1
0
Fork 0
spacetac/src/core/LootTemplate.spec.ts

193 lines
8.3 KiB
TypeScript

/// <reference path="effects/BaseEffect.ts" />
module TK.SpaceTac.Specs {
class FakeEffect extends BaseEffect {
fakevalue: number
constructor(val = 5) {
super("fake");
this.fakevalue = val;
}
}
function strip<T>(obj: T, attr: keyof T): any {
let result: any = {};
copyfields(obj, result);
delete result[attr];
return result;
}
function strip_id(effect: RObject): any {
if (effect instanceof StickyEffect) {
let result = strip(effect, "id");
result.base = strip_id(result.base);
return result;
} else {
return strip(effect, "id");
}
}
export function compare_effects(check: TestContext, effects1: BaseEffect[], effects2: BaseEffect[]): void {
check.equals(effects1.map(strip_id), effects2.map(strip_id), "effects");
}
export function compare_action(check: TestContext, action1: BaseAction | null, action2: BaseAction | null): void {
if (action1 === null || action2 === null) {
check.equals(action1, action2, "action");
} else {
check.equals(strip_id(action1), strip_id(action2), "action");
}
}
export function compare_trigger_action(check: TestContext, action1: BaseAction | null, action2: TriggerAction | null): void {
if (action1 === null || action2 === null || !(action1 instanceof TriggerAction)) {
check.equals(action1, action2, "action");
} else {
check.equals(strip_id(strip(action1, "effects")), strip_id(strip(action2, "effects")), "action");
compare_effects(check, action1.effects, action2.effects);
}
}
export function compare_toggle_action(check: TestContext, action1: BaseAction | null, action2: ToggleAction | null): void {
if (action1 === null || action2 === null || !(action1 instanceof ToggleAction)) {
check.equals(action1, action2, "action");
} else {
check.equals(strip_id(strip(action1, "effects")), strip_id(strip(action2, "effects")), "action");
compare_effects(check, action1.effects, action2.effects);
}
}
export function compare_drone_action(check: TestContext, action1: BaseAction | null, action2: DeployDroneAction | null): void {
if (action1 === null || action2 === null || !(action1 instanceof DeployDroneAction)) {
check.equals(action1, action2, "action");
} else {
check.equals(strip_id(strip(action1, "drone_effects")), strip_id(strip(action2, "drone_effects")), "action");
compare_effects(check, action1.drone_effects, action2.drone_effects);
}
}
testing("LootTemplate", test => {
test.case("generates equipment with correct information", check => {
let template = new LootTemplate(SlotType.Power, "Power Generator", "A great power generator !");
let result = template.generate(2, EquipmentQuality.PREMIUM);
check.equals(result.slot_type, SlotType.Power);
check.equals(result.code, "powergenerator");
check.equals(result.name, "Power Generator");
check.equals(result.price, 350);
check.equals(result.level, 2);
check.equals(result.quality, EquipmentQuality.COMMON);
check.equals(result.description, "A great power generator !");
template.addAttributeEffect("power_capacity", istep(10));
result = template.generate(1, EquipmentQuality.COMMON);
check.equals(result.quality, EquipmentQuality.COMMON);
compare_effects(check, result.effects, [new AttributeEffect("power_capacity", 10)]);
result = template.generate(1, EquipmentQuality.PREMIUM);
check.equals(result.quality, EquipmentQuality.PREMIUM);
compare_effects(check, result.effects, [new AttributeEffect("power_capacity", 13)]);
});
test.case("applies requirements on skills", check => {
let template = new LootTemplate(SlotType.Hull, "Hull");
template.setSkillsRequirements({ "skill_photons": istep(1), "skill_gravity": istep(2, istep(1)) });
let result = template.generate(1);
check.equals(result.requirements, {
"skill_photons": 1,
"skill_gravity": 2
});
result = template.generate(2);
check.equals(result.requirements, {
"skill_photons": 2,
"skill_gravity": 3
});
result = template.generate(10);
check.equals(result.requirements, {
"skill_photons": 10,
"skill_gravity": 47
});
});
test.case("applies cooldown", check => {
let template = new LootTemplate(SlotType.Weapon, "Weapon");
template.setCooldown(istep(1), istep(2));
let result = template.generate(1);
check.equals(result.cooldown.overheat, 1);
check.equals(result.cooldown.cooling, 2);
result = template.generate(2);
check.equals(result.cooldown.overheat, 2);
check.equals(result.cooldown.cooling, 3);
result = template.generate(10);
check.equals(result.cooldown.overheat, 10);
check.equals(result.cooldown.cooling, 11);
});
test.case("applies attributes permenant effects", check => {
let template = new LootTemplate(SlotType.Shield, "Shield");
template.addAttributeEffect("shield_capacity", irange(undefined, 50, 10));
let result = template.generate(1);
compare_effects(check, result.effects, [new AttributeEffect("shield_capacity", 50)]);
result = template.generate(2);
compare_effects(check, result.effects, [new AttributeEffect("shield_capacity", 60)]);
});
test.case("adds move actions", check => {
let template = new LootTemplate(SlotType.Engine, "Engine");
template.addMoveAction(irange(undefined, 100, 10), istep(50, irepeat(10)), irepeat(95));
let result = template.generate(1);
compare_action(check, result.action, new MoveAction(result, 100, 50, 95));
result = template.generate(2);
compare_action(check, result.action, new MoveAction(result, 110, 60, 95));
});
test.case("adds fire actions", check => {
let template = new LootTemplate(SlotType.Weapon, "Weapon");
template.addTriggerAction(istep(1), [
new EffectTemplate(new FakeEffect(3), { "fakevalue": istep(8) })
], istep(100), istep(50), istep(10));
let result = template.generate(1);
compare_trigger_action(check, result.action, new TriggerAction(result, [new FakeEffect(8)], 1, 100, 50, 10));
result = template.generate(2);
compare_trigger_action(check, result.action, new TriggerAction(result, [new FakeEffect(9)], 2, 101, 51, 11));
});
test.case("adds drone actions", check => {
let template = new LootTemplate(SlotType.Weapon, "Weapon");
template.addDroneAction(istep(1), istep(100), istep(50), [
new EffectTemplate(new FakeEffect(3), { "fakevalue": istep(8) })
]);
let result = template.generate(1);
compare_drone_action(check, result.action, new DeployDroneAction(result, 1, 100, 50, [new FakeEffect(8)]));
result = template.generate(2);
compare_drone_action(check, result.action, new DeployDroneAction(result, 2, 101, 51, [new FakeEffect(9)]));
});
test.case("checks the presence of damaging effects", check => {
let template = new LootTemplate(SlotType.Weapon, "Weapon");
check.equals(template.hasDamageEffect(), false);
template.addAttributeEffect("maneuvrability", irepeat(1));
check.equals(template.hasDamageEffect(), false);
template.addTriggerAction(irepeat(1), [new EffectTemplate(new BaseEffect("test"), {})], irepeat(50), irepeat(50));
check.equals(template.hasDamageEffect(), false);
template.addTriggerAction(irepeat(1), [new EffectTemplate(new DamageEffect(20), {})], irepeat(50), irepeat(50));
check.equals(template.hasDamageEffect(), true);
});
});
}