xiandie/scene/ground/scene/c02/s10_animation.gd
2025-06-18 21:02:36 +08:00

195 lines
5.9 KiB
GDScript

@tool
extends AnimationRoot
# 覆盖该方法
func _default_data() -> Dictionary:
return {
"display_wood_puppet": false,
}
func _ready() -> void:
super._ready()
if Engine.is_editor_hint():
return
const default_counter_x := 364.0
# 玩家推柜子时,距 counter 中间的相对 x
# player x=315.0 counter x=364.0
const player_pull_offset_x := 49.0
var xiao_chan_sprite: AnimatedSprite2D
var xiao_chan_interactable: Interactable2D
var counter: Interactable2D
var wood_puppet: Pickable2D
var catty_head: Pickable2D
var door: Portal2D
var portal: Portal2D
func _on_ground_ready() -> void:
xiao_chan_sprite = $"../DeployLayer/大头小蝉"
xiao_chan_interactable = $"../DeployLayer/Interactable小蝉"
counter = $"../DeployLayer/Interactable柜子"
wood_puppet = $"../DeployLayer/Pickable木头人偶"
catty_head = $"../DeployLayer/Pickable小猫玩具脑袋"
door = $"../DeployLayer/portal_left"
portal = $"../DeployLayer/portal_1"
# 进过瞎子卧室后,通道关闭
if ArchiveManager.get_global_value("c02_the_blind_room_unlocked"):
# 遮挡的空房间
$"../BGSprite2D".texture = preload("uid://ba57knu57jp3u")
door.before_pre_transport_wait.connect(_on_leave_room)
wood_puppet.enabled = data["display_wood_puppet"]
wood_puppet.triggered.connect(_on_pick_wood_puppet)
catty_head.triggered.connect(_on_pick_catty_head)
if not $"../DeployLayer/Ambush首次进入血脚印".played:
xiao_chan_sprite.modulate.a = 0
$"../DeployLayer/血脚印".frame = 0
else:
$"../DeployLayer/血脚印".frame = 8
if xiao_chan_interactable.interacted_times > 0:
xiao_chan_sprite.visible = false
counter.enabled = true
else:
xiao_chan_interactable.interacted.connect(_on_xiao_chan_interacted)
counter_pushed_out = ArchiveManager.get_global_value("c02_counter_pushed_out")
if counter_pushed_out:
counter.visible = false
counter.enabled = false
else:
# 空柜子 x 坐标
var counter_x = ArchiveManager.get_global_value("c02_counter_x", default_counter_x)
counter.interacted.connect(_on_counter_interacted)
counter.global_position.x = counter_x
after_counter_moved()
func first_enter_ambush():
SceneManager.freeze_player(0)
xiao_chan_sprite.modulate.a = 0
SceneManager.pop_debug_dialog_info("美术", "第一次进入房间,蔓延的血脚印")
var sprite = $"../DeployLayer/血脚印" as AnimatedSprite2D
sprite.play()
await sprite.animation_finished
var gaslight = $"../DeployLayer/煤油灯" as Gaslight
gaslight.turn_on(false)
var tween = create_tween()
tween.tween_interval(1.5)
tween.tween_property(xiao_chan_sprite, "modulate:a", 1.0, 1.0)
tween.tween_callback(SceneManager.release_player)
func _on_xiao_chan_interacted() -> void:
set_data("display_wood_puppet", true)
wood_puppet.enabled = true
wood_puppet.modulate.a = 0
# 小蝉丢下木头人偶并消失
SceneManager.freeze_player(0)
xiao_chan_sprite.play()
var tween = create_tween()
tween.tween_interval(1.0)
tween.tween_property(wood_puppet, "modulate:a", 1.0, 1.0)
await xiao_chan_sprite.animation_finished
tween = create_tween()
tween.tween_property(xiao_chan_sprite, "modulate:a", 0.0, 1.0)
counter.enabled = true
SceneManager.release_player()
func _on_pick_wood_puppet() -> void:
set_data("display_wood_puppet", false)
func _on_leave_room():
if pushing_counter:
counter_pushed_out = true
ArchiveManager.set_global_entry("c02_counter_pushed_out", true)
SceneManager.pop_debug_dialog_info("美术", "玩家将箱子推出房间")
var pushing_counter = false
var counter_pushed_out = false
func _on_counter_interacted():
var player = SceneManager.get_player() as MainPlayer
if pushing_counter:
# unconnect signal
player.position_updated.disconnect(on_player_moved_counter)
player.character = "吕萍"
player.lock_move_right = false
player.player_movement_rect.position.x -= 60
player.player_movement_rect.size.x += 65
else:
player.player_movement_rect.position.x += 60
player.player_movement_rect.size.x -= 65
SceneManager.freeze_player(0)
var x = counter.global_position.x - player_pull_offset_x
# 走到左侧
player.walk_to(Vector2(x, 98.0), 1.0)
await get_tree().create_timer(1.1).timeout
SceneManager.release_player()
player.position_updated.connect(on_player_moved_counter)
player.character = "吕萍推柜子"
player.lock_move_right = true
pushing_counter = !pushing_counter
func on_player_moved_counter(global_pos: Vector2):
var x = global_pos.x + player_pull_offset_x
ArchiveManager.set_global_entry("c02_counter_x", x)
counter.global_position.x = x
after_counter_moved()
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("cancel") and pushing_counter:
_on_counter_interacted()
get_viewport().set_input_as_handled()
# 柜子移动后,检查是否展示后面的洞
func after_counter_moved():
if not counter_pushed_out:
var current_x = counter.global_position.x
# default_counter_x +- 40
var x_diff = current_x - default_counter_x
if x_diff > -40 and x_diff < 40:
portal.enabled = false
catty_head.enabled = false
return
catty_head.enabled = true
# 进过瞎子卧室后,通道关闭
var entered = ArchiveManager.get_global_value("c02_the_blind_room_unlocked", false)
if not entered and catty_head.picked:
portal.enabled = true
func _on_pick_catty_head() -> void:
if SceneManager.has_prop("prop_无头小猫玩具"):
var inspector = SceneManager.get_inspector()
await inspector.quit_and_hidden
# 将小猫头与身子合并
SceneManager.disable_prop_item("prop_小猫玩具的脑袋")
SceneManager.disable_prop_item("prop_无头小猫玩具")
SceneManager.enable_prop_item_silently("prop_小猫玩具完整")
var sprite = $"../DeployLayer/拼接小猫玩具"
sprite.visible = true
sprite.play()
await sprite.animation_finished
sprite.visible = false
SceneManager.enable_prop_item("prop_小猫玩具完整")
# 进过瞎子卧室后,通道关闭
if not ArchiveManager.get_global_value("c02_the_blind_room_unlocked"):
portal.enabled = true