58 lines
1.2 KiB
GDScript
58 lines
1.2 KiB
GDScript
class_name InventorySlot
|
|
extends RefCounted
|
|
|
|
var item_id: String = ""
|
|
var quantity: int = 0
|
|
|
|
|
|
func is_empty() -> bool:
|
|
return item_id.is_empty() or quantity <= 0
|
|
|
|
|
|
func add_item(item: Item, amount: int = 1) -> int:
|
|
var max_quantity = item.max_stack if item.stackable else 1
|
|
if is_empty():
|
|
item_id = item.id
|
|
quantity = min(amount, max_quantity)
|
|
return amount - quantity
|
|
if item_id == item.id and item.stackable:
|
|
var space_available = item.max_stack - quantity
|
|
var amount_to_add = min(amount, space_available)
|
|
quantity += amount_to_add
|
|
return amount - amount_to_add
|
|
return amount
|
|
|
|
|
|
func remove_item(amount: int = 1) -> int:
|
|
var removed = min(amount, quantity)
|
|
quantity -= removed
|
|
if quantity <= 0:
|
|
clear()
|
|
return removed
|
|
|
|
|
|
func clear() -> void:
|
|
item_id = ""
|
|
quantity = 0
|
|
|
|
|
|
func to_dict() -> Dictionary:
|
|
return {"item_id": item_id, "quantity": quantity}
|
|
|
|
|
|
func from_dict(data: Dictionary) -> void:
|
|
item_id = data.get("item_id", "")
|
|
quantity = data.get("quantity", 0)
|
|
|
|
if is_empty():
|
|
clear()
|
|
return
|
|
|
|
var item = ItemDatabase.get_item(item_id)
|
|
if not item:
|
|
clear()
|
|
return
|
|
|
|
var max_quantity = item.max_stack if item.stackable else 1
|
|
quantity = clampi(quantity, 1, max_quantity)
|