18OE — Rulebook Coverage
For current sprint state → Implementation Tracker · Alpha gaps → Open for Alpha
225 mechanics tracked across 29 rulebook chapters.
Done & merged 106
Needs PR 7
Partial 9
To do 94
Deferred 9
Milestone:
Done & merged
Needs PR
Partial
To do
Deferred
Game Setup7/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 cash | alpha |
| ✓ | Bank £54,000 | alpha |
| ✓ | Certificate limits | alpha |
| ✓ | Three-tier hierarchy | alpha |
| ✓ | Incremental capitalisation | alpha |
| ✓ | Regional float condition | alpha |
| ✓ | Regional dump restriction | alpha |
Entities6/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 defined | alpha |
| ✓ | All 12 minors defined | alpha |
| ✓ | All 10 privates defined | alpha |
| ✓ | All 12 minor auction cards | alpha |
| ✓ | All 10 concession cards | alpha |
| ✓ | Charter colours for all 12 minors | alpha |
Map & Components11/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 grid | alpha |
| ✓ | 19 red off-board hexes | alpha |
| ✓ | Terrain costs | alpha |
| ✓ | 255 location names | alpha |
| ✓ | Station slot revenues | alpha |
| ✓ | Pre-printed yellow tiles | alpha |
| ✓ | Pre-printed ferry paths | alpha |
| ✓ | Sea zones (19) | alpha |
| ✓ | Port icons | alpha |
| ✓ | Logo SVGs | alpha |
| ✓ | Province borders + partition engine | alpha |
| ✗ | 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 map | alpha |
| ✗ | OE9–OE11 — green double-town path edge orientations needed | alpha |
| ✗ | OE20–OE22 — brown double-town path edge orientations needed | alpha |
| ✗ | OE19 — tile type unknown; must be identified and defined | alpha |
| ✗ | Verify standard tile quantities against physical tile manifest | alpha |
| ✗ | Audit OE-specific tile upgrade paths against physical manifest | alpha |
| ✗ | Ferry distance numbers — per-zone crossing distances needed for cross-water cost calculations (§8d); sea zone borders themselves are complete | beta |
| ✗ | **Ferry sea hexes** — partial work exists; still needed: N29/G22/N25/I22/I24/AE12/AF13/AB21/AB23/AB25 | beta |
| ✗ | Ferry route engine override — `game.rb` override to whitelist exits toward blue hexes that carry a matching pre-printed path | beta |
| ✗ | **Lille↔London ferry** — tiles connect correctly; all other ferry routes blocked pending L2 engine override | beta |
| ✗ | **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 work | beta |
Track Rights8/8
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 defined | alpha |
| ✓ | 20% terrain discount zones | alpha |
| ✓ | Zone fee on par | alpha |
| ✓ | Zone token restriction | alpha |
| ✓ | Minor zone assignment | alpha |
| ✓ | Asterisked-zone cap (UK/PHS/FR) | alpha |
| ✓ | Dynamic minor regions | alpha |
| ✓ | Home token filtering | alpha |
MINOR_TRACK_RIGHTS_CHITS
Asterisked zones cap
region_available? / cost
HomeToken process
major_phase?
5 done
| ✓ | MINOR_TRACK_RIGHTS_CHITS | alpha |
| ✓ | Asterisked zones cap | alpha |
| ✓ | region_available? / cost | alpha |
| ✓ | HomeToken process | alpha |
| ✓ | 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 rows | alpha |
| ✓ | Minor card → float + £120 par | alpha |
| ✗ | 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 | alpha |
Concession Phase0/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 values | alpha |
| — | Float obligation: holder pays 2× par; obligation transfers if holder cannot pay | alpha |
| — | Round sequencing: Auction → Concession → Regional/Minor Phase | alpha |
| — | 2-player without-concessions variant: skip Concession Phase (starting cash already correct) | alpha |
Stock Market Grid11/11
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 prices | alpha |
| ✓ | Par colour bands | alpha |
| ✓ | Minors/regionals exempt | alpha |
| ✓ | UP end-of-SR (no OM shares) | alpha |
| ✓ | Post-conversion sell window | alpha |
| ✓ | 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 movement | alpha |
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 roster | alpha |
| ✓ | L8 unlock after 4th L7 | alpha |
| ✓ | Rust triggers (L4/L6/L8) | alpha |
| ✓ | 8 named phases | alpha |
| ✓ | Tile colour by phase | alpha |
| ✓ | Status flags | alpha |
| ✓ | Consolidation event on L5 | alpha |
| ✓ | National corp type | alpha |
| ✓ | Level 3 restriction first OR | alpha |
Track Laying9/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-town | alpha |
| ✓ | OE4–OE8 yellow city | alpha |
| ✓ | OE12–OE18 green city | alpha |
| ✓ | OE23–OE33 brown city | alpha |
| ✓ | OE34–OE44 gray city | alpha |
| ✓ | Tile point budgets | alpha |
| ✓ | Tile point costs | alpha |
| ✓ | TILE_UPGRADES_MUST_USE_MAX_EXITS | alpha |
| ✓ | Metropolis upgrade labels | alpha |
| ✗ | 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 | alpha |
Token Placement3/3
Zone restriction
Connectivity check
Nationals skip token step
3 done
| ✓ | Zone restriction | alpha |
| ✓ | Connectivity check | alpha |
| ✓ | Nationals skip token step | alpha |
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 data | alpha |
| ✗ | Local train town counting: towns beyond city limit fill to train level; express trains skip towns | beta |
| ✗ | Combined train runs: Level ≤4 trains combine (sum); Level 5+, 4D, 5D cannot combine | beta |
| ✗ | Cross-water costs: Ferry = +£5 track / +£20 token × distance; Sea = +£10 track / +£40 token × zones | beta |
| ✗ | Ferry mechanics: distance counts against city limit; public ferry usable by any RR; enemy tokens block | beta |
| ✗ | 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 costs | beta |
| ✗ | 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 | beta |
| ✗ | Port types: public (any RR) vs private (owning RR only) | beta |
| ✗ | Offshore port mechanics: train connects regardless of intervening hexes | beta |
| ✗ | Channel passages at Copenhagen and Constantinople | beta |
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 track | beta |
| ✗ | First-time bonus: £30 (Ph2–4), £60 (Ph5–6), £100 (Ph7–8); OE marker placed on major | beta |
| ✗ | +3 RIGHT on first OE run (also §6b) | beta |
| ✗ | Train combining: Level ≤4 combine; combined level = sum; city limit = combined level | beta |
| ✗ | Subsequent OE runs: no bonus, no extra stock movement | beta |
| ✗ | Mandatory OE: if OE route is best possible, president must run it | beta |
| ✗ | OE blocked for nationals | beta |
| ✗ | D-train bonus does NOT apply to OE first-time bonus | beta |
Pullman Cars0/8
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 company | alpha |
| ✗ | Revenue bonus: +£10 × assigned train level, once per OR | alpha |
| ✗ | Purchase from Minor M: £150 + £15 royalty; J-minor discount on price only | alpha |
| ✗ | Purchase from Open Market: £150, no royalty; available Phase 4+ | alpha |
| ✗ | Purchase from another RR: negotiated price | alpha |
| ✗ | Minor M free Pullman: if Minor M not closed at Phase 4 start, places free Pullman | alpha |
| ✗ | Discard order: rusted trains first; Pullman voluntarily returnable to Open Market | alpha |
| ✗ | Company with zero trains but holds Pullman: retain until next train acquired | alpha |
Train Purchase4/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 obligation | alpha |
| ✓ | Phase-status check | alpha |
| ✓ | Depot level gating | alpha |
| ✓ | 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 value | alpha |
OR Steps (Major)7/10
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 price | alpha |
| ✓ | Lay Track | alpha |
| ✓ | Place Token | alpha |
| ✓ | Run Trains / Revenue | alpha |
| ✓ | Pay / Split / Hold | alpha |
| ✓ | Buy Trains | alpha |
| ✓ | 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 vestigial | alpha |
| ✗ | 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 | beta |
| ✗ | 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 | beta |
Stock Rounds5/9
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 order | alpha |
| ✓ | Home token in SR | alpha |
| ✓ | Regional→major conversion | alpha |
| ✓ | Share issuance for majors | alpha |
| ✓ | Change of presidency | alpha |
| ✗ | Voluntary regional removal — player may remove one unfloated regional during Regional/Minor Phase; max 6 total | alpha |
| ✗ | 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 | alpha |
| ✗ | Trade with another player — during own SR turn, controlling player may offer personal share trade to any other player; recipient not obligated to accept | alpha |
| ✗ | +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 minor | alpha |
| ✓ | Floating a regional | alpha |
| ✓ | Floating a major | alpha |
| ✗ | Forming a national (trigger): phase 4/6/8 purchase → `trigger_nationals_formation!` → ordered queue | beta |
| ✗ | Forming a national (steps): `Step::ConvertToNational` — cash→bank, treasury certs→OM, tokens removed, national placed, trains inherited | beta |
| ✗ | 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 | beta |
| ✗ | D minor token and L minor marker stay with their charters on abandonment | beta |
| ✗ | M minor Pullman stays with charter on abandonment | beta |
Nationals3/12
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 limits | alpha |
| ✓ | National region hexes | alpha |
| → | Rusted train claim | beta |
| ✗ | `national_revenue`: linked/unlinked split, best-first, D-train double, flat-rate fill; `[:payout]` only | beta |
| ✗ | 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 done | beta |
| ✗ | 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 formation | beta |
| ✗ | Exchange owned rusted train for higher-level unclaimed rusted train | beta |
| ✗ | Flip owned rusted train from express to local side | beta |
| ✗ | Upgrade rusted → non-rusted by purchasing from same-owner major | beta |
L5 trigger scaffold
Conditional merger: major/national may offer; if no offer, company is abandoned
1 done · 1 todo
| ✓ | L5 trigger scaffold | alpha |
| ✗ | Conditional merger: major/national may offer; if no offer, company is abandoned | beta |
Token Transfer Between Majors0/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 majors | alpha |
| ✗ | 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 position | alpha |
Minor Mergers3/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 action | beta |
| → | Plumbing / can_merge | beta |
| → | merge_minor! | beta |
| ✗ | **7.1** Ability transfer — minor merges into regional/major; ability inherited; nationals cannot inherit | beta |
| ✗ | **7.2** Minor A (Silver Banner) — bank pays major current share price at moment of merger | beta |
| ✗ | No-stock connection check: merge only if unlimited-city train can reach minor's token to major's network | beta |
| ✗ | Player choice on token conflict and train decline | beta |
| ✗ | Cross-player personal cash side payment UI | beta |
| ✗ | Solicit-offers rule for unmergeable minors | beta |
| ✗ | Cannot pass in Consolidation Phase if owns unfloated minors/regionals not yet merged | beta |
| ✗ | Consolidation Round forced mergers (§10.6) — hook into `Step::Consolidate` | beta |
End Game5/6
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 timing | alpha |
| ✓ | L8 purchase end trigger | alpha |
| ✓ | Remainder cash injection | alpha |
| ✓ | Bankrupt trigger removed | alpha |
| ✗ | Second final OR: each company pays same revenue as first final OR; no track/token/train actions (BUG-026) | beta |
Minor Abilities7/12
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 Scroll | alpha |
| ✓ | E – Blue Coast | alpha |
| ✓ | F – White Peak | alpha |
| ✓ | G – Indigo Foundry | alpha |
| ✓ | K – Vermilion Seal | alpha |
| → | J – Grey Locomotive | alpha |
| → | **C** (Golden Bell) — pre-OR blocking choice step (GoldenBellChoice); `first`/`last`/`normal`; entity order rebuilt from `operating_order` after choice | alpha |
| ~ | **D** (Green Junction) — DTokenPlacement step; assign action during track window; any non-metro non-offboard city; Phase 5 transition already wired | alpha |
| ~ | **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 ferry | beta |
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 test | alpha |
| ~ | **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 | alpha |
| ~ | **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 charged | beta |
| ~ | **Star Harbor** — `token` (extra_slot, special_only) wired; **still needed**: port routing, revenue exclusion, SR window | beta |
| ~ | **White Cliffs Ferry** — `token` (hexes: ['N31']) wired; **still needed**: Phase 5 start event hook + ferry routing | beta |
| ✗ | **8.2** Barclay, Bevan, Barclay & Tritton — owner selects one of three abilities at time of use | alpha |
| ✗ | **8.8** Swift Metropolitan Line — from Phase 4, one controlled RR may keep one 2+2 outside train limit | alpha |
Patronage Tiles0/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 removed | beta |
| ✗ | 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 | beta |
Variants & Scenarios0/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 rules | alpha |
| — | UK-FR map hex definitions | alpha |
| — | Medium / short scenarios — reduced RR counts, modified OE destinations | alpha |
Tests0/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 raise | alpha |
| ✗ | 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 transfer | alpha |
| ✗ | Pullman car revenue | alpha |
| ✗ | National revenue calculation | beta |
| ✗ | 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 |