@tool extends AnimationRoot # 覆盖该方法 func _default_data() -> Dictionary: return {} var shelf_game_scene = preload("res://scene/little_game/书架/书架.tscn") var shelf_game_node = shelf_game_scene.instantiate() var envelope_game_scene = preload("res://scene/little_game/拼凑信件.tscn") var envelope_game_node = envelope_game_scene.instantiate() func _ready() -> void: super._ready() if Engine.is_editor_hint(): return shelf_game_node.exiting.connect(_on_shelf_game_exiting) shelf_game_node.success.connect(_on_shelf_game_success) envelope_game_node.exiting.connect(_on_envelope_game_exiting) envelope_game_node.success.connect(_on_envelope_game_success) var counter: Interactable2D var envolope_table: Interactable2D var ladder: Ambush2D var coin: Ambush2D var mask: ColorRect var left_protal: Portal2D var shelf_game_success = false var envelope_game_success = false var manager var mice func _on_ground_ready() -> void: ladder = $"../DeployLayer/Ambush梯子" envolope_table = $"../DeployLayer/Interactable信件书桌" mask = $"../DeployLayer/Mask" left_protal = $"../DeployLayer/portal_left" as Portal2D counter = $"../DeployLayer/Interactable报纸柜台" coin = $"../DeployLayer/Ambush银元" mice = $"../DeployLayer/自动跟随的老鼠" manager = $"../DeployLayer/老板" # 首先放报纸,触发动画,领取任务 if counter.interacted_times > 0: ladder.enabled = true envolope_table.enabled = true else: counter.interacted.connect(assign_tasks, CONNECT_ONE_SHOT) ladder.enabled = false envolope_table.enabled = false envelope_game_success = ArchiveManager.archive.get_global_value("envelope_game_success") if envelope_game_success: envolope_table.enabled = false else: if envolope_table.interacted_times >= 2: # 两封信都放后,无需接受 envolope_table.prop_key = "" envolope_table.prop_key2 = "" envolope_table.interacted.connect(_on_envolope_table_interacted) # 书架工作 shelf_game_success = ArchiveManager.archive.get_global_value("shelf_game_success") if shelf_game_success: _setup_weird_bookstore() else: mice.visible = false _check_portal() func _check_portal(): if not shelf_game_success or not envelope_game_success: left_protal.holding = true left_protal.holding_reason_key = "c01_s08_书店工作" elif not coin.played: left_protal.holding = true left_protal.holding_reason_key = "c01_s08_书店工钱" else: left_protal.holding = false func _on_envolope_table_interacted() -> void: if envolope_table.interacted_times >= 2: # 两封信都放后,无需接受 envolope_table.prop_key = "" envolope_table.prop_key2 = "" play_envelope_game() func first_enter_door() -> void: await get_tree().create_timer(2.).timeout SceneManager.freeze_player(0) DialogueManager.show_dialogue_balloon(dialogue_c01, "c01_s08_书店进门老板台词") DialogueManager.dialogue_ended.connect(_on_dialogue_ended, CONNECT_ONE_SHOT) func _on_dialogue_ended(_res) -> void: SceneManager.release_player() func assign_tasks() -> void: # 放报纸动作 SceneManager.freeze_player(0, 8, false) await get_tree().create_timer(4.5).timeout $"放报纸音效".play() DialogueManager.show_dialogue_balloon(dialogue_c01, "c01_s08_书店老板任务") DialogueManager.dialogue_ended.connect(_on_dialogue_ended, CONNECT_ONE_SHOT) ladder.enabled = true envolope_table.enabled = true func _exit_tree() -> void: if is_instance_valid(shelf_game_node): shelf_game_node.queue_free() func play_shelf_game() -> void: if shelf_game_node.get_parent() != get_parent(): get_parent().add_child(shelf_game_node) SceneManager.freeze_player(0) func _on_shelf_game_exiting() -> void: if GlobalConfig.DEBUG: print("书架游戏 exiting") create_tween().tween_property(mask, "color:a", 0.0, 1.0).from(1.0) SceneManager.release_player() var fall_off func _on_shelf_game_success() -> void: ArchiveManager.archive.set_global_entry("shelf_game_success", true) shelf_game_success = true _setup_weird_bookstore() var player = SceneManager.get_player() as MainPlayer player.visible = false # 设置朝左,与书架的动画结尾一致 player.set_facing_direction(Vector2(-1, 0)) # 对齐位置 player.global_position.x = 437 # 相机抖动 SceneManager.get_camera_marker().shake_camera() # 播放小蝶从书架跌倒的动画 fall_off = $"../DeployLayer/小小蝶坠落" fall_off.visible = true fall_off.play() fall_off.animation_finished.connect(_on_fall_off_finished) $"摔倒音效".play() _check_portal() func _on_fall_off_finished() -> void: fall_off.visible = false # 最后释放玩家 SceneManager.release_player() SceneManager.get_player().visible = true await get_tree().create_timer(1.2).timeout SceneManager.pop_os_with_str("c01_s08_书架游戏完成") func _setup_weird_bookstore() -> void: # 切换背景音效 # $"写字声".stop() $"环境音".stop() $"诡异环境音".play() coin.enabled = true ladder.enabled = false manager.visible = false mice.visible = true $"../DirectionalLight2D".energy = 0.7 $"../BGSprite2D".texture = preload("res://asset/art/scene/c01/s08_书店/夜晚版/bg_书店夜晚.png") $"../ParallaxForeground/FGParallaxLayer/FGSprite2D".texture = preload("res://asset/art/scene/c01/s08_书店/夜晚版/fg_书店夜晚前景.png") ladder.texture = preload("res://asset/art/scene/c01/s08_书店/夜晚版/e_梯子 夜晚.png") func play_envelope_game() -> void: if envelope_game_node.get_parent() != get_parent(): get_parent().add_child(envelope_game_node) SceneManager.freeze_player(0) func _on_envelope_game_exiting() -> void: if GlobalConfig.DEBUG: print("信封游戏 exiting") create_tween().tween_property(mask, "color:a", 0.0, 1.0).from(1.0) SceneManager.release_player() func _on_envelope_game_success() -> void: SceneManager.release_player() envolope_table.enabled = false create_tween().tween_property(mask, "color:a", 0.0, 1.0).from(1.0) ArchiveManager.archive.set_global_entry("envelope_game_success", true) envelope_game_success = true _check_portal() func pay_off_wage() -> void: SceneManager.enable_prop_item("prop_银元") SceneManager.enable_important_item("prop_银元") SceneManager.get_inspector().quit_and_hidden.connect( _on_quit_inspect_coin, CONNECT_ONE_SHOT ) _check_portal() func _on_quit_inspect_coin() -> void: SceneManager.pop_os_with_str("c01_s08_获得袁大头后")