mud/docs/how/terrain-generation.txt
Jared Miller 25bb565091
Move notes to docs/how, docs/why, docs/lessons
how/  - how things work (terrain generation, command system)
why/  - design philosophy (telnet-first, text worlds)
lessons/ - things we learned the hard way (charset vs mtts)

Removes notes/ — DAYDREAMING.txt became DREAMBOOK.md, charset-vs-mtts
expanded into docs/lessons/ with the connect_maxwait fix documented.
2026-02-07 13:31:02 -05:00

64 lines
1.8 KiB
Text

terrain generation
==================
the world is a 2D grid of tiles generated deterministically from a seed.
same seed = same world, always.
how it works
------------
1. generate a permutation table from the seed (shuffled 0-255)
2. compute elevation at 1/4 resolution using layered Perlin noise (3 octaves)
3. normalize elevation to [0, 1]
4. bilinear interpolate up to full resolution
5. derive terrain from elevation thresholds:
> 0.75 mountain ^
> 0.55 forest T
> 0.25 grass .
> 0.15 sand :
<= 0.15 water ~
6. trace rivers from random high-elevation points downhill to water
the 1/4 resolution trick is why generation takes ~1s instead of ~9s for a
1000x1000 map. terrain features are large enough that interpolation doesn't
lose visible detail.
geography emerges naturally from noise: mountain ranges form along ridges,
forests cluster at foothills, sand appears at shorelines, oceans fill low
basins. rivers connect highlands to water bodies.
world config lives in worlds/<name>/config.toml:
[world]
name = "Earth"
seed = 42
width = 1000
height = 1000
rendering
---------
viewport is centered on the player (@). size comes from NAWS (terminal
dimensions) — eventually. for now it's a fixed 21x11.
ANSI colors per terrain type:
. grass green
^ mountain dark gray
~ water blue
T forest green
: sand yellow
@ player bold white
* entity bold red
passability
-----------
mountains and water are impassable. forest, grass, sand are walkable.
water will eventually have shallow/deep variants (wadeable vs boat-only).
code
----
src/mudlib/world/terrain.py world generation + noise
src/mudlib/render/ansi.py ANSI color mapping
worlds/earth/config.toml earth config