How It's Made · Step 10 of 27
The navy arrives - and the explosion that burned the sea bed
unrealnavywatervfx

We added ships in early October: destroyers, a carrier, submarines, battleships, and later a whole third faction's fleet. A navy changes what a game has to get right. The sea is a very large part of the screen, it is always moving, and everything that happens on it is judged against a real-world intuition that nobody has about tanks.
The screenshot
On 9 October the owner sent a screenshot of a ship being hit. A flat ring of dust sat under the ship, a long way below it, like a crater on the bottom of the sea. It was precisely what it looked like.
The cause was a single function. Every effect asked the effects pool "where is the ground here?", and over water the answer was the sea bed. So the dust ring, the scorch mark and the crater were all drawn on the bed, deep under the ship, and shifted sideways by the camera's tilt. Nothing was wrong with the effects. They were just on the wrong floor.
The fix was in one place: over water, "ground" is now the water surface, and the recipes for explosions, impacts, cannon blasts and dirt turn their dust, rings and clods into white spray at the surface. Open-water hits throw water, not fire. A hit on a hull keeps its fireball at the hull and puts a ring on the waterline.
While we were in there
The owner's note that week was blunt: make the water look good, make the boats splash waves as they travel, and give hits and explosions ripples. The old surface had two moving normal maps and a flat sky colour. Ships left nothing on it.
We built it in two parts:
- A new surface material. Three wave layers moving down one wind at different speeds (the long ones faster), a slow noise field that makes calm and choppy patches so no repeat shows from the camera, a sky-gradient reflection, a soft sheen next to the sharp sun glint, and caustics in the shallows only.
- A water effects layer. One 1024-pixel texture follows the camera's view of the sea. Every frame it is drawn with ship wakes, bow waves, stern foam, hit rings and a whirlpool for sinking ships, capped at 192 rings and 64 wakes. The surface material reads it.


The projectiles
The same day, the glowing blocks that stood in for ammunition were replaced. Shells, rockets, missiles, bombs and torpedoes are now small shaped models with trails and smoke, flying on their own arcs. The owner approved the shapes from a board, one verdict per row.
Filming a fleet that does not exist
The owner asked to see the ships shoot at each other. We added a demo mode, -NavyBattleDemo: two small fleets on open water, a script that gives them orders at set seconds, and a scripted camera: a wide shot, a low follow of one rocket from launch to impact, a broadside, an orbit of a ship going down. It runs the real units with their real weapons; the script only gives orders. Captured on the fixed-step recorder at 1920 by 1080, twenty seconds, one USA ship and four RUSSIA ships lost.
What we would do differently
- Test over water on the first day of the navy. A click over water had also landed on the sea bed instead of the surface, a bug we fixed on 6 October. Same cause, different symptom.
- Do the water before the ships. The ships looked much better on the new water than they did on the old one.
- Check that the machine has room before running a test. This change was compiled on the 9th, but the in-engine proof waited for free memory. We say so in the log: "compiled only".
Try it yourself
When a screenshot looks wrong, ask what the code believes the ground is. Many of our visual bugs have been a function answering a slightly different question than the one the picture was asking.
Next: What the AI did, what it did not, and where the humans decided (13 October 2026)
Written afterwards from our project notes and commit history; dated to when the work happened.


