Randoloot/scripts/planets/captain_equipment.gd

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)