How Apsis levels are made: built backwards, scored by reads
Behind the scenes: how Apsis builds every level backwards so it can always be cleared, measures difficulty in reads, and makes sure no level repeats another.

On this page
Nobody draws Apsis levels by hand. A program builds them, a solver measures them, and a few rules decide which ones ship and in what order.
Step 1: build it backwards
The generator never searches for a solution. It builds one in.
It starts with an empty system and adds arrows one at a time. A new arrow is accepted only if it fits (inside the rim, off the sun, a small gap from every other arrow) and its own path is already clear of every arrow placed before it.
That one rule guarantees the level can be cleared. Take the arrows away newest first: when an arrow’s turn comes, everything added after it is gone and everything added before it is still there. Its path was clear of exactly those when it was placed, so it is free. The file then stores the arrows shuffled, so the build order gives nothing away.
A side effect: no arrow is ever aimed across the sun, since it could never leave. The sun is never what blocks you in a real level.
Step 2: make it interesting
An arrow dropped at random usually blocks nothing, which only makes the level easier. So most new arrows are aimed: the generator picks an arrow that is free right now, a point along its path, and places the new arrow on the nearest orbit there, in its way.
It tries 36 candidates for each new arrow and keeps the best by a score: deeper chains, fewer arrows free at the start, and arrows spread evenly over the orbits. That last part came from a version where 47 percent of the arrows sat on the outermost orbit and late boards looked like a necklace.
Getting here took five rounds of changes, each measured over 40 builds. The shipped run made 3,972 builds in 191 seconds to choose from.
Step 3: measure it
Since removing an arrow only ever clears space, an arrow that is free stays free, and launching any free arrow, again and again, clears any level that can be cleared. So the solver needs no search. It measures a level in rounds: in round one every arrow free at the start leaves, in round two every arrow now free leaves, and so on. That gives the depth (how many rounds), the free count (how many can go at the start), and the difficulty score, reads.
Reads: what a careful player reads
Depth alone misjudges boards. In an earlier level set, level 96 came after level 89, both with 22 arrows, and 96 was deeper, 8 rounds against 7. Yet 96 was easier: it started with four arrows free rather than three, and most of its depth was a thin tail of single arrows at the end.
So the score became reads: how many arrows a careful player reads to clear the board, if every round they check each arrow still there and launch the free ones. An arrow that leaves in round 3 is read three times; add that up over every arrow. More arrows, fewer free at the start and longer chains all mean more reads, with no weights to tune. By this measure, level 89 read 82 and level 96 read 72.

Step 4: choose the order
For a given number of arrows and depth, the builder lands on almost the same reads every time, so building each level to an exact target means waiting a long time for rare builds. Instead, each stage of the game builds a pool of three candidates for every level it ships, and a search picks which ones ship and in what order:
- reads, arrows and depth never fall from one level to the next;
- no more than three levels in a row read the same;
- within those rules, the climb is as even as the pools allow.
Before this, 40 levels read less than the one before, and one step jumped by 18 reads. Now none fall, and no step rises by more than 3. New kinds of arrow arrive on schedule: the first long arrows on level 16 and the first diagonals on level 31, the levels whose captions introduce them.

Step 5: no level twice
A level turned around the sun, or mirrored, is the same puzzle, so every candidate is compared with every level already made, three ways:
- Turned or mirrored copies, found by writing each level in a standard form that ignores rotation and reflection.
- Near copies: under some rotation and mirror, at least half of the arrows pair up with arrows of the same length and direction within 40 units.
- The same puzzle redrawn: the same number of orbits and the same pattern of who blocks whom, with each arrow labelled by its orbit, direction and length.

Before this rule, 20 pairs of early levels were too close, the worst sharing 4 of 5 arrows. Now none are, and the closest pair shares 47 percent.
Checked on every build
The tests re-check every shipped level on every run: the solver clears it without losing a heart, its numbers match the file, the order never gets easier, and no two levels are near-duplicates. A rule change that broke a level could never ship quietly.
For the geometry that decides whether a path is clear, read straight lines across circles.



Comments
Sign in with GitHub to leave a comment or a question.