@tool extends Inventory class_name InOutInventory @export var input_capacity : int @export var output_capacity : int @export_storage var input_array : Array[InventorySlot] @export_storage var output_slot : InventorySlot func resize() -> void: input_array.resize(input_capacity) for i in range(input_capacity): input_array[i] = InventorySlot.new() output_slot = InventorySlot.new() func _init() -> void: super() resize.call_deferred() func add(stack : Stack) -> Stack: var found_index : int = find_input(stack.held_item) if found_index != -1: stack_added.emit(stack,found_index) stack = input_array[found_index].merge_stack(stack) if stack == null: return null for i in range(input_capacity): if input_array[i].can_be_merged(stack.held_item): stack_added.emit(stack,i) stack = input_array[i].merge_stack(stack) if stack == null: return null return stack func add_from_side(stack : Stack, _ang_diff : float) -> Stack: return add(stack) func can_add(item : Item = null) -> bool: if item == null: for i in range(input_capacity): return input_array[i].amount == 0 return false else: for i in range(input_capacity): if input_array[i].can_be_merged(item): return true #return true return false func can_add_from_side(_ang_diff : float,item: Item = null) -> bool: return can_add(item) ## Tries to take first item. Returns null if no items in inventory func pop() -> Stack: if output_slot.held_item != null: var extracted = output_slot.extract() stack_taken.emit(extracted,0) return extracted return null func peek() -> Stack: if output_slot.held_item != null: var peeked = output_slot.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 extracted = output_slot.extract_stack(amount) return extracted func find_input(item : Item) -> int: for i in range(input_capacity): if input_array[i].held_item == item: return i return -1 func find(item : Item) -> int: if output_slot.held_item == item: return 0 return -1