Five postings and five trades, so a group choosing from this sheet meets both halves of character creation without anyone having to explain them. Skills and kit are not written out per agent. They are expanded from the register at build time by the same helper the starter scenario uses, which is hoisted out of the BLACK PLATFORM block for the purpose — two copies of that expansion is two places for the induction rule to drift. Ratings sit at the middle of each band rather than being rolled, because a pregen that varies between installs is not a pregen. Portraits are generated art, resized to 512 and stored as webp (12MB of PNG became 210KB). buildActor now takes a portrait and gives the same face to the prototype token: a pregen you can recognise on the map is worth more at a convention table than a correct one you cannot tell apart. It throws on a portrait that is not on disk, because a broken image on a pregen sheet is the sort of thing that is first noticed on a projector. Guard: check-behaviour gains a test that every roster agent names a real posting or trade and has its portrait on disk, verified to bite. It caught "archive", which is not a posting — Bhattacharya is Registry. Verified in a running Foundry: 14 pregens in the pack, sheets render with the portraits, coherence and hit points fill from the template, no system errors. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
114 lines
6.7 KiB
JavaScript
114 lines
6.7 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>" }
|
|
];
|