89 lines
2.3 KiB
GDScript
89 lines
2.3 KiB
GDScript
class_name InventoryData extends Resource
|
|
|
|
@export var slots: Array[SlotData]
|
|
|
|
func _init() -> void:
|
|
connect_slots()
|
|
|
|
func add_item(item: ItemData, count := 1) -> bool:
|
|
var slot = get_slot_by_item(item)
|
|
if slot:
|
|
slot.quantity += count
|
|
return true
|
|
var empty_slot_index = get_empty_slot_index()
|
|
if empty_slot_index > -1:
|
|
var new_slot = SlotData.new()
|
|
new_slot.item_data = item
|
|
new_slot.quantity = count
|
|
slots[empty_slot_index] = new_slot
|
|
new_slot.changed.connect(on_slot_changed)
|
|
return true
|
|
print("inventory full")
|
|
return false
|
|
|
|
func get_slot_by_item(item: ItemData) -> SlotData:
|
|
var index = slots.find_custom(func(slot: SlotData): return slot != null and slot.item_data == item)
|
|
if index > -1:
|
|
return slots[index]
|
|
return null
|
|
|
|
func get_empty_slot_index() -> int:
|
|
return slots.find_custom(func(slot: SlotData): return !slot)
|
|
|
|
func get_valid_slots() -> Array[SlotData]:
|
|
return slots.filter(func(slot: SlotData): return slot);
|
|
|
|
func connect_slots() -> void:
|
|
for slot: SlotData in get_valid_slots():
|
|
slot.changed.connect(on_slot_changed)
|
|
|
|
func on_slot_changed() -> void:
|
|
for slot_index in slots.size():
|
|
var slot: SlotData = slots[slot_index]
|
|
if slot and slot.quantity < 1:
|
|
slot.changed.disconnect(on_slot_changed)
|
|
slots[slot_index] = null
|
|
emit_changed()
|
|
|
|
func get_save_data() -> Array:
|
|
var item_save := []
|
|
for slot in slots:
|
|
item_save.append(item_to_save(slot))
|
|
return item_save
|
|
|
|
func item_to_save(slot: SlotData) -> Dictionary:
|
|
var result := {
|
|
item = "",
|
|
quantity = 0
|
|
}
|
|
if !slot:
|
|
return result
|
|
result.quantity = slot.quantity
|
|
if !slot.item_data:
|
|
return result
|
|
result.item = slot.item_data.resource_path
|
|
return result
|
|
|
|
func load_save_date(save_data: Array) -> void:
|
|
var slots_size = slots.size()
|
|
slots.clear()
|
|
slots.resize(slots_size)
|
|
for save_index in save_data.size():
|
|
slots[save_index] = save_to_item(save_data[save_index])
|
|
connect_slots()
|
|
|
|
func save_to_item(save_item: Dictionary) -> SlotData:
|
|
if save_item.item == "":
|
|
return null
|
|
var new_slot := SlotData.new()
|
|
new_slot.item_data = load(save_item.item)
|
|
new_slot.quantity = int(save_item.quantity)
|
|
return new_slot
|
|
|
|
func use_item(item: ItemData, count := 1) -> bool:
|
|
for slot in slots:
|
|
if slot and slot.item_data == item and slot.quantity >= count:
|
|
slot.quantity -= count
|
|
return true
|
|
return false
|