1
1
mirror of https://github.com/Rundll86/Dog-Lynx-And-HCN.git synced 2026-05-27 22:41:56 +08:00

feat(保存系统): 改进保存数据的序列化和反序列化处理

重构保存系统以使用新的嵌套字典工具方法
修改Starter场景中的按钮文本并隐藏多人游戏选项
添加JsonTool和ArrayTool的嵌套数据操作方法
This commit is contained in:
2026-05-10 06:43:08 +08:00
parent 1dc6df8dd7
commit ebe9faa46c
4 changed files with 41 additions and 8 deletions
@@ -320,8 +320,7 @@ unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
toggle_mode = true
button_pressed = true
text = "观看"
text = "跳过"
[node name="start" type="VBoxContainer" parent="content/wrapper/layout/startGameWrapper/start/starter/singleplayer" index="1" unique_id=1119283819]
layout_mode = 2
@@ -343,6 +342,7 @@ theme = ExtResource("4_lfxcn")
text = "多人游戏"
[node name="multiplayer" type="VBoxContainer" parent="content/wrapper/layout/startGameWrapper/start/starter" index="1" unique_id=2010516457]
visible = false
layout_mode = 2
theme_override_constants/separation = 15
alignment = 1
+31
View File
@@ -53,3 +53,34 @@ static func mergeDictionary(a: Dictionary, b: Dictionary) -> Dictionary:
for key in b:
result[key] = result.get(key, 0.0) + b[key]
return result
static func getNested(data: Variant, path: String) -> Variant:
var keys = path.split(".")
var result = data
for key in keys:
if result is Dictionary:
result = result[key]
elif result is Array:
result = result[key.to_int()]
else:
return null
return result
static func setNested(data: Variant, path: String, value: Variant):
var keys = path.split(".")
for i in range(keys.size() - 1):
var key = keys[i]
if data is Dictionary:
data = data[key]
elif data is Array:
data = data[key.to_int()]
else:
return
var lastKey = keys[-1]
if data is Dictionary:
data[lastKey] = value
elif data is Array:
var index = lastKey.to_int()
if index == data.size():
data.append(value)
else:
data[index] = value
return data
+6 -6
View File
@@ -3,7 +3,7 @@ class_name SaveEngine
const SAVE_FILE = "user://save.json"
static func serialize():
return {
return JsonTool.stringify({
"out-game": {
"value": OutGameStorage.upgradableFieldsValue,
"level": OutGameStorage.upgradableFieldsLevel,
@@ -13,7 +13,7 @@ static func serialize():
"tutorial-watched": StarterPanel.tutorialWatched,
"selected-character": StarterPanel.selectedCharacter
}
}
})
static func apply(saveData: Dictionary):
OutGameStorage.upgradableFieldsValue = saveData["out-game"]["value"]
OutGameStorage.upgradableFieldsLevel = saveData["out-game"]["level"]
@@ -23,12 +23,12 @@ static func apply(saveData: Dictionary):
static func load():
var origin = JsonTool.parseFromFile(SAVE_FILE)
if origin is Dictionary:
origin["out-game"]["value"] = ArrayTool.mapEntries(origin["out-game"]["value"], func(key, value): return [int(key), value])
origin["out-game"]["level"] = ArrayTool.mapEntries(origin["out-game"]["level"], func(key, value): return [int(key), value])
origin["out-game"]["inventory"] = ArrayTool.mapEntries(origin["out-game"]["inventory"], func(key, value): return [int(key), value])
JsonTool.restoreEnumKey(origin, "out-game.value")
JsonTool.restoreEnumKey(origin, "out-game.level")
JsonTool.restoreEnumKey(origin, "out-game.inventory")
return origin
static func save():
var file = FileAccess.open(SAVE_FILE, FileAccess.ModeFlags.WRITE)
if file is FileAccess:
file.store_string(JsonTool.stringify(serialize()))
file.store_string(serialize())
file.close()
+2
View File
@@ -12,3 +12,5 @@ static func parseFromText(text: String):
return jsonObj.data
static func stringify(data: Variant):
return JSON.stringify(data, " ")
static func restoreEnumKey(origin: Dictionary, classpath: String):
ArrayTool.setNested(origin, classpath, ArrayTool.mapEntries(ArrayTool.getNested(origin, classpath), func(key, value): return [int(key), value]))