ai: Discourage from fleeing to arena borders
This commit is contained in:
parent
ff9aafdaa6
commit
92129eb512
|
@ -38,5 +38,16 @@ module TS.SpaceTac {
|
|||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the location of the ship after the action
|
||||
*/
|
||||
getFinalLocation(): { x: number, y: number } {
|
||||
if (this.simulation.need_move) {
|
||||
return this.simulation.move_location;
|
||||
} else {
|
||||
return { x: this.ship.arena_x, y: this.ship.arena_y };
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -104,6 +104,7 @@ module TS.SpaceTac {
|
|||
scaled(TacticalAIHelpers.evaluateTurnCost, 1),
|
||||
scaled(TacticalAIHelpers.evaluateDamageToEnemy, 30),
|
||||
scaled(TacticalAIHelpers.evaluateClustering, 3),
|
||||
scaled(TacticalAIHelpers.evaluatePosition, 1),
|
||||
]
|
||||
// TODO evaluator typing is lost
|
||||
evaluators.forEach(evaluator => this.evaluators.push((maneuver: Maneuver) => evaluator(this.ship, this.ship.getBattle(), maneuver)));
|
||||
|
|
|
@ -141,5 +141,27 @@ module TS.SpaceTac.Specs {
|
|||
battle.fleets[0].addShip().setArenaPosition(110, 20);
|
||||
expect(TacticalAIHelpers.evaluateClustering(ship, battle, maneuver)).toEqual(-1);
|
||||
});
|
||||
|
||||
it("evaluates ship position", function () {
|
||||
let battle = new Battle(undefined, undefined, 200, 100);
|
||||
let ship = battle.fleets[0].addShip();
|
||||
let weapon = TestTools.addWeapon(ship, 1, 1, 400);
|
||||
|
||||
ship.setArenaPosition(0, 0);
|
||||
let maneuver = new Maneuver(ship, weapon, new Target(0, 0), 0);
|
||||
expect(TacticalAIHelpers.evaluatePosition(ship, battle, maneuver)).toEqual(-1);
|
||||
|
||||
ship.setArenaPosition(100, 0);
|
||||
maneuver = new Maneuver(ship, weapon, new Target(0, 0), 0);
|
||||
expect(TacticalAIHelpers.evaluatePosition(ship, battle, maneuver)).toEqual(-1);
|
||||
|
||||
ship.setArenaPosition(100, 10);
|
||||
maneuver = new Maneuver(ship, weapon, new Target(0, 0), 0);
|
||||
expect(TacticalAIHelpers.evaluatePosition(ship, battle, maneuver)).toEqual(-0.6);
|
||||
|
||||
ship.setArenaPosition(100, 50);
|
||||
maneuver = new Maneuver(ship, weapon, new Target(0, 0), 0);
|
||||
expect(TacticalAIHelpers.evaluatePosition(ship, battle, maneuver)).toEqual(1);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -95,7 +95,7 @@ module TS.SpaceTac {
|
|||
*/
|
||||
static evaluateClustering(ship: Ship, battle: Battle, maneuver: Maneuver): number {
|
||||
// TODO Take into account blast radius of in-play weapons
|
||||
let move_location = maneuver.simulation.move_location || Target.newFromShip(ship);
|
||||
let move_location = maneuver.getFinalLocation();
|
||||
let distances = imaterialize(imap(ifilter(battle.iships(), iship => iship != ship), iship => Target.newFromShip(iship).getDistanceTo(move_location)));
|
||||
if (distances.length == 0) {
|
||||
return 0;
|
||||
|
@ -106,5 +106,15 @@ module TS.SpaceTac {
|
|||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluate the global positioning of a ship on the arena, between -1 and 1
|
||||
*/
|
||||
static evaluatePosition(ship: Ship, battle: Battle, maneuver: Maneuver): number {
|
||||
let pos = maneuver.getFinalLocation();
|
||||
let distance = min([pos.x, pos.y, battle.width - pos.x, battle.height - pos.y]);
|
||||
let factor = min([battle.width / 2, battle.height / 2]);
|
||||
return -1 + 2 * distance / factor;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue