From 3cb37faf4b0b940727608ad4b3a92ed588002354 Mon Sep 17 00:00:00 2001 From: Lexi Quinn Date: Thu, 6 Nov 2025 22:16:59 +1100 Subject: [PATCH] added wave viewer which required adding determinism to wave generation --- Enemies/Crystalisk/crystalisk.tres | 1 - PCs/hero.gd | 9 + PCs/hero.tscn | 4 +- PCs/hud.gd | 1 - Scenes/Menus/singleplayer_lobby.tscn | 14 +- Scenes/MixingTable/remix_table.gd | 2 +- Scripts/game.gd | 30 +++- Scripts/lobby.gd | 15 +- Scripts/noise_random.gd | 2 +- Scripts/singleplayer_lobby.gd | 1 - Scripts/wave_manager.gd | 23 +-- UI/Menus/GameEndScreen/enemy_row.gd | 35 ++-- UI/Menus/GameEndScreen/enemy_row.tscn | 12 +- UI/Menus/GameEndScreen/game_end_screen.gd | 2 +- UI/Menus/GameEndScreen/game_end_screen.tscn | 21 +-- UI/ShieldUI/shield_ui.gd | 39 +++-- UI/ShieldUI/shield_ui.tscn | 1 - UI/Themes/Scale1/grabber_disabled_tex.tres | 7 + UI/Themes/Scale1/grabber_tex.tres | 7 + UI/Themes/Scale1/h_scroll_bar.tres | 15 ++ UI/Themes/Scale1/h_scroll_grabber.tres | 15 ++ UI/Themes/Scale1/popup_item_hover.tres | 14 ++ UI/Themes/Scale1/psx_ui.tres | 96 ++++++---- UI/Themes/Scale1/slider.tres | 1 + UI/Themes/Scale1/slider_tick_tex.tres | 7 + UI/Themes/Scale1/v_scroll_bar.tres | 15 ++ ...oll_grabber.tres => v_scroll_grabber.tres} | 4 +- UI/card_description_ui.tscn | 1 - Worlds/GreenPlanet/Levels/Bridge/bridge.tscn | 13 +- main.gd | 7 +- main.tscn | 27 +-- project.godot | 5 + shield_ui_test.gd | 29 +++ shield_ui_test.gd.uid | 1 + shield_ui_test.tscn | 61 +++++++ wave_viewer.gd | 47 +++++ wave_viewer.gd.uid | 1 + wave_viewer.tscn | 165 ++---------------- 38 files changed, 438 insertions(+), 312 deletions(-) create mode 100644 UI/Themes/Scale1/grabber_disabled_tex.tres create mode 100644 UI/Themes/Scale1/grabber_tex.tres create mode 100644 UI/Themes/Scale1/h_scroll_bar.tres create mode 100644 UI/Themes/Scale1/h_scroll_grabber.tres create mode 100644 UI/Themes/Scale1/popup_item_hover.tres create mode 100644 UI/Themes/Scale1/slider_tick_tex.tres create mode 100644 UI/Themes/Scale1/v_scroll_bar.tres rename UI/Themes/Scale1/{scroll_grabber.tres => v_scroll_grabber.tres} (87%) create mode 100644 shield_ui_test.gd create mode 100644 shield_ui_test.gd.uid create mode 100644 shield_ui_test.tscn create mode 100644 wave_viewer.gd create mode 100644 wave_viewer.gd.uid diff --git a/Enemies/Crystalisk/crystalisk.tres b/Enemies/Crystalisk/crystalisk.tres index ea1b3b5..a2d2950 100644 --- a/Enemies/Crystalisk/crystalisk.tres +++ b/Enemies/Crystalisk/crystalisk.tres @@ -18,7 +18,6 @@ spawn_power = 6 health = 120 penalty = 7 movement_speed = 1.0 -spawn_cooldown = 1.0 common_group = 5 common_cost = 2 uncommon_group = 10 diff --git a/PCs/hero.gd b/PCs/hero.gd index 1621acf..25ca7a2 100644 --- a/PCs/hero.gd +++ b/PCs/hero.gd @@ -3,6 +3,7 @@ extends CharacterBody3D signal ready_state_changed(state: bool) +@export var wave_preview_scene: PackedScene @export var hero_class: HeroClass @export var camera: Camera3D @export var gun_camera: Camera3D @@ -184,6 +185,7 @@ func increment_selected() -> void: if hand_selected_index >= hand.size: hand_selected_index = 0 hud.hot_wheel.update_cassettes(get_wheel_cards()) + hud.show_features(selected_card) func decrement_selected() -> void: @@ -194,6 +196,7 @@ func decrement_selected() -> void: if hand_selected_index < 0: hand_selected_index = hand.size - 1 hud.hot_wheel.update_cassettes(get_wheel_cards()) + hud.show_features(selected_card) func get_wheel_cards() -> Array[Card]: @@ -243,6 +246,12 @@ func _unhandled_input(event: InputEvent) -> void: menu.quit_to_main_menu_pressed.connect(game_manager.scene_switch_main_menu) menu.closed.connect(unpause) hud.add_child(menu) + if event.is_action_pressed("Show Wave Preview"): + var wave_preview: WaveViewer = wave_preview_scene.instantiate() as WaveViewer + pause() + hud.add_child(wave_preview) + wave_preview.set_waves(game_manager.pre_generate_waves(), game_manager.wave) + wave_preview.closed.connect(unpause) func ready_self() -> void: diff --git a/PCs/hero.tscn b/PCs/hero.tscn index 2c59b04..733bef4 100644 --- a/PCs/hero.tscn +++ b/PCs/hero.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=67 format=3 uid="uid://dxgxbtf68lcv5"] +[gd_scene load_steps=68 format=3 uid="uid://dxgxbtf68lcv5"] [ext_resource type="Script" uid="uid://1fqpoegbdm6n" path="res://PCs/hero.gd" id="1_pihpe"] [ext_resource type="Resource" uid="uid://b5pc3frhx467q" path="res://Classes/Engineer/class.tres" id="2_dbyo0"] [ext_resource type="PackedScene" uid="uid://ri8r03wqy80t" path="res://Scenes/8_direction_sprite.tscn" id="2_ib0t5"] +[ext_resource type="PackedScene" uid="uid://ct6gic4shy5qw" path="res://wave_viewer.tscn" id="2_o55s8"] [ext_resource type="PackedScene" uid="uid://buvgdem68wtev" path="res://UI/Menus/PauseMenu/pause_menu.tscn" id="3_avnsx"] [ext_resource type="PackedScene" uid="uid://n8ab1cy7ordc" path="res://card_model/3d_card.tscn" id="4_2mqvj"] [ext_resource type="Script" uid="uid://cij76at0nbs1v" path="res://PCs/view_movement.gd" id="4_mhexa"] @@ -118,6 +119,7 @@ stream_0/stream = ExtResource("37_kv1mg") collision_layer = 2 collision_mask = 37 script = ExtResource("1_pihpe") +wave_preview_scene = ExtResource("2_o55s8") hero_class = ExtResource("2_dbyo0") camera = NodePath("ViewMovement/Head") gun_camera = NodePath("FirstPersonViewport/Head2") diff --git a/PCs/hud.gd b/PCs/hud.gd index af41403..3586fd2 100644 --- a/PCs/hud.gd +++ b/PCs/hud.gd @@ -126,7 +126,6 @@ func _process(_delta: float) -> void: func show_features(cassette: Card) -> void: - print("shown features") for child: Node in feature_preview.get_children(): child.queue_free() var cols: int = max(cassette.tower_stats.features.size(), cassette.weapon_stats.features.size()) diff --git a/Scenes/Menus/singleplayer_lobby.tscn b/Scenes/Menus/singleplayer_lobby.tscn index 1a699c2..285e0f5 100644 --- a/Scenes/Menus/singleplayer_lobby.tscn +++ b/Scenes/Menus/singleplayer_lobby.tscn @@ -10,7 +10,7 @@ random_pitch = 1.1 streams_count = 1 stream_0/stream = ExtResource("6_6nu57") -[node name="singleplayer_lobby" type="Control" node_paths=PackedStringArray("chatbox", "audio_player")] +[node name="singleplayer_lobby" type="Control" node_paths=PackedStringArray("audio_player")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -20,18 +20,8 @@ grow_vertical = 2 mouse_filter = 2 script = ExtResource("1_nd17k") character_select_screen = ExtResource("6_ltm04") -chatbox = NodePath("Chatbox") audio_player = NodePath("AudioStreamPlayer") - -[node name="Chatbox" parent="." instance=ExtResource("3_l8xy3")] -layout_mode = 1 -anchors_preset = -1 -anchor_left = 0.02 -anchor_top = 0.65 -anchor_right = 0.4 -anchor_bottom = 0.98 -grow_horizontal = 1 -grow_vertical = 1 +chatbox_scene = ExtResource("3_l8xy3") [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] stream = SubResource("AudioStreamRandomizer_g5har") diff --git a/Scenes/MixingTable/remix_table.gd b/Scenes/MixingTable/remix_table.gd index 7591324..d08d920 100644 --- a/Scenes/MixingTable/remix_table.gd +++ b/Scenes/MixingTable/remix_table.gd @@ -29,7 +29,7 @@ func _on_static_body_3d_button_interacted(_value: int, callback: Hero) -> void: func output(cards_to_remove: Array[Card], cards_to_add: Array[Card], amount_spent: int) -> void: for card: Card in cards_to_remove: reply_player.hand.contents.erase(card) - reply_player.check_removal() + reply_player.hud.hot_wheel.update_cassettes(reply_player.get_wheel_cards()) for card: Card in cards_to_add: reply_player.add_card(card) reply_player.currency -= amount_spent diff --git a/Scripts/game.gd b/Scripts/game.gd index 4ee71c7..65c0755 100644 --- a/Scripts/game.gd +++ b/Scripts/game.gd @@ -16,7 +16,7 @@ signal switch_to_main_menu var root_scene: Node var level_scene: PackedScene = load("res://Worlds/GreenPlanet/Levels/Bridge/bridge.tscn") var player_scene: PackedScene = load("res://PCs/hero.tscn") -var game_end_scene: PackedScene = load("res://Scenes/Menus/GameEndScreen/game_end_screen.tscn") +var game_end_scene: PackedScene = load("res://UI/Menus/GameEndScreen/game_end_screen.tscn") var connected_players_nodes: Dictionary = {} var game_active: bool = false var gamemode: GameMode = null @@ -157,11 +157,37 @@ func spawn_enemy_wave() -> void: wave_started.emit() +func pre_generate_waves() -> Array[Wave]: + var wave_list: Array[Wave] = [] + for i: int in range(wave, wave_limit + 1): + var spawn_power: int = WaveManager.calculate_spawn_power(i, connected_players_nodes.size()) + var generated_wave: Wave = WaveManager.generate_wave(spawn_power, level.enemy_pool) + wave_list.append(generated_wave) + return wave_list + + +func set_wave_to_spawners(wave_thing: Wave, wave_number: int) -> void: + var spawners: Array[EnemySpawner] = level.enemy_spawns + var ground_spawners: Array[EnemySpawner] = [] + var air_spawners: Array[EnemySpawner] = [] + for spawner: EnemySpawner in spawners: + if spawner.type == Data.EnemyType.LAND: + ground_spawners.append(spawner) + else: + air_spawners.append(spawner) + for card: EnemyCard in wave_thing.enemy_groups: + if card.enemy.target_type == Data.EnemyType.LAND: + ground_spawners[NoiseRandom.randi_in_range(wave_number, 0, ground_spawners.size() - 1)].add_card(card) + else: + air_spawners[NoiseRandom.randi_in_range(wave_number, 0, air_spawners.size() - 1)].add_card(card) + + func set_upcoming_wave() -> void: if is_multiplayer_authority(): var spawn_power: int = WaveManager.calculate_spawn_power(wave, connected_players_nodes.size()) #var new_wave: Dictionary = WaveManager.generate_wave(spawn_power, level.enemy_pool) - var new_wave: Wave = WaveManager.generate_wave(spawn_power, level.enemy_pool, level.enemy_spawns) + var new_wave: Wave = WaveManager.generate_wave(spawn_power, level.enemy_pool) + set_wave_to_spawners(new_wave, wave) temp_set_upcoming_wave(new_wave, WaveManager.calculate_pot(wave, connected_players_nodes.size())) #networked_set_upcoming_wave.rpc(new_wave, 6 + floori(spawn_power / 70.0)) diff --git a/Scripts/lobby.gd b/Scripts/lobby.gd index 67bc3e6..a26440d 100644 --- a/Scripts/lobby.gd +++ b/Scripts/lobby.gd @@ -2,10 +2,9 @@ class_name Lobby extends Control @export var character_select_screen: PackedScene -#@export var scoreboard: Scoreboard @export var chatbox: Chatbox -#@export var ready_button: Button @export var audio_player: AudioStreamPlayer +@export var chatbox_scene: PackedScene var game_manager: GameManager var gamemode: GameMode = null @@ -14,19 +13,19 @@ var connected_players_profiles: Dictionary = {} var enet_peer: ENetMultiplayerPeer = ENetMultiplayerPeer.new() func setup_the_ui() -> void: - #scoreboard.unready_all_players() - #scoreboard.set_visible(true) - loadout_editor.set_visible(true) + chatbox = chatbox_scene.instantiate() + game_manager.UILayer.add_child(chatbox) chatbox.set_visible(true) chatbox.game_manager = game_manager - #ready_button.set_visible(true) + chatbox.anchor_bottom = 0.98 + chatbox.anchor_left = 0.02 + chatbox.anchor_top = 0.7 + chatbox.anchor_right = 0.4 func start_game() -> void: game_manager.setup() - #scoreboard.set_visible(false) loadout_editor.queue_free() - #ready_button.set_visible(false) game_manager.connected_player_profiles = connected_players_profiles game_manager.start() diff --git a/Scripts/noise_random.gd b/Scripts/noise_random.gd index cf1d525..fcca5ce 100644 --- a/Scripts/noise_random.gd +++ b/Scripts/noise_random.gd @@ -12,7 +12,7 @@ static func set_seed(value: int) -> void: noise.fractal_gain = 0.1 noise.seed = value - +## output_end is inclusive static func randi_in_range(sample: float, output_start: int, output_end: int) -> int: return floori(remap(noise.get_noise_1d(sample), -1.0, 1.0, float(output_start), float(output_end + 1))) diff --git a/Scripts/singleplayer_lobby.gd b/Scripts/singleplayer_lobby.gd index 65f8e9c..97e951d 100644 --- a/Scripts/singleplayer_lobby.gd +++ b/Scripts/singleplayer_lobby.gd @@ -17,4 +17,3 @@ func setup_game() -> void: Data.player_profile.display_name_changed.connect(chatbox.change_username) loadout_editor.hero_selected.connect(Data.player_profile.set_preferred_class) connected_players_profiles[1] = Data.player_profile - setup_the_ui() diff --git a/Scripts/wave_manager.gd b/Scripts/wave_manager.gd index f3e5cf5..652f1f9 100644 --- a/Scripts/wave_manager.gd +++ b/Scripts/wave_manager.gd @@ -25,17 +25,16 @@ static func calculate_pot(wave_number: int, number_of_players: int) -> int: ## Uses a spawn power budget to "buy" cards of enemies at random selection from ## the given spawn pool, returns the resulting wave but also assigns the cards ## among the given set of enemy spawners -static func generate_wave(spawn_power: int, spawn_pool: Array[Enemy], spawners: Array[EnemySpawner]) -> Wave: +static func generate_wave(spawn_power: int, spawn_pool: Array[Enemy]) -> Wave: var wave: Wave = Wave.new() - + var points: int = int(spawn_power / 10.0) #print("Generating wave with " + str(points) + " points to spend") while points > 0: var new_card: EnemyCard = EnemyCard.new() #First, choose an enemy at random - #TODO: Use seeded random - new_card.enemy = spawn_pool.pick_random() + new_card.enemy = spawn_pool[NoiseRandom.randi_in_range(spawn_power, 0, spawn_pool.size() - 1)] #Next, we have to figure out if we can actually buy that enemy #and, if not, then we have to pick a different enemy, repeat until @@ -71,7 +70,7 @@ static func generate_wave(spawn_power: int, spawn_pool: Array[Enemy], spawners: #Now that we know which rarities we could afford, lets just choose a #random one - var chosen_rarity: int = randi_range(0, highest_rarity) + var chosen_rarity: int = NoiseRandom.randi_in_range(spawn_power, 0, highest_rarity) new_card.rarity = chosen_rarity as Data.Rarity #Add that new enemy to the wave and spend the points! @@ -86,18 +85,4 @@ static func generate_wave(spawn_power: int, spawn_pool: Array[Enemy], spawners: points -= new_card.enemy.epic_cost elif chosen_rarity == Data.Rarity.LEGENDARY: points -= new_card.enemy.legendary_cost - - var ground_spawners: Array[EnemySpawner] = [] - var air_spawners: Array[EnemySpawner] = [] - for spawner: EnemySpawner in spawners: - if spawner.type == Data.EnemyType.LAND: - ground_spawners.append(spawner) - else: - air_spawners.append(spawner) - for card: EnemyCard in wave.enemy_groups: - if card.enemy.target_type == Data.EnemyType.LAND: - #TODO: make this use determinisic noise rng - ground_spawners.pick_random().add_card(card) - else: - air_spawners.pick_random().add_card(card) return wave diff --git a/UI/Menus/GameEndScreen/enemy_row.gd b/UI/Menus/GameEndScreen/enemy_row.gd index 7c59196..7bbd2ed 100644 --- a/UI/Menus/GameEndScreen/enemy_row.gd +++ b/UI/Menus/GameEndScreen/enemy_row.gd @@ -1,20 +1,27 @@ -class_name EnemyBox -extends HBoxContainer +class_name EnemyRow +extends VBoxContainer + +@export var wave_label: Label +@export var enemy_hbox: HBoxContainer func set_wave(wave: int) -> void: - $WaveLabel.text = tr("LABEL_WAVE").format({Wave_Number = str(wave)}) + wave_label.text = tr("LABEL_WAVE").format({Wave_Number = str(wave)}) func add_enemy_tag(enemy: Enemy, num: int) -> void: - for x: int in num: - var enemy_tex: TextureRect = TextureRect.new() - enemy_tex.texture = enemy.sprite - enemy_tex.custom_minimum_size = Vector2(80, 80) - add_child(enemy_tex) - #var name_label: Label = Label.new() - #name_label.text = enemy.title - #var num_label: Label = Label.new() - #num_label.text = str(num) - #add_child(name_label) - #add_child(num_label) + var container: MarginContainer = MarginContainer.new() + enemy_hbox.add_child(container) + var enemy_tex: TextureRect = TextureRect.new() + enemy_tex.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + enemy_tex.texture = enemy.icon + enemy_tex.custom_minimum_size = Vector2(32, 32) + enemy_tex.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + container.add_child(enemy_tex) + var amount_label: Label = Label.new() + amount_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + amount_label.size_flags_vertical = Control.SIZE_EXPAND_FILL + amount_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT + amount_label.vertical_alignment = VERTICAL_ALIGNMENT_BOTTOM + amount_label.text = str(num) + container.add_child(amount_label) diff --git a/UI/Menus/GameEndScreen/enemy_row.tscn b/UI/Menus/GameEndScreen/enemy_row.tscn index 8335029..2dff9f7 100644 --- a/UI/Menus/GameEndScreen/enemy_row.tscn +++ b/UI/Menus/GameEndScreen/enemy_row.tscn @@ -2,9 +2,19 @@ [ext_resource type="Script" uid="uid://b0h5oewxd48lv" path="res://UI/Menus/GameEndScreen/enemy_row.gd" id="1_th4b3"] -[node name="EnemyRow" type="HBoxContainer"] +[node name="EnemyRow" type="VBoxContainer" node_paths=PackedStringArray("wave_label", "enemy_hbox")] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 script = ExtResource("1_th4b3") +wave_label = NodePath("WaveLabel") +enemy_hbox = NodePath("Enemies") [node name="WaveLabel" type="Label" parent="."] layout_mode = 2 text = "LABEL_WAVE" + +[node name="Enemies" type="HBoxContainer" parent="."] +layout_mode = 2 diff --git a/UI/Menus/GameEndScreen/game_end_screen.gd b/UI/Menus/GameEndScreen/game_end_screen.gd index dfa757b..24de5bc 100644 --- a/UI/Menus/GameEndScreen/game_end_screen.gd +++ b/UI/Menus/GameEndScreen/game_end_screen.gd @@ -23,7 +23,7 @@ func _ready() -> void: func set_wave() -> void: for wave_key: int in game_manager.stats.enemies_undefeated: - var spawned_box: EnemyBox = box.instantiate() as EnemyBox + var spawned_box: EnemyRow = box.instantiate() as EnemyRow undefeated_enemies.add_child(spawned_box) spawned_box.set_wave(wave_key) for enemy_key: Enemy in game_manager.stats.enemies_undefeated[wave_key]: diff --git a/UI/Menus/GameEndScreen/game_end_screen.tscn b/UI/Menus/GameEndScreen/game_end_screen.tscn index 4d40671..c2f97e6 100644 --- a/UI/Menus/GameEndScreen/game_end_screen.tscn +++ b/UI/Menus/GameEndScreen/game_end_screen.tscn @@ -10,13 +10,11 @@ streams_count = 1 stream_0/stream = ExtResource("3_ro1yg") [node name="GameEndScreen" type="PanelContainer" node_paths=PackedStringArray("outcome_label", "winrate_label", "total_games_label", "total_wins_label", "total_losses_label", "undefeated_enemies")] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 150.0 -offset_top = 100.0 -offset_right = -150.0 -offset_bottom = -100.0 +anchors_preset = -1 +anchor_left = 0.05 +anchor_top = 0.05 +anchor_right = 0.95 +anchor_bottom = 0.95 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_oa7nq") @@ -26,14 +24,13 @@ winrate_label = NodePath("VBoxContainer/Labels/VBoxContainer/HBoxContainer/WinRa total_games_label = NodePath("VBoxContainer/Labels/VBoxContainer/HBoxContainer2/WinRateLabel3") total_wins_label = NodePath("VBoxContainer/Labels/VBoxContainer/HBoxContainer3/WinRateLabel4") total_losses_label = NodePath("VBoxContainer/Labels/VBoxContainer/HBoxContainer4/WinRateLabel5") -undefeated_enemies = NodePath("VBoxContainer/UndefeatedEnemies") +undefeated_enemies = NodePath("VBoxContainer/ScrollContainer/UndefeatedEnemies") [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 2 [node name="Labels" type="VBoxContainer" parent="VBoxContainer"] layout_mode = 2 -size_flags_vertical = 3 alignment = 1 [node name="OutcomeLabel" type="Label" parent="VBoxContainer/Labels"] @@ -114,7 +111,11 @@ text = "0" horizontal_alignment = 2 vertical_alignment = 1 -[node name="UndefeatedEnemies" type="VBoxContainer" parent="VBoxContainer"] +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="UndefeatedEnemies" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"] layout_mode = 2 size_flags_vertical = 3 diff --git a/UI/ShieldUI/shield_ui.gd b/UI/ShieldUI/shield_ui.gd index 5d88bf5..d05da62 100644 --- a/UI/ShieldUI/shield_ui.gd +++ b/UI/ShieldUI/shield_ui.gd @@ -7,9 +7,17 @@ extends Control const CELL_HEALTH: int = 9 +var fading_enabled: bool = true var health: int = 144 var current_cell_health: int = CELL_HEALTH var fade_tween: Tween +var cell_tweens: Array[Tween] = [] + + +func _ready() -> void: + for x: int in cells.size(): + cell_tweens.append(null) + fade_timer.start() func take_damage(damage: int) -> void: @@ -24,6 +32,8 @@ func take_damage(damage: int) -> void: current_cell_health -= damage_to_deal_with var cell_level: int = health % 9 if remaining_damage > 0: ## This cell should be empty because the damage overran the cell + if cell_tweens[current_cell - 1]: + cell_tweens[current_cell - 1].kill() cell_level = 3 current_cell_health = CELL_HEALTH change_cell_color(current_cell - 1, cell_level) @@ -39,24 +49,29 @@ func take_damage(damage: int) -> void: else: ## This cell should be full health cell_level = 0 hit_glow.texture.region.position.x = 66.0 * (16 - current_cell) - var tween: Tween = create_tween() - tween.tween_callback(func() -> void: hit_glow.visible = true) - tween.tween_interval(0.07) - tween.tween_callback(func() -> void: hit_glow.visible = false) - tween.tween_interval(0.07) - tween.tween_callback(func() -> void: hit_glow.visible = true) - tween.tween_callback(change_cell_color.bind(current_cell - 1, cell_level)) - tween.tween_interval(0.07) - tween.tween_callback(func() -> void: hit_glow.visible = false) + if cell_tweens[current_cell - 1]: + cell_tweens[current_cell - 1].kill() + cell_tweens[current_cell - 1] = create_tween() + cell_tweens[current_cell - 1].tween_callback(func() -> void: hit_glow.visible = true) + cell_tweens[current_cell - 1].tween_interval(0.07) + cell_tweens[current_cell - 1].tween_callback(func() -> void: hit_glow.visible = false) + cell_tweens[current_cell - 1].tween_interval(0.07) + cell_tweens[current_cell - 1].tween_callback(func() -> void: hit_glow.visible = true) + cell_tweens[current_cell - 1].tween_callback(change_cell_color.bind(current_cell - 1, cell_level)) + cell_tweens[current_cell - 1].tween_interval(0.07) + cell_tweens[current_cell - 1].tween_callback(func() -> void: hit_glow.visible = false) fade_timer.start() func change_cell_color(cell: int, color: int) -> void: - cells[15 - cell].texture.region.position.x = 66.0 * color + var cell_to_change: int = 15 - cell + if cell_to_change >= 0 and cell_to_change < cells.size(): + cells[15 - cell].texture.region.position.x = 66.0 * color func fade_out() -> void: if fade_tween: fade_tween.kill() - fade_tween = create_tween() - fade_tween.tween_property(self, "modulate", Color8(255, 255, 255, 0), 1.0) + if fading_enabled: + fade_tween = create_tween() + fade_tween.tween_property(self, "modulate", Color8(255, 255, 255, 0), 1.0) diff --git a/UI/ShieldUI/shield_ui.tscn b/UI/ShieldUI/shield_ui.tscn index 9cbc53a..3713d2a 100644 --- a/UI/ShieldUI/shield_ui.tscn +++ b/UI/ShieldUI/shield_ui.tscn @@ -74,7 +74,6 @@ atlas = ExtResource("4_yanml") region = Rect2(0, 0, 66, 66) [node name="ShieldUI" type="Control" node_paths=PackedStringArray("cells", "hit_glow", "fade_timer")] -modulate = Color(1, 1, 1, 0) layout_mode = 3 anchors_preset = 0 script = ExtResource("1_aa64g") diff --git a/UI/Themes/Scale1/grabber_disabled_tex.tres b/UI/Themes/Scale1/grabber_disabled_tex.tres new file mode 100644 index 0000000..1e82d96 --- /dev/null +++ b/UI/Themes/Scale1/grabber_disabled_tex.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://c1xm8bkvho3vl"] + +[ext_resource type="Texture2D" uid="uid://b5h32okh8yu6f" path="res://ui_atlas.png" id="1_466t2"] + +[resource] +atlas = ExtResource("1_466t2") +region = Rect2(79, 1, 8, 8) diff --git a/UI/Themes/Scale1/grabber_tex.tres b/UI/Themes/Scale1/grabber_tex.tres new file mode 100644 index 0000000..efda8ce --- /dev/null +++ b/UI/Themes/Scale1/grabber_tex.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://cuwhoitu6ybba"] + +[ext_resource type="Texture2D" uid="uid://b5h32okh8yu6f" path="res://ui_atlas.png" id="1_74qo4"] + +[resource] +atlas = ExtResource("1_74qo4") +region = Rect2(62, 1, 8, 8) diff --git a/UI/Themes/Scale1/h_scroll_bar.tres b/UI/Themes/Scale1/h_scroll_bar.tres new file mode 100644 index 0000000..2919c68 --- /dev/null +++ b/UI/Themes/Scale1/h_scroll_bar.tres @@ -0,0 +1,15 @@ +[gd_resource type="StyleBoxTexture" load_steps=3 format=3 uid="uid://duopp63rij323"] + +[ext_resource type="Texture2D" uid="uid://b5h32okh8yu6f" path="res://ui_atlas.png" id="1_73g4w"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_okcqu"] +atlas = ExtResource("1_73g4w") +region = Rect2(62, 10, 8, 8) + +[resource] +texture = SubResource("AtlasTexture_okcqu") +texture_margin_left = 2.0 +texture_margin_top = 4.0 +texture_margin_right = 2.0 +texture_margin_bottom = 4.0 +region_rect = Rect2(0, 0, 8, 8) diff --git a/UI/Themes/Scale1/h_scroll_grabber.tres b/UI/Themes/Scale1/h_scroll_grabber.tres new file mode 100644 index 0000000..0b4b13c --- /dev/null +++ b/UI/Themes/Scale1/h_scroll_grabber.tres @@ -0,0 +1,15 @@ +[gd_resource type="StyleBoxTexture" load_steps=3 format=3 uid="uid://dlnw55uearhrg"] + +[ext_resource type="Texture2D" uid="uid://b5h32okh8yu6f" path="res://ui_atlas.png" id="1_xum1s"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_noue1"] +atlas = ExtResource("1_xum1s") +region = Rect2(62, 1, 8, 8) + +[resource] +texture = SubResource("AtlasTexture_noue1") +texture_margin_left = 2.0 +texture_margin_right = 2.0 +expand_margin_left = 2.0 +expand_margin_right = 2.0 +region_rect = Rect2(0, 0, 8, 8) diff --git a/UI/Themes/Scale1/popup_item_hover.tres b/UI/Themes/Scale1/popup_item_hover.tres new file mode 100644 index 0000000..6249109 --- /dev/null +++ b/UI/Themes/Scale1/popup_item_hover.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=3 format=3 uid="uid://co6ouoi7ieawj"] + +[ext_resource type="Texture2D" uid="uid://b5h32okh8yu6f" path="res://ui_atlas.png" id="1_slo62"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_xobyj"] +atlas = ExtResource("1_slo62") +region = Rect2(10, 10, 9, 9) + +[resource] +texture = SubResource("AtlasTexture_xobyj") +texture_margin_left = 3.0 +texture_margin_top = 3.0 +texture_margin_right = 3.0 +texture_margin_bottom = 3.0 diff --git a/UI/Themes/Scale1/psx_ui.tres b/UI/Themes/Scale1/psx_ui.tres index 8c8a0c6..97a44bf 100644 --- a/UI/Themes/Scale1/psx_ui.tres +++ b/UI/Themes/Scale1/psx_ui.tres @@ -1,4 +1,4 @@ -[gd_resource type="Theme" load_steps=36 format=3 uid="uid://jn4qqx5hxc5i"] +[gd_resource type="Theme" load_steps=42 format=3 uid="uid://jn4qqx5hxc5i"] [ext_resource type="StyleBox" uid="uid://doxcjij1w2ot7" path="res://UI/Themes/Scale1/button_disabled.tres" id="1_ts3pc"] [ext_resource type="StyleBox" uid="uid://buu2yn08s4wc7" path="res://UI/Themes/Scale1/button_focus.tres" id="1_vnhdr"] @@ -10,9 +10,16 @@ [ext_resource type="StyleBox" uid="uid://bfuea1sjymo8g" path="res://UI/Themes/Scale1/pane_style_box.tres" id="6_w151p"] [ext_resource type="StyleBox" uid="uid://jnnnhb3i2265" path="res://UI/Themes/Scale1/switch_side_b_style_box.tres" id="7_w8nmj"] [ext_resource type="StyleBox" uid="uid://cm3wsvk3woory" path="res://UI/Themes/Scale1/switch_side_a_style_box.tres" id="8_8j1wx"] +[ext_resource type="StyleBox" uid="uid://dlnw55uearhrg" path="res://UI/Themes/Scale1/h_scroll_grabber.tres" id="8_b5n6m"] [ext_resource type="StyleBox" uid="uid://bss3dp7k18rx0" path="res://UI/Themes/Scale1/grabber_area.tres" id="8_o6p3e"] +[ext_resource type="Texture2D" uid="uid://cuwhoitu6ybba" path="res://UI/Themes/Scale1/grabber_tex.tres" id="8_t2hcr"] +[ext_resource type="Texture2D" uid="uid://c1xm8bkvho3vl" path="res://UI/Themes/Scale1/grabber_disabled_tex.tres" id="9_n5i54"] [ext_resource type="StyleBox" uid="uid://bpowvv8e13flg" path="res://UI/Themes/Scale1/slider.tres" id="9_w151p"] -[ext_resource type="StyleBox" uid="uid://8s0fgx46n145" path="res://UI/Themes/Scale1/scroll_grabber.tres" id="13_w151p"] +[ext_resource type="StyleBox" uid="uid://duopp63rij323" path="res://UI/Themes/Scale1/h_scroll_bar.tres" id="9_xqncf"] +[ext_resource type="Texture2D" uid="uid://d3bbst30pgfgy" path="res://UI/Themes/Scale1/slider_tick_tex.tres" id="10_08ul3"] +[ext_resource type="StyleBox" uid="uid://co6ouoi7ieawj" path="res://UI/Themes/Scale1/popup_item_hover.tres" id="16_xqncf"] +[ext_resource type="StyleBox" uid="uid://8s0fgx46n145" path="res://UI/Themes/Scale1/v_scroll_grabber.tres" id="18_nis8m"] +[ext_resource type="StyleBox" uid="uid://c4cljq7yl78eg" path="res://UI/Themes/Scale1/v_scroll_bar.tres" id="19_aggbr"] [sub_resource type="AtlasTexture" id="AtlasTexture_845oj"] atlas = ExtResource("6_43i8g") @@ -26,27 +33,35 @@ region = Rect2(46, 1, 15, 8) base_font = ExtResource("5_o6p3e") baseline_offset = 0.15 -[sub_resource type="AtlasTexture" id="AtlasTexture_w8nmj"] -atlas = ExtResource("6_43i8g") -region = Rect2(62, 1, 8, 8) - -[sub_resource type="AtlasTexture" id="AtlasTexture_t2hcr"] -atlas = ExtResource("6_43i8g") -region = Rect2(79, 1, 8, 8) - -[sub_resource type="AtlasTexture" id="AtlasTexture_8j1wx"] -atlas = ExtResource("6_43i8g") -region = Rect2(62, 1, 8, 8) - -[sub_resource type="AtlasTexture" id="AtlasTexture_w151p"] -atlas = ExtResource("6_43i8g") -region = Rect2(75, 4, 2, 2) - [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_t2hcr"] +[sub_resource type="AtlasTexture" id="AtlasTexture_noue1"] +atlas = ExtResource("6_43i8g") +region = Rect2(98, 4, 8, 5) + [sub_resource type="FontVariation" id="FontVariation_inyly"] base_font = ExtResource("5_o6p3e") +[sub_resource type="AtlasTexture" id="AtlasTexture_k1p2l"] +atlas = ExtResource("6_43i8g") +region = Rect2(62, 1, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qa24s"] +atlas = ExtResource("6_43i8g") +region = Rect2(62, 10, 8, 8) + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_xqncf"] +content_margin_left = 2.0 +content_margin_top = 2.0 +content_margin_right = 2.0 +content_margin_bottom = 2.0 + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_nis8m"] +content_margin_left = 2.0 +content_margin_top = 2.0 +content_margin_right = 2.0 +content_margin_bottom = 2.0 + [sub_resource type="AtlasTexture" id="AtlasTexture_n5i54"] atlas = ExtResource("6_43i8g") region = Rect2(98, 4, 8, 5) @@ -82,18 +97,6 @@ region = Rect2(89, 7, 8, 5) [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ts3pc"] content_margin_top = 2.0 -[sub_resource type="AtlasTexture" id="AtlasTexture_okcqu"] -atlas = ExtResource("6_43i8g") -region = Rect2(62, 10, 8, 8) - -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_qa24s"] -texture = SubResource("AtlasTexture_okcqu") -texture_margin_left = 4.0 -texture_margin_top = 2.0 -texture_margin_right = 4.0 -texture_margin_bottom = 2.0 -region_rect = Rect2(0, 0, 8, 8) - [resource] Button/colors/font_color = Color(0.85490197, 0.8784314, 0.91764706, 1) Button/colors/font_disabled_color = Color(0.85882354, 0.6431373, 0.3882353, 1) @@ -109,10 +112,14 @@ CheckButton/icons/unchecked = SubResource("AtlasTexture_o6p3e") Control/constants/outline_size = 4 Control/font_sizes/font_size = 8 Control/fonts/font = SubResource("FontVariation_b02pe") -HSlider/icons/grabber = SubResource("AtlasTexture_w8nmj") -HSlider/icons/grabber_disabled = SubResource("AtlasTexture_t2hcr") -HSlider/icons/grabber_highlight = SubResource("AtlasTexture_8j1wx") -HSlider/icons/tick = SubResource("AtlasTexture_w151p") +HScrollBar/styles/grabber = ExtResource("8_b5n6m") +HScrollBar/styles/grabber_highlight = ExtResource("8_b5n6m") +HScrollBar/styles/grabber_pressed = ExtResource("8_b5n6m") +HScrollBar/styles/scroll = ExtResource("9_xqncf") +HSlider/icons/grabber = ExtResource("8_t2hcr") +HSlider/icons/grabber_disabled = ExtResource("9_n5i54") +HSlider/icons/grabber_highlight = ExtResource("8_t2hcr") +HSlider/icons/tick = ExtResource("10_08ul3") HSlider/styles/grabber_area = ExtResource("8_o6p3e") HSlider/styles/grabber_area_highlight = ExtResource("8_o6p3e") HSlider/styles/slider = ExtResource("9_w151p") @@ -121,13 +128,19 @@ Label/font_sizes/font_size = 8 Label/fonts/font = ExtResource("5_o6p3e") LineEdit/styles/focus = ExtResource("1_vnhdr") LineEdit/styles/normal = SubResource("StyleBoxEmpty_t2hcr") +OptionButton/icons/arrow = SubResource("AtlasTexture_noue1") PanelContainer/styles/panel = ExtResource("6_w151p") PopupMenu/constants/outline_size = 4 PopupMenu/font_sizes/font_size = 8 PopupMenu/fonts/font = SubResource("FontVariation_inyly") +PopupMenu/icons/radio_checked = SubResource("AtlasTexture_k1p2l") +PopupMenu/icons/radio_unchecked = SubResource("AtlasTexture_qa24s") +PopupMenu/styles/hover = ExtResource("16_xqncf") PopupMenu/styles/panel = ExtResource("6_w151p") RichTextLabel/font_sizes/normal_font_size = 8 RichTextLabel/fonts/normal_font = ExtResource("5_o6p3e") +RichTextLabel/styles/normal = SubResource("StyleBoxEmpty_xqncf") +ScrollContainer/styles/panel = SubResource("StyleBoxEmpty_nis8m") SideCheckButton/base_type = &"Button" SideCheckButton/colors/font_color = Color(0.8392157, 0.8392157, 0.8392157, 1) SideCheckButton/colors/font_hover_color = Color(1, 1, 1, 1) @@ -155,10 +168,17 @@ TabContainer/styles/tab_focus = ExtResource("1_vnhdr") TabContainer/styles/tab_hovered = ExtResource("2_ts3pc") TabContainer/styles/tab_selected = ExtResource("4_845oj") TabContainer/styles/tab_unselected = ExtResource("3_43i8g") -VScrollBar/styles/grabber = ExtResource("13_w151p") -VScrollBar/styles/grabber_highlight = ExtResource("13_w151p") -VScrollBar/styles/grabber_pressed = ExtResource("13_w151p") -VScrollBar/styles/scroll = SubResource("StyleBoxTexture_qa24s") +VScrollBar/styles/grabber = ExtResource("18_nis8m") +VScrollBar/styles/grabber_highlight = ExtResource("18_nis8m") +VScrollBar/styles/grabber_pressed = ExtResource("18_nis8m") +VScrollBar/styles/scroll = ExtResource("19_aggbr") +VSlider/icons/grabber = ExtResource("8_t2hcr") +VSlider/icons/grabber_disabled = ExtResource("9_n5i54") +VSlider/icons/grabber_highlight = ExtResource("8_t2hcr") +VSlider/icons/tick = ExtResource("10_08ul3") +VSlider/styles/grabber_area = ExtResource("8_o6p3e") +VSlider/styles/grabber_area_highlight = ExtResource("8_o6p3e") +VSlider/styles/slider = ExtResource("9_w151p") VersionLabel/base_type = &"Label" VersionLabel/colors/font_color = Color(0.85, 0.85, 0.85, 0.7) VersionLabel/font_sizes/font_size = 8 diff --git a/UI/Themes/Scale1/slider.tres b/UI/Themes/Scale1/slider.tres index 9c7fd8b..a54ee2a 100644 --- a/UI/Themes/Scale1/slider.tres +++ b/UI/Themes/Scale1/slider.tres @@ -8,6 +8,7 @@ region = Rect2(75, 4, 2, 2) [resource] content_margin_top = 2.0 +content_margin_right = 2.0 texture = SubResource("AtlasTexture_uj2su") axis_stretch_horizontal = 1 axis_stretch_vertical = 1 diff --git a/UI/Themes/Scale1/slider_tick_tex.tres b/UI/Themes/Scale1/slider_tick_tex.tres new file mode 100644 index 0000000..d328ff6 --- /dev/null +++ b/UI/Themes/Scale1/slider_tick_tex.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://d3bbst30pgfgy"] + +[ext_resource type="Texture2D" uid="uid://b5h32okh8yu6f" path="res://ui_atlas.png" id="1_gfpkm"] + +[resource] +atlas = ExtResource("1_gfpkm") +region = Rect2(75, 4, 2, 2) diff --git a/UI/Themes/Scale1/v_scroll_bar.tres b/UI/Themes/Scale1/v_scroll_bar.tres new file mode 100644 index 0000000..8c46118 --- /dev/null +++ b/UI/Themes/Scale1/v_scroll_bar.tres @@ -0,0 +1,15 @@ +[gd_resource type="StyleBoxTexture" load_steps=3 format=3 uid="uid://c4cljq7yl78eg"] + +[ext_resource type="Texture2D" uid="uid://b5h32okh8yu6f" path="res://ui_atlas.png" id="1_qpij5"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_okcqu"] +atlas = ExtResource("1_qpij5") +region = Rect2(62, 10, 8, 8) + +[resource] +texture = SubResource("AtlasTexture_okcqu") +texture_margin_left = 4.0 +texture_margin_top = 2.0 +texture_margin_right = 4.0 +texture_margin_bottom = 2.0 +region_rect = Rect2(0, 0, 8, 8) diff --git a/UI/Themes/Scale1/scroll_grabber.tres b/UI/Themes/Scale1/v_scroll_grabber.tres similarity index 87% rename from UI/Themes/Scale1/scroll_grabber.tres rename to UI/Themes/Scale1/v_scroll_grabber.tres index 19ea065..e0b1509 100644 --- a/UI/Themes/Scale1/scroll_grabber.tres +++ b/UI/Themes/Scale1/v_scroll_grabber.tres @@ -1,9 +1,9 @@ [gd_resource type="StyleBoxTexture" load_steps=3 format=3 uid="uid://8s0fgx46n145"] -[ext_resource type="Texture2D" uid="uid://b5h32okh8yu6f" path="res://ui_atlas.png" id="1_pfcbc"] +[ext_resource type="Texture2D" uid="uid://b5h32okh8yu6f" path="res://ui_atlas.png" id="1_6syfe"] [sub_resource type="AtlasTexture" id="AtlasTexture_noue1"] -atlas = ExtResource("1_pfcbc") +atlas = ExtResource("1_6syfe") region = Rect2(62, 1, 8, 8) [resource] diff --git a/UI/card_description_ui.tscn b/UI/card_description_ui.tscn index c4480fe..eae0ba3 100644 --- a/UI/card_description_ui.tscn +++ b/UI/card_description_ui.tscn @@ -24,7 +24,6 @@ text = "LABEL_CARD_DESCRIPTION" [node name="DescriptionText" type="RichTextLabel" parent="."] auto_translate_mode = 2 -clip_contents = false layout_mode = 2 size_flags_vertical = 3 bbcode_enabled = true diff --git a/Worlds/GreenPlanet/Levels/Bridge/bridge.tscn b/Worlds/GreenPlanet/Levels/Bridge/bridge.tscn index 9647d93..8ee8e64 100644 --- a/Worlds/GreenPlanet/Levels/Bridge/bridge.tscn +++ b/Worlds/GreenPlanet/Levels/Bridge/bridge.tscn @@ -187,9 +187,9 @@ domain_warp_enabled = true [sub_resource type="NoiseTexture2D" id="NoiseTexture2D_r4es0"] width = 1024 height = 1024 -seamless = true -color_ramp = SubResource("Gradient_dj4cy") noise = SubResource("FastNoiseLite_ttr7n") +color_ramp = SubResource("Gradient_dj4cy") +seamless = true [sub_resource type="ShaderMaterial" id="ShaderMaterial_4gdda"] shader = SubResource("Shader_6od8s") @@ -230,6 +230,7 @@ fog_density = 0.0416 adjustment_contrast = 2.18 [sub_resource type="BoxShape3D" id="BoxShape3D_awjk1"] +size = Vector3(1, 1, 3) [sub_resource type="BoxShape3D" id="BoxShape3D_134um"] size = Vector3(70.0478, 1, 73.4615) @@ -261,7 +262,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.63136, 4.35346, 7.28324) curve = SubResource("Curve3D_3rdl2") [node name="PathFollow3D" type="PathFollow3D" parent="CinemaCam/Path3D"] -transform = Transform3D(0.05423, 0.161068, 0.98545, -7.45055e-09, 0.986902, -0.161305, -0.998524, 0.00874761, 0.05352, 12.3765, 1.00006, -13.0874) +transform = Transform3D(0.054230012, 0.1610678, 0.98545, -7.4505473e-09, 0.98690206, -0.16130519, -0.998524, 0.008747612, 0.05351996, 12.3765, 1.00006, -13.0874) loop = false [node name="Camera3D" type="Camera3D" parent="CinemaCam/Path3D/PathFollow3D"] @@ -274,7 +275,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.63136, 4.35346, 7.28324) curve = SubResource("Curve3D_2yu5t") [node name="PathFollow3D2" type="PathFollow3D" parent="CinemaCam/Path3D2"] -transform = Transform3D(-0.607018, -0.0329605, 0.793996, 0, 0.999137, 0.0414758, -0.794684, 0.0251768, -0.606492, 7.20375, 0.376301, -5.50257) +transform = Transform3D(-0.60701805, -0.03296049, 0.7939957, 0, 0.999137, 0.041475825, -0.79468393, 0.025176814, -0.6064923, 7.20375, 0.376301, -5.50257) loop = false [node name="Camera3D2" type="Camera3D" parent="CinemaCam/Path3D2/PathFollow3D2"] @@ -286,7 +287,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.63136, 4.35346, 7.28324) curve = SubResource("Curve3D_tuqlc") [node name="PathFollow3D2" type="PathFollow3D" parent="CinemaCam/Path3D3"] -transform = Transform3D(-4.37112e-08, -0.0254899, -0.99965, 0, 0.999656, -0.0254898, 0.999996, -1.1142e-09, -4.36961e-08, 8.763, 5.707, -7.5) +transform = Transform3D(-4.3711214e-08, -0.02548992, -0.99965, 0, 0.999656, -0.025489768, 0.999996, -1.1141998e-09, -4.3696087e-08, 8.762999, 5.707, -7.5) progress = 27.9321 loop = false @@ -310,7 +311,7 @@ size = Vector3(1, 4, 3) collision_mask = 4 [node name="CollisionShape3D" type="CollisionShape3D" parent="EnemyGoal/Area3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0.010131836) shape = SubResource("BoxShape3D_awjk1") [node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="EnemyGoal"] diff --git a/main.gd b/main.gd index c0f42d4..a90c687 100644 --- a/main.gd +++ b/main.gd @@ -4,7 +4,6 @@ extends Node signal loaded_scene @export var scene: Node -@export var ui_viewport: SubViewport @export var movies: Node var game_manager: GameManager @@ -18,8 +17,9 @@ var singleplayer_lobby_scene_path: String = "res://Scenes/Menus/singleplayer_lob func _ready() -> void: Engine.max_fps = 60 UILayer = CanvasLayer.new() + UILayer.name = "UILayer" UILayer.layer = 2 - ui_viewport.add_child.call_deferred(UILayer) + add_child.call_deferred(UILayer) var version_label: Label = Label.new() var version: String = ProjectSettings.get_setting("application/config/version") version_label.text = "WORK IN PROGRESS | ALPHA - VERSION " + version + " | PLAYTEST" @@ -58,6 +58,7 @@ func load_singleplayer() -> void: await loaded_scene var single_player_lobby: SinglePlayerLobby = scene.get_child(0) as SinglePlayerLobby single_player_lobby.game_manager = game_manager + single_player_lobby.setup_the_ui() single_player_lobby.setup_game() @@ -81,6 +82,6 @@ func load_scene(scene_path: String) -> void: if movies: movies.queue_free() movies = null - $CanvasLayer.visible = true + UILayer.visible = true scene.add_child(new_scene.instantiate()) loaded_scene.emit() diff --git a/main.tscn b/main.tscn index d4fa243..ad60d2e 100644 --- a/main.tscn +++ b/main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://d2k8y13qfvch0"] +[gd_scene load_steps=7 format=3 uid="uid://d2k8y13qfvch0"] [ext_resource type="Script" uid="uid://cx1xj7esl03ui" path="res://main.gd" id="2_h2yge"] [ext_resource type="Texture2D" uid="uid://6frn8lcwwehv" path="res://Assets/TextureAtlases/puppyfruit.png" id="2_lquwl"] @@ -9,19 +9,15 @@ atlas = ExtResource("2_lquwl") region = Rect2(0, 0, 256, 256) -[sub_resource type="ViewportTexture" id="ViewportTexture_1bvp3"] -viewport_path = NodePath("UI") - [sub_resource type="ShaderMaterial" id="ShaderMaterial_272bh"] shader = ExtResource("6_7mycd") shader_parameter/color_depth = 5 shader_parameter/dithering = true shader_parameter/resolution_scale = 1 -[node name="Main" type="Node" node_paths=PackedStringArray("scene", "ui_viewport", "movies")] +[node name="Main" type="Node" node_paths=PackedStringArray("scene", "movies")] script = ExtResource("2_h2yge") scene = NodePath("Scene") -ui_viewport = NodePath("UI") movies = NodePath("Movies") metadata/_custom_type_script = "uid://cx1xj7esl03ui" @@ -80,25 +76,10 @@ color = Color(0.192157, 0.415686, 0.223529, 1) [node name="Scene" type="Node" parent="."] -[node name="UI" type="SubViewport" parent="."] -transparent_bg = true -size = Vector2i(320, 240) - -[node name="CanvasLayer" type="CanvasLayer" parent="."] +[node name="PostProcessingLayer" type="CanvasLayer" parent="."] layer = 3 -[node name="TextureRect" type="TextureRect" parent="CanvasLayer"] -texture_filter = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -texture = SubResource("ViewportTexture_1bvp3") -expand_mode = 1 - -[node name="ColorRect2" type="ColorRect" parent="CanvasLayer"] +[node name="ColorRect2" type="ColorRect" parent="PostProcessingLayer"] material = SubResource("ShaderMaterial_272bh") anchors_preset = 15 anchor_right = 1.0 diff --git a/project.godot b/project.godot index a7a7016..255b10c 100644 --- a/project.godot +++ b/project.godot @@ -208,6 +208,11 @@ Pause={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":48,"key_label":0,"unicode":48,"location":0,"echo":false,"script":null) ] } +"Show Wave Preview"={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) +] +} [internationalization] diff --git a/shield_ui_test.gd b/shield_ui_test.gd new file mode 100644 index 0000000..b00a123 --- /dev/null +++ b/shield_ui_test.gd @@ -0,0 +1,29 @@ +extends Control + +@export var shield: ShieldUI +@export var lives_bar: LivesBar +@export var damage_label: Label + +var damage: int = 1 + + +func _ready() -> void: + shield.fading_enabled = false + + +func increase_damage() -> void: + damage += 1 + damage_label.text = str(damage) + + +func decrease_damage() -> void: + damage -= 1 + if damage < 1: + damage = 1 + damage_label.text = str(damage) + + +func hit() -> void: + shield.take_damage(damage) + for x: int in damage: + lives_bar.take_life() diff --git a/shield_ui_test.gd.uid b/shield_ui_test.gd.uid new file mode 100644 index 0000000..36a74fa --- /dev/null +++ b/shield_ui_test.gd.uid @@ -0,0 +1 @@ +uid://dhj7ck7ug6uoj diff --git a/shield_ui_test.tscn b/shield_ui_test.tscn new file mode 100644 index 0000000..bf27dea --- /dev/null +++ b/shield_ui_test.tscn @@ -0,0 +1,61 @@ +[gd_scene load_steps=4 format=3 uid="uid://5kypijhwjhok"] + +[ext_resource type="Script" uid="uid://dhj7ck7ug6uoj" path="res://shield_ui_test.gd" id="1_uywwg"] +[ext_resource type="PackedScene" uid="uid://cqslp83lf0ku0" path="res://UI/ShieldUI/shield_ui.tscn" id="2_iketu"] +[ext_resource type="PackedScene" uid="uid://24x18qxqhy0i" path="res://UI/lives_bar.tscn" id="3_eamca"] + +[node name="Control" type="Control" node_paths=PackedStringArray("shield", "lives_bar", "damage_label")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_uywwg") +shield = NodePath("ShieldUI") +lives_bar = NodePath("LivesBar") +damage_label = NodePath("Controls/Label") + +[node name="Controls" type="HBoxContainer" parent="."] +layout_mode = 0 +offset_left = 251.0 +offset_top = 13.0 +offset_right = 311.00003 +offset_bottom = 29.0 + +[node name="Label" type="Label" parent="Controls"] +layout_mode = 2 +text = "1" + +[node name="VBoxContainer" type="HBoxContainer" parent="Controls"] +layout_mode = 2 + +[node name="Button" type="Button" parent="Controls/VBoxContainer"] +layout_mode = 2 +text = "<" + +[node name="Button2" type="Button" parent="Controls/VBoxContainer"] +layout_mode = 2 +text = ">" + +[node name="Button" type="Button" parent="Controls"] +layout_mode = 2 +text = "hit" + +[node name="ShieldUI" parent="." instance=ExtResource("2_iketu")] +layout_mode = 0 +offset_left = 130.0 +offset_top = 31.0 +offset_right = 130.0 +offset_bottom = 31.0 + +[node name="LivesBar" parent="." instance=ExtResource("3_eamca")] +layout_mode = 1 +offset_left = 69.0 +offset_top = 115.0 +offset_right = 69.0 +offset_bottom = 115.0 + +[connection signal="pressed" from="Controls/VBoxContainer/Button" to="." method="decrease_damage"] +[connection signal="pressed" from="Controls/VBoxContainer/Button2" to="." method="increase_damage"] +[connection signal="pressed" from="Controls/Button" to="." method="hit"] diff --git a/wave_viewer.gd b/wave_viewer.gd new file mode 100644 index 0000000..c9e88cf --- /dev/null +++ b/wave_viewer.gd @@ -0,0 +1,47 @@ +class_name WaveViewer +extends Control + +signal closed() + +@export var wave_vbox: VBoxContainer +@export var enemy_row_scene: PackedScene + + +func set_waves(waves: Array[Wave], starting_wave_number: int) -> void: + var i: int = starting_wave_number + for wave: Wave in waves: + var enemy_row: EnemyRow = enemy_row_scene.instantiate() as EnemyRow + wave_vbox.add_child(enemy_row) + enemy_row.set_wave(i) + i += 1 + + var enemy_dict: Dictionary[Enemy, int] = {} + + for group: EnemyCard in wave.enemy_groups: + if enemy_dict.has(group.enemy): + enemy_dict[group.enemy] += group_to_count(group) + else: + enemy_dict[group.enemy] = group_to_count(group) + + for enemy: Enemy in enemy_dict.keys(): + enemy_row.add_enemy_tag(enemy, enemy_dict[enemy]) + + +func group_to_count(group: EnemyCard) -> int: + var count: int = 0 + if group.rarity == Data.Rarity.COMMON: + count += group.enemy.common_group + elif group.rarity == Data.Rarity.UNCOMMON: + count += group.enemy.uncommon_group + elif group.rarity == Data.Rarity.RARE: + count += group.enemy.rare_group + elif group.rarity == Data.Rarity.EPIC: + count += group.enemy.epic_group + elif group.rarity == Data.Rarity.LEGENDARY: + count += group.enemy.legendary_group + return count + + +func _on_button_2_pressed() -> void: + closed.emit() + queue_free() diff --git a/wave_viewer.gd.uid b/wave_viewer.gd.uid new file mode 100644 index 0000000..df44417 --- /dev/null +++ b/wave_viewer.gd.uid @@ -0,0 +1 @@ +uid://ps6sgjd0b5qr diff --git a/wave_viewer.tscn b/wave_viewer.tscn index e815ba9..16f4e2e 100644 --- a/wave_viewer.tscn +++ b/wave_viewer.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=4 format=3 uid="uid://ct6gic4shy5qw"] +[gd_scene load_steps=5 format=3 uid="uid://ct6gic4shy5qw"] -[ext_resource type="Texture2D" uid="uid://g00wwrlxxdc5" path="res://Assets/Textures/icon_eye_dog.png" id="1_0v4fq"] +[ext_resource type="Script" uid="uid://ps6sgjd0b5qr" path="res://wave_viewer.gd" id="1_0v4fq"] +[ext_resource type="PackedScene" uid="uid://b5hp43bm07b8a" path="res://UI/Menus/GameEndScreen/enemy_row.tscn" id="2_lbx3o"] [ext_resource type="Texture2D" uid="uid://3ywtwfpuuknr" path="res://Assets/Textures/leapfrog.png" id="2_tptaq"] [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_0v4fq"] @@ -9,13 +10,16 @@ content_margin_top = 2.0 content_margin_right = 2.0 content_margin_bottom = 2.0 -[node name="WaveViewer" type="Control"] +[node name="WaveViewer" type="Control" node_paths=PackedStringArray("wave_vbox")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +script = ExtResource("1_0v4fq") +wave_vbox = NodePath("PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/Waves") +enemy_row_scene = ExtResource("2_lbx3o") [node name="PanelContainer" type="PanelContainer" parent="."] layout_mode = 1 @@ -32,7 +36,7 @@ layout_mode = 2 [node name="Label" type="Label" parent="PanelContainer/VBoxContainer"] layout_mode = 2 -text = "Upcoming waves" +text = "TITLE_WAVE_VIEWER" horizontal_alignment = 1 vertical_alignment = 1 @@ -45,154 +49,11 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 2.0 -[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 4 -theme_override_constants/margin_top = 4 -theme_override_constants/margin_right = 4 -theme_override_constants/margin_bottom = 4 - -[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer"] +[node name="Waves" type="VBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer"] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 -[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer"] -layout_mode = 2 -text = "Wave 1" - -[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer"] -layout_mode = 2 - -[node name="TextureRect" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect2" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect3" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect4" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect5" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect6" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="VBoxContainer2" type="VBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer2"] -layout_mode = 2 -text = "Wave 2" - -[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer2"] -layout_mode = 2 - -[node name="TextureRect" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer2/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect2" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer2/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect3" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer2/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect4" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer2/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect5" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer2/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect6" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer2/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="VBoxContainer3" type="VBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer3"] -layout_mode = 2 -text = "Wave 3" - -[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer3"] -layout_mode = 2 - -[node name="TextureRect" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer3/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect2" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer3/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect3" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer3/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect4" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer3/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect5" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer3/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect6" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer3/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="VBoxContainer4" type="VBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer4"] -layout_mode = 2 -text = "Wave 1" - -[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer4"] -layout_mode = 2 - -[node name="TextureRect" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer4/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect2" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer4/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect3" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer4/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect4" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer4/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect5" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer4/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - -[node name="TextureRect6" type="TextureRect" parent="PanelContainer/VBoxContainer/HBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer4/HBoxContainer"] -layout_mode = 2 -texture = ExtResource("1_0v4fq") - [node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer"] layout_mode = 2 size_flags_horizontal = 3 @@ -218,10 +79,8 @@ text = "this dawg is so big itll make your big meaty nuts fall off from how fuck layout_mode = 2 alignment = 2 -[node name="Button" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer2"] -layout_mode = 2 -text = "BUTTON_CANCEL" - [node name="Button2" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer2"] layout_mode = 2 -text = "BUTTON_CONFIRM" +text = "BUTTON_CLOSE" + +[connection signal="pressed" from="PanelContainer/VBoxContainer/HBoxContainer2/Button2" to="." method="_on_button_2_pressed"]