136 lines
3.8 KiB
GDScript
136 lines
3.8 KiB
GDScript
@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_院长房间_开场")
|
||
|
||
|
||
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.enabled = true
|
||
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)
|
||
|
||
func _on_bed_reading_frame_changed():
|
||
if bed_reading.animation == "c01_小小蝶_床上看书" and bed_reading.frame == 10:
|
||
# 播放结束,0.5s 后释放角色
|
||
get_tree().create_timer(0.5).timeout.connect(SceneManager.release_player)
|
||
|
||
|
||
func _on_note_read():
|
||
frame.enabled = false
|
||
# 稍加延时后显示鸡毛掸子
|
||
get_tree().create_timer(1.0).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")
|
||
right_door.enabled = true
|
||
SceneManager.pop_debug_dialog_info("音效", "开门声")
|
||
$"../sfx_door_open".play()
|
||
var inspector = SceneManager.get_inspector() as PropInspector
|
||
if inspector:
|
||
# 显示互动提示
|
||
inspector.quit_and_hidden.connect(
|
||
SceneManager.pop_center_notification.bind(tr("ui_press_b")), CONNECT_ONE_SHOT
|
||
)
|
||
|
||
|
||
# 钢琴音效,每次按下播放不同音符
|
||
# 最长间隔时间
|
||
var piano_time_epsilon := 2.0
|
||
# 钢琴音符最大编号
|
||
var piano_id_max := 10
|
||
var piano_last_played_time := 0.0
|
||
var piano_id := 0
|
||
|
||
|
||
func _on_piano_interacted():
|
||
# 播放音符
|
||
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
|
||
SceneManager.pop_debug_dialog_info("音效", "钢琴声: " + str(piano_id))
|
||
|
||
|
||
func show_interact_help():
|
||
pass
|
||
# 暂时无需使用背包系统
|
||
# SceneManager.pop_center_notification(tr("ui_press_e"))
|