Files
RingBRP/tools/roster.mjs
T
slaguru666andClaude Opus 5 26ad00174f Add the same ten before the department found them
Ten civilian counterparts, one per roster agent: same person, same
characteristics, same face, no induction and nothing ever issued to them. A
player can hold the two sheets side by side and read exactly what the job did.

Keyed off ROSTER rather than written out again, so the pair cannot drift apart.
The five who joined straight into a posting get the trade they came out of, and
between them the ten now cover all ten trades exactly once — which makes this
set a demonstration of the whole trade half of character creation as well as a
set of characters.

expandFromRegister grows a `civilian` mode: no induction skills, no standing
issue, no tier issue, no trade cant, and nothing anomalous or Coherence-costing.

Three things the build guard caught, each of which would have shipped:

  - Holloway was "carrying issued kit: notebook". Wrong: an interpreter owned a
    notebook long before anyone issued her one. The rule is now kit that could
    ONLY have come from the department.
  - Same again for skills — the linguist's core list contains trade cant,
    because it is a language and she is a linguist.
  - Wren Finch was carrying the black mirror, which is era "anomalous", from a
    transposed tradition, and costs Coherence to look into twice. That is
    something you acquire after the night the department notices you, not
    before. It is the only anomalous item in any trade kit.

The guard runs over the built objects rather than trusting the flag that made
them, because the flag is three call-frames away from the result.

Verified in Foundry: 24 pregens, the before sheets show the civilian job in
place of rank, no armour, nothing readied but fists, and the right face.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 16:19:50 +01:00

207 lines
12 KiB
JavaScript

/**
* THE DUTY ROSTER — ten ready-to-play agents for the compendium.
*
* Written compactly: a posting or a trade, a rank, eight characteristics and a face.
* Skills and kit are expanded from the register at build time by the same helper the
* starter scenario uses, so a roster agent cannot drift from the generator. Change
* TRADE_BANDS and every doctor on this list changes with it.
*
* Five postings and five trades on purpose. A group picking from this sheet sees both
* halves of character creation without anybody having to explain them.
*
* Portraits are generated art, one per agent, in art/portraits.
*/
export const ROSTER = [
/* ---------------- postings: career department ---------------- */
{ key: "pc_holloway", name: "Marta Holloway", role: "lead", rank: "Senior Field Officer",
portrait: "pc_holloway", chosenStyle: "reflex", species: "baseline",
age: { chronological: 44, physiological: 44 },
ch: { str: 11, siz: 12, con: 13, int: 15, pow: 14, dex: 14, cha: 14, edu: 13 },
talents: ["first_through", "read_room", "clean_scene"],
bio: "<p>Nineteen years, four of them on secondment to an office that no longer "
+ "appears in the directory. Signs for everything and reads it first.</p>"
+ "<p><em>Anchor:</em> a wedding ring she does not wear, kept in a coin envelope "
+ "in her jacket.</p>" },
{ key: "pc_okonkwo", name: "Ben Okonkwo", role: "heavy", rank: "Field Officer",
portrait: "pc_okonkwo", chosenStyle: "reflex", species: "baseline",
age: { chronological: 33, physiological: 33 },
ch: { str: 17, siz: 16, con: 16, int: 11, pow: 11, dex: 13, cha: 11, edu: 10 },
talents: ["hard_landing", "first_through"],
bio: "<p>Goes through the door and holds the corridor while everyone else does the "
+ "clever part. Has never once complained about being the one who is hit.</p>"
+ "<p><em>Anchor:</em> his sister's voice note, saved and never deleted.</p>" },
{ key: "pc_sandoval", name: "Rey Sandoval", role: "overwatch", rank: "Field Officer",
portrait: "pc_sandoval", chosenStyle: "deliberate", species: "baseline",
age: { chronological: 37, physiological: 37 },
ch: { str: 12, siz: 12, con: 13, int: 14, pow: 13, dex: 17, cha: 10, edu: 12 },
talents: ["first_through", "unblinking"],
bio: "<p>Takes the long lane and the long view. Keeps a private list of the shots "
+ "she chose not to take, and will not discuss it.</p>"
+ "<p><em>Anchor:</em> a paperback with somebody else's name inside the cover.</p>" },
{ key: "pc_bhattacharya", name: "Arun Bhattacharya", role: "registry",
rank: "Senior Field Officer", portrait: "pc_bhattacharya",
chosenStyle: "deliberate", species: "baseline",
age: { chronological: 56, physiological: 56 },
ch: { str: 10, siz: 11, con: 11, int: 17, pow: 15, dex: 11, cha: 12, edu: 17 },
talents: ["chain_custody", "debriefer", "requisition"],
bio: "<p>Thirty years in the registry. Has read files that were withdrawn "
+ "before he finished them and remembers what was in them anyway.</p>"
+ "<p><em>Anchor:</em> a brass slide rule that belonged to his predecessor.</p>" },
{ key: "pc_rahimi", name: "Soraya Rahimi", role: "settlements", rank: "Field Officer",
portrait: "pc_rahimi", chosenStyle: "deliberate", species: "baseline",
age: { chronological: 41, physiological: 41 },
ch: { str: 10, siz: 11, con: 12, int: 15, pow: 15, dex: 11, cha: 17, edu: 15 },
talents: ["read_room", "debriefer"],
bio: "<p>Writes the arrangement that everyone can live with, then holds both sides "
+ "to it. Has never raised her voice on an operation.</p>"
+ "<p><em>Anchor:</em> her mother's tea glass, chipped, carried in a sock.</p>" },
/* ---------------- trades: recruited from an ordinary job ---------------- */
{ key: "pc_nkemdirim", name: "Dr Chidi Nkemdirim", trade: "doctor", rank: "Probationary",
portrait: "pc_nkemdirim", chosenStyle: "deliberate", species: "baseline",
age: { chronological: 32, physiological: 32 },
ch: { str: 10, siz: 11, con: 12, int: 16, pow: 13, dex: 13, cha: 13, edu: 18 },
talents: ["triage", "unblinking"],
bio: "<p>Six years of emergency medicine and eleven months of this. Still the "
+ "calmest person in the room, and still startled by what the room contains.</p>"
+ "<p><em>Anchor:</em> a pager that has not worked since 2019.</p>" },
{ key: "pc_kowalczyk", name: "Marek Kowalczyk", trade: "engineer", rank: "Probationary",
portrait: "pc_kowalczyk", chosenStyle: "reflex", species: "baseline",
age: { chronological: 30, physiological: 30 },
ch: { str: 13, siz: 13, con: 13, int: 17, pow: 11, dex: 14, cha: 11, edu: 15 },
talents: ["hard_landing", "requisition"],
bio: "<p>Chartered, unimpressed, and the only person who asks what a thing is made "
+ "of before asking what it wants.</p>"
+ "<p><em>Anchor:</em> the first tool he ever bought, resharpened forty times.</p>" },
{ key: "pc_finch", name: "Wren Finch", trade: "criminal", rank: "Probationary",
portrait: "pc_finch", chosenStyle: "reflex", species: "baseline",
age: { chronological: 26, physiological: 26 },
ch: { str: 10, siz: 10, con: 12, int: 14, pow: 12, dex: 18, cha: 14, edu: 9 },
talents: ["cover_work", "clean_scene"],
bio: "<p>Opens things without leaving a mark, which is the part she is proud of. "
+ "Signed the Act in an interview room, which is the part she is not.</p>"
+ "<p><em>Anchor:</em> a door key to a flat that was demolished.</p>" },
{ key: "pc_agyeman", name: "Joseph Agyeman", trade: "police", rank: "Field Officer",
portrait: "pc_agyeman", chosenStyle: "reflex", species: "baseline",
age: { chronological: 52, physiological: 52 },
ch: { str: 14, siz: 14, con: 14, int: 13, pow: 13, dex: 12, cha: 14, edu: 12 },
talents: ["read_room", "chain_custody", "first_through"],
bio: "<p>Twenty-six years on division before somebody handed him a file with no "
+ "crime number. Knows how a statement is taken and how a scene is lost.</p>"
+ "<p><em>Anchor:</em> his old warrant number, written inside his watch strap.</p>" },
{ key: "pc_lindqvist", name: "Professor Åke Lindqvist", trade: "professor",
rank: "Field Officer", portrait: "pc_lindqvist",
chosenStyle: "deliberate", species: "baseline",
age: { chronological: 63, physiological: 63 },
ch: { str: 9, siz: 11, con: 10, int: 17, pow: 16, dex: 10, cha: 14, edu: 19 },
talents: ["debriefer", "wrong_memory", "read_room"],
bio: "<p>A chair in comparative folklore and a reading list nobody else has "
+ "finished. Was consulted once and never quite sent home.</p>"
+ "<p><em>Anchor:</em> a photograph of a lecture theatre, taken from the back.</p>" }
];
/**
* THE SAME TEN, BEFORE THE DEPARTMENT FOUND THEM.
*
* Same person, same characteristics, same face — a civilian who has not been inducted
* and has never been issued anything. Skills and tools come from the trade alone, so a
* player can hold the two sheets side by side and see exactly what the job did to them.
* (The linguist is the one who already speaks trade cant before she arrives. It is a
* language, and she is a linguist.)
*
* Five of the ten went into the department straight into a posting rather than out of a
* trade, so this is where they came from. Between them the ten cover all ten trades
* exactly once, which means this set also shows a table the whole trade half of
* character creation without anybody having to read the rules for it.
*
* `job` replaces the rank line on the sheet. The second paragraph of each biography is
* the seam: what they did that got them noticed. It is the hook a GM pulls on.
*/
export const BEFORE = {
pc_holloway: { trade: "linguist", job: "Court Interpreter", age: 25,
bio: "<p>Interpreting at magistrates' courts and immigration tribunals. Ten hours a "
+ "day saying other people's worst sentences in the first person, and going home "
+ "able to repeat every one of them.</p>"
+ "<p><em>How they found her:</em> she interpreted a statement nobody had asked "
+ "her to hear, and then wrote down what the room had done while it was said.</p>" },
pc_okonkwo: { trade: "builder", job: "Steel Erector", age: 28,
bio: "<p>Ten storeys up on a frame with no floor in it yet, in weather that sends "
+ "everyone else down the ladder. Never late, never sick, and never the one who "
+ "says the job cannot be done.</p>"
+ "<p><em>How they found him:</em> he carried two men off a site that had gone "
+ "wrong in a way the report could not describe, and he did not ask a single "
+ "question about it.</p>" },
pc_sandoval: { trade: "it", job: "Network Field Engineer", age: 31,
bio: "<p>Alone at the top of a mast in the dark with a laptop and a flask, fixing "
+ "links for towns that only notice the network when it stops. Long climbs, long "
+ "views, long silences.</p>"
+ "<p><em>How they found her:</em> a relay logged forty minutes of traffic from a "
+ "site decommissioned in 1994, and she kept the file instead of clearing it.</p>" },
pc_bhattacharya: { trade: "scientist", job: "Research Chemist", age: 26,
bio: "<p>An industrial laboratory, a bench, and a notebook filled in the same hand "
+ "every day for four years. Slow, exact, and constitutionally unable to leave a "
+ "discrepancy alone.</p>"
+ "<p><em>How they found him:</em> he noticed a batch record amended by somebody "
+ "who had never worked there, and he raised it in writing. Twice.</p>" },
pc_rahimi: { trade: "entertainer", job: "Local Radio Presenter", age: 33,
bio: "<p>Mid-morning phone-in on a station nobody outside the county has heard of. "
+ "Six years of listening to people who rang up angry and hung up calmer.</p>"
+ "<p><em>How they found her:</em> she talked a caller down from something on air "
+ "for eleven minutes, and the recording of those minutes does not play back the "
+ "same way twice.</p>" },
pc_nkemdirim: { trade: "doctor", job: "Registrar, Emergency Medicine", age: 31,
bio: "<p>Six years of A&amp;E and the flat calm that comes with it. The one the "
+ "department turns to when nobody else will say the decision out loud.</p>"
+ "<p><em>How they found them:</em> a patient came in with an injury that had "
+ "healed in the wrong direction, and the notes they wrote were too good to leave "
+ "in the system.</p>" },
pc_kowalczyk: { trade: "engineer", job: "Structural Engineer", age: 29,
bio: "<p>Chartered, practical, and happiest with a survey and a set of drawings that "
+ "disagree. Asks what a thing is made of before he asks what it is for.</p>"
+ "<p><em>How they found him:</em> he condemned a footbridge on load figures that "
+ "were correct, for a span he had measured three times and got three "
+ "answers.</p>" },
pc_finch: { trade: "criminal", job: "Between Things", age: 25,
bio: "<p>Not organised, and not caught either — doors, locks and other people's "
+ "assumptions, worked quietly and left tidy. Rents by the week and pays cash.</p>"
+ "<p><em>How they found her:</em> she was inside a building she had no business "
+ "in on the night it stopped being on the street it was on, and she was the only "
+ "witness who could describe the inside.</p>" },
pc_agyeman: { trade: "police", job: "Detective Sergeant", age: 50,
bio: "<p>Twenty-six years on division. Takes a statement properly, keeps a scene, "
+ "and has watched three generations of the same families come through the same "
+ "door.</p>"
+ "<p><em>How they found him:</em> a file with no crime number landed on his desk "
+ "and he worked it anyway, on his own time, and got further than he was meant "
+ "to.</p>" },
pc_lindqvist: { trade: "professor", job: "Professor of Comparative Folklore", age: 59,
bio: "<p>A chair, a reading list, and forty years of stories about places that take "
+ "people and give them back wrong. Treats them as evidence rather than as "
+ "literature.</p>"
+ "<p><em>How they found him:</em> he was consulted once, as an academic "
+ "courtesy, and gave an answer so specific that he was never quite sent "
+ "home.</p>" }
};