From db0a61e1620aaf479a213a8884ff4dfd265731ea Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Sat, 30 Dec 2023 21:02:39 -0500 Subject: [PATCH] implement marathon start screen --- autoloads/game.gd | 15 +- menus/marathon_select_lives.gd | 49 +++++ menus/marathon_start.gd | 20 +++ menus/marathon_start.tscn | 230 +++++++++++++++++++----- objects/hud/hud.gd | 2 +- objects/hud/options_screen_scholar.tscn | 4 +- ui/2ndpuberty_scholar_outline.png | Bin 6674 -> 6956 bytes 7 files changed, 267 insertions(+), 53 deletions(-) create mode 100644 menus/marathon_select_lives.gd diff --git a/autoloads/game.gd b/autoloads/game.gd index 9b9546d..f26664e 100644 --- a/autoloads/game.gd +++ b/autoloads/game.gd @@ -44,7 +44,7 @@ var current_level: int = 0 var difficulty: int = Difficulty.SPICY setget _set_difficulty var enemy_speed_factor: float = 1.0 # multiplier of enemy speed var is_easy_mode: bool = false # whether to do easy-specific behaviors -var use_lives: bool = false +var use_lives: bool = true var can_pause: bool = true var can_restart: bool = true var current_palette: String = "default" @@ -53,6 +53,7 @@ var still_playing: bool = false var marathon_mode: bool = true var marathon_score: int = 0 var marathon_lives: int = 2 +var marathon_shards: int = 0 var next_level: PackedScene func _ready(): @@ -74,19 +75,19 @@ func _set_difficulty(value: int) -> void: Difficulty.SWEET: is_easy_mode = true enemy_speed_factor = 0.75 - use_lives = false +# use_lives = false Difficulty.SALTY: is_easy_mode = false enemy_speed_factor = 1.0 - use_lives = false +# use_lives = false Difficulty.SPICY: is_easy_mode = false enemy_speed_factor = 1.0 - use_lives = true +# use_lives = true Difficulty.PUNGENT: is_easy_mode = false enemy_speed_factor = 1.25 - use_lives = true +# use_lives = true #Instances a node func instance_node(node:PackedScene,x:float,y:float,parent): @@ -138,6 +139,7 @@ func tally_scores() -> void: # final score final_score = score + arrows_bonus + collection_bonus + time_bonus + life_bonus + perfect_bonus marathon_score += final_score + marathon_shards += _get_shards() Game.save() @@ -166,7 +168,8 @@ func clear_collectibles() -> void: stars_collected.fill(false) shards_collected.fill(false) arrows = 0 - lives = marathon_lives if marathon_mode else 2 + if not marathon_mode: + lives = 0 deaths = 0 # score score = 0 diff --git a/menus/marathon_select_lives.gd b/menus/marathon_select_lives.gd new file mode 100644 index 0000000..83d08e0 --- /dev/null +++ b/menus/marathon_select_lives.gd @@ -0,0 +1,49 @@ +extends Button + + +const INFINITY_SIGIL := "▬↨" + + +onready var back_arrow: TextureRect = $"../BackArrow" +onready var next_arrow: TextureRect = $"../NextArrow" + + +func _ready() -> void: + _update_display() + + +func _update_display() -> void: + if Game.use_lives: + text = "%03d" % Game.marathon_lives + else: + text = INFINITY_SIGIL + + +func _gui_input(event: InputEvent) -> void: + if event.is_action_pressed("ui_left"): + if Game.use_lives: + Game.marathon_lives -= 1 + if Game.marathon_lives < 0: + Game.use_lives = false + else: + Game.use_lives = true + Game.marathon_lives = 999 + if event.is_action_pressed("ui_right"): + if Game.use_lives: + Game.marathon_lives += 1 + if Game.marathon_lives > 999: + Game.use_lives = false + else: + Game.use_lives = true + Game.marathon_lives = 0 + _update_display() + + +func _on_focus_entered() -> void: + back_arrow.visible = true + next_arrow.visible = true + + +func _on_focus_exited() -> void: + back_arrow.visible = false + next_arrow.visible = false diff --git a/menus/marathon_start.gd b/menus/marathon_start.gd index 4d4bccc..96464de 100644 --- a/menus/marathon_start.gd +++ b/menus/marathon_start.gd @@ -4,11 +4,31 @@ extends Control export var first_level: PackedScene +onready var difficulty_buttons := [ + $"%BeginnerButton", + $"%AdvancedButton", + $"%AdvancedButton", + $"%ProfessionalButton", +] + + func _ready() -> void: + yield(get_tree(), "idle_frame") + difficulty_buttons[Game.difficulty].grab_focus() Fade.fade_in() func _input(event: InputEvent) -> void: if Input.is_action_just_pressed("ui_accept"): + Game.lives = Game.marathon_lives Game.marathon_score = 0 + Game.marathon_shards = 0 Game.change_map(first_level) + + +func _set_difficulty(difficulty: int) -> void: + Game.difficulty = difficulty + + +func _on_DifficultySelect_focus_entered() -> void: + difficulty_buttons[Game.difficulty].grab_focus() diff --git a/menus/marathon_start.tscn b/menus/marathon_start.tscn index 28068d2..a7e2e8f 100644 --- a/menus/marathon_start.tscn +++ b/menus/marathon_start.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=2] +[gd_scene load_steps=14 format=2] [ext_resource path="res://shaders/ska_plane.gdshader" type="Shader" id=1] [ext_resource path="res://ui/theme.tres" type="Theme" id=2] @@ -6,6 +6,10 @@ [ext_resource path="res://maps/hills_scholar.tscn" type="PackedScene" id=4] [ext_resource path="res://ui/2ndpuberty_outline.tres" type="Material" id=5] [ext_resource path="res://graphics/hud/file_select_arrow.png" type="Texture" id=6] +[ext_resource path="res://ui/2ndpuberty_scholar_outline.fnt" type="BitmapFont" id=7] +[ext_resource path="res://shaders/wibble_wobble.gdshader" type="Shader" id=8] +[ext_resource path="res://graphics/hud/pause_arrow.png" type="Texture" id=9] +[ext_resource path="res://menus/marathon_select_lives.gd" type="Script" id=10] [sub_resource type="ShaderMaterial" id=1] shader = ExtResource( 1 ) @@ -17,6 +21,20 @@ shader_param/cycle_speed = Vector2( 4, 4 ) shader_param/cycle_alternation = Vector2( 4, 4 ) shader_param/uv_transform = Transform2D( 1, 0, 1, 1, 0, 0 ) +[sub_resource type="ShaderMaterial" id=2] +shader = ExtResource( 8 ) +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( 8 ) +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="MarathonStart" type="Control"] anchor_right = 1.0 anchor_bottom = 1.0 @@ -50,64 +68,188 @@ in revolution 2083 world" align = 1 valign = 1 -[node name="Panel" type="Panel" parent="."] +[node name="DifficultySelect" type="PanelContainer" parent="."] anchor_left = 0.5 anchor_top = 0.5 anchor_right = 0.5 anchor_bottom = 0.5 margin_left = -112.0 -margin_top = -32.0 +margin_top = -48.0 margin_right = 112.0 -margin_bottom = 4.0 +focus_mode = 2 -[node name="DiffcultySelect" type="Label" parent="Panel"] +[node name="VBoxContainer" type="VBoxContainer" parent="DifficultySelect"] +margin_left = 3.0 +margin_top = 3.0 +margin_right = 221.0 +margin_bottom = 45.0 + +[node name="DiffcultySelect" type="Label" parent="DifficultySelect/VBoxContainer"] material = ExtResource( 5 ) -anchor_right = 1.0 -margin_left = -4.0 -margin_top = -26.0 -margin_right = 4.0 -margin_bottom = 7.0 -text = "difficulty select" +margin_right = 218.0 +margin_bottom = 14.0 +rect_min_size = Vector2( 0, 14 ) +text = "difficulty select:" align = 1 valign = 1 -[node name="Difficulties" type="Label" parent="Panel"] +[node name="HBoxContainer" type="HBoxContainer" parent="DifficultySelect/VBoxContainer"] +margin_top = 18.0 +margin_right = 218.0 +margin_bottom = 42.0 +custom_constants/separation = 8 +alignment = 1 + +[node name="Beginner" type="VBoxContainer" parent="DifficultySelect/VBoxContainer/HBoxContainer"] +margin_left = 3.0 +margin_right = 59.0 +margin_bottom = 24.0 +custom_constants/separation = 2 + +[node name="Label" type="Label" parent="DifficultySelect/VBoxContainer/HBoxContainer/Beginner"] +margin_right = 56.0 +margin_bottom = 10.0 +custom_fonts/font = ExtResource( 7 ) +text = "Beginner" + +[node name="BeginnerButton" type="TextureButton" parent="DifficultySelect/VBoxContainer/HBoxContainer/Beginner"] +unique_name_in_owner = true material = ExtResource( 5 ) -anchor_right = 1.0 -margin_left = -44.0 -margin_top = -2.0 -margin_right = 46.0 -margin_bottom = 31.0 -text = "Beginner Advanced Professional" +margin_left = 28.0 +margin_top = 12.0 +margin_right = 28.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 0, 12 ) +focus_neighbour_right = NodePath("../../Advanced/AdvancedButton") +size_flags_horizontal = 4 +texture_focused = ExtResource( 6 ) +expand = true +stretch_mode = 3 + +[node name="Advanced" type="VBoxContainer" parent="DifficultySelect/VBoxContainer/HBoxContainer"] +margin_left = 67.0 +margin_right = 123.0 +margin_bottom = 24.0 +custom_constants/separation = 2 + +[node name="Label" type="Label" parent="DifficultySelect/VBoxContainer/HBoxContainer/Advanced"] +margin_right = 56.0 +margin_bottom = 10.0 +custom_fonts/font = ExtResource( 7 ) +text = "Advanced" + +[node name="AdvancedButton" type="TextureButton" parent="DifficultySelect/VBoxContainer/HBoxContainer/Advanced"] +unique_name_in_owner = true +material = ExtResource( 5 ) +margin_left = 28.0 +margin_top = 12.0 +margin_right = 28.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 0, 12 ) +focus_neighbour_left = NodePath("../../Beginner/BeginnerButton") +focus_neighbour_right = NodePath("../../Professional/ProfessionalButton") +size_flags_horizontal = 4 +texture_focused = ExtResource( 6 ) +expand = true +stretch_mode = 3 + +[node name="Professional" type="VBoxContainer" parent="DifficultySelect/VBoxContainer/HBoxContainer"] +margin_left = 131.0 +margin_right = 215.0 +margin_bottom = 24.0 +custom_constants/separation = 2 + +[node name="Label" type="Label" parent="DifficultySelect/VBoxContainer/HBoxContainer/Professional"] +margin_right = 84.0 +margin_bottom = 10.0 +custom_fonts/font = ExtResource( 7 ) +text = "Professional" + +[node name="ProfessionalButton" type="TextureButton" parent="DifficultySelect/VBoxContainer/HBoxContainer/Professional"] +unique_name_in_owner = true +material = ExtResource( 5 ) +margin_left = 42.0 +margin_top = 12.0 +margin_right = 42.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 0, 12 ) +focus_neighbour_left = NodePath("../../Advanced/AdvancedButton") +size_flags_horizontal = 4 +texture_focused = ExtResource( 6 ) +expand = true +stretch_mode = 3 + +[node name="LivesSelect" type="PanelContainer" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -66.0 +margin_top = 7.0 +margin_right = 66.0 +margin_bottom = 39.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="LivesSelect"] +margin_left = 3.0 +margin_top = 3.0 +margin_right = 129.0 +margin_bottom = 29.0 +custom_constants/separation = 0 + +[node name="Label" type="Label" parent="LivesSelect/VBoxContainer"] +material = ExtResource( 5 ) +margin_right = 126.0 +margin_bottom = 14.0 +rect_min_size = Vector2( 0, 14 ) +text = "number of lives:" align = 1 valign = 1 -[node name="Sprite" type="Sprite" parent="Panel"] -material = ExtResource( 5 ) -position = Vector2( 32, 26 ) -texture = ExtResource( 6 ) +[node name="HBoxContainer" type="HBoxContainer" parent="LivesSelect/VBoxContainer"] +margin_top = 14.0 +margin_right = 126.0 +margin_bottom = 26.0 +rect_min_size = Vector2( 0, 12 ) +size_flags_horizontal = 3 +alignment = 1 -[node name="Panel2" type="Panel" parent="."] -margin_left = 96.0 -margin_top = 120.0 -margin_right = 160.0 -margin_bottom = 152.0 +[node name="BackArrow" type="TextureRect" parent="LivesSelect/VBoxContainer/HBoxContainer"] +visible = false +material = SubResource( 2 ) +margin_left = 51.0 +margin_top = 2.0 +margin_right = 57.0 +margin_bottom = 10.0 +size_flags_vertical = 4 +texture = ExtResource( 9 ) +flip_h = true -[node name="LivesNumber" type="Label" parent="Panel2"] -material = ExtResource( 5 ) -anchor_right = 1.0 -margin_bottom = 33.0 -text = "999" -align = 1 -valign = 1 +[node name="SelectLives" type="Button" parent="LivesSelect/VBoxContainer/HBoxContainer"] +margin_left = 56.0 +margin_right = 70.0 +margin_bottom = 12.0 +focus_neighbour_left = NodePath(".") +focus_neighbour_top = NodePath("../../../../DifficultySelect") +focus_neighbour_right = NodePath(".") +theme = ExtResource( 2 ) +custom_colors/font_color = Color( 1, 1, 1, 1 ) +custom_fonts/font = ExtResource( 7 ) +text = "▬↨" +script = ExtResource( 10 ) -[node name="Lives" type="Label" parent="Panel2"] -material = ExtResource( 5 ) -anchor_right = 1.0 -margin_left = -24.0 -margin_top = -24.0 -margin_right = 17.0 -margin_bottom = 9.0 -text = "Number of lives" -align = 1 -valign = 1 +[node name="NextArrow" type="TextureRect" parent="LivesSelect/VBoxContainer/HBoxContainer"] +visible = false +material = SubResource( 3 ) +margin_left = 69.0 +margin_top = 2.0 +margin_right = 75.0 +margin_bottom = 10.0 +size_flags_vertical = 4 +texture = ExtResource( 9 ) + +[connection signal="focus_entered" from="DifficultySelect" to="." method="_on_DifficultySelect_focus_entered"] +[connection signal="focus_entered" from="DifficultySelect/VBoxContainer/HBoxContainer/Beginner/BeginnerButton" to="." method="_set_difficulty" binds= [ 0 ]] +[connection signal="focus_entered" from="DifficultySelect/VBoxContainer/HBoxContainer/Advanced/AdvancedButton" to="." method="_set_difficulty" binds= [ 2 ]] +[connection signal="focus_entered" from="DifficultySelect/VBoxContainer/HBoxContainer/Professional/ProfessionalButton" to="." method="_set_difficulty" binds= [ 3 ]] +[connection signal="focus_entered" from="LivesSelect/VBoxContainer/HBoxContainer/SelectLives" to="LivesSelect/VBoxContainer/HBoxContainer/SelectLives" method="_on_focus_entered"] +[connection signal="focus_exited" from="LivesSelect/VBoxContainer/HBoxContainer/SelectLives" to="LivesSelect/VBoxContainer/HBoxContainer/SelectLives" method="_on_focus_exited"] diff --git a/objects/hud/hud.gd b/objects/hud/hud.gd index c2a4037..cff7955 100644 --- a/objects/hud/hud.gd +++ b/objects/hud/hud.gd @@ -72,7 +72,7 @@ func _physics_process(delta): else: lives_counter.text = str(Game.deaths) #Life bonus color - if Game.lives == 2: + if Game.deaths == 0: lives_counter.modulate = bonus_color else: lives_counter.modulate = Color.white diff --git a/objects/hud/options_screen_scholar.tscn b/objects/hud/options_screen_scholar.tscn index e256ddd..97787f8 100644 --- a/objects/hud/options_screen_scholar.tscn +++ b/objects/hud/options_screen_scholar.tscn @@ -81,7 +81,7 @@ margin_bottom = 32.0 unique_name_in_owner = true margin_top = 36.0 margin_right = 218.0 -margin_bottom = 132.0 +margin_bottom = 116.0 focus_mode = 2 tabs_visible = false @@ -138,7 +138,6 @@ script = ExtResource( 3 ) options = [ "none", "no stains", "full" ] [node name="Video" type="VBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Tabs"] -visible = false anchor_right = 1.0 anchor_bottom = 1.0 focus_next = NodePath("Fullscreen/SelectFullscreen") @@ -443,6 +442,7 @@ script = ExtResource( 3 ) options = [ "off", "on" ] [node name="Input" type="VBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Tabs"] +visible = false anchor_right = 1.0 anchor_bottom = 1.0 focus_next = NodePath("Left/Keyboard") diff --git a/ui/2ndpuberty_scholar_outline.png b/ui/2ndpuberty_scholar_outline.png index c72a8ee5bdd15454fae3552f9ba731afef648d7f..edacf109ba4fd96fc96f4c38fa781dd8f9a4c401 100644 GIT binary patch delta 3360 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 Z$9>DL%Jtw>tL5SA4P$0&`qacT?%y}x|A7Di delta 3230 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 Q)&Kwi07*qoM6N<$g6NAEHvj+t