xiandie/scene/ground/scene/c02/s10_空房间.gd

234 lines
7.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 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 head_cover_closeup: Closeup2D
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_note: Note2D
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_note = $"../DeployLayer/Note进入隧道询问"
# 进过瞎子卧室后,通道关闭
if ArchiveManager.get_global_value(&"c02_entered_the_splitted_space"):
# 遮挡的空房间
$"../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)
$"../DeployLayer/血脚印".frame = 8 if $"../DeployLayer/Ambush首次进入血脚印".played else 0
# 先设置 closeup再设置 xiaochan sprite 与 interactable
head_cover_closeup = $"../DeployLayer/Closeup头套"
if head_cover_closeup.interacted_times > 0:
head_cover_closeup.hide()
head_cover_closeup.enabled = false
xiao_chan_sprite.visible = true
else:
xiao_chan_interactable.enabled = false
xiao_chan_sprite.visible = false
head_cover_closeup.exit.connect(func(_arg):
EventManager.set_stage_if_greater(&"handnote_c02_xchan_giveHerPuppet", 1)
head_cover_closeup.hide()
head_cover_closeup.enabled = false
xiao_chan_interactable.enabled = true
xiao_chan_sprite.visible = true
)
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)
$"Sfx小蝉哼歌".play()
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 = float(ArchiveManager.get_global_value(&"c02_counter_x", default_counter_x))
if counter_x <= 0:
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()
xiao_chan_sprite.modulate.a = 0
SceneManager.pop_debug_dialog_info("美术", "第一次进入房间,蔓延的血脚印")
var sprite = $"../DeployLayer/血脚印" as AnimatedSprite2D
sprite.play()
$"Sfx脚印出现".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)
$"Sfx小蝉出现".play()
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.lock_player()
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 tween.finished
SceneManager.unlock_player()
xiao_chan_sprite.animation_finished.connect(func():
create_tween().tween_property(xiao_chan_sprite, "modulate:a", 0.0, 1.0)
counter.enabled = true
EventManager.set_stage_if_greater(&"handnote_c02_xchan_sheKnowsMe", 2)
EventManager.set_stage_if_greater(&"handnote_c02_xchan_giveHerPuppet", 2)
)
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:
set(value):
if pushing_counter != value:
pushing_counter = value
if GlobalConfig.DEBUG:
print("pushing_counter:", pushing_counter)
var counter_pushed_out = false
var walking = 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
var x = counter.global_position.x - player_pull_offset_x
# 走到左侧,自动 freeze/release
player.walk_to_x(x).tween_callback(func():
walking = false
player.character = "吕萍推柜子"
player.lock_move_right = true
SceneManager.pop_center_notification("ui_center_notify_press_q_to_exit")
)
walking = true
player.position_updated.connect(on_player_moved_counter)
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 _input(event: InputEvent) -> void:
if event.is_action_pressed("cancel") and not walking and pushing_counter:
get_viewport().set_input_as_handled()
_on_counter_interacted()
# 柜子移动后,检查是否展示后面的洞
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_note.enabled = false
catty_head.enabled = false
return
catty_head.enabled = true
# 通道关闭
var entered = ArchiveManager.get_global_value(&"c02_entered_the_splitted_space")
if not entered and catty_head.picked:
portal_note.enabled = true
func _on_pick_catty_head() -> void:
if SceneManager.has_prop("prop_无头小猫玩具"):
print("拼接小猫玩具...")
SceneManager.lock_player()
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_小猫玩具完整")
await SceneManager.get_inspector().quit_and_hidden
await SceneManager.pop_os_with_str("c02_获得小猫玩具")
$"Sfx头痛耳鸣".play()
$"../DizzyShader".dizzy()
SceneManager.player_action(17, true)
await SceneManager.get_player().animation_finished
SceneManager.pop_os_with_str("c02_获得小猫头痛")
SceneManager.unlock_player()
# 进过瞎子卧室后,通道关闭
if not ArchiveManager.get_global_value(&"c02_entered_the_splitted_space"):
portal_note.enabled = true