234 lines
7.4 KiB
GDScript
234 lines
7.4 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 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
|