diff --git a/CHANGELOG.md b/CHANGELOG.md index e62792b..4b8c5a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Release Notes +- add ST character reveal, per player + ### Version 2.12.0 - tweak reference sheet to better fit screen in single column layout - add warning icon overlay for setup roles on character assignment modal diff --git a/src/components/Player.vue b/src/components/Player.vue index 6ee7c4e..ef4e97c 100644 --- a/src/components/Player.vue +++ b/src/components/Player.vue @@ -128,6 +128,10 @@ Nomination +
  • + + Reveal role to all +
  • Move player @@ -296,6 +300,9 @@ export default { this.isMenuOpen = false; } }, + revealPlayer() { + this.$emit("trigger", ["revealPlayer"]); + }, removePlayer() { this.isMenuOpen = false; this.$emit("trigger", ["removePlayer"]); diff --git a/src/components/TownSquare.vue b/src/components/TownSquare.vue index 729a813..4d1bdf5 100644 --- a/src/components/TownSquare.vue +++ b/src/components/TownSquare.vue @@ -161,6 +161,17 @@ export default { this.$store.commit("players/remove", playerIndex); } }, + revealPlayer(playerIndex) { + if (!this.session.isRevealPlayerOK) { + if ( + !confirm( + `Do you really want to reveal this players role to ALL other players?\n\nYou won't be asked to confirm again this game.` + ) + ) + return; + } + this.$store.commit("session/revealPlayer", playerIndex); + }, swapPlayer(from, to) { if (to === undefined) { this.cancel(); diff --git a/src/main.js b/src/main.js index dd39a1b..e8a5c72 100644 --- a/src/main.js +++ b/src/main.js @@ -33,6 +33,7 @@ const faIcons = [ "Question", "Random", "RedoAlt", + "SatelliteDish", "SearchMinus", "SearchPlus", "Square", diff --git a/src/store/modules/session.js b/src/store/modules/session.js index 80d4aaf..1cc0a9d 100644 --- a/src/store/modules/session.js +++ b/src/store/modules/session.js @@ -25,7 +25,8 @@ const state = () => ({ votingSpeed: 3000, isVoteInProgress: false, voteHistory: [], - isRolesDistributed: false + isRolesDistributed: false, + isRevealPlayerOK: false }); const getters = {}; @@ -47,6 +48,9 @@ const mutations = { setVoteInProgress: set("isVoteInProgress"), claimSeat: set("claimedSeat"), distributeRoles: set("isRolesDistributed"), + revealPlayer(state) { + state.isRevealPlayerOK = true; + }, setSessionId(state, sessionId) { state.sessionId = sessionId .toLocaleLowerCase() diff --git a/src/store/socket.js b/src/store/socket.js index e193a08..0cd0900 100644 --- a/src/store/socket.js +++ b/src/store/socket.js @@ -634,11 +634,12 @@ class LiveSession { } /** - * Distribute player roles to all seated players in a direct message. + * Distribute player roles to all seated players in a direct message. ST only * This will be split server side so that each player only receives their own (sub)message. */ distributeRoles() { if (this._isSpectator) return; + this._store.state.session.isRevealPlayerOK = false; const message = {}; this._store.state.players.players.forEach((player, index) => { if (player.id && player.role) { @@ -653,6 +654,19 @@ class LiveSession { } } + /** + * Announce a single players role to all other players. ST only + * @param playerIndex + */ + revealPlayer(index) { + if (this._isSpectator) return; + const player = this._store.state.players.players[index]; + if (player && player.role) { + const message = { index, property: "role", value: player.role.id }; + this._send("player", message); + } + } + /** * A player nomination. ST only * This also syncs the voting speed to the players. @@ -822,6 +836,9 @@ export default store => { session.distributeRoles(); } break; + case "session/revealPlayer": + session.revealPlayer(payload); + break; case "session/nomination": session.nomination(payload); break;