diff --git a/src/components/Menu.vue b/src/components/Menu.vue index 28b900b..64a3121 100644 --- a/src/components/Menu.vue +++ b/src/components/Menu.vue @@ -290,7 +290,7 @@ export default { if (this.session.isSpectator) return; const popup = "Do you want to reveal the GRIMOIRE to players?"; if (confirm(popup)) { - this.$store.commit("session/revealGrimoire", true); + this.$store.commit("session/setRevealedGrimoire", null); } }, imageOptIn() { diff --git a/src/components/TownSquare.vue b/src/components/TownSquare.vue index 4c34249..b557098 100644 --- a/src/components/TownSquare.vue +++ b/src/components/TownSquare.vue @@ -23,6 +23,11 @@ > +
+
+ Reveal storyteller grimoire? +
+
({ isVoteInProgress: false, voteHistory: [], isRolesDistributed: false, - isGrimoireRevealed: false isVoteHistoryAllowed: true, + revealedGrimoire: null }); const getters = {}; @@ -51,7 +51,7 @@ const mutations = { setVoteHistoryAllowed: set("isVoteHistoryAllowed"), claimSeat: set("claimedSeat"), distributeRoles: set("isRolesDistributed"), - revealGrimoire: set("isGrimoireRevealed"), + setRevealedGrimoire: set("revealedGrimoire"), setSessionId(state, sessionId) { state.sessionId = sessionId .toLocaleLowerCase() diff --git a/src/store/socket.js b/src/store/socket.js index cd2efad..0f4ff89 100644 --- a/src/store/socket.js +++ b/src/store/socket.js @@ -246,7 +246,7 @@ class LiveSession { /** * Publish the current gamestate. * Optional param isLightweight to reduce traffic (=send only player data) - * Optional param isRevealGrimoire to reveal grimoire (=include ALL player roles, reminders & bluffs), overrides isLightweight + * Optional param isRevealGrimoire to reveal grimoire (=include ALL player roles, reminders & bluffs) * @param playerId * @param isLightweight * @param isRevealGrimoire @@ -254,26 +254,27 @@ class LiveSession { sendGamestate( playerId = "", isLightweight = false, - isRevealGrimoire = false + isRevealedGrimoire = false ) { if (this._isSpectator) return; + if (isLightweight && isRevealedGrimoire) return; // incompatible this._gamestate = this._store.state.players.players.map(player => ({ name: player.name, id: player.id, isDead: player.isDead, isVoteless: player.isVoteless, pronouns: player.pronouns, - ...(player.role && (player.role.team === "traveler" || isRevealGrimoire) + ...(isRevealedGrimoire || (player.role && player.role.team === "traveler") ? { roleId: player.role.id } - : {}), - reminders: isRevealGrimoire + : { roleId: -1 }), + reminders: isRevealedGrimoire ? player.reminders.map(reminder => ({ name: reminder.name, role: reminder.role })) - : {} + : -1 })); - if (isLightweight && !isRevealGrimoire) { + if (isLightweight) { this._sendDirect(playerId, "gs", { gamestate: this._gamestate, isLightweight @@ -285,7 +286,7 @@ class LiveSession { this._sendDirect(playerId, "gs", { gamestate: this._gamestate, isLightweight: isLightweight, - isRevealGrimoire: isRevealGrimoire, + isRevealedGrimoire: isRevealedGrimoire, isNight: grimoire.isNight, isVoteHistoryAllowed: session.isVoteHistoryAllowed, nomination: session.nomination, @@ -294,6 +295,9 @@ class LiveSession { isVoteInProgress: session.isVoteInProgress, fabled: fabled.map(f => (f.isCustom ? f : { id: f.id })), ...(session.nomination ? { votes: session.votes } : {}) + bluffs: isRevealedGrimoire + ? bluffs.map(bluff => ({ roleId: bluff.id })) + : -1 }); } } @@ -308,7 +312,7 @@ class LiveSession { const { gamestate, isLightweight, - isRevealGrimoire, + isRevealedGrimoire, isNight, isVoteHistoryAllowed, nomination, @@ -319,14 +323,14 @@ class LiveSession { fabled, bluffs } = data; - if (isRevealGrimoire) { - // includes ALL roles, reminders & bluffs - const popup = - "Reveal the Storyteller's grimoire? This will overwrite your grimoire."; - if (!confirm(popup)) { - return; - } + if (isRevealedGrimoire) { + // special case: this includes ALL roles, reminders & bluffs + // would overwrite users notes, so we have to (store and) ask before applying + this._store.commit("session/setRevealedGrimoire", data ); + return; } + + const players = this._store.state.players.players; // adjust number of players if (players.length < gamestate.length) { @@ -341,19 +345,26 @@ class LiveSession { // update status for each player gamestate.forEach((state, x) => { const player = players[x]; - const { roleId } = state; - // update relevant properties + // properties we always update ["name", "id", "isDead", "isVoteless", "pronouns"].forEach(property => { const value = state[property]; if (player[property] !== value) { this._store.commit("players/update", { player, property, value }); } }); - // roles are special, because of travelers - if (roleId && player.role.id !== roleId) { + // roles + const { roleId } = state; + if ((roleId == {} || roleId !== -1) && player.role.team === "traveler") { + // special case for when a player stopped being a traveler + this._store.commit("players/update", { + player, + property: "role", + value: {} + }); + } else if (roleId !== -1 && player.role.id !== roleId) { const role = this._store.state.roles.get(roleId) || - this._store.getters.rolesJSONbyId.get(roleId); + this._store.getters.rolesJSONbyId.get(roleId) || {}; if (role) { this._store.commit("players/update", { player, @@ -361,15 +372,9 @@ class LiveSession { value: role }); } - } else if (!roleId && player.role.team === "traveler") { - this._store.commit("players/update", { - player, - property: "role", - value: {} - }); } // reminder tokens - if (isRevealGrimoire) { + if (state.reminders !== -1) { this._store.commit("players/update", { player, property: "reminders", @@ -378,6 +383,7 @@ class LiveSession { } }); if (!isLightweight) { + // properties we always update this._store.commit("toggleNight", !!isNight); this._store.commit("session/setVoteHistoryAllowed", isVoteHistoryAllowed); this._store.commit("session/nomination", { @@ -390,8 +396,8 @@ class LiveSession { this._store.commit("players/setFabled", { fabled: fabled.map(f => this._store.state.fabled.get(f.id) || f) }); - if (isRevealGrimoire) { - this._store.commit("session/revealGrimoire", true); + // bluffs + if (bluffs !== -1) { bluffs.forEach((bluff, i) => { const role = this._store.state.roles.get(bluff.roleId) || @@ -888,7 +894,7 @@ export default store => { session.distributeRoles(); } break; - case "session/revealGrimoire": + case "session/setRevealedGrimoire": session.sendGamestate("", false, true); break; case "session/nomination":