extends RefCounted const KINDS := ["breathing", "suit", "sidearm"] const NAMES := {"breathing": "System oddychania", "suit": "Skafander", "sidearm": "Broń ręczna"} const COLORS := {"breathing": Color("79d9e8"), "suit": Color("efbb7b"), "sidearm": Color("bca0ef")} const MATERIAL_NAMES := {"silicon": "Krzem", "copper": "Miedź", "nickel": "Nikiel", "tungsten": "Wolfram", "mercury": "Rtęć"} static func icon(kind: String) -> Texture2D: return load("res://assets/planets/%s.png" % kind) as Texture2D static func initialize(captain: Resource) -> void: if not captain.gear_items.is_empty(): return for index in KINDS.size(): var kind: String = KINDS[index] captain.gear_items.append({"uid": index + 1, "kind": kind, "level": 1}) captain.gear_slots[kind] = index + 1 captain.gear_next_uid = 4 static func item(captain: Resource, uid: int) -> Dictionary: for gear in captain.gear_items: if int(gear.uid) == uid: return gear return {} static func equipped(captain: Resource, kind: String) -> Dictionary: return item(captain, int(captain.gear_slots.get(kind, -1))) static func level(captain: Resource, kind: String) -> int: return int(equipped(captain, kind).get("level", 0)) static func equip(captain: Resource, kind: String, uid: int) -> bool: var gear := item(captain, uid) if gear.is_empty() or str(gear.kind) != kind or not kind in KINDS: return false captain.gear_slots[kind] = uid captain.emit_changed() return true static func unequip(captain: Resource, kind: String) -> void: captain.gear_slots.erase(kind) captain.emit_changed() static func next_level(captain: Resource, kind: String) -> int: var highest := 0 for gear in captain.gear_items: if gear.kind == kind: highest = maxi(highest, int(gear.level)) return highest + 1 static func recipe(kind: String, target_level: int) -> Dictionary: var amount := maxi(1, target_level) match kind: "breathing": return {"parts": 5 * amount, "silicon": 2 * amount, "copper": amount} "suit": return {"parts": 5 * amount, "nickel": 2 * amount, "iron": 3 * amount} "sidearm": return {"parts": 5 * amount, "tungsten": amount, "titanium": 2 * amount} return {} static func can_craft(captain: Resource, kind: String) -> bool: var cost := recipe(kind, next_level(captain, kind)) if cost.is_empty(): return false for key in cost: if (captain.parts if key == "parts" else float(captain.minerals.get(key, 0))) < cost[key]: return false return true static func craft(captain: Resource, kind: String) -> Dictionary: if not can_craft(captain, kind): return {} var target := next_level(captain, kind) var cost := recipe(kind, target) for key in cost: if key == "parts": captain.parts -= cost[key] else: captain.minerals[key] = int(captain.minerals.get(key, 0)) - cost[key] var gear := {"uid": captain.gear_next_uid, "kind": kind, "level": target} captain.gear_next_uid += 1 captain.gear_items.append(gear) captain.emit_changed() return gear static func recipe_text(captain: Resource, kind: String) -> String: var names: Dictionary = preload("res://scripts/items/crafting_recipes.gd").NAMES.duplicate() names.merge(MATERIAL_NAMES) names.parts = "Części" var pieces: PackedStringArray = [] var cost := recipe(kind, next_level(captain, kind)) for key in cost: pieces.append("%s: %d" % [names.get(key, key), cost[key]]) return " · ".join(pieces)