18OE — Map Implementation Status
For full rulebook picture → Rulebook Coverage · All open gaps → Open for Alpha
Overall Status
| Area | Status | Notes |
|---|---|---|
| Grid coverage | ✓ | 651 blue hexes |
| Regional home city coordinates | ✓ | All 24 |
| National region hex lists | ✓ | All 8 (UK, SC, FR, PHS, AH, IT, SP, RU) — NATIONAL_REGION_HEXES_COMPLETE = true |
| Location names | ✓ | All 255 |
| Sea zones | ✓ | 19 named zones with hex lists; borders encoded as type:province; port stubs on 37 sea tiles |
| Custom tile codes | ✓ | OE1–OE8, OE12–OE18, OE23–OE44 |
| Standard tile quantities | ✓ | Complete |
| Terrain costs | ✓ | UK, FR, SP, SC, Alps, IT, Adriatic, Carpathians, Balkans, Caucasus, river crossings |
| Station revenues | ✓ | All 255 named locations have correct starting revenue |
| Pre-printed yellows | ✓ | Liverpool J25, Manchester J27, Athinai AE72 |
| Pre-printed whites (path edges) | ~ | U24 Bordeaux: no edges (BUG-028); N31 Lille: edge 0 missing (BUG-029). M28/AA82/I20/O28/X33 edges added — verify moved to yellow: |
| Port icons | ✓ | 33 instances in map.rb; public/private classification is beta scope |
| Ferry paths / distances | ? | Outstanding |
| Double-town tile orientations | ? | OE9–11, OE20–22 outstanding |
| Logo SVGs | ✓ | All 36 corporations (minors A–M + all majors) |
Open Issues
No open map bugs.
| Section | Missing / Partial | Scope |
|---|---|---|
| Map & Components | ||
| 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 Laying | ||
| 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 | |
Current state of lib/engine/game/g_18_oe/map.rb. Tracks what is implemented, what is verified against the physical map, and what is still outstanding.
Map orientation: LAYOUT = :pointy, AXES = { x: :number, y: :letter } Coordinate system: rows A–Z then AA–AH (34 rows); columns 2–88.
Grid Bounds
A: 42-52, 66-74 B: 43-57, 63-81
C: 42-58, 64-66, 72-82 D: 41-57, 67-85
E: 24-28, 42-44, 48-58, 66-86
F: 23-29, 49-55, 69-85 G: 16-20, 24-28, 44-46, 50-56, 64-86
H: 15-21, 25-29, 43-47, 51-55, 63-87
I: 14-20, 26-28, 44-52, 64-86
J: 13-19, 23-29, 45-49, 63-87
K: 22-30, 40-50, 54-86 L: 23-31, 37-87
M: 22-30, 34-86 N: 31-85
O: 24, 28-86 P: 19-87
Q: 20-86 R: 23-87
S: 24-86 T: 23-81
U: 6-12, 22-80 V: 5-47, 51-79
W: 6-48, 54-78 X: 5-29, 33-37, 43-49, 55-77
Y: 2-28, 44-50, 56-78 Z: 3-27, 41, 45-51, 61-79
AA: 2-22, 48-54, 62-86 AB: 1-19, 27, 39-41, 51-57, 63-71, 77, 83-85
AC: 6-20, 38-40, 54-58, 64-68, 76-86
AD: 5-17, 39, 55, 65-71, 79-87
AE: 52, 68-72, 80-86 AF: 49-53, 67-69, 81-87
AG: 50-52, 68-70
Red (Off-Board) Hexes
19 red hexes. (A40 → blue/Skagerrak; E88 → removed entirely; AH87 → blue/no zone.)
A:54 A:56 North Sweden (×2) B:41 B:83 Bergen, Arkhangelsk
D:25 Scottish Highlands F:87 G:88 Moskva (×2; G88 = gray through-track)
N:1 N:87 New York, Kharkov S:88 T:87 Sevastopol (×2; S88 = gray through-track)
Z:1 Lisboa (2 station slots) AB:87 Levant
AD:1 North Africa & Americas AF:5 AF:11 AF:25 Casablanca, Melilla, Alger
AG:40 AG:88 Tunis, Alexandria & Suez
Off-Board Revenue Values
All best-guess — verify against physical map.
| Hex | Name | Revenues (y/g/b/gray) | Path edges | Notes |
|---|---|---|---|---|
| A54 | — | 1→4 | Gray through-track hex | |
| A56 | North Sweden | 30/50/80/100 | 0, 1, 4, 5 | |
| B41 | Bergen | 30/60/80/120 | 1, 3, 4 | |
| B83 | Arkhangelsk | 30/50/60/60 | none | confirm isolated or needs edge |
| D25 | Scottish Highlands | 20/40/50/50 | 0, 5 | |
| F87 | Moskva | 30/50/80/100 | 0, 1, 2, 5 | |
| G88 | — | 0→2 | Gray through-track hex | |
| N1 | New York | —/60/100/160 | 5 | no yellow phase |
| N87 | Kharkov | 30/40/60/80 | 0, 1, 2 | |
| S88 | — | 0→1 | Gray through-track hex | |
| T87 | Sevastopol | 30/40/60/80 | 1 | |
| Z1 | Lisboa (2 slots) | 30/40/60/80 | 3, 4 | city=revenue:0 ×2 also set |
| AB87 | Levant | 30/50/80/120 | 1, 2 | |
| AD1 | North Africa & Americas | —/40/80/120 | 4 | no yellow phase |
| AF5 | Casablanca | 30/40/60/80 | 3 | |
| AF11 | Melilla | 30/40/40/40 | 4 | |
| AF25 | Alger | 30/40/60/100 | 2, 3 | |
| AG40 | Tunis | 30/40/50/80 | 3, 4 | |
| AG88 | Alexandria & Suez | —/50/80/120 | 1 | no yellow phase |
Pre-Printed Tiles
✓ Complete
| Hex | City | Tile string |
|---|---|---|
| J25 | Liverpool | city=revenue:30;label=Y;path=a:2,b:_0;path=a:_0,b:4 |
| J27 | Manchester | city=revenue:20;upgrade=cost:30,terrain:mountain;path=a:1,b:_0;path=a:_0,b:4 |
| AE72 | Athinai | city=revenue:20;path=a:1,b:_0;path=a:5,b:_0 |
~ Partial / outstanding
| Hex | City | Current string | Status |
|---|---|---|---|
| U24 | Bordeaux | city=revenue:10;icon=image:port,sticky:1 | BUG-028 — no path edges at all |
| N31 | Lille | city=revenue:10;label=Y;border=edge:2,type:impassable;path=a:1,b:_0 | BUG-029 — edge 0 missing |
~ Verify white: → yellow: move
Edges have been added to these hexes in 18oe_testing; confirm they are now in the yellow: section (not white:) in map.rb:
| Hex | City | Verified edges |
|---|---|---|
| M28 | London | edge 5 present — verify edge and section |
| AA82 | Constantinople | edge 2 present — verify edge and section |
| I20 | Dublin | edge 4 present — verify edge and section |
| O28 | Le Havre | edge 1 present — verify edge and section |
| X33 | Marseille | edge 5 present — verify edge and section |
Sea Zones
19 named zones implemented. Zone borders encoded as border=edge:X,type:province on all boundary edges. Port-entry stubs on 37 sea tiles (junction;path=a:X,b:_0,terminal:1).
✓ All zones: Celtic Sea, North Atlantic Ocean, North Atlantic Silver Coast, Bay of Biscay, English Channel, North Sea, Skagerrak (incl. A40), German Bight, Gulf of Finland, Baltic Sea, Strait of Gibraltar, Balearic Sea, Sea of Sardinia, Tyrrhenian Sea, Adriatic Sea, Aegean Sea, Levantine Sea, Black Sea, Karkinitsky Bay.
Outstanding:
- ? Ferry paths — start hex+edge, end hex+edge, distance number
- ? Sea zone distance numbers for cost calculation
National Zone Boundaries
All 8 zones defined. NATIONAL_REGION_HEXES_COMPLETE = true. CITY_NATIONAL_ZONE overrides: Q38 → FR, O52 → PHS. MINOR_EXCLUDED_HOME_CITIES defined.
✓ Stale entries cleaned in 18oe_testing: A40 removed from SC, E88 removed from RU.
Terrain Costs
Carpathians (rows P–T, cols 55–75)
- £30: R51, Q70, O50, O68, P57
- £45: Q60, Q62, Q64, Q68, R61, R69, N45, O62, P55, T67, T71, T73
- £60: O54, R71, S52, S54, T49, T51
Balkans (rows X–AG, cols 55–80)
- £30: X65, Z63, Z69, Z75, AA68, AB53, AC66, AD65, AF69, AG50
- £45: X57, X61, X63, X67, Y62, Y68, Z61, Z65, Z71, AA64, AA72, AB67, AC54
- £60: X67, Z67, AA66, AA86, AB65
Caucasus (rows AA–AF, cols 80–88)
- £45: AD81, AD83, AE80, AF83
- £60: AA86, AB85, AE82, AE84
River Crossings
- £5: E78
- £30: N39, P41, K64, K66, L69, L71, L75, L77, M74, M76, M78, M80, N69–N79
- £45: K44, N81, O82, AE52
- £60: M34, T23, AB77, AC76, AD71, AG70
? Verify against physical map: Caucasus at AA86/AD81–AE84; river routing accuracy; combined terrain hexes (mountain + water).
Custom Tile Codes
✓ Implemented: OE1–OE8, OE12–OE18, OE23–OE44
? Outstanding — orientations unknown (double-town tiles, commented out):
| Code | Colour | Qty | Missing |
|---|---|---|---|
| OE9 | green | 3 | edge pair |
| OE10 | green | 3 | edge pair |
| OE11 | green | 3 | edge pair |
| OE20 | brown | 3 | edge pair |
| OE21 | brown | 2 | edge pair |
| OE22 | brown | 6 | edge pair |
| OE19 | ? | ? | tile type (gap between OE18 green and OE20 brown) |
? Do OE9–11 upgrade directly to OE20–22?
Ports and Ferry Routes
| Item | Status |
|---|---|
| Port city hexes (public light-blue / private red anchor) | ✓ 33 icon=image:port,sticky:1 instances in map.rb |
Ferry path stubs (14+ junction;path=...,terminal:1 hexes) | ✓ Stubs present |
| Ferry route paths (start hex+edge → end hex+edge, distance) | ? Numbers not yet defined |
| Sea zone distance numbers for cost calculation | ? Outstanding |
| North Sea port authority positions (8) | ? |
| Mediterranean port authority positions (8) | ? |
| White Cliffs Ferry token slot near Lille N31 | ? |
| Patronage tiles — fixed city list or game logic only? | ? |