1
0
Fork 0
spacetac/src/core/ShipLevel.ts

103 lines
2.5 KiB
TypeScript

module TK.SpaceTac {
/**
* Level and experience system for a ship.
*/
export class ShipLevel {
private level = 1;
private experience = 0;
/**
* Get current level
*/
get(): number {
return this.level;
}
/**
* Get the current experience points
*/
getExperience(): number {
return this.experience;
}
/**
* Get the next experience goal to reach, to gain one level
*/
getNextGoal(): number {
return isum(imap(irange(this.level), i => (i + 1) * 100));
}
/**
* Force experience gain, to reach a given level
*/
forceLevel(level: number): void {
while (this.level < level) {
this.forceLevelUp();
}
}
/**
* Force a level up
*/
forceLevelUp(): void {
let old_level = this.level;
this.addExperience(this.getNextGoal() - this.experience);
this.checkLevelUp();
if (old_level >= this.level) {
// security against infinite loops
throw new Error("No effective level up");
}
}
/**
* Check for level-up
*
* Returns true if level changed
*/
checkLevelUp(): boolean {
let changed = false;
while (this.experience >= this.getNextGoal()) {
this.level++;
changed = true;
}
return changed;
}
/**
* Add experience points
*/
addExperience(points: number): void {
this.experience += points;
}
/**
* Get skill points given by current level
*/
getSkillPoints(): number {
return 5 + 5 * this.level;
}
/**
* Get the level needed to have a given total of points
*/
static getLevelForPoints(points: number): number {
let lev = new ShipLevel();
while (lev.getSkillPoints() < points) {
lev.forceLevelUp();
}
return lev.level;
}
/**
* Get the points available at a given level
*/
static getPointsForLevel(level: number): number {
let lev = new ShipLevel();
lev.forceLevel(level);
return lev.getSkillPoints();
}
}
}