@tool extends AnimationRoot var ambush: Ambush2D var frame: Note2D var paper: Interactable2D var right_door: Portal2D var piano: Interactable2D # 覆盖该方法 func _default_data() -> Dictionary: return {"frame_relocated": false, "intro_played": false} func _ready() -> void: super._ready() func _setup_display_on_locale(): if is_node_ready(): var is_zh = TranslationServer.get_locale().begins_with("zh_") # 其他语言 $"Intro/Content/水平排版".visible = not is_zh $"Intro/Content/竖直排版".visible = is_zh func _notification(what: int) -> void: if what == NOTIFICATION_TRANSLATION_CHANGED: _setup_display_on_locale() func intro_start(): _setup_display_on_locale() SceneManager.lock_player() await animation_finished SceneManager.unlock_player() $"../DeployLayer/床".enabled = true await Util.wait(1) show_interact_help() set_data("intro_played", true) func play_intro_dialogue(): # 直接使用 sfx,防止下方字幕与全屏文字重复 $intro_audio_player.play() func _on_ground_ready() -> void: ArchiveManager.set_chapter_if_greater(1) ambush = $"../DeployLayer/ambush鸡毛掸子" frame = $"../DeployLayer/画框" paper = $"../DeployLayer/oneshot纸片" right_door = $"../DeployLayer/portal_right" piano = $"../DeployLayer/钢琴" if data["intro_played"]: $"../DeployLayer/床".enabled = true Util.timer(1.0, show_interact_help) # 画框是否已经正位 data.frame_relocated = ambush.played and ambush.one_shot # 禁用鸡毛掸子 ambush.enabled = false # 画框已经正位时,重制画框状态 if data.frame_relocated: frame.rotation_degrees = 0.0 frame.note_key = "c01_摆正的洋相片" if GlobalConfig.DEBUG: print("重置画框位置") else: # 画框未正位时,首先允许互动相框 frame.read_note.connect(_on_note_read, CONNECT_ONE_SHOT) ambush.triggered.connect(_on_ambush_triggered) # 纸片状态 if data.frame_relocated: # 画框已经正位,纸片已经被拾取 if paper.interacted_times > 0: paper.visible = false paper.enabled = false right_door.holding = false else: # 画框已经正位,纸片未被拾取,直接掉落 paper.visible = true paper.enabled = true paper.interacted.connect(_on_paper_interacted, CONNECT_ONE_SHOT) else: # 画框未正位,纸片未掉落 paper.visible = false paper.enabled = false paper.interacted.connect(_on_paper_interacted, CONNECT_ONE_SHOT) piano.interacted.connect(_on_piano_interacted) # play intro if not data.get("intro_played"): play("intro") func cant_read(): DialogueManager.show_dialogue_balloon(dialogue_c01, "c01_s05_院长房间_看不清了") func _on_note_read(): frame.enabled = false # 稍加延时后显示鸡毛掸子 Util.timer(1.0, func(): ambush.enabled = true) func _on_ambush_triggered(): ambush.enabled = false frame.note_key = "c01_摆正的洋相片" Util.timer(5.5, func(): frame.enabled = true) # 鸡毛掸子 4.5s,再等待 1.5s 后掉落纸片 Util.timer(6.0, _play_paper_animation) func lock_on_use_stick(): SceneManager.lock_player(4.0) SceneManager.get_player().walk_to_x(261.0) func _play_paper_animation(): # 播放纸片动画 paper.enabled = true play("纸片飘落") func _on_paper_interacted(): paper.visible = false paper.enabled = false SceneManager.enable_prop_item("prop_信碎片1") right_door.holding = false await SceneManager.get_inspector().quit_and_hidden $"捡起纸片后开门声".play() SceneManager.pop_center_notification("ui_center_notify_right_click_prop") # 钢琴音效,每次按下播放不同音符 # 最长间隔时间 var piano_time_epsilon := 2.0 var piano_last_played_time := 0.0 var piano_id := 0 var piano_streams = [ preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_01.ogg"), preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_02.ogg"), preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_03.ogg"), preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_04.ogg"), preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_05.ogg"), preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_06.ogg"), preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_07.ogg"), preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_08.ogg"), preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_09.ogg"), preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_10.ogg"), preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_11.ogg"), preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_12.ogg"), preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_13.ogg"), ] func _on_piano_interacted(): # 钢琴音符最大编号 var piano_id_max := piano_streams.size() # 播放音符 var now = Time.get_ticks_msec() if now - piano_last_played_time < piano_time_epsilon * 1000: piano_id = wrapi(piano_id + 1, 0, piano_id_max) else: piano_id = 0 piano_last_played_time = now var player = $piano_player player.stream = piano_streams[piano_id] player.play() SceneManager.pop_debug_dialog_info("音效", "钢琴声: " + str(piano_id)) func show_interact_help(): SceneManager.pop_center_notification("ui_center_notify_press_e_to_interact")