diff --git a/assets/scripts/lobby/publicData/avalon.js b/assets/scripts/lobby/publicData/avalon.js index 997d4738f..2552db447 100644 --- a/assets/scripts/lobby/publicData/avalon.js +++ b/assets/scripts/lobby/publicData/avalon.js @@ -16,8 +16,8 @@ function runPublicDataAvalon(gameDataInc) { } // Reset cards container - $('.playerDiv').find('.cardsContainer')[0].innerHTML = ''; - + $('.playerDiv').find('.cardsContainer').html = ''; + // Draw cards: for (const key in gd.publicData.cards) { if (gd.publicData.cards.hasOwnProperty(key) === true) { @@ -39,10 +39,24 @@ function runPublicDataAvalon(gameDataInc) { const padding = " "; + + const playerDiv = $('.playerDiv')[index]; + if (!playerDiv) { + console.log('Card index out of bounds', { + index, card: key, playerDivCount: $('.playerDiv').length, cardData: gd.publicData.cards[key] + }); + continue; + } + const cardsContainer = $(playerDiv).find('.cardsContainer')[0]; + if (!cardsContainer) { + console.log('No cardsContainer found for player', { + index, card: key, playerDiv + }); + continue; + } - $($('.playerDiv')[index]).find('.cardsContainer')[0].innerHTML += card; - $($('.playerDiv')[index]).find('.cardsContainer')[0].innerHTML += - padding; + cardsContainer.innerHTML += card; + cardsContainer.innerHTML += padding; // Initialise the tooltip. $('.cardObject').tooltip(); diff --git a/src/gameplay/gameEngine/cards/avalon/ladyOfTheLake.ts b/src/gameplay/gameEngine/cards/avalon/ladyOfTheLake.ts index e18e1605e..c3bf7efd1 100644 --- a/src/gameplay/gameEngine/cards/avalon/ladyOfTheLake.ts +++ b/src/gameplay/gameEngine/cards/avalon/ladyOfTheLake.ts @@ -24,10 +24,8 @@ class LadyOfTheLake implements ICard { this.thisRoom = thisRoom; } - initialise(): void { - this.setHolder( - (this.thisRoom.teamLeader + 1) % this.thisRoom.playersInGame.length, - ); + initialise(indexOfPlayerHolding: number): void { + this.setHolder(indexOfPlayerHolding); } setHolder(index: number): void { diff --git a/src/gameplay/gameEngine/cards/avalon/refOfTheRain.ts b/src/gameplay/gameEngine/cards/avalon/refOfTheRain.ts index 4a39eade0..168bea723 100644 --- a/src/gameplay/gameEngine/cards/avalon/refOfTheRain.ts +++ b/src/gameplay/gameEngine/cards/avalon/refOfTheRain.ts @@ -24,10 +24,8 @@ class RefOfTheRain implements ICard { this.thisRoom = thisRoom; } - initialise(): void { - this.setHolder( - (this.thisRoom.teamLeader + 1) % this.thisRoom.playersInGame.length, - ); + initialise(indexOfPlayerHolding: number): void { + this.setHolder(indexOfPlayerHolding); } setHolder(index: number): void { diff --git a/src/gameplay/gameEngine/cards/avalon/sireOfTheSea.ts b/src/gameplay/gameEngine/cards/avalon/sireOfTheSea.ts index b71648394..a412af0d4 100644 --- a/src/gameplay/gameEngine/cards/avalon/sireOfTheSea.ts +++ b/src/gameplay/gameEngine/cards/avalon/sireOfTheSea.ts @@ -24,16 +24,8 @@ class SireOfTheSea implements ICard { this.thisRoom = thisRoom; } - initialise(): void { - // If lady of the sea is in the game, give the card to the next person. - let addOne = 0; - if (this.thisRoom.options.includes('Lady of the Lake')) { - addOne = 1; - } - this.setHolder( - (this.thisRoom.teamLeader + 1 + addOne) % - this.thisRoom.playersInGame.length, - ); + initialise(indexOfPlayerHolding: number): void { + this.setHolder(indexOfPlayerHolding); } setHolder(index: number): void { diff --git a/src/gameplay/gameEngine/cards/types.ts b/src/gameplay/gameEngine/cards/types.ts index 27a0fcf6b..514951699 100644 --- a/src/gameplay/gameEngine/cards/types.ts +++ b/src/gameplay/gameEngine/cards/types.ts @@ -9,7 +9,7 @@ export enum Card { export interface ICard { card: Card; - initialise(): void; + initialise(indexOfPlayerHolding: number): void; setHolder(index: number): void; diff --git a/src/gameplay/gameEngine/game.ts b/src/gameplay/gameEngine/game.ts index 8acafab26..dbcaf87f1 100644 --- a/src/gameplay/gameEngine/game.ts +++ b/src/gameplay/gameEngine/game.ts @@ -601,10 +601,24 @@ class Game extends Room { for (let i = 0; i < this.playersInGame.length; i++) { this.voteHistory[this.playersInGame[i].request.user.username] = []; } - + // Initialise all the Cards - for (let i = 0; i < this.cardKeysInPlay.length; i++) { - this.specialCards[this.cardKeysInPlay[i]].initialise(); + const cardPosition = {}; + const numPlayers = this.playersInGame.length; + + for (const cardKey of this.cardKeysInPlay) { + const firstCardPosition = (this.hammer + 5 + numPlayers) % numPlayers; + let offset = 0; + // potentially refactor this so that the indexes of the cards matter rather than the cards themselves, would make life easier if a new card gets implemented + if (cardKey === Card.SireOfTheSea && this.cardKeysInPlay.includes(Card.LadyOfTheLake)) + offset++; + if (cardKey === Card.RefOfTheRain && this.cardKeysInPlay.includes(Card.LadyOfTheLake)) + offset++; + if (cardKey === Card.RefOfTheRain && this.cardKeysInPlay.includes(Card.SireOfTheSea)) + offset++; + + cardPosition[cardKey] = (firstCardPosition + offset) % numPlayers; + this.specialCards[cardKey].initialise(cardPosition[cardKey]); } this.distributeGameData(); diff --git a/src/sockets/sockets.ts b/src/sockets/sockets.ts index fa83cc432..0f0fa4bdc 100644 --- a/src/sockets/sockets.ts +++ b/src/sockets/sockets.ts @@ -1614,11 +1614,13 @@ function startGame(data) { ) { rooms[this.request.user.inRoomId].configureTimeouts(timeouts); rooms[this.request.user.inRoomId].configureAnonymousMode(anonymousMode); + rooms[this.request.user.inRoomId].configurerandomizeCardPosition(randomizeCardPosition); rooms[this.request.user.inRoomId].hostTryStartGame( options, gameMode, timeouts, anonymousMode, + randomizeCardPosition, ); } } diff --git a/src/views/changelog.ejs b/src/views/changelog.ejs index 08ec16777..868cf7c43 100644 --- a/src/views/changelog.ejs +++ b/src/views/changelog.ejs @@ -15,6 +15,17 @@

Changelog!