Skip to content

Local Testing

Kit Oliynyk edited this page Nov 3, 2026 · 3 revisions

TL;DR: On a local server you play an immortal with Fenia rights. load, vnum, stat, goto, force and advance cover most checks. To change profession, race, hometown or level of a character, assign the field with eval. api() prints what a Fenia object can do. gquest start runs a global quest with nobody online. Use when: you built a local server and want to try a change: spawn a mob or item, become another class, test a quest, watch a trigger fire. Source of truth: dreamland_code/plug-ins/comm/wizard.cpp (load, vnum, stat, advance, goto), dreamland_code/plug-ins/comm/set.cpp, dreamland_code/plug-ins/feniaroot/ceval.cpp, dreamland_code/plug-ins/feniaroot/ccodesource.cpp, dreamland_code/plug-ins/gquest/command/cgquest.cpp, dreamland_code/plug-ins/gquest/core/globalquestinfo.cpp, dreamland_code/plug-ins/admin/cprofile.cpp, dreamland_world/commands/, dreamland_world/gquests/ Verified: 2026-11-02 against dreamland_code a7c4fd10, dreamland_world a35c62ce, dreamland_fenia_public c28874b

Log in as Kadm or Cadmus first, see Local-Setup. Both carry the coder attribute, so every command below is allowed. A normal immortal needs level 110 for eval or a Fenia security attribute, and the coder attribute for cs load.

A fresh server has none of the public Fenia helpers (.tmp.chance and the like) until you load them with cs load, see Local-Setup.

Immortal commands accept English names. The in-game help has the full text: help <command>. wizhelp lists the immortal commands with a one-line hint each.

Find, create, inspect

Spawn a mob or an item by vnum:

load mob 3001
load obj 3000
load obj 3000 50

load obj takes an optional level, up to your trust. An item you can pick up lands in your inventory, anything else on the floor. A mob appears in your room.

Find a vnum by name. The search phrase is the whole rest of the line, quotes optional:

vnum obj beer
vnum mob baker
vnum type gem

vnum type <item_type> lists every object of that item type. mwhere, owhere and rwhere find where something is right now, or which rooms have a word in the name.

Print the full data of a thing. The same command is behind the stat menu in the web client:

stat obj <name>
stat mob <name>
stat char <name>
stat room
stat room 3001

stat with no type tries an item first, then a character, then a room.

Move and clean up

goto 3001
goto <mob or object name>
at 3001 look
transfer <name> 3001
purge <name>
purge
restore <name>
peace

goto takes a vnum or the name of a mob or object. at runs one command somewhere else and brings you back. purge with no argument destroys every NPC and object in the room. peace stops all fighting in the room.

Change a character

Profession, race, hometown, level

Assign the field with eval. A bare name on the left writes to the character that runs eval:

eval profession=.Profession("warlock")
eval race=.Race("satyr")
eval hometown=.Hometown("solace")
eval level=99

To change someone else, find them first. get_char_world inside eval resolves against you, so it takes a player or mob name:

eval get_char_world("gosha").profession=.Profession("ninja")
eval get_char_world("gosha").race=.Race("human")
eval get_char_world("gosha").hometown=.Hometown("midgaard_neutral")

Valid names are the file names, without .xml, in these folders of dreamland_world:

Field Folder Note
profession professions mobile is not a player class
hometown hometowns
race races player races have type DefaultPCRace in the root node

Kadm ships with the profession universal, which has no file in professions (unverified what the engine does with it). Give Kadm a real profession before you test skills. The eval command takes one expression. For several statements see Fenia-Scripts.

Skills, levels, other fields

set skill Kadm all 100
set skill gosha all 100
advance gosha 100
set char
  • set skill <player> all <rating> learns every skill to that rating. It works on players only.
  • advance <player> <level> sets a level from 1 to 110. The target must be in your room. Hit points and other values are recalculated, and not always neatly when you lower a level.
  • eval level=99 changes only the number and recalculates nothing (from the old guide, unverified).
  • set with no arguments lists its types: char, skill and help (which prints that list). There is no set mob, set room or set obj. Use oedit and medit for prototypes, see OLC.

There is no set for a single live mob or object. Override an instance with eval instead, for example eval get_char_world("goblin").max_hit=500. Only fields marked writable in the API can be assigned, see below.

Adding a character without a restart

Put the two profile files of the new character into the backup folders and restore them from the game. Suppose the character is gosha, with gosha.player and gosha.xml:

cp gosha.player var/db/oldstyle/backup
cp gosha.xml var/db/backup
profile recover gosha
finger gosha

profile backup <name> does the reverse and saves both profiles into those folders. profile undelete and profile unremort restore from the delete and remort folders. A new character can also be created the normal way through port 9000, which runs the creation dialog from the seeded Fenia database (unverified here, the dialog was not run for this page).

Make a character act

force <name> smile
eval get_char_room("valkyr").interpret("smile")

force all <command> makes every player of lower trust do it (it needs trust 105, and skips mobs). Forcing a single player needs trust 106, forcing a mob has no such limit, and you can only force a target of lower trust than yours. eval ... .interpret(...) runs a command as that character, see the API for interpret_cmd and interpret_raw.

Lists of commands and abilities

wizhelp
commands
commands list
commands show look
skills
skills spells
skills passive
  • commands shows the commands by help section, commands list shows all of them with aliases, commands show <name> shows one with its aliases and section.
  • skills lists the abilities your character has. Add skills, spells, active or passive to filter. Use skills all for the whole table.

Inspect the Fenia API

Every Fenia object can print what it offers. ptc prints a value to the character running eval:

eval ptc(api())
eval ptc(get_char_world("valkyr").api())
eval ptc(.get_mob_index(3000).api())
eval ptc(.get_obj_index(3000).api())
eval ptc("text".api())
eval ptc(.api())

In order: yourself, a mob in the world, a mob prototype, an item prototype, a string, the root object. rtapi() is the same idea for what has been set at run time, for example triggers added by scripts. The generated reference with every field and method is https://dreamland.rocks/feniaapi.html. See Fenia-API.

Never pass a negative vnum to an index lookup, see Troubleshooting.

Global quests

gquest with no arguments prints the syntax. For immortals the main subcommands are:

gquest list
gquest start <id> [<min_level> <max_level>] [<minutes>] [<scenario>] [<playerCnt>]
gquest stop <id>
gquest time <id> <minutes>
  • <id> comes from gquest list. The stock ids are gangsters, invasion and rainbow.
  • Level limits apply only to quests that use them, such as gangsters. Other quests start with the minutes argument.
  • <minutes> defaults to 30.
  • <scenario> picks a variant. rainbow has rainbow and sins. invasion has bubbles, football, iceberg and locust.
  • <playerCnt> pretends that many players are online, so a quest can start in an empty world.

Examples:

gquest start gangsters 5 10 29
gquest start rainbow 30 rainbow 5
gquest start rainbow 30 sins 5
gquest start invasion 30 locust 7
gquest list
gquest stop gangsters

The first starts bandits for levels 5 to 10 for 29 minutes. The next two start the rainbow or the seven sins for 30 minutes as if five players were online. The fourth starts an invasion as if seven were online. A quest of the rainbow type announces itself after one minute. gq works as an abbreviation. The files in dreamland_world/gquests are written by the server, so do not edit them by hand.

Clean up after yourself

Fields you assign on characters and objects, and anything stored under .tmp, are kept in the Fenia database and survive restarts. Debug triggers you attached stay attached. Remove them when you are done. To start over, re-seed the Fenia database, see Troubleshooting. Purge mobs and items you spawned.

See also

Clone this wiki locally