--------------------------------------------------------- --- 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, nil, nil, nil, nil, 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, nil, nil, nil, nil, 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 if (clanPower[GetHogClan(CurrentHedgehog)] >= placedExpense) then AddCaption(loc("Invalid Placement"),0xffba00ff,capgrpVolume) else AddCaption(loc("Insufficient Power"),0xffba00ff,capgrpVolume) end 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(loc(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("Teleportation 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