60 lines
1.6 KiB
TypeScript
60 lines
1.6 KiB
TypeScript
import { type CombatantActor, type Stats } from "../core/types";
|
|
|
|
export class ProgressionManager {
|
|
allocateStat(player: CombatantActor, statName: string) {
|
|
if (!player.stats || player.stats.statPoints <= 0) return;
|
|
|
|
player.stats.statPoints--;
|
|
if (statName === "strength") {
|
|
player.stats.strength++;
|
|
player.stats.maxHp += 2;
|
|
player.stats.hp += 2;
|
|
player.stats.attack += 0.2;
|
|
} else if (statName === "dexterity") {
|
|
player.stats.dexterity++;
|
|
player.speed += 1;
|
|
} else if (statName === "intelligence") {
|
|
player.stats.intelligence++;
|
|
if (player.stats.intelligence % 5 === 0) {
|
|
player.stats.defense++;
|
|
}
|
|
}
|
|
}
|
|
|
|
allocatePassive(player: CombatantActor, nodeId: string) {
|
|
if (!player.stats || player.stats.skillPoints <= 0) return;
|
|
if (player.stats.passiveNodes.includes(nodeId)) return;
|
|
|
|
player.stats.skillPoints--;
|
|
player.stats.passiveNodes.push(nodeId);
|
|
|
|
// Apply bonuses
|
|
switch (nodeId) {
|
|
case "off_1":
|
|
player.stats.attack += 2;
|
|
break;
|
|
case "off_2":
|
|
player.stats.attack += 4;
|
|
break;
|
|
case "def_1":
|
|
player.stats.maxHp += 10;
|
|
player.stats.hp += 10;
|
|
break;
|
|
case "def_2":
|
|
player.stats.defense += 2;
|
|
break;
|
|
case "util_1":
|
|
player.speed += 5;
|
|
break;
|
|
case "util_2":
|
|
player.stats.expToNextLevel = Math.floor(player.stats.expToNextLevel * 0.9);
|
|
break;
|
|
}
|
|
}
|
|
|
|
calculateStats(baseStats: Stats): Stats {
|
|
return baseStats;
|
|
}
|
|
}
|
|
|