TinyAdventure/inventory.gd

90 lines
2.0 KiB
GDScript

class_name Inventory
var _content:Array[ItemStack] = []
const INVENTORY_SIZE:int = 36
const INVENTORY_TOOL_START:int = 36 - 9
func _init() -> void:
clear()
func get_free_tool_stack_index() -> int:
for i:int in range(INVENTORY_TOOL_START, _content.size()):
if _content[i].count == 0:
return i
return -1
func get_free_item_stack_index() -> int:
for i:int in range(_content.size()):
if _content[i].count == 0:
return i
return -1
func add_item(item:Item) -> bool:
for item_stack:ItemStack in _content:
if item_stack.count == 0:
continue
if item_stack.item.resource_path != item.resource_path:
continue
if item_stack.count < item_stack.item.max_stack_size:
item_stack.count = item_stack.count + 1
return true
# First try to put it into the tool stacks...
var item_stack_index:int = get_free_tool_stack_index()
# ... and if that failed try use the regular inventory.
if item_stack_index < 0:
item_stack_index = get_free_item_stack_index()
if item_stack_index >= 0:
_content[item_stack_index].item = item
_content[item_stack_index].count = 1
return true
return false
func remove_item(item:Item):
for i in range(_content.size() - 1, -1, -1):
var item_stack:ItemStack = _content[i]
if item_stack.count == 0:
continue
if item_stack.item.resource_path == item.resource_path:
if item_stack.count > 1:
item_stack.count = item_stack.count - 1
return
func get_item_stacks() -> Array[ItemStack]:
return _content
func get_tool_item_stacks() -> Array[ItemStack]:
return _content.slice(_content.size() - 9)
func clear() -> void:
_content.clear()
_content.resize(INVENTORY_SIZE)
for i:int in range(_content.size()):
if _content[i] == null:
_content[i] = ItemStack.new()
func has_all(items:Array[Item]) -> bool:
var needed:Array[Item] = items.duplicate()
for item_stack:ItemStack in _content:
if item_stack.count == 0:
continue
for i in range (item_stack.count):
needed.erase(item_stack.item)
return needed.is_empty()