# HG changeset patch # User Wuzzy # Date 1520508886 -3600 # Node ID 59ebdb80d693403c28f508f6b7566bab8c30ba43 # Parent f3f8d017f994f6575316c05ff385c6e2352fed0a Capture the Flag: Fix many Lua errors when playing with >2 clans diff -r f3f8d017f994 -r 59ebdb80d693 share/hedgewars/Data/Scripts/Multiplayer/Capture_the_Flag.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Capture_the_Flag.lua Thu Mar 08 11:58:27 2018 +0100 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Capture_the_Flag.lua Thu Mar 08 12:34:46 2018 +0100 @@ -88,7 +88,6 @@ ------------------ "Oh well, they probably have the memory" local gameStarted = false -local gameTurns = 0 local captureLimit = 3 -------------------------- @@ -98,8 +97,6 @@ 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 @@ -122,7 +119,6 @@ local fThiefX = {} local fThiefY = {} -local FTTC = 0 -- flag thief tracker counter local fSpawnC = {} -- spawn circle marker local fCirc = {} -- flag/carrier marker circles @@ -137,25 +133,21 @@ --flag methods ------------------------ -function CheckScore(teamID) +function CheckScore(clanID) - if teamID == 0 then - alt = 1 - elseif teamID == 1 then - alt = 0 - end - - if fCaptures[teamID] == captureLimit then + if fCaptures[clanID] == captureLimit then + -- Capture limit reached! We have a winner! for i = 0, (numhhs-1) do if hhs[i] ~= nil then - if GetHogClan(hhs[i]) == alt then + -- Kill all losers + if GetHogClan(hhs[i]) ~= clanID then SetEffect(hhs[i], heResurrectable, 0) SetHealth(hhs[i],0) end end end if CurrentHedgehog ~= nil then - AddCaption(string.format(loc("Victory for %s!"), GetHogTeamName(CurrentHedgehog))) + AddCaption(string.format(loc("Victory for %s!"), GetHogTeamName(CurrentHedgehog)), 0xFFFFFFFF, capgrpGameState) updateScores() end end @@ -164,6 +156,7 @@ function DoFlagStuff(gear) + local wtf, bbq if (gear == fGear[0]) then wtf = 0 bbq = 1 @@ -183,7 +176,7 @@ fIsMissing[bbq] = false fNeedsRespawn[bbq] = true fCaptures[wtf] = fCaptures[wtf] +1 - AddCaption(string.format(loc("%s has scored!"), GetHogName(CurrentHedgehog))) + AddCaption(string.format(loc("%s has scored!"), GetHogName(CurrentHedgehog)), 0xFFFFFFFF, capgrpGameState) updateScores() PlaySound(sndHomerun) fThief[bbq] = nil -- player no longer has the enemy flag @@ -197,7 +190,7 @@ fNeedsRespawn[wtf] = true HandleRespawns() -- this will set fIsMissing[wtf] to false :) - AddCaption(loc("Flag returned!")) + AddCaption(loc("Flag returned!"), 0xFFFFFFFF, capgrpMessage2) --if the player is taking the enemy flag elseif GetHogClan(CurrentHedgehog) == bbq then @@ -213,7 +206,7 @@ end end end - AddCaption(loc("Flag captured!")) + AddCaption(loc("Flag captured!"), 0xFFFFFFFF, capgrpMessage2) end @@ -224,14 +217,14 @@ for i = 0, 1 do if fGear[i] ~= nil then - g1X = fGearX[i] - g1Y = fGearY[i] + local g1X = fGearX[i] + local g1Y = fGearY[i] - g2X, g2Y = GetGearPosition(CurrentHedgehog) + local g2X, g2Y = GetGearPosition(CurrentHedgehog) - q = g1X - g2X - w = g1Y - g2Y - dist = (q*q) + (w*w) + local q = g1X - g2X + local w = g1Y - g2Y + local dist = (q*q) + (w*w) if dist < 500 then --1600 DoFlagStuff(fGear[i]) @@ -253,7 +246,7 @@ 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!")) + AddCaption(loc("Flag respawned!"), 0xFFFFFFFF, capgrpMessage2) end end @@ -263,6 +256,7 @@ function FlagThiefDead(gear) + local wtf, bbq if (gear == fThief[0]) then wtf = 0 bbq = 1 @@ -331,14 +325,12 @@ function CheckDistance(gear1, gear2) - g1X, g1Y = GetGearPosition(gear1) - g2X, g2Y = GetGearPosition(gear2) + local g1X, g1Y = GetGearPosition(gear1) + local g2X, g2Y = GetGearPosition(gear2) g1X = g1X - g2X g1Y = g1Y - g2Y - z = (g1X*g1X) + (g1Y*g1Y) - - dist = z + local dist = (g1X*g1X) + (g1Y*g1Y) return dist @@ -346,48 +338,16 @@ function RebuildTeamInfo() - - -- make a list of individual team names + -- make a list of teams for i = 0, (TeamsCount-1) 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 i = 0, (TeamsCount-1) do for z = 0, numhhs-1 do - if GetHogTeamName(hhs[z]) == teamNameArr[i] then + if GetHogTeamName(hhs[z]) == GetTeamName(i) then if teamSize[i] == 0 then teamIndex[i] = z -- should give starting index end @@ -395,7 +355,6 @@ --add a pointer so this hog appears at i in hhs end end - end end @@ -403,7 +362,7 @@ function StartTheGame() gameStarted = true - AddCaption(loc("Game Started!")) + AddCaption(loc("Game Started!"), 0xFFFFFFFF, capgrpGameState) for i = 0, 1 do @@ -448,8 +407,6 @@ WaterRise = 0 HealthDecrease = 0 - Delay = 10 - end function showCTFMission() @@ -473,8 +430,12 @@ end function updateScores() - for i=0, 1 do - SetTeamLabel(teamNameArr[i], tostring(fCaptures[i])) + for i=0, TeamsCount-1 do + local team = GetTeamName(i) + local clan = GetTeamClan(team) + if clan <= 1 then + SetTeamLabel(team, tostring(fCaptures[clan])) + end end end @@ -501,26 +462,33 @@ function onNewTurn() - gameTurns = gameTurns + 1 - - if lastTeam ~= GetHogTeamName(CurrentHedgehog) then - lastTeam = GetHogTeamName(CurrentHedgehog) - end - if gameStarted == true then HandleRespawns() - --new method of placing starting flags - elseif gameTurns == 1 then - showCTFMission() - elseif gameTurns == 2 then - fPlaced[0] = true - elseif gameTurns == 3 then - fPlaced[1] = true + end + + for i=0, 1 do + if fSpawnX[i] and fSpawnY[i] then + fPlaced[i] = true + end + end + if not gameStarted and fPlaced[0] and fPlaced[1] then StartTheGame() end end +function onEndTurn() + -- if the game hasn't started yet, keep track of where we are gonna put the flags on turn end + if not gameStarted and CurrentHedgehog ~= nil then + local clan = GetHogClan(CurrentHedgehog) + + if clan <= 1 and GetX(CurrentHedgehog) and not fSpawnX[clan] then + fSpawnX[clan] = GetX(CurrentHedgehog) + fSpawnY[clan] = GetY(CurrentHedgehog) + end + end +end + function onGameTick() for i = 0,1 do @@ -535,19 +503,6 @@ if CurrentHedgehog ~= nil then CheckFlagProximity() end - elseif CurrentHedgehog ~= nil then -- if the game hasn't started yet, keep track of where we are gonna put the flags on turn end - - if GetHogClan(CurrentHedgehog) == 0 then - i = 0 - elseif GetHogClan(CurrentHedgehog) == 1 then - i = 1 - end - - if TurnTimeLeft == 0 and GetX(CurrentHedgehog) then - fSpawnX[i] = GetX(CurrentHedgehog) - fSpawnY[i] = GetY(CurrentHedgehog) - end - end end @@ -566,15 +521,14 @@ end function InABetterPlaceNow(gear) - for i = 0, (numhhs-1) do - if gear == hhs[i] then - + for h = 0, (numhhs-1) do + if gear == hhs[h] then for i = 0,1 do if gear == fThief[i] then FlagThiefDead(gear) end end - hhs[i] = nil + hhs[h] = nil end end end @@ -584,11 +538,10 @@ end function onHogRestore(gear) - match = false for i = 0, (numhhs-1) do - if (hhs[i] == nil) and (match == false) then + if (hhs[i] == nil) then hhs[i] = gear - match = true + break end end end @@ -626,8 +579,10 @@ InABetterPlaceNow(gear) elseif GetGearType(gear) == gtKamikaze and not gameStarted then local i = GetHogClan(CurrentHedgehog) - fSpawnX[i] = GetX(CurrentHedgehog) - fSpawnY[i] = GetY(CurrentHedgehog) + if i <= 1 then + fSpawnX[i] = GetX(CurrentHedgehog) + fSpawnY[i] = GetY(CurrentHedgehog) + end end end