Design

Procedural Level Generation on a Solo Schedule

Procedural generation promises infinite content, but a solo dev needs a version that ships. Here is how to scope it, build it from handcrafted pieces, and keep the output playable.

Vectra Play 6 min read
A grid of randomly assembled level pieces next to a handcrafted reference level

Procedural generation on a solo schedule works when you constrain it heavily. The goal is not infinite variety. It is enough variety that players do not notice repetition, built from handcrafted pieces assembled by simple rules. A tightly constrained generator ships in weeks. An unconstrained one eats months and still produces unplayable layouts.

Why solo devs should consider it at all

Hand-building every level is the safer path, but it has a ceiling. A solo developer can produce a limited number of polished levels, and content-hungry genres like roguelikes and endless runners burn through them fast.

Procedural generation removes that ceiling by trading authored precision for authored variety. The key word is "authored." A good generator does not create from nothing. It assembles from pieces you built, following rules you wrote.

The risk is scope. Generation systems are interesting to build, and interesting problems on a solo schedule are dangerous. The version that ships is always the simplest one that produces acceptable output.

Start with handcrafted pieces, not algorithms

The fastest path to a working generator is a library of handcrafted chunks assembled randomly within constraints.

Build 15 to 25 room pieces, corridor pieces, or level segments by hand. Each one should be playable on its own and fun in isolation. Then write the assembly logic.

This approach has three advantages for a solo developer.

  1. Quality floor. Every piece is authored, so the worst possible output is still a sequence of good pieces.
  2. Debuggable. When something feels wrong, you can identify which piece caused it and fix or remove it.
  3. Fast iteration. Adding variety means building a new piece, not debugging an algorithm.

The most reliable procedural generator is a shuffled deck of good cards, not a machine that invents new ones.

Compare this to pure algorithmic generation, which can produce novel layouts but requires extensive validation to ensure every output is playable. On a solo schedule, validation time exceeds generation time by a wide margin.

Constraining the generator

The constraints are the design. Without them, the generator produces technically valid but experientially poor levels.

Five constraints worth enforcing from the start.

These five cover most of what makes generated content feel designed rather than random. You can add complexity later, but these are enough to ship.

Seed testing and reproducibility

Every run should be driven by a seed. The seed lets you reproduce any specific level for testing, bug reports, and daily challenges.

Store the seed and log it visibly during development. When a tester says "level 23 had an impossible jump," you need to see exactly what they saw.

Three testing practices for seeded generation.

  1. Run a thousand seeds overnight. Check for crashes, stuck states, and impossible layouts. Automated testing catches the rare failures that manual play misses.
  2. Keep a list of known bad seeds. When you find a seed that produces a poor result, save it. Every fix should be verified against all known bad seeds.
  3. Pin good seeds for showcases. Your store screenshots and preview videos should use specific seeds that produce good-looking levels.

Reproducibility also enables daily challenges, leaderboards, and shared experiences, all of which are valuable for retention and cost nothing to add once the seed system works.

The pacing layer

Raw assembly produces levels that are technically correct and rhythmically flat. A pacing layer fixes this.

The pacing layer sits between the generator and the final output. It adjusts the order and density of pieces to create rise and fall.

Three pacing patterns that work for most genres.

Ramp. Start easy, increase difficulty steadily. Good for score-chasing games.

Wave. Alternate between hard and easy sections. Good for longer sessions where sustained difficulty causes fatigue.

Crescendo. Gradual increase with a high-intensity finish. Good for roguelikes and boss-rush structures.

Implement pacing as a curve that maps position in the level to difficulty. The generator places pieces that match the curve's value at each position. A simple sine wave produces the wave pattern. A linear ramp produces the ramp.

This is cheap to build and transforms the feel of the output. Without it, procedural levels feel like a random walk. With it, they feel shaped.

When to stop adding variety

Solo developers frequently over-invest in variety because the repetition is obvious to them after hundreds of test runs.

Players see far less repetition than you do. A player who runs twenty levels has seen each piece once or twice. You have seen each piece a hundred times.

Stop adding pieces when two conditions are met.

After that, more pieces add variety that players do not notice and maintenance cost that you feel on every change.

What we would do

Build 20 handcrafted pieces and a constrained assembler before writing any algorithm. Get the quality floor right first, then add variety by building more pieces rather than more complex logic.

Add the pacing layer in the second week. The improvement is immediate and the implementation is a single curve applied to piece selection.

Then run a thousand seeds overnight and fix every stuck state. Ship the generator when manual testing feels good and automated testing finds no failures. You can always add pieces after launch, and player feedback will tell you where variety matters most.

The short version

Build your first 20 pieces this week and test them in a shuffled sequence. If you want a generation system scoped for your game, get in touch.

#Design#Process#Mobile#Levels
Your turn

Got a game idea? We build it.

You bring the concept. We design, build, test and launch it, and you own 100% of the finished game.

Share Your Game Idea  →