2025-07-09 16:11:39 +00:00
|
|
|
|
extends CanvasLayer
|
|
|
|
|
|
2025-07-14 10:25:15 +00:00
|
|
|
|
@warning_ignore("unused_signal")
|
2025-07-09 16:11:39 +00:00
|
|
|
|
signal exit(arg)
|
|
|
|
|
|
2025-07-22 11:59:08 +00:00
|
|
|
|
@onready var slot_bowl: Marker2D = %DropSlotBowl
|
|
|
|
|
@onready var drawers: Array[HoverLightClickArea] = [
|
|
|
|
|
%Drawer1, %Drawer2, %Drawer3, %Drawer4, %Drawer5, %Drawer6
|
|
|
|
|
]
|
|
|
|
|
@onready var draggables: Array[DraggableRigid] = [
|
|
|
|
|
%DraggableRigid1,
|
|
|
|
|
%DraggableRigid2,
|
|
|
|
|
%DraggableRigid3,
|
|
|
|
|
%DraggableRigid4,
|
|
|
|
|
%DraggableRigid5,
|
|
|
|
|
%DraggableRigid6
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
@onready var sfx_picked = $SfxPicked as AudioStreamPlayer
|
|
|
|
|
@onready var sfx_invalid_drop = $SfxInvalidDrop as AudioStreamPlayer
|
|
|
|
|
@onready var sfx_dropped = $SfxDropped as AudioStreamPlayer
|
|
|
|
|
@onready var sfx_ready_to_grind = $SfxReadyToGrind as AudioStreamPlayer
|
|
|
|
|
|
|
|
|
|
const correct_ingredients = [0, 4, 6] # 生姜,竹叶,甘蔗
|
|
|
|
|
var picked_ingredients: Array[int] = []
|
|
|
|
|
var holding_ingredient := -1
|
|
|
|
|
var all_picked = false
|
2025-07-09 16:11:39 +00:00
|
|
|
|
|
|
|
|
|
func _ready() -> void:
|
|
|
|
|
layer = GlobalConfig.CANVAS_LAYER_LITTLE_GAME
|
2025-07-22 11:59:08 +00:00
|
|
|
|
for i in 6:
|
|
|
|
|
toggle_draggable_visible(i, false)
|
|
|
|
|
var drawer = drawers[i]
|
|
|
|
|
drawer.interacted.connect(_on_drawer_interacted.bind(i))
|
|
|
|
|
var drag = draggables[i]
|
|
|
|
|
drag.picked.connect(_on_picked.bind(i))
|
|
|
|
|
drag.dropped.connect(_on_dropped.bind(i))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func toggle_draggable_freeze(freezing := true):
|
|
|
|
|
for d in draggables:
|
|
|
|
|
d.freezing = freezing
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func toggle_draggable_visible(id: int, display := true):
|
|
|
|
|
var draggable = draggables[id]
|
|
|
|
|
draggable.visible = display
|
|
|
|
|
draggable.freeze = not display
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var has_notified_put_to_bowl = false
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_drawer_interacted(id: int):
|
|
|
|
|
if picked_ingredients.has(id) or holding_ingredient > 0:
|
|
|
|
|
$SfxPickFailed.play()
|
|
|
|
|
SceneManager.pop_center_notification("ui_center_notify_c03药车不能再取药材")
|
|
|
|
|
else:
|
|
|
|
|
if not has_notified_put_to_bowl:
|
|
|
|
|
SceneManager.pop_center_notification("ui_center_notify_c03碗口放入药材")
|
|
|
|
|
has_notified_put_to_bowl = true
|
|
|
|
|
holding_ingredient = id
|
|
|
|
|
toggle_draggable_visible(id, true)
|
|
|
|
|
draggables[id].force_hold()
|
|
|
|
|
sfx_picked.play()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_picked(_node: DraggableRigid, id: int):
|
|
|
|
|
$SfxPicked.play()
|
|
|
|
|
if holding_ingredient > 0 and holding_ingredient != id:
|
|
|
|
|
printerr("DraggableRigid _on_picked: holding_ingredient=", holding_ingredient, " but picked id=", id)
|
|
|
|
|
picked_ingredients.erase(id)
|
|
|
|
|
holding_ingredient = id
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_dropped(node: DraggableRigid, id: int):
|
|
|
|
|
var dropping_position = node.global_position
|
|
|
|
|
var dropped = false
|
|
|
|
|
if dropping_position.x < 210:
|
|
|
|
|
dropped = true
|
|
|
|
|
picked_ingredients.append(id)
|
|
|
|
|
else:
|
|
|
|
|
# 判断是否对应到 slots 在 limit_squared 范围内
|
|
|
|
|
var drawer = drawers[id]
|
|
|
|
|
if drawer.is_focused():
|
|
|
|
|
holding_ingredient = -1
|
|
|
|
|
dropped = true
|
|
|
|
|
node.update_position(drawer.global_position)
|
|
|
|
|
toggle_draggable_visible(id, false)
|
|
|
|
|
else:
|
|
|
|
|
for d in drawers:
|
|
|
|
|
if d.is_focused():
|
|
|
|
|
d.invalid_blink()
|
|
|
|
|
if dropped:
|
|
|
|
|
holding_ingredient = -1
|
|
|
|
|
# If all items are placed
|
|
|
|
|
all_picked = picked_ingredients.size() == correct_ingredients.size()
|
|
|
|
|
# 检查配方
|
|
|
|
|
for ingredient in correct_ingredients:
|
|
|
|
|
if not ingredient in picked_ingredients:
|
|
|
|
|
all_picked = false
|
|
|
|
|
break
|
|
|
|
|
# 配方 match
|
|
|
|
|
if all_picked:
|
|
|
|
|
print(picked_ingredients)
|
|
|
|
|
# 全部插入,stage 进入下一阶段
|
|
|
|
|
sfx_ready_to_grind.play()
|
|
|
|
|
_setup_on_ready_to_grind()
|
|
|
|
|
else:
|
|
|
|
|
sfx_dropped.play()
|
|
|
|
|
else:
|
|
|
|
|
SceneManager.pop_center_notification("ui_center_notify_c03放到碗中或原处")
|
|
|
|
|
node.invalid_shake()
|
|
|
|
|
node.force_hold()
|
|
|
|
|
sfx_invalid_drop.play()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _setup_on_ready_to_grind() -> void:
|
|
|
|
|
toggle_draggable_freeze(true)
|
|
|
|
|
# 禁用 drawer
|
|
|
|
|
for d in drawers:
|
|
|
|
|
d.freezing = true
|