From 6112e2f759bc6f4fff11979a49442d49a28872ff Mon Sep 17 00:00:00 2001 From: Ralty <78720179+Raltyro@users.noreply.github.com> Date: Fri, 8 Aug 2025 22:20:54 +0700 Subject: [PATCH] Changed FunkinSave Highscores Implementation --- .../backend/system/macros/FunkinSaveMacro.hx | 3 +- source/funkin/savedata/FunkinSave.hx | 56 ++++++++++++++++--- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/source/funkin/backend/system/macros/FunkinSaveMacro.hx b/source/funkin/backend/system/macros/FunkinSaveMacro.hx index 5ba9a051..ff96262d 100644 --- a/source/funkin/backend/system/macros/FunkinSaveMacro.hx +++ b/source/funkin/backend/system/macros/FunkinSaveMacro.hx @@ -44,6 +44,7 @@ class FunkinSaveMacro { */ var saveFuncBlocks:Array = [for(f in fieldNames) macro $i{saveFieldName}.data.$f = $i{f}]; + saveFuncBlocks.push(macro $i{"__flush"}()); saveFuncBlocks.push(macro $i{saveFieldName}.flush()); fields.push({ @@ -72,7 +73,7 @@ class FunkinSaveMacro { expr: EBlock([for(f in fieldNames) macro if ($i{saveFieldName}.data.$f != null) $i{f} = $i{saveFieldName}.data.$f - ]) + , macro $i{"__load"}()]) } }), access: [APublic, AStatic] diff --git a/source/funkin/savedata/FunkinSave.hx b/source/funkin/savedata/FunkinSave.hx index 5e5ed2eb..062ccfde 100644 --- a/source/funkin/savedata/FunkinSave.hx +++ b/source/funkin/savedata/FunkinSave.hx @@ -3,6 +3,8 @@ package funkin.savedata; import flixel.util.FlxSave; import lime.app.Application; import openfl.Lib; +import haxe.Serializer; +import haxe.Unserializer; /** * Class used for saves WITHOUT going through the struggle of type checks @@ -11,17 +13,14 @@ import openfl.Lib; */ @:build(funkin.backend.system.macros.FunkinSaveMacro.build("save", "flush", "load")) class FunkinSave { - public static var highscores:Map = []; - - /** * ONLY OPEN IF YOU WANT TO EDIT FUNCTIONS RELATED TO SAVING, LOADING OR HIGHSCORES. */ #if REGION - @:dox(hide) @:doNotSave - private static var __eventAdded = false; - @:doNotSave - public static var save:FlxSave; + @:doNotSave public static var highscores:Map = []; + + @:dox(hide) @:doNotSave private static var __eventAdded = false; + @:doNotSave public static var save:FlxSave; public static function init() { var path = Flags.SAVE_PATH, name = Flags.SAVE_NAME; @@ -46,6 +45,47 @@ class FunkinSave { } } + private static function __load() { + if (save.data.highscores != null) { + var temp; + for (entryData in Reflect.fields(save.data.highscores)) if ((temp = __getHighscoreEntry(entryData)) != null) + highscores.set(temp, Reflect.field(save.data.highscores, entryData)); + } + } + + private static function __flush() { + if (save.data.highscores == null) save.data.highscores = {}; + for (entry => score in highscores) Reflect.setField(save.data.highscores, __formatHighscoreEntry(entry), score); + } + + static function __getHighscoreEntry(data:String):HighscoreEntry { + try { + var d = Unserializer.run(data); + if (d.song is String) + return HSongEntry(d.song, d.diff, d.changes); + else if (d.week is String) + return HWeekEntry(d.week, d.diff); + } + catch (e) {} + return null; + } + + static function __formatHighscoreEntry(entry:HighscoreEntry):String { + switch (entry) { + case HWeekEntry(weekName:String, difficulty:String): + return Serializer.run({week: weekName, diff: difficulty}); + case HSongEntry(songName:String, difficulty:String, variation:Null, changes:Array): + var d = { + song: songName, + diff: difficulty, + changes: changes + }; + if (variation != null && variation != '') d.variation = variation; + return Serializer.run(d); + } + return ''; + } + /** * Returns the high-score for a song. * @param name Song name @@ -103,7 +143,7 @@ class FunkinSave { enum HighscoreEntry { HWeekEntry(weekName:String, difficulty:String); - HSongEntry(songName:String, difficulty:String, changes:Array); + HSongEntry(songName:String, difficulty:String, variation:Null, changes:Array); } enum HighscoreChange {