# HG changeset patch # User Wuzzy # Date 1545195002 -3600 # Node ID 2113296b7a296d299650a6fa1973cbcebebcbbeb # Parent 2c3fb87ad1c556df4a32c301f372b1b74f9baa11 Keep track of singleplayer high scores in challenges diff -r 2c3fb87ad1c5 -r 2113296b7a29 ChangeLog.txt --- a/ChangeLog.txt Wed Dec 19 01:47:41 2018 +0100 +++ b/ChangeLog.txt Wed Dec 19 05:50:02 2018 +0100 @@ -3,6 +3,7 @@ ============== 1.0.0-dev (unreleased) ============== + Hand-drawn maps can now be scaled with slider + Show check mark for completed scenarios, challenges and trainings + + Track high scores in singleplayer challenges + New chat command: “/help room” (shows room chat commands within the game) + Colorize switching arrows, pointing arrow and target cross in clan color + Longer delays between turns so its easier to see damage and messages @@ -22,6 +23,7 @@ + New call: GetMissionVar(varname): Get value of mission variable + New call: SetTurnTimePaused(isPaused): Call with true to pause turn time, false to unpause + New call: GetTurnTimePaused(): Returns true if turn time is paused due to Lua + + Utils library: New calls: getReadableChallengeRecord, updateChallengeRecord + New callback: onGameResult(winningClan): Called when the game ends normally. winningClan = index of winning clan or -1 on draw + Params explode, poison in the SpawnFake*Crate functions now optional and default to false diff -r 2c3fb87ad1c5 -r 2113296b7a29 share/hedgewars/Data/Maps/ClimbHome/map.lua --- a/share/hedgewars/Data/Maps/ClimbHome/map.lua Wed Dec 19 01:47:41 2018 +0100 +++ b/share/hedgewars/Data/Maps/ClimbHome/map.lua Wed Dec 19 05:50:02 2018 +0100 @@ -128,9 +128,14 @@ function onGameStart() --SetClanColor(ClansCount-1, 0x0000ffff) appears to be broken SendHealthStatsOff() + local recordInfo = "" + if isSinglePlayer then + recordInfo = getReadableChallengeRecord("Highscore") + end ShowMission(loc("Climb Home"), loc("Challenge"), - loc("You are far from home, and the water is rising, climb up as high as you can!|Your score will be based on your height."), + loc("You are far from home, and the water is rising, climb up as high as you can!|Your score will be based on your height.") + .. "|" .. recordInfo, -amRope, 0) local x = 1818 for h,i in pairs(HH) do @@ -419,7 +424,8 @@ end end - local finishTime = (GameTime-startTime)/1000 + local rawFinishTime = GameTime-startTime + local finishTime = rawFinishTime/1000 local roundedFinishTime = math.ceil(math.floor(finishTime+0.5)) if isSinglePlayer then if distanceFromWater < 0 and not YouLost and not YouWon then @@ -439,7 +445,9 @@ SendStat(siGameResult, loc("You have beaten the challenge!")) SendStat(siGraphTitle, loc("Your height over time")) SendStat(siCustomAchievement, string.format(loc("%s reached home in %.3f seconds. Congratulations!"), GetHogName(CurrentHedgehog), finishTime)) + updateChallengeRecord("TimeRecord", rawFinishTime, false) SendStat(siCustomAchievement, string.format(loc("%s bravely climbed up to a dizzy height of %d to reach home."), GetHogName(CurrentHedgehog), getActualHeight(RecordHeight))) + updateChallengeRecord("Highscore", getActualHeight(RecordHeight)) SendStat(siPointType, loc("seconds")) SendStat(siPlayerKills, tostring(roundedFinishTime), GetHogTeamName(CurrentHedgehog)) @@ -683,6 +691,8 @@ else SendStat(siCustomAchievement, string.format(text, RecordHeightHogName)) end + + updateChallengeRecord("Highscore", actualHeight) SendStat(siPointType, loc("points")) SendStat(siPlayerKills, actualHeight, GetHogTeamName(CurrentHedgehog)) EndGame() diff -r 2c3fb87ad1c5 -r 2113296b7a29 share/hedgewars/Data/Missions/Challenge/Basic_Training_-_Sniper_Rifle.lua --- a/share/hedgewars/Data/Missions/Challenge/Basic_Training_-_Sniper_Rifle.lua Wed Dec 19 01:47:41 2018 +0100 +++ b/share/hedgewars/Data/Missions/Challenge/Basic_Training_-_Sniper_Rifle.lua Wed Dec 19 05:50:02 2018 +0100 @@ -13,6 +13,7 @@ -- about translations. -- We can use the function loc(text) to localize a string. +HedgewarsScriptLoad("/Scripts/Utils.lua") HedgewarsScriptLoad("/Scripts/Locale.lua") -- This variable will hold the number of destroyed targets. @@ -147,13 +148,16 @@ -- Spawn the first target. spawnTarget(860,1020) + local highscore = getReadableChallengeRecord("Highscore") -- Show some nice mission goals. -- Parameters are: caption, sub caption, description, -- extra text, icon and time to show. -- A negative icon parameter (-n) represents the n-th weapon icon -- A positive icon paramter (n) represents the (n+1)-th mission icon -- A timeframe of 0 is replaced with the default time to show. - ShowMission(loc("Sniper Training"), loc("Aiming Practice"), loc("Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."), -amSniperRifle, 0) + ShowMission(loc("Sniper Training"), loc("Aiming Practice"), + loc("Eliminate all targets before your time runs out.|You have unlimited ammo for this mission.") + .. "|" .. highscore, -amSniperRifle, 0) -- Displayed initial player score SetTeamLabel(playerTeamName, "0") @@ -433,5 +437,6 @@ end SendStat(siPointType, loc("points")) SendStat(siPlayerKills, tostring(end_score_overall), playerTeamName) + updateChallengeRecord("Highscore", end_score_overall) end diff -r 2c3fb87ad1c5 -r 2113296b7a29 share/hedgewars/Data/Missions/Challenge/User_Mission_-_RCPlane_Challenge.lua --- a/share/hedgewars/Data/Missions/Challenge/User_Mission_-_RCPlane_Challenge.lua Wed Dec 19 01:47:41 2018 +0100 +++ b/share/hedgewars/Data/Missions/Challenge/User_Mission_-_RCPlane_Challenge.lua Wed Dec 19 05:50:02 2018 +0100 @@ -1,3 +1,4 @@ +HedgewarsScriptLoad("/Scripts/Utils.lua") HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Achievements.lua") @@ -46,13 +47,14 @@ SendHealthStatsOff() + local recordInfo = getReadableChallengeRecord("Lowscore") ShowMission ( loc("RC Plane Challenge"), loc("Challenge"), loc("Collect or destroy all the health crates.") .. "|" .. loc("Compete to use as few planes as possible!") .. "|" .. - "", -amRCPlane, 4000 + recordInfo, -amRCPlane, 4000 ) SetTeamLabel(loc("Wannabe Flyboys"), "0") @@ -408,6 +410,7 @@ SendStat(siCustomAchievement, string.format(loc("You have used %d RC planes."), planesUsed)) end SaveMissionVar("Won", "true") + updateChallengeRecord("Lowscore", planesUsed) if(totalMissiles > 1) then SendStat(siCustomAchievement, string.format(loc("You have dropped %d missiles."), totalMissiles)) diff -r 2c3fb87ad1c5 -r 2113296b7a29 share/hedgewars/Data/Missions/Challenge/User_Mission_-_Rope_Knock_Challenge.lua --- a/share/hedgewars/Data/Missions/Challenge/User_Mission_-_Rope_Knock_Challenge.lua Wed Dec 19 01:47:41 2018 +0100 +++ b/share/hedgewars/Data/Missions/Challenge/User_Mission_-_Rope_Knock_Challenge.lua Wed Dec 19 05:50:02 2018 +0100 @@ -1,3 +1,4 @@ +HedgewarsScriptLoad("/Scripts/Utils.lua") HedgewarsScriptLoad("/Scripts/Locale.lua") local hhs = {} @@ -98,6 +99,10 @@ SendStat(siPointType, loc("points")) SendStat(siPlayerKills, tostring(score), playerTeamName) PlaySound(sndHellish) + + -- Update highscore + updateChallengeRecord("Highscore", score) + EndGame() end @@ -117,6 +122,9 @@ SendStat(siPlayerKills, tostring(score), playerTeamName) SetTeamLabel(playerTeamName, tostring(score)) + -- Update highscore + updateChallengeRecord("Highscore", score) + if hhs[0] and GetHealth(hhs[0]) then SetEffect(hhs[0], heInvulnerable, 1) end @@ -188,11 +196,17 @@ function onGameStart() SendHealthStatsOff() + local recordInfo = getReadableChallengeRecord("Highscore") + if recordInfo == nil then + recordInfo = "" + else + recordInfo = "|" .. recordInfo + end ShowMission ( loc("Rope-knocking Challenge"), loc("Challenge"), loc("Use the rope to knock your enemies to their doom.") .. "|" .. - loc("Finish this challenge as fast as possible to earn bonus points."), + loc("Finish this challenge as fast as possible to earn bonus points.").. recordInfo, -amRope, 4000) SetTeamLabel(playerTeamName, "0") diff -r 2c3fb87ad1c5 -r 2113296b7a29 share/hedgewars/Data/Missions/Challenge/User_Mission_-_That_Sinking_Feeling.lua --- a/share/hedgewars/Data/Missions/Challenge/User_Mission_-_That_Sinking_Feeling.lua Wed Dec 19 01:47:41 2018 +0100 +++ b/share/hedgewars/Data/Missions/Challenge/User_Mission_-_That_Sinking_Feeling.lua Wed Dec 19 05:50:02 2018 +0100 @@ -1,6 +1,7 @@ HedgewarsScriptLoad("/Scripts/Locale.lua") +HedgewarsScriptLoad("/Scripts/Utils.lua") HedgewarsScriptLoad("/Scripts/Achievements.lua") local player @@ -15,6 +16,17 @@ local watGear = nil local cinematic = false +function printMission() + local highscore = tonumber(GetMissionVar("Highscore")) + local show = (type(highscore) == "number") and (highscore > 0) + local recordInfo = "" + if show then + recordInfo = getReadableChallengeRecord("Highscore") + end + ShowMission(loc("That Sinking Feeling"), loc("Challenge"), loc("Save as many hapless hogs as possible!") + .. "|" .. recordInfo, 4, 0) +end + -- allow skipping of the intro via hitting precise key function onPrecise() if introStage < 100 then @@ -22,7 +34,7 @@ genCounter = 0 FollowGear(CurrentHedgehog) AddCaption(loc("Good luck out there!")) - ShowMission(loc("That Sinking Feeling"), loc("Challenge"), loc("Save as many hapless hogs as possible!"), 4, 0) + printMission() SetInputMask(0xFFFFFFFF) end end @@ -70,11 +82,12 @@ function onGameStart() - cinematic = true - SetCinematicMode(true) + cinematic = true + SetCinematicMode(true) SendHealthStatsOff() - ShowMission(loc("That Sinking Feeling"), loc("Challenge"), loc("Save as many hapless hogs as possible!"), 4, 1) + printMission() + HideMission() HogTurnLeft(hh[0], false) HogTurnLeft(hh[1], true) @@ -241,6 +254,9 @@ SendStat(siCustomAchievement, string.format(loc("You saved %d of 8 Hapless Hogs."), hhLeft)) + -- Update highscore + updateChallengeRecord("Highscore", hhLeft) + if hhLeft == 8 then SaveMissionVar("Won", "true") awardAchievement(loc("Lively Lifeguard")) @@ -293,6 +309,9 @@ end SendStat(siPointType, loc("points")) SendStat(siPlayerKills, "0", loc("Nameless Heroes")) + local highscore = tonumber(GetMissionVar("Highscore")) + show = (type(highscore) == "number") and (highscore > 0) + updateChallengeRecord("Highscore", 0, show) SendStat(siGameResult, loc("Disqualified!")) GameOver = true diff -r 2c3fb87ad1c5 -r 2113296b7a29 share/hedgewars/Data/Scripts/SpeedShoppa.lua --- a/share/hedgewars/Data/Scripts/SpeedShoppa.lua Wed Dec 19 01:47:41 2018 +0100 +++ b/share/hedgewars/Data/Scripts/SpeedShoppa.lua Wed Dec 19 05:50:02 2018 +0100 @@ -21,6 +21,7 @@ ]=] +HedgewarsScriptLoad("/Scripts/Utils.lua") HedgewarsScriptLoad("/Scripts/Locale.lua") --[[ @@ -115,7 +116,8 @@ _G.onGameStart = function() SendHealthStatsOff() - ShowMission(params.missionTitle, loc("Challenge"), params.goalText, -amRope, 5000) + local append = getReadableChallengeRecord("TimeRecord") + ShowMission(params.missionTitle, loc("Challenge"), params.goalText .. "|" .. append, -amRope, 5000) -- / SetTeamLabel(params.teamName, string.format(loc("%d/%d"), cratesCollected, #crates)) for i=1,#crates do @@ -176,6 +178,7 @@ SendStat(siPlayerKills, tostring(time), params.teamName) SendStat(siCustomAchievement, string.format(loc("You have finished the challenge in %.3f s."), (time/1000))) SetTurnTimeLeft(0) + updateChallengeRecord("TimeRecord", time) else SendStat(siGameResult, loc("Challenge failed!")) SendStat(siPointType, loc("crate(s)")) diff -r 2c3fb87ad1c5 -r 2113296b7a29 share/hedgewars/Data/Scripts/TargetPractice.lua --- a/share/hedgewars/Data/Scripts/TargetPractice.lua Wed Dec 19 01:47:41 2018 +0100 +++ b/share/hedgewars/Data/Scripts/TargetPractice.lua Wed Dec 19 05:50:02 2018 +0100 @@ -55,6 +55,7 @@ ----- snip ----- ]=] +HedgewarsScriptLoad("/Scripts/Utils.lua") HedgewarsScriptLoad("/Scripts/Locale.lua") local player = nil @@ -167,7 +168,8 @@ _G.onGameStart = function() SendHealthStatsOff() - ShowMission(params.missionTitle, loc("Aiming practice"), params.goalText, -params.ammoType, 5000) + local recordInfo = getReadableChallengeRecord("Highscore") + ShowMission(params.missionTitle, loc("Aiming practice"), params.goalText .. "|" .. recordInfo, -params.ammoType, 5000) SetTeamLabel(params.teamName, "0") spawnTarget() end @@ -317,5 +319,7 @@ end SendStat(siPointType, loc("point(s)")) SendStat(siPlayerKills, tostring(end_score_overall), loc(params.teamName)) + -- Update highscore + updateChallengeRecord("Highscore", end_score_overall) end end diff -r 2c3fb87ad1c5 -r 2113296b7a29 share/hedgewars/Data/Scripts/Utils.lua --- a/share/hedgewars/Data/Scripts/Utils.lua Wed Dec 19 01:47:41 2018 +0100 +++ b/share/hedgewars/Data/Scripts/Utils.lua Wed Dec 19 05:50:02 2018 +0100 @@ -1,5 +1,7 @@ -- Library for miscellaneous utilitiy functions and global helper variables +HedgewarsScriptLoad("/Scripts/Locale.lua") + --[[ FUNCTIONS ]] -- Check if a gear is inside a box function gearIsInBox(gear, x, y, w, h) @@ -33,6 +35,59 @@ end end +local function challengeRecordToString(recordType, value) + if recordType == "TimeRecord" or recordType == "TimeRecordHigh" then + return string.format(loc("Team record: %.3fs"), value/1000) + elseif recordType == "Highscore" then + return string.format(loc("Team high score: %d"), value) + else + return string.format(loc("Team record: %d"), value) + end +end + +function getReadableChallengeRecord(recordType) + local record = tonumber(GetMissionVar(recordType)) + if type(record) ~= "number" then + return "" + else + return challengeRecordToString(recordType, record) + end +end + +function updateChallengeRecord(recordType, value, stat) + local oldRecord = tonumber(GetMissionVar(recordType)) + local newRecord = false + if stat == nil then + stat = true + end + if type(oldRecord) ~= "number" then + newRecord = true + else + local recordBeaten = false + if recordType == "Lowscore" or recordType == "TimeRecord" then + if value < oldRecord then + recordBeaten = true + newRecord = true + end + else + if value > oldRecord then + recordBeaten = true + newRecord = true + end + end + if stat then + if recordBeaten then + SendStat(siCustomAchievement, loc("You have beaten the team record, congratulations!")) + else + SendStat(siCustomAchievement, challengeRecordToString(recordType, oldRecord)) + end + end + end + if newRecord then + SaveMissionVar(recordType, value) + end +end + -- Completely fill the map with land. Requires MapGen=mgDrawn. -- If flush is false, FlushPoints() is not called. function fillMap(flush)