About the bots
The short version: a bot is a fifth player who knows the rules of the actions it takes, plays a fixed deck it has been taught, and asks you when it cannot see what your card does.
What a bot knows about cards
A bot does not read card text at the table. It plays from a card database (the cardfx library) that describes what each card mechanically does: cost, stealth, intercept, bleed, damage, prevention, income, votes. Today that database holds roughly 2,400 library and 1,800 crypt cards compiled automatically from the printed text, of which about 1,700 library cards have a usable effect and 105 are hand-curated (85 library, 20 crypt) — checked card by card so the bot plays them exactly right. Every master in the four V5 starters is among them: The Labyrinth locks for +1 stealth for a Nosferatu, Guardian Angel sits on the bot's sturdiest ready vampire (+1 intercept against your bleeds, 1 damage prevented each combat, gone when that vampire goes to torpor), Wasserschloss Anif banks blood from a ready Tremere for the next Tremere to come out, and Haven Uncovered goes on an opponent's vampire the bot means to rush — after that any minion, yours included, may enter combat with that vampire as a +1 stealth directed action. The other cards of the six decks in the menu all have a modelled effect, most of them compiled rather than curated.
This shapes three things you will notice:
- Its own deck it plays well. Every card in a bot deck has a modelled effect, so the bot never holds a card it cannot use. A card it genuinely cannot play with its current vampires is treated as dead and cycled in the discard phase.
- Your cards it recognises by their announced effect, not by name. The bot follows the structured lines the client writes when you use the action menu (, , , +X bleed, votes) and the shared counters. For a card play it cannot classify it asks the table one question — “Will this action cause me to lose pool?” — and decides from your answer.
- It is trained continuously. Cards are curated in sweeps, new decks are added with each bot release, and every human-vs-bot report feeds the next round. Until a card is curated the bot may need a nudge: correct its pool, its blood or a lock by hand (see Controls), and it carries on from the corrected state.
How a bot generally behaves
A bot plays a full turn in the rulebook order — unlock, master, minion, influence, discard — and announces each phase like a human saying “unlock” aloud. Between every visible step it takes a short breath (about three seconds at a human table; a phase announcement takes about one) so you can follow what it does. When it acts it asks the table for blocks with a quick phrase and waits; when you act against it, it answers with the same phrases. It counts stealth, intercept, votes and combat on the shared resolver counters and reads the numbers you put there.
Its play is statistical, not scripted: it tracks what each opponent has shown (bleed sizes, stealth, intercept, damage, blocks) and weighs its own hand against that picture. It knows its own deck's composition exactly, so its odds about its own next draws are real. Its picture of your deck starts from the tournament-winning decks archive (TWDA, about 4,700 decks): from your crypt's clan and every library card you have shown, it expects how much combat, stealth, intercept and bounce your deck runs, and sharpens that as you play. Public evidence only — never your hand. Once it is confident, one bot writes once in the log what it reads your deck as (“Viktor (bot) reads Johan's deck as Lawfirm (7 of 8 cards typical).”) — one bot speaks for the table, and it waits until no block, vote or combat is open; that line is explanation, it does not steer the bot's play.
Decks and archetypes
Each bot plays one of six fixed decks. The deck decides not only the cards but the posture — how eagerly it goes forward, how many bodies it keeps home, and what it builds first.
| Menu name | Archetype | How it plays |
| V5 Starter — Malkavian | Stealth-bleed with intel | Dementation/Obfuscate bleed engine, Kindred Spirits chip damage, Revelations hand reads. Goes forward hard on a stealth stack and gambles on card churn. The strongest of the starters — it has won tournaments out of the box. |
| V5 Starter — Ventrue | Vote-and-bleed toolbox | Princes call Kine Resources Contested and Parity Shift on their own titles, Dominate bleeds between referendums, Deflection and Second Tradition at home, Freak Drive to act twice. |
| V5 Starter — Tremere | Bounce-wall with Thaumaturgy reach | Auspex intercept plus Deflection redirect pressure; Theft of Vitae swings blood. A bleed/combat hybrid that nips at both pool and blood. |
| V5 Starter — Nosferatu | Menace attrition | Builds permanents first (intercept, damage enhancers), then Fame and Creeping Sabotage pressure with Animalism rushes to keep threats in torpor. A dangerous combat deck once a fight starts. |
| Weenie Bleed (Trainbot) | Ashur-cycling swarm | Cheap crypt floods the table, small bleeds every turn, Ashur Tablets recycle the engine. Based on a tournament-winning list — noticeably stronger than the starters. |
| Inside Dirt (Nosferatu) | Weenie stealth-bleed | Obfuscate swarm slips small bleeds and Inside Dirt pool damage through every turn; minimal combat. Also tournament-derived and strong. |
For an even table among bots, pair the four V5 starters. Mix in Weenie Bleed or Inside Dirt when you want a harder opponent.
Experience level
Every bot seat has a simulated experience setting. It does not change what the bot knows about cards — it changes how it weighs the same facts.
| Level | Character | In practice |
| Expert (default) | Full grasp of the table and its own deck | Plays the decision basis correctly: reads opponents' statistics, blocks with any body when the odds say so, aggressive bleeds, disciplined stealth and bounce timing. The reference the other two are graded against, and the level every test series runs on. |
| Experienced | Knows its deck, tunnel vision on the table | Normal aggression, blocks readily but only spends a “chump” body on a bare block, half the insight into what you are likely holding. |
| Novice | Focused on itself | Hesitant to block, rarely attempts a block without an intercept card, barely reads your hand, slightly over-eager going forward. Makes characteristic beginner mistakes. |
Adjusting a bot by hand
A bot owns its own state — pool, Edge, blood on its vampires, locks, torpor — and publishes it to the table. Because it cannot model every triggered ability (an untap-phase ping from one of your permanents, a diablerie, a referendum it miscounted), any player may adjust a bot's elements from the right-click menus. The bot takes the correction as truth and plays on. The full list is under Adjusting a bot's board.
Bots are pre-alpha. They can misjudge a situation, and a few interactions are still one-sided (listed honestly at the end of each section below). Pause a bot with ❗ Hold on… whenever you need to think or play a card in its phase, and use Report a problem in the menu when something looks wrong — those reports are what the bots are trained on next.
Setting up a table
Offline hotseat is the fastest way to play against bots: one screen, you and up to five bots, no server round-trips. Online, the host adds bots from the lobby and they sit at the table like any other player.
Before you start. Bots need Full mode (Lite is online-only and bot-free) and a Structured board. On elysium.cards the bot files are served with the client — nothing to install. If you run the client from your own machine or server, four files sit in the same folder as elysium-vtes-bord.html: elysium-bot.js (v0.6.147 or newer), elysium-cardfx.json, elysium-twd-profile.json and elysium-twd-archetypes.json. Opened as a local file, the client reads the .js twin of each data file instead (elysium-cardfx.js, elysium-twd-profile.js, elysium-twd-archetypes.js) — keep those beside it too. Without the two TWD files the bots simply play without reading decks. A missing or too-old bot file is refused with a message that says exactly what is wrong.
Offline / hotseat
- Open Play offline. The hotseat window lists the seats in turn order. Seat 1 is “You” with your saved decks in the dropdown; more seats come from (up to six).
- Make a seat a bot. Press the button on the seat's row. It cycles Expert → Experienced → Novice → off, so the first press gives you the default level. The row's deck dropdown switches to the six bot decks, and an alpha tag appears beside the seat. Any seat can be a bot, including seat 1 — turn order is simply the seat order.
- Pick its deck from the dropdown. The name field is the bot's table name; it introduces itself with it and answers to it in chat.
- Check the locks. The moment any seat is a bot, Board style is fixed to Structured and Helpers to “All helpers on”, greyed out. Bots are tuned for that environment; both are released again when the last bot is removed.
- Decide on Debug bot (optional, see below).
- Start hotseat. The bot files load, each bot joins its seat and uploads its deck, and the table deals. At least one seat must be human — an all-bot table is a simulation, not a hotseat. If a bot fails to load you get a dialog naming the reason; the table itself is unaffected.
The opening and the turn cycle — who plays when
Bots take their turns automatically. When you end your turn (your Discard, or the Pass handover), every bot between you and the next human plays in seat order: a toast says “🤖 Name is playing…”, the camera visits its board while it acts, and moves on when it passes. If bots sit before the first human, they play their opening turns right after the deal, and then your first turn begins with the usual cue.
While a bot plays you keep priority: play reactions, block, put cards on the counters, or say ❗ Hold on… to stop it while you think. Its turn ends when it says “passes”.
If you ever need to run the bot turns by hand — after resolving something manually, say — open the Bot Activity panel (the 🤖 badge top right) and press . It plays exactly the range the Pass handover would.
A bot that stays silent for three minutes while it holds the turn (waiting on a combat you resolve by hand, for instance) is not skipped automatically — the table asks you: “Pass the turn for it? (Cancel = keep waiting.)”. The same exit is on the bot's seat menu as .
Debug bot — see what it is thinking
Tick Debug bot in the setup window and every bot at the table plays with an open hand to the whole table, its uncontrolled crypt face up, and writes its decision weighting to the log (“master-play: … why”). It announces in chat that it is in debug mode, so nobody is misled. Use it to judge how the bot plays a deck; never in a real game, and it is refused outright in Tournament mode. The setting is read when the bot is added: tick Debug bot before you add the bot (offline: before Start); to change it, remove the bot and add it again. To look: right-click the bot's pool globe → , and for its discards (see the seat menu below). In Structured, the eye in the corner of a bot's pool zone opens its hand (Debug) and its ash heap (client v2.6.160+; it is lit while the hand is open to you). Every human at the table sees the hand, players and spectators alike; the other bots look away from it (bot v0.6.201) and learn its cards only the way you would, through a Revelations of their own. Its face-up crypt is on the table for everyone. A bot started from the command line takes --debug (and --no-debug-weights for the hand without the log lines), and refuses debug by itself at a Tournament table.
Ending or restarting — nothing lingers
Leaving the hotseat closes every bot: their timers, holds and state are torn down together with the 🤖 panel. A new game never inherits old bots. Saved matches store the human boards; bots are re-created from the seat setup when you start again.
Online
Online, bots are added by the host, in the lobby, in a room created as Structured. The bots live in the host's browser tab and connect to the room on their own sockets — to the server and to everyone else they are ordinary remote players.
- Create the room as Structured (Board style). Board style is fixed at creation; a Classic room cannot host bots and the button says so.
- In the lobby, find the Bots row: a name (a free name is suggested), a deck dropdown, an experience dropdown, and . Add up to the table limit of six seats; a seat picker per bot lets the host place it.
- Helpers lock on. Adding the first bot switches the room's helper policy to “All helpers on” for everyone and shows it in the lobby banner; removing the last bot restores what the room had before.
- Remove a bot with the ✕ on its lobby row — it leaves the seat itself. Debug bot works as offline (tick it before Add bot) and is refused in Tournament rooms. With client v2.6.158 or earlier the box could be greyed with a Tournament tooltip in a room that is not one (the client read the Play offline setting there): reload the page and add the bot before opening Play offline. Client v2.6.159 reads the room’s own setting.
- Start. From here the server drives everything: the bots take their turns when the turn reaches them, the referee menus (pool, oust, pass) and the card controls reach the bot through the server, and every seated player sees the 🤖 Bot Activity badge and its tempo gear. Only the host's tab holds the bots, so only the host's ▶ buttons can step them; everyone else answers with a quick phrase, a line or the menu.
If the host's connection blinks, a bot reconnects to its seat by token just as a human does. If the host closes the tab, the bots go with it.
Offline and online compared — same bot, one difference that matters
The bot's decision code is identical in both modes, and every quick phrase, counter, hold and chat command below works the same way. What differs is the transport: online the server relays everything; offline a bridge inside the client plays the server's role. Since bot v0.6.147 and client v2.6.124 the bridge relays counters, ousts and card hand-overs, so block exchanges, bounties and Fame/Pentex on a bot behave alike.
The right-click controls on a bot's board — the seat menu and the card menu, Burn included — reach the bot in both modes; at a hotseat the bridge carries them the way the server does online.
How a bot plays
A bot's turn looks like a careful human's: it names each phase, announces every action on the shared counters, asks for blocks and reactions, and waits for the table before it moves on. This section walks through a turn, then how it answers your actions, and finally what it weighs when it decides.
Its own turn, phase by phase
Unlock — and the triggers that ride on it
The bot unlocks its cards, announces the phase, and resolves its own unlock-phase permanents (a Smiling Jack it owns ticks here, its Blood Doll / Vessel income moves blood, a Fame it holds is checked). It pays a Smiling Jack's counters (yours too) with pool and its vampires' blood, never its last pool while blood can pay; when its unlock costs its last pool (its own Jack, a Fame) it is ousted there and its turn ends. Any other permanent of yours that affects the bot at its unlock it cannot see — apply the effect from the right-click menu on its board.
Master — one master a turn, trifles counted
It plays at most one master card per master phase (plus a trifle's extra action, plus anything a Parthenon-class card grants), paying pool up front and writing the payment to the log so it can be audited. Persistent masters attach to a vampire or go on the table; one-shots resolve straight to the ash heap. Fame is placed on the vampire it intends to rush, and so is Haven Uncovered — only when one of its ready vampires has a rush target that turn, otherwise it keeps the card; Guardian Angel goes on its sturdiest ready vampire; Pentex Subversion and Misdirection pick the most useful unlocked target on its prey's board. A master that is not hand-curated is played with a note: “(uncurated — adjust if needed)” — the bot may not know what that card does.
Minion — actions, one bleed and one political action per vampire
Every ready, unlocked vampire acts once. A vampire at 0 blood hunts first, as the rules require. The action itself is chosen by the deck's strategy (build permanents first, bleed, call a referendum, rush, hunt, recruit, equip, rescue) and follows this protocol against a human target:
- Announce. The action card's clone animates, the frozen log line is written (“Colette bleeds for 2.”), and the Block counter opens with the bot's announced stealth on its side — the card's built-in stealth plus any permanent stealth of the vampire.
- Ask. Name: Colette plays Govern the Unaligned — bleeds You for 2 (+1 stealth). Block? The window waits up to 20 s for your answer. After 7 s of silence it rings the room's Reaction stopwatch; once the stopwatch has run out it gives you two more seconds and then treats silence as “no block”.
- Your block. Say Block! and right-click the blocking minion → (or do the right-click first — either order works). If only the shout arrives the bot asks “Who blocks?” after 2.5 s. Now the contest runs on the counter: play your card, then put its value on your side (the +/− steps, or just type the number in chat — see the chat grammar). Playing a card books nothing on the counter by itself; the bot reads the counter and the numbers in chat. The bot compares the real numbers, waits a beat, and answers with its own stealth card if it needs one and has one — telling you when it is already ahead: Name: Colette currently has 2 stealth — play your intercept, or resolve the block. It never spends a stealth card it does not need.
- Verdict. When you stop adding intercept (say Pass or No block, press the counter's Resolve, or let the clock run) the bot declares the outcome from the counter: “Block: Stealth 2 vs Intercept 1 — block fails.” A successful block goes to combat (below). Cancelling a block with the counter's ✕ reopens the window fresh.
- Modifiers. After blocks are declined the bot may pump the bleed (Conditioning, Leverage): each modifier is a new log line and a new question — Name: Colette adds +2 bleed — now 4 on You. Any reaction? This window takes reactions only (a bounce or reduction); the rules do not reopen blocks. Answer No reaction or Pass to let it through, Yes or ❗ Hold on… to say “wait, I am reacting” and play your Deflection.
- Resolve. It resolves, then a log line: “The bleed goes through: You, −4 pool (adjust yours).” Adjust your own pool: the line tells the table what you took. The client never changes your pool, blood or Edge for you — you manage your own values, the bots manage theirs. A successful bleed (1 pool or more) gives the bot the Edge; your client clears your own Edge when the bot takes it (online, and at an offline table from client v2.6.159). A bleed you reduce to 0 is said as such — “The bleed goes through at 0” — and moves no Edge. The bot knows the reduction cards it plays itself; for any other, tell it the amount after your card with your vampire’s (client v2.6.159+; it writes “Lisa reduces the bleed by 1.”), and the bot bleeds for the rest. At a hotseat the camera shows the acting bot’s board while it acts: press first to reach your vampire — a ❗ Hold on… gives you the time. With an older client the bot’s line states the full amount: adjust your own pool by what actually landed.
Undirected actions (hunt, equip, recruit, a political action, rescue from torpor) are announced the same way and both the bot's prey and predator are asked; the window closes when both have declined. A political action is announced with a machine-readable terms line before the frozen action line, so a bot voter at the table can weigh it.
Influence — tempo versus transfers
It respects the opening transfer stagger (1, 2, 3, 4 transfers over the table's first four turns) and moves blood to the uncontrolled vampire it wants out next, judged on tempo and how well that vampire fits the deck (disciplines, title, capacity) rather than simply cheapest first. It never influences below its critical pool — a level it raises when its predator has shown big bleeds or high stealth. An influenced vampire stays hidden until it enters play.
Discard — dead cards first, then surplus stealth
One discard per phase (more with a Barrens-class card): a card none of its ready vampires can use goes first, then a duplicate, then a glut — more stealth cards in hand than one action could ever spend. Then it passes, and the log says so.
When you act against it
Your bleed or vote — how it decides to block or react
Announce with the action menu: right-click your minion → → , , , , , . The frozen line the client writes is what the bot reads, so the amount and the target must be on that line. Set the target first with / whenever the action is aimed at anyone but your prey: a directed action with no target on its line is read as aimed at your prey, and only the target of a directed action may block it.
The bot then weighs the block: what the action costs it in pool, how likely the block is to succeed (your announced stealth against the intercept it can raise — cards in hand, permanents, a wake for a locked body), what a fight against that vampire would cost (a vampire with no blood lets a small bleed through rather than go to torpor; against a hard-hitting deck a weak blocker stays back), and what it loses by locking a blocker it may want later. It says ❗ Hold on… while it decides, then either No block or Block! with the frozen line “Anarch Convert attempts to block.”, its wake and intercept cards played onto the counter one beat apart. If you add stealth it looks again at the real counter and answers with more intercept when it has it — several cards at once when several are needed. Then it is your move, and the bot says so: Name: Anarch Convert blocks (stealth 0 vs intercept 1) — Anna, add stealth, or say Pass to resolve it (3s → the block succeeds). Add stealth (play the card, then type the number in chat or put it on the counter — the clock starts again), or say Pass, or press the counter's Resolve. On its clock (or the panel's ▶) the bot declares the verdict from the counter: a fight when the block succeeds; when it fails, your action goes on. It resolves declares it too, and when the block fails your action lands at once. In Turn-based it waits for you, with a reminder.
Bouncing. A bot with a Deflection does not bounce at the announce. Following table custom it lets you pump first: after No block it waits for your modifiers () and bounces on the total once you say It resolves — or, if you play no modifier, about four seconds after your decline. It rarely bounces a bleed of 1 while it holds another bounce for something heavier, and against a known stealth bleeder it may deliberately let small bleeds through to clog your hand. When a bounce sends a bot's bleed to you, you may block it — the bounce cards say so, and the acting bot asks you (“… now bleeds You for 3 — You may block it”); every other Block! in that window is still refused. After a bot rushes your vampire with Deep Song, your vampire is the acting minion of that combat: the bot asks you first in every step.
Your action it cannot read — a card the client logs only as “plays X” — gets this exchange when you prompt Any blocks?:
Name: Will this action cause me to lose pool? (Yes / No)
Name: How much?
Answer with the quick phrases Yes / No or type yes, no, then a number. Silence within 20 s counts as “no”; a “yes” with no number counts as 1 pool. The answer lives only for that action and is applied when you say It resolves. A from the menu opens this question by itself, no prompt needed.
Rushing a bot's vampire — set the target, play the card, type rush
A rush card of yours (Bum's Rush, Harass and friends) is not yet in the bot's curated set, so the card alone tells it nothing. The table's interim rule, until the rush cards are swept into the database:
- Set the target. Right-click the bot's vampire → .
- Play your rush card from hand (or use on your vampire). The client's line carries the aim: “Lisa plays Bum's Rush. Target: Name's Colette.”
- Type
rush in chat. The bot reads the aimed line and treats it exactly like a Deep Song rush: if it has another unlocked minion or a wake it may try to block first (the rulebook allows the owner to block a rush) and asks the usual way; otherwise — or after it passes — Colette locks, and combat begins on the counters with Lisa as the opponent.
If the aim did not reach it (you forgot the target, or several plays went by), name the vampire: rush Colette — a unique prefix is enough. With several bots at the table a bare rush without an aimed line goes to the bot that is your prey; @Name rush Colette reaches any of them. The bot never rushes by chat itself — its own rushes come with the frozen Deep Song or Haven Uncovered line.
Combat — one round at a time, on the counters
When a block succeeds either way, the bot fights by its cards: maneuvers, presses, strikes with weapons or hand strikes, Carrion Crows, Immortal Grapple, dodges, Majesty-class combat-ends, prevention (Hidden Strength pays X to prevent the whole hit). A combat-ends card is played when the strike it faces is worth the card: what you announced, when you strike first, or what your deck is expected to hit for (from what it has shown and the TWDA). A hand strike for 1 is not worth a Majesty; a strike that would send its vampire to torpor, or aggravated damage, always is. A dodge follows the same idea with the bot's own strike as the yardstick. With one dodge in hand it dodges a strike of 2 or more that would do more to it than its own strike would do to you (a steal counts); with two it spares one even against a strike for 1, as long as yours does at least as much as its own. It always dodges aggravated damage or a strike that would empty or torpor its vampire. Otherwise it keeps the dodge and strikes when its own strike would put your vampire into torpor (with two dodges in hand, also when it would empty it). When it strikes first it reads your expected strike instead. A wave deck (the Malkavian) maneuvers to long only when your expected strike could put its vampire in torpor, or when one maneuver ends a dangerous fight because you show no way to press; otherwise it keeps Swallowed by the Night for its stealth. Each play is a log line and a clone; at the end of a round, fighting you, it writes the round to the log: “Name combat — Lisa strikes with .44 Magnum for 2; Anarch Convert takes 2 (loses 2 blood, now 1).” (between two bots it is a chat line, as before).
Fighting a bot yourself — the vampire's menu. Right-click your fighting vampire and use (Hand, Hand for N…, Weapon or card…, Steal blood…, Dodge…, Combat ends…), (to long / to close, or Set range for Immortal Grapple- or Sniper Rifle-class cards) and (continue / end). Each writes one log line the bot reads, and with the combat helper on it also moves the shared combat counter. The bot writes its own strike's damage onto its side of that counter, so your Damage step shows what is coming at you.
Blocks by chat. When a bot blocks your action, type your stealth in chat: a number is your total stealth (2), +1 adds to it. When you block a bot's action, type your intercept the same way. The bot books it on the block counter and answers with its own card if it needs one — it never plays stealth or intercept that is not needed.
The bot walks the combat steps with you. Fighting your vampire, a bot talks through the rulebook's steps. When you act it asks — “Anything before range?”, “Any maneuvers?”, “Anything before strikes?”, “What is your strike?”, “Any presses?”, “Anything before ending combat?” — and when it acts it says what it does, or “I have nothing before range.” and so on. Answer with the menu, or say No / Pass (or type no, pass, go on) to move on; stepping the combat helper forward works too. If you say nothing, a short clock moves the step along.
Two bots fighting each other walk the same steps in the rulebook's order. In the maneuver, before-strikes and press steps the acting bot speaks first — its card, or a log line such as “Lisa does not maneuver.”, “Lisa has nothing before strikes.”, “Lisa does not press.” — and the other bot answers knowing it: an Immortal Grapple or a maneuver to long reaches the other bot before it chooses its strike, and a press to continue is answered with a press to end or a “does not press”. The strike step too: the acting bot strikes first, and the other chooses knowing that strike — it does not throw a strike card into a dodge, and it dodges a blow that would empty or torpor its vampire. When a human sits at the table, each of those lines comes after a short beat, so you can follow the fight; ❗ Hold on… stops it.
What you took. With the combat helper on, your client writes “Name takes N (loses P blood, now M).” for you when the table steps past Damage resolution. The line is a report to the table: it does not change your card, so take the blood off your vampire yourself (and add any blood your vampire stole). On a Classic table (helper off) use — that is how the bot learns what your vampire took. If you say nothing, the bot falls back to the rulebook: 1 hand damage at close range, 0 at long range unless your vampire shows a ranged option.
Steals. When a bot steals blood from your vampire (Theft of Vitae), it takes the blood on its side; lower your vampire's blood yourself — the helper never touches the board.
Politics — calling and voting
A bot with a title calls referendums when it holds the votes: Kine Resources Contested and Parity Shift against its prey, or a bloat when that pays more. It announces the terms, opens the Vote counter and casts its own votes there; you cast yours with or the counter's +/−. ❗ Hold on… buys thinking time; Pass or No means “no votes from me” (typing abstain does the same); pressing It resolves or the counter's Resolve ends the poll and the bot announces the result at once. When its referendum moves its own pool it says so, as any voter does: Name: I gain 3 pool from the referendum. Pool: 23.
As a voter the bot is deliberately simple for now: it votes against a referendum that costs it pool or that helps its prey more than itself, for one that helps it more, and abstains otherwise. No bargaining, no vote-trading, no table diplomacy yet.
What it weighs
Every decision passes through one weighing seam with the experience level as the final filter. The main inputs:
- Its own deck, exactly. Composition is known, so “chance of drawing a stealth card on the replacement draw” is a real number, and it counts wakes, bounces and stealth cards left in the library.
- Your statistics. Per opponent it records offensive actions, average and maximum pool damage per action, stealth shown, intercept shown, blocks attempted, damage dealt in combat, and classifies your actions as offensive, economy or utility. From that it forecasts how many turns it has left against its predator (the oust range raises every risk weight) and how far its prey is from being ousted.
- Posture. A stealth-bleed deck goes forward on a stack of two or more stealth cards; when it has more vampires ready than you have blockers up, it probes with chump bleeds and keeps the big Govern for the last one; a wall deck prices keeping a blocker home; a rush deck goes for the famed or most threatening vampire; a grinder keeps its design home quota.
- The critical pool. A floor (6 by default) that rises with your shown burst damage; below it the bot stops influencing, drains a Blood Doll to pool, and plays Freak Drive as a survival unlock.
It plays by the rules throughout: action costs are paid so that the action can be completed, one bleed and one political action per vampire per turn, never the same named card twice in a turn, votes only with titles, blocks only by prey and predator on undirected actions, the Edge burned as cost is not refunded on a block.
Where its understanding ends
Revelations against a bot. Play it with the bot as your prey (whatever your target says, the card goes to your prey). At inferior the bot reveals its hand to you privately and asks you to pick: the card in what it revealed, or type discard CARD; it discards that card and draws. At superior it plays with an open hand until the card leaves play.
Haven Uncovered on your vampire. When a bot puts it there, the log says so (“Hanna plays Haven Uncovered — on Lisa's Colette.”); any minion may then enter combat with Colette. A bot's rush through it reads “Ryan enters combat with Lisa's Colette (Haven Uncovered).” and asks Block? as usual; Colette does not lock, and the rushing vampire is the acting minion. The bot does not read a Haven Uncovered that you play, and your own rush through one on a bot's vampire goes by rush in chat like a rush card — the bot then locks its vampire as it would for a rush card, which a Haven rush does not do: unlock it by hand.
Cards outside the curated set. Your uncurated card is a “plays X” line to the bot; it will ask about pool loss and otherwise let it be. Effects on the bot's board that come from your permanents must be applied by hand.
Rush cards. Only Deep Song is tagged as a rush in the database today, so your rush needs the target + rush in chat (above) until the rush cards are swept in.
Combat against a human. The bot reads your strikes, maneuvers and presses from the menu lines; anything you do not announce falls back to the rulebook default. Additional strikes are shown in the log but not yet resolved by the bot.
Politics is minimal. Straight for/against by self-interest; no deals.
Deck reading is young. The bot reads your deck from your crypt's clan and the cards you have shown, against the TWDA (see About the bots). Today that expectation shapes its combat choices (how hard it expects you to hit, whether you can press) and its blocks (whether the fight a block buys is worth the bleed it stops); its own bounce timing and the archetype labels themselves do not lean on it yet. A casual deck that looks like no tournament deck simply gets the clan's average.
Diablerie. A bot never diablerises. If you diablerise a bot's torpored vampire, remove it with on its card menu; you run your own blood-hunt referendum as usual — the bot does not call one.
Un-oust. “Return them to the game” on an ousted bot puts the seat back on the table but the bot itself stays ousted — a rare case, noted as an open trade-off.
Controls
Everything the bot listens to, in one place: the quick phrases, the chat commands, the counters, the action menu lines it reads, the seat and card menus that adjust its board, and the Bot Activity panel.
Quick phrases
The ten phrases on the quick-phrase bar are the fast path. The bot uses the same ten, so a table of humans and bots speaks one language.
| Phrase | What the bot does with it |
| ❗ Hold on… | Pauses every bot at its next visible step until someone releases it (It resolves, Pass, No block — or Release hold in the Bot Activity panel, which frees only the bot on that row). Every clock a bot runs on you stops: the block and reaction questions, its pool question, its vote poll, each combat step, the damage step and its wait for your move after it blocks you. Each starts again from the beginning when the hold is released, and an answer still counts at once. A bot in a combat also stops its own moves — the next step's question, its strike, its press — until the release, in a fight with you or with another bot. A bot waiting inside its block question, a combat step or its vote poll says so: “Holding for Anna — say ‘It resolves’ when ready.” That line goes out ahead of anything the bot has queued, and a hold or a resume the table has already moved past is not said at all. Every 90 s it reminds the table: “Still holding for Anna.” Use it to play a card in a bot's phase, to think, or to sort something out by hand. During a bot's political action it also keeps its vote poll open. If you leave the table while holding, the hold is released. |
| No block | Declines the block only on the bot's action. After it, the bot may still pump the bleed and asks for reactions. Also releases a hold. |
| Block! | You attempt to block the bot's action. Follow with right-click your minion → so it knows which vampire (it asks “Who blocks?” after 2.5 s otherwise), then play intercept onto the counter or type the number. Also releases a hold. |
| No reaction | Declines everything on the bot's action: no block, no bounce, no reduction. Closes the window at once. Also releases a hold. |
| It resolves | Says the table has moved on. Ends the bot's current action window, ends its vote poll (it announces the result), releases any hold, and — when it is your action — tells the bot to apply your resolved bleed or damage to its pool. While a bot's block on your action is open it first declares the verdict from the counter; when the block fails, your action lands at once. |
| Yes | Answers the bot's pool question (“Will this action cause me to lose pool?”). On a reactions-only question (“Any reaction?” after a bleed total) it means “wait, I am reacting” — the bot holds until you play and say It resolves or No reaction. |
| No | Answers the pool question with “no”. On a reactions-only question it closes the window at once. |
| Pass | “Nothing more from me.” Declines a block, ends your intercept adds in a live contest — or your stealth adds when a bot blocks you — (the bot then declares the verdict from the counter), and means “no votes from me” during a bot's referendum. Also releases a hold. |
| Any blocks? | Prompts the bot about your action. If it can read the action it answers with its block decision; if it cannot, it asks the pool question. |
| Any reaction? | Same prompt after blocks are declined — invites its bounce or reduction. |
Silence is never fatal: a bot's own question defaults to “no block” after its clock, and the Bot Activity panel lets you close any window early. How long that clock is, is the table's choice — see the tempo below.
The tempo — how long the bots wait for you
Every wait a bot makes on a human — the block question, the reaction question, its pool question, its vote poll, each of the combat steps, and its wait for your move after it blocks you — runs on one tempo the table sets with the gear on the 🤖 badge (client v2.6.139+; any seated player may change it, and the log says so: “Anna set bot tempo: Adaptive, 3 s.”). A change applies to every bot at the table at once, mid-wait included. Every table with bots starts at Standard, 3 s. Each clock starts when its question appears in the chat, so the number in the question is the time you have. (A bot that never hears a tempo — an older client — waits as bots always did: 20 s for a block, up to 60 s for a combat step. A terminal-launched table can set one with the launcher's --tempo standard:3.)
| Tempo | What the bot does |
| Standard | The slider (1–8 s, default 3 s) is the clock for every question; in combat the maneuver, strike and press steps get twice it, the “Anything before …?” steps once. The damage step asks nothing — it is your moment to play a prevention card — and lasts one slider (❗ Hold on stops it while you look); when the bot's strike dealt your vampire nothing (you dodged, it stole blood, fists at long range) there is nothing to prevent and it goes straight on, in every tempo. Your activity restarts the clock, and Pass / No / a card line still end a wait at once. |
| Adaptive | The slider is the ceiling. The bot measures how fast you actually answer (a running median over your last answers) and waits about one and a half times that — never under 0.8 s, never over the ceiling. It also skips a question you cannot act on: no block question while you have no minion that could block (none up, or every one locked with an empty hand), no “anything before …?” in combat with an empty hand. Your strike and your press are always asked — a press is a decision, not a capability. |
| Turn-based | No clock. The question says “(no clock — I wait for you)” and the bot stands still until you answer — a quick phrase, a line, or the beside the 🤖, which in this mode means “give the bot the word” (it works in the tab that holds the bots: the host's online, the shared screen offline). Safety net: a reminder in chat after two minutes, and after four the wait resolves as a pass, so an abandoned table never hangs. A Hold on stops both; the hold shows on every seat's badge and anyone can release it. |
Bots waiting on each other keep their own short windows in every tempo — the tempo governs only waits on humans. Each wait is written to the bot's log as a wait row (what, which tempo, how long, how it ended), so a session can be measured with ana-wait.py.
Chat commands
Chat is the fallback and the correction channel. A bot reads every line; a bare command reaches the bot it naturally concerns, and @Name … aims one at a specific bot when several sit at the table. Type help and the bot lists what it understands.
| You type | When | Effect |
bleed 3 | Your bleed landed on the bot but the normal flow did not resolve it (a block that was announced and never resolved, a turn that ended with it open, a manual bleed) | The bot takes 3 pool from its own total and confirms: “I take 3. Pool: 9.” A bare bleed N is read only by the bot that is your prey; use @Name bleed 3 for a bounced bleed or a non-prey target. |
vote 2 | Political pool damage that did not reach the bot through the counters | As above, with “vote” — @Name vote 2 to aim it. |
block · no | While the bot is asking “Block?” | Typed forms of Block! and No block (nej, through and pass also count as no). |
2 · +1 | While you are blocking the bot's action | A bare number is your total intercept right now (Sport Bike + Bowl of Convergence = 2); +N adds to what is already on the counter. The bot books it on the shared counter for you — “Anna has 2 intercept (booked on the counter).” — and judges at once. Only from the blocker (or @Name 2); outside a contest a bare number means nothing. |
rush · rush Colette | After you played a rush card with the bot's vampire as Target | The bot resolves your rush: block window if it can block, else the named vampire locks and fights. rush <name> names the vampire when the aim did not reach it; @Name rush … aims at one bot. See Rushing a bot's vampire. |
yes · no · 4 | While the bot's pool question is open | Typed answers to “Will this action cause me to lose pool?” and “How much?” (ja/nej, y/n work too). |
hold on | Any time | Typed ❗ Hold on…. |
carry on · resume · it resolves | While a hold is on | Releases the hold. Any human's release clears every hold at the table (at a hotseat, one screen holds for several names). |
any blocks? · any reaction? | Your action | Typed prompts, same as the quick phrases. |
abstain · no votes from me | During a bot's referendum | Counts you as heard; the poll closes once everyone has spoken or the counter is resolved. |
help | Any time | The bot answers with its version and the commands above. With several bots only the lowest-seated one answers a bare help; @Name help reaches that bot. |
Anything else in chat is table talk to the bot — it ignores it.
The counters
The shared resolver counters — Block, Vote, Combat — are how numbers travel between you and the bot. The bot writes only its own side and reads yours, so the two of you never overwrite each other.
- Block: stealth on the actor's side, intercept on the blocker's. The bot opens it with its stealth when it acts and adds its intercept when it blocks. Every change you make is read immediately; the ✕ (clear) during a contest against the bot is read as “block withdrawn” and reopens its window; Resolve closes the contest.
- Vote: for and against. The bot casts here when it calls or votes; your +/− steps and the menu are both read. Resolve ends a bot's poll.
- Combat: damage dealt each way per round. The bot announces its strikes as log lines and narrates the round; use the counter to show your damage so the table agrees.
Action-menu lines the bot reads
These right-click actions on your minion write the frozen lines a bot understands. Announcing an action in free chat instead does not reach it.
| Menu item | Line written | The bot… |
| Actions → Bleed 1 / 2 / 3 / X… | “Lisa bleeds for 2. Target: Name's pool.” | opens its block decision as the target (or as predator on an undirected read); remembers the action |
| Actions → +X bleed… | “Lisa adds +2 bleed (= 4).” | reopens its reaction window on the new total; this is the moment it bounces |
| Actions → Vote → Political action | “Lisa calls a political action.” | opens the block step for prey and predator, then asks the pool question |
| Actions → Vote → Cast votes → For/Against… | “Lisa casts 2 votes for.” | counts them in a bot-called referendum |
| Actions → Block | “Lisa blocks.” | names Lisa as the blocker of its action |
| Actions → Hunt / Rescue from torpor / Diablerie / Card action | “Lisa hunts.” etc. | opens the prey/predator window for hunt and rescue; remembers the rest so a later Any blocks? has something to ask about |
| Playing a card from hand | clone animation + “plays X” | learns the card name (its statistics) and, if the card is curated, its effect |
Adjusting a bot's board
Right-click on a bot's seat (its pool globe, or its row in the Table panel) and on its cards. On a Structured table the other seats' globes show in the table overview (V) and on a seat visit (the number keys 1–6; 0 goes home); the Table panel opens from the tab at the right edge. Everything here is meant for correcting what the bot could not see; the bot announces the change and plays on from it.
Seat menu (pool globe / Table panel)
- — type the new total. The bot clamps it, says “pool set to N by the host”, and a zero ousts it properly (bounty to its predator).
- / / — step it, for referendum costs and small corrections.
- — ousts the bot: it clears its board, stops taking turns, and its predator collects the bounty.
- — see the un-oust note above: the seat returns, the bot does not.
- — advances past a bot that holds the turn (online: while it is its turn; offline: while the sweep is waiting on it).
- — appears when the bot plays with an open hand (Debug bot, or Revelations at superior); at an offline table from client v2.6.159. In Structured the eye in the corner of the bot's pool zone opens the same rows (client v2.6.160+).
- — the bot's discarded and spent cards by name, for any bot, at any time.
Online these are host- and referee-only, like every referee verb; at a hotseat you are the host.
Card menu (right-click a card on the bot's board)
- / — a strike you dealt, a hunt it could not see, a permanent of yours that drains it.
- / — a Misdirection you played, a wake effect.
- /
- , — generic counters (a Fame's tally, corruption, whatever the card needs).
- / — vampires only; sending a famed vampire to torpor also triggers the Fame pool loss on the bot's side.
- — bot cards only, with a confirm: a diablerised vampire, a final death, or a card an effect of yours removed. The bot drops anything attached to it and says so in chat.
The bot applies each change, clamps it (blood 0–99), writes “ctrl from Anna: blood− on Colette” to its log and republishes its board — its publish is what everyone then sees.
Giving a bot a card
Drag a card from your hand onto the bot's board — onto one of its vampires for an attachment — exactly as you would for a human. Fame and Pentex Subversion dropped on a bot's vampire arm: the bot tracks the Fame's torpor cost and knows the Pentexed vampire cannot block. Works online and offline.
The Bot Activity panel
The badge in the top-right corner (a number beside it counts bots waiting on someone) opens a panel with one row per bot: its name, what it is waiting for in table language (“block? (Anna)”, “hold: Anna”, “pool question (how much?)”, “Anna's turn”, “thinking”), a countdown where one honestly exists, and a step button.
- — releases the bot on that row only (each bot keeps its own hold), written to the log as done from the table controls. To release every bot at once, say It resolves.
- — closes the bot's open block/reaction window exactly as its clock would have: nobody answered, so a contested window still declares its verdict from the counter.
- — closes the pool question as its clock would (stage one → “no”, stage two → 1 pool).
- — closes an open combat step (“combat step maneuvers (Anna)”) as its clock would.
- — closes the bot's vote poll (“votes (Anna, Bob)”) as its clock would.
- on “block verdict (Anna)” — a bot blocked your action and waits for your move: declares the verdict from the counter as its clock would.
- In the Turn-based tempo these rows show no countdown — the bot waits for you — and the ▶ beside the 🤖 is how you give it the word.
- (offline only) — plays the bot seats between the current turn and the next human, the range the Pass handover would play.
A step can only pull forward a wait the bot would have resolved itself; it never forces a decision the bot could not have reached. A greyed button means the wait is not steppable — the bot is pacing, or a human is mid-answer. Online every seated player sees the panel and its tempo gear; the step buttons only act in the host's tab, where the bots run.