diff -r cf410db21c80 -r 7a905f0070ce share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua Wed Jul 15 00:27:12 2015 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua Thu Jul 16 08:39:35 2015 -0400 @@ -1,1909 +1,1909 @@ ---------------------------------------------------------- ---- 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(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 +--------------------------------------------------------- +--- 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(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