--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua Mon Oct 27 21:24:55 2014 +0900
@@ -0,0 +1,1905 @@
+---------------------------------------------------------
+--- LE CONSTRUCTION MODE 0.7 (badly adapted from Hedge Editor 0.5)
+---------------------------------------------------------
+-- a hedgewars gameplay mode by mikade
+-- special thanks to all who helped test and offered suggestions
+-- additional thanks to sheepluva/nemo for adding some extra hooks
+
+-- (to do)
+-- investigate loc not working on addcaptions
+-- check for parsecommands before porting to dev
+-- test onUpDown more extensively as it may need revision (check for amRubber etc)
+-- test localization of weapons and utils and stuff
+
+-- try posistion grenades in Harmer so it blows hogs away from the struc
+-- and don't explode too close to the struc
+
+-- additional/previous balance ideas
+-- based on your money?
+-- based on the number of strucs/gens you own?
+-- based on your existing arsenal?
+-- limit number of crates spawned per round perhaps (done)
+-- limit number of generators?
+
+------------------------------------------------------------------------------
+--version history
+------------------------------------------------------------------------------
+--v0.1
+-- concept test
+
+--v0.2
+-- improved documentation (in script and in game)
+-- improved localisation (or is it? at any rate, crate placement should now say e.g. Bazooka and not amBazooka)
+-- added variable weapon costs (based on the values from Vatten's Consumerism script)
+
+-- added reflector shield (still needs work and balancing)
+-- added weapon-filter (probably ok)
+
+-- enabled super weapons like ballgun, rcplane, watermelon, hellish to test balance
+-- reduce max money to 1000
+
+--v0.3
+-- some /s removed
+
+--v0.4
+-- added support for per hog ammo (hopefully)
+
+--v0.5 (dev)
+-- added somewhat horribly implemented support for different structure sprites
+-- added override pictures for ammo menu
+-- added override message on wep select to aid understanding
+-- split menu into/between weps/parts: struc, crates, gears
+-- add a limit on crates per turn
+-- add a limit on extra time per turn
+-- add a test level
+-- restored rubber placement
+-- cleaned up some of the code a bit and removed about 280 lines of code I didn't need, lol
+
+--v0.6 (dev)
+-- added magic dance
+
+--v.07 (pushed to repo)
+-- added a cfg file
+-- removed another 903 lines of code we weren't using (lol)
+
+--------------------------------
+-- STRUCTURES LIST / IDEAS
+--------------------------------
+
+--Healing Station: heals hogs to 150 life
+--Teleportation Node: allows teleporting to any other teleporter nodes
+--Bio-filter: explodes enemy hogs
+--Respawner: if you have one of these, any slain hogs are resurrected here :D
+--Generator: generates energy (used to buy stuff, and possibly later other strucs might have upkeep costs)
+--Support Station: allows purchasing of weapons, utilities, and med-crates
+--Construction Station: allows purchasing of girders, rubber, mines, sticky mines, barrels
+--Reflector Shield: reflect projectiles
+--Weapon Filter: kill all equipement of enemy hogs passing through this area.
+
+
+--to make the grill more attractive make it vaporize flying saucers
+--and also rope, and maybe incoming gears
+
+-- make healing thing also cure poison
+-- maybe make poison more virulent and dangerous
+
+--(not implemented / abandoned ideas)
+-- Core: allows construction of other structures.
+-- Automated Turret (think red drones from space invasion)
+-- Canon (gives access to 3 fireballs per turn while near)
+-- something that allows control of wind/water
+-- Gravity Field generator : triggers world gravity change
+
+-- structures consume power over time and
+-- maybe you can turn structures OFF/ON, manually to save power.
+
+-- hacking
+-- allow hacking of structures, either being able to use enemy structures,
+-- or turning a team's structures against them.
+
+-- pylons
+-- allow hogs to put down a pylon-like gear which then allows the core
+-- to place other structures/objects within the pylon's sphere of influence
+-- this would allow aggressive structure advancement
+
+-- resouce mining?
+-- you could designate something like mines, that you could get close to,
+-- "pick up", and then "drop" back at a central location to simulate
+-- resource mining. bit complicated/meh, normal power generators probably easier
+
+-- it would be cool to have a red mask we could apply over girders
+-- that would indicate they were Indestructible
+
+HedgewarsScriptLoad("/Scripts/Locale.lua")
+HedgewarsScriptLoad("/Scripts/Tracker.lua")
+
+----------------------------------------------
+-- STRUC CRAP
+----------------------------------------------
+
+strucID = {}
+strucGear = {}
+strucClan = {}
+strucType = {}
+strucCost = {}
+strucHealth = {}
+
+strucCirc = {}
+strucCircCol = {}
+strucCircRadius = {}
+strucCircType = {}
+strucAltDisplay = {}
+
+placedExpense = 0
+
+tempID = nil
+
+sUID = 0
+
+colorRed = 0xff0000ff
+colorGreen = 0x00ff00ff
+
+clanBoundsSX = {}
+clanBoundsSY = {}
+clanBoundsEX = {}
+clanBoundsEY = {}
+
+clanPower = {}
+clanBoon = {}
+clanID = {}
+clanLStrucIndex = {}
+
+clanLWepIndex = {} -- for ease of use let's track this stuff
+clanLUtilIndex = {}
+clanLGearIndex = {}
+clanUsedExtraTime = {}
+clanCratesSpawned = {}
+
+effectTimer = 0
+
+wallsVisible = false
+wX = {}
+wY = {}
+wWidth = {}
+wHeight = {}
+wCol = {}
+margin = 20
+
+tauntString = ""
+
+vTag = {}
+lastWep = nil
+
+function HideTags()
+
+ for i = 0, 2 do
+ SetVisualGearValues(vTag[i],0,0,0,0,0,1,0, 0, 240000, 0xffffff00)
+ end
+
+end
+
+function DrawTag(i)
+
+ zoomL = 1.3
+
+ xOffset = 40
+
+ if i == 0 then
+ yOffset = 40
+ tCol = 0xffba00ff
+ tValue = 30--TimeLeft
+ elseif i == 1 then
+ zoomL = 1.1
+ xOffset = 45
+ yOffset = 70
+ tCol = 0x00ff00ff
+ tValue = clanPower[GetHogClan(CurrentHedgehog)]
+ elseif i == 2 then
+ zoomL = 1.1
+ xOffset = 60 + 35
+ yOffset = 70
+ tCol = 0xa800ffff
+ tValue = 10--shieldHealth - 80
+ end
+
+ DeleteVisualGear(vTag[i])
+ vTag[i] = AddVisualGear(0, 0, vgtHealthTag, 0, false)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vTag[i])
+ SetVisualGearValues (
+ vTag[i], --id
+ -div(ScreenWidth,2) + xOffset, --xoffset
+ ScreenHeight - yOffset, --yoffset
+ 0, --dx
+ 0, --dy
+ zoomL, --zoom
+ 1, --~= 0 means align to screen
+ g7, --frameticks
+ tValue, --value
+ 240000, --timer
+ tCol --GetClanColor( GetHogClan(CurrentHedgehog) )
+ )
+
+end
+
+function onScreenResize()
+
+ -- redraw Tags so that their screen locations are updated
+ if (CurrentHedgehog ~= nil) then
+ DrawTag(0)
+ DrawTag(1)
+ DrawTag(2)
+ end
+
+end
+
+function XYisInRect(px, py, psx, psy, pex, pey)
+
+ if (px > psx) and (px < pex) and (py > psy) and (py < pey) then
+ return(true)
+ else
+ return(false)
+ end
+
+end
+
+function AddWall(zXMin,zYMin, zWidth, zHeight, zCol)
+
+ table.insert(wX, zXMin)
+ table.insert(wY, zYMin)
+ table.insert(wWidth, zWidth)
+ table.insert(wHeight, zHeight)
+ table.insert(wCol, zCol)
+
+end
+
+function BorderSpark(zXMin,zYMin, zWidth, zHeight, bCol)
+
+ eX = zXMin + GetRandom(zWidth+10)
+ eY = zYMin + GetRandom(zHeight+10)
+ tempE = AddVisualGear(eX, eY, vgtDust, 0, false)
+ if tempE ~= 0 then
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
+ SetVisualGearValues(tempE, eX, eY, g3, g4, g5, g6, g7, 1, g9, bCol )
+ end
+
+end
+
+function HandleBorderEffects()
+
+ effectTimer = effectTimer + 1
+ if effectTimer > 15 then --25
+ effectTimer = 1
+ for i = 1, #wX do
+ BorderSpark(wX[i],wY[i],wWidth[i],wHeight[i], wCol[i])
+ end
+ end
+
+end
+
+----
+-- old reflecting stuff from like 3 years ago lol
+---
+
+function gearCanBeDeflected(gear)
+
+ if (GetGearType(gear) == gtShell) or
+ --(GetGearType(gear) == gtBee) or
+ (GetGearType(gear) == gtGrenade) or
+ (GetGearType(gear) == gtAirBomb) or
+ --(GetGearType(gear) == gtRCPlane) or
+ --(GetGearType(gear) == gtRope) or
+ (GetGearType(gear) == gtClusterBomb) or
+ (GetGearType(gear) == gtCluster) or
+ (GetGearType(gear) == gtGasBomb) or
+ --(GetGearType(gear) == gtSeduction) or
+ (GetGearType(gear) == gtMine) or -------
+ (GetGearType(gear) == gtMortar) or
+ (GetGearType(gear) == gtHellishBomb) or
+ (GetGearType(gear) == gtWatermelon) or
+ (GetGearType(gear) == gtMelonPiece) or
+ (GetGearType(gear) == gtEgg) or
+ (GetGearType(gear) == gtDrill) or
+ (GetGearType(gear) == gtBall) or
+ (GetGearType(gear) == gtExplosives) or ------
+ (GetGearType(gear) == gtFlame) or
+ (GetGearType(gear) == gtPortal) or
+ (GetGearType(gear) == gtDynamite) or
+ (GetGearType(gear) == gtSMine) or
+ --(GetGearType(gear) == gtKamikaze) or
+ --(GetGearType(gear) == gtRCPlane) or
+ --(GetGearType(gear) == gtCake) or
+ --(GetGearType(gear) == gtHedgehog) or ------
+ (GetGearType(gear) == gtKnife) or
+ (GetGearType(gear) == gtJetpack) or -- test this and birdy plz
+ (GetGearType(gear) == gtBirdy) or -- test this and birdy plz
+ (GetGearType(gear) == gtSnowball) or
+ (GetGearType(gear) == gtMolotov)
+ then
+ return(true)
+ else
+ return(false)
+ end
+
+end
+
+function getThreatDamage(gear)
+
+ --- damage amounts for weapons
+ if (GetGearType(gear) == gtGrenade) or
+ (GetGearType(gear) == gtClusterBomb) or
+ (GetGearType(gear) == gtGasBomb) or
+ (GetGearType(gear) == gtKnife) or
+ (GetGearType(gear) == gtEgg) or
+ (GetGearType(gear) == gtMolotov) or
+ (GetGearType(gear) == gtHellishBomb) or
+ (GetGearType(gear) == gtWatermelon) or
+ (GetGearType(gear) == gtSMine)
+ then
+ dmg = 30
+
+ elseif (GetGearType(gear) == gtMelonPiece) then
+ dmg = 40
+
+ elseif (GetGearType(gear) == gtAirBomb) or
+ (GetGearType(gear) == gtDrill) or
+ (GetGearType(gear) == gtMine) or
+ (GetGearType(gear) == gtCluster) then
+ dmg = 20
+
+ elseif (GetGearType(gear) == gtFlame) or
+ (GetGearType(gear) == gtPortal) or
+ (GetGearType(gear) == gtDynamite)
+ --(GetGearType(gear) == gtKamikaze) or
+ --(GetGearType(gear) == gtRCPlane) or
+
+ --(GetGearType(gear) == gtCake)
+ then
+ dmg = 0
+
+ elseif (GetGearType(gear) == gtBall) then
+ dmg = 1
+
+ else --normal shell, snowball etc
+ dmg = 65
+ end
+
+ return(dmg)
+
+end
+
+function setGearReflectionValues(gear)
+
+ dmg = getThreatDamage(gear)
+ setGearValue(gear,"damage",dmg)
+ setGearValue(gear,"deflects",0)
+
+ if (CurrentHedgehog ~= nil) then --and (gameStarted == true) then
+ setGearValue(gear,"owner",GetHogClan(CurrentHedgehog)) -- NEW NEEDS CHANGE?
+ else
+ setGearValue(gear,"owner",10) -- nil
+ end
+
+end
+
+function AddStruc(pX,pY, pType, pClan)
+
+ sUID = sUID + 1
+
+ tempG = AddGear(0, 0, gtTarget, 0, 0, 0, 0)
+ SetGearPosition(tempG, pX, pY)
+ setGearValue(tempG, "sUID", sUID)
+
+ tempCirc = AddVisualGear(0,0,vgtCircle,0,true)
+
+ SetVisualGearValues(tempCirc, 0, 0, 100, 255, 1, 100, 0, 500, 1, 0xFFFFFF00)
+
+ table.insert(strucID, sUID)
+ table.insert(strucType, pType)
+ table.insert(strucGear,tempG)
+ table.insert(strucClan,pClan)
+ table.insert(strucCost,2)
+
+ frameID = 0
+ visualSprite = sprTarget
+ madness = AddVisualGear(GetX(tempG), GetY(tempG), vgtStraightShot, 1, true,1)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(madness) --g9
+
+
+ if pType == loc("Reflector Shield") then
+ table.insert(strucHealth,255)
+
+ --SetVisualGearValues(madness, g1, g2, 0, 0, g5, frameID, g7, visualSprite, g9, g10 )
+ --SetState(tempG, bor(GetState(tempG),gstInvisible) )
+ --table.insert(strucAltDisplay, madness)
+
+ else
+ table.insert(strucHealth,1)
+ --table.insert(strucAltDisplay, 1)
+ end
+
+ table.insert(strucCirc,tempCirc)
+
+ table.insert(strucCircType, 1)
+ if pType == loc("Bio-Filter") then
+ table.insert(strucCircCol,colorRed)
+ table.insert(strucCircRadius,1000)
+ frameID = 7
+ elseif pType == loc("Healing Station") then
+ table.insert(strucCircCol,0xFF00FF00)
+ --table.insert(strucCircCol,colorGreen)
+ table.insert(strucCircRadius,500)
+ frameID = 3
+ elseif pType == loc("Respawner") then
+ table.insert(strucCircCol,0xFF00FF00)
+ --table.insert(strucCircCol,0xFF00FFFF)
+ table.insert(strucCircRadius,75)
+ runOnHogs(EnableHogResurrectionForThisClan)
+ frameID = 1
+ elseif pType == loc("Teleportation Node") then
+ table.insert(strucCircCol,0x0000FFFF)
+ table.insert(strucCircRadius,350)
+ frameID = 6
+ elseif pType == loc("Core") then
+ table.insert(strucCircCol,0xFFFFFFFF)
+ table.insert(strucCircRadius,350)
+ elseif pType == loc("Generator") then
+ table.insert(strucCircCol,0xFFFF00FF)
+ table.insert(strucCircRadius,75)
+ setGearValue(tempG, "power", 0)
+ frameID = 2
+ elseif pType == loc("Support Station") then
+ table.insert(strucCircCol,0xFFFF00FF)
+ table.insert(strucCircRadius,500)
+ frameID = 4
+ elseif pType == loc("Construction Station") then
+ table.insert(strucCircCol,0xFFFFFFFF)
+ table.insert(strucCircRadius,500)
+ frameID = 8
+ elseif pType == loc("Reflector Shield") then
+ table.insert(strucCircCol,0xffae00ff)
+ table.insert(strucCircRadius,750)
+ frameID = 9
+ elseif pType == loc("Weapon Filter") then
+ table.insert(strucCircCol,0xa800ffff)
+ table.insert(strucCircRadius,750)
+ frameID = 5
+ end
+
+
+ SetVisualGearValues(madness, g1, g2, 0, 0, g5, frameID, g7, visualSprite, g9, g10 )
+ SetState(tempG, bor(GetState(tempG),gstInvisible) )
+ table.insert(strucAltDisplay, madness)
+
+ -- may be needed for non gear-based structures
+ --table.insert(strucX, GetX(tempG))
+ --table.insert(strucY, GetY(tempG))
+
+end
+
+-- this is basically onStructureDelete
+-- we may need to expand it for non-gear structures later
+function CheckGearForStructureLink(gear)
+
+ respawnerDestroyed = false
+
+ for i = 1, #strucID do
+ if strucID[i] == getGearValue(gear,"sUID") then
+
+ if strucType[i] == loc("Respawner") then
+ respawnerDestroyed = true
+ end
+
+ table.remove(strucID,i)
+ table.remove(strucGear,i)
+ table.remove(strucClan,i)
+ table.remove(strucType,i)
+ table.remove(strucCost,i)
+ table.remove(strucHealth,i)
+
+ DeleteVisualGear(strucCirc[i])
+ table.remove(strucCirc,i)
+
+ table.remove(strucCircCol,i)
+ table.remove(strucCircRadius,i)
+ table.remove(strucCircType,i)
+
+ if strucAltDisplay[i] ~= 1 then
+ DeleteVisualGear(strucAltDisplay[i])
+ end
+ table.remove(strucAltDisplay,i)
+
+ end
+ end
+
+ if respawnerDestroyed == true then
+ runOnHogs(RecalibrateRespawn)
+ end
+
+end
+
+-- called when we add a new respawner
+function EnableHogResurrectionForThisClan(gear)
+ if GetHogClan(gear) == GetHogClan(CurrentHedgehog) then
+ SetEffect(gear, heResurrectable, 1)
+ end
+end
+
+-- this is called when a respawner blows up
+function RecalibrateRespawn(gear)
+
+ respawnerList = {}
+ for i = 1, #strucID do
+ if (strucType[i] == loc("Respawner")) and (strucClan[i] == GetHogClan(gear)) then
+ table.insert(respawnerList, i)
+ end
+ end
+
+ if #respawnerList >= 1 then
+ SetEffect(gear, heResurrectable, 1)
+ else
+ SetEffect(gear, heResurrectable, 0)
+ end
+
+end
+
+--resposition dead hogs at a respawner if they own one
+function FindRespawner(gear)
+
+ respawnerList = {}
+ for i = 1, #strucID do
+ if (strucType[i] == loc("Respawner")) and (strucClan[i] == GetHogClan(gear)) then
+ table.insert(respawnerList, i)
+ end
+ end
+
+ if #respawnerList >= 1 then
+ i = GetRandom(#respawnerList)+1
+ SetGearPosition(gear,GetX(strucGear[respawnerList[i]]),GetY(strucGear[respawnerList[i]])-25)
+ AddVisualGear(GetX(gear), GetY(gear), vgtExplosion, 0, false)
+ else -- (this should never happen, but just in case)
+ SetEffect(gear, heResurrectable, 0)
+ DeleteGear(gear)
+ end
+
+end
+
+function onGearResurrect(gear)
+ AddVisualGear(GetX(gear), GetY(gear), vgtExplosion, 0, false)
+ FindRespawner(gear)
+end
+
+
+function CheckTeleport(gear, tX, tY)
+
+ teleportOriginSuccessful = false
+ teleportDestinationSuccessful = false
+
+ for i = 1, #strucID do
+
+ if (strucType[i] == loc("Teleportation Node")) and (strucClan[i] == GetHogClan(CurrentHedgehog)) then
+
+ dist = GetDistFromGearToXY(CurrentHedgehog,GetX(strucGear[i]), GetY(strucGear[i]))
+ if strucCircType[i] == 0 then
+ NR = strucCircRadius[i]
+ else
+ NR = (48/100*strucCircRadius[i])/2
+ --NR = div((div(48,100) * strucCircRadius[tempID]),2)
+ end
+ if dist <= NR*NR then
+ teleportOriginSuccessful = true
+ end
+
+ dist = GetDistFromXYtoXY(tX,tY,GetX(strucGear[i]), GetY(strucGear[i]))
+ if strucCircType[i] == 0 then
+ NR = strucCircRadius[i]
+ else
+ NR = (48/100*strucCircRadius[i])/2
+ --NR = div((div(48,100) * strucCircRadius[tempID]),2)
+ end
+ if dist <= NR*NR then
+ teleportDestinationSuccessful = true
+ end
+
+ end
+
+
+ end
+
+ if ((teleportDestinationSuccessful == false) or (teleportOriginSuccessful == false)) then
+ AddCaption(loc("Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."))
+ SetGearTarget(gear, GetX(CurrentHedgehog), GetY(CurrentHedgehog))
+ end
+
+end
+
+--Check for proximity of gears to structures, and make structures behave accordingly
+function CheckProximity(gear)
+
+ --if isAStructureEffectingGear(gear) then
+
+ dist = GetDistFromGearToXY(gear, GetX(strucGear[tempID]), GetY(strucGear[tempID]))
+
+ -- calculate my real radius if I am an aura
+ if strucCircType[tempID] == 0 then
+ NR = strucCircRadius[tempID]
+ else
+ NR = (48/100*strucCircRadius[tempID])/2
+ --NR = div((div(48,100) * strucCircRadius[tempID]),2) -- doesn't work ffff
+ --NR = div((48/100*strucCircRadius[tempID]),2) -- still works
+
+ end
+
+ -- we're in business
+ if dist <= NR*NR then
+
+
+ -- heal clan hogs
+ if strucType[tempID] == loc("Healing Station") then
+
+ if GetGearType(gear) == gtHedgehog then
+ if GetHogClan(gear) == strucClan[tempID] then
+
+ hogLife = GetHealth(gear) + 1
+ if hogLife > 150 then
+ hogLife = 150
+ end
+ SetHealth(gear, hogLife)
+
+ -- change this to the med kit sprite health ++++s later
+ tempE = AddVisualGear(GetX(strucGear[tempID]), GetY(strucGear[tempID]), vgtSmoke, 0, true)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
+ SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, colorGreen )
+
+
+ end
+ end
+
+ -- explode enemy clan hogs
+ elseif strucType[tempID] == loc("Bio-Filter") then
+
+ --tempE = AddVisualGear(GetX(strucGear[tempID]), GetY(strucGear[tempID]), vgtSmoke, 0, true)
+ --g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
+ --SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, colorRed )
+
+ if GetGearType(gear) == gtHedgehog then
+ if (GetHogClan(gear) ~= strucClan[tempID]) and (GetHealth(gear) > 0) then
+ AddGear(GetX(gear), GetY(gear), gtGrenade, 0, 0, 0, 1)
+ end
+ end
+
+ -- were those weapons in your pocket, or were you just happy to see me?
+ elseif strucType[tempID] == loc("Weapon Filter") then
+
+ if GetGearType(gear) == gtHedgehog then
+ if (GetHogClan(gear) ~= strucClan[tempID]) then
+
+ for wpnIndex = 1, #atkArray do
+ AddAmmo(gear, atkArray[wpnIndex][1], 0)
+ end
+
+ for wpnIndex = 1, #utilArray do
+ AddAmmo(gear, utilArray[wpnIndex][1], 0)
+ end
+
+ AddAmmo(gear, amAirAttack, 100)
+ AddAmmo(gear, amSwitch, 100)
+ AddAmmo(gear, amSkip, 100)
+
+ end
+ end
+
+ -- BOUNCE! POGO! POGO! POGO! POGO!
+ elseif strucType[tempID] == loc("Reflector Shield") then
+
+ -- add check for whose projectile it is
+ if gearCanBeDeflected(gear) == true then
+
+ gOwner = getGearValue(gear,"owner")
+ gDeflects = getGearValue(gear,"deflects")
+ gDmg = getGearValue(gear,"damage")
+
+ if gDeflects >= 3 then
+ DeleteGear(gear)
+ AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, false)
+ PlaySound(sndVaporize)
+ elseif gOwner ~= strucClan[tempID] then
+ --whether to vaporize gears or bounce them
+ if gDmg ~= 0 then
+ dx, dy = GetGearVelocity(gear)
+
+ if (dx == 0) and (dy == 0) then
+ -- static mine, explosive, etc encountered
+ -- do nothing
+ else
+
+ --let's bounce something!
+
+ --if dx == 0 then
+ -- bounce away eggs
+ -- dx = 0.5
+ --end
+
+ dx = dx*(-1)
+ dy = dy*(-1)
+ SetGearVelocity(gear,dx,dy)
+ setGearValue(gear,"deflects",(gDeflects+1))
+
+ AddVisualGear(GetX(gear), GetY(gear), vgtExplosion, 0, false)
+ PlaySound(sndExplosion)
+
+ strucHealth[tempID] = strucHealth[tempID] - gDmg
+ strucCircCol[tempID] = strucCircCol[tempID] - gDmg
+
+ if strucHealth[tempID] <= 0 then
+ AddVisualGear(GetX(strucGear[tempID]), GetY(strucGear[tempID]), vgtExplosion, 0, false)
+ DeleteGear(strucGear[tempID])
+ PlaySound(sndExplosion)
+ end
+
+ end
+
+ else
+ DeleteGear(gear)
+ AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, false)
+ PlaySound(sndVaporize)
+ end
+ end
+ end
+
+ --mark as within range of a teleporter node
+ elseif strucType[tempID] == loc("Teleportation Node") then
+
+ if GetGearType(gear) == gtHedgehog then
+ if GetHogClan(gear) == strucClan[tempID] then
+ --tempE = AddVisualGear(GetX(strucGear[tempID]), GetY(strucGear[tempID]), vgtSmoke, 0, true)
+
+ for i = 1, #sProx do
+ if sProx[i][1] == loc("Teleportation Mode") then
+ sProx[i][2] = true
+ end
+ end
+
+ end
+ end
+
+ -- mark as within range of construction station
+ -- and thus allow menu access to placement modes
+ -- for girders, mines, sticky mines and barrels
+ elseif strucType[tempID] == loc("Construction Station") then
+
+ if GetGearType(gear) == gtHedgehog then
+ if GetHogClan(gear) == strucClan[tempID] then
+ tempE = AddVisualGear(GetX(strucGear[tempID]), GetY(strucGear[tempID]), vgtSmoke, 0, true)
+
+ for i = 1, #sProx do
+ if ((sProx[i][1] == loc("Girder Placement Mode"))
+ or (sProx[i][1] == loc("Rubber Placement Mode"))
+ or (sProx[i][1] == loc("Mine Placement Mode"))
+ or (sProx[i][1] == loc("Sticky Mine Placement Mode"))
+ or (sProx[i][1] == loc("Barrel Placement Mode")))
+ then
+ sProx[i][2] = true
+ end
+ end
+
+
+ end
+ end
+
+ -- mark as within stupport station range
+ -- and thus allow menu access to placement modes
+ -- for weapon, utility, and med crates
+ elseif strucType[tempID] == loc("Support Station") then
+
+ if GetGearType(gear) == gtHedgehog then
+ if GetHogClan(gear) == strucClan[tempID] then
+ tempE = AddVisualGear(GetX(strucGear[tempID]), GetY(strucGear[tempID]), vgtSmoke, 0, true)
+
+ for i = 1, #sProx do
+ if ((sProx[i][1] == loc("Health Crate Placement Mode"))
+ or (sProx[i][1] == loc("Weapon Crate Placement Mode"))
+ or (sProx[i][1] == loc("Utility Crate Placement Mode")))
+ then
+ sProx[i][2] = true
+ --AddCaption("wahey in a support station")
+ end
+ end
+
+
+ end
+ end
+
+ -- doesn't do shit
+ elseif strucType[tempID] == loc("Core") then
+
+ if GetGearType(gear) == gtHedgehog then
+ if GetHogClan(gear) == strucClan[tempID] then
+
+ tempE = AddVisualGear(GetX(strucGear[tempID]), GetY(strucGear[tempID]), vgtSmoke, 0, true)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
+ SetVisualGearValues(tempE, g1+20, g2, g3, g4, g5, g6, g7, g8, g9, GetClanColor(strucClan[tempID]) )
+
+ tempE = AddVisualGear(GetX(strucGear[tempID]), GetY(strucGear[tempID]), vgtSmoke, 0, true)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
+ SetVisualGearValues(tempE, g1-20, g2, g3, g4, g5, g6, g7, g8, g9, GetClanColor(strucClan[tempID]) )
+
+ end
+ end
+
+ end
+
+ end
+
+ --end
+
+end
+
+-- used to check if we need to run through all hogs or just currenthedgehog
+function isAStructureThatAppliesToMultipleGears(pID)
+ if strucType[pID] == loc("Healing Station") or
+ strucType[pID] == loc("Reflector Shield") or
+ strucType[pID] == loc("Weapon Filter") or
+ strucType[pID] == loc("Bio-Filter")
+ then
+ return(true)
+ else
+ return(false)
+ end
+end
+
+function HandleStructures()
+
+ for i = 1, #sProx do
+ sProx[i][2] = false
+
+ if sProx[i][1] == loc("Structure Placement Mode") then
+ sProx[i][2] = true
+ end
+
+ end
+
+ for i = 1, #strucID do
+
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(strucCirc[i])
+ SetVisualGearValues(strucCirc[i], GetX(strucGear[i]), GetY(strucGear[i]), g3, g4, g5, g6, g7, strucCircRadius[i], g9, strucCircCol[i])
+
+ tempID = i
+
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(strucAltDisplay[i]) --8000
+ SetVisualGearValues(strucAltDisplay[i], GetX(strucGear[i]), GetY(strucGear[i]), 0, 0, g5, g6, 800000, sprTarget, g9, g10 )
+
+
+
+ -- Check For proximity of stuff to our structures
+ if isAStructureThatAppliesToMultipleGears(i) then
+ runOnGears(CheckProximity)
+ else -- only check prox on CurrentHedgehog
+ CheckProximity(CurrentHedgehog)
+ end
+
+ if strucType[i] == loc("Core") then
+ tempE = AddVisualGear(GetX(strucGear[i]), GetY(strucGear[i]), vgtSmoke, 0, true)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
+ SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, GetClanColor(strucClan[i]) )
+ elseif strucType[i] == loc("Reflector Shield") then
+
+
+
+ --frameID = 1
+ --visualSprite = sprTarget
+ --g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(strucAltDisplay[i]) --frameID / g6
+ --SetVisualGearValues(strucAltDisplay[i], GetX(strucGear[i]), GetY(strucGear[i]), 0, 0, g5, g6, 8000, visualSprite, g9, g10 )
+
+ elseif strucType[i] == loc("Generator") then
+
+ --frameID = 1
+ --visualSprite = sprTarget
+ --layer
+ --tempE = AddVisualGear(GetX(strucGear[i]), GetY(strucGear[i]), vgtStraightShot, 1, true,1)
+ --g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --g9
+ --SetVisualGearValues(tempE, g1, g2, 0, 0, g5, frameID, g7, visualSprite, g9, g10 )
+ --SetState(strucGear[i], bor(GetState(strucGear[i]),gstInvisible) )
+
+ --currently generate power for all clans.
+ -- or should power only be generated for current clan?
+ for z = 0, ClansCount-1 do
+ if z == strucClan[i] then
+ increaseGearValue(strucGear[i],"power")
+ if getGearValue(strucGear[i],"power") == 10 then
+ setGearValue(strucGear[i],"power",0)
+ clanPower[z] = clanPower[z] + 1
+ if clanPower[z] > 1000 then
+ clanPower[z] = 1000
+ end
+ end
+
+ end
+ end
+
+ end
+
+ end
+
+
+
+ -- this is kinda messy and gross (even more than usual), fix it up at some point
+ -- it just assumes that if you have access to girders, it works for rubbers
+ -- as that is what the struc implemenation means due to construction station
+ anyUIProx = false
+ for i = 1, #sProx do
+
+ if sProx[i][1] == loc("Girder Placement Mode") then
+ if sProx[i][2] == true then
+ AddAmmo(CurrentHedgehog, amGirder, 100)
+ AddAmmo(CurrentHedgehog, amRubber, 100)
+ AddAmmo(CurrentHedgehog, amDrillStrike, 100)
+ else
+ AddAmmo(CurrentHedgehog, amGirder, 0)
+ AddAmmo(CurrentHedgehog, amRubber, 0)
+ AddAmmo(CurrentHedgehog, amDrillStrike, 0) -- new
+ end
+ elseif sProx[i][1] == loc("Teleportation Mode") then
+ if sProx[i][2] == true then
+ AddAmmo(CurrentHedgehog, amTeleport, 100)
+ else
+ AddAmmo(CurrentHedgehog, amTeleport, 0)
+ end
+ elseif sProx[i][1] == loc("Weapon Crate Placement Mode") then
+ -- this is new stuff
+ if sProx[i][2] == true then
+ AddAmmo(CurrentHedgehog, amNapalm, 100)
+ else
+ AddAmmo(CurrentHedgehog, amNapalm, 0)
+ end
+ end
+
+ if (sProx[i][2] == true) then
+ anyUIProx = true
+ end
+
+ end
+
+ -- doesn't do shit atm, maybe later when we add cores we can use this
+ --if anyUIProx == true then --(and core is placed)
+ -- AddAmmo(CurrentHedgehog, amAirAttack, 100)
+ --else
+ -- AddAmmo(CurrentHedgehog, amAirAttack, 0)
+ --end
+
+
+end
+
+
+function checkForSpecialWeapons()
+
+
+
+ if (GetCurAmmoType() == amAirAttack) then
+ AddCaption(loc("Structure Placement Tool"),GetClanColor(GetHogClan(CurrentHedgehog)),capgrpAmmoinfo)
+ elseif (GetCurAmmoType() == amDrillStrike) then
+ AddCaption(loc("Object Placement Tool"),GetClanColor(GetHogClan(CurrentHedgehog)),capgrpAmmoinfo)
+ elseif (GetCurAmmoType() == amNapalm) then
+ AddCaption(loc("Crate Placement Tool"),GetClanColor(GetHogClan(CurrentHedgehog)),capgrpAmmoinfo)
+ end
+
+ lastWep = GetCurAmmoType()
+
+end
+
+----------------------------------------------------------
+-- EXCERPTS OF ADAPTED HEDGE_EDITOR CODE FOLLOWS
+----------------------------------------------------------
+-- experimental crap
+
+local landType = 0
+-----------------------------------------
+-- tracking vars for save slash load purposes
+-----------------------------------------
+
+local hhs = {}
+
+---------------------------------
+-- crates are made of this stuff
+---------------------------------
+placeholder = 20
+ atkArray =
+ {
+ {amBazooka, "amBazooka", 0, loc("Bazooka"), 2*placeholder},
+ --{amBee, "amBee", 0, loc("Homing Bee"), 4*placeholder},
+ {amMortar, "amMortar", 0, loc("Mortar"), 1*placeholder},
+ {amDrill, "amDrill", 0, loc("Drill Rocket"), 3*placeholder},
+ {amSnowball, "amSnowball", 0, loc("Mudball"), 3*placeholder},
+
+ {amGrenade, "amGrenade", 0, loc("Grenade"), 2*placeholder},
+ {amClusterBomb, "amClusterBomb", 0, loc("Cluster Bomb"), 3*placeholder},
+ {amMolotov, "amMolotov", 0, loc("Molotov Cocktail"), 3*placeholder},
+ {amWatermelon, "amWatermelon", 0, loc("Watermelon Bomb"), 25*placeholder},
+ {amHellishBomb, "amHellishBomb", 0, loc("Hellish Handgrenade"), 25*placeholder},
+ {amGasBomb, "amGasBomb", 0, loc("Limburger"), 3*placeholder},
+
+ {amShotgun, "amShotgun", 0, loc("Shotgun"), 2*placeholder},
+ {amDEagle, "amDEagle", 0, loc("Desert Eagle"), 2*placeholder},
+ {amFlamethrower,"amFlamethrower", 0, loc("Flamethrower"), 4*placeholder},
+ {amSniperRifle, "amSniperRifle", 0, loc("Sniper Rifle"), 3*placeholder},
+ --{amSineGun, "amSineGun", 0, loc("SineGun"), 6*placeholder},
+ {amIceGun, "amIceGun", 0, loc("Freezer"), 15*placeholder},
+ {amLandGun, "amLandGun", 0, loc("Land Sprayer"), 5*placeholder},
+
+ {amFirePunch, "amFirePunch", 0, loc("Shoryuken"), 3*placeholder},
+ {amWhip, "amWhip", 0, loc("Whip"), 1*placeholder},
+ {amBaseballBat, "amBaseballBat", 0, loc("Baseball Bat"), 7*placeholder},
+ --{amKamikaze, "amKamikaze", 0, loc("Kamikaze"), 1*placeholder},
+ {amSeduction, "amSeduction", 0, loc("Seduction"), 1*placeholder},
+ {amHammer, "amHammer", 0, loc("Hammer"), 1*placeholder},
+
+ {amMine, "amMine", 0, loc("Mine"), 1*placeholder},
+ {amDynamite, "amDynamite", 0, loc("Dynamite"), 9*placeholder},
+ {amCake, "amCake", 0, loc("Cake"), 25*placeholder},
+ {amBallgun, "amBallgun", 0, loc("Ballgun"), 40*placeholder},
+ --{amRCPlane, "amRCPlane", 0, loc("RC Plane"), 25*placeholder},
+ {amSMine, "amSMine", 0, loc("Sticky Mine"), 5*placeholder},
+
+ --{amAirAttack, "amAirAttack", 0, loc("Air Attack"), 10*placeholder},
+ --{amMineStrike, "amMineStrike", 0, loc("Mine Strike"), 15*placeholder},
+ --{amDrillStrike, "amDrillStrike", 0, loc("Drill Strike"), 15*placeholder},
+ --{amNapalm, "amNapalm", 0, loc("Napalm"), 15*placeholder},
+ --{amPiano, "amPiano", 0, loc("Piano Strike"), 40*placeholder},
+
+ {amKnife, "amKnife", 0, loc("Cleaver"), 2*placeholder},
+
+ {amBirdy, "amBirdy", 0, loc("Birdy"), 7*placeholder}
+
+ }
+
+ utilArray =
+ {
+ {amBlowTorch, "amBlowTorch", 0, loc("Blowtorch"), 4*placeholder},
+ {amPickHammer, "amPickHammer", 0, loc("Pickhammer"), 2*placeholder},
+ --{amGirder, "amGirder", 0, loc("Girder"), 4*placeholder},
+ --{amRubber, "amRubber", 0, loc("Rubber Band"), 5*placeholder},
+ {amPortalGun, "amPortalGun", 0, loc("Personal Portal Device"), 15*placeholder},
+
+ {amRope, "amRope", 0, loc("Rope"), 7*placeholder},
+ {amParachute, "amParachute", 0, loc("Parachute"), 2*placeholder},
+ --{amTeleport, "amTeleport", 0, loc("Teleport"), 6*placeholder},
+ {amJetpack, "amJetpack", 0, loc("Flying Saucer"), 8*placeholder},
+
+ {amInvulnerable, "amInvulnerable", 0, loc("Invulnerable"), 5*placeholder},
+ {amLaserSight, "amLaserSight", 0, loc("Laser Sight"), 2*placeholder},
+ {amVampiric, "amVampiric", 0, loc("Vampirism"), 6*placeholder},
+
+ {amLowGravity, "amLowGravity", 0, loc("Low Gravity"), 4*placeholder},
+ {amExtraDamage, "amExtraDamage", 0, loc("Extra Damage"), 6*placeholder},
+ {amExtraTime, "amExtraTime", 0, loc("Extra Time"), 8*placeholder},
+
+ {amResurrector, "amResurrector", 0, loc("Resurrector"), 8*placeholder},
+ {amTardis, "amTardis", 0, loc("Tardis"), 2*placeholder},
+
+ {amSwitch, "amSwitch", 0, loc("Switch Hog"), 4*placeholder}
+ }
+
+----------------------------
+-- hog and map editting junk
+----------------------------
+
+ local reducedSpriteIDArray = {
+ sprBigDigit, sprKowtow, sprBee, sprExplosion50, sprGirder
+ }
+
+ local reducedSpriteTextArray = {
+ "sprBigDigit", "sprKowtow", "sprBee", "sprExplosion50", "sprGirder"
+ }
+
+----------------------------
+-- placement shite
+----------------------------
+
+local cGear = nil -- detects placement of girders and objects (using airattack)
+local curWep = amNothing
+
+-- primary placement categories
+local cIndex = 1 -- category index
+local cat = {
+ "Girder Placement Mode",
+ "Rubber Placement Mode",
+ "Mine Placement Mode",
+ "Sticky Mine Placement Mode",
+ "Barrel Placement Mode",
+ "Health Crate Placement Mode",
+ "Weapon Crate Placement Mode",
+ "Utility Crate Placement Mode",
+ --"Target Placement Mode",
+ --"Cleaver Placement Mode",
+
+ --"Advanced Repositioning Mode",
+ --"Tagging Mode",
+ --"Sprite Testing Mode",
+ --"Sprite Placement Mode",
+ "Structure Placement Mode"
+ }
+
+
+ sProx = {
+ {loc("Girder Placement Mode"),false},
+ {loc("Rubber Placement Mode"),false},
+ {loc("Mine Placement Mode"),false},
+ {loc("Sticky Mine Placement Mode"),false},
+ {loc("Barrel Placement Mode"),false},
+ {loc("Health Crate Placement Mode"),false},
+ {loc("Weapon Crate Placement Mode"),false},
+ {loc("Utility Crate Placement Mode"),false},
+ --{loc("Target Placement Mode"),false},
+ --{loc("Cleaver Placement Mode"),false},
+
+ --{loc("Advanced Repositioning Mode"),false},
+ --{loc("Tagging Mode"),false},
+ --{loc("Sprite Testing Mode"),false},
+ --{loc("Sprite Placement Mode"),false},
+ {loc("Structure Placement Mode"),false},
+ {loc("Teleportation Mode"),false}
+ }
+
+
+local pMode = {} -- pMode contains custom subsets of the main categories
+local pIndex = 1
+
+local genTimer = 0
+
+local CGR = 1 -- current girder rotation, we actually need this as HW remembers what rotation you last used
+
+local placedX = {}
+local placedY = {}
+local placedSpec = {}
+local placedSuperSpec = {}
+local placedType = {}
+local placedCount = 0
+
+local sCirc -- circle that appears around selected gears
+local sGear = nil
+local closestDist
+local closestGear = nil
+
+local tCirc = {} -- array of circles that appear around tagged gears
+
+------------------------
+-- SOME GENERAL METHODS
+------------------------
+
+function GetDistFromGearToXY(gear, g2X, g2Y)
+
+ g1X, g1Y = GetGearPosition(gear)
+ q = g1X - g2X
+ w = g1Y - g2Y
+
+ return ( (q*q) + (w*w) )
+
+end
+
+function GetDistFromXYtoXY(a, b, c, d)
+ q = a - c
+ w = b - d
+ return ( (q*q) + (w*w) )
+end
+
+function SelectGear(gear)
+
+ d = GetDistFromGearToXY(gear, placedX[placedCount], placedY[placedCount])
+
+ if d < closestDist then
+ closestDist = d
+ closestGear = gear
+ end
+
+end
+
+-- essentially called when user clicks the mouse
+-- with girders or an airattack
+function PlaceObject(x,y)
+
+ placedX[placedCount] = x
+ placedY[placedCount] = y
+ placedType[placedCount] = cat[cIndex]
+ placedSpec[placedCount] = pMode[pIndex]
+
+ if (clanUsedExtraTime[GetHogClan(CurrentHedgehog)] == true) and (cat[cIndex] == "Utility Crate Placement Mode") and (utilArray[pIndex][1] == amExtraTime) then
+ AddCaption(loc("You may only use 1 Extra Time per turn."),0xffba00ff,capgrpVolume)
+ PlaySound(sndDenied)
+ elseif (clanCratesSpawned[GetHogClan(CurrentHedgehog)] > 4) and ( (cat[cIndex] == "Health Crate Placement Mode") or (cat[cIndex] == "Utility Crate Placement Mode") or (cat[cIndex] == "Weapon Crate Placement Mode") ) then
+ AddCaption(loc("You may only spawn 5 crates per turn."),0xffba00ff,capgrpVolume)
+ PlaySound(sndDenied)
+ elseif (XYisInRect(x,y, clanBoundsSX[GetHogClan(CurrentHedgehog)],clanBoundsSY[GetHogClan(CurrentHedgehog)],clanBoundsEX[GetHogClan(CurrentHedgehog)],clanBoundsEY[GetHogClan(CurrentHedgehog)]) == true)
+ and (clanPower[GetHogClan(CurrentHedgehog)] >= placedExpense)
+ then
+
+
+
+ if cat[cIndex] == "Girder Placement Mode" then
+ PlaceGirder(x, y, CGR)
+ placedSpec[placedCount] = CGR
+ elseif cat[cIndex] == "Rubber Placement Mode" then
+ PlaceSprite(x,y, sprAmRubber, CGR, lfBouncy)
+ --PlaceGirder(x, y, CGR)
+ placedSpec[placedCount] = CGR
+ elseif cat[cIndex] == "Target Placement Mode" then
+ gear = AddGear(x, y, gtTarget, 0, 0, 0, 0)
+ elseif cat[cIndex] == "Cleaver Placement Mode" then
+ gear = AddGear(x, y, gtKnife, 0, 0, 0, 0)
+ elseif cat[cIndex] == "Health Crate Placement Mode" then
+ gear = SpawnHealthCrate(x,y)
+ SetHealth(gear, pMode[pIndex])
+ setGearValue(gear,"caseType","med")
+ clanCratesSpawned[GetHogClan(CurrentHedgehog)] = clanCratesSpawned[GetHogClan(CurrentHedgehog)] +1
+ elseif cat[cIndex] == "Weapon Crate Placement Mode" then
+ gear = SpawnAmmoCrate(x, y, atkArray[pIndex][1])
+ placedSpec[placedCount] = atkArray[pIndex][2]
+ setGearValue(gear,"caseType","ammo")
+ setGearValue(gear,"contents",atkArray[pIndex][2])
+ clanCratesSpawned[GetHogClan(CurrentHedgehog)] = clanCratesSpawned[GetHogClan(CurrentHedgehog)] +1
+ elseif cat[cIndex] == "Utility Crate Placement Mode" then
+ gear = SpawnUtilityCrate(x, y, utilArray[pIndex][1])
+ placedSpec[placedCount] = utilArray[pIndex][2]
+ setGearValue(gear,"caseType","util")
+ setGearValue(gear,"contents",utilArray[pIndex][2])
+ if utilArray[pIndex][1] == amExtraTime then
+ clanUsedExtraTime[GetHogClan(CurrentHedgehog)] = true
+ end
+ clanCratesSpawned[GetHogClan(CurrentHedgehog)] = clanCratesSpawned[GetHogClan(CurrentHedgehog)] +1
+ elseif cat[cIndex] == "Barrel Placement Mode" then
+ gear = AddGear(x, y, gtExplosives, 0, 0, 0, 0)
+ SetHealth(gear, pMode[pIndex])
+ elseif cat[cIndex] == "Mine Placement Mode" then
+ gear = AddGear(x, y, gtMine, 0, 0, 0, 0)
+ SetTimer(gear, pMode[pIndex])
+ elseif cat[cIndex] == "Sticky Mine Placement Mode" then
+ gear = AddGear(x, y, gtSMine, 0, 0, 0, 0)
+ elseif cat[cIndex] == "Advanced Repositioning Mode" then
+
+ if pMode[pIndex] == "Selection Mode" then
+ closestDist = 999999999
+ closestGear = nil -- just in case
+ sGear = nil
+ runOnGears(SelectGear)
+ sGear = closestGear
+ closestGear = nil
+ elseif pMode[pIndex] == "Placement Mode" then
+ if sGear ~= nil then
+ SetGearPosition(sGear, x, y)
+ end
+ end
+
+ elseif cat[cIndex] == "Tagging Mode" then
+
+ closestDist = 999999999
+ closestGear = nil
+ sGear = nil
+ runOnGears(SelectGear)
+
+
+ if closestGear ~= nil then
+
+ if getGearValue(closestGear,"tag") == nil then
+
+ --if there is no tag, add a victory/failure tag and circle
+ setGearValue(closestGear, "tCirc",AddVisualGear(0,0,vgtCircle,0,true))
+
+ --AddCaption("circ added",0xffba00ff,capgrpVolume)
+
+ if pMode[pIndex] == "Tag Victory Mode" then
+ setGearValue(closestGear, "tag","victory")
+ SetVisualGearValues(getGearValue(closestGear,"tCirc"), 0, 0, 100, 255, 1, 10, 0, 40, 3, 0xff0000ff)
+ elseif pMode[pIndex] == "Tag Failure Mode" then
+ setGearValue(closestGear, "tag","failure")
+ SetVisualGearValues(getGearValue(closestGear,"tCirc"), 0, 0, 100, 255, 1, 10, 0, 40, 3, 0x0000ffff)
+ end
+
+
+ else
+ -- remove tag and delete circ
+ --AddCaption("circ removed",0xffba00ff,capgrpVolume)
+ setGearValue(closestGear, "tag", nil)
+ DeleteVisualGear(getGearValue(closestGear,"tCirc"))
+ setGearValue(closestGear, "tCirc", nil)
+ end
+
+ end
+
+
+ elseif cat[cIndex] == "Sprite Testing Mode" then
+
+ frameID = 1
+ visualSprite = reducedSpriteIDArray[pIndex]
+ --visualSprite = spriteIDArray[pIndex]
+ tempE = AddVisualGear(x, y, vgtStraightShot, 0, true)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
+ SetVisualGearValues(tempE, g1, g2, 0, 0, g5, frameID, g7, visualSprite, g9, g10 )
+ --sprHorizonLong crashes game, so does skyL, as does flake
+
+ -- reduced list of cool sprites
+ -- sprBigDigit, sprKnife, sprFrozenHog, sprKowtow, sprBee, sprExplosion50, sprPiano, sprChunk, sprHHTelepMask, sprSeduction, sprSwitch, sprGirder,
+ --sprAMAmmos, sprAMSlotKeys, sprTurnsLeft, sprExplosivesRoll + maybe some others like the health case, arrows, etc
+
+ elseif cat[cIndex] == "Sprite Placement Mode" then
+
+ PlaceSprite(x,y, reducedSpriteIDArray[pIndex], 1, landType)
+ --PlaceGirder(x, y, CGR)
+ placedSpec[placedCount] = reducedSpriteTextArray[pIndex]
+ placedSuperSpec[placedCount] = landType
+
+ if landType == lfIce then
+ placedSuperSpec[placedCount] = "lfIce"
+ elseif landType == lfIndestructible then
+ placedSuperSpec[placedCount] = "lfIndestructible"
+ elseif landType == lfBouncy then
+ placedSuperSpec[placedCount] = "lfBouncy"
+ else
+ placedSuperSpec[placedCount] = "lfNormal"
+ end
+
+ elseif cat[cIndex] == "Structure Placement Mode" then
+
+ AddStruc(x,y, pMode[pIndex],GetHogClan(CurrentHedgehog))
+
+ end
+
+ clanPower[GetHogClan(CurrentHedgehog)] = clanPower[GetHogClan(CurrentHedgehog)] - placedExpense
+ placedCount = placedCount + 1
+
+ else
+ AddCaption("Invalid Placement",0xffba00ff,capgrpVolume)
+ PlaySound(sndDenied)
+ end
+
+
+end
+
+-- called when user changes primary selection
+-- either via up/down keys
+-- or selecting girder/airattack
+function RedefineSubset()
+
+ pIndex = 1
+ pMode = {}
+ placedExpense = 1
+
+ if cat[cIndex] == "Girder Placement Mode" then
+ pIndex = CGR
+ pMode = {"Girder"}
+ -- pCount = 1
+ elseif cat[cIndex] == "Rubber Placement Mode" then
+ pIndex = CGR
+ pMode = {"Rubber"}
+ placedExpense = 3
+ -- pCount = 1???
+ elseif cat[cIndex] == "Target Placement Mode" then
+ pMode = {"Standard Target"}
+ elseif cat[cIndex] == "Cleaver Placement Mode" then
+ pMode = {"Standard Cleaver"}
+ elseif cat[cIndex] == "Barrel Placement Mode" then
+ --pMode = {1,50,75,100}
+ pMode = {50}
+ placedExpense = 10
+ elseif cat[cIndex] == "Health Crate Placement Mode" then
+ --pMode = {25,50,75,100}
+ pMode = {25}
+ placedExpense = 5
+ elseif cat[cIndex] == "Weapon Crate Placement Mode" then
+ for i = 1, #atkArray do
+ pMode[i] = atkArray[i][4] -- was [2]
+ --placedExpense = atkArray[5]
+ end
+ placedExpense = 30
+ elseif cat[cIndex] == "Utility Crate Placement Mode" then
+ for i = 1, #utilArray do
+ pMode[i] = utilArray[i][4] -- was [2]
+ --placedExpense = utilArray[5]
+ end
+ placedExpense = 20
+ elseif cat[cIndex] == "Mine Placement Mode" then
+ --pMode = {1,1000,2000,3000,4000,5000,0}
+ pMode = {1,1000,2000,3000,4000,5000}
+ -- 0 is dud right, or is that nil?
+ placedExpense = 15
+ elseif cat[cIndex] == "Sticky Mine Placement Mode" then
+ pMode = {"Normal Sticky Mine"}
+ --elseif cat[cIndex] == "Gear Repositioning Mode" then
+ -- for i = 1, #hhs do
+ -- pMode[i] = GetHogName(hhs[i])
+ -- end
+ placedExpense = 20
+ elseif cat[cIndex] == "Advanced Repositioning Mode" then
+ pMode = {"Selection Mode","Placement Mode"}
+ elseif cat[cIndex] == "Tagging Mode" then
+ pMode = {"Tag Victory Mode","Tag Failure Mode"}
+ elseif cat[cIndex] == "Sprite Testing Mode" or cat[cIndex] == "Sprite Placement Mode" then
+ --for i = 1, #spriteTextArray do
+ -- pMode[i] = spriteTextArray[i]
+ --end
+ for i = 1, #reducedSpriteTextArray do
+ pMode[i] = reducedSpriteTextArray[i]
+ end
+ placedExpense = 100
+ elseif cat[cIndex] == "Structure Placement Mode" then
+ pMode = {loc("Healing Station"), loc("Bio-Filter"), loc("Weapon Filter"), loc("Reflector Shield"), loc("Respawner"),loc("Teleportation Node"),--[[loc("Core"),]]loc("Generator"),loc("Construction Station"),loc("Support Station")}
+ --placedExpense = 100
+ end
+
+
+
+
+end
+
+-- called in onGameTick()
+function HandleHedgeEditor()
+
+ if CurrentHedgehog ~= nil then
+
+ if wallsVisible == true then
+ HandleBorderEffects()
+ end
+
+ if (CurrentHedgehog ~= nil) and (TurnTimeLeft ~= TurnTime) then
+ if (lastWep ~= GetCurAmmoType()) then
+ checkForSpecialWeapons()
+ end
+ end
+
+ genTimer = genTimer + 1
+
+ if genTimer >= 100 then
+
+ genTimer = 0
+
+ DrawTag(1)
+
+ HandleStructures()
+
+ curWep = GetCurAmmoType()
+
+ -- change to girder mode on weapon swap
+ if (cIndex ~= 1) and (curWep == amGirder) then
+ cIndex = 1
+ RedefineSubset()
+ elseif (cIndex ~=2) and (curWep == amRubber) then
+ cIndex = 2
+ RedefineSubset()
+ -- change to generic mode if girder no longer selected
+ elseif (cIndex == 1) and (curWep ~= amGirder) then
+ cIndex = 3 -- was 2
+ RedefineSubset()
+ elseif (cIndex == 2) and (curWep ~= amRubber) then
+ cIndex = 3 --new
+ RedefineSubset()
+
+ end
+
+ -- update display selection criteria
+ if (curWep == amGirder) or (curWep == amAirAttack) or (curWep == amNapalm) or (curWep == amDrillStrike) or (curWep == amRubber) then
+
+ ---------------hooolllllyyyy fucking shit this
+ -- code is a broken mess now
+ -- it was redesigned and compromised three times
+ -- so now it is a mess trying to do what it was
+ -- never designed to do
+ -- needs to be rewritten badly sadface
+ -- this bit here catches the new 3 types of weapons
+ if ((sProx[cIndex][1] == loc("Structure Placement Mode") and (curWep ~= amAirAttack))) then
+ updatePlacementDisplay(1)
+ elseif (sProx[cIndex][1] == loc("Health Crate Placement Mode")) or
+ (sProx[cIndex][1] == loc("Weapon Crate Placement Mode")) or
+ (sProx[cIndex][1] == loc("Utility Crate Placement Mode")) then
+ if curWep ~= amNapalm then
+ updatePlacementDisplay(1)
+ end
+
+ elseif (sProx[cIndex][1] == loc("Mine Placement Mode")) or
+ (sProx[cIndex][1] == loc("Sticky Mine Placement Mode")) or
+ (sProx[cIndex][1] == loc("Barrel Placement Mode")) then
+ if curWep ~= amDrillStrike then
+ updatePlacementDisplay(1)
+ end
+
+ end
+
+ --this is called when it happens that we have placement
+ --mode selected and we are looking at something
+ --we shouldn't be allowed to look at, as would be the case
+ --when you WERE allowed to look at it, but then maybe
+ --a bomb blows up the structure that was granting you
+ --that ability
+ if (sProx[cIndex][2] ~= true) then
+ updatePlacementDisplay(1)
+ else
+ updateCost()
+ end
+
+
+ AddCaption(cat[cIndex],0xffba00ff,capgrpMessage)
+ AddCaption(pMode[pIndex],0xffba00ff,capgrpMessage2)
+ wallsVisible = true
+ else
+ wallsVisible = false
+ end
+
+ end
+
+ end
+
+ --update selected gear display
+ if (cat[cIndex] == "Advanced Repositioning Mode") and (sGear ~= nil) then
+ SetVisualGearValues(sCirc, GetX(sGear), GetY(sGear), 100, 255, 1, 10, 0, 300, 3, 0xff00ffff)
+ elseif (cat[cIndex] == "Tagging Mode") then
+ if (sGear ~= nil) or (closestGear ~= nil) then
+ SetVisualGearValues(sCirc, GetX(sGear), GetY(sGear), 0, 1, 1, 10, 0, 1, 1, 0x00000000)
+ closestGear = nil
+ sGear = nil
+ end
+ end
+
+ -- some kind of target detected, tell me your story
+ if cGear ~= nil then
+
+ x,y = GetGearTarget(cGear)
+
+ if GetGearType(cGear) == gtAirAttack then
+ DeleteGear(cGear)
+ PlaceObject(x, y)
+ elseif GetGearType(cGear) == gtTeleport then
+
+ CheckTeleport(cGear, x, y)
+ cGear = nil
+ elseif GetGearType(cGear) == gtGirder then
+
+ CGR = GetState(cGear)
+
+ -- improve rectangle test based on CGR when you can be bothered
+ --if TestRectForObstacle(x-20, y-20, x+20, y+20, true) then
+ -- AddCaption("Invalid Girder Placement",0xffba00ff,capgrpVolume)
+ --else
+ PlaceObject(x, y)
+ --end
+
+ -- this allows the girder tool to be used like a mining laser
+
+ --[[
+
+ if CGR < 4 then
+ AddGear(x, y, gtGrenade, 0, 0, 0, 1)
+ elseif CGR == 4 then
+ g = AddGear(x-30, y, gtGrenade, 0, 0, 0, 1)
+ g = AddGear(x+30, y, gtGrenade, 0, 0, 0, 1)
+ elseif CGR == 5 then -------
+ g = AddGear(x+30, y+30, gtGrenade, 0, 0, 0, 1)
+ g = AddGear(x-30, y-30, gtGrenade, 0, 0, 0, 1)
+ elseif CGR == 6 then
+ g = AddGear(x, y+30, gtGrenade, 0, 0, 0, 1)
+ g = AddGear(x, y-30, gtGrenade, 0, 0, 0, 1)
+ elseif CGR == 7 then -------
+ g = AddGear(x+30, y-30, gtGrenade, 0, 0, 0, 1)
+ g = AddGear(x-30, y+30, gtGrenade, 0, 0, 0, 1)
+ end
+]]
+ end
+
+ end
+
+end
+
+--------------------------------------------------
+-- EVENT HANDLERS
+--------------------------------------------------
+
+function onTaunt(t)
+ tauntString = tauntString .. t
+ if (tauntString == "101") and (clanPower[GetHogClan(CurrentHedgehog)] < 300) and (clanBoon[GetHogClan(CurrentHedgehog)] == false) then
+ clanBoon[GetHogClan(CurrentHedgehog)] = true
+ clanPower[GetHogClan(CurrentHedgehog)] = 1000
+ AddCaption(loc("The Great Hog in the sky sees your sadness and grants you a boon."))
+ end
+end
+
+---------------------------------------------------------------
+-- Cycle through selection subsets (by changing pIndex, pMode)
+-- i.e health of barrels, medikits,
+-- timer of mines
+-- contents of crates
+-- gears to reposition etc.
+---------------------------------------------------------------
+
+function updateCost()
+
+ if pMode[pIndex] == loc("Healing Station") then
+ placedExpense = 50
+ elseif pMode[pIndex] == loc("Weapon Filter") then
+ placedExpense = 50
+ elseif pMode[pIndex] == loc("Bio-Filter") then
+ placedExpense = 100
+ elseif pMode[pIndex] == loc("Respawner") then
+ placedExpense = 300
+ elseif pMode[pIndex] == loc("Teleportation Node") then
+ placedExpense = 30
+ elseif pMode[pIndex] == loc("Support Station") then
+ placedExpense = 50
+ elseif pMode[pIndex] == loc("Construction Station") then
+ placedExpense = 50
+ elseif pMode[pIndex] == loc("Generator") then
+ placedExpense = 300
+ elseif pMode[pIndex] == loc("Reflector Shield") then
+ placedExpense = 200
+ elseif pMode[pIndex] == loc("Core") then
+ placedExpense = 1
+ elseif cat[cIndex] == loc("Weapon Crate Placement Mode") then
+ placedExpense = atkArray[pIndex][5]
+ elseif cat[cIndex] == loc("Utility Crate Placement Mode") then
+ placedExpense = utilArray[pIndex][5]
+ end
+
+ AddCaption(loc("Cost") .. ": " .. placedExpense,0xffba00ff,capgrpAmmostate)
+
+end
+
+function onLeft()
+
+ pIndex = pIndex - 1
+ if pIndex == 0 then
+ pIndex = #pMode
+ end
+
+ if (curWep == amGirder) or (curWep == amAirAttack) or (curWep == amNapalm) or (curWep == amDrillStrike) then
+ AddCaption(pMode[pIndex],0xffba00ff,capgrpMessage2)
+ updateCost()
+ end
+
+
+end
+
+function onRight()
+
+ pIndex = pIndex + 1
+ if pIndex > #pMode then
+ pIndex = 1
+ end
+
+ if (curWep == amGirder) or (curWep == amAirAttack) or (curWep == amNapalm) or (curWep == amDrillStrike) then
+ AddCaption(pMode[pIndex],0xffba00ff,capgrpMessage2)
+ updateCost()
+ end
+
+end
+
+
+function updatePlacementDisplay(pDir)
+
+ foundMatch = false
+ while(foundMatch == false) do
+ cIndex = cIndex + pDir
+
+ if (cIndex == 1) or (cIndex == 2) then --1 --we no longer hit girder by normal means
+ cIndex = #cat
+ elseif cIndex > #cat then
+ cIndex = 3 -- 2 ----we no longer hit girder by normal means
+ end
+
+ -- new way of doing things
+ -- sProx[cIndex][2] == true just basically means we have ACCESS to something
+ -- but that doesn't neccessarily mean we are in the correct content menu, anymore
+ -- so we need to refine this a little
+ if sProx[cIndex][2] == true then
+ if (GetCurAmmoType() == amNapalm) then
+ if (sProx[cIndex][1] == loc("Health Crate Placement Mode")) or
+ (sProx[cIndex][1] == loc("Weapon Crate Placement Mode")) or
+ (sProx[cIndex][1] == loc("Utility Crate Placement Mode"))
+ then
+ foundMatch = true
+ end
+ elseif (GetCurAmmoType() == amDrillStrike) then
+ if (sProx[cIndex][1] == loc("Mine Placement Mode")) or
+ (sProx[cIndex][1] == loc("Sticky Mine Placement Mode")) or
+ (sProx[cIndex][1] == loc("Barrel Placement Mode"))
+ then
+ foundMatch = true
+ end
+ elseif (GetCurAmmoType() == amAirAttack) then
+ if sProx[cIndex][1] == loc("Structure Placement Mode") then
+ foundMatch = true
+ end
+ end
+ end
+
+
+ if foundMatch == true then
+ --if sProx[cIndex][2] == true then
+ -- normal case (scrolling through)
+ --foundMatch = true
+ RedefineSubset()
+ updateCost()
+ end
+
+ end
+
+end
+
+---------------------------------------------------------
+-- Cycle through primary categories (by changing cIndex)
+-- i.e mine, sticky mine, barrels
+-- health/weapon/utility crate, placement of gears
+---------------------------------------------------------
+function onUp()
+
+ if ((curWep == amAirAttack) or (curWep == amNapalm) or (curWep == amDrillStrike) ) then
+ updatePlacementDisplay(-1)
+ end
+
+end
+
+function onDown()
+
+ if ((curWep == amAirAttack) or (curWep == amNapalm) or (curWep == amDrillStrike) ) then
+ updatePlacementDisplay(1)
+ end
+
+end
+
+----------------------------
+-- standard event handlers
+----------------------------
+
+function onGameInit()
+
+ Explosives = 0
+ MinesNum = 0
+
+ EnableGameFlags(gfInfAttack)
+
+
+ RedefineSubset()
+
+end
+
+function initialSetup(gear)
+
+ FindPlace(gear, false, clanBoundsSX[GetHogClan(gear)], clanBoundsEX[GetHogClan(gear)],true)
+
+ -- for now, everyone should have this stuff
+ AddAmmo(gear, amAirAttack, 100)
+ AddAmmo(gear, amSwitch, 100)
+ AddAmmo(gear, amSkip, 100)
+
+end
+
+function onGameStart()
+
+ trackTeams()
+
+ ShowMission (
+ loc("CONSTRUCTION MODE"),
+ loc("a Hedgewars mini-game"),
+ " " .. "|" ..
+ loc("Build a fortress and destroy your enemy.") .. "|" ..
+ --loc("Defend your core from the enemy.") .. "|" ..
+ loc("There are a variety of structures available to aid you.") .. "|" ..
+ loc("Use the air-attack weapons and the arrow keys to select structures.") .. "|" ..
+ " " .. "|" ..
+ --loc("Core") .. ": " .. loc("Allows placement of structures.") .. "|" ..
+ loc("Healing Station") .. ": " .. loc("Grants nearby hogs life-regeneration.") .. "|" ..
+ loc("Bio-Filter") .. ": " .. loc("Aggressively removes enemy hedgehogs.") .. "|" ..
+ loc("Weapon Filter") .. ": " .. loc("Dematerializes weapons and equipment carried by enemy hedgehogs.") .. "|" ..
+ loc("Reflector Shield") .. ": " .. loc("Reflects enemy projectiles.") .. "|" ..
+
+ loc("Generator") .. ": " .. loc("Generates power.") .. "|" ..
+ loc("Respawner") .. ": " .. loc("Resurrects dead hedgehogs.") .. "|" ..
+ loc("Teleporation Node") .. ": " .. loc("Allows free teleportation between other nodes.") .. "|" ..
+ loc("Construction Station") .. ": " .. loc("Allows placement of girders, rubber-bands, mines, sticky mines and barrels.") .. "|" ..
+ loc("Support Station") .. ": " .. loc("Allows the placement of weapons, utiliites, and health crates.") .. "|" ..
+
+
+ " " .. "|" ..
+ --" " .. "|" ..
+ "", 4, 5000
+ )
+
+
+ sCirc = AddVisualGear(0,0,vgtCircle,0,true)
+ SetVisualGearValues(sCirc, 0, 0, 100, 255, 1, 10, 0, 40, 3, 0x00000000)
+
+ for i = 0, ClansCount-1 do
+ clanPower[i] = 500
+ clanBoon[i] = false
+ clanLWepIndex[i] = 1 -- for ease of use let's track this stuff
+ clanLUtilIndex[i] = 1
+ clanLGearIndex[i] = 1
+ clanUsedExtraTime[i] = false
+ clanCratesSpawned[i] = 0
+
+
+ end
+
+ tMapWidth = RightX - LeftX
+ tMapHeight = WaterLine - TopY
+ clanInterval = div(tMapWidth,ClansCount)
+
+ for i = 1, ClansCount do
+
+ clanBoundsSX[i-1] = LeftX+(clanInterval*i)-clanInterval+20
+ clanBoundsSY[i-1] = TopY
+ clanBoundsEX[i-1] = LeftX+(clanInterval*i)-20
+ clanBoundsEY[i-1] = WaterLine
+
+ --top and bottom
+ AddWall(LeftX+(clanInterval*i)-clanInterval,TopY,clanInterval,margin,GetClanColor(i-1))
+ AddWall(LeftX+(clanInterval*i)-clanInterval,WaterLine-25,clanInterval,margin,GetClanColor(i-1))
+
+ --add a wall to the left and right
+ AddWall(LeftX+(clanInterval*i)-clanInterval+20,TopY,margin,WaterLine,GetClanColor(i-1))
+ AddWall(LeftX+(clanInterval*i)-20,TopY,margin,WaterLine,GetClanColor(i-1))
+
+ end
+
+ runOnHogs(initialSetup)
+
+end
+
+
+function onNewTurn()
+
+ tauntString = ""
+ clanPower[GetHogClan(CurrentHedgehog)] = clanPower[GetHogClan(CurrentHedgehog)] + 50
+ clanUsedExtraTime[GetHogClan(CurrentHedgehog)] = false
+ clanCratesSpawned[GetHogClan(CurrentHedgehog)] = 0
+
+end
+
+function onGameTick()
+ HandleHedgeEditor()
+end
+
+function isATrackedGear(gear)
+ if (GetGearType(gear) == gtHedgehog) or
+ (GetGearType(gear) == gtTarget) or
+ (GetGearType(gear) == gtCase)
+ then
+ return(true)
+ else
+ return(false)
+ end
+end
+
+-- track hedgehogs and placement gears
+function onGearAdd(gear)
+
+ if GetGearType(gear) == gtHedgehog then
+ --table.insert(hhs, gear)
+ elseif (GetGearType(gear) == gtAirAttack) or (GetGearType(gear) == gtTeleport) or (GetGearType(gear) == gtGirder) then
+ cGear = gear
+
+ end
+
+ if isATrackedGear(gear) then
+ trackGear(gear)
+ elseif gearCanBeDeflected(gear) then
+ trackGear(gear)
+ setGearReflectionValues(gear)
+ end
+
+end
+
+function onGearDelete(gear)
+
+ if GetGearType(gear) == gtTarget then
+ CheckGearForStructureLink(gear)
+ end
+
+ if (GetGearType(gear) == gtAirAttack) or (GetGearType(gear) == gtTeleport) or (GetGearType(gear) == gtGirder) then
+ cGear = nil
+ end
+
+ if (isATrackedGear(gear) or gearCanBeDeflected(gear)) then
+
+ if getGearValue(gear, "tCirc") ~= nil then
+ DeleteVisualGear(getGearValue(gear, "tCirc"))
+ end
+
+ trackDeletion(gear)
+
+ end
+
+end