170 lines
5.3 KiB
GDScript
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)
|
|
|
|
|