From 0e39075a20785f832597d337d6d428bafb084e3a Mon Sep 17 00:00:00 2001
From: Cyd
Date: Fri, 7 Aug 2026 15:07:36 -0500
Subject: [PATCH] The track plans are the map screen's drawing again
With the models resolving properly there is nothing left to infer, so the
inference goes. Out: the gate tracing, the route/field test, the collapse
of each wall bar to a centreline, the dropping of "isolated" placements.
Every one of those existed to make sense of a track that appeared to be
one model repeated, and it is not.
What is left is what the map screen does. Every placement, its model's
GaugeImage looked up by name, laid down rotated and positioned, at the
LOD the engine would pick for that scale, in the palette the display is
configured with, on the display's own black. So the walls are grey
because index 51 is grey and the score zones are amber because sc50 and
sc500a are drawn in 56 - nothing on the page is a styling choice.
Also right way round now: +X runs right and +Z up, matching the engine and
the map viewer. The nine console pictures are still here, below each
drawing where they exist, captioned as mirrored - they are illustrations
rather than screenshots, and the page no longer quietly adopts their
handedness for everything else.
---
docs/tracks.html | 300 +++++++++---------
.../pages/__pycache__/navmap.cpython-314.pyc | Bin 17680 -> 11974 bytes
tools/pages/build_tracks.py | 235 ++++++--------
tools/pages/navmap.py | 263 +++++----------
tools/pages/tracks.css | 20 +-
tools/pages/tracks.tpl | 78 ++---
6 files changed, 374 insertions(+), 522 deletions(-)
diff --git a/docs/tracks.html b/docs/tracks.html
index f4490b5..600aa0d 100644
--- a/docs/tracks.html
+++ b/docs/tracks.html
@@ -110,17 +110,25 @@ h1 em { font-style: normal; color: var(--sys); }
.plan {
margin: 0 0 1rem; display: flex; flex-direction: column;
- align-items: center; gap: .5rem;
+ align-items: center; gap: .45rem;
}
+.plan--console { margin-top: -.4rem; opacity: .85; }
.plan__src {
- font: 500 var(--step--1)/1 var(--mono); letter-spacing: .1em;
+ font: 500 var(--step--1)/1.3 var(--mono); letter-spacing: .08em;
text-transform: uppercase; color: var(--ink-low); text-align: center;
}
+
+/* The map screen's own drawing: a real image in the game's palette on the
+ display's own black, so it reads the same in either theme. */
.plan__img {
- /* The mask is drawn with contain, so clamping the box letterboxes the
- art rather than stretching it - a portrait console map stays legible
- beside a squat arena. */
- display: block; width: 100%; max-width: 15rem; max-height: 22rem;
+ display: block; width: 100%; max-width: 15rem; max-height: 24rem;
+ height: auto; object-fit: contain; background: #000;
+ border: 1px solid var(--rule); image-rendering: pixelated;
+}
+
+/* The console's picture is line art, so it is tinted like type instead. */
+.plan__mask {
+ display: block; width: 100%; max-width: 11rem; max-height: 18rem;
aspect-ratio: var(--ar);
background-color: var(--ink-mid);
-webkit-mask-image: var(--art); mask-image: var(--art);
@@ -186,12 +194,11 @@ h1 em { font-style: normal; color: var(--sys); }
Red Planet 4.12 · plans drawn from RPL4.RES
Every track, seen from above
-
There are no track maps in the game's files. Nine of these are the
- next best thing: the setup console's own pictures, score zones and
- drop zone labelled, recovered and shown here as they were drawn. The other nine
- never had one — so their plan comes from the track itself. Almost every track
- is a single piece repeated, a wall thrown across the route with a gate in the
- middle, and every gate is a point the race passes through.
+
There are no track maps in the game's files, but the game draws
+ one every race: the map screen renders the track from above. These plans
+ are that same drawing, reconstructed outside the game — the same
+ models, the same placements, the same palette, straight down. Nine tracks also
+ have the picture the setup console showed, and those are here too.
- The course, gate by gate
+ Walls
+ Score zones
+ Drop zone and markersOffered for the death raceOffered for football
- The console’s own map
+ The map screen’s own drawingThe console’s picture — mirrored against the game
Paingod's Passage
pain
ARCADE 4.10DEATH RACE
-
Instances
255
+
Placements
255
+
Drawn
138
Cameras
18
Start boxes
12
-
Extent
1132 × 7775
-
Relief
110
+
Extent
503 × 7223
-
137 of 255 placements are drawn; the rest carry no map art or stand alone off the course
+
138 of 255 placements are drawn; the rest are models with no map art, which the map screen skips too
- The console’s own map
+ The map screen’s own drawingThe console’s picture — mirrored against the game
Blade's Edge
blade
ARCADE 4.10DEATH RACEFOOTBALL
-
Instances
216
+
Placements
216
+
Drawn
141
Cameras
21
Start boxes
7
-
Extent
800 × 7350
-
Relief
86
+
Extent
78 × 6786
-
159 of 216 placements are drawn; the rest carry no map art or stand alone off the course
+
141 of 216 placements are drawn; the rest are models with no map art, which the map screen skips too
- The console’s own map
+ The map screen’s own drawingThe console’s picture — mirrored against the game
Yip's Yahoorama
yip
ARCADE 4.10DEATH RACEFOOTBALL
-
Instances
127
+
Placements
127
+
Drawn
77
Cameras
20
Start boxes
17
-
Extent
880 × 6344
-
Relief
95
+
Extent
115 × 5854
-
82 of 127 placements are drawn; the rest carry no map art or stand alone off the course
+
77 of 127 placements are drawn; the rest are models with no map art, which the map screen skips too
- The console’s own map
+ The map screen’s own drawingThe console’s picture — mirrored against the game
Berserker's Bahnzai
otto
ARCADE 4.10DEATH RACEFOOTBALL
-
Instances
203
+
Placements
203
+
Drawn
132
Cameras
24
Start boxes
16
-
Extent
880 × 6344
-
Relief
105
+
Extent
119 × 5773
-
163 of 203 placements are drawn; the rest carry no map art or stand alone off the course
+
132 of 203 placements are drawn; the rest are models with no map art, which the map screen skips too
- The console’s own map
+ The map screen’s own drawingThe console’s picture — mirrored against the game
Firestorm's Fury
frstrm
ARCADE 4.10DEATH RACEFOOTBALL
-
Instances
325
+
Placements
325
+
Drawn
117
Cameras
20
Start boxes
15
-
Extent
880 × 6344
-
Relief
50
+
Extent
80 × 5773
-
119 of 325 placements are drawn; the rest carry no map art or stand alone off the course
+
117 of 325 placements are drawn; the rest are models with no map art, which the map screen skips too
- The console’s own map
+ The map screen’s own drawingThe console’s picture — mirrored against the game
Wiseguy's Wake
wise
ARCADE 4.10DEATH RACEFOOTBALL
-
Instances
133
+
Placements
133
+
Drawn
78
Cameras
16
Start boxes
9
-
Extent
880 × 6030
-
Relief
47
+
Extent
80 × 5450
-
Same footprint and instance count as -- Wiserguy's --
81 of 133 placements are drawn; the rest carry no map art or stand alone off the course
+
Same footprint and instance count as -- Wiserguy's --
78 of 133 placements are drawn; the rest are models with no map art, which the map screen skips too
- The console’s own map
+ The map screen’s own drawingThe console’s picture — mirrored against the game
Burnt Cookies
burnt
ARCADE 4.10DEATH RACEFOOTBALL
-
Instances
251
+
Placements
251
+
Drawn
97
Cameras
17
Start boxes
3
-
Extent
300 × 5300
-
Relief
40
+
Extent
90 × 5200
-
118 of 251 placements are drawn; the rest carry no map art or stand alone off the course
+
97 of 251 placements are drawn; the rest are models with no map art, which the map screen skips too
- The console’s own map
+ The map screen’s own drawingThe console’s picture — mirrored against the game
Brewer's Bane
brewers
ARCADE 4.10DEATH RACEFOOTBALL
-
Instances
607
+
Placements
607
+
Drawn
201
Cameras
20
Start boxes
20
-
Extent
3210 × 4725
-
Relief
115
+
Extent
2875 × 4385
-
220 of 607 placements are drawn; the rest carry no map art or stand alone off the course
+
201 of 607 placements are drawn; the rest are models with no map art, which the map screen skips too
- The console’s own map
+ The map screen’s own drawingThe console’s picture — mirrored against the game
Lyz's Lane
lyzlane
ARCADE 4.10DEATH RACEFOOTBALL
-
Instances
105
+
Placements
105
+
Drawn
82
Cameras
12
Start boxes
44
-
Extent
455 × 4220
-
Relief
15
+
Extent
162 × 4170
-
84 of 105 placements are drawn; the rest carry no map art or stand alone off the course
+
82 of 105 placements are drawn; the rest are models with no map art, which the map screen skips too
- Course traced from the gates
+ The map screen’s own drawing
Freezemoon's Freeway
headoff
ADDED 4.11DEATH RACE
-
Instances
264
+
Placements
264
+
Drawn
87
Cameras
18
Start boxes
5
-
Extent
300 × 4900
-
Relief
44
+
Extent
90 × 4800
-
113 of 264 placements are drawn; the rest carry no map art or stand alone off the course
+
87 of 264 placements are drawn; the rest are models with no map art, which the map screen skips too
- Course traced from the gates
+ The map screen’s own drawing
Freezemoon's Freeway (Football)
headmf
ADDED 4.11FOOTBALL
-
Instances
274
+
Placements
274
+
Drawn
83
Cameras
18
Start boxes
5
-
Extent
300 × 4900
-
Relief
44
+
Extent
90 × 4800
-
107 of 274 placements are drawn; the rest carry no map art or stand alone off the course
+
83 of 274 placements are drawn; the rest are models with no map art, which the map screen skips too
- Course traced from the gates
+ The map screen’s own drawing
-- Tour De Mars --
tourdemars
COMMUNITYDEATH RACE
-
Instances
607
+
Placements
607
+
Drawn
351
Cameras
20
Start boxes
20
-
Extent
800 × 20648
-
Relief
79
+
Extent
162 × 20338
-
391 of 607 placements are drawn; the rest carry no map art or stand alone off the course
+
351 of 607 placements are drawn; the rest are models with no map art, which the map screen skips too
- Wall blocks — no single course to trace
+ The map screen’s own drawing
-- Ares' Armpits --
trough
COMMUNITYDEATH RACE
-
Instances
633
+
Placements
633
+
Drawn
320
Cameras
16
Start boxes
9
-
Extent
625 × 6200
-
Relief
186
+
Extent
260 × 6122
-
417 of 633 placements are drawn; the rest carry no map art or stand alone off the course
-
-
-
- Course traced from the gates
-
-
-- Wiserguy's --
-
wiserguys
-
COMMUNITYDEATH RACE
-
-
Instances
133
-
Cameras
16
-
Start boxes
9
-
Extent
880 × 6030
-
Relief
72
-
-
Same footprint and instance count as Wiseguy's Wake
86 of 133 placements are drawn; the rest carry no map art or stand alone off the course
+
320 of 633 placements are drawn; the rest are models with no map art, which the map screen skips too
- Course traced from the gates
+ The map screen’s own drawing
-- Zaxxis --
rpweekend2014
COMMUNITYDEATH RACE
-
Instances
695
+
Placements
695
+
Drawn
134
Cameras
40
Start boxes
3
-
Extent
450 × 5890
-
Relief
87
+
Extent
108 × 5815
-
164 of 695 placements are drawn; the rest carry no map art or stand alone off the course
+
134 of 695 placements are drawn; the rest are models with no map art, which the map screen skips too
+
+
+
+ The map screen’s own drawing
+
+
-- Wiserguy's --
+
wiserguys
+
COMMUNITYDEATH RACE
+
+
Placements
133
+
Drawn
82
+
Cameras
16
+
Start boxes
9
+
Extent
80 × 5450
+
+
Same footprint and instance count as Wiseguy's Wake
82 of 133 placements are drawn; the rest are models with no map art, which the map screen skips too
- Course traced from the gates
+ The map screen’s own drawing
-- Donut --
donut
COMMUNITYDEATH RACE
-
Instances
325
+
Placements
325
+
Drawn
98
Cameras
20
Start boxes
15
-
Extent
3250 × 3100
-
Relief
10
+
Extent
2800 × 2800
-
96 of 325 placements are drawn; the rest carry no map art or stand alone off the course
+
98 of 325 placements are drawn; the rest are models with no map art, which the map screen skips too
- Wall blocks — no single course to trace
+ The map screen’s own drawing
-- Arena (Large) --
demoderb
COMMUNITYDEATH RACE
-
Instances
455
+
Placements
455
+
Drawn
4
Cameras
17
Start boxes
3
-
Extent
1880 × 1880
-
Relief
0
+
Extent
1800 × 1800
-
4 of 455 placements are drawn; the rest carry no map art or stand alone off the course
+
4 of 455 placements are drawn; the rest are models with no map art, which the map screen skips too
- Course traced from the gates
+ The map screen’s own drawing
-- Arena (Small) --
arena
COMMUNITYDEATH RACE
-
Instances
695
+
Placements
695
+
Drawn
130
Cameras
17
Start boxes
3
-
Extent
1618 × 1568
-
Relief
23
+
Extent
1550 × 1500
-
128 of 695 placements are drawn; the rest carry no map art or stand alone off the course
+
130 of 695 placements are drawn; the rest are models with no map art, which the map screen skips too
No track matches that.
18 tracks: 9 shipped in the 4.10 arcade cabinets, 2 added
- in 4.11, 7 built by the community afterwards. Drawing what the pod's map screen
- draws turns out not to give a map. That screen follows
- NavDisplay::DrawStatic, laying down each placement's
- GaugeImage, and nearly every placement in every track is the same
- piece: cn3, whose image is two 25×5 bars at x 19.5–44.5
- and -44.5–-19.5. That is not a wall running along the route, it is a wall thrown
- across it with a 39 unit gate in the middle, and the piece's collision solid says the
- same. A few hundred of those is a row of ticks, not a course.
-
But the gate is the point: cn3's own origin sits in the
- opening, so every placement marks somewhere the race passes through. Walk the gates in
- the order the course visits them — nearest to nearest, starting from the end
- furthest out, beginning a new line rather than reaching when the next gate is too far
- — and the track draws itself. Walls stacked for height repeat the same opening
- and count once. Placements standing alone more than 200 units from any other are
- dropped: fourteen tracks park a single piece at (1200, 0, 0) well off the
- course, and one stray placement stretches the frame to twelve times the width of the
- track. A real branch keeps its neighbours and stays — Paingod's second canyon is
- sixty pieces out at x = -400.
-
One track is drawn the other way. Chaining nearest neighbours across a
- regular grid invents a maze-like path out of nothing but the order the points happened
- to be visited in, and a plan has no business inventing a track layout. So each track is
- tested first: count how many neighbours a gate has within 1.6× the typical
- spacing. A corridor gives each gate the one ahead and the one behind; a floor of
- obstacles gives it four or more. Seventeen tracks score 1 or 2 and are drawn as a
- course. The large arena scores 8 on an exact 100 unit grid, so it keeps its wall blocks
- instead — and the small arena, which scores 2, really is the maze it looks like.
-
The console's nine pictures also check the other nine. Brewer's Bane is
- the one track with a shape distinctive enough to be wrong in an obvious way, and the
- reconstruction matches the picture turn for turn — long leg up one side to Score
- Zone 1, the corner, the run out to Score Zone 2, junction chambers spaced along it. It
- matched mirrored, which is how the projection came to be corrected: seen from above
- with +Z up the page the engine's +X runs to the left, and every plan here had
- been drawn the other way round. The tracks with no picture are now drawn the same way
- round as the tracks with one.
+ in 4.11, 7 built by the community afterwards. Each plan follows
+ NavDisplay::DrawStatic: for every placement in the track's instance
+ stream, look up that model's GaugeImage and lay it down rotated and
+ positioned, at the LOD the engine would choose for this scale. Colours are palette
+ indices resolved through secpal.pcc, the palette the pod's secondary
+ port is configured with, on the display's own black — so the walls really are
+ grey, the score zones really are amber, and nothing here is a styling choice.
+
A record is an Entity::MakeMessage
+ (MUNGA/ENTITY3.h), read by InterestManager::LoadMapStream,
+ and it carries its own length — most placements are 76 bytes but every track
+ has eight of 140, two of 80 and one of 336. It names the model's Model List,
+ whose GaugeImage is filed under the same model name, so the name is the
+ join. Models with no gauge image — oao, snAwork,
+ pz1 — are skipped here exactly as the map screen skips them, which
+ is why a card can draw fewer placements than the track contains.
+
Seen from above the engine's +X runs right and +Z up:
+ L4GaugeImagePrimitive::Draw plots (x, z) and the graphics
+ view's origin is bottom left. The console's own pictures are mirrored
+ against that — they are illustrations, not screenshots — so where a card
+ shows both, the two are handed differently and each is right for what it is.
There is still no driving surface anywhere in the file: the track is
- walls and gates, never tarmac. Extent and relief are the span of the placed geometry in
- world units, so a long thin plan is a point-to-point canyon run — most of the
- arcade tracks are exactly that, a few hundred units wide and several thousand long
- — and a squat one is a circuit or an arena. Tracks marked NOT IN THE MENU exist
- in the resource file but the setup screen does not offer them.
+ walls, zones and markers, never tarmac. Extent is the span of the placements in world
+ units, so a long thin plan is a point-to-point canyon run and a squat one a circuit
+ or an arena. Tracks marked NOT IN THE MENU exist in the resource file but the setup
+ screen does not offer them.