xiandie/scene/ground/scene/c02/s03_院子.gd

364 lines
13 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
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")