delurbelako/scripts/inventory/in_out_inventory.gd
2025-10-16 22:05:24 +05:00

71 lines
1.7 KiB
GDScript

@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, _context: InventoryContext = null) -> Stack:
for i in range(input_capacity):
if input_array[i].can_be_merged(stack.held_item):
stack_added.emit(stack,i)
input_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:
return false
else:
for i in range(input_capacity):
if input_array[i].can_be_merged(item):
return true
return false
## 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:
if item != output_slot.filter:
return null
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