From b1cb08970501e839a660434b8e4636fdafb4a773 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:25:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E4=BF=9D=E5=AD=98=E7=B3=BB=E7=BB=9F):=20?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=B8=B8=E6=88=8F=E5=AD=98=E6=A1=A3=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加SaveEngine类用于处理游戏存档的序列化、加载和应用 修改GameBusManager在游戏重启时自动保存和加载存档 扩展JsonTool功能以支持文件解析和字符串序列化 更新StarterPanel添加教程观看状态保存 --- scripts/Contents/Panels/Starter.gd | 2 ++ scripts/Tools/Engines/SaveEngine.gd | 23 +++++++++++++++++++++++ scripts/Tools/Engines/SaveEngine.gd.uid | 1 + scripts/Tools/GameRule.gd | 2 +- scripts/Tools/JsonTool.gd | 13 +++++++++---- scripts/Tools/Managers/GameBusManager.gd | 8 ++++++++ 6 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 scripts/Tools/Engines/SaveEngine.gd create mode 100644 scripts/Tools/Engines/SaveEngine.gd.uid diff --git a/scripts/Contents/Panels/Starter.gd b/scripts/Contents/Panels/Starter.gd index 39c6169..121df93 100644 --- a/scripts/Contents/Panels/Starter.gd +++ b/scripts/Contents/Panels/Starter.gd @@ -32,6 +32,7 @@ var historyStack static var GAMEMODE_MAP_WAVE = [Wave.WAVE_NORMAL, Wave.WAVE_BOSSRUSH, Wave.WAVE_MOWING, Wave.WAVE_TESTBOSS] static var START_CHARACTERS = ["MuyangDog", "Lynx", "HCN"] static var buildingShader: bool = true +static var tutorialWatched: bool = false static var selectingFeed: bool = true static var selectedCharacter: String = MathTool.randomChoiceFrom(START_CHARACTERS) @@ -100,6 +101,7 @@ func _ready(): func(on: bool): useTutorialBtn.text = "观看" if on else "跳过" ) + useTutorialBtn.button_pressed = tutorialWatched multiplayer.connection_failed.connect( func(): setState(MultiplayerState.ConnectionState.DISCONNECTED) diff --git a/scripts/Tools/Engines/SaveEngine.gd b/scripts/Tools/Engines/SaveEngine.gd new file mode 100644 index 0000000..69cd064 --- /dev/null +++ b/scripts/Tools/Engines/SaveEngine.gd @@ -0,0 +1,23 @@ +class_name SaveEngine + +const SAVE_FILE = "user://save.json" + +static func serialize(): + return { + "out-game": { + "value": OutGameStorage.upgradableFieldsValue.duplicate(), + "level": OutGameStorage.upgradableFieldsLevel.duplicate() + }, + "tutorial-watched": StarterPanel.tutorialWatched + } +static func apply(saveData: Dictionary): + OutGameStorage.upgradableFieldsValue = saveData["out-game"]["value"] + OutGameStorage.upgradableFieldsLevel = saveData["out-game"]["level"] + StarterPanel.tutorialWatched = saveData["tutorial-watched"] +static func load(): + return JsonTool.parseFromFile(SAVE_FILE) +static func save(): + var file = FileAccess.open(SAVE_FILE, FileAccess.ModeFlags.WRITE) + if file is FileAccess: + file.store_string(JsonTool.stringify(serialize())) + file.close() diff --git a/scripts/Tools/Engines/SaveEngine.gd.uid b/scripts/Tools/Engines/SaveEngine.gd.uid new file mode 100644 index 0000000..be8731e --- /dev/null +++ b/scripts/Tools/Engines/SaveEngine.gd.uid @@ -0,0 +1 @@ +uid://dae5c5gtbf3uo diff --git a/scripts/Tools/GameRule.gd b/scripts/Tools/GameRule.gd index f1d9117..d7dc778 100644 --- a/scripts/Tools/GameRule.gd +++ b/scripts/Tools/GameRule.gd @@ -1,6 +1,6 @@ class_name GameRule -static var deadReasons: Array = JsonTool.parseJson("res://resources/constants/deadReasons.json") +static var deadReasons: Array = JsonTool.parseFromFile("res://resources/constants/deadReasons.json") static var helpText: String static var difficultyRange: Vector2 = Vector2(-20, 50) # 难度倍数范围,包括最小值和最大值,负数则降低难度 static var difficulty: float = 1 # 难度倍数,可以写小数 diff --git a/scripts/Tools/JsonTool.gd b/scripts/Tools/JsonTool.gd index e5818c0..0558d49 100644 --- a/scripts/Tools/JsonTool.gd +++ b/scripts/Tools/JsonTool.gd @@ -1,9 +1,14 @@ class_name JsonTool -static func parseJson(filePath: String): +static func parseFromFile(filePath: String): var file = FileAccess.open(filePath, FileAccess.READ) - var json = file.get_as_text() - file.close() + if file is FileAccess: + var json = file.get_as_text() + file.close() + return parseFromText(json) +static func parseFromText(text: String): var jsonObj = JSON.new() - jsonObj.parse(json) + jsonObj.parse(text) return jsonObj.data +static func stringify(data: Variant): + return JSON.stringify(data, " ") diff --git a/scripts/Tools/Managers/GameBusManager.gd b/scripts/Tools/Managers/GameBusManager.gd index abec732..dba5b78 100644 --- a/scripts/Tools/Managers/GameBusManager.gd +++ b/scripts/Tools/Managers/GameBusManager.gd @@ -1,5 +1,12 @@ class_name GameBusManager +static func _static_init(): + init() + +static func init(): + var save = SaveEngine.load() + if save: + SaveEngine.apply(save) static func restart(tree: SceneTree): for bullet in tree.get_nodes_in_group("bullets"): bullet.queue_free() @@ -14,6 +21,7 @@ static func restart(tree: SceneTree): OutGameStorage.saveInventory() CameraManager.shakeStop() WorldManager.timeRestart() + SaveEngine.save() StarterPanel.selectingFeed = true UIState.setPanel("Starter")