xiandie/scene/ground/script/c02/s03_closeup抓药游戏.gd

206 lines
5.9 KiB
GDScript3
Raw Normal View History

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-23 09:07:20 +00:00
@onready var animation_player: AnimationPlayer = %AnimationPlayer
2025-07-22 11:59:08 +00:00
@onready var slot_bowl: Marker2D = %DropSlotBowl
@onready var drawers: Array[HoverLightClickArea] = [
2025-07-23 09:07:20 +00:00
%Drawer1, %Drawer2, %Drawer3, %Drawer4, %Drawer5, %Drawer6, %"Hover蟋蟀", %"Hover粉末"
2025-07-22 11:59:08 +00:00
]
@onready var draggables: Array[DraggableRigid] = [
%DraggableRigid1,
%DraggableRigid2,
%DraggableRigid3,
%DraggableRigid4,
%DraggableRigid5,
2025-07-23 09:07:20 +00:00
%DraggableRigid6,
%DraggableRigid7,
%DraggableRigid8
2025-07-22 11:59:08 +00:00
]
2025-07-23 09:07:20 +00:00
@onready var sfx_picked = $SfxPicked as Sfx
@onready var sfx_invalid_drop = $SfxInvalidDrop as Sfx
@onready var sfx_dropped = $SfxDropped as Sfx
@onready var sfx_ready_to_grind = $SfxReadyToGrind as Sfx
@onready var sfx_ingredients_ready = $SfxIngredientsReady as Sfx
@onready var sfx_toggle_grinder = $SfxToggleGrinder as Sfx
@onready var sfx_grinding = $SfxGrinding as Sfx
@onready var sfx_packing = $SfxPacking as Sfx
@onready var inspect_content = %"InspectContent" as Control
@onready var hover_spec = %"Hover药方" as HoverLightClickArea
@onready var hover_grinder = %"Hover石臼棒" as HoverLightClickArea
@onready var hover_finished_powder = %"Hover完成的药粉" as HoverLightClickArea
const correct_ingredients = [0, 3, 5, 6, 7] # 生姜,竹叶,甘蔗, 蟋蟀, 粉末
2025-07-22 11:59:08 +00:00
var picked_ingredients: Array[int] = []
var holding_ingredient := -1
var all_picked = false
2025-07-09 16:11:39 +00:00
2025-07-23 09:07:20 +00:00
2025-07-09 16:11:39 +00:00
func _ready() -> void:
layer = GlobalConfig.CANVAS_LAYER_LITTLE_GAME
2025-07-23 09:07:20 +00:00
for i in drawers.size():
2025-07-22 11:59:08 +00:00
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))
2025-07-23 09:07:20 +00:00
hover_spec.interacted.connect(_on_spec_interacted)
if not SceneManager.has_prop("prop_剪下的辫子"):
_freezing_drawers()
SceneManager.pop_center_notification("ui_center_notify_c03药车缺少物品")
func _on_spec_interacted() -> void:
hover_spec.hide()
inspect_content.show()
2025-07-22 11:59:08 +00:00
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()
2025-07-23 09:07:20 +00:00
drawers[id].invalid_blink()
2025-07-22 11:59:08 +00:00
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:
2025-07-23 09:07:20 +00:00
printerr(
"DraggableRigid _on_picked: holding_ingredient=",
holding_ingredient,
" but picked id=",
id
)
2025-07-22 11:59:08 +00:00
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)
2025-07-23 09:07:20 +00:00
if GlobalConfig.DEBUG:
print("picked_ingredients updated:", picked_ingredients)
2025-07-22 11:59:08 +00:00
else:
# 判断是否对应到 slots 在 limit_squared 范围内
var drawer = drawers[id]
if drawer.is_focused():
holding_ingredient = -1
dropped = true
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 进入下一阶段
2025-07-23 09:07:20 +00:00
sfx_ingredients_ready.play()
2025-07-22 11:59:08 +00:00
_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()
2025-07-23 09:07:20 +00:00
func _freezing_drawers() -> void:
2025-07-22 11:59:08 +00:00
# 禁用 drawer
for d in drawers:
d.freezing = true
2025-07-23 09:07:20 +00:00
func _setup_on_ready_to_grind() -> void:
toggle_draggable_freeze(true)
_freezing_drawers()
_process_grinding()
var p = get_parent() as Closeup2D
if p:
p.hold_cancel_before_exit()
func _process_grinding() -> void:
hover_spec.freezing = true
hover_spec.show()
inspect_content.hide()
SceneManager.pop_center_notification("ui_center_notify_c03准备研磨")
sfx_ready_to_grind.play()
hover_grinder.freezing = false
await hover_grinder.interacted
hover_grinder.freezing = true
animation_player.play("intro_grinding")
sfx_toggle_grinder.play()
await animation_player.animation_finished
hover_finished_powder.freezing = false
hover_finished_powder.interacted.connect(_on_finished_powder_interacted, CONNECT_ONE_SHOT)
func _on_finished_powder_interacted() -> void:
var packing_paper = $"洞中药纸"
sfx_packing.play()
var tween = create_tween()
tween.tween_property(packing_paper, "modulate:a", 0.0, 1.0)
tween = create_tween()
tween.tween_interval(0.5)
tween.tween_property(hover_finished_powder, "modulate:a", 0.0, 0.5)
tween.tween_callback(SceneManager.enable_prop_item.bind("prop_药包"))
tween.tween_callback(exit.emit.bind(true))
func ingredients_fading_out() -> void:
var tween = create_tween()
tween.tween_interval(0.01)
for i in drawers.size():
tween.parallel().tween_property(draggables[i], "modulate:a", 0.0, 3.0)
for i in drawers.size():
tween.tween_callback(draggables[i].queue_free)
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("cancel") and inspect_content.visible:
get_viewport().set_input_as_handled()
hover_spec.show()
inspect_content.hide()