Changelog
All notable changes to Into the After (codename Max). Version format: MAJOR.MINOR.PATCH (0.000.000).
- PATCH: bug fixes and incremental changes
- MINOR: significant progress / a closed-off feature or milestone
- MAJOR:
1.000.000when the game is fully playable
[0.003.073] - 2026-11-05
Changed
- Texture warp (Affine) is off by default: textures hold still on big walls and floors as the camera moves. It's still a slider in Rendering > Renderer.
[0.003.072] - 2026-11-05
Changed
- Vertex snapping is off by default: models no longer wobble as the camera moves. It's still a switch in Rendering > Renderer. Texture warp (Affine) is unchanged.
[0.003.071] - 2026-11-05
Changed
- Cans, boxes and paper only lie about in towns (City Block, Small Town, Residential). Out in the Wilds, Forest and Swamp and above underground levels there's a scatter of fallen leaves instead, and only leaves blow past; the Wasteland's sand has neither. Indoors, anywhere, there's still what people left behind. The Wasteland's scattered bin bags and litter are now rubble.
[0.003.070] - 2026-11-05
Changed
- The camera's defaults are the ones you baked: it stays further back and looks down more steeply (17 to 36 m, 30 to 48 degrees), with a slightly wider view (32 degrees).
[0.003.069] - 2026-11-05
Changed
- Bunker, Sewers and Railway doors are now in the middle of the starting area, set in a mound of earth, with a covered way running from the door to the stairs. You see nothing of the level until you're on the lower flight, and the earth and roof fade away while you're in the covered way.
- Swamp walkways are solid. The planks' holes are still there to look at, but you can't fall through them, walk through a deck or rail from the water, or get stuck in one. Walkways run square to the world with a platform at each bend, so rails no longer cross at junctions, and each hamlet has a ramp up out of the water. The bridges mean you can't wade underneath: use the ramps.
- Rooms have one unbroken floor, with no bare patches, and the floor finish is now cut to fit round holes in the slab.
- Painted clapboard on houses in place of the blotchy, peeling texture, and quiet plaster indoors in four sets with their own marks, picked per wall, so walls side by side don't repeat.
- Desert grass in the Wasteland: pale, dry and sparser. The green scrub bushes are still there.
- Rocks sit well into the ground instead of balancing on it, and fallen trunks lie down, partly buried.
- Underground walls are split into smaller faces, so textures should warp much less as the camera moves.
Fixed
- Scrap heaps no longer have pieces hanging in the air: each rests on what's under it.
- Reeds can be walked through.
- Stilt shacks' floors no longer flicker against their decks.
Removed
rock_outcropis no longer placed: its mesh is a mess of spikes. The model is still there if it's remade.
[0.003.068] - 2026-11-05
Fixed
- Clipping and z fighting cleared across the game. Furniture, shacks, signs, tents, tunnels and more no longer have parts flickering against each other (sofas and armchairs were the worst): the model build now finds parts lying in the same plane and separates them by a few millimetres. 314 models rebuilt.
- Towns, Residential streets and underground levels no longer put things down through each other: bins through benches, debris piles in piles, cots in cots, sludge and crates in walls, sheds on trampolines. Where one would cut into another it's left out. Existing seeds in those zones change a little (the golden city layout was updated on purpose).
- Fences no longer stand a post where the next piece's stands, and neighbours no longer both fence the same boundary.
- Where two buildings shared a corner they each had a pillar in it, a few centimetres apart; now just the one.
- Side streets sit clearly above the road they leave, and turning circles above their road.
- Ticket booths no longer poke through the ceiling above a platform.
Changed
generatedZonesHaveNoClippingOrZFightingnow holds every zone to tenet 6, thing against thing, the Swamp from 0.003.069. Newworld::GroundClaimsis what generators place things with.
[0.003.067] - 2026-11-05
Added
- Wasteland dunes. The sand now rolls: ridges with a long slope and a short steep face, wandering and broken up, with a gentle swell over everything. They ease in beside the road and round the petrol stations and motels, and you walk on them, so do the zombies. Tune it per size in World > Zone generation (Dunes, Dune width).
- The road goes into the sand. Sand drifts over the edges of the road and car parks along a wandering line, now and then in a long tongue across the lanes, instead of the asphalt stopping at a straight edge.
- Old barriers, road signs and cones now and then along the Wasteland road: a few concrete barriers or sawhorses knocked out of line, a sign twisted on its post. Not many.
- New engine tenet: no clipping, no z fighting.
tests/ClipTests.cppmeasures it. It fails if the Wasteland has surfaces lying together or things cutting into each other, and can list what every other zone and model still has.
Changed
- Things in the Wilds, Forest, Swamp and Wasteland no longer get placed through each other or through buildings: where one would cut into another it's left out. Existing seeds in those zones change a little (the golden layout was updated on purpose).
- Wrecks and scrap on a dune sink to its lowest corner, half buried uphill instead of hanging in the air, and none are placed where it's too steep.
- Camps, ruins and landmarks in the Wasteland keep off the road and its stops. The land's level sites there no longer include ones nothing was built on.
- Protocol 39: the terrain carries its road, stops and dunes.
Fixed
- Shop and motel floors no longer flicker against the car park under them, and road pieces no longer overlap at their joints.
- Scrap dropped on a car park or the road now lies on it, not sunk just into it.
- Car parks no longer lie over the road where it bends.
- Barbed wire fences and guard rails no longer stand the same post in two pieces where they join; drums and tyre piles no longer stand through each other.
- Petrol pumps no longer stand through the canopy's pillars, and their islands no longer flicker against the canopy's: the canopy has a small plinth round each pillar, and the pumps stand either side.
- The Wasteland road no longer stops dead just past the zone's edge: it runs on until the land on the horizon rises over it.
[0.003.066] - 2026-11-05
Added
- Notes for Claude. In the editor build, press P while playing: the picture freezes. Draw on it (circle what you mean, or click on it; right click takes a line back), type what's up, and Enter saves and carries on. Ctrl+Enter starts a new line and Esc drops the note. Then ask Claude to go through your notes.
- Each note knows what you drew on: the model, the mesh, material and texture, and the building it's part of. It also keeps the picture with and without your drawing, and where you were.
- Each note keeps the last 20 seconds as a replay, around 3 MB, instead of a video.
--replay <file>plays it back from where your camera was (pause, restart, and F8 to fly round it), and--replay-dump <file>writes it out as numbers. A replay plays on a build with the same network data. Tools > Notes sets its length.
[0.003.065] - 2026-11-05
Added
- Supplied textures, in the game's pixel art.
tools/textures/import_textures.pyshrinks the texture pack inCodename Max Source/Texturesto 32 texels a metre, keeps it tiling and reduces its palette. Only the small results are committed.tools/textures/texture_map.pysays which goes where, so changing one is one line. - Rooms have real floors: floorboards, parquet, carpet, kitchen and bathroom tile, marble lobbies, shop tile and worn lino, chosen by what the room is and laid over the concrete. Patches are missing in damaged buildings. Footsteps follow them (carpet is quieter, tile and boards louder). Stockrooms and storage stay bare concrete.
- Each zone has its own ground: grass in the Wilds and Residential, weedy dirt in Small Towns, dry dirt in City Blocks, forest floor in the Forest, sand in the Wasteland, mud in the Swamp. It tiles over 8 m rather than 2 m, so it repeats far less.
Changed
- New looks for existing surfaces: concrete, brick, rust, wood, shingles, paving and rocks all come from the pack, so every building and prop using them changes.
- Zone kits: plank decks and fences use weathered planks and trees' parts use bark. Stone walls are fieldstone, railway beds are ballast, and hay is straw. Bare steel fittings look like steel, with corrugated sheet kept for roofs and shed walls. Bunker hatches are tread plate.
- Rugs are thicker, so they sit clear of the new floors. Their pattern no longer flickers.
[0.003.064] - 2026-11-05
Fixed
- Floating and misplaced parts on the zone models. Anything in the new kits that was turned or tilted was moved away from where it belonged. That's what left shack walls in a line away from their houses and objects hanging in bunker rooms. It also bent log cabins, pipes and fallen things. All 732 kit models are rebuilt.
- Tents and shelters stand the right way up: ridge tents no longer open out into a V, and tarps, sheds and dog houses have their roofs over them.
- Falling out of the Sewers. A broken walkway had nothing under it: it now has the channel's bed below and a slumped step you can walk out of. Railway platform steps had the same hole either side of them. Nobody can now fall out of the bottom of an underground level.
- Swamp walkways: their rails no longer cross the platforms they join, so you can turn from one walkway onto another. Holes are at most two planks wide and the planks tilt less. On the test seed every stilt shack can now be reached.
- Flickering floor objects: rugs had a pattern only 2 mm above them, and floor stains and paint lines were almost as thin. These are thicker now, and other parts that sat too close together on shack walls, signs, trailers and a shop fridge are separated.
- Screenshot stamp names Forest, Wasteland and Swamp correctly instead of calling them Wilds.
Changed
- Bunkers are bare cast concrete, with a darker footing and the lines of the shuttering. The green and white painted bands are gone.
- Painted things are plain paint. Kit models used a car-paint texture with metre-wide rust patches and a printed cardboard texture for their colours, which is what made lockers, crates, coolers, tents and rugs look wrong.
- Fuel pumps look like fuel pumps: a cabinet, a pale head with price dials and grade buttons, a brand strip, a hose looped down to a holstered nozzle, on a concrete island with bollards. A few are knocked flat.
- Small props: picket gates hang from their post, and tricycles and wheelbarrows are joined up.
[0.003.063] - 2026-11-05
Added
- Swamp trees have long streaks of moss hanging from their crowns.
[0.003.062] - 2026-11-05
Added
- Bunker: a real kit and rooms that have a purpose: barracks (bunks, lockers, gas masks), stores (steel shelves, military crates), command rooms (consoles, map tables, radio racks), plant rooms (generators, tanks), mess halls and sick bays. Working, flickering and red emergency lights, crates of ammunition, rations, medicine and weapons to find, and a concrete hood with a blast door above ground.
- Sewers: long brick drains right across the level with branches off them: water down the middle (waist-deep wading), a walkway each side, steps up out of it, basins where they meet, dry chambers off them. Pipes, grates, ladders, valves and rubble on the walls, rats' nests and sludge, and shafts of daylight down open manholes.
- Railway Tunnels: a double line right across the level, two tracks on ballast, with stations (platforms and steps, benches, pillars, ticket booths, posters) and service tunnels to side rooms. Passenger and freight carriages stand on the line, some derailed: walk through them, and search them.
- Water can stand on any floor now, not only on terrain.
- About 210 new models for these three zones.
- Rooms that make sense, and many more things in them. Large houses now have a dining room beside the kitchen and a kids' room, nursery or study upstairs; halls have coat racks and shoe racks. 177 new furniture models: 4 or so variants of every sofa, armchair, table, bed, wardrobe, fridge, stove, kitchen unit, toilet, bath, basin, desk and more, picked per room so no two match; and new things: fireplaces, floor lamps, rugs, side tables, pantries, cribs, vanities, toy chests, hampers, coat racks.
- More to search: trunks, footlockers, safes, cash boxes, medicine chests, toolboxes, suitcases, cardboard boxes, plastic bins and hampers join the furniture, each with its own loot.
Fixed
- The level's base light underground is enough to see where you are; your torch still matters.
- The level now keeps a little dust in the air, so lights' beams show.
- Decks, walkways and shack floors are at the heights they were meant to be, so you step between them cleanly.
- AI can find its way through an underground level (navigation used to stop at the edge of the zone's terrain).
[0.003.061] - 2026-11-05
Added
- Residential. Long, gently curving streets with side streets and turning circles, not blocks. Houses stand in their own yards along them: 18 new ranches, bungalows and colonials (some burnt out), picket fences that are mostly falling down, board fences round the back, driveways, mailboxes, swing sets, trampolines, sheds, grills, garden gnomes and the rest (about 90 new yard models).
- Small Town, small is now a little main street of shops with houses at the ends and a few side streets. Medium and large keep their grid.
- Forest. A closed canopy of hemlock, white pine, birch and beech over ferns and rhododendron. Log cabins and plank sheds on level clearings, joined by worn paths; camps, logging piles, fire towers.
- Wasteland. Open, rolling, dead land with a road running through it. Petrol stations (canopies, pumps, a shop, price signs) and motels stop along it, with billboards, road signs, guard rails, wrecks, trailers, scrap heaps and bones off to the sides. Dead trees and scrub.
- Swamp. Mostly water, waist deep at most, with islands: bald cypress, tupelo and old live oak standing in it, reeds, lily pads, cypress knees, sunken rowboats and jetties. Ramshackle plank shacks with rusting tin roofs on stilt decks, in hamlets joined by plank walkways, some fallen in.
- Low fog (Runtime > Environment): a new layer of fog lying about waist deep, its top rolling and drifting, parted by people walking through it. The swamp has it on heavy. It costs about 1 ms a frame; Rendering > Renderer has a switch and its quality.
- Wading: water slows you, the deeper the slower (Player movement > Wading). Walkways above it don't.
- Wilds is a real place now: abandoned camps, farmsteads, ruins, windmills and water towers, graves, stone walls and barbed-wire fences, with worn paths between them. The test land's grey blocks, floating globes and lone lamp posts are gone.
- Buildings suit their zone: nothing from a city turns up in a swamp or forest, or the other way round.
- 16 new buildings for City Block, all 8 storeys or under, and 6 for the roadside.
docs/SFX.mdlists the sounds these zones are waiting for.
Changed
- City Block's zones are smaller (128, 192, 320 m) and Small Town's large is 400 m, so they run better: a large City Block was taking 40 ms a frame.
- Golden value of the default scene updated on purpose: the Wilds changed. Saved seeds keep their towns and cities.
[0.003.060] - 2026-11-05
Fixed
- Small towns aren't lopsided. A small town or city could end up all on one side of the road you arrive on, so you stood at a crossroads looking at trees. There's now always a block on each side of it.
- Litter. It's now spread by the area it's scattered over, so a small zone or a lone building doesn't get thousands of pieces in a heap, and most of it lands indoors rather than on roofs.
- Bunker: the level no longer shows past the edge of the map from above ground; it appears as you go through the door.
- Bunker: the minimap and the large map work underground, filling in as you see each room, with solid rock round them.
[0.003.059] - 2026-11-04
Added
- Zone types in the menu. Game > New world now asks for a type, then a size. Small Town, City Block, Bunker and Wilds can be generated today; Residential, Forest, Wasteland, Swamp, Sewers and Railway Tunnels are listed and come next.
- City Block is its own zone: tightly packed streets of buildings 3 to 8 storeys tall, with almost no gaps or empty lots. It uses the buildings we have until its own set is made.
- First underground level (grey box). A Bunker is a small area above ground with a door; go through it and down real stairs into rooms and corridors, with no loading screen. The sun, sky and fog fade out as you go down, and your torch does the rest. Everything is plain concrete for now, there's no door to open yet, and the minimap is blank down there.
--zone-typeand--zone-sizestart a game as any zone (--zone-type city_block --zone-size large).- Each zone type's rules are now data, in
assets/settings/Zone <type>.settings.json, and edited per type and size in World > Zone generation. A type can also change the look of its zones (Zone look <type>.settings.json) without touching your own saved settings. docs/SFX.mdlists the sounds the new zones need.
Changed
- What you've been playing is now called Small Town, and at medium size it's the same as before on the same seed.
- World > Zone generation shows one zone type at a time.
- Network protocol 38: the new-world request carries the zone type, and the shared wall damage setting now reaches every player.
Fixed
- Small zones have streets. A small town or city was too small for even one block to fit, so you got a lone junction. A small Small Town is now about 14 buildings.
- Litter now scales with the zone: a small zone isn't buried in it, and a large one is no longer sparse.
[0.003.058] - 2026-11-04
Changed
- The edit overlay's first menu is now Game (it was "Max").
[0.003.057] - 2026-11-04
Added
- Feedback from inside the game. A Feedback button in the top-left corner (while playing and on the main menu) opens a form: what it's about (bug, idea, balance or other), what happened, and a screenshot of the game as it was when you pressed the button, with the game's state (its version, where you were, what's switched on). Send it and it reaches the developers; without a connection it's kept and sent the next time the game starts. While the form is open the game waits and your typing stays out of the game.
- intotheaftergame.com: a title page and the changelog, updated after every release (
/changelog). - Behind them, a small relay on the site (
tools/feedback/worker, docs/FEEDBACK.md) files each report in the game's private issue tracker with its screenshot. The game sends with the system's own HTTP (libcurl on macOS and Linux, WinHTTP on Windows: no new download). --open feedbackshows the form in a capture.
Fixed
- Typing into a text field no longer moves the player or triggers game keys when the edit overlay is hidden.
[0.003.056] - 2026-11-04
Changed
- The main menu's logo 3 is the new, finer pixel-art version (549 x 206 pixels, drawn at 3 screen pixels each).
[0.003.055] - 2026-11-04
Changed
- The main menu shows logo 3 (the pixel-art one with the subtitle on a rusty sign). The others are still in Rendering > Main menu.
[0.003.054] - 2026-11-04
Changed
- Logos 1 and 3 are now the pixel-art versions, brought in at their own pixels (one per block of the drawing, so nothing is smeared), and the logo is drawn 25% bigger: about 560 game pixels across (Rendering > Main menu: Logo size). A pixel-art logo snaps to the nearest size that keeps its pixels even when one is close. Logo 2 stays the painted one.
[0.003.053] - 2026-11-04
Added
- The main menu. The game starts on the Into the After logo and a Start game button, over a street of the zone, blurred and darkened behind them, the camera slowly looking about. The logo and button go through the CRT (curve, scanlines, mask, grain) like the picture. Click Start game, or press Enter, Space or A. Your game doesn't begin until you do: the world holds once your character has arrived.
- Three logos to choose from (Rendering > Main menu: Logo), imported from
Codename Max Source/Logobytools/ui/import_hud.py. The same panel sets the logo's height and brightness, the blur and darkening, and where the street camera stands and looks. Its "Show the menu" button brings the menu back up to see a change. --open menushows the menu in a capture (captures, recordings, benchmarks and--startruns skip it otherwise).
[0.003.052] - 2026-11-04
Changed
- The game is now called Into the After (in full, *Into the After: The Scavenger's Road*). The window title and the caption in the corner say so in every language.
- In the code the game is
intotheafter: the programs arebuild/<preset>/bin/intotheafterandintotheafter_tests, the namespace isintotheafter::game, test macros areINTOTHEAFTER_TEST/INTOTHEAFTER_SLOW_TEST, and the build options and the source-art override areINTOTHEAFTER_*. The engine takes the game's name from the game. The repository and theCodename Max Settings,SourceandCapturesfolders keep the codename, so your settings, art and captures stay where they are. - The Desktop launchers are now Play Into the After (Editor) and Play Into the After (Player) (
tools/mac/make-launcher.shmakes both), logging to~/Library/Logs/Into the After.log.
[0.003.051] - 2026-11-04
Changed
- The inventory screen, rebuilt in the UI pack's look. Three riveted panels under a title plate: on the left the container you're searching (how many stacks are found, a bar while the search goes on) or, when you aren't searching, what you have equipped (sidearm, primary and melee weapon, with the rounds loaded); in the middle your pockets and the weight you carry, with a mark where it starts slowing you; on the right the details of the selected stack (its picture large, name, rarity, description, condition bar, weight, count, and what it does: health, food, water, pain relief, calibre, magazine). Every item has its own picture from the pack, in a frame coloured by its rarity, with its count on a badge. Along the bottom, what the controls do right now. The rest of the HUD steps aside while it's open.
- The loot outline is a solid rim round the whole silhouette, three pixels thick, like the selection outlines of other games: it no longer flickers as the camera moves (it now gets the same PS1 vertex snapping as the scene) and never shows the furniture's insides or edges within it. Something standing in front of the furniture (you, say) hides the rim there; furniture pushed into a wall, or seen through the dithered cut-away of a wall near the camera, keeps its whole rim.
Added
- Gamepad and keyboard control of the inventory: the d-pad or left stick (or WASD and the arrows) moves the selection between cells and across to the next panel, A (Enter, Space) picks up and puts down, X (R) turns what you hold, Y (T) sends the selected stack straight across, into the container or out of it, topping up your stacks first, and B (Esc) lets go or closes. With the mouse, click to pick up and click to put down, or drag. A stack you hold shows green where it fits and red where it doesn't. While the screen is open it has the controls: no walking, jumping, quick select or emotes.
- Item pictures: items have an
icon(an image underassets/); the base game's ten come from the UI pack (tools/ui/import_hud.py), sized to their cells. Modders set it initems.define(docs/MODDING.md), and Tools > Items edits it. - Testing helper:
--open inventoryopens the inventory screen at the start and--open lootsearches the nearest container in reach (it logs where the nearest loot spot is, for--start), so captures can show the screens.
Fixed
- The HUD was missing from captures and
--no-editorruns when drawn through the CRT (its font never reached the GPU). - Putting something into a container you hadn't finished searching hid it, and showed one of the container's unfound stacks instead.
[0.003.050] - 2026-11-03
Added
- The item editor (Tools > Items): every item in play, to change or to start a new one from (an id and a type). Edit its name, description, weight, rarity, condition, inventory size, stack and model, and its type's own parameters (a food's hunger recovery, a gun's calibre and magazine). Save writes it to the base mod's
scripts/edited_items.luaas an ordinaryitems.define; the server reloads the mods at once and everyone playing gets the change. It works where the game's server runs (single player, or hosting).
[0.003.049] - 2026-11-03
Added
- A white outline round what you can loot. Furniture holding loot near you (within about 4.5 m, and not behind a wall) gets a thin white rim; the one Interact would search is brighter. It's drawn into the scene before the post effects, so the CRT, colour reduction and grading treat it as part of the picture: a pixel wide at the game's resolution, whatever the furniture's shape.
[0.003.048] - 2026-11-03
Added
- Loot containers. The cupboards, shelves, counters and desks in buildings now hold loot: a container appears at each loot spot as you come near, filled from a Lua loot table by what the building is (a supermarket's shelves hold food, a pharmacy medicine, a gun shop ammo and guns), the same for every game with that world's seed. Press Interact (X, or the left shoulder on a gamepad) beside one to search it: the inventory screen opens with the container's grid beside yours, and its contents turn up one stack every 0.6 s while you stay close. Drag what you want across (and things back in). In co-op what's found is shared: first come, first served. Press Interact again, or walk away, to stop.
loot.tablein Lua, and the base game's tables (food, kitchen, medicine, medical, ammo, weapons, shop counters, and junk for everything else) with the test items. docs/MODDING.md has the loot section.
Changed
- The network protocol version is now 37 (interact presses; containers and searching).
[0.003.047] - 2026-11-03
Added
- The inventory screen (Tab or I, gamepad Start): your grids side by side (pockets now; a grid for each backpack or rig you wear later), every stack on its cells in its rarity's colour (grey common, green uncommon, blue rare, purple very rare, gold unique) with its name and count, and the weight you carry. Drag a stack with the mouse to move it; R turns it while you hold it. The server checks every move fits, so co-op players always see the same. While it's open the mouse and R are the inventory's (no shooting, no reloading). Gamepad control of the screen is to come.
- Weight slows you down: carrying more than 15 kg slows you evenly, down to 0.6 of your speed at 40 kg (Runtime > Player movement: Carry freely, Heavy load, Heavy load speed).
Changed
- The network protocol version is now 36 (inventory moves).
[0.003.046] - 2026-11-03
Added
- Ammo and reloading. Guns fire from their magazine (the pistol holds 15, the assault rifle 30, the shotgun 8) and Reload (R, or X / west on a gamepad) fills it from the rounds of its calibre you carry: the reload animation plays (upper body, so you can reload on the move) and you hear it; the rounds go in at its end. Empty, the trigger just clicks. Ammo is by real calibre (9mm, 5.56, 12 gauge), shared by any gun that takes it. The HUD shows rounds loaded / carried beside your status while a gun is out (red when empty).
- An inventory, on the server and sent to everyone: items on grids (your pockets, 5 x 2, and later a grid for each backpack or rig you wear), stacking, weight. You start with your guns loaded, 30 spare rounds for each, a can of food, a can of water and two bandages. The inventory screen is next.
- The base mod gains the assault rifle and 5.56 rounds.
Changed
- The network protocol version is now 35 (reload presses; inventories; dry fires and reloads heard by everyone).
[0.003.045] - 2026-11-03
Changed
- The engine is now called LibR8. Its code (
engine/) is namespacelibr8, its librarieslibr8_engine,libr8_audio,libr8_physicsandlibr8_script, and its macrosLIBR8_. The game is kept apart from it: still Codename Max for now (namespacemax, themaxprogram), built on LibR8. Nothing changes in play.
[0.003.044] - 2026-11-03
Added
- Mods, and items defined in Lua. Mods are folders (
mods/<id>/with amod.json, andModsin your settings folder for ones you've downloaded); the base game is itself a mod,mods/base, loaded first the same way. Each mod'sscripts/main.luaruns on the server and can define item types (items.type: a type builds on another and adds its own parameters with defaults) and items (items.define: every item has a name, description, weight, rarity, condition, grid size and stack, plus its type chain's parameters; a misspelt parameter is an error). What they define reaches every player in the world's item catalog. Mods reload while the game runs when their files change. Tools > Mods lists what's loaded and any script errors. - The base game's item types (resource, junk, consumable with food, drink and medical, ammo, weapon with gun and melee, gear) and its first test items: 9mm rounds, 12 gauge shells, canned food, canned water, bandages and painkillers, and the pistol and shotgun that fire them.
docs/MODDING.md, the guide for modders: what a mod is, what can be modded, the Lua sandbox and the items API, filled in as each part lands.
[0.003.043] - 2026-11-03
Added
- Lua scripting, the start of modding. Lua 5.4 is built into the engine (
engine/script), for gameplay scripts and, later, mods and Steam Workshop items. Scripts run on the server only, in a sandbox: no files, no OS, no bytecode,requireonly finds files inside the mod's own folder, and a script that runs too long is stopped with an error instead of freezing the game. Items, loot tables and containers are the first things to move into Lua. - New dependency: Lua 5.4.7 (MIT), pinned in
cmake/Dependencies.cmakeand built as C++ so script errors unwind cleanly through the engine's functions.
[0.003.042] - 2026-11-03
Changed
- Your settings are the build's defaults now: the Audio mix, Vegetation (tree density 0.477, bush density 2.2), Camera (closest zoom), HUD (drawn through the post-processing, its brightness) and Post (brightness ceiling and knee) as you've tuned them.
[0.003.041] - 2026-11-03
Added
- Gun sounds. Every gun now has its own report: the pistol, the revolver (a Desert Eagle), the machine pistol (a P90), the rifle (an M4), the shotgun (an AA-12) and the sniper (an AX50), carrying 160 m and echoing off the walls round about. Bullets sound where they land by what they hit: metal rings, concrete and brick crack, wood and dirt thud, bodies squelch, glass breaks; now and then one ricochets off something hard; and spent casings clink down by the shooter's feet a moment after (not the revolver's). Heard by everyone from the shots the server already sends, so nothing new goes over the network.
- Imported and waiting for their features: reload and dry-fire (empty) clicks, for when ammo and reloading land, and suppressed pistol, rifle and assault rifle shots, for when there are suppressors.
[0.003.040] - 2026-11-03
Changed
- Atlanta's real sun. The sun is where it really is in Atlanta (33.75 degrees north) on a midsummer day, with the time of day as local sun time: up at 4:53 in the north-east, 80 degrees high due south at noon (shadows short under everything), down at 19:07 in the north-west. At night a full moon takes the opposite way across. Atmosphere has Latitude and Day of the year (172 = midsummer; 80 and 266 the equinoxes, 6:00 to 18:00 and 56 degrees high; 355 midwinter) in place of Sunrise direction and Moon height. The network protocol version is now 34.
Fixed
- No more sun rays streaming away from you with the sun at your back. Shadows carve shafts into the fog only when you look towards the sun; looking away the fog takes the sun's even light. Parallel shafts meeting at the point opposite a low sun are real, but faint in a real sky; here they were as strong as the shafts towards it. (Slightly cheaper too: no shadow lookups for those rays.)
[0.003.039] - 2026-11-03
Fixed
- The sun rises in the east, passes straight overhead and sets in the west. It used to rise in the north (the bearing was read with +Z, north, as 90 degrees) and circle round the horizon at a fixed height, so buildings cast long shadows all day that turned like a clock hand. Now shadows fall west in the morning, are short under everything at noon, and fall east in the evening. The moon takes the same way across at night, lower (across the south).
Changed
- Atmosphere's sunrise setting is a compass bearing (90 = east; north is +Z on the map). "Sun height at noon" is gone: the sun always passes overhead. The network protocol version is now 33.
[0.003.038] - 2026-11-03
Fixed
- Ivy leaves at their real size. Each leaf on the climbers and ledge vines was the size of a whole leaf card (half a metre to two metres across, many times a person's hand). Now each card is a small sprig of seven leaves, 5-10 cm each, on cards a third the size, and slightly cheaper to draw (overdraw): at a busy street 19 ms a frame to 17 ms.
[0.003.037] - 2026-11-03
Fixed
- Vines on buildings no longer fade away as you zoom in. The plant camera fade (Renderer > Look) dithered away every plant near the camera, climbers included; it now thins only tree crowns, and never more than 60% of the way from the camera to the player, so zoomed in the trees beside you stay too.
[0.003.036] - 2026-11-03
Fixed
- A stutter every second, and a third of the frame time. Hot reload's once-a-second check of the asset folders made every model, sound and surface in the game reload, whether anything had changed or not. Now the folders are checked on a background thread and nothing reloads unless a file really changed. At a busy downtown street: 25 ms a frame down to a steady 60 fps; the dense office 29 to 20 ms, the tower 27 to 18, the start street 23 to 15 (uncapped).
- Characters well out of view are still animated (their footsteps, what they hold) but no longer skinned, which was most of their cost.
- Less grass on the roads: overgrowth thickens sidewalks, lots and edges, but bare asphalt keeps to the odd tuft in a crack.
- Vines no longer hang past a building's corner: climbers are fitted to their wall (shrunk to fit a short one).
Changed
- Ivy from IvyGen. Climbers and the vines hanging from ledges are grown by Blender's Ivy Gen over a patch of wall exactly their size (
tools/blender/ivyimport.py), with a drawn ivy leaf, instead of ez-tree's trellis plants. - Hanging vines move: they flutter in the wind like the trees' leaves, fixed where they hang from. Any model can do this now: its vertex colour's alpha says how much each part moves.
- Cheaper overgrowth: climbers cast no shadows (they lie flat on their walls), bushes cast sun shadows only within 40 m of the camera's focus (Renderer > Look > Bush shadow distance) and are drawn out to 110 m, bushes are lighter (about 1,000 triangles), and the defaults are fewer wild bushes (1.8 per 100 m2) and climbers (one every 8 m of wall).
[0.003.035] - 2026-11-03
Fixed
- Fingers no longer curl through the hand when walking or running with the torch (or a melee weapon) out. The grip used to close on top of the walk's and run's own finger swing; now it closes from the same relaxed hand as standing still, so the hand looks the same at every pace. Guns keep their own grip.
Changed
- Baked defaults: the torch's grip in the hand (Tools > Character tuner), and the Environment (time of day, wind and gusts, fog, dust), Sight and Renderer panels' settings.
[0.003.034] - 2026-11-03
Added
- Atlanta's trees. Towns are now modelled on Atlanta, "the city in a forest": loblolly pines up to 25 m in stands, tall straight tulip poplars, white, southern red, water and willow oaks, sweetgum, red maple, hickory, dark evergreen southern magnolias and little dogwoods under them. Woods stand through most of a city (World > Vegetation > Groves), with lone trees in its yards and streets.
- Atlanta's bushes. Chinese privet thickets everywhere (the invasive that fills Atlanta's woods), azaleas, American holly, mountain laurel and the bramble, all grown by ez-tree and swaying and fluttering like the trees.
- Overgrowth (World > Vegetation > Overgrowth): an abandoned city going back to nature, as in Detroit's empty blocks. Tree of heaven, boxelder, mulberry, cottonwood and sweetgum saplings come up through sidewalks, lots and yards (now and then through a cracked road), privet, sumac and bramble thicken against the buildings, and kudzu, English ivy and Virginia creeper climb their walls. Climbers flutter in the wind but hold to the wall. Nothing ever grows inside a building. One slider sets how far gone the city is.
- Hanging vines on ledges and parapets are now real vines (ivy, kudzu and creeper cascading down) instead of flat cards.
- Plant camera fade (Renderer > Look): trees and bushes right by the camera dither away, so you see the ground through the crowns you're looking down through.
Changed
- The dead trees, scrub and tumbleweed are out of the scatter (kept as assets), and so are the first ez-tree set (aspen and the generic oaks, ash and pines): towns are Atlanta's now.
- Each species has its own bark and leaf colour; the tree models live in
tools/blender/eztree_species.py, a catalogue, one line per model. - Default amounts: lone trees 0.6 and bushes 2.5 per 100 m2, 25 groves a square kilometre (12-40 m across) from a third of the way out of the city centre. Your saved Vegetation settings still win: reset Tree and Bush density to see the new ones.
- The network protocol version is now 32: the ground mask carries the buildings' footprints and wall heights, and vegetation gained the overgrowth settings.
- The vegetation golden value changed.
[0.003.033] - 2026-11-03
Added
- Living trees. The dead trees have made way for 23 living ones: young, grown and big old oaks, ash, golden aspen with white birch bark, and pines up to 22 m, with a few struggling ones whose crowns have thinned. They stand alone and in groves (pine stands, or a mix of the rest) at their real sizes, and their leaves flutter in the wind. Fallen wood, stumps, bushes and rocks are unchanged.
- Dappled shade. Leaves cast the shapes of their leaves in sunlight and lamplight, not squares, so the ground under a tree is broken shade.
- Seeing through crowns. A tree's crown between the camera and you now opens up around you, as walls do.
- Trees are grown by ez-tree (procedural trees by Daniel Greenheck, MIT), run under Node by
tools/eztree/export.mjs(@dgreenheck/ez-tree1.1.0 andthree0.170.0, pinned intools/eztree/package.json; its bark textures are CC0) and made game-ready bytools/blender/eztreeimport.py. Each tree is a preset and a seed, so there are as many as we want for free.
Fixed
- Cut-out textures (leaves, fences) no longer thin away to nothing in the distance or at low resolutions: their alpha is kept up in the small mip levels.
Changed
- The tree budget is 6,000 triangles (bark up to 2,500 plus leaf cards). Zoomed out over woods this costs about half a millisecond a frame.
- The vegetation golden value changed: every seed's trees are different species now.
[0.003.032] - 2026-11-03
Added
- Real trees, fallen wood, bushes and rocks. The placeholder bushes, dead trees and grey rock lumps from the very start are gone. In their place are models at their real sizes: a bare bleached dead tree, a broken snag, a big dead oak, a dying tree with a few brown leaves, and tall dead pines (about 15 m). There are fallen trunks, a rotten log, an uprooted tree, a burnt trunk and two stumps; dead bushes, dry scrub, a bramble and tumbleweeds; and boulders, a mossy rock, a split rock, a rock cluster, an outcrop and small stones.
- Groves. Small stands of dead trees (tall dead pines, or a mix of bare and dying trees) with bushes and fallen wood beneath, out in the wilds and towards the edges of a city, never on roads or in buildings. Tune them in World > Vegetation > Groves.
- Wind in the branches. Trees and bushes still bend in the wind, and now their twigs and leaves move on top of that, more the further out from the trunk. Patches of the crown stir and settle in turn, so a tree never sways as one stiff piece (Vegetation > Wind sway > Leaf flutter, Flutter speed). Shockwaves still rock them, but a player brushing past no longer bends a whole tree.
- Fallen wood and rocks have their own amounts in Vegetation > Amount. Trunks, logs, stumps and rocks block movement and paths; bushes are walked through.
Changed
- No rocks in the streets: rocks only lie outside the city.
- The bush and tree colours in Vegetation > Colour now tint the models' own painted colours (mid grey is as painted).
- The vegetation golden value and the default scene's layout golden changed: every seed's plants (and its old rock primitives) are different now.
- The network protocol version is now 31, because the vegetation settings changed.
[0.003.031] - 2026-11-03
Added
- Echo. Loud sounds now come back off the walls round about: a quick slap off the nearest (tens of milliseconds) and a late echo off those further away (down a street, across a square), timed by how far they really are and rolling on in fading repeats. Gunshots crack down a street; an open field hardly echoes; inside, rooms keep their reverb instead. Audio > Mixer > Space > Echo shows where the walls are and the echo's timing right now, and tunes its amount, the slap, the repeats and how quickly they dull, and how much gunfire, explosions and other effects echo (voices, footsteps and the beds never do).
- Spaces you can tune. Each space (Room, Tiled room, Hallway, Stairwell, Hall, Warehouse, Street, Open) now has its size, damping, reverb and echo in Audio > Mixer > Space > Spaces, instead of fixed in code.
[0.003.030] - 2026-11-03
Added
- Footstep levelling (Audio > Mixer > Footsteps): Normalise brings every footstep recording to the same level (0 as recorded, 1 all levelled), and Clamp caps how loud any step can be close up, so a landing or a heavy recording never jumps out. Each sound's loudest point is measured once, when it's first played.
[0.003.029] - 2026-11-03
Fixed
- No more "conflicting ID" errors in the panels. A folding section named the same as a control inside it (Dust motes, Clutter, Lighting, Player light in Renderer; CRT in Post; Fog in Lighting & fog; one in the Mixer) clashed with it; sections now have IDs of their own. Two sliders named Amount in the Mixer (reverb, lo-fi) and two named Radius in Vegetation no longer clash either.
Added
--check-ui-ids(for development): opens every panel, every section and each Renderer tab in turn, and logs any control drawn with the same ID as another in a frame.
[0.003.028] - 2026-11-03
Changed
- Dust motes hang indoors. A new Where setting (Rendering > Renderer > Air > Dust motes): Indoors only (the default), Everywhere or Outdoors only. Indoors means under a roof, in any building, so you glimpse them through doors and windows too, and there they hang in still air instead of drifting with the wind. They never show in the floors cut away above you.
- In shade: how much motes show where no light catches them (0.4 by default, up from a fixed 0.05), so a room's dust shows even out of the sun.
[0.003.027] - 2026-11-03
Added
- Hanging vines vary. 12 new hanging vines (8 two-metre, 4 one-metre), on seven new vine textures (sparser, thicker, longer, yellowing, drying out) and hanging from 1.3 to 2.2 m. Buildings pick one per spot by seed, so no two runs of vines match.
- Dust mote controls (Rendering > Renderer > Air > Dust motes): density, opacity, size, softness, how high they hang, drift with the wind, wander and wander speed, bob, and twinkle and twinkle speed.
- Soft dust motes. Softness turns the square specks into round ones that fade out from the middle (0.8 by default; 0 is the old squares).
Removed
- Ash and debris are gone from the weather (Environment > Weather) and the renderer; dust motes stay.
[0.003.026] - 2026-11-03
Added
- 40 new wall sections (Buildings > Kit > Walls > Variants): 30 plain and 10 with a blasted hole. Each has its own concrete, plaster-over-brick and bare-brick textures (eight new sets, from nearly whole plaster to most of it fallen off), its own chips along the top, and a few shrapnel pocks. Every plain or holed wall in a building now picks one of them, differently for each copy of the building, so walls side by side don't repeat. A shared wall uses the same section on both sides, so a hole still lines up.
Changed
- Every building's plain and holed walls, and every shared wall, are now drawn from the variants (the city golden value is updated). Frames cost about 0.45 ms more (13.2 to 13.6 ms in the benchmark).
[0.003.025] - 2026-11-03
Changed
- Neighbouring buildings share their walls. Concrete, plaster and brick buildings side by side now stand flush, with one shared wall where they meet instead of two walls in the same place. Each building keeps its own paint on its side, so nothing flickers there and no light leaks through a gap. Above the lower building's roof, the taller one keeps its own outside wall and windows. Where both end at the same height, one parapet runs along the top.
- Holes in shared walls match. A shared wall has no windows. A hole goes right through both sides, and a broken top only appears where both buildings end at the same height, so one side never shows a hole the other doesn't. How often is World > Zone generation > City and town layout > Shared wall damage.
- Houses, sheds, L-shaped buildings, ruins and buildings with a fallen corner still stand a hair apart from their neighbours.
- Every city's layout has changed slightly (the city golden value is updated).
[0.003.024] - 2026-11-03
Fixed
- No more band of artifacts along the line of sight's edge while turning. The trail's correction came from a coarse map with hard metre steps, which showed as a stripe inside the soft edge (worse with Edge softness turned up). It's now softened over the same ring as the edge itself, so the edge stays one smooth fade as you turn.
[0.003.023] - 2026-11-03
Fixed
- Line of sight edge smooth again. The trail had made the edge of your view step in metre-square blocks; now the edge is exactly as smooth as before whenever you're standing still, and the trail only shows while what you see is changing.
Changed
- The trail fades in as well as out. Ground coming into view now fades in over the trail's time too, as ground leaving it fades out (Rendering > Line of sight > Trail).
[0.003.022] - 2026-11-03
Changed
- Line of sight leaves a trail. What you've just stopped seeing, as you turn away or walk on, now stays visible a moment and fades out, instead of the edge of your view sweeping across the ground like a cut-out. How long is Rendering > Line of sight > Trail (0.8 s; 0 turns it off). It's your own view only: other players and creatures out of sight still vanish at once.
[0.003.021] - 2026-11-03
Added
- Free camera on the asset stage, as in the Character tuner: hold the right button to look round, W A S D to fly, E and Q up and down, Shift to go faster.
Changed
- Stage camera controls at the bottom left. On both the asset stage and the Character tuner, a bar in the bottom-left corner switches between Orbit and Free, sets the field of view while flying, and has Frame (back to orbiting what's on show); it says which mouse buttons and keys do what. They're no longer in the panels.
Fixed
- Floor pieces no longer flicker against the stage's grid. The grid sits just below the model's base, so a floor tile lying at ground level doesn't fight it.
[0.003.020] - 2026-11-03
Fixed
- Character tuner: the In hand choice and the held-item list had the same name, which upset the editor (the red "conflicting ID" message) and could leave it holding the mouse, so the stage's camera wouldn't move. The list is now called Holding.
[0.003.019] - 2026-11-03
Added
- Attachments: lights, sounds and smoke on a model. In Tools > Assets, a model's Attachments group adds a light, a spot light, a sound or smoke to it. Every copy of that model, wherever it's placed in the world, comes with them: give a street lamp its glow once and every lamp has it. Each has a name, a position and rotation from the model's base, and its own settings. A sound picks a sound or a sound set (and a mixer bus), and shows that sound's effects rack right there; for a set, pick which of its sounds to tune. Edits show live on the stage. Save keeps them as your edit and puts them on every copy in the world at once; Bake makes them the build's.
[0.003.018] - 2026-11-03
Added
- View in stage. In Tools > Assets, a selected model or prefab has a View in stage button (or double-click it in the list); Back to the game leaves the stage. The old Show in 3D tick box is gone, and the stage no longer stays hidden behind Pick from the game. The Character tuner closes when an asset goes on the stage, as they share it.
- Asset edits are yours until baked. Grips, placements and off hands (Character tuner), line of sight, sound effects, and prefab and material edits are now saved as your edits in the settings folder (
Asset overrides), over the build's copy. An edited asset is blue with a*in the asset list, and its details say "Edited, not baked" with Bake (writes it into the repository, for Claude to commit) and Revert. The tuner has Bake beside each save. The menu bar's not-baked list and the build warnings include edited assets. - An Edited filter in Tools > Assets lists only what you've edited and not baked.
Changed
- The Assets toolbar is in two rows: finding things (search, type, review queue, edited), then Pick from the game, Rescan and New category.
[0.003.017] - 2026-11-03
Changed
- Menus by subject. World (zones, lighting and fog, water, plants, physics, the inspector), Gameplay (movement, survival, weapons, senses, AI), Enemies, Characters (the tuner, character import, animation), Rendering (renderer, post, camera, HUD, line of sight), Audio (mixer, audio import) and Tools (assets, localisation, recording). Each menu is in alphabetical order. Panels you had open stay open.
- Sections fold away. Every panel's sections are now headers you can fold (click), and each panel remembers which you left open.
- Character tuner shows only what applies. Pick In hand or Worn at the top. In hand shows the grip, plus the off hand for a gun or the torch's hold for the torch: only the aimed or the carried hold, whichever is showing, with its own Save and Bake bar. Worn shows the slot and its placement. The figure and the stage's look are their own groups (the look starts folded).
- Renderer on tabs. Image, Light, Air, Plants, Player and Stats; hover a tab for what's on it.
- World > Vegetation no longer repeats the plant draw settings (they're in Rendering > Renderer > Plants); its This client group starts folded.
[0.003.016] - 2026-11-03
Added
- Bake. Every settings panel now has the same bar: Save (your values: the game starts with them), Revert (to saved, to the build's, or to the values in code), Bake (makes the panel's values the build's defaults for everyone, written into
assets/settingsin the repository for Claude to commit), and the three configs on their own row. Baked values sit under your saved ones and over the code's. - What's changed, at a glance. A setting you've edited but not saved has an amber bar beside it, one saved but not baked a blue bar; its tooltip says what's saved and what the build has. Right-click it to revert it or bake just that one. The bar counts them ("2 not saved", "5 not baked").
- Not baked yet. The menu bar shows how many saved settings aren't baked ("8 not baked"); click for the list by panel, with Bake or Forget for each.
- Builds warn. Every build, and every update of your checkout, prints
NOT BAKED:lines for saved settings that aren't baked, and for baked files not committed yet.
[0.003.015] - 2026-11-03
Changed
- The torch is held the way it was tuned. The aim and carry positions set with the Character tuner's torch gizmo (Rendering > Animation) are now the game's defaults: aimed, the hand closer in and lower, the beam 7 degrees down; carried, the hand by the hip and a little out, the beam 13 degrees down so it lights further ahead.
[0.003.014] - 2026-11-03
Fixed
- Shots go straight out of the gun. Aiming squared the chest to the aim, but the aim poses hold the gun across the body, so the pistol pointed about 9 degrees off and bullets left the muzzle at an angle. Now the body turns so the gun's barrel lines up with the aim, and shots start from where the muzzle is drawn for a pistol or a shouldered rifle.
[0.003.013] - 2026-11-03
Added
- Shooting. Fire (RT; left click) shoots the gun in hand, raising it to aim as it does. Each gun has its own rate of fire, damage, effective range, spread and recoil (World > Weapons): the pistol and revolver a shot a press, the uzi and assault rifle keep firing while held (quick, less accurate), the shotgun fires a spread of nine pellets, the sniper rifle is very accurate, hits hard and fires slowly. Past its range a bullet's damage falls away. Headshots do double. The gun kicks back in the hands as it fires.
- Lock-on. With a gun raised, the aim locks on to the nearest zombie in sight within the gun's lock-on range, shown by a small red box; moving the aim moves the lock to whoever it now points at, and you turn to face them.
- Hits you can see. A tracer and a muzzle flash (with a flash of light) for every shot, and an impact by what it hits: concrete dust and chips, brick-red chips, wood splinters, metal sparks, dirt, glass, and a spray of blood off a zombie. Blood splashes onto the wall or ground behind and stays for a couple of minutes. Bullets smash window glass and carry on through it.
- Zombies can be killed. They have 100 health (Enemies > Basic zombie > Health), no health bars. Shot from afar, a zombie comes for you; hit hard (a blow, a big bullet) it reels for a moment first. Gunshots are heard a long way off.
- Melee weapons. Six new weapons from Tripo, all the same size and all held by the same grip on the handle: crowbar, pipe, baseball bat, spiked bat, machete and hammer. They ride on a new belt slot, Melee weapon (place it once in Tools > Character tuner). D-pad down (3) takes yours out; Fire swings, and pressing again during a swing carries on a three-swing combo (horizontal, downward, backhand). Every zombie in the swing's arc is hit. New players carry a bat.
- Dodge roll on B (V): a quick roll the way the stick points, out of harm's way (a zombie's swipe or lunge misses you while you roll). It costs a quarter of your stamina.
- Runtime > Player state > Equipment swaps the sidearm, primary and melee weapon you carry.
--autopilotnow ends its loop with the weapons: the pistol out and fired, a dodge roll, three swings of the melee weapon.
Changed
- Controls (gamepad): B dodges, the left stick click sneaks (crouch), RB runs, RT fires, d-pad down takes out the melee weapon. Keyboard: V dodges, left click fires, 3 the melee weapon. The on-screen tips say so.
- Running puts your weapon away (the torch stays out) and it comes back out when you stop; you can't aim while running.
- Aiming a gun slows you down to half speed (World > Player movement > Gun raised).
- One run for every stance: the new Run Forward clip replaces the old run and the pistol and rifle runs.
- Out of stamina, you can't sprint or roll until it's back to half (was 30%).
Fixed
- The rifle's draw and holster now play. They were cut from the wrong part of the clip (past its end): now the hand reaches over the shoulder for the rifle, lifts it off the back and brings it round, and putting it away is the reverse. The rifle stays on the back until the hand reaches it, and in the hand until it lets go.
- Sneaking with a gun keeps it up in both hands: the pistol (and the rifle, sneaking sideways) had no crouched walk of its own, so the arms swung empty-handed and the off hand reached through the body for the gun.
- The off hand stays off the gun while a draw, roll or swing plays.
- 2026-11-03
Fixed
- Window and shopfront glass is solid: you can't walk through a whole pane any more. Once it's smashed (shot, hit, or broken from the start) you can climb through as before. Zombies that run into a whole pane smash straight through it.
[0.003.011] - 2026-11-02
Fixed
- No more lit column round your character with line of sight on. To keep people in sight from greying at the edges, the sight pass showed everything within half a metre of them at full brightness, so a wall you stood against had a bright strip (and a patch above your head) cut into its shading. Only the character's own pixels are kept whole now; the wall beside them is shaded like the rest of it.
[0.003.002] - 2026-11-02
Fixed
- Guns sit in the hand the right way round. The hand now has a full frame (the torch's roll was never fixed, so a gun could face anywhere), and importing a sidearm or weapon works out its barrel (the long axis, muzzle at the thinner end) and its top, and writes a default grip into its sidecar: barrel along the fingers, top to the thumb, the fist on the grip. All six guns reimported with grips; placements untouched. Tune any of them in Tools > Character tuner.
[0.003.001] - 2026-11-02
Fixed
- Aiming with a weapon no longer bends the arm into the torch's aim pose: a pistol or rifle aims by its clips and the upper body's twist.
[0.003.000] - 2026-11-02
Added
- Items and equipment. An item is a kind (weapon, armour, consumable, resource, tool) and a type (pistol, revolver, machine pistol, rifle, shotgun, sniper, torch) with a model; stats come later. Every player has equipment: a torch, a sidearm and a primary weapon, and one of them in hand. The test loadout is the torch, the pistol and the assault rifle. Holstered weapons show on the body (the hip and the back); the one in hand is drawn in the right hand.
- Quick select on the d-pad: up the torch, left the sidearm, right the primary, down puts it away (keyboard F, 1, 2, 0). The emote wheel moves to Y / Triangle on a pad. Pressing a slot's button again puts that item away.
- Armed animation. The pistol and rifle clip sets (idle, walk, strafes, run, crouch) play while that weapon is in hand; a rifle is drawn with the grab clip and put back with it played backwards, on the upper body while the legs keep moving. Aiming a pistol uses the torch's aim pose; a rifle aims by the upper body's twist.
- Grips. A held item has its own grip, where it sits in the fist, kept in its sidecar. Tools > Character tuner: In hand picks the torch or any sidearm or weapon, Aiming holds the aim, and Gizmo: held item moves the grip; Save grip writes it. Protocol 27.
[0.002.068] - 2026-11-02
Changed
- Tools > Item placement is now Tools > Character tuner. The stage figure can hold the torch (Away, Carried, Aimed), and a Torch section tunes how it's held, carried or aimed, while you watch; the values are the animation settings, saved with Rendering > Animation.
[0.002.067] - 2026-11-02
Changed
- The carried torch hangs out by the side of the hip rather than across it, with the elbow drawn back and a straighter wrist. Carry out, Carry elbow back and Carry wrist bend join the Torch sliders in Rendering > Animation.
[0.002.066] - 2026-11-02
Added
- Item placement: Save model override keeps a placement for the shown character model only, on top of the item's default (Save placement, every character). The panel says which is in effect; Remove override drops it. Overrides live in the item's sidecar under the model's id, and the game draws each character with its own if it has one.
[0.002.065] - 2026-11-02
Changed
- Carrying the torch (out but not aimed, standing or walking), the right hand now holds it low in front and points it diagonally down, lighting the way a few metres ahead instead of shining into the legs. Aiming takes over as before. Rendering > Animation has Carry reach, drop and pitch sliders.
[0.002.064] - 2026-11-02
Changed
- The Uzi regenerated as a compact machine pistol (same item, placement kept).
[0.002.063] - 2026-11-02
Changed
- The sniper rifle regenerated as a bolt-action rifle with a scope (same item, placement kept).
[0.002.062] - 2026-11-02
Changed
- Smooth shading for items and characters. The crease pass (every edge over 55 degrees made a hard edge) crumpled dense Tripo meshes into paper; it's off by default now, so models shade smooth as they came. Every outfit item is reimported at 1,500 triangles with it, and every character (players, NPC survivors, zombies) at its 3,000. Placements are untouched.
- Item import takes
sharp_angle(0 = smooth, the default); character import's "flat" now defaults off (Tools > Character import).
[0.002.061] - 2026-11-02
Changed
- Characters are categorised in Tools > Assets: Players (the ten player models), NPC survivors (the walkers that spawn and roam) and Zombies.
[0.002.060] - 2026-11-02
Changed
- The Character lists in Runtime > Player state and Tools > Item placement show only the player models (
characters/survivors/player_*); walkers' and zombies' models are left out. New players start as Player Character - Male 1.
[0.002.059] - 2026-11-02
Fixed
- Item placement's free camera looked down when the mouse went up.
[0.002.058] - 2026-11-02
Added
- Item placement: rotation rings on the gizmo (drag a ring to turn the item about that axis, world or bone), and a free camera (W A S D, E and Q up and down, Shift faster, right button to look, the wheel straight ahead, a field of view slider).
[0.002.057] - 2026-11-02
Fixed
- The Uzi regenerated: the first came back untextured and rifle-shaped.
[0.002.056] - 2026-11-02
Added
- Three sidearms from Tripo for the Sidearm slot: a semi-automatic pistol, a revolver and an Uzi (
sidearm_pistol,sidearm_revolver,sidearm_uzi), unplaced.
[0.002.055] - 2026-11-02
Changed
- Item placement is now Tools > Item placement, on the asset stage. It shows a character of your choice (any imported character) on the viewer's grid, idling, playing any emote clip, or held in its T-pose (a button), wearing the items you pick per slot. The gizmo's arrows move an item along the world axes or the bone's own axes (a switch), with the numbers for rotation and scale; Save writes the item's sidecar as before. The look is the stage's own: lighting as in the game, studio, or unlit; resolution the game's or native; post effects on or off. Left-drag orbits, right-drag pans, the wheel zooms.
--place-itemsopens it at the start. - The World > Item placement panel is gone (it placed items on your player in the live world).
Added
- A character can be held in its bind pose (
ActorFlag::RestPose): what the T-pose button uses.
[0.002.054] - 2026-11-02
Added
- Ten player characters from Tripo, five male and five female (
characters/survivors/player_male_1...player_female_5), imported with the house settings. - Outfit slots are now Hat, Mask, Backpack, Rear weapon, Sidearm, Belt - left, Belt - right and Body (the mask shares the head; the sidearm, pouches and body ride the hips and chest).
- 23 outfit items generated with Tripo and imported, unplaced (each sits at its bone until placed in World > Item placement and saved): ten hats (khaki, trucker and camo caps, ushanka, combat helmet, cowboy, flat cap, beanie, boonie, hard hat), two gas masks, three backpacks (small, medium, large), a sniper rifle, a shotgun and an assault rifle for the rear weapon slot, four belt pouches (small and large in canvas, small and large in leather) and a bulletproof vest.
- Item import can
clipa model to a box (fractions of its bounds) to cut off a belt or strap the prompt asked not to have; the small canvas pouch is clipped that way.
Changed
- Runtime > Player state > Outfit lists, for each slot, only the items imported for that slot's kind. Protocol 26.
Removed
- Male - Base Survivor and everything fitted to it: its face part, the two hairstyles, the leather jacket, the old cap, pack and holster, and the headless survivor body. Characters are whole models; gear is items.
[0.002.053] - 2026-11-02
Fixed
- Item placement: an unsaved edit no longer snaps back (scale to 1, the item to its bone) when the game rescans the asset folder; the panel keeps the edit until Save, and a Discard button drops it.
[0.002.052] - 2026-11-02
Added
- Outfit items, placed by hand. Characters are whole Tripo models again (the one-piece import, downsampled to the house look), and gear comes as plain items of a slot kind: hat, body armour, backpack, weapon on the back, belt pouch left and right, pistol on the hip, thigh holster. Each kind rides one bone of the shared rig; each item carries its own offset, turn and scale in its sidecar, so every item is placed once, on any character, and swapping what's shown is just another item in the slot (the visualiser the inventory will drive).
- World > Item placement: pick a slot kind and an item (it goes on your player), then drag the gizmo's arrows in the view (world X red, Y green, Z blue; F7 holds the pose) or type the numbers, and Save writes them into the item's sidecar. Runtime > Player state > Outfit lists every kind.
- Item import (
"mode": "item"in an outfit.import.json, withslot): seams merged, turned, reduced, its own texture kept, its middle at the origin and its longest side a size shared by the kind, so one placement fits every item of that kind. The baseball cap, hiking backpack and leg holster are rebuilt as items (unplaced: all at their bone).
Changed
--outfittakes the slot kinds by name (back=,weapon=,belt_left=,hip=,leg=...). Protocol 25.
[0.002.051] - 2026-11-02
Added
- Gear as plain objects, no straps: the baseball cap, short and messy hair, hiking backpack and leg holster are rebuilt as rigid parts (
"mode": "gear"in their import settings) that sit on any body or face. Body gear is cut from the Tripo person wearing it with everything that touched them stripped off and the holes closed (the pack's straps go, its back panel is sealed), sized in metres (size) and placed by cross-sections at its joint: a pack against the crest of the back, a holster's loop round the thigh. Head gear is sized to the face's hat band, seated against the back of the head and shrunk round the skull, so no hair or cap ever sinks into it. - Every gear import measures its fit and fails the build if more than a few per cent of its outer vertices sit inside the wearer or its nearest point floats more than 3 cm off.
- A part cut from a whole model keeps its own patch of the texture atlas at full size instead of the whole atlas scaled down.
Changed
- A body's Neck joint keeps the rig's own position across the torso (only its height comes from the collar line): a neck that slopes forward no longer carries the face's head forward with it. The survivor body's head now sits over its shoulders.
[0.002.050] - 2026-11-02
Added
- Heads and bodies swap separately. A character can be imported as a body (its head cut off at the collar line, the opening funnelled shut) or as a face (the base survivor's head with its neck, plugged, riding the head joint). A face worn in the new Face slot (Runtime > Player state > Outfit, or
--outfit face=characters/outfit/base_head.glbwith--wear characters/survivors/male_survivor_body.glb) sits on any body: one face, any clothes, no cloth fitting. Tools > Character import has a Head choice (keep, cut off, only the head). - Male - Survivor as a body (
characters/survivors/male_survivor_body) and the base survivor's head as a face (characters/outfit/base_head). - Importing a body mounts the base face on it and reports the join by number (the neck plug must reach past the funnel; the neck must fit the opening), so a bad fit fails the build instead of waiting to be noticed.
Changed
- Rigid outfit parts (a face, a cap, hair, a pack, a holster: all on one joint) now mount by that joint on the body they're worn on, so they sit right on any character with the same skeleton, not only the one they were fitted to. Cloth still fits the base body only.
- A cut body's or face's Neck and Head joints are placed from the neck opening itself (Tripo's rigs put them anywhere within 10 cm of each other), so the mount is exact.
Fixed
- Outfit parts cut from Tripo models came in with every texture-seam vertex split, so reducing them tore the mesh into shards and holes (the jacket's back, the "clouds of shards" standalone props came out as). Seam vertices are merged on import; the leather jacket, hiking backpack and baseball cap are rebuilt whole.
[0.002.049] - 2026-11-02
Changed
- Capture mode's camera is now a true free-fly camera. The mouse turns it: always while the overlay is hidden (F1), or hold the right button while it's up. WASD flies it the way it looks, and Space and C go straight up and down. Sprint is four times as fast and Aim (Ctrl) a quarter, the wheel zooms, and the right and left sticks work too. It sees right up close and right across the world.
- The Capture mode window gains Mouse look and Field of view sliders. Screenshots taken in capture mode give a
--fly-cameraline, which starts the camera at the same spot.
[0.002.048] - 2026-11-02
Added
- Screen capture mode (Debug > Capture mode, or F8), for showing things in screenshots (F10) and clips (F9):
- The world is drawn plain: no fog of any kind, no weather, no post effects (CRT, colour reduction, dither, bloom, grain, vignette), at the window's full resolution, with line of sight off. Your look settings are untouched and come back when you leave.
- The camera flies free of your player, who stands still: WASD or the left stick (Sprint for faster), Space and C (A and B) to rise and drop, turning and zooming as usual, and closer than in play.
- Pause the world with F7 (or the tick box): everything holds still while the camera keeps flying.
- Its window has line of sight, the HUD and the camera's speed. F1 hides the overlay for a clean shot.
--capture-modestarts the game in it.
[0.002.047] - 2026-11-02
Fixed
- Outfits look right now. After the first try (holes, shards, things through each other):
- The base survivor is bald, and hair is an outfit part like a hat: two styles, Short Hair and Messy Hair. A cap leaves the hair off, so nothing grows through it.
- The cap, backpack and holster are cut from a survivor actually wearing them (Tripo's standalone props came out as clouds of shards that fell apart). Each is lined up by what it was worn on: the holster's strap is centred on the thigh and sized to it, the cap is sized to the head and sits on it, the pack is centred on the back and rests against it.
- The jacket stands 3.5 cm clear of the body, so nothing reaches through it as the arms move.
- No more holes in the legs: gear that doesn't bend (holster, pack, cap, hair) only hides skin that moves exactly with it.
- The scraps of the source survivor's jeans that came with the holster are gone.
- Parts are reduced gently, or not at all, so their textures stay whole.
[0.002.046] - 2026-11-02
Added
- Outfits: gear you can see on your character. A new base survivor (Male - Base Survivor: T-shirt and jeans) and the first outfit parts made for him: a leather jacket, messier hair, a hiking backpack, a baseball cap and a leg holster with a pistol. Each is drawn on the body as it moves (the jacket bends with the arms, the backpack rides the spine, the holster the thigh), and the body underneath is hidden so nothing pokes through. A cap hides the hair. Try them in Runtime > Player state: set Character to Male - Base Survivor, then open Outfit and pick a part for each slot (head, hair, body, back, belt, leg). Everyone sees what you wear. Parts fit only the base survivor.
--outfit slot=path,...(testing) dresses this machine's player at start, e.g.--outfit body=characters/outfit/leather_jacket.glb.- How outfit parts are made from Tripo generations and fitted to the base (
tools/blender/charimport.py,outfit_part): docs/CHARACTERS.md section 10c.
Changed
- Network protocol version 23 (the Outfit component).
[0.002.045] - 2026-11-02
Added
- Badly hurt players limp. Below 35% health you're injured: the injured idle, walk, walk back and run play (from your Mixamo clips), and you move at 60% of every speed. Healed above it, you're back to normal; the change cross-fades. World > Player movement > Injured sets the threshold and the speed. The player's state shows it as Injured (Runtime > Player state).
Changed
- Network protocol version 22 (the Injured flag and its settings).
[0.002.044] - 2026-11-02
Added
- HUD brightness (Rendering > HUD, with Through the CRT on): the scanlines and phosphor mask darkened the HUD a lot, so it's now drawn 1.6 times brighter there by default, and the slider sets it from 0.5 to 3.
[0.002.043] - 2026-11-02
Added
- The HUD can go through the CRT (Rendering > HUD > Through the CRT, off by default). On, it gets whatever Rendering > Post has on, like the picture: the curve, the colour split, scanlines, the phosphor mask, grain and vignette. Off, it's drawn crisp on top as before. The emote wheel and the version caption go with it; the edit overlay always stays crisp.
[0.002.042] - 2026-11-02
Added
- A quickbar: six slots in the UI pack's item frames, on a plate beside the vitals along the bottom of the screen. They're empty for now: the inventory, and the controls to use them, come next.
[0.002.041] - 2026-11-02
Changed
- The vitals bars look like the UI pack's gauges (the item details' condition and filter bars): a thin khaki outline round a dark inside, a muted fill lit along its top edge, and the percentage beside each. They're now one per row: health, stamina, food, water. The HUD's colours are more muted throughout (olive, mustard, rust, slate).
- No N on the maps: north didn't tell you much.
[0.002.040] - 2026-11-02
Added
- A large map. Press [M] (View on an Xbox pad, Create on PlayStation, - on Switch) to open a bigger, square map under the clock, showing about 240 m across instead of the minimap's 60. It's the same map: only places you've seen, turned with the camera, with you, the other players and north on it. Press again to close it. Rendering > HUD sets how much it shows, and can start it open. A new control tip mentions it.
[0.002.039] - 2026-11-02
Added
- A HUD in the style of the new UI pack. Bottom left, a riveted plate with your four vitals as segmented bars (health, stamina, food, water) and a status strip above it (Normal, or Exhausted, Hungry, Thirsty, Starving, Dehydrated). Top right, a minimap in a porthole frame, with the time and weather (rain or fog, and the wind) on a plate underneath. It's all drawn as pixel art on a 540-line grid. Rendering > HUD turns parts of it off and sets how much the minimap shows.
- The minimap turns with the camera (up is always up on screen) and shows only places you've seen: streets, roofs and walls, with you as an arrow, other players as amber dots, and N marking north. It needs line of sight on.
- Hunger, thirst and stamina. Food lasts about an hour and water about 40 minutes. Running dry of either costs a little health every few seconds. Sprinting uses stamina, which comes back after a moment's rest. Run out, and you can't sprint until you've got some breath back. There's nothing to eat or drink yet; getting up after dying fills everything. Tune it in World > Survival.
Changed
- Remembering explored places (Rendering > Line of sight) is on by default again.
- The old red health bar is gone: health is on the new vitals plate. The control tips sit above the status strip.
- UI art has its own texture rules: any size up to 256, no need for powers of two (it's drawn at its own size, never tiled). The texture cooker re-checks every texture once.
- Network protocol version 21 (new synced vitals).
[0.002.038] - 2026-11-02
Fixed
- The emote you're pointing at reads clearly again. Its dark letters on the light box had a drop shadow that smeared them. Dark text no longer gets a shadow; light text, including the red "You died", keeps its shadow.
[0.002.037] - 2026-11-02
Changed
- Your tuned settings are now the built-in defaults. A fresh install, or "Built-in" in a panel, now gives the game as you've been playing it:
- Renderer: 540p, stable camera off, grass out to 100 m with more grass shadows and darker roots, no clarity fade on AO or grass, softer glass reflections, and a brighter, higher player light that reaches further.
- Camera: closer and lower (10–36 m, 16–37° pitch), with smoother following.
- Sight: 60 m range in a 167° cone, a sharper edge, unexplored areas a little brighter, nothing remembered once out of sight, and the outside world dimmed slightly from indoors.
- Environment: starts at midnight, a 90-minute day, stronger and gustier wind, and medium ground fog with fog patches.
- Post: a higher brightness ceiling and knee.
- Audio: no lo-fi, quieter footsteps, louder weather and ambience, softer rain.
- Vegetation: thicker, shorter grass, less patchy, scattered further out.
- The vegetation golden and the pixel-snap test now set their own values, so tuning the shipped defaults no longer moves them; no generated world changed.
[0.002.036] - 2026-11-02
Changed
- New pixel font for everything players read: Silkscreen. The control tips, "You died", the emote wheel and the version caption are now in Silkscreen, a blocky capitals-only pixel font drawn on whole pixels. It covers every accent English, German, French and Spanish need, plus Œ, œ and €. The edit overlay and screenshot captions keep the old font, which reads better small. Silkscreen is free under the SIL Open Font License (
assets/ui/fonts/silkscreen_OFL.txt).
[0.002.035] - 2026-11-02
Fixed
- Every resolution preset now does what it says. The game was drawn at a whole-number fraction of the window's height (at 1800 px: 900, 600, 450, 360...), so a preset was rounded to the nearest of those; some changed nothing at all. It's now drawn at exactly the preset's height and stretched to fill the window. Where the window's height doesn't divide evenly (1080 by 540 or 360 does; 1800 by 720 doesn't), some pixel rows and columns are a screen pixel wider than others.
Changed
- Resolution presets: 560p is now 540p, and 720p is added (Rendering > Renderer > Internal: 224p, 270p, 360p, 480p, 540p, 720p, Native). A saved Native from before is now 720p: pick Native again.
[0.002.034] - 2026-11-01
Fixed
- No more flicker where two buildings stand side by side. Neighbours were placed exactly against each other, so their touching walls, corner posts, ledges and parapet tops lay in the same planes and fought. Buildings along a street now stand 3 cm apart, and every other one sits 3 cm further back and 2 cm higher: no shared planes, too small to see.
Changed
- The city layout's golden value is updated on purpose (buildings moved by those few centimetres); the streets themselves are unchanged.
[0.002.033] - 2026-11-01
Added
- A fog wall at the zone's edge, Silent Hill style. Every pixel now fogs by how much of its view past the edge it looks through, to the ground or for ever (the sky), so nothing beyond the edge shows at all: land, hills and sky all disappear into a solid wall of slowly billowing grey fog. Its colour follows the sky's, greyed, so it darkens with the day. Controls in World > Lighting & fog > Fog wall: Thickness, Solid after (metres past the edge), Grey, Brightness, Billowing. It's drawn in the colour-grade pass, a few instructions a pixel.
Fixed
- No more dark, flickering shapes on the land past the edge. The line of sight shaded the far sides of the hills beyond the edge as out of sight, in shapes redrawn every frame. Past the edge nothing is ever shaded as unseen now (no one can be there).
[0.002.032] - 2026-11-01
Added
- Stair rooms on the roofs. Flat-roofed buildings whose stairs go up to the roof no longer have an open hole there: the stairs come up inside a small room of their own (a stair bulkhead, like real buildings), built in the building's own walls, with corner posts, a concrete roof and a hinged door out onto the roof at the top of the flight (to the side if the stairs reach the back wall). Rain stays out of the stairwell. 25 buildings have one; everything else about them is unchanged (a few roof vents and a water tank moved so they don't stand inside the room).
[0.002.031] - 2026-11-01
Fixed
- Roof railings and parapets no longer block your view. Railings, stair rails, the waist-high roof parapets and the fire escape's open steelwork are now seen through or over by the line of sight (and the AI's eyes). Walls, floors, roofs and doors still hide what's behind them. A model can still be set either way by hand in Tools > Assets.
[0.002.030] - 2026-11-01
Added
- Fog past the edge, Silent Hill style. Beyond where you can walk, the land thickens into fog (to 97% by 45 m past the edge), so the far hills fade away instead of showing plainly. World > Lighting & fog, Fog section: Edge fog, Edge fog reach. It costs nothing extra: it's part of the fog every surface already works out.
Fixed
- No more flickering shadows on the far hills. The sun's whole-view shadow map was resized every frame to fit the ground in view; looking out almost level (at the zone's edge, towards the hills), that size swung with every bob of the camera and every long tree shadow on the hills was drawn differently each frame. It now changes size in steps and holds them: it grows when it needs to, and shrinks only once it's well oversized.
[0.002.029] - 2026-11-01
Fixed
- Zombies no longer skid into a swipe. On the move, the swipe plays on the upper body only and the legs run underneath at the speed it's actually going, so the feet step as it closes in; standing still, the whole clip plays as before.
Changed
- A swiping zombie keeps coming. Through the wind-up it keeps advancing (60% of its run, slowing as it gets close) and steps in to 0.5 m instead of 0.8, instead of stopping dead. Enemies > Basic zombie: Keeps coming, Strikes from.
Added
- Upper-body actions (
ActionInfo::upper): an action can play on the spine, arms and head while the legs and hips play the run, blended in by speed. Attacks on the move (and later, shooting on the move) build on it.
[0.002.028] - 2026-11-01
Added
- The zombie's lunge attack. From 2.8-4 m away a zombie sometimes (35% of approaches) throws itself at you instead of closing in to swipe. The clip's own root motion carries it about 3 m, played 1.3x; the blow lands as its hands come down (30 damage), then it's on the ground and gets up again (the new Stand Up clip, 1.5x), your chance to get away.
- Actions can follow their clip's root motion. The server moves the character along the hips' path measured from the clip, and every client keeps the hips over it, so the body goes exactly where the clip throws it (no sliding).
- Enemies menu. Enemy types get their own menu in the edit overlay: Enemies > Basic zombie has every zombie setting: numbers, pace, alert, chasing, the swipe, the lunge and cries.
- Zombies show their frustration. One that lost you and gives up the search writhes and screams (the agonizing clip with a scream sound) before going idle. It still writhes silently now and then as an idle twitch.
Changed
- Steered characters (a lunge, a chase in the open) move exactly as steered instead of easing in.
[0.002.027] - 2026-11-01
Changed
- Walkers are spread across the zone, each at a spot from the zone's seed, instead of a group at the start, and there are half as many as zombies (World > AI walkers: Per zombie, Scattered). A killed walker's replacement turns up somewhere else in the zone.
- The zombie's swipe is 75% faster. The attack clip plays at 1.75x, with the lunge and the blow retimed to match (the hit lands 0.6 s in). Backing off isn't enough any more.
[0.002.026] - 2026-11-01
Changed
- Twice as many zombies (city block 16-28, small town 12-20, wilds 6-12 for a medium zone), and none ever start within 30 m of a player, wherever you've got to.
- Zombies are 15% slower (running 3.65 m/s, shambling 0.47): a sprint gets you away.
- The swipe lands when the hand does. The blow is now timed to the right hand's furthest reach in the attack clip (1.05 s in), not the start of the wind-up, and the attack plays through its follow-through.
- No lunge when it's already close enough. A zombie turns to you through the wind-up, then lunges into the swipe only as far as it takes to reach striking distance (0.8 m); already there, it just swipes. World > Zombies: Attacks from, Strikes from, Lunge starts.
- Walkers greet you instead of following you. One that notices you waves, then either comes over for a look or carries on, and pays you no more mind for a while (World > AI behaviour: Comes over, Then ignores you for).
Added
- Walkers fear zombies. A zombie they can see they stop and point out, then run from (straight away if it's close); a scream sends them running; and they remember where the danger was for 30 s, keeping 15 m clear of it.
Fixed
- No more pale circles under people fading out of sight. People in view are shown whole by the line of sight; that was still applied while they faded away, lighting a disc of ground at their feet.
[0.002.025] - 2026-11-01
Added
- Zombies, the first enemy. Six of them from Tripo: the vest man, the old businessman, a ragged man, a ragged woman, a bloated man and an old woman, in tattered, blood-stained rags, each animated with its own zombie clips (shamble, sprint, scream, lunge, bite, death).
- How they behave. They stand about a good while, twitching and groaning, then wander a little. A noise from a player or a walker raises their alert and they shamble over to look, then search round until their alert fades, and idle wherever they end up. If one sees you (or a walker) it screams and runs at you; in reach it lunges, then runs to close in again after a short cooldown, sometimes screaming after a miss. Lose it and it screams again, walks to where it last saw you and searches. Its scream brings other zombies to look and makes walkers flinch. Outrun one by sprinting.
- How many, and where: from the zone's seed, between limits for each kind of zone (city block 8-14, small town 6-10, wilds 3-6 for a medium zone; scaled by size), none within 30 m of the start. All of it tunes live in World > Zombies.
- Health for players, walkers and zombies. A health bar bottom left, a red flash at the screen's edges when you're hit, and "You died": you lie there a few seconds and get up again at the start. A killed walker lies where it fell for a while, and a new one comes in.
- Zombie sounds from your recordings (
enemies/zombies: idle groans every 8-10 seconds while calm, screams, attacks, hits and misses), heard from where the zombie is. A newenemies/folder in the audio drop folders (Tools > Audio import). Zombies use the same footsteps as everyone.
Changed
- The walkers' movement is shared with the zombies (one piece of code for both), and the AI's senses can now see and hear walkers, for the zombies.
- Network protocol 19 (actions, health, cries).
[0.002.024] - 2026-11-01
Added
- Wasteland Doctor: a stained, patched coat, a stethoscope and a leather medical satchel. Made in Tripo and imported with no hand fixes, the first test that the import's rig fixes work on any new character.
- The character import checks every skeleton it fixes (hips either side of the middle and level, shoulders mirrored, head over the hips) and reports anything off under the build line.
Fixed
- Shoulders no longer hunch forward when walking. Some models have their collarbones a few centimetres in front of the neck, and every clip kept that. The import now starts them level with the neck, so the shoulders sit where Mixamo's do. All characters are re-imported.
[0.002.023] - 2026-11-01
Added
- Hazmat Survivor, the first character made through Tripo from the command line: a worn, dirty orange hazmat suit with a respirator hood. H3.1 model, rigged by Tripo with the Mixamo rig. Wear it from Runtime > Player state > Character.
Fixed
- Characters that arrive facing the wrong way are turned round on import. Tripo delivered this one turned 90 degrees, and every animation then played sideways on it: hips front and back, the head flung to the side, legs everywhere. The import now turns any character so its left is Mixamo's left before fixing its bones.
Changed
- Tripo uses the H3.1 model by default (about 30 credits against P2's 120); it looked better on the same prompt. The Tripo skill records what Tripo's rigs get wrong and how the import fixes each one.
[0.002.022] - 2026-11-01
Added
- New characters and vehicles from Tripo, on request. Claude can now use Tripo from the command line. Describe a character (or a vehicle wreck) and it writes the prompt from your house style line plus your description, shows you candidates and their cost first, rigs the one you pick with Mixamo bone names, saves it in
Codename Max Source, imports it into the game and sends a close-up. Nothing is spent without your OK. The steps live in.claude/skills/tripo/SKILL.md, along with everything learned about importing Tripo characters (straight legs, kept textures, crease shading).
Changed
- New characters keep their own texture at 256 by default (Tools > Character import > Keep its own texture), as all nine do now.
[0.002.021] - 2026-11-01
Changed
- Characters keep the textures they were made with (scaled to 256 and capped at 240 colours), not a baked pixel-art one: clean faces, shirts and torn jeans, with no dark specks. 3,000 triangles each, chosen from the options sheet. All nine are re-imported.
- Tests run in about 20 seconds instead of about 2 minutes. The three whole-city sweeps (cover against every wall, every floor reachable, flickering faces) run only with
max_tests --all. Each test now prints how long it took. - Your rack tweaks to the indoors and light rain beds are kept.
[0.002.020] - 2026-11-01
Added
- 560p in Rendering > Renderer > Internal resolution, between 480p and Native.
- Tools > Character import > "Keep its own texture": a character can keep the texture it came with (and its UVs), just scaled down (Texture size 128-1024), instead of having a pixel-art texture baked for it. No dark outline pixels or specks. The game's characters still use the baked texture until one is chosen.
[0.002.019] - 2026-11-01
Fixed
- Changing a sound's effects now changes it while it plays. A looping bed or an emitter's hum used to keep the copy it started with, so rack tweaks (Tools > Assets) on rain, wind or a lamp did nothing until it restarted. Every voice playing that sound now switches to the new version at once and keeps its place in the loop. Long, streamed sounds restart from the top. The same happens when a sidecar is changed outside the game.
[0.002.018] - 2026-11-01
Fixed
- Sharp sun shadows again. With a low camera, the view reaches far up the street, and the sun's one shadow map was stretched over all of it, so shadows near you went blocky. There are now two maps: a sharp one for 25 m around you, and the wide one for everything else. Rendering > Renderer > "Sharp shadows within" sets the near distance (0 = one map only), and the shadow map size goes up to 4096.
- Every ambience bed now loops without a jump: wind, city, and light, medium and heavy rain, like night and indoors before them.
[0.002.017] - 2026-11-01
Added
- Hearing from the camera. Zooming out makes the world's sounds quieter, as if you were hearing them from up where the camera is. Left and right, walls, and how far a sound carries still count from the player. Audio > Mixer > 3D sound > "Listener at camera" sets how much (0 = from the player, as before; 1 = from the camera).
- Far away outdoors. Outdoors, zooming out makes the world sound distant: duller, with a long open echo, like hearing a street from across town. It grows with the zoom and is off indoors. Audio > Mixer > 3D sound > "Far away outdoors" sets how strong (0 = off), with a readout of how far away it sounds right now.
[0.002.016] - 2026-11-01
Fixed
- Walks and runs are no longer wide-legged. The supplied models stand with their feet apart, and the import kept that spread in every clip: feet were about 1.4 times the hip width apart, where Mixamo's walk has 0.85. The import now stands each model's arms and legs in Mixamo's own rest pose before binding, so every clip (walk, run, crouch, idle) keeps its feet where Mixamo put them. All nine characters are re-imported.
- Characters no longer look like crumpled paper. Reduced scans were shaded with every face flat, so each small, uneven triangle showed. They're now smooth-shaded, with hard edges only where the surface really turns (over 55°): clean low-poly planes with crisp creases, like PS1 characters.
Added
- Tools > Character import: "Crease angle" (which edges stay hard; 0 = every face flat, the old look) and "Relax" (smooths out a scan's bumps before reducing it; more than a pass or two softens faces).
[0.002.015] - 2026-11-01
Added
- Player light: a small glow round your own character so you can find your way in the dark, indoors especially. It casts no shadows and fades out in daylight. Tune it in Rendering > Renderer > Player light: brightness, reach, height, colour, and how much daylight dims it. Only you see it; other players and the AI don't.
- tools/audio/make_loop.py: makes a sound loop seamlessly by cross-fading its end into its start. It keeps the untouched original in
Codename Max Source/audio originals/, and--restoreputs it back.
Fixed
- The night and indoors ambience loops no longer jump at the join. Each has a 3-second cross-fade.
[0.002.014] - 2026-11-01
Added
- Real sounds everywhere but two. Ambience: wind, the distant city, night, indoors and rain. Effects: fire, lamp hum and buzz, neon, doors opening and closing, and windows breaking. They all replace the generated placeholders.
- Rain sounds as hard as it rains. Light, medium and heavy rain each have their own recording (
ambience/rain/light,/medium,/heavy), crossfading when the weather changes. A rain folder without those subfolders plays the same sound at every strength, as before.
Removed
- Placeholder sounds, except the sign knock and the UI click, which have no recordings yet.
[0.002.013] - 2026-11-01
Added
- Real footstep sounds on every surface: concrete, tile, wood, metal, carpet, gravel, grass, dirt, water and glass. Each surface has walking steps, running steps, crouched (sneaking) steps and landings. Tile uses stone recordings.
- Running and sneaking sound different, not just louder or softer. A surface with
runorcrouchsounds plays them; one without falls back to its ordinary steps made louder or softer, as before. The jump take-off sounds are imported but not played yet.
Removed
- The generated placeholder footsteps.
[0.002.012] - 2026-11-01
Changed
- City ambience: the placeholder city bed is slightly quieter and lower in pitch (a tweak made in the audio effects rack).
[0.002.011] - 2026-11-01
Changed
- Hanging lamps look like real pendant lamps: a black enamel cone shade with a dark bronze bulb holder on top, warm metal inside, and the bulb just showing under the rim, on a thinner flex. Broken ones have lost their bulb and have a dented shade.
- Finer rain. The streaks are much thinner (they were 5 cm thick, which looked huge with a close camera). Any streak thinner than a pixel is drawn a pixel wide but fainter, so rain stays fine at every resolution. Splash droplets are smaller too.
- Smaller dust, ash and blowing debris by default (0.6 of their old size).
Added
- Rendering > Renderer > Ambient particles: size sliders for dust, ash and debris.
- Rendering > Renderer > Rain: streak thickness, streak length, rain opacity and splash size.
- These are this client's look only and are saved with your Renderer settings.
[0.002.010] - 2026-11-01
Added
- Physics (Jolt). The engine now has a physics library: bodies, joints and collisions. Its first use is lamps that swing.
- Hanging lamps. Ordinary buildings with power now have bare bulbs under tin shades on flexes, instead of strip lights (special buildings keep their fluorescents). Each flex is three jointed pieces, so it bends as it swings, and the light and its shadows swing with the lamp.
- Bump into them. People are solid to them: walk into a low one (the longest hang about head height), or jump into one, and it swings, then settles and goes still. Walkers knock them too.
- Wind. A hanging thing out of doors is blown by the same wind as everything else. Under a roof there's none.
- World > Physics: knock the nearest lamp, or every lamp near you, to see the joints work; how far from the camera lamps are simulated, how many at once, how often, and how solid people are to them. How each lamp hangs (flex length, links, weight, how far it swings and bends) is on the lamp itself (Hanging) and can be edited live.
- Debug > Physics: the bodies, joints and anchors, green while swinging and grey at rest, and people as cyan capsules.
Changed
- The hanging lamp models no longer include their flex: the game draws the flex and swings it.
- New third-party library: Jolt Physics 5.6.0, in cross-platform deterministic mode.
[0.002.009] - 2026-11-01
Added
- The walkers act on what they notice (the AI behaviour phase).
- A noise: a walker stops, turns to look at where it came from, and after a moment walks over to check. It searches a few spots round it, looking about at each, then gives up and goes back to what it was doing.
- A glimpse of you makes it wary in the same way.
- Once it has clearly noticed you, it points you out and follows you at a distance, watching. If it loses sight of you for a few seconds, it goes to where it last saw you and searches.
- A crash or bang close by makes it flinch, and sometimes run away before coming back.
- While it's paying attention to something, its head turns to look at it.
- World > AI behaviour: every threshold and timing: when it's suspicious, when it's onto you, how loud a noise makes it look or flinch, how often it runs, how long it looks, searches and follows, and when it gives up.
- Debug > AI senses now also shows what each walker is doing (alerted, investigating, searching, following...).
Needs
- A few more animation clips would make this read better: a flinch when startled, looking round when searching, and a wary standing idle. Drop them in with the other Mixamo clips when you can.
[0.002.008] - 2026-11-01
Added
- The AI can see and hear you (the senses phase). The walkers notice things now, though they don't act on it yet (that's next). It's all worked out on the server, so every player agrees on who noticed what.
- Sight: each walker sees ahead of itself (not behind), out to about 22 m. Walls and tall furniture hide you. How well it sees you depends on the light you're in (daylight, dimmer indoors, lamps and lights nearby, the dark at night), whether you're crouched, whether you're moving, and how close you are. A torch out gives you away. A clear view makes it fully alert in about a second; out of sight, that fades.
- Hearing: your steps carry by how you move (sneaking hardly at all, running a long way) and what you're on (carpet and grass soft, metal, gravel and glass loud). Landing from a jump, doors creaking and banging, and breaking glass all carry too. Through a wall a noise is muffled, but it carries round corners and through doorways by the way round. A walker remembers where it last heard something, and how sure it is fades.
- Runtime > Stealth: how visible you are right now, the light you're standing in, how far your last step carried, and how many walkers see and heard you.
- World > Senses: every range, weight and timing for sight and hearing, live.
- Debug > AI senses: each walker's field of view, a line to whoever it sees, how alert it is, where it last heard something, and (when you're running the server) a ring for every noise as far as it carries.
Changed
- What's underfoot is worked out in one place for the footstep sounds and for the AI's hearing, and lamps go on and off by one rule for the picture, their hum and the AI's eyes.
[0.002.007] - 2026-11-01
Added
- Debug > Sounds: every sound emitter round you, with an inner ring where it's at full volume and an outer one where it goes silent (orange loops, blue one-shots), its sound set and range, and a line from you to it: green in plain sight, red when a wall muffles it. Footsteps flash as white dots where feet land.
- Debug > Reverb zones: each room's reverb box, coloured by kind (tiled cyan, hallways and stairwells yellow, halls and warehouses orange, rooms grey); the one you're in is brighter and labelled.
- That completes the audio phase: the mixer, emitters, the soundscape, rooms and walls, and footsteps. Everything plays placeholder sounds until yours are imported.
[0.002.006] - 2026-11-01
Added
- Footsteps. Everyone's feet make a sound as they touch down: you, other players and the walkers. The step matches what's underfoot: concrete and tarmac, tiles, wooden floors, metal stairs and fire escapes, carpet and rugs, glass, gravel and rubble, grass, dirt, and splashes in pools. Sneaking is soft and only heard close by, walking carries across a room, running is loud and carries down the street, and landing from a jump thumps. Steps behind a wall are muffled. They come from the animation itself, so they stay in time at every speed and on stairs.
- A model can say what it sounds like underfoot with
"surface": "wood"(or metal, tile, carpet...) in its .meta; otherwise it's worked out from its name. - Audio > Mixer and screenshot captions show how many steps have played and the surface under the last one.
[0.002.005] - 2026-11-01
Added
- Rooms sound like rooms. Every room in every building has a reverb zone now, by the kind of room it is: bathrooms, toilets and wards ring off their tiles, hallways and stairwells echo, shops, bars and lobbies are big and open, garages and warehouses boom, and furnished rooms are close and dull. Outside, a street between buildings has a short slap and open ground is nearly dry. Walking through a doorway eases from one to the next.
- Walls block sound. A sound you can't see, behind a wall or on another floor, is muffled and quieter, and opens up as you come round the corner.
- Audio > Mixer > Space: the space you're in and its reverb, a reverb amount, and how muffled and quiet sounds behind walls are. Captions show the space too.
[0.002.004] - 2026-11-01
Added
- The world has a soundscape. Five beds play under everything and follow what's happening: the wind rises and falls with the wind where you stand, gusts and all; rain plays with the weather; the distant city is louder by day; insects and wildlife come out at night (fewer in the rain); and inside a building you hear the room. Walk indoors and the outside goes quieter and muffled, as if through the walls; walk out and it opens up again. Towards the edge of the zone the city and wildlife fade, so the edge of the world feels empty.
- Audio > Mixer > Environment: how loud each bed is at its fullest, how muffled the outside is from indoors, and where the edge fade starts, with each bed's current level and how indoors you are right now. Screenshot captions show them too.
- Every sound can now be muffled while it plays (a low-pass per voice), which wall muffling will use next.
[0.002.003] - 2026-11-01
Added
- An effects rack for every sound. Select a sound in Tools > Assets and it has a rack of hardware units with knobs: LEVEL (volume, pitch), FILTER (low cut, high cut), DRIVE, CRUSHER (bits, sample rate), ECHO (delay, repeats, level) and TAPE (trims, fades, reverse, loop). Drag a knob up or down (Shift for fine steps), scroll it, double-click to reset; each unit's lamp is lit while it does something, and clicking the lamp switches the unit off and back on with its settings kept. Play and Loop let you hear changes as you make them. The effects are saved in the sound's .meta and baked in when the sound loads, so they cost nothing while it plays.
- A prefab's sounds show in its details: each sound set its emitters play, every sound in it with Play and its own rack.
- Player volumes and a developer mix in Audio > Mixer. Four sliders are the ones players will get in the options menu: Master, Sound effects, Music and Environment. Below them, a trim for each kind of sound (weapons, explosions and impacts, vehicles, doors, glass, fire, lamps and electrics, props and debris, creatures, footsteps, voices, weather, ambience beds, music, interface, other effects), worked out from the sound's folder, with how many of each are playing now.
Changed
- The separate Footsteps, Voices and UI volumes are gone from the player's volumes: they're part of Sound effects now, and have their own trims in the developer mix.
[0.002.002] - 2026-11-01
Added
- Things in the world make sounds. Fire barrels crackle, street lamps and ceiling lights hum while they're lit (faulty ones buzz and cut out with their flicker), neon signs buzz, shop signs knock now and then when the wind gets up, doors creak as they're pushed and bang when they swing hard into the wall, and windows crash when they break. Loops only play near you, and every player in co-op hears the same thing: the same sound from each folder, the same pitch, at the same moments.
- Sound sets: a sound is chosen from a folder (effects/fire, effects/doors/open...), so a folder can hold as many variations as you like; each fire barrel picks its own, and one-shots pick again every time, never the same one twice running. Your drop folder (Codename Max Source/audio) now has a folder for every set the game uses, listed in its README.
- Placeholder sounds for every set (generated by
tools/audio/make_placeholders.py), until the real ones are imported. - The Mixer panel and screenshot captions show how many emitters are near and how many loops are playing.
Fixed
- A door already pushed against the wall stays quiet when you keep walking into it (it would have creaked and banged every tick).
[0.002.001] - 2026-11-01
Added
- Sound. The game has an audio system now (the start of the audio phase). It plays through your output device with our own mixer: six buses (music, ambience, effects, footsteps, voices, UI) into a master, sounds placed in the world that fade with distance, pan left and right as the camera turns and rise or fall in pitch as they pass (Doppler), a voice limit that keeps the most important sounds when too many play at once, and a limiter so a busy moment is turned down instead of distorting. A lo-fi filter (lower sample rate, fewer bits, a gentle low-pass) gives the sound the same crunch as the pixels. Long sounds and music stream from disk.
- Audio > Mixer: every volume, the voice limit, 3D sound, the lo-fi filter and the limiter, live, with a level meter and a Test sounds section that plays any sound asset flat or placed to the right of the player. Saved like the other panels. It's this machine's own setting: nothing is sent.
- Tools > Audio import and the drop folders. Put your sounds in
Codename Max Source/audio/next to the game, inmusic,ambience,effects,footsteps,voiceorui(subfolders are fine), then press Import. They're converted into the game's assets with tidy names and picked up straight away. Effects, footsteps, voices and UI become mono WAV; music and ambience stay stereo (Ogg or FLAC, so loops never gap). The folder decides how a sound plays. - Two placeholder sounds (a UI click and a looping wind bed) until yours arrive, and
--no-audioto run without a sound device. - New dependency: miniaudio 0.11.26 (the audio device and decoding of WAV, FLAC, MP3 and Ogg Vorbis).
Changed
- The plan has the game's loop. Each player has a persistent camp on their own machine, built by up to two in split-screen. Expeditions go out to seeded zones on a world map, paid for in fuel, with the vehicle as the only storage out there. Online parties are for expeditions, and everyone goes home to their own camp. Local co-op is two players on a screen split down the middle. Destinations can be one large, two medium or four small tiles, which needs a chunked streaming system (planned in Milestone 3).
[0.002.000] - 2026-11-01
Milestone 2, "Pipeline", is closed: assets, buildings, characters and the tools around them are in place, and the bug and performance review is finished. Audio is next.
Changed
- The server only looks at what changed. Each tick it already turned every replicated component into bytes and compared them with what each player was last sent. It now remembers which entities changed since the last tick, so a player who is up to date skips the rest without comparing anything. The world sent is exactly the same. With about 1,100 replicated entities this saves little today, but the cost no longer grows with every player and every steady prop.
Fixed
- Volumetric fog stays within every graphics card's limits. Its smoke and fog-clump data was one 25 KB block, over the 16 KB that Vulkan guarantees, so some Windows and Linux GPUs could have failed to draw fog (Metal never minded). It's split in two now, and the build fails if any shader block grows past 16 KB again. Fog looks the same.
- Recording on Windows works with paths that have spaces. Windows' command shell stripped the outer quotes from a command starting with a quoted program, so ffmpeg in "Program Files", or a clip saved under a folder with a space, failed to start. Quotes are now kept, and quote marks in a path are dropped instead of being escaped in a way the shell ignores.
[0.001.102] - 2026-11-01
Fixed
- The sun no longer seems to rise again after sunset. At night the moon is the light, rising as the sun sets, but it shone with whatever the time-of-day blend was, and straight after sunset that's still the dusk's gold. So the sun set, it went dark, then the "sun" came back up before night fell (and the same before dawn). The moon now always shines with the night's moonlight colour, and the light fades right to nothing at the horizon, so the swap is invisible. The sky, mist and ambient light still blend, so the glow after sunset stays.
[0.001.101] - 2026-11-01
Added
- Debug > View settings > Colliders: switch floors, ceilings, walls, low walls and cars, and objects and people on or off, so a busy street is easier to read.
Changed
- Wrecked vehicles collide along their outside. The box from 0.001.098 left boxes and litter floating above the bonnet and boot. Each vehicle now collides as 20 cm columns over its footprint, as tall as the car is at each point, so things rest on the bonnet and roof and you're pushed off the sides. Holes in the scanned models are filled, so you still can't get inside. A new test checks every vehicle.
- The player has two eyes. The baked face had smeared eyes and brows into one dark band. The front of the face is now clean skin with two soft eyes and skin between them (
tools/blender/fix_face.py, re-run it after re-importing the character).
[0.001.100] - 2026-11-01
Fixed
- Shadows no longer change size as the camera moves or zooms. The real cause of the narrow building shadows: 0.001.098 began leaving things out of the sun's shadow map when they stood beyond its near end (between the map and the sun). That end never clipped anything (shadow depth is clamped), so tall buildings up the sun's line used to cast in full; leaving them out cut their shadows short by an amount that shifted with the camera. Only the map's four sides are tested now, so exactly what cast before 0.001.098 casts again, still without drawing what's off the map's sides. 0.001.099's longer shadow reach, which only moved the cut-off, is taken back.
- Shadows reach the far side of the screen when zoomed in. The sun's shadow map was sized from the zoom alone, but zoomed in the camera looks down at a shallow angle and the top of the screen shows ground far up the street. Past the map everything counted as lit, so far shadows were cut off at an edge that moved with the camera. The map now covers everywhere the screen's corners meet the ground (shadow texels are a little larger zoomed in).
[0.001.099] - 2026-11-01
Added
--camera yaw,zoomstarts the game camera turned and zoomed as given (zoom 0 closest, 1 farthest). A screenshot's caption now gives it ready to paste, next to--start, so a shot can be reproduced exactly.
Changed
- Screenshot captions are easier to read: twice the size, in two columns, on a nearly opaque strip. They stay legible when a chat upload shrinks the picture.
Fixed
- Tall buildings cast their whole shadow at every zoom. Zoomed in, the sun's shadow map only reached about 30 m back towards the sun, so with a low sun the top of a nearby building was left out and its shadow came out narrow, growing to its true size as you zoomed out. The map now reaches 300 m towards the sun at any zoom, with the shadow bias kept the same.
[0.001.098] - 2026-10-31
Added
- Screenshots say what was going on. F10 screenshots now have a strip along the bottom, and every screenshot or
--capturecarries the same text in the PNG's metadata (a "Comment"). It lists the build (version, release or debug, commit), the world (seed, zone size and type), where you stand as a ready-to-paste--start x,y,zwith your facing, the camera's zoom and turn, the sim tick and time of day, frame and GPU-wait times with the window size, the debug views that are on, the walker count, and whether line of sight, the CRT and the floor cut are on. With the seed and the--startline, anyone can stand exactly where you were. - Rendering > Look: *Reveal indoors when hidden* and *Reveal radius indoors*. Runtime > Line of sight: *Window reach*.
Changed
- Rooms stay whole when you're inside. The building you're in now only loses its floors above you. Its walls, furniture and hanging lamps stay, in your room and in the rooms you're not in, and the see-through circle shows you through the wall on the camera's side. Indoors the circle comes in sooner and wider (both tunable in Rendering > Look).
- You only see out of a window when you're near it. Inside a building, the street shows through a window or doorway only within 2 m of it (fading out over another 1.5 m). Deep in a room the outside stays dark, however big the windows are. Tune it in Runtime > Line of sight > Window reach.
- Wrecked vehicles collide as a solid box fitted to the model. The scanned car meshes had holes and open shells you could slip into and end up standing inside a car.
- About 30% faster in the city, 22% faster indoors on the benchmark (best of interleaved runs, your saved settings, M4 Pro):
| Where | Before | After | |---|---|---| | Street (the start) | 12.55 ms (80 fps) | 8.63 ms (116 fps) | | Inside an office | 15.84 ms (63 fps) | 12.30 ms (81 fps) |
What changed:
- Off-screen scenery isn't drawn: the main pass and the sun's shadow pass cull against the view, where before every city block was drawn every frame.
- Lamp shadows keep their place in the shadow atlas when another lamp flickers out, so they aren't redrawn several times a second. Each lamp only looks at the scenery near it.
- Line of sight draws only the ground within sight range into its view, not the whole zone.
- Skinned characters, wires and clutter upload inside the frame's own GPU commands: one submit a frame, not four.
- Characters' arm and leg IK works out each joint from its own chain, not the whole skeleton about 35 times a frame, and stops looking up bones and clips by name every frame.
- The hidden-player test builds its boxes once a frame and finds nearby trees through a grid, not every tree.
- The fog's lamp light takes one shadow sample a step instead of four.
- The server stops allocating to snapshot an unchanged world, and sorts it once a tick, not once per player.
- Hot reload no longer rescans the assets during benchmarks, and an unchanged sidecar isn't re-read.
- Walkers build at most one new navigation chunk a tick, and players and walkers share one obstacle list a tick, bucketed by area. Broken windows look up their pane once, pools search faster, and the plant and pool caches aren't thrown away when the other world asks.
- Editor panels stop reading files every frame: the asset details, prefab dragging, the localisation summary and the settings slots.
- Warnings now fail the build (
MAX_WARNINGS_AS_ERRORS, on by default, our code only).
Fixed
- Buildings you're leaning on aren't cut away. Standing against a building with the camera on your side cut it down to waist height, so you could see straight through it. Only a building truly between you and the camera is cut now.
- Balconies, fire escapes and signs are cut with their building when it's cut down in front of you.
- Lamps in what's cut away lose their glow too. A cut-down building's hanging lights left bright blobs in the fog and cones of light hanging from nothing.
- Hands no longer reach for doors on the floor below. On a roof, a door underneath you counted as being at chest height, so your hands jerked towards nothing as you walked.
- Cover no longer slides you through doorways. Hand IK and the see-through circle no longer find walls up to twice as far as they look: the scenery ray test counted hits past its end.
- City sidewalk props drew several random numbers in one statement, so a Windows build would lay out a different city. The Mac layout is unchanged, and a new golden test pins it.
- Root motion: walk, run and crouch-walk hips no longer drift up to 9 cm and snap back once a stride.
- Clutter: sleeping pieces could be drawn twice, and a respawned leaf left a ghost behind.
- Pools now follow edits to the terrain's flat square.
- Recording with
--record-fpsnow encodes at that rate, not the panel's. - Prefab editor: pressing Delete while dragging a handle crashed.
- Robustness: the server rejects truncated component edits and repeated hellos. A refused client edit no longer changes the client's copy. The JSON reader limits nesting, reads long numbers and decodes
\uescapes, and the writer escapes control characters. Out-of-range numbers in settings files are clamped. Corrupt skeletons and short inverse-bind lists are refused, and failed GPU uploads and captures fail cleanly instead of crashing. A second gamepad is picked up when the first is unplugged. A walker with nowhere to stand tries new spots once a second instead of the same eight every tick. Glass panes draw back to front. - Tests: a test that throws is reported and the rest still run. Three tests that could never fail now check something real.
[0.001.097] - 2026-10-31
Added
- World > Player movement: every movement setting in one panel, shared by all players (edits go through the server; save one as your default for new worlds). Speeds: walk, sprint, sneak, and how much slower you go sideways and backwards while aiming. Response: how quickly you get up to speed and stop, and how much you can steer in the air. Jumping: jump height and gravity. Turning: turn speed, aim turn speed and turn acceleration.
Changed
- The body turns instead of snapping round. Facing a new way (moving or aiming) now turns at up to 420 degrees a second (720 while aiming), easing into the turn and slowing to a stop on the new heading. Tune it in World > Player movement.
- Network protocol version 14 (new replicated settings): older builds can't join newer ones.
[0.001.096] - 2026-10-31
Changed
- Wireframe looks like the other debug views. Debug > Wireframe now draws the triangle edges as crisp lines over the normal picture at full resolution, without the CRT and colour reduction, people in cyan and everything else faint white, as far round you as the View settings range.
[0.001.095] - 2026-10-31
Fixed
- Dense interiors run at full speed again. In a furnished office the frame rate fell to about 20 fps (45 ms a frame); now it's back above 60 (16 ms). The check that decides when to see through what's between the camera and you fired its rays against every triangle in the room, sorting thousands of them per ray, up to 144 rays a frame. Rays now walk the collision grid cell by cell and test each triangle once, and finding the first thing still drawn past the cut-away ceilings takes one pass instead of up to twelve.
- People no longer hide parts of themselves. Bodies were drawn into your line of sight as if they were walls, so a walker's own body could hide its arms, legs or back. People never block sight now.
- People fade out of sight instead of vanishing. When a walker goes out of your line of sight, the whole of them dithers away over a second as they walk on, rather than disappearing piece by piece; the moment they're back in sight they're all there again. Someone standing still behind a wall is out of sight too.
[0.001.094] - 2026-10-31
Added
- Debug views, in the Debug menu. Tick any of them on (hover for what each shows); they're drawn round you, edit mode or not, and remembered with your layout:
- Wireframe: the scene as triangle edges.
- Colliders: what people stand on and bump into. Floors green, walls that block line of sight red, walls that don't (cars, fences, tables) yellow, ceilings blue, boxes, door leaves and tree trunks white, and everyone's capsule cyan.
- Line of sight blockers: just the faces that hide one person from another.
- IK points: the hand points in buildings (door frames, stair rails, ledges, with the way the hand pushes) and each character's live hand targets.
- Skeletons: every character's bones as posed.
- Navigation grid and Walker paths: where the AI can stand, and where each walker is heading and what it's doing (moved here from the AI walkers panel).
- Lights: each light's colour, reach and a spot's beam.
- Loot spots: where loot can turn up, with its table and chance.
- Wind: arrows showing the wind round you, gusts and all.
- Entity names: what every entity nearby is called.
- Debug > View settings: how far round you the views reach, whether to show only your own floor (so the floors above and below don't show through), and labels on or off.
--debug-views "Colliders,IK points"switches views on from the command line for one run (for captures), without changing your saved choice.
[0.001.093] - 2026-10-31
Added
- AI walkers that find their own way. Six people now wander the zone (World > AI walkers): each picks somewhere nearby, works out the way there and walks it, in through doorways (pushing the doors open), up stairs from floor to floor, round walls, wrecks and furniture, then stands about a while. They move and animate like players, keep from walking into each other, and every player sees them in the same places. In the panel: how many, how far they roam, how long they pause, walking speed or running, and Call them to me, which brings every walker to where you stand (from upstairs, or the far side of a building) to wait there half a minute.
- Navigation for the AI. A walkable grid worked out from the terrain and the buildings themselves: every place someone can stand, on every floor, with room to stand up and clear of walls. Stairs join the floors, doorways join the rooms. Long climbs are thought through over a few moments rather than all at once, so the game never stalls. Debug views in the AI walkers panel show the grid round you (green, orange beside walls) and each walker's way ahead.
Fixed
- Stairs are no longer railed off. In every building with more than two floors, a rail stood across the bottom of each flight above the first, at the landing, so you couldn't walk up past the first floor. It's now only at the top flight, guarding the stairwell's drop.
- No more gap at the top of the stairs. A 25 cm strip of open floor at the head of every flight is now floored over.
- Doors no longer shut the stairs off. A door hung on the side towards a staircase opened right across its landing (in houses the front door did). Doors near stairs now hang from their other side and open out of the way.
[0.001.092] - 2026-10-31
Added
- Props for the new rooms, textured like the rest, each with a smashed version: in bars a pool table (balls and a cue left on it), high tables with drinks, a jukebox and beer kegs; in hotel lobbies a key cabinet behind reception (some keys gone) and luggage trolleys (a case or two still on); dead potted plants in lobbies, offices, meeting rooms and hotel rooms; in bathrooms a shower stall (screen sometimes missing) and a towel rail; in offices partitions, a water cooler and a photocopier.
[0.001.091] - 2026-10-31
Added
- Signs with real names. Every sign names its business, picked per building so the same kind of shop is called something different across a city: bars like The Royal Oak, The Crown & Anchor and Duffy's Tavern; diners like Rosie's Diner and Route 9 Diner; Kwik Stop, Patel's Groceries and 24/7 Mini Mart; Bella Boutique, Denim & Co; Volt Electronics, Radio Ray's; offices like Harper & Cole; Joe's Auto Repair, Main St Motors. Neon on the special buildings too: Wellcare Pharmacy, FreshWay, Liberty Arms, St Mary's Medical Centre, and hotels like the Starlight Motor Inn and the Grand Hotel. 62 signs in all, the lettering sized to fit, the odd letter fallen off. (The list is
tools/blender/sign_names.py: add a name there and rerunmake_sign_scripts.py.) - Haze at the edge of the world. Past the playable area the land fades into the horizon's haze, so the far hills read as distance.
[0.001.090] - 2026-10-31
Added
- Knock things off furniture. Brushing past a table, counter or shelf at hand height shoves what's on it, which slides off the edge and falls.
- Street furniture to match the street. High streets have benches, bins and bus stops; downtown has bins and bus stops; suburbs have mailboxes; industrial rows have stacked pallets, wooden crates, tyre stacks and traffic cones (new pallet and crate props). Each side of a block is one kind of street, its buildings and pavement alike.
- Shop signs. Ordinary shops, diners, bars, offices and auto repair shops have an unlit painted sign over the front (MINI MART, CLOTHES, ELECTRONICS, DINER, BAR, OFFICES, AUTO REPAIR), the board painted a different colour shop to shop, a letter or two fallen off. Hotels have a neon HOTEL on the roof.
[0.001.089] - 2026-10-31
Changed
- Everything is textured. The last flat-coloured surfaces now have pixel-art textures like the rest of the world: upholstery (a worn weave with stains and burn holes), porcelain and enamel on sinks, toilets, baths, fridges and stoves (crazed, grimy, chipped), moulded plastic, rubber, mattress ticking (stripes, quilting, stains), shop stock (rows of packets and tins, with gaps where things were taken), the neon signs' backing boards and the flashlight. Only things that glow (neon tubes, bulbs, strip lights, lamp glass) stay plain.
[0.001.088] - 2026-10-31
Changed
- Less litter, and it looks like litter. A quarter as much as before (about 10,000 pieces), now textured from a pixel-art sheet: can labels, cardboard with tape and print, a pizza box lid, handwritten and printed paper, newspaper columns, leaves with veins. Mostly paper and boxes, a few cans and bottles, the odd pizza box. No more trash bags.
- Nothing's quite flat or square. Every sheet is a little curled, and each kind has its own shape: a dog-eared corner, a rolled end, a fold, a dish. Boxes have crushed corners, a bowed side or a sagging top.
- Weight. Full boxes barely shift when you walk into them and slide a little when you run; cans skitter and roll; paper and leaves fly up.
- Paper flies. A gust lifts paper and leaves off the ground: in the air they flutter side to side, tumble, bend and drift slowly down, instead of sliding along the floor. They lie a couple of centimetres up (no more flickering against the ground). The ones blowing past you start in the air.
[0.001.087] - 2026-10-31
Added
- Clutter that moves. Tin cans, bottles, cardboard and pizza boxes, trash bags, sheets of paper, newspapers and leaves lie about the city in clumps: against walls and kerbs, in doorways, on floors, tables and shelves (about 39,000 of them). Walk through them and you kick them; things on a table edge go over; paper, leaves and empty boxes skitter along in the wind (the same wind as the grass and smoke), settling in corners and getting picked up again by the next gust. Indoors the wind doesn't reach them. Leaves and paper keep blowing past you. Rendering > Look > Clutter sets how much (streets, inside, drifting), how far it reaches and how hard the wind pushes. Cosmetic: each player sees their own.
Changed
- Faster collision queries. The scenery's triangle lookup no longer sorts its lists on every query, which speeds up walking, foot IK and the clutter.
[0.001.086] - 2026-10-31
Fixed
- No flickering faces left in any building. Garage roller doors stand a centimetre off the wall (box and rails), and in concrete-frame buildings furniture against a wall stands clear of the columns. The flicker test now fails on a single overlapping pair. (0.001.085 went out without its version bump; this is it.)
[0.001.084] - 2026-10-31
Changed
- Streets with a character. Each street is one thing: downtown commerce (hotels, offices, apartment blocks, the medical centre), a midtown high street (shops, diners and bars, apartment blocks between) or a residential street, an outskirts suburb of houses or an industrial row of garages, warehouses and machine shops. Corner lots favour a corner shop, a bar or a diner, and the same building rarely stands twice side by side.
- L-shaped buildings planned properly too. Their main block is laid out like the rest (an L-shaped apartment block is a stair hall with two flats, an L-shaped shop a sales floor and stockroom), the wing carrying on the rooms in front of it. They're a little deeper to fit.
[0.001.083] - 2026-10-31
Added
- Interior walls and doors. Rooms are divided by thinner, painted plaster walls (pale green, cream, faded blue or plain, one colour a building) with ordinary 0.9 m doorways and panel doors (some kicked in), instead of outside walls with wide doorways.
Changed
- Every kind of building has a real layout now:
- Houses: the front door into a hall with the stairs, the living room at the front, the kitchen across the back; upstairs a landing, two bedrooms and the bathroom. Bungalows: living room across the front, then kitchen, hall, bathroom and bedroom.
- Offices: a stair hall at the side; a reception at the front of the ground floor with offices behind; open-plan floors above, each with a meeting room and toilets at the back.
- Clinics and the medical centre: a waiting room with reception, a corridor, treatment rooms off it; upstairs wards.
- Supermarkets: the sales floor, and behind it the stockroom (back door), the manager's office and the staff toilets.
[0.001.082] - 2026-10-31
Changed
- Buildings laid out like real ones. Floors are now planned room by room:
- Residential blocks (bigger now): a stair hall up the middle from the front door, a flat either side on every floor, each with a hall, a living room at the front, a kitchen-diner, a bedroom and a bathroom.
- Hotels (new, downtown, 5-6 storeys): a lobby with reception across the front, a bar and a kitchen behind; upstairs a corridor down the middle with rooms either side, each with its own bathroom by the door.
- Shops: the sales floor at the front, a stockroom behind with the back door; with two storeys, a flat upstairs up its own stairs from the back (living room, kitchen, hall, bedroom, bathroom).
- Other kinds keep a front and a back room for now.
- Fewer, better lights. One strip light in a room (two in a big one), fewer rooms lit; no more hanging bulbs. Inside, the lights over you stay visible (the floor above is cut just under its slab now).
Fixed
- Rebar through the roof. The bars in broken floor slabs stick out into the hole instead of hanging into the room below, so they don't float in view when the floor above is cut away.
- Less flicker. Interior walls meeting each other, vines over boarded windows and drainpipes behind balconies no longer share faces (20 overlapping pairs left in all 47 buildings, from 47).
[0.001.081] - 2026-10-31
Removed
- The placeholder van and mech. The box "van" parked at the start and the box "mech" landmark from the very first test scene are gone (the scene's layout golden value changes with them).
[0.001.080] - 2026-10-31
Added
- A horizon. Past the edge of the playable area the land carries on and rises into low hills a few hundred metres out, so from a rooftop the world ends in a skyline instead of a cut-off edge against the sky. You can't walk off the edge any more: you stop 2 m short of it.
[0.001.079] - 2026-10-31
Changed
- New wrecks. The old block cars are gone: the streets now have a rusty car, hatchback, muscle car, classic car, station wagon, van, a short school bus and motorbikes, made from supplied models, sized against the player and drawn as pixel art like everything else. Each comes as found, stripped (wheels gone, down on its hubs), roofless and wrecked (dented, roof crushed, down on one side), in faded, burnt or sun-bleached paint; motorbikes lie on their side, and one's half up a rubble pile.
- The asset viewer's scale figure is the player character now (idling), not a grey capsule.
Fixed
- On a roof you're outside. Standing on top of a building no longer counts as being inside it: no floor cut, and the outside doesn't fade away.
[0.001.078] - 2026-10-31
Fixed
- No more kinked wrist aiming the torch crouched. The hand is held a little lower, and the torch only turns so far from the line of the forearm (Rendering > Animation > Torch > Wrist bend); the arm does the rest of the pointing.
- Aiming while crouch-walking. There are no crouched strafe clips, and the ones standing in turned the whole body sideways (the body could end up facing backwards). Now, aiming while sneaking, the legs face the way you're going (or sneak backwards when you aim behind you) and the upper body turns to the aim, never more than a body can twist; turning the aim right round keeps the torch out in front all the way.
Changed
- Faster in busy streets. The check for whether you're hidden behind something (the see-through circle) stops at the first wall again instead of testing every wall along the way; the glass reflections no longer compare every pane with everything in the scene; neon sign lights are spots aimed down at the street (one shadow instead of six).
[0.001.077] - 2026-10-31
Changed
- Picking things in the game is on by default. With Tools > Assets open, click anything in the running game (a wall, a car, a table) and its model is selected and outlined in yellow, with the building it's part of (Select the building opens that prefab). Change its settings, like line of sight, and Save. Untick "Pick from the game" to see a selected model on its own 3D stage.
[0.001.076] - 2026-10-31
Fixed
- Torch: fingers wrap round it. While the torch is out, the right hand closes round it (Rendering > Animation > Torch > Grip).
- Torch held in front of the arm, not across the middle of the chest.
- Crouched, the torch is raised to just under your head when you aim (Crouched, below head).
- Aiming while sneaking no longer twists the arm behind or through the body. The crouched strafe clips turned the whole upper body sideways; while aiming, the chest now always turns to face the aim, so the arm holding the torch stays out in front whichever way you sneak.
[0.001.075] - 2026-10-31
Changed
- Reflections only up close. You show in window glass only when you're right up against it, as a faint image (30%), fading out as you step away (gone by 2 m). Rendering > Look: "Glass mirror" (how strong) and "Glass mirror reach" (how far).
[0.001.074] - 2026-10-31
Changed
- A better torch-aiming pose. Holding aim, the arm now reaches forward with a soft bend (elbow down and slightly out, hand at lower-chest height well in front), the fist upright with the palm facing in and the torch level along the forearm. Rendering > Animation > Torch still tunes reach, height, angle and sway.
[0.001.073] - 2026-10-31
Changed
- The torch is an item you hold. Press the torch button ([F] / Y) to take it out: a modelled flashlight is in your right hand, moving with it, and its beam shines from the lens wherever the hand points. Press again to put it away. Hold aim to raise it: your arm reaches out in front and points the torch where you're facing, with a gentle sway that grows as you walk. You can't aim while running. It starts put away. Tune the reach, height, angle and sway in Rendering > Animation > Torch.
- Real reflections in glass. The smeared, back-to-front reflections are gone: people near a window now show in it as in a mirror, facing back at you, clipped to the pane and hidden behind anything standing in front of the glass. Only people are reflected (cheap); the rest of the glass reflects the sky's colour. Nobody on the far side of the glass is reflected.
[0.001.072] - 2026-10-31
Fixed
- Glass is properly transparent. The dotted pattern over windows (which crawled as the camera moved) is gone: glass is now see-through, faintly tinted, with its dirt marks solid, and it reflects the world in front of it (you, the street, the lamps), more at glancing angles, falling back to the sky's colour. Rendering > Look: "Glass reflection" (how mirror-like) and "Glass glint" (the sun catching it).
[0.001.071] - 2026-10-31
Changed
- Inside a building, the outside world fades away. Step inside and everything outside the building goes dark, except what you can actually see through its windows, glass and doorways. Turning the camera no longer shows the street through the walls. Rendering > Line of sight > "Outside, when inside" sets how far it fades (1 = black, 0 = off).
[0.001.070] - 2026-10-31
Added
- Glass in the windows. Windows and shopfronts have glass behind their frames: dirty, see-through panes (a PS1-style dither) with solid grime marks, reflecting the sky at glancing angles and glinting in the sun. About half are already smashed, with jagged shards left in the frame (every broken wall's window is).
- Glass smashes. Anything that hits a whole pane smashes it for everyone: the pane swaps to its shards and a shower of glinting glass flies on the way it was hit, falls and lies on the ground for a few seconds. Bullets and thrown things will use this when they arrive; for now you can smash a pane from the World panel (tick its WindowGlass
broken). - Glass settings (Rendering > Look, this client): how much of the glass is drawn (clearer or more reflective) and how strongly it reflects.
[0.001.069] - 2026-10-31
Changed
- Only big, solid things block your line of sight. Cars, chain-link fences, rubble piles, poles, signs, tables, counters, sofas and other low furniture no longer hide what's behind them; walls, doors, wood fences and tall furniture (bookshelves, wardrobes, fridges, shelving) still do. You still bump into all of them.
Added
- Pick from the game (Tools > Assets). Tick it and the game stays in view: click anything in the world (a wall, a car, a table) and its model is selected, with the building it's part of (Select the building opens that prefab).
- Line of sight setting on every model (Tools > Assets): Auto, Blocks sight or Doesn't block sight, saved into the model's
.metawith Save. It applies to every copy of the model at once.
[0.001.068] - 2026-10-31
Fixed
- The see-through circle indoors. Inside a building, the ceilings and upper floors above you (cut away on screen) still counted as hiding you, so the circle came on all the time and furniture in front of you was dithered away even when it hid only your legs. Now only what's still drawn counts: the circle appears when three quarters of you is really hidden, as outside.
[0.001.067] - 2026-10-31
Added
- Neon signs on the important buildings. Supermarkets, pharmacies, gun shops, clinics, the medical centre, garages and the machine shop now have a big neon sign on the roof at the front, tilted back so you can read it from the street and from above: SUPERMARKET in amber, a green cross and PHARMACY, red GUNS, and so on. They glow day and night and light the street in their colour. About 4 in 10 are faulty: they buzz, stutter, cut out for a while and spit sparks, and the odd letter's tube is dead.
Changed
- A lamp's flicker now dims any glowing model it's on, not just its light (the network protocol is now 12).
[0.001.066] - 2026-10-31
Fixed
- Peeking always lets you see in. Vines hanging across an opening blocked your line of sight completely (their gaps didn't count); they no longer block it, and while peeking your view turns round the corner.
- Cover never puts you somewhere odd. It's only taken where your whole body fits behind the wall (you shuffle along to fit), not from on top of furniture and not into it (you could end up climbing a bookshelf and falling), and sidling stops at the edge of a drop.
[0.001.065] - 2026-10-31
Added
- More lights inside. About half the ordinary buildings still have power: bare bulbs hang under tin shades through their rooms, warm and dusty, some flickering, a few hanging askew with the bulb gone. Special buildings have far more of their fluorescent fittings working.
[0.001.064] - 2026-10-31
Added
- Screenshot button. Press F10 (or Screenshot in Tools > Recording) to save the next frame as a full-size PNG in the
Codename Max Capturesfolder. It's taken at the window's real pixels, so twice the size you see on a Retina screen. With "Hide the overlay" on, the editor panels are left out and the game and its HUD are kept.
Fixed
- A screenshot taken while recording no longer drops that frame from the video.
[0.001.063] - 2026-10-31
Added
- A brightness ceiling (Rendering > Post: Max brightness, Roll-off start). Thick fog lit by the sun and your torch could wash the whole screen white; now the brightest parts roll off smoothly towards a ceiling instead, colours kept, glow included. Set Max brightness to 2 to switch it off.
[0.001.062] - 2026-10-31
Changed
- Fewer doors and windows. Every floor has at most two doors, never more than one on a side, and no side has more than three windows. The rest is plain wall.
[0.001.061] - 2026-10-31
Changed
- Peeking holds. Leaning round a corner now stops with your head furthest out and stays there for as long as you hold the direction, instead of leaning out and back again.
- Stair rail hands taken out (they looked wrong), along with the drift towards the rail on the stairs.
Fixed
- No more slipping through walls in cover. Sidling along a wall into a corner could carry you through the other wall, to the far side or out of the building. Now a wall across your way stops you. Window frames and shopfront bars no longer count as walls to take cover against (that put you inside the wall). A test takes cover all over every building and checks nobody ends up through a wall.
[0.001.060] - 2026-10-31
Fixed
- Hands on stair rails, working at last. The rail was never being found (its hand points are further apart than the code allowed), so no hand ever went to it. Now on the stairs the hand on the rail's side grips it and moves up hand over hand, and you drift gently towards the rail as you climb or go down (steer away if you'd rather not), since from the middle of the wide stairs it's out of reach.
[0.001.059] - 2026-10-31
Fixed
- Peeking keeps you behind cover. You used to stop with half your body past the wall's end, then step further out to peek, standing in the doorway or window. Now you stop with your whole body behind the wall, and peeking just leans your head and shoulder out; your view comes from round the corner, so you see what's there without showing yourself.
- Taking cover at a chipped wall edge no longer turns you at an angle to the wall.
[0.001.058] - 2026-10-31
Added
- Record gameplay videos. Press F9 to start and stop recording (or use Tools > Recording). Clips are saved as MP4, GIF, or both, in the
Codename Max Capturesfolder next to your settings. They're 60 fps by default and always play at true speed. The edit overlay hides while you record, so the clip shows just the game and its HUD. The window title shows[REC]while it's running. - Tools > Recording sets the frame rate, the largest size (a Retina window is shrunk by a whole number, to 1080 lines by default), MP4 quality, and the GIF's frame rate and width. A GIF can't play at 60 fps (its timing is in hundredths of a second), so GIFs default to 30.
--record <clip.mp4|clip.gif>records a perfectly smooth clip from a scripted run: from--capture-framefor--record-seconds(10), at--record-fps(60), moving the game on exactly one frame's worth each time however long saving takes. Then it quits.- Needs ffmpeg (on a Mac:
brew install ffmpeg). It's found in Homebrew's folders or on PATH, or you can set its path in the panel. On the Mac it encodes with the hardware encoder, so recording barely touches the frame rate. Recording is an editor tool and isn't part of the game itself.
[0.001.057] - 2026-10-31
Added
- Cover. Walk into a wall and keep pushing for a moment: you put your back to it. Move left and right to sidle along it; you stop where the wall ends (a doorway, a window, a corner), and pushing on there you peek round the edge, leaning out far enough to see what's there. Step away from the wall, jump or sprint to leave cover. Low walls and windows aren't cover.
- Cover animations from the new clips: the idle against the wall, sidling either way, peeking, and turning to look the other way. They were made looking left; the engine mirrors them for looking right.
[0.001.056] - 2026-10-31
Added
- Emotes. Hold G (gamepad: D-pad up) and a wheel of 13 emotes opens round your character: wave, thumbs up, salute, bow, point, cheer, clap, jump for joy, dance, shake it off, charge, taunt and no. Point at one with the mouse or the right stick and let go to play it; let go in the middle to cancel. Everyone sees it; moving or jumping stops it.
Changed
- Hands simplified. Rail, wall and door-frame hands are gone. Walk into a door face on and both hands push it.
Fixed
- Blocky shadows under street lamps. Lamp and torch shadows are now softened across each shadow pixel, so your shadow under a lamp has your shape instead of a few big blocks. They also follow your pose when you stand still (an idle or an emote) instead of freezing.
[0.001.055] - 2026-10-31
Changed
- Calmer hands. You no longer reach for every wall you pass: a hand only goes to a wall once you've stood still beside it for a second, and only the hand nearer it, as if steadying yourself. Move and it comes away.
- Pushing doors: the right hand reaches out to a push point on the door as you go through; as that falls out of its reach, the left hand takes over; then both let go.
- Stair rails: the hand grips the rail and stays put as you climb, then lets go and takes a new grip further on, hand over hand. (Walk near the rail: the stairs are wide, and from the middle it's out of reach.)
Fixed
- Legs no longer bend or twist strangely on uneven ground: knees keep bending the way the walk bends them, a foot over a drop too deep to reach (a table's edge) stays where it is, foot IK eases off as you speed up, and landing on something higher no longer bends the legs from the old height.
- The stairwell wall no longer takes the hand that should be on the rail.
[0.001.054] - 2026-10-31
Changed
- Docs for everything characters.
docs/CHARACTERS.mddescribes the whole pipeline end to end: getting a model from Tripo and clips from Mixamo into the game, every step of the import, how the animation blends, the IK, player states and controls, doors, the testing tools, and the gotchas found on the way. The plan, asset rules and README point to it.
[0.001.053] - 2026-10-31
Changed
- A new cast. Nine characters, all straight from Tripo: Female - Fighter, Female - Survivor, Male - Camper, Male - Cowboy, Male - Field Medic, Male - Scientist, Male - Soldier, Male - SpecOps and Male - Survivor. You start as Male - Survivor; swap to any of the others from Runtime > Player state. The old test model is gone.
[0.001.052] - 2026-10-31
Added
- Doors on hinges. Most doorways now have a door, chosen by each building's seed (about three in four outside, three in five inside). Walk into one and it swings open away from you, your hand pushing it; it stays where it stops. They're all unlocked for now. Everyone sees the same doors swing.
Fixed
- Doors and windows sit in their openings. Every door and window frame was placed off to one side of its hole (doors by a metre, windows by half), sticking into the wall beside it and leaving part of the opening bare. Some doorways were blocked by a fixed door or a jammed shutter; outside doorways now have a hinged door or nothing.
[0.001.051] - 2026-10-31
Fixed
- You're the size you look. The player bumped into things as if 0.8 m across; now it's 0.6 m, the character's shoulders. Gaps the buildings leave for walking (onto stair landings, between furniture) were made for a slimmer person than the old collision, so some stairs couldn't be reached. They all can now.
- More room round the stairs. Furniture keeps well clear of the flight's open side, its foot and its head, so getting on and off is never a squeeze. A test climbs every building's stairs.
[0.001.050] - 2026-10-31
Fixed
- Flickering surfaces inside and on buildings. Wherever two surfaces lay exactly on top of each other they flickered (z-fighting): the tops of pillars and walls where they meet, window frames in their openings, railings sharing posts, ledges at building corners, furniture standing on the floor. Every one is now kept a centimetre or two apart, about 6,000 overlapping faces down to a few dozen on tiny props, and a test checks every building so it stays that way.
[0.001.049] - 2026-10-31
Added
- Hands and feet meet the world (IK):
- Feet stand on the ground under each of them: one on a stair, the other on the step below; on a kerb, a slope, a heap of rubble. The hips drop to let the lower foot reach.
- Stair rails: on the stairs, the hand on the rail's side slides along it.
- Door frames: going through a doorway, a hand brushes the frame.
- Walls: stand or walk right up to a wall and the nearer hand rests flat on it (not while running).
- Every part can be switched and tuned in Rendering > Animation; Runtime > Player state shows what the hands and feet are doing.
[0.001.048] - 2026-10-31
Added
- Import all new characters in one go. Tools > Character import finds every model in your source folder's
characters/that isn't in the game yet, names each after its folder ("Male Survivor - Camping" becomes male_survivor_camping) and builds them all in the background. - Swap your character while playing. Runtime > Player state has a Character dropdown listing every imported character; pick one and you're it (everyone sees it).
[0.001.047] - 2026-10-31
Added
- Tripo auto-rigged characters work as they come. Export from Tripo straight into the source folder and import: the import turns each bone to face the way Mixamo's do, so every animation fits without going through mixamo.com. The first one is in: Male Survivor - Camping (wear it from Tools > Character import).
--wear <asset path>(testing): start as a given character.
Changed
- Animations now keep each body's own proportions: they turn every joint but only move the hips, so a broad or lanky character isn't squashed into the clip's original shape.
[0.001.046] - 2026-10-31
Added
- Tools > Character import. Every supplied character's import settings, in the game: source file (a dropdown of what's in your Codename Max Source folder), triangles, flat or smooth shading, pixel size, colours, grit and the colour cap. Reimport rebuilds it in Blender in the background, and the game swaps it in when it's done. There are buttons to reimport every character or the animations, to start a new character from a source file, and to wear it on your player and walk round in it.
- Each character's settings live in a small
<name>.import.jsonbeside it, so the panel and a command-line rebuild always agree.
[0.001.045] - 2026-10-31
Changed
- A blockier player. Half the triangles (3,000) and flat shading: every face is lit as one plane, so the hood, backpack and limbs read as hard facets, like the PS1 characters we're after.
[0.001.044] - 2026-10-31
Changed
- The player's texture is pixel art now, not just pixel-sized. It was the right size but baked from a smooth texture, so neighbouring pixels were nearly the same colour and none showed. Now it has a small palette of its own (soft shading becomes visible steps), a little grit and the odd speck in every pixel, and darker outline pixels where colours meet, the same treatment as the road surfaces. Its pixels show at the same size as the street's.
[0.001.043] - 2026-10-31
Changed
- One pixel size for everything. Every texture is now drawn at 32 texels a metre, the same as the ground and the roads. Walls, props, furniture and roads were already there; the player was three times finer and looked smooth and flat beside them. It's now baked at the world's pixel size (each texel the average colour of the patch it covers), so the character is the same chunky pixel art as the street.
- A test measures every textured model and fails if one drifts from the standard, so new assets stay in line.
[0.001.042] - 2026-10-31
Added
- A real player character. The capsule is gone: you're a survivor in a hoodie, gas mask and backpack (the test model you supplied), 1.8 m tall, skinned on the shared Mixamo skeleton that players and enemies will all use.
- Movement animation, blended in layers:
- The legs play idle, walk or run (crouched: the crouched walk and sneaks), mixed by speed and by direction against where you face, so aiming while you move strafes and backpedals. Every clip stays in step and speeds up to match the ground you cover, so the feet don't slide.
- Crouching and standing, standing up into a sprint, jumping and landing play their own clips, fitted to the real jump.
- Your upper body twists towards where you face while the legs catch up; standing still, the feet step round once you've turned far enough.
- Heads turn to look at people nearby.
- Tune all of it in Rendering > Animation.
- New controls:
- C (gamepad B / circle) crouches and stands. Moving while crouched is sneaking.
- Space (A / cross) jumps, from standing or on the move: high enough to clear waist-high clutter.
- Shift (L3) held runs; walking is the default.
- Sprinting or jumping stands you up from a crouch.
- Player states. The server tracks what every player is doing (on the ground or in the air, jumping, falling, landing, standing or crouching, idle, walking, running, sneaking, aiming, strafing, backpedalling) and sends it to everyone. Game rules ("can't fire while jumping") will be built on these. Runtime > Player state shows yours live, with a history of changes, the clips playing, and an option to log every change.
- Character pipeline. Supplied characters and Mixamo clips live in
Codename Max Sourcebeside the game. A script makes them game-ready: 6,000 triangles, one 256×256 texture in the game's colours, every clip in one file. The character budget is now 3,000-6,000 triangles with 256×256 textures. --autopilot(testing): your player runs through every move in turn, for watching the animation.
Changed
- Walking is slower (1.9 m/s) and running 5.2 m/s, close to the clips' own pace. Aiming slows you sideways and more going backwards.
Fixed
- Torch, crouch and jump presses are no longer lost or counted twice: a press between two simulation ticks used to be missed, and one seen by two ticks in the same frame toggled the torch back off.
[0.001.041] - 2026-10-30
Changed
- Back to the capsule player. The scripted characters and animations (0.001.039 and 0.001.040) are reverted: they didn't reach the look we want. Characters, enemies and their animations will come from supplied models instead, and the character work starts again from those.
[0.001.038] - 2026-10-30
Changed
- Softer light shafts:
- The glow fades out in a smooth bell across the beam, on a wider card, so neither side shows as a line.
- It eases in just below the lamp instead of starting hard at the head.
- It falls away gently towards the floor.
- It's a little dimmer overall, and rain brightens it less, so it no longer blows out next to the lamp.
[0.001.037] - 2026-10-30
Added
- Light shafts. Every lit lamp (street lamps at night, ceiling lights indoors) shines a soft cone of glowing air down to the floor or ground. It's brightest at the lamp, soft at the sides, brighter in the rain, and follows the lamp's flicker. A cheap fake (two quads per lamp, drawn on each machine), on top of the volumetric fog's real beams. Renderer > Light shafts switches it and sets the brightness.
- Ceiling lights in special buildings. Supermarkets, the pharmacy, gun shops, medical buildings, garages and the machine shop still have power (a generator, presumably). Fluorescent fittings hang over every other cell, lit day and night. About a third are faulty, buzzing, cutting out and sparking, and some hang askew with a tube gone (Props > Furniture > Lighting).
[0.001.036] - 2026-10-30
Added
- Buildings in the way are cut down. A building standing between the camera and you drops to waist height, fading in and out, so you see the street and yourself instead of a wall in shadow. Up to four at once. Switch it in Renderer > Player reveal.
- Street lamps come on at night, each at its own moment round dusk. Most lamps on streets with power lines still work, downtown's mostly don't, and some are faulty: they buzz, stutter, go dark for a while and spit sparks. Which lamps work is shared by every player, and the flicker runs on the shared clock.
- A clear way through, guaranteed. The building generator keeps a walking map of every floor: walls, stairs, rails, partitions and everything placed, each grown by a person's width. A piece of furniture, a heap of rubble or a pile of debris is only placed if every way in, both stair landings and both sides of every inside door can still reach each other. Holes in floors are kept away from doorways and the top of the stairs. The generator stops with an error if an empty floor is ever cut off. Players and, later, enemies can always get through.
Changed
- Fewer windows: windows are now in every other bay at most, lined up storey above storey, with side walls mostly plain.
- Interior rubble and debris are placed with the furniture, so they never block a way through.
[0.001.035] - 2026-10-30
Added
- Buildings by kind: 46 buildings, filed under what they are, so each kind can have its own loot and rules later:
- Residential: houses, apartments, a tenement, a hotel.
- Commercial: two supermarkets, convenience stores, a pharmacy, two gun shops, clothing and electronics stores, a diner and bars.
- Medical: a clinic and a medical centre.
- Offices: office blocks and towers.
- Industrial: garages, a machine shop, warehouses.
- Ruins.
- Rare, valuable buildings. The supermarket, pharmacy, gun shop, medical buildings, garage and machine shop are special: a city has at most one of each kind. The log lists where they are.
- Furniture: about fifty pieces, each with a smashed variant (Props > Furniture). Rooms are furnished for what they were:
- homes: living rooms, kitchens, bedrooms, bathrooms;
- shops: aisles, fridges, checkouts, clothes racks, gun racks and display cases;
- medical: reception, treatment rooms and wards;
- offices: desks, chairs, filing cabinets;
- workshops: workbenches, tool racks, car lifts, machines;
- diners and bars: booths, counters, stools;
- stockrooms: pallet racks and crates.
Walkways, doorways and stairs are always kept clear.
- Loot spawn points on shelves, counters, in cabinets and on floors. Each has a loot table from its furniture and the building's speciality, so a pharmacy's shelves hold medicine and a gun shop's hold weapons. Intact pieces are likely to hold something, smashed ones rarely.
- Hand points for animation at every door frame and up the stair rails.
- Both are data in the building, not objects, so they cost nothing until gameplay uses them.
- Pitched roofs and gables for 10 m deep houses.
Changed
- More room:
- Buildings are bigger.
- Doors are 1.4 m wide (they were 1.0 m).
- Stairs are 1.8 m wide, with a rail up the open side (sometimes bent or broken) and railings round the well upstairs.
- The city picks buildings by district: towers, offices and the medical centre downtown; shops and apartments midtown; houses, sheds and machine shops on the outskirts.
- Asset pivots can be
floor(stands on its pivot but isn't centred) orwall(hung on a wall).
[0.001.034] - 2026-10-30
Fixed
- Stairs you can reach. Every flight now starts a metre in from the front wall, with a landing to walk onto it from, and steps off onto a small landing at the top. All 43 buildings were rebuilt. Buildings with stairs are at least 6 m deep.
- Roads flickering and their cracks swimming. The dirt edges, crack networks, paint and patches were thin layers a few millimetres above the asphalt, so they flickered against it. And with only two triangles per piece, the PS1 texture warp slid them about as the camera moved. Now:
- every road piece has its own painted texture covering the whole piece (Textures > Roads, made by
make_road_textures.py), with everything on the surface painted in; - road and sidewalk surfaces are a grid of 0.5 m quads, so the warp stays small;
- nothing lies flush on the road any more: the heaved chunks round potholes stand out of the surface.
Added
- Second surfaces for straight, dashed and worn roads and for junctions, so neighbouring pieces don't repeat.
[0.001.033] - 2026-10-30
Added
- Worn-out roads. Every road piece is now decades past maintenance:
- a rougher asphalt with alligator cracking, tar-sealed cracks, gravel showing through and oil stains;
- dirt and gravel creeping in from the edges with a ragged line;
- crack networks scattered over every piece.
- New road and sidewalk pieces:
- roads with worn-away lines, a dashed white centre line, a manhole and drain, patches, or broken up with heaved chunks and a strip gone to dirt;
- junctions with stop lines, or with a pothole;
- sidewalks with tilted and missing slabs.
Each street keeps one marking style along its length, and gets more broken towards the edge of town.
- Overgrowth where it belongs. No weeds on the asphalt itself. They come up thick in potholes, broken road and missing sidewalk slabs, along the gutters here and there, and in overgrown stretches of sidewalk. Verges and lots grow up to the road edges.
- Debris everywhere (Props > Debris): heaps of bricks and boards, split rubbish bags, scattered planks, broken concrete with bent bars, and litter. It's swept into the gutters, blown against buildings, strewn across the lanes and on every floor of damaged buildings.
- Power lines. Telegraph poles line every street outside downtown with four wires between them. The wires sag and sway in the wind. A few have snapped: they hang to the ground and spit sparks, with a flash of light.
- L-shaped buildings: six new buildings (shops, a workshop, apartments, offices, a gutted ruin) with a wing round the back and a yard in the corner. The building generator now works on any footprint of 2 m cells.
- The wilds round the city: rocks, and the dormant mech, out past the edge of town.
Changed
- Zones' plant mask rectangles carry how much grows there (smallest area decides), not just "clear".
[0.001.032] - 2026-10-30
Added
- See inside buildings (the floor cut):
- When you step inside, the floors above yours fade away, and the walls on the camera's side drop to waist height, so you see the room you're in and the stairs up.
- Climbing the stairs moves the cut up a floor, and stepping outside brings the building back.
- Rooms you're in get a little daylight, so they don't sit in pitch darkness under the building's own shadow.
- Switch it in Renderer > Player reveal.
- Weather stays outside. Rain stops at roofs and splashes on whatever is highest (a roof, or the floor under a hole). Ash stays out of buildings. Mist, ground fog and fog banks thin to almost nothing indoors. Holes and collapsed corners still let the weather in. A shelter map, the top of the scenery every 0.5 m, is built with the static scenery.
--start x,y,zputs your player on a chosen spot, for testing.
Fixed
- Line of sight through buildings. Walls, floors and wrecks now block line of sight, so moving things behind them are hidden, and the see-through circle knows when walls hide you.
[0.001.031] - 2026-10-30
Added
- Procedural cities: the test world is now a city block. Every seed lays out a different one:
- a US-style 90 degree grid of roads with junctions, sidewalks and corners;
- back alleys behind deep blocks, with lots fronting the streets;
- taller buildings downtown, and houses, sheds and ruins towards the edges;
- empty lots with fences and junk, and car parks downtown;
- street lamps (a few still lit), traffic lights or stop signs at the junctions, hydrants, bins, benches and bus shelters;
- wrecked cars in the lanes and the odd barricade;
- roads running out of town into the wilds.
Plants keep off the roads and out of the buildings.
- Zone types (World > Zone generation > Zone type): a city block, a small town (houses and a main street) or the wilds as before, or let the seed choose. City and town layout tunes the blocks, how tall downtown is, empty lots, gaps between buildings, wrecks, barricades, lamps and clutter.
- You can walk into buildings. Players now stand on floors, stairs and roofs, and bump into walls, wrecks and street furniture. Steps of up to 0.35 m are walked up, and holes in the floor drop you.
- 37 buildings, bashed from the kit by
tools/buildings/make_buildings.py(Buildings > Single storey, Two storey, Multi storey, Houses, Industrial, Ruins): - corner shops, a diner, workshops;
- shops with flats over them, offices, a bar with balconies;
- apartments with balconies and fire escapes, a tenement, a hotel, office blocks, an eight-storey tower and a gutted concrete frame;
- timber houses with pitched roofs;
- warehouses and sheds;
- burnt-out shells.
Every building has a way in and stairs up to every floor, and flat roofs of two storeys or more have stairs up to the roof. Edit any of them on the prefab stage.
- Players start on the road into town from the west, beside the van.
--asset-view yaw,zoom,sun,hourssets the asset viewer's starting camera and light, for review captures.
Changed
- Static scenery is merged. A building's plain parts, and a city's roads and street furniture, are no longer separate objects. Each machine works them out from the building's or city's seed, and merges them into a few big meshes per 24 m area. A city of about 11,600 pieces draws as about 600 batches, sends one network object per building, and starts in seconds. Before, it was one object per piece, and the game slowed to about 0.6 s a frame copying them all for the network.
- The ruined block was rebuilt by the building generator to the new kit rules.
- Network protocol version 9: the terrain's flat square, cities, ground masks and baked prefabs.
[0.001.030] - 2026-10-30
Added
- Street kit: made in Blender in the same ruined style.
- Roads (Terrain > Roads): straight road, cracked road with a pothole, crossing and junction, asphalt lots and parking bays, and sidewalks with curbs (straight, broken and corner).
- Street furniture (Props > Street): street lamp, traffic lights, stop sign, street sign, telegraph pole, hydrant, bench, bin, dumpster, bus shelter and mailbox.
- Barriers (Props > Barriers): jersey barrier, sawhorse, cone, concrete block, tyres and sandbags.
- Fences (Props > Fences): chain-link and plank fences, whole and broken.
- Wrecks (Vehicles > Wrecks): two rusted sedans and a pickup.
- More building kit:
- Walls: 4 m walls with a shopfront, a garage door or a window, or collapsing; corrugated metal walls; timber clapboard walls and gable ends.
- Roofs: pitched shingle roofs for 6 and 8 m deep houses, whole and holed; water tanks, vents, chimneys and roof hatches.
- Trim: balconies (whole and broken off), fire escapes, shop awnings (whole and torn), air conditioners, drainpipes, sign boards and railings.
- Openings: a garage roller door and a steel shopfront frame.
- Floors: 1 × 1, 1 × 2 and 4 × 4 m slabs.
- New textures: asphalt, paving, road paint, corrugated metal, clapboard, shingles, chain-link and car paint.
- New materials: paint colours for metal, clapboard, shingles, awnings and cars.
Changed
- Kit rules so nothing flickers:
- Walls and columns now stop under the slab above (2.8 m).
- Ledges sit outside the wall face and stand slightly proud of the slab.
- Ground floors sit 0.15 m above the street.
- Stairs fit a 4 m stairwell (0.25 m going).
- Window and door fillers are tagged with the opening they fit (window, door, shopfront, garage), so a window slot never picks a garage door.
Fixed
- Flickering surfaces (z-fighting). The depth buffer is now 32-bit instead of 16-bit. Surfaces a few centimetres apart flickered against each other, most visibly inside buildings.
[0.001.029] - 2026-10-30
Changed
- GitHub's build workflow now runs only when started by hand. Builds and tests run locally before every push, at no cost.
[0.001.028] - 2026-10-30
Added
- The first building kit: ruined concrete (Milestone 2, step 6), after the reference art. Browse it in Tools > Assets > Buildings > Kit:
- Walls: 1, 2 and 4 m; with a window or a door; a collapsed top with rebar; a blasted hole; half height.
- Floors: 2 × 2 m slabs, plain, holed, or with a corner broken away.
- Trim: square, broken and round columns; the slab-edge ledge that bands each storey; a rebar cluster.
- Windows and doors: two rusted steel frames, a boarded-up window, a rotten plank door and a jammed roller shutter. All fit the standard openings, so any of them fits any wall.
- Stairs (one storey) and roof parapets (whole and broken).
- Props > Rubble: a small and a large heap of concrete, slabs, brick and rebar.
- Vegetation > Vines: hanging vines, cut-out cards to drape from ledges.
- Textures and materials: concrete, brick, plaster peeling off brick, rust, wood and vines, as 64×64 pixel art (Textures > Ruin). Shared materials (Materials > Ruin) with variants: walls in plaster over brick, bare brick or dark concrete; painted rust and wood; dry vines.
- The first kit-bashed building: Buildings > Two storey > Ruined block, a 6 × 4 m two-storey block. It has a plaster-and-brick shopfront, a concrete upper floor whose front corner is collapsing, a stairwell, roof parapets, vines and rubble. Windows and doors are picked by seed, and some are missing, so every copy differs. Edit it on the prefab stage (tick Edit).
- New Blender helpers for making models from outlines, boolean cuts, world-aligned UVs and baked grime. The kit's shared shapes are in
tools/blender/ruinkit.py. - The Blender MCP is set up, so Claude can lay kits out in your open Blender for a look.
- Tests: every shipped model and texture must keep the asset rules (budgets, pivots, texture sizes) with no warnings, and the ruined block must find every part.
Changed
- The asset viewer frames large assets such as whole buildings more tightly.
[0.001.027] - 2026-10-30
Fixed
- The Linux build: the prefab stage was missing a standard header (
<cstring>) that the Mac and Windows compilers happened to include anyway.
[0.001.026] - 2026-10-30
Added
- Animation import groundwork (Milestone 2, step 14), ready for the animation system in Milestone 6:
- Skeletons: joints, their hierarchy and rest pose.
- Skinned meshes: which bones move each vertex, and by how much.
- Clips: keyframes per bone, by bone name.
- All of it imports from glTF, in models and in
.anim.glbanimation assets (for example Mixamo clips). - Tools > Assets shows a model's skeleton (with its joint tree) and its clips with their lengths. Animation assets list their clips, with a warning if a file has none.
tools/blender/make_test_rig.pybuilds the test rig.
Changed
- The processed model format is now version 2. Models are processed again once.
- Milestone 2's remaining steps are the content itself (the first building kit, buildings and real models), made with the Blender MCP.
[0.001.025] - 2026-10-30
Added
- Assets as code (Milestone 2, step 6, the tooling). Each model is built by a Blender script beside it, using the helpers in
tools/blender/maxasset.py: - materials, boxes and cylinders standing on their pivot;
- sockets and collision boxes;
- convention checks (pivot, applied transforms, triangle budget);
- export with the game's settings.
python3 tools/blender/build_assets.pyrebuilds every changed asset in background Blender and writes new assets'.metafiles. The running game hot-reloads the results. See docs/ASSETS.md section 5.
[0.001.024] - 2026-10-30
Added
- Hot reload (Milestone 2, step 12). Changes on disk reach the running game within about a second, with no restart:
- Assets: new and changed files are found and processed. Models, textures and materials update wherever they're used.
- Prefabs: a changed prefab is placed again everywhere it's been placed, for every player.
- String tables: reloaded into the running game, in the language you're playing in.
- Shaders: rebuilt with
tools/shaders/build.pywhile the game runs, every pipeline is remade.
Changed
- Development builds read the compiled shaders from
shaders/compiled/(the built-in copies are the fallback). - Making the gameplay code itself reloadable is moved to later (docs/PLAN.md, decisions log).
[0.001.023] - 2026-10-30
Added
- The prefab stage (Milestone 2, step 11). Pick a prefab in Tools > Assets and tick Edit: it's shown alone on the stage, ready to edit.
- Click a part to select it. Drag its arrows to move it along an axis, its centre square to slide it over the ground, and its ring to turn it.
- Snapping: moves snap to 1 m or 0.25 m (the building kit's grid) or not at all; turns snap to 90° or 15°, and R turns by one step.
- Parts: add models, prefabs, a "pick from a category" slot, lights, spot lights, smoke, stand-in shapes and points (sockets). Drag models and prefabs from the asset list onto the parts. Duplicate with Ctrl+D and delete with Del.
- The selected part: name, position, rotation and scale (typed exactly), how often it's there, its paint (any or a set variant), its pick category and tags, and every component's fields (light colour and range, smoke, shape...). Components can be added and removed.
- Undo and redo: Ctrl+Z and Ctrl+Shift+Z.
- Save writes the prefab's file, and Revert throws away unsaved changes. Switching to another prefab saves the one you were editing.
Removed
- The temporary Smoke panel: smoke settings now live in the prefab (edit the Fire barrel's Flame part).
[0.001.022] - 2026-10-30
Added
- Texture painting in the 3D asset view (Milestone 2, step 10). Tick Paint and paint pixel art straight onto a model, in game, for small fixes. The paint lands on the texel under the brush, in whichever texture that surface uses.
- Tools:
- Brush.
- Erase (makes texels transparent).
- Spray (a spray can, with a rate).
- Replace (every texel of the colour you click becomes the brush colour, with a tolerance).
- Pick (takes the colour under the mouse; Alt-click picks with any tool).
- Brush: colour with alpha, size (0.5 = one texel), feather (soft edge) and opacity.
- Mouse: left-drag paints, right-drag turns the view, middle-drag moves it, the wheel zooms.
- Undo and redo: Ctrl+Z and Ctrl+Shift+Z, stroke by stroke.
- You see it live in the game's colour. Each stroke is saved into the texture's PNG, so every model using that texture updates.
[0.001.021] - 2026-10-30
Added
- Prefabs (Milestone 2, step 9). A
.prefab.jsonis a group of parts placed together: models, other prefabs, and any component (lights, smoke, primitives). Format in docs/ASSETS.md. - Variation: a part can pick any model or prefab from a category (and its sub-categories), optionally only ones with given tags; for example, any door from Buildings > Kit > Doors. A part can also be there only some of the time, or use any material variant.
- Every choice comes from the seed the prefab is placed with, so every player gets the same result.
- Problems (a missing asset, nothing to pick from, an unknown component, a prefab inside itself) are warnings in Tools > Assets.
- Tools > Assets lists a prefab's parts and what varies, and shows it in the 3D view with a Seed and a Reroll button to see other copies.
- The test scene's fire barrels and lamp posts are now prefabs (
assets/props/barrels/fire_barrel.prefab.json,assets/props/street/lamp_post.prefab.json). The fire barrel's smoke uses your saved Smoke settings. - Texture painting is planned as Milestone 2 step 10 (requested): paint pixel art straight onto a model in the 3D view.
Changed
- The test scene's golden layout value changed: the barrels and lamps are now placed as prefabs (the same places, a root entity each, part names from the prefab). The network protocol is now version 8.
- Assets are processed after every component type is registered (prefabs name them), and prefabs are processed again whenever the component types change.
- The temporary Smoke panel's saved default no longer changes new worlds (the prefab holds the barrels' smoke).
Fixed
- 64-bit values in data files can be written in hex (
"0x...") as well as decimal.
[0.001.020] - 2026-10-30
Added
- Materials (Milestone 2, step 8). A
.material.jsonfile sets a surface's colour, texture, glow (emissive), alpha test (cut-outs for leaves and fences) and double-sidedness. A Blender material namedrust_metalusesrust_metal.material.json(format in docs/ASSETS.md). - Variants: a material can list other looks (paint colours, rust, dirt). Each placed copy of a model can use a different one, and the 3D view's Variant slider previews them.
- Editing in Tools > Assets: colour, texture (picked from every texture), emissive, alpha test, double sided and the variants. Each edit is saved to the file and every model using it updates.
- A model's details list its materials and which material file each uses.
- Models are drawn with their textures (with mipmaps) and alpha test.
Changed
- A model is rebuilt whenever it, a material it uses or one of their textures changes.
- The network protocol is now version 7 (models have a material variant).
[0.001.019] - 2026-10-30
Added
- PS1 asset rules, checked on import (Milestone 2, step 7). Each class of asset has a budget (docs/ASSETS.md section 8), chosen by its category or named in its
.meta. The budget sets its triangle count and texture size. - Whenever an asset is processed, it's checked against its budget, power-of-two texture sides, the 256-colour palette limit and its pivot.
- Breaking a rule is a warning, not an error: a (!) next to its review status in Tools > Assets, listed in its details and at the top of its review. Warnings are remembered between runs.
- Textures (PNG) are imported and reduced to the game's colour (5 bits a channel, alpha on or off). Tools > Assets shows the original and the in-game version side by side, at whole-number zooms with crisp texels.
- Each asset's details show its budget.
Changed
- Changing an asset's category, pivot or budget re-checks it, even if its file hasn't changed.
[0.001.018] - 2026-10-30
Added
- Asset reviews (Milestone 2, step 5). Each asset in Tools > Assets has a Review tab.
- Status: New, Needs changes, Changed or Approved, with Approve and Needs changes buttons. An approved asset whose file changes later comes back as Changed.
- Comments: each shows who wrote it, when, and whether it's about an earlier version.
- 3D pins: Place a pin, then click the model. A numbered pin goes there and remembers the camera view, and your next comment is about it. Clicking a pin shows the model from where it was placed. Tick a pin off when it's dealt with.
- Review queue: shows only what's waiting for you (new or changed). Approve or Needs changes moves on to the next, and the arrows step through.
- The list has a Review column, and your name is remembered.
- Everything is saved in a
.review.jsonbeside the asset (format indocs/ASSETS.md), where Claude reads it, makes the changes and replies.
[0.001.017] - 2026-10-30
Added
- 3D asset viewer (Milestone 2, step 4). Pick a model in Tools > Assets and it's shown in 3D instead of the game, which keeps running behind it.
- It stands on a floor grid with 1 m squares and faint lines every 0.25 m, next to a 1.8 m figure for scale.
- Mouse: left-drag to turn around it, right-drag to move sideways, the wheel to zoom, double-click (or Frame) to frame it again.
- Game look or clean view: exactly how it looks in game (low resolution, PS1 wobble, your colour, dither and CRT), or sharp and clean for judging shape and detail.
- Lighting:
- the game's own time of day with its fog (Dawn, Day, Dusk and Night shortcuts, or any time);
- a neutral studio;
- night with a torch that follows the camera and a warm lamp.
- Sun direction swings the sun around the model, and Spin turns it on its own.
- Closing the panel or hiding the editor (F1) goes back to the game.
- Models can now be drawn in the world (a new
Modelcomponent), with their materials and vertex colours. The network protocol is now version 6. --open-asset <path>opens Tools > Assets with that asset selected.
Changed
- The game camera ignores the mouse and sticks while the asset viewer is up, and the control hints are hidden over it.
- Tools > Assets now opens down the right-hand side of the screen.
[0.001.016] - 2026-10-30
Added
- Model import (Milestone 2, step 3). glTF models (
.glb, what Blender exports) are read and turned into the game's own model format. That covers meshes, materials, vertex colours, UVs, and objects parented to each other. - Collision shapes are named
UCX_...in Blender and are never drawn. - Attachment points are empties named
socket_...in Blender. - Pivot check: each model is checked against its pivot rule, bottom centre by default. Building kit parts are checked against their corner, and a
.metafile can name another rule. - Model details in Tools > Assets: a selected model shows its size in metres, triangles, meshes, materials, sockets, collision and whether its pivot is right. Problems from importing show in the panel (and the log), not just the log.
tools/blender/make_test_model.pybuilds the test model in Blender, run in the background.- New dependency: cgltf
v1.14(glTF reader).
Changed
- Each asset processor has a version. Changing one re-processes every asset of that type.
[0.001.015] - 2026-10-30
Added
- Asset conventions (Milestone 2, step 2), in
docs/ASSETS.md: - 1 unit = 1 metre, and pivots at the bottom centre unless an asset needs otherwise.
- Reference sizes, and the building kit: a 1 m grid, 3 m storeys, 0.2 m walls, and standard door and window openings, so any door fits any doorway.
- First triangle and texture budgets, how reviews work, and how prefabs vary (slots that pick from a category by seed, optional parts, material variants).
- Standard categories: Characters, Creatures, Vehicles, Weapons, Items, Props (Barrels, Crates, Street, Furniture, Junk), Buildings (Kit: Walls, Floors, Roofs, Doors, Windows, Stairs, Trim; Single storey; Two storey), Vegetation, Terrain, Effects, Textures, Materials, Audio, UI, Data. Each folder has a README saying what goes in it.
- Tools > Assets shows empty categories too, and New category adds one inside the selected category.
Changed
- A category folder's README title sets how it's shown, so
uishows as "UI". - Milestone 2's plan is reshaped around reviewing assets: the 3D viewer with lighting scenarios and reviews (comments and 3D pins) come next. Prefabs get their own editing stage, and hand placement in the game world is dropped, because the game places everything procedurally.
[0.001.014] - 2026-10-30
Added
- Asset database (Milestone 2, step 1). Every asset now has a stable ID, a type, a name, a category and tags.
- Categories are folders, as deep as you like:
assets/props/barrels/barrel_2.glbshows as Props > Barrels > "Barrel 2". Names are capitalised with spaces and sorted naturally, so Barrel 2 comes before Barrel 10. - Each asset has a small
.metafile beside it holding its ID, so moving or renaming it keeps its identity. The.metacan also rename it, file it under another category, or give it tags. A copied asset gets its own new ID automatically. - Assets are processed into a game-ready (cooked) copy in a cache beside the build, and only what changed is redone.
- Tools > Assets panel: the category tree with counts, search across names, categories, paths and tags, a filter by type, each asset's details, and a Rescan button.
--asset-dir <dir>reads assets from another folder.
Changed
- The string tables are now assets too (Localisation category), and
tools/loc/loc.py newwrites the sidecar for a new language.
[0.001.013] - 2026-10-30
Changed
- Docs brought up to date for Milestone 2: the plan's technology table now shows what's in use and what arrives with which milestone, the module layout and rendering notes match what's built, and Milestone 2 is marked in progress. The README covers the release build, aiming, the panel menus and the new capture options.
[0.001.012] - 2026-10-30
Fixed
- Shimmer when the camera moves slowly (zoomed out especially). The camera drifted a fraction of a low-res pixel each frame, so every edge, texel and snapped vertex flickered between neighbouring pixels.
- Stable camera (Renderer panel, Stability, on by default): the world is drawn with the camera moved only in whole low-res pixels, and the picture is slid by the leftover fraction when it is scaled up to the screen. Motion stays smooth, and what's drawn stays put. Turning and zooming still move the picture, on purpose.
- The dither patterns (colour depth, ambient occlusion, fog, line-of-sight edges, player reveal) now move with the world as the camera steps, instead of staying fixed to the screen while the picture moves under them.
- Sun shadows crawled whenever the camera moved: the shadow map was meant to stay on whole texels, but the snap measured the wrong point and never moved it. Tree, wall and dappled grass shadows now hold still.
- Texture mipmaps (on by default): distant textures use smaller copies of themselves, so their texels stop sparkling. Close up they stay just as hard. Turn it off for the raw PS1 sparkle.
- Measured on a slow pan at full zoom out, the change caused by motion is about two-thirds lower.
Added
--capture-count <n>saves n frames in a row (shot_000.png,shot_001.png...), for checking motion.
[0.001.011] - 2026-10-30
Added
- Zoom clarity (Renderer panel). Zoomed far out, the dither, film grain, ambient occlusion and dense grass turned into flickering sub-pixel noise.
- As you zoom out, those effects now ease back gradually, so the scene reads clearly at full zoom. The CRT, colour depth and pixel look are unchanged at every zoom.
- Clarity starts at zoom: where the easing begins (default a quarter of the way out).
- Each effect has its own reduction at full zoom out: less dither and grain (70%), less ambient occlusion (60%) and thinner grass (60% of clumps left out, which also draws faster).
- The panel shows how far the easing is right now.
[0.001.010] - 2026-10-30
Fixed
- Shadows that swung round as the player moved. They came from the line of sight, not from any light: each tree and bush left a darker wedge behind it, fanning out from the player's eye (trees counted their whole branch spread), so it looked like the player was carrying a huge lamp.
- Trees and bushes no longer block sight by default. Walls, rocks, vehicles and hills still do.
Added
- Line of sight: Trees and bushes block sight, to bring the old behaviour back.
[0.001.009] - 2026-10-30
Added
- Ambient occlusion (Renderer panel, "Ambient occlusion and grass shadows"). It darkens creases, corners, the ground under and between grass, and where things meet the ground.
- Three modes: Off, SSAO (test points in a hemisphere around each spot) and Horizon-based (GTAO-style) (traces outwards for how high the surroundings rise; cleaner, the default).
- Radius, strength and sample count are adjustable.
- It's worked out from the scene's depth at the internal resolution, with an ordered dither instead of a blur (the PS1 look), and applied before the fog so the air isn't darkened.
- Grass sun shadows: grass near the camera casts shadows from the sun and moon. A share setting decides how many clumps cast (15% by default), giving dappled light through the grass instead of a solid blanket, which with grass this dense turned the ground almost black.
- Grass root shade: blades darken towards the ground where they shade each other, so dense grass has depth. Almost free.
- Cost on the development Mac: within measurement noise.
[0.001.008] - 2026-10-30
Fixed
- Line of sight: moving things out of sight (the drifting globes now, later enemies and other players) were hidden, but their shadows still showed on the ground and their own lights still glowed, giving them away.
- Out of sight, they now cast no shadows (sun, lamps or torch) and their lights go out, on this client only, until you can see them again.
- Each frame there's a quick check per moving thing (range, view cone, and rays against walls, rocks, trees and hills).
- In plain view, nothing changes.
- The Renderer panel's player reveal section shows how many moving things are out of sight.
[0.001.007] - 2026-10-30
Changed
- Your saved settings are now the built-in defaults, so the game looks right out of the box with no saved settings. Saving, configs and defaults still work as before.
- Post: contrast 1.064, saturation 0.675, dither 2, scanlines 0.537, mask 0.896, no curvature, bloom 0.828, halation 0.28, grain 0.265, vignette 0.456.
- Renderer: 480p internal resolution, 48 light bands.
- Lighting & fog: light scattering 0.5, forward glow 0.463.
- Environment: starts at 16:10 with a 63-minute day; wind 1.7 m/s with gusts 0.165; dust and debris off.
- Vegetation: grass 257 per 100 m2 (sizes up to 2.02), bushes 2.2, trees 0.48, patchiness 0.6; sway 4.06, 0.88 and 0.27.
- Water: fill dips below -1.2 m, max depth 0.99 m, max radius 33 m, clarity 0.27, reflectivity 1.03, reflection reach 3 m, ripples 0.83, wave scale 1.05, shoreline 0.06, sun glint 0.17, light glint 0.4, glint sharpness 529, ripple pixel 0.1 m with 1 step, heave 0.026 m over 8.8 m, pushed by objects 0.15 m.
- Smoke: fade out 8.
- The vegetation and water golden values were updated on purpose: with the new defaults, worlds have different plants and pools. The scene layout golden is unchanged.
[0.001.006] - 2026-10-30
Added
- Line of sight (experimental; Runtime > Line of sight, with config slots).
- You see what your player's eyes can see. Walls, rocks, the van, trees, bushes and hills block the view, worked out from the player's eye with the same shadow tiles lamps use.
- In sight: looks normal.
- Seen before, not now: a dim, greyed memory of how it looked (an explored map over the whole zone remembers where you've been).
- Never seen: near black.
- The edge between seen and unseen is a soft gradient over a distance you set.
- Moving things (other players, drifters, later creatures) only show while you can see them, dithering away as they leave your view.
- Settings: range, view cone (360 by default, or narrower and centred on where you face or aim), always-seen radius, eye height, edge softness, memory brightness and colour, unexplored brightness, remember seen places, hide moving things, and "Forget explored places".
- It applies over everything drawn: fog, water, rain and particles included.
- Presentation on this client for now: each player has their own view. The server will also stop sending players what they can't see with real networking (Milestone 5).
- Cost on the development Mac: about 1 ms per frame.
[0.001.005] - 2026-10-30
Added
- Help in the editor.
- Every panel starts with (?) How this panel works: hover it for what the panel is for, what each section does, and whether its settings change the world for everyone or only how your computer draws it.
- Every control has hover help saying what it does and how changing it looks: about 170 controls across Renderer, Post, Camera, Environment, Lighting & fog, Vegetation, Water, Zone generation, Smoke, the World inspector, Stats and Localisation.
- The config bar's slots, Save, Load and Built-in buttons and the Max menu's world and layout items explain themselves too.
Changed
- Roadmap reworked (
docs/PLAN.md): - Milestone 2 "Pipeline": all about assets and the art pipeline. Asset database, conventions, the Blender add-on with headless export and MCP, glTF import, PS1 asset rules enforced on import, materials, hot reload of everything, an asset browser, prefabs, placement with saving, and the first real models and building.
- Milestone 3 "Lay of the Land": the world map, generation rules as data, biomes and biome blending, terrain v2, roads, clearing masks for plants, points of interest and settlements, spawn points, zone travel and generation tools.
- Physics, networking, animation and audio, and runs move to Milestones 4-7.
[0.001.004] - 2026-10-30
Fixed
- Sunset light vanished when the camera turned away from the sun. The fog scattered sunlight almost only forwards: it was about 18 times brighter looking into the sun than away. Turned away, the mist barely lit up but still dimmed everything behind it.
- Sunlit fog is now part even in every direction, part glow towards the sun, so the scene and its shafts stay lit whichever way you face. Looking into the sun is now about 3 times brighter.
Added
- Lighting & fog: Glow towards sun (0 = the fog is lit the same from every side, 1 = the old behaviour: only when looking into the sun). Default 0.35.
[0.001.003] - 2026-10-30
Added
- Light shafts. Each phase of the day now sets how the volumetric fog catches the light:
- Low mist: a layer hugging the ground (its height is in the fog settings) for shadows to carve. Trees, ruins, the van and the terrain cast long shafts and shadow lanes through it as the sun rises and sets.
- Sun shafts: how brightly the sun or moon lights the fog.
- Sky light in fog: lower means darker shadows between the shafts, so more contrast.
- Defaults bring mist and stronger shafts at dawn and dusk, a little at night, and none at midday. Tune them in Lighting & fog under each phase.
- Per-light fog strength (
Light::fogStrength): how strongly a light shows in fog and smoke. - Street lights now throw strong beams (2.5), fires glow through the mist (1.5) and the torch beam shows a little more (1.3).
- Any light can be set in the World inspector.
Changed
- Sun scattering and sky light in the fog moved from the fog settings into each phase. Saved Atmosphere files keep everything else.
- Low mist and ground fog share one terrain lookup per fog step, and skip it entirely above the highest ground.
- Cost on the development Mac: about 1-2 ms GPU time at dawn and dusk when the mist is on (noisy measurements), nothing at midday.
[0.001.002] - 2026-10-30
Added
- Zone sizes. Zones are generated on a square, small, medium or large, by global zone rules (World > Zone generation, with config slots; saved as the "Zones" default).
- Each size sets its side length (defaults 160 m, 256 m and 512 m), hill height and width, and prop density (rocks, ruins and lamps scale with the area).
- Also set: the default size, and metres per terrain cell (the mesh caps at 512 cells a side).
- Choosing a size: Max > New world now offers a small, medium or large zone with a fresh seed, and each size in the Zone generation panel has its own generate button. Regenerate keeps the current size.
- The zone size travels with the seed in the regenerate request (protocol version 5), and the server validates it.
Changed
- Vegetation covers the whole zone square, not a circle: the Vegetation panel's radius no longer limits generated worlds (
Vegetation::squareHalfSize). Clearing plants for roads and buildings will come as generation rules. - Medium is the M1 test world exactly, so existing seeds and the scene golden value are unchanged.
- Cost on the development Mac: a large zone with dense saved vegetation (about 414,000 plants) runs at the same frame rate as medium, since only nearby grass is drawn.
[0.001.001] - 2026-10-30
Added
- Camera panel (Rendering menu), with its own config slots:
- Zoom limits: closest and farthest distance (wider ranges than before: 2-80 m and 20-600 m).
- Camera angle: how far down it looks when closest and when farthest (it blends between them as you zoom), and the field of view.
- Feel: rotate, mouse-rotate, zoom and wheel speeds, smoothing and auto-orbit.
- Where the camera is right now: distance, angle, yaw and zoom.
Changed
- The camera controls left the Renderer panel. A camera saved with the Renderer still loads; save it from the Camera panel from now on.
[0.001.000] - 2026-10-30
Milestone 1, "First Light", is complete.
Added
- Milestone 1 step 11, localisation core:
- String tables:
assets/loc/<locale>.json, English the source with a translator note per string. Shipped: English, French, German and Spanish. loc::text(key, args): named arguments ({name}), plurals by each language's rules ({count, plural, one {# scrap} other {# scraps}}), and button tokens ({btn:Torch}shows[F],Y,TRIANGLE... for the device in use).- Stale detection: each translation remembers which English it was made from. When the English changes, the game falls back to English and flags the string until it's translated again.
- Translator round trip:
python3 tools/loc/loc.py export frwrites a spreadsheet (key, note, English, translation, status) to send out;import fr fr.csvbrings it back;statusshows each language's progress. - Language choice: Max > Language (saved with your settings, never sent: every player reads their own).
- Pseudo-locale (
qps): accents, pads (about 40%) and brackets every string, so text that skips the tables, or gets clipped, stands out. - Pixel font for player text: for now ProggyClean, the pixel font Dear ImGui ships (MIT), drawn at whole multiples so glyphs stay crisp squares (Latin-1).
- Tools > Localisation panel: every language's translated, missing and stale counts, and every string as it reads.
- Player-facing text now goes through the tables: the corner caption, the window title, and new control tips shown for the first few seconds of play.
- Tests: arguments, plurals (English and French rules), button tokens, fallback, stale and missing detection, pseudo-locale, the C++ and Python hashes agreeing, and every shipped language complete.
[0.000.045] - 2026-10-30
Changed
docs/PLAN.mdnow tracks progress:- Milestone 1's steps are marked done with the version that finished each (1-10 and 12 done; step 11, localisation, is next).
- A new list records the features built beyond the original steps.
CLAUDE.md: the plan is updated with every change, alongside the changelog.
[0.000.044] - 2026-10-30
Added
- Milestone 1 step 10, edit overlay: every look parameter already had a live control (checked against the Renderer and Post settings).
- Remembered layout: where each panel is, its size, and which panels are open are now saved in
EditorLayout.iniin yourCodename Max Settingsfolder, and restored next launch. - Screenshot, benchmark and overlay runs read it but never save it, so scripted runs can't disturb your layout.
- Max menu:
- New world (fresh seed) and Regenerate this world, with the current seed shown, without opening the World inspector.
- Close tuning panels: everything but the runtime panels.
- Reset layout: back to Stats and Environment, every window in its first place.
[0.000.043] - 2026-10-30
Fixed
- Frame rate with dense vegetation (34 fps on the development Mac with a saved Vegetation default of about 570,000 plants). Two features walked every plant every frame just to find the bushes and trees: the player reveal's line-of-sight test and the server's player collision.
- Bushes and trees are now kept in their own cached list (
solidPlantsOf), and the reveal only checks the ones near the line from the camera to the player. - Debug build with those settings: about 38 ms per frame before, about 7 ms after.
Changed
- Your copy now builds and plays the optimised build.
tools/sync/update-local.shbuilds thereleasepreset (it was the unoptimiseddevdebug build), and the Desktop launcher (tools/mac/make-launcher.sh, re-run once) startsbuild/release/bin/max. The debug build stays for development.
[0.000.042] - 2026-10-30
Changed
- Smooth grass pushing. Plants are now pushed through a foliage push map: 128 x 128 half-metre texels around the camera's focus, anchored to the world.
- Each frame, everything solid in the plants stamps into it. It eases in over about a tenth of a second, and relaxes back over about a second once things have moved on.
- The grass now bends smoothly as you arrive, springs back behind you, and leaves a soft, continuous trail, instead of snapping to each new position with trail points popping in every 40 cm.
- It now handles up to 64 pushing objects (from 32), and things up off the ground (on a roof, in the air) no longer push the grass under them.
- Shockwaves are unchanged (
addFoliageImpulse).
[0.000.041] - 2026-10-30
Added
- Foliage gets out of the way:
- Pushed aside: grass, bushes (and, a little, trees) bend away from anything solid standing or moving among them, the player included. Tops bend most and roots stay put.
- Trails: moving things leave a short trail of flattened grass that springs back over about a second.
- Up to 32 pushers at once: moving things nearest the camera's focus first, then the nearest.
- Renderer panel: Pushed by objects strength.
- Shockwaves through the plants:
SceneRenderer::addFoliageImpulse(position, strength, radius)sends a ring racing outwards that flattens what it passes, which then springs back, wobbling as it settles. Up to 8 at once. - It's the hook for explosions and grenades: those will be gameplay events from the server, and each client will call it.
- To test it now: Vegetation panel, Shockwave at player (with strength and radius).
- All of it is cosmetic and computed per plant in the vegetation vertex shader, so it costs nothing on the network.
[0.000.040] - 2026-10-30
Changed
- The player reveal now only appears when the player is mostly hidden: 75% by default (Reveal when hidden in the Renderer panel). Each frame, rays from the camera to twelve points over the player are tested against objects, the terrain, bushes and tree trunks.
- The reveal fades in and out over about a tenth of a second, and stays on until you're clearly visible again, so it doesn't flicker at the threshold.
- The panel shows how much of the player is hidden and how strong the reveal is.
Fixed
- The reveal cut into the player's own model: their head and shoulders are nearer the camera than the middle of their body. The player is now never cut.
[0.000.039] - 2026-10-30
Added
- See the player through objects. Inside a circle around your player on screen, anything nearer the camera than the player and standing above their feet is dithered away: walls, the van, trees, tall grass and hills in front of you. It's solid in the middle and thins out with an ordered dither towards the edge, in keeping with the PS1 look. The ground around you stays solid.
- Presentation only, on this client: other players never see your cut-outs.
- Renderer panel, Player reveal: on/off, radius (1.8 m default) and soft edge (saved with the Renderer configs).
- Plan: how this extends to buildings with several floors (a per-building floor cut that hides the floors above you and cuts down the near walls while you're inside), to be built with the first real building in Milestone 2.
[0.000.038] - 2026-10-29
Added
- Water displacement (the surface itself moves, not just its shading):
- Gentle heave: the surface rises and falls a few centimetres in place, with no travelling waves, so the waterline creeps in and out along every shore.
- Pushed by objects: anything in a pool (players, or anything else) raises a mound where it is, and its wake rings lift the surface as they spread. Something standing still in the water keeps sending out a soft ring every so often, so it keeps pushing the surface.
- The water mesh is split into 50 cm cells (from 2 m) so the surface bends smoothly.
- Water panel, Displacement: gentle heave height, heave size, and how far objects push the surface.
[0.000.037] - 2026-10-29
Changed
- Livelier water:
- Gentle ripples all the time, even in still air: the chop always drifts, wind makes it stronger, and a slow swell underneath keeps still water breathing.
- Refraction: the bottom seen through the water (taken from the scene drawn before it) is bent by the ripples and fades into the deep colour with depth. Clarity now defaults to 0.6 m.
- Reflection distortion: the ripples break up and wobble the reflections, so a pool no longer reads as a mirror in the landscape.
- Water panel: Refraction and Reflection distortion sliders.
Fixed
- Ripple shading steps were coarser than gentle ripples, so most of the surface rounded off to dead flat. The steps are now fine enough for them to survive.
[0.000.036] - 2026-10-29
Added
- Water reflects the world, not just the sky. The reflected view ray is traced through the scene already drawn this frame (screen-space reflections), so the player, bank grass, rocks and lamps show in the water, rippled by its surface. Where the ray leaves the screen or finds nothing, it falls back to the sky.
- From the high camera, a still pool mostly mirrors the sky, as a real one does: upright things reflect right at their base, and the bank's grass along the far shore.
- Only frames with a pool on screen pay for it (one copy of the low-res scene), within measurement noise on the development Mac.
- Water panel:
- Reflectivity now goes up to a mirror (about 2.5; default 1.0, stronger than before).
- Reflection reach, how far the reflections look.
- Ripple pixel size and Ripple steps.
Changed
- Pixel-art ripples: the surface pattern (chop, rain rings, wakes, sparkles) is now worked out per world-space texel, 12 cm by default, and its shading is stepped. The ripples look chunky like the rest of the game instead of smooth.
[0.000.035] - 2026-10-29
Added
--settings-overlay <folder>: settings files there are applied on top of your saved settings when loading, field by field, and never written. Screenshots and test runs now start from exactly what you see (your Post, CRT, Renderer and Atmosphere settings) and change only what the scenario needs, such as the time of day.
Changed
- Your saved settings stay in
Codename Max Settingson the Desktop: every build and every working copy finds them there, and saving from the game doesn't leave the project with uncommitted changes (which would stop your copy updating).
[0.000.034] - 2026-10-29
Added
- Water panel, Light on the water: sun glint, light glint (lamps, fires, torches), glint sharpness, and sunlight on the water body.
Fixed
- With the sun lined up with the camera, a pool could turn into a flat white sheet. Glints were several times full brightness across the whole surface, then multiplied again for sparkles. Now:
- the sun glint defaults much lower and is tighter;
- the smooth part of any glint is capped low;
- only individual sparkling facets flare bright.
[0.000.033] - 2026-10-29
Fixed
- Rain splashes moved with the camera: they were placed around its focus. They now land at world-anchored spots, like everything else.
- Rain streaks and ash rose and fell with the camera's focus as you walked up and down slopes. Their fall is now wrapped through a box anchored to the world vertically too.
- Every particle (rain, splashes, dust, ash, debris, smoke, fog patches) now lives in world space; only the box they're drawn in follows the view.
[0.000.032] - 2026-10-29
Added
- Water pools. The terrain's dips fill with small pools, never deeper than waist height.
- Found at level generation: every dip whose bottom is below a set height is flooded to the deepest level (up to the maximum depth) that stays inside its rim. Valleys too wide to be pools are skipped, and dips whose water would join merge at the higher level.
- Each pool's surface covers only the terrain cells around it.
- Like the terrain and vegetation, only the parameters replicate, and every peer finds the same pools (golden-tested). Nothing grows under the water.
- Water shader. The surface is flat (no mesh waves); everything that moves is in its normals:
- a soft edge with a pale shoreline;
- clear shallows (the depth comes from the terrain heightmap) and darker deep water;
- sky reflection, stronger at grazing angles;
- sharp glints and twinkling sparkles from the sun and every lamp, fire and torch, through their shadows;
- a drifting chop that travels with the wind.
- Rain rings on the water, more and quicker the heavier the rain.
- Wakes: anything moving through a pool (players, or any other object) leaves a trail of spreading rings. They're drawn locally (cosmetic), from where things are drawn.
- Water panel (World menu), with config slots:
- Pools: on/off, fill dips below, max depth, max radius, min area, and the pool count.
- Look: deep colour, clarity, reflectivity, ripples, wave scale, rain rings, sparkle and shoreline width.
Changed
- Dust motes are sparser and subtler: there were too many bright specks at dusk.
- The scene layout golden value was updated for the new water entity. The test world itself is unchanged apart from pools and the plants under them.
- Cost on the development Mac: within measurement noise (about 5 ms GPU time with or without water).
[0.000.031] - 2026-10-29
Added
- Aiming. Hold the left trigger (gamepad) or Ctrl (keyboard) to aim, moving or standing still:
- Gamepad: the right stick aims, relative to the camera. Centred, it keeps the way you already face. While aiming it no longer turns or zooms the camera; let go and it does again.
- Mouse: you face the point on the ground under the cursor.
- The player and their torch face the aim while you walk any direction.
- The aim is part of
PlayerInput(protocol version 4): a world-space direction the server validates (finite, normalised, ignored when zero) before turning the player, so every player sees where everyone aims.
Changed
- Sprint on the gamepad is now L3 only (the left trigger aims). Shift still sprints.
[0.000.030] - 2026-10-29
Added
- Day/night cycle. A shared clock (
TimeOfDay, world state) drives the sun across the sky from the sunrise direction to the opposite horizon. The moon takes the same path through the night, so the light never jumps round. - Only edits replicate: the time is worked out from the server clock, so a running day costs no network traffic and every player's sun moves smoothly.
- Defaults: 16:00, running, a 24-minute day.
- Phases of the day. Sun colour, intensity, ambient and sky/fog colour are now set per phase (night, dawn, day, dusk), each with its own hour and a "hold" (how long it stays fully that phase). The lighting blends smoothly between them, and the light fades out as the sun or moon reaches the horizon.
- Environment panel (runtime, open by default), with config slots:
- time of day as a clock and slider, day/night cycle on/off, and day length;
- wind, rain, ground fog, fog patches, and the particle toggles.
- Its saved default (time and weather) is what new worlds start with.
- Lighting & fog panel (World menu), replacing the Atmosphere panel:
- the current blend (the time, sun or moon position, and colour swatches);
- a rollout for each phase;
- the sun and moon path (sunrise direction, noon sun height, moon height);
- all the fog settings.
- Panel menus. Every panel is now listed in the menu bar under Runtime (Stats, Environment), World (World inspector, Lighting & fog, Vegetation, Smoke) or Rendering (Renderer, Post), and toggled there. Only Stats and Environment open at start.
- Reflection can describe fields of nested structs (
field("day.ambient", &Atmosphere::day, &DayPhase::ambient)), flattened into named fields on the wire and in files.
Changed
Atmosphereno longer has fixed sun azimuth, elevation, colour, intensity, ambient or fog colour; they come from the phases and the time. Saved Atmosphere files keep their fog settings but not those values.- Saved weather now lives in the Environment config. Older Atmosphere files still supply the weather if there's no saved Environment default.
[0.000.029] - 2026-10-29
Added
- Ambient particles, each toggled under Weather in the Atmosphere panel:
- Dust motes (on by default): specks hanging in the air and drifting lazily on the wind. They glitter where sunlight, a lamp or the torch catches them and almost vanish in shade.
- Ash (off by default): pale flakes settling slowly, carried and fluttering on the wind.
- Debris (on by default): scraps and dry leaves skittering and tumbling along the ground. The stronger the wind, the more they hop; in still air they stay put.
- Which kinds are present is shared weather. The particles themselves are computed entirely on the GPU from the server clock, like the rain: no buffers, no simulation, nothing sent.
- In the Renderer panel (this client only): particles on/off and an amount multiplier. Each particle is drawn at least about a pixel across, so they survive the low internal resolution.
Changed
- Cost on the development Mac: about +0.3 ms GPU time with dust and debris on.
[0.000.028] - 2026-10-29
Added
- Fog patches: a new weather setting, separate from ground fog: none, light, medium or heavy. Big, soft, flattened patches of thick fog lie on the terrain with clear ground between them. Each one drifts downwind, churns as it rolls along, fades in and thins away.
- They're real volumes in the volumetric pass, so trees and players stand inside them, and lamps, fires and the torch light them up.
- Live controls in the Atmosphere panel: patch density, size and glow (how brightly they catch the sun).
- Stateless: every patch is a hash of its index and the server clock, so nothing is simulated or sent, and every player sees the same patches.
- Medium ground fog, between light and heavy.
Fixed
- Dead trees and bushes now cast shadows from the torch, lamps and fires, as well as the sun, including through the volumetric fog. Grass still doesn't.
- The torch beam shimmered in dense fog, especially over grass. The fog pass took its steps as a fraction of each ray's length, so swaying grass moved every sample. Steps now sit at fixed distances from the camera, with finer steps close to each light, where its glow changes fastest.
Changed
- Saved
groundFog: 2(heavy) now loads as medium; set heavy again if you saved it. - Cost on the development Mac (release build, GPU time, best of several runs): about 5 ms per frame for the default scene, as before. Heavy fog patches cost about the same.
[0.000.027] - 2026-10-29
Added
- Vegetation panel (edit overlay, collapsed at the top right), with the usual config slots:
- Amount: grass density (logarithmic, up to 500 clumps per 100 m2), bush and tree density, patchiness, radius, and clearing around the start area.
- Size: min-max ranges for grass, bushes and trees.
- Wind sway: how far the wind bends each kind.
- Colour: for each kind, plus "New layout" to reseed.
- This client: total plants by kind, plants drawn and draw calls, vegetation on/off, and grass draw distance (saved with the Renderer configs).
- Vegetation is world state, so panel changes go to the server and every player. The saved Vegetation default is what new worlds start with, each with its own seed.
Vegetationgains per-kind size ranges and sway strengths (previously fixed in code).
Changed
- Much denser grass by default: 90 clumps per 100 m2 (was 28) and less patchy, about 25,000 plants in the test scene. Grass is also a little larger.
- Cost on the development Mac (release build, GPU time, best of three runs): the default vegetation is within measurement noise; grass at 300 per 100 m2 (about 83,000 plants) adds about 1.6 ms.
- The vegetation golden value was updated for the new defaults.
[0.000.026] - 2026-10-29
Added
- Rain: none, light, medium or heavy (Atmosphere panel, Weather). Up to 12,000 streaks plus splashes.
- Streaks fall at an angle with the wind field and are lit by the sun, ambient and every point and spot light through their shadows, so rain sparkles in lamp light and the torch beam. They're hidden behind walls and drawn under the fog.
- Splashes: droplets burst up and out of the ground where rain lands.
- Wet surfaces darken a little as rain gets heavier.
- Computed entirely on the GPU from the drop index and the server clock: no buffers, no simulation, world-anchored around the camera.
- Ground fog: none, light or heavy. Low fog banks hug the terrain and thin out above it, rolling along with the zone's wind. It's part of the volumetric fog, so every light scatters through it. It needs volumetric fog switched on.
- Rain and ground fog levels are shared
Weatherworld state: everyone has the same weather, but the drops and swirls are drawn locally. The levels save with the Atmosphere configs. - A terrain heightmap texture, so shaders know where the ground is (splashes, ground fog).
- Renderer panel stats: rain drop count.
[0.000.025] - 2026-10-29
Added
- Vegetation: about 6,400 plants in this scene, scattered over the terrain in patches. Dry straw-coloured grass tufts, lumpy low-poly bushes, and a few bare dead trees with forked branches, four mesh variants each, varied in size, heading and tint.
- Synced by seed: like the terrain, only a
Vegetationcomponent (seed, densities, colours) is replicated, and every peer scatters identical plants from it (golden-tested). The server uses the same scatter, so dead trees block players; grass and bushes are walked through. The start area is kept clear of bushes and trees. - Wind: plants bend in the shared wind field (the same one the smoke uses). Grass sways the most, bushes a little, trees barely, with a flutter so gusts ripple through.
- Drawing: instanced, one draw per mesh and 24 m chunk, culled against the view and by distance. Grass shrinks away towards a fade distance (Renderer panel: Grass distance, 70 m from the camera's focus). Trees and bushes cast sun shadows; grass doesn't, for cost. Lit like everything else, including the torch and lamps. In this test scene it costs within measurement noise.
- New pixel-art textures: bark and foliage.
- Renderer panel: vegetation on/off, grass distance, and a plant count. Densities, patchiness and colours are editable on the
vegetationentity in the World inspector. - Tests: the scatter is identical across runs and platforms (golden), the start area stays clear, there's more grass than bushes and more bushes than trees, and dead trees block players.
Changed
- The test scene's golden layout value was updated for the new vegetation entity.
[0.000.024] - 2026-10-29
Added
- The player carries a torch: a warm spot light held at chest height, aimed where they face and slightly down, with shadows like every light. It shows in the volumetric fog too. The server moves it with the player, so everyone sees each other's torches.
- F (or the gamepad's top face button) switches it on and off. The on/off state travels with the player's controls (protocol:
PlayerInputbutton bit 1). Switched-off lights cost nothing: no lighting, no shadow tiles. - Test: the torch follows and aims with the player, switches off, and leaves with them.
[0.000.023] - 2026-10-29
Added
- Milestone 1, step 9: a seeded test scene you can walk around.
- Rolling terrain generated from the seed (new
Terraincomponent). Only its parameters are replicated; the server and every client compute identical heights (integer-hashed value noise, golden-tested on every platform). Flat around the start, hills beyond. Drawn as a 128 x 128 smooth-shaded mesh that casts and receives sun shadows, and rebuilt only when its parameters change. - Rocks, ruins, fire barrels, lamps and drifters now stand on the terrain, and the drifters hover over it as they move. The start area is kept clear.
- Placeholder van (the player's base) parked at the start: body, cab, roof rack, wheels and a headlight. Placeholder mech, about 7 m tall, out on the plain: legs, hips, torso, arms with guns, and a glowing red eye. Both are made of primitives; prefabs replace them in Milestone 2.
- A capsule player you can walk around, the first exact-sync gameplay.
- The server spawns a player for each client that joins (and respawns everyone after Regenerate) and removes it when they leave.
- The client sends its controls every tick (new
PlayerInputmessage, protocol version 3): a camera-relative direction turned into a world direction, plus sprint. The server clamps and validates it. - The server moves the player: walk 4.5 m/s, sprint 8 m/s, terrain following, and sliding collision against rocks, walls, barrels, poles, the van and the mech. Small obstacles are stepped over.
- The camera follows your player smoothly. Middle-drag looks around; Home resets.
- Input actions:
Move(WASD/arrows, left stick) andSprint(Shift, left trigger or left stick click). Camera panning is now middle-drag only. - Module hooks
serverClientJoinedandserverClientLeft. - Tests: terrain determinism and golden height, player movement and terrain following, sliding along walls, server spawn and input over loopback, and input validation.
Fixed
- Moire rings at the edges of the CRT picture: each scanline is now averaged over the pixel's height instead of sampled once.
Changed
- The test scene's golden layout value was updated: rocks and ruins now stand on terrain, the start area is kept clear, and the van and mech are new.
- Performance: the terrain adds about 0.4 ms of GPU time per frame on the development Mac.
[0.000.022] - 2026-10-29
Changed
- Cheaper volumetrics and post (the look is unchanged):
- Fog and smoke are marched at half the internal resolution (4x fewer rays), then composited at full internal resolution with a depth-aware upsample, so they don't bleed across object edges.
- Each ray first works out which lights it passes near (usually 0-3), instead of testing all of them at every step.
- Smoke puffs are grouped by emitter with a bounding sphere: a ray skips a whole plume with one test instead of testing every puff.
- Bloom is blurred once at the internal resolution in the grade pass. The full-resolution CRT pass reads one filtered sample per pixel instead of 8.
- Measured on the development Mac (release build, GPU time per frame, best of several runs): the whole frame costs about 3-4 ms, of which volumetrics, light shadows and the CRT together are about 1 ms. Timings on the Mac are noisy; the savings matter most on weaker hardware such as the Steam Deck.
Added
--no-vsyncand--benchmark(logs frame time and GPU time) for measuring performance.
[0.000.021] - 2026-10-29
Fixed
- Flickering when looking down a smoke plume. Dense smoke (high puff rates) overflowed two limits in the fog pass, and both chose which puffs to keep in a way that changed every frame.
- Each pixel now keeps the 32 puffs nearest the camera, in order. They hide the rest, and the choice is stable. Previously it was the first 24 in list order.
- The shader takes up to 512 puffs (was 256). When there are more, the faintest are left out instead of an unstable pick by distance.
- Smoke is sampled at a fixed step length (Renderer panel: Smoke step, 0.25 m), so the sampling pattern no longer shimmers as puffs move. It replaces "Smoke steps".
Changed
- The barrel smoke's built-in defaults are now the values tuned in the Smoke panel: 11.5 puffs per second, density 3.75, spread 5.1, fade-out 5.03 and thinning 0.75.
[0.000.020] - 2026-10-29
Changed
- Lighter, more natural smoke from the fire barrels.
- Fewer puffs: about 3 per second, and the rate is now a
Smokesetting (rate). - Each puff's size varies (
sizeVariation, plus a little density and spread), so the plume is lumpy instead of an even black tube. - Lower density, and much more transparent as puffs age: they thin out as they expand and fade steeply towards the end, so the plume dissolves.
Added
- A temporary Smoke panel for tuning the barrel smoke: puffs per second, size and size variation, height, rise speed, wind lag, turbulence, density, spread, thinning, fade-out and colour. It edits every emitter at once (through the server), with the usual config slots. Its saved default is what new worlds' barrels use. Once the look is settled it gets baked into the code and the panel removed.
SmokegainsfadeOut,thinning,windLagandturbulence(previously fixed in code).- Plan: prefabs with per-instance overrides, and an inspector showing them, scheduled for Milestone 2.
[0.000.019] - 2026-10-29
Added
- Saved settings for every settings panel (Renderer, including the camera tuning; Post; Atmosphere, including the weather). A config bar at the top of each has:
- Config 1-3: pick a slot, then Save the current settings into it or Load it, to swap looks on the fly. Filled slots show a
*. - Default: Save makes the current settings what the panel starts with; Load brings them back.
- Built-in: back to the values in code. Your saved default is kept.
- Saved files are readable JSON in
~/Desktop/Codename Max Settings/(next to theCodename Maxfolder), one per panel and slot (Renderer.2.json,Post.default.json...). The folder is created at startup with a README. Builds made in a Claude worktree use the same folder.--settings-dir <path>overrides it. - Atmosphere configs are world state: loading one sends edits through the server to every player, and the saved Atmosphere default is what new worlds start with.
- Engine: a small JSON reader and writer (
core/Json.h), reflection to and from JSON that tolerates added and removed fields,ecs::describe<T>()for reflecting plain settings structs, andplatform/Storagefor the settings folder. - Tests: JSON round trip, tolerant reflection loading, slot save, load and reset, and finding the checkout from a worktree build. The tests use a temporary folder and never touch your real settings.
[0.000.018] - 2026-10-29
Changed
- The scene renders at 360p by default (was 270p). On a 1800-pixel-high output that's 640 x 360, scaled x5.
[0.000.017] - 2026-10-29
Changed
- Light bands go up to 128, for testing.
[0.000.016] - 2026-10-29
Changed
- Light bands go up to 64 (were 8), for subtler stepping in the lighting.
[0.000.015] - 2026-10-29
Added
- Milestone 1, step 8: the isometric camera and input actions.
- Input actions (
engine/input): game code readsCameraRotate,CameraZoom,CameraPanandCameraReset, not keys. - Keyboard and mouse: Q/E or right-drag rotate, wheel or Page Up/Down zoom, WASD/arrows or middle-drag pan, Home resets.
- Gamepad: right stick rotates and zooms, left stick pans, clicking the right stick resets. Radial dead zones; hot-plugging.
- The last-used device family (keyboard and mouse, Xbox, PlayStation, Switch, Steam Deck) is tracked for button glyphs, and shown in Stats.
- Isometric camera (
render::IsoCamera): free rotation and logarithmic zoom from a 12 m close follow to a 150 m tactical overview, with the pitch rising from 30 to 58 degrees as it zooms out. Narrow 28-degree field of view. Panning moves relative to the view, middle-drag grabs the ground, and every input is smoothed. Reset takes the short way round. - Renderer panel camera section: live state, the controls, tuning sliders, auto-orbit and reset. It replaces the temporary orbit camera.
- Tests for camera easing, zoom limits, view-relative panning and reset.
Changed
- The edit overlay now only takes the keyboard while you type in a text field, so WASD keeps moving the camera after you click a panel.
[0.000.014] - 2026-10-29
Added
- Milestone 1, step 7: the post stack.
- Grade (at the internal resolution): exposure, contrast, saturation (desaturated by default), gamma, and split toning (cool shadows, warm highlights).
- Colour depth: quantised to 5 bits per channel (PS1 15-bit colour) with an ordered 4x4 Bayer dither at the internal resolution, as the PS1 did.
- CRT (at output resolution; it replaces the plain upscale): barrel curvature with a black bezel, chromatic offset, bloom with red halation, a scanline beam per source row, aperture-grille phosphor mask, animated film grain, and vignette. With the CRT off it is still a pixel-perfect whole-number upscale.
- A new Post panel in the edit overlay with every setting. Post-processing is presentation: local to each client.
Changed
CLAUDE.mdand the plan: network sync tiers. Exact sync for gameplay, replicated world state that rarely changes, local-only cosmetics that may differ between players, and local presentation. Sync only what matters, and ask when a feature's tier is unclear.
[0.000.013] - 2026-10-29
Fixed
- Smoke now lives in world space. Previously the whole plume was recalculated from the current wind every frame, so a gust or a wind change swung the entire column at once like a bent tube.
- Emitters now release puffs (8 per second) that each move on their own: they ease into the wind at their own position, rise as they cool, grow, fade, and carry their own billowing noise.
- A wind change only affects puffs from then on, so gusts ripple up the plume, and a moving emitter leaves a trail.
- Simulated on each client as a cosmetic effect, stepped on the server's ticks with emission timing and seeds from server entity ids. Every player sees the same smoke; a late joiner converges within a few seconds.
- The fog pass finds which puffs each ray crosses (up to 24) and takes fine steps only inside them.
- Tests: smoke is deterministic however it is stepped; a sudden gale barely moves existing puffs in one tick; moving an emitter leaves the old puffs where they are.
[0.000.012] - 2026-10-29
Added
CLAUDE.md: the five engine tenets, plus a tenet checklist every feature must pass. The first decision is always whether something is world state (server-owned, replicated) or this client's presentation (local).- Edit commands (tenet 5): the client sends
EditComponentandRegenerateWorldmessages, and the server applies them and replicates the result to every player. The editing client sees its change at once. Protocol version 2. - The World panel's inspector is now editable for the client's replica. Every field type has a widget, and changes go to the server as edit commands. The server view stays read-only for comparison.
- Tests: an edit reaches the server and a second player; server-only components, unknown types and dead entities are rejected; regenerating is a request to the server; the atmosphere is replicated.
Changed
- Network-by-default audit of steps 3 to 6:
- Sun, ambient and fog are now world state: a replicated
world::Atmospherecomponent on the zone's environment entity (it replaces the renderer's localEnvironment), so every player sees the same sky. - Whether to draw the fog volumetrically is a local quality setting, now in the Renderer panel.
- The Atmosphere panel edits the world's atmosphere and weather through edit commands, no longer by writing straight into the in-process server.
- The World panel's Regenerate and Next buttons send a request to the server.
- Fire flicker runs on the server clock and server entity ids, so it is identical for every player.
- The golden layout value was updated: the weather entity is now called "environment".
[0.000.011] - 2026-10-29
Added
- Volumetric fog. A full-screen pass marches each pixel's view ray through the fog, adding the light it scatters towards the camera:
- ambient sky light;
- the sun, through its shadow map, so shadows carve god rays;
- every point and spot light, through their shadows, so fires glow into the haze and lamps throw light into it.
- The start of each ray is offset with an ordered (Bayer) dither, hiding step banding in a PS1-appropriate way.
- Plain per-surface fog is still there when volumetric is switched off.
- Volumetric smoke: a new
Smokecomponent makes a column that rises, billows (animated noise), spreads, thins out and bends with the wind. Every light lights it and it is shadowed like everything else. The fog march takes fine steps wherever a ray crosses a column. Fire barrels now smoke. - Weather as world state (
engine/world/Weather.h): - A server-owned, replicated
Weathercomponent holds the zone's wind direction, speed, gust strength and gust spacing. WeatherZonecomponents give local areas their own wind, blended in at their edges.WindField::windAt(position, time)gives every system the same wind, with gust fronts travelling downwind on the server's clock. Shaders get the identical function (windAtinshaders/environment.glsl). Smoke is the first user; grass, cloth, hanging objects, physics and rain will use the same field.- The test scene has zone-wide weather plus a gusty crosswind area around one ruin.
- Atmosphere panel: volumetric fog settings (density, light scattering, sun scattering, forward glow, sky light, max distance) and the server's weather (wind direction, speed, gusts, gust spacing). Renderer panel: fog and smoke step counts, and a smoke column count.
- Tests for the wind field: still air without weather, gusts within range, the same answer on every peer, and local zones.
Changed
shaders/lighting.glslis nowshaders/environment.glsl: the per-frame environment every shader shares (lights, shadows, fog, wind).- The golden layout value was updated for the new weather entities.
[0.000.010] - 2026-10-29
Added
- Every light casts shadows. Point lights render six cube faces and spot lights one view into a shared shadow atlas of 16 x 16 tiles, 64, 128 (default) or 256 texels per tile. Shadows are hard, with one sample, like the sun's.
- A light's tiles are only redrawn when the light or something in its range moves, so static lights cost nothing after their first frame.
- Each face only draws the objects inside the light's range and that face's view.
- In per-vertex (Gouraud) mode, light shadows are sampled per vertex too, so they are as coarse as the mesh.
- Renderer panel: light shadows on/off, tile size, light shadow bias, and stats for shadow tiles redrawn, shadow draws and renderer CPU time.
Changed
- Up to 32 lights per frame (was 16).
- Lamp posts now hang their head and light from an arm, clear of the pole, so the pole doesn't shadow its own light. The golden layout value was updated for the new arm.
[0.000.009] - 2026-10-29
Added
- Milestone 1, step 6: lights, shadows and fog.
- The sun casts a hard shadow map: one unfiltered sample, fitted around the camera's view and snapped to whole texels so edges don't crawl. Choose 512, 1024 or 2048 resolution, with bias and normal-offset sliders.
- Point and spot lights (new
Lightcomponent): up to 16 per frame, the nearest to the camera's target first. Spots shine along the entity's local -Y. Flicker is cosmetic and evaluated on each client. - Lighting can run per pixel or per vertex (PS1-style Gouraud), with optional banding into a few steps.
- Distance fog plus ground-hugging height fog. The sky clears to the fog colour.
- Emissive primitives, for lamp heads, flames and the drifters.
- Test scene: fire barrels with flickering light in most ruins, four fluorescent lamp posts with downward spot lights (the tube light from the reference shots), and drifters that glow and light the ground as they move.
- Atmosphere panel: sun azimuth, elevation, colour and intensity, ambient colour, fog colour, distance fog range and opacity, and height fog base, falloff and density. Renderer panel: lighting mode, light bands, shadows, shadow map size, bias and normal offset, and a light count.
- Shaders: shared include files (
shaders/*.glsl), hashed into the staleness check like the shaders themselves.
Changed
- The test scene's golden layout value was updated on purpose: fires, lamps and lights are new entities. Rocks, ruins and drifters are generated exactly as before.
- MSL resource indices now come straight from the GLSL binding numbers (
spirv-cross --msl-decoration-binding).
[0.000.008] - 2026-10-29
Changed
- GitHub:
mainis now the repository's default branch, so the front page shows current work. The stale first-session branch, already fully contained inmain, was deleted. CLAUDE.md: every finished, verified piece of work is committed and pushed tomainstraight away, without waiting to be asked.
[0.000.007] - 2026-10-29
Added
tools/mac/make-launcher.sh: creates "Play Codename Max.app" on the Desktop, a double-click launcher for the local dev build. Its icon is a frame of the game, and its log goes to~/Library/Logs/Codename Max.log.
[0.000.006] - 2026-10-29
Added
tools/sync/update-local.sh: after pushing tomainfrom the Mac, Claude fast-forwards and rebuilds the local checkout, so the game in~/Desktop/Codename Maxis always the latest. It never touches a checkout that has local changes or is on another branch.
Fixed
- Linux CI: the shader check script failed on CMake 3.x because script mode defaulted to old policies. The embed scripts now declare their minimum CMake version.
[0.000.005] - 2026-10-29
Added
- Milestone 1, step 5: the scene is drawn.
- The world renders into a low-resolution target (270p by default, with 224p, 360p, 480p and native presets) and is scaled up pixel-perfect: a whole-number scale with nearest filtering. The internal width follows the window's aspect ratio.
- Primitives: box, cylinder, cone, sphere, a subdivided ground plane, and eight lumpy low-poly rock variants. All are flat-shaded where it suits the PS1 look.
- Procedural pixel-art test textures: ground, rock, concrete blocks, rusty metal plate and a checker test pattern. They are 64x64 with small palettes, nearest-sampled and have no mipmaps.
- Vertex snapping to the low-res pixel grid, for the PS1 wobble.
- Affine texture mapping (the PS1 warp), blendable from 0 to 1.
- Textures are projected from object space, so texel density stays the same on any size of primitive.
- Movement is interpolated between sim ticks, so drifters move smoothly at any frame rate.
- A placeholder sun and ambient light until step 6.
- Edit overlay: Renderer panel. It has the resolution preset, vertex snapping, affine warp, metres per texture tile, checker textures and wireframe toggles, a temporary orbit camera (yaw, pitch, distance, FOV, auto-orbit) until step 8, and draw and triangle stats.
- Shader pipeline: shaders are written in Vulkan GLSL (
shaders/) and compiled withpython3 tools/shaders/build.pyto SPIR-V (glslang) and Metal Shading Language (spirv-cross). The compiled shaders are committed and embedded into the build, so building needs no shader tools. The build fails with instructions if a shader changes without being recompiled. - Tests for mesh winding and normals, rock variety and texture generation.
Changed
Primitivemoved from game code into the engine (render::Primitive) and gained a meshvariant. Rock variants come from their own seed, so the generated layout is unchanged.- The GPU device only asks for backends we ship shaders for, Metal and Vulkan. Windows runs on Vulkan until DXIL shaders are added.
[0.000.004] - 2026-10-29
Added
- Milestone 1, step 3: engine core.
- Seeded randomness: PCG32 and SplitMix64 with our own distributions, identical on every platform.
- Seed hierarchy: run -> world map -> zone -> chunk -> feature. Each level is derived by hashing, so generators never share a random stream.
- Minimal ECS: generational entity handles and per-component pools.
- Component reflection. It drives network serialisation, a client/server schema check and the editor inspector.
- Always-on asserts.
- Milestone 1, step 4: the server and client run in one process over a loopback transport.
- The server builds the world from the seed and is the only side that decides what exists.
- The client's world is a replica built only from snapshots.
- Snapshots are deltas: after the first full snapshot, only changed components, new entities and destroyed entities are sent.
- A handshake checks protocol version and component schema, and rejects a mismatched build.
- Test scene: a ground plane, scattered rocks, ruin wall clusters and four "drifters" that the server moves, all generated from the seed. Not rendered yet (step 5).
- Edit overlay: World panel (View > World). It shows server and client stats, has a seed field with Regenerate and Next, draws a top-down map of server positions (squares) against client replicas (dots), and lists entities with a reflection-driven inspector for either world.
--seed <n>command-line option.max_tests: a headless test suite for the RNG reference values, seed and scene golden values, ECS, serialisation and replication. CI runs it on macOS, Linux and Windows, so any platform difference in generation fails the build.- Dependency: glm 1.0.1 (headers only).
Changed
- Float determinism: floating-point contraction (FMA fusing) is disabled on GCC and Clang, so seeded maths gives the same bits on every platform.
- The gameplay code now builds as a library (
max_game) linked by the game and the tests.
[0.000.003] - 2026-10-29
Added
CLAUDE.md: project working rules (versioning, changelog, build and screenshot commands, code conventions), so every new Claude session follows them, whether it runs on the Mac or in the cloud.
[0.000.002] - 2026-10-29
Added
- Milestone 1, steps 1–2: CMake build (presets
devandrelease) with pinned dependencies (SDL3 3.4.18, Dear ImGui 1.93.0-docking, stb). VERSIONandCHANGELOG.mdembedded into every build. Version watermark is shown in-game, and the changelog viewer is under Max > Changelog (F2).- Engine core: logging, command-line args, module system (init, shutdown, fixed tick, update, render, editor panel hooks), 30 Hz fixed-timestep clock.
- Window and SDL3 GPU device (Metal on macOS, Vulkan on Linux, D3D12 on Windows), rendering into a frame target that is blitted to the swapchain.
- Edit-mode overlay (F1): menu bar, stats panel, and module panels. First game module: Atmosphere (fog colour).
- Screenshot capture:
--capture <file.png> [--capture-frame N], plus--quit-after N,--window WxH,--no-editorand--changelog. - GitHub Actions CI: builds on macOS, Linux and Windows, plus a Linux software-rendered screenshot test.
Changed
- Plan: recorded decisions (free camera rotation, day/night cycle, large zones of roughly 1–2 hours, work on
main).
[0.000.001] - 2026-10-29
Added
- Plan: localisation design (section 5.12). String keys only, per-locale tables, plural and argument formatting, glyph tokens, network sends keys not text, dialog and shops as data, pseudo-locale. Localisation core added to Milestone 1.
[0.000.000] - 2026-10-29
Added
- Master plan (
docs/PLAN.md): game summary, engine tenets, platform targets, technology choices, architecture (modules, client/server model, networking, determinism, edit-while-playing, PS1 rendering, Blender asset pipeline, Mixamo animation pipeline, input, versioning), remote workflow, and roadmap with Milestone 1 "First Light". VERSIONfile and this changelog.README.mdwith project overview and local Mac setup instructions.