xiandie/scene/ground/scene/c03/s12_胖子游戏3.gd
2025-08-11 22:06:18 +08:00

170 lines
5.3 KiB
GDScript

@tool
extends AnimationRoot
# 覆盖该方法
func _default_data() -> Dictionary:
return {"has_entered": false}
func _ready() -> void:
super._ready()
if Engine.is_editor_hint():
return
#region node_reference
var collapse_sprite: AnimatedSprite2D
var ambush_collapse: Ambush2D
var final_meat_ambush: Ambush2D
var final_meat_sprite: AnimatedSprite2D
var final_label
#endregion
# 读取设置变量名
func _setup_node_reference() -> void:
collapse_sprite = $"../ParallaxBackground2/山前地后/小孩山塌了"
final_meat_ambush = $"../DeployLayer/Ambush最终吃肉"
final_meat_sprite = $"../DeployLayer/Ambush最终吃肉/Pro吃肉"
final_label = $"../CanvasLayer/最终吃肉"
ambush_collapse = $"../DeployLayer/Ambush小孩山塌了"
func _on_ground_ready() -> void:
# 设置相机范围
var player = SceneManager.get_player()
var right_x = player.player_movement_rect.size.x
var rect := Rect2i(0, -158, int(right_x) + 320, 316)
SceneManager.get_camera_marker().apply_limits(rect)
# 玩家不能超过 ambush_collapse 位置
player.global_position.x = min(player.global_position.x, ambush_collapse.global_position.x)
# 处理 Ambush肉1 节点
for i in range(1, 4):
var node = get_node("../DeployLayer/Ambush肉" + str(i)) as Ambush2D
if node.played:
node.hide()
_disable_wall_on_meat(node)
else:
node.triggered.connect(_on_eat_meat_triggered.bind(node))
if not data["has_entered"]:
var x = $"../DeployLayer/portal_left".global_position.x
SceneManager.get_player().global_position.x = x
SceneManager.get_player().set_facing_direction(Vector2.RIGHT)
SceneManager.lock_player(0, 9, true)
set_data("has_entered", true)
await SceneManager.pause_and_hide_player_sprite(1.0)
await SceneManager.get_player().animation_finished
SceneManager.unlock_player()
func _disable_wall_on_meat(meat_node) -> void:
meat_node.get_node("StaticBody2D/CollisionShape2D").disabled = true
func _on_eat_meat_triggered(node) -> void:
_disable_wall_on_meat(node)
_tween_display_label(node)
var player = SceneManager.get_player()
SceneManager.lock_player(0, 8)
var tween = create_tween()
tween.tween_interval(0.9)
tween.tween_property(node, "self_modulate:a", 0.0, 1.0)
await player.animation_finished
SceneManager.unlock_player()
func _tween_display_label(node) -> void:
var label = node.get_node("Label")
label.modulate.a = 0.0
label.show()
var tween = create_tween()
tween.tween_property(label, "modulate:a", 1.0, 0.5)
tween.tween_interval(5.0)
tween.tween_property(label, "modulate:a", 0.0, 0.5)
func label_ambush1() -> void:
var ambush = $"../DeployLayer/AmbushLabel1"
_tween_display_label(ambush)
func label_ambush2() -> void:
var ambush = $"../DeployLayer/AmbushLabel2"
_tween_display_label(ambush)
func label_ambush3() -> void:
var ambush = $"../DeployLayer/AmbushLabel3"
_tween_display_label(ambush)
func eat_meat() -> void:
$"Sfx小蝉哼歌".play()
final_label.show()
final_label.modulate.a = 0.0
final_meat_ambush.enabled = false
var light_pivot = $"../DeployLayer/Ambush最终吃肉/LightPivot"
SceneManager.lock_player()
var x = final_meat_sprite.global_position.x
await SceneManager.get_player().walk_to_x(x).finished
var tween = create_tween()
tween.tween_interval(1.0)
tween.tween_property(final_label, "modulate:a", 1.0, 2.5)
# 第一帧没有瘦子,后面才有
var player = SceneManager.get_player() as MainPlayer
player.reparent_light(light_pivot)
play("eat_meat")
await animation_finished
# 将 final_label 放置到 transition_layer
SceneManager.transition_with_layer(final_label, 2.0, 4.0)
await Util.wait(5.0)
# c03_meat_grinder: 0:初始化 1:已装转盘 2:胖子游戏结束 3:绞肉机演出 4:演出结束
EventManager.set_stage_if_greater("c03_meat_grinder", 2)
SceneManager.unlock_player()
SceneManager.get_ground_loader().transition_to_scene("c03_s07", "2")
func collapse() -> void:
var player = SceneManager.get_player()
ambush_collapse.enabled = false
# 交互之后,启用 final_meat_ambush
final_meat_ambush.enabled = true
SceneManager.lock_player()
var label = $"../DeployLayer/都一样"
label.modulate.a = 0.0
label.show()
var camera := SceneManager.get_camera_marker() as CameraFocusMarker
var default_limit_rect := camera.default_camera_rect
var limit_rect := camera.default_camera_rect
limit_rect.position.y -= 100
limit_rect.size.y += 100
camera.apply_limits(limit_rect)
if GlobalConfig.DEBUG:
print("camera limit_rect:", limit_rect)
var tween
create_tween().tween_property(label, "modulate:a", 1.0, 2.0)
await Util.wait(1.0)
Util.timer(1.0, camera.tween_zoom.bind(1.05, 2.0))
camera.set_force_offset_to_target()
var target_offset = ambush_collapse.get_node("CameraPivot").global_position - player.global_position
tween = create_tween()
tween.tween_property(camera, "force_offset", target_offset, 3.0)
tween.tween_interval(1.0)
await tween.finished
collapse_sprite.play()
$"Sfx山塌了".play()
#TODO
SceneManager.pop_debug_dialog_info("音效", "山塌了")
await Util.wait(1.5)
camera.shake_camera()
tween = create_tween()
tween.tween_interval(3.0)
tween.tween_callback(camera.tween_zoom.bind(1.0, 1.5))
tween.tween_property(camera, "force_offset", Vector2.ZERO, 2.0)
await tween.finished
SceneManager.unlock_player()
camera.apply_limits(default_limit_rect)
create_tween().tween_property(label, "modulate:a", 0.0, 1.0)