xiandie/scene/ground/script/c02/敲门游戏.gd

79 lines
2.3 KiB
GDScript3
Raw Normal View History

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