diff --git a/autoloads/level_data.tscn b/autoloads/level_data.tscn index 9e1f0d5..7b3ae27 100644 --- a/autoloads/level_data.tscn +++ b/autoloads/level_data.tscn @@ -59,14 +59,6 @@ shard_titles = [ "Bone Climb", "Soul Graze", "Bow Happy Hellarcher", "Look out f save_id = "graveyard" scene = ExtResource( 11 ) -[sub_resource type="Resource" id=7] -resource_name = "Rust Inc." -script = ExtResource( 5 ) -title = "Rust Inc." -shard_titles = [ "Precarious Block", "Beside the button", "Saws and bullets", "Beyond the Steam", "5 Rainbow Stars", "Collection Bonus", "Time Bonus", "Life Bonus" ] -save_id = "rust" -scene = ExtResource( 9 ) - [sub_resource type="Resource" id=8] resource_name = "Police Station" script = ExtResource( 5 ) @@ -75,6 +67,14 @@ shard_titles = [ "All Cops Are Bastards", "Save Ms.X", "Treacherous Climb", "Dod save_id = "station" scene = ExtResource( 10 ) +[sub_resource type="Resource" id=7] +resource_name = "Rust Inc." +script = ExtResource( 5 ) +title = "Rust Inc." +shard_titles = [ "Precarious Block", "Beside the button", "Saws and bullets", "Beyond the Steam", "5 Rainbow Stars", "Collection Bonus", "Time Bonus", "Life Bonus" ] +save_id = "rust" +scene = ExtResource( 9 ) + [node name="LevelData" type="Node"] script = ExtResource( 1 ) -levels = [ SubResource( 1 ), SubResource( 2 ), SubResource( 4 ), SubResource( 6 ), SubResource( 3 ), SubResource( 9 ), SubResource( 7 ), SubResource( 8 ) ] +levels = [ SubResource( 1 ), SubResource( 2 ), SubResource( 4 ), SubResource( 6 ), SubResource( 3 ), SubResource( 9 ), SubResource( 8 ), SubResource( 7 ) ] diff --git a/graphics/level_select/small_sg.png b/graphics/level_select/small_sg.png new file mode 100644 index 0000000..2739498 Binary files /dev/null and b/graphics/level_select/small_sg.png differ diff --git a/graphics/level_select/small_sg.png.import b/graphics/level_select/small_sg.png.import new file mode 100644 index 0000000..89c353a --- /dev/null +++ b/graphics/level_select/small_sg.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/small_sg.png-1e404b8f0979e895a2dcca9c5f498c3c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://graphics/level_select/small_sg.png" +dest_files=[ "res://.import/small_sg.png-1e404b8f0979e895a2dcca9c5f498c3c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/graphics/level_select/world_map.png b/graphics/level_select/world_map.png new file mode 100644 index 0000000..90cad2f Binary files /dev/null and b/graphics/level_select/world_map.png differ diff --git a/graphics/level_select/world_map.png.import b/graphics/level_select/world_map.png.import new file mode 100644 index 0000000..dc5f7a1 --- /dev/null +++ b/graphics/level_select/world_map.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/world_map.png-c7670ec033333050c2cad389b5ebb694.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://graphics/level_select/world_map.png" +dest_files=[ "res://.import/world_map.png-c7670ec033333050c2cad389b5ebb694.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/graphics/level_select/world_map.xcf b/graphics/level_select/world_map.xcf new file mode 100644 index 0000000..ffa9072 Binary files /dev/null and b/graphics/level_select/world_map.xcf differ diff --git a/menus/level_select_scholar.gd b/menus/level_select_scholar.gd new file mode 100644 index 0000000..0aebf2c --- /dev/null +++ b/menus/level_select_scholar.gd @@ -0,0 +1,90 @@ +extends Node + +export var travel_time: float = 1.0 + +var selected_level: int = 0 +var tween: SceneTreeTween = null +var hop_tween: SceneTreeTween = null + +onready var level_path: Path2D = $LevelPath +onready var player_position: PathFollow2D = $"%PlayerPosition" +onready var player_sprite: Sprite = $"%PlayerSprite" +onready var back_arrow: TextureRect = $"%BackArrow" +onready var level_title: Label = $"%LevelTitle" +onready var forward_arrow: TextureRect = $"%ForwardArrow" +onready var in_cave: PathFollow2D = $"%InCave" +onready var out_cave: PathFollow2D = $"%OutCave" + +func _ready() -> void: + Fade.fade_in(0.4) + Audio.ac_music.stop() + # set initial offset + LevelData.levels[selected_level].save_id + var target_level = level_path.get_node(LevelData.levels[selected_level].save_id) + if target_level != null: + player_position.offset = target_level.offset + _select_level(selected_level) + +func _input(event: InputEvent) -> void: + # load selected map + if Input.is_action_just_pressed("ui_accept"): + Game.current_level = selected_level + Game.change_map(LevelData.levels[selected_level].scene) + elif Input.is_action_just_pressed("ui_right"): + _select_level(int(clamp(selected_level + 1, 0, LevelData.levels.size() - 1))) + elif Input.is_action_just_pressed("ui_left"): + _select_level(int(clamp(selected_level - 1, 0, LevelData.levels.size() - 1))) + +func _process(delta: float) -> void: + # make SG disappear inside of cave + if player_position.offset >= in_cave.offset and player_position.offset <= out_cave.offset: + player_sprite.visible = false + else: + player_sprite.visible = true + +func _select_level(level_id: int) -> void: + var level = LevelData.levels[level_id] + selected_level = level_id + # hide arrows at edges of leve set + if level_id == 0: + back_arrow.modulate.a = 0.0 + else: + back_arrow.modulate.a = 1.0 + if level_id == LevelData.levels.size() - 1: + forward_arrow.modulate.a = 0.0 + else: + forward_arrow.modulate.a = 1.0 + # set text + level_title.text = level.title + # initiate animation + _travel_to_level(level.save_id) + +func _travel_to_level(level_name: String) -> void: + # get path offset of target level + var target_level = level_path.get_node(level_name) + if target_level != null: + if target_level.offset < player_position.offset: + player_sprite.flip_h = true + else: + player_sprite.flip_h = false + # kill existing tweens if exist + if tween != null: + tween.kill() + if hop_tween != null: + hop_tween.kill() + player_sprite.position.y = -2.0 + + # hopping animation + hop_tween = create_tween().set_loops() + hop_tween.tween_property(player_sprite, "position:y", -4.0, 0.0) + hop_tween.tween_interval(0.1) + hop_tween.tween_property(player_sprite, "position:y", -2.0, 0.0) + hop_tween.tween_interval(0.1) + + # travel animation + tween = create_tween() + # go to target offset + tween.tween_property(player_position, "offset", target_level.offset, travel_time) + # kill other animation + tween.tween_callback(hop_tween, "kill") + tween.tween_property(player_sprite, "position:y", -2.0, 0.0) diff --git a/menus/level_select_scholar.tscn b/menus/level_select_scholar.tscn new file mode 100644 index 0000000..ad4e18a --- /dev/null +++ b/menus/level_select_scholar.tscn @@ -0,0 +1,147 @@ +[gd_scene load_steps=11 format=2] + +[ext_resource path="res://menus/level_select_scholar.gd" type="Script" id=1] +[ext_resource path="res://graphics/level_select/world_map.png" type="Texture" id=2] +[ext_resource path="res://graphics/level_select/small_sg.png" type="Texture" id=3] +[ext_resource path="res://ui/theme.tres" type="Theme" id=4] +[ext_resource path="res://graphics/hud/pause_arrow.png" type="Texture" id=5] +[ext_resource path="res://ui/2ndpuberty_outline.tres" type="Material" id=6] +[ext_resource path="res://shaders/wibble_wobble.gdshader" type="Shader" id=7] + +[sub_resource type="Curve2D" id=1] +_data = { +"points": PoolVector2Array( -2.9375, -8.1875, 2.9375, 8.1875, 61, 140, -4.4375, -0.0625, 4.4375, 0.0625, 78, 149, -4.15425, 1.32583, 4.15425, -1.32583, 96, 148, -1.65424, 3.52941, 1.65424, -3.52941, 112, 142, -1.88775, 1.4748, 1.88775, -1.4748, 113, 134, 0, 0, 0, 0, 119, 134, -1.08543, 0.828444, 1.08543, -0.828444, 125, 134, 2.83044, 1.16526, -2.83044, -1.16526, 125, 128, -0.794597, 4.50272, 0.794597, -4.50272, 123, 106, -4.30959, 1.47157, 4.30959, -1.47157, 130, 93, -11.05, -1.311, 11.05, 1.311, 141, 96, -1.31102, 2.24746, 1.31102, -2.24746, 155, 99, -2.22725, 4.12041, 2.22725, -4.12041, 162, 84, -4.89994, 0, 4.89994, 0, 172, 75, 0, -4.73004, 0, 4.73004, 184, 88, 0, -4.51982, 0, 4.51982, 177, 100, -3.88915, 0.630672, 3.88915, -0.630672, 185, 107, -0.630672, -4.62493, 0.630672, 4.62493, 192, 118, 1.05112, -1.99713, -1.05112, 1.99713, 190, 128, 2.6278, -0.420448, -2.6278, 0.420448, 184, 132, 1.78381, -1.78381, -1.78381, 1.78381, 175, 132, -6.30672, -0.210224, 6.30672, 0.210224, 181, 137, 0.52556, 6.83228, -0.52556, -6.83228, 204, 130 ) +} + +[sub_resource type="ShaderMaterial" id=2] +shader = ExtResource( 7 ) +shader_param/speed = Vector2( 4, 0 ) +shader_param/ammount = Vector2( 2, 0 ) +shader_param/offset = Vector2( 0, 0 ) +shader_param/delay = Vector2( 0, 0 ) + +[sub_resource type="ShaderMaterial" id=3] +shader = ExtResource( 7 ) +shader_param/speed = Vector2( 4, 0 ) +shader_param/ammount = Vector2( 2, 0 ) +shader_param/offset = Vector2( 0, 0 ) +shader_param/delay = Vector2( 4, 0 ) + +[node name="LevelSelect" type="Node"] +script = ExtResource( 1 ) + +[node name="WorldMap" type="TextureRect" parent="."] +margin_right = 40.0 +margin_bottom = 40.0 +texture = ExtResource( 2 ) + +[node name="LevelPath" type="Path2D" parent="."] +curve = SubResource( 1 ) + +[node name="PlayerPosition" type="PathFollow2D" parent="LevelPath"] +unique_name_in_owner = true +position = Vector2( 61, 140 ) +rotate = false + +[node name="PlayerSprite" type="Sprite" parent="LevelPath/PlayerPosition"] +unique_name_in_owner = true +position = Vector2( 0, -2 ) +texture = ExtResource( 3 ) + +[node name="hills" type="PathFollow2D" parent="LevelPath"] +position = Vector2( 61, 140 ) +rotation = 1.04814 + +[node name="canopy" type="PathFollow2D" parent="LevelPath"] +position = Vector2( 89.5314, 148.93 ) +rotation = -0.105869 +offset = 32.0 + +[node name="mountain" type="PathFollow2D" parent="LevelPath"] +position = Vector2( 111.481, 142.765 ) +rotation = -1.37064 +offset = 55.0 + +[node name="boss1" type="PathFollow2D" parent="LevelPath"] +position = Vector2( 118.615, 133.912 ) +rotation = 0.140896 +offset = 69.0 + +[node name="cave" type="PathFollow2D" parent="LevelPath"] +position = Vector2( 126.41, 129.495 ) +rotation = -2.19952 +offset = 80.0 + +[node name="InCave" type="PathFollow2D" parent="LevelPath"] +unique_name_in_owner = true +position = Vector2( 124.058, 126.26 ) +rotation = -1.85459 +offset = 84.0 + +[node name="OutCave" type="PathFollow2D" parent="LevelPath"] +unique_name_in_owner = true +position = Vector2( 139.8, 95.8421 ) +rotation = 0.144373 +offset = 130.0 + +[node name="abyss" type="PathFollow2D" parent="LevelPath"] +position = Vector2( 154.261, 99.6526 ) +rotation = -1.01682 +offset = 145.0 + +[node name="graveyard" type="PathFollow2D" parent="LevelPath"] +position = Vector2( 171.416, 75.085 ) +rotation = 0.234945 +offset = 176.0 + +[node name="station" type="PathFollow2D" parent="LevelPath"] +position = Vector2( 181.076, 106.194 ) +rotation = 0.297386 +offset = 217.0 + +[node name="rust" type="PathFollow2D" parent="LevelPath"] +position = Vector2( 177.983, 131.216 ) +rotation = 2.36539 +offset = 258.0 + +[node name="lab" type="PathFollow2D" parent="LevelPath"] +position = Vector2( 204, 130 ) +offset = 300.0 + +[node name="CurrentLevel" type="HBoxContainer" parent="."] +anchor_right = 1.0 +margin_bottom = 16.0 +alignment = 1 + +[node name="BackArrow" type="TextureRect" parent="CurrentLevel"] +unique_name_in_owner = true +material = SubResource( 2 ) +margin_left = 72.0 +margin_top = 4.0 +margin_right = 78.0 +margin_bottom = 12.0 +size_flags_vertical = 4 +texture = ExtResource( 5 ) +flip_h = true + +[node name="LevelTitle" type="Label" parent="CurrentLevel"] +unique_name_in_owner = true +material = ExtResource( 6 ) +margin_left = 82.0 +margin_top = 3.0 +margin_right = 173.0 +margin_bottom = 13.0 +theme = ExtResource( 4 ) +text = "Verdant Hills" +align = 1 +valign = 1 + +[node name="ForwardArrow" type="TextureRect" parent="CurrentLevel"] +unique_name_in_owner = true +material = SubResource( 3 ) +margin_left = 177.0 +margin_top = 4.0 +margin_right = 183.0 +margin_bottom = 12.0 +size_flags_vertical = 4 +texture = ExtResource( 5 ) diff --git a/objects/hud/pause_screen.gd b/objects/hud/pause_screen.gd index b9a0da4..0b2ebfd 100644 --- a/objects/hud/pause_screen.gd +++ b/objects/hud/pause_screen.gd @@ -40,7 +40,8 @@ func _on_Settings_pressed(): func _on_ExitLevel_pressed(): get_tree().paused = false - Game.change_map(load("res://maps/level_select.tscn")) + Game.change_map(load("res://menus/level_select_scholar.tscn")) + yield(Fade, "fade_finished") queue_free() diff --git a/project.godot b/project.godot index 22e7337..3719b4c 100644 --- a/project.godot +++ b/project.godot @@ -63,7 +63,7 @@ _global_script_class_icons={ [application] config/name="Robobong" -run/main_scene="res://maps/level_select.tscn" +run/main_scene="res://menus/level_select_scholar.tscn" config/use_custom_user_dir=true config/custom_user_dir_name="heromark2" config/icon="res://icon.png"