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); }); }); }