The video shows a night run. The game has a day/night cycle, and this time I wanted to show what night looks like. Night is more dangerous: guards go out on patrol, searchlights sweep for targets, mines go off faster. The trade-off is meant to be better loot.
Hi! This is part 5 about The Last Sand, a post-apocalyptic game I’m building with AI agents. Opus 5.5 and Codex (GPT-6 Astra) write the code and assemble scenes, models are built in Blender via MCP, and the engine is Godot.
The process has settled down by now. I rarely give “do X” commands. First the agent and I work out what the game needs and check it against the project’s principles and our rules for building assets, zones and locations. We don’t reinvent things: we lean on best practices that developers of similar games share publicly. That turns into a task list the agents work through on their own. They build, launch the game through Godot MCP, capture screenshots and measurements, and keep going until it meets the bar. I review the results, give feedback and make the calls.
A time bomb
I’m not a game developer, and this part is mostly about the consequences of that. Early on, Codex built the project fast but left no room for the world to grow: no streaming in small chunks, no budgets for models, no caches. That’s not a complaint. It did what I asked, and I didn’t know to ask for any of this. While the world was small, it didn’t matter. Once I started filling it with locations and enemies, FPS dropped, and the car would hit an invisible wall at the entrance to the village.
When Opus 5.5 dug in, here’s what it found:
- a raider guard had 23 materials and 98k triangles; the pickup with its crew had 461k triangles and 33 materials;
- 78 of 192 assets were over budget, and a single campfire was made of 159 parts;
- the ground recomputed its entire formula for every pixel every frame, which took up to 15 ms of a roughly 28 ms frame;
- the world loaded in whole 240 m chunks. Until a chunk was ready, there was a wall at its edge, and the car would sit there for 8–13 seconds;
- one drive along the test route made about 5,800 synchronous reads back from the GPU.
Opus took on the whole rework. I set one rule: no one-off fixes. You don’t fix “this fence”, you fix the mechanism for the whole class of objects, so new content gets the optimizations automatically.
What’s been done
- Ground via a virtual texture. The finished ground surface is cached around the camera and drawn once per patch instead of every frame. Frames got 5–12 ms faster with the same image, and now the ground can get more detailed without costing FPS.
- The world in 60 m cells instead of 240 m chunks. Collisions and a simplified view of the whole world are ready at load time, and detail streams in as you approach. The wall is gone. The area with the village used to take 21 s to be ready; now it takes 5.5 s. The longest frame on the drive went from 241 ms to about 60.
- Hunting stutters. The agent wrote a test drive that breaks every slow frame down by system. GPU reads went from 5,800 to 2, and frames over 33 ms from 45 to 3. The funniest find: whenever an oil-spill marker appeared, it recalculated the materials of the entire world, which ate 60 ms. On a MacBook Air M4: Low 49 → 78 FPS, High 32–36 → 60.
- Grass and ground cover. Grass is painted with a brush, and the game scatters the plants itself, thicker around rocks and walls. Tufts are built from cards with an atlas rendered from 3D plants in Blender: 20 triangles instead of 380–1500. Cars push the grass aside.
- Night lighting. A “light that’s still alive” set: gas station price signs, vending machines, a traffic light blinking yellow, sparking transformers, BAR and MOTEL signs, a TV showing static. Each object has its own damage story and a visible repair, and each flickers in its own way. Power lines and string lights are drawn by hand in the editor.
- Locations. A machine depot cut into a rock ridge on three levels, a dense village, and a gas station with a raider camp (the canopy turns see-through when your car is under it). The starting base moved off hardcoded logic onto the shared pipeline, and it finally feels lived-in.
- Enemies.
- A turret, a bunker with a searchlight and a patrol drone.
- A tank that visibly winds up before each shot.
- A bulldozer with a rocket pod: it marks the impact zone on the ground and rams with its blade.
- And since we’re talking bombs, an actual road mine. When it’s armed, the only giveaways are an antenna and dug-up sand. Once it triggers, you have 1.7 s by day and 0.9 s at night to get away.
- The world reacts. When shooting starts, villagers run into houses or crouch with their hands over their heads. The car drives over small debris, guardrails fold under it, and it slides off rocks instead of stopping dead.
- The agent checks its own work. It has around 170 regression tests, FPS measurements along the route by day and by night, and A/B frame breakdowns by object class. I don’t have to take its word for anything anymore.
Where I’m not sure
I’d like input from people who’ve been doing this longer than I have.
- At night, the buggy’s headlights (6 spotlights reaching 50 m) cost about 7 ms. The agent suggested replacing each pair with a single spotlight using a two-beam texture, and I said no. Maybe that was a mistake.
- The most expensive single item in the frame turned out to be asphalt: its shader is the full ground shader with asphalt layered on top.
- Upscaling on Mac: MetalFX Temporal smears in motion, while Spatial is sharper and even faster but leaves thin edges jagged.
- I measure everything on a fanless MacBook Air, but I want to ship on Steam for Windows. What would you pick as the minimum target machine?
And the main question
I can’t decide what’s next. I could keep polishing: water and swamps, visual upgrade levels for base buildings, sound, animations. Or I could expand the world now that the foundation can handle it: new areas, biomes, a family of enemies built on the rover. What would you do?
If you’re interested, I can show in the comments what a single task for the agent looks like, from the brief to the report with measurements.
Previous parts