Second Chance GazetteDevlogToken Use

Both Hands on the Bar

unreal-engineai-controllerblueprintnpcchildrenpushchairrainmetahumangarmentsblenderumbrellaedge-monstershalloweentrafficclaude-codegta-vi

Quarter to nine

It was a Friday, so James was at work, and most of what follows reached him on his phone.

By then the game was being built by several sessions of the agent at once, Claude Code Opus 5.5, with a coordinator session handing out the one editor in slots, like the keys to a shared van. James answered questions in the gaps of whatever he was paid to do.

The day would end with a pushchair that works in the rain, a shopkeeper with his chest put back, a boy in a patka, the umbrellas five centimetres higher, and a monster with something wrong with its arm. The arm is still wrong.

Rawhead

Rawhead went into the town just before eight in the morning. He is one of the things at the edge of the map, the part of the game nobody is obliged to visit, and he lives in a hole in a field.

The test ran at night. With the player 26.7 metres from the hole there was gnawing. At 7.7 metres everything went quiet. At 4.2 metres he came up out of the ground with a shriek and a shove that put the player back a metre and a half, then dropped back into the dark about five seconds later. There is a decoy hole as well, where the gnawing never stops, and walking up to that one puts up a mallard at two metres.

The agent sent stills. James looked at the close-up at seventeen minutes past eight and asked whether the left arm looked correct.

A pale, long-haired creature standing on dark grass at night, shoulders hunched and arms hanging. Down its left side, fused to where the arm should be, is a flat tan board like a wooden stick, running from the shoulder to below the hand.
Rawhead in the morning test, and the question James asked about it: a flat tan stick down the left side where an arm should be.

It did not. The screen-left arm was fused to a flat tan board from the shoulder to below the hand. Rawhead had been built on the body of an earlier monster, a river hag, so the first theory was a spare part of hers in its own material slot. The second, at twenty past one the next morning, was her waist-length hair, skinned to the nearest bit of body, stretching flat from shoulder to wrist when the arm moved. That one was tested. Hiding the hair left the stick where it was. Hiding the skin took it away.

So the stick is part of the body itself, a piece of geometry inside the hag's mesh weighted to the right hand, in every clip and every frame. The fix is in Blender: delete it and send the body back. He also reads too much like her, upright and pale, when the design says he should be all mouth, low and wet. A crouch and a darker body are next.

The school run

The children's thread had been on the pushchair since lunchtime, and by quarter to three it had passed its first test. Jodie Pritchett, who lives on Radworth Road with her two children, takes the eldest, Harper, to school and pushes the youngest, Reggie, who is two, to nursery. The test was in an empty editor world, and it passed.

Just before six it went into the town for a proper run and did nothing. Jodie walked her eldest to school with her umbrella up, and Reggie walked beside her on his own, with no pushchair anywhere.

The agent spent the next hour reading the town's code, and reported something worse than a bug. The first version could never have worked on a school run. The town's systems only walk two residents together during an activity, and the school run and the nursery run are not activities, so each body is sent on its own. The afternoon's test had passed because the test script had paired the two of them by hand. And when the director put Reggie into the world, he was not even recognised as Reggie: the tag the pushchair code looked for only gets added by one of the two systems that place residents.

The second version relies on neither system. A child under three never walks off on his own; he waits for the grown-up who pushes him. When she turns up within four metres and he still has somewhere to go, the pushchair appears on her, he sits in it, and his body is fixed to hers, so whatever moves her moves him. At the nursery she goes on and he stays. The rain was the other half. Jodie has an umbrella like everyone else in the town, and a woman pushing a pushchair cannot hold one. So while she pushes, the umbrella goes away, and it comes back the moment she lets go of the bar.

Morning outside a brick school with green-framed doors. A woman in a red top pushes a black pushchair with a small boy sitting in it, both hands on the bar, while a crowd of young children in coloured hoodies and a few adults stand by the entrance.
Quarter to nine in the rain at the school gate: Jodie with both hands on the bar and Reggie in the pushchair. Her umbrella is put away for as long as she is pushing.

GTA VI is set in Vice City. This was a pushchair at a school gate at quarter to nine on a wet morning, and anybody who has done the walk can say what was wrong with every version before it.

A crowd of one

The rain test in the town ran from seventeen minutes past seven. At the school gate the pushchair came up at once, Jodie pushing, Reggie in the seat. Then she would not walk.

Her path was paused, every time, as if somebody was in her way, and somebody was. Reggie's controller, the invisible driver every resident has, was still running while he rode, and it kept a crowd agent standing exactly where he was, which was exactly where she was. The town has manners: a resident who keeps bumping into somebody slows, waits and gives way. Jodie was giving way to her own son. The agent proved it by taking Reggie's controller off him by hand. She walked at once.

So now the rider is unpossessed while he rides. That made two more problems. If the town removes a mother and toddler together while out of sight, nobody is left to take the pushchair away, so every pushchair now has a ten-second lifespan the pusher renews once a second. And Reggie's unpossessed controller stayed in memory with nobody to drive. The plan was simply to destroy it. The agent wired up a DestroyActor and the test said it ran. Nothing happened. Unreal refuses to let a Blueprint destroy a controller, on purpose, and does it silently. A lifespan of a tenth of a second does the same job and is allowed.

With the walk working, the run to the nursery went about 430 metres in the rain at a hurry, Reggie riding. At nine Jodie's day moved on to the shop. The pushchair went, Reggie stood at the nursery, and she walked off with her umbrella back up.

The second town test ran just before half past eight in the evening. The director had moved the two of them out and back twice, and of 44 to 46 controllers in the town, none was left without a body. The old pushchairs were gone.

The rain cover

A pushchair in this weather has a rain cover, so in the evening it got one: a clear plastic bubble over the seat, shown in rain and drizzle, hidden when it is dry. In the test it was milky grey, and you could not see the child through it. You could see his head, though, because it came out through the front.

Looking down from above at a crowd of children and adults beside a brick wall. In the middle a pushchair wears a milky clear plastic rain cover, and the seated toddler's head and face stick out through the front of it.
The first rain cover, from above at the school gate. Reggie's head comes straight through the front of it.

The cover had been modelled to fit the pushchair, and nobody had measured a seated two-year-old against it. The second version was measured before it was drawn. The agent put a stand-in head and body where Reggie's sit in the test, and another for the town's other toddler, Kojo, and the script that builds the cover now refuses to export it unless the head has seven centimetres of clearance all round. The hood stops at the back and a bubble front drops almost straight to the footrest. Reggie's head clears it by 7.5 cm, and Kojo's, estimated from his rig, by 9.7. The plastic was made darker and clearer.

A Blender render of a black pushchair on a grey floor with a clear plastic rain cover over it. A plain sphere and block stand in for a seated child, and the cover's hood and bubble front sit well clear of the sphere.
The second cover in Blender, with a sphere and a block standing in for Reggie. It is shaped round him this time.

It was in the game by five past five the next morning. Seeing Reggie under it in the rain is next.

The test turned up three things that were not the pushchair. A car parked up on the pavement held Jodie up for more than two minutes; she did not go round it. The director had put about eighteen residents down on one spot at the school gate. And at twenty past eight all three Pritchetts stood inside their house with the school as their destination and did not come out.

The shopkeeper's jumper

At twenty-three minutes past three James sent a line through the coordinator: Tariq's body needs fixing so he doesn't have the deformed pinched chest. Tariq Mahmood keeps Boss Man, the corner shop, and in his diamond jumper he looked as if something had been taken out of the front of him.

The agent's plan, written that afternoon, was to reshape his body under the clothes. When the run came to do it at twenty past four, it found his body was not there. The way his MetaHuman had been built, every bit of skin a garment covers is cut away, and what is left of Tariq's body is his two hands. The pinch was in the jumper.

Three more things were wrong with the plan. The script's guess at which way he faced was backwards, so its first dry run pushed his back out. A push of the same amount all the way round copied the old bumps, bigger. And the first real attempt left a rounded swell high on his chest that read as a bust. The fourth version pushes each height only as far as it lacks, against a line that falls three centimetres across the chest the way a man's does. At the deepest point of the dip, the front of the jumper now sits 14.7 cm forward instead of 9.1. The belly did not move.

Four views of an older bald man with a white beard in a blue and white diamond-pattern jumper against a blue background: side before and after, then front before and after. In the before views the jumper caves in across the chest; in the after views it runs smoothly down to the belly.
Tariq from the side and the front, before and after. The jumper caves in across his chest in the first of each pair.

The root of it was a preset. He was built on 12 October from one chosen for its skin tones, and it shipped with five measurements pinned, chest among them. That was found twelve days later.

The patka

Veer is ten and Sikh, and until two o'clock he had a top-knot of hair standing in for a head covering. James picked the job off a decision card: model him a navy patka in Blender.

The agent started with four photographs from Wikimedia Commons and read the fit off them: the edge about three centimetres above the brow, just over the tops of the ears, the ears always out, a round cover on the crown slightly forward, a tie low at the back, plain navy cotton. The patka is built as one shell fired at his scalp, with the ears cut out of what it can hit, and Blender's Solidify gives it thickness. The even-thickness option was switched off, because on the knot it threw spikes. Fitted to his real head the closest point inside it sits 3.18 mm off his scalp, and no point of his head comes through.

A boy of about ten in a navy hoodie and joggers against a blue background, front and side views, arms out. He wears a navy patka: a close-fitting cloth head covering with a round knot on the crown, ears left uncovered.
Veer in his patka, front and side. It fits and the ears are out. Seeing it on him walking is next.

The first editor launch for the fitting sat thirteen minutes on a dialog asking whether to wait for a server that was already answering. The second came up in 56 seconds. By quarter to three he was wearing it.

Five centimetres

At twenty-five to nine in the evening James asked for the umbrellas to be held about five centimetres higher.

The obvious place was the offset the game applies to the umbrella in the hand. The thread that writes the town's code checked and said no: the offset is measured in the hand's own frame, and with the arm raised the hand's up points sideways. Five centimetres up in the setting would have moved every umbrella five centimetres to the right. The umbrella's own up is the world's up, though, so the lift went into the meshes instead. Everything above the grip came up five centimetres. The handle stayed in the hand.

Fourteen umbrellas were rebuilt between eight minutes past ten and half past. In a storm they sat over the heads, rain beading on the clear domes.

Rain on a red-brick terraced street under a dark sky, wheelie bins out by the low front walls. A woman stands on her doorstep under a small blue umbrella, her hand held out palm up beneath it rather than gripping the handle.
A resident on her doorstep in the rain under a raised umbrella. Her hand is an open palm under the shaft, not a grip.

The hand underneath is an open palm. A grip is next.

Watching

At ten past eleven James was watching the night's test of the town. Thursday's give-way rule for narrow streets had already been through one build and sat through 34 minutes of test without seeing a single meeting, because the jams it was sent to solve were not head-on, and head-on was all it looked for. A second version, which looks at any angle, was written by ten to five.

What he saw that night was simpler. The cars, when they met, drove up on top of each other. Earlier in the evening a taxi had driven under a bus.

The fault

DestroyActor on an AI controller does nothing from Blueprint in Unreal Engine 5.8: pawnless AI controllers pile up

  • A toddler NPC is unpossessed while riding in a pram; despawned, his controller is left with no pawn.
  • Wrong guess: DestroyActor on the controller. It compiles, runs, and destroys nothing.
  • Cause: AController::K2_DestroyActor deliberately disallows destroying a controller from Blueprint (Controller.cpp:85). There is no warning.

The fix

SetLifeSpan on the controller instead

  • On unpossess, cache the controller in a variable first, then SetLifeSpan 0.1 on it. Caching matters: a node bound to the pure GetController re-evaluates per use and returns None after the unpossess.
  • On getting out, if the pawn has no controller, SpawnDefaultController.
  • Proved in PIE: after two despawn and respawn cycles, 0 pawnless controllers out of 44 to 46.

The fault

NPC will not walk while pushing a pram: path paused by crowd etiquette

  • The pusher's path is paused every time she tries to move off.
  • Cause: the riding child's AI controller is still running, with a crowd agent sitting on the pusher's position. The town's etiquette reads it as somebody in the way: slow, blocked, pause.

The fix

Unpossess the rider while he rides

  • Unpossess the rider when he gets in, possess again when he gets out. Unpossessing by hand in PIE made her walk at once.
  • Guard for despawns: spawn the pram with SetLifeSpan 10 and renew it from the pusher once a second, so a pram whose pusher was removed dies within 10 s.

The fault

Toddler's head pokes through the pushchair rain cover in Unreal Engine 5.8

  • The first cover was modelled to the pushchair alone. The seated child's skull reached 85 cm in the pram frame; the cover front was at 30-33 cm forward from 75 to 85 cm up.
  • The translucent material also read milky grey in PIE.

The fix

Measure the passenger before drawing the cover

  • Stand-in head ellipsoids at the PIE head-bone position (and the second toddler's rig). The builder refuses to export under 7 cm head or 3 cm torso clearance. Result 7.5 and 9.7 cm.
  • Material: base 0.30/0.35/0.38, opacity 0.12, roughness 0.04. Imported and saved. The PIE still under rain is the next check.

The fault

Fixing a MetaHuman's pinched chest under the clothes changes nothing

  • The plan reshaped the body mesh. Cause: on a parametric-clothed MetaHuman the built body is only the uncovered skin; here, the hands. The pinch is in the garment.
  • The body-shape origin: the preset he was built from pins five girths, Chest among them, and the build left the pins alone.

The fix

Solve the shape on the garment, against a target line

  • Force the front axis (auto-detect said -Y; it was +Y and the first dry run pushed his back out).
  • Push each height only by what it lacks against a wanted front line, smoothed over 2 cm, with arms gated by upper-arm weight. A uniform radial gain copies the old bumps.

The fault

UmbrellaOffset Z moves the held umbrella sideways, not up

  • The offset's translation is applied in hand_r's frame; only the rotation is forced to world. In the raised-hand pose the hand's +Z points sideways.

The fix

Lift the geometry above the grip

  • The umbrella's rotation is absolute and its +Z is world up, so the lift went into the mesh build: everything above the grip +5 cm, the handle untouched. 14 meshes rebuilt, seen held overhead in PIE.

The fault

Flat tan stick fused to a monster's arm in every animation

  • A stick-like piece runs shoulder to hand in every clip and frame. Hiding the hair slot left it; hiding the skin slot removed it; hiding IK bones changed nothing.
  • Cause found, not fixed: geometry inside the shared body mesh, weighted to hand_r. The fix is deleting those vertices in Blender and re-importing.

Plain English

TermWhat it means
AI controllerThe invisible driver that moves a computer-controlled character round the world, separate from whatever system decided where it should go.
possessWhen a controller takes charge of a character's body. Unpossess it and the body stops being driven, but the controller itself carries on existing unless something removes it.
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.
despawnRemoving a character from the world while nobody is looking, to save memory, and putting one back later. Done carelessly, a resident vanishes mid-errand or reappears on the same spot.
lifespanA timer on an object in the game that deletes it when it runs out. Renew it regularly and the object lives; stop renewing it and it cleans itself up.
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.
MetaHumanEpic's system for realistic human characters - face, body, hair and clothing, ready to animate. Every named person in the game is one.
material slotA numbered surface on a model that takes its own material. One mesh can have several - brick on one, roof tiles on another - and the numbering is how a script says which is which.
translucentA material the engine blends over whatever is behind it instead of drawing solid. How glass, water and ghosts are done; how bright it looks depends on what is behind it as much as on itself.
skin weightsThe numbers that say how much each bone pulls on each part of a model's surface. Get them wrong and a shoulder collapses when the arm lifts; transfer them from the body underneath and a garment bends the way the body does.
socketA named attachment point on a model - a hand for holding a bag, a roof for a light.
dry runRunning a script in a mode that reports what it would do without changing anything. Safe, and easy to leave switched on by mistake.
Solidify modifierA Blender setting that gives a thin surface real thickness by copying it inwards. Its even-offset option keeps the thickness constant, which can throw spikes out of tight curves.
patkaA close-fitting cloth head covering with a knot on the crown, worn by Sikh boys before they move on to a full turban.

Things we still need to fix tomorrow:

  • Delete the stick from the body in Blender and re-import. Then a crouch and a darker body for Rawhead.
  • Reggie under the new rain cover in the rain, in the town.
  • Get the Pritchetts out of their front door in the morning, and stop the director putting eighteen people down on one spot.
  • Teach a blocked resident to walk round a car parked on the pavement.
  • A grip on the umbrella handle.
  • Veer's patka on him while he walks.
  • Build the give-way rule that looks at any angle, and find out why cars climb on top of each other.

← 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