From c28e105e783910b191b389c9cd952dfbc8e09fa9 Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Mon, 12 Feb 2024 01:00:08 -0500 Subject: [PATCH] enforce level progression --- autoloads/level_data.gd | 2 +- menus/level_select_scholar.gd | 37 ++++++++++++++++++++++-- menus/level_select_scholar.tscn | 51 ++++++++++++++++++++++++++++----- 3 files changed, 80 insertions(+), 10 deletions(-) diff --git a/autoloads/level_data.gd b/autoloads/level_data.gd index 27b483f..8d9775c 100644 --- a/autoloads/level_data.gd +++ b/autoloads/level_data.gd @@ -1,7 +1,7 @@ tool extends Node -export var levels = [] setget set_levels +export var levels: Array = [] setget set_levels func set_levels(value): levels = value diff --git a/menus/level_select_scholar.gd b/menus/level_select_scholar.gd index 399f8cb..6c8b589 100644 --- a/menus/level_select_scholar.gd +++ b/menus/level_select_scholar.gd @@ -24,6 +24,9 @@ onready var filled_shards: Node2D = $"%FilledShards" onready var shard_title: Label = $"%ShardTitle" onready var shard_arrow: Sprite = $"%ShardArrow" onready var animation_player: AnimationPlayer = $AnimationPlayer +onready var boss_block: TextureRect = $"%BossBlock" +onready var shards_block: HBoxContainer = $"%ShardsBlock" +onready var shards_needed: Label = $"%ShardsNeeded" func _ready() -> void: Fade.fade_in(0.4) @@ -56,6 +59,22 @@ func _ready() -> void: # _select_level(int(clamp(selected_level - 1, 0, LevelData.levels.size() - 1))) func _process(delta: float) -> void: + forward_arrow.visible = true + boss_block.visible = false + shards_block.visible = false + if selected_level + 1 < LevelData.levels.size(): + var save := Save.current_file + var level: LevelEntry = LevelData.levels[selected_level + 1] + var shards := save.get_total_shards() + if save.get_total_shards() < level.shards_required: + forward_arrow.visible = false + boss_block.visible = false + shards_block.visible = true + shards_needed.text = str(level.shards_required) + if level.boss_required != "" and not save.levels[level.boss_required].completed: + forward_arrow.visible = false + shards_block.visible = false + boss_block.visible = true # make SG disappear inside of cave if player_position.offset >= in_cave.offset and player_position.offset <= out_cave.offset: player_sprite.visible = false @@ -69,9 +88,13 @@ func _input(event: InputEvent) -> void: 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))) + var level = int(clamp(selected_level + 1, 0, LevelData.levels.size() - 1)) + if _can_travel(level): + _select_level(level) elif event.is_action_pressed("ui_left"): - _select_level(int(clamp(selected_level - 1, 0, LevelData.levels.size() - 1))) + var level = int(clamp(selected_level - 1, 0, LevelData.levels.size() - 1)) + if _can_travel(level): + _select_level(level) else: # player has selected level if event.is_action_pressed("ui_accept"): Game.current_level = selected_level @@ -105,6 +128,16 @@ func _select_level(level_id: int) -> void: # initiate animation _travel_to_level(level.save_id) +func _can_travel(index: int) -> bool: + var save := Save.current_file + var level: LevelEntry = LevelData.levels[index] + var shards := save.get_total_shards() + if save.get_total_shards() < level.shards_required: + return false + if level.boss_required != "": + return save.levels[level.boss_required].completed + return true + func _travel_to_level(level_name: String) -> void: # get path offset of target level var target_level = level_path.get_node(level_name) diff --git a/menus/level_select_scholar.tscn b/menus/level_select_scholar.tscn index 221ba0a..47c5bd6 100644 --- a/menus/level_select_scholar.tscn +++ b/menus/level_select_scholar.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=19 format=2] +[gd_scene load_steps=21 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,9 +7,11 @@ [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://graphics/hud/deaths_head.png" type="Texture" id=8] [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://ui/2ndpuberty_scholar_outline.fnt" type="BitmapFont" id=12] [ext_resource path="res://graphics/hud/levelselect_arrow.png" type="Texture" id=14] [sub_resource type="Curve2D" id=1] @@ -203,14 +205,15 @@ offset = 300.0 [node name="CurrentLevel" type="HBoxContainer" parent="."] anchor_right = 1.0 margin_bottom = 16.0 +theme = ExtResource( 4 ) alignment = 1 [node name="BackArrow" type="TextureRect" parent="CurrentLevel"] unique_name_in_owner = true material = SubResource( 2 ) -margin_left = 72.0 +margin_left = 61.0 margin_top = 4.0 -margin_right = 78.0 +margin_right = 67.0 margin_bottom = 12.0 size_flags_vertical = 4 texture = ExtResource( 5 ) @@ -219,9 +222,9 @@ flip_h = true [node name="LevelTitle" type="Label" parent="CurrentLevel"] unique_name_in_owner = true material = ExtResource( 6 ) -margin_left = 82.0 +margin_left = 71.0 margin_top = 3.0 -margin_right = 173.0 +margin_right = 162.0 margin_bottom = 13.0 theme = ExtResource( 4 ) text = "Verdant Hills" @@ -230,14 +233,48 @@ valign = 1 [node name="ForwardArrow" type="TextureRect" parent="CurrentLevel"] unique_name_in_owner = true +visible = false material = SubResource( 3 ) -margin_left = 177.0 +margin_left = 164.0 margin_top = 4.0 -margin_right = 183.0 +margin_right = 170.0 margin_bottom = 12.0 size_flags_vertical = 4 texture = ExtResource( 5 ) +[node name="BossBlock" type="TextureRect" parent="CurrentLevel"] +unique_name_in_owner = true +visible = false +margin_left = 169.0 +margin_top = 4.0 +margin_right = 176.0 +margin_bottom = 12.0 +size_flags_vertical = 4 +texture = ExtResource( 8 ) + +[node name="ShardsBlock" type="HBoxContainer" parent="CurrentLevel"] +unique_name_in_owner = true +margin_left = 166.0 +margin_right = 195.0 +margin_bottom = 16.0 + +[node name="Icon" type="TextureRect" parent="CurrentLevel/ShardsBlock"] +margin_top = 2.0 +margin_right = 11.0 +margin_bottom = 13.0 +size_flags_vertical = 4 +texture = ExtResource( 10 ) + +[node name="ShardsNeeded" type="Label" parent="CurrentLevel/ShardsBlock"] +unique_name_in_owner = true +modulate = Color( 0.933333, 0.247059, 0.247059, 1 ) +margin_left = 15.0 +margin_top = 3.0 +margin_right = 29.0 +margin_bottom = 13.0 +custom_fonts/font = ExtResource( 12 ) +text = "15" + [node name="LevelStats" type="Panel" parent="."] visible = false margin_left = 40.0