From 947b762774a62f9a509f8dedfea311b32e474158 Mon Sep 17 00:00:00 2001 From: Yan Wittmann Date: Sat, 11 Jan 2025 13:43:57 +0100 Subject: [PATCH] Added current inventory item visualization and improved UI management --- project/main-scenes/island.tscn | 71 +++++++++++-------- project/scripts/global/GameManager.gd | 9 ++- project/scripts/player/PlayerManager.gd | 13 ++-- project/scripts/player/tree/Task.gd | 34 ++++----- .../player/tree/impl/base/TaskSelector.gd | 3 +- .../player/tree/impl/base/TaskSequence.gd | 3 +- 6 files changed, 77 insertions(+), 56 deletions(-) diff --git a/project/main-scenes/island.tscn b/project/main-scenes/island.tscn index 1bc397d..2903cba 100644 --- a/project/main-scenes/island.tscn +++ b/project/main-scenes/island.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=25 format=4 uid="uid://b88asko1ugyd2"] +[gd_scene load_steps=26 format=4 uid="uid://b88asko1ugyd2"] [ext_resource type="Script" path="res://scripts/global/GameManager.gd" id="1_eeg2d"] [ext_resource type="Script" path="res://scripts/tilemap/World.gd" id="1_k0rw8"] @@ -6,6 +6,7 @@ [ext_resource type="Script" path="res://scripts/global/CameraController.gd" id="2_k51iv"] [ext_resource type="Material" uid="uid://ckg3be082ny3h" path="res://assets/shader/shader_vignette.tres" id="3_7waul"] [ext_resource type="Script" path="res://scripts/player/PlayerManager.gd" id="4_1xqo1"] +[ext_resource type="Texture2D" uid="uid://1ae5agveqddp" path="res://icon.svg" id="4_o8ona"] [ext_resource type="Script" path="res://scripts/tilemap/StepVisualization.gd" id="5_sr2su"] [ext_resource type="Script" path="res://scripts/player/tree/BehaviorTree.gd" id="6_efs30"] [ext_resource type="Script" path="res://scripts/player/tree/impl/base/TaskSelector.gd" id="7_1jajd"] @@ -49,53 +50,67 @@ size_flags_horizontal = 4 offset_right = 40.0 offset_bottom = 40.0 -[node name="InventoryLabel" type="Label" parent="Camera2D/CanvasLayer/VBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -text = "INV" - [node name="HealthBar" type="ProgressBar" parent="Camera2D/CanvasLayer/VBoxContainer"] -modulate = Color(0.787561, 0.0888135, 0.00437393, 1) +self_modulate = Color(0.788235, 0.0901961, 0.00392157, 1) custom_minimum_size = Vector2(150, 20) layout_mode = 2 tooltip_text = " " show_percentage = false +[node name="HealthLabel" type="Label" parent="Camera2D/CanvasLayer/VBoxContainer/HealthBar"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + [node name="FoodBar" type="ProgressBar" parent="Camera2D/CanvasLayer/VBoxContainer"] -modulate = Color(0.166826, 0.552224, 0.153144, 1) +self_modulate = Color(0.168627, 0.552941, 0.152941, 1) custom_minimum_size = Vector2(0, 20) layout_mode = 2 show_percentage = false +[node name="FoodLabel" type="Label" parent="Camera2D/CanvasLayer/VBoxContainer/FoodBar"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + [node name="TemperatureBar" type="ProgressBar" parent="Camera2D/CanvasLayer/VBoxContainer"] -modulate = Color(0.0235294, 0.0392157, 1, 1) +self_modulate = Color(0.0235294, 0.0392157, 1, 1) custom_minimum_size = Vector2(0, 20) layout_mode = 2 max_value = 50.0 show_percentage = false -[node name="TextureRect" type="TextureRect" parent="Camera2D/CanvasLayer/VBoxContainer"] +[node name="TemperatureLabel" type="Label" parent="Camera2D/CanvasLayer/VBoxContainer/TemperatureBar"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="Camera2D/CanvasLayer/VBoxContainer"] layout_mode = 2 -expand_mode = 5 +size_flags_horizontal = 0 +size_flags_vertical = 4 + +[node name="TemperatureLabel" type="Label" parent="Camera2D/CanvasLayer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +theme_override_font_sizes/font_size = 32 + +[node name="InventoryContentRect" type="TextureRect" parent="Camera2D/CanvasLayer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("4_o8ona") +expand_mode = 2 stretch_mode = 5 -[node name="HealthLabel" type="Label" parent="Camera2D/CanvasLayer"] -offset_left = 1.0 -offset_top = 26.0 -offset_right = 151.0 -offset_bottom = 49.0 - -[node name="FoodLabel" type="Label" parent="Camera2D/CanvasLayer"] -offset_top = 50.0 -offset_right = 150.0 -offset_bottom = 73.0 - -[node name="TemperatureLabel" type="Label" parent="Camera2D/CanvasLayer"] -offset_top = 74.0 -offset_right = 150.0 -offset_bottom = 97.0 - [node name="Tileset" type="Node2D" parent="."] script = ExtResource("1_k0rw8") @@ -116,7 +131,7 @@ tile_map_data = PackedByteArray("AAAQAA4AAwAAAAAAAAA=") tile_set = ExtResource("1_vlccq") [node name="TemperatureLayer" type="TileMapLayer" parent="Tileset"] -tile_map_data = PackedByteArray("AAAAAAAAAgABAAAAAAAsAAYAAgABAAAAAAApAAYAAgABAAAAAAAqAAYAAgABAAAAAAArAAYAAgABAAAAAAAtAAYAAgABAAAAAAAuAAYAAgABAAAAAAAvAAYAAgABAAAAAAAwAAYAAgABAAAAAAAwAAcAAgABAAAAAAAvAAcAAgABAAAAAAAuAAcAAgABAAAAAAAtAAcAAgABAAAAAAAsAAcAAgABAAAAAAArAAcAAgABAAAAAAAqAAcAAgABAAAAAAAqAAgAAgABAAAAAAAqAAkAAgABAAAAAAArAAkAAgABAAAAAAAsAAkAAgABAAAAAAAtAAkAAgABAAAAAAAuAAkAAgABAAAAAAAuAAgAAgABAAAAAAAvAAgAAgABAAAAAAAwAAgAAgABAAAAAAAtAAgAAgABAAAAAAAsAAgAAgABAAAAAAArAAgAAgABAAAAAAALAAsAAgAAAAAAAAALAAwAAgAAAAAAAAALAA0AAgAAAAAAAAALAA4AAgAAAAAAAAALAA8AAgAAAAAAAAALABAAAgAAAAAAAAALABEAAgAAAAAAAAAMAAsAAgAAAAAAAAAMAAwAAgAAAAAAAAAMAA0AAgAAAAAAAAAMAA4AAgAAAAAAAAAMAA8AAgAAAAAAAAAMABAAAgAAAAAAAAAMABEAAgAAAAAAAAANAAsAAgAAAAAAAAANAAwAAgAAAAAAAAANAA0AAgAAAAAAAAANAA4AAgAAAAAAAAANAA8AAgAAAAAAAAANABAAAgAAAAAAAAANABEAAgAAAAAAAAAOAAsAAgAAAAAAAAAOAAwAAgAAAAAAAAAOAA0AAgABAAAAAAAOAA4AAgABAAAAAAAOAA8AAgABAAAAAAAOABAAAgABAAAAAAAOABEAAgAAAAAAAAAPAAsAAgAAAAAAAAAPAAwAAgAAAAAAAAAPAA0AAgABAAAAAAAPAA4AAgABAAAAAAAPAA8AAgABAAAAAAAPABAAAgABAAAAAAAPABEAAgAAAAAAAAAQAAsAAgAAAAAAAAAQAAwAAgAAAAAAAAAQAA0AAgABAAAAAAAQAA4AAgABAAAAAAAQAA8AAgABAAAAAAAQABAAAgABAAAAAAAQABEAAgAAAAAAAAARAAsAAgAAAAAAAAARAAwAAgAAAAAAAAARAA0AAgABAAAAAAARAA4AAgABAAAAAAARAA8AAgABAAAAAAARABAAAgABAAAAAAARABEAAgAAAAAAAAASAAsAAgAAAAAAAAASAAwAAgAAAAAAAAASAA0AAgABAAAAAAASAA4AAgABAAAAAAASAA8AAgABAAAAAAASABAAAgABAAAAAAASABEAAgAAAAAAAAATAAsAAgAAAAAAAAATAAwAAgAAAAAAAAATAA0AAgAAAAAAAAATAA4AAgAAAAAAAAATAA8AAgAAAAAAAAATABAAAgAAAAAAAAATABEAAgAAAAAAAAAUAAsAAgAAAAAAAAAUAAwAAgAAAAAAAAAUAA0AAgAAAAAAAAAUAA4AAgAAAAAAAAAUAA8AAgAAAAAAAAAUABAAAgAAAAAAAAAUABEAAgAAAAAAAAAVAAsAAgAAAAAAAAAVAAwAAgAAAAAAAAAVAA0AAgAAAAAAAAAVAA4AAgAAAAAAAAAVAA8AAgAAAAAAAAAVABAAAgAAAAAAAAAVABEAAgAAAAAAAAA=") +tile_map_data = PackedByteArray("AAAAAAAAAgABAAAAAAAsAAYAAgABAAAAAAApAAYAAgABAAAAAAAqAAYAAgABAAAAAAArAAYAAgABAAAAAAAtAAYAAgABAAAAAAAuAAYAAgABAAAAAAAvAAYAAgABAAAAAAAwAAYAAgABAAAAAAAwAAcAAgABAAAAAAAvAAcAAgABAAAAAAAuAAcAAgABAAAAAAAtAAcAAgABAAAAAAAsAAcAAgABAAAAAAArAAcAAgABAAAAAAAqAAcAAgABAAAAAAAqAAgAAgABAAAAAAAqAAkAAgABAAAAAAArAAkAAgABAAAAAAAsAAkAAgABAAAAAAAtAAkAAgABAAAAAAAuAAkAAgABAAAAAAAuAAgAAgABAAAAAAAvAAgAAgABAAAAAAAwAAgAAgABAAAAAAAtAAgAAgABAAAAAAAsAAgAAgABAAAAAAArAAgAAgABAAAAAAAOAAwAAgAAAAAAAAAOAA0AAgABAAAAAAAOAA4AAgABAAAAAAAOAA8AAgABAAAAAAAPAAwAAgAAAAAAAAAPAA0AAgABAAAAAAAPAA4AAgABAAAAAAAPAA8AAgABAAAAAAAQAAwAAgAAAAAAAAAQAA0AAgABAAAAAAAQAA4AAgABAAAAAAAQAA8AAgABAAAAAAARAAsAAgAAAAAAAAARAAwAAgAAAAAAAAARAA0AAgABAAAAAAARAA4AAgABAAAAAAARAA8AAgABAAAAAAASAAsAAgAAAAAAAAASAAwAAgAAAAAAAAASAA0AAgABAAAAAAASAA4AAgABAAAAAAASAA8AAgABAAAAAAATAAsAAgAAAAAAAAATAAwAAgAAAAAAAAATAA0AAgAAAAAAAAATAA4AAgAAAAAAAAATAA8AAgAAAAAAAAAUAAsAAgAAAAAAAAAUAAwAAgAAAAAAAAAUAA0AAgAAAAAAAAAUAA4AAgAAAAAAAAAUAA8AAgAAAAAAAAAVAAsAAgAAAAAAAAAVAAwAAgAAAAAAAAAVAA0AAgAAAAAAAAA=") tile_set = ExtResource("1_vlccq") [node name="NavigationVisualization" type="TileMapLayer" parent="Tileset"] diff --git a/project/scripts/global/GameManager.gd b/project/scripts/global/GameManager.gd index 07a0be2..e58ec24 100644 --- a/project/scripts/global/GameManager.gd +++ b/project/scripts/global/GameManager.gd @@ -24,7 +24,6 @@ func _ready() -> void: world.step_visualizer.game_manager = self world.step_visualizer.world = world update_bars() - $Camera2D/CanvasLayer/VBoxContainer/TextureRect.texture = world.tilemap_interactive.get_cell_texture(tilemap_types.OBJECT_I_BOAT_PART_CHEST) # game_ticker.start() @@ -66,18 +65,18 @@ func update_bars() -> void: if health_bar != null: health_bar.max_value = player.max_health health_bar.value = clamp(player.health, 0, player.max_health) - $Camera2D/CanvasLayer/HealthLabel.text = str(health_bar.value) + "/" + str(player.max_health) - $Camera2D/CanvasLayer/HealthLabel.add_theme_color_override("font_color", Color(1, 1, 1)) + $Camera2D/CanvasLayer/VBoxContainer/HealthBar/HealthLabel.text = str(health_bar.value) + "/" + str(player.max_health) + $Camera2D/CanvasLayer/VBoxContainer/HealthBar/HealthLabel.add_theme_color_override("font_color", Color(1, 1, 1)) if food_bar != null: food_bar.max_value = player.max_food food_bar.value = clamp(player.food, 0, player.max_food) - $Camera2D/CanvasLayer/FoodLabel.text = str(food_bar.value) + "/" + str(player.max_food) + $Camera2D/CanvasLayer/VBoxContainer/FoodBar/FoodLabel.text = str(food_bar.value) + "/" + str(player.max_food) if temperature_bar != null: temperature_bar.max_value = player.temperature_set_buff_value temperature_bar.value = clamp(player.temperature_buff_timer, 0, player.temperature_set_buff_value) - $Camera2D/CanvasLayer/TemperatureLabel.text = str(temperature_bar.value) + "/" + str(player.temperature_set_buff_value) + $Camera2D/CanvasLayer/VBoxContainer/TemperatureBar/TemperatureLabel.text = str(temperature_bar.value) + "/" + str(player.temperature_set_buff_value) func toggle_temperature_layer() -> void: diff --git a/project/scripts/player/PlayerManager.gd b/project/scripts/player/PlayerManager.gd index 03f5d99..abaeb53 100644 --- a/project/scripts/player/PlayerManager.gd +++ b/project/scripts/player/PlayerManager.gd @@ -1,8 +1,6 @@ class_name PlayerManager extends Node -@onready var inventory_label: Label = %InventoryLabel - @export var max_health: int = 100 # food system @export var max_food: int = 100 @@ -75,10 +73,11 @@ func update_board() -> void: # decide what direction the player is facing tilemap_types.PLAYER_DOWN, ... var direction: Vector2i = find_direction(last_board_position, board_position) game_manager.world.tilemap_player.set_cell(board_position, tilemap_types.player_sprite_from_direction(direction)) + if inventory_slot and inventory_slot != tilemap_types.EMPTY: - inventory_label.text = str(inventory_slot) + %InventoryContentRect.texture = game_manager.world.tilemap_interactive.get_cell_texture(inventory_slot) else: - inventory_label.text = "empty" + %InventoryContentRect.texture = null # SECTION: inventory system @@ -209,7 +208,11 @@ func get_current_temperature() -> int: return game_manager.world.tilemap_temperature.get_custom_data(board_position, "temperature", 0) as int -func tick_handle_temperature(cell_temperature: int): +func tick_handle_temperature(cell_temperature: int) -> void: + if temperature_buff_timer > 0: + temperature_buff_timer -= 1 + return + if cell_temperature == 0: temperature_timer = 0 elif temperature_timer > temperature_endure: diff --git a/project/scripts/player/tree/Task.gd b/project/scripts/player/tree/Task.gd index a2c7944..4b1add8 100644 --- a/project/scripts/player/tree/Task.gd +++ b/project/scripts/player/tree/Task.gd @@ -17,22 +17,14 @@ func _ready() -> void: func internal_run(blackboard: Dictionary) -> void: blackboard["current_task"] = self - if status == RUNNING: - var running_child: Task = find_running_child() - if running_child != null: - print(" -> ", human_readable(running_child.name)) - running_child.internal_run(blackboard) - print(" <- ", human_readable(running_child.name)) - status = running_child.status - return - else: - print(" -> ", human_readable()) - run(blackboard) - print(" <- ", human_readable()) - else: - print(" -> ", human_readable()) - run(blackboard) - print(" <- ", human_readable()) + var running_child: Task = find_running_child() + var extra_string: String = "" + if running_child != null: + extra_string = running_child.name + + print(" -> ", human_readable(extra_string)) + run(blackboard) + print(" <- ", human_readable(extra_string)) func find_running_child() -> Task: @@ -48,6 +40,16 @@ func run_child(blackboard: Dictionary, p_child: Task) -> void: status = RUNNING +func slice_at_child(start_child: Task) -> Array: + var children: Array[Node] = get_children() + if start_child == null: + return children + var start_index: int = children.find(start_child) + if start_index == -1: + return children + return children.slice(start_index, children.size()) + + func run(blackboard: Dictionary) -> void: pass diff --git a/project/scripts/player/tree/impl/base/TaskSelector.gd b/project/scripts/player/tree/impl/base/TaskSelector.gd index 5db9acc..80a3b37 100644 --- a/project/scripts/player/tree/impl/base/TaskSelector.gd +++ b/project/scripts/player/tree/impl/base/TaskSelector.gd @@ -2,7 +2,8 @@ class_name TaskSelector extends Task func run(blackboard: Dictionary) -> void: - for c in self.get_children(): + var running_child: Task = find_running_child() + for c in slice_at_child(running_child): run_child(blackboard, c) if c.status == SUCCESS_STOP: c.status = SUCCESS diff --git a/project/scripts/player/tree/impl/base/TaskSequence.gd b/project/scripts/player/tree/impl/base/TaskSequence.gd index 789f216..2059336 100644 --- a/project/scripts/player/tree/impl/base/TaskSequence.gd +++ b/project/scripts/player/tree/impl/base/TaskSequence.gd @@ -2,7 +2,8 @@ class_name TaskSequence extends Task func run(blackboard: Dictionary) -> void: - for c in self.get_children(): + var running_child: Task = find_running_child() + for c in slice_at_child(running_child): run_child(blackboard, c) if c.status == SUCCESS_STOP: c.status = SUCCESS