extends Resource class_name CaptainProgress const BALANCE := preload("res://scripts/captain/captain_balance.gd") @export var level: int = 1 @export var experience: int = 0 @export var credits: int = 0 @export var parts: float = 0.0 @export var minerals: Dictionary = {"titanium": 0, "iron": 0, "aluminium": 0} @export var learning_points: int = 0 @export var skills: Dictionary = { "piloting": 0, "gunner": 0, "mechanic": 0, "sharp_eye": 0, } func get_xp_required() -> int: return BALANCE.xp_required(level) func get_skill_rank(skill: String) -> int: return clampi(int(skills.get(skill, 0)), 0, BALANCE.MAX_SKILL_RANK) func get_skill_bonus(skill: String) -> float: return BALANCE.skill_bonus(skill, get_skill_rank(skill)) func normalize_skill_ranks() -> void: var changed_ranks := false for skill in BALANCE.SKILL_NAMES: var previous := maxi(0, int(skills.get(skill, 0))) var rank := mini(previous, BALANCE.MAX_SKILL_RANK) learning_points += previous - rank if int(skills.get(skill, 0)) != rank: changed_ranks = true skills[skill] = rank if changed_ranks: emit_changed() func get_spent_learning_points() -> int: var spent := 0 for skill in BALANCE.SKILL_NAMES: spent += maxi(0, int(skills.get(skill, 0))) return spent func get_skill_reset_cost() -> int: return BALANCE.SKILL_RESET_COST_PER_LEVEL * maxi(1, level) func can_reset_skills() -> bool: return get_spent_learning_points() > 0 and credits >= get_skill_reset_cost() func reset_skills() -> bool: if not can_reset_skills(): return false credits -= get_skill_reset_cost() learning_points += get_spent_learning_points() for skill in BALANCE.SKILL_NAMES: skills[skill] = 0 emit_changed() return true func can_train(skill: String) -> bool: return skills.has(skill) and learning_points > 0 and get_skill_rank(skill) < BALANCE.MAX_SKILL_RANK func train_skill(skill: String) -> bool: if not can_train(skill): return false skills[skill] = get_skill_rank(skill) + 1 learning_points -= 1 emit_changed() return true func add_rewards(xp_amount: int, credit_amount: int) -> void: experience += maxi(0, xp_amount) credits += maxi(0, credit_amount) while experience >= get_xp_required(): experience -= get_xp_required() level += 1 learning_points += BALANCE.LEARNING_POINTS_PER_LEVEL emit_changed() func reward_enemy(system_level: int, tier: int, xp_multiplier: float, credit_multiplier: float, grant_credits: bool = true) -> Vector2i: var index := clampi(tier, 0, 2) var scale_factor := 1.0 + 0.05 * (clampi(system_level, 1, 1000) - 1) var xp := roundi(BALANCE.KILL_XP[index] * scale_factor * maxf(0.0, xp_multiplier)) var money := roundi(BALANCE.KILL_CREDITS[index] * scale_factor * maxf(0.0, credit_multiplier)) add_rewards(xp, money if grant_credits else 0) return Vector2i(xp, money)