18OE — Rulebook Coverage

225 mechanics tracked across 29 rulebook chapters.

Bar widths weighted by section effort (L3 systems = 3× · L2 overrides = 2× · L1 data = 1×).

Overall
47% implemented or in review
Alpha
72% alpha scope done
Done & merged 106
Needs PR 7
Partial 9
To do 94
Deferred 9
Milestone:
Done & merged
Needs PR
Partial
To do
Deferred
Game Setup
7/7
Player range & starting cash
Bank £54,000
Certificate limits
Three-tier hierarchy
Incremental capitalisation
Regional float condition
Regional dump restriction
7 done
Player range & starting cashalpha
Bank £54,000alpha
Certificate limitsalpha
Three-tier hierarchyalpha
Incremental capitalisationalpha
Regional float conditionalpha
Regional dump restrictionalpha
Entities
6/6
All 24 regionals defined
All 12 minors defined
All 10 privates defined
All 12 minor auction cards
All 10 concession cards
Charter colours for all 12 minors
6 done
All 24 regionals definedalpha
All 12 minors definedalpha
All 10 privates definedalpha
All 12 minor auction cardsalpha
All 10 concession cardsalpha
Charter colours for all 12 minorsalpha
Map & Components
11/24
651-hex grid
19 red off-board hexes
Terrain costs
255 location names
Station slot revenues
Pre-printed yellow tiles
Pre-printed ferry paths
Sea zones (19)
Port icons
Logo SVGs
Province borders + partition engine
Verify M28 London / AA82 Constantinople / I20 Dublin / O28 Le Havre / X33 Marseille are in `yellow:` section in map.rb (edges added in 18oe_testing; section move not yet confirmed)
N31 Lille second token slot for White Cliffs Ferry — pre-printed Lille tile needs a secondary station slot; confirm against physical map
OE9–OE11 — green double-town path edge orientations needed
OE20–OE22 — brown double-town path edge orientations needed
OE19 — tile type unknown; must be identified and defined
Verify standard tile quantities against physical tile manifest
Audit OE-specific tile upgrade paths against physical manifest
Ferry distance numbers — per-zone crossing distances needed for cross-water cost calculations (§8d); sea zone borders themselves are complete
**Ferry sea hexes** — partial work exists; still needed: N29/G22/N25/I22/I24/AE12/AF13/AB21/AB23/AB25
Ferry route engine override — `game.rb` override to whitelist exits toward blue hexes that carry a matching pre-printed path
**Lille↔London ferry** — tiles connect correctly; all other ferry routes blocked pending L2 engine override
**Port sea stubs** `[BETA]` — blue tiles at port entry points use `junction;path=a:X,b:_0,terminal:1` as connectors between land port paths and sea ferry routes; model: land port → stub → sea ferry hexes → stub → land port; implement per port once ferry routing engine override is in place; public vs private port access distinction applies here (see §8d)
**G30 inland port** `[BETA]` — G30 currently has `junction;path=a:4,b:_0` (missing `terminal:1`); inland ports differ from coastal port stubs in routing rules — define and document the distinction before implementing; add `terminal:1` as part of this work
11 done · 13 todo
651-hex gridalpha
19 red off-board hexesalpha
Terrain costsalpha
255 location namesalpha
Station slot revenuesalpha
Pre-printed yellow tilesalpha
Pre-printed ferry pathsalpha
Sea zones (19)alpha
Port iconsalpha
Logo SVGsalpha
Province borders + partition enginealpha
Verify M28 London / AA82 Constantinople / I20 Dublin / O28 Le Havre / X33 Marseille are in `yellow:` section in map.rb (edges added in 18oe_testing; section move not yet confirmed)alpha
N31 Lille second token slot for White Cliffs Ferry — pre-printed Lille tile needs a secondary station slot; confirm against physical mapalpha
OE9–OE11 — green double-town path edge orientations neededalpha
OE20–OE22 — brown double-town path edge orientations neededalpha
OE19 — tile type unknown; must be identified and definedalpha
Verify standard tile quantities against physical tile manifestalpha
Audit OE-specific tile upgrade paths against physical manifestalpha
Ferry distance numbers — per-zone crossing distances needed for cross-water cost calculations (§8d); sea zone borders themselves are completebeta
**Ferry sea hexes** — partial work exists; still needed: N29/G22/N25/I22/I24/AE12/AF13/AB21/AB23/AB25beta
Ferry route engine override — `game.rb` override to whitelist exits toward blue hexes that carry a matching pre-printed pathbeta
**Lille↔London ferry** — tiles connect correctly; all other ferry routes blocked pending L2 engine overridebeta
**Port sea stubs** `[BETA]` — blue tiles at port entry points use `junction;path=a:X,b:_0,terminal:1` as connectors between land port paths and sea ferry routes; model: land port → stub → sea ferry hexes → stub → land port; implement per port once ferry routing engine override is in place; public vs private port access distinction applies here (see §8d)beta
**G30 inland port** `[BETA]` — G30 currently has `junction;path=a:4,b:_0` (missing `terminal:1`); inland ports differ from coastal port stubs in routing rules — define and document the distinction before implementing; add `terminal:1` as part of this workbeta
8 zones defined
20% terrain discount zones
Zone fee on par
Zone token restriction
Minor zone assignment
Asterisked-zone cap (UK/PHS/FR)
Dynamic minor regions
Home token filtering
8 done
8 zones definedalpha
20% terrain discount zonesalpha
Zone fee on paralpha
Zone token restrictionalpha
Minor zone assignmentalpha
Asterisked-zone cap (UK/PHS/FR)alpha
Dynamic minor regionsalpha
Home token filteringalpha
MINOR_TRACK_RIGHTS_CHITS
Asterisked zones cap
region_available? / cost
HomeToken process
major_phase?
5 done
MINOR_TRACK_RIGHTS_CHITSalpha
Asterisked zones capalpha
region_available? / costalpha
HomeToken processalpha
major_phase?alpha
Waterfall auction tiered rows
Minor card → float + £120 par
All-pass price reduction — if all players consecutively pass before opening packet is sold, privates pay dividends then all items on topmost row reduce by £5; repeats; items reaching £0 must all be taken by next player
2 done · 1 todo
Waterfall auction tiered rowsalpha
Minor card → float + £120 paralpha
All-pass price reduction — if all players consecutively pass before opening packet is sold, privates pay dividends then all items on topmost row reduce by £5; repeats; items reaching £0 must all be taken by next playeralpha
Concession Phase
0/5
Define Concession round with ordered float actions (CON1–CON10)
Wire concession cards to specific regional/major home tokens and par values
Float obligation: holder pays 2× par; obligation transfers if holder cannot pay
Round sequencing: Auction → Concession → Regional/Minor Phase
2-player without-concessions variant: skip Concession Phase (starting cash already correct)
Define Concession round with ordered float actions (CON1–CON10)alpha
Wire concession cards to specific regional/major home tokens and par valuesalpha
Float obligation: holder pays 2× par; obligation transfers if holder cannot payalpha
Round sequencing: Auction → Concession → Regional/Minor Phasealpha
2-player without-concessions variant: skip Concession Phase (starting cash already correct)alpha
8×17 grid with prices
Par colour bands
Minors/regionals exempt
UP end-of-SR (no OM shares)
Post-conversion sell window
LEFT (zero dividend)
No movement (below par)
RIGHT (at/above par)
Sold-out order (hi→lo price)
>60% president pool buy at 2×
§11.7 issuance DOWN movement
11 done
8×17 grid with pricesalpha
Par colour bandsalpha
Minors/regionals exemptalpha
UP end-of-SR (no OM shares)alpha
Post-conversion sell windowalpha
LEFT (zero dividend)alpha
No movement (below par)alpha
RIGHT (at/above par)alpha
Sold-out order (hi→lo price)alpha
>60% president pool buy at 2×alpha
§11.7 issuance DOWN movementalpha
7-level roster
L8 unlock after 4th L7
Rust triggers (L4/L6/L8)
8 named phases
Tile colour by phase
Status flags
Consolidation event on L5
National corp type
Level 3 restriction first OR
9 done
7-level rosteralpha
L8 unlock after 4th L7alpha
Rust triggers (L4/L6/L8)alpha
8 named phasesalpha
Tile colour by phasealpha
Status flagsalpha
Consolidation event on L5alpha
National corp typealpha
Level 3 restriction first ORalpha
Track Laying
9/10
OE1–OE3 yellow double-town
OE4–OE8 yellow city
OE12–OE18 green city
OE23–OE33 brown city
OE34–OE44 gray city
Tile point budgets
Tile point costs
TILE_UPGRADES_MUST_USE_MAX_EXITS
Metropolis upgrade labels
First-OR green tile exception (§11.1.9) — Phase 2 only, first OR after float: if RR cannot connect home token to any town/city via land or ferry without a sea crossing, it may lay one non-city green tile at cost of all remaining tile points; requires ≥1 tile point; cannot be exploited deliberately
9 done · 1 todo
OE1–OE3 yellow double-townalpha
OE4–OE8 yellow cityalpha
OE12–OE18 green cityalpha
OE23–OE33 brown cityalpha
OE34–OE44 gray cityalpha
Tile point budgetsalpha
Tile point costsalpha
TILE_UPGRADES_MUST_USE_MAX_EXITSalpha
Metropolis upgrade labelsalpha
First-OR green tile exception (§11.1.9) — Phase 2 only, first OR after float: if RR cannot connect home token to any town/city via land or ferry without a sea crossing, it may lay one non-city green tile at cost of all remaining tile points; requires ≥1 tile point; cannot be exploited deliberatelyalpha
Token Placement
3/3
Zone restriction
Connectivity check
Nationals skip token step
3 done
Zone restrictionalpha
Connectivity checkalpha
Nationals skip token stepalpha
Sea zone data
Local train town counting: towns beyond city limit fill to train level; express trains skip towns
Combined train runs: Level ≤4 trains combine (sum); Level 5+, 4D, 5D cannot combine
Cross-water costs: Ferry = +£5 track / +£20 token × distance; Sea = +£10 track / +£40 token × zones
Ferry mechanics: distance counts against city limit; public ferry usable by any RR; enemy tokens block
Port authority markers: each reduces sea zone count + ferry distance by 2; 16 total (8 North Sea, 8 Med)
Port authority purchase — majors only, one per major; £125 paid during OR at any point before Buy Trains step; North Sea covers light-blue zones, Mediterranean covers sea-green zones; also reduces cross-water track and token costs
Port authority transfer — major may buy a PA marker from another major during its Transfer Tokens OR step; price exactly £125 to selling major's treasury
Port types: public (any RR) vs private (owning RR only)
Offshore port mechanics: train connects regardless of intervening hexes
Channel passages at Copenhagen and Constantinople
1 done · 10 todo
Sea zone dataalpha
Local train town counting: towns beyond city limit fill to train level; express trains skip townsbeta
Combined train runs: Level ≤4 trains combine (sum); Level 5+, 4D, 5D cannot combinebeta
Cross-water costs: Ferry = +£5 track / +£20 token × distance; Sea = +£10 track / +£40 token × zonesbeta
Ferry mechanics: distance counts against city limit; public ferry usable by any RR; enemy tokens blockbeta
Port authority markers: each reduces sea zone count + ferry distance by 2; 16 total (8 North Sea, 8 Med)beta
Port authority purchase — majors only, one per major; £125 paid during OR at any point before Buy Trains step; North Sea covers light-blue zones, Mediterranean covers sea-green zones; also reduces cross-water track and token costsbeta
Port authority transfer — major may buy a PA marker from another major during its Transfer Tokens OR step; price exactly £125 to selling major's treasurybeta
Port types: public (any RR) vs private (owning RR only)beta
Offshore port mechanics: train connects regardless of intervening hexesbeta
Channel passages at Copenhagen and Constantinoplebeta
Detect valid OE route: Constantinople (AA82) + one of Paris/London/Berlin/Madrid/Sankt-Peterburg + land track
First-time bonus: £30 (Ph2–4), £60 (Ph5–6), £100 (Ph7–8); OE marker placed on major
+3 RIGHT on first OE run (also §6b)
Train combining: Level ≤4 combine; combined level = sum; city limit = combined level
Subsequent OE runs: no bonus, no extra stock movement
Mandatory OE: if OE route is best possible, president must run it
OE blocked for nationals
D-train bonus does NOT apply to OE first-time bonus
8 todo
Detect valid OE route: Constantinople (AA82) + one of Paris/London/Berlin/Madrid/Sankt-Peterburg + land trackbeta
First-time bonus: £30 (Ph2–4), £60 (Ph5–6), £100 (Ph7–8); OE marker placed on majorbeta
+3 RIGHT on first OE run (also §6b)beta
Train combining: Level ≤4 combine; combined level = sum; city limit = combined levelbeta
Subsequent OE runs: no bonus, no extra stock movementbeta
Mandatory OE: if OE route is best possible, president must run itbeta
OE blocked for nationalsbeta
D-train bonus does NOT apply to OE first-time bonusbeta
Pullman asset type — does not count against train limit; max 1 per non-national company
Revenue bonus: +£10 × assigned train level, once per OR
Purchase from Minor M: £150 + £15 royalty; J-minor discount on price only
Purchase from Open Market: £150, no royalty; available Phase 4+
Purchase from another RR: negotiated price
Minor M free Pullman: if Minor M not closed at Phase 4 start, places free Pullman
Discard order: rusted trains first; Pullman voluntarily returnable to Open Market
Company with zero trains but holds Pullman: retain until next train acquired
8 todo
Pullman asset type — does not count against train limit; max 1 per non-national companyalpha
Revenue bonus: +£10 × assigned train level, once per ORalpha
Purchase from Minor M: £150 + £15 royalty; J-minor discount on price onlyalpha
Purchase from Open Market: £150, no royalty; available Phase 4+alpha
Purchase from another RR: negotiated pricealpha
Minor M free Pullman: if Minor M not closed at Phase 4 start, places free Pullmanalpha
Discard order: rusted trains first; Pullman voluntarily returnable to Open Marketalpha
Company with zero trains but holds Pullman: retain until next train acquiredalpha
Train Purchase
4/7
Reserved 2+2 obligation
Phase-status check
Depot level gating
Inter-RR purchase Phase 4+
Train type lock for inter-company purchases — minors may only sell to minors, regionals to regionals, majors to majors (§11.3)
Forced purchase — president covers shortfall; else national conversion (majors) or insolvency (minors/regionals)
First-round insolvency: president cash → treasury; company receives reserved 2+2; presidential cert → Open Market; president paid face value
4 done · 3 todo
Reserved 2+2 obligationalpha
Phase-status checkalpha
Depot level gatingalpha
Inter-RR purchase Phase 4+alpha
Train type lock for inter-company purchases — minors may only sell to minors, regionals to regionals, majors to majors (§11.3)alpha
Forced purchase — president covers shortfall; else national conversion (majors) or insolvency (minors/regionals)alpha
First-round insolvency: president cash → treasury; company receives reserved 2+2; presidential cert → Open Market; president paid face valuealpha
Operating order by share price
Lay Track
Place Token
Run Trains / Revenue
Pay / Split / Hold
Buy Trains
Buy/Sell Own Shares (§11.7)
Investigate `Engine::Step::Exchange` in OR step list — minor exchange abilities fire in SR only; confirm Exchange never triggers during OR and remove if vestigial
Major purchases one abandoned minor from Open Market for £60 (to bank); minor's charter + assets added as if merged but no share of major stock issued to former owner
Remove `Engine::Step::Bankrupt` from OR step list — base bankruptcy fires game-end immediately; 18OE force-buy should route to national conversion (BUG-019); replace with a custom no-op or override
7 done · 3 todo
Operating order by share pricealpha
Lay Trackalpha
Place Tokenalpha
Run Trains / Revenuealpha
Pay / Split / Holdalpha
Buy Trainsalpha
Buy/Sell Own Shares (§11.7)alpha
Investigate `Engine::Step::Exchange` in OR step list — minor exchange abilities fire in SR only; confirm Exchange never triggers during OR and remove if vestigialalpha
Major purchases one abandoned minor from Open Market for £60 (to bank); minor's charter + assets added as if merged but no share of major stock issued to former ownerbeta
Remove `Engine::Step::Bankrupt` from OR step list — base bankruptcy fires game-end immediately; 18OE force-buy should route to national conversion (BUG-019); replace with a custom no-op or overridebeta
Sell-then-buy order
Home token in SR
Regional→major conversion
Share issuance for majors
Change of presidency
Voluntary regional removal — player may remove one unfloated regional during Regional/Minor Phase; max 6 total
Reserved secondary shares — during Initial SR only, each player may designate one regional's secondary (25%) share as reserved; no other player may purchase it until the second SR; cancelled if regional expands to major before its first OR
Trade with another player — during own SR turn, controlling player may offer personal share trade to any other player; recipient not obligated to accept
+3 RIGHT — on the first Orient Express run, share price moves 3 steps right (depends on §8e)
5 done · 4 todo
Sell-then-buy orderalpha
Home token in SRalpha
Regional→major conversionalpha
Share issuance for majorsalpha
Change of presidencyalpha
Voluntary regional removal — player may remove one unfloated regional during Regional/Minor Phase; max 6 totalalpha
Reserved secondary shares — during Initial SR only, each player may designate one regional's secondary (25%) share as reserved; no other player may purchase it until the second SR; cancelled if regional expands to major before its first ORalpha
Trade with another player — during own SR turn, controlling player may offer personal share trade to any other player; recipient not obligated to acceptalpha
+3 RIGHT — on the first Orient Express run, share price moves 3 steps right (depends on §8e)beta
Floating a minor
Floating a regional
Floating a major
Forming a national (trigger): phase 4/6/8 purchase → `trigger_nationals_formation!` → ordered queue
Forming a national (steps): `Step::ConvertToNational` — cash→bank, treasury certs→OM, tokens removed, national placed, trains inherited
Abandoning a minor (§9.5): triggered by national formation or consolidation failure — `abandon_minor!`: charter→Open Market; trains→Open Market; tokens removed; cash→bank; track rights chit stays
D minor token and L minor marker stay with their charters on abandonment
M minor Pullman stays with charter on abandonment
3 done · 5 todo
Floating a minoralpha
Floating a regionalalpha
Floating a majoralpha
Forming a national (trigger): phase 4/6/8 purchase → `trigger_nationals_formation!` → ordered queuebeta
Forming a national (steps): `Step::ConvertToNational` — cash→bank, treasury certs→OM, tokens removed, national placed, trains inheritedbeta
Abandoning a minor (§9.5): triggered by national formation or consolidation failure — `abandon_minor!`: charter→Open Market; trains→Open Market; tokens removed; cash→bank; track rights chit staysbeta
D minor token and L minor marker stay with their charters on abandonmentbeta
M minor Pullman stays with charter on abandonmentbeta
National type in train limits
National region hexes
Rusted train claim
`national_revenue`: linked/unlinked split, best-first, D-train double, flat-rate fill; `[:payout]` only
Inherent Pullman: `+£10 × highest non-rusted train level`
No tokens / no terrain costs — `return 0 if entity.type == :national` in `upgrade_cost` (BUG-011); skip token step already done
Train limit discard via `depot.reclaim_train`
Merged minors abandoned at national formation (depends on `@minor_track_rights`)
Track rights / OE markers / private markers removed at formation
Exchange owned rusted train for higher-level unclaimed rusted train
Flip owned rusted train from express to local side
Upgrade rusted → non-rusted by purchasing from same-owner major
2 done · 1 needs-PR · 9 todo
National type in train limitsalpha
National region hexesalpha
Rusted train claimbeta
`national_revenue`: linked/unlinked split, best-first, D-train double, flat-rate fill; `[:payout]` onlybeta
Inherent Pullman: `+£10 × highest non-rusted train level`beta
No tokens / no terrain costs — `return 0 if entity.type == :national` in `upgrade_cost` (BUG-011); skip token step already donebeta
Train limit discard via `depot.reclaim_train`beta
Merged minors abandoned at national formation (depends on `@minor_track_rights`)beta
Track rights / OE markers / private markers removed at formationbeta
Exchange owned rusted train for higher-level unclaimed rusted trainbeta
Flip owned rusted train from express to local sidebeta
Upgrade rusted → non-rusted by purchasing from same-owner majorbeta
L5 trigger scaffold
Conditional merger: major/national may offer; if no offer, company is abandoned
1 done · 1 todo
L5 trigger scaffoldalpha
Conditional merger: major/national may offer; if no offer, company is abandonedbeta
Token Transfer Between Majors
0/3
During major's OR Transfer Tokens step: controlling player transfers one token between two majors
Cost: token value (paying major) + token value (receiving major, same zone) + transfer fee (Normal £20 / Grand £40 / Metropolis £60)
Selling a token: returns to charter at highest-cost open position
3 todo
During major's OR Transfer Tokens step: controlling player transfers one token between two majorsalpha
Cost: token value (paying major) + token value (receiving major, same zone) + transfer fee (Normal £20 / Grand £40 / Metropolis £60)alpha
Selling a token: returns to charter at highest-cost open positionalpha
Minor Mergers
3/11
Minor SR merge action
Plumbing / can_merge
merge_minor!
**7.1** Ability transfer — minor merges into regional/major; ability inherited; nationals cannot inherit
**7.2** Minor A (Silver Banner) — bank pays major current share price at moment of merger
No-stock connection check: merge only if unlimited-city train can reach minor's token to major's network
Player choice on token conflict and train decline
Cross-player personal cash side payment UI
Solicit-offers rule for unmergeable minors
Cannot pass in Consolidation Phase if owns unfloated minors/regionals not yet merged
Consolidation Round forced mergers (§10.6) — hook into `Step::Consolidate`
3 needs-PR · 8 todo
Minor SR merge actionbeta
Plumbing / can_mergebeta
merge_minor!beta
**7.1** Ability transfer — minor merges into regional/major; ability inherited; nationals cannot inheritbeta
**7.2** Minor A (Silver Banner) — bank pays major current share price at moment of mergerbeta
No-stock connection check: merge only if unlimited-city train can reach minor's token to major's networkbeta
Player choice on token conflict and train declinebeta
Cross-player personal cash side payment UIbeta
Solicit-offers rule for unmergeable minorsbeta
Cannot pass in Consolidation Phase if owns unfloated minors/regionals not yet mergedbeta
Consolidation Round forced mergers (§10.6) — hook into `Step::Consolidate`beta
Win condition (scoring)
Bank break pre-L8 timing
L8 purchase end trigger
Remainder cash injection
Bankrupt trigger removed
Second final OR: each company pays same revenue as first final OR; no track/token/train actions (BUG-026)
5 done · 1 todo
Win condition (scoring)alpha
Bank break pre-L8 timingalpha
L8 purchase end triggeralpha
Remainder cash injectionalpha
Bankrupt trigger removedalpha
Second final OR: each company pays same revenue as first final OR; no track/token/train actions (BUG-026)beta
B – Orange Scroll
E – Blue Coast
F – White Peak
G – Indigo Foundry
K – Vermilion Seal
J – Grey Locomotive
**C** (Golden Bell) — pre-OR blocking choice step (GoldenBellChoice); `first`/`last`/`normal`; entity order rebuilt from `operating_order` after choice
**D** (Green Junction) — DTokenPlacement step; assign action during track window; any non-metro non-offboard city; Phase 5 transition already wired
**L** (Krasnaya Strela) — KrasnayaStrelaAssign step wired; train-choice before Route step; D-train doubling exception in `18oe_dtrain_doubling` (BUG-031)
**7.13** Minor M (CIWL) — holds 10 Pullman cars (see §11.6.2)
**7.9** Minor H (Great Western Steamship) — reduces sea zones by 1 (Ph1–6) or 2 (Ph7–8)
**D (Green Junction)** — sea/ferry variant: unreachable-city placement step where target city is accessible only via sea or ferry
5 done · 2 needs-PR · 2 partial · 3 todo
B – Orange Scrollalpha
E – Blue Coastalpha
F – White Peakalpha
G – Indigo Foundryalpha
K – Vermilion Sealalpha
J – Grey Locomotivealpha
**C** (Golden Bell) — pre-OR blocking choice step (GoldenBellChoice); `first`/`last`/`normal`; entity order rebuilt from `operating_order` after choicealpha
~**D** (Green Junction) — DTokenPlacement step; assign action during track window; any non-metro non-offboard city; Phase 5 transition already wiredalpha
~**L** (Krasnaya Strela) — KrasnayaStrelaAssign step wired; train-choice before Route step; D-train doubling exception in `18oe_dtrain_doubling` (BUG-031)alpha
**7.13** Minor M (CIWL) — holds 10 Pullman cars (see §11.6.2)alpha
**7.9** Minor H (Great Western Steamship) — reduces sea zones by 1 (Ph1–6) or 2 (Ph7–8)beta
**D (Green Junction)** — sea/ferry variant: unreachable-city placement step where target city is accessible only via sea or ferrybeta
Robert Stephenson (none)
Ponts et Chaussées (none)
**Central Circle** — hex_bonus approximation (£10/£20/£40/£60 by phase via after_phase_change); SR window via extra_action:true already wired; city-as-town routing deferred to beta (BUG-032)
**Hochberg Mining** — HochbergPlacement step (rough terrain ≥ £45); routing exclusion via check_route_token override; removal mechanic pending browser test
**Swift Metropolitan Line** — SR `choose` action (Phase 4+); claim_sml_train! assigns rusted 2+2 outside train limit (buyable=false, rusted=true); num_corp_trains + must_buy_train? exclude SML train; route restriction §11.3.8 free via base check_overlap
**Brandt & Brandau** — `count_per_or: 2` + free tile wired; routing exclusion implemented (non-owning RRs blocked via `@bbe_hexes`); **still needed**: removal mechanic (pay terrain cost + tile point)
**Wien Südbahnhof** — `token` (price: 0, teleport_price: 0, extra_action: true) wired; **still needed**: cost-bypass in Token step (standard reachability still applies per §14.3) + sea-zone crossing costs still charged
**Star Harbor** — `token` (extra_slot, special_only) wired; **still needed**: port routing, revenue exclusion, SR window
**White Cliffs Ferry** — `token` (hexes: ['N31']) wired; **still needed**: Phase 5 start event hook + ferry routing
**8.2** Barclay, Bevan, Barclay & Tritton — owner selects one of three abilities at time of use
**8.8** Swift Metropolitan Line — from Phase 4, one controlled RR may keep one 2+2 outside train limit
2 done · 7 partial · 2 todo
Robert Stephenson (none)alpha
Ponts et Chaussées (none)alpha
~**Central Circle** — hex_bonus approximation (£10/£20/£40/£60 by phase via after_phase_change); SR window via extra_action:true already wired; city-as-town routing deferred to beta (BUG-032)alpha
~**Hochberg Mining** — HochbergPlacement step (rough terrain ≥ £45); routing exclusion via check_route_token override; removal mechanic pending browser testalpha
~**Swift Metropolitan Line** — SR `choose` action (Phase 4+); claim_sml_train! assigns rusted 2+2 outside train limit (buyable=false, rusted=true); num_corp_trains + must_buy_train? exclude SML train; route restriction §11.3.8 free via base check_overlapalpha
~**Brandt & Brandau** — `count_per_or: 2` + free tile wired; routing exclusion implemented (non-owning RRs blocked via `@bbe_hexes`); **still needed**: removal mechanic (pay terrain cost + tile point)alpha
~**Wien Südbahnhof** — `token` (price: 0, teleport_price: 0, extra_action: true) wired; **still needed**: cost-bypass in Token step (standard reachability still applies per §14.3) + sea-zone crossing costs still chargedbeta
~**Star Harbor** — `token` (extra_slot, special_only) wired; **still needed**: port routing, revenue exclusion, SR windowbeta
~**White Cliffs Ferry** — `token` (hexes: ['N31']) wired; **still needed**: Phase 5 start event hook + ferry routingbeta
**8.2** Barclay, Bevan, Barclay & Tritton — owner selects one of three abilities at time of usealpha
**8.8** Swift Metropolitan Line — from Phase 4, one controlled RR may keep one 2+2 outside train limitalpha
Patronage Tiles
0/3
Setup: randomise and place patronage tiles on map cities at game start (3 pink, 3 yellow, 3 white, 8 green drawn per group, rest discarded)
Payout: when a RR first lays a track tile in a patronage hex during Lay Track step, bank pays one-time bonus equal to tile amount for the highest track color available in current Train Phase; patronage tile removed
Float edge case: minor that places its home token on a patronage hex fulfils it immediately and receives the lowest payout shown on the tile
3 todo
Setup: randomise and place patronage tiles on map cities at game start (3 pink, 3 yellow, 3 white, 8 green drawn per group, rest discarded)beta
Payout: when a RR first lays a track tile in a patronage hex during Lay Track step, bank pays one-time bonus equal to tile amount for the highest track color available in current Train Phase; patronage tile removedbeta
Float edge case: minor that places its home token on a patronage hex fulfils it immediately and receives the lowest payout shown on the tilebeta
Variants & Scenarios
0/4
UK-FR variant entities (4 minors: C/H/K/M; 7 regionals: BEL/GSWR/GWR/LNWR/MIDI/OU/PLM)
UK-FR train rusting rules
UK-FR map hex definitions
Medium / short scenarios — reduced RR counts, modified OE destinations
UK-FR variant entities (4 minors: C/H/K/M; 7 regionals: BEL/GSWR/GWR/LNWR/MIDI/OU/PLM)alpha
UK-FR train rusting rulesalpha
UK-FR map hex definitionsalpha
Medium / short scenarios — reduced RR counts, modified OE destinationsalpha
Tests
0/8
Smoke spec — `Engine::Game::G18OE.new(%w[A B C D])` does not raise
Basic game flow (auction → regional/minor → major phase)
Train phase transitions (rusting, limits)
Stock market movement (right/left/up/down, edge cases)
Minor ability transfer
Pullman car revenue
National revenue calculation
Orient Express bonus (first run, subsequent runs)
8 todo
Smoke spec — `Engine::Game::G18OE.new(%w[A B C D])` does not raisealpha
Basic game flow (auction → regional/minor → major phase)alpha
Train phase transitions (rusting, limits)alpha
Stock market movement (right/left/up/down, edge cases)alpha
Minor ability transferalpha
Pullman car revenuealpha
National revenue calculationbeta
Orient Express bonus (first run, subsequent runs)beta
D-Train Revenue (BUG-031)
1/1
D-train city revenue doubling — 4D/5D trains double city value; then suppress doubling for Krasnaya Strela extra city (§15.7)
1 needs-PR
D-train city revenue doubling — 4D/5D trains double city value; then suppress doubling for Krasnaya Strela extra city (§15.7)alpha