xiandie/scene/ground/script/c03/s08_closeup囚室门锁.gd
2025-07-24 17:28:41 +08:00

67 lines
1.8 KiB
GDScript

extends CanvasLayer
@warning_ignore("unused_signal")
signal exit(arg)
@onready var sfx_picked = $SfxPicked as Sfx
@onready var sfx_dropped = $SfxDropped as Sfx
@onready var sfx_success = $SfxSuccess as Sfx
@onready var draggables: Array[Draggable2D] = [
%"Draggable锁豆1", %"Draggable锁豆2", %"Draggable锁豆3", %"Draggable锁豆4"
]
# draggables 在 dropped 时会 snap 到以下五个高度之一
var snapping_y_list := [139.0, 153.0, 167.0, 182.0, 197.0]
# snapping_y_list: 1,2,3,4,5
# draggables: 2,4,3,5
var correct_answers := [153.0, 182.0, 167.0, 197.0]
func _ready() -> void:
layer = GlobalConfig.CANVAS_LAYER_LITTLE_GAME
for d in draggables:
d.picked.connect(func(_n): sfx_picked.play())
d.dropped.connect(_on_dropped)
func _on_dropped(node: Draggable2D) -> void:
var y = node.global_position.y
# snap to snapping_heights
var closest_y = snapping_y_list[0]
var min_dist = abs(y - closest_y)
for sy in snapping_y_list:
var dist = abs(y - sy)
if dist < min_dist:
min_dist = dist
closest_y = sy
node.global_position.y = closest_y
# 播放音效/检查是否成功
_post_dropped()
func _post_dropped() -> void:
# 锁豆 1-4 对应 correct_answers
if (
draggables[0].global_position.y == correct_answers[0]
and draggables[1].global_position.y == correct_answers[1]
and draggables[2].global_position.y == correct_answers[2]
and draggables[3].global_position.y == correct_answers[3]
):
print("囚室开锁成功")
sfx_success.play()
_open_success()
else:
sfx_dropped.play()
# 打开门锁,更新 event stage
func _open_success() -> void:
var parent = get_parent() as Closeup2D
if parent:
parent.hold_cancel_before_exit()
# freeze all dragables
for d in draggables:
d.freezing = true
await Util.wait(2.0)
EventManager.set_stage_if_greater("c03_prison_lock", 1)
exit.emit(true)