Fixed Xander not being able to use Disengage
This commit is contained in:
parent
851c59bac1
commit
41f9b1ad6f
|
@ -128,6 +128,7 @@ module TK.SpaceTac {
|
|||
|
||||
// Move or approach needed ?
|
||||
let move_target: Target | null = null;
|
||||
let move_action: MoveAction | null = null;
|
||||
result.move_location = Target.newFromShip(this.ship);
|
||||
if (action instanceof MoveAction) {
|
||||
let corrected_target = action.applyReachableRange(this.ship, target, move_margin);
|
||||
|
@ -136,11 +137,12 @@ module TK.SpaceTac {
|
|||
result.need_move = target.getDistanceTo(this.ship.location) > 0;
|
||||
move_target = corrected_target;
|
||||
}
|
||||
move_action = action;
|
||||
} else {
|
||||
let engine = this.findEngine();
|
||||
if (engine) {
|
||||
move_action = this.findEngine();
|
||||
if (move_action) {
|
||||
let approach_radius = action.getRangeRadius(this.ship);
|
||||
let approach = this.getApproach(engine, target, approach_radius, move_margin);
|
||||
let approach = this.getApproach(move_action, target, approach_radius, move_margin);
|
||||
if (approach instanceof Target) {
|
||||
result.need_move = true;
|
||||
move_target = approach;
|
||||
|
@ -157,18 +159,15 @@ module TK.SpaceTac {
|
|||
}
|
||||
|
||||
// Check move AP
|
||||
if (result.need_move && move_target) {
|
||||
let engine = this.findEngine();
|
||||
if (engine) {
|
||||
result.total_move_ap = engine.getActionPointsUsage(this.ship, move_target);
|
||||
result.can_move = ap > 0;
|
||||
result.can_end_move = result.total_move_ap <= ap;
|
||||
result.move_location = move_target;
|
||||
// TODO Split in "this turn" part and "next turn" part if needed
|
||||
result.parts.push({ action: engine, target: move_target, ap: result.total_move_ap, possible: result.can_move });
|
||||
if (result.need_move && move_target && move_action) {
|
||||
result.total_move_ap = move_action.getPowerUsage(this.ship, move_target);
|
||||
result.can_move = ap > 0;
|
||||
result.can_end_move = result.total_move_ap <= ap;
|
||||
result.move_location = move_target;
|
||||
// TODO Split in "this turn" part and "next turn" part if needed
|
||||
result.parts.push({ action: move_action, target: move_target, ap: result.total_move_ap, possible: result.can_move });
|
||||
|
||||
ap -= result.total_move_ap;
|
||||
}
|
||||
ap -= result.total_move_ap;
|
||||
}
|
||||
|
||||
// Check action AP
|
||||
|
@ -176,7 +175,7 @@ module TK.SpaceTac {
|
|||
result.success = result.need_move && result.can_move;
|
||||
} else {
|
||||
result.need_fire = true;
|
||||
result.total_fire_ap = action.getActionPointsUsage(this.ship, target);
|
||||
result.total_fire_ap = action.getPowerUsage(this.ship, target);
|
||||
result.can_fire = result.total_fire_ap <= ap;
|
||||
result.fire_location = target;
|
||||
result.parts.push({ action: action, target: target, ap: result.total_fire_ap, possible: (!result.need_move || result.can_end_move) && result.can_fire });
|
||||
|
|
|
@ -39,9 +39,9 @@ module TK.SpaceTac.Specs {
|
|||
]);
|
||||
})
|
||||
|
||||
test.case("checks against remaining AP", check => {
|
||||
test.case("checks against remaining power", check => {
|
||||
let action = new BaseAction("test");
|
||||
check.patch(action, "getActionPointsUsage", () => 3);
|
||||
check.patch(action, "getPowerUsage", () => 3);
|
||||
|
||||
let ship = new Ship();
|
||||
check.equals(action.checkCannotBeApplied(ship), "action not available");
|
||||
|
|
|
@ -105,7 +105,7 @@ module TK.SpaceTac {
|
|||
if (remaining_ap === null) {
|
||||
remaining_ap = ship.getValue("power");
|
||||
}
|
||||
var ap_usage = this.getActionPointsUsage(ship, null);
|
||||
var ap_usage = this.getPowerUsage(ship, null);
|
||||
if (remaining_ap < ap_usage) {
|
||||
return "not enough power";
|
||||
}
|
||||
|
@ -119,11 +119,11 @@ module TK.SpaceTac {
|
|||
}
|
||||
|
||||
/**
|
||||
* Get the number of action points the action applied to a target would use
|
||||
* Get the power usage, for applying this action on an hypothetical target
|
||||
*
|
||||
* If target is null, an estimated cost is returned.
|
||||
*/
|
||||
getActionPointsUsage(ship: Ship, target: Target | null): number {
|
||||
getPowerUsage(ship: Ship, target: Target | null): number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -196,7 +196,7 @@ module TK.SpaceTac {
|
|||
result.push(new ShipActionUsedDiff(ship, this, target));
|
||||
|
||||
// Power usage
|
||||
let cost = this.getActionPointsUsage(ship, target);
|
||||
let cost = this.getPowerUsage(ship, target);
|
||||
if (cost) {
|
||||
result = result.concat(ship.getValueDiffs("power", -cost, true));
|
||||
}
|
||||
|
@ -232,7 +232,7 @@ module TK.SpaceTac {
|
|||
return false;
|
||||
}
|
||||
|
||||
let cost = this.getActionPointsUsage(ship, checked_target);
|
||||
let cost = this.getPowerUsage(ship, checked_target);
|
||||
if (ship.getValue("power") < cost) {
|
||||
console.warn("Action rejected - not enough power", ship, this, checked_target);
|
||||
return false;
|
||||
|
|
|
@ -22,7 +22,7 @@ module TK.SpaceTac {
|
|||
return this.name;
|
||||
}
|
||||
|
||||
getActionPointsUsage(ship: Ship, target: Target | null): number {
|
||||
getPowerUsage(ship: Ship, target: Target | null): number {
|
||||
let toggled_cost = isum(imap(ship.iToggleActions(true), action => action.power));
|
||||
return ship.getValue("power") + toggled_cost - ship.getAttribute("power_capacity");
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ module TK.SpaceTac.Specs {
|
|||
var action = new MoveAction("Engine", { distance_per_power: 10 });
|
||||
ship.actions.addCustom(action);
|
||||
|
||||
check.equals(action.getDistanceByActionPoint(ship), 10);
|
||||
check.equals(action.getDistanceByPower(ship), 10);
|
||||
|
||||
var result = action.checkTarget(ship, Target.newFromLocation(0, 20));
|
||||
check.equals(result, Target.newFromLocation(0, 20));
|
||||
|
@ -125,19 +125,19 @@ module TK.SpaceTac.Specs {
|
|||
|
||||
let action = new MoveAction("Engine", { distance_per_power: 100, maneuvrability_factor: 60 });
|
||||
TestTools.setAttribute(ship, "maneuvrability", 0);
|
||||
check.nears(action.getDistanceByActionPoint(ship), 40);
|
||||
check.nears(action.getDistanceByPower(ship), 40);
|
||||
TestTools.setAttribute(ship, "maneuvrability", 1);
|
||||
check.nears(action.getDistanceByActionPoint(ship), 60);
|
||||
check.nears(action.getDistanceByPower(ship), 60);
|
||||
TestTools.setAttribute(ship, "maneuvrability", 2);
|
||||
check.nears(action.getDistanceByActionPoint(ship), 70);
|
||||
check.nears(action.getDistanceByPower(ship), 70);
|
||||
TestTools.setAttribute(ship, "maneuvrability", 10);
|
||||
check.nears(action.getDistanceByActionPoint(ship), 90);
|
||||
check.nears(action.getDistanceByPower(ship), 90);
|
||||
|
||||
action = new MoveAction("Engine", { distance_per_power: 100, maneuvrability_factor: 0 });
|
||||
TestTools.setAttribute(ship, "maneuvrability", 0);
|
||||
check.nears(action.getDistanceByActionPoint(ship), 100);
|
||||
check.nears(action.getDistanceByPower(ship), 100);
|
||||
TestTools.setAttribute(ship, "maneuvrability", 10);
|
||||
check.nears(action.getDistanceByActionPoint(ship), 100);
|
||||
check.nears(action.getDistanceByPower(ship), 100);
|
||||
});
|
||||
|
||||
test.case("builds a textual description", check => {
|
||||
|
|
|
@ -67,10 +67,10 @@ module TK.SpaceTac {
|
|||
}
|
||||
}
|
||||
|
||||
getActionPointsUsage(ship: Ship, target: Target | null): number {
|
||||
getPowerUsage(ship: Ship, target: Target | null): number {
|
||||
if (target) {
|
||||
let distance = Target.newFromShip(ship).getDistanceTo(target);
|
||||
return Math.ceil(distance / this.getDistanceByActionPoint(ship));
|
||||
return Math.ceil(distance / this.getDistanceByPower(ship));
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
@ -84,26 +84,26 @@ module TK.SpaceTac {
|
|||
* Get the distance reachable with a given power
|
||||
*/
|
||||
getRangeRadiusForPower(ship: Ship, power = ship.getValue("power")): number {
|
||||
return power * this.getDistanceByActionPoint(ship);
|
||||
return power * this.getDistanceByPower(ship);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the distance range that may be traveled with 1 action point
|
||||
* Get the distance range that may be traveled with 1 power point
|
||||
*
|
||||
* The actual range will then depend on the ship maneuvrability
|
||||
*/
|
||||
getDistanceRangeByActionPoint(): IntegerRange {
|
||||
getDistanceRangeByPower(): IntegerRange {
|
||||
let min_distance = Math.ceil(this.distance_per_power * (1 - this.maneuvrability_factor * 0.01));
|
||||
return new IntegerRange(min_distance, this.distance_per_power);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the distance that may be traveled with 1 action point
|
||||
* Get the distance that may be traveled with 1 power point
|
||||
*/
|
||||
getDistanceByActionPoint(ship: Ship): number {
|
||||
getDistanceByPower(ship: Ship): number {
|
||||
let maneuvrability = Math.max(ship.getAttribute("maneuvrability"), 0);
|
||||
let factor = maneuvrability / (maneuvrability + 2);
|
||||
let range = this.getDistanceRangeByActionPoint();
|
||||
let range = this.getDistanceRangeByPower();
|
||||
return range.getProportional(factor);
|
||||
}
|
||||
|
||||
|
@ -147,7 +147,7 @@ module TK.SpaceTac {
|
|||
}
|
||||
|
||||
getEffectsDescription(): string {
|
||||
let range = this.getDistanceRangeByActionPoint();
|
||||
let range = this.getDistanceRangeByPower();
|
||||
let rangeinfo = (range.max == range.min) ? `${range.min}` : `${range.min}-${range.max}`;
|
||||
let result = `Move: ${rangeinfo}km per power point`;
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ module TK.SpaceTac {
|
|||
}
|
||||
}
|
||||
|
||||
getActionPointsUsage(ship: Ship, target: Target | null): number {
|
||||
getPowerUsage(ship: Ship, target: Target | null): number {
|
||||
return ship.actions.isToggled(this) ? -this.power : this.power;
|
||||
}
|
||||
|
||||
|
|
|
@ -91,7 +91,7 @@ module TK.SpaceTac {
|
|||
}
|
||||
}
|
||||
|
||||
getActionPointsUsage(ship: Ship, target: Target | null): number {
|
||||
getPowerUsage(ship: Ship, target: Target | null): number {
|
||||
return this.power;
|
||||
}
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ module TK.SpaceTac.UI.Specs {
|
|||
check.same(icon.img_power.visible, false, "no change");
|
||||
|
||||
let cost = 3;
|
||||
check.patch(action, "getActionPointsUsage", () => cost);
|
||||
check.patch(action, "getPowerUsage", () => cost);
|
||||
icon.refresh();
|
||||
check.in("power cost = 3", check => {
|
||||
check.equals(icon.img_power.visible, true);
|
||||
|
|
|
@ -225,7 +225,7 @@ module TK.SpaceTac.UI {
|
|||
}
|
||||
|
||||
// left
|
||||
let cost = this.action.getActionPointsUsage(this.ship, null);
|
||||
let cost = this.action.getPowerUsage(this.ship, null);
|
||||
this.img_power.visible = bool(cost);
|
||||
this.text_power.text = `${Math.abs(cost)}\n${cost < 0 ? "+" : "-"}`;
|
||||
this.text_power.fill = (cost > 0) ? "#ffdd4b" : "#dbe748";
|
||||
|
|
|
@ -19,10 +19,10 @@ module TK.SpaceTac.UI {
|
|||
if (ship.getValue("power") == 0) {
|
||||
cost = "Not enough power";
|
||||
} else {
|
||||
cost = `Cost: 1 power per ${action.getDistanceByActionPoint(ship)}km`;
|
||||
cost = `Cost: 1 power per ${action.getDistanceByPower(ship)}km`;
|
||||
}
|
||||
} else {
|
||||
let power_usage = action.getActionPointsUsage(ship, null);
|
||||
let power_usage = action.getPowerUsage(ship, null);
|
||||
if (power_usage) {
|
||||
if (ship.getValue("power") < power_usage) {
|
||||
cost = "Not enough power";
|
||||
|
|
|
@ -112,7 +112,7 @@ module TK.SpaceTac.UI {
|
|||
let move = part.action instanceof MoveAction;
|
||||
let color = (enabled && part.possible) ? (move ? 0xe09c47 : 0xdc6441) : 0x8e8e8e;
|
||||
let src = previous ? previous.target : this.ship.location;
|
||||
let gradation = (part.action instanceof MoveAction) ? part.action.getDistanceByActionPoint(this.ship) : 0;
|
||||
let gradation = (part.action instanceof MoveAction) ? part.action.getDistanceByPower(this.ship) : 0;
|
||||
this.drawVector(color, src.x, src.y, part.target.x, part.target.y, gradation);
|
||||
}
|
||||
|
||||
|
@ -265,7 +265,7 @@ module TK.SpaceTac.UI {
|
|||
if (move_action) {
|
||||
let power = this.ship.getValue("power");
|
||||
if (this.action !== move_action) {
|
||||
power = Math.max(power - this.action.getActionPointsUsage(this.ship, this.target), 0);
|
||||
power = Math.max(power - this.action.getPowerUsage(this.ship, this.target), 0);
|
||||
}
|
||||
let radius = move_action.getRangeRadiusForPower(this.ship, power);
|
||||
this.range_hint.update(this.ship, move_action, radius);
|
||||
|
|
Loading…
Reference in a new issue