namespace TK.SpaceTac { /** * A tool to manipulate battle plans (action plans for all involved ships, for one turn) */ export class BattlePlanning { private plan: BattlePlan constructor(private battle: Battle, readonly player?: Player) { this.plan = { fleets: battle.fleets.map(fleet => ({ fleet: fleet.id, ships: fleet.ships.map(ship => ({ ship: ship.id, actions: [] })) })) }; } getBattlePlan(): BattlePlan { return this.plan; } getFleetPlan(fleet: Fleet): FleetPlan { const fplan = first(this.plan.fleets, ifleet => fleet.is(ifleet.fleet)); return fplan || { fleet: -1, ships: [] }; } getShipPlan(ship: Ship): ShipPlan { const fplan = this.getFleetPlan(ship.fleet); const splan = first(fplan.ships, iship => ship.is(iship.ship)); return splan || { ship: -1, actions: [] }; } /** * Add an action to a ship plan */ addAction(ship: Ship, action: BaseAction, target?: Target) { const plan = this.getShipPlan(ship); if (any(plan.actions, iaction => action.is(iaction.action))) { // TODO replace (or remove if toggle action ?) } else { plan.actions.push({ action: action.id, target }); } } } export type BattlePlan = { fleets: FleetPlan[] } export type FleetPlan = { fleet: RObjectId, ships: ShipPlan[] } export type ShipPlan = { ship: RObjectId actions: ActionPlan[] } export type ActionPlan = { action: RObjectId target?: Target } }