| @ -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(); | |||
| } | |||
| }; | |||