Fog in the Sky
The school was innocent
The day started by clearing up something the night before had got wrong. Shooting the streets after dark on Sunday, the agent had found hard white shapes sitting on the horizon behind the trees, run a line trace along one of the sight lines, and hit the primary school 248 metres away. It had logged the school as a suspect and not touched it.
The school was innocent. A trace can only hit things that have collision, and the white shapes had none. They were the horizon cloud band, a ring of distant cloud painted on a sphere 40 kilometres out, drawn with an unlit material at a fixed brightness. That brightness had been chosen to sit just above the daytime sky. At night the game opens the exposure by about ten stops so the lamps can be seen, and nothing had ever told the band to dim. It rendered pure white.
Claude Code Opus 5.5, the agent, had a fix in by nine. The first version dimmed the band using the sky's own brightness, read from a node built for exactly that, and the night frames came back clean. Then it checked the control. Turned up a hundred thousand times, the band still drew as dark wisps against a blue daytime sky. The node returns nothing at all outside the sky material itself, so the fix had not dimmed the band at night. It had switched it off permanently, and the night frames were clean for the wrong reason.
The second version works from the height of the sun instead: full brightness above six degrees, fading to nothing four degrees below the horizon. The agent tested it with the band forced back to full strength at eleven at night, and got the blazing white strip back on cue. So the path was alive and the dimming was real. The first fix had passed everything except that one question.
As dark as night
The real subject of the day was weather, and it had a deadline. James had read that Rockstar were due to put out details of GTA 6's weather the next day, and he wanted his own weather on screen the same evening. Rockstar, he had read, have whole departments for the weather in GTA 6, and a team whose job is making interiors look right. He had a Monday.
The storms had arrived on Sunday, and the complaint about them was short. At one in the afternoon a full storm looked like the middle of the night. He had asked for the sun dimmed, not switched off.

The agent did not guess at this one, which was new. It pinned a full storm at one o'clock, pointed the camera at a sunlit wall, and measured the wall's brightness with each suspect switched off in turn. As built, the wall read 1.5 on a scale of 255. With the clouds' shading of the sky light turned off it read 1.8, so that was not it. With the cloud shadow on the ground turned off it read about 87. The storm deck was casting a shadow so complete that no sunlight reached the street at all.
There was no dial for it. The light's cloud-shadow strength can only be set in the editor, not while the game runs, so a storm could not turn it down and a clear day turn it back up. The fix had to go into the cloud material itself: thin the storm layer only for the rays that are working out the shadow, and only when a storm is overhead.
The first build of that changed nothing at all. The storm layer's strength turned out to reach only halfway even in a full storm, so anything multiplied by it did half its job. The second build turned the street black again, because a straight blend towards a tiny number like 0.0001 stops being gradual: at 92 per cent of the way there it had already let through only eight per cent of the light. The third build blended in powers instead, which is the right shape for how light fades through cloud, and the agent calibrated it by eye across a ladder of values. It settled on letting about 44 per cent of the sun through a full storm.

The rain was fixed the same morning, in the other direction. It had been starting with the first cloud. James wanted the deck to build and darken first, so now nothing falls until the sky is eight tenths covered. In the test it held at zero through a quarter, a half and 0.797 of cover, and began at 0.864.
At 11.23 another session's builder ran the machine out of memory and the editor fell over. It came back up behind a dialog asking whether to restore packages. The dialog wanted a click. It waited 55 minutes for one, and then the editor was killed and relaunched with the flag that skips the question.
Proper clothes
To prove the rain got people wet, the agent staged a resident called Pete on the pavement and let the storm soak him. His tee went 43 per cent darker in about 45 seconds of storm. James looked at the result and asked for somebody else. Pete wears the homemade clothes from earlier in the year, built in Blender before the switch to bought outfits from Fab, and the plan is to replace every one of them. He wanted the photograph on a character in the new kit.
Barry and Mervyn wear Fab outfits, and Fab outfits had no idea what rain was. The agent spliced the existing wet-cloth function into both outfit masters, which reached fifteen material instances in one go, including three other characters who had not been asked about. It staged Barry at his front door in the storm, dry, then soaked. James picked the wetness he wanted from two options: "probably 0.18 looks most realistic." Later he approved a look for wet skin as well, a little glossier and a little less rough, and said to keep it for the game. It went in that evening.
When he got to the PC himself, the agent had a storm pinned and waiting for him to walk round in. His verdict was that it looked like normal rain. Then the app hung and the PC was restarted.

Award winners
The evening was the photographs. Before any of them were taken the agent booked the editor, told every other session working in it to stay out of play mode until the weather was done, and set the capture to High.
James wanted a sunset behind the church spire, partly cloudy. The agent found the sun's bearing, stood a camera 250 metres from the spire on that line, five metres above a field, and James steered it live: earlier, so the sun was still up; less cloud; now a little later. The sun came out as a faint disc in a flat wash, and the agent traced that to the ordinary daytime haze. Then James asked it to open Chrome, look up award-winning photographs of British sunsets, and say honestly whether ours needed work.
It looked at winners from the Landscape Photographer of the Year and the Royal Meteorological Society's weather photography awards, viewed rather than downloaded, and came back with a yes. A real British sunset has a gradient in it: a white-gold core round the sun, orange at the horizon, grey or even blue higher up. Ours was one colour per frame, top to bottom, amber then orange then purple as the sun went down.
It had a suspect, and this time the suspect held. The height fog was set to cover everything at any distance, including the sky, which is infinitely far away. So every sky pixel was being painted with the fog's single colour. Stopping the fog at 30 kilometres left the hills hazy and the sky alone.


James's verdict came at four minutes to nine: "the skies looked more realistic that time," and "more colourful."
Then the same change made the storm look like a chalk drawing.

In a storm the fog is thick and starts close. With the sky no longer fogged, every edge where a fogged roof met clear sky drew a bright line. The agent's first idea was to blend the cutoff away as the rain built. It argued itself out of that before building it: the cutoff is a hard edge, so any distance above zero still leaves the sky clear, and the blend would have taken the fog off the far hills first. It is a switch. Fair weather keeps the 30 kilometres. Rain above 0.05 sets it to zero, and sky and buildings fog together. It measured where the halos began, below rain 0.27, and put the gate well under it. James said a flicker at the changeover was acceptable, since it could pass for spray.

A GPU crash at half eight cost a relaunch. The card had been at 7,131 MB of its 7,128.
Back to front
Late on, James asked for snow on the Radworth streets and wet footprints in the rain. The snow was a test, not a feature: the road, pavement and kerb materials have no snow in them, so for the photograph the agent swapped every surface within 250 metres onto one that does, in the running game only. Roofs, wall tops and bin lids took it on their own.
To check the footprints it laid two trails in the snow, one the way the game lays them and one turned round, and asked James which way each was walking.

"The left ones are walking towards us, the right ones away." The left ones were the game's. Every wet footprint in Oakhaven had been walking backwards. One number in the Blueprint, 90, is now 270. The fixed version has been compiled and saved and is next to be seen on a real walk.
Elsewhere in the same editor the petrol station got its name, Gasp!, on the pumps, the totem and the attendant's badge. The editor was handed on to the car salesman's session at 22.33.
Sunday night
Sunday night, before any of this, James had been scrolling X. Artists were saying AI was ruining their commissions and could not do what a human could. Others replied that it was a tool letting more people make things. He had spent a lot of the week on YouTube, and his view of indie games was that too many cut corners: a fade to black to hide getting into a car, because animating it is hard.
His own position was plain enough. Rockstar have departments. A solo developer does not, and with the tools as they are he has the equivalent of several. He had read that big companies, Microsoft among them, now say all their developers use AI tools, and did not see why one person should not. The art, as he saw it, was deciding what went in, giving the direction, and playing it until it was right. He would not have got this far without it.
He agreed about the slop. Earlier that evening at his parents' they had been talking about a holiday next month, Tunisia or Turkey, somewhere still hot, and most of the hotel videos they found were stock photographs under an AI voiceover that knew nothing about the hotel.
Monday was the argument in practice. The agent measured the storm and was right. It chose a node for the horizon band and was wrong, and its own control caught it. It placed the footprints and was wrong, and James caught that with his eyes. It found the fog in the sky because he told it to go and look at real photographs.
The fault
Storm with volumetric clouds is as dark as night at 1pm in Unreal Engine 5.8
A full storm at 13:00 rendered as night. Measured on a sunlit wall, brightness 0-255: as built 1.5, r.VolumetricCloud.SkyAO 0 1.8, r.VolumetricCloud.ShadowMap 0 about 87. The deck's shadow on the ground blocked all sun. CloudShadowOnSurfaceStrength on the directional light is interp and BlueprintReadOnly, so it cannot be changed at runtime.
The fix
Thin the storm layer for shadow samples only, in log space
In the cloud material, scale extinction only where CloudSampleAttribute.ShadowSampleDistance > 0, by pow(max(scale, 1e-12), amount), storm layer only. Scale 1e-4 lets through about 44 % of the sun (the wall read 26.8; open sky 38).
- A plain
lerp(1, 1e-4, a)is roughly1 - a: at a = 0.92 it passed 8 % and read black. - The storm layer's amount is only 0.5 in a full storm, so it is ramped ×4 first.
The guard: A/B the engine cvars on a measured wall before building anything, and keep the second frame after a change, because the cloud shadow map is temporally filtered.
The fault
Exponential height fog paints the whole sunset sky one flat colour in Unreal Engine 5.8
With FogCutoffDistance 0 the height fog covers the sky pixels too, which sit at infinite depth, in the SkyAtmosphere's single ambient colour. The sunset read as one wash with no gradient, and noon read milky white.
The fix
FogCutoffDistance 30 km in fair weather, 0 in rain, as a switch
TickFog now sets FogCutoffDistance = Select(0, 3,000,000 cm, RainIntensity > 0.05) every tick. With the cutoff on in rain, every roofline, lamp and cable draws a white edge halo against the clear sky; the halos start below rain 0.27.
Not a lerp: the cutoff is a hard per-pixel edge, so any value above 0 leaves the sky clear, and a lerp would strip fog off distant hills first.
The fault
Unlit horizon cloud material glows white at night, and SkyAtmosphereViewLuminance returns 0
A distant cloud band with a fixed unlit emissive went pure white under the night exposure. A line trace blamed a school at 248 m; the band has no collision. The first fix scaled by SkyAtmosphereViewLuminance, which returns 0 in a non-sky translucent material: it blacked the band out day and night.
The fix
Dim the emissive from AtmosphericLightVector.z instead
Emissive × saturate((AtmosphericLightVector.z - SunSinLo) / (SunSinHi - SunSinLo))², with SunSinHi 0.105 (6°) and SunSinLo -0.07 (-4°). The guard: a positive control. With the scale forced to 1 at 23:00 the band blazed white, which proves the path is alive and the night black is real.
The fault
Wet footprint decals appear back to front in Unreal Engine 5.8
Prints were laid rotated 180°. The print's BeginPlay subtracts 90 from its yaw, and the aiming function added 90 on top.
The fix
Yaw offset 90 changed to 270, proven with two trails first
Two PIE decal trails, one at the game's rotation and one at +180, and a human asked which way each walks. Then the literal changed, compiled, saved.
The kit
| Tool | Why this one |
|---|---|
| Claude Code Opus 5.5 | measured before building, ran the captures, and shared one editor with several other sessions by booking it |
| Monolith MCP | bulk node edits to the weather Blueprints, and the material graph surgery |
| Chrome | award-winning British sunset photographs as references, viewed, not downloaded |
| Two engine cvars | r.VolumetricCloud.ShadowMap and SkyAO found the storm's cause in four frames |
| HighResShot at 2560x1440, High | the ceiling this 8 GB card holds; 4K at Epic has crashed it before |
Plain English
| Term | What it means |
|---|---|
| volumetric cloud | Clouds built as a real 3D volume the sun shines through, rather than a picture painted on the sky. They cast shadows on the ground, which is what makes a storm dark - and, left alone, too dark. |
| height fog | Unreal's ground-hugging haze, thick near the ground and thinning with altitude. It sells distance and weather, and if nothing stops it, it tints the sky as well. |
| exposure | How bright the virtual camera treats the scene, like a real camera's aperture and shutter. A higher EV100 number darkens the picture. This project pins it per building so a room does not slowly brighten while you stand in it. |
| emissive | The part of a material that gives off light - a screen, a bulb, a neon sign. |
| lit material | A lit material reacts to the lights around it and goes dark in shadow; an unlit one shows its own colour whatever the lighting, which is what a glowing screen needs. |
| lerp | A blend between two values by a fraction - halfway between 1 and 0 is 0.5. Simple, and the wrong tool when one end is a tiny number, because it stops being gradual. |
| roughness | How matte or glossy a surface is. Low roughness is a mirror or a wet road; high roughness is chalk or dry cotton. Wet things get less rough. |
| material instance | A copy of a material with some settings changed. Cheap to make and cheap to render, so most surfaces are instances rather than originals. |
| decal | An image projected onto whatever surface is underneath - a puddle, a road marking, graffiti, a stain. |
| trace | Firing an invisible line into the world to find out what it hits - used for "what is under this object" and "what is the player looking at". |
| positive control | A deliberate attempt to make the thing fire, run before you trust its silence. If the alarm does not sound when you set fire to the test rig, the absence of an alarm the rest of the day means nothing. Here it meant calling the interaction function directly on the live player, watching it work perfectly, and thereby proving the fault was in the key press and not in anything it leads to. |
| Fab | Epic's marketplace for ready-made game assets - models, materials, characters, clothing. Buying a garment and refitting it is how almost everyone in this game got dressed. |
| MetaHuman | Epic's system for realistic human characters - face, body, hair and clothing, ready to animate. Every named person in the game is one. |
| scalability settings | The engine's quality dials - shadows, textures, effects, anti-aliasing - each of which can be set independently. Turning one up can cost far more than turning the rest up together. |
| VRAM | Memory on the graphics card. This project has 8 GB of it, and that ceiling shapes most of the decisions in the devlog. |
| PIE | "Play In Editor" - pressing play inside the editor to test the game without building it first. Fast, and it behaves subtly differently from the real build. |
Things we still need to fix tomorrow:
- The fixed footprints on a real walk: get soaked outside, then walk indoors.
- Rain splashes draw as a few dark blots. Measure the splash material against the storm-day scene before changing it.
- Snow for roads, pavements and kerbs, with rounded kerb edges and mounds on bin lids and walls. The photograph was a test swap.
- The fog gate at sunset at High: 20:52, 21:06, 21:16, 21:25.
- Rain on the bus windscreen, from a camera just behind the glass.
- The brick in No. 6's front room gets wet when it rains outside.
- Tag Barry and Mervyn so the rain reaches them in the level, not just in the test.
- James walks round a storm in real time and says whether 44 per cent is dark enough.