A World That Agrees With Itself

A text world is a graph with prose attached. Every room is a node, every exit an edge, every name a promise that the next mention will match. MUDs have worked this way since the late 1970s. The hard part of generating one was never the writing. It’s keeping ten thousand rooms from contradicting each other.

A generated world fails quietly. An exit leads east with no way back west. A quest sends you to a smith who was never placed. A town is renamed after a rebuild, and every saved character who called it home now lives somewhere else. None of these crash anything. They just make the world untrustworthy, and a world you can’t trust isn’t one you stay in.

Mythics MUD is still in development and is my attempt to treat that as the design problem: one interface across the website, mobile, desktop and browser interface and a to the whole text environment and the generator that builds it, as one modular system that scales, stays interactive, and stays accurate.

Why text

Text makes structure visible. There’s no renderer between the player and the graph, no art budget hiding a missing exit. The Forge, the Mythics world generator, produces no images at all. The map is the symbol grid. However it is possible to assign 2d or 3d assets to these.

In a 3D game, ten thousand rooms is an art problem nobody attempts. In text, each room costs a paragraph, so the limit isn’t production. It’s consistency. That’s a problem software and agents can actually work on.

One model for playing and making

The Forge brief starts from one sentence: one data model, the world bundle. Zones of rooms, links between zones, and content attached to rooms: NPCs, items, shops, quests. Every generator is a plugin that writes into it. The game’s importer reads the same shape the generator writes.

The client follows the same rule from the other side. Typed commands, quick buttons, item verbs, and map clicks all resolve to the same validated actions on one authoritative realm. One room graph feeds both the compact node map and the illustrated one. Narration and the side panes come from the same events, so the game never parses its own prose to work out what happened.

The reason is simple. Two interfaces drift. A separate editor with its own format becomes a second world, and the two disagree within a week. If making the world and playing it run through one model, a fix in one place is a fix everywhere.

Layers, not a monolith

The Forge builds in layers. Elevation, temperature, and rainfall noise produce biomes, then rivers, settlements, roads, and dungeon mouths. Each settlement becomes a town with streets and interiors. Then come names per culture, NPCs with homes and schedules, shops priced by town size and local goods, quests bound to real rooms, and a 300-year chronicle in which every event leaves a mark on the land: a battlefield cairn, a plague pit, a treaty stone.

Each layer is its own generator, so any one can be replaced without rebuilding the rest. Dungeons can come from the internal generator or be imported from donjon’s JSON. Generated prose is a floor, not the voice. Any room, NPC, item, or quest can be overridden with my own text, marked as authored, and the generator leaves it alone.

What accurate means

Accuracy is a set of rules the importer can rely on. Every exit is mutual. One exit per direction per room. Every room is reachable from its zone’s start. Every reference in content points at something that exists, and every quest target is a real NPC, item, creature, or room.

The second rule is determinism. Same seed, same output, so rewriting a room description never moves a saved player. On the working branch, a test hashes the full topology of the seed-7 world and fails if any edit changes it.

Names needed their own fix. Picks used to depend on list order, so adding a city could quietly rename three others. Now a committed ledger keys every name to the entity it belongs to, not to its position in a list. Adding a city moves nothing. The change cost one round of renames (Munara became Ponara). After that, the names were pinned.

The third rule is harder: a world can pass every structural check and still be false. An audit of the full build found 227 inns serving one identical menu, 96 of 97 delivery quests sending players to another zone, and a single legendary sword placed six times. All valid graphs, but none of it believable. The fixes were catalogue-backed food, rare items with a lifetime cap of one, and IDs keyed by place instead of build order. Without that last fix, the first content edit would have silently re-keyed every saved hoard.

What scale means here

The numbers are build numbers, not players. An 80×48 map at density 1 builds about 3,400 rooms in two seconds. The seed-7 world builds 361 zones, 11,640 rooms, and 227 settlements in 1.9 seconds, with 3,406 NPCs and 673 quests.

The plan for going further is a set of identity rules more than new hardware. World, room, exit, and quest IDs can’t derive from display names, insertion order, or which worker happens to hold a zone. Mutable game state stays separate from what can be rebuilt. With those in place, distant zones can load lazily later without the world’s references breaking. That part is planned, not built.

Specs

  • Forge: Node 18+, no dependencies, local viewer, headless build to a room-graph bundle. 21 classes, 630 abilities, 14 races, night, rain, and snow variants per room, 60–130 words of description per room.
  • Game: an earlier TypeScript server with a web client ran Forge content locally. On October 29, a fresh character finished the full ten-step beginner journey on it. That build is retained on Railway behind a holding page at mythics.online. On November 1, I chose CoffeeMud (Java) as the game’s basis going forward.
  • Engine: mythics-core is private engine work on the open-source Ryzom Core (NeL) C++ engine. Local builds only.
  • Process: AI-assisted. Codex builds the game, Claude owns the Forge, and each reviews the other’s work.

What stays open

The Forge works. The game doesn’t yet. As of November 3, the CoffeeMud slice had no complete session from new account to first quest reward. The single shared interface, one component source across website, browser, desktop, and phone, is a written contract, not a package. Publishing the accepted world to the wiki is designed but unimplemented.

The generator can already produce a world larger than anyone will walk. The open question is whether it can be made deep enough to be worth walking, and still agree with itself.