From ba60dece770c697dd90472d2e2e8c0ea58abe3e2 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Sat, 21 Jun 2025 19:43:07 +0530 Subject: [PATCH] global player leaderboards and update the rating curves locally --- data/missions/advanced/Acrobat/acrobat.mis | 2 +- data/missions/advanced/Cube Root/cube.mis | 2 +- data/missions/advanced/Daedalus/daedalus.mis | 2 +- .../advanced/Divergence/divergence.mis | 2 +- .../missions/advanced/Endurance/endurance.mis | 2 +- data/missions/advanced/Extreme Skiing/ski.mis | 2 +- .../advanced/Half Pipe Elite/halfpipe2.mis | 2 +- .../kingofthemountain.mis | 2 +- .../advanced/Natural Selection/selection.mis | 2 +- data/missions/advanced/Ordeal/ordeal.mis | 2 +- .../advanced/Ramps Reloaded/reloaded.mis | 2 +- data/missions/advanced/Scaffold/scaffold.mis | 2 +- .../advanced/Slick Slide/slickslide.mis | 2 +- .../Survival of the Fittest/survival.mis | 2 +- .../advanced/Threefold Maze/threefoldmaze.mis | 2 +- .../Under Construction/construction.mis | 2 +- .../missions/advanced/WilloWisp/willowisp.mis | 2 +- .../beginner/Early Frost/earlyfrost.mis | 2 +- data/missions/beginner/Friction/friction.mis | 2 +- .../beginner/Gravity Helix/gravity.mis | 2 +- .../beginner/Gyro Training/gyro_train.mis | 2 +- data/missions/beginner/Half Pipe/halfpipe.mis | 2 +- data/missions/beginner/Hazards/hazards.mis | 2 +- data/missions/beginner/Jump/jumpjumpjump.mis | 2 +- .../beginner/Level Five/level_five.mis | 2 +- .../beginner/Level Four/level_four.mis | 2 +- data/missions/beginner/Level One/levelone.mis | 2 +- .../missions/beginner/Level Six/level_six.mis | 2 +- .../beginner/Level Three/level_three.mis | 2 +- data/missions/beginner/Level Two/leveltwo.mis | 2 +- data/missions/beginner/MP Train/mptrain.mis | 2 +- data/missions/beginner/Pitfalls/pitfall.mis | 2 +- .../beginner/Platform Party/platformparty.mis | 2 +- .../beginner/Ramp Matrix/rampmatrix.mis | 2 +- .../beginner/Skate park/skatePark.mis | 2 +- .../beginner/Upward Spiral/upward.mis | 2 +- .../beginner/Winding Road/windingroad.mis | 2 +- .../intermediate/Aim High/aimhigh.mis | 2 +- .../aroundtheworld.mis | 2 +- .../Black Diamond/blackdiamond.mis | 2 +- .../missions/intermediate/Duality/duality.mis | 2 +- .../intermediate/Gauntlet/gauntlet.mis | 2 +- .../Hop Skip and Jump/hopskipjump.mis | 2 +- .../Mountaintop Retreat/mountaintop.mis | 2 +- .../intermediate/Mudslide/mudslide.mis | 2 +- .../Road less travelled/lesstravel.mis | 2 +- .../intermediate/Skate to the top/skate.mis | 2 +- .../Spork in the Road/sporkintheroad.mis | 2 +- .../intermediate/Urban Jungle/urban.mis | 2 +- data/missions/intermediate/Whirl/whirl.mis | 2 +- .../intermediate/plumbing/plumbing.mis | 2 +- data/missions/multiplayer/Spires/spires.mis | 2 +- .../multiplayer/Triumvirate/triumvirate.mis | 2 +- .../multiplayer/Vortex/vortexeffect.mis | 2 +- src/Leaderboards.hx | 18 +++ src/gui/EndGameGui.hx | 4 +- src/gui/LeaderboardsGui.hx | 127 ++++++++++++------ src/gui/LeaderboardsSelectGui.hx | 103 ++++++++++++++ src/gui/MainMenuGui.hx | 2 +- 59 files changed, 265 insertions(+), 97 deletions(-) create mode 100644 src/gui/LeaderboardsSelectGui.hx diff --git a/data/missions/advanced/Acrobat/acrobat.mis b/data/missions/advanced/Acrobat/acrobat.mis index 8caf19db..9971d19d 100644 --- a/data/missions/advanced/Acrobat/acrobat.mis +++ b/data/missions/advanced/Acrobat/acrobat.mis @@ -9,7 +9,7 @@ new SimGroup(MissionGroup) { type = "advanced"; include = "1"; level = "49"; - difficulty = "9"; + difficulty = "10"; name = $Text::LevelName79; }; new Sky(Sky) { diff --git a/data/missions/advanced/Cube Root/cube.mis b/data/missions/advanced/Cube Root/cube.mis index 4ffd2d3b..1aa4723c 100644 --- a/data/missions/advanced/Cube Root/cube.mis +++ b/data/missions/advanced/Cube Root/cube.mis @@ -4,7 +4,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { artist = "Alex Swanson"; include = "1"; - difficulty = "9"; + difficulty = "6"; type = "advanced"; time = "120000"; level = "47"; diff --git a/data/missions/advanced/Daedalus/daedalus.mis b/data/missions/advanced/Daedalus/daedalus.mis index e46263d2..d1c98560 100644 --- a/data/missions/advanced/Daedalus/daedalus.mis +++ b/data/missions/advanced/Daedalus/daedalus.mis @@ -3,7 +3,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { include = "1"; - difficulty = "8"; + difficulty = "10"; type = "advanced"; time = "180000"; level = "44"; diff --git a/data/missions/advanced/Divergence/divergence.mis b/data/missions/advanced/Divergence/divergence.mis index f7f633ca..efd40ae4 100644 --- a/data/missions/advanced/Divergence/divergence.mis +++ b/data/missions/advanced/Divergence/divergence.mis @@ -7,7 +7,7 @@ new SimGroup(MissionGroup) { level = "41"; artist = "Alex Swanson"; include = "1"; - difficulty = "8"; + difficulty = "7"; desc = "divergence"; name = $Text::LevelName104; gameType = "SinglePlayer"; diff --git a/data/missions/advanced/Endurance/endurance.mis b/data/missions/advanced/Endurance/endurance.mis index 1a11140d..7116dd46 100644 --- a/data/missions/advanced/Endurance/endurance.mis +++ b/data/missions/advanced/Endurance/endurance.mis @@ -7,7 +7,7 @@ new SimGroup(MissionGroup) { level = "50"; type = "advanced"; name = $Text::LevelName106; - difficulty = "9"; + difficulty = "7"; time = "70000"; artist = "Alex Swanson"; }; diff --git a/data/missions/advanced/Extreme Skiing/ski.mis b/data/missions/advanced/Extreme Skiing/ski.mis index 3fabe53d..13849cdf 100644 --- a/data/missions/advanced/Extreme Skiing/ski.mis +++ b/data/missions/advanced/Extreme Skiing/ski.mis @@ -9,7 +9,7 @@ new SimGroup(MissionGroup) { level = "56"; include = "1"; artist = "Alex Swanson"; - difficulty = "10"; + difficulty = "9"; name = $Text::LevelName75; }; new Sky(Sky) { diff --git a/data/missions/advanced/Half Pipe Elite/halfpipe2.mis b/data/missions/advanced/Half Pipe Elite/halfpipe2.mis index 93b1e652..20729221 100644 --- a/data/missions/advanced/Half Pipe Elite/halfpipe2.mis +++ b/data/missions/advanced/Half Pipe Elite/halfpipe2.mis @@ -2,7 +2,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { - difficulty = "9"; + difficulty = "7"; type = "advanced"; level = "53"; gameType = "SinglePlayer"; diff --git a/data/missions/advanced/King of the Mountain/kingofthemountain.mis b/data/missions/advanced/King of the Mountain/kingofthemountain.mis index 1a9f59dd..b2a35470 100644 --- a/data/missions/advanced/King of the Mountain/kingofthemountain.mis +++ b/data/missions/advanced/King of the Mountain/kingofthemountain.mis @@ -9,7 +9,7 @@ new SimGroup(MissionGroup) { type = "advanced"; artist = "Alex Swanson"; gameType = "SinglePlayer"; - difficulty = "10"; + difficulty = "11"; level = "58"; hasEggIndex = "16"; }; diff --git a/data/missions/advanced/Natural Selection/selection.mis b/data/missions/advanced/Natural Selection/selection.mis index cd92c161..1c5fdf05 100644 --- a/data/missions/advanced/Natural Selection/selection.mis +++ b/data/missions/advanced/Natural Selection/selection.mis @@ -8,7 +8,7 @@ new SimGroup(MissionGroup) { name = $Text::LevelName58; include = "1"; time = "75000"; - difficulty = "10"; + difficulty = "9"; type = "advanced"; artist = "Alex Swanson"; hasEggIndex = "20"; diff --git a/data/missions/advanced/Ordeal/ordeal.mis b/data/missions/advanced/Ordeal/ordeal.mis index dda3ec58..11e17836 100644 --- a/data/missions/advanced/Ordeal/ordeal.mis +++ b/data/missions/advanced/Ordeal/ordeal.mis @@ -18,7 +18,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { artist = "Alex Swanson"; include = "1"; - difficulty = "8"; + difficulty = "9"; type = "advanced"; time = "70000"; level = "43"; diff --git a/data/missions/advanced/Ramps Reloaded/reloaded.mis b/data/missions/advanced/Ramps Reloaded/reloaded.mis index 412d4c17..6dd82d26 100644 --- a/data/missions/advanced/Ramps Reloaded/reloaded.mis +++ b/data/missions/advanced/Ramps Reloaded/reloaded.mis @@ -2,7 +2,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { - difficulty = "8"; + difficulty = "9"; artist = "Alex Swanson"; type = "advanced"; gameType = "SinglePlayer"; diff --git a/data/missions/advanced/Scaffold/scaffold.mis b/data/missions/advanced/Scaffold/scaffold.mis index 2930eeaa..17557111 100644 --- a/data/missions/advanced/Scaffold/scaffold.mis +++ b/data/missions/advanced/Scaffold/scaffold.mis @@ -6,7 +6,7 @@ new SimGroup(MissionGroup) { time = "60000"; level = "48"; include = "1"; - difficulty = "9"; + difficulty = "8"; gameType = "SinglePlayer"; name = $Text::LevelName83; artist = "Alex Swanson"; diff --git a/data/missions/advanced/Slick Slide/slickslide.mis b/data/missions/advanced/Slick Slide/slickslide.mis index 810a54d1..4ddf8831 100644 --- a/data/missions/advanced/Slick Slide/slickslide.mis +++ b/data/missions/advanced/Slick Slide/slickslide.mis @@ -7,7 +7,7 @@ new SimGroup(MissionGroup) { level = "42"; artist = "Alex Swanson"; include = "1"; - difficulty = "8"; + difficulty = "7"; name = $Text::LevelName59; gameType = "SinglePlayer"; }; diff --git a/data/missions/advanced/Survival of the Fittest/survival.mis b/data/missions/advanced/Survival of the Fittest/survival.mis index 6f6b9f51..c87b6fee 100644 --- a/data/missions/advanced/Survival of the Fittest/survival.mis +++ b/data/missions/advanced/Survival of the Fittest/survival.mis @@ -7,7 +7,7 @@ new SimGroup(MissionGroup) { level = "45"; artist = "Alex Swanson"; include = "1"; - difficulty = "8"; + difficulty = "7"; name = $Text::LevelName72; gameType = "SinglePlayer"; }; diff --git a/data/missions/advanced/Threefold Maze/threefoldmaze.mis b/data/missions/advanced/Threefold Maze/threefoldmaze.mis index 09919899..0e106e06 100644 --- a/data/missions/advanced/Threefold Maze/threefoldmaze.mis +++ b/data/missions/advanced/Threefold Maze/threefoldmaze.mis @@ -8,7 +8,7 @@ new SimGroup(MissionGroup) { include = "1"; type = "advanced"; time = "180000"; - difficulty = "9"; + difficulty = "10"; level = "52"; name = $Text::LevelName57; hasEggIndex = "19"; diff --git a/data/missions/advanced/Under Construction/construction.mis b/data/missions/advanced/Under Construction/construction.mis index 550f5684..06e41f63 100644 --- a/data/missions/advanced/Under Construction/construction.mis +++ b/data/missions/advanced/Under Construction/construction.mis @@ -7,7 +7,7 @@ new SimGroup(MissionGroup) { level = "55"; artist = "Alex Swanson"; include = "1"; - difficulty = "10"; + difficulty = "8"; name = $Text::LevelName97; gameType = "SinglePlayer"; }; diff --git a/data/missions/advanced/WilloWisp/willowisp.mis b/data/missions/advanced/WilloWisp/willowisp.mis index d5637858..385dbf45 100644 --- a/data/missions/advanced/WilloWisp/willowisp.mis +++ b/data/missions/advanced/WilloWisp/willowisp.mis @@ -7,7 +7,7 @@ new SimGroup(MissionGroup) { time = "105000"; level = "54"; include = "1"; - difficulty = "10"; + difficulty = "11"; name = $Text::LevelName70; artist = "Alex Swanson"; hasEggIndex = "18"; diff --git a/data/missions/beginner/Early Frost/earlyfrost.mis b/data/missions/beginner/Early Frost/earlyfrost.mis index a3ba223d..186bf2bd 100644 --- a/data/missions/beginner/Early Frost/earlyfrost.mis +++ b/data/missions/beginner/Early Frost/earlyfrost.mis @@ -4,7 +4,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { type = "beginner"; include = "1"; - difficulty = "3"; + difficulty = "6"; time = "30000"; level = "14"; name = $Text::LevelName34; diff --git a/data/missions/beginner/Friction/friction.mis b/data/missions/beginner/Friction/friction.mis index 473d84d1..7bac33ee 100644 --- a/data/missions/beginner/Friction/friction.mis +++ b/data/missions/beginner/Friction/friction.mis @@ -3,7 +3,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { include = "1"; - difficulty = "1"; + difficulty = "5"; time = "45000"; type = "beginner"; level = "4"; diff --git a/data/missions/beginner/Gravity Helix/gravity.mis b/data/missions/beginner/Gravity Helix/gravity.mis index 8eb47f39..78f89a40 100644 --- a/data/missions/beginner/Gravity Helix/gravity.mis +++ b/data/missions/beginner/Gravity Helix/gravity.mis @@ -9,7 +9,7 @@ new SimGroup(MissionGroup) { level = "12"; include = "1"; artist = "Alex Swanson"; - difficulty = "2"; + difficulty = "5"; desc = "Change gravity to solve this puzzle."; }; new MissionArea(MissionArea) { diff --git a/data/missions/beginner/Gyro Training/gyro_train.mis b/data/missions/beginner/Gyro Training/gyro_train.mis index 21b8d216..48140620 100644 --- a/data/missions/beginner/Gyro Training/gyro_train.mis +++ b/data/missions/beginner/Gyro Training/gyro_train.mis @@ -3,7 +3,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { include = "1"; - difficulty = "2"; + difficulty = "5"; time = "45000"; level = "9"; type = "beginner"; diff --git a/data/missions/beginner/Half Pipe/halfpipe.mis b/data/missions/beginner/Half Pipe/halfpipe.mis index f7dbe400..c15d4458 100644 --- a/data/missions/beginner/Half Pipe/halfpipe.mis +++ b/data/missions/beginner/Half Pipe/halfpipe.mis @@ -4,7 +4,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { include = "1"; artist = "Alex Swanson"; - difficulty = "4"; + difficulty = "5"; time = "60000"; type = "beginner"; level = "18"; diff --git a/data/missions/beginner/Hazards/hazards.mis b/data/missions/beginner/Hazards/hazards.mis index 88e5162c..e4eccf1d 100644 --- a/data/missions/beginner/Hazards/hazards.mis +++ b/data/missions/beginner/Hazards/hazards.mis @@ -8,7 +8,7 @@ new SimGroup(MissionGroup) { level = "8"; time = "100000"; include = "1"; - difficulty = "3"; + difficulty = "6"; name = $Text::LevelName9; artist = "Alex Swanson"; }; diff --git a/data/missions/beginner/Jump/jumpjumpjump.mis b/data/missions/beginner/Jump/jumpjumpjump.mis index 48f3903d..6d1791e9 100644 --- a/data/missions/beginner/Jump/jumpjumpjump.mis +++ b/data/missions/beginner/Jump/jumpjumpjump.mis @@ -3,7 +3,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { include = "1"; - difficulty = "3"; + difficulty = "6"; time = "20000"; level = "19"; type = "Beginner"; diff --git a/data/missions/beginner/Level Five/level_five.mis b/data/missions/beginner/Level Five/level_five.mis index afefedad..59c01825 100644 --- a/data/missions/beginner/Level Five/level_five.mis +++ b/data/missions/beginner/Level Five/level_five.mis @@ -7,7 +7,7 @@ new SimGroup(MissionGroup) { type = "Beginner"; name = $Text::LevelName7; time = "45000"; - difficulty = "2"; + difficulty = "5"; include = "1"; gameType = "SinglePlayer"; artist = "Alex Swanson"; diff --git a/data/missions/beginner/Level Four/level_four.mis b/data/missions/beginner/Level Four/level_four.mis index 322a418b..629d949f 100644 --- a/data/missions/beginner/Level Four/level_four.mis +++ b/data/missions/beginner/Level Four/level_four.mis @@ -3,7 +3,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { include = "1"; - difficulty = "2"; + difficulty = "4"; time = "45000"; type = "beginner"; level = "6"; diff --git a/data/missions/beginner/Level One/levelone.mis b/data/missions/beginner/Level One/levelone.mis index 534cb51c..8388e62f 100644 --- a/data/missions/beginner/Level One/levelone.mis +++ b/data/missions/beginner/Level One/levelone.mis @@ -11,7 +11,7 @@ new SimGroup(MissionGroup) { level = "1"; artist = "Alex Swanson"; name = $Text::LevelName1; - difficulty = "1"; + difficulty = "4"; hasEggIndex = "1"; goldTime = "7000"; proTime = "16000"; diff --git a/data/missions/beginner/Level Six/level_six.mis b/data/missions/beginner/Level Six/level_six.mis index d1c23a36..e5493373 100644 --- a/data/missions/beginner/Level Six/level_six.mis +++ b/data/missions/beginner/Level Six/level_six.mis @@ -3,7 +3,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { include = "1"; - difficulty = "1"; + difficulty = "4"; time = "45000"; isInDemoMode = "1"; type = "beginner"; diff --git a/data/missions/beginner/Level Three/level_three.mis b/data/missions/beginner/Level Three/level_three.mis index 0a0593e0..83f0b27d 100644 --- a/data/missions/beginner/Level Three/level_three.mis +++ b/data/missions/beginner/Level Three/level_three.mis @@ -3,7 +3,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { include = "1"; - difficulty = "1"; + difficulty = "4"; time = "70000"; isInDemoMode = "1"; level = "3"; diff --git a/data/missions/beginner/Level Two/leveltwo.mis b/data/missions/beginner/Level Two/leveltwo.mis index ef5f1539..a866275d 100644 --- a/data/missions/beginner/Level Two/leveltwo.mis +++ b/data/missions/beginner/Level Two/leveltwo.mis @@ -4,7 +4,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { include = "1"; artist = "Alex Swanson"; - difficulty = "1"; + difficulty = "3"; time = "45000"; type = "beginner"; level = "2"; diff --git a/data/missions/beginner/MP Train/mptrain.mis b/data/missions/beginner/MP Train/mptrain.mis index f24f96c2..d440643e 100644 --- a/data/missions/beginner/MP Train/mptrain.mis +++ b/data/missions/beginner/MP Train/mptrain.mis @@ -2,7 +2,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { - difficulty = "2"; + difficulty = "5"; type = "beginner"; level = "10"; isInDemoMode = "1"; diff --git a/data/missions/beginner/Pitfalls/pitfall.mis b/data/missions/beginner/Pitfalls/pitfall.mis index e200a1b6..585bd519 100644 --- a/data/missions/beginner/Pitfalls/pitfall.mis +++ b/data/missions/beginner/Pitfalls/pitfall.mis @@ -7,7 +7,7 @@ new SimGroup(MissionGroup) { desc = "Be careful crossing these bridges."; level = "11"; time = "60000"; - difficulty = "2"; + difficulty = "5"; name = $Text::LevelName21; gameType = "SinglePlayer"; include = true; diff --git a/data/missions/beginner/Platform Party/platformparty.mis b/data/missions/beginner/Platform Party/platformparty.mis index 5f9b8cda..26c11d32 100644 --- a/data/missions/beginner/Platform Party/platformparty.mis +++ b/data/missions/beginner/Platform Party/platformparty.mis @@ -7,7 +7,7 @@ new SimGroup(MissionGroup) { level = "13"; name = $Text::LevelName22; time = "60000"; - difficulty = "3"; + difficulty = "5"; gameType = "SinglePlayer"; artist = "Alex Swanson"; desc = "Practice with moving platforms."; diff --git a/data/missions/beginner/Ramp Matrix/rampmatrix.mis b/data/missions/beginner/Ramp Matrix/rampmatrix.mis index 85637ab3..3c1f30a4 100644 --- a/data/missions/beginner/Ramp Matrix/rampmatrix.mis +++ b/data/missions/beginner/Ramp Matrix/rampmatrix.mis @@ -10,7 +10,7 @@ new SimGroup(MissionGroup) { artist = "Alex Swanson"; include = "1"; name = $Text::LevelName28; - difficulty = "3"; + difficulty = "6"; hasEggIndex = "4"; }; new MissionArea(MissionArea) { diff --git a/data/missions/beginner/Skate park/skatePark.mis b/data/missions/beginner/Skate park/skatePark.mis index 25f6e596..acd903b6 100644 --- a/data/missions/beginner/Skate park/skatePark.mis +++ b/data/missions/beginner/Skate park/skatePark.mis @@ -3,7 +3,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { include = "1"; - difficulty = "3"; + difficulty = "6"; artist = "Kevin Ryan & Tim Aste"; type = "beginner"; time = "90000"; diff --git a/data/missions/beginner/Upward Spiral/upward.mis b/data/missions/beginner/Upward Spiral/upward.mis index 3c7b4da0..dad0cb3b 100644 --- a/data/missions/beginner/Upward Spiral/upward.mis +++ b/data/missions/beginner/Upward Spiral/upward.mis @@ -9,7 +9,7 @@ new SimGroup(MissionGroup) { artist = "Alex Swanson"; type = "beginner"; level = "20"; - difficulty = "4"; + difficulty = "6"; name = $Text::LevelName48; hasEggIndex = "5"; }; diff --git a/data/missions/beginner/Winding Road/windingroad.mis b/data/missions/beginner/Winding Road/windingroad.mis index fc0e1cc3..0856e48b 100644 --- a/data/missions/beginner/Winding Road/windingroad.mis +++ b/data/missions/beginner/Winding Road/windingroad.mis @@ -6,7 +6,7 @@ new SimGroup(MissionGroup) { level = "15"; name = $Text::LevelName23; time = "80000"; - difficulty = "3"; + difficulty = "5"; gameType = "SinglePlayer"; artist = "Alex Swanson"; desc = "Follow the path and fly to the goal."; diff --git a/data/missions/intermediate/Aim High/aimhigh.mis b/data/missions/intermediate/Aim High/aimhigh.mis index acf3b51c..2173044e 100644 --- a/data/missions/intermediate/Aim High/aimhigh.mis +++ b/data/missions/intermediate/Aim High/aimhigh.mis @@ -4,7 +4,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { gameType = "SinglePlayer"; include = "1"; - difficulty = "5"; + difficulty = "7"; type = "Intermediate"; artist = "Kevin Ryan and Tim Aste"; time = "30000"; diff --git a/data/missions/intermediate/Around the world in 30 Seconds/aroundtheworld.mis b/data/missions/intermediate/Around the world in 30 Seconds/aroundtheworld.mis index 4cb9eb74..08ac60d7 100644 --- a/data/missions/intermediate/Around the world in 30 Seconds/aroundtheworld.mis +++ b/data/missions/intermediate/Around the world in 30 Seconds/aroundtheworld.mis @@ -4,7 +4,7 @@ new SimGroup(MissionGroup) { gameType = "SinglePlayer"; desc = "Gather all the gems around the globe in less than 30 seconds."; include = "1"; - difficulty = "4"; + difficulty = "7"; type = "Intermediate"; artist = "Kevin Ryan"; time = "30000"; diff --git a/data/missions/intermediate/Black Diamond/blackdiamond.mis b/data/missions/intermediate/Black Diamond/blackdiamond.mis index 77b7a5fc..f4b68da1 100644 --- a/data/missions/intermediate/Black Diamond/blackdiamond.mis +++ b/data/missions/intermediate/Black Diamond/blackdiamond.mis @@ -5,7 +5,7 @@ new SimGroup(MissionGroup) { type = "Intermediate"; include = "1"; level = "35"; - difficulty = "6"; + difficulty = "8"; name = $Text::LevelName103; desc = "Black Diamond"; gameType = "SinglePlayer"; diff --git a/data/missions/intermediate/Duality/duality.mis b/data/missions/intermediate/Duality/duality.mis index 9f383c53..cc121450 100644 --- a/data/missions/intermediate/Duality/duality.mis +++ b/data/missions/intermediate/Duality/duality.mis @@ -5,7 +5,7 @@ new SimGroup(MissionGroup) { level = "27"; name = $Text::LevelName86; time = "30000"; - difficulty = "4"; + difficulty = "6"; gameType = "SinglePlayer"; artist = "Alex Swanson"; type = "intermediate"; diff --git a/data/missions/intermediate/Gauntlet/gauntlet.mis b/data/missions/intermediate/Gauntlet/gauntlet.mis index 758350ed..77f79a86 100644 --- a/data/missions/intermediate/Gauntlet/gauntlet.mis +++ b/data/missions/intermediate/Gauntlet/gauntlet.mis @@ -4,7 +4,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { time = "120000"; include = "1"; - difficulty = "5"; + difficulty = "7"; type = "Intermediate"; level = "23"; artist = "Alex Swanson"; diff --git a/data/missions/intermediate/Hop Skip and Jump/hopskipjump.mis b/data/missions/intermediate/Hop Skip and Jump/hopskipjump.mis index 248a9452..2e41cd16 100644 --- a/data/missions/intermediate/Hop Skip and Jump/hopskipjump.mis +++ b/data/missions/intermediate/Hop Skip and Jump/hopskipjump.mis @@ -7,7 +7,7 @@ new SimGroup(MissionGroup) { include = "1"; time = "60000"; artist = "Alex Swanson"; - difficulty = "7"; + difficulty = "6"; type = "Intermediate"; level = "39"; name = $Text::LevelName36; diff --git a/data/missions/intermediate/Mountaintop Retreat/mountaintop.mis b/data/missions/intermediate/Mountaintop Retreat/mountaintop.mis index d3d267ed..b4c96e8a 100644 --- a/data/missions/intermediate/Mountaintop Retreat/mountaintop.mis +++ b/data/missions/intermediate/Mountaintop Retreat/mountaintop.mis @@ -3,7 +3,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { time = "50000"; include = "1"; - difficulty = "4"; + difficulty = "7"; type = "Intermediate"; level = "21"; isInDemoMode = "1"; diff --git a/data/missions/intermediate/Mudslide/mudslide.mis b/data/missions/intermediate/Mudslide/mudslide.mis index 3e305055..f7620036 100644 --- a/data/missions/intermediate/Mudslide/mudslide.mis +++ b/data/missions/intermediate/Mudslide/mudslide.mis @@ -9,7 +9,7 @@ new SimGroup(MissionGroup) { gameType = "SinglePlayer"; time = "50000"; include = "1"; - difficulty = "5"; + difficulty = "6"; artist = "Alex Swanson"; }; new MissionArea(MissionArea) { diff --git a/data/missions/intermediate/Road less travelled/lesstravel.mis b/data/missions/intermediate/Road less travelled/lesstravel.mis index f15487ac..6e58ad9f 100644 --- a/data/missions/intermediate/Road less travelled/lesstravel.mis +++ b/data/missions/intermediate/Road less travelled/lesstravel.mis @@ -48,7 +48,7 @@ new SimGroup(MissionGroup) { artist = "Alex Swanson"; include = "1"; name = $Text::LevelName101; - difficulty = "5"; + difficulty = "7"; isInDemoMode = "1"; }; new MissionArea(MissionArea) { diff --git a/data/missions/intermediate/Skate to the top/skate.mis b/data/missions/intermediate/Skate to the top/skate.mis index ba6fb9db..74a63f4f 100644 --- a/data/missions/intermediate/Skate to the top/skate.mis +++ b/data/missions/intermediate/Skate to the top/skate.mis @@ -2,7 +2,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { - difficulty = "7"; + difficulty = "6"; type = "Intermediate"; level = "36"; desc = "Careful, its slippery!"; diff --git a/data/missions/intermediate/Spork in the Road/sporkintheroad.mis b/data/missions/intermediate/Spork in the Road/sporkintheroad.mis index dbd683b0..17f85d02 100644 --- a/data/missions/intermediate/Spork in the Road/sporkintheroad.mis +++ b/data/missions/intermediate/Spork in the Road/sporkintheroad.mis @@ -6,7 +6,7 @@ new SimGroup(MissionGroup) { level = "33"; name = $Text::LevelName37; time = "120000"; - difficulty = "6"; + difficulty = "7"; gameType = "SinglePlayer"; artist = "Kevin Ryan"; desc = "Find the gems in the maze of roads!"; diff --git a/data/missions/intermediate/Urban Jungle/urban.mis b/data/missions/intermediate/Urban Jungle/urban.mis index 8514b2f8..fb7405ba 100644 --- a/data/missions/intermediate/Urban Jungle/urban.mis +++ b/data/missions/intermediate/Urban Jungle/urban.mis @@ -6,7 +6,7 @@ new SimGroup(MissionGroup) { level = "22"; name = $Text::LevelName107; time = "120000"; - difficulty = "4"; + difficulty = "8"; gameType = "SinglePlayer"; desc = "Its a jungle out there!"; type = "Intermediate"; diff --git a/data/missions/intermediate/Whirl/whirl.mis b/data/missions/intermediate/Whirl/whirl.mis index 37f5d4fd..06c655e8 100644 --- a/data/missions/intermediate/Whirl/whirl.mis +++ b/data/missions/intermediate/Whirl/whirl.mis @@ -6,7 +6,7 @@ new SimGroup(MissionGroup) { include = "1"; artist = "Alex Swanson"; level = "38"; - difficulty = "7"; + difficulty = "6"; startHelpTest = "Climb to the top!"; desc = "Climb to the top!"; name = $Text::LevelName80; diff --git a/data/missions/intermediate/plumbing/plumbing.mis b/data/missions/intermediate/plumbing/plumbing.mis index 01c580ae..a36faaa0 100644 --- a/data/missions/intermediate/plumbing/plumbing.mis +++ b/data/missions/intermediate/plumbing/plumbing.mis @@ -4,7 +4,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { type = "intermediate"; include = "1"; - difficulty = "6"; + difficulty = "8"; level = "37"; time = "120000"; name = $Text::LevelName73; diff --git a/data/missions/multiplayer/Spires/spires.mis b/data/missions/multiplayer/Spires/spires.mis index 970e8a18..3eeafa2a 100644 --- a/data/missions/multiplayer/Spires/spires.mis +++ b/data/missions/multiplayer/Spires/spires.mis @@ -12,7 +12,7 @@ new SimGroup(MissionGroup) { type = "advanced"; gameMode = "Scrum"; name = $Text::LevelNameMP21; - difficulty = "8"; + difficulty = "9"; numgems = "1"; goldTime = "0"; guid = "{3DCFC6EE-A2DE-465F-B040-6FC31D5C0B6E}"; diff --git a/data/missions/multiplayer/Triumvirate/triumvirate.mis b/data/missions/multiplayer/Triumvirate/triumvirate.mis index 170528e0..35a2dc92 100644 --- a/data/missions/multiplayer/Triumvirate/triumvirate.mis +++ b/data/missions/multiplayer/Triumvirate/triumvirate.mis @@ -11,7 +11,7 @@ new SimGroup(MissionGroup) { type = "beginner"; gameMode = "Scrum"; name = $Text::LevelNameMP18; - difficulty = "4"; + difficulty = "6"; gemGroupRadius = "25"; goldTime = "0"; numgems = "1"; diff --git a/data/missions/multiplayer/Vortex/vortexeffect.mis b/data/missions/multiplayer/Vortex/vortexeffect.mis index 57447fa1..e7ae2bb7 100644 --- a/data/missions/multiplayer/Vortex/vortexeffect.mis +++ b/data/missions/multiplayer/Vortex/vortexeffect.mis @@ -4,7 +4,7 @@ new SimGroup(MissionGroup) { new ScriptObject(MissionInfo) { gameMode = "Scrum"; level = "84"; - difficulty = "9"; + difficulty = "7"; maxGemsPerGroup = "6"; time = "300000"; type = "intermediate"; diff --git a/src/Leaderboards.hx b/src/Leaderboards.hx index 0f3e646c..a7103bee 100644 --- a/src/Leaderboards.hx +++ b/src/Leaderboards.hx @@ -12,6 +12,13 @@ typedef LBScore = { score:Float, platform:Int, rewind:Int, + rating:Int, +} + +typedef LBPlayer = { + uid:String, + name:String, + rating:Int, } enum abstract LeaderboardsKind(Int) { @@ -59,6 +66,17 @@ class Leaderboards { }); } + public static function getTopPlayers(kind:LeaderboardsKind, cb:Array->Void) { + return Http.get('${host}/api/players?&game=${game}&view=${kind}', (b) -> { + var s = b.toString(); + var players:Array = Json.parse(s).players; + cb(players); + }, (e) -> { + Console.log("Failed to get players: " + e); + cb([]); + }); + } + public static function submitReplay(ref:Int, replay:haxe.io.Bytes) { return Http.uploadFile('${host}/api/record?ref=${ref}', replay, (b) -> { Console.log("Replay submitted"); diff --git a/src/gui/EndGameGui.hx b/src/gui/EndGameGui.hx index 10c7ad8b..f9dedb00 100644 --- a/src/gui/EndGameGui.hx +++ b/src/gui/EndGameGui.hx @@ -123,9 +123,9 @@ class EndGameGui extends GuiImage { var completionBonus = 1000; var timeBonus = 0; if (t < parTime) - timeBonus = Math.floor(parTime / t) * 1000; + timeBonus = Math.floor((parTime / t) * 1000); else - timeBonus = Math.floor(parTime / t) * 500; + timeBonus = Math.floor((parTime / t) * 500); return (completionBonus + timeBonus) * difficulty; } diff --git a/src/gui/LeaderboardsGui.hx b/src/gui/LeaderboardsGui.hx index fb786a79..3a0d8a35 100644 --- a/src/gui/LeaderboardsGui.hx +++ b/src/gui/LeaderboardsGui.hx @@ -17,7 +17,7 @@ import gui.HtmlText; class LeaderboardsGui extends GuiImage { var innerCtrl:GuiControl; - public function new(index:Int, levelSelectDifficulty:String, levelSelectGui:Bool = false,) { + public function new(index:Int, levelSelectDifficulty:String, levelSelectGui:Bool = false) { var res = ResourceLoader.getImage("data/ui/xbox/BG_fadeOutSoftEdge.png").resource.toTile(); super(res); var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); @@ -121,7 +121,8 @@ class LeaderboardsGui extends GuiImage { return null; } - var headerText = 'RankNameScorePlatform'; + var headerText = 'RankNameScoreRatingPlatform'; + var playerHeaderText = 'RankNameRating'; var scores = [ '1. Nardo Polo99:59:999', @@ -150,7 +151,7 @@ class LeaderboardsGui extends GuiImage { .concat(MissionList.missionList.get('ultra').get('advanced')) .concat(MissionList.missionList.get('ultra').get('multiplayer')); - var actualIndex = allMissions.indexOf(MissionList.missionList.get('ultra').get(levelSelectDifficulty)[index]); + var actualIndex = levelSelectDifficulty != "players" ? allMissions.indexOf(MissionList.missionList.get('ultra').get(levelSelectDifficulty)[index]) : 0; levelTitle.text.text = 'Level ${actualIndex + 1}'; @@ -159,6 +160,10 @@ class LeaderboardsGui extends GuiImage { var scoreCategories = ["Overall", "Rewind", "Non-Rewind"]; var scoreView:LeaderboardsKind = cast Settings.optionsSettings.currentView; + if (levelSelectDifficulty == "players") { + levelTitle.text.text = 'Top Players: ${scoreCategories[cast scoreView]}'; + } + var currentMission = allMissions[actualIndex]; var scoreTok = 0; @@ -176,8 +181,9 @@ class LeaderboardsGui extends GuiImage { for (score in scoreList) { var scoreText = '${i}. ${score.name} - ${score.rewind > 0 ? "" : ""} - ${isHuntScore ? Std.string(1000 - score.score) : Util.formatTime(score.score)} + ${score.rewind > 0 ? "" : ""} + ${isHuntScore ? Std.string(1000 - score.score) : Util.formatTime(score.score)} + ${score.rating} '; scoreTexts.push(scoreText); i++; @@ -192,6 +198,31 @@ class LeaderboardsGui extends GuiImage { scoreCtrl.text.text = headerText + "




" + '

Loading...

'; } + function fetchPlayers() { + var ourToken = scoreTok++; + Leaderboards.getTopPlayers(scoreView, (scoreList) -> { + if (ourToken + 1 != scoreTok) + return; + var scoreTexts = []; + var i = 1; + + for (score in scoreList) { + var scoreText = '${i}. + ${score.name} + ${score.rating}'; + scoreTexts.push(scoreText); + i++; + } + while (i <= 10) { + var scoreText = '${i}. 10000'; + scoreTexts.push(scoreText); + i++; + } + scoreCtrl.text.text = playerHeaderText + "
" + scoreTexts.join('
'); + }); + scoreCtrl.text.text = playerHeaderText + "




" + '

Loading...

'; + } + var levelSelectOpts = new GuiXboxOptionsList(2, "Overall", levelNames); levelSelectOpts.position = new Vector(380, 485); levelSelectOpts.extent = new Vector(815, 94); @@ -199,13 +230,20 @@ class LeaderboardsGui extends GuiImage { levelSelectOpts.horizSizing = Right; levelSelectOpts.alwaysActive = true; levelSelectOpts.onChangeFunc = (l) -> { + if (levelSelectDifficulty == "players") { + fetchPlayers(); + levelTitle.text.text = 'Top Players: ${scoreCategories[cast scoreView]}'; + return true; + } levelTitle.text.text = 'Level ${l + 1}'; currentMission = allMissions[l]; fetchScores(); return true; } levelSelectOpts.setCurrentOption(actualIndex); - innerCtrl.addChild(levelSelectOpts); + + if (levelSelectDifficulty != "players") + innerCtrl.addChild(levelSelectOpts); var bottomBar = new GuiControl(); bottomBar.position = new Vector(0, 590); @@ -223,7 +261,7 @@ class LeaderboardsGui extends GuiImage { if (levelSelectGui) backButton.pressedAction = (e) -> MarbleGame.canvas.setContent(new LevelSelectGui(levelSelectDifficulty)); else { - backButton.pressedAction = (e) -> MarbleGame.canvas.setContent(new MainMenuGui()); + backButton.pressedAction = (e) -> MarbleGame.canvas.setContent(new LeaderboardsSelectGui()); } bottomBar.addChild(backButton); @@ -236,47 +274,56 @@ class LeaderboardsGui extends GuiImage { scoreView = scoreView == All ? Rewind : (scoreView == Rewind ? NoRewind : All); Settings.optionsSettings.currentView = cast scoreView; levelSelectOpts.labelText.text.text = scoreCategories[cast(scoreView, Int)]; - fetchScores(); + if (levelSelectDifficulty == "players") { + levelTitle.text.text = 'Top Players: ${scoreCategories[cast scoreView]}'; + fetchPlayers(); + } else + fetchScores(); } bottomBar.addChild(changeViewButton); - var replayButton = new GuiXboxButton("Watch Replay", 220); - replayButton.position = new Vector(750, 0); - replayButton.vertSizing = Bottom; - replayButton.gamepadAccelerator = [Settings.gamepadSettings.alt2]; - replayButton.horizSizing = Right; - replayButton.pressedAction = (e) -> { - Leaderboards.watchTopReplay(currentMission.path, scoreView, (b) -> { - if (b != null) { - var replayF = new Replay(""); - if (replayF.read(b)) { - var repmis = replayF.mission; - // Strip data/ from the mission name - if (StringTools.startsWith(repmis, "data/")) { - repmis = repmis.substr(5); + if (levelSelectDifficulty != "players") { + var replayButton = new GuiXboxButton("Watch Replay", 220); + replayButton.position = new Vector(750, 0); + replayButton.vertSizing = Bottom; + replayButton.gamepadAccelerator = [Settings.gamepadSettings.alt2]; + replayButton.horizSizing = Right; + replayButton.pressedAction = (e) -> { + Leaderboards.watchTopReplay(currentMission.path, scoreView, (b) -> { + if (b != null) { + var replayF = new Replay(""); + if (replayF.read(b)) { + var repmis = replayF.mission; + // Strip data/ from the mission name + if (StringTools.startsWith(repmis, "data/")) { + repmis = repmis.substr(5); + } + + var mi = MissionList.missions.get(repmis); + + // try with data/ added + if (mi == null) { + if (!StringTools.contains(repmis, "data/")) + repmis = "data/" + repmis; + mi = MissionList.missions.get(repmis); + } + + MarbleGame.instance.watchMissionReplay(mi, replayF, DifficultySelectGui); + } else { + MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Could not load replay for this level.")); } - - var mi = MissionList.missions.get(repmis); - - // try with data/ added - if (mi == null) { - if (!StringTools.contains(repmis, "data/")) - repmis = "data/" + repmis; - mi = MissionList.missions.get(repmis); - } - - MarbleGame.instance.watchMissionReplay(mi, replayF, DifficultySelectGui); } else { - MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Could not load replay for this level.")); + MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("No top replay found for this level.")); } - } else { - MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("No top replay found for this level.")); - } - }); + }); + } + bottomBar.addChild(replayButton); } - bottomBar.addChild(replayButton); - fetchScores(); + if (levelSelectDifficulty == "players") { + fetchPlayers(); + } else + fetchScores(); } override function onResize(width:Int, height:Int) { diff --git a/src/gui/LeaderboardsSelectGui.hx b/src/gui/LeaderboardsSelectGui.hx new file mode 100644 index 00000000..7a7b2d5f --- /dev/null +++ b/src/gui/LeaderboardsSelectGui.hx @@ -0,0 +1,103 @@ +package gui; + +import h2d.filter.DropShadow; +import src.MarbleGame; +import gui.GuiControl.MouseState; +import hxd.res.BitmapFont; +import h3d.Vector; +import src.ResourceLoader; +import src.Settings; + +class LeaderboardsSelectGui extends GuiImage { + var innerCtrl:GuiControl; + var btnList:GuiXboxList; + + public function new() { + var res = ResourceLoader.getImage("data/ui/xbox/BG_fadeOutSoftEdge.png").resource.toTile(); + super(res); + var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); + var domcasual32b = new BitmapFont(domcasual32fontdata.entry); + @:privateAccess domcasual32b.loader = ResourceLoader.loader; + var domcasual32 = domcasual32b.toSdfFont(cast 42 * Settings.uiScale, MultiChannel); + + this.horizSizing = Width; + this.vertSizing = Height; + this.position = new Vector(); + this.extent = new Vector(640, 480); + + #if hl + var scene2d = hxd.Window.getInstance(); + #end + #if js + var scene2d = MarbleGame.instance.scene2d; + #end + + var offsetX = (scene2d.width - 1280) / 2; + var offsetY = (scene2d.height - 720) / 2; + + var subX = 640 - (scene2d.width - offsetX) * 640 / scene2d.width; + var subY = 480 - (scene2d.height - offsetY) * 480 / scene2d.height; + + innerCtrl = new GuiControl(); + innerCtrl.position = new Vector(offsetX, offsetY); + innerCtrl.extent = new Vector(640 - subX, 480 - subY); + innerCtrl.horizSizing = Width; + innerCtrl.vertSizing = Height; + this.addChild(innerCtrl); + + var coliseumfontdata = ResourceLoader.getFileEntry("data/font/ColiseumRR.fnt"); + var coliseumb = new BitmapFont(coliseumfontdata.entry); + @:privateAccess coliseumb.loader = ResourceLoader.loader; + var coliseum = coliseumb.toSdfFont(cast 44 * Settings.uiScale, MultiChannel); + + var rootTitle = new GuiText(coliseum); + rootTitle.position = new Vector(100, 30); + rootTitle.extent = new Vector(1120, 80); + rootTitle.text.textColor = 0xFFFFFF; + rootTitle.text.text = "SELECT LEADERBOARDS"; + rootTitle.text.alpha = 0.5; + innerCtrl.addChild(rootTitle); + + btnList = new GuiXboxList(); + btnList.position = new Vector(70 - offsetX, 165); + btnList.horizSizing = Left; + btnList.extent = new Vector(502, 500); + innerCtrl.addChild(btnList); + + btnList.addButton(0, 'Level Leaderboards', (e) -> { + MarbleGame.canvas.setContent(new LeaderboardsGui(0, "beginner", false)); + }); + btnList.addButton(0, 'Player Leaderboards', (e) -> { + MarbleGame.canvas.setContent(new LeaderboardsGui(0, "players", false)); + }); + var bottomBar = new GuiControl(); + bottomBar.position = new Vector(0, 590); + bottomBar.extent = new Vector(640, 200); + bottomBar.horizSizing = Width; + bottomBar.vertSizing = Bottom; + innerCtrl.addChild(bottomBar); + + var backButton = new GuiXboxButton("Back", 160); + backButton.position = new Vector(400, 0); + backButton.vertSizing = Bottom; + backButton.horizSizing = Right; + backButton.gamepadAccelerator = [Settings.gamepadSettings.back]; + backButton.accelerators = [hxd.Key.ESCAPE, hxd.Key.BACKSPACE]; + backButton.pressedAction = (e) -> MarbleGame.canvas.setContent(new MainMenuGui()); + + bottomBar.addChild(backButton); + } + + override function onResize(width:Int, height:Int) { + var offsetX = (width - 1280) / 2; + var offsetY = (height - 720) / 2; + + var subX = 640 - (width - offsetX) * 640 / width; + var subY = 480 - (height - offsetY) * 480 / height; + innerCtrl.position = new Vector(offsetX, offsetY); + innerCtrl.extent = new Vector(640 - subX, 480 - subY); + btnList.position = new Vector(70 - offsetX, 165); + + super.onResize(width, height); + } +} diff --git a/src/gui/MainMenuGui.hx b/src/gui/MainMenuGui.hx index 67c35550..70e1cfc7 100644 --- a/src/gui/MainMenuGui.hx +++ b/src/gui/MainMenuGui.hx @@ -85,7 +85,7 @@ class MainMenuGui extends GuiImage { } }); btnList.addButton(2, "Leaderboards", (e) -> { - cast(this.parent, Canvas).setContent(new LeaderboardsGui(0, "beginner", false)); + cast(this.parent, Canvas).setContent(new LeaderboardsSelectGui()); }, 20); btnList.addButton(2, "Achievements", (e) -> { cast(this.parent, Canvas).setContent(new AchievementsGui());