125 lines
5.8 KiB
TypeScript
125 lines
5.8 KiB
TypeScript
module TK.SpaceTac.Specs {
|
|
testing("AIScoringHelpers", test => {
|
|
test.case("evaluates the drawback of leaving power untouched", check => {
|
|
const battle = new Battle();
|
|
const ship = battle.fleets[0].addShip();
|
|
TestTools.setShipModel(ship, 100, 0, 10);
|
|
const weapon = TestTools.addWeapon(ship, 10, 2, 100, 10, 10);
|
|
const toggle = ship.actions.addCustom(new ToggleAction("test"));
|
|
const enemy = battle.fleets[1].addShip();
|
|
TestTools.setShipModel(enemy, 100, 0, 13);
|
|
|
|
let plan = new AIPlan(undefined, battle, ship.getPlayer());
|
|
check.equals(AIScoringHelpers.remainingPower(plan), -1, "no action");
|
|
|
|
plan = planSingleAction(ship, weapon, Target.newFromLocation(50, 0));
|
|
check.equals(AIScoringHelpers.remainingPower(plan), -0.8, "fire");
|
|
|
|
plan = planSingleAction(ship, toggle, Target.newFromShip(ship));
|
|
check.equals(AIScoringHelpers.remainingPower(plan), -0.9, "toggle on");
|
|
|
|
ship.actions.toggle(toggle, true);
|
|
plan = new AIPlan(undefined, battle, ship.getPlayer());
|
|
check.equals(AIScoringHelpers.remainingPower(plan), -0.9, "toggle kept on");
|
|
|
|
plan = planSingleAction(ship, toggle, Target.newFromShip(ship));
|
|
check.equals(AIScoringHelpers.remainingPower(plan), -1, "toggle off");
|
|
});
|
|
|
|
test.case("evaluates damage to enemies", check => {
|
|
let battle = new Battle();
|
|
let ship = battle.fleets[0].addShip();
|
|
let action = TestTools.addWeapon(ship, 50, 5, 500, 100);
|
|
|
|
let enemy1 = battle.fleets[1].addShip();
|
|
enemy1.setArenaPosition(250, 0);
|
|
TestTools.setShipModel(enemy1, 50, 25);
|
|
let enemy2 = battle.fleets[1].addShip();
|
|
enemy2.setArenaPosition(300, 0);
|
|
TestTools.setShipModel(enemy2, 25, 0);
|
|
|
|
// no enemies hurt
|
|
let plan = planSingleAction(ship, action, Target.newFromLocation(100, 0));
|
|
check.nears(AIScoringHelpers.healthEnemies(plan), 0, 8);
|
|
|
|
// one enemy loses half-life
|
|
plan = planSingleAction(ship, action, Target.newFromLocation(180, 0));
|
|
check.nears(AIScoringHelpers.healthEnemies(plan), 0.1666666666, 8);
|
|
|
|
// one enemy loses half-life, the other one is dead
|
|
plan = planSingleAction(ship, action, Target.newFromLocation(280, 0));
|
|
check.nears(AIScoringHelpers.healthEnemies(plan), 0.6666666666, 8);
|
|
});
|
|
|
|
test.case("evaluates overheat", check => {
|
|
let battle = new Battle(undefined, undefined, 200, 100);
|
|
let ship = battle.fleets[0].addShip();
|
|
let weapon = TestTools.addWeapon(ship, 1, 1, 400, 10);
|
|
let enemy = battle.fleets[1].addShip();
|
|
TestTools.addWeapon(enemy, 1, 1, 400);
|
|
|
|
let plan = planSingleAction(ship, weapon, new Target(0, 50));
|
|
check.equals(AIScoringHelpers.overheat(plan), 0);
|
|
|
|
weapon.configureCooldown(1, 1);
|
|
ship.actions.updateFromShip(ship);
|
|
ship.actions.addCustom(weapon);
|
|
check.equals(AIScoringHelpers.overheat(plan), -0.4);
|
|
|
|
weapon.configureCooldown(1, 2);
|
|
ship.actions.updateFromShip(ship);
|
|
ship.actions.addCustom(weapon);
|
|
check.equals(AIScoringHelpers.overheat(plan), -0.8);
|
|
|
|
weapon.configureCooldown(1, 3);
|
|
ship.actions.updateFromShip(ship);
|
|
ship.actions.addCustom(weapon);
|
|
check.equals(AIScoringHelpers.overheat(plan), -1);
|
|
|
|
weapon.configureCooldown(2, 1);
|
|
ship.actions.updateFromShip(ship);
|
|
ship.actions.addCustom(weapon);
|
|
check.equals(AIScoringHelpers.overheat(plan), 0);
|
|
});
|
|
|
|
test.case("evaluates active effects", check => {
|
|
let battle = TestTools.createBattle();
|
|
let ship = battle.fleets[0].ships[0];
|
|
let enemy = battle.fleets[1].ships[0];
|
|
TestTools.setShipModel(ship, 5, 0, 1);
|
|
TestTools.setShipModel(enemy, 5, 5);
|
|
enemy.setArenaPosition(50, 0);
|
|
let action = new TriggerAction("Test", { range: 100, power: 1, blast: 10 });
|
|
ship.actions.addCustom(action);
|
|
|
|
let plan = planSingleAction(ship, action, Target.newFromShip(enemy));
|
|
check.equals(AIScoringHelpers.activeEffects(plan), 0);
|
|
|
|
action.effects = [new StickyEffect(new DamageEffect(1), 1)];
|
|
plan = planSingleAction(ship, action, Target.newFromShip(enemy));
|
|
check.nears(AIScoringHelpers.activeEffects(plan), 0.5);
|
|
|
|
plan = planSingleAction(ship, action, Target.newFromLocation(4, 0));
|
|
check.nears(AIScoringHelpers.activeEffects(plan), -0.5);
|
|
|
|
action.effects = [new StickyEffect(new CooldownEffect(1), 1)];
|
|
plan = planSingleAction(ship, action, Target.newFromShip(enemy));
|
|
check.nears(AIScoringHelpers.activeEffects(plan), -0.5);
|
|
|
|
plan = planSingleAction(ship, action, Target.newFromLocation(4, 0));
|
|
check.nears(AIScoringHelpers.activeEffects(plan), 0.5);
|
|
|
|
battle.fleets[0].addShip();
|
|
check.nears(AIScoringHelpers.activeEffects(plan), 0.3333333333333333);
|
|
|
|
action.effects = [new StickyEffect(new CooldownEffect(1), 1), new StickyEffect(new CooldownEffect(1), 1)];
|
|
plan = planSingleAction(ship, action, Target.newFromShip(enemy));
|
|
check.nears(AIScoringHelpers.activeEffects(plan), -0.6666666666666666);
|
|
|
|
action.effects = range(10).map(() => new StickyEffect(new CooldownEffect(1), 1));
|
|
plan = planSingleAction(ship, action, Target.newFromShip(enemy));
|
|
check.nears(AIScoringHelpers.activeEffects(plan), -1);
|
|
});
|
|
});
|
|
}
|