From 1c31de430a71867feadf391519da0a87436b3dd5 Mon Sep 17 00:00:00 2001 From: Steffen Date: Sat, 6 Feb 2021 22:24:46 +0100 Subject: [PATCH] allow selecting multiple characters (closes #77) --- src/components/modals/RolesModal.vue | 51 ++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/src/components/modals/RolesModal.vue b/src/components/modals/RolesModal.vue index 39f460b..671227a 100644 --- a/src/components/modals/RolesModal.vue +++ b/src/components/modals/RolesModal.vue @@ -7,16 +7,24 @@

Select the characters for {{ nonTravelers }} players:

@@ -64,7 +72,7 @@ export default { computed: { selectedRoles: function() { return Object.values(this.roleSelection) - .map(roles => roles.filter(role => role.selected).length) + .map(roles => roles.reduce((a, { selected }) => a + selected, 0)) .reduce((a, b) => a + b, 0); }, hasSelectedSetupRoles: function() { @@ -84,7 +92,7 @@ export default { this.$set(this.roleSelection, role.team, []); } this.roleSelection[role.team].push(role); - this.$set(role, "selected", false); + this.$set(role, "selected", 0); }); delete this.roleSelection["traveler"]; const playerCount = Math.max(5, this.nonTravelers); @@ -93,10 +101,10 @@ export default { for (let x = 0; x < composition[team]; x++) { if (this.roleSelection[team]) { const available = this.roleSelection[team].filter( - role => role.selected !== true + role => !role.selected ); if (available.length) { - randomElement(available).selected = true; + randomElement(available).selected = 1; } } } @@ -106,7 +114,12 @@ export default { if (this.selectedRoles <= this.nonTravelers && this.selectedRoles) { // generate list of selected roles and randomize it const roles = Object.values(this.roleSelection) - .map(roles => roles.filter(role => role.selected)) + .map(roles => + roles + // duplicate roles selected more than once and filter unselected + .reduce((a, r) => [...a, ...Array(r.selected).fill(r)], []) + ) + // flatten into a single array .reduce((a, b) => [...a, ...b], []) .map(a => [Math.random(), a]) .sort((a, b) => a[0] - b[0]) @@ -152,6 +165,9 @@ ul.tokens { transition: all 250ms; &.selected { opacity: 1; + .buttons { + display: flex; + } } &.townsfolk { box-shadow: 0 0 10px $townsfolk, 0 0 10px #004cff; @@ -172,6 +188,27 @@ ul.tokens { transform: scale(1.2); z-index: 10; } + .buttons { + display: none; + position: absolute; + top: 95%; + text-align: center; + width: 100%; + z-index: 30; + font-weight: bold; + filter: drop-shadow(0 0 5px rgba(0, 0, 0, 1)); + span { + flex-grow: 1; + } + svg { + opacity: 0.25; + cursor: pointer; + &:hover { + opacity: 1; + color: red; + } + } + } } .count { opacity: 1;