@@ -3,6 +3,8 @@ package funkin.savedata;
33import flixel .util .FlxSave ;
44import lime .app .Application ;
55import openfl .Lib ;
6+ import haxe .Serializer ;
7+ import haxe .Unserializer ;
68
79/**
810 * Class used for saves WITHOUT going through the struggle of type checks
@@ -11,17 +13,14 @@ import openfl.Lib;
1113 */
1214@:build (funkin.backend.system.macros. FunkinSaveMacro .build (" save" , " flush" , " load" ))
1315class FunkinSave {
14- public static var highscores : Map <HighscoreEntry , SongScore > = [];
15-
16-
1716 /**
1817 * ONLY OPEN IF YOU WANT TO EDIT FUNCTIONS RELATED TO SAVING, LOADING OR HIGHSCORES.
1918 */
2019 #if REGION
21- @:dox ( hide ) @ :doNotSave
22- private static var __eventAdded = false ;
23- @:doNotSave
24- public static var save : FlxSave ;
20+ @:doNotSave public static var highscores : Map < HighscoreEntry , SongScore > = [];
21+
22+ @:dox ( hide ) @ : doNotSave private static var __eventAdded = false ;
23+ @ :doNotSave public static var save : FlxSave ;
2524
2625 public static function init () {
2726 var path = Flags .SAVE_PATH , name = Flags .SAVE_NAME ;
@@ -46,6 +45,47 @@ class FunkinSave {
4645 }
4746 }
4847
48+ private static function __load () {
49+ if (save .data .highscores != null ) {
50+ var temp ;
51+ for (entryData in Reflect .fields (save .data .highscores )) if ((temp = __getHighscoreEntry (entryData )) != null )
52+ highscores .set (temp , Reflect .field (save .data .highscores , entryData ));
53+ }
54+ }
55+
56+ private static function __flush () {
57+ if (save .data .highscores == null ) save .data .highscores = {};
58+ for (entry => score in highscores ) Reflect .setField (save .data .highscores , __formatHighscoreEntry (entry ), score );
59+ }
60+
61+ static function __getHighscoreEntry (data : String ): HighscoreEntry {
62+ try {
63+ var d = Unserializer .run (data );
64+ if (d .song is String )
65+ return HSongEntry (d .song , d .diff , d .changes );
66+ else if (d .week is String )
67+ return HWeekEntry (d .week , d .diff );
68+ }
69+ catch (e ) {}
70+ return null ;
71+ }
72+
73+ static function __formatHighscoreEntry (entry : HighscoreEntry ): String {
74+ switch (entry ) {
75+ case HWeekEntry (weekName :String , difficulty :String ):
76+ return Serializer .run ({week : weekName , diff : difficulty });
77+ case HSongEntry (songName :String , difficulty :String , variation :Null < String > , changes :Array < HighscoreChange > ):
78+ var d = {
79+ song : songName ,
80+ diff : difficulty ,
81+ changes : changes
82+ };
83+ if (variation != null && variation != ' ' ) d .variation = variation ;
84+ return Serializer .run (d );
85+ }
86+ return ' ' ;
87+ }
88+
4989 /**
5090 * Returns the high-score for a song.
5191 * @param name Song name
@@ -103,7 +143,7 @@ class FunkinSave {
103143
104144enum HighscoreEntry {
105145 HWeekEntry (weekName : String , difficulty : String );
106- HSongEntry (songName : String , difficulty : String , changes : Array <HighscoreChange >);
146+ HSongEntry (songName : String , difficulty : String , variation : Null < String >, changes : Array <HighscoreChange >);
107147}
108148
109149enum HighscoreChange {
0 commit comments