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

80 lines
3.1 KiB
TypeScript
Raw Normal View History

2017-09-24 22:23:22 +00:00
module TK.SpaceTac {
/**
* Equipment generator from loot templates
*
* Loot templates are automatically populated from the "SpaceTac.Equipments" namespace
*/
2015-01-14 00:00:00 +00:00
export class LootGenerator {
// List of available templates
templates: LootTemplate[]
2015-01-14 00:00:00 +00:00
// Random generator that will be used
random: RandomGenerator
// Filter to select a subset of templates
templatefilter: (template: LootTemplate) => boolean
2015-01-14 00:00:00 +00:00
2017-02-26 17:44:15 +00:00
constructor(random = RandomGenerator.global, populate: boolean = true) {
2015-01-14 00:00:00 +00:00
this.templates = [];
this.random = random;
this.templatefilter = () => true;
2015-01-14 00:00:00 +00:00
if (populate) {
this.populate();
}
2015-01-14 00:00:00 +00:00
}
/**
* Set the template filter for next generations
*/
setTemplateFilter(filter: (template: LootTemplate) => boolean) {
this.templatefilter = filter;
}
2015-01-14 00:00:00 +00:00
// Fill the list of templates
populate(): void {
2017-05-02 21:33:58 +00:00
let templates: LootTemplate[] = [];
2017-09-24 22:23:22 +00:00
let namespace: any = TK.SpaceTac.Equipments;
2017-05-02 21:33:58 +00:00
for (var template_name in namespace) {
2017-02-07 00:08:07 +00:00
if (template_name && template_name.indexOf("Abstract") != 0) {
2017-05-02 21:33:58 +00:00
let template_class = namespace[template_name];
let template: LootTemplate = new template_class();
templates.push(template);
}
}
this.templates = templates;
2015-01-14 00:00:00 +00:00
}
// Generate a random equipment for a specific level
2015-01-14 00:00:00 +00:00
// If slot is specified, it will generate an equipment for this slot type specifically
// If no equipment could be generated from available templates, null is returned
generate(level: number, quality = EquipmentQuality.COMMON, slot: SlotType | null = null): Equipment | null {
2015-01-14 00:00:00 +00:00
// Generate equipments matching conditions, with each template
let templates = this.templates.filter(this.templatefilter).filter(template => slot == null || slot == template.slot);
let equipments = templates.map(template => template.generate(level, quality, this.random));
2015-01-14 00:00:00 +00:00
// No equipment could be generated with given conditions
if (equipments.length === 0) {
return null;
}
// Pick a random equipment
return this.random.choice(equipments);
}
/**
* Generate a random equipment of highest level, from a given set of skills
*/
generateHighest(skills: ShipSkills, quality = EquipmentQuality.COMMON, slot: SlotType | null = null): Equipment | null {
let templates = this.templates.filter(this.templatefilter).filter(template => slot == null || slot == template.slot);
let candidates = nna(templates.map(template => template.generateHighest(skills, quality, this.random)));
if (candidates.length) {
let chosen = this.random.weighted(candidates.map(equ => equ.level));
return candidates[chosen];
} else {
return null;
}
}
2015-01-14 00:00:00 +00:00
}
}