MUD on Urbit

Admin Commands & Tools

research Doc 20

Comprehensive reference covering admin command sets, interface design patterns, and permission systems across major MUD codebases.


1. Admin/Immortal Command Reference

1.1 Player Management Commands

These commands let admins move through the world, move players, observe activity, and directly interact with the game state.

Movement & Teleportation

CommandCodebaseSyntaxDescription
gotoMerc/ROM/SMAUGgoto <location|player|mob>Teleport yourself to any room, player, or mobile. Customizable arrival/departure messages via bamfin/bamfout (Merc) or poofin/poofout (CircleMUD).
gotoCircleMUDgoto <room_vnum|player|mob>Same concept, uses poofin/poofout messages.
teleportEvenniatel [<object> =] <target>Move yourself or any object to a target location. Respects teleport and teleport_here locks. Supports /quiet, /intoexit, /tonone, /loc switches.

Player Transport

CommandCodebaseSyntaxDescription
transferMerc/ROMtransfer <player|all> [location]Move a player (or all players) to your current room, or to a specified location. Level 38+.
transCircleMUDtrans <victim>Transport a player to your location.
teleportCircleMUDteleport <victim> <location>Send a player to a specific room.

Remote Execution

CommandCodebaseSyntaxDescription
atMerc/ROM/CircleMUDat <location|player|mob> <command>Execute a command at a remote location without physically going there. Level 37 in Merc.
forceMerc/ROMforce <player|all> <command>Compel a player (or all players) to execute a command. Level 39 in Merc.
forceCircleMUDforce <player|all|room> <command>Same, also supports forcing everyone in the room.
forceEvenniaforce <object> = <command>Forces an object to execute a command. Requires perm(spawn) or perm(Builder).

Body Control

CommandCodebaseSyntaxDescription
switchMerc/ROM/CircleMUDswitch <mobile>Take control of a mobile’s body. Your own body goes inert. Used by Angels in ROM for quest running.
returnMerc/ROM/CircleMUDreturnLeave the switched body and return to your own.

Observation & Stealth

CommandCodebaseSyntaxDescription
snoopMerc/ROM/CircleMUDsnoop <player>Monitor a player’s session — everything they see and type appears on your terminal prefixed with %. Use snoop with no argument to stop. Level 37 in Merc.
holylightMerc/ROM/CircleMUDholylightToggle ability to see invisible objects, hidden characters, and dark rooms. Level 37 in Merc.
invis / wizinvisMerc/ROMinvis [level]Become invisible to players below the specified level. Toggle with no argument. Level 37 in Merc.
invisCircleMUDinvis [level]Same — set invisibility level; characters below that level cannot see you.
incognitoROMincognito [level]Partial invisibility — your presence is hidden from who and where lists, but you’re still visible in the room. Distinct from full wizinvis.
nohassleCircleMUDnohassleToggle prevention of aggressive monster attacks on yourself.

1.2 Punishment Commands

Commands for disciplining players, restricting access, and enforcing rules.

Communication Restrictions

CommandCodebaseSyntaxDescription
mute / silenceMercsilence <player>Prevents a player from using channels. Level 38.
muteCircleMUDmute <player>Silence a player on all communication channels.
noemoteMerc/SMAUGnoemote <player>Prevent a player from using the emote command. Level 38.
notellMerc/SMAUGnotell <player>Prevent a player from using tell. Level 38.
notitleCircleMUDnotitle <player>Prevent a player from setting a custom title.

Access Restrictions

CommandCodebaseSyntaxDescription
freeze / thawMerc/CircleMUDfreeze <player> / thaw <player>Completely prevent a player from issuing any commands. Level 39 in Merc.
denyMercdeny <player>Permanently deny a player access to the MUD. Not reversible in-game in stock Merc. Level 39.
banMercban <site>Ban an entire site from connecting. Suffix-matched. Level 39.
allowMercallow <site>Remove a site ban. Level 39.
banCircleMUDban [ALL|NEW|SELECT] <site>Three ban levels: ALL (no connections), NEW (no new characters), SELECT (flagged characters only).
unbanCircleMUDunban <site>Remove a site ban.
banEvenniaban [<name or ip> [: reason]]Ban by account name or IP. Supports wildcard patterns for subnet blocking. Requires perm(ban) or perm(Developer).
unbanEvenniaunban <banid>Remove a ban by its ID number.
wizlockMerc/CircleMUDwizlock [level]Prevent all players below a given level from logging in. Level 39 in Merc.

Other Punishments

CommandCodebaseSyntaxDescription
pardonMerc/CircleMUDpardon <player> [killer|thief]Remove killer or thief flags. Level 38 in Merc.
slayMercslay <player>Kill a character instantly, no saving throw. Level 38.
dcCircleMUDdc <descriptor_number>Disconnect a socket without extracting the player from the game.
bootEvenniaboot[/quiet|/sid] <account> [: reason]Kick an account from the server. /quiet suppresses notification, /sid allows removal by session ID. Requires perm(boot) or perm(Admin).
purge (player)CircleMUDpurge <player>Remove a player entirely from the game world.

1.3 World Management Commands

Commands for manipulating the game world — loading, creating, resetting, and restoring.

CommandCodebaseSyntaxDescription
purgeMerc/ROM/CircleMUDpurge [name]With no argument: remove all NPCs and objects from the room. With argument: remove a specific mobile or object. Level 38 in Merc.
load / mload / oloadMerc/ROMmload <vnum> / oload <vnum> [level]Create a mobile or object by virtual number. Level 38 in Merc.
loadCircleMUDload <mob|obj> <vnum>Same concept — create mobs or objects in-game.
cloneROMclone <obj|mob> <target>Duplicate an existing mob or object, preserving strung/set info and spell effects. Must be in same room or in possession. Level 52+.
peaceMerc/ROMpeaceStop all fighting in the current room. Level 37 in Merc.
restoreMerc/ROM/CircleMUDrestore <character>Fully restore hit points, mana, and movement. Level 38 in Merc.
advanceMerc/ROM/CircleMUDadvance <player> <level>Set a player’s level. The only way to create immortals. Level 40 in Merc.
trustMerc/ROMtrust <player> <level>Grant a player access to commands at a given level without changing their actual level. Doesn’t affect combat strength. Level 40 in Merc.
setCircleMUDset [file|player] <character> <field> <value>Modify character attributes — extremely powerful, one of the most versatile admin commands.
rerollCircleMUDreroll <player>Regenerate a player’s statistics.
unaffectCircleMUDunaffect <player>Remove all spell effects from a character.
zresetCircleMUDzreset <zone|*|.>Force a zone reset. * resets all zones, . resets current zone.
destroyEvenniadestroy [obj, obj2, ...]Permanently delete objects. Supports /force to bypass confirmation. Requires perm(destroy) or perm(Builder).
spawnEvenniaspawn <prototype>Create objects from prototypes. Without arguments, lists available prototypes.

1.4 Information Commands

Commands for inspecting the state of the game, players, objects, and connections.

CommandCodebaseSyntaxDescription
statMerc/ROMmstat|ostat|rstat <target>Display detailed statistics about a mobile, object, or room. Level 37 in Merc.
statCircleMUDstat [player|object|mobile|file] <name>Detailed information about any entity.
examineEvenniaexamine [<object>[/attrname]]Show technical details — attributes, locks, typeclasses, and all metadata. Supports examine *<account> for account inspection. Requires perm(examine) or perm(Builder).
vnumCircleMUDvnum <mob|obj> <name>List virtual numbers for mobs/objects matching a name.
vstatCircleMUDvstat <mob|obj> <vnum>Display prototype stats by vnum.
mfind / ofindMercmfind|ofind <name>Find all mobile or object types matching a name. Level 37.
mwhereMercmwhere <name>Show locations of all mobiles matching a name. Level 37.
findEvenniafind [<name>]Search database for objects, displays with #dbref identifiers.
wizlistCircleMUDwizlistDisplay the list of immortals. Auto-generated.
lastCircleMUDlast <player>Check when a player last logged in, from what site, and their ID number.
logMerclog <player>Toggle logging of all commands a player enters. Level 37.
usersMerc/CircleMUDusers [-k|-o|-p|-d|-l|-n|-h|-c]List active connections with filtering options. Level 39 in Merc.
showCircleMUDshow <mode> [arg]Display game information by mode (zones, player, stats, etc.).
syslogCircleMUDsyslog <off|brief|normal|complete>Control system log verbosity.
uptimeCircleMUDuptimeShow server boot time and duration.
memoryMercmemoryReport MUD size and memory usage. Level 37.
slookupMercslookup <skill|spell>Show internal identifiers for skills/spells. Level 37.
objectsEvenniaobjects [<nr>]Database statistics and recent object list.
scriptsEvenniascripts [key|#dbref]List and manage running scripts.

1.5 Building Commands (OLC — Online Creation)

OLC (Online Creation) systems let builders edit areas in real-time while logged in, replacing the old workflow of editing text files and rebooting. The most widely adopted OLC originated from NiMUD (1994) and was ported across the Diku family.

ROM/Merc OLC (Ivan Toledo’s OLC 1.1+)

All OLC commands enter a modal editor — you type a command, then use subcommands to modify fields. done exits.

CommandSyntaxDescriptionSubcommands
reditredit [vnum] / redit create <vnum>Enter room editor or create new roomname, desc, ed (extra desc), sector, room (flags), direction commands (north, south, etc. to set exits), format, show
meditmedit <vnum> / medit create <vnum>Enter mobile editor or create newname, short, long, desc, level, alignment, sex, act (flags), affect, ac, form, part, imm, res, vuln, off, size, hitdice, manadice, damdice, shop, spec, material
oeditoedit <vnum> / oedit create <vnum>Enter object editor or create newname, short, long, ed, type, extra, wear, v0-v4 (type-specific values), weight, cost, material, addaffect, delaffect
aeditaedit [area]Enter area editorname, filename, builder, vnum (range), age, reset, security, flags
mpeditmpedit <vnum>Enter mobprog editorProgram triggers and scripting
asaveasave <world|area|changed|list>Save areas to diskworld (all), area (current), changed (modified only), list (show what needs saving)
alistalistList all areas with vnums and assigned builders
resetreset <number> <type> <args>Configure room resetsmob <vnum> [max], obj <vnum> room, obj <vnum> inside <container_vnum>, delete

OLC item value reference (for oedit v0-v4):

Item Typev0v1v2v3v4
LIGHThours (-1/999=infinite)
WEAPONclassdice countdice typeweapon type
ARMORAC pierceAC bashAC slashAC exotic
CONTAINERcapacityflagskey vnum
DRINKcapacityquantityliquid typepoisoned
FOODfood hourspoisoned
SCROLL/POTION/PILLlevelspell1spell2spell3
STAFF/WANDlevelmax chargescurrent chargesspell

SMAUG OLC

SMAUG’s OLC is similar in structure but adds extra commands:

CommandSyntaxDescription
reditredit <field> <value>Modify current room (must be standing in it). Includes televnum, teledelay for teleportation rooms.
meditmedit <vnum>Edit mobile. Also supports medit create <vnum>.
oeditoedit <vnum>Edit object. Also supports oedit create <vnum>.
checkvnumcheckvnumCheck available vnum ranges
rassign / oassign / massignrassign <start> <end>Assign vnum ranges for rooms, objects, mobs
aassignaassign <area>Assign yourself to an area for editing
foldareafoldarea <filename>Save an area to disk
loadarealoadarea <filename>Load an area from disk
bestowareabestowarea <player> <area>Grant a builder editing rights to an area
makeshopmakeshop <keeper_vnum>Create a shop with a keeper mob
shopsetshopset <keeper_vnum> <field> <value>Configure shop properties
makerepairmakerepair <keeper_vnum>Create a repair shop
makeboardmakeboard <filename>Create a message board
bsetbset <board> <field> <value>Configure board settings

Additional SMAUG admin commands for content configuration:

CommandSyntaxDescription
ssetsset create <type> '<name>'Create new skill/spell/ability/herb
ssetsset <number> <property> <value>Configure spell/skill properties
setracesetrace <race> <property> <value>Modify racial attributes
setclasssetclass <class> <property> <value>Modify class attributes
makedeitymakedeity <name>Create a new deity
setdeitysetdeity <deity> <property> <value>Configure deity mechanics
setclansetclan <clan> <property> <value>Configure guilds/clans
morphcreatemorphcreate '<name>'Create polymorph forms
setmorphsetmorph <vnum> <property> <value>Configure morph attributes
hedithedit <topic>Edit help files
hsethset saveSave help file changes

Evennia Building Commands

Evennia takes a fundamentally different approach — no modal editors, no vnums. Everything is a Python object with a database reference (#dbref). Building commands are standalone rather than entering an editor mode.

CommandSyntaxPermissionDescription
createcreate[/drop] <name>[;alias][:typeclass]BuilderCreate objects. /drop places in room instead of inventory.
digdig <roomname>[;alias][:typeclass] [= <exit_to>[;alias], <exit_back>[;alias]]BuilderCreate rooms with bidirectional exits. /teleport switch moves you there.
tunneltunnel <direction>[:typeclass] [= <roomname>]BuilderQuick room creation using cardinal directions.
openopen <exit>[;alias][:typeclass] [,<return_exit>] = <destination>BuilderCreate exits between existing rooms.
linklink <object> = <target>BuilderConnect existing exits to destinations. /twoway for bidirectional.
copycopy <original> [= <new_name>][;alias][:location]BuilderDuplicate objects with properties.
setset <obj>/<attr>[:category] = <value>BuilderSet attributes on objects. Supports nested data structures and Python primitives.
descdesc [<obj> =] <description>BuilderSet descriptions. /edit opens line editor.
namename <obj> = <newname>;alias1;alias2BuilderRename objects and set aliases.
tagtag[/del] <obj> [= <tag>[:<category>]]BuilderManage tags for grouping and searching.
typeclasstypeclass <object> [= <path>]BuilderView or change an object’s typeclass. /reset clears attributes.
locklock <object> [= <lockstring>]BuilderSet access control rules. Uses function-based syntax.
wipewipe <object>[/<attr>]BuilderClear attributes from objects.
scriptscript <object> = <python.path>BuilderAttach timed scripts to objects.
spawnspawn <prototype>BuilderCreate objects from prototype templates.
teleporttel [<object> =] <target>BuilderMove objects between locations.
destroydestroy [obj, obj2, ...]BuilderDelete objects permanently.
findfind <name>BuilderSearch database for objects by name or dbref.
examineexamine [<object>[/attr]]BuilderShow all technical details about an object.
objectsobjects [<nr>]BuilderDatabase statistics and recent object list.
scriptsscripts [key|#dbref]BuilderList and manage running scripts.
cmdsetscmdsets <obj>BuilderDisplay command sets on objects.
cpattrcpattr <obj>/<attr> = <obj2>/<attr2>BuilderCopy attributes between objects.
sethelpsethelp <topic> = <text>BuilderCreate help entries.

1.6 Cross-Codebase Command Comparison

FunctionMerc/ROMCircleMUDSMAUGEvennia
Teleport selfgotogotogototel (self)
Move playertransfertrans / teleporttransfertel <player> = <dest>
Execute remotelyatatat— (use force)
Force actionforceforceforceforce
Watch playersnoopsnoopsnoop— (custom)
Admin invisibilityinvisinviswizinvis / incognito— (custom)
See hiddenholylightholylightholylight— (superuser bypass)
Load mob/objmload / oloadloadmload / oloadspawn / create
Delete entitiespurgepurgepurgedestroy
Inspectmstat / ostat / rstatstatstatexamine
Ban sitebanbanbanban
Freeze playerfreezefreezefreeze— (custom)
Mute playersilencemutesilence— (custom lock)
Set leveladvanceadvanceadvanceperm
Edit roomsredit (OLC)— (offline)reditdig / set
Edit mobsmedit (OLC)— (offline)meditcreate + set
Edit objectsoedit (OLC)— (offline)oeditcreate + set
Admin channelimmtalk (:)wiznet (;)immtalkchannel system
Broadcastechoecho / gecho / sendechowall / emit

2. Admin Interface Design

2.1 Wiz Commands vs Player Commands

In traditional MUDs, admin commands and player commands exist in the same text interface but are gated by level. The separation is purely logical, not visual:

  • Same input line: Admins type commands into the same prompt as players. There’s no separate admin console.
  • Level gating: Each command has a minimum level. The wizhelp command shows only commands available at your current level.
  • Same parser: The command interpreter checks your level against the command table before executing.

In Merc/ROM, the command table in interp.c defines each command with a minimum level:

{ "goto",     do_goto,     POS_DEAD, L_HER, LOG_NORMAL, 1 },
{ "transfer", do_transfer, POS_DEAD, L_APP, LOG_ALWAYS, 1 },

In CircleMUD, commands in interpreter.c use level constants:

{ "advance", "advance", POS_DEAD, do_advance, LVL_IMPL, 0 },
{ "at",      "at",      POS_DEAD, do_at,      LVL_IMMORT, 0 },
{ "ban",     "ban",     POS_DEAD, do_ban,     LVL_GRGOD, 0 },

Evennia’s approach is different: commands are Python classes organized into command sets. Admin commands live in evennia.commands.default.admin and building commands in evennia.commands.default.building. Each command class declares its own lock:

class CmdBoot(MuxCommand):
    key = "boot"
    locks = "cmd:perm(boot) or perm(Admin)"

2.2 Admin-Only Channels

Every major codebase provides dedicated communication channels that only immortals can see.

Merc/ROM: immtalk (shortcut :)

The core immortal chat channel. All immortals level 36+ can hear and speak on it.

: Hey, anyone seen suspicious activity from Trogdor?
[Gandalf]: Hey, anyone seen suspicious activity from Trogdor?

ROM: wiznet (shortcut ;)

ROM’s wiznet is more than a chat channel — it’s an information service that broadcasts game events to immortals. You can toggle categories:

wiznet                      — show current wiznet status
wiznet on                   — enable wiznet
wiznet off                  — disable wiznet
wiznet <message>            — send a message on wiznet
; <message>                 — shortcut

Wiznet event categories (toggleable per-immortal):

FlagEvents Reported
deathsPlayer deaths
loginsPlayer connects/disconnects
newbiesNew character creation
snoopsWhen someone snoops another player
ticksGame tick events
resetsArea resets
penaltiesBans, freezes, denies
saccingEquipment sacrifice
levelsLevel gains
switchesBody switches
bugsBug/typo/idea submissions
secureLogin failures, site bans triggered
linksLink dead/reconnect events
loadObject/mob loading

Each immortal customizes their wiznet to see only relevant events:

wiznet +deaths +logins -ticks

CircleMUD: wiznet (shortcut ;)

CircleMUD’s wiznet operates similarly:

; [@|+|-|#] [text]
  • ; message — send to all immortals
  • ; @ — toggle wiznet on/off
  • ; + / ; - — toggle specific categories

The nowiz command also toggles wiznet visibility.

SMAUG: immtalk

SMAUG uses immtalk like Merc, plus adds specialized channels at higher levels. The wartalk channel exists for deity+ discussions.

Evennia: Channel System

Evennia handles admin channels through its general channel infrastructure:

channel/create staffchat;staff = Staff-only discussion channel

Channels are controlled via three lock types:

  • listen: who can subscribe and see messages
  • send: who can post
  • control: who can manage the channel (boot users, set bans)

Default system channels:

  • MudInfo: Server announcements (restarts, errors)
  • ConnectInfo: Player connection/disconnection notifications (optional)

Custom admin channels are created with appropriate locks:

lock staffchat = listen:perm(Admin);send:perm(Admin);control:perm(Developer)

2.3 Snooping — Watching Player I/O

Snooping lets an admin see everything a player sees and types in real-time.

Technical implementation (Merc/ROM/CircleMUD):

  • Everything sent to the snooped player’s output buffer is also sent to the snooper, prefixed with %
  • Everything the snooped player types is also shown to the snooper
  • Only one snoop target at a time per admin
  • Higher-level immortals can snoop lower-level ones; you cannot snoop someone of equal or higher level
  • Snooping is typically logged (ROM’s wiznet reports it under the snoops flag)

Ethical frameworks vary by MUD:

  • Restrictive model: Some MUDs implement a snoopable flag that players control. Default is off. Admins can override but must file a report justifying why.
  • Open model: Admins can snoop freely but are expected to treat observed private communications (tells, etc.) as confidential.
  • Policy model: Most MUDs state snoop should only be used “for disciplinary purposes” when cheating or illegal behavior is suspected. Admins who abuse snoop face demotion.

Evennia: No built-in snoop command. Can be implemented as a custom command that intercepts the msg() method on the target, forwarding output to the snooper. The lock system provides the access control framework.

2.4 Player Monitoring and Statistics

Beyond snooping, admins have several passive monitoring tools:

ToolWhat It Shows
users / socketsAll connected players: name, host, idle time, connection state
lastLast login time and site for a given player
logToggle command logging for a specific player (writes to file)
wiznet eventsReal-time stream of deaths, logins, level gains, penalties
stat / examineFull character sheet: stats, equipment, affects, location, flags
who (imm version)Admin who shows player levels, sites, and flags invisible to mortals

2.5 How Evennia Handles Admin Interfaces — The Django Admin Panel

Evennia is unique among MUD engines in providing a web-based admin interface alongside the traditional in-game commands.

Access: http://localhost:4001/admin (default), or the “Admin” link in the web client header.

Capabilities:

  • Browse, search, create, edit, and delete all database objects (rooms, characters, exits, scripts, accounts)
  • View and modify Attributes and Tags on any object
  • Manage account permissions and staff status
  • Link accounts to characters (especially important in MULTISESSION_MODE 0/1)
  • View connection history and session data
  • Create rooms, exits, and set descriptions through form fields

Access control:

  • Requires Staff status flag on the Account
  • Only Superusers can grant staff status
  • The Django admin permission system is separate from in-game permissions (Builder, Admin, Developer)

Relationship to in-game commands: Almost everything possible through the web admin can also be done with in-game commands. The web admin is an alternative interface, not a replacement. It’s particularly useful for:

  • Bulk operations (editing many objects at once)
  • Non-technical staff who prefer GUIs
  • Remote administration without a MUD client
  • Debugging (direct database inspection)

Backend code lives in evennia/web/admin/ with admin classes like ObjectAdmin, AccountAdmin, etc. The admin site configuration is in evennia/web/utils/adminsite.py.

2.6 How Modern Engines Separate Admin from Player UIs

EngineApproach
Traditional (Diku family)Single text interface, commands gated by level. No separation at all — just “you can type this, they can’t.”
EvenniaDual interface: in-game text commands (gated by permissions/locks) + Django web admin panel (gated by staff flag). Both modify the same database.
RanvierNode.js engine with clean command separation in code. Admin commands are in separate modules. No built-in web admin.
Custom modern MUDsSome implement dedicated admin web dashboards, REST APIs for remote management, or Discord bot integration for monitoring.

The general trend: modern engines provide both in-game and out-of-game admin interfaces, while traditional codebases rely entirely on the in-game command line.


3. Trust Levels and Permission Systems

3.1 Merc/ROM Trust System

ROM (and its ancestor Merc) uses a numeric level system where immortal levels start above the mortal maximum and each level unlocks additional commands.

Merc level structure (stock):

LevelTitleKey Commands Unlocked
1-35MortalPlayer commands only
36Immortalimmtalk, wizhelp
37Herogoto, bamfin/bamfout, holylight, invis, stat (mstat/ostat/rstat), mfind/ofind, mwhere, peace, switch/return, snoop, log, at, echo/recho, memory, slookup
38Demi-Godmload/oload, mset/oset/rset/sset, noemote, notell, silence, purge, restore, slay, transfer, pardon
39Godban/allow, deny, disconnect, freeze, force, reboot, shutdown, wizlock, users
40Implementoradvance, trust

ROM additions (levels 52-60):

LevelTitleKey Additions
50Avatar/HeroMortal maximum
52-54Angelclone, quest running via switch only
55-56DeityReimbursements (limited to 10 items), quest running
57-59GodRule enforcement: notell, deny, purge, freeze, ban
60ImplementorFull access to everything

The trust command: ROM’s most elegant admin tool. It lets you grant a player command access at a specific level without changing their actual level. A level 52 Angel given trust 57 can use God-level commands without gaining God-level combat stats or being listed as a God. Trust of 0 resets to natural level.

3.2 SMAUG Level Hierarchy

SMAUG extends the Merc hierarchy to 65 levels with a much more granular immortal tier:

LevelConstantTitle
1-49Mortal
50LEVEL_AVATAR / LEVEL_HEROAvatar
51LEVEL_NEOPHYTENeophyte
52LEVEL_ACOLYTEAcolyte
53LEVEL_CREATORCreator
54LEVEL_SAVIORSavior
55LEVEL_DEMIDemi God
56LEVEL_TRUEIMMTrue Immortal
57LEVEL_LESSERLesser God
58LEVEL_GODGod
59LEVEL_GREATERGreater God
60LEVEL_ASCENDANTAscendant
61LEVEL_SUB_IMPLEMSub-Implementor
62LEVEL_IMPLEMENTORImplementor
63LEVEL_ETERNALEternal
64LEVEL_INFINITEInfinite
65LEVEL_SUPREMESupreme Entity

Each level gates specific commands. The first immortal is created by editing a player file directly (changing the Level field to 65) or using the included “Admin” pfile (password: admin).

SMAUG also adds per-command level gating: admins can restrict which immortal levels can use which commands, and the bestowarea command grants building rights to specific areas without granting broader powers.

3.3 CircleMUD Privilege Levels

CircleMUD uses four immortal tiers defined as constants in structs.h:

ConstantDefault LevelTitleKey Commands
LVL_IMMORT31Immortalgoto, at, invis, holylight, stat, snoop, switch, load, purge, restore, echo, send, wiznet
LVL_GOD32Godforce, freeze/thaw, mute, set, dc, reboot, shutdown
LVL_GRGOD33Greater Godban/unban, wizlock, syslog, users
LVL_IMPL34Implementoradvance, full access to set on any field, shutdown die

Key design principles:

  • The first character to log in to a fresh MUD is automatically made LVL_IMPL
  • All other immortals are created via advance from the implementor
  • The level constants can be adjusted by modifying structs.h and recompiling, allowing MUDs to add more granular tiers
  • Commands are gated by setting the minimum level in the cmd_info[] array in interpreter.c
  • Auto-generated wizlist and immlist files are maintained by the autowiz utility

CircleMUD’s set command is particularly powerful — it can modify almost any player attribute:

set <player> level 31          — change level
set <player> gold 10000        — set gold
set <player> str 18            — set strength
set <player> title the Mighty  — set title
set file <player> ...          — modify offline players

3.4 Evennia’s Permission and Lock System

Evennia replaces numeric levels with a string-based permission hierarchy combined with a flexible lock system. This is the most modern and granular approach among the engines covered here.

Permission Hierarchy

Six default levels (from lowest to highest):

PermissionPurposeDefault Access
GuestTemporary accountsOnly if GUEST_ENABLED=True
PlayerStandard playerDefault for new accounts (set by PERMISSION_ACCOUNT_DEFAULT)
HelperTrusted playerCan edit help files
BuilderWorld builderCan use all building commands (create, dig, spawn, examine, etc.)
AdminAdministratorCan manage accounts, boot, wall, change passwords
DeveloperFull accessCan set permissions, ban/unban, functions like superuser but affected by locks

Hierarchy is automatic: having Admin permission automatically passes any lock checking for Builder, Helper, or Player.

Assignment:

perm/account Tommy = Builder     — grant Builder permission
perm/account/del Tommy = Builder — revoke it
perm *Tommy = Builder            — asterisk syntax for accounts

The perm command is Developer-level and cannot be used to escalate beyond your own level.

The Lock System

Locks are the real power of Evennia’s access control. Every entity (objects, commands, scripts, accounts, channels) can have locks that define who can interact with it and how.

Lock string syntax:

access_type: [NOT] lockfunc1([args]) [AND|OR] [NOT] lockfunc2([args])

Multiple access types are separated by semicolons:

delete:id(34); edit:all(); get:not attr(very_weak) or perm(Admin)

Common access types:

Access TypeApplies ToControls
controlObjectsOwnership and modification rights
examineObjectsWho can inspect details
editObjectsWho can modify
deleteObjectsWho can destroy
getObjectsWho can pick up
traverseExitsWho can pass through
cmdCommandsWho can invoke the command
puppetCharactersWho can control the character
listenChannelsWho can subscribe
sendChannelsWho can post messages
bootAccountsWho can kick users

Built-in lock functions:

FunctionDescription
true() / all()Always grants access
false() / none()Always denies
perm(permission)Check hierarchical permission
perm_above(permission)Require strictly higher permission
pperm(permission)Check Account permissions only (prevents puppet escalation)
id(dbref) / dbref(num)Match specific object ID
attr(attrname[, value])Check attributes
attr_gt() / attr_ge() / attr_lt()Attribute value comparisons
tag(tagkey[, category])Check tags
holds(objid)Check inventory
inside()Check location
serversetting(name, value)Check server config

In code:

# Checking access
if not obj.access(caller, 'delete'):
    caller.msg("You can't delete that.")

# Setting locks
obj.locks.add("get:attr_gt(strength, 50)")
obj.locks.add("control:id(34); examine:perm(Builders)")

# Arbitrary lock checks
if not caller.locks.check_lockstring(caller, "dummy:perm(Admin)"):
    caller.msg("Admin access required.")

Quelling

The quell command lets staff temporarily drop to their character’s permission level, useful for testing what players experience. Superusers can use this to test whether locks are working correctly.

Per-Command Access Control

Every Evennia command class defines its own lock:

class CmdBan(MuxCommand):
    key = "ban"
    locks = "cmd:perm(ban) or perm(Developer)"
    help_category = "Admin"

This means access control is per-command rather than per-level, and custom permissions can be created for fine-grained control:

# A custom command only for guild leaders
class CmdGuildPromote(MuxCommand):
    key = "guildpromote"
    locks = "cmd:tag(guild_leader, roles)"

3.5 Builder vs Admin vs Implementor — Access Patterns

The distinction between builder, admin, and implementor access is consistent across codebases despite different implementation details:

RoleCan DoCannot DoTypical Level
BuilderCreate/edit rooms, mobs, objects, help files, area resetsModify players, ban/freeze, access player data, change game configMerc 37, CircleMUD 31 (LVL_IMMORT), SMAUG 51-53, Evennia Builder
AdminEverything builders can + player management, punishment, snoop, monitoring, ban/freezeModify the game engine, set implementor-level fields, advance to implementorMerc 38-39, CircleMUD 32-33, SMAUG 55-60, Evennia Admin
ImplementorEverything — advance players, trust, shutdown, set any field, unrestricted accessNothing is off-limitsMerc 40, CircleMUD 34, SMAUG 62-65, Evennia Developer / Superuser

Key distinction in ROM/Merc: The trust command allows precise access control without level promotion. A builder trusted to level 39 can use God commands without being a God. This is more flexible than CircleMUD’s rigid four-tier system but less granular than Evennia’s per-command locks.

Key distinction in Evennia: The Superuser flag bypasses all locks entirely. This is separate from the Developer permission. Superusers can’t properly test locks because they always pass — hence the quell command.


Sources