364 lines
13 KiB
GDScript
364 lines
13 KiB
GDScript
@tool
|
||
extends AnimationRoot
|
||
|
||
var gate: Interactable2D
|
||
|
||
|
||
# 覆盖该方法
|
||
func _default_data() -> Dictionary:
|
||
return {}
|
||
|
||
|
||
func _ready() -> void:
|
||
super._ready()
|
||
if Engine.is_editor_hint():
|
||
return
|
||
|
||
|
||
var eavesdrop_window: AnimatedSprite2D
|
||
var madman_npc: Npc2D
|
||
var small_shoe: Pickable2D
|
||
var bully_layer
|
||
var burning_layer
|
||
var counter
|
||
var fg
|
||
|
||
|
||
func _on_ground_ready() -> void:
|
||
fg = $"../ParallaxForeground/FGParallaxLayer/FGSprite2D"
|
||
gate = $"../DeployLayer/Interactable铁门" as Interactable2D
|
||
if gate.interacted_times > 0:
|
||
gate.get_node("Wall/CollisionShape2D").disabled = true
|
||
else:
|
||
gate.interact_mismatch_failed.connect(_on_gate_failed)
|
||
gate.interacted.connect(_on_gate_interacted)
|
||
|
||
eavesdrop_window = $"../DeployLayer/李氏赖子房间人影"
|
||
if ArchiveManager.get_global_value(&"c02_eavesdrop_finished"):
|
||
$"../DeployLayer/Ambush偷听对话".enabled = false
|
||
eavesdrop_window.visible = false
|
||
|
||
$"../DeployLayer/Closeup敲门游戏".exit.connect(_on_knock_exit)
|
||
|
||
counter = $"../DeployLayer/Interactable柜子" as Interactable2D
|
||
counter.interacted.connect(_on_counter_interacted)
|
||
if ArchiveManager.get_global_value(&"c02_counter_pushed_out"):
|
||
counter.get_node("../Note柜子可放置区域").enabled = false
|
||
counter.visible = true
|
||
if not ArchiveManager.get_global_value(&"c02_burning"):
|
||
# 点燃前
|
||
counter.enabled = true
|
||
elif EventManager.get_stage(&"c02_burning_end_stage") == 2:
|
||
# 离开后
|
||
counter.visible = false
|
||
|
||
var new_bg = $"../DeployLayer/火灾背景"
|
||
# 点燃后~离开前
|
||
if (
|
||
ArchiveManager.get_global_value(&"c02_burning")
|
||
and EventManager.get_stage(&"c02_burning_end_stage") < 2
|
||
):
|
||
new_bg.modulate.a = 1.0
|
||
# 火灾开始后,无需 enable
|
||
counter.get_node("点燃").modulate.a = 1.0
|
||
$VibeSfx氛围.switch_to("c02_火灾")
|
||
$"../DirectionalLight2D".energy = 0
|
||
|
||
madman_npc = $"../DeployLayer/Npc井边疯子"
|
||
madman_npc.visible = false
|
||
# c02_madman_hitwall 之后, c02_ball_game_stage==3(游戏结束) 之前;同时 eavesdrop_finished
|
||
if EventManager.get_stage(&"c02_ball_game_stage") < 3:
|
||
# and ArchiveManager.get_global_value(&"c02_eavesdrop_finished")
|
||
if not ArchiveManager.get_global_value("c02_watched_the_well"):
|
||
$"../DeployLayer/Closeup井".exit.connect(func(_arg): madman_npc.visible = true)
|
||
else:
|
||
madman_npc.visible = true
|
||
(
|
||
madman_npc
|
||
. talk_finished
|
||
. connect(
|
||
func(): ArchiveManager.unlock_memory(2)
|
||
# 2 号为井边记忆
|
||
)
|
||
)
|
||
|
||
if ArchiveManager.get_global_value(&"c02_show_grounded_coins"):
|
||
# 奠字 + 纸钱
|
||
$"../DeployLayer/新背景_奠".visible = true
|
||
|
||
small_shoe = $"../DeployLayer/Pickable小鞋子" as Pickable2D
|
||
|
||
# 1: 已交互疯子; 2:小鞋已掉落
|
||
if EventManager.get_stage("c02_madman_interacted_stage") == 1:
|
||
SceneManager.lock_player(0)
|
||
# 等待转场
|
||
await Util.wait(1)
|
||
small_shoe.enabled = true
|
||
var y2 = small_shoe.position.y
|
||
var y1 = y2 - 150
|
||
small_shoe.position.y = y1
|
||
var drop_duration = 1.0
|
||
var tween = create_tween()
|
||
# 实现重力加速度效果的 y 移动,在 drop_duration 中移动到 final_y
|
||
tween.tween_method(drop_shoe.bind(y1, y2), 0.0, 1.0, drop_duration)
|
||
await tween.finished
|
||
# 落地音效
|
||
$"Sfx小鞋落地".play()
|
||
SceneManager.pop_os_with_str("c02_s03_掉鞋子")
|
||
SceneManager.get_player().set_facing_direction(Vector2.LEFT)
|
||
tween = create_tween()
|
||
tween.tween_property(fg, "modulate:a", 0.0, 1.5)
|
||
await tween.finished
|
||
play("镜头上下运动")
|
||
$"../BGSprite2D/无头小蝶".play()
|
||
$"../CameraFocusMarker".limit_top -= 1000
|
||
SceneManager.pop_debug_dialog_info("美术", "小鞋子掉落")
|
||
elif EventManager.get_stage("c02_madman_interacted_stage") == 2:
|
||
small_shoe.enabled = true
|
||
|
||
bully_layer = $"../DeployLayer/霸凌"
|
||
burning_layer = $"../DeployLayer/火灾"
|
||
if EventManager.get_stage(&"c02_ball_game_stage") >= 3 and EventManager.get_chapter_stage() < 3:
|
||
_setup_bully_or_burning(true)
|
||
|
||
|
||
func drop_shoe(progress: float, y1: float, y2: float):
|
||
var t = ease(progress, 4.0)
|
||
small_shoe.position.y = lerp(y1, y2, t)
|
||
|
||
|
||
func cg_end() -> void:
|
||
# SceneManager.enable_prop_item("prop_小鞋子2")
|
||
EventManager.set_stage("c02_madman_interacted_stage", 2)
|
||
#$"../CameraFocusMarker".limit_top += 1000
|
||
create_tween().tween_property(fg, "modulate:a", 1.0, 1.5)
|
||
SceneManager.unlock_player()
|
||
|
||
|
||
func _on_gate_failed() -> void:
|
||
EventManager.set_stage_if_greater(&"handnote_c02_gate_chain", 1)
|
||
if not ArchiveManager.get_global_value(&"c02_open_gate_first_failed"):
|
||
ArchiveManager.set_global_entry(&"c02_open_gate_first_failed", true)
|
||
SceneManager.pop_os_with_str("c02_s03_铁门")
|
||
|
||
|
||
func _on_gate_interacted() -> void:
|
||
$"Sfx打开铁门后".play()
|
||
gate.get_node("Wall/CollisionShape2D").disabled = true
|
||
EventManager.set_stage_if_greater(&"handnote_c02_gate_chain", 2)
|
||
EventManager.set_stage_if_greater(&"handnote_c02_map_1Right", 1)
|
||
|
||
|
||
func _on_knock_exit(arg):
|
||
if arg:
|
||
await create_tween().tween_interval(1.0).finished
|
||
SceneManager.pop_os_with_str("c02_敲门_肉掉落")
|
||
|
||
|
||
func shocking_lighting() -> void:
|
||
var root = $"../DeployLayer/闷雷_纸人闪现" as Node2D
|
||
var normal_ppl = root.get_node("排队常人") as Sprite2D
|
||
var paper_ppl = root.get_node("排队纸人") as Sprite2D
|
||
var light = root.get_node("PointLight2D") as PointLight2D
|
||
root.visible = true
|
||
normal_ppl.modulate.a = 0
|
||
paper_ppl.modulate.a = 0
|
||
light.energy = 0
|
||
var sfx = $"Sfx闷雷"
|
||
var tween = create_tween()
|
||
tween.tween_property(light, "energy", 7.0, 0.1)
|
||
tween.tween_property(light, "energy", 4.0, 0.02)
|
||
tween.parallel().tween_property(normal_ppl, "modulate:a", 1.0, 0.03)
|
||
tween.tween_property(light, "energy", 8.0, 0.01)
|
||
tween.tween_callback($"../DeployLayer/新背景_奠".show)
|
||
tween.tween_property(light, "energy", 3.0, 0.02)
|
||
tween.tween_property(light, "energy", 7.0, 0.01)
|
||
tween.parallel().tween_property(paper_ppl, "modulate:a", 1.0, 0.03)
|
||
tween.tween_property(light, "energy", 0.0, 0.1)
|
||
tween.tween_callback(root.hide)
|
||
# 纸人闪现 惊悚闪电 闷雷声缓缓而来
|
||
tween.tween_interval(2.0)
|
||
tween.tween_callback(sfx.play)
|
||
ArchiveManager.set_global_entry("c02_show_grounded_coins", true)
|
||
|
||
|
||
func eavesdrop() -> void:
|
||
$"../DeployLayer/Ambush偷听对话".enabled = false
|
||
# 12 c00_吕萍_蹲下 13 c00_吕萍_蹲下呼吸 14 c00_吕萍_起立
|
||
await SceneManager.lock_player(0, 12)
|
||
SceneManager.player_action(13)
|
||
# 对话
|
||
DialogueManager.show_dialogue_balloon(dialogue_c02, "c02_04_李氏癞子")
|
||
await DialogueManager.dialogue_ended
|
||
eavesdrop_window.visible = false
|
||
await Util.wait(1)
|
||
SceneManager.player_action(14, true)
|
||
ArchiveManager.set_global_entry(&"c02_eavesdrop_finished", true)
|
||
await Util.wait(1.5)
|
||
await SceneManager.pop_os_with_str("c02_偷听李癞对话后")
|
||
EventManager.set_stage_if_greater(&"handnote_c02_meat_knockDoor", 1)
|
||
# 1 号为偷听对话
|
||
ArchiveManager.unlock_memory(1)
|
||
SceneManager.unlock_player()
|
||
|
||
|
||
func _setup_bully_or_burning(reenter_scene := false):
|
||
# 弹珠游戏结束后就开始霸凌,此时禁止偷听。第一章结束后(火灾结束),第二章再偷听
|
||
$"../DeployLayer/Ambush偷听对话".enabled = false
|
||
eavesdrop_window.visible = false
|
||
if EventManager.get_stage(&"c02_burning_end_stage") == 2:
|
||
# 火灾演出完全结束
|
||
burning_layer.visible = false
|
||
bully_layer.visible = false
|
||
bully_layer.get_node("Ambush点火游戏阻挡右移").enabled = false
|
||
bully_layer.get_node("wall/CollisionShape2D").disabled = true
|
||
elif not ArchiveManager.get_global_value(&"c02_burning"):
|
||
bully_layer.get_node("Ambush点火游戏阻挡右移").enabled = true
|
||
bully_layer.get_node("wall/CollisionShape2D").disabled = false
|
||
burning_layer.visible = false
|
||
bully_layer.visible = true
|
||
# 霸凌童谣直接播放
|
||
$"../DeployLayer/霸凌/f1/Sfx2D霸凌童谣".play()
|
||
if not ArchiveManager.get_global_value(&"c02_ready_to_fire"):
|
||
bully_layer.get_node("Ambush霸凌").enabled = true
|
||
else:
|
||
GlobalFunctor.c02_fire_count_down_try_start()
|
||
else:
|
||
bully_layer.visible = false
|
||
burning_layer.visible = true
|
||
$VibeSfx氛围.switch_to("c02_火灾")
|
||
$"../DeployLayer/霸凌/f1/Sfx2D霸凌童谣".easing_kill()
|
||
bully_layer.get_node("Ambush点火游戏阻挡右移").enabled = false
|
||
bully_layer.get_node("wall/CollisionShape2D").disabled = true
|
||
burning_layer.get_node("Ambush等待的小蝉").enabled = true
|
||
burning_layer.get_node("Ambush等待的小蝉/SignSnapper").arrived.connect(
|
||
run_away, CONNECT_ONE_SHOT
|
||
)
|
||
if not reenter_scene:
|
||
burning_layer.get_node("Pro小孩喊着火啦3").play()
|
||
burning_layer.get_node("Pro小孩喊着火啦2").play()
|
||
DialogueManager.show_dialogue_balloon(
|
||
dialogue_c02, "c02_男孩们喊着火啦", [GlobalConfig.DIALOG_IGNORE_INPUT]
|
||
)
|
||
else:
|
||
burning_layer.get_node("Pro小孩喊着火啦3").queue_free()
|
||
burning_layer.get_node("Pro小孩喊着火啦2").queue_free()
|
||
|
||
|
||
func bully_ambush():
|
||
$"../DeployLayer/霸凌/Ambush霸凌".enabled = false
|
||
SceneManager.lock_player()
|
||
play("bully")
|
||
DialogueManager.show_dialogue_balloon(
|
||
dialogue_c02, "c02_尾声霸凌童谣", [GlobalConfig.DIALOG_IGNORE_INPUT]
|
||
)
|
||
var sdf2d = $"../DeployLayer/霸凌/f1/Sfx2D霸凌童谣" as Sfx2D
|
||
sdf2d.volume_db += 5
|
||
sdf2d.play()
|
||
sdf2d.finished.connect(func(): sdf2d.volume_db -= 5, CONNECT_ONE_SHOT)
|
||
await animation_finished
|
||
|
||
|
||
func bully_end():
|
||
SceneManager.unlock_player()
|
||
# #TODO 小猫玩具微亮
|
||
# SceneManager.pop_debug_dialog_info("美术", "手中小猫玩具微亮")
|
||
SceneManager.pop_os_with_str("c02_霸凌救小蝉开始")
|
||
# 准备好点火
|
||
ArchiveManager.set_global_entry(&"c02_ready_to_fire", true)
|
||
GlobalFunctor.c02_fire_count_down_try_start()
|
||
|
||
|
||
func block_right_move():
|
||
SceneManager.pop_os_with_str("c02_点火前阻止右移")
|
||
|
||
|
||
# var count_down_tween:Tween
|
||
|
||
# func count_down():
|
||
# if count_down_tween:
|
||
# count_down_tween.kill()
|
||
# count_down_tween = create_tween()
|
||
# count_down_tween.tween_interval(60)
|
||
|
||
|
||
func _on_counter_interacted():
|
||
# if not ArchiveManager.get_global_value(&"c02_eavesdrop_finished"):
|
||
# SceneManager.pop_os_with_str("c02_点火前偷听对话")
|
||
# return
|
||
if not ArchiveManager.get_global_value(&"c02_ready_to_fire"):
|
||
SceneManager.pop_os_with_str("c02_火灾等待准备")
|
||
return
|
||
SceneManager.lock_player()
|
||
counter.enabled = false
|
||
counter.get_node("../Note柜子可放置区域").enabled = false
|
||
if not ArchiveManager.get_global_value(&"c02_burning"):
|
||
GlobalFunctor.c02_fire_count_down_stop()
|
||
# 6: 低位点火
|
||
SceneManager.player_action(6)
|
||
ArchiveManager.set_global_entry(&"c02_burning", true)
|
||
var new_bg = $"../DeployLayer/火灾背景"
|
||
var light = $"../DirectionalLight2D"
|
||
# var moon_light = $"../AmbientLayer/PointLight2D"
|
||
var tween = create_tween()
|
||
tween.tween_interval(1.5)
|
||
# 火灾后的背景覆盖上来
|
||
tween.tween_property(new_bg, "modulate:a", 1.0, 2.0)
|
||
tween.parallel().tween_property(light, "energy", 0.0, 2.0)
|
||
# tween.parallel().tween_property(moon_light, "energy", 0.0, 2.0)
|
||
var flame_sprite = counter.get_node("点燃")
|
||
tween.parallel().tween_property(flame_sprite, "modulate:a", 1.0, 2.0)
|
||
await tween.finished
|
||
_setup_bully_or_burning()
|
||
burning_layer.get_node("区域1").recheck()
|
||
burning_layer.get_node("地面1").recheck()
|
||
# 直接进入自动牵手
|
||
_walk_to_xchan_and_run_away()
|
||
SceneManager.unlock_player()
|
||
|
||
|
||
func _walk_to_xchan_and_run_away() -> void:
|
||
SceneManager.lock_player()
|
||
# 从走向小蝉就开始放
|
||
$"Sfx牵手演出氛围音".global_play()
|
||
var player = SceneManager.get_player() as MainPlayer
|
||
var tween = player.walk_to_x(2128.0)
|
||
tween.tween_interval(1.0)
|
||
await tween.finished
|
||
run_away()
|
||
SceneManager.unlock_player()
|
||
|
||
|
||
func run_away():
|
||
SceneManager.lock_player()
|
||
SceneManager.pop_debug_dialog_info("美术", "牵手跑开")
|
||
var player = SceneManager.get_player() as MainPlayer
|
||
# 整体修改
|
||
player.visible = false
|
||
var ambush_xiaochan = burning_layer.get_node("Ambush等待的小蝉")
|
||
ambush_xiaochan.enabled = false
|
||
var node = burning_layer.get_node("牵手跑") as Node2D
|
||
var sprite_together = node.get_node("牵手跑动画") as AnimatedSprite2D
|
||
node.visible = true
|
||
var camera = SceneManager.get_camera_marker()
|
||
camera.focus_node(sprite_together)
|
||
create_tween().tween_property(camera, "force_offset:x", -200.0, 10.0)
|
||
player.reparent_light(sprite_together)
|
||
# 牵手动作
|
||
var sprite_xiaochan = burning_layer.get_node("Ambush等待的小蝉/小婵呼吸")
|
||
sprite_together.play("吕萍牵手动作")
|
||
sprite_xiaochan.play("小婵牵手动作")
|
||
await sprite_together.animation_finished
|
||
sprite_xiaochan.visible = false
|
||
sprite_together.play("一起牵手跑步")
|
||
node.get_node("Sfx2D跑步").play()
|
||
# 一起跑
|
||
var tween = create_tween()
|
||
tween.tween_property(node, "global_position:x", 20.0, 18.0)
|
||
await tween.finished
|
||
# 1: 牵手跑结束; 2: 谢幕演出结束
|
||
EventManager.set_stage(&"c02_burning_end_stage", 1)
|
||
camera.force_offset.x = 0.0
|
||
SceneManager.unlock_player()
|
||
SceneManager.get_ground_loader().transition_to_scene("c02_s06", "right")
|