diff --git a/client/js/client.js b/client/js/client.js
index 17fea44..ceab1fa 100644
--- a/client/js/client.js
+++ b/client/js/client.js
@@ -1,5 +1,4 @@
-/*("http://localhost:16918")*/
-var socketCluster = require("socketcluster-client");
+var socket = require("socket.io-client");
var Backbone = require("backbone");
require("./backbone.modal-min");
var Handlebars = require("handlebars");
@@ -21,7 +20,7 @@ var App = Backbone.Router.extend({
Backbone.history.start();
},
connect: function(){
- this.socket = socketCluster.connect(Config.Server);
+ this.socket = socket(Config.Server.hostname + ":" + Config.Server.port);
},
receive: function(event, cb){
this.socket.on(event, cb);
@@ -235,7 +234,7 @@ var BattleView = Backbone.View.extend({
var interval = setInterval(function(){
if(!user.get("room")) return;
- this.setUpBattleEvents(user.get("room"));
+ this.setUpBattleEvents();
this.app.send("request:gameLoaded", {_roomID: user.get("room")});
clearInterval(interval);
}.bind(this), 10);
@@ -380,7 +379,7 @@ var BattleView = Backbone.View.extend({
calculateCardMargin(this.$el.find(".field-hand .card"), 538, 70, this.handCards.length);
}
- if(this.user.get("isReDrawing")) {
+ if(this.user.get("isReDrawing")){
this.user.set("handCards", this.handCards);
var modal = new ReDrawModal({model: this.user});
this.$el.prepend(modal.render().el);
@@ -421,12 +420,50 @@ var BattleView = Backbone.View.extend({
this.app.send("activate:leader")
},
- setUpBattleEvents: function(channelName){
- this.battleChannel = this.app.socket.subscribe(channelName);
+ setUpBattleEvents: function(){
var self = this;
var user = this.user;
+ var app = user.get("app");
- this.battleChannel.watch(function(d){
+ app.on("update:hand", function(data) {
+ if(user.get("roomSide") == data._roomSide){
+ self.handCards = JSON.parse(data.cards);
+ self.user.set("handCards", app.handCards);
+ self.render();
+ }
+ })
+ app.on("update:info", function(data) {
+ var _side = data._roomSide;
+ var infoData = data.info;
+ var leader = data.leader;
+
+ var side = self.yourSide;
+ if(user.get("roomSide") != _side){
+ side = self.otherSide;
+ }
+ side.infoData = infoData;
+ side.leader = leader;
+
+ side.infoData.discard = JSON.parse(side.infoData.discard);
+
+ side.render();
+ })
+
+ app.on("update:fields", function(data) {
+ var _side = data._roomSide;
+
+ var side = self.yourSide;
+ if(user.get("roomSide") != _side){
+ side = self.otherSide;
+ }
+ side.field.close = data.close;
+ side.field.ranged = data.ranged;
+ side.field.siege = data.siege;
+ side.field.weather = data.weather;
+ side.render();
+ })
+
+ /*this.battleChannel.watch(function(d){
var event = d.event, data = d.data;
if(event === "update:hand"){
@@ -465,7 +502,7 @@ var BattleView = Backbone.View.extend({
side.field.weather = data.weather;
side.render();
}
- })
+ })*/
}
});
@@ -525,7 +562,8 @@ var User = Backbone.Model.extend({
},
initialize: function(){
var self = this;
- var app = this.get("app");
+ var user = this;
+ var app = user.get("app");
this.listenTo(this.attributes, "change:room", this.subscribeRoom);
@@ -541,10 +579,10 @@ var User = Backbone.Model.extend({
app.navigate("battle", {trigger: true});
})
- app.receive("response:createRoom", function(roomID){
+ /*app.receive("response:createRoom", function(roomID){
self.set("room", roomID);
console.log("room created", roomID);
- });
+ });*/
app.receive("response:joinRoom", function(roomID){
self.set("room", roomID);
@@ -584,15 +622,25 @@ var User = Backbone.Model.extend({
self.set("setHorn", data.cardID);
})
- app.receive("redraw:cards", function() {
+ app.receive("redraw:cards", function(){
self.set("isReDrawing", true);
})
- app.receive("redraw:close", function() {
+ app.receive("redraw:close", function(){
self.set("isReDrawing", false);
})
- app.on("createRoom", this.createRoom, this);
+ app.receive("update:hand", function(data){
+ app.trigger("update:hand", data);
+ })
+ app.receive("update:fields", function(data){
+ app.trigger("update:fields", data);
+ })
+ app.receive("update:info", function(data){
+ app.trigger("update:info", data);
+ })
+
+ app.on("startMatchmaking", this.startMatchmaking, this);
app.on("joinRoom", this.joinRoom, this);
app.on("setName", this.setName, this);
app.on("setDeck", this.setDeck, this);
@@ -600,16 +648,18 @@ var User = Backbone.Model.extend({
app.send("request:name", this.get("name") == "unnamed" ? null : {name: this.get("name")});
},
- createRoom: function(){
- this.get("app").send("request:createRoom");
+ startMatchmaking: function(){
+ this.set("inMatchmakerQueue", true);
+ this.get("app").send("request:matchmaking");
},
joinRoom: function(){
this.get("app").send("request:joinRoom");
+ this.set("inMatchmakerQueue", false);
},
subscribeRoom: function(){
var room = this.get("room");
var app = this.get("app");
- app.socket.subscribe(room);
+ //app.socket.subscribe(room);
},
setName: function(name){
this.get("app").send("request:name", {name: name});
@@ -636,8 +686,8 @@ var Lobby = Backbone.View.extend({
this.render();
},
events: {
- "click .create-room": "createRoom",
- "click .join-room": "joinRoom",
+ "click .startMatchmaking": "startMatchmaking",
+ /*"click .join-room": "joinRoom",*/
"blur .name-input": "changeName",
"change #deckChoice": "setDeck"
},
@@ -646,8 +696,8 @@ var Lobby = Backbone.View.extend({
/*this.$el.find("#deckChoice option[value='" + this.app.user.get("setDeck") + "']").attr("selected", "selected")*/
return this;
},
- createRoom: function(){
- this.app.trigger("createRoom");
+ startMatchmaking: function(){
+ this.app.trigger("startMatchmaking");
},
joinRoom: function(){
this.app.trigger("joinRoom");
diff --git a/client/templates/lobby.handlebars b/client/templates/lobby.handlebars
index 0349e6c..110d51e 100644
--- a/client/templates/lobby.handlebars
+++ b/client/templates/lobby.handlebars
@@ -14,8 +14,11 @@
-
-
+
+
diff --git a/package.json b/package.json
index 7d2295a..c233cfe 100644
--- a/package.json
+++ b/package.json
@@ -10,8 +10,8 @@
"minimist": "1.1.0",
"serve-static": "1.8.0",
"shortid": "^2.2.2",
- "socketcluster": "2.2.x",
- "socketcluster-client": "2.2.x",
+ "socket.io": "^1.3.5",
+ "socket.io-client": "^1.3.5",
"underscore": "^1.8.3"
},
"devDependencies": {
diff --git a/server/Battle.js b/server/Battle.js
index 5883230..570d193 100644
--- a/server/Battle.js
+++ b/server/Battle.js
@@ -46,7 +46,7 @@ var Battle = (function(){
this.on("AfterPlace", this.checkAbilityOnAfterPlace)*/
- this.channel = this.socket.subscribe(this._id);
+ //this.channel = this.socket.subscribe(this._id);
this.p1 = Battleside(this._user1.getName(), 0, this, this._user1);
this.p2 = Battleside(this._user2.getName(), 1, this, this._user2);
this.p1.foe = this.p2;
@@ -67,25 +67,16 @@ var Battle = (function(){
Promise.when(this.p1.reDraw(2), this.p2.reDraw(2))
- .then(function() {
+ .then(function(){
this.on("NextTurn", this.switchTurn);
this.switchTurn(Math.random() > .5 ? this.p1 : this.p2);
}.bind(this));
-
-
-
- /*
- this.on("NextTurn", this.switchTurn);
-
- this.switchTurn(Math.random() > .5 ? this.p1 : this.p2);*/
}
r.switchTurn = function(side, __flag){
__flag = typeof __flag == "undefined" ? 0 : 1;
- /*side.foe.wait();*/
-
if(!(side instanceof Battleside)){
console.trace("side is not a battleside!");
@@ -98,13 +89,12 @@ var Battle = (function(){
return this.switchTurn(side.foe, 1);
}
+
this.runEvent("EachTurn");
- //setTimeout(function() {
this.runEvent("Turn" + side.getID());
- //}.bind(this), 1000);
- console.log("current Turn: ", side.getName());
+ console.log("current Turn: ", side.getName());
}
r.startNextRound = function(){
@@ -130,27 +120,33 @@ var Battle = (function(){
this._update(this.p2);
}
- r._update = function(p){
+ r.updateSelf = function(side) {
+ this._update(side, true);
+ }
+
+ r._update = function(p, isPrivate){
+ isPrivate = isPrivate || false;
p.send("update:info", {
info: p.getInfo(),
leader: p.field[Card.TYPE.LEADER].get()[0]
- })
+ }, isPrivate)
p.send("update:hand", {
cards: JSON.stringify(p.hand.getCards())
- });
+ },isPrivate);
p.send("update:fields", {
close: p.field[Card.TYPE.CLOSE_COMBAT].getInfo(),
ranged: p.field[Card.TYPE.RANGED].getInfo(),
siege: p.field[Card.TYPE.SIEGE].getInfo(),
weather: p.field[Card.TYPE.WEATHER].getInfo()
- })
+ }, isPrivate);
}
r.send = function(event, data){
- this.channel.publish({
+ /*this.channel.publish({
event: event,
data: data
- });
+ });*/
+ io.sockets.in(this._id).emit(event, data);
}
r.runEvent = function(eventid, ctx, args, uid){
@@ -175,7 +171,7 @@ var Battle = (function(){
obj.cb.apply(ctx, obj.onArgs.concat(args));
}
}
- this.update();
+ //this.update();
}
r.on = function(eventid, cb, ctx, args){
diff --git a/server/Battleside.js b/server/Battleside.js
index 4d07cc9..6426288 100644
--- a/server/Battleside.js
+++ b/server/Battleside.js
@@ -78,7 +78,7 @@ Battleside = (function(){
})
this.receive("set:passing", function(){
self.setPassing(true);
- self.update();
+ //self.update();
self.runEvent("NextTurn", null, [self.foe]);
})
this.receive("medic:chooseCardFromDiscard", function(data){
@@ -210,10 +210,6 @@ Battleside = (function(){
var card = this.deck.draw();
this.hand.add(card);
}
-
- console.log("update:hand fired");
-
- /*this.update();*/
}
r.calcScore = function(){
@@ -266,9 +262,9 @@ Battleside = (function(){
this.socket.on(event, cb);
}
- r.update = function(){
- //PubSub.publish("update");
- this.runEvent("Update");
+ r.update = function(self){
+ self = self || false;
+ this.runEvent("Update", null, [self]);
}
r.onTurnStart = function(){
@@ -325,7 +321,6 @@ Battleside = (function(){
this.checkAbilityOnAfterPlace(card, obj);
- this.update();
if(obj._waitResponse){
this.hand.remove(card);
@@ -333,6 +328,8 @@ Battleside = (function(){
return 0;
}
+ this.update();
+
return 1;
}
@@ -409,7 +406,7 @@ Battleside = (function(){
}
if(ability && ability.name === obj.suppress){
- this.update();
+ //this.update();
}
if(ability && !Array.isArray(ability)){
@@ -454,7 +451,6 @@ Battleside = (function(){
self.hand.add(replaceCard);
self.hand.remove(card);
- self.update();
self.runEvent("NextTurn", null, [self.foe]);
})
@@ -472,7 +468,7 @@ Battleside = (function(){
card._uidEvents["WeatherChange"] = uid;
}
- this.update();
+ //this.update();
}
}
@@ -480,7 +476,7 @@ Battleside = (function(){
var ability = card.getAbility();
if(ability){
if(ability.name && ability.name === obj.suppress){
- this.update();
+ //this.update();
return;
}
if(ability.onAfterPlace){
@@ -529,7 +525,7 @@ Battleside = (function(){
_card.setForcedPower(forcedPower);
});
this.runEvent("WeatherChange");
- this.update();
+ //this.update();
}
r.clearMainFields = function(){
@@ -633,17 +629,20 @@ Battleside = (function(){
self.deck.add(card);
self.deck.shuffle();
self.draw(1);
- self.update();
if(!left) {
self.send("redraw:close", null, true);
console.log("redraw finished");
deferred.resolve("done");
+ //self.socket.off("redraw:reDrawCard", h1);
}
+ /*self.update(self);*/
+ self.battle.updateSelf(self);
})
this.receive("redraw:close_client", function() {
console.log("redraw finished!");
deferred.resolve("done");
+ //self.socket.off("redraw:close_client", h2);
})
return deferred;
diff --git a/server/Matchmaker.js b/server/Matchmaker.js
index acf1c57..3052f5c 100644
--- a/server/Matchmaker.js
+++ b/server/Matchmaker.js
@@ -1,9 +1,9 @@
var Promise = require("promise");
var Matchmaker = (function(){
- var Matchmaker = function(connections){
+ var Matchmaker = function(){
if(!(this instanceof Matchmaker)){
- return (new Matchmaker(connections));
+ return (new Matchmaker());
}
/**
* constructor here
@@ -23,47 +23,47 @@ var Matchmaker = (function(){
r._queue = null;
r._connections = null;
- r.findOpponent = function(user){
- var self = this;
-
- var promise = new Promise(function(resolve){
- self._queue.push(user);
- self._checkForOpponent(resolve);
- });
- return promise;
- }
-
- r._checkForOpponent = function(resolve){
- if(this._queue.length <= 1) return;
- console.log(this._queue.length);
- if(!this._checkConnections()) return;
- this._match(this._queue[0], this._queue[1], resolve);
- }
-
- r._match = function(p1, p2, resolve){
- this._queue.splice(0, 2);
- var roomID = p1.id + p2.id;
- p1.send("get:opponent", {socketID: p2.getID()});
- p2.send("get:opponent", {socketID: p1.getID()});
-
- p1.joinRoom(roomID);
- p2.joinRoom(roomID);
-
- resolve(p1, p2, roomID);
- }
-
- r._checkConnections = function() {
- var res = true;
- var self = this;
-
- this._queue.forEach(function(user, index) {
- if(!self._connections.hasUser(user)) {
- self._queue.splice(index, 1);
- res = false;
+ r.removeFromQueue = function(user){
+ for(var i = 0; i < this._queue.length; i++) {
+ var u = this._queue[i];
+ if(u.getID() === user.getID()) {
+ user._inQueue = false;
+ return this._queue.splice(i, 1);
}
- });
+ }
+ }
- return res;
+ r.findOpponent = function(user){
+ var c = connections;
+
+ var found = this._checkForOpponent();
+
+ if(found){
+
+ var room = Room();
+ c.roomCollection[room.getID()] = room;
+ room.join(user);
+ room.join(found);
+ user._inQueue = false;
+ found._inQueue = false;
+ return room;
+ }
+
+ this._getInQueue(user);
+ }
+
+ r._getInQueue = function(user){
+ console.log(user.getName() + " joined in queue");
+ this._queue.push(user);
+ user._inQueue = true;
+ }
+
+
+ r._checkForOpponent = function(){
+ if(!this._queue.length) return null;
+ var foe = this._queue.splice(0, 1)[0];
+ foe._inQueue = false;
+ return foe;
}
diff --git a/server/Room.js b/server/Room.js
index 212dd1c..157356b 100644
--- a/server/Room.js
+++ b/server/Room.js
@@ -2,9 +2,9 @@ var shortid = require("shortid");
var Battle = require("./Battle");
var Room = (function(){
- var Room = function(scServer){
+ var Room = function(){
if(!(this instanceof Room)){
- return (new Room(scServer));
+ return (new Room());
}
/**
* constructor here
@@ -14,7 +14,7 @@ var Room = (function(){
this._id = shortid.generate();
this._users = [];
this._ready = {};
- this.socket = scServer.global;
+ //this.socket = scServer.global;
console.log("room created: " + this.getID());
@@ -40,6 +40,8 @@ var Room = (function(){
if(this._users.length >= 2) return;
this._users.push(user);
user.addRoom(this);
+ user.socket.join(this.getID());
+ user.send("response:joinRoom", this.getID());
if(!this.isOpen()){
this.initBattle();
@@ -55,7 +57,7 @@ var Room = (function(){
}
r.initBattle = function(){
- this._battle = Battle(this._id, this._users[0], this._users[1], this.socket);
+ this._battle = Battle(this._id, this._users[0], this._users[1], io);
this._users[0].send("init:battle", {side: "p1"});
this._users[1].send("init:battle", {side: "p2"});
}
diff --git a/server/Socket.js b/server/Socket.js
index efb40b5..cc601e5 100644
--- a/server/Socket.js
+++ b/server/Socket.js
@@ -1,11 +1,8 @@
-/*
-var app = require('http').createServer();
-global.io = require("socket.io")(app);
-var User = require("./User");
+/*var app = require('http').createServer();
+global.io = require("socket.io")(app);*/
+/*var User = require("./User");
var Connections = require("./Connections");
-var Battle = require("./Battle");
-var Npc = require("./Npc");
-var Room = require("./Room");
+var Room = require("./Room");*/
var Socket = (function(){
@@ -13,39 +10,28 @@ var Socket = (function(){
if(!(this instanceof Socket)){
return (new Socket());
}
- */
-/**
+ /**
* constructor here
- *//*
-
+ */
this.connections = Connections();
- */
-/*
- this.matchmaker = Matchmaker(this.connections);
- *//*
-
this.roomCollection = {};
app.listen(this.port);
this.io = io;
this._events();
};
var r = Socket.prototype;
- */
-/**
+ /**
* methods && properties here
* r.property = null;
* r.getProperty = function() {...}
- *//*
-
+ */
r.io = null;
r.port = 16918;
r.connections = null;
r.roomCollection = null;
- */
-/*
+ /*
r.matchmaker = null;
- *//*
-
+ */
r._events = function(){
var self = this;
@@ -102,4 +88,4 @@ var Socket = (function(){
return Socket;
})();
-module.exports = Socket;*/
+module.exports = Socket;
\ No newline at end of file
diff --git a/server/User.js b/server/User.js
index 4ce88fd..587fdbb 100644
--- a/server/User.js
+++ b/server/User.js
@@ -12,6 +12,8 @@ var User = (function(){
this._rooms = [];
this._id = socket.id;
this.generateName();
+
+ this._events();
};
var r = User.prototype;
/**
@@ -23,7 +25,7 @@ var User = (function(){
r._id = null;
r._name = null;
r._rooms = null;
- r._searching = false;
+ r._inQueue = false;
r.socket = null;
r.disconnected = false;
@@ -31,13 +33,13 @@ var User = (function(){
return this._id;
}
- r.joinRoom = function(roomid){
+ /*r.joinRoom = function(roomid){
var self = this;
- /*this.socket.on(roomid, function(d) {
+ *//*this.socket.on(roomid, function(d) {
var event = d.event, data = d.data;
self.socket.on(event, data);
- });*/
- }
+ });*//*
+ }*/
r.send = function(event, data, room){
room = room || null;
@@ -45,12 +47,12 @@ var User = (function(){
if(!room){
this.socket.emit(event, data);
}
- else {/*
- this.socket.to(room).emit(event, data);*/
- this.socket.global.publish(room, {
+ else {
+ this.socket.to(room).emit(event, data);
+ /*this.socket.global.publish(room, {
event: event,
data: data
- })
+ })*/
}
}
@@ -102,6 +104,8 @@ var User = (function(){
var self = this;
this.disconnected = true;
+ matchmaking.removeFromQueue(this);
+
this._rooms.forEach(function(room) {
room.leave(self);
if(!room.hasUser()) {
@@ -113,6 +117,57 @@ var User = (function(){
this.cleanUp();
}
+ r._events = function() {
+ var socket = this.socket;
+ var self = this;
+
+ socket.on("request:name", function(data){
+ if(data && data.name){
+ self.setName(data.name);
+ }
+ socket.emit("response:name", {name: self.getName()});
+ })
+
+ /*socket.on("request:createRoom", function(){
+ var room = Room();
+ connections.roomCollection[room.getID()] = room;
+ room.join(self);
+ console.log("room %s created by %s", room.getID(), self.getName());
+ self.send("response:createRoom", room.getID());
+ })
+
+ socket.on("request:joinRoom", function(){
+ console.log("joinroom");
+ var interval = setInterval(function(){
+ for(var key in connections.roomCollection) {
+ var room = connections.roomCollection[key];
+ if(!room.isOpen()) continue;
+ room.join(self);
+ clearInterval(interval);
+ console.log("user %s joined room %s", self.getName(), room.getID());
+ self.send("response:joinRoom", room.getID());
+ }
+ }, 1000);
+ })*/
+
+ socket.on("request:matchmaking", function() {
+ if(self._inQueue) return;
+ matchmaking.findOpponent(self);
+ });
+
+ socket.on("request:gameLoaded", function(data){
+ console.log(data);
+ connections.roomCollection[data._roomID].setReady(self);
+ })
+
+ socket.on("set:deck", function(data) {
+ console.log(data);
+ if(data && data.deck){
+ self.setDeck(data.deck);
+ }
+ })
+
+ }
return User;
})();
diff --git a/server/server.js b/server/server.js
index e7ea4b7..32eab77 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1,6 +1,7 @@
var argv = require('minimist')(process.argv.slice(2));
-var SocketCluster = require('socketcluster').SocketCluster;
+/*var SocketCluster = require('socketcluster').SocketCluster;*/
+/*
var socketCluster = new SocketCluster({
workers: Number(argv.w) || 1,
stores: Number(argv.s) || 1,
@@ -10,4 +11,34 @@ var socketCluster = new SocketCluster({
storeController: __dirname + '/store.js',
socketChannelLimit: 100,
rebootWorkerOnCrash: argv['auto-reboot'] != false
-});
\ No newline at end of file
+});*/
+
+global.connections = require("./Connections")();
+
+global.matchmaking = require("./Matchmaker")();
+
+global.Room = require("./Room");
+
+global.User = require("./User");
+
+/*global.Socket = require("./Socket");*/
+
+
+var app = require('http').createServer();
+global.io = require("socket.io")(app);
+
+app.listen(16918);
+
+io.on("connection", function(socket) {
+ var user;
+ connections.add(user = User(socket));
+ console.log("new user ", user.getName());
+
+ socket.on("disconnect", function() {
+ connections.remove(user);
+ user.disconnect();
+ console.log("user ", user.getName(), " disconnected");
+ user = null;
+ })
+
+})
\ No newline at end of file