Added level 7

This commit is contained in:
2026-01-11 16:56:16 +03:00
parent b22a62a111
commit 5314aac33a
27 changed files with 1557 additions and 883 deletions
+11 -8
View File
@@ -28,6 +28,16 @@ func _input(event: InputEvent) -> void:
pause_menu.show()
func _complete_level(player_position: Vector2) -> void:
SoundManager.play_sfx_stream(SoundManager.sfx_stream_level_completed, player_position)
get_tree().paused = true
completion_menu.show()
if SaveManager.completed_levels <= LevelManager.current_level_index:
SaveManager.completed_levels = LevelManager.current_level_index + 1
SaveManager.save()
func _on_player_dead() -> void:
get_tree().paused = true
game_over_menu.show()
@@ -35,11 +45,4 @@ func _on_player_dead() -> void:
func _on_level_end_entered(body: Node2D) -> void:
if body is Player:
var player_position := player.global_position
SoundManager.play_sfx_stream(SoundManager.sfx_stream_level_completed, player_position)
get_tree().paused = true
completion_menu.show()
if SaveManager.completed_levels <= LevelManager.current_level_index:
SaveManager.completed_levels = LevelManager.current_level_index + 1
SaveManager.save()
_complete_level(player.global_position)
+3 -3
View File
@@ -4,10 +4,10 @@
[ext_resource type="PackedScene" uid="uid://dtcad8tdx78tg" path="res://game/characters/player.tscn" id="2_r0ht6"]
[ext_resource type="PackedScene" uid="uid://dqu87loahl7wn" path="res://game/tiles/walls.tscn" id="3_3fw0b"]
[ext_resource type="Texture2D" uid="uid://due8mmt5ww1sf" path="res://images/level/walls.png" id="3_fnnmn"]
[ext_resource type="Material" uid="uid://dojhoc6ljpt1a" path="res://game/materials/gray_walls.tres" id="3_pi5fd"]
[ext_resource type="Material" uid="uid://d2o2o1w8kb51g" path="res://game/materials/white_walls.tres" id="5_6b8cu"]
[ext_resource type="Material" uid="uid://dojhoc6ljpt1a" path="res://game/materials/walls_gray.tres" id="3_pi5fd"]
[ext_resource type="Material" uid="uid://d2o2o1w8kb51g" path="res://game/materials/walls_white.tres" id="5_6b8cu"]
[ext_resource type="PackedScene" uid="uid://nfgx201cn4ti" path="res://game/tiles/traps.tscn" id="5_b7vts"]
[ext_resource type="Material" uid="uid://bhksbugqhxxa0" path="res://game/materials/black_walls.tres" id="6_x8k35"]
[ext_resource type="Material" uid="uid://bhksbugqhxxa0" path="res://game/materials/walls_black.tres" id="6_x8k35"]
[ext_resource type="PackedScene" uid="uid://dsts4y32slhnc" path="res://game/menu/pause_menu.tscn" id="7_l0xih"]
[ext_resource type="PackedScene" uid="uid://84lhc3yn8vub" path="res://game/menu/game_over_menu.tscn" id="8_b7vts"]
[ext_resource type="PackedScene" uid="uid://bareycqj42c6e" path="res://game/menu/completion_menu.tscn" id="11_3fw0b"]
+1 -1
View File
@@ -3,7 +3,7 @@
[ext_resource type="PackedScene" uid="uid://mpsu4g2b5h3a" path="res://game/levels/abstract_level.tscn" id="1_15okj"]
[ext_resource type="PackedScene" uid="uid://cojxqx5al7kyv" path="res://game/doors/locked_door.tscn" id="2_4ocoy"]
[ext_resource type="Texture2D" uid="uid://dfeeppi0orneg" path="res://images/level/moon.png" id="2_ia26y"]
[ext_resource type="Material" uid="uid://dojhoc6ljpt1a" path="res://game/materials/gray_walls.tres" id="2_tuvkr"]
[ext_resource type="Material" uid="uid://dojhoc6ljpt1a" path="res://game/materials/walls_gray.tres" id="2_tuvkr"]
[ext_resource type="PackedScene" uid="uid://b7mhdrj3b6loq" path="res://game/doors/door.tscn" id="3_crrvt"]
[ext_resource type="Texture2D" uid="uid://du56n63yrot7d" path="res://images/level/tree.png" id="3_o0jti"]
[ext_resource type="Texture2D" uid="uid://d3346lrt1c1oh" path="res://images/level/outdoor.png" id="3_wi6ud"]
+148
View File
@@ -0,0 +1,148 @@
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)
+1
View File
@@ -0,0 +1 @@
uid://lxye5wqo5suq
File diff suppressed because one or more lines are too long