Randoloot/scripts/captain/captain_progress.gd
2026-10-10 21:21:58 +02:00

48 lines
1.6 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 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 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) -> 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)
return Vector2i(xp, money)