diff --git a/data/ui/play/sort_alpha_d.png b/data/ui/play/sort_alpha_d.png new file mode 100644 index 00000000..715c3358 Binary files /dev/null and b/data/ui/play/sort_alpha_d.png differ diff --git a/data/ui/play/sort_alpha_h.png b/data/ui/play/sort_alpha_h.png new file mode 100644 index 00000000..30ba3d42 Binary files /dev/null and b/data/ui/play/sort_alpha_h.png differ diff --git a/data/ui/play/sort_alpha_i.png b/data/ui/play/sort_alpha_i.png new file mode 100644 index 00000000..4ffbac32 Binary files /dev/null and b/data/ui/play/sort_alpha_i.png differ diff --git a/data/ui/play/sort_alpha_n.png b/data/ui/play/sort_alpha_n.png new file mode 100644 index 00000000..30e946fc Binary files /dev/null and b/data/ui/play/sort_alpha_n.png differ diff --git a/data/ui/play/sort_date_d.png b/data/ui/play/sort_date_d.png new file mode 100644 index 00000000..756370cf Binary files /dev/null and b/data/ui/play/sort_date_d.png differ diff --git a/data/ui/play/sort_date_h.png b/data/ui/play/sort_date_h.png new file mode 100644 index 00000000..f745a1a8 Binary files /dev/null and b/data/ui/play/sort_date_h.png differ diff --git a/data/ui/play/sort_date_i.png b/data/ui/play/sort_date_i.png new file mode 100644 index 00000000..51ec26ec Binary files /dev/null and b/data/ui/play/sort_date_i.png differ diff --git a/data/ui/play/sort_date_n.png b/data/ui/play/sort_date_n.png new file mode 100644 index 00000000..9df8dcc5 Binary files /dev/null and b/data/ui/play/sort_date_n.png differ diff --git a/src/Marbleland.hx b/src/Marbleland.hx index 4c836147..8d5f9bb2 100644 --- a/src/Marbleland.hx +++ b/src/Marbleland.hx @@ -32,7 +32,7 @@ class Marbleland { for (missionData in claJson) { // filter - if (missionData.compatibility != 'mbw' && missionData.compatibility != 'mbg') + if (missionData.datablockCompatibility != 'mbw' && missionData.datablockCompatibility != 'mbg') continue; if (!['gold', 'platinum', 'ultra', 'platinumquest'].contains(missionData.modification)) continue; @@ -61,6 +61,7 @@ class Marbleland { mission.ultimateTime = missionData.ultimateTime != null ? missionData.ultimateTime / 1000 : 0; mission.hasEgg = missionData.hasEgg; mission.isClaMission = true; + mission.addedAt = missionData.addedAt; var game = missionData.modification; diff --git a/src/Mission.hx b/src/Mission.hx index 7d7871f1..8848e4df 100644 --- a/src/Mission.hx +++ b/src/Mission.hx @@ -1,5 +1,6 @@ package src; +import haxe.Int64; import src.Http.HttpRequest; import gui.Canvas; import gui.MessageBoxOkDlg; @@ -40,6 +41,7 @@ class Mission { public var game:String; public var hasEgg:Bool; public var isCustom:Bool; + public var addedAt:Int64; var next:Mission; diff --git a/src/gui/PlayMissionGui.hx b/src/gui/PlayMissionGui.hx index f681eb4c..d71b7736 100644 --- a/src/gui/PlayMissionGui.hx +++ b/src/gui/PlayMissionGui.hx @@ -37,7 +37,7 @@ class PlayMissionGui extends GuiImage { var setSelectedFunc:Int->Void; var setScoreHover:Bool->Void; - var setCategoryFunc:(String, String, ?Bool) -> Void; + var setCategoryFunc:(String, String, ?String, ?Bool) -> Void; var buttonHoldFunc:(dt:Float, mouseState:MouseState) -> Void; var pmScoreButton:GuiButton; @@ -204,6 +204,27 @@ class PlayMissionGui extends GuiImage { } pmBox.addChild(pmSearch); + var sortType = 0; // 0 = alphabetical, 1 = date + + var sortAlphaImgs = loadButtonImages("data/ui/play/sort_alpha"); + var sortDateImgs = loadButtonImages("data/ui/play/sort_date"); + + var pmSort = new GuiButton(sortAlphaImgs); + pmSort.position = new Vector(366, 325); + pmSort.extent = new Vector(43, 43); + pmSort.pressedAction = (e) -> { + sortType = (sortType + 1) % 2; + if (sortType == 0) { + @:privateAccess pmSort.anim.frames = sortAlphaImgs; + } + if (sortType == 1) { + @:privateAccess pmSort.anim.frames = sortDateImgs; + } + setCategoryFunc(currentGame, currentCategoryStatic, sortType == 1 ? "date" : "alpha"); + // MarbleGame.canvas.pushDialog(new SearchGui(currentGame, currentCategory == "custom")); + } + pmBox.addChild(pmSort); + var pmPrev = new GuiButton(loadButtonImages("data/ui/play/prev")); pmPrev.position = new Vector(436, 325); pmPrev.extent = new Vector(72, 43); @@ -605,7 +626,7 @@ class PlayMissionGui extends GuiImage { MarbleGame.canvas.pushDialog(mbo); } else { currentCategory = "custom"; - setCategoryFunc("gold", "custom"); + setCategoryFunc("gold", "custom", sortType == 1 ? "date" : "alpha"); } } pmDifficultyCtrl.addChild(pmDifficultyGoldCustom); @@ -621,7 +642,7 @@ class PlayMissionGui extends GuiImage { MarbleGame.canvas.pushDialog(mbo); } else { currentCategory = "custom"; - setCategoryFunc("platinum", "custom"); + setCategoryFunc("platinum", "custom", sortType == 1 ? "date" : "alpha"); } } pmDifficultyCtrl.addChild(pmDifficultyPlatinumCustom); @@ -637,7 +658,7 @@ class PlayMissionGui extends GuiImage { MarbleGame.canvas.pushDialog(mbo); } else { currentCategory = "custom"; - setCategoryFunc("ultra", "custom"); + setCategoryFunc("ultra", "custom", sortType == 1 ? "date" : "alpha"); } } pmDifficultyCtrl.addChild(pmDifficultyUltraCustom); @@ -812,7 +833,7 @@ class PlayMissionGui extends GuiImage { currentList = MissionList.missionList["platinum"]["beginner"]; - setCategoryFunc = function(game:String, category:String, ?doRender:Bool = true) { + setCategoryFunc = function(game:String, category:String, ?sort:String = null, ?doRender:Bool = true) { currentList = category == "custom" ? (switch (game) { case 'gold' if (Marbleland.goldMissions.length != 0): Marbleland.goldMissions; case 'platinum' if (Marbleland.platinumMissions.length != 0): Marbleland.platinumMissions; @@ -836,6 +857,24 @@ class PlayMissionGui extends GuiImage { pmAchievements.disabled = true; } + if (category == "custom") { + pmSort.anim.visible = true; + pmSort.disabled = false; + } else { + pmSort.anim.visible = false; + pmSort.disabled = true; + } + + if (sort != null) { + currentList = currentList.copy(); // Don't modify the originals + if (sort == "alpha") { + currentList.sort((x, y) -> x.title > y.title ? 1 : (x.title < y.title ? -1 : 0)); + } + if (sort == "date") { + currentList.sort((x, y) -> x.addedAt > y.addedAt ? 1 : (x.addedAt < y.addedAt ? -1 : 0)); + } + } + currentCategoryStatic = currentCategory; if (currentGame != game) { @@ -1044,7 +1083,7 @@ class PlayMissionGui extends GuiImage { #end } - setCategoryFunc(currentGame, currentCategoryStatic, false); + setCategoryFunc(currentGame, currentCategoryStatic, null, false); #if js var kofi = new GuiButton(loadButtonImages("data/ui/kofi1"));