diff --git a/src/core/MoveFireSimulator.ts b/src/core/MoveFireSimulator.ts index 41339b2..147d451 100644 --- a/src/core/MoveFireSimulator.ts +++ b/src/core/MoveFireSimulator.ts @@ -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 }); diff --git a/src/core/actions/BaseAction.spec.ts b/src/core/actions/BaseAction.spec.ts index e6dc0b0..d0054ab 100644 --- a/src/core/actions/BaseAction.spec.ts +++ b/src/core/actions/BaseAction.spec.ts @@ -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"); diff --git a/src/core/actions/BaseAction.ts b/src/core/actions/BaseAction.ts index 54cf2a6..53918c3 100644 --- a/src/core/actions/BaseAction.ts +++ b/src/core/actions/BaseAction.ts @@ -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; diff --git a/src/core/actions/EndTurnAction.ts b/src/core/actions/EndTurnAction.ts index ac29b3f..2378aa9 100644 --- a/src/core/actions/EndTurnAction.ts +++ b/src/core/actions/EndTurnAction.ts @@ -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"); } diff --git a/src/core/actions/MoveAction.spec.ts b/src/core/actions/MoveAction.spec.ts index 681ff45..6538851 100644 --- a/src/core/actions/MoveAction.spec.ts +++ b/src/core/actions/MoveAction.spec.ts @@ -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 => { diff --git a/src/core/actions/MoveAction.ts b/src/core/actions/MoveAction.ts index 3d10618..c183de3 100644 --- a/src/core/actions/MoveAction.ts +++ b/src/core/actions/MoveAction.ts @@ -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`; diff --git a/src/core/actions/ToggleAction.ts b/src/core/actions/ToggleAction.ts index ff35dfc..60259e2 100644 --- a/src/core/actions/ToggleAction.ts +++ b/src/core/actions/ToggleAction.ts @@ -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; } diff --git a/src/core/actions/TriggerAction.ts b/src/core/actions/TriggerAction.ts index a18fd17..0bd5b72 100644 --- a/src/core/actions/TriggerAction.ts +++ b/src/core/actions/TriggerAction.ts @@ -91,7 +91,7 @@ module TK.SpaceTac { } } - getActionPointsUsage(ship: Ship, target: Target | null): number { + getPowerUsage(ship: Ship, target: Target | null): number { return this.power; } diff --git a/src/ui/battle/ActionIcon.spec.ts b/src/ui/battle/ActionIcon.spec.ts index 03617ce..4738994 100644 --- a/src/ui/battle/ActionIcon.spec.ts +++ b/src/ui/battle/ActionIcon.spec.ts @@ -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); diff --git a/src/ui/battle/ActionIcon.ts b/src/ui/battle/ActionIcon.ts index b2fddde..5029b4c 100644 --- a/src/ui/battle/ActionIcon.ts +++ b/src/ui/battle/ActionIcon.ts @@ -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"; diff --git a/src/ui/battle/ActionTooltip.ts b/src/ui/battle/ActionTooltip.ts index f888698..dbac640 100644 --- a/src/ui/battle/ActionTooltip.ts +++ b/src/ui/battle/ActionTooltip.ts @@ -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"; diff --git a/src/ui/battle/Targetting.ts b/src/ui/battle/Targetting.ts index d487021..22e3aa2 100644 --- a/src/ui/battle/Targetting.ts +++ b/src/ui/battle/Targetting.ts @@ -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);