1
0
Fork 0

Added player interaction status and icon

This commit is contained in:
Michaël Lemaire 2015-02-16 01:00:00 +01:00
parent 2239d1e06d
commit 97771a9b0a
11 changed files with 100 additions and 10 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View file

@ -41,15 +41,30 @@ module SpaceTac.Game {
}
// Create a quick random battle, for testing purposes
static newQuickRandom(): Battle {
static newQuickRandom(with_ai: boolean = false): Battle {
var player1 = Player.newQuickRandom("John");
var player2 = Player.newQuickRandom("Carl");
var result = new Battle(player1.fleet, player2.fleet);
if (with_ai) {
player2.ai = new AI.BullyAI(player2.fleet);
}
result.start();
return result;
}
// Check if a player is able to play
// This can be used by the UI to determine if player interaction is allowed
canPlay(player: Player): boolean {
if (this.ended) {
return false;
} else if (this.playing_ship.getPlayer() === player) {
return this.playing_ship.isAbleToPlay();
} else {
return false;
}
}
// Create play order, performing an initiative throw
throwInitiative(gen: RandomGenerator = new RandomGenerator()): void {
var play_order: Ship[] = [];
@ -160,6 +175,18 @@ module SpaceTac.Game {
if (this.playing_ship) {
this.playing_ship.startTurn(this.first_turn);
if (!this.playing_ship.isAbleToPlay()) {
// If the ship is not able to play, wait a little, then advance to the next one
setTimeout(() => {
this.advanceToNextShip(log);
}, 2000);
} else if (this.playing_ship.getPlayer().ai) {
// TODO If the ship is managed by an AI, let it get to work
setTimeout(() => {
this.advanceToNextShip(log);
}, 2000);
}
}
if (log) {
@ -178,7 +205,7 @@ module SpaceTac.Game {
ship.updateAttributes();
ship.restoreHealth();
});
this.advanceToNextShip(false);
this.advanceToNextShip();
}
// Force an injection of events in the battle log to simulate the initial state

View file

@ -6,9 +6,13 @@ module SpaceTac.Game {
// Current fleet
fleet: Fleet;
// AI playing (null for human player)
ai: AI.AbstractAI;
// Create a player, with an empty fleet
constructor() {
this.fleet = new Fleet(this);
this.ai = null;
}
// Create a quick random player, with a fleet, for testing purposes

View file

@ -0,0 +1,17 @@
module SpaceTac.Game.AI {
"use strict";
// Base class for all Artificial Intelligence interaction
export class AbstractAI {
// The battle this AI is involved in
battle: Battle;
// The fleet controlled by this AI
fleet: Fleet;
constructor(fleet: Fleet) {
this.fleet = fleet;
this.battle = fleet.battle;
}
}
}

View file

@ -0,0 +1,11 @@
/// <reference path="AbstractAI.ts"/>
module SpaceTac.Game.AI {
"use strict";
// Basic Artificial Intelligence, with a tendency to move forward and shoot the nearest enemy
export class BullyAI extends AbstractAI {
constructor(fleet: Fleet) {
super(fleet);
}
}
}

View file

@ -4,7 +4,7 @@ module SpaceTac.View {
export class Main extends Phaser.State {
create() {
// Switch to a test battle
var battle = Game.Battle.newQuickRandom();
var battle = Game.Battle.newQuickRandom(true);
this.game.state.start("battle", true, false, battle.fleets[0].player, battle);
}
}

View file

@ -11,12 +11,13 @@ module SpaceTac.View {
this.load.setPreloadSprite(this.preloadBar);
// Load assets
this.loadImage("battle/background.jpg");
this.loadImage("battle/waiting.png");
this.loadImage("battle/shiplist-base.png");
this.loadImage("battle/shiplist-normal.png");
this.loadImage("battle/shiplist-playing.png");
this.loadImage("battle/shiplist-own.png");
this.loadImage("battle/shiplist-enemy.png");
this.loadImage("battle/background.jpg");
this.loadImage("battle/arena/background.png");
this.loadImage("battle/actionbar.png");
this.loadImage("battle/action-inactive.png");

View file

@ -60,12 +60,16 @@ module SpaceTac.View {
var action_bar = this;
this.clearAll();
var actions = ship.getAvailableActions();
actions.forEach((action: Game.BaseAction) => {
action_bar.addAction(ship, action);
});
if (ship.getPlayer() === this.battleview.player) {
var actions = ship.getAvailableActions();
actions.forEach((action: Game.BaseAction) => {
action_bar.addAction(ship, action);
});
this.ship = ship;
this.ship = ship;
} else {
this.ship = null;
}
this.updateActionPoints();
}

View file

@ -40,6 +40,12 @@ module SpaceTac.View {
// Subscription to the battle log
log_processor: LogProcessor;
// True if player interaction is allowed
interacting: boolean;
// Indicator of interaction disabled
icon_waiting: Phaser.Image;
// Init the view, binding it to a specific battle
init(player: Game.Player, battle: Game.Battle) {
this.player = player;
@ -74,6 +80,11 @@ module SpaceTac.View {
this.card_playing = new ShipCard(this, 1060, 130);
this.card_hovered = new ShipCard(this, 1060, 430);
this.icon_waiting = new Phaser.Image(this.game, 640, 360, "battle-waiting", 0);
this.icon_waiting.anchor.set(0.5, 0.5);
game.add.existing(this.icon_waiting);
game.tweens.create(this.icon_waiting).to({"angle": 360}, 3000).repeat(-1).start();
// Start processing the battle log
this.log_processor = new LogProcessor(this);
}
@ -153,9 +164,22 @@ module SpaceTac.View {
}
}
// Enable or disable the global player interaction
// Disable interaction when it is the AI turn, or when the current ship can't play
setInteractionEnabled(enabled: boolean): void {
this.exitTargettingMode();
this.interacting = enabled;
this.icon_waiting.visible = !this.interacting;
}
// Enter targetting mode
// While in this mode, the Targetting object will receive hover and click events, and handle them
enterTargettingMode(): Targetting {
if (!this.interacting) {
return null;
}
if (this.targetting) {
this.exitTargettingMode();
}

View file

@ -62,6 +62,8 @@ module SpaceTac.View {
this.view.ship_list.setPlaying(event.target.ship);
this.view.card_playing.setShip(event.target.ship);
this.view.action_bar.setShip(event.target.ship);
this.view.setInteractionEnabled(this.battle.canPlay(this.view.player));
}
// Damage to ship

View file

@ -8,7 +8,7 @@ module SpaceTac.View.Specs {
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;
var player = battle.playing_ship.getPlayer();
ingame_it(desc, (game: Phaser.Game, state: Phaser.State) => {
func(battleview);
}, battleview, player, battle);