diff --git a/src/scripts/game/specs/BattleLog.spec.ts b/src/scripts/game/specs/BattleLog.spec.ts index 0e5a67b..4b5b45f 100644 --- a/src/scripts/game/specs/BattleLog.spec.ts +++ b/src/scripts/game/specs/BattleLog.spec.ts @@ -1,4 +1,5 @@ /// +/// module SpaceTac.Game { "use strict"; diff --git a/src/scripts/view/battle/BattleView.ts b/src/scripts/view/battle/BattleView.ts index 38a3b20..f07eed7 100644 --- a/src/scripts/view/battle/BattleView.ts +++ b/src/scripts/view/battle/BattleView.ts @@ -142,8 +142,12 @@ module SpaceTac.View { setShipHovered(ship: Game.Ship): void { this.ship_hovered = ship; this.card_hovered.setShip(ship); - if (this.targetting && ship) { - this.targetting.setTargetShip(ship); + if (this.targetting) { + if (ship) { + this.targetting.setTargetShip(ship); + } else { + this.targetting.unsetTarget(); + } } } diff --git a/src/scripts/view/battle/Targetting.ts b/src/scripts/view/battle/Targetting.ts index db3842e..673b54a 100644 --- a/src/scripts/view/battle/Targetting.ts +++ b/src/scripts/view/battle/Targetting.ts @@ -4,6 +4,9 @@ module SpaceTac.View { // Targetting system // Allows to pick a target for an action export class Targetting { + // Current target + target: Game.Target; + // Signal to receive hovering events targetHovered: Phaser.Signal; @@ -19,9 +22,6 @@ module SpaceTac.View { // Source of the targetting private source: PIXI.Sprite; - // Current target - private target: Game.Target; - // Create a default targetting mode constructor(battleview: BattleView) { this.battleview = battleview; diff --git a/src/scripts/view/specs/BattleView.spec.ts b/src/scripts/view/specs/BattleView.spec.ts new file mode 100644 index 0000000..6928579 --- /dev/null +++ b/src/scripts/view/specs/BattleView.spec.ts @@ -0,0 +1,103 @@ +/// +/// +/// + +module SpaceTac.View.Specs { + "use strict"; + + export function inbattleview_it(desc: string, func: (battleview: BattleView) => void) { + var battleview = new BattleView(); + var battle = Game.Battle.newQuickRandom(); + var player = battle.fleets[0].player; + ingame_it(desc, (game: Phaser.Game, state: Phaser.State) => { + func(battleview); + }, battleview, player, battle); + } + + describe("BattleView", () => { + inbattleview_it("forwards events in targetting mode", (battleview: BattleView) => { + expect(battleview.targetting).toBeNull(); + + battleview.cursorInSpace(5, 5); + + expect(battleview.targetting).toBeNull(); + + // Enter targetting mode + var result = battleview.enterTargettingMode(); + + expect(battleview.targetting).toBeTruthy(); + expect(result).toBe(battleview.targetting); + + // Collect targetting events + var hovered = []; + var clicked = []; + result.targetHovered.add((target: Game.Target) => { + hovered.push(target); + }); + result.targetSelected.add((target: Game.Target) => { + clicked.push(target); + }); + + // Forward selection in space + battleview.cursorInSpace(8, 4); + + expect(battleview.ship_hovered).toBeNull(); + expect(battleview.targetting.target).toEqual(Game.Target.newFromLocation(8, 4)); + + // Process a click on space + battleview.cursorClicked(); + + // Forward ship hovering + battleview.cursorOnShip(battleview.battle.play_order[0]); + + expect(battleview.ship_hovered).toEqual(battleview.battle.playing_ship); + expect(battleview.targetting.target).toEqual(Game.Target.newFromShip(battleview.battle.playing_ship)); + + // Don't leave a ship we're not hovering + battleview.cursorOffShip(battleview.battle.play_order[1]); + + expect(battleview.ship_hovered).toEqual(battleview.battle.playing_ship); + expect(battleview.targetting.target).toEqual(Game.Target.newFromShip(battleview.battle.playing_ship)); + + // Don't move in space while on ship + battleview.cursorInSpace(1, 3); + + expect(battleview.ship_hovered).toEqual(battleview.battle.playing_ship); + expect(battleview.targetting.target).toEqual(Game.Target.newFromShip(battleview.battle.playing_ship)); + + // Process a click on ship + battleview.cursorClicked(); + + // Leave the ship + battleview.cursorOffShip(battleview.battle.play_order[0]); + + expect(battleview.ship_hovered).toBeNull(); + expect(battleview.targetting.target).toBeNull(); + + // Quit targetting + battleview.exitTargettingMode(); + + expect(battleview.targetting).toBeNull(); + + // Events process normally + battleview.cursorInSpace(8, 4); + expect(battleview.ship_hovered).toBeNull(); + battleview.cursorOnShip(battleview.battle.play_order[0]); + expect(battleview.ship_hovered).toEqual(battleview.battle.playing_ship); + + // Quit twice don't do anything + battleview.exitTargettingMode(); + + // Check collected targetting events + expect(hovered).toEqual([ + Game.Target.newFromLocation(8, 4), + Game.Target.newFromShip(battleview.battle.playing_ship), + null + ]); + expect(clicked).toEqual([ + Game.Target.newFromLocation(8, 4), + Game.Target.newFromShip(battleview.battle.playing_ship), + ]); + }); + }); +} diff --git a/src/scripts/view/specs/TestGame.ts b/src/scripts/view/specs/TestGame.ts index c404a34..c7d7fef 100644 --- a/src/scripts/view/specs/TestGame.ts +++ b/src/scripts/view/specs/TestGame.ts @@ -3,29 +3,28 @@ module SpaceTac.View.Specs { "use strict"; - // Internal test state for Phaser - class TestState extends Phaser.State { - private testfunc: (game: Phaser.Game) => void; - private donefunc: () => void; - - init(testfunc: (game: Phaser.Game) => void, donefunc: () => void) { - this.testfunc = testfunc; - this.donefunc = donefunc; - } - - create() { - this.testfunc(this.game); - this.game.destroy(); - this.donefunc(); - } - } - // Test game wrapper (use instead of jasmine 'it') - export function ingame_it(desc: string, func: (game: Phaser.Game) => void) { + export function ingame_it(desc: string, func: (game: Phaser.Game, state: Phaser.State) => void, + state: Phaser.State = null, ...stateargs: any[]) { it(desc, (done: () => void) => { var game = new Phaser.Game(500, 500, Phaser.HEADLESS); - game.state.add("main", TestState); - game.state.start("main", true, true, func, done); + + if (!state) { + state = new Phaser.State(); + } + + var orig_create = state.create; + state.create = function() { + orig_create.apply(state); + func(game, state); + done(); + }; + + game.state.add("test", state); + stateargs.unshift(true); + stateargs.unshift(true); + stateargs.unshift("test"); + game.state.start.apply(game.state, stateargs); }); } }