149 lines
4.5 KiB
GDScript
149 lines
4.5 KiB
GDScript
extends AbstractLevel
|
|
|
|
|
|
const CUTSCENE_CAMERA_TIME = 5
|
|
const CUTSCENE_HAZE_TIME = 0.1
|
|
|
|
const CUTSCENE_HAZE_TIME_BY_PHASE : Dictionary[int, float] = {
|
|
1: CUTSCENE_HAZE_TIME,
|
|
3: CUTSCENE_HAZE_TIME,
|
|
5: CUTSCENE_HAZE_TIME,
|
|
7: CUTSCENE_HAZE_TIME,
|
|
}
|
|
|
|
|
|
var _cutscene_phase := 0
|
|
var _player_walk_speed : int
|
|
var _cutscene_player_speed_factor := 0.5
|
|
|
|
var _function_by_phase : Dictionary[int, Callable] = {
|
|
1: _do_cutscene_phase_one,
|
|
4: _do_cutscene_phase_four,
|
|
6: _do_cutscene_phase_six,
|
|
7: _do_cutscene_phase_seven,
|
|
}
|
|
|
|
|
|
@onready var cutscene_camera : Camera2D = $Cutscene/Camera2D
|
|
@onready var cutscene_haze : Polygon2D = $%CutsceneHaze
|
|
@onready var cutscene_thanks : Label = $CanvasLayer/MarginContainer/ThanksLabel
|
|
|
|
@onready var cutscene_haze_timer : Timer = $Cutscene/HazeTimer
|
|
@onready var cutscene_player_timer : Timer = $Cutscene/PlayerTimer
|
|
@onready var cutscene_enemy_timer : Timer = $Cutscene/EnemyTimer
|
|
@onready var cutscene_end_timer : Timer = $Cutscene/EndTimer
|
|
|
|
@onready var cutscene_fake_player : AnimatedSprite2D = $Cutscene/FakePlayer
|
|
@onready var cutscene_fake_enemy : AnimatedSprite2D = $Cutscene/FakeEnemy
|
|
|
|
@onready var enemy_waves_by_phase : Dictionary[int, Node2D] = {
|
|
3: $Cutscene/EnemyWaves/WaveOne,
|
|
5: $Cutscene/EnemyWaves/WaveTwo,
|
|
7: $Cutscene/EnemyWaves/WaveThree,
|
|
}
|
|
|
|
@onready var cutscene_room_center : Vector2 = $Cutscene/RoomCenter.position
|
|
@onready var PLAYER_TARGET_POSITION_BY_PHASE : Dictionary[int, Vector2] = {
|
|
1: $Cutscene/PlayerTargetPositions/PhaseOne.global_position,
|
|
2: $Cutscene/PlayerTargetPositions/PhaseTwo.global_position,
|
|
3: $Cutscene/PlayerTargetPositions/PhaseThree.global_position,
|
|
4: $Cutscene/PlayerTargetPositions/PhaseFour.global_position,
|
|
5: $Cutscene/PlayerTargetPositions/PhaseFive.global_position,
|
|
6: $Cutscene/FakeEnemy.global_position,
|
|
}
|
|
|
|
|
|
func _ready() -> void:
|
|
super._ready()
|
|
_player_walk_speed = player.max_speed
|
|
cutscene_haze.hide()
|
|
cutscene_fake_player.hide()
|
|
cutscene_fake_enemy.hide()
|
|
cutscene_thanks.hide()
|
|
for phase in enemy_waves_by_phase:
|
|
enemy_waves_by_phase[phase].hide()
|
|
|
|
|
|
func _show_cutscene_haze(time: float) -> void:
|
|
SoundManager.play_sfx_stream(SoundManager.sfx_stream_haze, cutscene_room_center)
|
|
cutscene_haze.show()
|
|
cutscene_haze_timer.start(time)
|
|
|
|
|
|
func _next_cutscene_phase() -> void:
|
|
_cutscene_phase += 1
|
|
|
|
if _function_by_phase.has(_cutscene_phase):
|
|
_function_by_phase[_cutscene_phase].call()
|
|
|
|
if CUTSCENE_HAZE_TIME_BY_PHASE.has(_cutscene_phase):
|
|
_show_cutscene_haze(CUTSCENE_HAZE_TIME_BY_PHASE[_cutscene_phase])
|
|
|
|
if enemy_waves_by_phase.has(_cutscene_phase):
|
|
enemy_waves_by_phase[_cutscene_phase].show()
|
|
|
|
if PLAYER_TARGET_POSITION_BY_PHASE.has(_cutscene_phase):
|
|
var target_pos := PLAYER_TARGET_POSITION_BY_PHASE[_cutscene_phase]
|
|
var time := _get_player_move_time(cutscene_fake_player.position, target_pos)
|
|
var tween : Tween = create_tween()
|
|
tween.tween_property(cutscene_fake_player, "position", target_pos, time)
|
|
tween.finished.connect(_next_cutscene_phase)
|
|
|
|
|
|
func _do_cutscene_phase_one() -> void:
|
|
player.queue_free()
|
|
cutscene_camera.position = player.position
|
|
cutscene_camera.enabled = true
|
|
cutscene_camera.make_current()
|
|
cutscene_fake_player.show()
|
|
cutscene_fake_player.play(Player.ANIMATION_WALK_RIGHT, _cutscene_player_speed_factor)
|
|
var tween : Tween = create_tween()
|
|
tween.set_ease(Tween.EASE_IN_OUT)
|
|
tween.set_trans(Tween.TRANS_QUAD)
|
|
tween.tween_property(cutscene_camera, "position", cutscene_room_center, CUTSCENE_CAMERA_TIME)
|
|
|
|
|
|
func _do_cutscene_phase_four() -> void:
|
|
cutscene_fake_player.play(Player.ANIMATION_WALK_LEFT,_cutscene_player_speed_factor)
|
|
|
|
|
|
func _do_cutscene_phase_six() -> void:
|
|
_cutscene_player_speed_factor = 0.25
|
|
cutscene_fake_player.play(Player.ANIMATION_WALK_RIGHT, _cutscene_player_speed_factor)
|
|
|
|
|
|
func _do_cutscene_phase_seven() -> void:
|
|
cutscene_fake_player.play("look_around", 0.5)
|
|
cutscene_player_timer.start()
|
|
|
|
|
|
func _get_player_move_time(initial_pos: Vector2, target_pos: Vector2) -> float:
|
|
var distance := initial_pos.distance_to(target_pos)
|
|
return distance / (_player_walk_speed * _cutscene_player_speed_factor)
|
|
|
|
|
|
func _on_level_end_entered(body: Node2D) -> void:
|
|
if body is Player:
|
|
_next_cutscene_phase()
|
|
|
|
|
|
func _on_haze_timer_timeout() -> void:
|
|
cutscene_haze.hide()
|
|
|
|
|
|
func _on_player_timer_timeout() -> void:
|
|
_show_cutscene_haze(CUTSCENE_HAZE_TIME)
|
|
cutscene_fake_player.queue_free()
|
|
cutscene_fake_enemy.show()
|
|
cutscene_fake_enemy.play("look_around", 0.5)
|
|
cutscene_enemy_timer.start()
|
|
|
|
|
|
func _on_enemy_timer_timeout() -> void:
|
|
cutscene_thanks.show()
|
|
cutscene_end_timer.start()
|
|
|
|
|
|
func _on_end_timer_timeout() -> void:
|
|
_complete_level(cutscene_room_center)
|