xiandie/scene/ground/scene/c02/s06_animation.gd
2025-06-05 15:17:51 +08:00

121 lines
3.9 KiB
GDScript

@tool
extends AnimationRoot
# 覆盖该方法
func _default_data() -> Dictionary:
return {}
func _ready() -> void:
super._ready()
if Engine.is_editor_hint():
return
var mice_hole: Interactable2D
var ball_game_boys_ambush: Ambush2D
var closeup_ball
func _on_ground_ready() -> void:
if ArchiveManager.get_global_value("c02_burning") and not ArchiveManager.get_global_value("c02_burning_end"):
# 第一章火灾结束,尾声演出
_c02_final_show.call_deferred()
else:
# 否则,隐藏 c02_final 层
$"../DeployLayer/c02_final".visible = false
mice_hole = $"../DeployLayer/Interactable老鼠洞"
mice_hole.interacted.connect(_on_mice_hole_interacted)
closeup_ball = $"../DeployLayer/Closeup弹珠游戏" as Closeup2D
ball_game_boys_ambush = $"../DeployLayer/Ambush三男孩"
# 0:默认 1:寻找弹珠(老虎钳可以换弹珠) 2:给出弹珠 3:游戏结束
if (
ArchiveManager.get_global_value("c02_the_blind_room_entered", false)
and ArchiveManager.get_global_value("c02_ball_game_stage", 0) < 3
):
# 进入瞎子卧室后,可开始弹珠游戏
ball_game_boys_ambush.enabled = true
ball_game_boys_ambush.visible = true
func _on_mice_hole_interacted():
mice_hole.enabled = false
SceneManager.freeze_player(0)
var animated_sprite = $"../DeployLayer/小老鼠拖鞋子" as AnimatedSprite2D
animated_sprite.visible = true
animated_sprite.frame = 8
animated_sprite.play()
await animated_sprite.animation_finished
animated_sprite.visible = false
mice_hole.enabled = true
if mice_hole.interacted_times >= 2:
# 触发疯子撞墙,疯子在一楼内侧过道中消失
ArchiveManager.set_global_entry("c02_madman_hitwall", true)
ArchiveManager.set_global_entry("c02_s02_mouse_push_shoe1", true)
# 老鼠散开并不再跟随
ArchiveManager.set_global_entry("c02_mouse_follow_player", false)
$"../DeployLayer/自动跟随的老鼠".flush_right_and_disable()
SceneManager.pop_debug_dialog_info("美术", "疯子从左侧过来撞墙")
var sprite = $"../DeployLayer/疯子撞墙"
sprite.visible = true
sprite.play("疯子撞墙")
await get_tree().create_timer(5.0).timeout
SceneManager.release_player()
func boys_ball_game() -> void:
# 0:默认 1:寻找弹珠(老虎钳可以换弹珠) 2:给出弹珠 3:游戏结束
var stage = ArchiveManager.get_global_value("c02_ball_game_stage", 0)
if stage == 0:
ArchiveManager.set_global_entry("c02_ball_game_stage", 1)
ArchiveManager.set_global_entry("c02_pliers_to_ball", true)
SceneManager.freeze_player(0)
DialogueManager.show_dialogue_balloon(dialogue_c02, "c02_s05_三男孩弹珠游戏1")
await DialogueManager.dialogue_ended
SceneManager.release_player()
elif stage == 1 or stage == 2:
SceneManager.freeze_player(0)
if stage == 1 and SceneManager.get_current_prop(false) != "prop_弹珠":
var hud = SceneManager.get_prop_hud() as PropHud
hud.on_toggle_invalid_prop()
DialogueManager.show_dialogue_balloon(dialogue_c02, "c02_s05_三男孩弹珠游戏2")
await DialogueManager.dialogue_ended
else:
# 进入弹珠游戏
closeup_ball.exit.connect(_on_ball_game_exit)
closeup_ball.display()
# closeup_ball.enabled = false
SceneManager.release_player()
func _on_ball_game_exit(success = null):
# closeup_ball.enabled = false
if success:
ball_game_boys_ambush.enabled = false
ball_game_boys_ambush.visible = false
# 第一章火灾结束,尾声演出
func _c02_final_show():
var player = SceneManager.get_player()
player.set_facing_direction(Vector2(-1, 0))
SceneManager.freeze_player(0)
play("c02_final_show")
# WARN: 如果不延时,开场直接显示 dialog 可能会显示失败(无报错提示)
await get_tree().create_timer(0.1).timeout
player.global_position.x = 650
DialogueManager.show_dialogue_balloon(dialogue_c02, "c02_s11_谢幕交谈")
func _c02_final_show_end():
SceneManager.release_player()
ArchiveManager.set_global_entry("c02_burning_end", true)