mirror of https://github.com/bra1n/townsquare.git
parent
df07af4824
commit
5a995c589e
94
src/App.vue
94
src/App.vue
|
@ -6,6 +6,20 @@
|
|||
:players="players"
|
||||
:roles="roles"
|
||||
></TownSquare>
|
||||
<Modal v-show="showEditionModal" @close="showEditionModal = false">
|
||||
<h2>Select an edition:</h2>
|
||||
<ul class="editions">
|
||||
<li
|
||||
v-for="edition in editions"
|
||||
class="edition"
|
||||
v-bind:class="['edition-' + edition.id]"
|
||||
v-bind:key="edition.id"
|
||||
@click="setEdition(edition.id)"
|
||||
>
|
||||
{{ edition.name }}
|
||||
</li>
|
||||
</ul>
|
||||
</Modal>
|
||||
<div class="controls">
|
||||
<font-awesome-icon icon="cogs" @click="isControlOpen = !isControlOpen" />
|
||||
<ul v-if="isControlOpen">
|
||||
|
@ -13,15 +27,15 @@
|
|||
<li @click="addPlayer" v-if="players.length < 20">
|
||||
<em>A</em>dd Player
|
||||
</li>
|
||||
<li @click="togglePublic" v-if="players.length > 4">
|
||||
Select Roles
|
||||
</li>
|
||||
<li @click="randomizeSeatings" v-if="players.length > 2">
|
||||
<em>R</em>andomize Seatings
|
||||
</li>
|
||||
<li @click="clearPlayers" v-if="players.length">
|
||||
Clear Players
|
||||
</li>
|
||||
<li @click="showEditionModal = true" v-if="players.length > 4">
|
||||
Select Edition
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -30,30 +44,27 @@
|
|||
<script>
|
||||
import TownSquare from "./components/TownSquare";
|
||||
import TownInfo from "./components/TownInfo";
|
||||
import Modal from "./components/Modal";
|
||||
import rolesJSON from "./roles";
|
||||
|
||||
const getRolesByEdition = (edition = "TB") =>
|
||||
new Map(
|
||||
rolesJSON
|
||||
.filter(r => r.edition === edition)
|
||||
.sort((a, b) => b.team.localeCompare(a.team))
|
||||
.map(role => [role.id, role])
|
||||
);
|
||||
|
||||
console.log(getRolesByEdition());
|
||||
import editions from "./editions";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
TownSquare,
|
||||
TownInfo
|
||||
TownInfo,
|
||||
Modal
|
||||
},
|
||||
data: () => ({
|
||||
data: function() {
|
||||
return {
|
||||
editions,
|
||||
isPublic: true,
|
||||
isControlOpen: false,
|
||||
players: [],
|
||||
roles: getRolesByEdition(),
|
||||
edition: "TB"
|
||||
}),
|
||||
roles: this.getRolesByEdition(),
|
||||
edition: "tb",
|
||||
showEditionModal: false
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
togglePublic() {
|
||||
this.isPublic = !this.isPublic;
|
||||
|
@ -92,12 +103,30 @@ export default {
|
|||
this.randomizeSeatings();
|
||||
break;
|
||||
}
|
||||
},
|
||||
getRolesByEdition(edition = "tb") {
|
||||
const selectedEdition = editions.find(({ id }) => id === edition);
|
||||
return new Map(
|
||||
rolesJSON
|
||||
.filter(
|
||||
r => r.edition === edition || selectedEdition.roles.includes(r.id)
|
||||
)
|
||||
.sort((a, b) => b.team.localeCompare(a.team))
|
||||
.map(role => [role.id, role])
|
||||
);
|
||||
},
|
||||
setEdition(edition) {
|
||||
this.edition = edition;
|
||||
this.showEditionModal = false;
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
if (localStorage.isPublic !== undefined) {
|
||||
this.isPublic = JSON.parse(localStorage.isPublic);
|
||||
}
|
||||
if (localStorage.edition) {
|
||||
this.edition = localStorage.edition;
|
||||
this.roles = getRolesByEdition(this.edition);
|
||||
this.roles = this.getRolesByEdition(this.edition);
|
||||
}
|
||||
if (localStorage.players) {
|
||||
this.players = JSON.parse(localStorage.players).map(player => ({
|
||||
|
@ -120,12 +149,18 @@ export default {
|
|||
},
|
||||
edition(newEdition) {
|
||||
localStorage.edition = newEdition;
|
||||
this.roles = this.getRolesByEdition(newEdition);
|
||||
},
|
||||
isPublic(newIsPublic) {
|
||||
localStorage.isPublic = JSON.stringify(newIsPublic);
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import "vars";
|
||||
|
||||
@font-face {
|
||||
font-family: "Papyrus";
|
||||
src: url("assets/fonts/papyrus.eot"); /* IE9*/
|
||||
|
@ -199,4 +234,25 @@ body {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Editions
|
||||
@each $img in $editions {
|
||||
.edition-#{$img} {
|
||||
background-image: url("./assets/edition-#{$img}.png");
|
||||
}
|
||||
}
|
||||
|
||||
ul.editions .edition {
|
||||
text-align: center;
|
||||
padding-top: 100px;
|
||||
background-position: center center;
|
||||
background-size: cover;
|
||||
width: 200px;
|
||||
margin: 5px;
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000,
|
||||
1px 1px 0 #000, 0 0 5px rgba(0, 0, 0, 0.75);
|
||||
cursor: pointer;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -50,6 +50,20 @@ export default {
|
|||
margin: 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-content: center;
|
||||
align-items: center;
|
||||
overflow: hidden;
|
||||
justify-content: center;
|
||||
font-size: 75%;
|
||||
line-height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.modal-fade-enter,
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
:class="{
|
||||
dead: player.hasDied,
|
||||
'no-vote': player.hasVoted,
|
||||
traveller: player.role && player.role.team === 'traveller'
|
||||
traveler: player.role && player.role.team === 'traveler'
|
||||
}"
|
||||
>
|
||||
<div class="shroud" @click="toggleStatus()"></div>
|
||||
|
@ -168,7 +168,7 @@ export default {
|
|||
}
|
||||
|
||||
&.dead {
|
||||
&.traveller {
|
||||
&.traveler {
|
||||
filter: grayscale(100%);
|
||||
}
|
||||
|
||||
|
|
|
@ -25,11 +25,11 @@
|
|||
class="demon"
|
||||
v-bind:icon="teams.demons > 1 ? 'user-friends' : 'user'"
|
||||
/>
|
||||
<template v-if="teams.travellers">
|
||||
{{ teams.travellers }}
|
||||
<template v-if="teams.travelers">
|
||||
{{ teams.travelers }}
|
||||
<font-awesome-icon
|
||||
class="traveller"
|
||||
v-bind:icon="teams.travellers > 1 ? 'user-friends' : 'user'"
|
||||
class="traveler"
|
||||
v-bind:icon="teams.travelers > 1 ? 'user-friends' : 'user'"
|
||||
/>
|
||||
</template>
|
||||
</li>
|
||||
|
@ -52,14 +52,14 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
teams: function() {
|
||||
const nontravellers = this.players.filter(
|
||||
player => player.role.team !== "traveller"
|
||||
const nontravelers = this.players.filter(
|
||||
player => player.role.team !== "traveler"
|
||||
).length;
|
||||
const alive = this.players.filter(player => player.hasDied !== true)
|
||||
.length;
|
||||
return {
|
||||
...gameJSON[nontravellers - 5],
|
||||
travellers: this.players.length - nontravellers,
|
||||
...gameJSON[nontravelers - 5],
|
||||
travelers: this.players.length - nontravelers,
|
||||
alive,
|
||||
votes:
|
||||
alive +
|
||||
|
@ -126,28 +126,19 @@ export default {
|
|||
.demon {
|
||||
color: $demon;
|
||||
}
|
||||
.traveller {
|
||||
color: $traveller;
|
||||
.traveler {
|
||||
color: $traveler;
|
||||
}
|
||||
}
|
||||
|
||||
li.edition {
|
||||
width: 220px;
|
||||
height: 200px;
|
||||
background: 0 center no-repeat;
|
||||
background-position: 0 center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% auto;
|
||||
position: absolute;
|
||||
top: -50px;
|
||||
|
||||
&.edition-TB {
|
||||
background-image: url("../assets/edition-tb.png");
|
||||
}
|
||||
&.edition-BMR {
|
||||
background-image: url("../assets/edition-bmr.png");
|
||||
}
|
||||
&.edition-SNV {
|
||||
background-image: url("../assets/edition-snv.png");
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -211,20 +211,7 @@ export default {
|
|||
}
|
||||
|
||||
/***** Role token modal ******/
|
||||
ul.tokens {
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-content: center;
|
||||
align-items: center;
|
||||
overflow: hidden;
|
||||
justify-content: center;
|
||||
font-size: 75%;
|
||||
line-height: 100%;
|
||||
|
||||
.token {
|
||||
ul.tokens .token {
|
||||
border-radius: 50%;
|
||||
height: 120px;
|
||||
width: 120px;
|
||||
|
@ -255,8 +242,8 @@ ul.tokens {
|
|||
&.demon {
|
||||
box-shadow: 0 0 10px $demon, 0 0 10px $demon;
|
||||
}
|
||||
&.traveller {
|
||||
box-shadow: 0 0 10px $traveller, 0 0 10px $traveller;
|
||||
&.traveler {
|
||||
box-shadow: 0 0 10px $traveler, 0 0 10px $traveler;
|
||||
}
|
||||
|
||||
&:before {
|
||||
|
@ -272,14 +259,10 @@ ul.tokens {
|
|||
&:hover {
|
||||
transform: scale(1.2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/***** Reminder token modal ******/
|
||||
ul.reminders {
|
||||
@extend .tokens;
|
||||
|
||||
.reminder {
|
||||
ul.reminders .reminder {
|
||||
background: url("../assets/reminder.png") center center;
|
||||
background-size: 100%;
|
||||
width: 100px;
|
||||
|
@ -312,6 +295,5 @@ ul.reminders {
|
|||
&:hover {
|
||||
transform: scale(1.2);
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
[
|
||||
{
|
||||
"id": "tb",
|
||||
"name": "Trouble Brewing",
|
||||
"hasTravelers": true,
|
||||
"description": "Clouds roll in over Ravenswood Bluff, engulfing this sleepy town and its superstitious inhabitants in foreboding shadow. Freshly-washed clothes dance eerily on lines strung between cottages. Chimneys cough plumes of smoke into the air. Exotic scents waft through cracks in windows and under doors, as hidden cauldrons lay bubbling. An unusually warm Autumn breeze wraps around vine-covered walls and whispers ominously to those brave enough to walk the cobbled streets.\n\nAnxious mothers call their children home from play, as thunder begins to clap on the horizon. If you listen more closely, however, noises stranger still can be heard echoing from the neighbouring forest. Under the watchful eye of a looming monastery, silhouetted figures skip from doorway to doorway. Those who can read the signs know there is... Trouble Brewing.",
|
||||
"level": "Beginner",
|
||||
"roles": []
|
||||
},
|
||||
{
|
||||
"id": "bmr",
|
||||
"name": "Bad Moon Rising",
|
||||
"hasTravelers": true,
|
||||
"description": "The sun is swallowed by a jagged horizon as another winter's day surrenders to the night. Flecks of orange and red decay into deeper browns, the forest transforming in silent anticipation of the coming snow.\n\nRavenous wolves howl from the bowels of a rocky crevasse beyond the town borders, sending birds scattering from their cozy rooks. Travelers hurry into the inn, seeking shelter from the gathering chill. They warm themselves with hot tea, sweet strains of music and hearty ale, unaware that strange and nefarious eyes stalk them from the ruins of this once great city.\n\nTonight, even the livestock know there is a... Bad Moon Rising.",
|
||||
"level": "Intermediate",
|
||||
"roles": []
|
||||
},
|
||||
{
|
||||
"id": "snv",
|
||||
"name": "Sects & Violets",
|
||||
"hasTravelers": true,
|
||||
"description": "Vibrant spring gives way to a warm and inviting summer. Flowers of every description blossom as far as the eye can see, tenderly nurtured in public gardens and window boxes overlooking the lavish promenade. Birds sing, artists paint and philosophers ponder life's greatest mysteries inside a bustling tavern as a circus pitches its endearingly ragged tent on the edge of town.\n\nAs the townsfolk bask in frivolity and mischief, indulging themselves in fine entertainment and even finer wine, dark and clandestine forces are assembling. Witches and cults lurk in majestic ruins on the fringes of the community, hosting secret meetings in underground caves and malevolently plotting the downfall of Ravenswood Bluff and its revelers.\n\nThe time is ripe for... Sects & Violets.",
|
||||
"level": "Intermediate",
|
||||
"roles": []
|
||||
},
|
||||
{
|
||||
"id": "luf",
|
||||
"name": "Laissez un Faire",
|
||||
"hasTravelers": false,
|
||||
"description": "",
|
||||
"level": "Veteran",
|
||||
"roles": ["balloonist", "savant", "amnesiac", "fisherman", "artist", "cannibal", "mutant", "lunatic", "widow", "goblin", "leviathan"]
|
||||
}
|
||||
]
|
253
src/roles.json
253
src/roles.json
|
@ -2,7 +2,7 @@
|
|||
{
|
||||
"id": "washerwoman",
|
||||
"name": "Washerwoman",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": true,
|
||||
"otherNight": false,
|
||||
|
@ -16,7 +16,7 @@
|
|||
{
|
||||
"id": "librarian",
|
||||
"name": "Librarian",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": true,
|
||||
"otherNight": false,
|
||||
|
@ -30,7 +30,7 @@
|
|||
{
|
||||
"id": "investigator",
|
||||
"name": "Investigator",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": true,
|
||||
"otherNight": false,
|
||||
|
@ -44,7 +44,7 @@
|
|||
{
|
||||
"id": "chef",
|
||||
"name": "Chef",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": true,
|
||||
"otherNight": false,
|
||||
|
@ -55,7 +55,7 @@
|
|||
{
|
||||
"id": "empath",
|
||||
"name": "Empath",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
|
@ -66,7 +66,7 @@
|
|||
{
|
||||
"id": "fortuneteller",
|
||||
"name": "Fortune Teller",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
|
@ -79,7 +79,7 @@
|
|||
{
|
||||
"id": "undertaker",
|
||||
"name": "Undertaker",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
|
@ -92,7 +92,7 @@
|
|||
{
|
||||
"id": "monk",
|
||||
"name": "Monk",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
|
@ -105,7 +105,7 @@
|
|||
{
|
||||
"id": "ravenkeeper",
|
||||
"name": "Ravenkeeper",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
|
@ -116,7 +116,7 @@
|
|||
{
|
||||
"id": "mayor",
|
||||
"name": "Mayor",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
|
@ -127,7 +127,7 @@
|
|||
{
|
||||
"id": "slayer",
|
||||
"name": "Slayer",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
|
@ -140,7 +140,7 @@
|
|||
{
|
||||
"id": "soldier",
|
||||
"name": "Soldier",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
|
@ -151,7 +151,7 @@
|
|||
{
|
||||
"id": "virgin",
|
||||
"name": "Virgin",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
|
@ -164,7 +164,7 @@
|
|||
{
|
||||
"id": "butler",
|
||||
"name": "Butler",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "outsider",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
|
@ -177,7 +177,7 @@
|
|||
{
|
||||
"id": "drunk",
|
||||
"name": "Drunk",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "outsider",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
|
@ -190,7 +190,7 @@
|
|||
{
|
||||
"id": "recluse",
|
||||
"name": "Recluse",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "outsider",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
|
@ -201,7 +201,7 @@
|
|||
{
|
||||
"id": "saint",
|
||||
"name": "Saint",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "outsider",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
|
@ -212,7 +212,7 @@
|
|||
{
|
||||
"id": "baron",
|
||||
"name": "Baron",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "minion",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
|
@ -223,7 +223,7 @@
|
|||
{
|
||||
"id": "poisoner",
|
||||
"name": "Poisoner",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "minion",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
|
@ -236,7 +236,7 @@
|
|||
{
|
||||
"id": "spy",
|
||||
"name": "Spy",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "minion",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
|
@ -247,7 +247,7 @@
|
|||
{
|
||||
"id": "scarletwoman",
|
||||
"name": "Scarlet Woman",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "minion",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
|
@ -255,12 +255,12 @@
|
|||
"Demon"
|
||||
],
|
||||
"setup": false,
|
||||
"ability": "If there are 5 or more players alive (Travellers don't count) and the Demon dies, you become the Demon."
|
||||
"ability": "If there are 5 or more players alive (Travelers don't count) and the Demon dies, you become the Demon."
|
||||
},
|
||||
{
|
||||
"id": "imp",
|
||||
"name": "Imp",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"team": "demon",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
|
@ -272,7 +272,7 @@
|
|||
},
|
||||
{
|
||||
"id": "grandmother",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Grandchild"],
|
||||
|
@ -283,7 +283,7 @@
|
|||
},
|
||||
{
|
||||
"id": "sailor",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Drunk"],
|
||||
|
@ -294,7 +294,7 @@
|
|||
},
|
||||
{
|
||||
"id": "chambermaid",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": [],
|
||||
|
@ -305,7 +305,7 @@
|
|||
},
|
||||
{
|
||||
"id": "exorcist",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Chosen"],
|
||||
|
@ -316,7 +316,7 @@
|
|||
},
|
||||
{
|
||||
"id": "innkeeper",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Protected", "Drunk"],
|
||||
|
@ -327,7 +327,7 @@
|
|||
},
|
||||
{
|
||||
"id": "gambler",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Die"],
|
||||
|
@ -338,7 +338,7 @@
|
|||
},
|
||||
{
|
||||
"id": "gossip",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Die"],
|
||||
|
@ -349,7 +349,7 @@
|
|||
},
|
||||
{
|
||||
"id": "courtier",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Drunk 1", "Drunk 2", "Drunk 3", "Used"],
|
||||
|
@ -360,7 +360,7 @@
|
|||
},
|
||||
{
|
||||
"id": "professor",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Alive", "Used"],
|
||||
|
@ -371,7 +371,7 @@
|
|||
},
|
||||
{
|
||||
"id": "minstrel",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Everyone drunk"],
|
||||
|
@ -382,7 +382,7 @@
|
|||
},
|
||||
{
|
||||
"id": "tealady",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": ["Protected"],
|
||||
|
@ -393,7 +393,7 @@
|
|||
},
|
||||
{
|
||||
"id": "pacifist",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
|
@ -404,7 +404,7 @@
|
|||
},
|
||||
{
|
||||
"id": "fool",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": ["Used"],
|
||||
|
@ -415,7 +415,7 @@
|
|||
},
|
||||
{
|
||||
"id": "tinker",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Die"],
|
||||
|
@ -426,7 +426,7 @@
|
|||
},
|
||||
{
|
||||
"id": "moonchild",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Die"],
|
||||
|
@ -437,7 +437,7 @@
|
|||
},
|
||||
{
|
||||
"id": "goon",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Drunk"],
|
||||
|
@ -448,7 +448,7 @@
|
|||
},
|
||||
{
|
||||
"id": "lunatic",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Attack 1", "Attack 2", "Attack 3", "Decoy"],
|
||||
|
@ -459,7 +459,7 @@
|
|||
},
|
||||
{
|
||||
"id": "godfather",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Died today", "Die"],
|
||||
|
@ -470,7 +470,7 @@
|
|||
},
|
||||
{
|
||||
"id": "devilsadvocate",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Survives execution"],
|
||||
|
@ -481,7 +481,7 @@
|
|||
},
|
||||
{
|
||||
"id": "assassin",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Die", "Used"],
|
||||
|
@ -492,7 +492,7 @@
|
|||
},
|
||||
{
|
||||
"id": "mastermind",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
|
@ -503,7 +503,7 @@
|
|||
},
|
||||
{
|
||||
"id": "po",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Die 1", "Die 2", "Die 3", "Attack x3"],
|
||||
|
@ -514,7 +514,7 @@
|
|||
},
|
||||
{
|
||||
"id": "zombuul",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["No death today", "Die"],
|
||||
|
@ -525,7 +525,7 @@
|
|||
},
|
||||
{
|
||||
"id": "pukka",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Poisoned", "Die"],
|
||||
|
@ -536,7 +536,7 @@
|
|||
},
|
||||
{
|
||||
"id": "shabaloth",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Die 1", "Die 2", "Alive"],
|
||||
|
@ -547,7 +547,7 @@
|
|||
},
|
||||
{
|
||||
"id": "clockmaker",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": true,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
|
@ -558,7 +558,7 @@
|
|||
},
|
||||
{
|
||||
"id": "dreamer",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": [],
|
||||
|
@ -569,7 +569,7 @@
|
|||
},
|
||||
{
|
||||
"id": "snakecharmer",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Poisoned"],
|
||||
|
@ -580,7 +580,7 @@
|
|||
},
|
||||
{
|
||||
"id": "mathematician",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Abnormal effect"],
|
||||
|
@ -591,7 +591,7 @@
|
|||
},
|
||||
{
|
||||
"id": "flowergirl",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Demon did vote", "Demon did not vote"],
|
||||
|
@ -602,7 +602,7 @@
|
|||
},
|
||||
{
|
||||
"id": "towncrier",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["No Minion nominated", "Minion nominated"],
|
||||
|
@ -613,7 +613,7 @@
|
|||
},
|
||||
{
|
||||
"id": "oracle",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": [],
|
||||
|
@ -624,7 +624,7 @@
|
|||
},
|
||||
{
|
||||
"id": "savant",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
|
@ -635,7 +635,7 @@
|
|||
},
|
||||
{
|
||||
"id": "seamstress",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Used"],
|
||||
|
@ -646,7 +646,7 @@
|
|||
},
|
||||
{
|
||||
"id": "philosopher",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Used", "Drunk"],
|
||||
|
@ -657,7 +657,7 @@
|
|||
},
|
||||
{
|
||||
"id": "artist",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": ["Used"],
|
||||
|
@ -668,7 +668,7 @@
|
|||
},
|
||||
{
|
||||
"id": "juggler",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Correct"],
|
||||
|
@ -679,7 +679,7 @@
|
|||
},
|
||||
{
|
||||
"id": "sage",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": [],
|
||||
|
@ -690,7 +690,7 @@
|
|||
},
|
||||
{
|
||||
"id": "mutant",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
|
@ -701,7 +701,7 @@
|
|||
},
|
||||
{
|
||||
"id": "sweetheart",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Drunk"],
|
||||
|
@ -712,7 +712,7 @@
|
|||
},
|
||||
{
|
||||
"id": "barber",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Swap"],
|
||||
|
@ -723,7 +723,7 @@
|
|||
},
|
||||
{
|
||||
"id": "klutz",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
|
@ -734,7 +734,7 @@
|
|||
},
|
||||
{
|
||||
"id": "eviltwin",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": true,
|
||||
"otherNight": false,
|
||||
"reminders": ["Twin"],
|
||||
|
@ -745,7 +745,7 @@
|
|||
},
|
||||
{
|
||||
"id": "witch",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Cursed"],
|
||||
|
@ -756,7 +756,7 @@
|
|||
},
|
||||
{
|
||||
"id": "cerenovus",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Mad"],
|
||||
|
@ -767,7 +767,7 @@
|
|||
},
|
||||
{
|
||||
"id": "pithag",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": [],
|
||||
|
@ -778,7 +778,7 @@
|
|||
},
|
||||
{
|
||||
"id": "fanggu",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Die"],
|
||||
|
@ -789,7 +789,7 @@
|
|||
},
|
||||
{
|
||||
"id": "vigormortis",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Die", "Poisoned", "Ability active"],
|
||||
|
@ -800,7 +800,7 @@
|
|||
},
|
||||
{
|
||||
"id": "nodashii",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Die", "Poisoned"],
|
||||
|
@ -811,7 +811,7 @@
|
|||
},
|
||||
{
|
||||
"id": "vortox",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Die"],
|
||||
|
@ -822,7 +822,7 @@
|
|||
},
|
||||
{
|
||||
"id": "scapegoat",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
|
@ -833,7 +833,7 @@
|
|||
},
|
||||
{
|
||||
"id": "gunslinger",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
|
@ -844,7 +844,7 @@
|
|||
},
|
||||
{
|
||||
"id": "beggar",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
|
@ -855,7 +855,7 @@
|
|||
},
|
||||
{
|
||||
"id": "bureaucrat",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Vote x3"],
|
||||
|
@ -866,7 +866,7 @@
|
|||
},
|
||||
{
|
||||
"id": "thief",
|
||||
"edition": "TB",
|
||||
"edition": "tb",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Negative vote"],
|
||||
|
@ -877,7 +877,7 @@
|
|||
},
|
||||
{
|
||||
"id": "apprentice",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": true,
|
||||
"otherNight": false,
|
||||
"reminders": ["Apprentice ability"],
|
||||
|
@ -888,7 +888,7 @@
|
|||
},
|
||||
{
|
||||
"id": "matron",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
|
@ -899,7 +899,7 @@
|
|||
},
|
||||
{
|
||||
"id": "voudon",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
|
@ -910,7 +910,7 @@
|
|||
},
|
||||
{
|
||||
"id": "judge",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": ["Used"],
|
||||
|
@ -921,7 +921,7 @@
|
|||
},
|
||||
{
|
||||
"id": "bishop",
|
||||
"edition": "BMR",
|
||||
"edition": "bmr",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": ["Nominate Good", "Nominate Evil"],
|
||||
|
@ -932,7 +932,7 @@
|
|||
},
|
||||
{
|
||||
"id": "butcher",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
|
@ -943,7 +943,7 @@
|
|||
},
|
||||
{
|
||||
"id": "bonecollector",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Used", "Ability active"],
|
||||
|
@ -954,7 +954,7 @@
|
|||
},
|
||||
{
|
||||
"id": "harlot",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Die"],
|
||||
|
@ -965,7 +965,7 @@
|
|||
},
|
||||
{
|
||||
"id": "barista",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Ability x2", "Healthy & Sober"],
|
||||
|
@ -976,7 +976,7 @@
|
|||
},
|
||||
{
|
||||
"id": "deviant",
|
||||
"edition": "SNV",
|
||||
"edition": "snv",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
|
@ -984,5 +984,82 @@
|
|||
"name": "Deviant",
|
||||
"team": "traveler",
|
||||
"ability": "If you were funny today, you can not be exiled."
|
||||
},
|
||||
{
|
||||
"id": "balloonist",
|
||||
"edition": "",
|
||||
"firstNight": true,
|
||||
"otherNight": true,
|
||||
"reminders": ["Seen"],
|
||||
"setup": true,
|
||||
"name": "Balloonist",
|
||||
"team": "townsfolk",
|
||||
"ability": "Each night, you learn 1 player of each character type, until there are no more types to learn. [+1 Outsider]"
|
||||
},
|
||||
{
|
||||
"id": "amnesiac",
|
||||
"edition": "",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
"name": "Amnesiac",
|
||||
"team": "townsfolk",
|
||||
"ability": "You do not know what your ability is. Each day, privately guess what it is: you learn how accurate you are."
|
||||
},
|
||||
{
|
||||
"id": "cannibal",
|
||||
"edition": "",
|
||||
"firstNight": false,
|
||||
"otherNight": true,
|
||||
"reminders": ["Ability gained", "Poisoned"],
|
||||
"setup": false,
|
||||
"name": "Cannibal",
|
||||
"team": "townsfolk",
|
||||
"ability": "You have the ability of the recently killed executee. If they are evil, you are poisoned until a good player dies this way."
|
||||
},
|
||||
{
|
||||
"id": "fisherman",
|
||||
"edition": "",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": ["Used"],
|
||||
"setup": false,
|
||||
"name": "Fisherman",
|
||||
"team": "townsfolk",
|
||||
"ability": "Once per game, during the day, visit the Storyteller for some advice to help you win."
|
||||
},
|
||||
{
|
||||
"id": "goblin",
|
||||
"edition": "",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": ["Claimed today"],
|
||||
"setup": false,
|
||||
"name": "Goblin",
|
||||
"team": "minion",
|
||||
"ability": "When nominated, you may publicly claim to be the Goblin: if you are executed that day, your team wins."
|
||||
},
|
||||
{
|
||||
"id": "widow",
|
||||
"edition": "",
|
||||
"firstNight": true,
|
||||
"otherNight": false,
|
||||
"reminders": ["Poisoned", "Knowing"],
|
||||
"setup": false,
|
||||
"name": "Widow",
|
||||
"team": "minion",
|
||||
"ability": "On your 1st night, look at the Grimoire & choose a player: they are poisoned. 1 good player knows a Widow is in play."
|
||||
},
|
||||
{
|
||||
"id": "leviathan",
|
||||
"edition": "",
|
||||
"firstNight": false,
|
||||
"otherNight": false,
|
||||
"reminders": ["Good executed", "Day 1", "Day 2", "Day 3", "Day 4", "Day 5"],
|
||||
"setup": false,
|
||||
"name": "Leviathan",
|
||||
"team": "demon",
|
||||
"ability": "All players know you are in play. After 5 days, evil wins. If more than 1 good player is executed, evil wins."
|
||||
}
|
||||
]
|
||||
|
|
|
@ -3,7 +3,13 @@ $townsfolk: #1f65ff;
|
|||
$outsider: #46d5ff;
|
||||
$minion: #ff6900;
|
||||
$demon: #ce0100;
|
||||
$traveller: #cc04ff;
|
||||
$traveler: #cc04ff;
|
||||
|
||||
$editions:
|
||||
'tb',
|
||||
'bmr',
|
||||
'snv'
|
||||
;
|
||||
|
||||
$roles:
|
||||
'apprentice',
|
||||
|
|
Loading…
Reference in New Issue