Skip to content

GM Guide

The operator's manual for Game Masters: how GM powers are granted, all GM commands, and how to read and set player progression and combat values.

For how the underlying systems work from a player perspective, see the rest of this wiki. This page covers the admin side.


Becoming a GM

GM powers are gated by an allowlist of character names (Game:GmNames). The flag is re-derived from this list at login — it cannot be set in-game, cannot be persisted from a previous session, and cannot be toggled. Change the allowlist, then disconnect and reconnect.

A non-GM receives I don't recognize that command. for every GM verb — identical to a typo, by design.

Launch method How to set GmNames
Visual Studio launchSettings.json → Game__GmNames__0
run-local.ps1 -Gm YourName parameter
appsettings / env Game:GmNames array, or PHOENIX_GM_NAMES (comma-separated)

Confirm with /showplayer self (GM-only) or check HELP — the GM help category only appears when gm == 1.


GM command reference

All GM verbs start with /, are case-insensitive, and are gated by GM status. Most act on your current room or yourself unless a player name is specified.

Player management

Command Aliases Description
/showplayer <self\|player> /inspect Full player sheet: level, exp, TP, stats, HP, mana, silver, skills
/set <self\|player> <field> <value> /setplayer Set a player field — see §Set fields below
/award <self\|player> <exp> /grantexp, /giveexp Grant experience (negative removes); runs normal level-up + TP grant
/levelup <self\|player> [n] /advance Advance n levels (default 1; negative de-levels)
/heal <self\|player> /restore, /revive, /raise Fully restore HP + mana, clear all effects/recovery, raise if dead
/reroll <self\|player> /remake Preview a character re-roll (destructive — see below)
/reroll <self\|player> confirm — Execute the re-roll (wipes items + silver, resets to level 1)

Player moderation

Discipline live players. See §Moderation below for the details.

Command Aliases Description
/smite <self\|player> [kill] [reason] /wrath Call down a thunderbolt on any online player from anywhere: bare, it leaves them at 1 HP and prone; kill slays outright through the normal death path
/timeout <player> [minutes] [reason] /jail Confine a disruptive player to the timeout room (a Warded Cell, room 9000, pre-built and pre-wired) — only quiet verbs work until it lifts (default Game:TimeoutDefaultMinutes). Survives a relog. Repoint with /config timeoutroom <vnum>
/free <player> /untimeout, /unjail, /pardon End a time-out early and return the player where they were pulled from
/ban <player> [perm\|Nd\|Nh\|Nm] [reason] — Ban an account (default permanent); persisted + enforced at login; an online target is disconnected at once. Refuses you and bootstrap-GM accounts
/unban <player> — Lift any ban on an account
/banlist /bans List every account still under a ban (lift time or "permanent", plus reason)
/kick <player> [reason] /disconnect, /boot Drop an online player's connection — no ban, they can reconnect

World/room manipulation

Command Aliases Description
/goto <room vnum> /teleport Teleport yourself to a room (e.g. /goto 1007)
/goto messages /teleport messages, /goto message Preview your teleport messages privately. Set either with /goto messages depart <text> or /goto messages arrive <text>; {name} inserts your name. Saved to your GM character profile, also editable in Worldbuilder. One line of up to 500 characters. /goto messages reset [depart\|arrive] restores one or both defaults
/spawnmob <nameKey> [qty] /spawncreature, /spawnenemy Spawn 1–10 mobs from template into your room
/spawnitem <nameKey> [qty] /spawnobj, /spawn Spawn 1–10 items onto the ground here
/spawnbox [tier] /makebox Spawn a random treasure box (tier 1–10, default 3)
/spawnpick [material] /makepick Spawn a lockpick (copper…starsteel, default steel)
/spawnarmor <slot> [group] /makearmor Spawn wearable armor (slot = head/chest/legs/…; group = cloth…plate)
/deleteobj <name\|id> /delitem, /delobj Delete an object and its contents
/track <item\|guid> /whereis Locate an item: current location, owner, drop history
/alter [POCKET\|DEEPEN\|SEAL\|WEIGHT\|LIGHTEN] <item> [n] [n] /tailor Re-cut one spawned item at the alterer's bench: POCKET cuts pockets into it (an enabled Inside slot plus IsContainer — the only thing that separates a coat that holds things from one that doesn't), DEEPEN grows them, SEAL sews them shut (refuses while anything is inside), WEIGHT/LIGHTEN change what it weighs. Bare /alter <item> inspects. Capacities take -1 for "no limit". Reach is your hands, then the room — take the garment across the counter. Instance-only: the template and every other copy stay as authored, and the change is saved as it happens
/dragon /flyover Demand a dragon flyover: a three-beat staged sky event starting within ~20s, seen from outdoor rooms (indoor rooms catch a shadow or sound at most). Natural flights run every 45–100 min of real time — Game:Environment:Dragon
/ferry [go] /ferries, /boat List every timed NPC boat (where she is, seconds to the next leg); /ferry go ends every boat's current leg on the next tick (~10s) so a full crossing demos in under a minute. Ferries are room data (ferry.* vars); kill switch Game:Ferry:Enabled=false
/event [kind\|stop] /events, /sky Status of the sky, or force a world event for a demo: storm, heatwave, coldsnap, meteor, comet, aurora (begins within ~20s, eligibility skipped so it plays under any sky); /event stop ends the active one. Natural events roll on their own — tune live with /config events (on/off) and /config eventgap (mean minutes). Cold snaps slicken ice, meteor showers drop forageable sky-iron, the aurora quickens outdoor recovery

NPC configuration

Command Aliases Description
/makecaster <mob> <words> /spellmob Flag a room mob as a caster with specific incantation
/makevendor <npc> /makeshop Flag an NPC as a general merchant
/makegemshop <npc> /makegemseller Flag an NPC as a gemshop (premium gem pricing)
/makementor <npc> <WORD> /maketeacher Flag an NPC as an element word mentor
/makecleric <npc> /makepriest Flag an NPC as a temple cleric: dead bodies in their room stop decaying and get the paid CONFIRM raise offer (fee = 100 + 30×level silver)

Diagnostics

Command Aliases Description
/debug <guid\|phrase> — Dump entity identity, flags, all vars, container slots, scripts (your room only)
/boxes /listboxes Audit all treasure boxes in the world
/afflict <self\|target> <effect> [args] — Apply timed effects for testing (see §Afflict below)
/killself /die Run the real death/respawn path on yourself (death-rest + DEPART, the grave-chill, region respawn at half HP)
/regions /region List the realm's regions (anchor, resting place, room count, seams) and which one you stand in

Live settings: /CONFIG

/config (aliases /settings, /gameconfig) reads and writes runtime game settings. Writes persist to the DB-backed game_settings store, which overrides appsettings.json at boot (it's added last in Program.cs CreateHostBuilder, so it always wins) — an override survives every restart until you delete it.

Form Effect
/config List every curated setting with its effective value — * marks live-apply, the rest take effect on /reboot — plus any overrides saved outside the curated list
/config <key\|alias> Show one setting in full: description, type, live/reboot, aliases, running value, DB override
/config <key\|alias> <value> Set it. Booleans take on/off, true/false, 1/0; numbers are validated. A live setting applies in-process immediately; the rest are saved and wait for /reboot
/config delete <key> Remove the override (reset and clear are synonyms). The appsettings default returns on the next /reboot — a live setting's running value is not rolled back in place

The curated list is not a whitelist: /config sets any config key, curated or not. An unrecognized key is stored verbatim and applies on the next /reboot — which also means a typo'd key quietly becomes an inert override (it shows under "Other overrides" in the bare listing; /config delete it). Restart with /reboot now — bare /reboot only warns.

The curated settings — live applies in-process the moment you set it, reboot waits for the next restart:

Key Aliases Applies What it does
Game:DebugTimestamps timestamps, timestamp, ts live Prefix world-event output with [HH:mm:ss.fff]
Game:DebugShowIds showids, ids, guids, itemids live Append each item's GUID in world output (GM debug aid; off so players never see GUIDs)
Game:PlayerSaveSeconds playersaveseconds, saveseconds reboot Save-on-milestone flush cadence in seconds (2–120)
Npc:Gossip:Enabled gossip reboot Ambient NPC gossip lines (the news feed stays on regardless)
Npc:Gossip:Chance gossipchance reboot Per-tick chance an opted-in NPC voices a rumor (0–1)
Npc:Narrator:Enabled narrator reboot The chronicle narrator's rare private milestone lines
Nlu:Enabled nlu reboot Fuzzy natural-language fallback for unknown commands
Game:SummonCinematicAlways summonfull, cinematicalways live Force the FULL summon cinematic every time (demo mode)
Worldbuilder:BaseUrl wburl, worldbuilderurl, editorurl live Worldbuilder base URL for GM /edit deep links
Game:SummonFullCooldownMinutes fullcooldown, summoncooldown live Minutes before a pet's FULL summon cinematic replays (0 = every far summon)
Game:IceHazardScale icescale, icehazard live Percent scale on icy-room slip difficulty (100 = as authored, 0 = off)
Game:RegenScale regenscale, regenspeed, recoveryscale live Percent speed of body recovery — HP/mana/spirit/stamina (100 = reference pacing, 200 = default double speed; 10–1000). Exp absorption has its own expscale
Game:ExpAbsorbScale expscale, absorbscale, expabsorbscale live Percent speed of the field-exp absorption clock only (100 = reference ~60s pulse, the default; 10–1000). Slow drain = the hunt-fry-rest rhythm
Game:CommandQueueLimit queuelimit, commandqueuelimit, queuecap live Maximum actions waiting for recovery; default 3, whole numbers 0–20. Zero disables queuing and clears waiting commands
Game:RespecEnabled respec, respecenabled live Temporary free full character rebuild at an inn; off prevents new rebuilds while allowing an existing rebuild to finish or cancel
Game:DarknessEnabled darkness, dark live Dark rooms blind the unlit (carry a light.source lantern or cast 2244 Lanternseed); off = darkness is scenery
Game:WorldEventsEnabled events, worldevents, skyevents live Staged world events (storms, heat waves, cold snaps, meteor showers, comets, aurora)
Game:WorldEventGapMinutes eventgap, eventminutes live Mean minutes between natural world events (jittered 0.6×–1.4×; min 5)
Game:ArmorHindranceScale hindscale, armorhindrance live Percent scale on armor spell-hindrance (100 = as designed, 0 = armor never hinders casting)
Game:MobPopulationTickSeconds mobtick, mobpopulationtick, spawntick live Seconds between mob population director ticks (respawn + region top-up; 10–600)
Game:RoomAmbientFloorSeconds ambientfloor, roomambientfloor, noisefloor live Seconds a room must stay quiet between ambient lines, whoever's turn it was (0 = no floor; 0–300)
Game:TimedScriptSpreadEnabled scriptspread, spreadscripts, pulsespread live Spread each pulse's timed ambient scripts across the pulse (off = all fire at once)
Game:MobScalingEnabled mobscaling, mobscale, popscaling live Scale a region's live-mob budget with the players present (off = authored baseline only)
Game:MobEmptyFloorPct mobfloor, mobemptyfloor live Target mob population of an empty region, as % of baseline (spawn-only floor; 0–100)
Game:MobScalePerPlayerPct mobperplayer, mobscaleplayer live % of baseline added per extra player in a region (1 player = 100%, then +this% each)
Game:MobScaleMaxPct mobcap, mobscalemax, swarmcap live Per-area budget ceiling: most a region's target may reach, as % of baseline (300 = 3×)
Game:MobSpawnBurst mobburst, mobspawnburst, spawnburst live Most mobs the director spawns into one region per tick (refill-rate ceiling; 1–100)
Server:MaxConnections maxconn, maxconnections live Total telnet connections the TCP listener accepts (8–5000; reaches the TCP process within ~15s)
Server:MaxConnectionsPerIp maxperip, maxconnperip, periplimit live Telnet connections allowed per source address (1–1000; raise for a load-test swarm, then drop back)
Game:DeedBaseCost deedbase, deedcost live Deed offering base value, before level/deed scaling (shrine rite)
Game:DeedCostPerLevel deedperlevel live Deed offering cost added per character level
Game:DeedCostPerDeed deedperdeed live Deed offering cost added per deed already banked
Game:DeedMax deedmax, maxdeeds live Most deeds a player may bank at once
Game:LootBoxDefaultChance boxchance live Default % chance a searched corpse yields a locked box (loot.box.chance overrides)
Game:LootJewelryDefaultChance jewelrychance live Default % chance a searched corpse yields jewelry (loot.jewelry.chance overrides)
Game:LootCurioDefaultChance curiochance, rarechance live Default % chance a searched corpse yields a wand/scroll/oddity (loot.rare.chance overrides)
Game:VendorCashDefault vendorcash live Silver in a merchant's till (vendor.cash overrides); bigger payouts become promissory notes
Game:VendorNoteFeePermille notefee, vendornotefee live Tenths of a percent a merchant shaves off a promissory note (vendor.note.fee.permille overrides)
Game:FlareChancePct flarechance, flarescale live % chance a flaring material (embersteel/rimesteel/stormsteel/thrumsteel/…) procs on a landed blow
Game:TimeoutRoom timeoutroom, jail, jailroom live Room vnum the GM /timeout verb confines players to (0 = unset) — see §Moderation
Game:TimeoutDefaultMinutes timeoutminutes, timeoutdefault live Default /timeout length in minutes when the GM doesn't name one
Game:TravelStepMs travelms, travelstep, travelspeed live Milliseconds between TRAVEL auto-walk steps (clamped 100–5000)
Game:SwapRtMs swaprt, swapms live Recovery in ms for SWAP (hand-to-hand item trade); 0 = instant. Clamped 0–10000
Game:WearRtMs wearrt, wearms, removert live Default recovery in ms for WEAR/REMOVE; body_slots.wear_rt_ms overrides per slot (accessories are 0); 0 = instant. Clamped 0–10000
Game:SearchBodyRtMs searchbodyrt, searchbodyms, lootrt, corpsesearchrt live Recovery in ms for a SEARCH <body> that finds loot; 0 = instant. Clamped 0–30000
Game:SearchBodyEmptyRtMs searchemptyrt, lootemptyrt live Recovery in ms for a SEARCH <body> that turns up nothing; 0 = instant. Clamped 0–30000

In the bare listing, the value shown is the DB override if one exists, else the running value where the engine can read it ((default) where it can't).

This table mirrors the KnownSettings registry in GameEngine/Commands/CoreCommands.Config.cs — when a setting lands there, add its row here.


/set: setting player fields

/set uses the real progression helpers so derived values stay consistent. Target is self/me or an online player's name.

/set self level 10
/set self mgt 90
/set self skill.edged 40
/set self skill.lore.fire 25
/set self profession Wizard
/set self mana.cur 999
/set Nitefallz silver 5000

Field reference

Field Value Notes
level 1–100 Sets experience to that level's threshold; grants all missing Training
exp ≥ 0 Sets permanent experience; re-derives level and Training grants
training (training.points) ≥ 0 Available Training
silver ≥ 0 Currency
mgt vig fin grc res att ins pre 1–100 A raw attribute. Recomputes Mana, Spirit, and Stamina; does not retroactively change Health or already-granted Training.
hp.max ≥ 1 Max HP. The fitness cap is 150; /set allows higher for testing.
hp.cur (hp) 1..max Current HP. Won't drop below 1 — use /killself for death.
mana.cur (mana) 0..max Current mana. Raise max first if needed.
skill.<name> ≥ 0 Skill ranks (e.g. skill.edged, skill.lore.fire, skill.harnesspower). skill.harnesspower recomputes mana.
profession calling name Recomputes Mana; does not refund spent Training or re-apply ancestry modifiers.
stance assault/press/ready/brace/guard Combat stance
posture standing/kneeling/sitting/prone Body position

Delta notation

Any numeric field accepts +N or -N to add or subtract instead of setting:

/set bob exp +5000        grant 5000 exp (level-up and Training grants run normally)
/set self mgt +5          raise Might by 5
/set self skill.edged +3  add 3 ranks
/set bob silver -100      confiscate 100 silver

Important constraints

  • Health is derived. A /set attribute edit deliberately leaves a GM's explicit hp.max override alone. Adjust Conditioning to re-derive Health, or set hp.max directly.
  • Maximum Mana is built. Setting mana.cur only tops up the current pool; to give more capacity, add Channeling, magical control, circle/Wordcraft ranks, or the casting aptitude.
  • Level is derived from experience. A hand-set level var is overwritten on the next award. Use the level field above or set exp to the desired threshold.

/afflict: applying test effects

/afflict applies temporary effects without touching base stats. Target is self/me or a living mob in your room (you cannot afflict another player).

/afflict self stun 2              stun yourself for 2 rounds (10 seconds)
/afflict self bleed 5             5 HP per pulse bleed on chest
/afflict self buff as 30 60       +30 Attack for 60 seconds
/afflict kobold debuff ds 20 30   −20 Guard on the kobold for 30 seconds
/afflict self clear               remove all effects on yourself

Syntax:

Sub-command Args Effect
stun <rounds> rounds × 5s Stun effect
bleed <hp/pulse> HP drained per 6s tick Wound at "chest"
buff <channel> <magnitude> <seconds> channel = attack guard focus resolve mgt vig fin grc res att ins pre Positive timed modifier
debuff <channel> <magnitude> <seconds> Same (magnitude forced negative) Negative timed modifier
clear — Remove all effects on target

Moderation: smite, time-out, ban, kick

Tools for disciplining live players. Unlike /afflict and /heal (which touch only creatures in your room), these reach any online player by name from anywhere. All refuse to act on a fellow GM, and /ban//kick//timeout refuse to act on you.

/smite <self|player> [kill] [reason]

Calls down a pillar of divine fire. Bare, it takes the target to 1 HP and leaves them prone (a scare, not a death). Add kill (or slay/dead) to slay them outright through the normal death path — the grave-chill, chapel respawn, and all. A trailing reason is whispered to them.

/smite Griefer                     thunderbolt — 1 HP, prone
/smite Griefer kill last warning   slay outright, whisper the reason

/timeout <player> [minutes] [reason]: the in-game time-out

Whisks a disruptive player to the timeout room and confines them there. While the sentence runs they can only look, say, check their sheets, and wait — moving, fighting, casting, and everything else is refused. The sentence is stored on the character, so relogging doesn't dodge it, and it self-expires: the moment it's up they're freed in place and can walk out.

  • Default length is Game:TimeoutDefaultMinutes (5). /free <player> (aliases /untimeout, /pardon) ends it early and returns them where they were pulled from.
  • The cell is already built and wired: A Warded Cell (room 9000), a still pocket apart from the world with a single warded door north back to the Town Square (1007), flagged Safe + NoMagic. Game:TimeoutRoom defaults to it — no setup needed. Repoint it at any other room with /config timeoutroom <vnum> if you'd rather.
/timeout Griefer 10 spamming say   ten-minute time-out
/free Griefer                      release early
/config timeoutroom 1099           (optional) use a different cell

/ban, /unban, /banlist: account bans

/ban <player> [duration] [reason] closes the realm to an account. It's persisted (players.banned_until) and enforced at login, so it outlives a restart; an online target is disconnected immediately. Duration is perm (the default when omitted), or Nd / Nh / Nm (days/hours/minutes); a bare number is days. /ban refuses you and any Game:GmNames bootstrap-GM account.

/ban Cheater perm botting          permanent
/ban Griefer 7d spamming           seven days
/unban Griefer                     lift it
/banlist                           who's banned, and why

Temp bans self-clear on the first login attempt after they expire.

/kick <player> [reason]: drop a connection

/kick <player> disconnects an online player without a ban — they can reconnect at once. Use it to break up a scene or bounce a stuck session; reach for /ban when they shouldn't come back.


/reroll: resetting a character

/reroll <player> re-rolls an existing online character: resets them to level 1, wipes all items and silver (a carried pet is spared), and routes them through character creation again. The name is kept.

Two-step: /reroll <player> previews what would be lost. /reroll <player> confirm performs it.

The character stays in the world during re-roll. A disconnect mid-creation rolls back cleanly.


GM recipes

Make a level-10 melee fighter ready to swing:

/set self level 10
/set self str 90
/set self skill.edged 40
/set self skill.dodge 20
/set self hp.max 200
/spawnitem broadsword
Then GET broadsword.

Make a test caster with sufficient casting competence:

/set self profession Wizard
/set self level 10
/set self aur 90
/set self skill.harnesspower 25
/set self skill.lore.fire 25
/showplayer self    (confirm mana max > 0)
INCANT BOLTAR IGNAGA kobold

Test the lockpicking loop:

/spawnbox 6                 tier-6 box (likely locked, likely trapped)
/spawnpick starsteel
/set self skill.lockpicking 30
/set self skill.disarmtraps 30
SURVEY box
DEFUSE box
PICK box
OPEN box
LOOT box
/boxes                      audit all live boxes

Spawn a caster mob:

/spawnmob kobold
/makecaster kobold BOLTAR IGNARA
KILL kobold


Server console keys

When the GameServer runs with a console, single keypresses control the live world:

Key Action
S World entity stats
N NPC vitals (room, drives, behavior)
R Reload scripts
W Dump world snapshot to JSON
P Toggle world clock auto-pulse
M Fire one manual clock pulse
Q Graceful shutdown
H / ? Console help

P then M steps the clock one tick at a time — useful for testing time-of-day events.


Notes and limitations

  • No PvP. Combat cannot target players; only hostile mobs are valid.
  • /afflict cannot target another player (only self or a room mob).
  • gm flag is always re-derived at login: it cannot be set with /set and will not persist.
  • Profession changes via /set recompute mana but do not re-apply race stat mods or refund TP.
  • Attack/Guard use attribute bonuses, not raw values. The combat snapshot converts each raw attribute to floor((raw − 50) / 2) before feeding Attack/Guard, so stat.mgt = 86 contributes its +18 bonus, not 86. An absent attribute reads as a neutral 50 (bonus 0). Creature offense inputs — Might and weapon ranks — are additionally floored to 6 + level.
  • GM commands bypass the stun lockout. You can always /heal, /goto, or /set your way out of an uncontrolled test state.