2015-01-13 00:00:00 +00:00
|
|
|
module SpaceTac.Game {
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
// Template used to generate a loot equipment
|
|
|
|
export class LootTemplate {
|
|
|
|
// Type of slot this equipment will fit in
|
|
|
|
slot: SlotType;
|
|
|
|
|
|
|
|
// Base name, lower cased
|
|
|
|
name: string;
|
|
|
|
|
|
|
|
// Ability requirement ranges
|
|
|
|
|
|
|
|
// Targetting flags
|
|
|
|
|
|
|
|
// Distance to target
|
|
|
|
distance: Range;
|
|
|
|
|
|
|
|
// Effect area's radius
|
|
|
|
blast: Range;
|
|
|
|
|
2015-01-14 00:00:00 +00:00
|
|
|
// Duration, in number of turns
|
|
|
|
duration: IntegerRange;
|
2015-01-13 00:00:00 +00:00
|
|
|
|
|
|
|
// Effects
|
|
|
|
|
|
|
|
// Action Points usage
|
|
|
|
ap_usage: Range;
|
|
|
|
|
|
|
|
// Level requirement
|
2015-01-14 00:00:00 +00:00
|
|
|
min_level: IntegerRange;
|
2015-01-13 00:00:00 +00:00
|
|
|
|
|
|
|
// Create a loot template
|
|
|
|
constructor(slot: SlotType, name: string) {
|
|
|
|
this.slot = slot;
|
|
|
|
this.name = name;
|
|
|
|
this.distance = new Range(0, 0);
|
|
|
|
this.blast = new Range(0, 0);
|
2015-01-14 00:00:00 +00:00
|
|
|
this.duration = new IntegerRange(0, 0);
|
2015-01-13 00:00:00 +00:00
|
|
|
this.ap_usage = new Range(0, 0);
|
2015-01-14 00:00:00 +00:00
|
|
|
this.min_level = new IntegerRange(0, 0);
|
2015-01-13 00:00:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Generate a random equipment with this template
|
2015-01-14 00:00:00 +00:00
|
|
|
generate(random: RandomGenerator = null): Equipment {
|
|
|
|
random = random || new RandomGenerator();
|
2015-01-13 00:00:00 +00:00
|
|
|
var power = random.throw();
|
|
|
|
return this.generateFixed(power);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Generate a fixed-power equipment with this template
|
|
|
|
generateFixed(power: number): Equipment {
|
|
|
|
var result = new Equipment();
|
|
|
|
|
|
|
|
result.slot = this.slot;
|
|
|
|
result.name = this.name;
|
|
|
|
|
2015-01-14 00:00:00 +00:00
|
|
|
result.distance = this.distance.getProportional(power);
|
|
|
|
result.blast = this.blast.getProportional(power);
|
|
|
|
result.duration = this.duration.getProportional(power);
|
|
|
|
result.ap_usage = this.ap_usage.getProportional(power);
|
|
|
|
result.min_level = this.min_level.getProportional(power);
|
2015-01-13 00:00:00 +00:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
2015-01-14 00:00:00 +00:00
|
|
|
|
|
|
|
// Find the power range that will result in the level range
|
|
|
|
getPowerRangeForLevel(level: IntegerRange): Range {
|
|
|
|
if (level.min > this.min_level.max || level.max < this.min_level.min) {
|
|
|
|
return null;
|
|
|
|
} else {
|
|
|
|
var min: number;
|
|
|
|
var max: number;
|
|
|
|
|
|
|
|
if (level.min <= this.min_level.min) {
|
|
|
|
min = 0.0;
|
|
|
|
} else {
|
|
|
|
min = this.min_level.getReverseProportional(level.min);
|
|
|
|
}
|
|
|
|
if (level.max >= this.min_level.max) {
|
|
|
|
max = 1.0;
|
|
|
|
} else {
|
|
|
|
max = this.min_level.getReverseProportional(level.max);
|
|
|
|
}
|
|
|
|
|
|
|
|
return new Range(min, max);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Generate an equipment that will have its level requirement in the given range
|
|
|
|
// May return null if level range is not compatible with the template
|
|
|
|
generateInLevelRange(level: IntegerRange, random: RandomGenerator = null): Equipment {
|
|
|
|
random = random || new RandomGenerator();
|
|
|
|
|
|
|
|
var random_range = this.getPowerRangeForLevel(level);
|
|
|
|
if (random_range) {
|
|
|
|
var power = random.throw() * (random_range.max - random_range.min) + random_range.min;
|
|
|
|
return this.generateFixed(power);
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
2015-01-13 00:00:00 +00:00
|
|
|
}
|
|
|
|
}
|