From c31b3bdc4fb7ea6691aa18d8aa96356d29eb8f06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=A8=E8=90=BD=E5=9F=BA=E5=9B=B4=E8=99=BE?= <3161880837@qq.com> Date: Sat, 9 May 2026 21:41:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BA=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E7=B3=BB=E7=BB=9F=E5=B9=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 扩展保存系统以包含更多游戏状态数据,包括库存和角色选择 添加调试打印语句以帮助排查保存问题 新增字典映射工具方法用于数据转换 修复新召唤实体未正确分组的问题 --- scripts/Contents/Panels/Starter.gd | 4 ++++ scripts/Statemachine/EntityBase.gd | 1 + scripts/Tools/ArrayTool.gd | 8 ++++++++ scripts/Tools/Engines/SaveEngine.gd | 21 ++++++++++++++++----- scripts/Tools/Managers/GameBusManager.gd | 1 + 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/scripts/Contents/Panels/Starter.gd b/scripts/Contents/Panels/Starter.gd index 121df93..2c3e8a0 100644 --- a/scripts/Contents/Panels/Starter.gd +++ b/scripts/Contents/Panels/Starter.gd @@ -94,6 +94,8 @@ func startSingleplayerGame(): UIState.setPanel("CompilingTip") else: UIState.setPanel("SelectInitialFeed") + if useTutorialBtn.button_pressed: + tutorialWatched = true func _ready(): historyStack = Composables.useHistoryStack(playerNameInput) @@ -206,6 +208,7 @@ func rebuildInfo(): func(newValue: float): OutGameStorage.upgradableFieldsValue[fieldShow.field] = newValue OutGameStorage.upgradableFieldsLevel[fieldShow.field] += 1 + SaveEngine.save() rebuildInfo() ) upgradeFieldsBox.add_child(fieldShow) @@ -219,6 +222,7 @@ func rebuildInfo(): getCurrentSelectedCharacter().animator.play("hide") selectedCharacter = card.name getCurrentSelectedCharacter().animator.play("show") + SaveEngine.save() ) charactersBox.add_child(card) if selectedCharacter == card.name: diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index f3df792..b7091ba 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -508,6 +508,7 @@ func summon(who: PackedScene, syncFields: bool = true, lockValue: bool = true) - instance.position = get_global_mouse_position() instance.myMaster = self summoned(instance) + instance.add_to_group("entities") if isPlayer(): instance.add_to_group("players") if syncFields: if lockValue: diff --git a/scripts/Tools/ArrayTool.gd b/scripts/Tools/ArrayTool.gd index 12d3ec3..a093ac8 100644 --- a/scripts/Tools/ArrayTool.gd +++ b/scripts/Tools/ArrayTool.gd @@ -31,6 +31,14 @@ static func fill(origin: Dictionary, filler: Callable) -> Dictionary: return accum, {} ) +static func mapEntries(origin: Dictionary, mapper: Callable) -> Dictionary: + return origin.keys().reduce( + func(accum, key): + var entry = mapper.call(key, origin[key]) + accum[entry[0]] = entry[1] + return accum, + {} + ) static func dictionaryFromEntries(keys: Array, values: Array) -> Dictionary: var result = {} for index in len(keys): diff --git a/scripts/Tools/Engines/SaveEngine.gd b/scripts/Tools/Engines/SaveEngine.gd index 69cd064..35412fe 100644 --- a/scripts/Tools/Engines/SaveEngine.gd +++ b/scripts/Tools/Engines/SaveEngine.gd @@ -5,17 +5,28 @@ const SAVE_FILE = "user://save.json" static func serialize(): return { "out-game": { - "value": OutGameStorage.upgradableFieldsValue.duplicate(), - "level": OutGameStorage.upgradableFieldsLevel.duplicate() + "value": OutGameStorage.upgradableFieldsValue, + "level": OutGameStorage.upgradableFieldsLevel, + "inventory": OutGameStorage.inventory, }, - "tutorial-watched": StarterPanel.tutorialWatched + "ui-state": { + "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"] - StarterPanel.tutorialWatched = saveData["tutorial-watched"] + OutGameStorage.inventory = saveData["out-game"]["inventory"] + StarterPanel.tutorialWatched = saveData["ui-state"]["tutorial-watched"] + StarterPanel.selectedCharacter = saveData["ui-state"]["selected-character"] static func load(): - return JsonTool.parseFromFile(SAVE_FILE) + 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]) + return origin static func save(): var file = FileAccess.open(SAVE_FILE, FileAccess.ModeFlags.WRITE) if file is FileAccess: diff --git a/scripts/Tools/Managers/GameBusManager.gd b/scripts/Tools/Managers/GameBusManager.gd index dba5b78..1d2cede 100644 --- a/scripts/Tools/Managers/GameBusManager.gd +++ b/scripts/Tools/Managers/GameBusManager.gd @@ -6,6 +6,7 @@ static func _static_init(): static func init(): var save = SaveEngine.load() if save: + print(save) SaveEngine.apply(save) static func restart(tree: SceneTree): for bullet in tree.get_nodes_in_group("bullets"):