Today, I built the largest course in North Is Not Up so far—and discovered that the landscape itself was too large to treat like an ordinary level.

Ravenwood was designed as an any-order score challenge across a country estate. The finished course gave the player 22 minutes to collect as many of 250 available points as possible, with 10 points deducted for every started minute late.

Before I could balance that course, I had to make the estate practical to load, edit and cross without visible interruptions.

Rebuilding the landscape around route choice

The first Ravenwood geography did not support the course well enough. The estate looked large, but its relationships did not create the route decisions I wanted. I preserved that version as a backup and rebuilt the landscape rather than forcing controls into it.

The new 1.44 km² world included a stone entrance and event meadow, Ravenwood Hall, a walled garden, a ruined chapel, a lake and wetland, working woodland, a quarry and eastern hills. Paths connected the major places, but water, cliffs, bridges and vegetation made the order of controls consequential.

The source world grew to more than 105,000 objects, including 19,088 visible trees. It was far beyond the compact scenes used for the earlier courses.

Keeping everything live at once made startup and movement too expensive. It also made the scene unpleasant to work with in the editor. The challenge was to divide the technical world without making the player feel those divisions.

From three regions to 65 cells

I first tested a three-region streaming version. It improved startup and moving frame times, but loading a whole region in the background only moved the hitch to activation. One run produced a 227 ms frame when the prepared content entered the scene tree.

I replaced those large activations with a more granular system: 65 saved cells across 14 authored areas.

Each cell owned a defined part of the detailed landscape. Lightweight proxies kept distant terrain and all visible tree placements represented, while detailed resources loaded before the player reached them. Activation and retirement were divided into bounded pages so the main thread did not receive an entire region in one frame.

The loader kept the current cell and its neighbours ready, looked ahead in the direction of travel and used hysteresis to avoid unloading an area the moment the player turned around. Teleports and respawns prepared the destination before returning control.

The complete conversion preserved 105,199 atomic nodes, 616 original MultiMesh buffers, 19,422 collider properties and more than 13 million collision faces. Those numbers were not targets by themselves; they were evidence that the faster version had not quietly removed the estate.

Proving the joins were not barriers

A streamed orienteering world fails if a cell edge becomes an invisible wall or an unloaded bridge.

I tested 122 shared collision edges and 61 authored road crossings with the actual player controller. The sweep recorded no boundary holds or failed crossings. Rapid reversals, diagonal woodland travel, map opening, compass state, camera restoration and respawn state also survived cells loading and retiring.

An elevated visual check found a colour seam across the lake. Loading both detailed cells removed it, which isolated the problem to the simplified water proxies rather than the material. I restored the original tessellation for the two affected proxy meshes and kept the rest of the proxy system unchanged.

Another benchmark looked unusually good until I found that the dummy renderer had discarded MultiMesh buffers while saving. I rejected those results and reran the measurements with the real renderer. A fast number was not useful if thousands of trees were missing from the test.

The corrected candidate reached a warm startup of about 8.5 seconds and a moving frame-time p95 of roughly 18.7 ms. It completed the measured routes without a moving frame over 33.3 ms. Peak memory stayed just under 3 GiB.

Not every soft target passed. Collision shapes remained above the preferred budget in many frames, and a small number of activation pages exceeded 3 ms. I kept those limits in the report instead of presenting the streaming conversion as perfect.

Adding the score challenge after the world worked

I kept the first streaming validation separate from the course. The landscape candidate had no authored objectives, so tests of its persistent state were labelled as fixtures rather than claimed as a successful score run.

Only after the estate was stable did I add the 12 control stations. They could be visited in any order and were worth a combined 250 points. The player had to return to the entrance and finish within 22 minutes or accept the late penalty. Results ranked net score first and elapsed time second, with the best result saved.

The controls belonged to streamed cells, but their punched state did not. A station could unregister when its cell unloaded and reappear later without forgetting that it had already been visited.

The whole estate used one 4096-pixel map. Opening it did not load regional scenes or swap to a more detailed local sheet. There were no route overlays in gameplay. The larger world still followed the rule that started the project: the game provides the geography and the tools, but the player chooses the route.

Finishing the fifth course

I integrated Ravenwood into the course menu, enabled free level selection and brought its ElevenLabs text-to-speech narration, ambience and daylight into line with the other levels.

Ravenwood was the point where North Is Not Up became more than a sequence of increasingly large maps. The any-order scoring changed how the player valued distance, while the streaming work let that decision happen across a continuous estate.

The hardest part was not placing twelve controls. It was making the world underneath them reliable enough that a late return came from the player's route choice rather than a loading hitch or a broken boundary.