67 lines
1.8 KiB
GDScript
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)
|