@tool extends Inventory ## Base class for simple storages with no differentiation. class_name Storage ## Amount of stacks that can be held in storage @export var capacity : int: set(value): if value < 0: return if value == capacity: return capacity = value get: return capacity ## :3 @export_storage var internal_array : Array[InventorySlot] = [] func _init() -> void: super() deferred_init.call_deferred() func deferred_init(): internal_array.resize(capacity) for i in range(capacity): internal_array[i] = InventorySlot.new() ## Finds first entry of item. Returns -1 if no item found func find(item : Item) -> int: for i in range(len(internal_array)): if internal_array[i].held_item == item: return i return -1 ## Tries to add an item into inventory. Returns not stored stack of item. func add(stack: Stack, _context: InventoryContext = null) -> Stack: var found_index : int = find(stack.held_item) if found_index != -1: stack_added.emit(stack,found_index) internal_array[found_index].merge_stack(stack) if stack.is_valid() == false: return null for i in range(len(internal_array)): if internal_array[i].held_item == null or internal_array[i].held_item == stack.held_item: stack_added.emit(stack,i) internal_array[i].merge_stack(stack) if stack.is_valid() == false: return null return stack func can_add(item : Item = null, _context: InventoryContext = null) -> bool: if item == null: for i in range(internal_array): return internal_array[i].amount == 0 return false else: for i in range(internal_array): if internal_array[i].amount == 0: return (internal_array[i].filter != null and internal_array[i].filter.is_equal(item)) or internal_array[i].filter == null return internal_array[i].held_item.is_equal(item) return false ## Tries to take first item. Returns null if no items in inventory func pop() -> Stack: for i in range(len(internal_array)): if internal_array[i].held_item != null: var extracted = internal_array[i].extract() stack_taken.emit(extracted,i) return extracted return null func peek() -> Stack: for i in range(len(internal_array)): if internal_array[i].held_item != null: var peeked = internal_array[i].as_stack() return peeked return null ## Tries to take certain item from inventory. Returns null if no item found func take(item: Item,amount: int) -> Stack: var found = find(item) if found == -1: return null var extracted = internal_array[found].extract_stack(amount) stack_taken.emit(extracted,found) return extracted