xiandie/scene/ground/scene/c04/s08_三楼III.gd
2025-08-26 20:57:41 +08:00

155 lines
4.9 KiB
GDScript

@tool
extends AnimationRoot
# 覆盖该方法
func _default_data() -> Dictionary:
return {"c04_ghost_trapped_suprised": false}
func _ready() -> void:
super._ready()
if Engine.is_editor_hint():
return
#region node_reference
var interactable家门: Interactable2D
#endregion
# 读取设置变量名
func _setup_node_reference() -> void:
interactable家门 = $"../DeployLayer/Interactable家门"
interactable家门.interacted.connect(_on_door_interacted)
func _on_ground_ready() -> void:
var trap_stage = EventManager.get_stage("c04_ghost_trapped")
if trap_stage == 1:
$"../DeployLayer/鬼打墙两侧纸人".show()
if not data["c04_ghost_trapped_suprised"]:
set_data("c04_ghost_trapped_suprised", true)
Util.timer(1.2, SceneManager.pop_os_with_str.bind("c04_鬼打墙_首次传送"))
elif trap_stage == 2:
# 开始鬼打墙
setup_trap()
func _on_door_interacted() -> void:
SceneManager.lock_player()
# c04_ghost_trapped: 0:初始化 1:第一次开门 2:进入鬼打墙场景 3:鬼打墙结束 4:排队纸人歪头
var trap_stage = EventManager.get_stage("c04_ghost_trapped")
if trap_stage == 0:
SceneManager.unlock_player()
EventManager.set_stage("c04_ghost_trapped", 1)
SceneManager.get_ground_loader().transition_to_scene("c04_s08", "1")
elif trap_stage == 1 or trap_stage == 2:
SceneManager.unlock_player()
EventManager.set_stage("c04_ghost_trapped", 2)
SceneManager.get_ground_loader().transition_to_scene("c04_s08", "1")
elif trap_stage == 3:
SceneManager.unlock_player()
$"Sfx纸人咔嚓转头".play()
EventManager.set_stage("c04_ghost_trapped", 4)
SceneManager.get_ground_loader().transition_to_scene("c04_s05", "left")
elif trap_stage == 4:
SceneManager.unlock_player()
SceneManager.get_ground_loader().transition_to_scene("c04_s05", "left")
var camera_rect
var player_rect
func setup_trap() -> void:
# 设置活动范围
# 190-700
camera_rect = SceneManager.get_camera_marker().default_camera_rect
player_rect = SceneManager.get_player().player_movement_rect
SceneManager.get_camera_marker().apply_limits(Rect2i(190, -158, 510, 316))
SceneManager.get_player().player_movement_rect = Rect2(195, -158, 500, 316)
$"../鬼打墙Layer".show()
$"../DeployLayer".hide()
# os
Util.timer(1.2, SceneManager.pop_os_with_str.bind("c04_鬼打墙_再次开门"))
func ambush_door1() -> void:
$"../鬼打墙Layer/Ambush门1".enabled = false
_show_wall(1)
func ambush_door2() -> void:
$"../鬼打墙Layer/Ambush门2".enabled = false
_show_wall(2)
func ambush_door3() -> void:
$"../鬼打墙Layer/Ambush门3".enabled = false
_show_wall(3)
var wall_count := 0
func _show_wall(id: int) -> void:
wall_count += 1
var wall = get_node("../鬼打墙Layer/砖墙" + str(id))
wall.show()
wall.modulate.a = 0.0
create_tween().tween_property(wall, "modulate:a", 1.0, 1.0)
#TODO
$"Sfx墙体浮现".play()
SceneManager.pop_debug_dialog_info("音效", "墙体浮现音效")
# 烛光抖动
var candle_l = get_node("../鬼打墙Layer/蜡烛光" + str(id))
var candle_r = get_node("../鬼打墙Layer/蜡烛光" + str(id + 1))
var tween = create_tween()
tween.tween_property(candle_l, "energy", 0.2, 0.8)
tween.parallel().tween_property(candle_r, "energy", 0.3, 0.7)
tween.tween_property(candle_l, "energy", 0.6, 0.7)
tween.parallel().tween_property(candle_r, "energy", 0.6, 0.8)
if wall_count == 3:
_game_success()
func _game_success() -> void:
SceneManager.lock_player()
# show
await Util.wait(0.5)
await SceneManager.pop_os_with_str("c04_鬼打墙_全部交互完")
await Util.wait(0.5)
await SceneManager.pop_os_with_str("c04_鬼打墙_捂眼")
await Util.wait(1.0)
var animation_player = $"鬼打墙黑手Effect/AnimationPlayer"
animation_player.play("双手捂屏幕")
# 重置镜头与玩家活动范围
SceneManager.get_player().player_movement_rect = player_rect
var camera = SceneManager.get_camera_marker()
# 镜头锁定玩家(镜头逐渐移动过去) 提高速度保证紧密贴紧边缘
camera.speed = 100.0
var tween = create_tween()
tween.tween_property(camera, "limit_right", camera_rect.size.x + 250.0, 4.0)
await animation_player.animation_finished
await Util.wait(2.0)
$"../DeployLayer".show()
_hide_trap_layer()
await Util.wait(1.5)
animation_player.play("双手离开屏幕")
camera.speed = 2.0
tween = create_tween()
tween.tween_property(camera, "limit_right", camera_rect.size.x, 2.0)
EventManager.set_stage("c04_ghost_trapped", 3)
await Util.wait(1.0)
SceneManager.unlock_player()
func _hide_trap_layer() -> void:
var l = $"../鬼打墙Layer"
var tween = create_tween()
tween.tween_property(l, "modulate:a", 0.0, 1.0)
tween.parallel().tween_property(l.get_node("蜡烛光1"), "energy", 0.0, 1.0)
tween.parallel().tween_property(l.get_node("蜡烛光2"), "energy", 0.0, 1.0)
tween.parallel().tween_property(l.get_node("蜡烛光3"), "energy", 0.0, 1.0)
tween.parallel().tween_property(l.get_node("蜡烛光4"), "energy", 0.0, 1.0)
tween.tween_callback(l.hide)