diff --git a/menus/level_select_scholar.gd b/menus/level_select_scholar.gd index 4b94643..399f8cb 100644 --- a/menus/level_select_scholar.gd +++ b/menus/level_select_scholar.gd @@ -3,6 +3,8 @@ extends Node export var travel_time: float = 1.0 var selected_level: int = 0 +var made_selection: bool = false +var selected_shard: int = 0 var tween: SceneTreeTween = null var hop_tween: SceneTreeTween = null @@ -14,6 +16,14 @@ onready var level_title: Label = $"%LevelTitle" onready var forward_arrow: TextureRect = $"%ForwardArrow" onready var in_cave: PathFollow2D = $"%InCave" onready var out_cave: PathFollow2D = $"%OutCave" +onready var score_any: Label = $"%ScoreAny" +onready var time_any: Label = $"%TimeAny" +onready var score_100: Label = $"%Score100" +onready var time_100: Label = $"%Time100" +onready var filled_shards: Node2D = $"%FilledShards" +onready var shard_title: Label = $"%ShardTitle" +onready var shard_arrow: Sprite = $"%ShardArrow" +onready var animation_player: AnimationPlayer = $AnimationPlayer func _ready() -> void: Fade.fade_in(0.4) @@ -35,22 +45,49 @@ func _ready() -> void: # 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: +# # 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: - # 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))) - # 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 _input(event: InputEvent) -> void: + if not made_selection: # player is walking around + if event.is_action_pressed("ui_accept"): + _update_stats() + animation_player.play("show_stats") + made_selection = true + elif event.is_action_pressed("ui_right"): + _select_level(int(clamp(selected_level + 1, 0, LevelData.levels.size() - 1))) + elif event.is_action_pressed("ui_left"): + _select_level(int(clamp(selected_level - 1, 0, LevelData.levels.size() - 1))) + else: # player has selected level + if event.is_action_pressed("ui_accept"): + Game.current_level = selected_level + Game.change_map(LevelData.levels[selected_level].scene) + elif event.is_action_pressed("ui_cancel"): + animation_player.play("hide_stats") + made_selection = false + elif event.is_action_pressed("ui_right"): + selected_shard = posmod(selected_shard + 1, 8) + shard_title.text = LevelData.levels[selected_level].shard_titles[selected_shard] + shard_arrow.position.x = filled_shards.get_child(selected_shard).position.x + elif event.is_action_pressed("ui_left"): + selected_shard = posmod(selected_shard - 1, 8) + shard_title.text = LevelData.levels[selected_level].shard_titles[selected_shard] + shard_arrow.position.x = filled_shards.get_child(selected_shard).position.x + func _select_level(level_id: int) -> void: var level = LevelData.levels[level_id] selected_level = level_id @@ -97,3 +134,19 @@ func _travel_to_level(level_name: String) -> void: # kill other animation tween.tween_callback(hop_tween, "kill") tween.tween_property(player_sprite, "position:y", -2.0, 0.0) + +func _update_stats() -> void: + # fill in level panel information + var save_id = LevelData.levels[selected_level].save_id + var save_data: Save.LevelSaveData = Save.current_file.levels[save_id] + score_any.text = "%05d" % save_data.score_any + time_any.text = Game.format_time(save_data.time_any) + score_100.text = "%05d" % save_data.score_100 + time_100.text = Game.format_time(save_data.time_100) + var shards = filled_shards.get_children() + print(save_data.shards_collected) + for i in 8: + shards[i].visible = save_data.shards_collected[i] + selected_shard = 0 + shard_title.text = LevelData.levels[selected_level].shard_titles[selected_shard] + shard_arrow.position.x = filled_shards.get_child(selected_shard).position.x diff --git a/menus/level_select_scholar.tscn b/menus/level_select_scholar.tscn index ad4e18a..221ba0a 100644 --- a/menus/level_select_scholar.tscn +++ b/menus/level_select_scholar.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=2] +[gd_scene load_steps=19 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] @@ -7,6 +7,10 @@ [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] +[ext_resource path="res://shaders/1px_border.gdshader" type="Shader" id=9] +[ext_resource path="res://graphics/collectibles/shard.png" type="Texture" id=10] +[ext_resource path="res://objects/collectibles/shard.tscn" type="PackedScene" id=11] +[ext_resource path="res://graphics/hud/levelselect_arrow.png" type="Texture" id=14] [sub_resource type="Curve2D" id=1] _data = { @@ -27,12 +31,100 @@ shader_param/ammount = Vector2( 2, 0 ) shader_param/offset = Vector2( 0, 0 ) shader_param/delay = Vector2( 4, 0 ) +[sub_resource type="ShaderMaterial" id=5] +shader = ExtResource( 9 ) +shader_param/border_color = Color( 0, 0, 0, 1 ) +shader_param/border_corners = false + +[sub_resource type="Animation" id=6] +length = 0.001 +tracks/0/type = "value" +tracks/0/path = NodePath("LevelStats:visible") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ false ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("LevelStats:rect_scale") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 1, 1 ) ] +} + +[sub_resource type="Animation" id=8] +resource_name = "hide_stats" +length = 0.4 +tracks/0/type = "value" +tracks/0/path = NodePath("LevelStats:visible") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0.4 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ true ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("LevelStats:rect_scale") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 0.2, 0.4 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 1, 1 ), Vector2( 1, 0.02 ), Vector2( 0, 0.02 ) ] +} + +[sub_resource type="Animation" id=7] +resource_name = "show_stats" +length = 0.4 +tracks/0/type = "value" +tracks/0/path = NodePath("LevelStats:visible") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ true ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("LevelStats:rect_scale") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 0.2, 0.4 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 0.02 ), Vector2( 1, 0.02 ), Vector2( 1, 1 ) ] +} + [node name="LevelSelect" type="Node"] script = ExtResource( 1 ) [node name="WorldMap" type="TextureRect" parent="."] -margin_right = 40.0 -margin_bottom = 40.0 +margin_right = 256.0 +margin_bottom = 192.0 texture = ExtResource( 2 ) [node name="LevelPath" type="Path2D" parent="."] @@ -145,3 +237,187 @@ margin_right = 183.0 margin_bottom = 12.0 size_flags_vertical = 4 texture = ExtResource( 5 ) + +[node name="LevelStats" type="Panel" parent="."] +visible = false +margin_left = 40.0 +margin_top = 45.0 +margin_right = 216.0 +margin_bottom = 147.0 +grow_horizontal = 2 +grow_vertical = 2 +rect_min_size = Vector2( 176, 102 ) +rect_pivot_offset = Vector2( 88, 51 ) +theme = ExtResource( 4 ) + +[node name="HighScoreLabel" type="Label" parent="LevelStats"] +material = ExtResource( 6 ) +margin_left = 16.0 +margin_top = 16.0 +margin_right = 160.0 +margin_bottom = 26.0 +theme = ExtResource( 4 ) +text = "High SCORE:" +align = 1 + +[node name="Any" type="Label" parent="LevelStats"] +material = ExtResource( 6 ) +margin_left = 39.0 +margin_top = 27.0 +margin_right = 67.0 +margin_bottom = 37.0 +theme = ExtResource( 4 ) +text = "any%" +align = 1 + +[node name="ScoreAny" type="Label" parent="LevelStats/Any"] +unique_name_in_owner = true +use_parent_material = true +margin_top = 13.0 +margin_right = 28.0 +margin_bottom = 23.0 +text = "0000" + +[node name="TimeAny" type="Label" parent="LevelStats/Any"] +unique_name_in_owner = true +use_parent_material = true +margin_left = -11.0 +margin_top = 26.0 +margin_right = 38.0 +margin_bottom = 36.0 +text = "0:00.00" + +[node name="100" type="Label" parent="LevelStats"] +material = ExtResource( 6 ) +margin_left = 102.0 +margin_top = 27.0 +margin_right = 130.0 +margin_bottom = 37.0 +theme = ExtResource( 4 ) +text = "100%" +align = 1 + +[node name="Score100" type="Label" parent="LevelStats/100"] +unique_name_in_owner = true +use_parent_material = true +margin_top = 13.0 +margin_right = 28.0 +margin_bottom = 23.0 +text = "0000" + +[node name="Time100" type="Label" parent="LevelStats/100"] +unique_name_in_owner = true +use_parent_material = true +margin_left = -11.0 +margin_top = 26.0 +margin_right = 38.0 +margin_bottom = 36.0 +text = "0:00.00" + +[node name="ShardTitle" type="Label" parent="LevelStats"] +unique_name_in_owner = true +material = ExtResource( 6 ) +margin_left = 3.0 +margin_top = 89.0 +margin_right = 173.0 +margin_bottom = 99.0 +theme = ExtResource( 4 ) +text = "AAAAAAAAAAAAAAAAAAAAAAAA" +align = 1 + +[node name="EmptyShards" type="Node2D" parent="LevelStats"] +position = Vector2( -40, -35 ) + +[node name="EmptyShard1" type="Sprite" parent="LevelStats/EmptyShards"] +modulate = Color( 0, 0, 0, 1 ) +material = SubResource( 5 ) +position = Vector2( 76, 118 ) +texture = ExtResource( 10 ) + +[node name="EmptyShard2" type="Sprite" parent="LevelStats/EmptyShards"] +modulate = Color( 0, 0, 0, 1 ) +material = SubResource( 5 ) +position = Vector2( 91, 118 ) +texture = ExtResource( 10 ) + +[node name="EmptyShard3" type="Sprite" parent="LevelStats/EmptyShards"] +modulate = Color( 0, 0, 0, 1 ) +material = SubResource( 5 ) +position = Vector2( 106, 118 ) +texture = ExtResource( 10 ) + +[node name="EmptyShard4" type="Sprite" parent="LevelStats/EmptyShards"] +modulate = Color( 0, 0, 0, 1 ) +material = SubResource( 5 ) +position = Vector2( 121, 118 ) +texture = ExtResource( 10 ) + +[node name="EmptyShard5" type="Sprite" parent="LevelStats/EmptyShards"] +modulate = Color( 0, 0, 0, 1 ) +material = SubResource( 5 ) +position = Vector2( 136, 118 ) +texture = ExtResource( 10 ) + +[node name="EmptyShard6" type="Sprite" parent="LevelStats/EmptyShards"] +modulate = Color( 0, 0, 0, 1 ) +material = SubResource( 5 ) +position = Vector2( 151, 118 ) +texture = ExtResource( 10 ) + +[node name="EmptyShard7" type="Sprite" parent="LevelStats/EmptyShards"] +modulate = Color( 0, 0, 0, 1 ) +material = SubResource( 5 ) +position = Vector2( 166, 118 ) +texture = ExtResource( 10 ) + +[node name="EmptyShard8" type="Sprite" parent="LevelStats/EmptyShards"] +modulate = Color( 0, 0, 0, 1 ) +material = SubResource( 5 ) +position = Vector2( 181, 118 ) +texture = ExtResource( 10 ) + +[node name="FilledShards" type="Node2D" parent="LevelStats"] +unique_name_in_owner = true + +[node name="Shard1" parent="LevelStats/FilledShards" instance=ExtResource( 11 )] +visible = false +position = Vector2( 31, 80 ) + +[node name="Shard2" parent="LevelStats/FilledShards" instance=ExtResource( 11 )] +visible = false +position = Vector2( 46, 80 ) + +[node name="Shard3" parent="LevelStats/FilledShards" instance=ExtResource( 11 )] +visible = false +position = Vector2( 61, 80 ) + +[node name="Shard4" parent="LevelStats/FilledShards" instance=ExtResource( 11 )] +visible = false +position = Vector2( 76, 80 ) + +[node name="Shard5" parent="LevelStats/FilledShards" instance=ExtResource( 11 )] +visible = false +position = Vector2( 91, 80 ) + +[node name="Shard6" parent="LevelStats/FilledShards" instance=ExtResource( 11 )] +visible = false +position = Vector2( 106, 80 ) + +[node name="Shard7" parent="LevelStats/FilledShards" instance=ExtResource( 11 )] +visible = false +position = Vector2( 121, 80 ) + +[node name="Shard8" parent="LevelStats/FilledShards" instance=ExtResource( 11 )] +visible = false +position = Vector2( 136, 80 ) + +[node name="ShardArrow" type="Sprite" parent="LevelStats"] +unique_name_in_owner = true +position = Vector2( 31, 71 ) +texture = ExtResource( 14 ) +offset = Vector2( 5, 0 ) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +anims/RESET = SubResource( 6 ) +anims/hide_stats = SubResource( 8 ) +anims/show_stats = SubResource( 7 )