2017-02-09 00:00:35 +00:00
|
|
|
module TS.SpaceTac {
|
2014-12-31 00:00:00 +00:00
|
|
|
// Action to move to a given location
|
|
|
|
export class MoveAction extends BaseAction {
|
2015-04-21 20:14:17 +00:00
|
|
|
|
|
|
|
// Safety distance from other ships
|
|
|
|
safety_distance: number;
|
|
|
|
|
2015-01-28 00:00:00 +00:00
|
|
|
constructor(equipment: Equipment) {
|
2017-01-08 22:42:53 +00:00
|
|
|
super("move", "Move", true, equipment);
|
2015-04-21 20:14:17 +00:00
|
|
|
|
|
|
|
this.safety_distance = 50;
|
2014-12-31 00:00:00 +00:00
|
|
|
}
|
|
|
|
|
2015-02-26 00:00:00 +00:00
|
|
|
canBeUsed(battle: Battle, ship: Ship, remaining_ap: number = null): boolean {
|
|
|
|
if (battle && battle.playing_ship !== ship) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check AP usage
|
|
|
|
if (remaining_ap === null) {
|
2017-02-07 19:15:21 +00:00
|
|
|
remaining_ap = ship.values.power.get();
|
2015-02-26 00:00:00 +00:00
|
|
|
}
|
|
|
|
return remaining_ap > 0.0001;
|
2014-12-31 00:00:00 +00:00
|
|
|
}
|
|
|
|
|
2015-02-26 00:00:00 +00:00
|
|
|
getActionPointsUsage(battle: Battle, ship: Ship, target: Target): number {
|
|
|
|
if (target === null) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
var distance = Target.newFromShip(ship).getDistanceTo(target);
|
2017-01-19 18:33:56 +00:00
|
|
|
return Math.ceil(this.equipment.ap_usage * distance / this.equipment.distance);
|
2015-02-26 00:00:00 +00:00
|
|
|
}
|
|
|
|
|
2015-03-03 00:00:00 +00:00
|
|
|
getRangeRadius(ship: Ship): number {
|
2017-02-07 19:15:21 +00:00
|
|
|
return ship.values.power.get() * this.equipment.distance / this.equipment.ap_usage;
|
2015-03-03 00:00:00 +00:00
|
|
|
}
|
|
|
|
|
2017-01-19 18:33:56 +00:00
|
|
|
/**
|
|
|
|
* Get the distance that may be traveled with 1 action point
|
|
|
|
*/
|
|
|
|
getDistanceByActionPoint(ship: Ship): number {
|
|
|
|
return this.equipment.distance / this.equipment.ap_usage;
|
|
|
|
}
|
|
|
|
|
2014-12-31 00:00:00 +00:00
|
|
|
checkLocationTarget(battle: Battle, ship: Ship, target: Target): Target {
|
2015-04-21 20:14:17 +00:00
|
|
|
// Apply maximal distance
|
2017-01-19 18:33:56 +00:00
|
|
|
var max_distance = this.getRangeRadius(ship);
|
2015-04-21 20:14:17 +00:00
|
|
|
target = target.constraintInRange(ship.arena_x, ship.arena_y, max_distance);
|
|
|
|
|
|
|
|
// Apply collision prevention
|
|
|
|
battle.play_order.forEach((iship: Ship) => {
|
|
|
|
if (iship !== ship) {
|
|
|
|
target = target.moveOutOfCircle(iship.arena_x, iship.arena_y, this.safety_distance,
|
|
|
|
ship.arena_x, ship.arena_y);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return target;
|
2014-12-31 00:00:00 +00:00
|
|
|
}
|
2015-01-02 00:00:00 +00:00
|
|
|
|
2017-02-19 21:52:11 +00:00
|
|
|
protected customApply(battle: Battle, ship: Ship, target: Target) {
|
2015-01-02 00:00:00 +00:00
|
|
|
ship.moveTo(target.x, target.y);
|
|
|
|
}
|
2014-12-31 00:00:00 +00:00
|
|
|
}
|
2015-01-07 00:00:00 +00:00
|
|
|
}
|