Skip to content

Commit 6112e2f

Browse files
committed
Changed FunkinSave Highscores Implementation
1 parent 3939439 commit 6112e2f

File tree

2 files changed

+50
-9
lines changed

2 files changed

+50
-9
lines changed

source/funkin/backend/system/macros/FunkinSaveMacro.hx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class FunkinSaveMacro {
4444
*/
4545
var saveFuncBlocks:Array<Expr> = [for(f in fieldNames) macro $i{saveFieldName}.data.$f = $i{f}];
4646

47+
saveFuncBlocks.push(macro $i{"__flush"}());
4748
saveFuncBlocks.push(macro $i{saveFieldName}.flush());
4849

4950
fields.push({
@@ -72,7 +73,7 @@ class FunkinSaveMacro {
7273
expr: EBlock([for(f in fieldNames)
7374
macro if ($i{saveFieldName}.data.$f != null)
7475
$i{f} = $i{saveFieldName}.data.$f
75-
])
76+
, macro $i{"__load"}()])
7677
}
7778
}),
7879
access: [APublic, AStatic]

source/funkin/savedata/FunkinSave.hx

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package funkin.savedata;
33
import flixel.util.FlxSave;
44
import lime.app.Application;
55
import 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"))
1315
class 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

104144
enum 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

109149
enum HighscoreChange {

0 commit comments

Comments
 (0)