mino.mobi · fable · morph

morph.

A level up: instead of generating puzzles, morph generates whole games. Each roll samples a genome — a topology (grid, cylinder, torus, Möbius, Klein, hex), a law (push, slide, collect, lights, portals), a goal, and a look — and instantiates a puzzle from it that one invariant solver has certified solvable. New game rolls a fresh genome — a different planet. New puzzle rolls a fresh level in the same game. The thing that never changes is the oracle; the game always does.
—
Solved!
how this game works
games 1–12
each card is a different GAME — click to play

One level up the ladder of abstraction

The first four wings of fable — puzz, knack, flux, gyre — each generate puzzles. But within a wing, every roll is the same game with the furniture rearranged: knack is always knack. They feel like four games, not infinite games. morph asks the next question: what does a generator of puzzle generators look like?

Sample the grammar, not just the furniture

The insight is that a game is a point in a space of grammars, and the axes are orthogonal:

  • Substrate — the topology the game lives on: grid, cylinder, torus, Möbius strip, Klein bottle, hex. This is the deepest knob; a Möbius seam flips your frame mid-slide, and the solver never notices.
  • Law — how you move and what the world does: walk or slide, push, collect, light-up, teleport.
  • Goal — reach the gate, fill every marker, gather it all, light every tile.
  • Aesthetic — sampled independently, so two games with the same grammar still look alien to each other.

A roll is a genome. Instantiating it with an instance seed lays out a concrete level. The product of these axes — six topologies × four goals × layered rules × eight motifs — is large, and because the axes are independent you get combinations no one designed: Lights-Out on a Klein bottle, Sokoban across a torus seam, a slick collect-a-thon on a Möbius strip.

The invariant that makes it possible: one oracle

What lets the grammar vary without limit is that the thing underneath doesn't. Every genome in this wing compiles to a discrete state graph, and a single breadth-first search certifies any of them solvable, finds the optimal length, and grades it. The games are generated; the oracle is fixed. That's the whole trick — and it's why morph can reject a genome as a dud (no good instance exists) and grade a genome's richness before you ever play it.

Two knobs, named

New game rolls a new genome — a different planet. New puzzle keeps the genome and rolls a new instance — the same game, a fresh level. Naming both is the point: morph is inexhaustible at the genome level, not just the level level. /morph/?n=<game>&p=<puzzle> is a permalink to exactly one level of exactly one game.

Where this goes next

This wing's oracle is BFS over a discrete state graph, so it covers every game that is discrete, deterministic, and turn-based. Other oracle families already exist next door — constraint-uniqueness (puzz), action-space sweep (flux/gyre) — and the genome's outer axis is really which family. Number games, node graphs, painting/symmetry, word-embedding games: each is a new substrate or a new oracle family bolted under the same meta-generator. The ladder keeps going up.