diff options
| author | historia <[not public]> | 2026-06-16 01:59:27 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-06-16 01:59:27 -0400 |
| commit | 43f21aabae8924f35c12c8485e690aeefe0089fb (patch) | |
| tree | b5fbadb89df3cf4ffec86503bb8e2d7e52b27454 /TODO.md | |
| parent | 4cc1ddcd185509080b4b3e15d1646567edd51c9d (diff) | |
| download | thehouseoficarus-43f21aabae8924f35c12c8485e690aeefe0089fb.tar.gz | |
feat: overhauled ansi color, added prompt options
Diffstat (limited to 'TODO.md')
| -rw-r--r-- | TODO.md | 243 |
1 files changed, 7 insertions, 236 deletions
@@ -1,245 +1,16 @@ -# Third Collapse +# TODO -A low-tech sci-fi MUD set on a terraformed asteroid. Runescape-style combat and skill progression, written in Go. +Upcoming work for Third Collapse. See `AGENTS.md` for architecture, commands, and reference. -## Theme +## Phase 1: Core Skill Chains (breadth over depth) -Takes place on a terraformed asteroid. Technology has regressed — people scrap and scavenge remnants of the old world. "Science" replaces Prayer, "Technology" replaces Magic. Scavenging replaces Runecrafting. - -## Skills (23 total, all go from 1-99) - -``` -Combat: Attack, Strength, Defense, Hitpoints, Ranged, Science, Technology, Assassin -Gathering: Fishing, Woodcutting, Mining, Hacking, Scavenging, Farming, Thieving -Production: Cooking, Smithing, Crafting, Fletching, Alchemy, Construction, Firemaking -Utility: Agility -``` - -## Architecture - -``` -cmd/mud/ Entry point (--config flag, multi-listener) -internal/ - config/ YAML config loading (telnet, http, https listeners) - action/ Behavior system: gather/talk/use/toggle types, drop tables - engine/ Tick scheduler (600ms) - world/ Rooms, exits, ground items, mobs, object instance state - player/ Character sheet, skills, XP, inventory, equipment, validation - combat/ Combat formulas, combat state tracking - object/ ItemDef, ObjectDef, item/object stores - net/ Telnet + HTTPS/WebSocket server, sessions, Conn interface, echo control - game/ Session handler, login flow, command dispatch, action tick, input sanitization -data/ - behaviors/ Behavior YAML files (gather, talk, use, toggle) - drops/ Shared drop table YAML files - rooms/ Room YAML files - objects/ Object definition YAML files - items/ Item definition YAML files - mobs/ Mob definition YAML files - help/ Help topic YAML files - players/ - accounts/ Account YAML files (gitignored) - characters/ Character YAML files (gitignored) -``` - -## Behavior System - -Objects and mobs in rooms can have behaviors. Four types exist: - -| Type | Verbs | Use | -| -------- | --------------------- | -------------------------------------------------------------------------- | -| `gather` | mine, chop, cut, fish | Resource gathering with skill checks, tool requirements, depletion/respawn | -| `use` | use | Crafting stations — consume items, produce output, optional skill checks | -| `talk` | talk, speak, ask | NPC conversation trees with choices, conditions, actions | -| `toggle` | pull, push | Levers, switches, gates — set world flags, conditional on existing values | - -Behaviors are defined in `data/behaviors/<id>.yaml`. Objects reference them with `behavior: <id>`. Mobs can also carry `behavior: <id>` — StartAction falls back to mob lookup when no object matches. - -### Two Depletion Mechanics - -**Per-drop depletion** (mining, regular trees): Set `depletes: true` on a drop entry. The resource depletes on first successful gather of that drop. - -**Shared depletion** (higher-tier trees): Set `deplete_timer: <ticks>` on the behavior. A shared timer counts down while anyone is chopping; when it hits 0, the next successful gather depletes the tree for all players. The timer regenerates back to max when no one is chopping. - -### Bird's Nests - -Set `nest_chance: 256` on a gather behavior to give a 1/256 independent chance to find a bird's nest alongside the normal drop. Bird's nests are searched with the `search` command, rolling on the `birds_nest_drop` drop table. - -### Condition System - -Used by exits, talk options, on-enter scripts, and toggle checks: - -| Field | Scope | Example | -| ------------- | ------------------------------ | -------------------------------- | -| `flag` | World (shared by all players) | `flag: gate_open` | -| `player_flag` | Per-character (quest progress) | `player_flag: finished_tutorial` | -| `has_item` | Player inventory check | `has_item: bronze_key` | -| `all_of` | All sub-conditions must pass | Nested list of conditions | -| `any_of` | Any sub-condition passes | Nested list of conditions | -| `not` | Invert the check | `not: true` | - -### Node Actions (talk dialog) - -Set on nodes in talk behaviors: - -| Field | Effect | -| ------------------ | ------------------------------------------------------ | -| `set_flags` | Sets world flags (global) | -| `set_player_flags` | Sets player-local flags (per-character, saved to YAML) | -| `give_item` | Gives an item to inventory | -| `take_item` | Removes an item from inventory | -| `teleport` | Moves player to a room ID | -| `heal` | Restores hitpoints | - -All fields in a single action are processed together. - -### Accounts & Aliases - -Accounts stored in `data/players/accounts/<name>.yaml`. Each account has: -- Password hash (sha256 + salt) -- Character list -- Alias map (`alias <name> <cmd>` — account-wide, shared by all characters) - -Aliases resolve before built-in commands and support argument passthrough (`alias k kill` → `k man` expands to `kill man`). - -### World - -- Rooms are flat YAML files, read from disk on each access (live editing) -- Everything is YAML-driven — no database -- Exits support conditions (world flags, player flags, items, compound) -- Rooms support `on_enter` scripts with per-step conditions -- Objects can be `hidden: true` (interactable but not listed in room) -- Mobs wander via legal room exits (unconditioned), not hardcoded room lists -- Mob wander config (`wander_rooms`, `wander_interval`) set per-instance in room YAML -- Object wander config same format — objects teleport between listed rooms - -## Implemented - -### Core Systems -- [x] Telnet server, account creation, hashed passwords, account/character management -- [x] HTTPS/WebSocket server with embedded web terminal client -- [x] Multi-listener config (telnet + http + https, any combination) -- [x] YAML config file (`config.yaml`) with `--config` flag and runtime defaults -- [x] 600ms tick engine driving all world simulation -- [x] Room-based player hub with enter/exit/action notifications -- [x] Single-login enforcement, disconnect timer -- [x] Player YAML persistence on every state change -- [x] Transport-agnostic Conn interface (tcpConn + wsConn) -- [x] Password echo suppression (telnet IAC ECHO, web OSC sequences) -- [x] Input sanitization (control character stripping at HandleSession) -- [x] Name validation (alphanumeric+spaces, 3-30 chars) -- [x] Max input line length (1024 bytes) -- [x] WebSocket origin checking (same-origin + loopback) -- [x] Tick-based action queue system (600ms) — commands classified as instant, free, or active -- [x] ActionState system for player activity display in room look -- [x] Smart conflict resolution (multi-player attack/get timestamp ordering, shared depletion deferral) -- [x] Fractional tick system — all YAML timers accept float64, probabilistically rounded -- [x] Configurable tick_length and game_speed for server operators -- [x] Ground item spawn stacking fix (Tick + SeedGroundItems) - -### Commands -- [x] `look / l` — room rendering (mobs, objects, ground items, exits, players) -- [x] `look <target>` — examine mobs, objects, items, players, directions -- [x] `n/s/e/w/u/d` — movement (conditional exits, interrupts combat/actions) -- [x] `get / drop / drop all` — item pickup/drop with stacking, reservations -- [x] `say` — room chat (preserves case) -- [x] `score / inventory / equipment / exits` — character and world info -- [x] `style` — combat style selection (prefix matching) -- [x] `attack / kill <mob>` — combat with numbered targeting -- [x] `mine / chop / cut / fish <object>` — gathering with numbered targeting -- [x] `use <object>` — crafting station interaction -- [x] `talk / speak / ask <target>` — NPC conversations (objects or mobs) -- [x] `pull / push <object>` — toggle interactions (levers, gates) -- [x] `alias <name> <cmd> / unalias <name>` — account-wide command aliases -- [x] `option / options [name] [value]` — 15 character settings (bool, string, int types) -- [x] `queued` — show pending tick actions -- [x] `description / desc / help [topic] / quit` -- [x] `search <item>` — search bird's nests for loot -- [x] `burn [item]` — start a fire from logs on ground or in inventory (smart default) -- [x] `stoke [item]` — add logs to an existing fire for firemaking XP - -### Combat -- [x] RSC-based formulas (attack/defense rolls, max hit) -- [x] Attack styles with bonuses and XP distribution -- [x] Equipment bonuses, HP tracking, death mechanics -- [x] Combat lock timer, movement interrupts combat -- [x] Mob/player regen (1 HP per 100 ticks) -- [x] Mob exit-based wandering, enter/leave/spawn notifications -- [x] Drop reservation system (100-tick owner lock on loot) - -### Skills & Gathering -- [x] Mining (copper rocks, pickaxe, depletion/respawn, gem sub-table) -- [x] Fishing (wandering spots, non-depleting, fishing rod) -- [x] Woodcutting (9 tree types, axes, shared depletion, bird's nests, exhausted message) -- [x] Firemaking (9 log tiers, burn/stoke, fire objects, fire tools: matches/firesteel/lighter) -- [x] Tool system (tool_type + tool_speed on items, tool requirement on behaviors) -- [x] Shared drop tables (referenced by multiple behaviors) -- [x] XP drops for all skill actions (combat, gathering, use) -- [x] Level-up messages across all skills ("*** You are now level N <skill>! ***") -- [x] 23 skill definitions with RSC XP table (4 implemented: Mining, Fishing, Woodcutting, Firemaking) - -### World & Data -- [x] Room, item, object, mob, behavior, drop table YAML loaders -- [x] Object instance tracking (depletion, wandering, respawn, broadcast) -- [x] 21 structured rooms (west gathering wing, east production/utility/combat wing) -- [x] Conditional exits (world flags, player flags, items, compound conditions) -- [x] Room on_enter scripts with conditions -- [x] Hidden objects (interactable but not listed in room output) -- [x] Player-local flags vs world flags for multiplayer state separation -- [x] Compound conditions: all_of / any_of -- [x] Aligned ground item reservation display -- [x] Mob wander config per-instance in room YAML (not on MobDef) -- [x] Object depletion timer display (depletion toggle) -- [x] Bidirectional prefix matching for get/drop/attack/gather commands -- [x] Ambiguity detection when multiple object types match a command -- [x] Smart default targeting for mine/chop/fish (single type → auto-select) -- [x] Smart default targeting for attack/kill (same mob type → auto-target) -- [x] Smart default targeting for burn/stoke (single log type → auto-select) -- [x] Object inroom_description (replaces generic "A X is here.") -- [x] Object removal_item (drops item when object instance is removed) -- [x] Ground item independent despawn timers (no stack merging) -- [x] Ground item despawn display (option: despawn) -- [x] Reserve display format: "reserved for <player> <ticks>t" - -### Documentation -- [x] WORLDBUILDING.md — comprehensive guide with examples -- [x] AGENTS.md — repo structure for LLM context - -## Data Format Reference - -See WORLDBUILDING.md for full examples of every data type with explanations. - -## Action Plan - -### Phase 1: ASCII map implemented with BFS - -- [x] Replaced `toggle` command with `option`/`options` — supports bool (on/off), string (choice lists), and int option types -- [x] All old toggles migrated to the option system (tiny_map, xp_drops, exits, mob_enter, mob_leave, mob_spawn, reserve, depletion, description) -- [x] Added `color` option — support for ANSI 16-color, xterm 256-color, and `none` modes with tag-based color syntax (`<red>text</red>`, `<bold>text</bold>`) and a `color` Go package for programmatic use -- [x] Added `mapwidth` and `mapheight` options for the `map` command viewport size -- [x] `map` command — renders a full ASCII map centered on the player using BFS graph traversal with geometric coordinate assignment -- [x] Shared BFS graph builder (`buildGraph`) reused by both the tiny map (in `look`) and the `map` command -- [x] Added `mappadding` option (none, x, y, xy) — controls blank-row stripping and left-trimming of map output -- [x] Tiny map built via BFS viewport rendering (3x3 room window at 2x zoom) — no hardcoded corner/cardinal rules, no room duplication - - -### Phase 2: Core Skill Chains (breadth over depth) -- [x] Woodcutting — tree objects + axes, shared depletion, bird's nests -- [x] Firemaking — burn (inventory/ground logs → fire object), stoke (add logs to fire), 3 fire tools -- [x] Exhausted message on gather behaviors (custom tree-fall message) -- [x] Depleted message on gather behaviors (custom depleted rock/tree message) -- [x] Level-up messages across all skills -- [x] Smart default targeting for gather/combat/burn/stoke -- [x] Ground item despawn display via new `despawn` option -- [x] Object `inroom_description` replacing generic "A X is here." -- [x] Object `removal_item` for generic cleanup drops (fire → ashes) -- [x] Independent despawn timers per ground item entry - [ ] Cooking — fire/range object (`use` type), raw fish/meat → cooked food - [ ] Smithing — furnace + anvil objects (`use` type), ore → bars → weapons/armor - [ ] Fletching — fletching table object (`use` type), logs → arrow shafts/bows - [ ] Equipment: bronze/iron weapons, axes, cooked trout, arrows, bows -### Phase 3: World Depth +## Phase 2: World Depth + - [ ] Shop system — talk node action for buy/sell interface with credits - [ ] Bank system — deposit/withdraw items at bank booth objects - [ ] Ranged combat — bows/crossbows/ammo, add Ranged to combat formulas @@ -247,11 +18,11 @@ See WORLDBUILDING.md for full examples of every data type with explanations. - [ ] Flee command - [ ] Equipment skill requirements -### Phase 4: Polish +## Phase 3: Polish + - [ ] Hacking, Thieving, Agility, Alchemy, Construction, Crafting, Scavenging, Farming, Assassin - [ ] Quest system (already supported via talk nodes + world/player flags) - [ ] PvP combat, multi-combat zones -- [x] ANSI / xterm256 color output — gather, combat, room names, talk, item names, prompt - [ ] Admin commands - [ ] Persist ground items and mob state across restarts - [ ] More rooms — flesh out the asteroid world |
