2017-09-24 22:23:22 +00:00
|
|
|
module TK.SpaceTac {
|
2017-03-17 00:07:00 +00:00
|
|
|
/**
|
|
|
|
* Level and experience system for a ship.
|
|
|
|
*/
|
|
|
|
export class ShipLevel {
|
|
|
|
private level = 1;
|
|
|
|
private experience = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get current level
|
|
|
|
*/
|
|
|
|
get(): number {
|
|
|
|
return this.level;
|
|
|
|
}
|
|
|
|
|
2017-05-09 17:19:26 +00:00
|
|
|
/**
|
|
|
|
* Get the current experience points
|
|
|
|
*/
|
|
|
|
getExperience(): number {
|
|
|
|
return this.experience;
|
|
|
|
}
|
|
|
|
|
2017-03-17 00:07:00 +00:00
|
|
|
/**
|
|
|
|
* 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
|
|
|
|
*/
|
2017-04-18 19:51:23 +00:00
|
|
|
forceLevel(level: number): void {
|
2017-03-17 00:07:00 +00:00
|
|
|
while (this.level < level) {
|
2017-04-18 19:51:23 +00:00
|
|
|
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");
|
2017-03-17 00:07:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check for level-up
|
|
|
|
*
|
|
|
|
* Returns true if level changed
|
|
|
|
*/
|
|
|
|
checkLevelUp(): boolean {
|
|
|
|
let changed = false;
|
2017-04-18 19:51:23 +00:00
|
|
|
while (this.experience >= this.getNextGoal()) {
|
2017-03-17 00:07:00 +00:00
|
|
|
this.level++;
|
|
|
|
changed = true;
|
|
|
|
}
|
|
|
|
return changed;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add experience points
|
|
|
|
*/
|
2017-04-18 19:51:23 +00:00
|
|
|
addExperience(points: number): void {
|
2017-03-17 00:07:00 +00:00
|
|
|
this.experience += points;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get skill points given by current level
|
|
|
|
*/
|
|
|
|
getSkillPoints(): number {
|
|
|
|
return 5 + 5 * this.level;
|
|
|
|
}
|
2017-04-18 19:51:23 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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();
|
|
|
|
}
|
2017-03-17 00:07:00 +00:00
|
|
|
}
|
|
|
|
}
|