Swipers was Panda Paw's first game: a physics-heavy co-op heist where players raid procedurally generated facilities while a teammate guides them from the van. We pivoted to CatchUp in June 2026.
The level generator is the part I'm proudest of. It is about 43,000 lines of runtime code and 11,000 lines of editor tooling.
1. Halls, most constrained first
2. Perimeter loop corridor
3. Rooms attach to halls
4. Hallways: spanning tree plus loops, routed with A*
What I built
A network-first pipeline
The first version placed rooms and squeezed corridors through what was left, which produced mazes rather than buildings. I rewrote it top down: special halls first, most constrained first, then regular halls, perimeter loop corridors, attached rooms, and finally hallways connected by a spanning tree plus loops and routed with A*. Sixteen named stages take a level from empty grid to packaged result.
One data structure at every scale
Layouts are stored as a doubly connected edge list, where every wall is two half-edges, one for each side. The same graph, per room and level-wide, drives maze carving (depth-first, Prim and Kruskal), occlusion zones, guard hearing and pathfinding.
Deterministic multiplayer
The host sends a single integer. Every player builds identical geometry from salted random streams, and only the host spawns networked items. A failed seed retries automatically, and a curated cache holds pre-validated seeds.
Performance
Layout runs on a background thread, instantiation is chunked under an 8 ms per-frame budget, and the navmesh bakes asynchronously afterwards.
Designer control
Placement rules (near or far, required or preferred, boundary sides), weighted pools in ScriptableObjects, and a Level Workbench editor with a live 2D layout preview, a seed curator, room scaffolding, decoration tools, validation, gizmo overlays and a loot-economy simulator that runs across many seeds.
Result
It generated every level in Swipers playtests. Its data types and seed-determinism model now underpin CatchUp's world.
