diff --git a/README.md b/README.md index b500248..8c643b2 100644 --- a/README.md +++ b/README.md @@ -4,31 +4,60 @@ A complete, dice-only replacement for the published chase subsystem. No card deck, no randomiser tables, no components beyond the dice already on the table. -Every player has a job in every round. +Every player has a job in every round, and a chase fits inside fifteen minutes. ## Status | | | |---|---| -| **Version** | v1 — design spec only | -| **Playtests** | 0 | -| **Remaining** | Rules text, GM sheet, obstacle ladders, console module, playtest | +| **Version** | v1 draft — complete, unplaytested | +| **Playtests** | 0 of 4 (see the spec, §7) | +| **Console tests** | 42 passing | -The approved design lives in -[`docs/superpowers/specs/2026-07-23-rundown-cardless-chase-design.md`](docs/superpowers/specs/2026-07-23-rundown-cardless-chase-design.md). +**Not table-ready yet.** The rules are complete and the console logic is +verified, but nothing here has faced players. The status line changes when a +live chase runs inside the fifteen-minute budget. -## What it is +## Contents + +| File | What it is | +|---|---| +| [`rules/RUNDOWN.md`](rules/RUNDOWN.md) | **The system.** Self-contained — a GM with only this file can run a chase. | +| [`reference/rundown-gm-sheet.html`](reference/rundown-gm-sheet.html) | One-page printable GM sheet: roles, procedure, outcomes, blank ladder, round log. | +| [`reference/obstacle-ladders.md`](reference/obstacle-ladders.md) | Eight ready-to-run ladders — market, rooftops, storm drain, transit, freight yard, arterial, spinner, corporate atrium. | +| [`reference/converting-from-raw.md`](reference/converting-from-raw.md) | Switching from the published chase rules, mid-campaign or mid-chase. | +| [`gm-utility/rundown-console.html`](gm-utility/rundown-console.html) | Touch console for a tablet: LEAD track, round counter, ladder stepper, Collateral, live outcome. | +| [`docs/superpowers/specs/`](docs/superpowers/specs/) | The design spec, with the calibration maths and the playtest plan. | + +## How it works - **LEAD** — one accumulating 0–8 track replaces the published range categories. -- **Four roles** — Runner, Cutter, Spotter, Pressure. Everyone rolls, every round. -- **Obstacle Ladder** — six authored obstacles in fixed escalating order, one per - round, replacing the obstacle deck. -- **Collateral** — the pursuit's cost to the city, not to the character sheet. -- **Six-round budget** with a bounded Overtime, so a chase fits a convention slot - by construction. + 0 is *hands on them*, 8 is *gone*. +- **Four roles** — Runner, Cutter, Spotter, Pressure. Everyone rolls, every + round, on four different skills. +- **Obstacle Ladder** — six authored obstacles played in fixed escalating order, + one per round. Rung 6 always forces the ending. This replaces the deck. +- **Collateral** — the pursuit's cost to the city, spent after the scene. It + never touches Health, Resolve, or Humanity. +- **Six rounds**, plus a bounded three-round Overtime, so a chase fits a + convention slot by construction rather than by GM intervention. -One engine covers foot, ground vehicle, and spinner pursuits as swappable -terrain layers, and works identically whether the PCs are hunting or running. +One engine covers foot, ground-vehicle and spinner pursuits as swappable terrain +layers, and runs identically whether the PCs are hunting or running. + +**The trade this system makes:** the published rules hide your maneuver behind a +card, which is the only thing the deck is really for. RUNDOWN reveals the +obstacle *before* anyone declares. You lose the bluff; you gain a table that all +rolls and a round that takes seconds instead of a minute. + +## Running the console + +Open `gm-utility/rundown-console.html` in any browser — no server, no build, no +dependencies. State persists across a refresh. To verify the chase logic: + +``` +node gm-utility/test/rundown.test.js +``` --- diff --git a/gm-utility/modules/rundown.js b/gm-utility/modules/rundown.js new file mode 100644 index 0000000..c2c8c32 --- /dev/null +++ b/gm-utility/modules/rundown.js @@ -0,0 +1,378 @@ +/* RUNDOWN — chase console + Cardless chase rules for the Blade Runner RPG. + Self-contained, no dependencies, works from file:// v1 */ +(function () { + 'use strict'; + + /* ---------------- ladders ---------------- */ + + var LADDERS = [ + { + name: 'The Night Market', terrain: 'foot', start: 4, coll: 'standard', + rungs: [ + { t: 'Noodle stalls', d: 'A wall of stools and elbows.', toll: 'Mobility, or lose your roll', tilt: 'Prey +1', c: 1 }, + { t: 'Steam-cart collision', d: 'Scalding white-out, someone screaming about their cart.', toll: 'Mobility, or lose your roll', tilt: '—', c: 1 }, + { t: 'Monk procession', d: 'Slow, chanting, impossible to shove through.', toll: 'Manipulation, or your role fails', tilt: 'Prey +1', c: 1 }, + { t: 'Holo-ad burst', d: 'A four-storey geisha blooms across the alley.', toll: 'Observation, or lose your roll', tilt: '—', c: 0 }, + { t: 'Plastic curtain maze', d: 'Hanging sheeting, animoid tanks, forty ways out.', toll: 'Mobility, or lose your roll', tilt: 'Prey +1 · Spotter at disadvantage', c: 0 }, + { t: 'THE SHRINE ALLEY', d: 'A dead end behind a paper shrine. Three metres of wall, no door, an old woman watching.', toll: 'None — nowhere left to go', tilt: 'Pursuers +1', c: 0 } + ] + }, + { + name: 'Sector 12 Rooftops', terrain: 'foot', start: 3, coll: 'standard', + rungs: [ + { t: 'Gravel and standing water', d: 'No grip anywhere.', toll: 'Mobility, or lose your roll', tilt: '—', c: 0 }, + { t: 'Aerial forest', d: 'Dishes, guy-lines, a decade of illegal cabling.', toll: 'Mobility, or lose your roll', tilt: 'Prey +1', c: 0 }, + { t: 'The service gap', d: 'Four metres between blocks, forty storeys down.', toll: 'Mobility — failure counts as a failed Gambit: out, and hurt', tilt: 'Pursuers +1', c: 0 }, + { t: 'Downdraft', d: 'A spinner passes low and the roof becomes a wind tunnel.', toll: 'Force, or lose your roll', tilt: '—', c: 0 }, + { t: 'Skylight run', d: 'Old glass over an occupied floor.', toll: 'Mobility, or you go through it', tilt: 'Prey +1', c: 1 }, + { t: 'THE PARAPET', d: 'The block ends. Below is the arterial, moving fast.', toll: 'None', tilt: 'Pursuers +1', c: 0 } + ] + }, + { + name: 'The Storm Drain', terrain: 'foot', start: 4, coll: 'standard', + rungs: [ + { t: 'The grade', d: 'A long wet slope, no handholds.', toll: 'Mobility, or lose your roll', tilt: '—', c: 0 }, + { t: 'Dark', d: 'The lighting failed years ago.', toll: 'Observation, or disadvantage next round', tilt: 'Prey +1', c: 0 }, + { t: 'Sluice discharge', d: 'A side pipe dumps hard across the channel.', toll: 'Force, or lose your roll', tilt: '—', c: 0 }, + { t: 'The junction', d: 'Four identical mouths, one right answer.', toll: 'Observation, or your role fails', tilt: 'Prey +1 · Spotter shines', c: 0 }, + { t: 'Rising water', d: 'Knee-deep and climbing, the sound enormous.', toll: 'Stamina or Force, or lose your roll', tilt: 'Pursuers +1', c: 0 }, + { t: 'THE OUTFALL GRATE', d: 'The channel ends at a rusted grate and open air beyond.', toll: 'None', tilt: 'Pursuers +1', c: 0 } + ] + }, + { + name: 'Transit Interchange', terrain: 'foot', start: 4, coll: 'standard', + rungs: [ + { t: 'The concourse', d: 'A river of commuters going the other way.', toll: 'Mobility, or lose your roll', tilt: 'Prey +1', c: 1 }, + { t: 'Turnstile bank', d: 'Everyone stops. Nobody stops for you.', toll: 'Connections or Tech, or lose your roll', tilt: '—', c: 1 }, + { t: 'Down escalator, wrong way', d: 'Against the grain, in front of everyone.', toll: 'Mobility, or lose your roll', tilt: 'Prey +1', c: 1 }, + { t: 'Transit police', d: 'Two officers who have noticed.', toll: 'Manipulation, or your role fails and you take 1 Collateral', tilt: '—', c: 1 }, + { t: 'The platform', d: 'A train arriving, doors about to close.', toll: 'Observation, or lose your roll', tilt: 'Prey +1', c: 1 }, + { t: 'THE CLOSING DOORS', d: 'One carriage, both of you — or one of you.', toll: 'None', tilt: '—', c: 1 } + ] + }, + { + name: 'The Freight Yard', terrain: 'ground vehicle', start: 4, coll: 'doubled', + rungs: [ + { t: 'Standing water and rail', d: 'The surface will not hold a hard turn.', toll: 'Driving, or lose your roll', tilt: '—', c: 0 }, + { t: 'Container canyon', d: 'Blind corners, no sightlines.', toll: 'Observation, or disadvantage next round', tilt: 'Prey +1', c: 0 }, + { t: 'Gantry crane', d: 'A load swinging across the lane.', toll: 'Driving, or lose your roll', tilt: '—', c: 0 }, + { t: 'Yard hauler', d: 'Forty metres of articulated freight, reversing.', toll: 'Driving, or your role fails', tilt: 'Prey +1', c: 0 }, + { t: 'Fuel apron', d: 'Hard surface, wide open, and a very good reason not to shoot.', toll: 'Driving · Firearms Pressure here is double Collateral', tilt: 'Pursuers +1', c: 1 }, + { t: 'THE GATE', d: 'Closed, manned, and lowering.', toll: 'None — through it is 3 Collateral', tilt: 'Pursuers +1', c: 1 } + ] + }, + { + name: 'Sepulveda Arterial, rain', terrain: 'ground vehicle', start: 4, coll: 'doubled', + rungs: [ + { t: 'Spray', d: 'The car ahead throws a wall of it.', toll: 'Observation, or lose your roll', tilt: '—', c: 0 }, + { t: 'Lane discipline', d: 'The automated flow does not want you doing this.', toll: 'Driving or Tech, or lose your roll', tilt: 'Prey +1', c: 1 }, + { t: 'Underpass', d: 'Dark, loud, three lanes narrowing to two.', toll: 'Driving, or lose your roll', tilt: '—', c: 1 }, + { t: 'Stalled vehicle', d: 'Hazards on, occupants inside.', toll: 'Driving, or lose your roll and take 1 Collateral', tilt: 'Pursuers +1', c: 1 }, + { t: 'Interchange ramp', d: 'Four ways off, decided in a second and a half.', toll: 'Observation, or your role fails', tilt: 'Prey +1 · Spotter decisive', c: 0 }, + { t: 'THE CHECKPOINT', d: 'LAPD barrier across all lanes, lights on.', toll: 'None', tilt: 'Pursuers +1', c: 1 } + ] + }, + { + name: 'Over the Wall', terrain: 'spinner', start: 5, coll: 'halved', + rungs: [ + { t: 'Traffic lane', d: 'You are both in a corridor you are not cleared for.', toll: 'Driving or Connections, or lose your roll', tilt: '—', c: 0 }, + { t: 'Rain shear', d: 'The weather between the towers is its own animal.', toll: 'Driving, or lose your roll', tilt: '—', c: 0 }, + { t: 'Ad blimp', d: 'Three hundred metres of illuminated hull, directly across.', toll: 'Driving, or your role fails', tilt: 'Prey +1', c: 0 }, + { t: 'Transponder ping', d: 'Traffic control wants to know who you are.', toll: 'Tech or Connections, or disadvantage next round', tilt: 'Pursuers +1', c: 0 }, + { t: 'The span', d: 'A bridge deck with clearance nobody sane would take.', toll: 'Driving — taking it is a Gambit; refusing costs your roll', tilt: 'Prey +1', c: 0 }, + { t: 'THE WALL', d: 'The sector boundary, and a hard deck beyond it that is not your jurisdiction.', toll: 'None', tilt: '—', c: 0 } + ] + }, + { + name: 'The Atrium', terrain: 'foot · corporate', start: 3, coll: 'standard', + rungs: [ + { t: 'The floor', d: 'Wet-polished stone, no traction at speed.', toll: 'Mobility, or lose your roll', tilt: '—', c: 1 }, + { t: 'Reception cordon', d: 'A desk, a rope line, and a very calm young man.', toll: 'Manipulation, or your role fails', tilt: 'Prey +1', c: 1 }, + { t: 'Elevator bank', d: 'Twelve doors, one of them closing.', toll: 'Observation, or lose your roll', tilt: 'Prey +1', c: 1 }, + { t: 'Corporate security', d: 'Two of them. Polite, armed, and not police.', toll: 'Manipulation or Connections, or your role fails and you take 1 Collateral', tilt: '—', c: 1 }, + { t: 'The gallery', d: 'A mezzanine over the whole atrium, in full view of everyone.', toll: 'Mobility, or lose your roll', tilt: 'Pursuers +1', c: 1 }, + { t: 'THE SEALED FLOOR', d: 'The building has decided. Every door on this level locks at once.', toll: 'None', tilt: 'Pursuers +1', c: 1 } + ] + } + ]; + + var OUTCOMES = [ + { lead: [0, 0], nm: 'ENGAGED', cls: 'live', d: 'Hands on them. Combat, restraint, or a conversation at contact range.' }, + { lead: [1, 2], nm: 'CORNERED', cls: 'live', d: 'Trapped, not held. A standoff, a negotiation, or a jump nobody should survive.' }, + { lead: [3, 4], nm: 'LOST, BUT', cls: 'done', d: 'Gone from sight — and you have a direction, a dropped thing, a plate, a witness.' }, + { lead: [5, 7], nm: 'GONE', cls: 'bad', d: 'Clean. The street still remembers, and so do you.' }, + { lead: [8, 8], nm: 'GHOST', cls: 'bad', d: 'You never had them. They were better than you, or they were never alone.' } + ]; + + var COLL_NOTES = [ + 'Nothing yet. The city has not noticed.', + 'Noise. Someone remembers your face.', + 'Noise. Someone remembers your face — and will talk to the wrong person.', + 'A report gets filed. LAPD attention, or a supervisor’s question.', + 'A report gets filed, and the case just got harder.', + 'A body, or a burned asset. Something you needed is gone.', + 'A body, or a burned asset. Someone above you is now personally involved.' + ]; + + var MAX_ROUNDS = 6, MAX_OT = 3, KEY = 'rundown.v1'; + + /* ---------------- state ---------------- */ + + var S, history = []; + + function fresh(li) { + var idx = (typeof li === 'number') ? li : 0; + return { + ladder: idx, + lead: LADDERS[idx].start, + round: 1, + coll: 0, + pursuer: 0, + prey: 0, + overtime: false, + ended: null, + peeked: false + }; + } + + function load() { + try { + var raw = localStorage.getItem(KEY); + if (raw) { + var p = JSON.parse(raw); + if (p && typeof p.lead === 'number' && LADDERS[p.ladder]) return p; + } + } catch (e) { /* storage unavailable — run in memory */ } + return fresh(0); + } + + function save() { + try { localStorage.setItem(KEY, JSON.stringify(S)); } catch (e) { /* ignore */ } + } + + function snapshot() { + history.push(JSON.stringify(S)); + if (history.length > 30) history.shift(); + } + + function clamp(v, lo, hi) { return v < lo ? lo : (v > hi ? hi : v); } + + function $(id) { return document.getElementById(id); } + + /* ---------------- render ---------------- */ + + function currentRungIndex() { + // In overtime the Terminator stands; otherwise rung follows the round. + return clamp(S.round, 1, MAX_ROUNDS) - 1; + } + + function outcomeFor(lead) { + for (var i = 0; i < OUTCOMES.length; i++) { + if (lead >= OUTCOMES[i].lead[0] && lead <= OUTCOMES[i].lead[1]) return OUTCOMES[i]; + } + return OUTCOMES[0]; + } + + function renderLead() { + var track = $('leadTrack'); + track.innerHTML = ''; + for (var i = 0; i <= 8; i++) { + var d = document.createElement('div'); + d.className = 'n' + (i === S.lead ? ' cur' : '') + (i === 0 || i === 8 ? ' term' : ''); + if (i === S.lead && i === 0) d.className += ' zero'; + if (i === S.lead && i === 8) d.className += ' eight'; + d.innerHTML = i + (i === 0 ? 'ENGAGED' : (i === 8 ? 'GHOST' : '')); + (function (v) { + d.addEventListener('click', function () { snapshot(); S.lead = v; S.ended = null; commit(); }); + })(i); + track.appendChild(d); + } + var L = LADDERS[S.ladder]; + $('leadSub').textContent = L.terrain + ' · start ' + L.start; + } + + function renderRound() { + var v = $('roundVal'); + if (S.overtime) { + var ot = S.round - MAX_ROUNDS; + v.innerHTML = 'OT' + ot + '/' + MAX_OT + ''; + v.className = 'val over'; + } else { + v.innerHTML = S.round + '/' + MAX_ROUNDS + ''; + v.className = 'val'; + } + } + + function rungHTML(r, n, isTerm) { + return '
' + + '
Rung ' + n + ' of 6' + (isTerm ? ' — Terminator' : '') + '
' + + '
' + r.t + (r.c ? 'CROWD' : '') + '
' + + '
' + r.d + '
' + + 'Toll: ' + r.toll + '  ·  Tilt: ' + r.tilt + '' + + (r.c ? '
Failed Toll here costs 1 Collateral.' : '') + + '
'; + } + + function renderObstacle() { + var L = LADDERS[S.ladder]; + var i = currentRungIndex(); + var isTerm = (i === 5); + var html = rungHTML(L.rungs[i], i + 1, isTerm); + if (S.overtime) { + html += '
Overtime — the Terminator stands. No new rungs. LEAD −1 at the start of each round. Collateral doubled.
'; + } + $('obstacleBox').innerHTML = html; + $('ladderName').textContent = L.name; + $('peekBtn').disabled = (i >= 5 || S.overtime); + $('peekOut').innerHTML = ''; + if (S.peeked && i < 5) { + var nx = L.rungs[i + 1]; + $('peekOut').innerHTML = 'Next — rung ' + (i + 2) + ': ' + + nx.t + '. ' + nx.toll + ''; + } + } + + function renderNet() { + $('pursuerVal').textContent = S.pursuer; + $('preyVal').textContent = S.prey; + var net = S.pursuer - S.prey; + var el = $('netVal'); + el.textContent = (net > 0 ? '+' : '') + net; + el.className = 'v ' + (net > 0 ? 'pos' : (net < 0 ? 'neg' : 'zero')); + } + + function renderColl() { + var box = $('pips'); + box.innerHTML = ''; + for (var i = 1; i <= 6; i++) { + var d = document.createElement('div'); + d.className = (i <= S.coll ? 'on' : '') + (i <= S.coll && i >= 5 ? ' hot' : ''); + d.textContent = i; + (function (v) { + d.addEventListener('click', function () { + snapshot(); + S.coll = (S.coll === v) ? v - 1 : v; // tap the current pip to step back + commit(); + }); + })(i); + box.appendChild(d); + } + $('collNote').textContent = COLL_NOTES[clamp(S.coll, 0, 6)]; + $('collSub').textContent = S.overtime ? 'doubled in overtime' : 'the city pays'; + } + + function renderOutcome() { + var o = outcomeFor(S.lead); + var el = $('outcome'); + el.className = 'outcome ' + o.cls; + var head = S.ended ? 'CHASE OVER — ' : ''; + el.innerHTML = '
' + head + o.nm + '
' + o.d + '
'; + } + + function renderButtons() { + var atEnd = (S.round >= MAX_ROUNDS && !S.overtime); + $('overtimeBtn').disabled = !(atEnd && !S.ended); + $('overtimeBtn').textContent = S.overtime ? 'Overtime running' : 'Call Overtime'; + $('undoBtn').disabled = history.length === 0; + $('applyBtn').disabled = !!S.ended; + $('applyBtn').textContent = S.ended ? 'Chase over' : 'Apply & next round'; + } + + function render() { + renderLead(); renderRound(); renderObstacle(); + renderNet(); renderColl(); renderOutcome(); renderButtons(); + } + + function commit() { save(); render(); } + + /* ---------------- actions ---------------- */ + + function applyRound() { + if (S.ended) return; + snapshot(); + + S.lead = clamp(S.lead - (S.pursuer - S.prey), 0, 8); + S.pursuer = 0; S.prey = 0; S.peeked = false; + + if (S.lead === 0 || S.lead === 8) { S.ended = true; commit(); return; } + + var lastRound = S.overtime ? (MAX_ROUNDS + MAX_OT) : MAX_ROUNDS; + if (S.round >= lastRound) { S.ended = true; commit(); return; } + + S.round += 1; + if (S.overtime) { + // Overtime drift: LEAD closes by 1 at the start of each overtime round. + S.lead = clamp(S.lead - 1, 0, 8); + if (S.lead === 0) S.ended = true; + } + commit(); + } + + function undo() { + if (!history.length) return; + S = JSON.parse(history.pop()); + commit(); + } + + function callOvertime() { + snapshot(); + S.overtime = true; + S.ended = null; + S.round = MAX_ROUNDS + 1; + S.lead = clamp(S.lead - 1, 0, 8); // first overtime round drifts immediately + if (S.lead === 0) S.ended = true; + commit(); + } + + function reset() { + snapshot(); + S = fresh(S.ladder); + commit(); + } + + /* ---------------- wire up ---------------- */ + + function init() { + S = load(); + + var pick = $('ladderPick'); + LADDERS.forEach(function (l, i) { + var o = document.createElement('option'); + o.value = i; + o.textContent = l.name + ' — ' + l.terrain; + pick.appendChild(o); + }); + pick.value = S.ladder; + pick.addEventListener('change', function () { + snapshot(); + S = fresh(parseInt(pick.value, 10)); + commit(); + }); + + document.querySelectorAll('[data-adj]').forEach(function (b) { + b.addEventListener('click', function () { + var p = b.getAttribute('data-adj').split(','); + S[p[0]] = clamp(S[p[0]] + parseInt(p[1], 10), 0, 12); + renderNet(); + save(); + }); + }); + + $('applyBtn').addEventListener('click', applyRound); + $('undoBtn').addEventListener('click', undo); + $('overtimeBtn').addEventListener('click', callOvertime); + $('peekBtn').addEventListener('click', function () { S.peeked = true; commit(); }); + $('resetBtn').addEventListener('click', function () { + if (window.confirm('Reset the chase?')) reset(); + }); + + render(); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } +})(); diff --git a/gm-utility/rundown-console.html b/gm-utility/rundown-console.html new file mode 100644 index 0000000..08a3d71 --- /dev/null +++ b/gm-utility/rundown-console.html @@ -0,0 +1,229 @@ + + + + + +RUNDOWN — Chase Console + + + +
+ +
+ ⌂ + +
+
+
Round
+
1/6
+
+
+ +
+ +
+

Lead standard start

+
+
◀ pursuers gainprey gains ▶
+ +
+
+
Pursuers
+
+ +
0
+ +
+
+
+
Net
+
0
+
+
+
Prey
+
+ +
0
+ +
+
+
+ +
+ + +
+
+ Side total = highest single Runner + all Pressure + banked Cutter spent. +
+
+ +
+

Obstacle —

+
+
+ + +
+
+
+ +
+

Collateral the city pays

+
+
+
+ +
+

Outcome if it ended now

+
+
+ +
+
+ ▸ Roles reference + + + + + + +
RUNNERMobility
Driving
Successes move LEAD. Free. The default.
PRESSUREFirearms
Manipulation
Connections
Successes move LEAD. 1 Collateral each.
SPOTTERObservationPer success: negate a Toll · remove 1 Collateral · +1 advantage die · reveal next rung.
CUTTERMobility
Driving
Banks successes, spend all at once later. No successes = out 1 round, bank lost.
GAMBITonce eachDisadvantage. Win = double successes. Lose = out of the chase, +1 Collateral.
+
+
+ +
+

Chase

+
+ + +
+
+ Overtime: max 3 rounds, Terminator stands, LEAD −1 each round, Collateral doubled. +
+
+ +
+
+ + + + diff --git a/gm-utility/test/rundown.test.js b/gm-utility/test/rundown.test.js new file mode 100644 index 0000000..0e0ea64 --- /dev/null +++ b/gm-utility/test/rundown.test.js @@ -0,0 +1,126 @@ +// Minimal DOM stub — drives the real rundown.js through its actual code paths. +const fs = require('fs'); + +class El { + constructor(tag){ this.tag=tag; this._id=''; this.className=''; this._html=''; + this._text=''; this.children=[]; this.style={}; this.disabled=false; this.value=''; + this.attrs={}; this.handlers={}; } + // real DOM: assigning innerHTML replaces all child nodes + set innerHTML(v){ this._html=String(v); this.children=[]; } get innerHTML(){ return this._html; } + set id(v){ this._id=v; reg[v]=this; } get id(){ return this._id; } + set textContent(v){ this._text=String(v); } get textContent(){ return this._text; } + addEventListener(ev,fn){ (this.handlers[ev]=this.handlers[ev]||[]).push(fn); } + click(){ (this.handlers.click||[]).forEach(f=>f.call(this)); } + appendChild(c){ this.children.push(c); return c; } + setAttribute(k,v){ this.attrs[k]=v; } getAttribute(k){ return this.attrs[k]; } +} + +const reg = {}; +const IDS = ['leadTrack','leadSub','roundVal','obstacleBox','ladderName','peekBtn','peekOut', + 'pursuerVal','preyVal','netVal','pips','collNote','collSub','outcome','overtimeBtn', + 'undoBtn','applyBtn','resetBtn','ladderPick']; +IDS.forEach(i => { const e = new El('div'); e.id = i; }); + +const adjBtns = [['pursuer',-1],['pursuer',1],['prey',-1],['prey',1]].map(([k,d]) => { + const b = new El('button'); b.setAttribute('data-adj', `${k},${d}`); return b; +}); + +global.document = { + readyState: 'complete', + getElementById: id => reg[id] || null, + createElement: t => new El(t), + querySelectorAll: sel => sel === '[data-adj]' ? adjBtns : [], + addEventListener: () => {}, +}; +const store = {}; +global.localStorage = { + getItem: k => (k in store ? store[k] : null), + setItem: (k,v) => { store[k]=v; }, +}; +global.window = { confirm: () => true }; + +eval(fs.readFileSync(process.argv[2] || __dirname + "/../modules/rundown.js",'utf8')); + +// ---- helpers ---- +const leadNow = () => reg.leadTrack.children.findIndex(c => c.className.includes('cur')); +const roundNow = () => reg.roundVal.innerHTML.replace(/<[^>]*>/g,''); +const outcomeNow = () => (reg.outcome.innerHTML.match(/
([^<]*)<\/div>/)||[])[1]; +const rungNow = () => (reg.obstacleBox.innerHTML.match(/Rung (\d)/)||[])[1]; +const collNow = () => reg.pips.children.filter(c=>c.className.includes('on')).length; +// drive through the real +/- buttons rather than poking state +const setNet = (p,q) => { + for(let i=0;i{ const ok=String(got)===String(want); + console.log(`${ok?' ok ':' FAIL'} ${label}: got ${got}${ok?'':` want ${want}`}`); ok?pass++:fail++; }; + +console.log('\n=== 1. initial state (Night Market, start 4) ==='); +eq('LEAD', leadNow(), 4); eq('round', roundNow(), '1/6'); +eq('rung', rungNow(), 1); eq('outcome band', outcomeNow(), 'LOST, BUT'); + +console.log('\n=== 2. pursuers net +2 -> LEAD 2, round 2, rung 2 ==='); +setNet(2,0); reg.applyBtn.click(); +eq('LEAD', leadNow(), 2); eq('round', roundNow(), '2/6'); +eq('rung', rungNow(), 2); eq('outcome', outcomeNow(), 'CORNERED'); + +console.log('\n=== 3. prey wins the round, net -3 -> LEAD 5 ==='); +setNet(1,4); reg.applyBtn.click(); +eq('LEAD', leadNow(), 5); eq('round', roundNow(), '3/6'); eq('outcome', outcomeNow(), 'GONE'); + +console.log('\n=== 4. undo restores LEAD 2 / round 2 AND the entered totals ==='); +reg.undoBtn.click(); +eq('LEAD', leadNow(), 2); eq('round', roundNow(), '2/6'); +eq('pursuer entry restored', reg.pursuerVal.textContent, 1); +eq('prey entry restored', reg.preyVal.textContent, 4); + +console.log('\n=== 5. LEAD hits 0 -> ENGAGED, chase ends, apply locked ==='); +for(let i=0;i<4;i++) adjBtns[2].click(); // clear prey back to 0 +eq('prey cleared', reg.preyVal.textContent, 0); +setNet(1,0); // pursuer 1 + 1 = 2, net +2 from LEAD 2 +reg.applyBtn.click(); +eq('LEAD', leadNow(), 0); eq('outcome', outcomeNow(), 'CHASE OVER — ENGAGED'); +eq('apply disabled', reg.applyBtn.disabled, true); +eq('round did NOT advance', roundNow(), '2/6'); + +console.log('\n=== 6. reset, then run to the round cap ==='); +reg.resetBtn.click(); +eq('LEAD after reset', leadNow(), 4); eq('round after reset', roundNow(), '1/6'); +for (let r=1; r<6; r++) reg.applyBtn.click(); // five net-0 rounds +eq('round at cap', roundNow(), '6/6'); eq('rung at cap', rungNow(), 6); +eq('LEAD unchanged by net 0', leadNow(), 4); +eq('overtime offered', reg.overtimeBtn.disabled, false); + +console.log('\n=== 7. round 6 applied with no overtime -> chase ends on the cap ==='); +reg.applyBtn.click(); +eq('ended at cap', outcomeNow(), 'CHASE OVER — LOST, BUT'); +eq('apply disabled', reg.applyBtn.disabled, true); + +console.log('\n=== 8. overtime: drift -1 per round, Terminator stands, hard ceiling ==='); +reg.overtimeBtn.click(); +eq('LEAD drifted on entry', leadNow(), 3); +eq('round label', roundNow(), 'OT1/3'); +eq('rung stays Terminator', rungNow(), 6); +reg.applyBtn.click(); +eq('OT2 LEAD drift', leadNow(), 2); eq('OT2 label', roundNow(), 'OT2/3'); +reg.applyBtn.click(); +eq('OT3 LEAD drift', leadNow(), 1); eq('OT3 label', roundNow(), 'OT3/3'); +reg.applyBtn.click(); +eq('ceiling reached, ended', reg.applyBtn.disabled, true); +eq('final outcome', outcomeNow(), 'CHASE OVER — CORNERED'); + +console.log('\n=== 9. collateral pips: tap to set, tap current to step back ==='); +reg.resetBtn.click(); +reg.pips.children[3].click(); eq('tap pip 4 -> 4', collNow(), 4); +reg.pips.children[3].click(); eq('tap pip 4 again -> 3', collNow(), 3); +reg.pips.children[0].click(); eq('tap pip 1 -> 1', collNow(), 1); + +console.log('\n=== 10. LEAD clamps at 8 (GHOST), never overflows ==='); +reg.resetBtn.click(); +setNet(0,9); reg.applyBtn.click(); +eq('clamped to 8', leadNow(), 8); eq('outcome', outcomeNow(), 'CHASE OVER — GHOST'); + +console.log(`\n${pass} passed, ${fail} failed\n`); +process.exit(fail ? 1 : 0); diff --git a/reference/converting-from-raw.md b/reference/converting-from-raw.md new file mode 100644 index 0000000..0453e66 --- /dev/null +++ b/reference/converting-from-raw.md @@ -0,0 +1,122 @@ +# Converting From the Published Chase Rules + +For GMs who already run the core rulebook's chase subsystem and want to swap in +RUNDOWN — mid-campaign, mid-session, or mid-chase. + +This file assumes you own the core rulebook. It does not reproduce its rules. + +--- + +## 1. What maps to what + +| Published concept | RUNDOWN equivalent | +|---|---| +| Range categories (Engaged → Extreme) | **LEAD**, a 0–8 number | +| Maneuver selected in secret | **Role**, declared in the open | +| Obstacle drawn or rolled | **Ladder rung**, authored and played in order | +| Pursuer group collapsing to one roller | **Everyone rolls**, side total takes the highest Runner | +| Chase runs until someone breaks off | **Six rounds**, then the outcome table | +| Consequences narrated ad hoc | **Collateral**, a 0–6 track spent after the scene | + +### Range → LEAD + +If you need to convert a position mid-chase: + +| Published range | LEAD | +|---|---| +| Engaged | **0** | +| Short | **2** | +| Medium | **4** | +| Long | **6** | +| Extreme | **8** | + +Read it the other way for the reverse. The mapping is deliberately coarse — +LEAD carries more resolution than five categories do, which is the point of the +change. + +### Maneuver → Role + +Players who know the published rules will reach for the maneuver names. Answer +in roles: + +| They say | They mean | +|---|---| +| "I chase them" / "I run" | **RUNNER** | +| "I try to cut them off" | **CUTTER** | +| "I shoot" / "I shout at them" / "I call it in" | **PRESSURE** | +| "I watch where they're going" / "I look for a shortcut" | **SPOTTER** | +| "I hide" | Not a role — see §4 | +| "I block the alley" | **PRESSURE** using Force, GM's call | + +--- + +## 2. Switching mid-chase + +You can do this at a round boundary without stopping play. + +1. **Convert the current range to LEAD** using the table above. +2. **Say the round number out loud.** If you are three rounds in, you have + three rungs left before the Terminator — write three obstacles, or take rungs + 4, 5 and 6 from a ladder in `obstacle-ladders.md`. +3. **Have everyone declare a role.** Anyone who does not is a Runner. +4. **Carry Collateral forward at 0.** Do not retroactively bill anyone for what + happened before the switch — narrate it instead. + +The one thing you cannot carry over is a maneuver already selected in secret. +Discard it and let them declare openly. Nobody has ever complained. + +--- + +## 3. What you are giving up + +Be honest with your table about the trade, because it is a real one. + +**You lose the bluff.** The published chase's simultaneous hidden selection +creates a rock-paper-scissors read — guessing whether they will break left or +turn and fight. RUNDOWN deletes that. In exchange you lose the 30–60 seconds +per round it costs, and the choice moves from *guessing what they will do* to +*deciding what this obstacle is worth to you*. + +**You lose per-maneuver specificity.** Four roles cover less ground than the +published maneuver list. Anything not covered is a Pressure roll with the GM +choosing the skill, or a Gambit. + +**You gain a table that all rolls.** This is the trade that motivated the whole +system. If your group is two players, the published rules work fine and you may +not need this. At four or more, the difference is the entire scene. + +--- + +## 4. Rulings the conversion needs + +**"I hide."** Hiding is not a role, because RUNDOWN has no hidden state. Treat +an attempt to break line of sight as a **Gambit** on a Runner roll using +Stealth: succeed and you double your successes (you are simply gone that +round); fail and you are out of the chase, spotted, at whatever LEAD stands. + +**"I stand and shoot."** That is PRESSURE with Firearms. It moves LEAD and it +costs Collateral. If a player wants a *lethal* shot rather than a suppressive +one, stop the chase and resolve it as combat — RUNDOWN abstracts gunfire into +pressure, and a killing shot is a different scene. + +**"I ram them."** PRESSURE with Force or Driving, minimum 2 Collateral on a +success, and ask whether they are ending the chase deliberately. Often they are. + +**Vehicles against pedestrians.** Use §9 of the rules — each side rolls its own +terrain layer, Collateral takes the higher rate. A spinner over a runner on +foot starts at LEAD 5 and closes fast; that is correct, and the ladder is what +keeps it interesting. + +**Prey with no relevant skill.** An unathletic target who bolts is not a chase, +it is a capture. Do not roll. RUNDOWN is for when the outcome is in doubt. + +--- + +## 5. Running both + +Nothing stops you keeping the published chase for two-hander scenes and using +RUNDOWN when the whole table is involved. They share the same dice, the same +skills, and the same fiction. The only cost is remembering which one you called. + +If you do, tell the players which system is live **before** they declare — +that is the only place the two get confused in practice. diff --git a/reference/obstacle-ladders.md b/reference/obstacle-ladders.md new file mode 100644 index 0000000..bea9ea0 --- /dev/null +++ b/reference/obstacle-ladders.md @@ -0,0 +1,197 @@ +# Obstacle Ladders + +**Eight ready-to-run ladders for RUNDOWN.** Pick one, set the starting LEAD, +run it. Each is six rungs, played one per round in the order written. Rung 6 is +always a Terminator — it forces the chase to break one way or the other. + +**Reading a rung:** + +- **Toll** — a roll to avoid a penalty. Everyone the obstacle touches makes it. + A failed Toll in crowded terrain also generates **1 Collateral**. +- **Tilt** — which side the terrain favours. Usually one advantage die. + +Crowded rungs are marked **[C]** — a failed Toll there costs Collateral. + +--- + +## 1. THE NIGHT MARKET — *foot* + +**Start LEAD 3–4.** Steam, frying oil, six languages, nobody looking up. +The classic. Bodies everywhere, and every one of them a reason not to shoot. + +| # | Obstacle | Toll | Tilt | +|---|---|---|---| +| 1 | **Noodle stalls** — a wall of stools and elbows **[C]** | Mobility, or lose your roll | Prey +1 | +| 2 | **Steam-cart collision** — scalding white-out, someone screaming about their cart **[C]** | Mobility, or lose your roll | Neither | +| 3 | **Monk procession** — slow, chanting, impossible to shove through **[C]** | Manipulation, or your role fails this round | Prey +1 | +| 4 | **Holo-ad burst** — a four-storey geisha blooms across the alley, blinding everyone | Observation, or lose your roll | Neither | +| 5 | **Plastic curtain maze** — hanging sheeting, animoid tanks, forty ways out | Mobility, or lose your roll | Prey +1; Spotter rolls at disadvantage | +| 6 | **THE SHRINE ALLEY** *(Terminator)* — a dead end behind a paper shrine. Three metres of wall, no door, an old woman watching | None — there is nowhere left to go | Pursuers +1 | + +**Terminator note:** the best place in the sector to catch someone gently. If +the prey reaches this rung still ahead, they are choosing the wall over you — +play that. + +--- + +## 2. SECTOR 12 ROOFTOPS — *foot* + +**Start LEAD 3.** Wet tar, aerial clutter, a two-hundred-metre drop on every +side. Gambits are the whole texture here — expect three of them. + +| # | Obstacle | Toll | Tilt | +|---|---|---|---| +| 1 | **Gravel and standing water** — no grip anywhere | Mobility, or lose your roll | Neither | +| 2 | **Aerial forest** — dishes, guy-lines, a decade of illegal cabling | Mobility, or lose your roll | Prey +1 | +| 3 | **The service gap** — four metres between blocks, forty storeys down | Mobility. **Failure here is a Gambit failure** — you are out of the chase and hurt | Pursuers +1 | +| 4 | **Downdraft** — a spinner passes low and the roof turns into a wind tunnel | Force, or lose your roll | Neither | +| 5 | **Skylight run** — old glass over an occupied floor **[C]** | Mobility, or you go through it | Prey +1 | +| 6 | **THE PARAPET** *(Terminator)* — the block ends. Below is the arterial, moving fast | None | Pursuers +1 | + +**Terminator note:** somebody is going to jump. Decide before you start whether +this city's rooftops have a next building close enough, and tell the players. + +--- + +## 3. THE STORM DRAIN — *foot* + +**Start LEAD 4.** Concrete throat under the city, ankle-deep and rising. No +crowd to hurt — Collateral here is structural and personal, not civilian. + +| # | Obstacle | Toll | Tilt | +|---|---|---|---| +| 1 | **The grade** — a long wet slope, no handholds | Mobility, or lose your roll | Neither | +| 2 | **Dark** — the lighting failed years ago | Observation, or roll at disadvantage next round | Prey +1 | +| 3 | **Sluice discharge** — a side pipe dumps hard across the channel | Force, or lose your roll | Neither | +| 4 | **The junction** — four identical mouths, one right answer | Observation, or your role fails this round | Prey +1; Spotter shines here | +| 5 | **Rising water** — knee-deep and climbing, the sound enormous | Stamina or Force, or lose your roll | Pursuers +1 | +| 6 | **THE OUTFALL GRATE** *(Terminator)* — the channel ends at a rusted grate and open air beyond | None | Pursuers +1 | + +**Terminator note:** the grate is the question. Locked, and it is a capture. +Loose, and it is a fifteen-metre drop into a settling pond. + +--- + +## 4. TRANSIT INTERCHANGE — *foot* + +**Start LEAD 4.** Six levels, forty thousand people an hour, cameras on every +face. The most expensive place in the city to draw a weapon. + +| # | Obstacle | Toll | Tilt | +|---|---|---|---| +| 1 | **The concourse** — a river of commuters going the other way **[C]** | Mobility, or lose your roll | Prey +1 | +| 2 | **Turnstile bank** — everyone stops, nobody stops for you **[C]** | Connections or Tech, or lose your roll | Neither | +| 3 | **Down escalator, wrong way** **[C]** | Mobility, or lose your roll | Prey +1 | +| 4 | **Transit police** — two officers who have noticed **[C]** | Manipulation, or your role fails and you generate 1 Collateral | Neither | +| 5 | **The platform** — a train arriving, doors about to close **[C]** | Observation, or lose your roll | Prey +1 | +| 6 | **THE CLOSING DOORS** *(Terminator)* — one carriage, both of you, or one of you | None | Neither | + +**Terminator note:** if the prey makes the train and the pursuers do not, that +is **GONE**, not a failure — the platform cameras have a face and a departure +time. Say so out loud. + +**Collateral warning:** every rung here is crowded. A table that reaches for +Pressure in a transit hall will max the track by round four. That is the lesson, +not a punishment — let it happen and bill them later. + +--- + +## 5. THE FREIGHT YARD — *ground vehicle* + +**Start LEAD 4. Collateral doubled.** Container stacks, gantry cranes, and +nobody around to see it except the people who own the containers. + +| # | Obstacle | Toll | Tilt | +|---|---|---|---| +| 1 | **Standing water and rail** — the surface will not hold a hard turn | Driving, or lose your roll | Neither | +| 2 | **Container canyon** — blind corners, no sightlines | Observation, or roll at disadvantage next round | Prey +1 | +| 3 | **Gantry crane** — a load swinging across the lane | Driving, or lose your roll | Neither | +| 4 | **Yard hauler** — forty metres of articulated freight, reversing | Driving, or your role fails this round | Prey +1 | +| 5 | **Fuel apron** — hard surface, wide open, and a very good reason not to shoot | Driving. **Any Firearms Pressure here generates double Collateral** | Pursuers +1 | +| 6 | **THE GATE** *(Terminator)* — closed, manned, and lowering | None | Pursuers +1 | + +**Terminator note:** the gate is a choice between stopping and going through it. +Going through it is 3 Collateral and a report that writes itself. + +--- + +## 6. SEPULVEDA ARTERIAL, RAIN — *ground vehicle* + +**Start LEAD 4. Collateral doubled.** Eight lanes, standing water, everyone +doing ninety because the traffic system says it is safe. + +| # | Obstacle | Toll | Tilt | +|---|---|---|---| +| 1 | **Spray** — the car ahead throws a wall of it | Observation, or lose your roll | Neither | +| 2 | **Lane discipline** — the automated flow does not want you doing this **[C]** | Driving or Tech, or lose your roll | Prey +1 | +| 3 | **Underpass** — dark, loud, three lanes narrowing to two **[C]** | Driving, or lose your roll | Neither | +| 4 | **Stalled vehicle** — hazards on, occupants inside **[C]** | Driving, or lose your roll and generate 1 Collateral | Pursuers +1 | +| 5 | **Interchange ramp** — four ways off, decided in a second and a half | Observation, or your role fails this round | Prey +1; Spotter decisive | +| 6 | **THE CHECKPOINT** *(Terminator)* — LAPD barrier across all lanes, lights on **[C]** | None | Pursuers +1 | + +**Terminator note:** the checkpoint ends this one way or another. If the prey +runs it, that is a citywide alert and someone else's arrest — the PCs get +**LOST, BUT** with a very good lead and a very bad afternoon. + +--- + +## 7. OVER THE WALL — *spinner / aerial* + +**Start LEAD 5. Collateral halved, but every point is severe.** Nothing below +you for six hundred metres, and everything below you is somebody's roof. + +| # | Obstacle | Toll | Tilt | +|---|---|---|---| +| 1 | **Traffic lane** — you are both in a corridor you are not cleared for | Driving or Connections, or lose your roll | Neither | +| 2 | **Rain shear** — the weather between the towers is its own animal | Driving, or lose your roll | Neither | +| 3 | **Ad blimp** — three hundred metres of illuminated hull, directly across | Driving, or your role fails this round | Prey +1 | +| 4 | **Transponder ping** — traffic control wants to know who you are | Tech or Connections, or roll at disadvantage next round | Pursuers +1 | +| 5 | **The span** — a bridge deck with clearance nobody sane would take | Driving. **Taking it is a Gambit**; refusing costs your roll | Prey +1 | +| 6 | **THE WALL** *(Terminator)* — the sector boundary, and a hard deck beyond it that is not your jurisdiction | None | Neither | + +**Terminator note:** the Wall is jurisdictional, not physical. Crossing it means +the chase is over and the paperwork has begun. If the prey crosses, that is +**GONE** — you know exactly where they went and you cannot follow. + +--- + +## 8. THE ATRIUM — *foot, corporate interior* + +**Start LEAD 3.** Polished stone, filtered air, and four hundred employees who +have never seen anybody run. Every camera works. Every camera is owned. + +| # | Obstacle | Toll | Tilt | +|---|---|---|---| +| 1 | **The floor** — wet-polished stone, no traction at speed **[C]** | Mobility, or lose your roll | Neither | +| 2 | **Reception cordon** — a desk, a rope line, and a very calm young man **[C]** | Manipulation, or your role fails this round | Prey +1 | +| 3 | **Elevator bank** — twelve doors, one of them closing **[C]** | Observation, or lose your roll | Prey +1 | +| 4 | **Corporate security** — two of them, polite, armed, and not police **[C]** | Manipulation or Connections, or your role fails and you generate 1 Collateral | Neither | +| 5 | **The gallery** — a mezzanine walkway over the whole atrium, in full view of everyone **[C]** | Mobility, or lose your roll | Pursuers +1 | +| 6 | **THE SEALED FLOOR** *(Terminator)* — the building has decided. Every door on this level locks at once | None | Pursuers +1 | + +**Terminator note:** the building sealing is not on the PCs' side. Everyone is +now inside with corporate security, and the question of who leaves is a +negotiation, not a chase. + +--- + +## Writing your own + +Five minutes, six lines: + +1. **Pick the location** and picture somebody sprinting through it. +2. **List six things that would interrupt them.** Not six dangers — six + *interruptions*. Crowds, doors, weather, machinery, other people's business. +3. **Order them from annoying to impassable.** +4. **Give each a Toll** — the skill that gets you past it, and what it costs to + fail. "Lose your roll this round" is the default and is usually right. +5. **Tilt about half of them.** Crowds favour the prey. Open ground favours the + pursuers. Leave some neutral. +6. **Make rung 6 force the ending.** A wall, a barrier, a drop, a door that + locks, a vehicle leaving. Something that cannot be run past. + +Mark crowded rungs **[C]** so the Collateral rule is visible at the table. + +**One thing to check before you run it:** read your six rungs in order and ask +whether they escalate. If rung 2 is scarier than rung 5, swap them. The ladder +is the scene's shape — that is the whole reason it is written down. diff --git a/reference/rundown-gm-sheet.html b/reference/rundown-gm-sheet.html new file mode 100644 index 0000000..84b9c19 --- /dev/null +++ b/reference/rundown-gm-sheet.html @@ -0,0 +1,237 @@ + + + + + +RUNDOWN — GM Sheet + + + + + + +
+

RUNDOWNCardless chases · Blade Runner RPG

+
+ START LEAD   3 close · 4 standard · 5 distant
+ 6 ROUNDS   ~15 min · Overtime max 3 +
+
+ + +
+

LEAD — mark it, move it once a round

+
+
0ENGAGED
+
1
2
3
4
+
5
6
7
+
8GHOST
+
+
◀ Pursuers gainPrey gains ▶
+
+ +
+
+ + +
+

Roles — everyone takes one, every round

+ + + + + + + + + + + + + + + + + + +
RoleRollEffect
RUNNERMobility
Driving
Successes move LEAD. Free. The default — declare nothing, you are this.
PRESSUREFirearms
Manipulation
Connections
Successes move LEAD. 1 Collateral each.
SPOTTERObservationSpend each success: negate a Toll · remove 1 Collateral · +1 advantage die to an ally · reveal next rung.
CUTTERMobility
Driving
Banks successes — spend all at once later. No successes = out 1 round, bank lost.
+
Fast is expensive. Pure Runners win slowly and clean; Pressure wins fast and bills the city.
+
+ + +
+

The round

+
    +
  1. Reveal the obstacle — before anyone declares.
  2. +
  3. Prey declares a role and rolls.
  4. +
  5. Pursuers declare in any order and roll.
  6. +
  7. Net → move LEAD.
  8. +
  9. Collateral. Narrate. Next rung.
  10. +
+
+ SIDE TOTAL = highest single Runner result + + all Pressure successes + banked Cutter spent
+ NET = pursuers − prey  →  + lowers LEAD · − raises it +
+
NPC side: one roll per round, whatever the table size. A real edge is +1 advantage die, never an extra roll.
+
+ + +
+

Gambit — once each per chase

+ + + + +
RollAt disadvantage. Modifies your role roll — not an extra roll.
SuccessDouble your successes this round.
FailureOut of the chase, terrain-appropriate consequence, +1 Collateral.
+
+ +
+
+ + +
+

Collateral — the city pays, never the sheet

+
+ + + +
+1each Pressure success · each failed Toll in a crowd · each failed Gambit
−1each Spotter success, same round it is generated
+ + + + + +
Spend afterCost
1–2Noise. Someone remembers your face.
3–4A report gets filed. LAPD attention, or the case gets harder.
5–6A body, or a burned asset. Something you needed is gone.
+
Never spent during the chase. Never modifies a roll. Capped at 6.
+
+ + +
+

Outcomes — LEAD 0, LEAD 8, or end of round 6

+ + + + + + +
0ENGAGED — hands on them.
1–2CORNERED — trapped, not held. Standoff, negotiation, or a jump.
3–4LOST, BUT — gone, and you have a direction, an object, a plate, a witness.
5–7GONE — clean. The street remembers.
8GHOST — you never had them.
+
No outcome is a dead end. LOST, BUT is the ordinary failure and it still hands you the next scene.
+
+ + +
+

Overtime & terrain

+ + + + + + +
OVERTIME — max 3 rounds, GM's call at end of round 6. Terminator stands, no new rungs. LEAD −1 at the start of each round. Collateral doubled.
TerrainRunner / Cutter · Start · Collateral
FootMobility · LEAD 3–4 · standard
VehicleDriving · LEAD 4 · doubled
SpinnerDriving · LEAD 5 · halved, each point severe
+
Mixed chase: each side uses its own layer; Collateral takes the higher rate.
+
+ +
+
+ + +
+

Obstacle ladder — six rungs, in order, one per round. Rung 6 forces the ending.

+ + + + + + + + +
ObstacleTollTilt
1
2
3
4
5
6
+
Toll = a roll or lose your roll this round. Tilt = who the terrain favours, usually +1 die. Mark crowded rungs [C] — a failed Toll there costs 1 Collateral.
+
+ + +
+

Round log

+ + + + + + + + +
#Roles takenNetLEADColl.Note
1
2
3
4
5
6
+
+ + + + + diff --git a/rules/RUNDOWN.md b/rules/RUNDOWN.md new file mode 100644 index 0000000..f84f6a1 --- /dev/null +++ b/rules/RUNDOWN.md @@ -0,0 +1,330 @@ +# RUNDOWN + +**Cardless chase rules for the Blade Runner RPG.** +*v1 draft — unofficial fan supplement. Requires the core rulebook.* + +> Nobody in this city runs because they think they'll get away. They run because +> stopping means answering the question. + +RUNDOWN replaces the chase subsystem in the core rulebook. It needs **no cards, +no tables to roll on, and no components beyond the dice already in front of +you**. Every player has a job in every round, and the whole chase fits in +fifteen minutes. + +--- + +## 1. What you need + +- The dice you already use: an attribute die and a skill die per roll. +- **One number written where everyone can see it** — the LEAD. +- **Six obstacles**, written before play. Take one from + `reference/obstacle-ladders.md` or write your own (§7). + +That is all. No deck, no board, no tokens. + +**Resolution is unchanged from the core rules.** Roll your attribute die and +your skill die. **6–9 is one success. 10+ is two successes.** Advantage adds a +d6; disadvantage drops your lowest die. + +--- + +## 2. LEAD + +**LEAD is how far ahead the prey is.** One number, 0 to 8. + +| | | +|---|---| +| **LEAD 0** | **ENGAGED.** Chase over — hands on them. | +| **LEAD 8** | **GHOST.** Chase over — they broke away clean. | + +Set the starting LEAD when you call the chase: + +| Start | When | +|---|---| +| **3** | **Close.** A stumble away. They were nearly in reach when they bolted. | +| **4** | **Standard.** They got a jump on you. *Use this when unsure.* | +| **5** | **Distant.** You spotted them across the plaza, the lot, the traffic lane. | + +LEAD goes **down** when the pursuers gain and **up** when the prey does. It +moves once per round, by one number, and that number is the only arithmetic in +the system. + +--- + +## 3. Roles + +At the top of the chase, **every participant takes a role**. Any number can +share a role, and anyone may change role between rounds. + +**RUNNER is the default.** A player who declares nothing is a Runner. + +### RUNNER — *close the gap, or open it* +**Roll:** Mobility (on foot) or Driving (vehicle, spinner) +Successes move LEAD. Costs nothing. The safe, steady option. + +### PRESSURE — *make them flinch* +**Roll:** Firearms, Manipulation, or Connections +You act on the prey without moving: a warning shot, a shouted order down an +alley, a call ahead to someone who owes you, a traffic signal killed from a +terminal. + +Successes move LEAD — **but every success generates 1 Collateral (§6).** + +### SPOTTER — *read the ground* +**Roll:** Observation +Spend each success on **one** of: + +- **Negate one Toll penalty** suffered by anyone on your side this round. +- **Remove 1 Collateral** generated this round. +- **Grant one advantage die** to an ally's next roll. +- **Reveal the next rung** of the obstacle ladder before it is played. + +### CUTTER — *take the other way round* +**Roll:** Mobility (on foot) or Driving (vehicle, spinner) +A parallel route — a fire escape, a service corridor, a side street, an overhead +pass. Your successes are **banked, not applied.** + +Banked successes may be spent **all at once, in any later round**, added to that +round's side total. On a roll with **no successes**, you are out of the chase +for one round and **your bank is lost**. + +### How the roles pay off + +| Role | Buys you | Costs you | +|---|---|---| +| **RUNNER** | Steady progress | Nothing | +| **PRESSURE** | Speed | Collateral | +| **SPOTTER** | Safety, and Collateral back | A round of progress | +| **CUTTER** | A decisive later round | Risk of losing everything | + +A table of pure Runners will win a chase slowly and cleanly. A table that leans +on Pressure will win it fast and leave a mess behind. **The quick way to catch +someone in this city is the expensive way.** That is the whole point. + +--- + +## 4. The round + +Six rounds, maximum. Roughly fifteen minutes. + +> **1. The GM reveals this round's obstacle.** +> **2. The prey declares their role and rolls.** +> **3. The pursuers declare in any order and roll.** +> **4. Work out the net. Move the LEAD.** +> **5. Stamp Collateral. Narrate. Next round.** + +**The obstacle is revealed before anyone declares.** Nothing is hidden and +nothing is simultaneous — that is what removes the cards. Players choose their +role knowing what the street just threw at them, so the choice is a decision +instead of a guess. + +### Working out the net + +Each side totals up: + +> the **highest single RUNNER result** on that side — *not the sum* +> **+** all PRESSURE successes +> **+** any banked CUTTER successes spent this round + +Then: + +> **NET = pursuer total − prey total** +> Positive → **LEAD goes down** by that much. +> Negative → **LEAD goes up** by that much. +> Zero → LEAD is unchanged. The round still happened; Collateral still lands. + +Extra Runners make a side **more reliable, not more powerful.** A second Runner +is worth about half a success; a fourth is worth about a fifth of one. Four +people running down the same alley is four chances at a good roll, not four +times the speed. + +### Running the other side + +**An NPC makes one roll per round**, in a role of the GM's choosing. Do not roll +for a mob. If the opposition has a real advantage — a bike, local knowledge, +a head start through a door that locks — give them **one advantage die**, not +another roll. + +This holds the GM's dice load at one roll per round whether there are two +players or six. + +--- + +## 5. Gambits + +**Once per chase, each participant may declare a Gambit** — a named, specific +risk. *"I go over the gap."* *"I take the spinner under the span."* + +A Gambit modifies **your role roll for that round**. It is not an extra roll. + +| | | +|---|---| +| **Roll** | At **disadvantage** — drop your lowest die. | +| **Success** | **Double your successes** this round. | +| **Failure** | You are **out of the chase**, with a consequence the terrain suggests, and you generate **1 Collateral**. | + +A Gambit is the moment somebody talks about afterwards. It is capped at one +each so it stays that. + +--- + +## 6. Collateral + +Chases in this city cost the city. **Collateral is a track from 0 to 6.** It +never touches a character sheet — not Health, not Resolve, not Humanity. + +**Generated by:** + +- each **PRESSURE success** — 1 each +- each **failed Toll in crowded terrain** — 1 each +- each **failed Gambit** — 1 each + +**Removed by:** SPOTTER successes, one for one, in the round it is generated. + +**Capped at 6.** Beyond that, narrate it and stop counting. + +### Spending it — after the chase, never during + +| Collateral | What it costs you | +|---|---| +| **1–2** | Noise. Someone remembers your face. A witness who will talk to the wrong person. | +| **3–4** | A report gets filed. LAPD attention, a supervisor's question, or a fresh complication in the case. | +| **5–6** | A body, or a burned asset. Something you were going to need is gone. | + +Collateral never modifies a roll and is never spent in the moment. It is a +budget the GM draws on in the scenes that follow — which is exactly what makes +players argue about whether to reach for Pressure. + +--- + +## 7. The Obstacle Ladder + +**Six obstacles, written in advance, played in fixed order, one per round.** +This replaces both the obstacle deck and any table you would otherwise roll on. + +Rung 1 is a nuisance. Rung 6 is a wall. + +Each rung is one line carrying a **Toll** and a **Tilt**: + +- **Toll** — a roll to avoid a penalty. Anyone the obstacle touches makes it. +- **Tilt** — which side the terrain favours, usually one advantage die. + +``` +[3] TRANSIT PLATFORM — Toll: Mobility or lose your roll this round. + Tilt: prey (+1 die). A crowd is the runner's friend. +``` + +### Rung 6 is always a Terminator + +The last rung is a feature that **forces resolution**: a dead end, a rail line, +a roof edge, a checkpoint, a canal. The chase has to break one way or the other +against it. Write it that way. + +### Why authored, not random + +- Pacing is built in — the scene has a written shape and a written ending. +- The obstacles are about *this* market, *this* rooftop, *this* freight yard. +- No lookup, no randomiser, no shuffling. +- The GM knows what round four looks like before round one starts. + +**Writing one takes about five minutes.** Pick a location, list six things in it +that would interrupt a person running flat out, order them from *annoying* to +*impassable*, and give each a Toll. Eight finished ladders are in +`reference/obstacle-ladders.md`. + +--- + +## 8. Ending it + +The chase ends at **LEAD 0**, at **LEAD 8**, or at the **end of round 6** — +whichever comes first. + +| LEAD | Outcome | | +|---|---|---| +| **0** | **ENGAGED** | Hands on them. Combat, restraint, or a conversation at contact range. | +| **1–2** | **CORNERED** | Trapped, not held. A standoff, a negotiation, or a jump nobody should survive. | +| **3–4** | **LOST, BUT** | Gone from sight — and you have a direction, a dropped thing, a plate, a witness. | +| **5–7** | **GONE** | Clean. The street still remembers, and so do you. | +| **8** | **GHOST** | You never had them. They were better than you, or they were never alone. | + +**No outcome is a dead end.** LOST, BUT is the ordinary failure and it still +hands you the next scene. GONE and GHOST still leave you the Collateral, and +they leave you what the prey gave away by *how* they ran — the route they knew, +the door that was unlocked for them, the fact that they never once looked back. + +### Overtime + +If round 6 ends with the chase unresolved and the table is leaning in, the GM +may call **Overtime — at most three more rounds.** + +- **No new obstacles.** The Terminator stands and applies every round. +- **LEAD drops by 1 at the start of each Overtime round**, before any rolls. + The pursuit closes. The city closes in. +- **Collateral generation is doubled.** + +Overtime always ends: nine rounds is the hard ceiling, and the automatic drift +drags any close chase to ground. At the end of it, read the outcome table +whatever the number says. + +--- + +## 9. Terrain + +One engine, three skins. **The procedure never changes** — only this table. + +| | RUNNER / CUTTER | SPOTTER | Start LEAD | Collateral | +|---|---|---|---|---| +| **Foot** | Mobility | Observation | 3–4 | Standard | +| **Ground vehicle** | Driving | Observation | 4 | **Doubled** — a car in a crowd | +| **Spinner / aerial** | Driving | Observation *(plotting vectors)* | 5 | **Halved**, but every point is severe | + +**Mixed chases** — a spinner over a runner on foot, a car chasing a pedestrian +through an arcade — use each side's own layer for its own rolls, and the +**higher** of the two Collateral rates. + +--- + +## 10. If the PCs are the ones running + +Nothing changes. The roles, the ladder, the net, and the outcome table are all +symmetric. Swap which side wants LEAD to go up. + +The only thing to watch: **the outcome table reads from the pursuers' side.** +When the PCs are prey, invert it — LEAD 0 means *they caught you*, LEAD 8 means +*you are a ghost*, and LOST, BUT means you got away but left something behind +that they will follow. + +Collateral still accrues to whoever generates it. A PC who shoots their way out +of a crowded transit hall owns that, even running. + +--- + +## 11. Quick reference + +**LEAD 0–8.** Start 3 close / 4 standard / 5 distant. 0 = caught, 8 = gone. + +**Round:** obstacle → prey declares and rolls → pursuers declare and roll → +net → move LEAD → Collateral → narrate. + +**Side total** = highest single Runner + all Pressure + banked Cutter spent. +**Net** = pursuers − prey. + +| Role | Roll | Does | +|---|---|---| +| RUNNER | Mobility / Driving | Moves LEAD. Free. | +| PRESSURE | Firearms / Manipulation / Connections | Moves LEAD. 1 Collateral per success. | +| SPOTTER | Observation | Negate Toll / remove Collateral / grant advantage die / reveal next rung. | +| CUTTER | Mobility / Driving | Banks successes; spend all at once later. No successes = out a round, bank lost. | + +**Gambit:** once each. Disadvantage. Win = double successes. Lose = out, +1 Collateral. + +**Six rounds.** Six rungs. Rung 6 forces the end. Overtime = 3 more, −1 LEAD a +round, double Collateral. + +**Outcomes:** 0 ENGAGED · 1–2 CORNERED · 3–4 LOST, BUT · 5–7 GONE · 8 GHOST. + +--- + +*Unofficial fan supplement. Not affiliated with, endorsed by, or sponsored by +Free League Publishing or the rights holders of Blade Runner. Requires the Blade +Runner RPG core rulebook to play. Not for sale.*