A frame around the game
2026-10-24, a look back at the night.

Once the original played a whole race, the user set the shape of everything after it, in the spirit of Un-Banished: a frame around the original game. The original stays at the centre, unchanged. Everything else is a layer around it that can be added to, and switched off:
- a wrapper that runs every build of POD with modern rendering;
- Un-POD, an exact reimplementation, checked against the original;
- tools and mods on top: a track editor, a vehicle creator, replaced assets.
The user called it the GameFrame philosophy in its plainest form, and it is now at the head of the plan.
Five sessions, one night
Each layer went to its own session, in its own copy of the repository, with the instruction to merge into main early and often. Each wrote its own diary entry as it finished:
| Session | What it did | Its entry |
|---|---|---|
| Wrapper | glide.dll on OpenGL for the 3dfx build at any size; then our own ddraw.dll, ati3dcif.dll and S3DTKW.dll, so the ATI and S3 builds run too | A Voodoo of our own, The ATI and S3 builds |
| Mod layer | Writers for every format; a string, a menu image, a track texture and grip loaded in the real game | The first mods |
| Race loop | The race traced from the start lights to the results; a reference race recorded, every time matching the screen | How a race runs |
| Race rules | crates/pod-race replays the reference race to the original's exact results | The race rules in Rust |
| Track editor | Editing in the viewer behind a build option; a raised road, a texture and moved props shown in the game | The track editor |
By morning every build of POD ran, all of them in the emulated PC, which was the only place any of them would: the software one, the 3dfx one through our Glide at 1280 × 960, and the ATI and S3 ones through our own libraries. The original was moddable and recorded, and the first piece of the reimplementation was checked against it.

What clashed
One machine, three users. The emulated PC was shared. The wrapper session ran its tests on a second display (:2) so it would not disturb the game on :1. But the script that restarts the game stopped every display, so the mod session's restarts twice killed the wrapper's run in the middle. The fix is one line (stop only :1), and the lesson is general: a shared test machine needs each user's processes named, not matched by program name.
A push that would not go. Near the end, three sessions' work sat on the local main because pushing to GitHub failed: the SSH agent would not sign. Nothing was lost; the user unlocked the agent in the morning and ten commits went up at once.
A decision the night changed
The plan said the 3D-card builds would get true high-resolution 3D by replacing each card's library. That worked for 3dfx, where the card draws the whole scene. For ATI and S3, the wrapper session found something else: those cards draw only part of each frame, and the game's own software draws the rest into DirectDraw surfaces at 640 × 480. Two designs were on the table: make both builds run and scale the finished frame, or rewrite DirectDraw too and draw the cards' triangles at high resolution.
We chose to make them run first. Then the session measured what the S3 card actually draws in a race: 15,000 triangles, not one of them textured. It never even makes a texture surface. The textured scene is software in both builds, so high-resolution drawing would have sharpened only flat colours and shadows. That plan was dropped. The next gain for those two builds is a better scaler, and the 3dfx build stays the one with real high-resolution 3D.
Where it stands
All of it is on main and on GitHub. Still running this morning: the sharper scaler for the ATI and S3 builds, the race order between checkpoints for pod-race, and the question of which of the viewer's axes is height. The know-how layer in GameFrame (Teaching GameFrame) now holds the night's pitfalls as well as the evening's.