😶 From Noise to a Playable World
on October 4, 2026
Darkwaar20 starts with noise.
A 7×9 board initially contains no terrain, no path, no objective, and no meaningful visual structure. Each of its 63 cells holds four integer channels generated from a seed. Five transformations later, those same integers describe a world of ground, void, energy, a core, and an exit.
The transformation is not automatic. Before every pass, the player chooses how the noise should settle. Generation is the first phase of play. Walking the result is the second.
seed
↓
noise
↓
five constrained transformations
↓
terrain
↓
playable world
The same seed does not imply the same world.
same seed
+
different constraints
=
different world
That split is the whole experiment. The noise is fixed. The player supplies the constraints. The board records what remains.
Start with Noise
The board is seven columns by nine rows. Sixty-three cells. Four channels per cell. The channels are ordinary integers, produced from an explicit seed, so the opening field is variation that can be restored exactly.
Randomness is useful because it stops every run from looking like the last one. A seed is useful because it makes that variation reproducible. Two runs can begin from the same noise and diverge only where the player chooses a different condition. Without that split, a dead board and a playable board would be indistinguishable accidents. With it, the difference can be attributed.
random input
is the seed.
player influence
is the sequence of conditions.
At step zero the channels are still raw. Nearby cells do not agree. Nothing on the board is ground or void yet, because those words are an interpretation that does not exist until the fifth pass locks. What the player sees is the noise itself: four values, drawn as an unsettled field.
Denoising, in Darkwaar20, is a game-design name for the passes that follow. The implementation is deterministic integer arithmetic. There is no neural network, no trained model, and no image-generation inference. The useful picture is smaller:
noise
→ repeated local transformations
→ increasingly stable structure
Five Ways to Shape the Same Seed
Each pass looks only at the current board. A cell does not carry a history of why its value exists. It carries four integers. The pass reads those integers, reads the orthogonal neighbors, applies the selected condition, and writes the next board. That next board is the only input the following pass needs.
state n
+
local rule
=
state n + 1
The base rule is the same for every condition. Average the cell with the orthogonal neighbors that exist, then snap each channel onto one of four levels:
value = average(cell, north, south, east, west)
value = snap(value, [0, 85, 170, 255])
Snapping is the part that creates structure. A channel that could sit anywhere from 0 to 255 is forced onto a rung. Cells that were merely close become identical. Identical neighbors survive the next average more easily than a scattered field does. Repeat the pass and local disagreement shrinks. Regions appear because precision was removed, not because a shape was drawn.
The selected condition edits that average before the snap. LIFE, ORDER, and VOID are not labels on top of one algorithm. They are three different edits.
LIFE raises the average, and it raises a supported cell by more. Support means an orthogonal neighbor whose value on that channel sits within 64 of the cell. Two or more such neighbors add 48. Fewer than two add 16. The result is clamped and snapped. Connected, similar structure is pushed upward. An isolated cell still moves, but by less, so it is easier for a later pass to leave behind.
ORDER changes the average itself. Each neighbor is counted three times, and the cell once. The pass also tallies which snapped level appears among the cell and its neighbors. If one level is a strict majority, that level wins outright. If not, the weighted average is snapped as usual. Disagreement inside a neighborhood is discarded as soon as one level can outvote the rest. Coherent regions grow faster under ORDER than under a plain average, because the neighborhood is allowed to decide.
VOID lowers the average. Fewer than two supporting neighbors subtract 120. Two or more subtract 64. The result is clamped at zero and snapped. Weak or isolated structure is driven toward the bottom rung. Repeated VOID passes do not carve a designed hole. They collapse whatever was not already held up by its neighbors, until low values cover the cell and, later, read as void.
None of these rules simulates a physical process. They are local integer edits with readable consequences: LIFE keeps supported structure stronger, ORDER settles disagreement, VOID erases what is not supported.
Five passes are five decisions, not five automatic iterations.
condition
→ settle
→ inspect
After each settle the board is visible. Early passes still look noisy, but flat areas start to show. Later passes show larger regions. The player is not watching a progress bar. The player is reading a partial result and choosing the next constraint with that result in view. The world is not generated before play. Generating the world is the first phase of play.
A sixth pass does nothing. Once five conditions have been applied, the channels stop being noise and become terrain.
Turning Numbers into Terrain
The generator does not build a second map. It reads the same four channels it has been rewriting.
sum = a + b + c + d
sum <= 340 → VOID
sum >= 680 → ENERGY
otherwise → GROUND
The thresholds sit on the snap levels. Four channels at 85 sum to 340, which is void. Four channels at 170 sum to 680, which is energy. Anything between is ground. The continuity matters:
noise values
→ settled values
→ terrain
No separate roll places walls, energy, or rooms. Terrain is a reading of the field the passes left behind.
That field still has to become a route. The core is the strongest non-void cell. Its score is a + b + 2c: the first two channels once, the third channel twice. The highest score wins. A tie goes to the smallest row, then the smallest column. The exit is chosen only among ground cells that can be reached from the core by an orthogonal walk through ground and energy. Among those cells, the farthest Manhattan distance from the core wins. A tie goes to the largest row, then the largest column. Energy can be crossed. It cannot be the exit. The core itself is not a candidate.
Nothing is placed after the fact. If the passes leave no non-void cell, there is no core. If no ground cell is reachable, there is no exit. The topology is the route.
When Generation Becomes Gameplay
After the fifth pass the rules shrink. The player stands on the core. Movement is one orthogonal step. Ground, energy, and the exit can be entered. Void blocks. Reaching the exit wins. A board with no reachable exit is not repaired and not rerolled. It ends as NO WAY OUT.
Traversal is simple because the decisions have already been made. Walking answers a single question: did those five transformations leave a viable world? A long path is not a second puzzle layered on top of generation. It is the consequence of the field that generation produced.
The picture tracks the same process. The opening frame is raw noise. The middle frames mix that noise with the regions the thresholds would already imply. Later frames commit to larger areas of ground, energy, and void. The last frame is the locked world, with the core and the exit marked. The draw is not a separate illustration. It is the state, shown with less integer detail as the state itself becomes more constrained. The player can follow the loss of possibilities without reading the channels.
Same Noise, Different World
Seed 20020 is the checked example. The opening field is identical in both runs. Only the five conditions change.
LIFE
ORDER
LIFE
VOID
ORDER
locks a playable world. The core is (3, 0). The exit is (6, 8). The board holds 6 void, 54 ground, and 3 energy. An orthogonal walk from the core reaches the exit.
The seed is then restored, which restores the original noise, the step count, and the empty history. The second sequence is:
VOID
VOID
ORDER
VOID
LIFE
Every one of the 63 cells is void. There is no core, no exit, and no path. The result is NO WAY OUT.
seed 20020 + sequence A = playable world
seed 20020 + sequence B = dead world
The initial randomness did not decide that. The constraints did.
Small Rules, Generated Consequences
At step zero, each cell still has many futures. A channel can move toward any of the four rungs, and five choices remain. Each pass removes some of those futures. LIFE spends a step keeping supported values high. ORDER spends a step letting a local majority erase the minority. VOID spends a step pushing unsupported values down. By step five, enough uncertainty is gone that the sums can be read as terrain, and the terrain can be read as a route.
That is generation by constraint, not by placement. The implementation never says where a wall goes, where energy goes, or where the exit goes. It only restricts the field. The exit appears where the remaining ground is farthest from the strongest remaining cell, among cells the void has not cut off. If the restrictions go too far, the exit does not appear at all.
many possible worlds
↓
constraint
↓
fewer possible worlds
↓
constraint
↓
stable topology
↓
playable world
The machinery stays small because the board is the memory. There is no biome pass, no room pass, no path pass, no resource placer, and no repair step that quietly fixes an illegal map. A few integer rules, a neighborhood, a quantization, five decisions, two thresholds, and a deterministic choice of core and exit are enough for a topology to show up. Complexity here is a result of repeating a local rule, not a catalog of systems that each own one kind of content.
Failure belongs to that result. Many generators test a level and roll again until a path exists. Darkwaar20 keeps the dead board. If every sequence were repaired into a walkable map, LIFE, ORDER, and VOID would be visual preferences. NO WAY OUT is the evidence that they are not. A guaranteed valid world would be smoother to finish. An allowed failure makes the five conditions mean something. Darkwaar20 takes the second option.
The trade is visible on one seed. Sequence A leaves a core at the top of the board and an exit at the far corner, with a thin scatter of void and energy. Sequence B, from the same integers, spends four of its five decisions pulling unsupported cells down and finishes with nothing to walk. Same noise. Different accumulated constraints. Different game, including a game that cannot be played.
Play Darkwaar20
Noise is not the generated world. It is the space of possible worlds. Five choices remove possibilities until one world remains. Darkwaar20 then asks the player to walk through the consequences.
Generation is part of the game because the player constrains the world before having to play it.
Darkwaar20 can be played in the browser on itch.io. The Darkwaar20 release page is the game entry on darkwaar.com.