AmbonMUD is a Kotlin MUD server (the runtime banner says "QuickMUD") built as a small, event-driven backend. It runs a telnet-compatible TCP server, loads YAML world data at startup, and persists players to disk.
- Tick-based game engine with NPC wandering and scheduled actions.
- Telnet transport with ANSI rendering, prompt handling, and backpressure protection.
- YAML-defined world data with multi-zone room IDs and validation on load.
- Basic player persistence to
data/playersvia YAML files. - Commands for movement, chat, inventory, and simple UI helpers.
- JDK 17
- Gradle wrapper (included)
- Start the server:
./gradlew runOn Windows:
.\gradlew.bat run- Connect with telnet:
telnet localhost 4000The server listens on port 4000 (see src/main/kotlin/dev/ambon/Main.kt).
helpor?: list available commands.lookorl: look around the current room.look <direction>: peek into a direction (e.g.look north).n,s,e,w(ornorth,south,east,west): move.exitsorex: list exits in the current room.say <msg>or'<msg>: speak to the room.emote <msg>: perform an emote visible to the room.who: list online players.name <newName>: claim or log in to a character name.tell <player> <msg>ort <player> <msg>: private message.gossip <msg>orgs <msg>: broadcast to everyone.inventory/inv/i: show inventory.get <item>/take <item>/pickup <item>/pick <item>/pick up <item>: take item.drop <item>: drop item.ansi on/ansi off: toggle ANSI colors.colors: show ANSI demo (when ANSI is on).clear: clear screen (ANSI) or print a divider.quitorexit: disconnect.
World files live in src/main/resources/world and are loaded by WorldFactory.demoWorld(). Each YAML file describes a zone:
zone: demo
startRoom: trailhead
mobs:
wolf:
name: "a wary wolf"
room: trailhead
items:
lantern:
displayName: "a brass lantern"
description: "A brass lantern with soot-stained glass."
room: trailhead
rooms:
trailhead:
title: "Forest Trailhead"
description: "A narrow trail slips beneath ancient boughs."
exits:
north: mossy_pathNotes:
- Room IDs and exit targets can be local (
trailhead) or fully qualified (zone:trailhead). mobsanditemsare optional;roomsandstartRoomare required.- Items may be placed in a
roomor on amob(not both).
Player records are stored in data/players as YAML files. When you run name <newName>, the server either creates a new record or loads the existing one and places the player in their saved room.
./gradlew testSee DesignDecisions.md for architectural rationale and future-direction notes.