diff --git a/googletrendsgame/server/room.js b/googletrendsgame/server/room.js new file mode 100644 index 0000000..0c48eb7 --- /dev/null +++ b/googletrendsgame/server/room.js @@ -0,0 +1,286 @@ +/** + * Object used for storing rooms + * @param capacityP -- the number of people that can be in room + * @param pass -- the room password -- null if none + * @param owner -- the person who is creating the room + */ + +//used for the getting the word array +const utils = require("./utils.js"); + + + +class Room +{ + //max capacity of room -- default is 4 for now + var capacity; + +//name of the room + var roomName; + +//list of words used in the game +//7 for now will change later to be room specific + var words = utils.getRandomWords(7); + + var currentWord = words.pop(); + +//list players -- so we can push requests to them + var users = []; + +//increments when rounds pass + var currentRound = 0; + +// the password of the room -- null if no password + var password; + + /** + 1 = Waiting for users + 2 = Word shown, Waiting for response from users + 3 = Showing Result + 4 = Game Over, Display Final Results + */ + var state = 1; +} + +module.exports = + { + /** + * Constructor for the module to initialise variables + * @param capacityP + * @param pass + * @param owner + */ + createRoom: function(capacityP, pass, owner) + { + this.addUser(owner); + password = pass; + capacity = capacityP; + roomName = owner.name; + }, + + /** + * creates json to send in the 'roomUpdate' socket event + * + * {users: gameState: roundWinner: currentWord: } + */ + generateRoomUpdate: function() + { + var result = new Object(); + + result.users = []; + + users.forEach(function(u) + { + result.users.push(u.genJASON()); + }); + + //sort the users based on score + var countOuter = 0; + var countInner = 0; + var countSwap = 0; + + // var swapped; + // do + // { + // countOuter++; + // swapped = false; + // for(var i = 0; i < result.users.length; i++) + // { + // countInner++; + // if(result.users[i].score && result.users[i + 1].score && + // result.users[i].score > result.users[i + 1].score) + // { + // countSwap++; + // var temp = result.users[i]; + // result.users[i] = result.users[j]; + // result.users[j] = temp; + // swapped = true; + // } + // } + // } while(swapped); + + + result.gameState = state; + + + //sets round winner + var rWinner = -1; + + for(var i = 0; i < users.length; i++) + { + if(rWinner < users[i].roundScore) + { + result.roundWinner = users[i].name; + rWinner = users[i].roundScore; + } + } + + result.currentWord = currentWord; + + return result; + }, + + /** + * grabs roomUpdate json and beams it to every user in the channel + */ + sendRoomUpdate: function() + { + var message = this.generateRoomUpdate(); + this.users.forEach(function(u) + { + //console.log("room update called"); + u.socket.emit('roomUpdate', message); + //console.log(message); + }); + }, + /** + * adds a user to a room + * @param p + * return 0 if they could join + */ + addUser: function(player) + { + //console.log("user added"); + //check if room is not full + this.users.push(player); + player.room = this; + + if(this.users.length == this.capacity) + { + this.state = 2; + } + + console.log("user added to room " + player.name); + //console.log(this.users); + + this.update(); + }, + + /** + * Removes a specific user from the room and adjusts the size of the array + * if the array is empty, the room closes + * @param p + */ + removeUser: function(p) + { + console.log("remove users fnc called"); + var temp = new Array(); + + for(var i = 0; i < temp.length; i++) + { + if(p.name === users[i].name) + { + + } + else + { + temp.push(users[i]); + } + } + + users = temp; + + //if room is empty remove the room from rooms list + if(users.length == 0) + { + console.log("room scrubbed"); + delete rooms[roomName]; + } + + this.update(); + }, + + /** + * Whether or not a user can join this room -- checks for number of people are + * already in the room and the password + * @param p + * @returns {boolean} + */ + canJoin: function(p) + { + if(password == null) + { + return (users.length < capacity); + } + else + { + return (users.length < capacity) && (p === password); + } + }, + /** + * starts new round for the room -- called once all the players have submitted + */ + newRound: function() + { + console.log("new round started"); + if(words.length == 0) + { + state == 4; + } + else + { + currentRound++; + users.forEach(function(u) + { + u.submission = ''; + }); + currentWord = words.pop(); + state = 2; + } + this.sendRoomUpdate(); + }, + //updates room variables + update: function() + { + switch(state) + { + case 1: //waiting for users to join + { + if(users.length == capacity) + { + this.newRound(); + } + break; + } + case 2: // waiting for responses + { + var flag = true; + var test = ""; + users.forEach(function(u) + { + test+=u.submission; + if(u.submission === '') + { + flag = false; + } + }); + console.log("big stuff " + test); + if(flag) + { + state = 3; + this.newRound(); + // setTimeout(function() { + // + // }, 4000); + } + break; + } + case 3: // showing results -- time out fnc + { + console.log("error &&&&&&&&&&&&&&&&&&"); + break; + } + case 4: //game over display final result + { + //sqlStuff.dumpRoom(this); + break; + } + default: + { + console.log("You don goof up") + } + } + console.log(state + " state"); + this.sendRoomUpdate(); + } + };