195 lines
5.9 KiB
GDScript
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
|