Second Chance GazetteDevlogToken Use

Substantially Enclosed

unreal-enginenavmeshnav-linknpclightingexposureemissivescalabilitynightclubblueprint

The yard behind the DJ booth

The Sweat Box is an old brick warehouse on the edge of Oakhaven with a sound system in it. On Thursday it got a smoking area, and the smoking area took the afternoon. The toilets took the evening and most of the night after that, and at the end of it the woman they were built for still could not get into the Ladies.

That was one thread of five. By evening there were several sessions of the agent - Claude Code Opus 5.5 - sharing one copy of the editor. One was on the club. One was on the electricity meter in the player's hall. One was hanging strip lights in the cellar of the same house. Others were on a car and a set of doors. Only one of them is allowed to press Play at a time, so they queued for it, and the editor ran the club at about one frame a second whenever somebody did.

The yard came out of Blender as three pieces: a paved pad 8.4 metres by 3.5, a steel canopy over it, and three infrared heater bars hung from the canopy on short brackets. James had picked the terrace over the bouncer, and he had picked the heaters. Anyone nesh enough to want a coat on for a cigarette stands under one of those, and every pub garden in the country has them.

The first thing the agent reported was a problem with the heaters before they had been placed. The club's glowing signs and trim share one emissive material, and the plan said to reuse it for the heater element. The agent read the material's graph first, and the brightness was multiplied by the club's music parameter. The heater bars would have throbbed in time with the bass. It built a second material that does nothing but glow, steady, and gave the heaters that.

Three frames that looked the same

Under each heater went a small red spotlight, pointing down, so that anybody standing beneath one would be lit the colour of a grill. The first run in play put Christie - the woman from the dance floor, borrowed from her routine for the purpose - under the middle heater, and took three frames: the spots at 400 lumens, at 120, and switched off.

A night-time smoking terrace behind a brick nightclub, seen from one end. A woman in loose orange trousers dances on pale cream paving under a black steel canopy. Three heater bars glow orange on the canopy beams, and a black bar railing runs down the right-hand side with brick terraced houses behind it. A pink-lit brick wall fills the left edge.
The yard at 400 lumens. The heater bars glow; the pad under them reads cream, and the red light that should be pooling on it is nowhere.

All three frames looked the same. The obvious reading was that the lights did nothing, and that reading was wrong. The agent tried the opposite extreme to prove the spots rendered at all - 20,000 lumens, which blew the pad and her head out white - and they did. So the lights worked, and the comparison did not.

The reason was behind the camera. The loading door from the club into the yard is 3.6 metres wide and open, and the club's light show spills out of it onto the terrace. The show changes with the music: one group of lights only runs in one band of the track, and the moving heads sweep. Two frames taken at identical settings a few seconds apart came out completely different. An on-off test across two frames was comparing two moments of the music, not two light levels.

The fix was a gross change rather than a fine one, and a pinned exposure for the yard alone, so it stopped borrowing the club's. The spots went to 3,000 lumens and a deeper red, (1.0, 0.10, 0.03) - the first colour tried read orange-yellow, like a kebab shop sign.

The same smoking terrace much darker, lit deep red. A woman stands on the paving in a red pool of light from the heater above her; the railing reads black on the right, a cyan panel of light shows through the doorway behind her, and the brick wall on the left glows red.
The same yard at 3,000 lumens with its own pinned exposure. A red pool on the paving and on Christie, and the fence reading black against the car park.

Half the walls

The yard had a second fault, and it was a way in. From the street you could walk round the back of the building, onto the terrace, and in through the loading door, past the bouncer who was not built yet but would be. James said to fence it off.

The agent built a railing: 1.8 metres of black steel bars at 12 cm centres on three sides of the pad, butted into the gable. It also wrote a note in the handover, in capitals, telling any later session not to upgrade it to solid panels. In England a smoking shelter with a roof stops being legal when it is substantially enclosed, which means more than half of its walls are solid. Solid fencing on three sides plus the building's own wall would have put the yard over that line. The railing keeps it open.

That is a small thing and it is the point. GTA 6's clubs are in Vice City. This one is a warehouse in a Midlands town, and the smoking area behind it is the legal shape.

After the fence, the only way from the street to the terrace is round the front, past the door and through the hall. The agent measured it on the navmesh: about 90 metres.

Daylight on the dance floor

The club itself was the next frame. Every interior in the game has its exposure pinned, so a room does not slowly brighten while you stand in it, and the Sweat Box had been pinned at the same value as the houses, EV 2.5.

The inside of a brick warehouse nightclub from the dance floor, looking at the DJ booth under a lighting truss. Steel galleries with railings run down both sides. The whole image is bright and washed out and the floor reads almost white.
The club at EV 2.5, the value it shipped with. It reads like a warehouse at noon, and the near-black dance floor comes out white.

It read like daylight. A dance floor that is nearly black in its material came out white, and the moving beams barely showed against the walls. The agent shot it at 2.5, 4 and 5 and recommended 4. James looked at the frames and agreed.

The same nightclub hall, darker and better balanced. The brick walls read red, small cyan and pink lights show on the back wall, a purple beam crosses the left gallery, and the floor is a pale grey.
The same hall at EV 4.0. The walls, the colour pools and the beams read. The floor is still paler than it should be.

The floor stayed pale at every exposure and in every state of the light show. The agent traced it to the floor's material, which is slightly glossy, and offered a theory: at a low eye angle it is mirroring the lit walls. It said plainly that the theory was not proven. Testing it is on the list.

The door that only opened for him

The club's nine toilets had been swapped that week for the real toilet the pub uses - the one with the lid, the flush and the minigame. All nine flushed on command in play. The pub's and the house's toilets did not flush in sympathy, which was checked because it was the kind of thing that could happen.

Christie is meant to go to the loo. It is in her routine, and she has a state for it. In play she walked up the stairs to the gallery, stopped 3.1 metres from the Ladies, and stood there for over three minutes.

The agent asked the navmesh for the path, and the navmesh said the path was partial: it went as far as the gallery and no further. Inside the room, from the floor to the cubicle door, was a clean path of 169 cm. The room was fine. The gap was the doorway.

There were three things in the way, and it took three rounds to find all of them.

The first was the door itself. Its leaf, and an invisible box that tells the player when they are inside, both counted as obstacles to the pathfinder. The agent switched that off on the club's door only, leaving the pub's and the depot's copies alone.

The second was the width. The doorway is 1.05 metres. The pathfinder assumes an NPC is 35 cm wide either side of its middle and shrinks the walkable area back from every wall by that much, so the strip left through a 1.05 m gap is thin enough to vanish when the navmesh is built. The agent placed a nav link through each loo doorway - a hand-drawn bridge, both ways, with its ends 1.2 metres either side of the wall. The paths came back complete: gallery to Ladies, 852 cm.

The third one James found by watching. Christie walked the link, reached the door, bounced off it, turned round, came back, and did it again. The loo doors open when somebody walks up to them, and the check that opens them looks for the player and nobody else. A woman walking at a closed door that will never open for her is going to do that all night.

Both room doors are now propped open. Rockstar have a department that would have caught the door check in review. He had a Thursday evening and a woman walking into a door.

Two lights in the house

The other two threads were in the player's own house, at 6 Radworth Road, and both of them ended on the same number.

The cellar got six fluorescent battens on the ceiling, the five-foot kind every garage and cellar in the country has, and a zone that switches them on when the player's feet go down the stairs. The feet, not the head: the zone reads where the player is standing, so crouching on the top step does not fool it. On the way in they blink twice and then come on, the way a starter does, slower than three flashes a second so nobody with photosensitivity gets a strobe. Two seconds after you go back up, they go off.

A real tube of that length puts out about 5,000 lumens. The agent tried it.

A brick-walled cellar lit by white fluorescent strip lights on the ceiling. The walls, floor and a white table with a few bottles and a bag on it are washed pale, and a stair rises at the back.
The cellar at 5,000 lumens a batten, the real figure. The house is exposed for a dim room, so the bricks and floor wash out.

The whole house is pinned at EV 2.5, which suits a front room with a lamp in it, and 5,000 lumens a tube blew the cellar out. The editor could not show the true in-game look without playing - its capture has no bounce lighting, so the sky floods even a sealed cellar - so the agent calibrated relative instead: the brightness in the cellar against the brightness under the living room's own bulb, direct light only. It settled on 1,500 lumens a batten, and the knob for changing it lives on each light, so it can be turned in play without rebuilding anything.

The same cellar with the strip lights dimmer. The red brick has its colour back, the floor reads orange-brown, and a green watering can and a small pot stand near the table.
The cellar at 1,500 lumens a batten, the calibrated figure. Bright enough to work in, and the brick still has its colour.

The meter was the other. James wanted the electricity meter moved up from the cellar to the hall, just inside the front door at a height you can read, and a key that walks the camera up to the glass so you can read the numbers. The first placement put all eight pieces of it on the hall wall at the right height with the face pointing into the wall. The second was the right way round. The digit drums, which turn, had their own orientation fault, and were rebuilt with a rotation about the meter's own facing so they read upright at the angle the house actually sits at, which is not quite square.

A very bright, almost white hallway with the foot of a wooden stair on the left. A small pale box on the wall shows a row of five grey digit drums and a white oval below them; everything else in the frame is washed out.
An editor capture of the meter on the hall wall. The hall is blown out and the printed face is a pale smear; the five digit drums are what survived.

Then James looked at it in the editor and said it was just white. The agent measured why, and the answer was the editor, not the meter. Every scalability group was on Low. Low turns off the bounce lighting, so the sky light floods the sealed hall, and on top of the house's pinned exposure that is a white room. Low also throws away the sharp versions of textures, so the meter's printed face dropped to a smear. The digits survived because that one texture has no smaller versions to fall back to. The digits are what you press the key to read, so at Low the game still does its job, and everything else about the look gets judged at High, in the game, with the editor shut.

Nearly one in the morning

The club thread did not stop at the propped doors. By half past midnight the agent had written the whole loo visit as one Blueprint: into the room, pick a free cubicle, wait in the room if there is not one, go in, lock the door against the player, sit, stand, flush, wash hands, walk back down. Fifty-four functions, placed, saved, and a test key that sends Christie to the Ladies a minute after the player arrives. Running it is next.

Then it asked the navmesh one more question, and the navmesh gave a new answer. Every path to anything inside the Ladies was partial again, ending two or three metres short. The route it had drawn went across the dance floor, under the gallery, and straight up the nav link from the hall floor, 417 cm below the doorway. The link's far end had snapped to the nearest floor, and the nearest floor was the one underneath. The pathfinder was treating it as a lift.

The agent wrote down a fix it had not tried, and the time, and stopped.

The fault

NPC stops at a doorway - navmesh path is partial through a 1.05 m door in Unreal Engine 5.8

The NPC stalls 3.1 m short of a room. The path query from the gallery to the room floor returns partial, ending on the gallery. Inside the room, floor to cubicle is a complete 169 cm path.

Three causes, stacked:

  • the door leaf and its trigger box were nav-relevant, so they carved the doorway
  • the doorway is 1.05 m, and an agent radius of 35 cm leaves a strip thin enough to voxelise away
  • the door's open check tests the player pawn only, so the NPC walked into a closed leaf and bounced between it and the link start

Later, in a fresh editor load: the paths went partial again. The link's north end had attached to the hall floor 417 cm below the gallery, so the pathfinder routed floor to link as if it were a lift.

The fix

Stop the door affecting navigation, bridge the gap with a nav link, prop the door

  • bCanEverAffectNavigation False on the door leaf and trigger box, as an override on the club's child Blueprint only
  • a NavLinkProxy per doorway, both directions, ends 1.2 m either side of the wall - paths came back complete, gallery to Ladies 852 cm
  • the two room doors propped open (leaf yaw -90, flagged open)

Guard: read the path's partial flag, not whether a path came back. Open: the link ends can snap to a floor below. The next try is bUseSnapHeight with a snap height of about 50 on each link, then re-checking every path from the dance floor.

The fault

Point light A/B test shows no difference at 400, 120 and 0 lumens, and an emissive heater pulses to the music

Three frames of a spotlight at 400, 120 and 0 lm looked identical. Two frames at the same setting looked completely different. The yard's background light was a club light show spilling through a 3.6 m open door, and it changes with the music.

Separately: the shared emissive master for the club's signs multiplies its brightness by the music parameter collection, so anything using it pulses to the beat.

The fix

Prove the light with a gross change, pin the yard's exposure, and give steady glows their own master

  • a 20,000 lm probe proved the spots rendered; then 3,000 lm, colour (1.0, 0.10, 0.03)
  • a post process volume for the yard alone, exposure pinned at EV 2.5, stopping short of the club's own volume so they never overlap
  • a separate unlit master for the heater elements: colour times power into emissive, nothing else

Guard: pair an A/B within one state of anything animated nearby, or change the value by an order of magnitude. Read a material's graph before reusing it for something that must not move.

The fault

Interior blown out white in the Unreal Engine 5.8 editor, and a texture prints as a pale smear

A hall and a cellar read white; a meter's printed face blurred. The editor was on Low for every scalability group. sg.GlobalIlluminationQuality 0 turns Lumen off, so the sky light lights a sealed room unoccluded; the house exposure is pinned at EV100 2.5 on top of that. sg.TextureQuality 0 sets r.Streaming.MipBias 16, dropping streamed textures to their smallest mip. A texture with no mips stays sharp.

In the cellar, real-world fluorescent output (5,000 lm a batten) also blew the room out under that same pinned exposure.

The fix

Judge the look at High in the game, and calibrate lights against the room's own exposure

  • the look is judged in a standalone game at High, editor closed
  • the cellar battens were calibrated relative to the living-room bulb, direct light only, and set to 1,500 lm, 5,000 K, with per-light lumens editable on each placed light

Guard: ask which scalability a "too bright" or "too dark" report was taken at before touching a light.

The kit

ToolWhy this one
Blenderthe terrace, canopy, heaters and railing, each checked for inside-out faces before export
Navmesh path queries from editor Pythonthe partial flag found all three doorway faults and the fourth one after them
A 20,000 lumen probesettled whether the lights rendered at all, which three careful frames could not
James watching the play windowthe door that only opened for the player

Plain English

TermWhat it means
navmeshAn invisible map of walkable ground that characters use to work out routes. No navmesh, no walking.
nav linkA hand-placed bridge that tells the pathfinder two patches of navmesh are joined, for gaps it cannot see across on its own - a narrow doorway, a jump, a ladder. Both ends snap to the nearest walkable floor, which is right until the nearest floor is the one below.
agent radiusHow wide the pathfinder assumes a walking character is. The navmesh is shrunk back from every wall by this much, so any gap narrower than twice the radius simply is not there as far as an NPC is concerned.
exposureHow 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.
post process volumeA box in the level that changes how the final image looks inside it - exposure, colour, contrast.
emissiveThe part of a material that gives off light - a screen, a bulb, a neon sign.
materialThe recipe describing how a surface looks: colour, roughness, shininess, transparency.
scalability settingsThe 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.
mipmapPre-shrunk copies of a texture used at distance, so far-away surfaces do not shimmer.
LumenUnreal's lighting system for bounced light and reflections, worked out live rather than baked beforehand.
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.
BlueprintUnreal's visual scripting. Logic built by wiring boxes together with lines instead of typing code. This whole game is built in it.
standaloneRunning the game on its own with the editor closed, the way a player would. The only honest place to measure frame rate, because the editor eats memory and processor time of its own.

Things we still need to fix tomorrow:

  • Fix the snap on both loo nav links, then re-check every path from the dance floor to the Ladies.
  • Run Christie's loo visit end to end with the test key: stairs, door, sit, flush, sink, back down.
  • Test the club floor with a rougher material and see whether the pale reading goes.
  • Walk down the cellar stairs in the game and watch the battens strike, then go back up and count two seconds.
  • Press the key on the meter in the game at High and read the numbers off it.
  • Functional sinks are next after the loos, starting with the Ladies.

← All devlog entries

Watch it get built. All of this goes up on YouTube as it happens - broken animations, buildings hovering a foot off the ground, the lot.

Subscribe on YouTube