Dev Log: Building Five Districts from Half a Map
How Neon Burrow stores each 21 by 21 district as a hand-drawn left half that is mirrored at load time, and why a one-character legend made iteration fast.
When we started Neon Burrow we knew we wanted hand-crafted levels rather than procedural ones. A maze escape game lives or dies on the quality of its routes: where the seeds cluster, how far the core is from the portal, where an enemy can trap you. Those decisions need a designer's hand. At the same time, we are a small team, and we needed a level format that would let us sketch, test and rewrite a district in minutes rather than hours. This dev log explains the format we landed on and what we learned from it.
Why 21 by 21?
Every district in Neon Burrow is a grid of 21 by 21 tiles. We arrived at that size through playtesting on phones. Smaller grids felt cramped once we added hazards and multiple enemy types. Larger grids made tiles too small to read on a phone held in portrait, and they stretched runs beyond the short-session length we were aiming for. Twenty-one tiles also gives us an odd number of columns, which means there is always a single centre column. That matters because of the next decision.
Designing half a map
Each district is authored as the left half plus the centre column: eleven characters per row. At load time, the game mirrors that half onto the right side to produce the full 21-column map.
Symmetry was a deliberate design choice, not just a shortcut. Symmetric mazes are easier for players to learn, because once you understand one side you understand the other. They also feel fair: neither side of the map is obviously better, so where you choose to go is a matter of strategy rather than luck. And they look striking in neon, with every glowing corridor reflected on the opposite side.
The practical benefit is that we only write half as much data. A full district is 21 rows of 11 characters, which fits comfortably on one screen in a code editor. You can see the entire level at a glance.
The legend
Every tile is a single character. A few examples of the kind of symbols the legend uses:
- Walls and open corridor tiles
- Energy seeds, scrap and data pickups
- Pip's spawn point, the Pulse Core and the portal location
- Enemy spawns, with a different character for each enemy type
- Hazards: heat vents, laser barriers, conveyors in each direction, water and moving platforms
- Special walls: cracked walls, the two groups of shifting crystal walls, gates and keys
- Teleport pads, numbered so that pairs can be matched
- Secret room markers
Because every feature has a character, adding a new mechanic is mostly a matter of adding a new letter to the legend, teaching the loader what it means and teaching the renderer how to draw it. The level files themselves do not need any new structure.
Breaking symmetry on purpose
Pure mirroring has limits. Some things should not be duplicated: there is only one Pulse Core, one portal and one player spawn. Some puzzles need asymmetry to work, like a single cracked wall hiding a secret room, or a gold key sitting in only one corner.
We handle this with per-tile overrides. After the mirror step, each district can specify a short list of individual tiles to replace. The gold key in Power Junction's top-left corner, for example, is placed by a single override, so it exists only on the left side. In the Core Vault, the left half contains a cracked wall with a secret room behind it, while overrides on the mirrored right side swap that pocket for a scrap and a data pickup lying in the open. This keeps the convenience of mirroring while allowing exactly as much asymmetry as a design needs.
The overrides also turned into a useful design tool. When something in a district felt too predictable, we would often fix it with a single override rather than redrawing the half map.
Per-district settings
Alongside the tile data, each district carries a small block of settings:
- A name and colour palette, which drive the renderer's glow colours
- The extraction timer, from 32 to 40 seconds
- An enemy speed multiplier, rising gently from 1.0 to 1.12 across the five districts
- The music root note and tempo, which feed the procedural soundtrack
Keeping these next to the map meant that balancing a district was a matter of editing one object. If Thermal Foundry felt too harsh, we could add two seconds to its timer or shave its enemy speed without touching any code.
Testing levels
A format this compact is easy to break. A single typo can wall off the core or leave a seed stranded behind a wall. Because a district is so small, our main defence is simply playing it: every change gets a run-through, and the mirrored structure means a mistake on one side usually shows up as an obvious asymmetry on the other. Teleport pads are matched by number, so a pad placed on the left half automatically gets its partner on the right.
We also compute the seed requirement automatically. The game counts every seed after mirroring and applies the current requirement, 60 percent by default or lower with the Energy Capacity upgrade, rounding up. That means designers never need to keep a seed count in sync by hand.
What we would do differently
Two lessons stand out. First, we underestimated how often we would want to tweak hazard timing per district. Vent and laser rhythms are currently global, and a few designs would have benefited from local timing. Second, a visual editor would have saved time for the more complex districts, especially the Core Vault, which uses nearly every legend character. For the first five districts, though, plain text was fast, readable and easy to review.
Why this matters for players
The format is invisible when you play, but its effects are not. Symmetry makes districts learnable. Per-district settings let us tune difficulty smoothly. And because a new district is just twenty-one short lines of text and a settings block, adding more content is cheap. That is exactly what we want for a game that we plan to keep growing.
Coming up
In our next dev log we go inside the minds of the enemies: how Seekers follow your trail, how Swarm Drones coordinate a pincer and why every enemy uses breadth-first search rather than something fancier.