xiandie/scene/ground/scene/c01/s05_animation.gd
2025-04-20 21:35:13 +08:00

166 lines
5.4 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@tool
extends AnimationRoot
var ambush: Ambush2D
var frame: Note2D
var paper: Interactable2D
var right_door: Portal2D
var piano: Interactable2D
var bed_reading: AnimatedSprite2D
# 覆盖该方法
func _default_data() -> Dictionary:
return {
"frame_relocated": false
}
func _ready() -> void:
super._ready()
oneshot_animation_finished.connect(show_interact_help)
func play_intro_dialogue():
# 播放开场对话
# DialogueManager.show_dialogue_balloon(dialogue_c01, "c01_s05_院长房间_开场")
# 直接使用 sfx防止下方字幕与全屏文字重复
$intro_audio_player.play()
SceneManager.pop_debug_dialog_info("音效", "开场念诵声等")
func _on_ground_ready() -> void:
ambush = $"../DeployLayer/ambush鸡毛掸子"
frame = $"../DeployLayer/画框"
paper = $"../DeployLayer/oneshot纸片"
right_door = $"../DeployLayer/portal_right"
piano = $"../DeployLayer/钢琴"
bed_reading = $"../DeployLayer/小小蝶看书"
bed_reading.frame_changed.connect(_on_bed_reading_frame_changed)
# 画框是否已经正位
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)
$"环境音".finished.connect($"环境音".play)
var intro_dialog_played = false
func _on_bed_reading_frame_changed():
if bed_reading.animation == "c01_小小蝶_床上看书":
if bed_reading.frame == 5 and not intro_dialog_played:
intro_dialog_played = true
DialogueManager.show_dialogue_balloon(dialogue_c01, "c01_s05_院长房间_开场")
elif bed_reading.frame == 10:
# 播放结束0.5s 后释放角色
get_tree().create_timer(0.5).timeout.connect(SceneManager.release_player)
$"../DeployLayer/床".enabled = true
func _on_note_read():
frame.enabled = false
# 稍加延时后显示鸡毛掸子
get_tree().create_timer(4.5).timeout.connect(func(): ambush.enabled = true)
func _on_ambush_triggered():
ambush.enabled = false
frame.note_key = "c01_摆正的洋相片"
get_tree().create_timer(5.5).timeout.connect(func(): frame.enabled = true)
# 鸡毛掸子 4.5s,再等待 3s 后掉落纸片
get_tree().create_timer(8).timeout.connect(_play_paper_animation)
func _play_paper_animation():
# 播放纸片动画
paper.enabled = true
play("纸片飘落")
func _on_paper_interacted():
paper.visible = false
paper.enabled = false
SceneManager.enable_prop_item("prop_信碎片1")
SceneManager.enable_important_item("prop_信碎片1")
right_door.holding = false
# SceneManager.pop_debug_dialog_info("音效", "开门声")
var inspector = SceneManager.get_inspector() as PropInspector
if inspector:
# 显示互动提示
inspector.quit_and_hidden.connect(
SceneManager.pop_center_notification.bind(tr("ui_important_item_update")), CONNECT_ONE_SHOT
)
# 钢琴音效,每次按下播放不同音符
# 最长间隔时间
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.wav"),
preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_02.wav"),
preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_03.wav"),
preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_04.wav"),
preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_05.wav"),
preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_06.wav"),
preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_07.wav"),
preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_08.wav"),
preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_09.wav"),
preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_10.wav"),
preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_11.wav"),
preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_12.wav"),
preload("res://asset/audio/sfx/交互/序章/01_院长房间_钢琴_13.wav"),
]
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(tr("ui_press_e"))