1
0
Fork 0

ai: Discourage from fleeing to arena borders

This commit is contained in:
Michaël Lemaire 2017-05-09 23:09:44 +02:00
parent ff9aafdaa6
commit 92129eb512
4 changed files with 45 additions and 1 deletions

View file

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

View file

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

View file

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

View file

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