diff --git a/autoloads/levels.gd b/autoloads/levels.gd index dc97f4e..2e73738 100644 --- a/autoloads/levels.gd +++ b/autoloads/levels.gd @@ -2,3 +2,61 @@ extends Node @export var level_sets: Array[LevelSet] = [] + + +var current_set_index: int = 0 +var current_level_index: int = 0 + +var current_set: LevelSet: + get(): + return level_sets[current_set_index] + +var current_level: LevelInfo: + get(): + return current_set.levels[current_level_index] + + +func _ready() -> void: + SceneManager.current_scene_changed.connect(_on_current_scene_changed) + + +func get_level(set_idx: int, level_idx: int) -> LevelInfo: + if set_idx >= level_sets.size(): + return null + var lvl_set = level_sets[set_idx] + if level_idx >= lvl_set.levels.size(): + return null + return lvl_set.levels[level_idx] + + +func advance_level() -> void: + var next_idx = current_level_index + 1 + + # change scene to end-of-set scene if it is reached + if next_idx >= current_set.levels.size(): + SceneManager.current_scene = current_set.end_scene.instantiate() + return + + var level_info = current_set.levels[next_idx] + var level = load(level_info.scene_path) as PackedScene + if level: + SceneManager.current_scene = level.instantiate() + +func _detect_current_level() -> void: + if not SceneManager.current_scene is Level: + current_set_index = -1 + current_level_index = -1 + return + + for idx_set in level_sets.size(): + var level_set = level_sets[idx_set] + for idx_lvl in level_set.levels.size(): + var level = level_set.levels[idx_lvl] + if level.scene_path == SceneManager.current_scene.scene_file_path: + current_set_index = idx_set + current_level_index = idx_lvl + return + + +func _on_current_scene_changed(_new_scene: Node) -> void: + _detect_current_level() diff --git a/autoloads/levels.tscn b/autoloads/levels.tscn index 54258b7..dea6664 100644 --- a/autoloads/levels.tscn +++ b/autoloads/levels.tscn @@ -1,6 +1,9 @@ -[gd_scene load_steps=2 format=3 uid="uid://dbqsgks307bto"] +[gd_scene load_steps=4 format=3 uid="uid://dbqsgks307bto"] [ext_resource type="Script" uid="uid://4na03iques5r" path="res://autoloads/levels.gd" id="1_b8434"] +[ext_resource type="Script" uid="uid://dak8il8fxqyph" path="res://scripts/level/level_set.gd" id="2_ebfuu"] +[ext_resource type="Resource" uid="uid://g36wkssommtr" path="res://maps/descent.tres" id="3_hgsu8"] [node name="Levels" type="Node"] script = ExtResource("1_b8434") +level_sets = Array[ExtResource("2_ebfuu")]([ExtResource("3_hgsu8")]) diff --git a/autoloads/scene_manager.gd b/autoloads/scene_manager.gd index cf1411a..e47dccd 100644 --- a/autoloads/scene_manager.gd +++ b/autoloads/scene_manager.gd @@ -1,6 +1,10 @@ extends Node +## Emitted when the current scene is changed. +signal current_scene_changed(new_scene: Node) + + ## Methods of scaling the game viewport. enum ScaleMode { ## Maintain aspect ratio and scale by highest whole number that will fit within the screen. @@ -46,6 +50,7 @@ var current_scene: Node: new_scene.get_parent().remove_child.call_deferred(new_scene) viewport.add_child.call_deferred(new_scene) current_scene = new_scene + current_scene_changed.emit(new_scene) func _ready() -> void: diff --git a/cutscenes/world1_cut.tscn b/cutscenes/world1_cut.tscn index a578283..884aad6 100644 --- a/cutscenes/world1_cut.tscn +++ b/cutscenes/world1_cut.tscn @@ -4,6 +4,57 @@ [ext_resource type="FontFile" uid="uid://dets0g4ce7npf" path="res://assets/fonts/Super Mario Bros. NES.ttf" id="2_3lnes"] [ext_resource type="AudioStream" uid="uid://dp7tqt5uocg0g" path="res://assets/audio/sfx/talking.ogg" id="3_3lnes"] +[sub_resource type="Animation" id="Animation_edpvw"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Label:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(7, 6)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Label2:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(169, 186)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("ColorRect:color") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(0, 0, 0, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("AudioStreamPlayer:playing") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} + [sub_resource type="Animation" id="Animation_5wwpe"] resource_name = "fade" length = 6.0 @@ -71,57 +122,6 @@ tracks/4/keys = { "values": [true] } -[sub_resource type="Animation" id="Animation_edpvw"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("Label:position") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector2(7, 6)] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("Label2:position") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector2(169, 186)] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("ColorRect:color") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Color(0, 0, 0, 1)] -} -tracks/3/type = "value" -tracks/3/imported = false -tracks/3/enabled = true -tracks/3/path = NodePath("AudioStreamPlayer:playing") -tracks/3/interp = 1 -tracks/3/loop_wrap = true -tracks/3/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [false] -} - [sub_resource type="AnimationLibrary" id="AnimationLibrary_iw1oc"] _data = { &"RESET": SubResource("Animation_edpvw"), @@ -141,9 +141,9 @@ position = Vector2(144, 108) texture = ExtResource("1_edpvw") [node name="Label" type="Label" parent="."] -offset_left = -126.41 +offset_left = 7.0 offset_top = 6.0 -offset_right = -14.41 +offset_right = 119.0 offset_bottom = 29.0 theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) theme_override_constants/shadow_outline_size = 8 @@ -152,9 +152,9 @@ theme_override_font_sizes/font_size = 16 text = "WORLD 1" [node name="Label2" type="Label" parent="."] -offset_left = 295.0 +offset_left = 169.0 offset_top = 186.0 -offset_right = 407.0 +offset_right = 281.0 offset_bottom = 209.0 theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) theme_override_constants/shadow_outline_size = 8 diff --git a/maps/descent.tres b/maps/descent.tres new file mode 100644 index 0000000..b1f42cd --- /dev/null +++ b/maps/descent.tres @@ -0,0 +1,57 @@ +[gd_resource type="Resource" script_class="LevelSet" load_steps=10 format=3 uid="uid://g36wkssommtr"] + +[ext_resource type="Script" uid="uid://d3hlv706rwapg" path="res://scripts/level/level_info.gd" id="1_47duy"] +[ext_resource type="PackedScene" uid="uid://bbnq7ptk8hhxa" path="res://maps/level1.tscn" id="1_d6k11"] +[ext_resource type="Script" uid="uid://dak8il8fxqyph" path="res://scripts/level/level_set.gd" id="2_f3ju2"] +[ext_resource type="PackedScene" uid="uid://bt3mxr1j3qyul" path="res://cutscenes/world1_cut.tscn" id="4_i5ovp"] + +[sub_resource type="Resource" id="Resource_d6k11"] +resource_name = "Obligatory Tutorial Level" +script = ExtResource("1_47duy") +title = "Obligatory Tutorial Level" +id = "tutorial" +order = 0 +scene_path = "res://maps/descent/tutorial.tscn" + +[sub_resource type="Resource" id="Resource_i5ovp"] +resource_name = "Yikes! Spikes!" +script = ExtResource("1_47duy") +title = "Yikes! Spikes!" +id = "spikes" +order = 1 +scene_path = "res://maps/descent/yikes_spikes.tscn" + +[sub_resource type="Resource" id="Resource_p1poa"] +resource_name = "Yikes! More Spikes!" +script = ExtResource("1_47duy") +title = "Yikes! More Spikes!" +id = "more-spikes" +order = 2 +scene_path = "res://maps/descent/yikes_more_spikes.tscn" + +[sub_resource type="Resource" id="Resource_sgm6x"] +resource_name = "Spring Time!" +script = ExtResource("1_47duy") +title = "Spring Time!" +id = "spring-time" +order = 3 +scene_path = "res://maps/descent/its_spring.tscn" + +[sub_resource type="Resource" id="Resource_ba8kn"] +resource_name = "Purple Portals" +script = ExtResource("1_47duy") +title = "Purple Portals" +id = "purple-portals" +order = 4 +scene_path = "res://maps/descent/purple_portals.tscn" + +[resource] +resource_name = "Descent" +script = ExtResource("2_f3ju2") +title = "Descent" +id = "descent" +start_scene = ExtResource("4_i5ovp") +end_scene = ExtResource("1_d6k11") +levels_dir = "res://maps/descent" +levels = Array[ExtResource("1_47duy")]([SubResource("Resource_d6k11"), SubResource("Resource_i5ovp"), SubResource("Resource_p1poa"), SubResource("Resource_sgm6x"), SubResource("Resource_ba8kn")]) +metadata/_custom_type_script = "uid://dak8il8fxqyph" diff --git a/maps/its_spring.tscn b/maps/descent/its_spring.tscn similarity index 91% rename from maps/its_spring.tscn rename to maps/descent/its_spring.tscn index 5bc42ce..cffb372 100644 --- a/maps/its_spring.tscn +++ b/maps/descent/its_spring.tscn @@ -1,12 +1,13 @@ -[gd_scene load_steps=12 format=3 uid="uid://bd2srrfspy7ft"] +[gd_scene load_steps=13 format=3 uid="uid://bd2srrfspy7ft"] +[ext_resource type="Script" uid="uid://d3v13a4er2h1x" path="res://scripts/level/level.gd" id="1_dnp5v"] [ext_resource type="Texture2D" uid="uid://d13tqqx8ygak4" path="res://assets/textures/backgrounds/hell.png" id="1_p8vut"] [ext_resource type="Shader" uid="uid://cwktxks6mchp2" path="res://assets/shaders/noise.gdshader" id="2_hpwyk"] [ext_resource type="PackedScene" uid="uid://bwtpsjpe2lf7l" path="res://objects/player/player.tscn" id="3_edpy5"] [ext_resource type="TileSet" uid="uid://xwfn24if3pxk" path="res://assets/tilesets/chocomint.tres" id="4_onc0l"] [ext_resource type="FontFile" uid="uid://dets0g4ce7npf" path="res://assets/fonts/Super Mario Bros. NES.ttf" id="5_s8gph"] [ext_resource type="PackedScene" uid="uid://bhnse651bcybm" path="res://objects/end_door/end_door.tscn" id="6_8fhro"] -[ext_resource type="PackedScene" uid="uid://dmg4t4vm6fd5s" path="res://maps/purple_portals.tscn" id="7_ri7pq"] +[ext_resource type="PackedScene" uid="uid://dmg4t4vm6fd5s" path="res://maps/descent/purple_portals.tscn" id="7_ri7pq"] [ext_resource type="PackedScene" uid="uid://cnqmbq84hbnvj" path="res://objects/spikes/spikes.tscn" id="8_cfxl1"] [ext_resource type="PackedScene" uid="uid://68lav5rke5ag" path="res://objects/spring/spring.tscn" id="9_dtd3x"] @@ -18,7 +19,11 @@ shader_parameter/animate_noise = true shader_parameter/noise_intensity = 1.0 shader_parameter/fps = 15.0 -[node name="Level3" type="Node2D"] +[node name="SpringTime" type="Node2D"] +script = ExtResource("1_dnp5v") +title = "Spring Time!" +id = "spring-time" +order = 3 [node name="Sprite2D" type="Sprite2D" parent="."] material = SubResource("ShaderMaterial_sf5kh") diff --git a/maps/purple_portals.tscn b/maps/descent/purple_portals.tscn similarity index 99% rename from maps/purple_portals.tscn rename to maps/descent/purple_portals.tscn index 364728e..31e73b0 100644 --- a/maps/purple_portals.tscn +++ b/maps/descent/purple_portals.tscn @@ -22,7 +22,7 @@ shader_parameter/fps = 15.0 script = ExtResource("1_srnft") title = "Purple Portals" id = "purple-portals" -order = 3 +order = 4 metadata/_custom_type_script = "uid://d3v13a4er2h1x" [node name="Sprite2D" type="Sprite2D" parent="."] diff --git a/maps/tutorial.tscn b/maps/descent/tutorial.tscn similarity index 87% rename from maps/tutorial.tscn rename to maps/descent/tutorial.tscn index 8eeb932..844ed7e 100644 --- a/maps/tutorial.tscn +++ b/maps/descent/tutorial.tscn @@ -1,12 +1,13 @@ -[gd_scene load_steps=10 format=3 uid="uid://byx8blpt2i8hx"] +[gd_scene load_steps=11 format=3 uid="uid://byx8blpt2i8hx"] [ext_resource type="Texture2D" uid="uid://d13tqqx8ygak4" path="res://assets/textures/backgrounds/hell.png" id="1_5dne7"] +[ext_resource type="Script" uid="uid://d3v13a4er2h1x" path="res://scripts/level/level.gd" id="1_8bygc"] [ext_resource type="Shader" uid="uid://cwktxks6mchp2" path="res://assets/shaders/noise.gdshader" id="2_els7d"] [ext_resource type="PackedScene" uid="uid://bwtpsjpe2lf7l" path="res://objects/player/player.tscn" id="3_imjpd"] [ext_resource type="TileSet" uid="uid://xwfn24if3pxk" path="res://assets/tilesets/chocomint.tres" id="4_1rmvv"] [ext_resource type="FontFile" uid="uid://dets0g4ce7npf" path="res://assets/fonts/Super Mario Bros. NES.ttf" id="5_ae2vf"] [ext_resource type="PackedScene" uid="uid://bhnse651bcybm" path="res://objects/end_door/end_door.tscn" id="6_yywag"] -[ext_resource type="PackedScene" uid="uid://cun6ov7vdfr6a" path="res://maps/yikes_spikes.tscn" id="7_0g05i"] +[ext_resource type="PackedScene" uid="uid://cun6ov7vdfr6a" path="res://maps/descent/yikes_spikes.tscn" id="7_0g05i"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_sf5kh"] @@ -16,7 +17,10 @@ shader_parameter/animate_noise = true shader_parameter/noise_intensity = 1.0 shader_parameter/fps = 15.0 -[node name="Level2" type="Node2D"] +[node name="Tutorial" type="Node2D"] +script = ExtResource("1_8bygc") +title = "Obligatory Tutorial Level" +id = "tutorial" [node name="Sprite2D" type="Sprite2D" parent="."] material = SubResource("ShaderMaterial_sf5kh") diff --git a/maps/yikes_more_spikes.tscn b/maps/descent/yikes_more_spikes.tscn similarity index 89% rename from maps/yikes_more_spikes.tscn rename to maps/descent/yikes_more_spikes.tscn index b2e98f7..f133912 100644 --- a/maps/yikes_more_spikes.tscn +++ b/maps/descent/yikes_more_spikes.tscn @@ -1,12 +1,13 @@ -[gd_scene load_steps=11 format=3 uid="uid://hrrypch7psfa"] +[gd_scene load_steps=12 format=3 uid="uid://hrrypch7psfa"] [ext_resource type="Texture2D" uid="uid://d13tqqx8ygak4" path="res://assets/textures/backgrounds/hell.png" id="1_6i0lb"] +[ext_resource type="Script" uid="uid://d3v13a4er2h1x" path="res://scripts/level/level.gd" id="1_73lj3"] [ext_resource type="Shader" uid="uid://cwktxks6mchp2" path="res://assets/shaders/noise.gdshader" id="2_3dp43"] [ext_resource type="PackedScene" uid="uid://bwtpsjpe2lf7l" path="res://objects/player/player.tscn" id="3_mts2t"] [ext_resource type="TileSet" uid="uid://xwfn24if3pxk" path="res://assets/tilesets/chocomint.tres" id="4_evy0b"] [ext_resource type="FontFile" uid="uid://dets0g4ce7npf" path="res://assets/fonts/Super Mario Bros. NES.ttf" id="5_eo1kb"] [ext_resource type="PackedScene" uid="uid://bhnse651bcybm" path="res://objects/end_door/end_door.tscn" id="6_vvcgd"] -[ext_resource type="PackedScene" uid="uid://bd2srrfspy7ft" path="res://maps/its_spring.tscn" id="7_4f1b6"] +[ext_resource type="PackedScene" uid="uid://bd2srrfspy7ft" path="res://maps/descent/its_spring.tscn" id="7_4f1b6"] [ext_resource type="PackedScene" uid="uid://cnqmbq84hbnvj" path="res://objects/spikes/spikes.tscn" id="8_8qxg7"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_sf5kh"] @@ -17,7 +18,11 @@ shader_parameter/animate_noise = true shader_parameter/noise_intensity = 1.0 shader_parameter/fps = 15.0 -[node name="Level3" type="Node2D"] +[node name="YikesMoreSpikes" type="Node2D"] +script = ExtResource("1_73lj3") +title = "Yikes! More Spikes!" +id = "more-spikes" +order = 2 [node name="Sprite2D" type="Sprite2D" parent="."] material = SubResource("ShaderMaterial_sf5kh") diff --git a/maps/yikes_spikes.tscn b/maps/descent/yikes_spikes.tscn similarity index 88% rename from maps/yikes_spikes.tscn rename to maps/descent/yikes_spikes.tscn index b077a82..847fa8f 100644 --- a/maps/yikes_spikes.tscn +++ b/maps/descent/yikes_spikes.tscn @@ -1,12 +1,13 @@ -[gd_scene load_steps=11 format=3 uid="uid://cun6ov7vdfr6a"] +[gd_scene load_steps=12 format=3 uid="uid://cun6ov7vdfr6a"] [ext_resource type="Texture2D" uid="uid://d13tqqx8ygak4" path="res://assets/textures/backgrounds/hell.png" id="1_588ks"] +[ext_resource type="Script" uid="uid://d3v13a4er2h1x" path="res://scripts/level/level.gd" id="1_3317b"] [ext_resource type="Shader" uid="uid://cwktxks6mchp2" path="res://assets/shaders/noise.gdshader" id="2_rvhjv"] [ext_resource type="PackedScene" uid="uid://bwtpsjpe2lf7l" path="res://objects/player/player.tscn" id="3_pdn7u"] [ext_resource type="TileSet" uid="uid://xwfn24if3pxk" path="res://assets/tilesets/chocomint.tres" id="4_pcxb3"] [ext_resource type="FontFile" uid="uid://dets0g4ce7npf" path="res://assets/fonts/Super Mario Bros. NES.ttf" id="5_bpruh"] [ext_resource type="PackedScene" uid="uid://bhnse651bcybm" path="res://objects/end_door/end_door.tscn" id="6_uyuca"] -[ext_resource type="PackedScene" uid="uid://hrrypch7psfa" path="res://maps/yikes_more_spikes.tscn" id="7_7rv68"] +[ext_resource type="PackedScene" uid="uid://hrrypch7psfa" path="res://maps/descent/yikes_more_spikes.tscn" id="7_7rv68"] [ext_resource type="PackedScene" uid="uid://cnqmbq84hbnvj" path="res://objects/spikes/spikes.tscn" id="7_y3eq7"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_sf5kh"] @@ -17,7 +18,11 @@ shader_parameter/animate_noise = true shader_parameter/noise_intensity = 1.0 shader_parameter/fps = 15.0 -[node name="Level3" type="Node2D"] +[node name="YikesSpikes" type="Node2D"] +script = ExtResource("1_3317b") +title = "Yikes! Spikes!" +id = "spikes" +order = 1 [node name="Sprite2D" type="Sprite2D" parent="."] material = SubResource("ShaderMaterial_sf5kh") diff --git a/objects/end_door/end_door.gd b/objects/end_door/end_door.gd index 7f6eee6..e9d73f0 100644 --- a/objects/end_door/end_door.gd +++ b/objects/end_door/end_door.gd @@ -10,4 +10,4 @@ signal door_entered() func _on_player_detector_body_entered(body: Node2D) -> void: if body is Player: door_entered.emit() - SceneManager.current_scene = next_map.instantiate() + Levels.advance_level() diff --git a/scripts/level/level_info.gd b/scripts/level/level_info.gd index 3ffe0f2..5395dbd 100644 --- a/scripts/level/level_info.gd +++ b/scripts/level/level_info.gd @@ -17,4 +17,5 @@ static func from_level(level: Level) -> LevelInfo: info.title = level.title info.id = level.id info.order = level.order + info.scene_path = level.scene_file_path return info diff --git a/scripts/level/level_set.gd b/scripts/level/level_set.gd index 25d9432..4648f42 100644 --- a/scripts/level/level_set.gd +++ b/scripts/level/level_set.gd @@ -8,12 +8,15 @@ extends Resource title = value resource_name = title @export var id: String +@export var start_scene: PackedScene +@export var end_scene: PackedScene + @export_dir var levels_dir: String: set(value): levels_dir = value if Engine.is_editor_hint(): update_levels() - +@export_tool_button("Update Levels") var _update_levels_action = update_levels @export var levels: Array[LevelInfo] = [] @@ -51,6 +54,8 @@ func update_levels() -> void: file = dir.get_next() # sort levels by level order levels.sort_custom(func(a, b): return a.order < b.order) + emit_changed() + notify_property_list_changed() func _popup_alert(message: String) -> void: