diff --git a/Webservice/Game.js b/Webservice/Game.js index ccef9d2..c54f0e0 100644 --- a/Webservice/Game.js +++ b/Webservice/Game.js @@ -2,44 +2,56 @@ const Player = require('./Player'); const Hunter = require("./Hunter"); class Game { + + static MAX_PLAYERS = 4; + static WIN_POSITION = 16; + static STATUS = { + SETTING_UP: 0, + ONGOING: 1, + IS_DRAW: 2, + IS_WON: 3 + } + constructor() { + this.currentStatus = Game.STATUS.SETTING_UP; this.players = []; this.currentPlayerIndex = 0; - this.started = false; + this.winnerIndex = 0; this.round = 0; this.hunter = new Hunter(); } finish_turn() { - let move_to_next_round = false; - // move on to next player; skip dead players - do { - if (this.players.length === 0) break; + this.update_game_status(); + if (this.currentStatus !== Game.STATUS.ONGOING) return; + if (!this.players.some(player => player.isAlive === true)) return; + + let roundIsOver = false; + do { this.currentPlayerIndex++; if (this.currentPlayerIndex >= this.players.length) { this.currentPlayerIndex = 0; - move_to_next_round = true; + roundIsOver = true; } } while (!this.players[this.currentPlayerIndex].isAlive); // skip dead players - this.finish_round(); + + if (roundIsOver) this.#finish_round(); } - finish_round() { + #finish_round() { this.round++; - // kill players with hunter if (this.round >= 5) { this.hunter.move_by(1); this.hunter.hunt(this.players); } - // check if all players are dead - if (!this.players.some(player => player.isAlive === true)) { - // todo: end game (all players are dead) - } + this.update_game_status(); } add_player(name) { - this.players.push(new Player(name)); + let canAddPlayer = this.players.length < Game.MAX_PLAYERS; + if (canAddPlayer) this.players.push(new Player(name)); + return canAddPlayer; } remove_player(name) { @@ -52,6 +64,7 @@ class Game { } current_player_is(name) { + if (this.players[this.currentPlayerIndex] === undefined) return false; return this.players[this.currentPlayerIndex].name === name; } @@ -61,7 +74,19 @@ class Game { move_player(name, amount) { let index = this.get_player_index(name); + if (index === -1) return; this.players[index].move_by(amount); + this.update_game_status(); + } + + update_game_status() { + if (!this.players.some(player => player.isAlive === true)) this.currentStatus = Game.STATUS.IS_DRAW; + + let index = this.players.findIndex(player => player.position >= Game.WIN_POSITION); + if (index !== -1) { + this.currentStatus = Game.STATUS.IS_WON; + this.winnerIndex = index; + } } } diff --git a/Webservice/Player.js b/Webservice/Player.js index 7e80fca..f04a288 100644 --- a/Webservice/Player.js +++ b/Webservice/Player.js @@ -7,10 +7,6 @@ class Player { move_by(amount) { this.position += amount; - //todo: move by 1 only on the last 3 fields - if (this.position >= 16) { - // todo: win - } } } diff --git a/Webservice/server.js b/Webservice/server.js index 12e3159..98e2176 100644 --- a/Webservice/server.js +++ b/Webservice/server.js @@ -9,7 +9,7 @@ const {Server} = require("socket.io"); const io = new Server(server); let cards = JSON.parse(fs.readFileSync(__dirname + '/../data/fragen_10_06_21_final_new_format.json')); -let gameState = {}; +let game = {}; let port = 5000; server.listen(port, function () { @@ -44,12 +44,12 @@ io.on('connection', socket => { socket.username = data.username; socket.room = data.room_name; - if (gameState[socket.room] === undefined) { - gameState[socket.room] = new Game(); + if (game[socket.room] === undefined) { + game[socket.room] = new Game(); } - if (gameState[socket.room].players.length < 4 && !gameState[socket.room].started) { - gameState[socket.room].add_player(socket.username); + if (game[socket.room].add_player(socket.username)) { + addedUser = true; socket.emit('login'); @@ -64,7 +64,7 @@ io.on('connection', socket => { }); socket.on('new message', function (data) { - if (gameState[socket.room] !== undefined && addedUser) { + if (game[socket.room] !== undefined && addedUser) { socket.broadcast.to(socket.room).emit('new message', { username: socket.username, message: data @@ -75,15 +75,15 @@ io.on('connection', socket => { }); socket.on('disconnect', function () { - if (gameState[socket.room] !== undefined && addedUser) { + if (game[socket.room] !== undefined && addedUser) { socket.broadcast.to(socket.room).emit('user left', socket.username); - gameState[socket.room].remove_player(socket.username); + game[socket.room].remove_player(socket.username); // TODO Close card if card is opened and active player left socket.leave(socket.room); - if (gameState[socket.room].players.length === 0) delete gameState[socket.room]; + if (game[socket.room].players.length === 0) delete game[socket.room]; } generate_log_message(socket.room, socket.username, "LEFT", ""); @@ -91,51 +91,68 @@ io.on('connection', socket => { // Game socket.on('roll dice', function () { - if (gameState[socket.room] !== undefined && addedUser) { - if (gameState[socket.room].current_player_is(socket.username)) { - gameState[socket.room].started = true; - let sides = 3; - let randomNumber = Math.floor(Math.random() * sides) + 1; + if (game[socket.room] === undefined || !addedUser) return; - io.in(socket.room).emit('dice', randomNumber); + if (game[socket.room].current_player_is(socket.username)) { + game[socket.room].currentStatus = Game.STATUS.ONGOING; + let sides = 3; + let randomNumber = Math.floor(Math.random() * sides) + 1; - generate_log_message(socket.room, socket.username, "DICE", randomNumber); - } else { - io.to(socket.id).emit('error', 'It\'s not your turn'); - } + io.in(socket.room).emit('dice', randomNumber); + + generate_log_message(socket.room, socket.username, "DICE", randomNumber); + } else { + io.to(socket.id).emit('error', 'It\'s not your turn'); } + }); socket.on('get card', function (difficulty) { - if (gameState[socket.room] !== undefined && addedUser) { - if (gameState[socket.room].current_player_is(socket.username)) { - io.in(socket.room).emit('card', {'username': socket.username, 'card': getRandomCard(difficulty)}); + if (game[socket.room] === undefined || !addedUser) return; + if (game[socket.room].currentStatus !== Game.STATUS.ONGOING) return; - generate_log_message(socket.room, socket.username, "CARD", difficulty); - } else { - io.to(socket.id).emit('error', 'It\'s not your turn'); - } + if (game[socket.room].current_player_is(socket.username)) { + io.in(socket.room).emit('card', {'username': socket.username, 'card': getRandomCard(difficulty)}); + + generate_log_message(socket.room, socket.username, "CARD", difficulty); + } else { + io.to(socket.id).emit('error', 'It\'s not your turn'); } + }); socket.on('card finished', function (difficulty, answerIsCorrect) { - if (gameState[socket.room] !== undefined && addedUser) { - if (answerIsCorrect) { - gameState[socket.room].move_player(socket.username, difficulty); - generate_log_message(socket.room, socket.username, "MOVE", difficulty); - } - io.in(socket.room).emit('card destroyed'); - gameState[socket.room].finish_turn(); + if (game[socket.room] === undefined || !addedUser) return; + if (game[socket.room].currentStatus !== Game.STATUS.ONGOING) return; - let index = gameState[socket.room].get_player_index(socket.username); - let next_player = gameState[socket.room].players[gameState[socket.room].currentPlayerIndex].name; + io.in(socket.room).emit('card destroyed'); + if (answerIsCorrect) { + game[socket.room].move_player(socket.username, difficulty); + generate_log_message(socket.room, socket.username, "MOVE", difficulty); + + let index = game[socket.room].get_player_index(socket.username); + let next_player = game[socket.room].players[game[socket.room].currentPlayerIndex].name; io.in(socket.room).emit('player moved', { "next_player": next_player, "player": index, - "position": gameState[socket.room].players[index].position + "position": game[socket.room].players[index].position }); } + + game[socket.room].finish_turn(); + + switch (game[socket.room].currentStatus) { + case Game.STATUS.IS_WON: + //TODO show clients the winner + //game[socket.room].winnerIndex + break; + case Game.STATUS.IS_DRAW: + //TODO show clients that nobody wins + break; + default: + break; + } }); }); diff --git a/public/js/chat.js b/public/js/chat.js index 2ab44df..e758a5a 100644 --- a/public/js/chat.js +++ b/public/js/chat.js @@ -1,6 +1,43 @@ let socket; let connected = false; +function start_chat() { + socket.on('login', function () { + connected = true; + + document.getElementById('login').style.display = 'none'; + document.getElementById('game').style.display = 'flex'; + document.getElementById('chat').style.display = 'flex'; + start_chat(); + start_game(); + resize(); + + addLogMessage("Welcome " + username + "!"); + }); + + socket.on('error', function (data) { + if (data === 'Game started already or room has two many members') { + document.getElementById('login').style.display = 'flex'; + document.getElementById('game').style.display = 'none'; + document.getElementById('chat').style.display = 'none'; + document.getElementById('error').innerText = data; + } + console.log(data); + }); + + socket.on('new message', function (data) { + addChatMessage(data); + }); + + socket.on('user joined', function (data) { + addLogMessage(data + ' joined'); + }); + + socket.on('user left', function (data) { + addLogMessage(data + ' left'); + }); +} + function sendMessage() { let message = document.getElementById('message_input').value; diff --git a/public/js/index.js b/public/js/index.js index 8493e39..93968bd 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -14,41 +14,8 @@ document.getElementById('ok').addEventListener('click', function () { closeOnBeforeunload: false }); + start_chat(); + // Login socket.emit('add user', {'username': username, 'room_name': room_name}); - - - socket.on('login', function () { - connected = true; - - document.getElementById('login').style.display = 'none'; - document.getElementById('game').style.display = 'flex'; - document.getElementById('chat').style.display = 'flex'; - start_game(); - resize(); - - addLogMessage("Welcome " + username + "!"); - }); - - socket.on('error', function (data) { - if (data === 'Game started already or room has two many members') { - document.getElementById('login').style.display = 'flex'; - document.getElementById('game').style.display = 'none'; - document.getElementById('chat').style.display = 'none'; - document.getElementById('error').innerText = data; - } - console.log(data); - }); - - socket.on('new message', function (data) { - addChatMessage(data); - }); - - socket.on('user joined', function (data) { - addLogMessage(data + ' joined'); - }); - - socket.on('user left', function (data) { - addLogMessage(data + ' left'); - }); }); \ No newline at end of file