How to use this manual
JVMud is an LPC/LPMud engine for the JVM. This manual explains how to understand its design, run a local world, inspect LPC objects, and develop mudlib content against the current repository.
The documented version is 0.1.0-SNAPSHOT. The platform provides a compiler, world model, hosted instances, Telnet sessions, storage adapters, and an admin shell. Compatibility is incremental; a successful build or preload scan does not prove complete gameplay or production readiness.
-
Evaluating JVMud: read Getting Oriented for philosophy, architecture, and the core package map.
-
Running or playing a local world: follow Installing And Running and the Small Mercies walkthrough, then Playing And Testing. Commands in terminal blocks run from the repository root.
-
Operating or debugging: use Operating JVMud and Troubleshooting.
-
Writing LPC: follow LPC Authoring and Mudlibs; keep the configuration and command references nearby.
-
Changing Java: start with the package map, then Developer Reference.
Examples identify whether input belongs in a terminal, the admin shell, or a Telnet client. Replace angle-bracket placeholders with actual values; do not type the angle brackets. A mudlib is the LPC source and configuration that define a game.
The manual owns procedures, concepts, and LPC reference material. Java API pages describe Java contracts. The website provides project information and links into these two documentation sources.
Terms used in procedures
A Player is an identity; a Session is a connection; a Persona is the Entity through which that Player acts in a World. A Place provides locality, a Link connects Places, and a Location identifies containment. A loaded LPC object can also be a service with no physical presence.
A manifest is the profile’s .config file. It selects source paths, startup
objects, lifecycle mappings, language features, and engine capabilities. A
profile includes this manifest and the mudlib-side adapters needed to host that
content. Legacy terms such as room and heart_beat are used when naming actual
LPC paths or compatibility methods.
Getting Oriented
Start with what JVMud means by a world, then follow how its packages collaborate. The architecture is an ownership model; it is not a claim that every planned engine behavior is complete.
Overview
JVMud compiles LPC source to JVM bytecode and loads that code as live objects. The engine models shared world concepts; a mudlib supplies fiction, commands, rules, and presentation. The hosted instance brings these parts together, while Telnet gives players a line-oriented way to participate.
The distribution includes Small Mercies, a tiny teaching world. Start with its walkthrough, or choose or author a compatible LPC source tree and declare its hosting requirements in a manifest. Shared launchers always require that manifest explicitly.
The Java code is one Maven project with responsibility-based packages. The packages described here are not separately released Maven modules.
The JVMud Philosophy Of MUD
JVMud is built around eight core concepts:
-
Game
-
Text
-
Interactive
-
Multiplayer
-
World
-
Persistence
-
Temporality
-
Presence
Together, these concepts define what JVMud means by MUD.
A MUD is an interactive, multiplayer, text-centric game set in a persistent, temporal, player-present world.
JVMud is not a general-purpose simulation framework, chat server, collaboration platform, generic game engine, or generic MUD framework. It is specifically and by design an LPMud engine: a platform for imagining, creating, operating, and playing LPC-authored game worlds in the tradition of LP MUDs.
Game
The world exists to be played. JVMud assumes rules, mechanics, goals, challenges, progression, or other game-like structures.
Text
Text is the primary medium through which the world is perceived and manipulated. It is a first-class part of the engine’s design, not a skin over a visual game.
Interactive
Players can affect the world, and the world can affect players. Actions have consequences.
Multiplayer
Multiple players inhabit the same world simultaneously. The world is shared.
World
The game takes place within a concrete virtual domain. JVMud describes this domain in terms of Places, Links, Entities, and Movement.
Places give the world locality. Links make Places traversable. Entities are the things that exist in that structure. Movement changes where an Entity is present.
Persistence
The world and its state endure independently of any individual player’s session. A player may disconnect and later return to a world whose state has continued to exist.
Persistence does not require eternal continuity. Reboots, resets, and selected save/restore behavior can all be compatible with a persistent world.
Temporality
The world can change through time. Events occur, actions have consequences, and state evolves.
Temporality is separate from Persistence: a world can have active time, saved state, restored state, and reset state without treating all of those as the same idea.
Presence
Presence means that a player experiences the game from within the World. The player is not an outside observer manipulating a simulation from above.
In JVMud terms, a player participates through a Persona: an Entity that serves as the player’s current point of perception and action. A Persona is located somewhere, and that location determines what the player can perceive and what actions are locally available.
Players are somewhere, not everywhere. Presence creates locality of information, which makes exploration, discovery, concealment, surprise, navigation, and mystery possible.
LPC Compatibility And Engine Vocabulary
JVMud has one mudlib and language target: LPC for LPMud-style worlds. Its compatibility work exists to make JVMud a deeper LPMud platform, not to broaden it into a multi-language MUD framework.
An LPMud, in JVMud’s sense, is a game world authored in LPC, compiled into live game objects, and able to be rewritten, recompiled, and reloaded while the game continues running.
That does not mean JVMud adopts every legacy LPMud driver term as engine ontology.
Legacy names such as rooms, objects, heartbeats, applies, call_outs, and master objects may appear in compatibility surfaces, mudlib source, and LPC-facing documentation. The engine-facing model remains JVMud’s own model: Game, Text, Interactive, Multiplayer, World, Persistence, Temporality, and Presence, built from Places, Links, Entities, Players, Sessions, and Personas.
Architecture
JVMud has four top-level Java packages: language, execution,
communication, and storage.
language turns LPC source into executable JVM code and supplies the runtime
support that code needs. It owns preprocessing, scanning, parsing, semantic
analysis, IR, bytecode generation, efun contracts, loading, and diagnostics.
execution separates three responsibilities:
-
applicationstarts JVMud, owns public endpoints and administrator authority, supervises separate worker JVMs, and supports installation updates. It remains available with zero mudlibs. -
modeldefines worlds, Places, Entities, Locations, Links, identities, time, and mudlib boundary contracts.WorldRuntimeenforces rules such as single containment and valid movement. These concepts do not own process supervision. -
instanceassembles language runtime facilities and model state into one running mudlib. It boots content, attaches Personas, invokes lifecycle hooks, and serializes input and ticks on the worker’s execution queue.
communication owns human-facing interaction. Its transport packages handle
sockets, Telnet, administration framing, and connection lifecycle. Its admin
package interprets administrative commands and maintains session state; its
console package supplies the terminal client. Structured client messages and
text presentation live in protocol and output. Player commands continue to
be interpreted by the mudlib.
storage owns durable representations and adapters, including filesystem
accounts, LPC object state, JDBC services, and administrator identities and
grants. Execution uses these services without owning their storage formats.
The mudlib supplies authored content, fiction, object behavior, player commands,
and compatibility policy. It lives under mudlibs/, outside the Java package
tree. A player connects through communication code to an execution instance,
which runs language-compiled behavior against model state and storage services.
These packages organize responsibilities within the project. Separate worker JVMs give each mudlib independent runtime state and contain worker process crashes. Workers retain the host account’s OS permissions; this architecture provides fault isolation, not an OS security sandbox.
Core packages and repository tour
All Java package names below begin with io.github.protasm.jvmud.
| Package | Responsibility and starting points |
|---|---|
|
LPC compilation and runtime support. Start with |
|
|
|
|
|
Durable adapters under |
src/main/java/ contains these packages; src/test/java/ mirrors them.
mudlibs/<name>/source/ contains LPC content, and mudlibs/<name>/jvmud/
contains manifests, adapters, and profile-specific scripts. Inspect the selected
profile before assuming all mudlibs have the same storage layout.
manual/ contains editable AsciiDoc; docs/ contains the site, generated manual,
and API. Shared tools live in scripts/. pom.xml defines dependencies and
build profiles. See Documentation Generation before editing generated pages.
Installing And Running
This chapter gets one local listener running and proves that a player can reach it. Database requirements depend on the selected profile.
Installing
Installing a preview package
Download the archive matching your platform from Downloads. A POSIX terminal and a Telnet-capable MUD client are required. The platform packages include Java; the runtime-free package requires Java 21 or newer. Maven is not needed.
In a terminal, go to the writable folder containing your download. For Apple Silicon, run the commands below; for another platform, replace the archive filename with your download:
mkdir current &&
tar -xzf jvmud-0.1.0-preview.9-macos-aarch64.tar.gz --strip-components=1 -C current &&
cd current &&
scripts/jvmud-start smallmercies
Keep the installation in current across releases. These commands stop if that directory already exists; use the updater below for an existing installation.
Wait for the mudlib’s state=RUNNING status, then connect a Telnet-capable MUD client to 127.0.0.1:4000 with SSL/TLS disabled. Select Small Mercies to see its direct Telnet address, then connect to that player port. Choose a guest name, gender, and class. Try help, look, and north. Stop the server with Ctrl+C.
Update an installation
Before updating, record the running mudlib names and player/admin port pairs with
status in the engine console. Back up the external engine state directory
separately; it contains administrator credentials, grants and TLS keys.
From your existing current directory:
scripts/jvmud-update --check
scripts/jvmud-update
The updater verifies the latest matching download, stops this installation’s servers cleanly, and creates a full backup in ../backup/, beside the distribution folder. It updates JVMud and shipped mudlib jvmud/ files, then restarts the servers. Other mudlib content and saved data remain in place. Starting with preview.6, comment-only configuration differences do not block updates, edited Markdown documentation is backed up and replaced, and genuine adapter/configuration conflicts are reported together before downtime. The updater already installed performs each upgrade. External files and databases need separate backups.
The updater restarts engines with their original arguments. Mudlibs started
through administration are not automatically restarted. After the update, use
scripts/jvmud-console --owner and restore them with their recorded ports, for
example start smallmercies 4100 4101 and start lp245 4200 4201. Use status
to verify both. The previous flag --local is replaced by --owner in preview.8.
The installation folder keeps its name across releases; the updater reports the installed version. Do not rename a running installation. Stop its servers cleanly first, then relaunch them from the new location with their original options and update any external paths. The bundled Java runtime is available through jre; engine logs live in .jvmud/log/ and worker logs in the private engine state directory. Players must reconnect after an update. Earlier previews without the updater require a manual migration; see the package README for recovery and migration details.
Starting with preview.9, the updater prints the mudlibs that were running before
shutdown, their original player/admin ports, and console commands for those
that require a manual restart. The inventory is retained in the backup’s
.jvmud/servers records. It also identifies mudlibs restarted from launch
arguments. When upgrading from an older release, record status yourself:
the updater performing that upgrade is still the older installed version.
Building from source
You need a JDK that can compile Java 21, Maven, Git, and a POSIX shell for the repository launch scripts. Some profile-owned smoke scripts also require Bash or Python 3. A Telnet-capable client is needed for interactive play. The bundled Small Mercies walkthrough needs no database or saved-account setup.
git clone https://github.com/protasm/jvmud.git
cd jvmud
java -version
mvn -version
mvn -DskipTests compile
Check that Maven reports the intended JDK. The compiler release is set to 21 in
pom.xml. The first build needs access to Maven dependencies; later builds may
use the local cache. Successful compilation creates target/classes/.
For an existing checkout, run commands from its root. Do not clone over local work. Tests are described in Testing And Verification; compiling alone does not run them.
Running JVMud
For a ready-to-run example, use First steps with Small Mercies. To host your own content, select a JVMud-compatible LPC source tree and its manifest. JVMud is the host; it does not choose game content implicitly. The manifest must describe real source files, including an initial Place and the profile’s player behavior. Small Mercies is the bundled teaching example; the same host contract applies to other compatible content.
In a terminal at the repository root:
scripts/jvmud-start <mudlib-config-file>
Replace <mudlib-config-file> with the absolute path to your manifest, or a path
relative to the repository root. Do not type the angle brackets. The script
compiles Java, resolves the dependency classpath, and runs the Telnet server in
the foreground. Wait for the preload summary followed by
the engine endpoint report and the mudlib’s state=RUNNING status before connecting.
The launcher defaults to loopback port 4000. Use --bind 0.0.0.0 --port 4000
to accept incoming connections on all IPv4 interfaces, or choose a specific
local address and a different port. Clients use the server’s actual address;
allow the selected TCP port through applicable firewalls and router forwarding.
Each listener needs an available address/port pair. Mounted profiles, if declared,
must also be present and valid. See Configuration Reference for manifest keys.
To capture detailed startup failures:
scripts/jvmud-start --trace-startup-loads <mudlib-config-file> > target/startup.log 2>&1
This still runs in the foreground. Inspect the log from another terminal and
stop with Ctrl+C. Trace output can be large; begin with the preload summary and
first failure. To see launch syntax, use scripts/jvmud-start --help.
Ctrl+C stops the engine and its worker JVMs. Persistence remains mudlib-specific; shutdown does not promise a snapshot of every loaded object. Engine administration is always available on its separate TLS port (default 4001) and local Unix socket. Use the administration console workflow described in the next section.
Offer several mudlibs
scripts/jvmud-start smallmercies lp245
The engine player port presents a selection menu, including for a single mudlib. Each mudlib receives a direct player port and a separate TLS admin port, shown in engine status. Each worker owns its execution queue and configurable clock. Quitting a mudlib closes the connection; reconnect to select another.
Starting with no manifests is valid. Use engine administration to start mudlibs later and to request explicit player/admin port pairs. A failed mudlib startup leaves engine administration and other mudlibs available.
First steps with Small Mercies
Small Mercies is JVMud’s bundled toy mudlib: five rooms, a few talkative NPCs, and sparring opponents with more confidence than good sense. It demonstrates a native LPC profile without database setup, account registration, or saved characters. Use it to learn the player flow and to find small source examples.
Launch and create a guest
From the repository root:
scripts/jvmud-start mudlibs/smallmercies/jvmud/smallmercies.config
Wait for the engine endpoint report and the mudlib’s state=RUNNING status. In a second terminal or
Telnet-capable MUD client, connect to 127.0.0.1 on port 4000:
telnet 127.0.0.1 4000
Answer each prompt separately:
-
Choose a name containing 2–16 letters. It must be different from the names of players currently connected.
-
Choose
maleorfemale. -
Choose
warriorormage.
You arrive in the Village Square. Type help, then score.
There is no password. A guest character exists for one connection: disconnecting
ends that character’s visit, and reconnecting starts character creation again.
| Class | STR | INT | DEX | Starting HP |
|---|---|---|---|---|
Warrior |
12 |
6 |
9 |
32 |
Mage |
6 |
12 |
9 |
26 |
Warriors use STR for their attacks; mages use INT for sparks. DEX helps dodge.
score also shows victories and the current opponent, when fighting. Gender
changes the character description, not the attributes or rules.
Explore the whole world
Every exit has a return route. Read look to see a description, exits, and nearby
characters. Use full directions, their initials, or go <direction>.
| Place | Exits |
|---|---|
Village Square |
|
The Resting Hero |
|
Municipal Herb Garden |
|
Very Short Lane |
|
Cellar of Mild Peril |
|
From a fresh arrival in the square, enter these player commands one at a time:
look
talk mayor
west
talk innkeeper
rest
east
north
look goose
south
east
down
look rat
up
west
You finish back in the square. rest restores full health only at the inn.
talk addresses an NPC in your current Place. Try who to list connected
adventurers. say Hello! and smile, wave, bow, or laugh provide local
communication. Connect a second guest to try these with another player.
Try a short sparring match
From the square, go north, then type attack goose. Combat repeats every two
seconds; you do not need to repeat the attack command. kill goose is an alias.
Use stop or move south to end the bout. The rat in the cellar is the other
sparring opponent; the mayor and innkeeper are friendly.
A defeated NPC rests for 20 seconds before recovering. A player defeat sends you
to the inn with 1 HP; rest restores full health. NPCs spar with one challenger
at a time; their remaining HP persists when a visitor stops or leaves. There is no player-versus-player combat. If an opponent is resting or
occupied, return later rather than repeatedly issuing attack.
Use score to check health and victories, then quit to end your visit.
//quit is the default transport disconnect control. Neither creates a saved
character. NPC state remains shared while the server runs; restarting resets the
world. Stop the server with Ctrl+C in its terminal when finished.
Read the implementation
The manifest selects room/square and player/adventurer, maps object loading to
create, interaction scope to init, session connection to connect, and
session disconnection to disconnect. It grants session_control and maps
recurring ticks to tick; there is no filesystem-account policy or database.
Path under mudlibs/smallmercies/ |
What to learn |
|---|---|
|
Explicit source root, preload manifest path, Persona, initial Place, lifecycle mappings, and capability grant. |
|
Startup object paths, one per line in load order. |
|
Shared descriptions, authored exit lookup, and NPC creation. |
|
Small Place definitions with prose, exits, and resident NPCs. |
|
Guest creation, command registration, movement, communication, score, and recurring combat. |
|
NPC identity, dialogue, single-challenger combat, and deferred recovery. |
These LPC examples use JVMud-native efuns. Game rules stay in the mudlib; the host supplies execution, session, location, and scheduling services. Read the source before changing behavior, then replay the relevant route after restarting. Use a separate copy for experiments you do not intend to keep in the distribution.
The two-guest live Telnet check lives at
src/test/scripts/smallmercies/smoke-play.py.
Connecting With Telnet
In a second terminal, use a Telnet client:
telnet 127.0.0.1 4000
If your system has no telnet command, use a Telnet-capable MUD client with host
127.0.0.1 and port 4000. Follow the mudlib’s login prompts, then try help
and look. Use //quit to disconnect from profiles using the default transport prefix. The listener keeps
running until stopped in its own terminal.
Optional GMCP integration
JVMud’s Telnet listener supports ordinary line-oriented clients and negotiates
the Generic Mud Communication Protocol (GMCP) as Telnet option 201. The server
offers GMCP with IAC WILL GMCP; clients that accept it can exchange UTF-8 GMCP
subnegotiations without affecting the visible text stream.
Mudlibs with the session_control engine capability can use:
-
jvmud_gmcp_enabled()orjvmud_gmcp_enabled(user)to test negotiation state. -
jvmud_send_gmcp(package)for a package without a payload. -
jvmud_send_gmcp(package, payload)to JSON-encode LPC strings, numbers, arrays, and string-keyed mappings.
An interactive LPC object may implement
client_protocol_changed(string protocol, int enabled) to react to negotiation
and receive_gmcp(string package, mixed payload) to receive decoded client
messages. JVMud owns Telnet framing and JSON conversion; mudlib code owns the
meaning of packages such as Room.Info and Char.Vitals.
Smoke Tests
For the bundled toy, run its focused integration test from the repository root:
mvn -Dtest=SmallMerciesTest test
This boots the real profile and exercises character creation, movement, room-local communication, and scheduled combat. It does not start a TCP listener; use the route in First steps with Small Mercies for live transport verification.
For an automated live check, start a fresh Small Mercies listener as described in the walkthrough. Keep it running, then use a second terminal:
python3 src/test/scripts/smallmercies/smoke-play.py
The script connects to loopback port 4000, creates two disposable guests, and
checks login, both classes, chat, an emote, the tutorial route, combat, score,
rest, and quit. Success prints PASS: live guest login…. It does not launch
or stop the server. Use a dedicated development listener so another player’s
sparring match or a resting NPC does not interfere.
To compile every object in Small Mercies' source/preload_objects manifest:
scripts/scan-mudlib-preload-compile.sh mudlibs/smallmercies/jvmud/smallmercies.config
The scanner checks compilation; the focused test above also exercises gameplay.
A host smoke test should prove the complete route from launch to interaction, using the profile you intend to run:
-
Start the listener with its explicit manifest and wait for the listening message.
-
Connect a Telnet client and complete the configured login or entry flow.
-
Exercise a known command and verify its expected text.
-
Move through a known Link and verify the new Place.
-
Disconnect and reconnect to check cleanup and any state the profile promises to save.
-
Stop the listener and retain the first error if a step fails.
Use a disposable account and state directory selected for the test. Profile-owned scripts may automate these steps, but the shared engine does not prescribe game names, account names, commands, locations, or credentials.
Passing proves that profile’s particular transcript. It does not prove all language behavior or multi-user reliability. Separate compiler assertions, preload scans, and live player evidence when reporting results.
Playing And Testing
Player commands belong to the selected mudlib. JVMud handles transport controls and delivers ordinary input to the hosted world.
Login Flow
Connect only after the listener reports that it is ready. Follow the profile’s prompts rather than sending gameplay commands before entry is complete.
There are two configuration patterns:
-
With
session_policy = filesystem_accounts, JVMud performs local account-file and password-verification work. It then dispatchesplayer_persona_resolvedandplayer_entered_worldto mudlib-owned methods selected in the manifest. -
Without a managed session policy, the configured interactive object supplies the login conversation through its mapped session-connection lifecycle method.
persona_object selects the interactive LPC source; player_object is the
legacy manifest spelling. Method names and prompts belong to that source tree,
not to a universal JVMud game flow.
For a repeatable test, record the manifest, whether the account is new or existing, the prompt where input was sent, and the first unexpected reply. Exclude passwords and private account fields from shared transcripts.
Basic Commands
Read the selected world’s welcome text and help after entry. A profile may
provide verbs such as help, look, or movement directions, but JVMud does not
require a universal gameplay vocabulary. Use the exact verbs and exits documented
by your authored content.
For a first route, inspect your current Place, choose one listed exit, move, and verify that the description changes. Record the expected text in your test. These are player-client inputs; the local admin shell has a separate grammar.
With the default transport prefix, //help shows connection controls and
//quit disconnects the client. A mudlib’s own exit command can run game-specific
saving and cleanup. For persistence tests, exercise that command as well as
transport disconnect/reconnect.
Command Routing
Input passes from the Telnet session to the hosted instance and the profile’s
LPC command behavior. The configured transport.control_prefix reserves an
escaped namespace for connection controls; its default is //.
-
//helpand//quitare transport controls in profiles using the default transport prefix. -
lookand movement verbs go to the mudlib after login. -
Ordinary single-slash commands remain available to mudlib code.
-
load,inspect, andreloadrun through the authenticated admin connection against the selected live mudlib. They are not player Telnet commands.
If a command is unrecognized, first identify which of these contexts received it. Then check the active profile’s lifecycle mappings and command registration.
Transcript Regressions
For a useful regression report, record the repository revision, manifest path, startup summary, client input, expected result, actual output, and server error. Use a small route with known starting state. A successful login is a different assertion from successful movement, persistence, or selection from the mudlib menu.
Start with the Small Mercies walkthrough and the relevant tests under
src/test/java/io/github/protasm/jvmud/execution/instance/ and transport/. Add a focused
assertion for the first wrong behavior, then replay the route against a restarted
listener when runtime code changes. Avoid treating a long transcript with no
assertions as proof of compatibility.
Operating JVMud
Use the local admin shell to investigate object behavior, the manifest to define hosting policy, and the server log to diagnose a running listener.
Administration consoles
The engine starts independently of mudlibs. Its player port presents a public directory of direct connection details; its TLS admin port manages mudlib lifecycles and engine-owned administrator grant records. Each mudlib runs in a separate worker JVM with its own player/admin port pair. Mudlib administration operates on that worker’s live objects.
Owner and administrator access
The owner of an engine instance is the operating-system account that owns its
private state directory, normally the account that starts it. Owner access grants
full engine authority through a Unix-domain socket on the host. Run the console
as that account, directly or through SSH. This does not require Unix root or
sudo; ownership is not a grant in the administrator registry.
An administrator is a named JVMud identity with an access token and explicit
grants. Administrators connect over TCP/TLS. An engine grant includes all
mudlibs and administrator management; mudlib:<id> is limited to one mudlib.
These identities are separate from OS accounts and player accounts.
| Invocation | Transport | Authentication and authority |
|---|---|---|
|
Default engine’s Unix socket |
OS owner; full engine authority |
|
Specified Unix socket |
Same owner authentication |
|
TCP/TLS to |
Fingerprint, administrator name and token; explicit grants |
|
TCP/TLS; default port 4001 |
Same administrator authentication |
--owner must stand alone. --socket requires a path. Neither uses a TCP port
or administrator credentials. Omitting flags uses TLS administrator access even
though the destination is localhost.
Bootstrap and connect
Bootstrap as the engine owner:
scripts/jvmud-start
# In another terminal:
scripts/jvmud-console --owner
admin-create operator
grant operator engine
available
start smallmercies 4100 4101
status
--owner uses ~/.jvmud/engine-4000/engine.sock and authenticates through your
OS account. For custom engine state, use --socket <state-directory>/engine.sock.
Store the issued random token securely; it is displayed only once. The engine stores its hash and grants. Remote connections require the certificate fingerprint printed by the engine, obtained through a trusted channel:
scripts/jvmud-console # localhost:4001
scripts/jvmud-console server.example # server.example:4001
scripts/jvmud-console server.example 4401 # server.example:4401
The console prompts for the trusted certificate fingerprint, administrator name,
and token. Token input is hidden. These values are not saved between connections.
Supply --user, --fingerprint, and --token-file <private-file> when no
interactive terminal is available. Explicit --host and --port options remain
supported. Local TCP connections use the same TLS authentication; the Unix socket
provides initial bootstrap and recovery. Engine grants include all mudlibs;
grant <name> mudlib:<id> limits an administrator to one mudlib. Grants are
independent of OS accounts, player accounts and in-game wizard privileges.
available lists names under the engine’s configured mudlib directory.
start <name> resolves <mudlib-dir>/<name>/jvmud/<name>.config and defaults to
player/admin ports 4100/4101. Occupied ports return an error. Supply another pair
for additional mudlibs, or 0 0 for OS-allocated ports. Engine ports still default
to 4000/4001.
The host operator selects --mudlib-dir at startup; it defaults to mudlibs
under the launch root. Both local and networked administration reject host
paths, traversal, and escaping symlinks. Restarts revalidate the same boundary.
Connect to a mudlib’s admin port for objects, inspect, call, reload, and
other mudlib commands. quit disconnects only the console. stop and restart
are engine commands; shutdown stops the engine and all workers. A worker crash
closes its connections while leaving the engine and other mudlibs running.
The private engine state defaults to ~/.jvmud/engine-<player-port> and contains
its recovery socket, registry, TLS identity and bounded worker logs. Override it
with --state-dir. Keep it outside mudlib trees. Workers launch directly with
Java and retain the host account’s OS permissions. Separate JVMs contain worker
crashes; they are not a security boundary against hostile code. No external
sandbox package is required.
See the repository’s docs/ENGINE-ADMINISTRATION.md for isolation limits, timeout
behavior, certificate management and the complete operating workflow.
Runtime Model
WorldRuntime enforces single containment and rejects containment cycles.
Places connect through Links; Entities can be contained by Places or Entities.
Players participate through Personas attached to Sessions. Time-dependent work
uses the engine scheduler.
Hosted LPC execution also keeps object environment and inventory state in its
runtime context. Do not assume every loaded service object is a world-present
Entity, or that all compatibility bookkeeping has been unified with
WorldRuntime. The repository’s docs/DEFERRED_WORK.md records this boundary
and the remaining world-event/concurrency work.
The filesystem_accounts policy stores account records under accounts/ in its
selected mudlib root. LPC object save/restore and JDBC data are separate storage
surfaces. Before an upgrade or reset, identify the active profile’s state paths
and database, stop writers, and preserve those stores. The project does not yet
provide a universal backup/restore command or a verified production recovery
procedure; test restoration on a disposable copy of the profile’s data.
Mudlib Boundary
The manifest declares how a profile participates in JVMud. initial_place
selects the starting Place. persona_object (or legacy player_object) selects
the interactive LPC object. Preloads, include paths, lifecycle methods, syntax
features, and capabilities are explicit.
To adapt a profile:
-
Begin with its current
.configfile and identifymudlib_root. -
Verify the initial Place, Persona, and preload paths exist.
-
Map JVMud lifecycle events to the mudlib’s method names.
-
Enable only the syntax and engine capabilities the profile needs.
-
Launch it, inspect the preload summary, and test login and a small command route.
Unknown keys fail validation. language_features controls optional syntax;
engine_capabilities authorizes capability-gated efuns. Neither is a substitute
for the other. See Configuration Reference for the supported keys.
docs/ENGINE_MUDLIB_CONTRACT.md is the detailed design contract. Keep native world
semantics in the engine and profile vocabulary in manifests or dedicated shims.
Example declaration
The following is a manifest shape, not a complete runnable world. Each source path must exist in your authored tree; the chosen method names must match it.
game_id = <your-world-id>
mudlib_root = ../source
initial_place = place/start
persona_object = persona/player
lifecycle.player_session_connected = connect
transport.control_prefix = //
Add preloads, mapped world-entry behavior, account policy, syntax gates, and host capabilities only as required by that content. Validate startup before testing player interaction.
LPC Authoring
Supported LPC
JVMud supports LPC as the source language for LPMud-style game worlds. The goal is not to preserve every historical driver quirk. The goal is to provide a clear, practical LPC platform for writing mudlib code that can be compiled, loaded, inspected, reloaded, and hosted by JVMud.
There is no single authoritative LPC. LPC grew through the work of hobbyists, enthusiasts, and mudlib authors building real worlds on real drivers. Over time, different drivers and mudlibs carried the language in different directions. Many LPC features are therefore best understood as dialect features, compatibility conventions, or driver-specific behavior rather than as parts of one universal standard.
When this manual says JVMud supports LPC, it means JVMud supports the LPC language surface described here, plus the compatibility behavior needed to host the mudlibs JVMud is designed to run.
This topic describes the supported language surface at a high level. It is a working authoring guide, not a complete grammar reference.
Source Files And Objects
An LPC source file compiles to a loadable game object. Source files may define:
-
fields
-
methods
-
forward method declarations
-
inherited parent objects
JVMud supports ordinary inherit declarations with string paths:
inherit "/obj/thing";
The parser also recognizes virtual inherit syntax for compatibility with
mudlib source that uses it:
virtual inherit "/obj/base";
The runtime resolves object paths through the configured mudlib source root and include paths. Path policy is part of the runtime and mudlib configuration, not the LPC language itself.
Types
JVMud supports the LPC types currently needed by the compiler and hosted mudlibs:
-
int -
float -
string -
status -
object -
mapping -
mixed -
void -
array forms such as
int *,string *, andmixed *
Use explicit return types, field types, local variable types, and parameter types in JVMud-maintained LPC. Explicit types make compiler errors clearer and avoid importing legacy driver ambiguity into the engine contract.
string short() {
return "a brass lantern";
}
int count;
void set_count(int value) {
count = value;
}
Untyped methods and untyped parameters are rejected. Compatibility syntax does not remove the requirement for explicit signatures.
Declarations And Modifiers
Fields and methods may use the common LPC declaration modifiers that JVMud currently recognizes:
-
public -
private -
protected -
static -
nomask -
varargs -
nosave -
deprecated
The varargs modifier applies to methods only and requires the varargs
language feature. Protected evaluation, typed function literals, inline
callables, and multi-value mappings also have explicit profile feature gates.
private int count;
nosave mixed transient_state;
public string query_name() {
return "lantern";
}
varargs void message(string text, object target) {
write(text);
}
Multiple field declarators are supported in a single declaration:
int x, y, z;
string *names, title_words;
Statements
JVMud supports the statement forms used by ordinary mudlib control flow:
-
blocks
-
expression statements
-
if/else -
while -
do/while -
for -
foreach -
break -
continue -
return
Both foreach (… in …) and foreach (… : …) forms are supported.
Mappings may be iterated with key and value variables.
int total(int *values) {
int sum;
foreach (int value in values) {
sum += value;
}
return sum;
}
void describe_mapping(mapping values) {
foreach (string key, mixed value in values) {
write(key + ": " + value + "\n");
}
}
Typed local declarations are supported in blocks and in for initializers.
A for initializer may declare one typed local variable.
Expressions
JVMud supports the expression forms expected in practical LPC mudlib code:
-
integer, float, string, true, false, and null-like zero values
-
array literals
-
mapping literals
-
local and field access
-
assignment and compound assignment
-
method calls
-
efun calls
-
object-style invocation with
→ -
parent calls through
super -
indexing and slicing
-
ternary expressions
-
comma expressions in loop clauses
-
protected evaluation with
catch
Supported operator families include arithmetic, comparison, equality, logical, bitwise, shift, and unary operators.
mixed *values = ({ "north", "south", "east" });
mapping exits = ([ "north": "/room/green", "south": "/room/road" ]);
string first = values[0];
mixed *rest = values[1..2];
if (sizeof(values) > 0 && exits["north"]) {
write("There is a way north.\n");
}
Adjacent string literals are accepted as one string value, which is useful for long room descriptions:
string long() {
return "The corridor is narrow and cold. "
"A brass lantern hangs from a hook.";
}
Collections
Arrays and mappings are first-class LPC values in JVMud.
Array literals use LPC’s ({ … }) form. Mapping literals use LPC’s
([ key: value ]) form.
mixed *items = ({ "lamp", "key", "coin" });
mapping descriptions = ([
"lamp": "A small brass lantern.",
"key": "A tarnished iron key."
]);
Indexing is supported for arrays, mappings, and strings where the runtime type allows it. Slicing is supported for strings and array-like values.
Efun Calls
JVMud exposes engine functions as efuns. Ordinary efun calls use the familiar LPC call form:
write("Hello.\n");
sizeof(({ 1, 2, 3 }));
Qualified efun::name(…) calls are supported for engine efuns:
return efun::sizeof(({ 1, 2, 3 }));
The efun catalog is documented separately in this manual and in the generated Java API documentation for the engine efun registry.
Function References And Inline Callables
JVMud recognizes LPC function-reference forms used by mudlibs, including quoted function references and efun references:
#'db_close
efun::db_handles()
Inline callable forms used with collection helpers such as filter and map
are supported for the compatibility patterns currently exercised by hosted
mudlibs.
Preprocessor And Includes
JVMud includes a preprocessor with support for ordinary include resolution, macro expansion, conditional directives, and source mapping. Include behavior depends on the runtime/compiler configuration for the mudlib being compiled.
Use includes for shared LPC constants and declarations, but keep engine-facing concepts in JVMud vocabulary. LPC headers should help mudlib code compile; they should not redefine the engine’s model of Places, Entities, Players, Sessions, or Personas.
Runtime-Oriented LPC
JVMud supports the LPC patterns needed to host live LPMud objects:
-
object loading
-
method invocation
-
inherited behavior
-
selected lifecycle methods
-
command hooks such as
init,add_action, andadd_verb -
player/session text output helpers
-
save and restore helpers for LPC object state
-
timed behavior through scheduler-backed compatibility functions
These features are compatibility surfaces over JVMud’s engine model. They make LPC mudlib code usable without making legacy driver vocabulary the engine’s own ontology.
Current Limits
JVMud’s LPC support is intentionally practical and evolving. If a historical LPC feature is not needed by the hosted mudlibs, it may be absent, partial, or accepted only as a compatibility parse form.
In particular:
-
supported LPC means the JVMud compiler and runtime currently have behavior for the construct, not that every legacy driver variant behaves identically
-
compatibility syntax may exist before full runtime behavior exists
-
JVMud-authored source should prefer explicit types and simple declarations
-
engine concepts should be documented as JVMud concepts, not as legacy LPC driver concepts
When in doubt, prefer the forms already used by JVMud mudlib code and covered by compiler or telnet smoke tests.
Explicit Types
Declare return types and every parameter type. Untyped methods and parameters
are compiler errors. Use mixed when a value intentionally varies, and void
when a method returns no value.
These are the default typing rules. A mudlib can explicitly select
compiler.dynamic_types = true to treat all declared value types as mixed.
This does not allow missing method declarations; legacy declaration syntax
requires its own opt-in. See the compatibility section for the policy boundaries.
For a disposable authoring exercise, save this as example/counter.c beneath
the selected mudlib source root (create the directory if needed):
int count;
int add(int amount) {
count += amount;
return count;
}
int increment() {
return add(2);
}
int query_count() {
return count;
}
In the admin shell, run load /example/counter, then use its returned handle
with call <handle> increment and call <handle> query_count. Both calls should
return 2 on a fresh object. Use inspect <handle> to see its fields and methods.
This exercise needs no legacy efun aliases. Remove only your disposable example
when finished; keep upstream mudlib source intact.
The current admin call command passes supplied arguments as strings; it does
not coerce numeric text to LPC integers. This exercise uses a no-argument method
to call the typed integer helper. Test non-string argument contracts through LPC
wrappers or the Java execution API.
Efuns
The jvmud_ identifier prefix is reserved for JVMud engine symbols. Mudlib code
may call jvmud_* efuns, but may not declare names with that prefix, including
functions, fields, parameters, locals, or macros. This also applies to mfuns and
compatibility shims. The compiler rejects violations even when the particular
name is not yet an engine efun. Strings and comments are unaffected.
Profile predefines and engine-function aliases cannot repurpose reserved names
either; an alias may retain an engine function’s identical native spelling.
Name game policy separately: Small Mercies uses mercy_random(n) for favorable
dodge rolls and jvmud_random(n) for the engine’s uniform random primitive.
Explicit efun:: and jvmud:: calls still bypass mudlib function resolution.
Efuns expose host operations to LPC. Ordinary calls may resolve through mudlib
functions or the active boundary’s translation table. efun::name(…) selects
that efun surface; jvmud::name(…) requires an exact native JVMud efun name.
int sample_size() {
return jvmud::jvmud_size(({ 1, 2, 3 }));
}
The native form does not invent a jvmud_ prefix or translate sizeof.
Legacy aliases belong in the profile. A recognized efun can still require an
engine_capabilities grant, such as mudlib_files, database, session_control,
or host_control.
Use the efun catalog for signatures and categories, and
language.efun.builtin.CoreEfuns for implementation details. Do not duplicate the
catalog in a mudlib guide. When a call fails, check its spelling, argument types,
profile mapping, and required capability.
Ordinary JSON
jvmud_parse_json(document) converts an ordinary JSON document to LPC values.
JSON objects become mappings with string keys; arrays retain their order;
strings and numbers remain scalar values; booleans become status values 1
and 0; and JSON null becomes LPC false (0).
mapping item = jvmud_read_mudlib_json(
"/data/items/i0001.json.gz");
jvmud_read_mudlib_json(path) is available to mudlibs with the MUDLIB_FILES
engine capability. It parses either plain JSON or gzip-compressed JSON, detected
from the file content rather than the filename.
jvmud_format_json(value) performs the inverse conversion for values that can
be represented in ordinary JSON. Mapping keys must be strings. Because LPC
false and a parsed JSON null share the value 0, formatting a parsed value is
not promised to reproduce the original JSON token-for-token.
Bounded JSON Array Reads
Mudlibs with the MUDLIB_FILES engine capability may read a structural slice
without materializing an entire JSON document:
mixed *items = jvmud_read_mudlib_json_array(
"/data/catalog.json", "/items", 500, 100);
The second argument is an RFC 6901 JSON Pointer selecting an array. offset is
the zero-based first entry and count is the maximum number returned. JVMud
scans forward through ordinary JSON, but skips unrelated branches and entries
outside the requested range without constructing their LPC values. An empty
pointer selects a root array. Plain and gzip-compressed documents are both
accepted.
Efun catalog
Boundary Role
JVMud’s core efuns use JVMud-native names. Legacy driver names belong in mudlib compatibility profiles through engine function aliases such as engine_function.jvmud_size = sizeof. That keeps familiar LPC source usable without making old driver vocabulary the engine model.
Mudlib code can also qualify calls. efun::name(…) bypasses mudlib shim methods while still honoring configured engine-function aliases. jvmud::name(…) resolves only JVMud-native efuns, such as jvmud::jvmud_size(…); it does not invent a jvmud_ prefix for bad calls.
Current Core Efuns
This page mirrors the built-in catalog registered by CoreEfuns. Overloaded families are shown with arity ranges when each overload has the same behavior.
Output And Perception
void jvmud_write (mixed message)-
Writes text to the active output sink.
void jvmud_write_to_lpc_object (object target, mixed message)-
Writes text to a target object’s bound session, when it has one.
status jvmud_rebind_session_lpc_object (object newObject, object oldObject)-
Moves an interactive session binding from one LPC object to another.
void jvmud_emit_perceivable (mixed emitter, mixed message)-
Emits a perceivable message from an entity or path-resolved object.
void jvmud_emit_perceivable_except (mixed emitter, mixed message, mixed excluded)-
Emits near an entity while suppressing one explicit recipient.
void jvmud_emit_perceivable_at (mixed location, mixed message)-
Emits a perceivable message at an explicit location or path-resolved object.
Current Context
object jvmud_current_lpc_object ()-
Returns the currently executing LPC object.
object jvmud_previous_lpc_object ()-
Returns the previous LPC object in the active call chain, when available.
object jvmud_current_actor ()-
Returns the active command actor, falling back to the current object.
object jvmud_current_agent ()-
Returns the active world-present Agent for the action scope, or LPC false when none is active.
string jvmud_current_verb ()-
Returns the verb being dispatched for the current command.
object jvmud_previous_object ()-
Compatibility spelling for the previous LPC object on the runtime call stack.
Command Dispatch
mixed jvmud_dispatch_entity_command (mixed actor, string commandLine)-
Dispatches a text command as an entity or path-resolved object.
void jvmud_enable_commands ()-
Marks the current object as command-capable.
void jvmud_add_action (string methodName)-
Remembers a method as a command action without registering a verb yet.
void jvmud_add_action (string methodName, string verb)-
Remembers an action method and registers a verb for it.
void jvmud_add_action (string methodName, string verb, status prefix)-
Registers a verb for an action method, optionally as a prefix verb.
void jvmud_add_verb (string verb)-
Registers a verb for the most recently remembered action method in the current interaction scope.
Time And Scheduling
int jvmud_time ()-
Returns Unix epoch seconds from the host clock.
string jvmud_format_time (int epochSeconds)-
Formats epoch seconds using the host default time zone.
int jvmud_random (int max)-
Returns a value in
[0, max), or0whenmax ⇐ 0. void jvmud_schedule_recurring_tick (int enabled, int intervalSeconds)-
Schedules or disables recurring temporal ticks for the current object.
void jvmud_schedule_deferred_callback (string methodName, int delaySeconds)-
Schedules a one-shot callback on the current object.
void jvmud_schedule_deferred_callback (string methodName, int delaySeconds, mixed arg…)-
Schedules a one-shot callback with one to four mudlib-supplied arguments.
int jvmud_cancel_deferred_callback (string methodName)-
Cancels matching deferred callbacks and returns the runtime cancellation result.
Objects, Entities, And Containment
string jvmud_lpc_object_id (mixed object)-
Returns the registered runtime object id for a loaded LPC object.
status jvmud_method_exists (string name)-
Reports whether the current object exposes a public mudlib method.
status jvmud_method_exists (string name, mixed object)-
Reports whether another loaded object exposes a public mudlib method.
array jvmud_inherited_programs (mixed object)-
Returns the transitive LPC program paths inherited by a generated object.
mixed jvmud_find_lpc_object (string path)-
Returns an already loaded LPC object, or LPC false when it is not loaded.
mixed jvmud_find_object (string path)-
Returns an already loaded shared object, or LPC false when it is not loaded.
object jvmud_load_lpc_object (string path)-
Loads or returns the shared LPC runtime object for a mudlib path.
object jvmud_clone_lpc_object (string path)-
Clones an LPC object and returns the new runtime instance.
mixed jvmud_invoke_lpc_object (mixed target, string methodName, mixed arg…)-
Invokes an optional method on an object or path-resolved shared object; registered for arities 2 through 6.
void jvmud_destroy_lpc_object (object object)-
Destroys an LPC object and removes it from runtime indexes.
void jvmud_set_entity_location (mixed entity, mixed location)-
Sets an entity’s location or containment directly.
void jvmud_move_entity (mixed entity, mixed destination)-
Moves an entity or path-resolved object through runtime containment.
object jvmud_find_entity (string id)-
Finds an entity by id in the default scope.
object jvmud_find_entity (mixed id, mixed location)-
Finds an entity by id inside a supplied location or container.
object jvmud_entity_location ()-
Returns the current object’s immediate location.
object jvmud_entity_location (mixed entity)-
Returns another entity’s immediate location.
object jvmud_first_entity_at (mixed location)-
Starts traversal of entities in a location or container.
object jvmud_next_entity_at (mixed entity)-
Continues traversal from a previous entity in the same inventory walk.
Aliases, Capabilities, And Light
void jvmud_bind_entity_alias (object entity, string alias, mixed location)-
Binds a lookup alias for an entity in a location scope.
object jvmud_find_entity_alias (string alias, mixed location)-
Resolves an alias in a location scope.
status jvmud_entity_has_alias (mixed entity, string alias)-
Reports whether an entity has a registered alias.
status jvmud_entity_commands_enabled (mixed entity)-
Reports whether command handling is enabled for an entity.
void jvmud_set_entity_translucent (mixed entity, status translucent)-
Controls whether ambient perception such as light passes through an entity container.
status jvmud_entity_translucent (mixed entity)-
Reports whether an entity is currently translucent.
int jvmud_set_light (int delta)-
Adjusts current runtime light and returns the resulting light value.
Sessions, Users, And Host Requests
array jvmud_users ()-
Returns the active user/player objects known to the runtime.
status jvmud_interactive (mixed user)-
Reports whether an object is bound to an active session.
mixed jvmud_interactive_info (mixed user, int key)-
Returns LPC false for driver-specific interactive metadata JVMud does not expose.
mixed jvmud_lpc_object_info (mixed object, int key)-
Returns LPC false for driver-specific LPC object metadata JVMud does not expose.
mixed jvmud_object_info (mixed object, int key)-
Returns LPC false for driver-specific object metadata JVMud does not expose.
status jvmud_configure_lpc_object (mixed object, int key, mixed value)-
Accepts driver-specific LPC object configuration requests conservatively.
status jvmud_configure_object (mixed object, int key, mixed value)-
Accepts driver-specific object configuration requests conservatively.
void jvmud_shutdown ()-
Accepts legacy shutdown requests without exposing driver control to mudlib code.
void jvmud_set_this_player (mixed player)-
Accepts legacy current-player mutation requests while JVMud keeps session ownership engine-side.
void jvmud_raise_error (mixed message)-
Raises a runtime exception with the supplied LPC message.
int jvmud_query_idle (mixed user)-
Returns idle time for a runtime session/user target.
mixed jvmud_query_ip_number (mixed user)-
Returns the user’s remote address, or LPC false when unavailable.
mixed jvmud_runtime_info (int key)-
Returns LPC false for unsupported runtime metadata queries.
void jvmud_capture_session_input (string methodName, int noEcho, mixed arg…)-
Routes the next session input line to a method on the current object; registered for arities 2 through 8.
status jvmud_transfer_player_to_game (string gameId)-
Asks the host to transfer the current player to another registered game.
Files, Persistence, And Databases
mixed jvmud_read_mudlib_text (string path)-
Reads a mudlib-relative text file, returning LPC false when unavailable.
mixed jvmud_read_mudlib_text (string path, int startLine, int lineCount)-
Reads a line slice from a mudlib-relative text file for legacy file helpers.
mixed jvmud_read_mudlib_json (string path)-
Parses a mudlib-relative ordinary JSON file, transparently accepting gzip compression.
mixed jvmud_read_mudlib_json_array (string path, string pointer, int offset, int count)-
Streams a bounded slice from a JSON array selected by RFC 6901 JSON Pointer, returning LPC false when the file is unavailable.
array jvmud_list_mudlib_paths (string path)-
Lists mudlib-relative paths with default listing flags.
array jvmud_list_mudlib_paths (string path, int flags)-
Lists mudlib-relative paths, including simple glob support for compatibility discovery.
status jvmud_append_mudlib_text (string path, mixed text)-
Appends text to a mudlib-relative file.
status jvmud_remove_mudlib_text (string path)-
Removes a mudlib-relative file.
int jvmud_copy_mudlib_text (string source, string destination)-
Copies a mudlib-relative file, returning zero for success.
int jvmud_rename_mudlib_text (string source, string destination)-
Renames a mudlib-relative path, returning zero for success.
status jvmud_create_mudlib_directory (string path)-
Creates a mudlib-relative directory.
status jvmud_remove_mudlib_directory (string path)-
Removes an empty mudlib-relative directory.
status jvmud_save_lpc_object_state (string path)-
Persists the current object’s LPC fields.
status jvmud_restore_lpc_object_state (string path)-
Restores the current object’s LPC fields.
int jvmud_db_connect (string database)-
Opens a configured JDBC database handle.
int jvmud_db_connect (string database, string user, string password)-
Opens a JDBC database handle with mudlib-supplied credentials.
int jvmud_db_exec (int handle, string sql)-
Executes SQL and retains any result cursor for later fetches.
mixed jvmud_db_fetch (int handle)-
Returns the next result row as an LPC array, or LPC false when no row remains.
mixed jvmud_db_error (int handle)-
Returns the last SQL error for a handle.
status jvmud_db_close (int handle)-
Closes a database handle.
array jvmud_db_handles ()-
Returns currently open database handles.
string jvmud_db_escape (mixed value)-
Escapes text for mudlib-generated SQL.
Security Helpers
string jvmud_hash_password (string password)-
Returns a PBKDF2-SHA256 password hash string.
status jvmud_verify_password (string password, string encodedHash)-
Verifies a password against a hash created by
jvmud_hash_password.
Text And Regex
string jvmud_lowercase_text (mixed value)-
Converts text to lowercase.
string jvmud_uppercase_text (mixed value)-
Converts text to uppercase.
array jvmud_split_text (string text, string delimiter)-
Splits text on a literal delimiter while preserving empty trailing fields.
mixed jvmud_regex_match (array values, string pattern)-
Returns values whose string forms match a compatibility regular expression, or LPC false when none match.
mixed jvmud_regex_match (array values, string pattern, int flags)-
Compatibility regex match with flags.
string jvmud_regex_replace (string input, string pattern, mixed replacement, int flags)-
Performs compatibility regex replacement for legacy mudlib text helpers, including function callbacks that receive each matched string.
array jvmud_regex_explode (string input, string pattern)-
Splits text around regular-expression matches while preserving matched delimiters.
int jvmud_to_int (mixed value)-
Converts numeric values and base-10 text to an integer, returning false-style zero for non-numeric input.
string jvmud_to_string (mixed value)-
Converts a mixed LPC value to JVMud text form.
string jvmud_capitalize_text (mixed value)-
Capitalizes the first character of text.
string jvmud_wrap_text (mixed text)-
Wraps description text at the default 78-column width.
string jvmud_wrap_text (mixed text, int width)-
Wraps description text at a requested line width.
string jvmud_format_text (string format, mixed arg…)-
Formats text using the host formatter; registered for arities 1 through 24.
string jvmud_extract_text (mixed value, int from)-
Extracts text from an inclusive start index through the end.
string jvmud_extract_text (mixed value, int from, int to)-
Extracts text using inclusive start and end indexes.
Collections, Types, And Values
int jvmud_size (mixed value)-
Returns the size of a string, collection, mapping, or array.
int jvmud_member (mixed value, mixed needle)-
Checks mapping key membership or returns the index of a value in an array or string.
array jvmud_mapping_keys (mapping value)-
Returns a mapping’s keys in runtime iteration order.
array jvmud_mapping_values (mapping value)-
Returns a mapping’s values in runtime iteration order.
mapping jvmud_mapping_from_keys (array keys)-
Builds a mapping whose keys come from an array and whose values are LPC true.
mapping jvmud_mapping_delete (mapping value, mixed key)-
Removes a key from a mutable mapping and returns the same mapping.
string jvmud_serialize_lpc_value (mixed value)-
Serializes LPC data values to JVMud’s tagged JSON payload.
mixed jvmud_deserialize_lpc_value (string data)-
Restores LPC data values produced by
jvmud_serialize_lpc_value. mixed jvmud_parse_json (string document)-
Parses ordinary JSON into LPC mappings, arrays, strings, numbers, and 1/0 status values; JSON null becomes LPC false.
string jvmud_format_json (mixed value)-
Formats LPC-compatible data as ordinary JSON; mapping keys must be strings.
status jvmud_is_string (mixed value)-
Reports whether the value is Java-backed LPC string data.
status jvmud_is_int (mixed value)-
Reports whether the value is Java-backed LPC integer data.
status jvmud_is_object (mixed value)-
Reports whether the value is a live runtime object.
status jvmud_is_array (mixed value)-
Reports whether the value is Java-backed LPC array data.
status jvmud_is_mapping (mixed value)-
Reports whether the value is Java-backed LPC mapping data.
mapping jvmud_filter_indices (mapping values, function callback, mixed arg…)-
Returns entries whose keys satisfy a callable predicate; registered for arities 2 through 8.
array jvmud_allocate (int size)-
Returns a zero-filled LPC array of non-negative size.
int jvmud_sscanf (mixed input, mixed format, mixed capture…)-
Scans text into supplied capture targets; registered for arities 3 through 8.
Lifecycle Hooks
JVMud emits native events; a manifest maps them to LPC methods. For example:
lifecycle.object_loaded = reset
lifecycle.interaction_scope_started = init
lifecycle.player_session_connected = logon
These are illustrative legacy method names, not required names. Native profiles can map the same events to their own typed LPC methods.
Read the lifecycle reference for each event’s role. Verify the mapped method’s signature in the profile and corresponding Java dispatch code before adding a hook. Test normal entry, failed input, and disconnect paths; recognizing a method name does not establish its invocation order or error behavior.
Perception
World communication is separate from private session output. An emitted perception reaches the source’s location and its immediate contents, excluding the source and any explicitly excluded recipient. It does not recursively reach carried objects or apply sensory rules such as hearing distance or line of sight. Recipients are snapshotted before callbacks; destroyed recipients are skipped.
// Emit structured speech with text for connected observers.
jvmud_emit_world_event(this_object(), "speech", "mellon", "A voice says: mellon\n");
// Address one observer without broadcasting to its neighbors.
jvmud_deliver_world_event(target, "speech", "mellon", "A voice whispers: mellon\n");
These native functions take (mixed source_or_target, string kind, mixed content,
string text). The existing jvmud_emit_perceivable* functions emit text events
with their original message as content. jvmud_write_to_lpc_object remains private
output and does not notify world observers.
Map lifecycle.perception_received to an observer method taking one mapping.
Each observer receives its own mapping containing actor, source, location,
kind, content, text, and directed (0 or 1). Missing object references are 0.
The originating command actor is preserved during synchronous delivery; events
outside a command may have no actor. The receiver is the current object.
Text is delivered once to each connected recipient, independently of its hook.
A mudlib may also map lifecycle.perception_delivery to a boundary-object method
with (object observer, mapping event). It runs after the observer method and
can adapt observations to the mudlib’s conventions. LP245 uses this to call the
optional catch_tell method with exact, unwrapped legacy text. Neither hook is
required. Callbacks may emit further events; nesting beyond 64 deliveries raises
an error and unwinds the delivery. Callback errors propagate to the existing
command/scheduler error handling and can interrupt the remaining recipients.
Lifecycle event reference
How Mudlibs Register Events
A mudlib registers interest through its MudlibBoundary. Configuration keys such as lifecycle.object_loaded = reset map an engine event to a mudlib method. A mudlib can also declare handled_lifecycle_events as metadata before a concrete method mapping exists.
No lifecycle event is globally required. If no method is configured, JVMud continues the engine-owned operation. If a method is configured but the target object does not define it, JVMud skips the call unless a future event contract marks that call required.
Configuration Names
Event names are case-insensitive in mudlib config, and hyphens or spaces normalize to underscores. Older aliases such as player_connected, player_bound, and interaction_scope_entered are accepted for existing manifests, but the current contract names below are preferred.
Current Lifecycle Events
SERVER_STARTED-
Implemented. After the declared boundary object and preload manifest have loaded, JVMud invokes the configured no-argument method on the boundary object. A compatibility profile can map a driver-specific master-startup convention here without teaching that convention to the engine.
OBJECT_LOADED-
Implemented. Invoked on a loaded or cloned object with one argument,
mixed first_load; current compatibility passes0. Example compatibility mapping:reset. OBJECT_ACTIVATED-
Reserved. Names a reactivation moment for reload, reset, or world maintenance, but JVMud does not currently invoke it.
OBJECT_SOURCE_MISSING-
Implemented. Invoked on the configured boundary object when a shared object path is requested but no source exists. The method receives the normalized requested path and may return an object to bind to that path. Example compatibility mapping:
compile_object. OBJECT_DESTRUCTION_REQUESTED-
Implemented. Invoked on the configured boundary object before destruction, passing the target object. The return value is advisory. Example compatibility mapping:
prepare_destruct. OBJECT_DESTROYED-
Reserved. Names a post-destruction cleanup point for future policies that need an after-the-fact notification.
ENTITY_ARRIVED_AT_PLACE-
Reserved. Names the moment after an entity completes movement into a Place.
ENTITY_DEPARTED_FROM_PLACE-
Reserved. Names the moment when an entity leaves a Place, paired with
ENTITY_ARRIVED_AT_PLACE. ENTITY_ADDED_TO_ENTITY-
Reserved. Names the moment when an entity enters another entity’s containment.
ENTITY_REMOVED_FROM_ENTITY-
Reserved. Names the moment when an entity leaves another entity’s containment.
PLAYER_SESSION_CONNECTED-
Implemented by the hosted server path. The configured player object method is invoked without arguments and may start login or character selection. Example compatibility mapping:
logon. PLAYER_SESSION_POST_REBIND-
Implemented by the hosted server path after a compatibility session handoff changes which LPC object receives player input. The configured method is invoked without arguments on the newly bound object.
PLAYER_PERSONA_RESOLVED-
Implemented for host-managed session policies. Delivers the external user ID, display name, gender text, and policy-defined profile attributes to the selected Persona.
PLAYER_OBJECT_BOUND-
Reserved. Names the moment when JVMud has associated a live mudlib projection with a Player, Session, and Persona.
PLAYER_ENTERED_WORLD-
Implemented for host-managed session policies. Delivers the configured starting Place object after the Player’s Persona has entered the world.
PLAYER_SESSION_DISCONNECTED-
Implemented by the hosted server path. The configured player object method is invoked without arguments so the mudlib can save or clean up session-owned state. Example compatibility mapping:
quit. INTERACTION_SCOPE_STARTED-
Implemented. Invoked without arguments on the active Persona, its location, objects in that location, and carried objects. Compatibility mudlibs usually register local text commands here. Example compatibility mapping:
init. COMMAND_DISPATCH_STARTED-
Reserved. Names the moment before JVMud dispatches a Player command line to mudlib behavior.
COMMAND_DISPATCH_FINISHED-
Reserved. Names the moment after JVMud finishes dispatching a Player command line.
LOG_ERROR-
Implemented. Invoked on the configured boundary object with the object path and diagnostic message for compilation or load-time diagnostics. Example compatibility mapping:
log_error. RUNTIME_ERROR-
Implemented for timed runtime errors and server-layer error handling. Invoked on the configured boundary or error handler object with details about target, context, operation, and message. Example compatibility mapping:
runtime_error. SCHEDULED_TICK_ERROR-
Implemented. When a scheduled tick throws, JVMud can invoke this specialized error event in addition to
RUNTIME_ERROR. Example compatibility mapping:heart_beat_error. SERVER_SHUTDOWN-
Implemented by the hosted server path. Invoked on the configured boundary or error handler object with the shutdown reason. Example compatibility mapping:
notify_shutdown. SCHEDULED_TICK-
Implemented through temporal tick configuration rather than a per-event method mapping. The boundary chooses the recurring tick method and default interval; compatibility shims may expose names such as
set_heart_beat. DEFERRED_CALLBACK-
Reserved as a named event. Concrete one-shot callbacks are currently scheduled with explicit callback method names through runtime efuns.
Compatibility Shims
Keep imported source as upstream material. Put compatibility functions, aliases,
headers, and lifecycle translations in the profile’s jvmud/ area where possible.
mfun_object supplies mudlib-global helpers; compatibility_object and
compatibility_overrides support explicit compatibility overrides.
For a missing legacy operation, first identify whether the gap is syntax, a native engine operation, or profile policy. Add generic compiler/engine behavior only when it belongs to JVMud; map legacy vocabulary in the profile. Do not relax explicit typing to accommodate an untyped legacy declaration.
Record the motivating source and test in docs/COMPATIBILITY_FEATURE_PROVENANCE.md
when changing compatibility features. The result should remain usable without
hardcoding a particular game into shared Java or launch scripts.
Opt-In Legacy Method Transpilation
A bridge manifest may explicitly set transpilation.untyped_methods = true.
The default is false. JVMud’s io.github.protasm.jvmud.language.transpiler subpackage
adds explicit mixed return and parameter types to untyped method signatures
in memory after preprocessing and before parsing. Includes, inherited objects,
and global helper objects use the same profile setting. Existing explicit types
and method bodies remain unchanged, and inserted tokens retain the original
source locations. The compiler still rejects missing explicit method types when
transpilation is disabled. This accommodation does not imply support for every
legacy LPC dialect feature and never rewrites imported files.
Opt-In Dynamic Value Typing
Set compiler.dynamic_types = true when a mudlib’s value declarations are
documentary. The default is false. The compiler retains written type names but
uses stable mixed storage for fields, locals, parameters, return values, and
typed function literal declarations. Array declarations impose no restriction.
Includes, inheritance, global helpers, and hosted bridge objects use the same
policy. Assignments cannot narrow storage after compilation.
Modifiers, argument structure, native function contracts, explicit conversions, and runtime operation checks remain in effect. Duplicate methods of the same arity remain errors. Missing declarations require the separate untyped-method switch. Mixed defaults and empty returns use LPC zero. Existing unsupported syntax, including legacy casts, remains unsupported.
LP245 selects this policy instead of its former 51 field and 24 local type
overrides. Its JSON file retains only the method-varargs rule for room/room.c:init.
Remove field/local type overrides before enabling dynamic typing; combining them
is rejected. Checked overrides remain available for mudlibs using strict typing.
Restart the instance when changing typing policy so every object is recompiled under the same policy.
Checked Field-Type Overrides
Select a bridge-owned JSON file explicitly in the manifest:
transpilation.overrides = transpilation.json
The override file path is relative to the manifest directory. This setting is
independent of transpilation.untyped_methods; neither enables the other.
{
"field_type_overrides": [
{
"file": "obj/torch.c",
"field": "amount_of_fuel",
"expected_type": "string",
"replacement_type": "int"
}
]
}
file identifies a filesystem compilation unit relative to mudlib_root.
Rules apply after preprocessing, so declarations expanded from its headers are
part of that unit. They also apply when the unit is loaded as an inherited
object, global helper, or bridge object. In-memory snippets without a source
file path are not matched by file overrides.
The named field must occur exactly once with the expected type. A mismatch,
missing field, or duplicate declaration stops compilation at the TRANSPILE
stage. Invalid JSON, unknown keys, duplicate rules, missing source files, and
unsupported field types are errors. Fields can use int, float, string,
object, mixed, mapping, function, or status, with optional array stars.
The JSON vocabulary also supports local_type_overrides and
method_varargs_overrides; those adaptations are separate from field rules.
Grouped declarations are split when necessary to preserve neighboring fields' types, modifiers, and initializer order. Locals, parameters, method bodies, and string values are not field override targets. Source locations are retained for diagnostics and original files are never rewritten. Rules are read at manifest load; restart the instance to load changed configuration.
Mudlibs
A profile combines authored LPC with explicit hosting requirements. Native and legacy profiles share the JVMud host while owning their own vocabulary and game rules.
Layout
A useful source layout separates authored content, host configuration, and writable state. This is an illustrative convention, not a required game:
<content-root>/
source/ LPC source, headers, and authored data
jvmud/ manifest and host-facing adapters
<state-area>/ profile-selected writable data
mudlib_root selects the actual source root. If the manifest lives in jvmud/,
mudlib_root = ../source resolves from that directory. Inspect persistence code
before choosing, moving, or cleaning state paths; not every store uses a sibling
state directory.
Supply peer manifests to scripts/jvmud-start <manifest> <manifest> ….
The engine offers them in a connection menu. Each must have a unique game id.
mount.* declarations and world-hopping are unsupported. No manifest owns or
implicitly discovers other worlds.
Small Mercies follows this separation under mudlibs/smallmercies/. Its guest
characters are transient; it does not demonstrate durable account storage.
Validate a profile
Before hosting content, check these responsibilities against your source tree:
-
the manifest’s initial Place and Persona paths resolve to real LPC objects;
-
includes, inherited objects, and preloads resolve under the intended root;
-
lifecycle mappings name methods with the expected signatures;
-
optional language features and engine capabilities match actual requirements;
-
writable stores exist where the persistence policy expects them;
-
each configured world boots independently and can be selected directly from the engine menu.
For a load failure, reproduce the same object under the same manifest in the
admin shell with verbosity watch. Changes to includes, syntax flags, or adapters
can affect many objects, so rerun focused tests and the relevant live route.
Upstream Source Policy
Preserve upstream material and provenance. Prefer dedicated shims and manifest
mappings to broad source rewrites. Keep necessary source fixes small and tested;
a content bug is not automatically a compiler defect. Never commit private saves
or secrets. Use database.password_env for database credentials.
Developer Reference
Use the core package map to choose where a change belongs, then follow the compiler and hosted-instance flows below. The Java API provides class and method contracts for all six core package families.
Compiler Pipeline
JVMud is easiest to understand as a collaboration between compiler, engine, and mudlib. The compiler turns LPC source into JVM classes. The engine owns the live world model. The mudlib supplies authored behavior and compatibility policy.
The compiler pipeline is deliberately staged so each step has a small job and a clear artifact:
| Stage | Input | Output |
|---|---|---|
Preprocess |
LPC source text plus include paths and macro definitions |
Expanded source with mappings back to the original files |
Scan |
Preprocessed source |
A token stream |
Parse |
Tokens |
An abstract syntax tree for one LPC object |
Analyze |
AST plus inherited object metadata and registered efun signatures |
A semantic model with resolved names, signatures, and type information |
Lower |
Semantic model |
Typed intermediate representation |
Compile |
Typed IR |
JVM bytecode |
Execute |
Bytecode plus host runtime configuration |
A loaded LPC object instance managed by the host-facing LPC runtime |
The package layout follows that path. preproc, scanner, token, parser,
semantic, ir, and bytecode are compiler stages. pipeline coordinates the
stages and reports CompilationProblem values when a source unit cannot move
forward. efun defines the LPC-facing function contract, and
efun.builtin.CoreEfuns provides JVMud’s built-in catalog.
The package io.github.protasm.jvmud.language.runtime is support code for
compiled LPC bytecode: active execution context, truthiness, coercions,
indexing, strings, arrays, and runtime type descriptors. It is not the JVMud
engine ontology. Engine-owned concepts live under io.github.protasm.jvmud.execution.application
with execution.model.world for WorldRuntime,
Place, and Entity; execution.model.identity for Player, Session, and Persona
records; execution.model.time for scheduling; and execution.model.mudlib for mudlib lifecycle
boundaries.
Instance And Transport Internals
execution.application.JVMud starts engine endpoints independently of mudlibs and supervises
one separate worker JVM per mudlib. MudlibWorker boots through MudlibBoot and
reports readiness over private pipes. The engine then publishes the mudlib’s
player/admin pair. PlayerGateway provides the engine menu and direct relays;
worker-side TelnetServer handles only its own mudlib’s protocol sessions.
There is no return-to-menu operation after a player selects a mudlib.
Each MudInstance owns a MudlibExecution: one thread serving its command queue
and clock. Player input, protocol callbacks, administration, and scheduled work
run serially there. Each manifest supplies its own temporal_tick_interval;
zero disables automatic ticks. Ticks use a delay after the preceding tick
completes, without accumulating catch-up ticks. No router-wide tick loop or
cross-world execution lock exists.
Telnet delivers input without interpreting LPC command results or generating rejected-command messages. The selected mudlib owns that meaning and output.
Follow an input from transport to instance to LPC command handling when debugging
player behavior. Follow an efun from its catalog through runtime context and
instance services when debugging host effects. language.runtime is generated-code
support; execution.model.world owns the engine’s world model.
communication.console.AdminConsole connects to an engine or mudlib administration endpoint.
The engine owns TLS authentication and grants. Engine commands execute in
EngineAdminCommandSession; mudlib commands cross private worker pipes and execute
in MudlibAdminCommandSession on that instance’s execution queue. No administrator
credentials are sent to worker JVMs. Player listeners relay bytes to a selected
worker, where Telnet negotiation, player login and game commands are handled.
Storage adapters live under storage; engine administrator identities are
separate from mudlib player accounts. See docs/ENGINE-ADMINISTRATION.md for the
process fault isolation, supervision deadlines and platform limitations.
Testing And Verification
Run the repository baseline from its root:
mvn test
For a targeted change, select the relevant JUnit class, for example:
mvn -Dtest=MudlibAdminCommandSessionTest,EngineArchitectureTest test
Some integration checks require an external database and configured password environment variable. A missing prerequisite is an incomplete integration check, not a passing compatibility result. Read the failing test and profile before classifying it as a Java regression.
Use target/surefire-reports/ for test outcomes. Informational compatibility
reports and full preload scans answer different questions from assertions and
live player tests. Shared scan tooling is scripts/scan-mudlib-preload-compile.sh;
profile wrappers remain under the owning mudlib’s jvmud/ directory.
For runtime changes, restart the affected profile and replay the relevant player route. For documentation-only edits, regenerate outputs and check local links, anchors, commands against source, and PDF layout. See Documentation Generation.
Troubleshooting
Begin with the smallest failing step: Java build, manifest validation, object load, listener startup, login, or command handling. Keep the first diagnostic and the exact manifest path; later errors may be consequences of the first failure.
Build Failures
-
Release 21 not supported: compare
java -versionandmvn -version; Maven may be using a different JDK. Select the intended JDK before rebuilding. -
Dependencies cannot resolve: check access to the configured Maven repository. An offline cache must already contain the required artifacts.
-
Tests fail on database setup: inspect the selected profile’s external service requirements. Do not put a password in the manifest to silence the failure.
-
Permission denied launching a script: use a POSIX shell environment and check the script’s executable bit in the checkout.
Retain Maven’s first error and the relevant Surefire report. Repeatedly rebuilding without changing the failing prerequisite is unlikely to help.
Object Load Failures
-
Confirm the source path is relative to the selected mudlib root, not the Java repository root.
-
Inspect
include_paths, inherited source paths, and preload declarations. -
In the admin shell, set
verbosity watchand runload <path>. -
Use
preprocess,scan,parse, orirto stop at the earliest failing stage. -
Check explicit types, optional
language_features, efun aliases, and capability grants before changing source semantics.
Unknown manifest keys fail fast. A missing initial_place or invalid profile
mapping is a hosting configuration problem. Runtime invocation failures after a
successful load need an execution test, not just another compile scan.
Login And Command Failures
| Symptom | Check |
|---|---|
Connection refused |
Wait for the listening message; verify the process is still running on the configured address and player port (default localhost:4000). |
Address already in use |
Stop your earlier listener or choose another pair with |
Prompts repeat or login fails |
Confirm the selected profile and account policy; inspect the server log and that profile’s writable storage. |
Admin command is unrecognized in Telnet |
Use |
Movement or |
Complete login and read the active mudlib’s help; verify command registration and lifecycle mapping. |
GMCP output is absent |
Check client negotiation, |
For mounted-world issues, first prove each profile can boot directly, then test the engine menu selection and the selected mudlib manifest. Capture the first failing transition.
Documentation Generation
Edit manual/*/.adoc, not docs/manual/index.html or the PDF. From the
repository root, generate both manual formats:
mvn -Pmanual-docs -DskipTests process-resources
The outputs are docs/manual/index.html and
docs/manual/jvmud-user-manual.pdf. Shared HTML styling and navigation come from
manual/docinfo.html and manual/docinfo-header.html; PDF typography and page
flow come from manual/pdf-theme.yml.
Generate the Java API with:
python3 scripts/build-api-docs.py
python3 src/test/scripts/check-docs.py
Javadocs live under docs/api/apidocs/; docs/api/index.html is the generated
package directory. The build script runs Javadoc, derives package descriptions
from its output, and opens detailed reference links in a new tab. Standard
Javadoc pages retain their own layout. The checker verifies local HTML links, fragment targets, and
manual placeholders. It does not check external URLs or prove visual quality.
Preview the static site with python3 -m http.server 8000 --directory docs and
open http://localhost:8000/. Stop that preview with Ctrl+C.
If generation fails, check Maven dependency resolution, missing AsciiDoc includes,
and the first generator error. Regenerate HTML and PDF together, then inspect the
PDF contents, page breaks, and long code/table cells before publishing. See
docs/README.md for source ownership and docs/DOCUMENTATION_GAPS.md for remaining
coverage work.
Appendixes
Use these references while following the procedures. The manifest key inventory and command syntax describe the current implementation; compatibility limits are explicit rather than implied by a successful build.
Commands
These mudlib commands run after connecting the administration console to a mudlib-admin endpoint. Engine endpoints have their own help command.
Paths name source files; handles identify loaded objects. Use objects to find
handles. Arguments to call are passed as strings; quote strings containing
spaces. Numeric text is not automatically converted to LPC integers. help is the live syntax reference.
| Command | Alias | Purpose |
|---|---|---|
|
|
Show this command reference. |
|
— |
Invoke a method on a loaded object handle. |
|
— |
Print a file from the virtual mudlib filesystem. |
|
— |
Change the current virtual mudlib directory. |
|
— |
Compile if needed and create a new LPC object instance. |
|
|
Compile an LPC source file to bytecode without loading it. |
|
|
Remove an object from the runtime. |
|
|
Show object state, inventory, environment, and methods. |
|
|
Compile through lowering and print the typed IR. |
|
|
Compile, load, and register an LPC object. |
|
|
Call long() or short() and display object text. |
|
— |
List a virtual mudlib directory or file. |
|
|
Move one object handle into another object’s inventory. |
|
|
List registered live object handles. |
|
|
Preprocess, scan, parse, and print the LPC AST. |
|
|
Expand includes, macros, and preprocessor directives. |
|
— |
Print the current virtual mudlib directory. |
|
|
Recompile and replace a loaded LPC object. |
|
|
Preprocess and print scanner tokens for an LPC source file. |
|
|
Show or change compiler/shell output detail. |
|
|
Show the environment containing an object. |
|
|
Disconnect this console session; the mudlib keeps running. |
The terminal launcher for play is
scripts/jvmud-start [--bind <address>] [--port <port>] [--admin-port <port>] [--state-dir <path>] [--mudlib-dir <directory>] [--trace-startup-loads] [<mudlib-config-file>…].
Inside a player client, profiles using the default transport prefix reserve //help and //quit for
transport controls. The mudlib owns all gameplay verbs.
Configuration Reference
Manifests use key = value, one declaration per line. Lists are comma-separated.
Blank lines and comments are ignored. Simple surrounding quotes are removed;
this is not a general-purpose quoted-string format, and still starts a
comment. Unknown keys are rejected by MudlibBoundaryConfigReader.
Use a checked-in profile as the complete example. The following groups cover the reader’s exact keys and supported key prefixes. Optional values can still become required by the selected boot, session, or database policy.
Identity and paths
| Key | Meaning |
|---|---|
|
Stable profile identity and display name. |
|
LPC source root; relative paths resolve from the manifest directory. |
|
Startup Place object path, required for hosted boot. |
|
Interactive object path; |
|
Optional boundary-declaration LPC object. |
|
Mudlib-global function object. |
|
Comma-separated source include search paths. |
|
Startup object manifest, relative to |
|
Additional comma-separated startup object paths. |
Use mudlib-rooted object paths such as room/church; Java package paths are not
LPC paths. The launch scripts resolve a relative manifest argument from the
repository root. mudlib_root resolves from the manifest, a different base.
Sessions and presentation
| Key | Meaning |
|---|---|
|
Optional host-managed login policy. |
|
Prompt text; |
|
Text shown on connection. |
|
Escape prefix for transport controls; default |
|
Optional profile-selected location diagnostic command. |
|
Presentation line width, validated against engine bounds. |
|
Presentation ruler toggle. Booleans accept true/false, yes/no, on/off, or 1/0. |
Host and port are not manifest keys. The shared Telnet launcher uses loopback port 4000; passing a port as a second positional argument fails.
Language and host access
| Key | Meaning |
|---|---|
|
Optional syntax gates: |
|
Optional dynamic value typing, default false. Treat
declared fields, locals, parameters, and returns as stable |
|
Supply missing method return and parameter types in memory; default false and independent of dynamic typing. |
|
Resolve unknown bare calls on the current object at runtime; default false. |
|
Manifest-relative JSON file containing checked field, local, or method-varargs adaptations. LP245 retains only a method-varargs rule. |
|
Capability grants: |
|
One or more mudlib aliases for a native engine function. |
|
Explicit compatibility-global function object. |
|
Names allowed to override mudlib-global functions. |
|
Object-like compatibility macro replacement. |
|
Single-argument function-like compatibility macro replacement. |
Feature flags enable syntax; capabilities enable restricted host operations. Start with the active profile’s actual requirements. A compatibility alias does not bypass a capability grant.
Lifecycle and time
| Key | Meaning |
|---|---|
|
Comma-separated native event declarations. |
|
Map a native lifecycle event to a mudlib method. Event names are normalized for case, spaces, and hyphens. |
|
Mudlib method for scheduler-backed recurring behavior. |
|
Interval in seconds by default; also accepts |
Refer to lifecycle events for event roles and verify method signatures against the selected profile.
Database
| Key | Meaning |
|---|---|
|
JDBC URL; |
|
Database user for the selected profile. |
|
Name of a required nonblank environment variable containing the password. Preferred for configured profiles. |
|
Literal password alternative supported by the reader;
do not commit secrets. Mutually exclusive with |
A missing named password environment variable fails manifest loading. Setting the variable does not provision a database, create a schema, or grant database access. Those are profile-specific prerequisites.
Compatibility Notes
LPC dialects differ. Accepted syntax, successful compilation, object loading, and correct interactive behavior are separate levels of support. Optional language features are selected per profile; legacy efun names and lifecycle methods are boundary mappings.
docs/COMPATIBILITY_FEATURE_PROVENANCE.md records why compatibility features
exist. docs/DEFERRED_WORK.md records implementation debt;
docs/FUTURE_DESIGN_IDEAS.md collects proposals. None is a substitute for the
active source and tests, or a guarantee of full legacy-driver parity.
Database provisioning and recovery remain profile-specific. Start with the credential-free examples in this manual before taking on that environment.
Glossary
This glossary covers MUD traditions, LPC programming, and JVMud’s native vocabulary. Historical usage varies between communities and drivers; aliases are grouped together. It is a broad reference, not a claim that every local slang term or every legacy API is implemented. Use your browser’s Find command to locate any spelling, or browse the alphabetical sections.
JVMud marks a native concept or a distinct JVMud meaning of a shared term; it does not mean the word originated with JVMud.
Small caps identify the eight pillars of MUD on the website. Unmarked entries describe general or historical vocabulary.
From legacy vocabulary to JVMud
These are conceptual correspondences, not promises of identical behavior or mechanical renames.
| Historical term | JVMud distinction |
|---|---|
Driver |
Application hosting, language runtime, communication, and storage have separate responsibilities. |
Room / exit |
Place / Link describe world structure. |
Object |
LPC object describes code and state; Entity and Place describe the World. |
Player / player object |
Player, Session, Persona, and account are distinct roles and lifetimes. |
Apply |
An explicit lifecycle event maps to a configured mudlib method. |
Simul-efun |
An mfun is supplied by the configured mudlib-global provider. |
Master object |
Explicit boundary configuration and mudlib callbacks supply policy. |
Heartbeat / call_out |
Scheduled ticks / delayed callbacks express timed work. |
Living / interactive |
Actor capabilities, Persona control, and Session state distinguish different meanings. |
A
- AberMUD
-
An early, influential MUD family associated with the University of Wales at Aberystwyth. It is a separate historical lineage, not a generic name for LP mudlibs.
- Account
-
A mudlib-defined durable login identity or profile. It may own several characters. In JVMud an account is distinct from a live Player or Session; administrator identities are also separate from game accounts.
- Action; add_action
-
In classic LP command systems, a function registered to handle a verb in a command giver’s vicinity.
add_actionis the familiar registration name. JVMud leaves player-command interpretation and success/failure policy to the mudlib.
- Actor JVMud
-
An Entity capable of initiating change. An NPC or scripted effect can be an Actor without being a player’s Persona.
- Administrator; admin
-
A person authorized to operate a server or game. A JVMud administrator is a named identity authenticated by an access token over TLS, with explicit engine or mudlib grants. It is separate from the engine owner’s OS identity and from mudlib-defined wizard ranks. The engine owner is the OS account that owns the private engine state directory and uses
jvmud-console --ownerfor full engine control on the host.
- Aggro; aggressive
-
Automatic hostility or the attention of an opponent. A mudlib may model aggression, threat, and combat targets separately; none is inherent in the engine’s Actor capability.
- Alias
-
An alternate name or command expansion. A client alias expands typed input; a JVMud profile’s engine-function alias maps a legacy function spelling to an engine operation. These are different mechanisms.
- Apply; applied function
-
A method the driver invokes in LPC, rather than a built-in function LPC calls in the driver. Applies can handle object, connection, and policy events. JVMud uses explicitly configured lifecycle hooks for these callbacks; legacy method names are profile choices. See FluffOS applies.
- Area; zone; domain; realm
-
A grouping of rooms, content, or building responsibility. Meanings vary: a zone may be a reset unit, a domain a wizard team’s territory, and a realm a setting or administrative region. These are mudlib structures, not synonyms for a JVMud instance.
- Array
-
An ordered LPC collection, commonly written
({ … }). Element types, indexing, and reference semantics depend on the dialect.
- Attribute; property
-
Named data attached to a game object. In MUSH/MOO families these terms often refer to database-stored fields; LP mudlibs may instead expose property mappings and query/set methods.
- Avatar; character; PC
-
An in-world identity controlled by a player; PC means player character. JVMud calls the Entity serving as a player’s current perspective a Persona. A character’s saved identity may outlive that role or a connection.
B
- Blueprint; prototype; master copy
-
The shared loaded object associated with an LPC source path, from which clones are commonly created. This use of “master” does not mean the master policy object. JVMud documentation also uses shared object. See LDMud objects.
- Boot; reboot
-
Starting a runtime, or stopping and starting it again. In JVMud application startup and mudlib startup are separate: the engine can run with zero mudlibs, and each loaded mudlib has its own worker JVM.
- Builder; creator; coder
-
A contributor who authors world content or behavior. Some games distinguish room builders from LPC programmers; others use creator or wizard for both. These are community roles, not Java access levels.
C
- Call other; call_other
-
Calling a named method on an LPC object; commonly written
object→method(…). It differs from invoking an efun. See FluffOS function calls.
- Call out; call_out
-
A scheduled callback that runs later, after the initiating call returns. It is usually one-shot, though a callback can schedule another. JVMud expresses delayed work through scheduling; a legacy spelling belongs to the compatibility surface.
- Capability JVMud
-
An ability or authorization. World capabilities describe what an Entity can do, such as act or perceive. JVMud
engine_capabilitiesgrants authorize selected host operations; they are distinct fromlanguage_featuressyntax settings.
- Catch tell; catch_tell
-
A traditional LPC method receiving delivered text, often used by NPCs to react. JVMud can adapt this behavior through perception hooks and compatibility code; world event delivery need not be reduced to parsing prose.
- Channel; tell; say; shout
-
Common communication scopes: a named group, a specific recipient, nearby participants, or a broader audience. Range, privacy, and permissions are mudlib rules. These words may name commands as well as LPC helpers.
- Client
-
The program used to connect to a MUD. Clients may provide scrollback, aliases, triggers, maps, and protocol support; the server hosts the shared game.
- Clone
-
A distinct runtime object created from an LPC program, with its own instance state. Cloning does not imply copying every current value from an existing object. A clone number identifies an instance, not a character account.
- Closure; function pointer
-
A value representing callable behavior, sometimes with bound context or arguments. LPC dialects differ in syntax and supported forms; the presence of a glossary term does not imply JVMud implements every dialect’s version.
- Codebase
-
The source of a server, game, or software family. A codebase is not necessarily a mudlib: Diku-style server code and an LP driver-plus-mudlib split organize responsibilities differently.
- Command; verb; parser
-
A command is player input requesting an action; its verb commonly selects behavior. A parser interprets input and arguments. JVMud transport delivers input, while the mudlib decides what it means. An LPC compiler parser instead parses program source.
- Command dispatch JVMud
-
Routing input to mudlib command behavior in its current context. JVMud serializes execution inside the instance; transport does not interpret LPC return values as command success or failure.
- Command giver; this_player
-
The LPC object on whose behalf a command is executing. It can be an NPC and is not necessarily an interactive user.
this_player()is legacy execution-context vocabulary, not the definition of a JVMud Player.
- Compatibility profile JVMud
-
Configuration describing one mudlib’s language options, aliases, lifecycle mappings, capabilities, and supporting objects. Compatibility is explicit and scoped to that profile, not a promise that every LP dialect works unchanged.
- Compatibility shim JVMud
-
A dedicated mudlib-side adapter translating legacy names or behavior into JVMud operations. It preserves the distinction between historical conventions and native engine concepts.
- Compiler; interpreter; bytecode
-
A compiler translates source into executable form; an interpreter executes a representation of a program; bytecode is instruction data for a virtual machine. JVMud compiles LPC into JVM bytecode. “Interpreted LPC” does not necessarily mean source is reread on each call.
- Containment JVMud
-
An Entity’s immediate Location in another Entity: a coin in a bag, for example. JVMud’s single-containment rule gives each Entity exactly one immediate Location, either a Place or another Entity.
- Create; create()
-
An initialization callback in many LPC dialects. Others use
resetor configured hooks. Its name, arguments, and invocation rules are not universal; JVMud declares lifecycle method mappings explicitly.
D
- Daemon; service object
-
An LPC object providing shared services such as weather, channels, or banking, often loaded once. An LP daemon need not be an operating-system process or thread. JVMud worker processes are a different concept.
- Dbref; database reference
-
A database object identifier, often written
#123, in Tiny-family systems. It is not an LPC source path or an LPC clone suffix. See the MUCK manual.
- Destruct; destruction
-
Removing a live LPC object. Destruction, deleting its source file, and deleting saved state are separate operations. Hooks and reference cleanup vary by runtime.
- Dialect; flavor
-
A particular LPC language or driver/mudlib convention set. Differences can include types, efuns, initialization, security, and command handling. JVMud targets LPC/LPMud while adapting specific conventions through explicit profiles.
- DikuMUD; Diku
-
A MUD codebase and family associated with combat, progression, and data-defined areas. Diku is a lineage name, not a synonym for all combat MUDs or an LPC dialect. See DikuMUD history.
- Disconnect; quit; reconnect
-
Ending a connection, requesting departure, and connecting again. Character cleanup and recovery are mudlib policy. Quitting a JVMud mudlib closes the connection; it does not return the player to the engine menu.
- Driver; gamedriver
-
The traditional LP runtime hosting LPC programs and supplying compilation, execution, networking, and built-ins. JVMud separates these responsibilities among language, execution, communication, and storage packages; “engine” is not just a replacement name for every driver responsibility.
E
- Efun; external function
-
A runtime-provided function callable from LPC. Historically supplied by the driver; in JVMud it exposes a host operation. Compare lfun (object-authored method), simul-efun (mudlib-global helper), and apply (runtime-to-LPC callback). See LDMud efuns.
- Emulator; compatibility
-
Software or behavior reproducing another system’s interface. JVMud’s targeted LP compatibility does not mean complete emulation of a particular legacy driver’s internals.
- Engine JVMud
-
JVMud’s application and hosting machinery.
JVMudowns application lifetime, endpoints, and worker supervision. Each mudlib executes in a separate worker, and its World is distinct from the hosting application.
- Entity JVMud
-
A thing in JVMud’s World: a Persona, coin, bag, vehicle, NPC, or effect. It is a world-model concept, not a synonym for every LPC object; service objects need not represent in-world things.
- Environment
-
In LP vocabulary, the immediate containing object, often queried with
environment(). It can be a room or a carried container. JVMud models this relationship as Location and Containment; “environment” here is not the operating system’s environment variables.
- Eval cost; evaluation limit
-
A runtime accounting or limit on work performed by LPC execution. Units and enforcement differ among drivers. A historical eval-cost efun is not automatically available in JVMud.
- Exec; exec()
-
In traditional LP APIs, transferring an interactive connection between LPC objects, often from a login object to a body. It does not mean launching an operating-system executable. JVMud describes the compatibility operation as session rebinding.
- Exit
-
A route out of a room, often named by a direction or command. JVMud’s corresponding world-model concept is a Link between Places; doors and travel restrictions remain authored game policy.
- Exploration; hack-and-slash; social MUD
-
Labels for discovery-oriented, combat-oriented, or social play. A game can combine them; these describe emphasis, not mutually exclusive server technologies.
G
- Game JVMud
-
The playable system with rules, mechanics, goals, challenges, progression, or other game-like structures. One of JVMud’s eight defining MUD concepts.
- GMCP
-
Generic Mud Communication Protocol: structured messages sent alongside ordinary text using Telnet subnegotiation. JVMud has GMCP codec and message support; a mudlib still determines the meaning of its game-specific messages. See GMCP protocol notes.
- Guild; class; race
-
Common mudlib classifications for membership, abilities, or fictional identity. Their rules are game-specific and do not form fixed JVMud engine types.
H
- Hardcode; softcode
-
Relative terms for server implementation versus behavior authored through the server’s programming facilities. In an LP setting, driver implementation is often called hardcode and LPC mudlib code softcode; neither term means the latter is less substantial software.
- Heartbeat; heart_beat
-
A recurring callback traditionally used for combat or other periodic object behavior. JVMud uses scheduled time and configured tick methods;
heart_beatis a compatibility name, not a universal engine-required method.
- Hot reload; live reload; update
-
Replacing or reloading authored behavior while the game continues. Reloading a program does not inherently migrate every existing object’s state. An in-game
updatecommand, mudlib reload, and JVMud installation update are different operations.
- HP; mana; stamina; movement points
-
Hit/health points and other common resource pools for survival, magic, exertion, or travel. Meanings and abbreviations vary by game; JVMud does not prescribe these attributes.
I
- IC; OOC; roleplay; RP
-
In character, out of character, and acting a fictional role. These distinguish a character’s knowledge and speech from the player’s. A server lineage does not by itself require or forbid roleplay.
- Immortal; wizard; wiz; god; implementor; archwizard
-
Historical staff or privileged-character titles, with different rank systems in different MUDs. Wizard can also mean an ordinary fictional profession. JVMud’s operational administrator grants are separate from these mudlib-defined ranks.
- Include; header; preprocessor
-
Source reuse and transformation before LPC parsing. An included header contributes source text, while inheritance reuses a program’s definitions. A file suffix such as
.his a convention, not a world-model role.
- Inheritance; inherit
-
Reusing an LPC program’s definitions in another program. Inheritance shares behavior structure; it is not object containment, and inheriting a room program does not itself place an object in a room.
- Init; init()
-
A traditional method used when establishing local command interactions, often registering actions. Exact invocation policy varies by driver and mudlib. JVMud profiles can map
INTERACTION_SCOPE_STARTEDtoinit; it is not a general-purpose Java constructor.
- Input capture; input_to
-
Routing subsequent input to a designated callback, commonly for login prompts or editors, rather than the normal command parser. The legacy
input_tospelling and detailed behavior depend on the compatibility profile.
- Instance; MudInstance JVMud
-
In JVMud, one running mudlib assembled and executed within a worker JVM, with its own serialized execution queue and clock. In general game language, “instance” can instead mean a private copy of an area; that is a different use.
- Interaction scope JVMud
-
The Persona and local context that can contribute commands or perception: its Location, carried Entities, and nearby Entities. It describes locality, not access to every object in the mudlib.
- Interactive JVMud
-
As a MUD property, players and the World can affect one another. As a legacy LPC predicate, “interactive” means an object is associated with a live connection. JVMud represents connection state with a Session; these two meanings should not be conflated.
- Inventory
-
The immediate contents of an object, not just equipment a character can use. A deep inventory includes recursively contained objects. JVMud describes this through Containment rather than treating every container as an LPC-specific engine type.
J
- JVM
-
Java Virtual Machine, the runtime executing JVMud and compiled LPC bytecode. Each mudlib worker runs in a separate JVM; the language of authored mudlibs remains LPC.
- JVMud JVMud
-
The project’s LPC compiler and LPMud hosting application, including world-model, transport, storage, and administrative facilities. Its native terminology keeps runtime services, world concepts, and legacy mudlib conventions distinct.
L
- Lag; idle; AFK
-
Delayed response, lack of recent input, and away from keyboard. A connected Session can be idle without its Persona being absent; lag may arise in the client, network, or server.
- Lfun; local function
-
A function defined by an LPC object/program, including inherited behavior. “Local” distinguishes it from a driver-supplied efun; it does not necessarily mean private or inaccessible through an object call.
- Lifecycle hook JVMud
-
An explicitly configured call from JVMud into mudlib code at an event boundary. The event belongs to the engine contract; the mapped method name belongs to the mudlib. Some named events are reserved rather than invoked; consult the lifecycle reference for status.
- Link JVMud
-
A traversable relationship between JVMud Places. It is the world-model counterpart of a conventional room exit, not a network connection or website hyperlink.
- Linkdead; netdead
-
A character whose controlling network connection has been lost. Whether the character remains in the world, is protected, or can reconnect is mudlib policy; the Persona and its Session are distinct.
- Living
-
In legacy LP usage, an object enabled to participate as a command giver. This need not mean biologically alive or human-controlled. JVMud’s Actor and Persona concepts describe different capabilities and roles, not an exact rename of this predicate.
- Load; preload
-
Loading makes an LPC program/object available to the runtime. Preloading loads selected objects during mudlib startup, commonly from an ordered manifest. Source availability, successful compilation, and world placement are separate facts.
- Location JVMud
-
An Entity’s immediate position in JVMud: a Place or another Entity. It describes where something is; Presence describes a player’s experience through a located Persona.
- LP245; 2.4.5 mudlib
-
A classic LP mudlib lineage and JVMud’s bundled legacy compatibility target. The name identifies mudlib source and conventions; it does not mean JVMud is that historical driver.
- LPC
-
The C-like, object-oriented language created for LPMud by Lars Pensjö. It has evolved into driver-specific dialects. JVMud’s authored mudlib language is LPC, compiled to JVM bytecode, not C or Java source.
- LPMud; LP MUD
-
The MUD tradition originating with Lars Pensjö, with a driver hosting LPC-authored game behavior. JVMud uses the term for games whose LPC objects can be rewritten, recompiled, and reloaded while the game continues. It does not require adopting every historical driver API.
M
- Mapping
-
An LPC associative collection indexed by keys, commonly written
([ … ]). It is data, not necessarily a world map; dialects differ in permitted key/value forms.
- Master object
-
A privileged policy object consulted by traditional drivers for startup, connections, security, or errors. JVMud uses explicit mudlib boundary configuration and mapped callbacks; a legacy master role can be adapted. Do not confuse it with a clone’s blueprint.
- MCCP; MSP; MSSP; MXP; MSDP
-
MUD Client Compression Protocol, MUD Sound Protocol, MUD Server Status Protocol, MUD eXtension Protocol, and MUD Server Data Protocol: separate extensions for compression, sound, server metadata, markup, and structured data. These historical protocol names are not a JVMud support checklist.
- Mfun JVMud
-
JVMud’s term for a mudlib-global function supplied by a configured
mfun_object. It fills the traditional simul-efun role while making the provider explicit. “Mfun” describes the role; function names need not begin withmfun_.
- Mixed
-
An LPC type used for values of varying types. It does not mean an omitted type declaration; JVMud requires explicit method return and parameter types.
- Mob; mobile; monster; NPC
-
An autonomously controlled game character; NPC means non-player character. “Mob” derives from mobile and can include friendly inhabitants. In JVMud these are mudlib-defined Entities and may be Actors; NPC is not a separate hosting process.
- MOO
-
“MUD, Object Oriented”: a family with a persistent object database and its own programming language, exemplified by LambdaMOO. It is not an LPC dialect. See the MOO project.
- Mortal; newbie; guest
-
Common labels for an ordinary player, newcomer, or limited visitor account. Permissions and progression are local game policy, not universal meanings of the words.
- Movement JVMud
-
Changing an Entity’s Location, whether traversing a Link or entering/leaving another Entity’s containment. In JVMud movement is world behavior; transferring a network connection is a different operation.
- MU*; MUSH; MUCK; MUX; MUSE
-
MU* is an umbrella spelling for related multi-user text environments. MUSH is commonly expanded as Multi-User Shared Hallucination; MUCK is a name/pun rather than an original acronym. MUX and MUSE name other related families. Their social, building, and roleplay traditions are not LPC compatibility standards.
- MUD
-
Historically “Multi-User Dungeon”; “Multi-User Domain,” “Multi-User Dimension,” and “Multiple User Dialogue” are also used. The broad historical family includes varied text worlds. JVMud adopts a specific definition: an interactive, multiplayer, text-centric game set in a persistent, temporal, player-present world.
- Mud driver hook
-
A configurable driver callback or behavior setting, especially in LDMud terminology. It is related to but not always identical with an apply. JVMud uses a declared mudlib boundary and lifecycle mappings rather than adopting every driver’s hook registry.
- MUD1; Essex MUD; MUD2
-
MUD1 is the pioneering Multi-User Dungeon begun by Roy Trubshaw and developed with Richard Bartle at Essex; MUD2 is its successor. These are particular games, not version numbers for all MUD software. See the historical MUD FAQ.
- Mudlib; mud library
-
The LPC source/content layer defining a game’s fiction, commands, rules, presentation, and object behavior. In JVMud a mudlib is hosted by an instance; its World is part of the mudlib, not a synonym for it.
- Mudlib boundary; boundary object JVMud
-
JVMud’s declared contract between engine services and authored code. Configuration selects policy objects, event mappings, aliases, and capabilities. A boundary object supplies configured mudlib callbacks; it does not own application startup or public listeners.
- MudOS; FluffOS; LDMud; DGD
-
Names of LP driver implementations or families. FluffOS continues the MudOS lineage; LDMud descends through Amylaar’s LPMud work; DGD is Dworkin’s Game Driver. Their differences matter when interpreting an old manual. None is an alternate name for JVMud.
- MUF; MPI; MUSHcode
-
Other text-world programming facilities: MUF is Forth-like, MPI is an expression/message facility in MUCK systems, and MUSHcode names MUSH softcode. They are not alternate spellings or supported dialects of LPC.
- Multiplayer JVMud
-
The property that multiple Players can inhabit the same shared World simultaneously. One of JVMud’s defining MUD concepts.
N
- Native efun; jvmud_ prefix JVMud
-
A JVMud engine function with an engine-owned name.
jvmud_is reserved for engine symbols.jvmud::name(…)requests the exact native efun name;efun::name(…)bypasses ordinary mudlib function resolution but can use the configured efun surface.
- Notify fail; notify_fail
-
A conventional LP helper for setting the message used if command handling fails. It is part of mudlib/compatibility command policy; JVMud socket transport does not decide success from an LPC return value.
O
- Object; LPC object
-
A runtime instance combining an LPC program’s behavior and data. Rooms, characters, services, and tools may all be implemented as objects. JVMud distinguishes the language-level object from world-level Entity and Place.
- Object path; clone name
-
An LPC object’s mudlib-relative source identity or runtime name. Clone names commonly append a number to distinguish instances of one program. These names are not OS process identifiers, database references, or durable account identities.
- OLC; online creation
-
Editing game content while the server is running. The tools and editable data vary by codebase. Live LPC compilation is one mechanism for live development, not the definition of every OLC system.
P
- Perception; perceptive JVMud
-
Information reaching an Entity about events in the World, and the capability to receive it. JVMud delivers world perception events; a legacy
catch_tellmethod is a compatibility interpretation of delivered text, not the engine’s universal perception model.
- Persistence JVMud
-
World/state continuity independent of an individual Session. Durable save/restore is related but separate: persistence does not promise that every live value survives a reboot, or that all rooms are stored in a database.
- Persona JVMud
-
The Entity serving as a Player’s current in-world point of perception and action. A located Persona creates Presence. It is distinct from a durable account, the remote client, and the active Session.
- PK; PvP; PvE
-
Player killing, player-versus-player, and player-versus-environment play. Consent, penalties, combat, and death rules are mudlib choices, not properties determined by LPMud lineage.
- Place JVMud
-
A discrete location in JVMud’s World where Entities can exist and interact. It can represent a forest clearing or road as well as an interior room. “Place” avoids making a conventional LP room object the engine’s universal spatial model.
- Player JVMud
-
In ordinary MUD conversation, a human participant and sometimes their character or player object. In JVMud, the human-facing controller endpoint associated with a Session. It is not itself an Entity, durable account, or proof of a unique real-world person.
- Player object
-
A legacy LPC object that can combine character behavior, profile data, login, and connection glue. JVMud separates the Player, Session, and Persona concepts even when a compatibility mudlib combines their behavior in one object.
- Possession; puppet; body
-
Terms for controlling or acting through an in-world object. Some mudlibs separate a persistent user/login object from a replaceable body. JVMud’s Player/Persona distinction expresses control and perspective without imposing one such mudlib design.
- Presence JVMud
-
Experiencing the game from within its World through a located Persona. An Entity can have a Location without being a player’s perspective; Presence therefore means more than position alone.
- Program
-
The compiled LPC behavior associated with source, potentially used by several object instances. A program, one of its clones, and the source file on disk are related but distinct.
- Prompt
-
Text inviting the next input, sometimes including status values. Client protocols can distinguish prompt boundaries or provide status separately; a prompt is not itself an LPC command parser.
Q
- Quest; XP; level
-
A task or goal, experience points, and a progression rank. These are common game conventions; JVMud does not require a particular reward or leveling system.
R
- Reset; repop; respawn
-
Reset can mean an object callback or broader world renewal; repop/respawn usually means replenishing inhabitants or items. Early LP
resetmay also initialize objects. JVMud lifecycle mappings distinguish an actual implemented load callback from proposed activation events; reset is not simply a server reboot.
- Room
-
A conventional unit of MUD space, including outdoor locations. LP mudlibs often implement it as an LPC object. JVMud uses Place for the world-model location; “room” remains valid authored or compatibility vocabulary.
- RPI; RPE
-
Roleplay-intensive and roleplay-enforced: community descriptions of how strongly a game emphasizes or requires staying in character. Usage and enforcement vary, and neither denotes a driver implementation.
S
- Save/restore; save_object; restore_object
-
Serializing selected object state and restoring it later. This is distinct from preserving a live connection or the whole running World. Legacy LPC function names belong to the configured compatibility surface.
- Scheduled tick; scheduler JVMud
-
A recurring execution opportunity and the machinery scheduling work. JVMud’s per-instance clock and execution queue order timed work with player input and other callbacks. A tick is not necessarily a combat round or one second.
- Session JVMud
-
An active connection/control context carrying input, output, terminal state, and disconnect lifecycle. JVMud associates a live Session with a Player; the Persona supplies the in-world perspective.
- Shadow; shadowing
-
A legacy LP mechanism that intercepts calls to another object, subject to driver and security rules. It differs from inheritance and from a variable hiding another name. See LDMud objects; support must be checked per runtime.
- Simul-efun; simul_efun; sefun
-
A simulated efun: a mudlib-authored function made globally available through a designated provider object, rather than implemented in the driver. JVMud calls this role an mfun and configures its provider explicitly. See the MudOS simul-efun documentation.
- Single containment JVMud
-
JVMud’s rule that each Entity has exactly one immediate Location. Nested containers are possible; ambiguous multiple immediate locations and containment cycles are not a useful world structure.
- Snoop
-
A privileged facility for observing another user’s input or output in some drivers. Authorization and visibility rules are implementation-specific; a historical snoop API does not establish JVMud administrator permissions.
- Static; private; protected; public; nomask
-
LPC declaration modifiers governing visibility, inheritance, or overriding.
nomaskconventionally prevents overriding;staticis particularly dialect-dependent. Check JVMud’s supported LPC reference rather than assuming C or Java meanings.
- Stock mudlib; stock MUD
-
An unmodified or lightly modified distribution and its supplied content. “Stock” describes how much has been customized, not a server protocol or formal compatibility level.
- Swap; swapping
-
Moving inactive runtime data to backing storage in drivers that support it. It differs from mudlib save/restore and from operating-system virtual-memory swapping. It is historical runtime vocabulary, not a JVMud persistence guarantee.
T
- Telnet; ANSI; NAWS
-
Telnet carries terminal text and option negotiation; ANSI escape sequences are commonly used for color and terminal control; NAWS negotiates window size. A client connection is not synonymous with the in-world character.
- Temporality JVMud
-
The World’s capacity to change through time. It covers active time and scheduled work without conflating them with durable saved state.
- Text JVMud
-
JVMud’s primary medium for perceiving and manipulating the World. Structured client messages can accompany text without redefining the game as a graphical world.
- This object; previous object
-
this_object()identifies the executing LPC object;previous_object()describes the calling-object context in traditional LPC. Neither necessarily identifies the player or the owner of an account. See FluffOS function calls.
- Tick; pulse; round
-
Timing words whose units depend on the system: a scheduler step, server loop interval, or game action/combat interval. They are not interchangeable with a wall-clock second or a legacy object’s heartbeat.
- TinyMUD; Tiny family
-
A historically influential text-world system and related traditions emphasizing social interaction and user building. “Tiny” is a lineage label, not a limit on world size. See the historical MUD overview.
- Trigger; bot; macro
-
A trigger reacts to output or an event, a bot automates participation, and a macro expands a stored action. These may live in clients or mudlibs. An LPC preprocessor macro is source substitution, a different mechanism.
U
- UID; EUID; wizard privileges
-
User ID and effective user ID in drivers that attach authorization identities to LPC objects. These do not automatically equal host OS identities. JVMud’s explicit capabilities and administrator grants should not be interpreted as a blanket emulation of a legacy UID model.
V
- Varargs
-
An LPC modifier associated with optional or variable argument handling. Accepted forms and omitted-argument rules vary by dialect; it is not permission to omit parameter types in JVMud source.
- Virtual object; virtual room
-
An object supplied dynamically for a requested path, often to represent coordinates without one source file per room. JVMud can map a missing-source lifecycle hook to a mudlib method such as
compile_object; “virtual” does not mean every such object is a separate World.
- Vnum
-
A virtual number used by Diku-family area formats to identify a room, mob, or item prototype. It is distinct from a Tiny-family dbref and an LPC source path.
W
- Wiztool; wizard shell
-
An object or command environment providing development and privileged in-game operations. Its rights come from the mudlib’s security policy; it is distinct from JVMud’s TLS administration console.
- Worker JVMud
-
The separate JVM process executing one JVMud mudlib. It provides independent runtime state and process fault isolation while retaining the host account’s OS permissions; it is not an OS security boundary.
- World JVMud
-
The shared virtual domain of a game, composed in JVMud of Places, Links, Entities, Locations, Containment, and Movement. It is part of a mudlib, not another name for the engine or the mudlib’s worker process.
- World continuity
-
The World remaining coherent independently of any one player’s connection. It is one aspect of Persistence, distinct from explicitly saving and restoring selected state.
Sources and further reading
Definitions distinguish historical usage from JVMud’s own design. The linked driver manuals explain their respective dialects; they are not JVMud API specifications.
-
Historical MUD FAQ and MUD overview, preserved by Richard Bartle: origins and families.
-
DikuMUD history and MOO project: other server traditions.
-
The MUCK manual: community, database, and MU* vocabulary.
-
LDMud history, functions, objects, and efuns: LP language and runtime vocabulary.
-
FluffOS LPC, applies, object applies, master applies, function calls, and interactive facilities: another LP dialect and its callback conventions.
-
MudOS simulated efuns: the historical global-helper mechanism.
-
GMCP protocol notes and TinTin++ protocol references: terminal and structured client communication.
-
../manual/index.html#_the_jvmud_philosophy_of_mud[JVMud philosophy], ../manual/index.html#_architecture[architecture], ../manual/index.html#efun-catalog[efun catalog], and ../manual/index.html#lifecycle-reference[lifecycle reference]: native concepts and implemented contracts.