1
0
Fork 0
spacetac/src/app/view/battle/LogProcessor.ts

132 lines
4.6 KiB
TypeScript
Raw Normal View History

2014-12-31 00:00:00 +00:00
module SpaceTac.View {
2015-01-07 00:00:00 +00:00
"use strict";
2014-12-31 00:00:00 +00:00
// Processor of battle log events
// This will process incoming battle events, and update the battleview accordingly
export class LogProcessor {
// Link to the battle view
private view: BattleView;
// Link to the battle
private battle: Game.Battle;
// Link to the battle log
private log: Game.BattleLog;
// Subscription identifier
private subscription: any;
// Create a log processor, linked to a battleview
constructor(view: BattleView) {
this.view = view;
this.battle = view.battle;
this.log = view.battle.log;
2015-01-07 00:00:00 +00:00
this.subscription = this.log.subscribe((event: Game.BaseLogEvent) => {
2014-12-31 00:00:00 +00:00
this.processBattleEvent(event);
});
this.battle.injectInitialEvents();
}
// Process a BaseLogEvent
processBattleEvent(event: Game.BaseLogEvent) {
console.log("Battle event", event);
switch (event.code) {
case "ship_change":
2015-02-03 00:00:00 +00:00
this.processShipChangeEvent(<Game.ShipChangeEvent>event);
break;
case "damage":
this.processDamageEvent(<Game.DamageEvent>event);
break;
case "move":
2015-02-03 00:00:00 +00:00
this.processMoveEvent(<Game.MoveEvent>event);
break;
case "attr":
2015-02-03 00:00:00 +00:00
this.processAttributeChangedEvent(<Game.AttributeChangeEvent>event);
break;
2015-02-18 00:00:00 +00:00
case "death":
this.processDeathEvent(<Game.DeathEvent>event);
break;
2015-02-20 00:00:00 +00:00
case "fire":
this.processFireEvent(<Game.FireEvent>event);
break;
case "endbattle":
this.view.setInteractionEnabled(false);
break;
2014-12-31 00:00:00 +00:00
}
}
// Destroy the log processor
destroy() {
if (this.subscription) {
this.log.unsubscribe(this.subscription);
this.subscription = null;
}
}
2015-02-03 00:00:00 +00:00
// Playing ship changed
2015-02-18 00:00:00 +00:00
private processShipChangeEvent(event: Game.ShipChangeEvent): void {
2015-02-03 00:00:00 +00:00
this.view.arena.setShipPlaying(event.target.ship);
2015-02-03 00:00:00 +00:00
this.view.ship_list.setPlaying(event.target.ship);
2015-02-03 00:00:00 +00:00
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));
2015-02-03 00:00:00 +00:00
}
// Damage to ship
2015-02-18 00:00:00 +00:00
private processDamageEvent(event: Game.DamageEvent): void {
2015-02-03 00:00:00 +00:00
var sprite = this.view.arena.findShipSprite(event.ship);
if (sprite) {
sprite.displayDamage(event.hull, event.shield);
}
}
// Ship moved
2015-02-18 00:00:00 +00:00
private processMoveEvent(event: Game.MoveEvent): void {
2015-02-03 00:00:00 +00:00
var sprite = this.view.arena.findShipSprite(event.ship);
if (sprite) {
sprite.moveTo(event.target.x, event.target.y, event.facing_angle, true);
}
}
// Ship attribute changed
2015-02-18 00:00:00 +00:00
private processAttributeChangedEvent(event: Game.AttributeChangeEvent): void {
2015-02-03 00:00:00 +00:00
var item = this.view.ship_list.findItem(event.ship);
if (item) {
item.attributeChanged(event.attribute);
}
if (event.ship === this.view.card_playing.ship) {
this.view.card_playing.attributeChanged(event.attribute);
}
if (event.ship === this.view.card_hovered.ship) {
this.view.card_hovered.attributeChanged(event.attribute);
}
2015-02-03 00:00:00 +00:00
}
2015-02-18 00:00:00 +00:00
// A ship died
private processDeathEvent(event: Game.DeathEvent): void {
2015-02-23 00:00:00 +00:00
if (this.view.ship_hovered === event.ship) {
this.view.setShipHovered(null);
}
2015-02-18 00:00:00 +00:00
this.view.arena.removeShip(event.ship);
this.view.ship_list.removeShip(event.ship);
}
2015-02-20 00:00:00 +00:00
// Weapon used
private processFireEvent(event: Game.FireEvent): void {
var source = Game.Target.newFromShip(event.ship);
var destination = event.target;
2015-02-20 00:00:00 +00:00
// Face the target
var attacker = this.view.arena.findShipSprite(event.ship);
var angle = source.getAngleTo(destination);
attacker.moveTo(source.x, source.y, angle, true);
var effect = new WeaponEffect(this.view.arena, source, destination, event.weapon.code);
2015-02-20 00:00:00 +00:00
effect.start();
}
2014-12-31 00:00:00 +00:00
}
2015-01-07 00:00:00 +00:00
}