diff --git a/common/inventory/scripts/inventory.gd b/common/inventory/scripts/inventory.gd index f47518e..b61b89f 100644 --- a/common/inventory/scripts/inventory.gd +++ b/common/inventory/scripts/inventory.gd @@ -4,15 +4,22 @@ class_name Inventory signal inventory_changed(inventory: Inventory) @export var items: Array[Item] = [] -@export var size: int = 3 var current_item_ind: int = 0 -func _init(_inventory_size : int = 1): - size = _inventory_size +func _init(inventory_size: int = 1): + items.resize(inventory_size) + +func get_best_available_slot_ind(): + if items[current_item_ind] == null: + return current_item_ind + for i in items.size(): + if items[i] == null: + return i + return current_item_ind func set_current_item(new_ind: int): - if new_ind >= length(): + if new_ind >= items.size(): return if new_ind != current_item_ind: @@ -20,42 +27,25 @@ func set_current_item(new_ind: int): emit_signal("inventory_changed", self) func change_current_item(ind_mod: int): - if length() == 0: + if items.size() == 0: current_item_ind = 0 return - var new_ind : int = current_item_ind + ind_mod - new_ind = new_ind % length() + var new_ind: int = current_item_ind + ind_mod + new_ind = new_ind % items.size() if new_ind < 0: - new_ind += length() + new_ind += items.size() set_current_item(new_ind) func add_item(item: Item): - if items.size() < size: - items.append(item) - emit_signal("inventory_changed", self) + var best_ind = get_best_available_slot_ind() + if best_ind != current_item_ind: + set_item(item, best_ind) return true else: return false -func add_items(items_to_add: Array[Item], fillup: bool = false): - if fillup: - var has_changed := false - for i in min(items_to_add.size(), size - items.size()): - items.append(items_to_add[i]) - has_changed = true - if has_changed: - emit_signal("inventory_changed", self) - return has_changed - elif !fillup && items.size() + items_to_add.size() < size: - items.append_array(items_to_add) - emit_signal("inventory_changed", self) - return true - -func length() -> int: - return len(items) - func set_item(item: Item, ind: int = 0) -> bool: - if ind >= size: + if ind < 0 || ind >= items.size(): return false while len(items) <= ind: items.append(null) @@ -64,7 +54,7 @@ func set_item(item: Item, ind: int = 0) -> bool: return true func get_item(ind: int = current_item_ind) -> Item: - if len(items) <= ind: + if ind < 0 || items.size() <= ind: return null return items[ind] @@ -72,27 +62,27 @@ func has_item(item: Item) -> bool: return item in items func remove_item(item: Item): - items.erase(item) - emit_signal("inventory_changed", self) + var ind = items.find(item) + if ind >= 0: + items[ind] = null + emit_signal("inventory_changed", self) func remove_item_at(ind: int = current_item_ind): - if len(items) <= ind: + if items.size() <= ind: return - items.remove_at(ind) - if current_item_ind >= length(): - change_current_item(-1) + + items[ind] = null emit_signal("inventory_changed", self) func remove_current_item(): remove_item_at() func pop_item(ind: int = current_item_ind) -> Item: - if length() == 0: + if items.size() == 0: return - var item_removed: Item = items.pop_at(ind) - if current_item_ind >= length(): - change_current_item(-1) + var item_removed: Item = items[ind] + items[ind] = null emit_signal("inventory_changed", self) return item_removed diff --git a/entities/plants/resources/plant_types/solita.tres b/entities/plants/resources/plant_types/solita.tres index 59ff5b0..49e0810 100644 --- a/entities/plants/resources/plant_types/solita.tres +++ b/entities/plants/resources/plant_types/solita.tres @@ -4,7 +4,6 @@ [ext_resource type="Script" uid="uid://ceqx5va1ormau" path="res://entities/plants/scripts/plant_effects/produce_seeds.gd" id="2_1q5bp"] [ext_resource type="Script" uid="uid://jnye5pe1bgqw" path="res://entities/plants/scripts/plant_type.gd" id="2_x4nie"] [ext_resource type="Texture2D" uid="uid://c00jac2jlgdfu" path="res://entities/plants/assets/sprites/solita/growing.png" id="3_j4n5p"] -[ext_resource type="Texture2D" uid="uid://b3wom2xu26g43" path="res://entities/plants/assets/sprites/solita/mature.png" id="4_njidq"] [ext_resource type="Texture2D" uid="uid://pltmnkqd5ut2" path="res://entities/plants/assets/sprites/seeds/grille_seeds.png" id="6_yn0yu"] [sub_resource type="Resource" id="Resource_3fdsj"] @@ -12,6 +11,9 @@ script = ExtResource("2_1q5bp") level = 1 metadata/_custom_type_script = "uid://ceqx5va1ormau" +[sub_resource type="Resource" id="Resource_j4n5p"] +metadata/__load_path__ = "res://entities/plants/assets/sprites/default_plant_glowing.png" + [sub_resource type="AtlasTexture" id="AtlasTexture_auuc2"] atlas = ExtResource("6_yn0yu") region = Rect2(335, 74, 134, 142) @@ -24,6 +26,6 @@ default_growing_time = 3 default_plant_score = 2 seed_texture = SubResource("AtlasTexture_auuc2") growing_texture = ExtResource("3_j4n5p") -mature_texture = ExtResource("4_njidq") +mature_texture = SubResource("Resource_j4n5p") default_harvest_effects = Array[ExtResource("1_mksys")]([SubResource("Resource_3fdsj")]) metadata/_custom_type_script = "uid://jnye5pe1bgqw" diff --git a/entities/player/scripts/player.gd b/entities/player/scripts/player.gd index 659a44b..2659f40 100644 --- a/entities/player/scripts/player.gd +++ b/entities/player/scripts/player.gd @@ -127,12 +127,14 @@ func try_move(move_to : Vector2): func pick_item(item : Item) -> Item: play_sfx("pick") - if inventory.length() >= inventory.size: + var available_slot_ind = inventory.get_best_available_slot_ind() + if available_slot_ind == inventory.current_item_ind: var current_item : Item = inventory.get_item() - inventory.set_item(item, inventory.current_item_ind) + inventory.set_item(item, available_slot_ind) return current_item else : - inventory.add_item(item) + if inventory.set_item(item, available_slot_ind): + inventory.set_current_item(available_slot_ind); return null func drop_item(): @@ -176,7 +178,7 @@ func upgrade_max_energy(amount = 1): player_updated.emit(self) func upgrade_inventory_size(amount = 1): - inventory.size += amount + inventory.items.resize(inventory.items.size() + amount) upgraded.emit() player_updated.emit(self) diff --git a/gui/game/inventory_gui/inventory_item/inventory_gui_item.tscn b/gui/game/inventory_gui/inventory_item/inventory_gui_item.tscn index 2fea9f9..f020b05 100644 --- a/gui/game/inventory_gui/inventory_item/inventory_gui_item.tscn +++ b/gui/game/inventory_gui/inventory_item/inventory_gui_item.tscn @@ -38,6 +38,18 @@ tracks/1/path = NodePath("CenterContainer/ItemTexture:modulate") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { +"times": PackedFloat32Array(0, 0.033333335), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(0.27058825, 0.27058825, 0.27058825, 1), Color(0.27058825, 0.27058825, 0.27058825, 1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("CenterContainer/NoItemTextureRect:modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 0, @@ -71,6 +83,18 @@ tracks/1/keys = { "update": 0, "values": [Color(0.27022192, 0.27022192, 0.2702219, 1), Color(1, 1, 1, 1)] } +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("CenterContainer/NoItemTextureRect:modulate") +tracks/2/interp = 2 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(0.27022192, 0.27022192, 0.2702219, 1), Color(1, 1, 1, 1)] +} [sub_resource type="AnimationLibrary" id="AnimationLibrary_2wu2x"] _data = { @@ -114,6 +138,7 @@ layout_mode = 2 [node name="NoItemTextureRect" type="TextureRect" parent="CenterContainer"] unique_name_in_owner = true visible = false +modulate = Color(0.27058825, 0.27058825, 0.27058825, 1) custom_minimum_size = Vector2(12, 12) layout_mode = 2 texture = SubResource("GradientTexture2D_vgckh") @@ -142,3 +167,5 @@ stretch_mode = 4 [node name="BottomSpace" type="Control" parent="."] layout_mode = 2 + +[connection signal="gui_input" from="." to="." method="_on_gui_input"] diff --git a/gui/game/inventory_gui/inventory_item/scripts/inventory_gui_item.gd b/gui/game/inventory_gui/inventory_item/scripts/inventory_gui_item.gd index 5b7acb1..22633dc 100644 --- a/gui/game/inventory_gui/inventory_item/scripts/inventory_gui_item.gd +++ b/gui/game/inventory_gui/inventory_item/scripts/inventory_gui_item.gd @@ -3,6 +3,7 @@ class_name InventoryGuiItem @export var no_item_texture_path : Texture2D +signal item_clicked() const MODULATE_INSPECTED_COLOR = Color.GRAY @@ -25,6 +26,10 @@ func _on_mouse_excited(): if current_item: Pointer.stop_inspect(self) +func _on_gui_input(_event: InputEvent) -> void: + if Input.is_action_just_pressed("action"): + emit_signal("item_clicked") + func inspector_info() -> Inspector.Info: return current_item.inspector_info() diff --git a/gui/game/inventory_gui/scripts/inventory_gui.gd b/gui/game/inventory_gui/scripts/inventory_gui.gd index 8dcf468..b23d51c 100644 --- a/gui/game/inventory_gui/scripts/inventory_gui.gd +++ b/gui/game/inventory_gui/scripts/inventory_gui.gd @@ -1,26 +1,27 @@ extends HBoxContainer class_name InventoryGui -@export var inventory_item_scene : PackedScene +@export var inventory_item_scene: PackedScene -var inventory_item_objects : Array[InventoryGuiItem] +var inventory_item_objects: Array[InventoryGuiItem] -func update(inventory : Inventory): - if len(inventory_item_objects) == 0 or len(inventory_item_objects) != inventory.size: +func update(inventory: Inventory): + if len(inventory_item_objects) == 0 or len(inventory_item_objects) != inventory.items.size(): for o in inventory_item_objects: o.queue_free() - inventory_item_objects = generate_inventory_item_objects(inventory.size) + inventory_item_objects = generate_inventory_item_objects(inventory, inventory.items.size()) - for i in range(inventory.size): - inventory_item_objects[i].update( - inventory.get_item(i), - i == inventory.current_item_ind and inventory.get_item(i) != null - ) + for i in range(inventory.items.size()): + inventory_item_objects[i].update(inventory.get_item(i), i == inventory.current_item_ind) -func generate_inventory_item_objects(nb : int = 1) -> Array[InventoryGuiItem]: - var objects : Array[InventoryGuiItem] = [] +func generate_inventory_item_objects(inventory: Inventory, nb: int = 1) -> Array[InventoryGuiItem]: + var objects: Array[InventoryGuiItem] = [] for i in range(nb): var o = inventory_item_scene.instantiate() as InventoryGuiItem add_child(o) objects.append(o) + o.item_clicked.connect(func(): change_current_item_ind(inventory, i)) return objects + +func change_current_item_ind(inventory: Inventory, new_ind: int): + inventory.set_current_item(new_ind) diff --git a/gui/game/tutorial/scripts/tutorial.gd b/gui/game/tutorial/scripts/tutorial.gd index 9538e72..82f1cd8 100644 --- a/gui/game/tutorial/scripts/tutorial.gd +++ b/gui/game/tutorial/scripts/tutorial.gd @@ -68,7 +68,7 @@ class TakeShovelStep extends Step: return [] func is_step_over(p : Player) -> bool: - return p.inventory.length() > 0 + return p.inventory.items.size() > 0 class DigLootStep extends Step: func generate_indicators(p: Player) -> Array[InGameIndicator]: