The first version of these plans was a scatter of scenery positions - an
impression of a track rather than a picture of one. The game already draws
the real thing: the map screen in the pod renders the track from above every
race, so the plans now reconstruct that instead of approximating it.
NavDisplay::DrawStatic walks the static entities, looks up each one's
L4GaugeImage by resource id, and draws it through localToWorld x
worldToView. navmap.py does the same offline. The pieces that made it
possible:
- a map instance carries its model's GaugeImage id at +44, beside the
position at +48 and the quaternion at +60;
- a GaugeImage is a vertex array plus per-LOD polylines through it, in
world units - cn3 is an 89x5 wall segment, pit1 a 500x300 pit;
- a placement whose model has no gauge image is skipped here exactly as
DrawStatic skips it, which is why a card can report fewer placements
carrying map art than the track contains.
The difference is not subtle. Wiseguy's Wake and Paingod's Passage resolve
into twin canyon walls running their length, Brewer's Bane into an L-shaped
route through junction chambers, and both arenas into a lattice of obstacles
inside a boundary wall. What is still missing is the driving surface: the
map draws what lines the route, never the tarmac.
tools/pages/navmap.py carries the reader, and the README documents both the
instance record and the gauge image stream. Regenerating from the committed
generators reproduces the committed page byte for byte.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
62 lines
3.1 KiB
Smarty
62 lines
3.1 KiB
Smarty
<!doctype html>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Red Planet - the tracks</title>
|
|
<style>{css}</style>
|
|
|
|
<header class="top">
|
|
<div class="wrap">
|
|
<p class="eyebrow">Red Planet 4.12 · plans drawn from RPL4.RES</p>
|
|
<h1>Every track,<br><em>seen from above</em></h1>
|
|
<p class="lede">There are no track maps in the game's files — the console had
|
|
pictures of them and those pictures did not survive. But the game draws one every
|
|
race: the map screen in the pod renders the track from above. <strong>These plans
|
|
are that same drawing, reconstructed outside the game</strong> — the same
|
|
outlines, from the same placements, straight down.</p>
|
|
</div>
|
|
</header>
|
|
|
|
<div class="bar">
|
|
<div class="wrap bar__in">
|
|
<div class="seg" role="group" aria-label="Filter">
|
|
<button type="button" data-filter="all" aria-pressed="true">All</button>
|
|
<button type="button" data-filter="arcade" aria-pressed="false">Arcade</button>
|
|
<button type="button" data-filter="r411" aria-pressed="false">4.11</button>
|
|
<button type="button" data-filter="later" aria-pressed="false">Community</button>
|
|
<button type="button" data-filter="race" aria-pressed="false">Death race</button>
|
|
<button type="button" data-filter="football" aria-pressed="false">Football</button>
|
|
</div>
|
|
<input id="search" class="search" type="search" placeholder="Search track…"
|
|
aria-label="Search track">
|
|
<span class="count" id="count">{n} / {n} TRACKS</span>
|
|
</div>
|
|
</div>
|
|
|
|
<main class="wrap">
|
|
<div class="key">
|
|
<span><i style="background:var(--ink-mid)"></i>What the map screen draws — walls, structures, pit</span>
|
|
<span><i style="background:var(--sys)"></i>Offered for the death race</span>
|
|
<span><i style="background:var(--pilot)"></i>Offered for football</span>
|
|
</div>
|
|
|
|
<div class="grid">{cards}</div>
|
|
<p class="empty-state" id="nomatch" hidden>No track matches that.</p>
|
|
|
|
<p class="foot">{n} tracks: {arcade} shipped in the 4.10 arcade cabinets, {r411} added
|
|
in 4.11, {later} built by the community afterwards. Each plan follows
|
|
<code>NavDisplay::DrawStatic</code>: for every placement in the map's instance
|
|
stream, look up that model's <code>GaugeImage</code> — a small set of outlines
|
|
in world units, the same ones the pod's map screen draws — and lay it down
|
|
rotated and positioned. A placement whose model has no gauge image is skipped here
|
|
exactly as the map screen skips it, which is why a card can say fewer placements
|
|
carry map art than the track contains.</p>
|
|
<p class="foot">So the walls are the canyon walls and the chambers are real chambers,
|
|
but there is still no driving surface: the map draws what lines the route, never the
|
|
tarmac. Extent and relief are the span of the drawn outlines in world units, so a
|
|
long thin plan is a point-to-point 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.</p>
|
|
</main>
|
|
|
|
<script>{js}</script>
|