# HG changeset patch # User Wuzzy # Date 1558037226 -7200 # Node ID 4406994969c3dd8a822632fb5a0325566334b67c # Parent fe8b4f2da9aa78e2e1410d9ec7d517dd411741ab# Parent 9719a998670b56e0e287d446c8e760410151fac8 Merge antoc27's commits diff -r 9719a998670b -r 4406994969c3 ChangeLog.txt --- a/ChangeLog.txt Thu May 16 21:26:27 2019 +0200 +++ b/ChangeLog.txt Thu May 16 22:07:06 2019 +0200 @@ -135,6 +135,7 @@ + Utils library: New calls: getReadableChallengeRecord, updateChallengeRecord, integerSqrt, integerHypotenuse + New callback: onGameResult(winningClan): Called when the game ends normally. winningClan = index of winning clan or -1 on draw + New callback: onCaseDrop(gear): Called at the point where a crate MIGHT be dropped between turns. Gear is the crate gear or nil + + New callback: ooHogSwitch(oldHog): Called when hogs was switched with the “switch hedgehog” utility + New callback: onPreciseLocal(): Called when precise key is pressed client-side + SendStat extension: Option to use predefined modes with siPointType, like "!POINTS" or "!TIME" + SimpleMission: Add isMissionTeam attribute for teams diff -r 9719a998670b -r 4406994969c3 hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Thu May 16 21:26:27 2019 +0200 +++ b/hedgewars/uGearsHandlersMess.pas Thu May 16 22:07:06 2019 +0200 @@ -3338,6 +3338,7 @@ hedgehog: PHedgehog; State: Longword; switchDir: Longword; + oldUid: Longword; begin AllInactive := false; @@ -3355,6 +3356,7 @@ if (Gear^.Message and gmSwitch) <> 0 then begin HHGear := CurrentHedgehog^.Gear; + oldUid:= HHGear^.uid; HHGear^.Message := HHGear^.Message and (not gmSwitch); Gear^.Message := Gear^.Message and (not gmSwitch); @@ -3387,6 +3389,7 @@ AmmoMenuInvalidated:= true; HHGear := CurrentHedgehog^.Gear; + ScriptCall('onHogSwitch', oldUid); HHGear^.State := State; HHGear^.Active := true; FollowGear := HHGear; diff -r 9719a998670b -r 4406994969c3 share/hedgewars/Data/Maps/CTF_Blizzard/map.lua --- a/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua Thu May 16 21:26:27 2019 +0200 +++ b/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua Thu May 16 22:07:06 2019 +0200 @@ -105,6 +105,7 @@ -- currently every 6 TURNS, should this work -- on ROUNDS instead? local effectTimer = 0 +local gameEnded = false local ropeGear = nil @@ -120,6 +121,11 @@ local teamIndex = {} -- at what point in the hhs{} does each team begin local clanTeams = {} -- list of teams per clan +local mostCapturesHogName = nil -- name of hog who holds the record of most flags captured +local mostCapturesHogTeam = nil -- name of team who holds the record of most flags captured +local mostCaptures = 0 -- number of most per-hog captures +local capturesPerHog = {} + ------------------- -- flag variables ------------------- @@ -155,8 +161,8 @@ --zone and teleporter variables -------------------------------- -local redTel -local orangeTel +local leftTel +local rightTel local zXMin = {} local zWidth = {} @@ -175,16 +181,18 @@ if effectTimer > 50 then effectTimer = 0 - for i = 0,1 do - local eX = 10 + zXMin[i] + GetRandom(zWidth[i]-10) - local eY = 50 + zYMin[i] + GetRandom(zHeight[i]-110) + local i = GetHogClan(CurrentHedgehog) + if i ~= 0 and i ~= 1 then + return + end + local eX = 10 + zXMin[i] + GetRandom(zWidth[i]-10) + local 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 - local tempE = AddVisualGear(eX, eY, vgtDust, 0, false) - SetVisualGearValues(tempE, eX, eY, nil, nil, nil, nil, nil, nil, nil, fCol[i]) - end + -- steam and smoke and DUST look good, smokering looks trippy + -- smoketrace and eviltrace are not effected by wind? + -- chunk is a LR falling gear + local tempE = AddVisualGear(eX, eY, vgtDust, 0, false) + SetVisualGearValues(tempE, eX, eY, nil, nil, nil, nil, nil, nil, nil, fCol[i]) end end @@ -228,14 +236,38 @@ alt = 0 end - if fCaptures[teamID] == 3 then + if fCaptures[teamID] == 3 and not gameEnded then + gameEnded = true for i = 0, (numhhs-1) do if GetHogClan(hhs[i]) == alt then SetEffect(hhs[i], heResurrectable, 0) SetHealth(hhs[i],0) end end - ShowMission(loc("GAME OVER!"), loc("Victory for the ") .. GetHogTeamName(CurrentHedgehog), loc("Hooray!"), 0, 0) + local victoryMsg = string.format(loc("Victory for %s!"), GetHogTeamName(CurrentHedgehog)) + AddCaption(victoryMsg, capcolDefault, capgrpGameState) + + -- Calculate team rankings + local teamList = {} + for i=0, TeamsCount-1 do + local name = GetTeamName(i) + local clan = GetTeamClan(name) + if fCaptures[clan] ~= nil then + table.insert(teamList, { score = fCaptures[clan], name = name, clan = clan }) + end + end + local teamRank = function(a, b) + return a.score > b.score + end + table.sort(teamList, teamRank) + + for i=1, #teamList do + SendStat(siPointType, "!POINTS") + SendStat(siPlayerKills, tostring(teamList[i].score), teamList[i].name) + end + if mostCaptures >= 2 then + SendStat(siCustomAchievement, string.format(loc("%s (%s) has captured the flag %d times."), mostCapturesHogName, mostCapturesHogTeam, mostCaptures)) + end end end @@ -246,10 +278,9 @@ if fNeedsRespawn[i] == true then fGear[i] = SpawnFakeAmmoCrate(fSpawnX[i],fSpawnY[i],false,false) - --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!")) + AddCaption(loc("Flag respawned!"), capcolDefault, capgrpAmmoinfo) end end @@ -259,7 +290,6 @@ function FlagDeleted(gear) local wtf, bbq - PlaySound(sndShotgunReload) if (gear == fGear[0]) then wtf = 0 bbq = 1 @@ -271,12 +301,13 @@ if CurrentHedgehog ~= nil then --if the player picks up the flag - if CheckDistance(CurrentHedgehog, fGear[wtf]) < 1600 then + if band(GetGearMessage(gear), gmDestroy) ~= 0 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 + PlaySound(sndShotgunReload) fIsMissing[wtf] = false fNeedsRespawn[wtf] = true fIsMissing[bbq] = false @@ -288,25 +319,33 @@ SetTeamLabel(clanTeams[wtf][i], fCaptures[wtf]) end + capturesPerHog[CurrentHedgehog] = capturesPerHog[CurrentHedgehog] + 1 + if capturesPerHog[CurrentHedgehog] > mostCaptures then + mostCaptures = capturesPerHog[CurrentHedgehog] + mostCapturesHogName = GetHogName(CurrentHedgehog) + mostCapturesHogTeam = GetHogTeamName(CurrentHedgehog) + end + PlaySound(sndHomerun) fThief[bbq] = nil -- player no longer has the enemy flag CheckScore(wtf) --if the player is returning the flag elseif GetHogClan(CurrentHedgehog) == wtf then - + PlaySound(sndShotgunReload) 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!")) + AddCaption(loc("Flag returned!"), capcolDefault, capgrpAmmoinfo) elseif fIsMissing[wtf] == false then AddCaption(loc("That was pointless. The flag will respawn next round.")) end --if the player is taking the enemy flag elseif GetHogClan(CurrentHedgehog) == bbq then + PlaySound(sndShotgunReload) fIsMissing[wtf] = true for i = 0,numhhs-1 do if CurrentHedgehog == hhs[i] then @@ -321,7 +360,7 @@ end - -- if flag has been destroyed, probably + -- if flag has been destroyed else if GetY(fGear[wtf]) > 2025 then @@ -368,6 +407,7 @@ else fGear[wtf] = SpawnFakeAmmoCrate(fThiefX[wtf],(fThiefY[wtf]-50),false,false) end + AddCaption(string.format(loc("%s has dropped the flag!"), GetHogName(gear)), capcolDefault, capgrpAmmoinfo) AddVisualGear(fThiefX[wtf], fThiefY[wtf], vgtBigExplosion, 0, false) fThief[wtf] = nil @@ -399,28 +439,15 @@ -- general methods ------------------------ -function CheckDistance(gear1, gear2) - - local g1X, g1Y = GetGearPosition(gear1) - local g2X, g2Y = GetGearPosition(gear2) - - g1X = g1X - g2X - g1Y = g1Y - g2Y - local dist = (g1X*g1X) + (g1Y*g1Y) - - return dist - -end - function CheckTeleporters() local teleportActive = false - if (GearIsInZone(CurrentHedgehog, redTel) == true) and (GetHogClan(CurrentHedgehog) == 0) then + if (GearIsInZone(CurrentHedgehog, leftTel) == true) and (GetHogClan(CurrentHedgehog) == 0) then teleportActive = true destinationX = 1402 destinationY = 321 - elseif (GearIsInZone(CurrentHedgehog, orangeTel) == true) and (GetHogClan(CurrentHedgehog) == 1) then + elseif (GearIsInZone(CurrentHedgehog, rightTel) == true) and (GetHogClan(CurrentHedgehog) == 1) then teleportActive = true destinationX = 2692 destinationY = 321 @@ -438,6 +465,7 @@ elseif actionReset == 20 then AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtBigExplosion, 0, false) SetGearPosition(CurrentHedgehog,destinationX,destinationY) + PlaySound(sndWarp) AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtBigExplosion, 0, false) end @@ -511,6 +539,7 @@ elseif r == 7 then SpawnSupplyCrate(0,0,amPortalGun) end + PlaySound(sndReinforce, CurrentHedgehog) end @@ -534,17 +563,26 @@ Map = "Blizzard" -- The map to be played Theme = "Snow" -- The theme to be used + SendHealthStatsOff() + SendRankingStatsOff() + end function onGameStart() - ShowMission(loc("CTF_Blizzard"), loc("Capture The Flag"), 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) - + ShowMission(loc("CTF_Blizzard"), loc("Capture The Flag"), + loc("- Return the enemy flag to your base to score") .."|".. + string.format(loc("- First clan to score %d captures wins"), 3) .. "|".. + loc("- You may only score when your flag is in your base") .."|".. + loc("- Hogs will drop the flag when killed") .."|".. + loc("- Dropped flags may be returned or recaptured").."|".. + loc("- Hogs will be revived") .."|".. + loc("- Touch the sparkles near your base to teleport"), 0, 0) -- initialize teleporters - redTel = CreateZone(342,1316,42,449) -- red teleporter - orangeTel = CreateZone(3719,1330,45,449) -- orange teleporter + leftTel = CreateZone(342,1316,42,449) -- left teleporter (clan 0) + rightTel = CreateZone(3719,1330,45,449) -- right teleporter (clan 1) --new improved placement schematics aw yeah @@ -616,6 +654,11 @@ function onNewTurn() HandleRespawns() + +end + +function onCaseDrop() + HandleCrateDrops() end @@ -639,7 +682,9 @@ end HandleCircles() - ManageTeleporterEffects() + if (CurrentHedgehog ~= nil) then + ManageTeleporterEffects() + end end @@ -707,6 +752,7 @@ if GetGearType(gear) == gtHedgehog then + capturesPerHog[gear] = 0 if GetHogClan(gear) > 1 then DeleteGear(gear) if not excessHogsWarning then