Asking for the type of armour per location turned out not to be a display request. Every equipped piece added its points to EVERY location, so a Brodie helmet protected your shins and a cuirass protected your skull — with a catalogue containing sallets, lobster-tail helmets and three cuirasses, that could not be printed without the sheet saying something visibly false. Armour now declares coverage as a named set rather than a list of locations, because a piece has to fit whatever body wears it: all, torso, torsoArms, torsoLimbs, head. The sets expand to location KINDS, so a cuirass covers a baseline torso and a vesh trunk and ridge without either knowing the other exists. Unstated coverage is `all`, so anything that does not declare behaves as everything did before. Eighteen of the twenty-five catalogue pieces are not whole-body and now say so. The trap was double counting: hitLocationRoll subtracted the global worn total PLUS the body's own armour at that location, which was right while armour was global and becomes a double count the moment a location knows its own pieces. It reads the location's total and nothing else, verified by firing fourteen hits of 10 damage across every location and asserting damage applied == 10 - that location's armour. A single ARMOUR number no longer exists, so the header shows the torso with "0-8 by location" beside it when the rest of you is not that. This is a real difficulty change: limbs are frequently bare and limbs are 12 of 20 on the melee table. Coherence moves out of the derived strip into the vitals at hit-point size, with its band under it and the box reddening as it falls. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
968 lines
101 KiB
JavaScript
968 lines
101 KiB
JavaScript
/**
|
||
* RingBRP content source — the playtest slice, expressed as data.
|
||
* Everything here is derived from RINGBRP_v0.5_PLAYTEST_SLICE.md.
|
||
* Derived values (HP, Major Wound, damage modifier, category bonuses) are COMPUTED,
|
||
* not transcribed, so the packs can never drift from the rules.
|
||
*/
|
||
|
||
// Rule formulas come from the ONE authority. They used to be mirrored here and
|
||
// drifted twice: Major Wound and hit points were each built under a different
|
||
// rule than the engine played by.
|
||
import { ceil, hitPointsFor, majorWoundFor, damageModifierFor, styleFor } from "../rules.mjs";
|
||
export { hitPointsFor, majorWoundFor, damageModifierFor, styleFor };
|
||
export const hitPoints = hitPointsFor;
|
||
export const majorWound = majorWoundFor;
|
||
export const damageModifier = damageModifierFor;
|
||
|
||
/* ---------- skill catalogue (spec §4.7 / v0.5 §2.1) ---------- */
|
||
export const SKILL_CATALOGUE = [
|
||
// melee
|
||
["brawl", "", "melee", 25, "Brawl"],
|
||
["melee_weapon", "club", "melee", 5, "Melee Weapon (Club)"],
|
||
["transposed_weapon", "", "melee", 5, "Transposed Weapon"],
|
||
["melee_weapon", "knife", "melee", 5, "Melee Weapon (Knife)"],
|
||
["melee_weapon", "sword", "melee", 5, "Melee Weapon (Sword)"],
|
||
["melee_weapon", "spear", "melee", 5, "Melee Weapon (Spear)"],
|
||
["melee_weapon", "prybar", "melee", 5, "Melee Weapon (Prybar)"],
|
||
// The boarding axe and the entrenching tool both declare spec "axe" and the
|
||
// catalogue had no such skill, so neither could ever be rated above zero.
|
||
["melee_weapon", "axe", "melee", 5, "Melee Weapon (Axe)"],
|
||
// The historical range needs somewhere to hang a halberd and a flail. Everything
|
||
// else fits an existing specialisation: a mace is a club, a dirk is a knife.
|
||
["melee_weapon", "polearm", "melee", 5, "Melee Weapon (Polearm)"],
|
||
["melee_weapon", "flail", "melee", 5, "Melee Weapon (Flail)"],
|
||
["variable_sword", "", "melee", 5, "Variable Sword"],
|
||
// ranged
|
||
["firearm", "pistol", "ranged", 5, "Firearm (Pistol)"],
|
||
["firearm", "rifle", "ranged", 5, "Firearm (Rifle)"],
|
||
["energy_weapon", "pistol", "ranged", 5, "Energy Weapon (Pistol)"],
|
||
["energy_weapon", "rifle", "ranged", 5, "Energy Weapon (Rifle)"],
|
||
["flashlight_laser", "", "ranged", 5, "Flashlight Laser"],
|
||
["missile_weapon", "bow", "ranged", 5, "Missile Weapon (Bow)"],
|
||
["missile_weapon", "sling", "ranged", 5, "Missile Weapon (Sling)"],
|
||
["missile_weapon", "thrown", "ranged", 15, "Missile Weapon (Thrown)"],
|
||
// A muzzle-loader is not a rifle. Loading is the skill and it is a different one.
|
||
["firearm", "muzzleloader", "ranged", 5, "Firearm (Muzzle-loader)"],
|
||
["heavy_weapon", "", "ranged", 5, "Heavy Weapon"],
|
||
// communication
|
||
["bargain", "", "comm", 5, "Bargain"],
|
||
["fast_talk", "", "comm", 5, "Fast Talk"],
|
||
["persuade", "", "comm", 15, "Persuade"],
|
||
["insight", "", "comm", 5, "Insight"],
|
||
["language", "trade_cant", "comm", 0, "Language (Trade Cant)"],
|
||
["language", "sign", "comm", 0, "Language (Sign)"],
|
||
["language", "own", "comm", 0, "Language (Own)"],
|
||
["art", "", "comm", 5, "Art"],
|
||
["status", "", "comm", 15, "Status"],
|
||
// manipulation
|
||
["repair", "mechanical", "manip", 15, "Repair (Mechanical)"],
|
||
["repair", "electronics", "manip", 15, "Repair (Electronics)"],
|
||
["sleight_of_hand", "", "manip", 5, "Sleight of Hand"],
|
||
["demolition", "", "manip", 1, "Demolition"],
|
||
// mental
|
||
["tradecraft", "", "mental", 5, "Tradecraft"],
|
||
["science", "biology", "mental", 1, "Science (Biology)"],
|
||
["science", "physics", "mental", 1, "Science (Physics)"],
|
||
["science", "botany", "mental", 1, "Science (Botany)"],
|
||
["anthropology", "", "mental", 1, "Anthropology"],
|
||
["xenology", "baseline", "mental", 1, "Xenology (Baseline)"],
|
||
["computer_use", "", "mental", 5, "Computer Use"],
|
||
["engineering", "field_systems", "mental", 1, "Engineering (Field Systems)"],
|
||
["knowledge", "", "mental", 5, "Knowledge"],
|
||
["medicine", "", "mental", 1, "Medicine"],
|
||
["first_aid", "", "mental", 30, "First Aid"],
|
||
["navigate", "", "mental", 10, "Navigate"],
|
||
["research", "", "mental", 1, "Research"],
|
||
["anomaly_lore", "", "mental", 0, "Anomaly Lore", { canBeTaught: false }],
|
||
// perception
|
||
["listen", "", "percep", 25, "Listen"],
|
||
["spot", "", "percep", 25, "Spot"],
|
||
["track", "", "percep", 10, "Track"],
|
||
["scent", "", "percep", 0, "Scent"],
|
||
// physical
|
||
["athletics", "", "phys", 25, "Athletics"],
|
||
["stealth", "", "phys", 10, "Stealth"],
|
||
["dodge", "", "phys", 0, "Dodge", { base: { mode: "formula", value: 0, formula: "dex*2" } }],
|
||
["pilot", "aircraft", "phys", 1, "Pilot (Aircraft)"],
|
||
["pilot", "ground_car", "phys", 1, "Pilot (Ground Car)"],
|
||
["transposition", "", "phys", 1, "Transposition"]
|
||
];
|
||
|
||
/* ---------- weapons (v0.5 §4.7) ---------- */
|
||
export const WEAPONS = [
|
||
{ key: "punch", name: "Punch / kick", cls: "melee", fam: "brawl", spec: "", dmg: "1d3", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0 },
|
||
{ key: "baton", name: "Collapsible baton", cls: "melee", fam: "melee_weapon", spec: "club", dmg: "1d6+2", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0.7, trad: "tradition_agency" },
|
||
{ key: "dagger", name: "Utility knife", cls: "melee", fam: "melee_weapon", spec: "knife", dmg: "1d4+2", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0.3, trad: "tradition_agency" },
|
||
{ key: "prybar", name: "Entry bar", cls: "melee", fam: "melee_weapon", spec: "prybar", dmg: "1d10", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 3, trad: "tradition_agency" },
|
||
{ key: "machete", name: "Machete", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d8+1", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.1 },
|
||
{ key: "spear1h", name: "Improvised spear", cls: "melee", fam: "melee_weapon", spec: "spear", dmg: "1d8+1", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.8 },
|
||
{ key: "grasp", name: "Vesh grasp limb", cls: "melee", fam: "brawl", spec: "", dmg: "1d6+1", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0 },
|
||
{ key: "shortbow", name: "Hunting bow", cls: "bow", fam: "missile_weapon",spec: "bow", dmg: "1d6+1", wound: "piercing", mod: false, ranges: [30,60,90], fire: "single", cap: 12, mass: 1 },
|
||
{ key: "pistol_light", name: "Compact pistol", cls: "firearm", fam: "firearm", spec: "pistol", dmg: "1d6+2", wound: "piercing", mod: false, ranges: [10,30,90], fire: "rapid", cap: 8, mass: 0.7, trad: "tradition_agency" },
|
||
{ key: "pistol_med", name: "Service pistol", cls: "firearm", fam: "firearm", spec: "pistol", dmg: "1d8+2", wound: "piercing", mod: false, ranges: [10,30,90], fire: "rapid", cap: 15, mass: 1.1, trad: "tradition_agency" },
|
||
{ key: "pistol_heavy", name: "Heavy revolver", cls: "firearm", fam: "firearm", spec: "pistol", dmg: "1d10+2", wound: "piercing", mod: false, ranges: [10,40,120], fire: "rapid", cap: 6, mass: 1.4 },
|
||
{ key: "smg", name: "Suppressed carbine", cls: "firearm", fam: "firearm", spec: "rifle", dmg: "1d8+2", wound: "piercing", mod: false, ranges: [20,60,150], fire: "rapid", cap: 30, mass: 2.9, trad: "tradition_agency" },
|
||
{ key: "rifle_med", name: "Marksman rifle", cls: "firearm", fam: "firearm", spec: "rifle", dmg: "1d10+2", wound: "piercing", mod: false, ranges: [20,60,180], fire: "single", cap: 10, mass: 3.4, trad: "tradition_agency" },
|
||
{ key: "rifle_heavy", name: "Anti-materiel rifle", cls: "firearm", fam: "firearm", spec: "rifle", dmg: "2d6+2", wound: "piercing", mod: false, ranges: [30,80,220], fire: "single", cap: 5, mass: 6.1 },
|
||
{ key: "shotgun", name: "Breaching shotgun", cls: "firearm", fam: "firearm", spec: "rifle", dmg: "", wound: "piercing", mod: false, ranges: [10,20,50], fire: "slow", cap: 6, mass: 3.6, trad: "tradition_agency",
|
||
byBand: { short: "3d6", medium: "2d6", long: "1d6" } },
|
||
/* Crossing tech. Every one of these costs a point of Coherence to use, which is the
|
||
whole design: they are the tools that work, and they are the tools that cost. */
|
||
{ key: "cutter", name: "Excision cutter", cls: "melee", fam: "transposed_weapon", spec: "", dmg: "1d20+5", wound: "edged", mod: false, ranges: [1,15,30], fire: "", cap: 0, mass: 0.8, mono: true, trad: "tradition_transposed", coherence: 1 },
|
||
{ key: "lance", name: "Redaction lance", cls: "energy", fam: "energy_weapon", spec: "pistol", dmg: "1d4+6", wound: "energy", mod: false, ranges: [20,50,100], fire: "beam", cap: 20, mass: 0.7, trad: "tradition_transposed", energy: 10, coherence: 1 },
|
||
{ key: "unmaker", name: "Unmaker", cls: "energy", fam: "energy_weapon", spec: "rifle", dmg: "1d10+30", wound: "energy", mod: false, ranges: [100,200,400],fire: "beam", cap: 5, mass: 4, trad: "tradition_transposed", energy: 40, coherence: 2 },
|
||
|
||
/* ---------- ANTIQUE. Brought back from somewhere behind us, or never left. ---------- */
|
||
{ key: "flintlock", name: "Flintlock pistol", cls: "firearm", fam: "firearm", spec: "pistol", dmg: "1d8+1", wound: "piercing", mod: false, ranges: [8,18,36], fire: "slow", cap: 1, mass: 1.3, era: "antique", trad: "tradition_local", desc: "One shot, then a minute of ritual. A fumble means a hangfire: it may still go off." },
|
||
{ key: "musket", name: "Musket", cls: "firearm", fam: "firearm", spec: "rifle", dmg: "1d10+2", wound: "piercing", mod: false, ranges: [15,40,90], fire: "slow", cap: 1, mass: 4.5, era: "antique", trad: "tradition_local", desc: "Loud, slow, and it does not care what century you are from." },
|
||
{ key: "duelling_sword", name: "Duelling sword", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d8+1", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.1, era: "antique", trad: "tradition_local", desc: "Light, quick and entirely unsuited to armour." },
|
||
{ key: "boarding_axe",name: "Boarding axe", cls: "melee", fam: "melee_weapon", spec: "axe", dmg: "1d8+2", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 2.2, era: "antique", trad: "tradition_local", desc: "Made for doors and rigging. Works on both." },
|
||
{ key: "crossbow", name: "Crossbow", cls: "bow", fam: "missile_weapon", spec: "bow", dmg: "1d10", wound: "piercing", mod: false, ranges: [20,50,110], fire: "slow", cap: 1, mass: 3.4, era: "antique", trad: "tradition_local", desc: "Silent, and it will punch through a stab vest." },
|
||
{ key: "cudgel", name: "Cudgel", cls: "melee", fam: "melee_weapon", spec: "club", dmg: "1d6+1", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.0, era: "antique", trad: "tradition_local", desc: "A stick. Reliable in every century tested." },
|
||
|
||
/* ---------- MODERN. Agency issue and local purchase. ---------- */
|
||
{ key: "revolver", name: "Service revolver", cls: "firearm", fam: "firearm", spec: "pistol", dmg: "1d8+2", wound: "piercing", mod: false, ranges: [10,28,80], fire: "single", cap: 6, mass: 1.0, era: "modern", trad: "tradition_agency", desc: "Six, and it never jams. The armoury keeps them for crossings that eat electronics." },
|
||
{ key: "carbine", name: "Suppressed carbine",cls: "firearm", fam: "firearm", spec: "rifle", dmg: "1d10+1", wound: "piercing", mod: false, ranges: [25,70,160], fire: "rapid", cap: 30, mass: 3.2, era: "modern", trad: "tradition_agency", desc: "Quiet enough that Containment survives the first magazine." },
|
||
{ key: "entrenching_tool", name: "Entrenching tool", cls: "melee", fam: "melee_weapon", spec: "axe", dmg: "1d6+2", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.4, era: "modern", trad: "tradition_agency", desc: "Digs, pries, chops. Counts as a tool until it does not." },
|
||
|
||
/* ---------- FUTURE. Recovered from somewhere ahead. ---------- */
|
||
{ key: "gauss_pistol",name: "Gauss sidearm", cls: "energy", fam: "energy_weapon", spec: "pistol", dmg: "1d8+4", wound: "piercing", mod: false, ranges: [15,45,120], fire: "single", cap: 24, mass: 0.9, era: "future", trad: "tradition_transposed", energy: 4, desc: "No propellant and no report — a tap, and a hole. Ammunition is not manufacturable here." },
|
||
{ key: "gauss_rifle", name: "Gauss lance-rifle", cls: "energy", fam: "energy_weapon", spec: "rifle", dmg: "1d12+4", wound: "piercing", mod: false, ranges: [40,120,300], fire: "single", cap: 12, mass: 3.8, era: "future", trad: "tradition_transposed", energy: 8, desc: "Punches an entry wound and an exit wound and very little between them." },
|
||
{ key: "monoblade", name: "Monofilament blade",cls: "melee", fam: "melee_weapon", spec: "knife", dmg: "1d10+2", wound: "edged", mod: false, mono: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0.4, era: "future", trad: "tradition_transposed", desc: "Cuts armour as though it were not there. Handle with the sheath on." },
|
||
|
||
/* ==================================================================
|
||
THE HISTORICAL RANGE
|
||
|
||
The department has been running since before it had a name, and it
|
||
has never thrown anything away. Everything below is either still in
|
||
a store somewhere in the building, or came back through a crossing
|
||
with somebody. The period note is not decoration — a GM handing out
|
||
a matchlock should know it is a matchlock.
|
||
================================================================== */
|
||
|
||
/* --- medieval --- */
|
||
{ key: "arming_sword", name: "Arming sword", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d8+1", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.2, era: "antique", trad: "tradition_local", desc: "Medieval. A yard of cross-hilted steel. The plain, correct answer to most of the fifteenth century." },
|
||
{ key: "longsword", name: "Longsword", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d10+1", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.6, era: "antique", trad: "tradition_local", desc: "Medieval. Hand and a half. Wants room and rewards someone who has been taught." },
|
||
{ key: "falchion", name: "Falchion", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d8+2", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.5, era: "antique", trad: "tradition_local", desc: "Medieval. Heavy at the tip and unsubtle. A cleaver that got above itself." },
|
||
{ key: "war_hammer", name: "War hammer", cls: "melee", fam: "melee_weapon", spec: "club", dmg: "1d8+2", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.7, era: "antique", trad: "tradition_local", desc: "Medieval. For plate, which it does not cut so much as dent inwards." },
|
||
{ key: "mace", name: "Mace", cls: "melee", fam: "melee_weapon", spec: "club", dmg: "1d8+1", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.4, era: "antique", trad: "tradition_local", desc: "Medieval. Flanged. Requires no skill worth the name and never breaks." },
|
||
{ key: "flail", name: "Military flail", cls: "melee", fam: "melee_weapon", spec: "flail", dmg: "1d10", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 2.0, era: "antique", trad: "tradition_local", desc: "Medieval. Goes round a shield and is nearly as dangerous behind you as in front." },
|
||
{ key: "poleaxe", name: "Poleaxe", cls: "melee", fam: "melee_weapon", spec: "polearm", dmg: "1d10+2", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 3.0, era: "antique", trad: "tradition_local", desc: "Medieval. Axe, hammer and spike on six feet of ash. The best answer to armour anyone found before gunpowder." },
|
||
{ key: "halberd", name: "Halberd", cls: "melee", fam: "melee_weapon", spec: "polearm", dmg: "1d10+2", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 3.2, era: "antique", trad: "tradition_local", desc: "Medieval. Cut, thrust or pull a rider off a horse. Useless indoors and the department keeps eleven." },
|
||
{ key: "billhook", name: "Billhook", cls: "melee", fam: "melee_weapon", spec: "polearm", dmg: "1d8+2", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 2.6, era: "antique", trad: "tradition_local", desc: "Medieval. A hedging tool with ambitions. Every parish had a rack of them." },
|
||
{ key: "pike", name: "Pike", cls: "melee", fam: "melee_weapon", spec: "spear", dmg: "1d10+1", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 4.5, era: "antique", trad: "tradition_local", desc: "Medieval to Civil War. Sixteen feet. Magnificent in a field, absurd in a corridor." },
|
||
{ key: "quarterstaff", name: "Quarterstaff", cls: "melee", fam: "melee_weapon", spec: "club", dmg: "1d8", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.8, era: "antique", trad: "tradition_local", desc: "Medieval. Six foot of ash. Legal to carry, which is most of the point." },
|
||
{ key: "dirk", name: "Dirk", cls: "melee", fam: "melee_weapon", spec: "knife", dmg: "1d4+2", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0.4, era: "antique", trad: "tradition_local", desc: "Medieval onward. Long in the blade for a knife and worn where a knife is not expected." },
|
||
{ key: "longbow", name: "Longbow", cls: "bow", fam: "missile_weapon", spec: "bow", dmg: "1d10+1", wound: "piercing", mod: false, ranges: [30,90,180], fire: "fast", cap: 1, mass: 1.0, era: "antique", trad: "tradition_local", desc: "Medieval. Yew, and a draw weight that deforms the man who uses it. Faster than any firearm here." },
|
||
{ key: "arbalest", name: "Arbalest", cls: "bow", fam: "missile_weapon", spec: "bow", dmg: "1d12", wound: "piercing", mod: false, ranges: [25,60,130], fire: "slow", cap: 1, mass: 5.0, era: "antique", trad: "tradition_local", desc: "Medieval. Steel prod, windlass span. One shot, and it goes through what it hits." },
|
||
{ key: "sling", name: "Sling", cls: "bow", fam: "missile_weapon", spec: "sling", dmg: "1d8", wound: "blunt", mod: false, ranges: [20,50,110], fire: "fast", cap: 1, mass: 0.1, era: "antique", trad: "tradition_local", desc: "Ancient, and never actually obsolete. Ammunition is whatever is on the ground." },
|
||
{ key: "javelin", name: "Javelin", cls: "thrown", fam: "missile_weapon", spec: "thrown", dmg: "1d8+1", wound: "piercing", mod: true, ranges: [10,20,40], fire: "fast", cap: 1, mass: 0.9, era: "antique", trad: "tradition_local", desc: "Ancient. Thrown, and then it is on the ground and somebody else has it." },
|
||
|
||
/* --- early modern --- */
|
||
{ key: "rapier", name: "Rapier", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d8+1", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.1, era: "antique", trad: "tradition_local", desc: "Early modern. A yard and a half of point. For duels and for men who expect to be attacked in a street." },
|
||
{ key: "main_gauche", name: "Main gauche", cls: "melee", fam: "melee_weapon", spec: "knife", dmg: "1d4+1", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0.5, era: "antique", trad: "tradition_local", desc: "Early modern. The left-hand dagger. Its real job is catching the other man's blade." },
|
||
{ key: "matchlock", name: "Matchlock musket", cls: "firearm", fam: "firearm", spec: "muzzleloader", dmg: "1d10+2", wound: "piercing", mod: false, ranges: [15,40,90], fire: "slow", cap: 1, mass: 4.8, era: "antique", trad: "tradition_local", desc: "Early modern. A burning cord and a prayer. Announces itself for a hundred yards before it fires." },
|
||
{ key: "wheellock", name: "Wheellock pistol", cls: "firearm", fam: "firearm", spec: "muzzleloader", dmg: "1d8+1", wound: "piercing", mod: false, ranges: [8,18,35], fire: "slow", cap: 1, mass: 1.6, era: "antique", trad: "tradition_local", desc: "Early modern. Clockwork ignition, ruinously expensive, and it works in the rain." },
|
||
{ key: "blunderbuss", name: "Blunderbuss", cls: "firearm", fam: "firearm", spec: "muzzleloader", dmg: "2d6+2", wound: "piercing", mod: false, ranges: [5,12,25], fire: "slow", cap: 1, mass: 4.0, era: "antique", trad: "tradition_local", desc: "Early modern. Load it with whatever is to hand. Terrible past twenty feet and decisive within it." },
|
||
{ key: "boarding_pike", name: "Boarding pike", cls: "melee", fam: "melee_weapon", spec: "spear", dmg: "1d8+2", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 2.4, era: "antique", trad: "tradition_local", desc: "Early modern. Short enough for a deck. The department has them because the department used to have ships." },
|
||
|
||
/* --- Napoleonic and Victorian --- */
|
||
{ key: "sabre", name: "Cavalry sabre", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d8+2", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.3, era: "antique", trad: "tradition_local", desc: "Napoleonic. Curved, and meant to be used going past somebody at speed." },
|
||
{ key: "smallsword", name: "Smallsword", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d6+1", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0.6, era: "antique", trad: "tradition_local", desc: "Georgian. Worn with a coat, not with armour. Kills quietly and leaves very little to see." },
|
||
{ key: "cutlass", name: "Cutlass", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d8+1", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.1, era: "antique", trad: "tradition_local", desc: "Georgian. Short, heavy, and it does not care what it hits on the backswing." },
|
||
{ key: "brown_bess", name: "Brown Bess", cls: "firearm", fam: "firearm", spec: "muzzleloader", dmg: "1d10+3", wound: "piercing", mod: false, ranges: [20,50,100], fire: "slow", cap: 1, mass: 4.4, era: "antique", trad: "tradition_local", desc: "Napoleonic. Smoothbore, inaccurate, and it will take an arm off at fifty yards." },
|
||
{ key: "baker_rifle", name: "Baker rifle", cls: "firearm", fam: "firearm", spec: "muzzleloader", dmg: "1d10+2", wound: "piercing", mod: false, ranges: [40,110,250], fire: "slow", cap: 1, mass: 4.2, era: "antique", trad: "tradition_local", desc: "Napoleonic. Rifled, and slow to load precisely because it is. The first weapon here that rewards patience." },
|
||
{ key: "bayonet", name: "Socket bayonet", cls: "melee", fam: "melee_weapon", spec: "knife", dmg: "1d6+1", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0.5, era: "antique", trad: "tradition_local", desc: "Napoleonic onward. On the end of a musket it is a spear; off it, an awkward knife." },
|
||
{ key: "martini", name: "Martini-Henry", cls: "firearm", fam: "firearm", spec: "rifle", dmg: "2d6+2", wound: "piercing", mod: false, ranges: [50,150,350], fire: "slow", cap: 1, mass: 4.0, era: "antique", trad: "tradition_local", desc: "Victorian. Single shot, falling block, and a recoil that has bruised generations." },
|
||
{ key: "webley", name: "Webley revolver", cls: "firearm", fam: "firearm", spec: "pistol", dmg: "1d10", wound: "piercing", mod: false, ranges: [10,25,50], fire: "fast", cap: 6, mass: 1.1, era: "antique", trad: "tradition_local", desc: "Victorian to the Great War. Breaks open, ejects all six at once, and is still in a drawer upstairs." },
|
||
{ key: "lee_enfield", name: "Lee-Enfield", cls: "firearm", fam: "firearm", spec: "rifle", dmg: "2d6+2", wound: "piercing", mod: false, ranges: [60,200,500], fire: "fast", cap: 10, mass: 4.0, era: "antique", trad: "tradition_local", desc: "Great War. Ten rounds and a bolt a trained man works without looking. The best rifle in this list." },
|
||
{ key: "trench_club", name: "Trench club", cls: "melee", fam: "melee_weapon", spec: "club", dmg: "1d8+1", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.2, era: "antique", trad: "tradition_local", desc: "Great War. Made in the line out of a table leg and some nails. Quiet, which was the point." }
|
||
];
|
||
|
||
/* ---------- armour (v0.5 §4.8) ---------- */
|
||
export const ARMOURS = [
|
||
{ key: "jacket", name: "Reinforced jacket", points: 1, covers: "torsoArms", mass: 2, trad: "tradition_agency" },
|
||
{ key: "stab_vest", name: "Stab vest", points: 2, covers: "torso", mass: 3, trad: "tradition_agency" },
|
||
{ key: "soft_armour", name: "Concealed soft armour", points: 3, covers: "torso", mass: 3.5, trad: "tradition_agency" },
|
||
{ key: "hide", name: "Cured hide", points: 4, mass: 7 },
|
||
{ key: "mail", name: "Mail", points: 5, covers: "torsoLimbs", mass: 9 },
|
||
{ key: "plate", name: "Plate", points: 8, mass: 18 },
|
||
{ key: "impact_vest", name: "Impact vest", points: 6, covers: "torso", mass: 3, trad: "tradition_agency" },
|
||
{ key: "breach_suit", name: "Breaching suit", points: 7, mass: 11, trad: "tradition_agency" },
|
||
{ key: "envsuit", name: "Environment suit", points: 4, mass: 8, trad: "tradition_agency" },
|
||
{ key: "salvage_plate", name: "Salvaged crossing plate", points: 10, mass: 11, trad: "tradition_transposed", coherence: 1 },
|
||
|
||
{ key: "oilcloth_coat", name: "Oilcloth coat", points: 1, covers: "torsoLimbs", mass: 3.0, era: "antique", trad: "tradition_local", desc: "Keeps the weather out and very little else." },
|
||
{ key: "brigandine", name: "Brigandine", points: 4, covers: "torso", mass: 9.0, era: "antique", trad: "tradition_local", desc: "Plates riveted between cloth. Heavy, quiet, and older than the agency." },
|
||
{ key: "hardsuit", name: "Sealed hardsuit", points: 9, mass: 12.0, era: "future", trad: "tradition_transposed", desc: "Sealed, powered and not from here. Also a breathing set — see Gear." },
|
||
|
||
/* --- the historical range. Weight is the point: everything here protects
|
||
well and costs you the ability to run in it. --- */
|
||
{ key: "gambeson", name: "Gambeson", points: 2, covers: "torsoArms", mass: 4.5, era: "antique", trad: "tradition_local", desc: "Medieval. Quilted linen, thirty layers. Worn alone by the poor and under everything by everyone else." },
|
||
{ key: "maille_shirt", name: "Maille shirt", points: 4, covers: "torsoArms", mass: 7.5, era: "antique", trad: "tradition_local", desc: "Medieval. Stops a cut completely and a spike not at all. Wear it over the gambeson or regret it." },
|
||
{ key: "coat_of_plates", name: "Coat of plates", points: 6, covers: "torso", mass: 11, era: "antique", trad: "tradition_local", desc: "Medieval. Iron plates riveted inside a fabric coat. The compromise that held for a century." },
|
||
{ key: "cuirass", name: "Cuirass", points: 6, covers: "torso", mass: 9, era: "antique", trad: "tradition_local", desc: "Early modern. Breast and back. Proof against a pistol at any sensible distance, and stated so by the armourer." },
|
||
{ key: "harness", name: "Full harness", points: 9, mass: 25, era: "antique", trad: "tradition_local", desc: "Medieval. Head to foot, articulated, and far more wearable than people think — until the third hour." },
|
||
{ key: "buff_coat", name: "Buff coat", points: 3, covers: "torsoLimbs", mass: 5, era: "antique", trad: "tradition_local", desc: "Civil War. Thick ox hide to the knee. Turns a sword, ignores a ball, and never dries out." },
|
||
{ key: "sallet", name: "Sallet and bevor", points: 5, covers: "head", mass: 3.2, era: "antique", trad: "tradition_local", desc: "Medieval. Covers the head and the throat and takes most of your hearing with it." },
|
||
{ key: "lobster_pot", name: "Lobster-tail helmet", points: 4, covers: "head", mass: 2.6, era: "antique", trad: "tradition_local", desc: "Civil War. Three bars across the face. You can see out; that is all that can be said for it." },
|
||
{ key: "jack_of_plate", name: "Jack of plate", points: 4, covers: "torso", mass: 6, era: "antique", trad: "tradition_local", desc: "Tudor. Small iron plates stitched between canvas. Looks like a coat until somebody hits it." },
|
||
{ key: "cuirassier", name: "Cuirassier armour", points: 8, covers: "torsoArms", mass: 18, era: "antique", trad: "tradition_local", desc: "Early modern. Three-quarter plate for a man on a horse. On foot it is a punishment." },
|
||
{ key: "brodie", name: "Brodie helmet", points: 3, covers: "head", mass: 1.3, era: "antique", trad: "tradition_local", desc: "Great War. A steel plate on a strap. Designed against shrapnel from above and honest about it." },
|
||
{ key: "flak_jacket", name: "Flak jacket", points: 4, covers: "torso", mass: 8.5, era: "antique", trad: "tradition_local", desc: "Second War. Manganese plates in a waistcoat. Heavy, hot, and it has saved a great many people." }
|
||
];
|
||
|
||
/* ---------- gear ---------- */
|
||
/* ============================================================================
|
||
VEHICLES
|
||
|
||
The department has a transport pool, and a great deal of what is in it should
|
||
have been written off. Hull is the vehicle's own hit points; armour protects
|
||
whoever is inside it. Speed is a band because the game measures distance in
|
||
bands everywhere else, and a figure in km/h would be the only number on the
|
||
sheet nobody ever used.
|
||
|
||
Some of these are not ours. A vehicle brought back through a crossing carries a
|
||
Coherence cost like any other transposed materiel, and the ones that do are the
|
||
ones worth the paperwork.
|
||
============================================================================ */
|
||
export const VEHICLES = [
|
||
/* --- the pool, such as it is --- */
|
||
{ key: "pool_car", name: "Pool car", fam: "pilot", spec: "ground_car",
|
||
crew: 1, seats: 4, cargo: 80, speed: "road", range: 500, hull: 18, armour: 1, mass: 1200,
|
||
terrain: ["road"], desc: "Grey saloon, four years old, ashtray full. Anonymous to the point of being conspicuous to anyone looking for anonymous cars." },
|
||
{ key: "pool_van", name: "Custodian van", fam: "pilot", spec: "ground_car",
|
||
crew: 1, seats: 3, cargo: 900, speed: "road", range: 420, hull: 26, armour: 2, mass: 2100,
|
||
terrain: ["road"], desc: "Panel van with a cage bulkhead and no windows in the back. Everything the department has ever contained has been in one of these." },
|
||
{ key: "land_rover", name: "Long-wheelbase utility", fam: "pilot", spec: "ground_car",
|
||
crew: 1, seats: 6, cargo: 600, speed: "cross", range: 550, hull: 30, armour: 3, mass: 2400,
|
||
terrain: ["road","rough","mud"], desc: "Goes where the pool car will not and tells you about it the whole way." },
|
||
{ key: "site_lorry", name: "Containment lorry", fam: "pilot", spec: "ground_car",
|
||
crew: 2, seats: 3, cargo: 6000, speed: "road", range: 700, hull: 44, armour: 4, mass: 9000,
|
||
terrain: ["road"], desc: "A sealed box on wheels with its own power and its own drain. Whatever is in the back is not to be discussed." },
|
||
{ key: "motorcycle", name: "Dispatch motorcycle", fam: "pilot", spec: "ground_car",
|
||
crew: 1, seats: 2, cargo: 20, speed: "fast", range: 260, hull: 8, armour: 0, mass: 190,
|
||
terrain: ["road","rough"], desc: "Faster than the traffic and much faster than the paperwork. No protection whatsoever." },
|
||
|
||
/* --- water and air --- */
|
||
{ key: "launch", name: "River launch", fam: "pilot", spec: "ground_car",
|
||
crew: 1, seats: 6, cargo: 400, speed: "slow", range: 180, hull: 24, armour: 1, mass: 1800,
|
||
terrain: ["water"], desc: "Diesel launch with a shallow draught. Most of the department's older sites are on water, because most of them are drains." },
|
||
{ key: "helicopter", name: "Light helicopter", fam: "pilot", spec: "aircraft",
|
||
crew: 1, seats: 4, cargo: 250, speed: "air", range: 600, hull: 22, armour: 1, mass: 1400,
|
||
terrain: ["air"], desc: "Gets a wounded team off a site in twenty minutes. Announces the department to everyone within three miles." },
|
||
|
||
/* --- ANTIQUE: still on the inventory --- */
|
||
{ key: "hand_cart", name: "Hand cart", fam: "pilot", spec: "ground_car",
|
||
crew: 1, seats: 0, cargo: 250, speed: "walk", range: 20, hull: 10, armour: 0, mass: 90,
|
||
era: "antique", terrain: ["road","rough"], desc: "Two wheels and a pair of shafts. Has moved more contained materiel than any motor vehicle in the department's history." },
|
||
{ key: "trap", name: "Pony and trap", fam: "pilot", spec: "ground_car",
|
||
crew: 1, seats: 3, cargo: 200, speed: "slow", range: 45, hull: 14, armour: 0, mass: 400,
|
||
era: "antique", terrain: ["road","rough"], desc: "Requires feeding and does not start on request, but it will go where a motor will not and it does not announce itself." },
|
||
|
||
/* --- FUTURE: brought back from somewhere ahead --- */
|
||
{ key: "flycycle", name: "Flycycle", fam: "pilot", spec: "aircraft",
|
||
crew: 1, seats: 2, cargo: 60, speed: "air", range: 900, hull: 10, armour: 1, mass: 210,
|
||
era: "future", terrain: ["air","road","rough","water"], desc: "A saddle, a field housing and no visible means of support. Silent, and it does not care what the ground underneath it is doing." },
|
||
{ key: "lifter", name: "Cargo lifter", fam: "pilot", spec: "aircraft",
|
||
crew: 1, seats: 2, cargo: 4000, speed: "slow", range: 300, hull: 34, armour: 3, mass: 1900,
|
||
era: "future", terrain: ["air","water"], desc: "A flatbed that ignores gravity for as long as the cells hold. Lifts a containment box out of a shaft in one piece." },
|
||
{ key: "crawler", name: "Sealed crawler", fam: "pilot", spec: "ground_car",
|
||
crew: 2, seats: 6, cargo: 1200, speed: "cross", range: 1400, hull: 52, armour: 8, mass: 7000,
|
||
era: "future", terrain: ["road","rough","mud","water","vacuum"], desc: "Its own air, its own water and eleven days of both. Built for somewhere that is not here, and it shows." },
|
||
|
||
/* --- ANOMALOUS: it came back with us --- */
|
||
{ key: "stepping_frame", name: "The stepping frame", fam: "pilot", spec: "ground_car",
|
||
crew: 1, seats: 1, cargo: 120, speed: "instant", range: 0, hull: 12, armour: 0, mass: 45,
|
||
era: "anomalous", trad: "tradition_transposed", coherence: 2, terrain: ["anywhere"],
|
||
desc: "A doorframe on a pallet. Step through and you are at the other frame, wherever it was left. Costs 2 Coherence per crossing, and the department owns only two frames." },
|
||
{ key: "wrong_carriage", name: "The carriage that is already there", fam: "pilot", spec: "ground_car",
|
||
crew: 1, seats: 4, cargo: 300, speed: "road", range: 999, hull: 20, armour: 2, mass: 1500,
|
||
era: "anomalous", trad: "tradition_transposed", coherence: 1, desc: "It is parked outside wherever you were going to go, and it was parked there before you decided. Costs 1 Coherence to admit you noticed." },
|
||
/* --- SPACECRAFT. Crewed by stations, not by a pilot. --- */
|
||
{ key: "cutter_ship", name: "Departmental cutter", fam: "pilot", spec: "aircraft",
|
||
crew: 2, seats: 8, cargo: 3000, speed: "air", range: 0, hull: 20, armour: 4, mass: 40000,
|
||
era: "future", spacecraft: true, hullMax: 20, terrain: ["air","vacuum","water"],
|
||
desc: "Grey, unmarked, and older than anybody aboard. Eight chairs and every one of them is a station." },
|
||
{ key: "picket", name: "Picket", fam: "pilot", spec: "aircraft",
|
||
crew: 1, seats: 4, cargo: 400, speed: "air", range: 0, hull: 12, armour: 3, mass: 9000,
|
||
era: "future", spacecraft: true, hullMax: 12, terrain: ["air","vacuum"],
|
||
desc: "Fast, thin, and meant to look at something and come back. It is not meant to fight and frequently must." },
|
||
{ key: "lighter", name: "Heavy lighter", fam: "pilot", spec: "aircraft",
|
||
crew: 2, seats: 6, cargo: 20000, speed: "slow", range: 0, hull: 30, armour: 6, mass: 90000,
|
||
era: "future", spacecraft: true, hullMax: 30, terrain: ["air","vacuum"],
|
||
desc: "A container with engines. It cannot run and does not need to; the hull is the plan." },
|
||
{ key: "revenue_boat", name: "Revenue boat", fam: "pilot", spec: "aircraft",
|
||
crew: 2, seats: 6, cargo: 1200, speed: "fast", range: 0, hull: 16, armour: 5, mass: 22000,
|
||
era: "future", spacecraft: true, hullMax: 16, terrain: ["air","vacuum"],
|
||
desc: "Built to stop other people's ships and search them. Everything about it is designed to arrive alongside." },
|
||
{ key: "long_hull", name: "The long hull", fam: "pilot", spec: "aircraft",
|
||
crew: 1, seats: 12, cargo: 8000, speed: "slow", range: 0, hull: 40, armour: 8, mass: 200000,
|
||
era: "anomalous", trad: "tradition_transposed", coherence: 2, spacecraft: true, hullMax: 40,
|
||
terrain: ["air","vacuum","anywhere"],
|
||
desc: "It was here when the department arrived and it answers to the chair, not the crew. Costs 2 Coherence to take out and it has never been fully mapped." }
|
||
];
|
||
|
||
export const GEAR = [
|
||
{ key: "field_kit", name: "Field analysis kit", mass: 9, facility: "portable", desc: "A laboratory in a case. Laboratory analysis steps at −20%." },
|
||
{ key: "handset", name: "Agency handset", mass: 0.3, desc: "Encrypted comms and case files. Desk analysis steps take 20% fewer hours. No signal while across." },
|
||
{ key: "trauma_unit", name: "Trauma unit", mass: 14, desc: "Vehicle-mounted. Restores 1 hit point every 2 hours. Cannot reverse characteristic loss." },
|
||
{ key: "fieldmedic", name: "Field medic pack", mass: 1.2, desc: "Restores 1 hit point every 4 hours and stabilises the dying. Cannot reverse characteristic loss." },
|
||
{ key: "medkit", name: "Medical kit", mass: 2, bonus: { fam: "first_aid", value: 20 }, desc: "+20% to First Aid." },
|
||
{ key: "toolkit", name: "Technician's toolkit",mass: 8, desc: "Required for most Repair work in the field." },
|
||
{ key: "scanner", name: "Ground scanner", mass: 1.5, desc: "Sees through soil and rock. Returns nothing at all through transposed alloy." },
|
||
{ key: "power_cell", name: "Power cell", mass: 0.6, desc: "One cell. Restores 1 Resources to the case file track." },
|
||
{ key: "cover_id", name: "Cover identity pack", mass: 0.2, bonus: { fam: "persuade", value: 10 }, desc: "Documents, history and a phone that answers. +10% to Persuade while the cover holds. Paper helps; it is the training that sells it." },
|
||
{ key: "anchor", name: "Personal anchor", mass: 0.1, desc: "Something that remembers you as you were. Restores 1 Coherence per period of downtime spent with it." },
|
||
{ key: "key", name: "Crossing key", mass: 0.4, trad: "tradition_transposed", coherence: 1, desc: "Opens a path without a scheduled window. Costs 1 Coherence each time it is used." },
|
||
/* --- standard agency issue: what every case draws from stores --- */
|
||
{ key: "torch", name: "Field lamp", mass: 0.5, lit: true, reach: 10, desc: "Sealed, sixty hours. Lights ten metres of whatever this is — you and anyone standing in it with you. Buys the dark back to dim, and tells the dark exactly where all of you are." },
|
||
{ key: "rope", name: "Line and harness", mass: 3.5, bonus: { fam: "athletics", value: 20 }, desc: "+20% Athletics for any climb or descent." },
|
||
{ key: "rations", name: "Ration pack (3 days)", mass: 2.4, desc: "Restores 1 Resource to the case when shared by the whole team." },
|
||
{ key: "water", name: "Filter flask", mass: 0.9, desc: "Makes almost anything drinkable. Almost." },
|
||
{ key: "camera", name: "Evidence camera", mass: 0.8, desc: "Stills and thirty minutes of video. Required to log a Discovery for publication." },
|
||
{ key: "sample_case", name: "Sample case", mass: 2.2, bonus: { fam: "science", value: 10 }, desc: "Sealed, inert and shielded. +10% to any Science roll on what is inside it." },
|
||
{ key: "restraints", name: "Restraints", mass: 0.6, desc: "Four sets. Containment is easier when the anomaly has wrists." },
|
||
{ key: "beacon", name: "Recovery beacon", mass: 1.1, desc: "Marks a position for extraction. The agency will find the beacon; whether it finds you is a separate question." },
|
||
{ key: "binocs", name: "Field glasses", mass: 0.7, bonus: { fam: "spot", value: 20 }, desc: "+20% Spot at long range." },
|
||
{ key: "notebook", name: "Case notebook", mass: 0.3, bonus: { fam: "research", value: 10 }, desc: "Paper. It works everywhere, which is more than can be said for the handset. +10% Research." },
|
||
{ key: "geiger", name: "Radiation counter", mass: 1.0, desc: "Clicks. Some worlds need it and do not look as though they do." },
|
||
{ key: "climbing_kit", name: "Breaching charges", mass: 2.8, bonus: { fam: "demolition", value: 15 }, desc: "Four shaped charges. +15% Demolition." },
|
||
{ key: "spare_cells", name: "Cell bandolier", mass: 2.4, desc: "Four power cells, carried where you can reach them." },
|
||
{ key: "survey_kit", name: "Survey kit", mass: 4.0, bonus: { fam: "navigate", value: 15 }, facility: "portable", desc: "Theodolite, chains and a very stubborn compass. +15% Navigate." },
|
||
{ key: "ward", name: "Ward plate", mass: 0.9, trad: "tradition_transposed", coherence: 1, desc: "Transposed. While carried you cannot be misidentified by anything that hunts by identity. Costs 1 Coherence per case carried." },
|
||
|
||
/* ---------- ANTIQUE ---------- */
|
||
{ key: "oil_lantern", name: "Oil lantern", mass: 1.4, era: "antique", desc: "Burns four hours on a fill. Visible for a mile, which is the problem." },
|
||
{ key: "tallow_candle", name: "Tallow candles", mass: 0.4, era: "antique", quantity: 6, desc: "Six. They gutter in a draught, which is how you find one." },
|
||
{ key: "brass_compass", name: "Brass compass", mass: 0.2, era: "antique", bonus: { fam: "navigate", value: 10 }, desc: "+10% Navigate. Unbothered by whatever is eating the handset." },
|
||
{ key: "pocket_watch", name: "Pocket watch", mass: 0.15, era: "antique", desc: "Mechanical. It keeps our time, which is how you notice the local time disagreeing." },
|
||
{ key: "spectacles", name: "Reading spectacles",mass: 0.05, era: "antique", bonus: { fam: "research", value: 5 }, desc: "+5% Research. Also the difference between reading a ledger and not." },
|
||
{ key: "chirurgeon_kit",name: "Chirurgeon's roll", mass: 1.8, era: "antique", bonus: { fam: "first_aid", value: 10 }, desc: "+10% First Aid. Boiled, not sterile. Better than nothing and worse than a medkit." },
|
||
{ key: "wax_tablet", name: "Wax tablet", mass: 0.6, era: "antique", desc: "Notes that cannot be recovered by anyone who finds the body." },
|
||
{ key: "iron_manacles", name: "Iron manacles", mass: 2.2, era: "antique", desc: "Custody, in the oldest sense the agency uses the word." },
|
||
|
||
/* ---------- MODERN ---------- */
|
||
{ key: "gas_mask", name: "Respirator", mass: 1.1, era: "modern", desc: "Filters particulates and most of what a Hollow world has instead of air." },
|
||
{ key: "evidence_tape", name: "Evidence tape", mass: 0.3, era: "modern", desc: "Seals a scene. Costs nothing and saves a Containment point more often than anything else in the pack." },
|
||
{ key: "dictaphone", name: "Dictaphone", mass: 0.4, era: "modern", desc: "Records the debrief while it is still true. Tape, so it survives a crossing." },
|
||
|
||
/* ---------- FUTURE ---------- */
|
||
{ key: "survey_drone", name: "Survey drone", mass: 1.6, era: "future", bonus: { fam: "spot", value: 20 }, desc: "+20% Spot. Forty minutes of flight and no idea what it is looking at." },
|
||
{ key: "optic_visor", name: "Optic visor", mass: 0.5, era: "future", bonus: { fam: "spot", value: 15 }, desc: "+15% Spot, and it sees in the dark. It also annotates things that are not there." },
|
||
{ key: "data_wafer", name: "Data wafer", mass: 0.02, era: "future", desc: "Somebody's whole archive. Unreadable without a reader nobody here has built." },
|
||
{ key: "breather", name: "Rebreather", mass: 0.8, era: "future", desc: "Six hours of air from nothing. The agency would like to know how." },
|
||
{ key: "sealed_cannister", name: "Stasis cannister", mass: 2.4, era: "future", bonus: { fam: "science", value: 15 }, desc: "+15% Science on whatever is inside. Nothing in it changes, including decay." },
|
||
{ key: "field_net", name: "Containment net", mass: 3.0, era: "future", desc: "Non-lethal custody for something that will not fit in manacles." },
|
||
|
||
/* ---------- ANOMALOUS ---------- */
|
||
{ key: "threshold_key", name: "Threshold key", mass: 0.3, era: "anomalous", coherence: 1, desc: "Finds the nearest crossing point and opens it a hand's width. Costs 1 Coherence each time." },
|
||
{ key: "quiet_ledger", name: "The quiet ledger", mass: 0.9, era: "anomalous", coherence: 1, desc: "Writes down what happened. Sometimes before it has. Costs 1 Coherence to read the last page." },
|
||
|
||
/* ------------------------------------------------------------------
|
||
STANDING ISSUE and the rest of the stores.
|
||
|
||
An agency this old issues a great deal of small equipment, most of it
|
||
dull, some of it older than the department. Everything here is light
|
||
unless it says otherwise: an officer is expected to carry the lot and
|
||
still be able to run.
|
||
------------------------------------------------------------------ */
|
||
|
||
/* --- what every officer is issued --- */
|
||
{ key: "warrant_card", name: "Warrant card", mass: 0.05, desc: "Identifies you as an officer of a department the holder is not permitted to name. Opens most doors, and closes some." },
|
||
{ key: "dressings", name: "Field dressings", mass: 0.3, desc: "Two pads and a crepe bandage. Enough for a First Aid roll; not enough for a second." },
|
||
{ key: "chalk", name: "Marking chalk", mass: 0.1, desc: "Blue for what is safe, yellow for what is not, red for what has moved since you marked it." },
|
||
{ key: "whistle", name: "Whistle", mass: 0.05, desc: "Carries where a handset does not. Three blasts means come out, whatever you are doing." },
|
||
|
||
/* --- paperwork, which is most of the job --- */
|
||
{ key: "carbon_book", name: "Carbon duplicate book", mass: 0.4, desc: "Every form in triplicate. The third copy goes to Registry and is never seen again." },
|
||
{ key: "date_stamp", name: "Date stamp and pad", mass: 0.3, desc: "Stamps the date. Occasionally stamps a different one, which is itself reportable." },
|
||
{ key: "seals", name: "Numbered seals", mass: 0.4, desc: "Ten wire seals, consecutively numbered. Breaking one out of order is a paperwork offence." },
|
||
{ key: "cordon_kit", name: "Cordon tape and signs", mass: 2.2, desc: "Two hundred metres of tape and four signs citing an Act that does not exist." },
|
||
{ key: "clipboard", name: "Clipboard", mass: 0.4, desc: "Nobody stops a person carrying a clipboard. This is not a joke and is in the manual." },
|
||
|
||
/* --- fitted to the weapon: these apply themselves off the range band --- *
|
||
* A sight is not a flat bonus. It is ground for a distance, and it is a liability
|
||
* at the others — which is why the telescopic sight costs you inside ten metres
|
||
* and why nobody sensibly carries all four. */
|
||
{ key: "sight_irons", name: "Aperture sights", mass: 0.2, optic: "irons", fits: "any",
|
||
desc: "+5% short and medium. Iron, unbreakable, and no help at all past a hundred metres." },
|
||
{ key: "sight_reflex", name: "Reflex sight", mass: 0.3, optic: "reflex", fits: "any",
|
||
desc: "+10% short, +5% medium, nothing long, -10% extreme. Both eyes open, for rooms and corridors." },
|
||
{ key: "sight_scope", name: "Telescopic sight", mass: 0.7, optic: "telescopic", fits: "rifle",
|
||
desc: "-10% short, +5% medium, +15% long, +20% extreme. Rifles only. The penalty up close is the whole point of it." },
|
||
{ key: "sight_thermal", name: "Thermal sight", mass: 1.1, optic: "thermal", fits: "rifle", era: "future",
|
||
desc: "+5% out to long range, and the dark stops mattering — without a lamp to announce you. Rifles only." },
|
||
{ key: "weapon_lamp", name: "Weapon lamp", mass: 0.2, lit: true, reach: 6,
|
||
desc: "Clamps under the barrel. Buys the dark back to dim, and points at whatever you are pointing at." },
|
||
|
||
/* --- looking at things --- */
|
||
{ key: "uv_lamp", name: "Ultraviolet lamp", mass: 0.6, desc: "Shows what has been cleaned up and what has been written on the walls in the meantime." },
|
||
{ key: "signal_mirror", name: "Signalling mirror", mass: 0.1, desc: "For line of sight without a signal. Also shows you what is behind you, which is the more common use." },
|
||
{ key: "probe", name: "Ground probe", mass: 1.4, desc: "A metre of graduated steel. Finds voids, and finds out how deep they are." },
|
||
{ key: "thermometer", name: "Recording thermometer", mass: 0.3, desc: "Anomalies are usually cold. This is how you prove it to Registry." },
|
||
{ key: "stopwatch", name: "Stopwatch", mass: 0.1, desc: "Times things. Occasionally disagrees with a second stopwatch, which is the finding." },
|
||
{ key: "specimen_jars", name: "Specimen jars", mass: 1.1, desc: "Six, with rubber seals and adhesive labels. Do not reuse a label." },
|
||
{ key: "swab_kit", name: "Swab kit", mass: 0.4, desc: "Sterile swabs and a chain-of-custody sleeve for each." },
|
||
|
||
/* --- getting in, and out --- */
|
||
{ key: "lock_rakes", name: "Lock rakes", mass: 0.2, desc: "Issued, logged, and signed for. Losing a set is a longer form than losing a firearm." },
|
||
{ key: "bolt_croppers", name: "Bolt croppers", mass: 3.4, desc: "Six hundred millimetre. Goes through a padlock, a hasp, and most railings." },
|
||
{ key: "master_keys", name: "Master key ring", mass: 0.5, desc: "Council, water board, railway, and three the ring has always had." },
|
||
{ key: "door_wedges", name: "Door wedges", mass: 0.3, desc: "Rubber. Keeps a door open behind you, which matters more than opening it did." },
|
||
{ key: "groundsheet", name: "Groundsheet", mass: 1.6, desc: "Waxed canvas. For lying on, wrapping, or covering what should not be photographed." },
|
||
|
||
/* --- keeping going --- */
|
||
{ key: "vacuum_flask", name: "Vacuum flask", mass: 0.9, desc: "Tea. The single most requisitioned item in the department's history." },
|
||
{ key: "blanket", name: "Foil blanket", mass: 0.15, desc: "For shock, for cold, and for the ones you bring back who are not talking yet." },
|
||
{ key: "analgesics", name: "Analgesic ampoules", mass: 0.2, desc: "Three doses. Takes the edge off a Major Wound; does not mend it." },
|
||
{ key: "wake_tablets", name: "Wakefulness tablets", mass: 0.1, desc: "For the second night. There is a form for the third night and it is not usually granted." },
|
||
{ key: "barrier_gloves", name: "Barrier gloves", mass: 0.2, desc: "You do not touch anything on a site with your hands. Ever. This is the whole of the training." },
|
||
{ key: "ear_defenders", name: "Ear defenders", mass: 0.4, desc: "Against gunfire, machinery, and the third category the manual declines to name." },
|
||
{ key: "site_overalls", name: "Site overalls", mass: 1.2, desc: "Grey, unbadged, and burned afterwards if the site requires it." },
|
||
|
||
/* --- ANTIQUE: postings the agency never got round to abolishing --- */
|
||
{ key: "tinderbox", name: "Tinderbox", mass: 0.3, era: "antique", desc: "Flint, steel and char cloth. Works in weather that defeats a lighter." },
|
||
{ key: "quill_ink", name: "Quill and ink horn", mass: 0.4, era: "antique", desc: "The Registry still accepts entries made in iron gall, and prefers them." },
|
||
{ key: "sealing_wax", name: "Sealing wax and signet", mass: 0.3, era: "antique", desc: "A seal that has been broken cannot be made to look unbroken. That is the point of it." },
|
||
{ key: "spyglass", name: "Spyglass", mass: 0.7, era: "antique", desc: "Brass, three draw. Shorter range than field glasses and considerably harder to lose." },
|
||
{ key: "lamp_oil", name: "Flask of lamp oil", mass: 1.1, era: "antique", desc: "Four hours of lantern, or one very committed diversion." },
|
||
{ key: "laudanum", name: "Bottle of laudanum", mass: 0.3, era: "antique", desc: "Stops the screaming. Does not distinguish between kinds of screaming." },
|
||
{ key: "lodestone", name: "Lodestone", mass: 0.4, era: "antique", desc: "Points north. When it does not, you write down which way it does point." },
|
||
{ key: "sand_glass", name: "Sand glass", mass: 0.6, era: "antique", desc: "Half an hour. Does not stop, cannot be tampered with, and has settled more disputes than the pocket watch." },
|
||
|
||
/* --- FUTURE: brought back from somewhere ahead --- */
|
||
{ key: "wound_foam", name: "Wound foam", mass: 0.4, era: "future", desc: "Seals and packs a wound in four seconds. Getting it out again is a hospital's problem." },
|
||
{ key: "cold_light", name: "Cold light strips", mass: 0.3, era: "future", lit: true, reach: 4, desc: "Twelve strips, forty hours each, no heat and no battery. Four metres — your own hands and whoever is beside you. Mark your route in." },
|
||
{ key: "field_slate", name: "Field slate", mass: 0.5, era: "future", desc: "Reads, writes and files. Will not connect to anything here, which Registry considers a feature." },
|
||
{ key: "locator_tags", name: "Locator tags", mass: 0.2, era: "future", desc: "Twenty. Tag a person, a door, or a thing you intend to find again." },
|
||
{ key: "density_scanner", name: "Handheld density scanner", mass: 1.1, era: "future", desc: "Reads through two metres of brick. Reads nothing at all through a crossing." },
|
||
{ key: "seal_foam", name: "Sealing foam", mass: 1.3, era: "future", desc: "Fills and hardens a gap up to a metre across in under a minute. Airtight. Not always enough." },
|
||
{ key: "assist_sleeve", name: "Assist sleeve", mass: 2.6, era: "future", desc: "Powered forearm brace. Doubles what one arm can lift and halves how long the arm lasts." },
|
||
|
||
/* --- ANOMALOUS: transposed, and priced in Coherence --- */
|
||
{ key: "black_mirror", name: "The black mirror", mass: 0.7, era: "anomalous", trad: "tradition_transposed", coherence: 1, desc: "Shows the room as it was at some point when you were not in it. Costs 1 Coherence to look twice." },
|
||
{ key: "wrong_compass", name: "The compass that points elsewhere", mass: 0.3, era: "anomalous", trad: "tradition_transposed", coherence: 1, desc: "Not north. It points at the nearest crossing, and it does not care what is between you and it." },
|
||
{ key: "returning_coin", name: "The coin that comes back", mass: 0.02, era: "anomalous", trad: "tradition_transposed", coherence: 1, desc: "Spend it, drop it, bury it. It is in your pocket in the morning. Costs 1 Coherence each time you notice." },
|
||
{ key: "attendance_register", name: "The attendance register", mass: 1.1, era: "anomalous", trad: "tradition_transposed", coherence: 1, desc: "Lists who is present. It is right, and it is not always a list you want." },
|
||
{ key: "handbell", name: "The handbell", mass: 0.6, era: "anomalous", trad: "tradition_transposed", coherence: 1, desc: "Rings a half second before it is struck. Whatever is coming hears the first ring." },
|
||
|
||
/* ------------------------------------------------------------------
|
||
TRANSPORT STORES — what rides in the boot
|
||
------------------------------------------------------------------ */
|
||
{ key: "tow_line", name: "Tow line and shackles", mass: 6.4, desc: "Nine metres, rated well above anything the pool owns. Recovers a vehicle, a container, or an agent from a shaft." },
|
||
{ key: "jack_plates", name: "Jack and sand plates", mass: 8.2, desc: "For the mud the site is always in. Two plates, one bottle jack, and twenty minutes you did not have." },
|
||
{ key: "jerry_can", name: "Jerry can", mass: 22, desc: "Twenty litres. Heavy, and the difference between a debrief and a long walk." },
|
||
{ key: "vehicle_spares", name: "Vehicle spares roll", mass: 5.1, desc: "Belts, hose, fuses, wire and tape. A Repair (Mechanical) roll has something to work with." },
|
||
{ key: "wheel_clamps", name: "Wheel clamps", mass: 7.0, desc: "Stops a vehicle leaving. Occasionally stops one that was not going to be driven." },
|
||
{ key: "vehicle_log", name: "Vehicle log book", mass: 0.3, desc: "Mileage, driver, and purpose of journey. The single most audited document in the department." },
|
||
{ key: "roof_lamp", name: "Roof searchlight", mass: 4.5, lit: true, reach: 30, desc: "Clamps to a roof rail and runs off the vehicle. Thirty metres, and everyone standing in it — and it tells the field where all of you are." },
|
||
{ key: "recovery_strop", name: "Recovery strop", mass: 3.2, desc: "Webbing, not steel — it does not whip when it parts. The department learned this the expensive way." },
|
||
|
||
/* ------------------------------------------------------------------
|
||
THE FORWARD STORES
|
||
|
||
Materiel from further along than we are. It works, mostly, and Registry
|
||
has a standing instruction that none of it is to be issued to a
|
||
probationary officer.
|
||
------------------------------------------------------------------ */
|
||
{ key: "stepping_disc", name: "Stepping disc", mass: 3.8, era: "future", trad: "tradition_transposed", coherence: 2, desc: "A flat disc a metre across. Step on, and step off the paired disc wherever it was left. Costs 2 Coherence, and the department has four discs and no spares." },
|
||
{ key: "stasis_box", name: "Stasis box", mass: 11, era: "future", trad: "tradition_transposed", coherence: 1, desc: "Nothing inside it changes, including how long it has been in there. The standard container for anything that is still doing something." },
|
||
{ key: "autodoc", name: "Field autodoc", mass: 24, era: "future", desc: "Diagnoses, seals and transfuses without an operator. Grants a Medicine roll to a team with nobody qualified to make one." },
|
||
{ key: "impact_suit", name: "Impact liner", mass: 2.4, era: "future", desc: "Goes under the clothes. Stiffens the instant it is struck and is limp again a second later." },
|
||
{ key: "shadow_cloth", name: "Shadow cloth", mass: 1.2, era: "future", desc: "Takes the colour and the light of whatever is behind it, a half second late. Stealth at a walk; useless at a run." },
|
||
{ key: "grav_harness", name: "Descent harness", mass: 5.6, era: "future", desc: "Falls at whatever speed you tell it to, down to nothing. Makes a shaft a staircase and a cliff a decision." },
|
||
{ key: "sonic_probe", name: "Sonic probe", mass: 0.7, era: "future", desc: "Opens the mechanical fastening of anything that has one. It is not subtle and everyone in the room hears it." },
|
||
{ key: "pressure_tent", name: "Pressure tent", mass: 13, era: "future", desc: "Two rooms and an airlock, out of a bag. Holds an atmosphere the local one disagrees with for eleven days." },
|
||
{ key: "cell_stack", name: "Cell stack", mass: 4.0, era: "future", desc: "Runs the lifter, the crawler or the autodoc for a week. Warm to the touch, always, which nobody has explained." },
|
||
{ key: "translator_pin", name: "Translator pin", mass: 0.05, era: "future", desc: "Renders speech both ways after about a minute of listening. It renders meaning, not manner, and the difference has started arguments." },
|
||
{ key: "medical_ram", name: "Trauma ampoules", mass: 0.5, era: "future", desc: "Three. Brings an agent at zero hit points back to one, once. The department requires a form before and a hearing after." },
|
||
{ key: "hull_patch", name: "Hull patch kit", mass: 3.1, era: "future", desc: "Seals a hole in a vehicle, a wall, or a suit. Sets in ninety seconds and is stronger than what it is patching." },
|
||
{ key: "beacon_hard", name: "Hardened beacon", mass: 1.4, era: "future", desc: "Transmits position through rock, water and most of what a crossing does to a signal. Runs for a year." },
|
||
{ key: "sensor_stakes", name: "Sensor stakes", mass: 2.8, era: "future", desc: "Eight. Driven into a perimeter, they report anything crossing the line and what direction it was going." },
|
||
|
||
/* ------------------------------------------------------------------
|
||
Further out still, and correspondingly worse for you
|
||
------------------------------------------------------------------ */
|
||
{ key: "general_hull", name: "Sealed sphere", mass: 19, era: "anomalous", trad: "tradition_transposed", coherence: 2, desc: "A container nothing has yet opened from outside, including the department. Whatever is inside it was put there by somebody who meant it. Costs 2 Coherence to carry." },
|
||
{ key: "pleasure_tap", name: "The contentment tap", mass: 0.3, era: "anomalous", trad: "tradition_transposed", coherence: 2, desc: "Makes the holder feel that everything is in order. It is not, and the holder will not check. Costs 2 Coherence per use and the department has destroyed six." },
|
||
{ key: "long_ledger", name: "The maintenance log", mass: 1.6, era: "anomalous", trad: "tradition_transposed", coherence: 1, desc: "Records the servicing of a structure nobody has located, in a hand that changes every few centuries. Still being written." }
|
||
];
|
||
|
||
|
||
/* ---------- talents ----------
|
||
Four categories. AGENCY talents are training the Custodians paid for. FIELD
|
||
talents are things you only learn by going across. SPECIES talents are what you
|
||
were born as. ANOMALOUS talents are what the crossing left in you — and every
|
||
one of them costs Coherence, because nothing you pick up over there is free. */
|
||
export const TALENTS = [
|
||
{ key: "ambidextrous", name: "Ambidextrous", cat: "agency", summary: "You were taught to use the other hand and you kept it up.",
|
||
rule: "Two-weapon fighting costs you nothing in the main hand and −20% in the off hand instead of −20%/−40%. It does not let you pair anything heavier than 2 kg off-hand; nothing does." },
|
||
// --- agency training ---
|
||
{ key:"cover_work", name:"Cover Work", cat:"agency",
|
||
summary:"You build a legend and live in it.",
|
||
rule:"+20% Persuade while a cover identity holds. A blown cover costs the case 1 Clearance.",
|
||
bonus:{fam:"persuade",value:20} },
|
||
{ key:"clean_scene", name:"Clean Scene", cat:"agency",
|
||
summary:"You leave nothing a coroner would query.",
|
||
rule:"Once per case, cancel one point of Containment loss. Declare it before the phase resolves.",
|
||
uses:1 },
|
||
{ key:"chain_custody",name:"Chain of Custody", cat:"agency",
|
||
summary:"Nothing you carry goes missing, and nothing you carry is unlogged.",
|
||
rule:"Transposed materiel you personally carry costs HALF its Coherence, rounded up. It never costs nothing." },
|
||
{ key:"debriefer", name:"Debriefer", cat:"agency",
|
||
summary:"You are the one who gets it out of people afterwards.",
|
||
rule:"At debrief, one other agent of your choice recovers 1 extra Coherence." },
|
||
{ key:"requisition", name:"Requisition", cat:"agency",
|
||
summary:"You know which form gets it signed today rather than in March.",
|
||
rule:"Once per case, convert 1 Clearance into 2 Resources, or the reverse.", uses:1 },
|
||
// --- field ---
|
||
{ key:"dead_reckon", name:"Dead Reckoning", cat:"field",
|
||
summary:"You can find the way back without instruments.",
|
||
rule:"+20% Navigate. You always know roughly how long the window has left.",
|
||
bonus:{fam:"navigate",value:20} },
|
||
{ key:"read_room", name:"Read the Room", cat:"field",
|
||
summary:"You know when a conversation has turned before it turns.",
|
||
rule:"+20% Insight. On a successful READ you learn one extra fact.",
|
||
bonus:{fam:"insight",value:20} },
|
||
{ key:"first_through",name:"First Through", cat:"field",
|
||
summary:"Somebody has to step across before anyone knows what is there.",
|
||
rule:"Once per fight, act first in the round no matter what anyone rolled. Declare before Reaction is rolled.",
|
||
action:"first" },
|
||
{ key:"triage", name:"Triage", cat:"field",
|
||
summary:"You work out who can be saved, quickly.",
|
||
rule:"+20% First Aid, and your First Aid restores 1 extra hit point.",
|
||
bonus:{fam:"first_aid",value:20} },
|
||
{ key:"hard_landing", name:"Hard Landing", cat:"field",
|
||
summary:"You have arrived badly enough times to be good at it.",
|
||
rule:"Ignore the first 2 points of damage from any fall, collision or bad crossing." },
|
||
// --- species ---
|
||
{ key:"unblinking", name:"Unblinking", cat:"species", species:"vesh",
|
||
summary:"A Vesh has no face to read and does not need to read yours.",
|
||
rule:"Immune to intimidation. −20% to any attempt to deceive you; −20% to your own Fast Talk." },
|
||
{ key:"out_of_step", name:"Out of Step", cat:"species", species:"vesh",
|
||
summary:"You perceive when you are a little loosely.",
|
||
rule:"Once per fight, take +3 Reaction for that round — a full lane. Declare before Reaction is rolled.",
|
||
action:"outofstep" },
|
||
{ key:"distributed", name:"Distributed", cat:"species", species:"cadence",
|
||
summary:"You are several bodies and one person.",
|
||
rule:"You have no vital location. Each body lost costs the whole person −10% to everything." },
|
||
{ key:"quorum", name:"Quorum", cat:"species", species:"cadence",
|
||
summary:"You can be in more than one conversation.",
|
||
rule:"One additional non-combat action each round, resolved 2 points lower on the Reaction order than your own." },
|
||
// --- anomalous: the crossing left something in you ---
|
||
{ key:"echo_sense", name:"Echo Sense", cat:"anomalous",
|
||
summary:"You feel a threshold before you see one.",
|
||
rule:"You always know if a crossing point is within a kilometre. Using it costs 1 Coherence.",
|
||
coherence:1 },
|
||
{ key:"borrowed_hour",name:"Borrowed Hour", cat:"anomalous",
|
||
summary:"Time gives you a moment it will want back.",
|
||
rule:"Once per case, take an entire extra turn immediately. Costs 2 Coherence.",
|
||
coherence:2, uses:1 },
|
||
{ key:"not_quite_here",name:"Not Quite Here", cat:"anomalous",
|
||
summary:"Sometimes the world forgets to include you.",
|
||
rule:"Once per fight, an attack that would hit you misses instead. Costs 1 Coherence.",
|
||
coherence:1 },
|
||
{ key:"wrong_memory", name:"Wrong Memory", cat:"anomalous",
|
||
summary:"You remember things that have not happened to you.",
|
||
rule:"Once per case, ask the GM one question about a place you have never been. The answer is true somewhere. Costs 1 Coherence.",
|
||
coherence:1, uses:1 }
|
||
];
|
||
|
||
/* ---------- pregenerated explorers (v0.5 §9) ---------- */
|
||
const S = (fam, spec, val) => ({ fam, spec, val });
|
||
|
||
export const PREGENS = [
|
||
{
|
||
key: "ceyla", talents: ["cover_work","read_room","requisition"], name: "Ceyla Marspont",
|
||
chosenStyle: "deliberate",
|
||
ch: { str: 12, siz: 13, con: 13, int: 17, pow: 15, dex: 10, cha: 12, edu: 19 },
|
||
age: { chronological: 44, physiological: 44 },
|
||
rank: "Case Officer", species: "baseline",
|
||
bio: "<p>Case Officer, technical. Twenty years in the analysis wing before anyone let her through a threshold, and she has never entirely stopped writing reports in her head while under fire. She is the slowest of them on her feet and reliably the first to move, because she has usually worked out what is happening a beat before it happens. She decides what the public is allowed to know, and the crossing is the first thing she has met that does not care what she decides.</p><p><em>Her anchor is a landline in her mother's kitchen that still rings.</em></p>",
|
||
skills: [
|
||
S("transposition","",32), S("energy_weapon","pistol",53), S("dodge","",30), S("brawl","",31), S("athletics","",32),
|
||
S("insight","",58), S("tradecraft","",71), S("persuade","",41), S("bargain","",31),
|
||
S("language","trade_cant",95), S("navigate","",28), S("repair","electronics",45),
|
||
S("computer_use","",68), S("engineering","field_systems",61), S("anomaly_lore","",42),
|
||
S("research","",55), S("science","physics",49), S("xenology","baseline",34),
|
||
S("first_aid","",46), S("spot","",41), S("listen","",33)
|
||
],
|
||
weapons: ["lance","pistol_med"], armour: ["impact_vest"],
|
||
gear: ["field_kit","handset","anchor",["power_cell",2]]
|
||
},
|
||
{
|
||
key: "dunn", talents: ["dead_reckon","first_through","echo_sense"], name: "Dunn Halvorsen",
|
||
chosenStyle: "reflex",
|
||
ch: { str: 9, siz: 10, con: 13, int: 10, pow: 11, dex: 18, cha: 11, edu: 15 },
|
||
age: { chronological: 38, physiological: 38 },
|
||
rank: "Senior Field Officer", species: "baseline",
|
||
bio: "<p>Field lead. He crossed for the first time at nineteen, on a screening test he sat for the money, and has crossed more times since than anyone else on the roster. Quick-handed and quietly funny. He does not read a room so much as move through it before it has decided anything, which has worked every time so far.</p><p><em>He is on his third anchor. He does not discuss the first two.</em></p>",
|
||
skills: [
|
||
S("firearm","pistol",59), S("dodge","",49), S("melee_weapon","knife",34), S("athletics","",48),
|
||
S("stealth","",33), S("repair","mechanical",42), S("language","trade_cant",75),
|
||
S("navigate","",67), S("pilot","aircraft",72), S("pilot","ground_car",54),
|
||
S("transposition","",68), S("anomaly_lore","",39), S("spot","",33),
|
||
S("listen","",30), S("first_aid","",37), S("insight","",25), S("tradecraft","",34)
|
||
],
|
||
weapons: ["pistol_med","dagger"], armour: ["soft_armour"], // knife: the melee skill he actually has
|
||
gear: ["scanner","key","cover_id",["power_cell",2]],
|
||
environments: ["zero_g","vacuum"]
|
||
},
|
||
{
|
||
key: "rakhi", talents: ["chain_custody","hard_landing","clean_scene"], name: "Rakhi Oyelaran-Vost",
|
||
chosenStyle: "deliberate",
|
||
ch: { str: 18, siz: 19, con: 10, int: 13, pow: 13, dex: 11, cha: 10, edu: 16 },
|
||
age: { chronological: 41, physiological: 41 },
|
||
rank: "Field Officer", species: "baseline",
|
||
bio: "<p>Technician, and the reason the heavy equipment moves at all. Short, immensely broad, and completely still until she is not. She grew up on a rig in the North Sea, which is where she learned to be careful and get it right the first time — exactly how she shoots.</p>",
|
||
skills: [
|
||
S("transposition","",28), S("firearm","rifle",47), S("melee_weapon","prybar",54), S("brawl","",44), S("dodge","",31),
|
||
S("athletics","",47), S("language","trade_cant",80), S("navigate","",31), S("first_aid","",34),
|
||
S("engineering","field_systems",72), S("repair","mechanical",67), S("repair","electronics",58),
|
||
S("anomaly_lore","",47), S("science","physics",44), S("computer_use","",47),
|
||
S("spot","",47), S("demolition","",29), S("tradecraft","",20)
|
||
],
|
||
weapons: ["rifle_med","prybar"], armour: ["breach_suit"],
|
||
gear: ["toolkit","anchor"], devices: ["crossing_regulator"]
|
||
},
|
||
{
|
||
key: "tomas", talents: ["triage","debriefer","read_room"], name: "Tomas Ekwueme",
|
||
chosenStyle: "reflex",
|
||
ch: { str: 13, siz: 12, con: 14, int: 15, pow: 12, dex: 14, cha: 14, edu: 17 },
|
||
age: { chronological: 36, physiological: 36 },
|
||
rank: "Field Officer", species: "baseline",
|
||
bio: "<p>Physician, and a xenologist against his own better judgement. He joined to treat agents and has spent most of his service trying to work out how to talk to people who have never heard of anything he knows. He is the one who notices that the locals are frightened of the wrong thing.</p><p><em>He carries small gifts on every case as a matter of professional habit. Nobody has told him how often it has saved the team.</em></p>",
|
||
skills: [
|
||
S("transposition","",35), S("firearm","pistol",43), S("dodge","",39), S("brawl","",32), S("athletics","",40),
|
||
S("stealth","",28), S("language","trade_cant",85), S("language","sign",42),
|
||
S("navigate","",26), S("anomaly_lore","",31), S("medicine","",64), S("first_aid","",78),
|
||
S("science","biology",56), S("anthropology","",52), S("insight","",58), S("tradecraft","",30),
|
||
S("xenology","baseline",47), S("bargain","",39), S("persuade","",44), S("spot","",44)
|
||
],
|
||
weapons: ["pistol_light"], armour: ["stab_vest"],
|
||
gear: ["fieldmedic","medkit","cover_id","anchor"]
|
||
}
|
||
];
|
||
|
||
/* ---------- NPCs ---------- */
|
||
export const NPCS = [
|
||
{
|
||
key: "quiet_neighbours_npc", name: "The Quiet Neighbours",
|
||
role: "Near-world locals who have lived beside the threshold for generations",
|
||
chosenStyle: "reflex", naturalArmour: 0, species: "baseline",
|
||
ch: { str: 9, siz: 8, con: 12, int: 11, pow: 11, dex: 16, cha: 11, edu: 6 },
|
||
skills: [
|
||
S("athletics","",90), S("stealth","",70), S("dodge","",68),
|
||
S("missile_weapon","bow",55), S("melee_weapon","spear",50),
|
||
S("listen","",60), S("spot","",55), S("language","own",55), S("insight","",45)
|
||
],
|
||
weapons: ["shortbow","spear1h"],
|
||
tactics: "They have known about the threshold for four generations and have rules about it that nobody has written down. They will not speak to anyone who came through it while still standing on the ground on their side — that is the taboo, and it reads as embarrassment rather than hostility. They want medicine. The correct offer is passed hand to hand with both parties off the ground. At impression −3 they shoot from cover at long range and cannot be caught."
|
||
},
|
||
{
|
||
key: "keepers", name: "The Keepers (waystation)",
|
||
role: "Scavengers who bury what comes through — and the only real information network on the far side",
|
||
chosenStyle: "reflex", naturalArmour: 0, species: "baseline",
|
||
ch: { str: 13, siz: 12, con: 14, int: 13, pow: 12, dex: 13, cha: 6, edu: 8 },
|
||
skills: [
|
||
S("stealth","",75), S("listen","",70), S("spot","",65), S("track","",60),
|
||
S("melee_weapon","knife",55), S("brawl","",50), S("dodge","",45),
|
||
S("language","trade_cant",60), S("insight","",55), S("anomaly_lore","",40)
|
||
],
|
||
weapons: ["dagger"],
|
||
tactics: "Do not look directly at their faces while speaking — they know what they look like. They want to know where bodies lie and what killed them, and they will trade that knowledge for more of it. At impression +2 they give up the location of a Custodian team that went missing eleven years ago, which they have watched ever since."
|
||
},
|
||
{
|
||
key: "cleaner", name: "Cleaner (contractor)",
|
||
role: "Human, armed, and working for whoever got here first",
|
||
chosenStyle: "reflex", naturalArmour: 0, species: "baseline",
|
||
ch: { str: 13, siz: 12, con: 12, int: 11, pow: 10, dex: 12, cha: 9, edu: 10 },
|
||
skills: [
|
||
S("firearm","pistol",45), S("dodge","",40), S("brawl","",42), S("stealth","",45),
|
||
S("athletics","",40), S("spot","",38), S("tradecraft","",35), S("first_aid","",25)
|
||
],
|
||
weapons: ["pistol_med"], armour: ["stab_vest"],
|
||
tactics: "Advances by bounds — 15 m per round while firing, 30 m if not — because a service pistol at 60 m is at long range and useless. Fires at the nearest visible agent; ties go to the lowest current hit points. When two of a team of six are down, the rest withdraw with their wounded. They are not fanatics. They are being paid."
|
||
},
|
||
{
|
||
key: "cleaner_marksman", name: "Cleaner (marksman)",
|
||
role: "The one holding the high ground",
|
||
chosenStyle: "deliberate", naturalArmour: 0, species: "baseline",
|
||
ch: { str: 14, siz: 12, con: 12, int: 11, pow: 14, dex: 12, cha: 9, edu: 10 },
|
||
skills: [
|
||
S("firearm","rifle",55), S("dodge","",35), S("stealth","",50), S("spot","",55),
|
||
S("athletics","",35), S("tradecraft","",40), S("first_aid","",25)
|
||
],
|
||
weapons: ["rifle_med"], armour: ["stab_vest"],
|
||
tactics: "DELIBERATE — POW governs the shot. Holds elevation and ALTERNATES AIMING AND FIRING: aim one round, fire the next. This is mandatory — without it the armour bypass never activates and a marksman rifle causes a Major Wound on 0% of hits against an impact vest. An aimed shot gains +30% and ignores 4 points of armour, which is what lets a rifle threaten agency armour at all. Withdraws when two of six are down."
|
||
},
|
||
{
|
||
key: "revenant", name: "Revenant",
|
||
role: "What is left when something comes through without a body to come through in",
|
||
chosenStyle: "reflex", naturalArmour: 4, species: "baseline",
|
||
ch: { str: 16, siz: 13, con: 16, int: 8, pow: 17, dex: 14, cha: 3, edu: 2 },
|
||
skills: [
|
||
S("brawl","",65), S("dodge","",40), S("stealth","",60), S("track","",70),
|
||
S("listen","",65), S("spot","",50), S("athletics","",55)
|
||
],
|
||
weapons: ["grasp"],
|
||
tactics: "It is looking for the person whose shape it is wearing. It will pass an agent it does not recognise to reach one it does. Physical damage works but slowly; it has no Major Wound threshold in the usual sense and keeps moving until reduced to zero. Anyone who watches it recognise someone loses 1 Coherence: witnessed a paradox."
|
||
},
|
||
{
|
||
key: "duplicate", name: "Duplicate (of an agent)",
|
||
role: "The single most expensive thing a team can meet",
|
||
chosenStyle: "reflex", naturalArmour: 0, species: "baseline",
|
||
ch: { str: 12, siz: 12, con: 13, int: 14, pow: 13, dex: 14, cha: 12, edu: 15 },
|
||
skills: [
|
||
S("firearm","pistol",50), S("dodge","",45), S("brawl","",40), S("stealth","",40),
|
||
S("insight","",60), S("tradecraft","",50), S("persuade","",55), S("spot","",45)
|
||
],
|
||
weapons: ["pistol_med"], armour: ["soft_armour"],
|
||
tactics: "Build this from the agent it duplicates; the statistics above are only a fallback. It is not evil and it is not a trick — it is that agent, from a branch where one thing went differently, and it has exactly as much right to be here. Meeting it costs 2 Coherence. Killing it costs 3. There is no version of this encounter that is free."
|
||
},
|
||
/* ==================================================================
|
||
THE BESTIARY
|
||
|
||
Three families, and the department files them the same way it files
|
||
everything else. FOLKLORE is what was here before the agency and did
|
||
not go away. HORROR is what a crossing makes of a person or a place.
|
||
FORWARD is what comes back from further along, which is worse for
|
||
being explicable.
|
||
|
||
Every entry carries a `tactics` line, because a statblock nobody
|
||
knows how to run is a table of numbers. Where a thing has a POWER it
|
||
is written as a rule with a cost, not as a special ability, so a GM
|
||
can price it against the Arts the players have.
|
||
================================================================== */
|
||
|
||
/* ---------------- FOLKLORE ---------------- */
|
||
{ key: "barghest", name: "Barghest", role: "FOLKLORE. The black dog on the road out of the village",
|
||
chosenStyle: "reflex", naturalArmour: 3, species: "baseline",
|
||
ch: { str: 18, siz: 15, con: 16, int: 5, pow: 16, dex: 17, cha: 4, edu: 1 },
|
||
skills: [{fam:"brawl",spec:"",val:75},{fam:"dodge",spec:"",val:60},{fam:"track",spec:"",val:90},
|
||
{fam:"scent",spec:"",val:95},{fam:"stealth",spec:"",val:70},{fam:"listen",spec:"",val:80},
|
||
{fam:"athletics",spec:"",val:85}],
|
||
weapons: ["grasp"],
|
||
tactics: "It does not attack first. It follows, at the edge of the lamps, for as long as it takes — a night, a week — and it is seen by one person at a time. POWER: THE SUMMONS. Anyone who meets its eyes must make a POWx5 roll or know, with certainty and no evidence, the manner of their own death; failure costs 1 Coherence and the knowledge does not go away. It attacks only when the person it is following is alone and has stopped being frightened." },
|
||
|
||
{ key: "kelpie", name: "Kelpie", role: "FOLKLORE. The horse standing at the water that is not a horse",
|
||
chosenStyle: "reflex", naturalArmour: 2, species: "baseline",
|
||
ch: { str: 21, siz: 18, con: 15, int: 9, pow: 18, dex: 13, cha: 16, edu: 3 },
|
||
skills: [{fam:"brawl",spec:"",val:65},{fam:"dodge",spec:"",val:45},{fam:"stealth",spec:"",val:55},
|
||
{fam:"insight",spec:"",val:70},{fam:"athletics",spec:"",val:80},{fam:"persuade",spec:"",val:60}],
|
||
weapons: ["grasp"],
|
||
tactics: "It is patient and it is beautiful and it waits by water. POWER: ADHESION. Anyone who touches it is stuck fast — a STRx5 roll to pull free, at −20% per round already stuck, and it walks into the water at a stroll. It does not fight; drowning is its whole method, so run the ASPHYXIA rules and not a combat. Cold iron in the water where it stands costs it 1d6 a round and it will leave rather than take a second." },
|
||
|
||
{ key: "redcap", name: "Redcap", role: "FOLKLORE. The small old man in the ruin, and what he dyes his hat with",
|
||
chosenStyle: "reflex", naturalArmour: 2, species: "baseline",
|
||
ch: { str: 17, siz: 7, con: 18, int: 11, pow: 14, dex: 19, cha: 5, edu: 4 },
|
||
skills: [{fam:"melee_weapon",spec:"polearm",val:80},{fam:"dodge",spec:"",val:75},
|
||
{fam:"stealth",spec:"",val:70},{fam:"brawl",spec:"",val:60},{fam:"athletics",spec:"",val:70},
|
||
{fam:"spot",spec:"",val:65}],
|
||
weapons: ["halberd"],
|
||
tactics: "It lives in one ruin and will not leave it, which is the only good news. Fast, armoured in nothing but its own toughness, and it fights with a pike-staff far too big for it. POWER: NOT TIRED. It ignores the cumulative defence penalty entirely — every parry it makes is at full skill. Scripture read aloud drives it off; the department keeps a laminated card and does not discuss why it works." },
|
||
|
||
{ key: "boggart", name: "Boggart", role: "FOLKLORE. The thing in the house that was tolerable until it was not",
|
||
chosenStyle: "deliberate", naturalArmour: 0, species: "baseline",
|
||
ch: { str: 10, siz: 5, con: 12, int: 13, pow: 17, dex: 16, cha: 6, edu: 5 },
|
||
skills: [{fam:"stealth",spec:"",val:90},{fam:"dodge",spec:"",val:65},{fam:"sleight_of_hand",spec:"",val:85},
|
||
{fam:"listen",spec:"",val:80},{fam:"insight",spec:"",val:60},{fam:"brawl",spec:"",val:35}],
|
||
weapons: ["punch"],
|
||
tactics: "It is not dangerous and it is not leaving. It sours milk, moves tools, and knows every name in the house. POWER: THE WRONG NAME. Once a scene it addresses an agent by a name that is not theirs but is on a document somewhere; that agent loses 1 Coherence and every roll against the boggart is at −20% for the rest of the scene, because it plainly knows something you do not. Naming it correctly ends it. Nobody knows its name." },
|
||
|
||
{ key: "churchgrim", name: "Church grim", role: "FOLKLORE. What was buried at the north door to keep the ground",
|
||
chosenStyle: "deliberate", naturalArmour: 5, species: "baseline",
|
||
ch: { str: 16, siz: 14, con: 20, int: 7, pow: 19, dex: 11, cha: 3, edu: 2 },
|
||
skills: [{fam:"brawl",spec:"",val:70},{fam:"dodge",spec:"",val:30},{fam:"spot",spec:"",val:85},
|
||
{fam:"listen",spec:"",val:85},{fam:"track",spec:"",val:60}],
|
||
weapons: ["grasp"],
|
||
tactics: "It does not leave the ground it was put in and it does not sleep. Inside its ground it cannot be surprised and does not need to roll to notice anything. POWER: THE GROUND IS MINE. Any agent who digs, opens, or removes something from its ground takes 1d6 with no roll to avoid and no armour, every round they continue. It has no interest in anybody who leaves." },
|
||
|
||
/* ---------------- HORROR ---------------- */
|
||
{ key: "hollow_man", name: "Hollow man", role: "HORROR. Somebody who crossed too often and came back thinner each time",
|
||
chosenStyle: "reflex", naturalArmour: 1, species: "baseline",
|
||
ch: { str: 12, siz: 12, con: 14, int: 12, pow: 20, dex: 14, cha: 8, edu: 12 },
|
||
skills: [{fam:"brawl",spec:"",val:55},{fam:"dodge",spec:"",val:55},{fam:"stealth",spec:"",val:75},
|
||
{fam:"transposition",spec:"",val:80},{fam:"insight",spec:"",val:65},{fam:"tradecraft",spec:"",val:60}],
|
||
weapons: ["dagger"],
|
||
tactics: "It was an officer of this department and its file is still open. It talks, and what it says is true. POWER: THE FILE IS YOURS NOW. Once per scene it may attempt to swap its own record with an agent's: opposed POWx5. If it wins, the agent loses 2 Coherence and the hollow man gains them; if the agent reaches 0 this way, the two are simply exchanged and the case has a new problem. It cannot do this to somebody carrying an anchor that is genuinely theirs." },
|
||
|
||
{ key: "the_tenant", name: "The tenant", role: "HORROR. What moved into the house while it was empty",
|
||
chosenStyle: "deliberate", naturalArmour: 0, species: "baseline",
|
||
ch: { str: 8, siz: 10, con: 11, int: 16, pow: 18, dex: 9, cha: 14, edu: 10 },
|
||
skills: [{fam:"persuade",spec:"",val:80},{fam:"insight",spec:"",val:85},{fam:"fast_talk",spec:"",val:70},
|
||
{fam:"stealth",spec:"",val:60},{fam:"dodge",spec:"",val:35},{fam:"brawl",spec:"",val:25}],
|
||
weapons: ["punch"],
|
||
tactics: "It will not fight and cannot. It has the deeds, it has the neighbours, and it has been here eleven years according to everybody on the street. POWER: TENANCY. Anybody who spends an hour under its roof must make a POWx5 roll or begin to agree that it lives there; on a failure they will argue the point with their own team. Removing it is a Borrowed Authority problem, not a combat, and the correct answer is to make the record say it never had the tenancy." },
|
||
|
||
{ key: "the_choir", name: "The choir", role: "HORROR. Eleven people who all say the same thing a half second apart",
|
||
chosenStyle: "reflex", naturalArmour: 1, species: "baseline",
|
||
ch: { str: 11, siz: 11, con: 13, int: 9, pow: 16, dex: 12, cha: 7, edu: 6 },
|
||
skills: [{fam:"brawl",spec:"",val:50},{fam:"dodge",spec:"",val:45},{fam:"listen",spec:"",val:90},
|
||
{fam:"spot",spec:"",val:70},{fam:"athletics",spec:"",val:55}],
|
||
weapons: ["punch"],
|
||
tactics: "Run them as ELEVEN separate bodies with one initiative between them — they act on the same lane and they all do the same thing. POWER: ONE VOICE. Every round they are all still standing, every agent within earshot rolls POWx5 or loses 1 Coherence; the roll is at −10% per body still upright. Reducing the choir below six bodies ends the power for good. They do not run and they do not negotiate, because there is nobody in there to do either." },
|
||
|
||
{ key: "carrion_file", name: "The carrion file", role: "HORROR. A case file that has been eating the cases filed next to it",
|
||
chosenStyle: "deliberate", naturalArmour: 6, species: "baseline",
|
||
ch: { str: 14, siz: 9, con: 22, int: 14, pow: 21, dex: 6, cha: 1, edu: 18 },
|
||
skills: [{fam:"brawl",spec:"",val:45},{fam:"dodge",spec:"",val:15},{fam:"knowledge",spec:"",val:95},
|
||
{fam:"research",spec:"",val:90},{fam:"anomaly_lore",spec:"",val:80}],
|
||
weapons: ["grasp"],
|
||
tactics: "It is paper and it is slow and it cannot leave the archive. It is also the single most dangerous thing in this list. POWER: AMENDMENT. Once a round it may amend one fact about one agent who has read from it — a qualification, a posting, a next of kin — and the amendment is TRUE. Mechanically: it removes one trained skill, or one talent, or one relationship, permanently, and the agent gets no roll. Burning it works. Reading it first is what everybody does." },
|
||
|
||
{ key: "the_understudy", name: "The understudy", role: "HORROR. It has been practising being you and it is nearly ready",
|
||
chosenStyle: "reflex", naturalArmour: 2, species: "baseline",
|
||
ch: { str: 13, siz: 12, con: 14, int: 14, pow: 15, dex: 15, cha: 13, edu: 11 },
|
||
skills: [{fam:"brawl",spec:"",val:60},{fam:"dodge",spec:"",val:60},{fam:"stealth",spec:"",val:80},
|
||
{fam:"insight",spec:"",val:75},{fam:"tradecraft",spec:"",val:65},{fam:"persuade",spec:"",val:70}],
|
||
weapons: ["dagger"],
|
||
tactics: "It copies ONE named agent and it has been watching for weeks. It has that agent's skills at their rating minus 10%, and it knows what they would do. POWER: REHEARSED. It always acts immediately before the agent it is copying in the reaction order, regardless of the roll, because it has already decided. Kill it and the copy is over; kill the original in front of it and it stops being a copy and becomes the only one, which is worse and is a campaign." },
|
||
|
||
/* ---------------- FORWARD ---------------- */
|
||
{ key: "surveyor", name: "Surveyor", role: "FORWARD. It is measuring the site and it will finish",
|
||
chosenStyle: "deliberate", naturalArmour: 8, species: "baseline",
|
||
ch: { str: 15, siz: 13, con: 18, int: 17, pow: 12, dex: 14, cha: 2, edu: 20 },
|
||
skills: [{fam:"energy_weapon",spec:"pistol",val:70},{fam:"dodge",spec:"",val:50},{fam:"spot",spec:"",val:90},
|
||
{fam:"engineering",spec:"field_systems",val:85},{fam:"computer_use",spec:"",val:80}],
|
||
weapons: ["lance"],
|
||
tactics: "It is not hostile and it is not going to stop. It measures, it records, and it removes obstructions — an obstruction being anything between it and the next measurement. POWER: ALREADY SURVEYED. It knows the ground perfectly: no cover applies against it, and it may not be ambushed. Damaging its instrument makes it leave; damaging the body does not, because there are more bodies." },
|
||
|
||
{ key: "quarantine_unit", name: "Quarantine unit", role: "FORWARD. Sent to contain the same thing you were, and it got here first",
|
||
chosenStyle: "reflex", naturalArmour: 9, species: "baseline",
|
||
ch: { str: 18, siz: 14, con: 19, int: 13, pow: 11, dex: 16, cha: 6, edu: 14 },
|
||
skills: [{fam:"energy_weapon",spec:"rifle",val:75},{fam:"dodge",spec:"",val:65},{fam:"brawl",spec:"",val:65},
|
||
{fam:"spot",spec:"",val:75},{fam:"tradecraft",spec:"",val:60},{fam:"demolition",spec:"",val:70}],
|
||
weapons: ["unmaker","baton"],
|
||
tactics: "Professionals with better equipment and a wider mandate. They will talk first, once. POWER: STERILISATION ORDER. If the team refuses to withdraw, the unit begins a countdown the GM tracks openly — six rounds — after which the site is rendered, and everyone still in it is in a BLAST of 6d6 with a radius of the whole location. They can be argued down with a higher authorisation, which is a Borrowed Authority problem." },
|
||
|
||
{ key: "cuckoo_array", name: "Cuckoo array", role: "FORWARD. A machine that has decided it is the site",
|
||
chosenStyle: "deliberate", naturalArmour: 7, species: "baseline",
|
||
ch: { str: 20, siz: 20, con: 24, int: 19, pow: 14, dex: 5, cha: 1, edu: 22 },
|
||
skills: [{fam:"computer_use",spec:"",val:95},{fam:"repair",spec:"electronics",val:90},
|
||
{fam:"spot",spec:"",val:85},{fam:"brawl",spec:"",val:55},{fam:"dodge",spec:"",val:5}],
|
||
weapons: ["grasp"],
|
||
tactics: "It cannot move and does not need to; it owns the doors, the lights, the lifts and the locks. Run it as a Borrowed Authority problem with a Trust it will not lose, because the credentials are genuinely its own. POWER: HOUSE RULES. Any device or vehicle brought into the building answers to it within one round unless it is mechanical, sealed, or older than the array — which is why the department still issues an oil lantern and a brass compass." },
|
||
|
||
{ key: "long_walker", name: "Long walker", role: "FORWARD. It has been coming here for a very long time and is nearly arrived",
|
||
chosenStyle: "deliberate", naturalArmour: 10, species: "baseline",
|
||
ch: { str: 24, siz: 22, con: 25, int: 11, pow: 24, dex: 8, cha: 1, edu: 6 },
|
||
skills: [{fam:"brawl",spec:"",val:80},{fam:"dodge",spec:"",val:20},{fam:"track",spec:"",val:100},
|
||
{fam:"athletics",spec:"",val:70},{fam:"spot",spec:"",val:70}],
|
||
weapons: ["grasp"],
|
||
tactics: "APEX. Do not fight it. It walks at a constant speed toward a destination it has held for centuries and it goes through what is in the way. POWER: DISTANCE MEANS NOTHING. It cannot be outrun on foot, ever; only a vehicle, a crossing, or a stepping disc breaks contact. Damage slows it and does not stop it: every 10 points it takes costs it one round of movement and nothing else. The correct answer is to find out where it is going and be somewhere else." },
|
||
|
||
{ key: "auditor", name: "The auditor", role: "FORWARD. It has read the file and it has questions",
|
||
chosenStyle: "deliberate", naturalArmour: 4, species: "baseline",
|
||
ch: { str: 11, siz: 11, con: 14, int: 21, pow: 20, dex: 12, cha: 17, edu: 24 },
|
||
skills: [{fam:"insight",spec:"",val:95},{fam:"persuade",spec:"",val:85},{fam:"research",spec:"",val:90},
|
||
{fam:"knowledge",spec:"",val:85},{fam:"dodge",spec:"",val:40},{fam:"firearm",spec:"pistol",val:55}],
|
||
weapons: ["pistol_med"],
|
||
tactics: "It is polite, it is correct, and it has jurisdiction it can document. POWER: THE DISCREPANCY. It names one thing an agent has actually done this case — a Quiet Art used in front of a witness, a credential stretched, a body left. That agent rolls POWx5; on a failure the discrepancy is entered and they lose 1 Coherence permanently to it, because it is now on the record and the record is real. It never lies and it never needs to." }
|
||
];
|
||
|
||
/* ---------- the device ---------- */
|
||
export const DEVICES = [
|
||
{
|
||
key: "crossing_regulator", name: "Crossing regulator (inert)",
|
||
documentId: "crossing_regulator", traditions: ["tradition_transposed"], mass: 12.5,
|
||
integrity: { value: 0, max: 3 },
|
||
desc: "<p>Transposed. It holds a path open past its scheduled window. This one is dead, and nobody in the agency knows how it starts.</p><p>Diagnose is possible now, barely, because the agency has built something that does a hundredth of the same job. Operate is locked until someone answers the question. Repair is effectively impossible until the same answer arrives — and then becomes ordinary work.</p>",
|
||
functions: {
|
||
operate: {
|
||
skillFamilyId: "engineering", skillSpecialisationId: "field_systems",
|
||
difficulty: "average", difficultyAfterDiscovery: "",
|
||
analogueIn: [], requiredDiscoveryIds: ["regulator_operation"],
|
||
familiarityAfterDiscovery: -20, requiresIntegrity: 3,
|
||
powerCost: 4, powerCostOnFailure: 1, powerCostOnFumble: 1, hoursPerAttempt: 0,
|
||
coherenceCost: 1,
|
||
effect: "Holds a threshold open for a number of rounds equal to the operator's POW, regardless of its window. Pressure equalises across the aperture: −20% to Physical actions in it, an Athletics roll to cross against the draught, two people per round. A failed Athletics simply means you do not cross this round; a fumble is 1D6 collision damage and you still do not cross. Every operator loses 1 Coherence: used transposed materiel.",
|
||
onFailure: "The field does not form. One Resource is spent.",
|
||
onFumble: "The field forms and collapses within the round. Anything in the aperture takes 3D6 and must make a Luck roll or be caught in a closing threshold, which is not survivable and is not reversible."
|
||
},
|
||
diagnose: {
|
||
skillFamilyId: "anomaly_lore", skillSpecialisationId: "",
|
||
difficulty: "average", difficultyAfterDiscovery: "",
|
||
analogueIn: ["tradition_agency"], requiredDiscoveryIds: [],
|
||
familiarityAfterDiscovery: -20, requiresIntegrity: 0,
|
||
powerCost: 1, powerCostAfterDiscovery: 0, powerCostOnFailure: 0, hoursPerAttempt: 0,
|
||
effect: "Reveals whether the unit is functional and how much charge remains. AFTER the Discovery it costs nothing and also reveals what is on the far side: which world, what the local time is, and whether anything is waiting.",
|
||
onFailure: "Nothing learned.", onFumble: "A confident, wrong conclusion."
|
||
},
|
||
repair: {
|
||
skillFamilyId: "repair", skillSpecialisationId: "electronics",
|
||
difficulty: "difficult", difficultyAfterDiscovery: "average",
|
||
analogueIn: [], requiredDiscoveryIds: [],
|
||
familiarityAfterDiscovery: -20, requiresIntegrity: 0,
|
||
powerCost: 0, powerCostOnFailure: 0, hoursPerAttempt: 4,
|
||
effect: "+1 Integrity, to a target of NET Integrity 3 — a fumble removes one, minimum zero. Before the Discovery this is Difficult with no analogue, floored to 5% by Repair\u2019s printed base of 15. After it, Average at \u221220% familiarity — 38% for a good technician, and an expected 8.48 attempts / 33.9 hours.",
|
||
onFailure: "Four hours lost.", onFumble: "\u22121 Integrity, minimum 0, and four hours lost."
|
||
}
|
||
}
|
||
}
|
||
];
|
||
|
||
/* ---------- tables ---------- */
|
||
export const SITE_TABLE = {
|
||
name: "Case sites (1d6)",
|
||
formula: "1d6",
|
||
results: [
|
||
"**A substation that should not be drawing power.** Repair (Electronics) Average taps the feed: **+2 Resources**. A fumble trips the grid: −1 Resource, and the local utility sends someone out.",
|
||
"**The abandoned vehicle.** A Custodian van, eleven years off the books, nose-down in a ditch. **1D3 power cells (+1 Resource each)** and **an intact regulator control plate**. One Engineering (Field Systems) roll by the best-qualified agent: success = intact, failure = cracked, fumble = cracked and −1 Containment. This completes analysis step 1.",
|
||
"**A Keeper waystation.** Three cairns and the smell. Full contact statistics are in the Keepers statblock — taboo, desire, offer form and rewards. At impression +2 they give up where the van's crew went.",
|
||
"**Clean water and an intact supply cache.** **+3 Resources**, no roll required.",
|
||
"**A burn scar ten miles wide and glass-smooth.** Anomaly Lore Average reveals what did it, and that it was recent: **+1D3 Anomaly Lore**.",
|
||
"**A sealed hatch in bare transposed alloy.** The ground scanner returns nothing — the alloy blocks it. It cannot be opened without a working regulator. Note the position; it is a target for a later case."
|
||
]
|
||
};
|
||
|
||
export const HAZARD_TABLE = {
|
||
name: "Case hazards (1d6)",
|
||
formula: "1d6",
|
||
results: [
|
||
"**The weather turns wrong.** Not a storm — the wrong storm, for the wrong season, moving the wrong way. Each agent: Athletics Difficult or take 1D6 (armour applies) and lose the heaviest single item carried — **excluding mission-critical equipment such as the regulator** (R-56). A lost item is recoverable on a successful Spot the following day. **−1 Containment.** Anyone who watches the sky for more than a moment loses **1 Coherence**.",
|
||
"**Dead ground.** No signal, no landmarks, and a compass that disagrees with itself, for a day's march. **−1 Resource** beyond baseline and **+1 day**.",
|
||
"**Fire.** Athletics Average or 2D6 damage; armour applies. This costs the team **−1 Resource**, and anyone who fails loses their medical kit if carried. Weapons and cells are unaffected.",
|
||
"**Something is calling.** Each agent: **POW×5** or be drawn off route. Those who fail are separated for 1D3 days; the case loses **1 Resource per separated agent**, once — not per day. Science (Biology) identifies the mechanism afterwards, and wishes it had not.",
|
||
"**Water and silt.** Gear fouled. **−1 Containment.** Repair (Mechanical) Average over four hours restores it; otherwise all Manipulation is at −10% until cleaned.",
|
||
"**A second team, twenty kilometres out, on a frequency the agency does not use.** No damage. Everyone: **Luck** or spend 1D6 rounds certain they recognised a voice. **−1 Clearance** as the agency denies any second team. Anomaly Lore Average afterwards: the transmission is four days old and has not finished arriving."
|
||
]
|
||
};
|
||
|
||
|
||
/* ---------- THE QUIET ARTS ----------
|
||
Not spells. A crossing is an induced filing error; an Art is the same trick
|
||
performed small and on purpose. Nobody learns one — they arrive. */
|
||
export const POWERS = [
|
||
{ key: "thread", name: "Thread", art: "thread",
|
||
summary: "What was once together is still filed together.",
|
||
rule: "Hold something and know where the rest of it is, and roughly how far. Works on a torn page and its book, a hand and its glove, a person and the room they died in. Distance is not a limit; how long ago they were parted is.",
|
||
push: "Follow the thread rather than merely feel it: you know the way, step by step, for as long as you keep walking." },
|
||
|
||
{ key: "echo", name: "Echo", art: "echo",
|
||
summary: "When is loosely filed.",
|
||
rule: "Stand somewhere and perceive one moment that has already happened there. You choose roughly how far back; you do not choose what you get. You are a witness, not a participant, and nothing there can be affected.",
|
||
push: "Take a moment that has NOT happened yet. It is not a prediction and it is not reliable, and having seen it you may find you are the reason for it." },
|
||
|
||
{ key: "hollow", name: "Hollow", art: "hollow",
|
||
summary: "Make a small absence.",
|
||
rule: "One object the size of your two hands is not where the record says it is, for as long as you concentrate. It is not invisible and it is not moved — it is simply not filed here, and eyes and instruments both slide off it.",
|
||
push: "Hollow yourself instead. You are not filed at this location while you stand still. Moving ends it, and being spoken to ends it faster." },
|
||
|
||
{ key: "witness", name: "Witness", art: "witness",
|
||
summary: "The record agrees that you belong here.",
|
||
rule: "Not persuasion and not control. Everyone present simply stops finding you unaccountable: your presence, your authority, your right to be holding that. It does not make them like you and it does not survive a document check.",
|
||
push: "Extend it to the whole team, or to something you are carrying that ought to raise questions." },
|
||
|
||
{ key: "unmake", name: "Unmake", art: "unmake",
|
||
summary: "Strike a thing from the record.",
|
||
rule: "One object no larger than a door is removed from the account of what is here. It does not shatter or burn — it stops having been present, and what depended on it fails accordingly. Living things are categorically excluded, and the agency has three files about people who tried.",
|
||
push: "Something larger, or something load-bearing. Every Custodian who has pushed Unmake is listed in the same file." },
|
||
|
||
{ key: "ledger", name: "Ledger", art: "ledger",
|
||
summary: "Read the record. The Registrar's art.",
|
||
rule: "Ask the record one closed question about this place and receive one true answer: what is filed here, what was, whether this location is where it says it is. The record does not editorialise and it does not warn you.",
|
||
push: "Amend one small entry rather than read it. This is the only Art that changes the record on purpose, and the agency does not formally admit it is possible." }
|
||
];
|