92 lines
3.3 KiB
GDScript
92 lines
3.3 KiB
GDScript
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)
|