diff --git a/src/server/websocket/handler.js b/src/server/websocket/handler.js index 702bd29..37b5c61 100644 --- a/src/server/websocket/handler.js +++ b/src/server/websocket/handler.js @@ -1,3 +1,5 @@ +const crypto = require("crypto"); + const gameController = require("../controllers/GameControllerMongoose"); const playerController = require("../controllers/PlayerControllerMongoose"); @@ -130,10 +132,14 @@ exports.handleMessage = ( gameSocketList, socket, dataRaw ) => { gameController.findGameByIdAndSetStateAndPopulateBoard( socket.locals.game, "IN_PROGRESS" ) .then( ( game ) => { gameOuter = game; - let randomPlayerIndex = crypto.randomInt(0, game.players.length ); - let randomPlayer = game.players[randomPlayerIndex]; - let otherPlayers = game.players.splice(randomPlayerIndex, 1); - return playerController.setPlayerIsChoosingAndOthersNotChoosing( randomPlayer, otherPlayers ); + if( game.players.length > 0 ){ + let randomPlayerIndex = crypto.randomInt(0, game.players.length ); + let randomPlayer = game.players[randomPlayerIndex]; + let otherPlayers = game.players.splice(randomPlayerIndex, 1); + return playerController.setPlayerIsChoosingAndOthersNotChoosing( randomPlayer, otherPlayers ); + } else { + return -1; + } }) .then( ( choosingPlayer ) => { let message = "Game is starting"; @@ -159,12 +165,12 @@ exports.handleMessage = ( gameSocketList, socket, dataRaw ) => { } break; case "playerChooseBoardEntry": - playerController.checkPlayerCanChoose() - .then( ( canChoose ) => { - if( canChoose ){ - let message = `BoardEntry ${payload.boardEntryIndex} selected`; - let sendingData = { categoryIndex: payload.categoryIndex, boardEntryIndex: payload.boardEntryIndex }; - sendAllPlayers( socket, gameSocketList, "boardEntrySelected", message, sendingData ); + playerController.checkPlayerCanChoose( socket.locals.player ) + .then( ( player ) => { + if( player.isChoosing ){ + let message = `Category ${payload.categoryIndex} with BoardEntry ${payload.boardEntryIndex} selected`; + let sendingData = { categoryIndex: payload.categoryIndex, boardEntryIndex: payload.boardEntryIndex, choosingPlayer: player._id.toString() }; + sendToHost( socket, gameSocketList, "playerChoseBoardEntry", message, sendingData ); resolve(); } else { resolve(); diff --git a/src/webapp/components/blocks/BoardEntryCard.vue b/src/webapp/components/blocks/BoardEntryCard.vue index 623fedf..8cad40e 100644 --- a/src/webapp/components/blocks/BoardEntryCard.vue +++ b/src/webapp/components/blocks/BoardEntryCard.vue @@ -16,6 +16,10 @@ const props = defineProps({ type: Boolean, default: false, }, + playerChose: { + type: [Boolean, String], + default: false, + }, }); const emit = defineEmits(["boardEntryCardClicked", "boardEntryAnsweredClicked", "boardEntryAnsweredRevertClicked" ]); @@ -60,6 +64,11 @@ function boardEntryAnsweredRevertClicked(){ +
+ + {{ props.playerChose.name }} chooses this + +
{{ props.boardEntry.points }}
@@ -73,4 +82,7 @@ function boardEntryAnsweredRevertClicked(){ max-height: 20%; max-width: 90vw; } +.max-w-50{ + max-width: 50%; +} \ No newline at end of file diff --git a/src/webapp/components/pages/Game.vue b/src/webapp/components/pages/Game.vue index d2a590b..1a5042a 100644 --- a/src/webapp/components/pages/Game.vue +++ b/src/webapp/components/pages/Game.vue @@ -183,6 +183,18 @@ function setUpListeners(){ gameStore.players.splice( playerIndex, 1 ); } }); + gameStore.addSocketListener("playerChoseBoardEntry", ( data ) => { + let categoryIndex = data.payload.categoryIndex; + let boardEntryIndex = data.payload.boardEntryIndex; + let player = gameStore.players.find( playerEntry => playerEntry._id === data.payload.choosingPlayer ); + if( player ){ + gameStore.chosenEntry = { + player: player, + categoryIndex: categoryIndex, + boardEntryIndex: boardEntryIndex, + } + } + }); } function playerBuzzered( data ){ @@ -395,6 +407,7 @@ onBeforeRouteLeave((to, from) => { :isPlayerChoosing="gameStore.isPlayerChoosing" :anyPlayerIsAnswering="anyPlayerIsAnswering" :isBeingPlayed="isBeingPlayed" + :chosenEntry="gameStore.chosenEntry" @showBoard="showBoard" @showQuestion="showQuestion" @showAnswer="showAnswer" diff --git a/src/webapp/components/views/BoardView.vue b/src/webapp/components/views/BoardView.vue index 408d2dd..51a0480 100644 --- a/src/webapp/components/views/BoardView.vue +++ b/src/webapp/components/views/BoardView.vue @@ -16,10 +16,19 @@ const props = defineProps({ type: Boolean, default: false, }, + chosenEntry: Object, }); const emit = defineEmits(["boardEntryClicked", "questionAnswered", "questionAnsweredRevert" ]) +function playerChosenBoardEntry( categoryIndex, boardEntryIndex ){ + if( props.chosenEntry !== undefined && ( props.chosenEntry.categoryIndex === categoryIndex || props.chosenEntry.boardEntryIndex === boardEntryIndex ) ){ + return props.chosenEntry.player.name; + } else { + return false; + } +} + function boardEntryCardClicked( categoryIndex, boardEntryIndex ){ if( props.isHost || props.isPlayerChoosing ){ emit("boardEntryClicked", categoryIndex, boardEntryIndex); @@ -49,6 +58,7 @@ function boardEntryCardClicked( categoryIndex, boardEntryIndex ){ :isPlayerChoosing="props.isPlayerChoosing" :isBeingPlayed="props.isBeingPlayed" :boardEntry="boardEntry" + :playerChose="playerChosenBoardEntry( categoryIndex, boardEntryIndex )" @boardEntryCardClicked="boardEntryCardClicked( categoryIndex, boardEntryIndex )" @boardEntryAnsweredClicked="emit( 'questionAnswered', categoryIndex, boardEntryIndex )" @boardEntryAnsweredRevertClicked="emit( 'questionAnsweredRevert', categoryIndex, boardEntryIndex )" diff --git a/src/webapp/components/views/GameView.vue b/src/webapp/components/views/GameView.vue index ae9fce5..f47f923 100644 --- a/src/webapp/components/views/GameView.vue +++ b/src/webapp/components/views/GameView.vue @@ -34,6 +34,7 @@ const props = defineProps({ type: Boolean, default: false, }, + chosenEntry: Object, }); const emit = defineEmits(["boardEntryClicked", "specificQuestionLayerSelected", "showBoard", "playerBuzzered", "playAudio", "stopAudio", @@ -124,6 +125,7 @@ watch( :isHost="props.isHost" :isBeingPlayed="props.isBeingPlayed" :isPlayerChoosing="props.isPlayerChoosing" + :chosenEntry="props.chosenEntry" @boardEntryClicked="boardEntryClicked" @questionAnswered="questionAnswered" @questionAnsweredRevert="questionAnsweredRevert" diff --git a/src/webapp/stores/GameStore.js b/src/webapp/stores/GameStore.js index da4ddc0..99a22fd 100644 --- a/src/webapp/stores/GameStore.js +++ b/src/webapp/stores/GameStore.js @@ -24,6 +24,7 @@ export const useGameStore = defineStore('game', { board: new Board( undefined, "New Board", []), acceptAnswers: false, isPlayerChoosing: false, + chosenEntry: undefined, } }, actions: {