xiandie/scene/ground/script/c02/小手讨东西.gd

170 lines
5.4 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@tool
extends Sprite2D
@export var accept_tin_coin := false
@export var accept_ball_or_plier := false
@export var enabled := true:
set(val):
enabled = val
if is_node_ready():
sign_mark.enabled = val
@export var unmatched_sign_texture: Texture2D
@export var matched_sign_texture: Texture2D
@onready var sfx_invalid = $SfxInvalid as Sfx
@onready var sfx_success = $SfxSuccess as Sfx
@onready var sign_mark = %Sign as Sign
@onready var area2d = %Area2D as Area2D
@onready var animated_sprite = $ as AnimatedSprite2D
var ground_archive: GroundArchive
static var item_config_res = preload("res://asset/dialogue/item_description.dialogue")
# 当前小手手持的 prop
var holding_prop = ""
var coin
func _ready() -> void:
if Engine.is_editor_hint():
return
area2d.body_entered.connect(_reset)
area2d.body_exited.connect(_on_cancel)
sign_mark.interacted.connect(_on_interacted)
sign_mark.cancel.connect(_on_cancel)
sign_mark.base_scale = sign_mark.scale
sign_mark.enabled = enabled
# setup default value
ground_archive = ArchiveManager.archive.ground_archive()
sign_mark.enabled = enabled
coin = get_node("Ambush地上的元宝") as Ambush2D
coin.triggered.connect(_on_coin_interacted)
func _reset(_body = null) -> void:
_reset_sign_testure_to_prop()
var prop_hud = SceneManager.get_prop_hud() as PropHud
if not prop_hud.current_item_changed.is_connected(_set_sign_texture_to_prop):
prop_hud.current_item_changed.connect(_set_sign_texture_to_prop)
func _reset_sign_testure_to_prop():
var key = SceneManager.get_current_prop(false)
_set_sign_texture_to_prop(key)
# 根据当前 prop调整 sign 所显示的 texture
func _set_sign_texture_to_prop(key):
var interactable = false
if holding_prop != "":
# 手持物品时,允许交互,获得物品
interactable = true
if key == "prop_锡箔元宝":
interactable = true
elif accept_ball_or_plier and key == "prop_老虎钳":
interactable = ArchiveManager.get_global_value("pliers_to_ball", false)
elif accept_ball_or_plier and key == "prop_弹珠":
interactable = not ArchiveManager.get_global_value("pliers_to_ball", false)
if interactable:
sign_mark.sprite2d.texture = matched_sign_texture
else:
sign_mark.sprite2d.texture = unmatched_sign_texture
func _on_cancel(_body = null) -> void:
# disconnect signal
var prop_hud = SceneManager.get_prop_hud() as PropHud
if prop_hud and prop_hud.current_item_changed.is_connected(_set_sign_texture_to_prop):
prop_hud.current_item_changed.disconnect(_set_sign_texture_to_prop)
var interact_mutex = Mutex.new()
func _on_interacted() -> void:
if not interact_mutex.try_lock():
return
if holding_prop != "":
# 手持物品时,交互直接给玩家物品
SceneManager.enable_prop_item(holding_prop)
holding_prop = ""
animated_sprite.play("小手_idle")
interact_mutex.unlock()
return
var key = SceneManager.get_current_prop(false)
var interacted_success = false
SceneManager.freeze_player(0)
# accept_tin_coin
if key == "prop_锡箔元宝":
interacted_success = true
SceneManager.disable_prop_item("prop_锡箔元宝")
if accept_tin_coin:
# 叠成纸杯电话
animated_sprite.play("小手_锡箔_hide")
# TODO
SceneManager.pop_debug_dialog_info("美术", "叠成纸杯: 小手_锡箔_hide + 小手_纸杯_show + 小手_纸杯_idle")
await get_tree().create_timer(1.5).timeout
SceneManager.enable_prop_item("prop_小鞋子1")
ArchiveManager.set_global_entry("c02_mouse_follow_player", true)
# 稍等后显示小老鼠
await get_tree().create_timer(0.5).timeout
SceneManager.pop_debug_dialog_info("美术", "触发⼩⽼⿏跟在玩家身后")
var node = get_node("../自动跟随的老鼠") as Node2D
if node:
node.visible = true
else:
printerr("小手已接受锡箔;自动跟随的老鼠节点不存在")
else:
# 丢下元宝
animated_sprite.play("小手_锡箔_drop")
# TODO
SceneManager.pop_debug_dialog_info("美术", "丢下元宝: 小手_锡箔_drop + 小手_idle + 落地后的锡箔贴图")
await get_tree().create_timer(1.5).timeout
coin.visible = true
coin.enabled = true
# 是否允许老虎钳换弹珠
var pliers_to_ball = ArchiveManager.get_global_value("pliers_to_ball", false)
if accept_ball_or_plier and key == "prop_老虎钳" and pliers_to_ball:
interacted_success = true
SceneManager.disable_prop_item("prop_老虎钳")
animated_sprite.play("小手_老虎钳_hide")
# TODO
SceneManager.pop_debug_dialog_info("美术", "小手_老虎钳_hide + 小手_弹珠_show + 小手_弹珠_idle")
await get_tree().create_timer(1.5).timeout
holding_prop = "prop_弹珠"
elif accept_ball_or_plier and key == "prop_弹珠" and not pliers_to_ball:
interacted_success = true
SceneManager.disable_prop_item("prop_弹珠")
animated_sprite.play("小手_弹珠_hide")
# TODO
SceneManager.pop_debug_dialog_info("美术", "小手_弹珠_hide + 小手_老虎钳_show + 小手_老虎钳_idle")
await get_tree().create_timer(1.5).timeout
holding_prop = "prop_老虎钳"
if interacted_success:
# sfx_success.play()
EventManager.prop_interacted(name, key, 1)
_reset_sign_testure_to_prop()
else:
sfx_invalid.play()
sign_mark.invalid_shake()
# SceneManager.on_toggle_invalid_prop()
SceneManager.release_player()
interact_mutex.unlock()
func _on_coin_interacted() -> void:
SceneManager.enable_prop_item("prop_锡箔元宝")
coin.visible = false
coin.enabled = false