Add a dreambook
This commit is contained in:
parent
2d210dfaf5
commit
a81888d0b8
1 changed files with 258 additions and 0 deletions
258
DREAMBOOK.md
Normal file
258
DREAMBOOK.md
Normal file
|
|
@ -0,0 +1,258 @@
|
|||
# dreambook
|
||||
|
||||
a living document. the vision, the philosophy, the wild ideas. not a spec.
|
||||
come back here when you need to remember why this matters.
|
||||
|
||||
|
||||
## why text
|
||||
|
||||
text is not a limitation. it is the medium.
|
||||
|
||||
david jacobson at brandeis studied this: narrow bandwidth doesn't impoverish
|
||||
experience, it enriches imagination. when you read "a torch flickers against
|
||||
wet stone walls" your brain builds a cathedral. VR hands you someone else's
|
||||
cathedral. text worlds are collaborative hallucinations between the author
|
||||
and the reader.
|
||||
|
||||
the MOO community proved this for decades. LambdaMOO, MediaMOO, PMC-MOO -
|
||||
people formed real relationships, built real communities, lived real social
|
||||
lives through nothing but text on a terminal. presence isn't about polygons.
|
||||
presence is about engagement, attention, the feeling that you are *there* and
|
||||
that what happens *matters*.
|
||||
|
||||
we honor telnet. the protocol is the interface. ANSI color, cursor control,
|
||||
alternate screen buffer - these are our tools. a person with a terminal
|
||||
emulator gets the full experience. no browser required. no client download.
|
||||
`telnet mud.example.com 6789` and you're in.
|
||||
|
||||
|
||||
## the world
|
||||
|
||||
not rooms. terrain.
|
||||
|
||||
the world is a large 2D grid of tiles. each tile is a terrain type - grass,
|
||||
mountain, water, forest, sand, whatever the planet calls for. the player
|
||||
sees a viewport into this grid, always centered on themselves. move east
|
||||
and the viewport shifts east. you are always @.
|
||||
|
||||
```
|
||||
...........~~......
|
||||
...^^^^....~~......
|
||||
....^^^^..~~.......
|
||||
.........@.~~......
|
||||
............~~.....
|
||||
.............~~....
|
||||
```
|
||||
|
||||
you're standing between a mountain range and a river.
|
||||
|
||||
```
|
||||
....^^^^..~~.......
|
||||
....^^^^...~~......
|
||||
.........@..~~.....
|
||||
.............~~....
|
||||
..............~~...
|
||||
...............~~..
|
||||
```
|
||||
|
||||
you walked south-east. the mountains are scrolling off the top of the
|
||||
viewport, river's closer. @ never moved on screen. the world moved.
|
||||
|
||||
**terrain types:**
|
||||
|
||||
- `.` grass/ground - the default, walkable, the base canvas
|
||||
- `^` mountains - impassable, you walk around them
|
||||
- `~` water - rivers, lakes, oceans. shallow water (light blue) you can
|
||||
wade through. deep water (dark blue) you can't cross without a boat or
|
||||
ability. you get wet crossing shallow water. that matters (cold, weight,
|
||||
combat penalty, whatever the system wants).
|
||||
- `T` trees/forest - walkable but slower, provides cover
|
||||
- more terrain types per world/planet. different planets use different
|
||||
palettes. earth is green and blue. a desert planet is yellow and brown.
|
||||
same concept, different colors.
|
||||
|
||||
**entities on the map:**
|
||||
|
||||
- `@` you, always centered
|
||||
- `*` other players or mobs. you see a * to the north-east, that's
|
||||
something alive. could be a player, could be a mob. you won't know until
|
||||
you get closer or use a skill/scouter/scan. if multiple entities share
|
||||
a tile the display could show count or just *.
|
||||
|
||||
the viewport size comes from NAWS - we know the terminal dimensions. a
|
||||
small terminal gets a smaller window into the world. a big terminal sees
|
||||
more terrain. the map can sit above the status line or beside a description
|
||||
panel, adapting to available space.
|
||||
|
||||
**movement is tile-based.** cardinal directions (n/s/e/w) and diagonals
|
||||
(ne/nw/se/sw). each step is one tile. movement speed could vary by terrain
|
||||
(forest is slower, roads are faster). the map redraws on every move.
|
||||
|
||||
**the world data** lives in files - YAML, TOML, or even plain text grids.
|
||||
version controlled, human-editable. a world is a set of maps (earth surface,
|
||||
caves, interiors, other planets). runtime state (where players are, mob
|
||||
positions, dropped items) lives in memory. the world definition is the
|
||||
source of truth; instances are ephemeral.
|
||||
|
||||
rooms still exist conceptually - when you enter a building or cave, you
|
||||
transition from the overworld grid into an interior space. that could be
|
||||
its own small grid or a classic room-with-exits. the overworld is terrain,
|
||||
interiors are rooms. both work.
|
||||
|
||||
|
||||
## combat
|
||||
|
||||
inspired by a DBZ MUD. timing-based, not turn-based. not twitch either -
|
||||
there are windows. you read what's happening and respond.
|
||||
|
||||
**attacking:**
|
||||
- punch right/left [target]
|
||||
- roundhouse [target]
|
||||
- (more moves to discover/earn)
|
||||
|
||||
**defending:**
|
||||
- dodge right/left
|
||||
- duck
|
||||
- jump
|
||||
- parry high/low
|
||||
|
||||
you see your opponent telegraph:
|
||||
|
||||
```
|
||||
jake pulls back his right fist
|
||||
```
|
||||
|
||||
that means parry high or dodge left. but not instantly - there's a timing
|
||||
window. too early and you whiff, too late and you eat it. commands have
|
||||
cooldowns. you can't just spam parry.
|
||||
|
||||
**power level** is your health AND your damage multiplier. damage is a
|
||||
percentage function of PL. this creates natural scaling - fights between
|
||||
equals are long and tense, fights against weaker mobs are fast.
|
||||
|
||||
**stamina** governs action economy. empty your stamina and you pass out,
|
||||
vulnerable. resource management matters.
|
||||
|
||||
**progression** has diminishing returns. killing a mob at your PL gives ~10%
|
||||
gain. killing something far below you gives almost nothing. you have to push
|
||||
into harder territory. no grinding weak mobs forever.
|
||||
|
||||
the combat engine is a state machine per encounter, driven by the game loop
|
||||
tick. input is queued, processed each tick, timing windows checked, hits
|
||||
resolved, output sent. the framework supports tweaking all these numbers -
|
||||
timing windows, damage curves, stamina costs, XP formulas.
|
||||
|
||||
|
||||
## session modes
|
||||
|
||||
a player's session has a mode stack. each mode filters what events reach
|
||||
the player and what commands are available.
|
||||
|
||||
- **normal mode**: you see everything - room events, chat, people walking by,
|
||||
weather, ambient messages. full MUD experience.
|
||||
|
||||
- **combat mode**: combat output dominates. you still see urgent things
|
||||
(someone attacking you, system messages) but casual chatter and room
|
||||
ambience get suppressed or buffered for after the fight.
|
||||
|
||||
- **editor mode**: full isolation. you're writing something - a room
|
||||
description, a letter, a piece of IF. the world keeps going but none of
|
||||
it scrolls through your editor. when you exit, you get a summary of what
|
||||
you missed. this is critical for telnet - without mode filtering, world
|
||||
output would destroy whatever you're composing.
|
||||
|
||||
- **IF mode**: you've entered an interactive fiction game within the MUD.
|
||||
you're in a sub-world with its own rooms, puzzles, inventory. other
|
||||
players see "jared is playing The Caves of Doubt in the arcade." fully
|
||||
isolated from main world noise.
|
||||
|
||||
modes can stack. you could be in an IF game and enter combat within it.
|
||||
|
||||
|
||||
## interactive fiction as content
|
||||
|
||||
the MUD can host IF games. a room in the world could be a portal to one.
|
||||
players enter and they're in a self-contained adventure - puzzles, keys,
|
||||
locked doors, inventory, the whole classic IF toolkit.
|
||||
|
||||
IF games could be defined in data files, same as the main world but with
|
||||
puzzle/trigger extensions. or - and this is the MOO dream - players could
|
||||
*create* IF games from within the MUD. builder commands, an in-world editor
|
||||
(editor mode!), test it, publish it. other players play through your
|
||||
creation.
|
||||
|
||||
user-created content is the MOO ethos. LambdaMOO's power was that players
|
||||
built the world. not just decorating - *programming*. we don't need a full
|
||||
in-world programming language (MOO's approach has tradeoffs), but we do need
|
||||
a world-building DSL that's powerful enough to express puzzles, triggers,
|
||||
conditional descriptions, state machines.
|
||||
|
||||
the DSL should be writable in the in-MUD editor. plain text, easy to learn,
|
||||
easy to share. someone with a telnet client and curiosity should be able to
|
||||
create a small adventure.
|
||||
|
||||
|
||||
## presence and community
|
||||
|
||||
from the MOO research:
|
||||
|
||||
- **presence comes from engagement, not fidelity.** you don't need graphics
|
||||
to feel like you're somewhere. you need things to care about.
|
||||
|
||||
- **identity is constructed through language.** your description, your emotes,
|
||||
your speech patterns, your name - these are your body in a text world.
|
||||
|
||||
- **community forms through shared space and shared creation.** people who
|
||||
build together bond. the MOO wizards learned this. the builders learned
|
||||
this. give people tools to shape the world and they'll make it home.
|
||||
|
||||
- **authority shapes culture.** who can build? who can program? who moderates?
|
||||
these aren't just admin decisions, they define what kind of community grows.
|
||||
lean toward trust and openness.
|
||||
|
||||
- **the mask enables authenticity.** jacobson's paradox: removing physical
|
||||
cues doesn't remove identity, it lets people construct identity more
|
||||
deliberately. text worlds let people be who they want to be. that's not
|
||||
deception, it's freedom.
|
||||
|
||||
|
||||
## technical north stars
|
||||
|
||||
- **telnetlib3 is the transport.** it handles telnet protocol, option
|
||||
negotiation, GMCP, MSDP, NAWS. we use it as a dependency, contribute
|
||||
upstream. we already improved CHARSET/MTTS fallback - that's the
|
||||
relationship. users who give back.
|
||||
|
||||
- **async everything.** the game loop is an asyncio task alongside the telnet
|
||||
server. no threads, no blocking. player input → queue → tick → output.
|
||||
|
||||
- **world data in files, state in memory, persistence in SQLite.** world
|
||||
definitions are version controlled YAML/TOML. everything loads into memory
|
||||
at startup. player accounts and progress persist to SQLite. no external
|
||||
database server.
|
||||
|
||||
- **the game loop is tick-based.** 10 ticks/second or whatever feels right.
|
||||
each tick: drain input queues, update combat, run mob AI, flush output.
|
||||
timing-based combat requires a real clock.
|
||||
|
||||
- **simple > clever.** always. readability > performance. the codebase should
|
||||
be approachable. someone should be able to read server.py and understand
|
||||
how connections work in five minutes.
|
||||
|
||||
|
||||
## things to explore later
|
||||
|
||||
- GMCP for rich client data (Mudlet, Blightmud can use structured data
|
||||
alongside raw telnet text - maps, gauges, inventory panels)
|
||||
- MSDP for real-time variable updates (HP bars, stamina, PL)
|
||||
- MCCP for compression (big rooms, lots of text)
|
||||
- alternate screen buffer for map/combat split views
|
||||
- sound via MSP (mud sound protocol) or links
|
||||
- inter-MUD communication (IMC2, I3?)
|
||||
- AI-driven NPCs that actually converse
|
||||
- procedural world generation from templates
|
||||
- seasons, weather, time of day affecting descriptions
|
||||
- crafting systems
|
||||
- housing / player-built rooms in the persistent world
|
||||
- a web client that's just a terminal emulator (xterm.js) pointing at the
|
||||
telnet port - honor the protocol even in the browser
|
||||
Loading…
Reference in a new issue