Second Chance GazetteDevlogToken Use

Right-Hand Drive

unreal-engineweatherrainpiegymnavigationkimodotaxisvehiclesblenderlightingexposuremetahumancrime-loopgrow-shopclaude-codegta-vi

The night shift

On Thursday morning James woke up, checked on the agents and found the work had carried on without him.

That had not happened before. Two days earlier he had written a short block into the project's rules: the agents could build the code, close the editor without saving and open it again, at any hour, without waking him to ask. The night of the fourth had been the first full test of it. By the time he was up, a thread working on the gym had held the editor until seven, a bartender at the nightclub had served the player at twenty-five past one, and the bus wraps were in. Two requests were refused overnight. The agents wrote each one down in a line and moved on, which is what the block told them to do.

Then he got to the part about the rain.

A gym floor with a row of black squat racks loaded with orange-rimmed plates along a wall of windows, and grey streaks of rain falling across the room in front of them.
Rain falling between the squat racks on the first floor of the leisure centre gym, under a roof that the game's own traces say is there.

Weather permitting

The gym is on the first floor of the leisure centre: squat racks along the windows, rowers, a leg press, a turf lane with a sled. On a test run at four in the morning it had rain falling between the racks.

The agent's first diagnosis was confident. The weather system decides whether the player is indoors by firing a handful of invisible lines upwards and seeing whether they hit a roof. Some buildings in the town are single meshes seen from outside, so a line fired from inside them can pass straight through the roof from underneath. The agent built a fix for the whole town on that basis: fifteen building meshes switched to be solid from both sides, and thirty-six invisible slabs laid under the roofs of the leisure centre, the hospital, the station, the church, the mosque, the working men's club and nine others. It verified all 36 and saved them.

It ran the test again. Rain was still falling in the gym.

A second slot at twenty-five past seven did what the first should have done, which was to ask the roof directly. Every point on the gym floor already read as indoors, five lines out of five, and the centre line hit the underside of the roof seven and a half metres up. The roof had been fine all along. What had not been fine was the player. When the agent read back where the player's body actually was, it found him walking about ninety metres away, under the ground, in a part of the map that had not finished loading when he was teleported. The camera had been in the gym. The weather was being worked out for a man standing in the dirt somewhere else.

The agent put the body back on the gym floor, set it to fly so it could not drop through the unloaded ground again, and read the position back before it believed it. Rain at 93 per cent outside. Inside: none. Ten metres out into the car park, it came back on, with splashes.

It retired all thirty-six slabs that morning. The most likely story is the one above, though the first test cannot be re-run to prove it. The agent said so in its own notes, which is more than it had said the first time.

A dim gym floor with a green turf lane and a weight sled, a long white wall of windows on the right looking out on a car park and shop fronts, and no rain in the room.
The same gym floor in heavy rain, after the player's body was put back inside: dry. The squat racks are out of frame on this angle.

Twenty-five seconds

The rain was the visible problem. The real one was that nobody was using the gym.

Forty residents have a membership - James set the number the night before, teens and adults, nobody over 60 - and each has a session in their week. In the four o'clock test a resident called Carly walked from home, came in through the front door, was claimed by a rower, and was let go again 25 seconds later. The machine's code gave anyone it claimed 25 seconds to arrive. The walk from the front door to the machines upstairs is 130 to 160 metres, which at walking pace is nearer two minutes. And her own day kept re-sending her to the front door, which the machine took as a reason to let go too.

The code went to a build at five to six with a proper timeout - a body is released when it stops making progress, not when a clock runs out - and the second complaint removed. The same build added an age check: nobody under 16 can be seated on a machine. At half six the test was run again. Abena, who is 30, got onto a squat rack at 16:51 game time and stayed there until 17:04, sets and rests in turn, the bar on her shoulders, down into a deep squat. It was the first time anybody had been seen using anything in that building. Then she moved to a rower and her hands floated a few centimetres above where the handle would be.

A woman in a black T-shirt and leggings stands resting in front of a loaded barbell on a squat rack, with orange gym slogans painted on the dark wall behind her.
Abena between sets at the squat rack. The workout clips came from a written description of each lift.

James saw the frames at eight minutes to eight, before work. Her hands are not gripping the bar. The workouts came from NVIDIA's Kimodo, which turns a sentence describing a movement into an animation; the hands it made held the bar like a mug somebody had said was hot. By eight the fix was done in a cloud thread: the fingers now close into a proper power grip, and on the rower both wrists are pinned to one handle line, 32 centimetres apart. Three clips were re-made. Putting them on the residents needs fifteen minutes of editor time, which is next.

Carly, meanwhile, still stood just inside the front door. In the same test she gave up again, at the doorway itself: the path from the door to the stairs runs straight through the swing of two open door leaves that block anyone walking into them. The age check had come out of the earlier test. While setting up a still, the agent's own staging script had put a seven-year-old from the estate on the squat rack. She was released within seconds, and the build an hour later made sure it could not happen again.

Two wheels

At twenty-five past seven, between reading about the rain and leaving for work, James had answered a question about the taxis. Now that each cab has its own driver - a resident on a shift, not a mannequin - did he want to be able to see them through the glass? He did.

It took the agent a slot to swap the cab windows for the bus glass and put a small light by the driver so you could see a face at night. At noon it looked right. At ten at night the driver glowed like a phone screen in a dark bedroom.

A black taxi with a Gopher Cabs roof sign on a terraced street at night, the whole scene washed bright orange, and the driver inside lit up white through the windscreen.
A cab at ten at night with the first light setting: the driver lit up through the windscreen. The whole frame is over-exposed orange, a separate problem with the night scene.

That light was 200 lumens, a desk lamp's worth, in the space of a car. James said it was too bright at nineteen minutes past eight. Sixty was still too bright. Fifteen, warmer, with a shorter reach, gave a driver you could read and nothing more.

The same taxi and street at night, washed orange, with the driver now softly lit at the wheel through the windscreen and no glow.
Fifteen lumens: Lisa is visible at the wheel and nothing glows.

Three minutes later he looked at the same picture again and saw the wheel. It was much too close to her - the agent measured it at 31 centimetres in front of her head - and it was not the only one. The car's own steering wheel was still in the mesh, on the other side of the dashboard. The cab body was left-hand drive.

This was not news to the project. It had been written down on 29 August, along with a decision to live with it while the cabs were empty and nobody could see in. The glass had ended that. James's ruling came at sixteen minutes past eight: we only need right-hand steering wheels.

GTA VI is set in a version of Florida, where the wheel is on the left and nobody would notice it. In a British town, a cab with a wheel on the passenger side is the first thing a British player would see through the windscreen.

A worker took the mesh back into Blender that morning. It proved which side was which before touching anything, checking the axis flips against the tail lamps and the grille, then deleted the rim and the steering column: 758 faces. It moved the driver's backrest 12 centimetres back so the drivers would fit, after first trying the whole seat and finding the cushion would end up on their shins. Thirty-two checks passed offline. The wheel the drivers will hold is the car designer's own, mirrored across to the right and set at least 40 centimetres in front of the driver's neck.

Two top-down cutaway views of a car's front seats side by side: on the left a steering wheel highlighted in red in front of one seat and the other seat's backrest in blue; on the right the wheel is gone and the blue backrest sits further back.
The cab from above, before and after: the left-hand wheel and its column in red, removed; the driver's backrest in blue, moved back 12 centimetres.

None of it is in the game yet. The re-import is one slot, and the drivers have to be re-seated in the same slot, or they will sit down for a seat that has moved.

Then he went to work.

Lights not on

The longest thread of the day was the grow shop.

Green Boss is the grow shop, and its shelves carry what a hydroponic grow needs: nutrient bottles in A and B, grow and bloom, pH up and pH down, tents, carbon filters, extension leads. The player who chooses the crime path buys his kit there, and buys his first seeds from the lad behind the counter, if the lad decides he trusts him. At quarter past eight James gave him a surname. He had said Green in another conversation, but Tansley sounded better. Liam Tansley, 22.

Between twenty to nine and noon the agent built him: a MetaHuman body, a green T-shirt matched to the shop front, and a name badge with the shop's wordmark and LIAM under it. Then it wired in his conversation and tested it in play. Liam is wary of newcomers, because a newcomer asking about seeds could be the police. The greeting worked, trust went up by two, and talking to him again the next day added more. James answered at twenty-eight minutes past twelve. The agent had flagged that the face read older than 22 and the hair more blond than light brown, and offered another round on the face. He looks fine. There was no other round.

The evening slot started at twenty to eight and found the shop dark. Six pairs of batten lights were placed and switched on, and the room still looked like nobody had paid the electric. The agent's report was short: the shop had no exposure volume at all. Every other interior in the town has a box telling the camera how bright the room is meant to be; Green Boss had been built without one, so the camera was still adjusted for the street outside. Once the box was in, the lights were on.

Then it stocked the place: ten fixtures and 383 display units went on the shelves from a script that can be run again, Liam was put behind the counter, and the shop floor got a navmesh so customers can walk round it, though the level's copy is still to be saved. In play, the police test worked both ways. Give the wrong answer and Liam is off with you for the rest of the day - Till's there. Bye. Give the right one, with £30 in your pocket, and the cash went down by 30 and five seeds went into the inventory.

A young man with short fair hair in a green T-shirt with a name badge stands behind a black shop counter beside a grey till with a green display.
Liam Tansley at the Green Boss till, badge on, behind the counter he now stands at.

The last slot of the evening, from twenty to eleven to twenty past, made the stock buyable. Twenty-three items now sit on the three front units as things you can pick up and take to the till. The test purchase was left for the morning: a web browser was open on the machine and there was less than a gigabyte of memory free, and the rule is that you do not start a test like that.

One thing turned up and was left for another day. The shop's big street sign is buried inside its own side wall, 35 centimetres behind the front of the building, where nobody on the street can see it.

Close-up of two shelves of plant nutrient bottles with Green Boss labels: green 'Hydroponic A grow focus' bottles and red 'Plant Food B bloom focus' bottles.
The nutrient shelf, photographed in the small hours by the thread that worked through the night: Hydroponic A for growth, Plant Food B for bloom.

Everyone else

The other threads ran round those. The hotel shot its first posed frames of residents at the pool and the back bar. The job centre seated a visitor at the right height opposite Denise at desk four. At one point an agent closed what it thought was its own editor and shut down the fresh one another thread had just opened.

Rockstar have a building full of people who check that a cab is driven from the correct side. He had a Thursday morning before work, and a picture of the wrong one on his phone.

An indoor hotel swimming pool with a red brick wall of tall arched windows, a black and white chequered floor and wooden sun loungers, where two women sit and a man stands.
Three residents posed round the hotel pool for the first set of stills.

By the next morning the agents had worked through another night.

The fault

Rain falls inside a building in PIE even though the roof traces as indoors (Unreal Engine 5.8, borrowed camera, teleported pawn)

Rain streaks over the gym floor in a PIE still, rain at 0.95. Wrong guess: line traces from inside a one-sided building mesh pass up through the roof. Cost: a slot spent building 36 invisible blocker slabs under 15 roofs and setting 15 meshes two-sided; the rain was still there. Actual cause, most likely: the still was taken through a borrowed camera inside the gym while the pawn, which is what the weather manager traces from, was about 90 m away under the landscape, dropped there by a teleport into cells that had not streamed. Every trace point on the gym floor reads indoors (5 of 5) with nothing added.

The fix

Judge indoor rain from the pawn's position, and read the position back

Teleport the pawn with its movement mode set to flying, read its location back, then read the weather manager's own indoor flag before taking a frame. In the gym: outdoor flag false, blend 0.0, five traces blocked, no drops, no splashes; in the car park ten seconds later, rain and splashes back. The 36 slabs were retired. Guard: never judge weather, lighting or audio from a view-target camera without first confirming where the pawn is.

The fault

Gym NPC released 25 seconds after being assigned a machine: "gave up walking ... released, no teleport" (Unreal Engine 5.8 C++ activity station)

The station adopted a resident at the front door and released her 25 s later. Causes: a fixed WalkTimeoutSeconds = 25 against a 130-160 m walk (100-115 s at 140 cm/s), and the resident's activity session re-sending its own goal, which the station treated as a reason to let go.

The fix

Release on lack of progress, not on a clock

The fixed timeout and the goal-distance release were replaced with a stall check and the session no longer re-sends its goal while a station holds the body. An age floor of 16 went in with it. Built green; the next test had a resident working a squat rack for 13 game minutes. Still open: the open front-door leaves block the path to the stairs.

The fault

Taxi driver glows through the windscreen at night after the cab glass is made see-through (Unreal Engine 5.8 point light in a car)

A 200 lumen, 4200 K point light with a 120 cm radius, added so the driver's face shows at night, lit the driver like a screen once the glass went translucent. 60 lumens still glowed.

The fix

15 lumens, 3000 K, 70 cm radius

Readable at 22:00, no glow, on only in cabs with a driver.

The fault

Fitted shop interior stays dark with every light placed and switched on (Unreal Engine 5.8, no post process volume)

Six batten pairs lit and the room still read near black. Cause: the shop had no post process volume, so exposure was still set for the daylit street.

The fix

Give every interior its own exposure

A post process volume over the shop at EV 6.3, the same pattern as the other interiors. Guard: when lights are on and a room is still dark, check for the volume before adding more light.

The kit

ToolWhy this one
Claude Code, unattendedthe first full night under James's standing approvals for builds and editor restarts
NVIDIA Kimodothe gym workout clips; the grip was re-made from a procedural pass over its output
Blender 5.1, headlessthe wheel removal and seat move, with a 32-check gate before anything reaches Unreal

Plain English

TermWhat it means
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.
pawnThe thing in the world the player is actually driving - the body the camera is attached to. When the pawn stops responding, nothing the player presses does anything.
traceFiring 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".
teleportMoving a character or the player straight to a new spot in one step instead of walking there - quick for testing, but they can land somewhere the world has not finished loading.
two-sided materialA material set to be drawn from both sides of every surface instead of only the front.
post process volumeA box in the level that changes how the final image looks inside it - exposure, colour, contrast.
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.
navmeshAn invisible map of walkable ground that characters use to work out routes. No navmesh, no walking.
KimodoAn open model from NVIDIA that turns a written description of a movement - 'walks with his hands in his hoodie pouch' - into a skeleton animation, which can then be put on a character.
MetaHumanEpic's system for realistic human characters - face, body, hair and clothing, ready to animate. Every named person in the game is one.
retargetingTaking an animation made for one character and making it work on a differently proportioned one.
FBXThe interchange file format used to move models and animation between Blender and Unreal.
lumensHow much light a lamp gives out in total; a desk lamp is a few hundred, a candle about twelve. Not the same thing as Unreal's Lumen lighting system.

Things we still need to fix tomorrow:

  • Green Boss: the test purchase at the till, save the shop's navmesh, then the sign out of its own wall.
  • Re-import the right-hand-drive cab body and re-seat every driver in the same slot.
  • Put the re-made gripping clips on the gym members.
  • The gym's front doorway: route the path round the open door leaves.
  • Put the fifteen roof meshes back to one-sided.
  • The over-exposed orange night scene.

← 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