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;