inventory refactor + inv ui interactable
This commit is contained in:
parent
433b3dfd28
commit
3ee2c8bdf1
@ -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
|
||||
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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"]
|
||||
|
||||
@ -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()
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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]:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user