xiandie/scene/ground/script/c02/敲门游戏.gd
2025-06-20 20:36:08 +08:00

79 lines
2.3 KiB
GDScript

extends CanvasLayer
signal exit(success: bool)
@onready var knock_wrong_sfx = $KnockWrong as AudioStreamPlayer
@onready var knock_light_sfx = $KnockLight as AudioStreamPlayer
@onready var knock_heavy_sfx = $KnockHeavy as AudioStreamPlayer
@onready var drop_meat_sfx = $DropMeat as AudioStreamPlayer
@onready var button = $TextureButton as TextureButton
var dialogue = preload("res://asset/dialogue/c02.dialogue")
var fail_time = 0.0
func _ready() -> void:
layer = GlobalConfig.CANVAS_LAYER_LITTLE_GAME
button.pressed.connect(_on_button_pressed)
fail_time = Time.get_ticks_msec()
button.disabled = true
DialogueManager.show_dialogue_balloon(dialogue, "c02_s03_敲门游戏intro")
await DialogueManager.dialogue_ended
if (
# 未偷听,或已敲门成功,则禁用
not ArchiveManager.get_global_value("c02_eavesdrop_finished", false)
or ArchiveManager.get_global_value("c02_meat_dropping", false)
or ArchiveManager.get_global_value("c02_meat_given", false)
):
button.disabled = true
else:
button.disabled = false
var current_id = 0
var knock_time := 0.0
func _on_button_pressed() -> void:
current_id += 1
var last_knock_time = knock_time
knock_time = Time.get_ticks_msec()
var diff = knock_time - last_knock_time
# 敲门游戏节奏: 三快(<0.8s)三慢(>1s & <5s)
if current_id == 1:
knock_light_sfx.play()
elif current_id > 1 and current_id <= 3:
if diff > 800:
failed()
return
knock_light_sfx.play()
elif current_id > 3:
if diff < 1000 or diff > 7000:
failed()
return
knock_heavy_sfx.play()
if current_id == 6:
drop_meat_sfx.play()
ArchiveManager.set_global_entry("c02_meat_dropping", true)
button.disabled = true
# 肉落下的声音,然后自动退出界面
SceneManager.pop_debug_dialog_info("音效", "肉落下的声音(敲门游戏成功)")
await get_tree().create_timer(2.0).timeout
exit.emit(true)
else:
SceneManager.pop_debug_dialog_info("音效", "敲门:" + str(current_id))
func failed():
current_id = 0
knock_wrong_sfx.play()
var current_time = Time.get_ticks_msec()
if current_time - fail_time < 5000:
return
fail_time = current_time
button.disabled = true
DialogueManager.show_dialogue_balloon(dialogue, "c02_s03_敲门游戏fail")
await DialogueManager.dialogue_ended
button.disabled = false