WIP
This commit is contained in:
parent
bb67458180
commit
7079001885
1
TODO.md
1
TODO.md
|
@ -56,6 +56,7 @@ Battle
|
||||||
* Display the grid in targetting mode, with colors (replaces range hint)
|
* Display the grid in targetting mode, with colors (replaces range hint)
|
||||||
* Fix move-fire simulator's scanCircle
|
* Fix move-fire simulator's scanCircle
|
||||||
* Fix tactical AI scanArea
|
* Fix tactical AI scanArea
|
||||||
|
* Apply to action's default targets
|
||||||
* Add engine trail effect, and sound
|
* Add engine trail effect, and sound
|
||||||
* Find incentives to move from starting position (permanent drones or anomalies?)
|
* Find incentives to move from starting position (permanent drones or anomalies?)
|
||||||
* Mark targetting in error when target is refused by the action (there is already an arrow for this)
|
* Mark targetting in error when target is refused by the action (there is already an arrow for this)
|
||||||
|
|
|
@ -92,9 +92,11 @@ module TK.SpaceTac {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the target is a ship
|
* Returns true if the target is a ship
|
||||||
|
*
|
||||||
|
* If a ship or ship id is passed, also check that it is the targetted one
|
||||||
*/
|
*/
|
||||||
isShip(): boolean {
|
isShip(ship?: Ship | RObject): boolean {
|
||||||
return this.ship_id !== null;
|
return this.ship_id !== null && (typeof ship == "undefined" || rid(ship) == this.ship_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -17,7 +17,6 @@ module TK.SpaceTac {
|
||||||
var battle = new Battle(fleet1, fleet2);
|
var battle = new Battle(fleet1, fleet2);
|
||||||
if (!hexgrid) {
|
if (!hexgrid) {
|
||||||
battle.grid = new PixelGrid();
|
battle.grid = new PixelGrid();
|
||||||
battle.placeShips();
|
|
||||||
}
|
}
|
||||||
battle.ships.list().forEach(ship => TestTools.setShipModel(ship, 1, 0));
|
battle.ships.list().forEach(ship => TestTools.setShipModel(ship, 1, 0));
|
||||||
battle.play_order = fleet1.ships.concat(fleet2.ships);
|
battle.play_order = fleet1.ships.concat(fleet2.ships);
|
||||||
|
|
|
@ -12,19 +12,37 @@ module TK.SpaceTac.Specs {
|
||||||
check.equals(action.getVerb(ship), "Recall");
|
check.equals(action.getVerb(ship), "Recall");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test.case("provides a default target", check => {
|
||||||
|
let ship = new Ship();
|
||||||
|
let action = new DeployDroneAction("testdrone", undefined, { drone_radius: 50 });
|
||||||
|
ship.actions.addCustom(action);
|
||||||
|
|
||||||
|
check.equals(action.getDefaultTarget(ship), Target.newFromLocation(45, 0));
|
||||||
|
|
||||||
|
ship.actions.toggle(action, true);
|
||||||
|
|
||||||
|
check.equals(action.getDefaultTarget(ship), Target.newFromShip(ship));
|
||||||
|
});
|
||||||
|
|
||||||
test.case("allows to deploy in range", check => {
|
test.case("allows to deploy in range", check => {
|
||||||
let ship = new Ship();
|
let ship = new Ship();
|
||||||
ship.setArenaPosition(0, 0);
|
ship.setArenaPosition(0, 0);
|
||||||
let action = new DeployDroneAction("testdrone", { power: 0 }, { deploy_distance: 8 });
|
let action = new DeployDroneAction("testdrone", { power: 0 }, { deploy_distance: 8 });
|
||||||
ship.actions.addCustom(action);
|
ship.actions.addCustom(action);
|
||||||
|
|
||||||
check.equals(action.checkTarget(ship, new Target(8, 0, null)), true);
|
check.equals(action.checkTarget(ship, new Target(8, 0, null)), true, "deploy");
|
||||||
check.equals(action.checkTarget(ship, new Target(12, 0, null)), false);
|
check.equals(action.checkTarget(ship, new Target(12, 0, null)), false, "too far");
|
||||||
check.equals(action.checkTarget(ship, Target.newFromShip(ship)), false);
|
check.equals(action.checkTarget(ship, Target.newFromShip(ship)), false, "activate on self");
|
||||||
|
|
||||||
let other = new Ship();
|
let other = new Ship();
|
||||||
other.setArenaPosition(8, 0);
|
other.setArenaPosition(8, 0);
|
||||||
check.equals(action.checkTarget(ship, new Target(8, 0, other)), false);
|
check.equals(action.checkTarget(ship, Target.newFromShip(other)), false, "activate on other");
|
||||||
|
|
||||||
|
ship.actions.toggle(action, true);
|
||||||
|
|
||||||
|
check.equals(action.checkTarget(ship, new Target(8, 0, null)), false, "already activated");
|
||||||
|
check.equals(action.checkTarget(ship, Target.newFromShip(ship)), true, "recall");
|
||||||
|
check.equals(action.checkTarget(ship, Target.newFromShip(other)), false, "recall other");
|
||||||
});
|
});
|
||||||
|
|
||||||
test.case("deploys a new drone", check => {
|
test.case("deploys a new drone", check => {
|
||||||
|
|
|
@ -49,12 +49,16 @@ module TK.SpaceTac {
|
||||||
}
|
}
|
||||||
|
|
||||||
getDefaultTarget(ship: Ship): Target {
|
getDefaultTarget(ship: Ship): Target {
|
||||||
let harmful = any(this.effects, effect => !effect.isBeneficial());
|
if (ship.actions.isToggled(this)) {
|
||||||
let distance = this.drone_radius * (harmful ? 1.1 : 0.9);
|
return Target.newFromShip(ship);
|
||||||
return Target.newFromLocation(
|
} else {
|
||||||
ship.arena_x + Math.cos(ship.arena_angle) * distance,
|
let harmful = any(this.effects, effect => !effect.isBeneficial());
|
||||||
ship.arena_y + Math.sin(ship.arena_angle) * distance
|
let distance = this.drone_radius * (harmful ? 1.1 : 0.9);
|
||||||
);
|
return Target.newFromLocation(
|
||||||
|
ship.arena_x + Math.cos(ship.arena_angle) * distance,
|
||||||
|
ship.arena_y + Math.sin(ship.arena_angle) * distance
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getRangeRadius(ship: Ship): number {
|
getRangeRadius(ship: Ship): number {
|
||||||
|
@ -68,11 +72,19 @@ module TK.SpaceTac {
|
||||||
}
|
}
|
||||||
|
|
||||||
checkShipTarget(ship: Ship, target: Target): boolean {
|
checkShipTarget(ship: Ship, target: Target): boolean {
|
||||||
return false;
|
if (ship.actions.isToggled(this)) {
|
||||||
|
return target.isShip(ship);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
checkLocationTarget(ship: Ship, target: Target): boolean {
|
checkLocationTarget(ship: Ship, target: Target): boolean {
|
||||||
return arenaInRange(ship.location, target, this.deploy_distance);
|
if (ship.actions.isToggled(this)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return arenaInRange(ship.location, target, this.deploy_distance);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getSpecificDiffs(ship: Ship, battle: Battle, target: Target): BaseBattleDiff[] {
|
getSpecificDiffs(ship: Ship, battle: Battle, target: Target): BaseBattleDiff[] {
|
||||||
|
|
|
@ -28,10 +28,10 @@ module TK.SpaceTac.Specs {
|
||||||
ship1.actions.addCustom(action);
|
ship1.actions.addCustom(action);
|
||||||
|
|
||||||
var result = action.checkTarget(ship1, Target.newFromShip(ship1));
|
var result = action.checkTarget(ship1, Target.newFromShip(ship1));
|
||||||
check.equals(result, null);
|
check.equals(result, false);
|
||||||
|
|
||||||
result = action.checkTarget(ship1, Target.newFromShip(ship2));
|
result = action.checkTarget(ship1, Target.newFromShip(ship2));
|
||||||
check.equals(result, null);
|
check.equals(result, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
test.case("applies and reverts", check => {
|
test.case("applies and reverts", check => {
|
||||||
|
|
Loading…
Reference in a new issue