diff -r a267482ad461 -r 1d2e89be3eb6 share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Thu Nov 17 14:38:11 2016 +0100 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Thu Nov 17 14:59:20 2016 +0100 @@ -1,5 +1,3 @@ -local MUTANT_VERSION = "v0.9.5" - --[[ ___ ___ ( ) ( ) ___ .-. .-. ___ ___ | |_ .---. ___ .-. | |_ @@ -67,36 +65,74 @@ local circles = {} local circleFrame = -1 -function showStartingInfo() +-- Variables for custom achievements + +-- Most kills in 1 turn +local recordKills = 0 +local recordKillsHogName = nil +local recordKillsTeamName = nil + +-- Most suicides +local recordSuicides = 0 +local recordSuicidesHogName = nil +local recordSuicidesTeamName = nil + +-- Most skips +local recordSkips = 0 +local recordSkipsHogName = nil +local recordSkipsTeamName = nil - ruleSet = loc("RULES") .. ": " .. - " |" .. --" |" .. - loc("The first player to kill someone becomes the Mutant.") .. "|" .. +-- Most crates collected +local recordCrates = 0 +local recordCratesHogName = nil +local recordCratesTeamName = nil + +-- Most deaths +local recordDeaths = 0 +local recordDeathsHogName = nil +local recordDeathsTeamName = nil + +-- Total killed hedgehogs +local totalKills = 0 + +-- Total damage +local totalDamage = 0 + +function rules() + + local ruleSet = loc("Rules: ") .. "|" .. + loc("Hedgehogs will be revived after their death.") .. "|" .. + string.format(loc("Mines explode after %d s."), div(MinesTime, 1000)) .. "|" .. + " |".. + loc("The first hedgehog to kill someone becomes the Mutant.") .. "|" .. loc("The Mutant has super-weapons and a lot of health.") .. "|" .. loc("The Mutant loses health quickly if he doesn't keep scoring kills.") .. "|" .. " |" .. - loc("Normal players can only score points by killing the mutant.") .. "|" .. - " |" .. "" .. - loc("The player with least points (or most deaths) becomes the Bottom Feeder.") .. "|" .. - loc("The Bottom Feeder can score points by killing anyone.") .. "|" .. - " |" .. - loc("POINTS") .. ": " .. - " |" .. - loc("+2 for becoming a Mutant") .. "|" .. - loc("+1 to a Mutant for killing anyone") .. "|" .. - loc("+1 to a Bottom Feeder for killing anyone") .. "|" .. + loc("Score points by killing other hedgehogs (see below).") .. "|" .. + loc("The hedgehog with least points (or most deaths) becomes the Bottom Feeder.") .. "|" .. + string.format(loc("The first hedgehog which scores %d or more wins the game."), winScore) .. "|" .. + " |" .. + loc("Scoring: ") .. "|" .. + loc("+2 for becoming the Mutant") .. "|" .. + loc("+1 to the Mutant for killing anyone") .. "|" .. + loc("+1 to the Bottom Feeder for killing anyone") .. "|" .. loc("-1 to anyone for a suicide") .. "|" .. loc("Other kills don't give you points.") - ShowMission(loc("Mutant"), - loc("a Hedgewars tag game"), - ruleSet, 0, 5000) + return ruleSet + +end + +function showStartingInfo() + + ShowMission(loc("Mutant"), loc("A Hedgewars tag game"), rules(), 1, 5000) end function onGameInit() TurnTime = 20000 WaterRise = 0 + HealthDecrease = 0 EnableGameFlags(gfResetWeps, gfPerHogAmmo) HealthCaseProb=0 HealthCaseAmount=0 @@ -110,17 +146,15 @@ if cnthhs > 1 then hogLimitHit = true SetEffect(gear, heResurrectable, false) - --SetHealth(gear, 0) SetGearPosition(gear, -100,LAND_HEIGHT) end end function onGameStart() + SendHealthStatsOff() trackTeams() teamScan() runOnHogs(saveStuff) - --local str = "/say " .. MUTANT_VERSION - --ParseCommand(str) hogLimitHit = false for i=0 , TeamsCount - 1 do @@ -128,7 +162,7 @@ runOnHogsInTeam(limitHogs, teams[i]) end if hogLimitHit then - AddCaption(loc("ONE HOG PER TEAM! KILLING EXCESS HEDGES")) + AddCaption(loc("Only one hog per team allowed! Excess hogs will be removed"), 0xFFFFFFFF, capgrpGameState) end showStartingInfo() end @@ -197,10 +231,15 @@ killsCounter = 0 if mutant == nil then - AddCaption( loc("FIRST BLOOD MUTATES") ) + AddCaption( loc("First killer will mutate"), 0xFFFFFFFF, capgrpGameState ) end checkScore() + + for i=0, TeamsCount-1 do + SendStat(siClanHealth, getTeamValue(teams[i], "Score"), teams[i]) + end + giveWeapons(CurrentHedgehog) drawCircles() setAIHints() @@ -219,23 +258,29 @@ function countBodies() if killsCounter == 2 then - AddCaption(loc("DOUBLE KILL")) + AddCaption(loc("Double kill!"), 0xFFFFFFFF, capgrpGameState ) elseif killsCounter == 3 then - AddCaption(loc("MEGA KILL")) + AddCaption(loc("Mega kill!"), 0xFFFFFFFF, capgrpGameState ) PlaySound(sndRegret) elseif killsCounter == 4 then - AddCaption(loc("ULTRA KILL")) + AddCaption(loc("Ultra kill!"), 0xFFFFFFFF, capgrpGameState ) elseif killsCounter == 5 then - AddCaption(loc("MONSTER KILL")) + AddCaption(loc("Monster kill!"), 0xFFFFFFFF, capgrpGameState ) PlaySound(sndIllGetYou) elseif killsCounter == 6 then - AddCaption(loc("LUDICROUS KILL")) + AddCaption(loc("Ludicrous kill!"), 0xFFFFFFFF, capgrpGameState ) PlaySound(sndNutter) elseif killsCounter == 7 then - AddCaption(loc("HOLY SHYTE!")) + AddCaption(loc("Holy shit!"), 0xFFFFFFFF, capgrpGameState ) PlaySound(sndLaugh) elseif killsCounter > 8 then - AddCaption(loc("INSANITY")) + AddCaption(loc("Insanity!"), 0xFFFFFFFF, capgrpGameState ) + end + + if killsCounter > recordKills then + recordKills = killsCounter + recordKillsHogName = getGearValue(CurrentHedgehog, "Name") + recordKillsTeamName = GetHogTeamName(CurrentHedgehog) end end @@ -302,14 +347,14 @@ if teams[i]~= nil then local curr_score = getTeamValue(teams[i], "Score") - showScore = showScore .. teams[i] .. ": " .. curr_score .. " (" .. loc("deaths") .. ": " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|" + showScore = showScore .. string.format(loc("%s: %d (deaths: %d)"), teams[i], curr_score, getTeamValue(teams[i], "DeadHogs")) .. "|" end end - ShowMission(loc("Score"), - "-------", - showScore, 0, 200) + ShowMission(loc("Mutant"), + loc("Scores"), + showScore, 4, 1) HideMission() @@ -329,7 +374,7 @@ runOnHogsInTeam(removeFeeder, teams[i]) - showScore = showScore .. teams[i] ..": " .. curr_score .. " (" .. loc("deaths") .. ": " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|" + showScore = showScore .. string.format(loc("%s: %d (deaths: %d)"), teams[i], curr_score, getTeamValue(teams[i], "DeadHogs")) .. "|" if curr_score >= winScore then gameOver = true @@ -362,16 +407,71 @@ end if gameOver then + SendStat(siGraphTitle, loc("Score graph")) + TurnTimeLeft = 0 - for i=0, #teams do + + teamsSorted = {} + + for i=0, TeamsCount-1 do if teams[i]~=winTeam then runOnHogsInTeam(armageddon, teams[i]) end + teamsSorted[i+1] = teams[i] end - ShowMission( loc("WINNER IS ") .. winTeam, - "~~~~~~~~~~~~~~~~~~~~~~~~~", - showScore, 0, 200) + -- Achievements stuff + local achievements = 0 + --- Most kills per turn + if recordKills >= 3 then + SendStat(siMaxStepKills, string.format("%d %s (%s)", recordKills, recordKillsHogName, recordKillsTeamName)) + achievements = achievements + 1 + end + --- Most crates collected + if recordCrates >= 5 then + SendStat(siCustomAchievement, string.format(loc("%s (%s) was the greediest hedgehog and collected %d crates."), recordCratesHogName, recordCratesTeamName, recordCrates)) + achievements = achievements + 1 + end + --- Most suicides + if recordSuicides >= 5 then + SendStat(siCustomAchievement, string.format(loc("%s (%s) hate life and suicided %d times."), recordSuicidesHogName, recordSuicidesTeamName, recordSuicides)) + achievements = achievements + 1 + end + --- Most deaths + if recordDeaths >= 5 then + SendStat(siCustomAchievement, string.format(loc("Poor %s (%s) died %d times."), recordDeathsHogName, recordDeathsTeamName, recordDeaths)) + achievements = achievements + 1 + end + --- Most skips + if recordSkips >= 3 then + SendStat(siMaxTurnSkips, string.format("%d %s (%s)", recordSkips, recordSkipsHogName, recordSkipsTeamName)) + achievements = achievements + 1 + end + --- Total damage + if totalDamage >= 900 then + SendStat(siCustomAchievement, string.format(loc("%d damage was dealt in this game."), totalDamage)) + achievements = achievements + 1 + end + --- Total kills + if totalKills >= 20 or achievements <= 0 then + SendStat(siKilledHHs, tostring(totalKills)) + achievements = achievements + 1 + end + + -- Score and stats stuff + table.sort(teamsSorted, function(team1, team2) return getTeamValue(team1, "Score") < getTeamValue(team2, "Score") end) + for i=TeamsCount, 1, -1 do + SendStat(siPointType, loc("point(s)")) + SendStat(siPlayerKills, getTeamValue(teamsSorted[i], "Score"), teamsSorted[i]) + end + + AddCaption(string.format(loc("%s wins!"), winTeam), 0xFFFFFFFF, capgrpGameState ) + SendStat(siGameResult, string.format("%s wins!", winTeam)) + + ShowMission( loc("Mutant"), + loc("Final result"), + string.format(loc("Winner: %s"), winTeam) .. "| |" .. loc("Scores:") .. " |" .. + showScore, 0, 15000) else if only_low_score then @@ -381,9 +481,10 @@ if meh == false then meh = true else - ShowMission( loc("Score"), - loc("-------"), - showScore, 0, 200) + ShowMission( loc("Mutant"), + loc("Scores"), + showScore, 4, 1) + HideMission() end end @@ -421,7 +522,7 @@ function setFeeder(gear) if gear~= mutant and gear~= nil then - SetHogName(gear, loc("BOTTOM FEEDER")) + SetHogName(gear, loc("Bottom Feeder")) SetHogHat(gear, 'poke_slowpoke') setGearValue(gear,"Feeder", true) end @@ -430,14 +531,14 @@ function setMutantStuff(gear) mutant = gear - SetHogName(gear, loc("MUTANT")) + SetHogName(gear, loc("Mutant")) SetHogHat(gear,'WhySoSerious') SetHealth(gear, ( mutant_base_health + numhhs*25) ) SetEffect(gear, hePoisoned, 1) setGearValue(mutant,"SelfDestruct",false) setGearValue(gear, "Feeder", false) - AddCaption(getGearValue(gear, "Name") .. loc(" HAS MUTATED")) + AddCaption(string.format(loc("%s has mutated! +2 points"), getGearValue(gear, "Name")), GetClanColor(GetHogClan(gear)), capgrpMessage) TurnTimeLeft=0 @@ -459,7 +560,10 @@ for j=0, TeamsCount-1 do if teams[j] ==nil and hhs[i]~=nil then teams[j] = GetHogTeamName(hhs[i]) - setTeamValue(teams[j],"Score",0) + setTeamValue(teams[j], "Score",0) + setTeamValue(teams[j], "Suicides",0) + setTeamValue(teams[j], "Skips",0) + setTeamValue(teams[j], "Crates",0) setTeamValue(teams[j], "DeadHogs",0) break end @@ -498,6 +602,13 @@ end else setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment)) + increaseTeamValue(curr_team,"Suicides") + if(getTeamValue(curr_team, "Suicides") > recordSuicides) then + recordSuicides = getTeamValue(curr_team, "Suicides") + recordSuicidesHogName = getGearValue(CurrentHedgehog, "Name") + recordSuicidesTeamName = curr_team + end + AddCaption(loc("-1 point"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage) end else if mutant==nil then @@ -510,19 +621,29 @@ end else setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment)) + increaseTeamValue(curr_team,"Suicides") + if(getTeamValue(curr_team, "Suicides") > recordSuicides) then + recordSuicides = getTeamValue(curr_team, "Suicides") + recordSuicidesHogName = getGearValue(CurrentHedgehog, "Name") + recordSuicidesTeamName = curr_team + end + AddCaption(loc("-1 point"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage) end else if curr_team ~=GetHogTeamName(gear) then if CurrentHedgehog==mutant and getGearValue(mutant,"SelfDestruct")==false then SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)+kill_reward) - AddCaption("+" .. kill_reward .. loc(" HP") ) + AddCaption(loc("+1 point"), GetClanColor(GetHogClan(gear)), capgrpMessage) + AddCaption(string.format(loc("+%d health"), kill_reward), GetClanColor(GetHogClan(gear)), capgrpMessage2) increaseTeamValue(curr_team,"Score") end if getGearValue(CurrentHedgehog,"Feeder") then increaseTeamValue(curr_team,"Score") + AddCaption(loc("+1 point"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage) end else setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment)) + AddCaption(loc("+1 point"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage) end end end @@ -534,6 +655,12 @@ if GetGearType(gear) == gtHedgehog then increaseTeamValue(GetHogTeamName(gear), "DeadHogs") + totalKills = totalKills + 1 + if(getTeamValue(GetHogTeamName(gear), "DeadHogs") > recordDeaths) then + recordDeaths = getTeamValue(GetHogTeamName(gear), "DeadHogs") + recordDeathsHogName = getGearValue(gear, "Name") + recordDeathsTeamName = GetHogTeamName(gear) + end if gear==CurrentHedgehog then setGearValue(CurrentHedgehog, "Alive", false) @@ -550,6 +677,25 @@ end end +function onGearDamage(gear, damage) + if not gameOver and GetGearType(gear) == gtHedgehog then + totalDamage = totalDamage + damage + end +end + +function onHogAttack(ammoType) + -- Record skips for achievement + if ammoType == amSkip then + local team = GetHogTeamName(CurrentHedgehog) + increaseTeamValue(team, "Skips") + if(getTeamValue(team, "Skips") > recordSkips) then + recordSkips = getTeamValue(team, "Skips") + recordSkipsHogName = getGearValue(CurrentHedgehog, "Name") + recordSkipsTeamName = team + end + end +end + function onGearAdd(gear) -- Catch hedgehogs for the tracker @@ -605,6 +751,22 @@ end AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) trackDeletion(gear) + + -- End game properly when only the winner remains + if gameOver and numhhs == 1 then + EndGame() + end + elseif GetGearType(gear) == gtCase then + -- Check if a crate has been collected + if band(GetGearMessage(gear), gmDestroy) ~= 0 and CurrentHedgehog ~= nil then + -- Update crate collection achievement + increaseTeamValue(GetHogTeamName(CurrentHedgehog), "Crates") + if(getTeamValue(GetHogTeamName(CurrentHedgehog), "Crates") > recordCrates) then + recordCrates = getTeamValue(GetHogTeamName(CurrentHedgehog), "Crates") + recordCratesHogName = getGearValue(CurrentHedgehog, "Name") + recordCratesTeamName = GetHogTeamName(CurrentHedgehog) + end + end end end