1
0
mirror of https://github.com/exane/not-gwent-online synced 2024-10-31 10:36:53 +00:00
not-gwent-online/server/Battleside.js
2015-06-14 16:01:25 +02:00

176 lines
3.8 KiB
JavaScript

var io = global.io;
var DeckData = require("../assets/data/deck");
var Deck = require("./Deck");
var Hand = require("./Hand");
var Card = require("./Card");
var Field = require("./Field");
var PubSub = require("pubsub-js");
var Battleside = (function(){
var Battleside = function(name, n, battle, user){
if(!(this instanceof Battleside)){
return (new Battleside(name, n, battle, user));
}
/**
* constructor here
*/
this._isWaiting = true;
this.socket = user.socket;
this.field = {};
this.field[Card.TYPE.LEADER] = Field(Card.TYPE.LEADER);
this.field[Card.TYPE.CLOSE_COMBAT] = Field(Card.TYPE.CLOSE_COMBAT);
this.field[Card.TYPE.RANGED] = Field(Card.TYPE.RANGED);
this.field[Card.TYPE.SIEGE] = Field(Card.TYPE.SIEGE);
this.n = n ? "p2" : "p1";
this._name = name;
this.battle = battle;
this.hand = Hand();
this.deck = Deck(DeckData["test"]);
PubSub.subscribe("turn/" + this.getID(), this.onTurnStart.bind(this));
};
var r = Battleside.prototype;
/**
* methods && properties here
* r.property = null;
* r.getProperty = function() {...}
*/
r._name = null;
r._discard = null;
/*r.leaderField = null;
r.closeField = null;
r._range = null;
r._siege = null;
r._field = null;*/
r._lives = 2;
r._score = 0;
r._isWaiting = null;
r.field = null;
r.socket = null;
r.n = null;
r.foe = null;
r.hand = null;
r.battle = null;
r.deck = null;
r.wait = function(){
this._isWaiting = true;
this.send("set:waiting", {waiting: this._isWaiting}, true);
}
r.turn = function() {
this._isWaiting = false;
this.send("set:waiting", {waiting: this._isWaiting}, true);
}
r.setLeadercard = function(){
var leaderCard = this.deck.find("type", Card.TYPE.LEADER);
this.deck.removeFromDeck(leaderCard[0]);
/*
this.getYourside().setField("leader", leaderCard[0]);*/
this.field[Card.TYPE.LEADER].add(leaderCard[0]);
}
r.getID = function() {
return this.n;
}
r.draw = function(times){
while(times--) {
var card = this.deck.draw();
this.hand.add(card);
}
console.log("update:hand fired");
this.update();
}
r.calcScore = function() {
var score = 0;
for(var key in this.field) {
score += +this.field[key].getScore();
}
return this._score = score;
}
r.getInfo = function(){
console.log(this.getName(), this._isWaiting);
return {
name: this.getName(),
lives: this._lives,
score: this.calcScore(),
hand: this.hand.length()
}
}
r.getName = function(){
return this._name;
}
r.send = function(event, msg, isPrivate){
msg = msg || {};
isPrivate = typeof isPrivate === "undefined" ? false : isPrivate;
msg._roomSide = this.n;
if(isPrivate) {
return this.socket.emit(event, msg);
}
this.battle.send(event, msg);
}
r.receive = function(event, cb) {
this.socket.on(event, cb);
}
r.update = function(){
this.send("update:info", {
info: this.getInfo(),
leader: this.field[Card.TYPE.LEADER].get()[0]
})
this.send("update:hand", {
cards: JSON.stringify(this.hand.getCards())
});
this.send("update:fields", {
close: this.field[Card.TYPE.CLOSE_COMBAT],
ranged: this.field[Card.TYPE.RANGED],
siege: this.field[Card.TYPE.SIEGE]
})
}
r.onTurnStart = function() {
this.foe.wait();
this.turn();
var self = this;
this.receive("play:cardFromHand", function(data) {
var cardID = data.id;
var card = self.hand.getCard(cardID);
self.hand.remove(cardID);
self.playCard(card);
})
};
r.playCard = function(card) {
if(card === -1) return;
var field = this.field[card.getType()];
field.add(card);
this.update();
PubSub.publish("nextTurn");
}
return Battleside;
})();
module.exports = Battleside;