Blood on the Clocktower Online Steffen Baumgart
winget install --id=ThePandemoniumInstitute.BloodontheClocktowerOnline -e
Blood on the Clocktower Online
Blood on the Clocktower Online is an application designed to enhance gameplay for the popular Blood on the Clocktower party game. It provides a digital interface for managing character roles, tracking game progression, and facilitating special abilities during the session.
Key Features:
- Custom Script Support: Allows users to create and share custom scripts with optional metadata for improved play experience.
- Homebrew Character Creation: Enables players to design their own characters using a JSON schema, supporting features like team assignments, night reminders, and ability activation.
- Special App Features: Includes tools such as pointing mechanics, ghost vote distribution, and signal sending to enhance gameplay.
- Winget Installation: Can be installed via winget for easy setup on Windows systems.
Audience & Benefit: Ideal for game moderators (Storytellers) and players seeking a seamless Blood on the Clocktower experience. The app streamlines character management, reduces setup time, and ensures consistent rule application across different scripts, making it easier to focus on storytelling and player interaction.
README
Blood on the Clocktower App releases
You can find the latest app version downloads here.
If you encounter a bug or want to suggest a new feature, feel free to open a ticket!
Depending on your operating system, you have to select the correct file:
- Windows: Blood.on.the.Clocktower.Online_[version]_x64-setup.exe
- Mac (M1 or newer): Blood.on.the.Clocktower.Online_[version]_aarch64.dmg
- Mac (Intel): Blood.on.the.Clocktower.Online_[version]_x64.dmg
- Linux: Blood.on.the.Clocktower.Online_[version]_amd64.AppImage
> [!WARNING] > The Linux standalone version currently does not support microphone / camera chat. This will be fixed in a future update. > You can check this and this issue for progress.
Custom scripts
Your custom (and homebrew) scripts can be augmented with "meta data" to improve the play experience and make it easier for your players to see what script exactly is being played. In order to do this, just add a meta
entry to your custom script JSON, with the following (optional) properties:
{
"id": "_meta",
"name": "Your Custom Script Name",
"author": "Your Name",
"logo": "https://i.imgur.com/logo.png",
"hideTitle": false,
"background": "https://i.imgur.com/background-image.jpg",
"bootlegger": ["Your custom bootlegger rule"],
"firstNight": ["dusk","minioninfo", "demoninfo","poisoner","...","dawn"],
"otherNight": ["dusk","poisoner","...","dawn"]
}
Homebrew scripts
If you're interested in creating your own "homebrew" scripts or characters, there's a JSON Schema available which will give you an idea about how your JSON should look like, in order to be supported by the app. You can also use this schema to validate your JSON file. Here's an example of how a character might be defined:
{
"id": "widow",
"name": "Widow",
"edition": "experimental",
"image": [
"https://i.imgur.com/widow.png",
"https://i.imgur.com/widow_good.png"
],
"team": "minion",
"firstNight": 22,
"firstNightReminder": "Show the Grimoire for as long as the Widow needs. The Widow chooses a player. :reminder:",
"otherNight": 0,
"otherNightReminder": "",
"reminders": ["Poisoned"],
"remindersGlobal": ["Knows"],
"setup": false,
"ability": "On your 1st night, look at the Grimoire and choose a player: they are poisoned. 1 good player knows a Widow is in play.",
"special": [
{
"name": "grimoire",
"type": "signal",
"time": "night"
}
],
"jinxes": [
{"id": "alchemist", "reason": "The Alchemist can not have the Widow ability."},
{"id": "magician", "reason": "When the Widow sees the Grimoire, the Demon and Magician's character tokens are removed."},
{"id": "poppygrower", "reason": "If the Poppy Grower is in play, the Widow does not see the Grimoire until the Poppy Grower dies."},
{"id": "damsel", "reason": "Only 1 jinxed character can be in play."},
{"id": "heretic", "reason": "Only 1 jinxed character can be in play."}
]
}
Note that most of these properties are optional and in fact a few of them (jinxes
, special
) will very rarely, if ever, be needed for Homebrew content and might be subject to change.
Special App Features
Homebrew characters can use some of the app features through the special
property, which contains an array of each special app feature that this character will use.
Each of these special
features requires a type
and name
property, at the very least. Some of them also need a value
, time
or global
property or any combination of them.
The available special app features are listed below, grouped by their type
.
Type: selection
This type modifies how the character selection process at the beginning of the game works.
- Name:
bag-disabled
: This character can't be selected to go into the bag. (to be distributed to the players) Example: Drunk, Marionette - Name:
bag-duplicate
: This character can be added more than once to the bag. (to be distributed to the players) Example: Legion, Riot
Type: ability
This type allows the Storyteller to activate a special character ability, like returning all ghost vote tokens or allowing players to point at another player.
All abilities can be modified by the time
and global
parameters.
- Name:
pointing
: Starts a "point at a player" type of special vote, which allows some or all players to democratically choose a player. Example: Boomdandy, Fiddler - Name:
ghost-votes
: This ability returns all spent ghost votes to dead players. Example: Ferryman - Name:
distribute-roles
: This ability sends out the currently assigned characters to all players. Example: Gardener
Type: signal
This type allows the Storyteller to send a player special information through the night "wake" interface.
Can be modified by the time
parameter.
- Name:
grimoire
: Send a copy of the Grimoire to the player. The grimoire copy can be modified before being sent. Example: Spy, Widow - Name:
card
: Send a pre-defined custom Storyteller card to a player with this character. Requires avalue
to contain the card text. - Name:
player
: Allows a player with this character to send a pre-defined custom response to the Storyteller. Requires avalue
to contain the response text.
Type: vote
This type modifies how the nomination or vote is being run.
- Name:
hidden
: The vote will be run in secret. (only the Storyteller can see the results) Example: Organ Grinder - Name:
multiplier
: Assigning any reminder token of this character to a player will modify their vote count with a multiplier. Requires avalue
to define the multiplier. Example: Bureaucrat, Thief
Type: reveal
This type modifies what happens when the game ends, right before the character reveal.
- Name:
replace-character
: Assigning the firstremindersGlobal
reminder token (e.g. "Is the Philosopher") to a player will replace their current character with this one when the game ends. Example: Drunk, Philosopher
Optional properties: time
, value
, global
- Property
time
: This property limits when a specific ability or effect can be used. Currently only works onability
andsignal
type of effects. Possible values:- "pregame"
- "day"
- "night"
- "firstNight"
- "firstDay"
- "otherNight"
- "otherDay"
- Property
value
: Can be a Number or String that is used as a parameter for a special ability or effect. - Property
global
: An awkward compromise to allow Lil'Monsta to work when it is not in play. Currently defines what kind of characters have the special ability as long as this character is on the script. I'd probably not use this if I were you, because it might be subject to change if I can think of a better way to make Lil'Monsta work. Can contain any character type value ("townsfolk", "outsider", "minion", "demon", "traveler") or the special value "dead" which allows all dead players to pick.