delurbelako/scripts/inventory/belt_inventory.gd
2025-10-17 18:22:49 +05:00

101 lines
3 KiB
GDScript

@tool
extends Inventory
class_name BeltInventory
## 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
@export var pop_treshold : float = 0.99
## :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(capacity):
if internal_array[i].can_be_merged(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:
if context != null:
var ang_diff = (context.position - context.source.global_position).angle()-context.target.direction
if is_equal_approx(abs(ang_diff),PI/2):
if internal_array[capacity/2].amount != 0:
return null
stack_added.emit(stack,capacity/2)
internal_array[capacity/2].merge_stack(stack)
return stack
elif is_equal_approx(abs(ang_diff), PI):
if internal_array[capacity-1].amount != 0:
return null
stack_added.emit(stack,capacity-1)
internal_array[capacity-1].merge_stack(stack)
return stack
if internal_array[0].amount != 0:
return null
stack_added.emit(stack,0)
internal_array[0].merge_stack(stack)
return stack
func can_add(_item : Item = null, context : InventoryContext = null) -> bool:
if context != null:
var ang_diff = (context.position - context.source.global_position).angle()-context.target.direction
if is_equal_approx(abs(ang_diff),PI/2):
return internal_array[capacity/2].amount == 0
elif is_equal_approx(abs(ang_diff),PI):
return internal_array[capacity-1].amount == 0
return internal_array[0].amount == 0
## Tries to take first item. Returns null if no items in inventory
func pop() -> Stack:
if internal_array[capacity-1].amount == 0:
return null
stack_taken.emit(internal_array[capacity-1], capacity-1)
return internal_array[capacity-1].extract()
func peek() -> Stack:
if internal_array[capacity-1].amount == 0:
return null
return internal_array[capacity-1].as_stack()
func advance() -> void:
for i in range(capacity-1,0,-1):
if internal_array[i].amount == 0 and internal_array[0].updated == false:
var extracted_stack = internal_array[i-1].extract()
internal_array[i].merge_stack(extracted_stack)
if extracted_stack != null and extracted_stack.is_valid():
internal_array[i-1].merge_stack(extracted_stack)
## 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
func refresh() -> void:
for i in range(capacity):
internal_array[i].updated = false