Merge branch 'bra1n:develop' into develop
67
.github/workflows/codeql-analysis.yml
vendored
|
@ -1,67 +0,0 @@
|
|||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, develop ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ main, develop ]
|
||||
schedule:
|
||||
- cron: '27 22 * * 1'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'javascript' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
|
||||
# Learn more:
|
||||
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
24
.github/workflows/deploy.yml
vendored
|
@ -5,19 +5,19 @@ on:
|
|||
- main
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
concurrency: ci-${{ github.ref }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v1
|
||||
- name: Checkout 🛎️
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
npm install
|
||||
npm run-script build
|
||||
- name: Install and Build 🔧
|
||||
run: |
|
||||
npm ci
|
||||
npm run build
|
||||
|
||||
- name: Deploy
|
||||
uses: JamesIves/github-pages-deploy-action@releases/v3
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BRANCH: gh-pages
|
||||
FOLDER: dist
|
||||
- name: Deploy 🚀
|
||||
uses: JamesIves/github-pages-deploy-action@v4.2.5
|
||||
with:
|
||||
branch: gh-pages
|
||||
folder: dist
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
- added ability to run a non-nomination vote
|
||||
|
||||
### Version 2.15.3
|
||||
- add Huntsman/Damsel, Noble, Al-Hadikhia, Golem, Fearmonger to list of available characters
|
||||
- add Huntsman/Damsel, Noble, Al-Hadikhia, Golem, Fearmonger, Puzzlemaster, Alchemist, Engineer, Riot, Psychopath, Atheist, Nightwatchman to list of available characters
|
||||
- fixed game state JSON not handling custom Fabled correctly
|
||||
|
||||
### Version 2.15.2
|
||||
- added mobile web application support
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
# Blood on the Clocktower Grimoire & Town Square
|
||||
|
||||
> :warning: **This project is no longer actively maintained** and will only receive critical bug fixes and the remaining Kickstarter preview roles. :warning:
|
||||
|
||||

|
||||
|
||||
This is an unofficial online tool to run Blood on the Clocktower games through Discord or other digital means.
|
||||
|
@ -27,7 +29,7 @@ If you want to learn more about how to use the app as a player, [JayBotC](https:
|
|||
|
||||
### Custom Script Support
|
||||
|
||||
Any custom script generated by the official [Script Tool](https://bloodontheclocktower.com/script) is supported out of
|
||||
Any custom script generated by the official [Script Tool](https://script.bloodontheclocktower.com/) is supported out of
|
||||
the box and you only need to upload it to get the selected set of characters into your grimoire. If you want to customize
|
||||
your script further, there is an additional `"_meta"` object that you can add to the script like you would add a normal
|
||||
character:
|
||||
|
|
11975
package-lock.json
generated
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "townsquare",
|
||||
"version": "2.15.2",
|
||||
"version": "2.15.3",
|
||||
"description": "Blood on the Clocktower Town Square",
|
||||
"author": "Steffen Baumgart",
|
||||
"scripts": {
|
||||
|
|
|
@ -12,10 +12,14 @@ register.setDefaultLabels({
|
|||
|
||||
const PING_INTERVAL = 30000; // 30 seconds
|
||||
|
||||
const server = https.createServer({
|
||||
cert: fs.readFileSync("cert.pem"),
|
||||
key: fs.readFileSync("key.pem")
|
||||
});
|
||||
const options = {};
|
||||
|
||||
if (process.env.NODE_ENV !== "development") {
|
||||
options.cert = fs.readFileSync("cert.pem");
|
||||
options.key = fs.readFileSync("key.pem");
|
||||
}
|
||||
|
||||
const server = https.createServer(options);
|
||||
const wss = new WebSocket.Server({
|
||||
...(process.env.NODE_ENV === "development" ? { port: 8081 } : { server }),
|
||||
verifyClient: info =>
|
||||
|
@ -234,7 +238,7 @@ const interval = setInterval(function ping() {
|
|||
ws.readyState === WebSocket.CONNECTING)
|
||||
)
|
||||
) {
|
||||
metrics.channels_list.remove([channel]);
|
||||
metrics.channels_list.remove({ name: channel });
|
||||
delete channels[channel];
|
||||
}
|
||||
}
|
||||
|
|
BIN
src/assets/icons/alchemist.png
Normal file
After Width: | Height: | Size: 125 KiB |
BIN
src/assets/icons/atheist.png
Normal file
After Width: | Height: | Size: 181 KiB |
BIN
src/assets/icons/engineer.png
Normal file
After Width: | Height: | Size: 899 KiB |
Before Width: | Height: | Size: 856 KiB After Width: | Height: | Size: 124 KiB |
Before Width: | Height: | Size: 838 KiB After Width: | Height: | Size: 121 KiB |
BIN
src/assets/icons/nightwatchman.png
Normal file
After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 158 KiB |
BIN
src/assets/icons/psychopath.png
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
src/assets/icons/puzzlemaster.png
Normal file
After Width: | Height: | Size: 161 KiB |
BIN
src/assets/icons/riot.png
Normal file
After Width: | Height: | Size: 122 KiB |
|
@ -32,7 +32,7 @@
|
|||
<h3>Load custom script / characters</h3>
|
||||
To play with a custom script, you need to select the characters you want
|
||||
to play with in the official
|
||||
<a href="https://bloodontheclocktower.com/script-tool/" target="_blank"
|
||||
<a href="https://script.bloodontheclocktower.com/" target="_blank"
|
||||
>Script Tool</a
|
||||
>
|
||||
and then upload the generated "custom-list.json" either directly here or
|
||||
|
|
|
@ -40,7 +40,9 @@ export default {
|
|||
roles: this.edition.isOfficial
|
||||
? ""
|
||||
: this.$store.getters.customRolesStripped,
|
||||
fabled: this.players.fabled.map(({ id }) => id),
|
||||
fabled: this.players.fabled.map(fabled =>
|
||||
fabled.isCustom ? fabled : { id: fabled.id }
|
||||
),
|
||||
players: this.players.players.map(player => ({
|
||||
...player,
|
||||
role: player.role.id || {}
|
||||
|
@ -79,7 +81,12 @@ export default {
|
|||
}
|
||||
if (fabled) {
|
||||
this.$store.commit("players/setFabled", {
|
||||
fabled: fabled.map(id => this.$store.state.fabled.get(id))
|
||||
fabled: fabled.map(
|
||||
f =>
|
||||
this.$store.state.fabled.get(f) ||
|
||||
this.$store.state.fabled.get(f.id) ||
|
||||
f
|
||||
)
|
||||
});
|
||||
}
|
||||
if (players) {
|
||||
|
|
|
@ -115,7 +115,7 @@ export default {
|
|||
{
|
||||
id: "evil",
|
||||
name: "Minion info",
|
||||
firstNight: 4,
|
||||
firstNight: 5,
|
||||
team: "minion",
|
||||
players: this.players.filter(p => p.role.team === "minion"),
|
||||
firstNightReminder:
|
||||
|
@ -125,7 +125,7 @@ export default {
|
|||
{
|
||||
id: "evil",
|
||||
name: "Demon info & bluffs",
|
||||
firstNight: 7,
|
||||
firstNight: 8,
|
||||
team: "demon",
|
||||
players: this.players.filter(p => p.role.team === "demon"),
|
||||
firstNightReminder:
|
||||
|
|
142
src/hatred.json
|
@ -17,15 +17,6 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "Mutant",
|
||||
"hatred": [
|
||||
{
|
||||
"id": "Undertaker",
|
||||
"reason": "If the Mutant causes a second execution, the Undertaker learns either one or both executed characters (Storyteller's choice)."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "Lunatic",
|
||||
"hatred": [
|
||||
|
@ -58,10 +49,6 @@
|
|||
{
|
||||
"id": "Goblin",
|
||||
"reason": "The Cerenovus may choose to make a player mad that they are the Goblin."
|
||||
},
|
||||
{
|
||||
"id": "Undertaker",
|
||||
"reason": "If the Cerenovus causes a second execution, the Undertaker learns either one or both executed characters (Storyteller's choice)."
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -140,6 +127,10 @@
|
|||
{
|
||||
"id": "Legion",
|
||||
"hatred": [
|
||||
{
|
||||
"id": "Engineer",
|
||||
"reason": "Legion and the Engineer can not both be in play at the start of the game. If the Engineer creates Legion, most players (including all evil players) become evil Legion."
|
||||
},
|
||||
{
|
||||
"id": "Preacher",
|
||||
"reason": "Only 1 jinxed character can be in play."
|
||||
|
@ -162,6 +153,10 @@
|
|||
"id": "Magician",
|
||||
"reason": "When the Spy sees the Grimoire, the Demon and Magician's character tokens are removed."
|
||||
},
|
||||
{
|
||||
"id": "Alchemist",
|
||||
"reason": "The Alchemist can not have the Spy ability."
|
||||
},
|
||||
{
|
||||
"id": "Poppy Grower",
|
||||
"reason": "If the Poppy Grower is in play, the Spy does not see the Grimoire until the Poppy Grower dies."
|
||||
|
@ -187,6 +182,10 @@
|
|||
"id": "Poppy Grower",
|
||||
"reason": "If the Poppy Grower is in play, the Widow does not see the Grimoire until the Poppy Grower dies."
|
||||
},
|
||||
{
|
||||
"id": "Alchemist",
|
||||
"reason": "The Alchemist can not have the Widow ability."
|
||||
},
|
||||
{
|
||||
"id": "Damsel",
|
||||
"reason": "Only 1 jinxed character can be in play."
|
||||
|
@ -225,12 +224,129 @@
|
|||
"id": "Balloonist",
|
||||
"reason": "If the Marionette thinks that they are the Balloonist, +1 Outsider was added."
|
||||
},
|
||||
{
|
||||
"id": "Damsel",
|
||||
"reason": "The Marionette does not learn that a Damsel is in play."
|
||||
},
|
||||
{
|
||||
"id": "Huntsman",
|
||||
"reason": "If the Marionette thinks that they are the Huntsman, the Damsel was added."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "Riot",
|
||||
"hatred": [
|
||||
{
|
||||
"id": "Engineer",
|
||||
"reason": "Riot and the Engineer can not both be in play at the start of the game. \nIf the Engineer creates Riot, the evil players become Riot."
|
||||
},
|
||||
{
|
||||
"id": "Golem",
|
||||
"reason": "If The Golem nominates Riot, the Riot player does not die."
|
||||
},
|
||||
{
|
||||
"id": "Snitch",
|
||||
"reason": "If the Snitch is in play, each Riot player gets an extra 3 bluffs."
|
||||
},
|
||||
{
|
||||
"id": "Saint",
|
||||
"reason": "If a good player nominates and kills the Saint, the Saint's team loses."
|
||||
},
|
||||
{
|
||||
"id": "Butler",
|
||||
"reason": "The Butler can not nominate their master."
|
||||
},
|
||||
{
|
||||
"id": "Pit-Hag",
|
||||
"reason": "If the Pit-Hag creates Riot, all evil players become Riot. \nIf the Pit-Hag creates Riot after day 3, the game continues for one more day."
|
||||
},
|
||||
{
|
||||
"id": "Mayor",
|
||||
"reason": "If the 3rd day begins with just three players alive, the players may choose (as a group) not to nominate at all. If so (and a Mayor is alive) then the Mayor's team wins."
|
||||
},
|
||||
{
|
||||
"id": "Monk",
|
||||
"reason": "If a Riot player nominates and kills the Monk-protected-player, the Monk-protected-player does not die."
|
||||
},
|
||||
{
|
||||
"id": "Farmer",
|
||||
"reason": "If a Riot player nominates and kills a Farmer, the Farmer uses their ability tonight."
|
||||
},
|
||||
{
|
||||
"id": "Innkeeper",
|
||||
"reason": "If a Riot player nominates an Innkeeper-protected-player, the Innkeeper-protected-player does not die."
|
||||
},
|
||||
{
|
||||
"id": "Sage",
|
||||
"reason": "If a Riot player nominates and kills a Sage, the Sage uses their ability tonight."
|
||||
},
|
||||
{
|
||||
"id": "Ravenkeeper",
|
||||
"reason": "If a Riot player nominates and kills the Ravenkeeper, the Ravenkeeper uses their ability tonight."
|
||||
},
|
||||
{
|
||||
"id": "Soldier",
|
||||
"reason": "If a Riot player nominates the Soldier, the Soldier does not die."
|
||||
},
|
||||
{
|
||||
"id": "Grandmother",
|
||||
"reason": "If a Riot player nominates and kills the Grandchild, the Grandmother dies too."
|
||||
},
|
||||
{
|
||||
"id": "King",
|
||||
"reason": "If a Riot player nominates and kills the King and the Choirboy is alive, the Choirboy uses their ability tonight."
|
||||
},
|
||||
{
|
||||
"id": "Exorcist",
|
||||
"reason": "Only 1 jinxed character can be in play."
|
||||
},
|
||||
{
|
||||
"id": "Minstrel",
|
||||
"reason": "Only 1 jinxed character can be in play."
|
||||
},
|
||||
{
|
||||
"id": "Flowergirl",
|
||||
"reason": "Only 1 jinxed character can be in play."
|
||||
},
|
||||
{
|
||||
"id": "Undertaker",
|
||||
"reason": "Players that die by nomination register as being executed to the Undertaker."
|
||||
},
|
||||
{
|
||||
"id": "Cannibal",
|
||||
"reason": "Players that die by nomination register as being executed to the Cannibal."
|
||||
},
|
||||
{
|
||||
"id": "Pacifist",
|
||||
"reason": "Players that die by nomination register as being executed to the Pacifist."
|
||||
},
|
||||
{
|
||||
"id": "Devil's Advocate",
|
||||
"reason": "Players that die by nomination register as being executed to the Devil's Advocate."
|
||||
},
|
||||
{
|
||||
"id": "Investigator",
|
||||
"reason": "Riot registers as a Minion to the Investigator."
|
||||
},
|
||||
{
|
||||
"id": "Clockmaker",
|
||||
"reason": "Riot registers as a Minion to the Clockmaker."
|
||||
},
|
||||
{
|
||||
"id": "Town Crier",
|
||||
"reason": "Riot registers as a Minion to the Town Crier."
|
||||
},
|
||||
{
|
||||
"id": "Damsel",
|
||||
"reason": "Riot registers as a Minion to the Damsel."
|
||||
},
|
||||
{
|
||||
"id": "Preacher",
|
||||
"reason": "Riot registers as a Minion to the Preacher."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "Lleech",
|
||||
"hatred": [
|
||||
|
|
333
src/roles.json
|
@ -4,7 +4,7 @@
|
|||
"name": "Washerwoman",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 30,
|
||||
"firstNight": 32,
|
||||
"firstNightReminder": "Show the character token of a Townsfolk in play. Point to two players, one of which is that character.",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
|
@ -18,7 +18,7 @@
|
|||
"name": "Librarian",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 31,
|
||||
"firstNight": 33,
|
||||
"firstNightReminder": "Show the character token of an Outsider in play. Point to two players, one of which is that character.",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
|
@ -32,7 +32,7 @@
|
|||
"name": "Investigator",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 32,
|
||||
"firstNight": 34,
|
||||
"firstNightReminder": "Show the character token of a Minion in play. Point to two players, one of which is that character.",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
|
@ -46,7 +46,7 @@
|
|||
"name": "Chef",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 33,
|
||||
"firstNight": 35,
|
||||
"firstNightReminder": "Show the finger signal (0, 1, 2, \u2026) for the number of pairs of neighbouring evil players.",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
|
@ -59,9 +59,9 @@
|
|||
"name": "Empath",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 34,
|
||||
"firstNight": 36,
|
||||
"firstNightReminder": "Show the finger signal (0, 1, 2) for the number of evil alive neighbours of the Empath.",
|
||||
"otherNight": 52,
|
||||
"otherNight": 53,
|
||||
"otherNightReminder": "Show the finger signal (0, 1, 2) for the number of evil neighbours.",
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
|
@ -72,9 +72,9 @@
|
|||
"name": "Fortune Teller",
|
||||
"edition": "tb",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 35,
|
||||
"firstNight": 37,
|
||||
"firstNightReminder": "The Fortune Teller points to two players. Give the head signal (nod yes, shake no) for whether one of those players is the Demon. ",
|
||||
"otherNight": 53,
|
||||
"otherNight": 54,
|
||||
"otherNightReminder": "The Fortune Teller points to two players. Show the head signal (nod 'yes', shake 'no') for whether one of those players is the Demon.",
|
||||
"reminders": ["Red herring"],
|
||||
"setup": false,
|
||||
|
@ -87,7 +87,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 55,
|
||||
"otherNight": 56,
|
||||
"otherNightReminder": "If a player was executed today: Show that player\u2019s character token.",
|
||||
"reminders": ["Executed"],
|
||||
"setup": false,
|
||||
|
@ -100,7 +100,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 12,
|
||||
"otherNight": 13,
|
||||
"otherNightReminder": "The previously protected player is no longer protected. The Monk points to a player not themself. Mark that player 'Protected'.",
|
||||
"reminders": ["Protected"],
|
||||
"setup": false,
|
||||
|
@ -113,7 +113,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 41,
|
||||
"otherNight": 42,
|
||||
"otherNightReminder": "If the Ravenkeeper died tonight: The Ravenkeeper points to a player. Show that player\u2019s character token.",
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
|
@ -176,9 +176,9 @@
|
|||
"name": "Butler",
|
||||
"edition": "tb",
|
||||
"team": "outsider",
|
||||
"firstNight": 36,
|
||||
"firstNight": 38,
|
||||
"firstNightReminder": "The Butler points to a player. Mark that player as 'Master'.",
|
||||
"otherNight": 54,
|
||||
"otherNight": 55,
|
||||
"otherNightReminder": "The Butler points to a player. Mark that player as 'Master'.",
|
||||
"reminders": ["Master"],
|
||||
"setup": false,
|
||||
|
@ -229,9 +229,9 @@
|
|||
"name": "Poisoner",
|
||||
"edition": "tb",
|
||||
"team": "minion",
|
||||
"firstNight": 15,
|
||||
"firstNight": 17,
|
||||
"firstNightReminder": "The Poisoner points to a player. That player is poisoned.",
|
||||
"otherNight": 7,
|
||||
"otherNight": 8,
|
||||
"otherNightReminder": "The previously poisoned player is no longer poisoned. The Poisoner points to a player. That player is poisoned.",
|
||||
"reminders": ["Poisoned"],
|
||||
"setup": false,
|
||||
|
@ -242,9 +242,9 @@
|
|||
"name": "Spy",
|
||||
"edition": "tb",
|
||||
"team": "minion",
|
||||
"firstNight": 45,
|
||||
"firstNight": 48,
|
||||
"firstNightReminder": "Show the Grimoire to the Spy for as long as they need.",
|
||||
"otherNight": 66,
|
||||
"otherNight": 68,
|
||||
"otherNightReminder": "Show the Grimoire to the Spy for as long as they need.",
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
|
@ -257,7 +257,7 @@
|
|||
"team": "minion",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 19,
|
||||
"otherNight": 20,
|
||||
"otherNightReminder": "If the Scarlet Woman became the Demon today: Show the 'You are' card, then the demon token.",
|
||||
"reminders": ["Demon"],
|
||||
"setup": false,
|
||||
|
@ -283,7 +283,7 @@
|
|||
"team": "demon",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 23,
|
||||
"otherNight": 24,
|
||||
"otherNightReminder": "The Imp points to a player. That player dies. If the Imp chose themselves: Replace the character of 1 alive minion with a spare Imp token. Show the 'You are' card, then the Imp token.",
|
||||
"reminders": ["Dead"],
|
||||
"setup": false,
|
||||
|
@ -359,9 +359,9 @@
|
|||
"name": "Grandmother",
|
||||
"edition": "bmr",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 37,
|
||||
"firstNight": 39,
|
||||
"firstNightReminder": "Show the marked character token. Point to the marked player.",
|
||||
"otherNight": 49,
|
||||
"otherNight": 50,
|
||||
"otherNightReminder": "If the Grandmother\u2019s grandchild was killed by the Demon tonight: The Grandmother dies.",
|
||||
"reminders": ["Grandchild"],
|
||||
"setup": false,
|
||||
|
@ -372,7 +372,7 @@
|
|||
"name": "Sailor",
|
||||
"edition": "bmr",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 9,
|
||||
"firstNight": 10,
|
||||
"firstNightReminder": "The Sailor points to a living player. Either the Sailor, or the chosen player, is drunk.",
|
||||
"otherNight": 4,
|
||||
"otherNightReminder": "The previously drunk player is no longer drunk. The Sailor points to a living player. Either the Sailor, or the chosen player, is drunk.",
|
||||
|
@ -385,9 +385,9 @@
|
|||
"name": "Chambermaid",
|
||||
"edition": "bmr",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 47,
|
||||
"firstNight": 50,
|
||||
"firstNightReminder": "The Chambermaid points to two players. Show the number signal (0, 1, 2, \u2026) for how many of those players wake tonight for their ability.",
|
||||
"otherNight": 68,
|
||||
"otherNight": 70,
|
||||
"otherNightReminder": "The Chambermaid points to two players. Show the number signal (0, 1, 2, \u2026) for how many of those players wake tonight for their ability.",
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
|
@ -400,7 +400,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 21,
|
||||
"otherNight": 22,
|
||||
"otherNightReminder": "The Exorcist points to a player, different from the previous night. If that player is the Demon: Wake the Demon. Show the Exorcist token. Point to the Exorcist. The Demon does not act tonight.",
|
||||
"reminders": ["Chosen"],
|
||||
"setup": false,
|
||||
|
@ -413,7 +413,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 8,
|
||||
"otherNight": 9,
|
||||
"otherNightReminder": "The previously protected and drunk players lose those markers. The Innkeeper points to two players. Those players are protected. One is drunk.",
|
||||
"reminders": ["Protected",
|
||||
"Drunk"],
|
||||
|
@ -427,7 +427,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 10,
|
||||
"otherNight": 11,
|
||||
"otherNightReminder": "The Gambler points to a player, and a character on their sheet. If incorrect, the Gambler dies.",
|
||||
"reminders": ["Dead"],
|
||||
"setup": false,
|
||||
|
@ -440,7 +440,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 46,
|
||||
"otherNight": 47,
|
||||
"otherNightReminder": "If the Gossip\u2019s public statement was true: Choose a player not protected from dying tonight. That player dies.",
|
||||
"reminders": ["Dead"],
|
||||
"setup": false,
|
||||
|
@ -451,9 +451,9 @@
|
|||
"name": "Courtier",
|
||||
"edition": "bmr",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 17,
|
||||
"firstNight": 19,
|
||||
"firstNightReminder": "The Courtier either shows a 'no' head signal, or points to a character on the sheet. If the Courtier used their ability: If that character is in play, that player is drunk.",
|
||||
"otherNight": 9,
|
||||
"otherNight": 10,
|
||||
"otherNightReminder": "Reduce the remaining number of days the marked player is poisoned. If the Courtier has not yet used their ability: The Courtier either shows a 'no' head signal, or points to a character on the sheet. If the Courtier used their ability: If that character is in play, that player is drunk.",
|
||||
"reminders": ["Drunk 3",
|
||||
"Drunk 2",
|
||||
|
@ -469,7 +469,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 44,
|
||||
"otherNight": 45,
|
||||
"otherNightReminder": "If the Professor has not used their ability: The Professor either shakes their head no, or points to a player. If that player is a Townsfolk, they are now alive.",
|
||||
"reminders": ["Alive",
|
||||
"No ability"],
|
||||
|
@ -535,7 +535,7 @@
|
|||
"team": "outsider",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 47,
|
||||
"otherNight": 48,
|
||||
"otherNightReminder": "The Tinker might die.",
|
||||
"reminders": ["Dead"],
|
||||
"setup": false,
|
||||
|
@ -548,7 +548,7 @@
|
|||
"team": "outsider",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 48,
|
||||
"otherNight": 49,
|
||||
"otherNightReminder": "If the Moonchild used their ability to target a player today: If that player is good, they die.",
|
||||
"reminders": ["Dead"],
|
||||
"setup": false,
|
||||
|
@ -572,9 +572,9 @@
|
|||
"name": "Lunatic",
|
||||
"edition": "bmr",
|
||||
"team": "outsider",
|
||||
"firstNight": 6,
|
||||
"firstNight": 7,
|
||||
"firstNightReminder": "If 7 or more players: Show the Lunatic a number of arbitrary 'Minions', players equal to the number of Minions in play. Show 3 character tokens of arbitrary good characters. If the token received by the Lunatic is a Demon that would wake tonight: Allow the Lunatic to do the Demon actions. Place their 'attack' markers. Wake the Demon. Show the Demon\u2019s real character token. Show them the Lunatic player. If the Lunatic attacked players: Show the real demon each marked player. Remove any Lunatic 'attack' markers.",
|
||||
"otherNight": 20,
|
||||
"otherNight": 21,
|
||||
"otherNightReminder": "Allow the Lunatic to do the actions of the Demon. Place their 'attack' markers. If the Lunatic selected players: Wake the Demon. Show the 'attack' marker, then point to each marked player. Remove any Lunatic 'attack' markers.",
|
||||
"reminders": ["Attack 1",
|
||||
"Attack 2",
|
||||
|
@ -587,9 +587,9 @@
|
|||
"name": "Godfather",
|
||||
"edition": "bmr",
|
||||
"team": "minion",
|
||||
"firstNight": 19,
|
||||
"firstNight": 21,
|
||||
"firstNightReminder": "Show each of the Outsider tokens in play.",
|
||||
"otherNight": 37,
|
||||
"otherNight": 38,
|
||||
"otherNightReminder": "If an Outsider died today: The Godfather points to a player. That player dies.",
|
||||
"reminders": ["Died today",
|
||||
"Dead"],
|
||||
|
@ -601,9 +601,9 @@
|
|||
"name": "Devil's Advocate",
|
||||
"edition": "bmr",
|
||||
"team": "minion",
|
||||
"firstNight": 20,
|
||||
"firstNight": 22,
|
||||
"firstNightReminder": "The Devil\u2019s Advocate points to a living player. That player survives execution tomorrow.",
|
||||
"otherNight": 13,
|
||||
"otherNight": 14,
|
||||
"otherNightReminder": "The Devil\u2019s Advocate points to a living player, different from the previous night. That player survives execution tomorrow.",
|
||||
"reminders": ["Survives execution"],
|
||||
"setup": false,
|
||||
|
@ -616,7 +616,7 @@
|
|||
"team": "minion",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 36,
|
||||
"otherNight": 37,
|
||||
"otherNightReminder": "If the Assassin has not yet used their ability: The Assassin either shows the 'no' head signal, or points to a player. That player dies.",
|
||||
"reminders": ["Dead",
|
||||
"No ability"],
|
||||
|
@ -643,7 +643,7 @@
|
|||
"team": "demon",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 24,
|
||||
"otherNight": 25,
|
||||
"otherNightReminder": "If no-one died during the day: The Zombuul points to a player. That player dies.",
|
||||
"reminders": ["Died today",
|
||||
"Dead"],
|
||||
|
@ -655,9 +655,9 @@
|
|||
"name": "Pukka",
|
||||
"edition": "bmr",
|
||||
"team": "demon",
|
||||
"firstNight": 26,
|
||||
"firstNight": 28,
|
||||
"firstNightReminder": "The Pukka points to a player. That player is poisoned.",
|
||||
"otherNight": 25,
|
||||
"otherNight": 26,
|
||||
"otherNightReminder": "The Pukka points to a player. That player is poisoned. The previously poisoned player dies. ",
|
||||
"reminders": ["Poisoned",
|
||||
"Dead"],
|
||||
|
@ -671,7 +671,7 @@
|
|||
"team": "demon",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 26,
|
||||
"otherNight": 27,
|
||||
"otherNightReminder": "One player that the Shabaloth chose the previous night might be resurrected. The Shabaloth points to two players. Those players die.",
|
||||
"reminders": ["Dead",
|
||||
"Alive"],
|
||||
|
@ -685,7 +685,7 @@
|
|||
"team": "demon",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 27,
|
||||
"otherNight": 28,
|
||||
"otherNightReminder": "If the Po chose no-one the previous night: The Po points to three players. Otherwise: The Po either shows the 'no' head signal , or points to a player. Chosen players die",
|
||||
"reminders": ["Dead",
|
||||
"3 attacks"],
|
||||
|
@ -763,7 +763,7 @@
|
|||
"name": "Clockmaker",
|
||||
"edition": "snv",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 38,
|
||||
"firstNight": 40,
|
||||
"firstNightReminder": "Show the hand signal for the number (1, 2, 3, etc.) of places from Demon to closest Minion.",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
|
@ -776,9 +776,9 @@
|
|||
"name": "Dreamer",
|
||||
"edition": "snv",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 39,
|
||||
"firstNight": 41,
|
||||
"firstNightReminder": "The Dreamer points to a player. Show 1 good and 1 evil character token; one of these is correct.",
|
||||
"otherNight": 56,
|
||||
"otherNight": 57,
|
||||
"otherNightReminder": "The Dreamer points to a player. Show 1 good and 1 evil character token; one of these is correct.",
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
|
@ -789,9 +789,9 @@
|
|||
"name": "Snake Charmer",
|
||||
"edition": "snv",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 18,
|
||||
"firstNight": 20,
|
||||
"firstNightReminder": "The Snake Charmer points to a player. If that player is the Demon: swap the Demon and Snake Charmer character and alignments. Wake each player to inform them of their new role and alignment. The new Snake Charmer is poisoned.",
|
||||
"otherNight": 11,
|
||||
"otherNight": 12,
|
||||
"otherNightReminder": "The Snake Charmer points to a player. If that player is the Demon: swap the Demon and Snake Charmer character and alignments. Wake each player to inform them of their new role and alignment. The new Snake Charmer is poisoned.",
|
||||
"reminders": ["Poisoned"],
|
||||
"setup": false,
|
||||
|
@ -802,9 +802,9 @@
|
|||
"name": "Mathematician",
|
||||
"edition": "snv",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 48,
|
||||
"firstNight": 51,
|
||||
"firstNightReminder": "Show the hand signal for the number (0, 1, 2, etc.) of players whose ability malfunctioned due to other abilities.",
|
||||
"otherNight": 69,
|
||||
"otherNight": 71,
|
||||
"otherNightReminder": "Show the hand signal for the number (0, 1, 2, etc.) of players whose ability malfunctioned due to other abilities.",
|
||||
"reminders": ["Abnormal"],
|
||||
"setup": false,
|
||||
|
@ -817,7 +817,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 57,
|
||||
"otherNight": 58,
|
||||
"otherNightReminder": "Nod 'yes' or shake head 'no' for whether the Demon voted today. Place the 'Demon not voted' marker (remove 'Demon voted', if any).",
|
||||
"reminders": ["Demon voted",
|
||||
"Demon not voted"],
|
||||
|
@ -831,7 +831,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 58,
|
||||
"otherNight": 59,
|
||||
"otherNightReminder": "Nod 'yes' or shake head 'no' for whether a Minion nominated today. Place the 'Minion not nominated' marker (remove 'Minion nominated', if any).",
|
||||
"reminders": ["Minions not nominated",
|
||||
"Minion nominated"],
|
||||
|
@ -845,7 +845,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 59,
|
||||
"otherNight": 60,
|
||||
"otherNightReminder": "Show the hand signal for the number (0, 1, 2, etc.) of dead evil players.",
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
|
@ -869,9 +869,9 @@
|
|||
"name": "Seamstress",
|
||||
"edition": "snv",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 40,
|
||||
"firstNight": 42,
|
||||
"firstNightReminder": "The Seamstress either shows a 'no' head signal, or points to two other players. If the Seamstress chose players , nod 'yes' or shake 'no' for whether they are of same alignment.",
|
||||
"otherNight": 60,
|
||||
"otherNight": 61,
|
||||
"otherNightReminder": "If the Seamstress has not yet used their ability: the Seamstress either shows a 'no' head signal, or points to two other players. If the Seamstress chose players , nod 'yes' or shake 'no' for whether they are of same alignment.",
|
||||
"reminders": ["No ability"],
|
||||
"setup": false,
|
||||
|
@ -911,7 +911,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 61,
|
||||
"otherNight": 62,
|
||||
"otherNightReminder": "If today was the Juggler\u2019s first day: Show the hand signal for the number (0, 1, 2, etc.) of 'Correct' markers. Remove markers.",
|
||||
"reminders": ["Correct"],
|
||||
"setup": false,
|
||||
|
@ -924,7 +924,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 42,
|
||||
"otherNight": 43,
|
||||
"otherNightReminder": "If the Sage was killed by a Demon: Point to two players, one of which is that Demon.",
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
|
@ -950,7 +950,7 @@
|
|||
"team": "outsider",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 40,
|
||||
"otherNight": 41,
|
||||
"otherNightReminder": "Choose a player that is drunk.",
|
||||
"reminders": ["Drunk"],
|
||||
"setup": false,
|
||||
|
@ -963,7 +963,7 @@
|
|||
"team": "outsider",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 39,
|
||||
"otherNight": 40,
|
||||
"otherNightReminder": "If the Barber died today: Wake the Demon. Show the 'This character selected you' card, then Barber token. The Demon either shows a 'no' head signal, or points to 2 players. If they chose players: Swap the character tokens. Wake each player. Show 'You are', then their new character token.",
|
||||
"reminders": ["Haircuts tonight"],
|
||||
"setup": false,
|
||||
|
@ -987,7 +987,7 @@
|
|||
"name": "Evil Twin",
|
||||
"edition": "snv",
|
||||
"team": "minion",
|
||||
"firstNight": 21,
|
||||
"firstNight": 23,
|
||||
"firstNightReminder": "Wake the Evil Twin and their twin. Confirm that they have acknowledged each other. Point to the Evil Twin. Show their Evil Twin token to the twin player. Point to the twin. Show their character token to the Evil Twin player.",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
|
@ -1000,9 +1000,9 @@
|
|||
"name": "Witch",
|
||||
"edition": "snv",
|
||||
"team": "minion",
|
||||
"firstNight": 22,
|
||||
"firstNight": 24,
|
||||
"firstNightReminder": "The Witch points to a player. If that player nominates tomorrow they die immediately.",
|
||||
"otherNight": 14,
|
||||
"otherNight": 15,
|
||||
"otherNightReminder": "If there are 4 or more players alive: The Witch points to a player. If that player nominates tomorrow they die immediately.",
|
||||
"reminders": ["Cursed"],
|
||||
"setup": false,
|
||||
|
@ -1013,9 +1013,9 @@
|
|||
"name": "Cerenovus",
|
||||
"edition": "snv",
|
||||
"team": "minion",
|
||||
"firstNight": 23,
|
||||
"firstNight": 25,
|
||||
"firstNightReminder": "The Cerenovus points to a player, then to a character on their sheet. Wake that player. Show the 'This character selected you' card, then the Cerenovus token. Show the selected character token. If the player is not mad about being that character tomorrow, they can be executed.",
|
||||
"otherNight": 15,
|
||||
"otherNight": 16,
|
||||
"otherNightReminder": "The Cerenovus points to a player, then to a character on their sheet. Wake that player. Show the 'This character selected you' card, then the Cerenovus token. Show the selected character token. If the player is not mad about being that character tomorrow, they can be executed.",
|
||||
"reminders": ["Mad"],
|
||||
"setup": false,
|
||||
|
@ -1028,7 +1028,7 @@
|
|||
"team": "minion",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 16,
|
||||
"otherNight": 17,
|
||||
"otherNightReminder": "The Pit-Hag points to a player and a character on the sheet. If this character is not in play, wake that player and show them the 'You are' card and the relevant character token. If the character is in play, nothing happens.",
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
|
@ -1041,7 +1041,7 @@
|
|||
"team": "demon",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 28,
|
||||
"otherNight": 29,
|
||||
"otherNightReminder": "The Fang Gu points to a player. That player dies. Or, if that player was an Outsider and there are no other Fang Gu in play: The Fang Gu dies instead of the chosen player. The chosen player is now an evil Fang Gu. Wake the new Fang Gu. Show the 'You are' card, then the Fang Gu token. Show the 'You are' card, then the thumb-down 'evil' hand sign.",
|
||||
"reminders": ["Dead",
|
||||
"Once"],
|
||||
|
@ -1055,7 +1055,7 @@
|
|||
"team": "demon",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 31,
|
||||
"otherNight": 32,
|
||||
"otherNightReminder": "The Vigormortis points to a player. That player dies. If a Minion, they keep their ability and one of their Townsfolk neighbours is poisoned.",
|
||||
"reminders": ["Dead",
|
||||
"Has ability",
|
||||
|
@ -1070,7 +1070,7 @@
|
|||
"team": "demon",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 29,
|
||||
"otherNight": 30,
|
||||
"otherNightReminder": "The No Dashii points to a player. That player dies.",
|
||||
"reminders": ["Dead",
|
||||
"Poisoned"],
|
||||
|
@ -1084,7 +1084,7 @@
|
|||
"team": "demon",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 30,
|
||||
"otherNight": 31,
|
||||
"otherNightReminder": "The Vortox points to a player. That player dies.",
|
||||
"reminders": ["Dead"],
|
||||
"setup": false,
|
||||
|
@ -1162,7 +1162,7 @@
|
|||
"name": "Noble",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 41,
|
||||
"firstNight": 43,
|
||||
"firstNightReminder": "Point to 3 players including one evil player, in no particular order.",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
|
@ -1175,9 +1175,9 @@
|
|||
"name": "Bounty Hunter",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 43,
|
||||
"firstNight": 45,
|
||||
"firstNightReminder": "Point to 1 evil player. Wake the townsfolk who is evil and show them the 'You are' card and the thumbs down evil sign.",
|
||||
"otherNight": 64,
|
||||
"otherNight": 65,
|
||||
"otherNightReminder": "If the known evil player has died, point to another evil player. ",
|
||||
"reminders": ["Known"],
|
||||
"setup": true,
|
||||
|
@ -1188,7 +1188,7 @@
|
|||
"name": "Pixie",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 27,
|
||||
"firstNight": 29,
|
||||
"firstNightReminder": "Show the Pixie 1 in-play Townsfolk character token.",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
|
@ -1202,9 +1202,9 @@
|
|||
"name": "General",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 46,
|
||||
"firstNight": 49,
|
||||
"firstNightReminder": "Show the General thumbs up for good winning, thumbs down for evil winning or thumb to the side for neither.",
|
||||
"otherNight": 67,
|
||||
"otherNight": 69,
|
||||
"otherNightReminder": "Show the General thumbs up for good winning, thumbs down for evil winning or thumb to the side for neither.",
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
|
@ -1215,9 +1215,9 @@
|
|||
"name": "Preacher",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 12,
|
||||
"firstNight": 14,
|
||||
"firstNightReminder": "The Preacher chooses a player. If a Minion is chosen, wake the Minion and show the 'This character selected you' card and then the Preacher token.",
|
||||
"otherNight": 6,
|
||||
"otherNight": 7,
|
||||
"otherNightReminder": "The Preacher chooses a player. If a Minion is chosen, wake the Minion and show the 'This character selected you' card and then the Preacher token.",
|
||||
"reminders": ["At a sermon"],
|
||||
"setup": false,
|
||||
|
@ -1228,9 +1228,9 @@
|
|||
"name": "King",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 8,
|
||||
"firstNight": 9,
|
||||
"firstNightReminder": "Wake the Demon, show them the 'This character selected you' card, show the King token and point to the King player.",
|
||||
"otherNight": 63,
|
||||
"otherNight": 64,
|
||||
"otherNightReminder": "If there are more dead than living, show the King a character token of a living player.",
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
|
@ -1241,9 +1241,9 @@
|
|||
"name": "Balloonist",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 42,
|
||||
"firstNight": 44,
|
||||
"firstNightReminder": "Choose a character type. Point to a player whose character is of that type. Place the Balloonist's Seen reminder next to that character.",
|
||||
"otherNight": 62,
|
||||
"otherNight": 63,
|
||||
"otherNightReminder": "Choose a character type that does not yet have a Seen reminder next to a character of that type. Point to a player whose character is of that type, if there are any. Place the Balloonist's Seen reminder next to that character.",
|
||||
"reminders": ["Seen Townsfolk",
|
||||
"Seen Outsider",
|
||||
|
@ -1258,9 +1258,9 @@
|
|||
"name": "Cult Leader",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 44,
|
||||
"firstNight": 47,
|
||||
"firstNightReminder": "If the cult leader changed alignment, show them the thumbs up good signal of the thumbs down evil signal accordingly.",
|
||||
"otherNight": 65,
|
||||
"otherNight": 67,
|
||||
"otherNightReminder": "If the cult leader changed alignment, show them the thumbs up good signal of the thumbs down evil signal accordingly.",
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
|
@ -1273,7 +1273,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 22,
|
||||
"otherNight": 23,
|
||||
"otherNightReminder": "The Lycanthrope points to a living player: if good, they die and no one else can die tonight.",
|
||||
"reminders": ["Dead"],
|
||||
"setup": false,
|
||||
|
@ -1284,7 +1284,7 @@
|
|||
"name": "Amnesiac",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 11,
|
||||
"firstNight": 12,
|
||||
"firstNightReminder": "Decide the Amnesiac's entire ability. If the Amnesiac's ability causes them to wake tonight: Wake the Amnesiac and run their ability.",
|
||||
"otherNight": 5,
|
||||
"otherNightReminder": "If the Amnesiac's ability causes them to wake tonight: Wake the Amnesiac and run their ability.",
|
||||
|
@ -1292,6 +1292,32 @@
|
|||
"setup": false,
|
||||
"ability": "You do not know what your ability is. Each day, privately guess what it is: you learn how accurate you are."
|
||||
},
|
||||
{
|
||||
"id": "nightwatchman",
|
||||
"name": "Nightwatchman",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 46,
|
||||
"firstNightReminder": "The Nightwatchman may point to a player. Wake that player, show the 'This character selected you' card and the Nightwatchman token, then point to the Nightwatchman player.",
|
||||
"otherNight": 66,
|
||||
"otherNightReminder": "The Nightwatchman may point to a player. Wake that player, show the 'This character selected you' card and the Nightwatchman token, then point to the Nightwatchman player.",
|
||||
"reminders": ["No ability"],
|
||||
"setup": false,
|
||||
"ability": "Once per game, at night, choose a player: they learn who you are."
|
||||
},
|
||||
{
|
||||
"id": "engineer",
|
||||
"name": "Engineer",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 13,
|
||||
"firstNightReminder": "The Engineer shows a 'no' head signal, or points to a Demon or points to the relevant number of Minions. If the Engineer chose characters, replace the Demon or Minions with the choices, then wake the relevant players and show them the You are card and the relevant character tokens.",
|
||||
"otherNight": 6,
|
||||
"otherNightReminder": "The Engineer shows a 'no' head signal, or points to a Demon or points to the relevant number of Minions. If the Engineer chose characters, replace the Demon or Minions with the choices, then wake the relevant players and show them the 'You are' card and the relevant character tokens.",
|
||||
"reminders": ["No ability"],
|
||||
"setup": false,
|
||||
"ability": "Once per game, at night, choose which Minions or which Demon is in play."
|
||||
},
|
||||
{
|
||||
"id": "fisherman",
|
||||
"name": "Fisherman",
|
||||
|
@ -1310,14 +1336,28 @@
|
|||
"name": "Huntsman",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 28,
|
||||
"firstNight": 30,
|
||||
"firstNightReminder": "The Huntsman shakes their head 'no' or points to a player. If they point to the Damsel, wake that player, show the 'You are' card and a not-in-play character token.",
|
||||
"otherNight": 50,
|
||||
"otherNight": 51,
|
||||
"otherNightReminder": "The Huntsman shakes their head 'no' or points to a player. If they point to the Damsel, wake that player, show the 'You are' card and a not-in-play character token.",
|
||||
"reminders": ["No ability"],
|
||||
"setup": true,
|
||||
"ability": "Once per game, at night, choose a living player: the Damsel, if chosen, becomes a not-in-play Townsfolk. [+the Damsel]"
|
||||
},
|
||||
{
|
||||
"id": "alchemist",
|
||||
"name": "Alchemist",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 3,
|
||||
"firstNightReminder": "Show the Alchemist a not-in-play Minion token",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
"reminders": [],
|
||||
"remindersGlobal": ["Is the Alchemist"],
|
||||
"setup": false,
|
||||
"ability": "You have a not-in-play Minion ability."
|
||||
},
|
||||
{
|
||||
"id": "farmer",
|
||||
"name": "Farmer",
|
||||
|
@ -1325,7 +1365,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 45,
|
||||
"otherNight": 46,
|
||||
"otherNightReminder": "If a Farmer died tonight, choose another good player and make them the Farmer. Wake this player, show them the 'You are' card and the Farmer character token.",
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
|
@ -1351,7 +1391,7 @@
|
|||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 43,
|
||||
"otherNight": 44,
|
||||
"otherNightReminder": "If the King was killed by the Demon, wake the Choirboy and point to the Demon player.",
|
||||
"reminders": [],
|
||||
"setup": true,
|
||||
|
@ -1362,7 +1402,7 @@
|
|||
"name": "Poppy Grower",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 3,
|
||||
"firstNight": 4,
|
||||
"firstNightReminder": "Do not inform the Demon/Minions who each other are",
|
||||
"otherNight": 3,
|
||||
"otherNightReminder": "If the Poppy Grower has died, show the Minions/Demon who each other are.",
|
||||
|
@ -1370,6 +1410,19 @@
|
|||
"setup": false,
|
||||
"ability": "Minions & Demons do not know each other. If you die, they learn who each other are that night."
|
||||
},
|
||||
{
|
||||
"id": "atheist",
|
||||
"name": "Atheist",
|
||||
"edition": "",
|
||||
"team": "townsfolk",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
"reminders": [],
|
||||
"setup": true,
|
||||
"ability": "The Storyteller can break the game rules & if executed, good wins, even if you are dead. [No evil characters]"
|
||||
},
|
||||
{
|
||||
"id": "cannibal",
|
||||
"name": "Cannibal",
|
||||
|
@ -1389,7 +1442,7 @@
|
|||
"name": "Snitch",
|
||||
"edition": "",
|
||||
"team": "outsider",
|
||||
"firstNight": 5,
|
||||
"firstNight": 6,
|
||||
"firstNightReminder": "After Minion info wake each Minion and show them three not-in-play character tokens. These may be the same or different to each other and the ones shown to the Demon.",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
|
@ -1404,12 +1457,26 @@
|
|||
"team": "outsider",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 38,
|
||||
"otherNight": 39,
|
||||
"otherNightReminder": "If a good living neighbour is drunk or poisoned, the Acrobat player dies.",
|
||||
"reminders": ["Dead"],
|
||||
"setup": false,
|
||||
"ability": "Each night*, if either good living neighbour is drunk or poisoned, you die."
|
||||
},
|
||||
{
|
||||
"id": "puzzlemaster",
|
||||
"name": "Puzzlemaster",
|
||||
"edition": "",
|
||||
"team": "outsider",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
"reminders": ["Drunk",
|
||||
"Guess used"],
|
||||
"setup": false,
|
||||
"ability": "1 player is drunk, even if you die. If you guess (once) who it is, learn the Demon player, but guess wrong & get false info."
|
||||
},
|
||||
{
|
||||
"id": "heretic",
|
||||
"name": "Heretic",
|
||||
|
@ -1428,9 +1495,9 @@
|
|||
"name": "Damsel",
|
||||
"edition": "",
|
||||
"team": "outsider",
|
||||
"firstNight": 29,
|
||||
"firstNight": 31,
|
||||
"firstNightReminder": "Wake all the Minions, show them the 'This character selected you' card and the Damsel token.",
|
||||
"otherNight": 51,
|
||||
"otherNight": 52,
|
||||
"otherNightReminder": "If selected by the Huntsman, wake the Damsel, show 'You are' card and a not-in-play Townsfolk token.",
|
||||
"reminders": ["Guess used"],
|
||||
"setup": false,
|
||||
|
@ -1467,7 +1534,7 @@
|
|||
"name": "Widow",
|
||||
"edition": "",
|
||||
"team": "minion",
|
||||
"firstNight": 16,
|
||||
"firstNight": 18,
|
||||
"firstNightReminder": "Show the Grimoire to the Widow for as long as they need. The Widow points to a player. That player is poisoned. Wake a good player. Show the 'These characters are in play' card, then the Widow character token.",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
|
@ -1481,14 +1548,27 @@
|
|||
"name": "Fearmonger",
|
||||
"edition": "",
|
||||
"team": "minion",
|
||||
"firstNight": 24,
|
||||
"firstNight": 26,
|
||||
"firstNightReminder": "The Fearmonger points to a player. Place the Fear token next to that player and announce that a new player has been selected with the Fearmonger ability.",
|
||||
"otherNight": 17,
|
||||
"otherNight": 18,
|
||||
"otherNightReminder": "The Fearmonger points to a player. If different from the previous night, place the Fear token next to that player and announce that a new player has been selected with the Fearmonger ability.",
|
||||
"reminders": ["Fear"],
|
||||
"setup": false,
|
||||
"ability": "Each night, choose a player. If you nominate & execute them, their team loses. All players know if you choose a new player."
|
||||
},
|
||||
{
|
||||
"id": "psychopath",
|
||||
"name": "Psychopath",
|
||||
"edition": "",
|
||||
"team": "minion",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
"reminders": [],
|
||||
"setup": false,
|
||||
"ability": "Each day, before nominations, you may publicly choose a player: they die. If executed, you only die if you lose roshambo."
|
||||
},
|
||||
{
|
||||
"id": "goblin",
|
||||
"name": "Goblin",
|
||||
|
@ -1503,28 +1583,28 @@
|
|||
"ability": "If you publicly claim to be the Goblin when nominated & are executed that day, your team wins."
|
||||
},
|
||||
{
|
||||
"id": "mezepheles",
|
||||
"name": "Mezepheles",
|
||||
"id": "mephit",
|
||||
"name": "Mephit",
|
||||
"edition": "",
|
||||
"team": "minion",
|
||||
"firstNight": 25,
|
||||
"firstNightReminder": "Show the Mezepheles their secret word.",
|
||||
"otherNight": 18,
|
||||
"otherNightReminder": "Wake the 1st good player that said the Mezepheles' secret word and show them the 'You are' card and the thumbs down evil signal.",
|
||||
"firstNight": 27,
|
||||
"firstNightReminder": "Show the Mephit their secret word.",
|
||||
"otherNight": 19,
|
||||
"otherNightReminder": "Wake the 1st good player that said the Mephit's secret word and show them the 'You are' card and the thumbs down evil signal.",
|
||||
"reminders": ["Turns evil",
|
||||
"No ability"],
|
||||
"setup": false,
|
||||
"ability": "You start knowing a secret word. The 1st good player to say this word becomes evil that night."
|
||||
},
|
||||
{
|
||||
"id": "mephit",
|
||||
"name": "Mephit",
|
||||
"id": "mezepheles",
|
||||
"name": "Mezepheles",
|
||||
"edition": "",
|
||||
"team": "minion",
|
||||
"firstNight": 25,
|
||||
"firstNightReminder": "Show the Mephit their secret word.",
|
||||
"otherNight": 18,
|
||||
"otherNightReminder": "Wake the 1st good player that said the Mephit's secret word and show them the 'You are' card and the thumbs down evil signal.",
|
||||
"firstNight": 27,
|
||||
"firstNightReminder": "Show the Mezepheles their secret word.",
|
||||
"otherNight": 19,
|
||||
"otherNightReminder": "Wake the 1st good player that said the Mezepheles' secret word and show them the 'You are' card and the thumbs down evil signal.",
|
||||
"reminders": ["Turns evil",
|
||||
"No ability"],
|
||||
"setup": false,
|
||||
|
@ -1535,7 +1615,7 @@
|
|||
"name": "Marionette",
|
||||
"edition": "",
|
||||
"team": "minion",
|
||||
"firstNight": 10,
|
||||
"firstNight": 11,
|
||||
"firstNightReminder": "Select one of the good players next to the Demon and place the Is the Marionette reminder token. Wake the Demon and show them the Marionette.",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
|
@ -1562,9 +1642,9 @@
|
|||
"name": "Lil' Monsta",
|
||||
"edition": "",
|
||||
"team": "demon",
|
||||
"firstNight": 14,
|
||||
"firstNight": 16,
|
||||
"firstNightReminder": "Wake all Minions together, allow them to vote by pointing at who they want to babysit Lil' Monsta.",
|
||||
"otherNight": 35,
|
||||
"otherNight": 36,
|
||||
"otherNightReminder": "Wake all Minions together, allow them to vote by pointing at who they want to babysit Lil' Monsta. Choose a player, that player dies.",
|
||||
"reminders": [],
|
||||
"remindersGlobal": ["Is the Demon",
|
||||
|
@ -1577,9 +1657,9 @@
|
|||
"name": "Lleech",
|
||||
"edition": "",
|
||||
"team": "demon",
|
||||
"firstNight": 13,
|
||||
"firstNight": 15,
|
||||
"firstNightReminder": "The Lleech points to a player. Place the Poisoned reminder token.",
|
||||
"otherNight": 34,
|
||||
"otherNight": 35,
|
||||
"otherNightReminder": "The Lleech points to a player. That player dies.",
|
||||
"reminders": ["Dead",
|
||||
"Poisoned"],
|
||||
|
@ -1593,7 +1673,7 @@
|
|||
"team": "demon",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 32,
|
||||
"otherNight": 33,
|
||||
"otherNightReminder": "The Al-Hadikhia chooses 3 players. Announce the first player, wake them to nod yes to live or shake head no to die, kill or resurrect accordingly, then put to sleep and announce the next player. If all 3 are alive after this, all 3 die.",
|
||||
"reminders": ["1", "2", "3",
|
||||
"Chose death",
|
||||
|
@ -1608,7 +1688,7 @@
|
|||
"team": "demon",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 33,
|
||||
"otherNight": 34,
|
||||
"otherNightReminder": "Choose a player, that player dies.",
|
||||
"reminders": ["Dead",
|
||||
"About to die"],
|
||||
|
@ -1620,9 +1700,9 @@
|
|||
"name": "Leviathan",
|
||||
"edition": "",
|
||||
"team": "demon",
|
||||
"firstNight": 50,
|
||||
"firstNight": 53,
|
||||
"firstNightReminder": "Place the Leviathan 'Day 1' marker. Announce 'The Leviathan is in play; this is Day 1.'",
|
||||
"otherNight": 71,
|
||||
"otherNight": 73,
|
||||
"otherNightReminder": "Change the Leviathan Day reminder for the next day.",
|
||||
"reminders": ["Day 1",
|
||||
"Day 2",
|
||||
|
@ -1633,6 +1713,19 @@
|
|||
"setup": false,
|
||||
"ability": "If more than 1 good player is executed, you win. All players know you are in play. After day 5, evil wins."
|
||||
},
|
||||
{
|
||||
"id": "riot",
|
||||
"name": "Riot",
|
||||
"edition": "",
|
||||
"team": "demon",
|
||||
"firstNight": 0,
|
||||
"firstNightReminder": "",
|
||||
"otherNight": 0,
|
||||
"otherNightReminder": "",
|
||||
"reminders": [],
|
||||
"setup": true,
|
||||
"ability": "Nominees die, but may nominate again immediately (on day 3, they must). After day 3, evil wins. [All Minions are Riot]"
|
||||
},
|
||||
{
|
||||
"id": "gangster",
|
||||
"name": "Gangster",
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
class LiveSession {
|
||||
constructor(store) {
|
||||
this._wss = "wss://live.clocktower.online:8080/";
|
||||
//this._wss = "wss://localhost:8081/";
|
||||
// this._wss = "ws://localhost:8081/"; // uncomment if using local server with NODE_ENV=development
|
||||
this._socket = null;
|
||||
this._isSpectator = true;
|
||||
this._gamestate = [];
|
||||
|
|