feat: add location-based food storage loop

This commit is contained in:
2026-07-05 17:57:24 +02:00
parent 3ea8f02d55
commit 6dbb395bd6
22 changed files with 469 additions and 72 deletions
+73
View File
@@ -0,0 +1,73 @@
class_name StorageStateRecord
extends RefCounted
const SCHEMA_VERSION := 1
var data: Dictionary
func _init(record_data: Dictionary = {}) -> void:
data = record_data.duplicate(true)
static func create(
storage_id: StringName,
initial_amounts: Dictionary,
capacity: float = 100.0
) -> StorageStateRecord:
return StorageStateRecord.new({
"schema_version": SCHEMA_VERSION,
"storage_id": String(storage_id),
"amounts": initial_amounts.duplicate(true),
"capacity": capacity
})
static func from_dictionary(record_data: Dictionary) -> StorageStateRecord:
if int(record_data.get("schema_version", -1)) != SCHEMA_VERSION:
return null
if not record_data.has_all(["storage_id", "amounts", "capacity"]):
return null
if String(record_data["storage_id"]).is_empty():
return null
if not record_data["amounts"] is Dictionary:
return null
var normalized := record_data.duplicate(true)
normalized["schema_version"] = SCHEMA_VERSION
normalized["capacity"] = float(record_data["capacity"])
var normalized_amounts := {}
for item_id in record_data["amounts"]:
normalized_amounts[String(item_id)] = float(
record_data["amounts"][item_id]
)
normalized["amounts"] = normalized_amounts
return StorageStateRecord.new(normalized)
func get_storage_id() -> StringName:
return StringName(data["storage_id"])
func get_amount(item_id: StringName) -> float:
return float(data["amounts"].get(String(item_id), 0.0))
func get_total_amount() -> float:
var total := 0.0
for amount in data["amounts"].values():
total += float(amount)
return total
func deposit(item_id: StringName, requested_amount: float) -> float:
var accepted := minf(
maxf(requested_amount, 0.0),
maxf(float(data["capacity"]) - get_total_amount(), 0.0)
)
if accepted <= 0.0:
return 0.0
data["amounts"][String(item_id)] = get_amount(item_id) + accepted
return accepted
func withdraw(item_id: StringName, requested_amount: float) -> float:
var removed := minf(maxf(requested_amount, 0.0), get_amount(item_id))
if removed <= 0.0:
return 0.0
data["amounts"][String(item_id)] = get_amount(item_id) - removed
return removed
func to_dictionary() -> Dictionary:
return data.duplicate(true)