18OE — Map Implementation Status

Bar weighted by section effort (L1 data = 1×).

Map & Components
46% · 23 / 37 items across map sections
Done 23
Needs PR 0
Partial 0
To do 14

Overall Status

AreaStatusNotes
Grid coverage651 blue hexes
Regional home city coordinatesAll 24
National region hex listsAll 8 (UK, SC, FR, PHS, AH, IT, SP, RU) — NATIONAL_REGION_HEXES_COMPLETE = true
Location namesAll 255
Sea zones19 named zones with hex lists; borders encoded as type:province; port stubs on 37 sea tiles
Custom tile codesOE1–OE8, OE12–OE18, OE23–OE44
Standard tile quantitiesComplete
Terrain costsUK, FR, SP, SC, Alps, IT, Adriatic, Carpathians, Balkans, Caucasus, river crossings
Station revenuesAll 255 named locations have correct starting revenue
Pre-printed yellowsLiverpool 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 icons33 instances in map.rb; public/private classification is beta scope
Ferry paths / distances?Outstanding
Double-town tile orientations?OE9–11, OE20–22 outstanding
Logo SVGsAll 36 corporations (minors A–M + all majors)
Map & Components
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
Track Laying
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
Token Placement
Zone restriction
Connectivity check
Nationals skip token step

Open Issues

No open map bugs.

SectionMissing / PartialScope
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
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

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.

HexNameRevenues (y/g/b/gray)Path edgesNotes
A54North Sweden1→4Gray through-track hex
A56North Sweden30/50/80/1000, 1, 4, 5
B41Bergen30/60/80/1201, 3, 4
B83Arkhangelsk30/50/60/60noneconfirm isolated or needs edge
D25Scottish Highlands20/40/50/500, 5
F87Moskva30/50/80/1000, 1, 2, 5
G88Moskva0→2Gray through-track hex
N1New York—/60/100/1605no yellow phase
N87Kharkov30/40/60/800, 1, 2
S88Sevastopol0→1Gray through-track hex
T87Sevastopol30/40/60/801
Z1Lisboa (2 slots)30/40/60/803, 4city=revenue:0 ×2 also set
AB87Levant30/50/80/1201, 2
AD1North Africa & Americas—/40/80/1204no yellow phase
AF5Casablanca30/40/60/803
AF11Melilla30/40/40/404
AF25Alger30/40/60/1002, 3
AG40Tunis30/40/50/803, 4
AG88Alexandria & Suez—/50/80/1201no yellow phase

Pre-Printed Tiles

✓ Complete

HexCityTile string
J25Liverpoolcity=revenue:30;label=Y;path=a:2,b:_0;path=a:_0,b:4
J27Manchestercity=revenue:20;upgrade=cost:30,terrain:mountain;path=a:1,b:_0;path=a:_0,b:4
AE72Athinaicity=revenue:20;path=a:1,b:_0;path=a:5,b:_0

~ Partial / outstanding

HexCityCurrent stringStatus
U24Bordeauxcity=revenue:10;icon=image:port,sticky:1BUG-028 — no path edges at all
N31Lillecity=revenue:10;label=Y;border=edge:2,type:impassable;path=a:1,b:_0BUG-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:

HexCityVerified edges
M28Londonedge 5 present — verify edge and section
AA82Constantinopleedge 2 present — verify edge and section
I20Dublinedge 4 present — verify edge and section
O28Le Havreedge 1 present — verify edge and section
X33Marseilleedge 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):

CodeColourQtyMissing
OE9green3edge pair
OE10green3edge pair
OE11green3edge pair
OE20brown3edge pair
OE21brown2edge pair
OE22brown6edge pair
OE19??tile type (gap between OE18 green and OE20 brown)

? Do OE9–11 upgrade directly to OE20–22?


Ports and Ferry Routes

ItemStatus
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??