mud/demo_terrain.py
Jared Miller 0d0c142993
Add seed-based terrain world with movement and viewport
1000x1000 tile world generated deterministically from a seed using
layered Perlin noise. Terrain derived from elevation: mountains,
forests, grasslands, sand, water, with rivers traced downhill from
peaks. ANSI-colored viewport centered on player.

Command system with registry/dispatch, 8-direction movement (n/s/e/w
+ diagonals), look/l, quit/q. Players see arrival/departure messages.

Set connect_maxwait=0.5 on telnetlib3 to avoid the 4s CHARSET
negotiation timeout — MUD clients reject CHARSET immediately via MTTS.
2026-02-07 13:27:44 -05:00

42 lines
1.2 KiB
Python
Executable file

#!/usr/bin/env -S uv run --script
"""Demo script to visualize terrain generation."""
from mudlib.render.ansi import colorize_map
from mudlib.world.terrain import World
def main():
print("Generating world (seed=42, 100x100)...")
world = World(seed=42, width=100, height=100)
print("\nTerrain distribution:")
terrain_counts = {".": 0, "^": 0, "~": 0, "T": 0, ":": 0}
for y in range(100):
for x in range(100):
tile = world.get_tile(x, y)
terrain_counts[tile] += 1
for char, name in [
(".", "grass"),
("^", "mountain"),
("~", "water"),
("T", "forest"),
(":", "sand"),
]:
count = terrain_counts[char]
percentage = (count / 10000) * 100
print(f" {char} {name:10} {count:5} tiles ({percentage:5.1f}%)")
print("\nViewport at center (50, 50) - 40x20:")
viewport = world.get_viewport(50, 50, width=40, height=20)
colored = colorize_map(viewport)
print(colored)
print("\nViewport at (25, 25) - 40x20:")
viewport = world.get_viewport(25, 25, width=40, height=20)
colored = colorize_map(viewport)
print(colored)
if __name__ == "__main__":
main()