A Foundry VTT game system: Basic Roleplaying d100 in a drab British agency that deals with crossings, where reality keeps a record of what belongs where and can be made to get it wrong. Contents: - rules.mjs as the single authority for every rule formula, with 40 rules and 132 spot-checked values. Nothing may restate a formula it defines. - 25 postings, each with a key characteristic, trained skills, talents and its own kit; a 175-item catalogue across four eras; 231 generated icons. - Reaction Lanes initiative, re-rolled every round including the first. - Coherence, and the Quiet Arts, which only ever arrive from a crossing gone wrong. - Graded defences: only a critical stops a critical. - Borrowed Authority — access as a record rather than a hacking roll. - A case generator, and a rules journal generated from rules.mjs so the book cannot drift from the code. Built compendia are committed so a remote Foundry needs only the files. node_modules is not; `npm install` restores it for rebuilding content. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
719 lines
67 KiB
JavaScript
719 lines
67 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)"],
|
||
["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)"],
|
||
["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." }
|
||
];
|
||
|
||
/* ---------- armour (v0.5 §4.8) ---------- */
|
||
export const ARMOURS = [
|
||
{ key: "jacket", name: "Reinforced jacket", points: 1, mass: 2, trad: "tradition_agency" },
|
||
{ key: "stab_vest", name: "Stab vest", points: 2, mass: 3, trad: "tradition_agency" },
|
||
{ key: "soft_armour", name: "Concealed soft armour", points: 3, mass: 3.5, trad: "tradition_agency" },
|
||
{ key: "hide", name: "Cured hide", points: 4, mass: 7 },
|
||
{ key: "mail", name: "Mail", points: 5, mass: 9 },
|
||
{ key: "plate", name: "Plate", points: 8, mass: 18 },
|
||
{ key: "impact_vest", name: "Impact vest", points: 6, 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, mass: 3.0, era: "antique", trad: "tradition_local", desc: "Keeps the weather out and very little else." },
|
||
{ key: "brigandine", name: "Brigandine", points: 4, 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." }
|
||
];
|
||
|
||
/* ---------- 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." }
|
||
];
|
||
|
||
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, desc: "Sealed, sixty hours. Nothing on the far side is reliably lit." },
|
||
{ 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." },
|
||
|
||
/* --- 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", desc: "Twelve strips, forty hours each, no heat and no battery. 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, desc: "Clamps to a roof rail and runs off the vehicle. Lights a field, and tells the field where 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 = [
|
||
// --- 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 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." }
|
||
];
|