diff --git a/generic/constructibles/dbg_assembler.tres b/generic/constructibles/dbg_assembler.tres index 857a443..316eb81 100644 --- a/generic/constructibles/dbg_assembler.tres +++ b/generic/constructibles/dbg_assembler.tres @@ -1,4 +1,4 @@ -[gd_resource type="Resource" script_class="Constructible" load_steps=5 format=3 uid="uid://yn1iesx30nfu"] +[gd_resource type="Resource" script_class="Prototype" load_steps=5 format=3 uid="uid://yn1iesx30nfu"] [ext_resource type="Script" uid="uid://c80sp6f77l5ha" path="res://scripts/prototype.gd" id="1_mqcr0"] [ext_resource type="Texture2D" uid="uid://dinyjq8853usn" path="res://sprites/atlasses/Popekko.png" id="1_sh8t1"] diff --git a/scripts/inventory/inventory.gd b/scripts/inventory/inventory.gd new file mode 100644 index 0000000..c98a3b4 --- /dev/null +++ b/scripts/inventory/inventory.gd @@ -0,0 +1,22 @@ +@abstract +extends Resource + +class_name Inventory + +func _init() -> void: + resource_local_to_scene = true + +@abstract +func add(item : Stack) -> Stack + +@abstract +func pop() -> Stack + +@abstract +func take(item : Item,amount: int) -> Stack + +@abstract +func find(item : Item) -> int + +func has(item : Item) -> bool: + return find(item) != -1 diff --git a/scripts/inventory/inventory.gd.uid b/scripts/inventory/inventory.gd.uid new file mode 100644 index 0000000..7f054ab --- /dev/null +++ b/scripts/inventory/inventory.gd.uid @@ -0,0 +1 @@ +uid://01aqkh38trcr diff --git a/scripts/inventory/inventory_slot.gd b/scripts/inventory/inventory_slot.gd new file mode 100644 index 0000000..a30cd1f --- /dev/null +++ b/scripts/inventory/inventory_slot.gd @@ -0,0 +1,59 @@ +@tool +extends RefCounted + +class_name InventorySlot + +@export_storage var held_item : Item: + set(value): + if held_item == null and value != null: + held_item = value + amount += 1 + return + held_item = value + get: + return held_item + +@export_storage var amount : int: + set(value): + if value <= 0: + held_item = null + amount = 0 + return + if held_item == null: + return + if value > held_item.stack_size: + amount = held_item.stack_size + return + amount = value + get: + return amount + +func extract_stack(extract_amount: int) -> Stack: + var return_stack : Stack + if extract_amount > amount: + return_stack = Stack.new(held_item,amount) + else: + return_stack = Stack.new(held_item,extract_amount) + + self.amount = 0 + + return return_stack + +func extract() -> Stack: + var return_stack : Stack = Stack.new(held_item,amount) + self.amount = 0 + + return return_stack + +func merge_stack(stack: Stack) -> Stack: + if held_item == null: + held_item = stack.held_item + amount = stack.amount + return null + if stack.held_item != held_item: + return null + var return_stack_amount = max(0,stack.amount-amount) + amount += stack.amount - return_stack_amount + if return_stack_amount == 0: + return null + return Stack.new(held_item,return_stack_amount) diff --git a/scripts/inventory/inventory_slot.gd.uid b/scripts/inventory/inventory_slot.gd.uid new file mode 100644 index 0000000..ef6794d --- /dev/null +++ b/scripts/inventory/inventory_slot.gd.uid @@ -0,0 +1 @@ +uid://bd4ojfqrl8idm diff --git a/scripts/inventory/stack.gd b/scripts/inventory/stack.gd new file mode 100644 index 0000000..991e853 --- /dev/null +++ b/scripts/inventory/stack.gd @@ -0,0 +1,11 @@ +extends RefCounted + +class_name Stack + +func _init(item: Item = null, amount: int = 0) -> void: + held_item = item + self.amount = amount + +@export_storage var held_item : Item + +@export_storage var amount : int diff --git a/scripts/inventory/stack.gd.uid b/scripts/inventory/stack.gd.uid new file mode 100644 index 0000000..582e453 --- /dev/null +++ b/scripts/inventory/stack.gd.uid @@ -0,0 +1 @@ +uid://h78lmbi3vbfe diff --git a/scripts/inventory/storage.gd b/scripts/inventory/storage.gd new file mode 100644 index 0000000..dafe70e --- /dev/null +++ b/scripts/inventory/storage.gd @@ -0,0 +1,50 @@ +@tool +extends Inventory + +class_name Storage + +@export var capacity : int: + set(value): + if value < 0: + return + if value == capacity: + return + capacity = value + internal_array.resize(capacity) + for i in range(capacity): + internal_array[i] = InventorySlot.new() + get: + return capacity + +@export_storage var internal_array : Array[InventorySlot] = [] + +func find(item : Item) -> int: + for i in range(len(internal_array)): + if internal_array[i].held_item == item: + return i + return -1 + +func add(stack: Stack) -> Stack: + var found_index : int = find(stack.held_item) + if found_index != -1: + stack = internal_array[found_index].merge_stack(stack) + if stack == null: + 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 = internal_array[i].merge_stack(stack) + if stack == null: + return null + return stack + +func pop() -> Stack: + for i in range(len(internal_array)): + if internal_array[i].held_item != null: + return internal_array[i].extract() + return null + +func take(item: Item,amount: int) -> Stack: + var found = find(item) + if found == -1: + return null + return internal_array[found].extract_stack(amount) diff --git a/scripts/inventory/storage.gd.uid b/scripts/inventory/storage.gd.uid new file mode 100644 index 0000000..c57e4f9 --- /dev/null +++ b/scripts/inventory/storage.gd.uid @@ -0,0 +1 @@ +uid://1scdy7mttx5h diff --git a/scripts/item.gd b/scripts/item.gd new file mode 100644 index 0000000..9d20b7a --- /dev/null +++ b/scripts/item.gd @@ -0,0 +1,7 @@ +extends Resource + +class_name Item + +@export var display_name : StringName +@export var preview : Texture2D +@export var stack_size : int diff --git a/scripts/item.gd.uid b/scripts/item.gd.uid new file mode 100644 index 0000000..182ac96 --- /dev/null +++ b/scripts/item.gd.uid @@ -0,0 +1 @@ +uid://p5327ibxtyfs