Files
CultManor/game/levels/level_7.gd
T
2026-01-11 16:56:37 +03:00

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)