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
/setattribute edit deliberately leaves a GM's explicithp.maxoverride alone. Adjust Conditioning to re-derive Health, or sethp.maxdirectly. - Maximum Mana is built. Setting
mana.curonly 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
levelfield above or setexpto 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:TimeoutRoomdefaults 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
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.
/afflictcannot target another player (only self or a room mob).gmflag is always re-derived at login: it cannot be set with/setand will not persist.- Profession changes via
/setrecompute 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, sostat.mgt = 86contributes 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 to6 + level. - GM commands bypass the stun lockout. You can always
/heal,/goto, or/setyour way out of an uncontrolled test state.