diff -r 5047d270e7d3 -r 71fb9189d91c share/hedgewars/Data/Maps/CTF_Blizzard/map.lua --- a/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua Thu Dec 30 16:21:14 2010 +0100 +++ b/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua Thu Dec 30 11:32:04 2010 -0500 @@ -1,756 +1,756 @@ --------------------------------- --- CTF_BLIZZARD 0.4 --------------------------------- - ---------- --- 0.2 ---------- - --- disabled super weapons - --- theme modifications - --- improved hog placement system: teams can now be put --- in any order and be of any size - ---------- --- 0.3 ---------- - --- In this version: - --- changed starting weapons --- changed crate drop contents and rate of drops - --- completely removed super weapons and super weapon scripts - --- removed custom respawning --- removed set respawn points - --- added AIRespawn-esque respawning --- added simple left vs right respawn points - --- added non-lethal poison to flag carriers as an indicator - --- improved flag mechanics and player-flag feedback --- flag now instantly respawns if you kill enemy hog and return it, --- or if the flag falls in water, _BUT_ not if it is blown up - ---------- --- 0.4 ---------- - --- tweaked crate drop rates and crate contents --- improved the teleporters, they should now be able to handle rope... hopefully --- updated SetEffect calls to be in line with 0.9.15 definitions --- added visual gears when hogs respawn --- added visual gears when hogs teleport --- added visual gear to track flag and flag carriers --- removed poisoning of flag carriers --- removed health adjustments for flag carriers due to aforementioned poisons - ---------- --- 0.5 ---------- - --- added translation support, hopefully --- added ctf rules --- added effects to the teleporters --- added aura round spawning area --- changed the aura around the flag carrier / flag to an aura and added some support for this --- changed things so the seed is no longer always the same... - - -loadfile(GetDataPath() .. "Scripts/Locale.lua")() - ---------------------------------------------------------------- -----------lots of bad variables and things -----------because someone is too lazy -----------to read about tables properly ------------------- "Oh well, they probably have the memory" - -local actionReset = 0 -- used in CheckTeleporters() - -local roundsCounter = 0 -- used to determine when to spawn more crates - -- currently every 6 TURNS, should this work - -- on ROUNDS instead? -local effectTimer = 0 - --------------------------- --- hog and team tracking variales --------------------------- - -local numhhs = 0 -- store number of hedgehogs -local hhs = {} -- store hedgehog gears - -local numTeams -- store the number of teams in the game -local teamNameArr = {} -- store the list of teams -local teamSize = {} -- store how many hogs per team -local teamIndex = {} -- at what point in the hhs{} does each team begin - -------------------- --- flag variables -------------------- - -local fGear = {} -- pointer to the case gears that represent the flag -local fThief = {} -- pointer to the hogs who stole the flags -local fIsMissing = {} -- have the flags been destroyed or captured -local fNeedsRespawn = {} -- do the flags need to be respawned -local fCaptures = {} -- the team "scores" how many captures -local fSpawnX = {} -- spawn X for flags -local fSpawnY = {} -- spawn Y for flags - -local fThiefX = {} -local fThiefY = {} -local FTTC = 0 -- flag thief tracker counter ---local fThiefsHealed = false - -local fSpawnC = {} -local fCirc = {} -- flag/carrier marker circles -local fCol = {} -- colour of the clans - -local vCircX = {} -local vCircY = {} -local vCircMinA = {} -local vCircMaxA = {} -local vCircType = {} -local vCircPulse = {} -local vCircFuckAll = {} -local vCircRadius = {} -local vCircWidth = {} -local vCircCol = {} - - --------------------------------- ---zone and teleporter variables --------------------------------- - -local redTel -local orangeTel ---local areaArr = {} -- no longer used - -local zXMin = {} -local zWidth = {} -local zYMin = {} -local zHeight = {} -local zOccupied = {} -local zCount = 0 - ------------------------- --- zone methods ------------------------- --- see on gameTick also - -function ManageTeleporterEffects() - effectTimer = effectTimer + 1 - if effectTimer > 50 then -- 100 - effectTimer = 0 - - for i = 0,1 do - eX = 10 + zXMin[i] + GetRandom(zWidth[i]-10) - eY = 50 + zYMin[i] + GetRandom(zHeight[i]-110) - - -- steam and smoke and DUST look good, smokering looks trippy - -- smoketrace and eviltrace are not effected by wind? - -- chunk is a LR falling gear - 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, g8, g9, fCol[i]) - end - end - end -end - -function CreateZone(xMin, yMin, width, height) - - - zXMin[zCount] = xMin - zYMin[zCount] = yMin - zWidth[zCount] = width - zHeight[zCount] = height - zOccupied[zCount] = false - zCount = zCount + 1 - - return (zCount-1) - -end - -function GearIsInZone(gear, zI) - - if (GetX(gear) > zXMin[zI]) and (GetX(gear) < (zXMin[zI]+zWidth[zI])) and (GetY(gear) > zYMin[zI]) and (GetY(gear) < (zYMin[zI]+zHeight[zI])) then - zOccupied[zI] = true - else - zOccupied[zI] = false - end - - return zOccupied[zI] - -end - ------------------------- ---flag methods ------------------------- - -function CheckScore(teamID) - - if teamID == 0 then - alt = 1 - winner = "Red" - - elseif teamID == 1 then - alt = 0 - winner = "Blue" - end - - if fCaptures[teamID] == 2 then - for i = 0, (numhhs-1) do - if GetHogClan(hhs[i]) == alt then - SetEffect(hhs[i], heResurrectable, false) - SetHealth(hhs[i],0) - end - end - --ShowMission("GAME OVER!", "Victory for the " .. winner .. " Team!", "Hooray!", 0, 0) - ShowMission(loc("GAME OVER!"), loc("Victory for the ") .. GetHogTeamName(CurrentHedgehog), loc("Hooray!"), 0, 0) - end - -end - -function HandleRespawns() - - for i = 0, 1 do - - if fNeedsRespawn[i] == true then - fGear[i] = SpawnAmmoCrate(fSpawnX[i],fSpawnY[i],amSkip) - --fGear[i] = SpawnHealthCrate(fSpawnX[i],fSpawnY[i]) - fNeedsRespawn[i] = false - fIsMissing[i] = false -- new, this should solve problems of a respawned flag being "returned" when a player tries to score - AddCaption(loc("Flag respawned!")) - end - - end - -end - -function FlagDeleted(gear) - - if (gear == fGear[0]) then - wtf = 0 - bbq = 1 - elseif (gear == fGear[1]) then - wtf = 1 - bbq = 0 - end - - --ShowMission("OH HAI!", "FlagDeleted was called", "Oh noes!", -amBazooka, 0) - - if CurrentHedgehog ~= nil then - - --ShowMission("GUESS WAT?", "I'm not nil", "Oh noes!", -amBazooka, 0) - --if the player picks up the flag - if CheckDistance(CurrentHedgehog, fGear[wtf]) < 1600 then - - fGear[wtf] = nil -- the flag has now disappeared and we shouldnt be pointing to it - - -- player has successfully captured the enemy flag - if (GetHogClan(CurrentHedgehog) == wtf) and (CurrentHedgehog == fThief[bbq]) and (fIsMissing[wtf] == false) then - fIsMissing[wtf] = false - fNeedsRespawn[wtf] = true - fIsMissing[bbq] = false - fNeedsRespawn[bbq] = true - fCaptures[wtf] = fCaptures[wtf] +1 --fCaptures[wtf] - - --ShowMission(loc("You have SCORED!!"), "Red Team: " .. fCaptures[0], "Blue Team: " .. fCaptures[1], -amBazooka, 0) - ShowMission(loc("You have SCORED!!"), GetHogTeamName(CurrentHedgehog) .. ": " .. fCaptures[wtf], loc("Opposing Team: ") .. fCaptures[bbq], 0, 0) - - PlaySound(sndVictory) - --SetEffect(fThief[bbq], hePoisoned, false) - fThief[bbq] = nil -- player no longer has the enemy flag - CheckScore(wtf) - - --if the player is returning the flag - elseif GetHogClan(CurrentHedgehog) == wtf then - - fNeedsRespawn[wtf] = true - - -- NEW ADDIITON, does this work? Should make it possible to return your flag and then score in the same turn - if fIsMissing[wtf] == true then - HandleRespawns() -- this will set fIsMissing[wtf] to false :) - AddCaption(loc("Flag returned!")) - elseif fIsMissing[wtf] == false then - AddCaption(loc("That was pointless.") .. loc("The flag will respawn next round.")) - end - - --fIsMissing[wtf] = false - --ShowMission("Flag returned!", "Hooray", "", -amBazooka, 0) - - --if the player is taking the enemy flag - elseif GetHogClan(CurrentHedgehog) == bbq then - fIsMissing[wtf] = true - for i = 0,numhhs-1 do - if CurrentHedgehog == hhs[i] then - fThief[wtf] = hhs[i] - --SetEffect(fThief[wtf], hePoisoned, true) - end - end - - AddCaption(loc("Flag captured!")) - - else --below line doesnt usually get called - AddCaption("Hmm... that wasn't supposed to happen...") - - end - - -- if flag has been destroyed, probably - else - - if GetY(fGear[wtf]) > 2025 then - fGear[wtf] = nil - fIsMissing[wtf] = true - fNeedsRespawn[wtf] = true - HandleRespawns() - else - fGear[wtf] = nil - fIsMissing[wtf] = true - fNeedsRespawn[wtf] = true - AddCaption(loc("Boom!") .. " " .. loc("The flag will respawn next round.")) - end - - end - - -- if flag has been destroyed deep underwater and player is now nil - -- probably only gets called if the flag thief drowns himself - -- otherwise the above one will work fine - else - --ShowMission("NIL PLAYER!", "Oh snap", "Oh noes!", -amBazooka, 0) - fGear[wtf] = nil - fIsMissing[wtf] = true - fNeedsRespawn[wtf] = true - AddCaption(loc("The flag will respawn next round.")) - end - -end - -function FlagThiefDead(gear) - - if (gear == fThief[0]) then - wtf = 0 - bbq = 1 - elseif (gear == fThief[1]) then - wtf = 1 - bbq = 0 - end - - if fThief[wtf] ~= nil then - --SetEffect(fThief[wtf], hePoisoned, false) - fGear[wtf] = SpawnAmmoCrate(fThiefX[wtf],fThiefY[wtf]-50,amSkip) - AddVisualGear(fThiefX[wtf], fThiefY[wtf], vgtBigExplosion, 0, false) - fThief[wtf] = nil - end - -end - -function HandleCircles() - - for i = 0, 1 do - if fIsMissing[i] == false then -- draw a circle at the flag's spawning place - --SetVisualGearValues(fCirc[i], fSpawnX[i],fSpawnY[i], 20, 200, 0, 0, 100, 33, 2, fCol[i]) - SetVisualGearValues(fCirc[i], fSpawnX[i],fSpawnY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i]) - elseif (fIsMissing[i] == true) and (fNeedsRespawn[i] == false) then - if fThief[i] ~= nil then -- draw circle round flag carrier - --SetVisualGearValues(fCirc[i], fThiefX[i], fThiefY[i], 20, 200, 0, 0, 100, 33, 2, fCol[i]) - SetVisualGearValues(fCirc[i], fThiefX[i], fThiefY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i]) - elseif fThief[i] == nil then -- draw cirle round dropped flag - --SetVisualGearValues(fCirc[i], GetX(fGear[i]), GetY(fGear[i]), 20, 200, 0, 0, 100, 33, 2, fCol[i]) - SetVisualGearValues(fCirc[i], GetX(fGear[i]),GetY(fGear[i]), vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i]) - end - end - - if fNeedsRespawn[i] == true then -- if the flag has been destroyed, no need for a circle - SetVisualGearValues(fCirc[i], fSpawnX[i],fSpawnY[i], 20, 200, 0, 0, 100, 0, 0, fCol[i]) - end - end - -end - ------------------------- --- general methods ------------------------- - -function CheckDistance(gear1, gear2) - - g1X, g1Y = GetGearPosition(gear1) - g2X, g2Y = GetGearPosition(gear2) - - g1X = g1X - g2X - g1Y = g1Y - g2Y - z = (g1X*g1X) + (g1Y*g1Y) - - --dist = math.sqrt(z) - - dist = z - - return dist - -end - -function CheckTeleporters() - - teleportActive = false - - if (GearIsInZone(CurrentHedgehog, redTel) == true) and (GetHogClan(CurrentHedgehog) == 0) then - teleportActive = true - destinationX = 1402 - destinationY = 321 - elseif (GearIsInZone(CurrentHedgehog, orangeTel) == true) and (GetHogClan(CurrentHedgehog) == 1) then - teleportActive = true - destinationX = 2692 - destinationY = 321 - end - - if teleportActive == true then - if actionReset == 0 then - SetGearMessage(CurrentHedgehog, gmAttack) - --AddCaption(actionReset .. ";" .. "attack") - elseif actionReset == 10 then - SetGearMessage(CurrentHedgehog, 0) - --AddCaption(actionReset .. ";" .. "reset") - elseif actionReset == 20 then - AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtBigExplosion, 0, false) - SetGearPosition(CurrentHedgehog,destinationX,destinationY) - AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtBigExplosion, 0, false) - --AddCaption(actionReset .. ";" .. "teleport") - end - - actionReset = actionReset + 1 - if actionReset >= 30 then - actionReset = 0 - end - - end - -end - -function RebuildTeamInfo() - - - -- make a list of individual team names - for i = 0, 5 do - teamNameArr[i] = i - teamSize[i] = 0 - teamIndex[i] = 0 - end - numTeams = 0 - - for i = 0, (numhhs-1) do - - z = 0 - unfinished = true - while(unfinished == true) do - - newTeam = true - tempHogTeamName = GetHogTeamName(hhs[i]) -- this is the new name - - if tempHogTeamName == teamNameArr[z] then - newTeam = false - unfinished = false - end - - z = z + 1 - - if z == TeamsCount then - unfinished = false - if newTeam == true then - teamNameArr[numTeams] = tempHogTeamName - numTeams = numTeams + 1 - end - end - - end - - end - - -- find out how many hogs per team, and the index of the first hog in hhs - for i = 0, numTeams-1 do - - for z = 0, numhhs-1 do - if GetHogTeamName(hhs[z]) == teamNameArr[i] then - if teamSize[i] == 0 then - teamIndex[i] = z -- should give starting index - end - teamSize[i] = teamSize[i] + 1 - --add a pointer so this hog appears at i in hhs - end - end - - end - -end - -function HandleCrateDrops() - - roundsCounter = roundsCounter +1 - - if roundsCounter == 5 then - - roundsCounter = 0 - - r = GetRandom(8) - if r == 0 then - SpawnUtilityCrate(0,0,amSwitch) - elseif r == 1 then - SpawnUtilityCrate(0,0,amTeleport) - elseif r == 2 then - SpawnUtilityCrate(0,0,amJetpack) - elseif r == 3 then - SpawnUtilityCrate(0,0,amExtraTime) - elseif r == 4 then - SpawnUtilityCrate(0,0,amGirder) - elseif r == 5 then - SpawnAmmoCrate(0,0,amDynamite) - elseif r == 6 then - SpawnAmmoCrate(0,0,amFlamethrower) - elseif r == 7 then - SpawnUtilityCrate(0,0,amPortalGun) - end - - end - -end - ------------------------- --- game methods ------------------------- - -function onGameInit() - - -- Things we don't modify here will use their default values. - GameFlags = gfDivideTeams -- Game settings and rules - TurnTime = 30000 -- (was 30) The time the player has to move each round (in ms) - CaseFreq = 0 -- The frequency of crate drops - MinesNum = 0 -- The number of mines being placed - MinesTime = 2000 - Explosives = 0 -- The number of explosives being placed - Delay = 10 -- The delay between each round - SuddenDeathTurns = 99 -- suddendeath is off, effectively - Map = "Blizzard" -- The map to be played - Theme = "Snow" -- The theme to be used "Nature" - -end - - -function onGameStart() - - --ShowMission(loc(caption), loc(subcaption), loc(goal), 0, 0) - ShowMission(loc("CTF_BLIZZARD") .. " 0.5", loc("by mikade"), loc(" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"), 0, 0) - - - -- initialize teleporters - redTel = CreateZone(342,1316,42,449) -- red teleporter - orangeTel = CreateZone(3719,1330,45,449) -- orange teleporter - - - --new improved placement schematics aw yeah - RebuildTeamInfo() - --ShowMission("Team Info Rebuilt", "Here you go:", "TeamCount: " .. TeamsCount .. "|" .. teamNameArr[0] .. ": " .. teamSize[0] .. " Hogs|" .. teamNameArr[1] .. ": " .. teamSize[1] .. " Hogs|" .. teamNameArr[2] .. ": " .. teamSize[2] .. " Hogs|", 0, 0) - team1Placed = 0 - team2Placed = 0 - for i = 0, (TeamsCount-1) do - for g = teamIndex[i], (teamIndex[i]+teamSize[i]-1) do - if GetHogClan(hhs[g]) == 0 then - SetGearPosition(hhs[g],1403+ ((team1Placed+1)*50),1570) - team1Placed = team1Placed +1 - if team1Placed > 6 then - team1Placed = 0 - end - elseif GetHogClan(hhs[g]) == 1 then - SetGearPosition(hhs[g],2230+ ((team2Placed+1)*50),1570) - team2Placed = team2Placed +1 - if team2Placed > 6 then - team2Placed = 0 - end - end - end - end - - - - --spawn starting ufos and or super weapons - SpawnAmmoCrate(2048,1858,amJetpack) - --SpawnUtilityCrate(2048,1858,amExtraTime) - - --set flag spawn points and spawn the flags - fSpawnX[0] = 957 - fSpawnY[0] = 1747 - fSpawnX[1] = 3123 - fSpawnY[1] = 1747 - - for i = 0, 1 do - fGear[i] = SpawnAmmoCrate(fSpawnX[i],fSpawnY[i],amSkip) - fCirc[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true) - fCol[i] = GetClanColor(i) - - fSpawnC[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true) - SetVisualGearValues(fSpawnC[i], fSpawnX[i],fSpawnY[i], 10, 200, 1, 10, 0, 300, 5, fCol[i]) - - - fIsMissing[i] = false - fNeedsRespawn[i] = false - fCaptures[i] = 0 - - vCircMinA[i] = 20 - vCircMaxA[i] = 255 - vCircType[i] = 1 - vCircPulse[i] = 10 - vCircFuckAll[i] = 0 - vCircRadius[i] = 150 - vCircWidth[i] = 5 - vCircCol[i] = fCol[i] - - SetVisualGearValues(fCirc[i], fSpawnX[i],fSpawnY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i]) - - end - -end - - -function onNewTurn() - - if lastTeam ~= GetHogTeamName(CurrentHedgehog) then - lastTeam = GetHogTeamName(CurrentHedgehog) - end - - for i = 0, 1 do - if fThief[i] ~= nil then - --adjust = 5 + GetHealth(fThief[i]) - --SetHealth(fThief[i], adjust) - --AddCaption('Helped out the flag poisoned flag thiefs') - end - end - - --AddCaption("Handling respawns") - HandleRespawns() - HandleCrateDrops() - - --myC = AddVisualGear(GetX(CurrentHedgehog),GetY(CurrentHedgehog),vgtCircle,0,true) - --SetVisualGearValues(myC, GetX(CurrentHedgehog),GetY(CurrentHedgehog), 20, 200, 0, 0, 100, 50, 3, GetClanColor(GetHogClan(CurrentHedgehog))) - -end - -function onGameTick() - - -- onRessurect calls AFTER you have resurrected, - -- so keeping track of x,y a few milliseconds before - -- is useful - --FTTC = FTTC + 1 - --if FTTC == 100 then - -- FTTC = 0 - for i = 0,1 do - if fThief[i] ~= nil then - fThiefX[i] = GetX(fThief[i]) - fThiefY[i] = GetY(fThief[i]) - end - end - --end - - -- things we wanna check often - if (CurrentHedgehog ~= nil) then - --AddCaption(GetX(CurrentHedgehog) .. "; " .. GetY(CurrentHedgehog)) - --AddCaption("Checking Teleporters") - CheckTeleporters() - end - - HandleCircles() - ManageTeleporterEffects() - -end - - -function onAmmoStoreInit() - - SetAmmo(amDrill,9,0,0,0) - SetAmmo(amMortar,9,0,0,0) - - SetAmmo(amGrenade,9,0,0,0) - SetAmmo(amClusterBomb,4,0,0,0) - - --SetAmmo(amDEagle, 4, 0, 0, 0) - SetAmmo(amShotgun, 9, 0, 0, 0) - SetAmmo(amFlamethrower, 1, 0, 0, 1) - - SetAmmo(amFirePunch, 9, 0, 0, 0) - SetAmmo(amBaseballBat, 2, 0, 0, 0) - - SetAmmo(amDynamite,2,0,0,1) - SetAmmo(amSMine,4,0,0,0) - - SetAmmo(amBlowTorch, 9, 0, 0, 0) - SetAmmo(amPickHammer, 9, 0, 0, 0) - SetAmmo(amGirder, 2, 0, 0, 2) - SetAmmo(amPortalGun, 2, 0, 0, 2) - - SetAmmo(amParachute, 9, 0, 0, 0) - SetAmmo(amRope, 9, 0, 0, 0) - SetAmmo(amTeleport, 1, 0, 0, 1) - SetAmmo(amJetpack, 1, 0, 0, 1) - - SetAmmo(amSwitch, 2, 0, 0, 1) - SetAmmo(amExtraTime,1,0,0,1) - SetAmmo(amLowGravity,1,0,0,0) - SetAmmo(amSkip, 9, 0, 0, 0) - -end - - -function onGearResurrect(gear) - - --AddCaption("A gear has been resurrected!") - - -- mark the flag thief as dead if he needed a respawn - for i = 0,1 do - if gear == fThief[i] then - FlagThiefDead(gear) - end - end - - -- place hogs belonging to each clan either left or right side of map - if GetHogClan(gear) == 0 then - FindPlace(gear, false, 0, 2048) - elseif GetHogClan(gear) == 1 then - FindPlace(gear, false, 2048, LAND_WIDTH) - end - - AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) - -end - -function onGearDamage(gear, damage) - - -- >_< damn, occurs too fast, before the hog has finished moving / updated his health - --if GetGearType(gear) == gtHedgehog then - -- if damage > GetHealth(gear) then - -- AddVisualGear(GetX(gear), GetY(gear), vgtExplosion, 0, false) - -- end - --end - -end - -function onGearAdd(gear) - - if GetGearType(gear) == gtHedgehog then - - hhs[numhhs] = gear - numhhs = numhhs + 1 - SetEffect(gear, heResurrectable, true) - - end - -end - -function onGearDelete(gear) - - if (gear == fGear[0]) or (gear == fGear[1]) then - FlagDeleted(gear) - end - -end +-------------------------------- +-- CTF_BLIZZARD 0.4 +-------------------------------- + +--------- +-- 0.2 +--------- + +-- disabled super weapons + +-- theme modifications + +-- improved hog placement system: teams can now be put +-- in any order and be of any size + +--------- +-- 0.3 +--------- + +-- In this version: + +-- changed starting weapons +-- changed crate drop contents and rate of drops + +-- completely removed super weapons and super weapon scripts + +-- removed custom respawning +-- removed set respawn points + +-- added AIRespawn-esque respawning +-- added simple left vs right respawn points + +-- added non-lethal poison to flag carriers as an indicator + +-- improved flag mechanics and player-flag feedback +-- flag now instantly respawns if you kill enemy hog and return it, +-- or if the flag falls in water, _BUT_ not if it is blown up + +--------- +-- 0.4 +--------- + +-- tweaked crate drop rates and crate contents +-- improved the teleporters, they should now be able to handle rope... hopefully +-- updated SetEffect calls to be in line with 0.9.15 definitions +-- added visual gears when hogs respawn +-- added visual gears when hogs teleport +-- added visual gear to track flag and flag carriers +-- removed poisoning of flag carriers +-- removed health adjustments for flag carriers due to aforementioned poisons + +--------- +-- 0.5 +--------- + +-- added translation support, hopefully +-- added ctf rules +-- added effects to the teleporters +-- added aura round spawning area +-- changed the aura around the flag carrier / flag to an aura and added some support for this +-- changed things so the seed is no longer always the same... + + +loadfile(GetDataPath() .. "Scripts/Locale.lua")() + +--------------------------------------------------------------- +----------lots of bad variables and things +----------because someone is too lazy +----------to read about tables properly +------------------ "Oh well, they probably have the memory" + +local actionReset = 0 -- used in CheckTeleporters() + +local roundsCounter = 0 -- used to determine when to spawn more crates + -- currently every 6 TURNS, should this work + -- on ROUNDS instead? +local effectTimer = 0 + +-------------------------- +-- hog and team tracking variales +-------------------------- + +local numhhs = 0 -- store number of hedgehogs +local hhs = {} -- store hedgehog gears + +local numTeams -- store the number of teams in the game +local teamNameArr = {} -- store the list of teams +local teamSize = {} -- store how many hogs per team +local teamIndex = {} -- at what point in the hhs{} does each team begin + +------------------- +-- flag variables +------------------- + +local fGear = {} -- pointer to the case gears that represent the flag +local fThief = {} -- pointer to the hogs who stole the flags +local fIsMissing = {} -- have the flags been destroyed or captured +local fNeedsRespawn = {} -- do the flags need to be respawned +local fCaptures = {} -- the team "scores" how many captures +local fSpawnX = {} -- spawn X for flags +local fSpawnY = {} -- spawn Y for flags + +local fThiefX = {} +local fThiefY = {} +local FTTC = 0 -- flag thief tracker counter +--local fThiefsHealed = false + +local fSpawnC = {} +local fCirc = {} -- flag/carrier marker circles +local fCol = {} -- colour of the clans + +local vCircX = {} +local vCircY = {} +local vCircMinA = {} +local vCircMaxA = {} +local vCircType = {} +local vCircPulse = {} +local vCircFuckAll = {} +local vCircRadius = {} +local vCircWidth = {} +local vCircCol = {} + + +-------------------------------- +--zone and teleporter variables +-------------------------------- + +local redTel +local orangeTel +--local areaArr = {} -- no longer used + +local zXMin = {} +local zWidth = {} +local zYMin = {} +local zHeight = {} +local zOccupied = {} +local zCount = 0 + +------------------------ +-- zone methods +------------------------ +-- see on gameTick also + +function ManageTeleporterEffects() + effectTimer = effectTimer + 1 + if effectTimer > 50 then -- 100 + effectTimer = 0 + + for i = 0,1 do + eX = 10 + zXMin[i] + GetRandom(zWidth[i]-10) + eY = 50 + zYMin[i] + GetRandom(zHeight[i]-110) + + -- steam and smoke and DUST look good, smokering looks trippy + -- smoketrace and eviltrace are not effected by wind? + -- chunk is a LR falling gear + 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, g8, g9, fCol[i]) + end + end + end +end + +function CreateZone(xMin, yMin, width, height) + + + zXMin[zCount] = xMin + zYMin[zCount] = yMin + zWidth[zCount] = width + zHeight[zCount] = height + zOccupied[zCount] = false + zCount = zCount + 1 + + return (zCount-1) + +end + +function GearIsInZone(gear, zI) + + if (GetX(gear) > zXMin[zI]) and (GetX(gear) < (zXMin[zI]+zWidth[zI])) and (GetY(gear) > zYMin[zI]) and (GetY(gear) < (zYMin[zI]+zHeight[zI])) then + zOccupied[zI] = true + else + zOccupied[zI] = false + end + + return zOccupied[zI] + +end + +------------------------ +--flag methods +------------------------ + +function CheckScore(teamID) + + if teamID == 0 then + alt = 1 + winner = "Red" + + elseif teamID == 1 then + alt = 0 + winner = "Blue" + end + + if fCaptures[teamID] == 2 then + for i = 0, (numhhs-1) do + if GetHogClan(hhs[i]) == alt then + SetEffect(hhs[i], heResurrectable, false) + SetHealth(hhs[i],0) + end + end + --ShowMission("GAME OVER!", "Victory for the " .. winner .. " Team!", "Hooray!", 0, 0) + ShowMission(loc("GAME OVER!"), loc("Victory for the ") .. GetHogTeamName(CurrentHedgehog), loc("Hooray!"), 0, 0) + end + +end + +function HandleRespawns() + + for i = 0, 1 do + + if fNeedsRespawn[i] == true then + fGear[i] = SpawnAmmoCrate(fSpawnX[i],fSpawnY[i],amSkip) + --fGear[i] = SpawnHealthCrate(fSpawnX[i],fSpawnY[i]) + fNeedsRespawn[i] = false + fIsMissing[i] = false -- new, this should solve problems of a respawned flag being "returned" when a player tries to score + AddCaption(loc("Flag respawned!")) + end + + end + +end + +function FlagDeleted(gear) + + if (gear == fGear[0]) then + wtf = 0 + bbq = 1 + elseif (gear == fGear[1]) then + wtf = 1 + bbq = 0 + end + + --ShowMission("OH HAI!", "FlagDeleted was called", "Oh noes!", -amBazooka, 0) + + if CurrentHedgehog ~= nil then + + --ShowMission("GUESS WAT?", "I'm not nil", "Oh noes!", -amBazooka, 0) + --if the player picks up the flag + if CheckDistance(CurrentHedgehog, fGear[wtf]) < 1600 then + + fGear[wtf] = nil -- the flag has now disappeared and we shouldnt be pointing to it + + -- player has successfully captured the enemy flag + if (GetHogClan(CurrentHedgehog) == wtf) and (CurrentHedgehog == fThief[bbq]) and (fIsMissing[wtf] == false) then + fIsMissing[wtf] = false + fNeedsRespawn[wtf] = true + fIsMissing[bbq] = false + fNeedsRespawn[bbq] = true + fCaptures[wtf] = fCaptures[wtf] +1 --fCaptures[wtf] + + --ShowMission(loc("You have SCORED!!"), "Red Team: " .. fCaptures[0], "Blue Team: " .. fCaptures[1], -amBazooka, 0) + ShowMission(loc("You have SCORED!!"), GetHogTeamName(CurrentHedgehog) .. ": " .. fCaptures[wtf], loc("Opposing Team: ") .. fCaptures[bbq], 0, 0) + + PlaySound(sndVictory) + --SetEffect(fThief[bbq], hePoisoned, false) + fThief[bbq] = nil -- player no longer has the enemy flag + CheckScore(wtf) + + --if the player is returning the flag + elseif GetHogClan(CurrentHedgehog) == wtf then + + fNeedsRespawn[wtf] = true + + -- NEW ADDIITON, does this work? Should make it possible to return your flag and then score in the same turn + if fIsMissing[wtf] == true then + HandleRespawns() -- this will set fIsMissing[wtf] to false :) + AddCaption(loc("Flag returned!")) + elseif fIsMissing[wtf] == false then + AddCaption(loc("That was pointless.") .. loc("The flag will respawn next round.")) + end + + --fIsMissing[wtf] = false + --ShowMission("Flag returned!", "Hooray", "", -amBazooka, 0) + + --if the player is taking the enemy flag + elseif GetHogClan(CurrentHedgehog) == bbq then + fIsMissing[wtf] = true + for i = 0,numhhs-1 do + if CurrentHedgehog == hhs[i] then + fThief[wtf] = hhs[i] + --SetEffect(fThief[wtf], hePoisoned, true) + end + end + + AddCaption(loc("Flag captured!")) + + else --below line doesnt usually get called + AddCaption("Hmm... that wasn't supposed to happen...") + + end + + -- if flag has been destroyed, probably + else + + if GetY(fGear[wtf]) > 2025 then + fGear[wtf] = nil + fIsMissing[wtf] = true + fNeedsRespawn[wtf] = true + HandleRespawns() + else + fGear[wtf] = nil + fIsMissing[wtf] = true + fNeedsRespawn[wtf] = true + AddCaption(loc("Boom!") .. " " .. loc("The flag will respawn next round.")) + end + + end + + -- if flag has been destroyed deep underwater and player is now nil + -- probably only gets called if the flag thief drowns himself + -- otherwise the above one will work fine + else + --ShowMission("NIL PLAYER!", "Oh snap", "Oh noes!", -amBazooka, 0) + fGear[wtf] = nil + fIsMissing[wtf] = true + fNeedsRespawn[wtf] = true + AddCaption(loc("The flag will respawn next round.")) + end + +end + +function FlagThiefDead(gear) + + if (gear == fThief[0]) then + wtf = 0 + bbq = 1 + elseif (gear == fThief[1]) then + wtf = 1 + bbq = 0 + end + + if fThief[wtf] ~= nil then + --SetEffect(fThief[wtf], hePoisoned, false) + fGear[wtf] = SpawnAmmoCrate(fThiefX[wtf],fThiefY[wtf]-50,amSkip) + AddVisualGear(fThiefX[wtf], fThiefY[wtf], vgtBigExplosion, 0, false) + fThief[wtf] = nil + end + +end + +function HandleCircles() + + for i = 0, 1 do + if fIsMissing[i] == false then -- draw a circle at the flag's spawning place + --SetVisualGearValues(fCirc[i], fSpawnX[i],fSpawnY[i], 20, 200, 0, 0, 100, 33, 2, fCol[i]) + SetVisualGearValues(fCirc[i], fSpawnX[i],fSpawnY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i]) + elseif (fIsMissing[i] == true) and (fNeedsRespawn[i] == false) then + if fThief[i] ~= nil then -- draw circle round flag carrier + --SetVisualGearValues(fCirc[i], fThiefX[i], fThiefY[i], 20, 200, 0, 0, 100, 33, 2, fCol[i]) + SetVisualGearValues(fCirc[i], fThiefX[i], fThiefY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i]) + elseif fThief[i] == nil then -- draw cirle round dropped flag + --SetVisualGearValues(fCirc[i], GetX(fGear[i]), GetY(fGear[i]), 20, 200, 0, 0, 100, 33, 2, fCol[i]) + SetVisualGearValues(fCirc[i], GetX(fGear[i]),GetY(fGear[i]), vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i]) + end + end + + if fNeedsRespawn[i] == true then -- if the flag has been destroyed, no need for a circle + SetVisualGearValues(fCirc[i], fSpawnX[i],fSpawnY[i], 20, 200, 0, 0, 100, 0, 0, fCol[i]) + end + end + +end + +------------------------ +-- general methods +------------------------ + +function CheckDistance(gear1, gear2) + + g1X, g1Y = GetGearPosition(gear1) + g2X, g2Y = GetGearPosition(gear2) + + g1X = g1X - g2X + g1Y = g1Y - g2Y + z = (g1X*g1X) + (g1Y*g1Y) + + --dist = math.sqrt(z) + + dist = z + + return dist + +end + +function CheckTeleporters() + + teleportActive = false + + if (GearIsInZone(CurrentHedgehog, redTel) == true) and (GetHogClan(CurrentHedgehog) == 0) then + teleportActive = true + destinationX = 1402 + destinationY = 321 + elseif (GearIsInZone(CurrentHedgehog, orangeTel) == true) and (GetHogClan(CurrentHedgehog) == 1) then + teleportActive = true + destinationX = 2692 + destinationY = 321 + end + + if teleportActive == true then + if actionReset == 0 then + SetGearMessage(CurrentHedgehog, gmAttack) + --AddCaption(actionReset .. ";" .. "attack") + elseif actionReset == 10 then + SetGearMessage(CurrentHedgehog, 0) + --AddCaption(actionReset .. ";" .. "reset") + elseif actionReset == 20 then + AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtBigExplosion, 0, false) + SetGearPosition(CurrentHedgehog,destinationX,destinationY) + AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtBigExplosion, 0, false) + --AddCaption(actionReset .. ";" .. "teleport") + end + + actionReset = actionReset + 1 + if actionReset >= 30 then + actionReset = 0 + end + + end + +end + +function RebuildTeamInfo() + + + -- make a list of individual team names + for i = 0, 5 do + teamNameArr[i] = i + teamSize[i] = 0 + teamIndex[i] = 0 + end + numTeams = 0 + + for i = 0, (numhhs-1) do + + z = 0 + unfinished = true + while(unfinished == true) do + + newTeam = true + tempHogTeamName = GetHogTeamName(hhs[i]) -- this is the new name + + if tempHogTeamName == teamNameArr[z] then + newTeam = false + unfinished = false + end + + z = z + 1 + + if z == TeamsCount then + unfinished = false + if newTeam == true then + teamNameArr[numTeams] = tempHogTeamName + numTeams = numTeams + 1 + end + end + + end + + end + + -- find out how many hogs per team, and the index of the first hog in hhs + for i = 0, numTeams-1 do + + for z = 0, numhhs-1 do + if GetHogTeamName(hhs[z]) == teamNameArr[i] then + if teamSize[i] == 0 then + teamIndex[i] = z -- should give starting index + end + teamSize[i] = teamSize[i] + 1 + --add a pointer so this hog appears at i in hhs + end + end + + end + +end + +function HandleCrateDrops() + + roundsCounter = roundsCounter +1 + + if roundsCounter == 5 then + + roundsCounter = 0 + + r = GetRandom(8) + if r == 0 then + SpawnUtilityCrate(0,0,amSwitch) + elseif r == 1 then + SpawnUtilityCrate(0,0,amTeleport) + elseif r == 2 then + SpawnUtilityCrate(0,0,amJetpack) + elseif r == 3 then + SpawnUtilityCrate(0,0,amExtraTime) + elseif r == 4 then + SpawnUtilityCrate(0,0,amGirder) + elseif r == 5 then + SpawnAmmoCrate(0,0,amDynamite) + elseif r == 6 then + SpawnAmmoCrate(0,0,amFlamethrower) + elseif r == 7 then + SpawnUtilityCrate(0,0,amPortalGun) + end + + end + +end + +------------------------ +-- game methods +------------------------ + +function onGameInit() + + -- Things we don't modify here will use their default values. + GameFlags = gfDivideTeams -- Game settings and rules + TurnTime = 30000 -- (was 30) The time the player has to move each round (in ms) + CaseFreq = 0 -- The frequency of crate drops + MinesNum = 0 -- The number of mines being placed + MinesTime = 2000 + Explosives = 0 -- The number of explosives being placed + Delay = 10 -- The delay between each round + SuddenDeathTurns = 99 -- suddendeath is off, effectively + Map = "Blizzard" -- The map to be played + Theme = "Snow" -- The theme to be used "Nature" + +end + + +function onGameStart() + + --ShowMission(loc(caption), loc(subcaption), loc(goal), 0, 0) + ShowMission(loc("CTF_BLIZZARD") .. " 0.5", loc("by mikade"), loc(" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"), 0, 0) + + + -- initialize teleporters + redTel = CreateZone(342,1316,42,449) -- red teleporter + orangeTel = CreateZone(3719,1330,45,449) -- orange teleporter + + + --new improved placement schematics aw yeah + RebuildTeamInfo() + --ShowMission("Team Info Rebuilt", "Here you go:", "TeamCount: " .. TeamsCount .. "|" .. teamNameArr[0] .. ": " .. teamSize[0] .. " Hogs|" .. teamNameArr[1] .. ": " .. teamSize[1] .. " Hogs|" .. teamNameArr[2] .. ": " .. teamSize[2] .. " Hogs|", 0, 0) + team1Placed = 0 + team2Placed = 0 + for i = 0, (TeamsCount-1) do + for g = teamIndex[i], (teamIndex[i]+teamSize[i]-1) do + if GetHogClan(hhs[g]) == 0 then + SetGearPosition(hhs[g],1403+ ((team1Placed+1)*50),1570) + team1Placed = team1Placed +1 + if team1Placed > 6 then + team1Placed = 0 + end + elseif GetHogClan(hhs[g]) == 1 then + SetGearPosition(hhs[g],2230+ ((team2Placed+1)*50),1570) + team2Placed = team2Placed +1 + if team2Placed > 6 then + team2Placed = 0 + end + end + end + end + + + + --spawn starting ufos and or super weapons + SpawnAmmoCrate(2048,1858,amJetpack) + --SpawnUtilityCrate(2048,1858,amExtraTime) + + --set flag spawn points and spawn the flags + fSpawnX[0] = 957 + fSpawnY[0] = 1747 + fSpawnX[1] = 3123 + fSpawnY[1] = 1747 + + for i = 0, 1 do + fGear[i] = SpawnAmmoCrate(fSpawnX[i],fSpawnY[i],amSkip) + fCirc[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true) + fCol[i] = GetClanColor(i) + + fSpawnC[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true) + SetVisualGearValues(fSpawnC[i], fSpawnX[i],fSpawnY[i], 10, 200, 1, 10, 0, 300, 5, fCol[i]) + + + fIsMissing[i] = false + fNeedsRespawn[i] = false + fCaptures[i] = 0 + + vCircMinA[i] = 20 + vCircMaxA[i] = 255 + vCircType[i] = 1 + vCircPulse[i] = 10 + vCircFuckAll[i] = 0 + vCircRadius[i] = 150 + vCircWidth[i] = 5 + vCircCol[i] = fCol[i] + + SetVisualGearValues(fCirc[i], fSpawnX[i],fSpawnY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i]) + + end + +end + + +function onNewTurn() + + if lastTeam ~= GetHogTeamName(CurrentHedgehog) then + lastTeam = GetHogTeamName(CurrentHedgehog) + end + + for i = 0, 1 do + if fThief[i] ~= nil then + --adjust = 5 + GetHealth(fThief[i]) + --SetHealth(fThief[i], adjust) + --AddCaption('Helped out the flag poisoned flag thiefs') + end + end + + --AddCaption("Handling respawns") + HandleRespawns() + HandleCrateDrops() + + --myC = AddVisualGear(GetX(CurrentHedgehog),GetY(CurrentHedgehog),vgtCircle,0,true) + --SetVisualGearValues(myC, GetX(CurrentHedgehog),GetY(CurrentHedgehog), 20, 200, 0, 0, 100, 50, 3, GetClanColor(GetHogClan(CurrentHedgehog))) + +end + +function onGameTick() + + -- onRessurect calls AFTER you have resurrected, + -- so keeping track of x,y a few milliseconds before + -- is useful + --FTTC = FTTC + 1 + --if FTTC == 100 then + -- FTTC = 0 + for i = 0,1 do + if fThief[i] ~= nil then + fThiefX[i] = GetX(fThief[i]) + fThiefY[i] = GetY(fThief[i]) + end + end + --end + + -- things we wanna check often + if (CurrentHedgehog ~= nil) then + --AddCaption(GetX(CurrentHedgehog) .. "; " .. GetY(CurrentHedgehog)) + --AddCaption("Checking Teleporters") + CheckTeleporters() + end + + HandleCircles() + ManageTeleporterEffects() + +end + + +function onAmmoStoreInit() + + SetAmmo(amDrill,9,0,0,0) + SetAmmo(amMortar,9,0,0,0) + + SetAmmo(amGrenade,9,0,0,0) + SetAmmo(amClusterBomb,4,0,0,0) + + --SetAmmo(amDEagle, 4, 0, 0, 0) + SetAmmo(amShotgun, 9, 0, 0, 0) + SetAmmo(amFlamethrower, 1, 0, 0, 1) + + SetAmmo(amFirePunch, 9, 0, 0, 0) + SetAmmo(amBaseballBat, 2, 0, 0, 0) + + SetAmmo(amDynamite,2,0,0,1) + SetAmmo(amSMine,4,0,0,0) + + SetAmmo(amBlowTorch, 9, 0, 0, 0) + SetAmmo(amPickHammer, 9, 0, 0, 0) + SetAmmo(amGirder, 2, 0, 0, 2) + SetAmmo(amPortalGun, 2, 0, 0, 2) + + SetAmmo(amParachute, 9, 0, 0, 0) + SetAmmo(amRope, 9, 0, 0, 0) + SetAmmo(amTeleport, 1, 0, 0, 1) + SetAmmo(amJetpack, 1, 0, 0, 1) + + SetAmmo(amSwitch, 2, 0, 0, 1) + SetAmmo(amExtraTime,1,0,0,1) + SetAmmo(amLowGravity,1,0,0,0) + SetAmmo(amSkip, 9, 0, 0, 0) + +end + + +function onGearResurrect(gear) + + --AddCaption("A gear has been resurrected!") + + -- mark the flag thief as dead if he needed a respawn + for i = 0,1 do + if gear == fThief[i] then + FlagThiefDead(gear) + end + end + + -- place hogs belonging to each clan either left or right side of map + if GetHogClan(gear) == 0 then + FindPlace(gear, false, 0, 2048) + elseif GetHogClan(gear) == 1 then + FindPlace(gear, false, 2048, LAND_WIDTH) + end + + AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) + +end + +function onGearDamage(gear, damage) + + -- >_< damn, occurs too fast, before the hog has finished moving / updated his health + --if GetGearType(gear) == gtHedgehog then + -- if damage > GetHealth(gear) then + -- AddVisualGear(GetX(gear), GetY(gear), vgtExplosion, 0, false) + -- end + --end + +end + +function onGearAdd(gear) + + if GetGearType(gear) == gtHedgehog then + + hhs[numhhs] = gear + numhhs = numhhs + 1 + SetEffect(gear, heResurrectable, true) + + end + +end + +function onGearDelete(gear) + + if (gear == fGear[0]) or (gear == fGear[1]) then + FlagDeleted(gear) + end + +end