From 9b0ecd43454794aa55948196bba0d7b440e61988 Mon Sep 17 00:00:00 2001 From: cakipaul Date: Tue, 15 Jul 2025 14:54:13 +0800 Subject: [PATCH] =?UTF-8?q?event=5Fmanager=20=E8=A7=A3=E8=80=A6=20=5Fon=5F?= =?UTF-8?q?stage=5Fupdated=5Ffor=5Fhandnote?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manager/event_manager/event_manager.gd | 69 +++++++++++++++----------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/manager/event_manager/event_manager.gd b/manager/event_manager/event_manager.gd index ba015a02..149ac9a8 100644 --- a/manager/event_manager/event_manager.gd +++ b/manager/event_manager/event_manager.gd @@ -1,61 +1,74 @@ @tool extends Node +## 当任何事件的状态(stage)发生变化时发出此信号。 +## 其他系统(如UI、角色状态机等)可以监听此信号来做出反应。 signal stage_updated(event_name: StringName, stage: int) +# 节点初始化时,异步加载并解析事件规则。 +func _ready() -> void: + stage_updated.connect(_on_stage_updated_for_handnote) + + +# --- 公共 API --- + func get_chapter_stage() -> int: - return get_stage("current_chapter_stage") + return get_stage(&"current_chapter_stage") func get_stage(event_name: StringName) -> int: if not ArchiveManager.archive or ArchiveManager.archive.event_stage == null: - printerr("[EventManager] Archive or event_stage is null.") + printerr("[EventManager] Archive or event_stage is null. Cannot get stage for '", event_name, "'.") return 0 - var val = ArchiveManager.archive.event_stage.get(event_name, 0) - return val + return ArchiveManager.archive.event_stage.get(event_name, 0) +# 核心的 stage 设置函数 # default 为 0,首次更新为 1 func set_stage(event_name: StringName, stage := 1) -> void: if not ArchiveManager.archive or ArchiveManager.archive.event_stage == null: - printerr("[EventManager] Archive or event_stage is null.") + printerr("[EventManager] Archive or event_stage is null. Cannot set stage for '", event_name, "'.") return ArchiveManager.archive.event_stage[event_name] = stage - # print before emit - print("[EventManager] Stage updated: %s, stage: %s" % [event_name, stage]) + print("[EventManager] Stage updated: %s -> %s" % [event_name, stage]) stage_updated.emit(event_name, stage) - # 如果是 handnote_ 事件,玩家进行记笔记动作 - if ( - SceneManager.is_node_ready() - and SceneManager.get_player() - and SceneManager.get_player().character.begins_with("吕萍") - ): - if event_name == &"current_chapter_stage": - # 章节更新 - pass - elif event_name.begins_with("handnote_"): - # 笔记条目更新 - # 0 初始化隐藏,1 开始显示,2 划掉,3 结束隐藏 - if stage == 1: - SceneManager.lock_player(3.0, 16, true) - SceneManager.pop_notification("ui_notify_note_update") -# 仅在设置的 stage > 当前 stage 时更新,相等或小于时不更新 -func set_stage_if_greater(event_name: StringName, stage := 1) -> bool: - var current_stage = get_stage(event_name) - if stage > current_stage: +# 仅当设置的 stage > 当前 stage 时更新 +func set_stage_if_greater(event_name: StringName, stage: int) -> bool: + if stage > get_stage(event_name): set_stage(event_name, stage) return true return false # stage 最大 99999 -func next_staged(event_name: StringName, stage_max := 99999) -> void: +func next_stage(event_name: StringName, stage_max := 99999) -> int: var current_stage = get_stage(event_name) if current_stage < stage_max: - set_stage(event_name, current_stage + 1) + var new_stage = current_stage + 1 + set_stage(event_name, new_stage) + return new_stage + return stage_max + + +# --- 游戏特定逻辑 --- +func _on_stage_updated_for_handnote(event_name: StringName, stage: int) -> void: + # 检查条件是否满足 + if not ( + SceneManager.is_node_ready() + and SceneManager.get_player() + and SceneManager.get_player().character.begins_with("吕萍") + ): + return + + if event_name.begins_with("handnote_"): + # 笔记条目更新 + # 0 初始化隐藏,1 开始显示,2 划掉,3 结束隐藏 + if stage == 1: + SceneManager.lock_player(3.0, 16, true) + SceneManager.pop_notification("ui_notify_note_update") ##### 其他事件 #####