86 lines
2.7 KiB
GDScript
86 lines
2.7 KiB
GDScript
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)
|