diff --git a/src/components/Player.vue b/src/components/Player.vue index 792c60e..8edb587 100644 --- a/src/components/Player.vue +++ b/src/components/Player.vue @@ -667,7 +667,7 @@ li.move:not(.from) .player .overlay svg.move { } /***** Ability text *****/ -#townsquare.public .ability { +#townsquare.public .circle .ability { display: none; } .circle .player .shroud:hover ~ .token .ability, diff --git a/src/components/TownSquare.vue b/src/components/TownSquare.vue index 76ae9fa..ceafb9a 100644 --- a/src/components/TownSquare.vue +++ b/src/components/TownSquare.vue @@ -115,6 +115,7 @@ export default { this.isFabledOpen = !this.isFabledOpen; }, removeFabled(index) { + if (this.session.isSpectator) return; this.$store.commit("setFabled", { index }); }, handleTrigger(playerIndex, [method, params]) { @@ -427,7 +428,7 @@ export default { z-index: 2; } -.fabled ul li:hover .token:before { +#townsquare:not(.spectator) .fabled ul li:hover .token:before { opacity: 1; } diff --git a/src/components/modals/EditionModal.vue b/src/components/modals/EditionModal.vue index 779b7ae..d16e050 100644 --- a/src/components/modals/EditionModal.vue +++ b/src/components/modals/EditionModal.vue @@ -88,24 +88,24 @@ export default { "https://gist.githubusercontent.com/bra1n/0337cc44c6fd2c44f7589256ed5486d2/raw/4a7a1545004620146f47583cde4b05f77dd9b6d2/penanceday.json" ], [ - "Catfishing 8.0 (+Sentinel)", - "https://gist.githubusercontent.com/bra1n/8a5ec41a7bbf945f6b7dfc1cef72b569/raw/a9451def4bb7b3c424426e9524ee94f3ac65dbf4/catfishing.json" + "Catfishing 8.0", + "https://gist.githubusercontent.com/bra1n/8a5ec41a7bbf945f6b7dfc1cef72b569/raw/86b2ce5293e7160530f8775b8a7118b2078fdd79/catfishing.json" ], [ - "On Thin Ice (Teensyville, +Sentinel)", - "https://gist.githubusercontent.com/bra1n/8dacd9f2abc6f428331ea1213ab153f5/raw/9758aff4b59965dc7a094db549d950be5a26b571/custom-script.json" + "On Thin Ice (Teensyville)", + "https://gist.githubusercontent.com/bra1n/8dacd9f2abc6f428331ea1213ab153f5/raw/0cacbcaf8ed9bddae0cca25a9ada97e9958d868b/on-thin-ice.json" ], [ - "Race To The Bottom (Teensyville, +Sentinel, +Doomsayer)", - "https://gist.githubusercontent.com/bra1n/63e1354cb3dc9d4032bcd0623dc48888/raw/5be4df8386ec61e3a98c32be77f8cac3f8414379/custom-script.json" + "Race To The Bottom (Teensyville)", + "https://gist.githubusercontent.com/bra1n/63e1354cb3dc9d4032bcd0623dc48888/raw/5acb0eedcc0a67a64a99c7e0e6271de0b7b2e1b2/race-to-the-bottom.json" ], [ - "Frankenstein's Mayor by Ted (Teensyville, +Sentinel)", - "https://gist.githubusercontent.com/bra1n/32c52b422cc01b934a4291eeb81dbcee/raw/3ca5a043c41141ac40667dc15097deb327263268/Frankensteins_Mayor_by_Ted.json" + "Frankenstein's Mayor by Ted (Teensyville)", + "https://gist.githubusercontent.com/bra1n/32c52b422cc01b934a4291eeb81dbcee/raw/5bf770693bbf7aff5e86601c82ca4af3222f4ba6/Frankensteins_Mayor_by_Ted.json" ], [ - "Vigormortis High School (Teensyville, +Sentinel)", - "https://gist.githubusercontent.com/bra1n/1f65bd4a999524719d5dabe98c3c2d27/raw/f28d3268846c182b2078888122003c6f95c6b2cf/VigormortisHighSchool.json" + "Vigormortis High School (Teensyville)", + "https://gist.githubusercontent.com/bra1n/1f65bd4a999524719d5dabe98c3c2d27/raw/22bbec6bf56a51a7459e5ae41ed47e41971c5445/VigormortisHighSchool.json" ] ] }; @@ -150,14 +150,22 @@ export default { }, parseRoles(roles) { if (!roles || !roles.length) return; - this.$store.commit( - "setCustomRoles", - roles.map(role => { - role.id = role.id.toLocaleLowerCase().replace(/[^a-z0-9]/g, ""); - return role; - }) - ); + const customRoles = roles.map(role => { + role.id = role.id.toLocaleLowerCase().replace(/[^a-z0-9]/g, ""); + return role; + }); + this.$store.commit("setCustomRoles", customRoles); this.$store.commit("setEdition", "custom"); + // check for fabled and set those too, if present + if (customRoles.some(({ id }) => this.$store.state.fabled.has(id))) { + const fabled = []; + customRoles.forEach(({ id }) => { + if (this.$store.state.fabled.has(id)) { + fabled.push(this.$store.state.fabled.get(id)); + } + }); + this.$store.commit("setFabled", { fabled }); + } this.isCustom = false; }, ...mapMutations(["toggleModal", "setEdition"]) diff --git a/src/components/modals/FabledModal.vue b/src/components/modals/FabledModal.vue index b8630b9..bb84209 100644 --- a/src/components/modals/FabledModal.vue +++ b/src/components/modals/FabledModal.vue @@ -38,6 +38,7 @@ export default { this.$store.commit("setFabled", { fabled: role }); + this.$store.commit("toggleModal", "fabled"); }, ...mapMutations(["toggleModal"]) } @@ -49,8 +50,8 @@ export default { ul.tokens li { border-radius: 50%; - width: 6vw; - margin: 1%; + width: 8vw; + margin: 0.5%; transition: transform 500ms ease; &:hover { diff --git a/src/store/index.js b/src/store/index.js index 9c9578b..7c7fb5b 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -134,8 +134,12 @@ export default new Vuex.Store({ setFabled({ grimoire }, { index, fabled } = {}) { if (index !== undefined) { grimoire.fabled.splice(index, 1); - } else { - grimoire.fabled.push(fabled); + } else if (fabled) { + if (!Array.isArray(fabled)) { + grimoire.fabled.push(fabled); + } else { + grimoire.fabled = fabled; + } } }, toggleModal({ modals }, name) { diff --git a/src/store/persistence.js b/src/store/persistence.js index 4235267..88e8001 100644 --- a/src/store/persistence.js +++ b/src/store/persistence.js @@ -25,10 +25,10 @@ module.exports = store => { }); } if (localStorage.fabled !== undefined) { - JSON.parse(localStorage.fabled).forEach(role => { - store.commit("setFabled", { - fabled: store.state.fabled.get(role) || {} - }); + store.commit("setFabled", { + fabled: JSON.parse(localStorage.fabled).map(id => + store.state.fabled.get(id) + ) }); } if (localStorage.players) { diff --git a/src/store/socket.js b/src/store/socket.js index 1cea03b..0ef97e8 100644 --- a/src/store/socket.js +++ b/src/store/socket.js @@ -92,6 +92,9 @@ class LiveSession { case "edition": this._updateEdition(params); break; + case "fabled": + this._updateFabled(params); + break; case "gs": this._updateGamestate(params); break; @@ -179,6 +182,7 @@ class LiveSession { })); const { session } = this._store.state; this.sendEdition(); + this.sendFabled(); this._send("gs", { gamestate: this._gamestate, nomination: session.nomination, @@ -272,6 +276,30 @@ class LiveSession { } } + /** + * Publish a fabled update. ST only + */ + sendFabled() { + if (this._isSpectator) return; + const { fabled } = this._store.state.grimoire; + this._send( + "fabled", + fabled.map(({ id }) => id) + ); + } + + /** + * Update fabled roles. + * @param fabled + * @private + */ + _updateFabled(fabled) { + if (!this._isSpectator) return; + this._store.commit("setFabled", { + fabled: fabled.map(id => this._store.state.fabled.get(id)) + }); + } + /** * Publish a player update. * @param player @@ -557,6 +585,9 @@ export default store => { case "setEdition": session.sendEdition(); break; + case "setFabled": + session.sendFabled(); + break; case "players/swap": session.swapPlayer(payload); break;