Skip to content

Area Format

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

TL;DR: An area is one XML file with six sections: header, helps, mobiles, objects, rooms and quests. Every player-facing string exists in three languages, as one element per language with an l attribute. The file is read once at boot and rewritten whole by every save. Use when: you edit area XML by hand or by script, write a tool that reads areas, or need to know what an element means, how names and keywords are matched, or why a vnum seems to exist twice. Source of truth: plug-ins/areas/xmlarea.h, xmlroom.h, xmlmobilefactory.h, xmlobjectfactory.h, xmlmisc.h (the fields), plug-ins/areas/load_xml.cpp (loading), src/xml/xmlmultistring.cpp (languages), src/l10n/flexer.cpp (case forms), plug-ins/help/areahelp.cpp (the area help article). The area repository itself is the best set of examples. Verified: 2026-11-02 against dreamland_code 88da8302, dreamland_world 43880467, dreamland_areas 6a04168

Files and loading

  • One file per area, named <name>.are.xml. The set of files to load is listed in area.lst.xml (an <arealist> of <node> elements) in the same folder.
  • The folder is the areaDir setting of the server configuration. A local setup uses the demo areas in the areas.local folder of the dreamland_world repository.
  • All files are read once, at boot. The server never re-reads an area file while it runs. A hand edit takes effect at the next boot.
  • Saving (asave, the autosave) writes the whole file from memory, with elements in alphabetical order. A hand edit of a file that the server has open in memory is overwritten by the next save of that area.

File skeleton

<?xml version="1.0" encoding="UTF-8"?>
<area>
  <areadata> ... </areadata>
  <helps> <node id="..."> ... </node> </helps>
  <mobiles> <node name="3001"> ... </node> </mobiles>
  <objects> <node name="3001"> ... </node> </objects>
  <quests> <node type="AreaQuest"> ... </node> </quests>
  <rooms> <node name="3001"> ... </node> </rooms>
</area>

Any section may be missing. A mob, object or room is a <node name="<vnum>">.

Header

<areadata> holds the area as a whole.

Element Meaning
name Area name, one element per language. Russian and Ukrainian use case forms.
altname Optional alternative names. They are searchable and shown in the area help.
preposition Preposition before the name, per language ("in", "в", "у").
speedwalk Speedwalk from the central square of Midgaard (room 3014) to the area, per language. The notation is compass letters n e s w u d with run lengths: 13w, 6s3w.
resetMessage Line shown to players in the area when it resets, per language.
authors, translator Free text.
credits Old field, kept for compatibility.
levelLow, levelHigh Recommended character levels.
vnumLow, vnumHigh The vnum range of the area. Ranges of different areas do not overlap.
flags Area flags (? area_flags): hometown mansion wizlock clan noquest hidden nogate nosavedrop popular system safe easy hard deadly dungeon. hidden hides the area from the areas list, system marks utility areas, popular resets often, dungeon resets items even while players are inside, and safe to deadly set the danger shown in the area help.
security A security number from 0 to 9. Stored, and not checked by the editors.
behavior Legacy area behavior XML.

The help article of an area is composed by the engine from this header (name, levels, authors, danger, quests, speedwalk, map link). The article node in <helps> holds only the story text.

Text and languages

One element per language

A multi-language field is written as one element per language:

<name l="en">Main Street</name>
<name l="ru">Главная улица</name>
<name l="ua">Головна вулиця</name>
  • The attribute is en, ru or ua. A legacy element with no l is read as Russian when it contains Cyrillic letters and as English otherwise.
  • When a player reads a field in a language where it is empty, the engine falls back to the Russian text, and then to the English one. A missing translation never shows as a blank.
  • Russian is the source language of most areas. The English text of old areas goes back to the original Anatolia MUD sources, which Dreamland has rewritten in large part, so do not assume a 1:1 match.
  • Descriptions are plain text with colour and link tags in braces: Text-Markup. A multi-line description ends with a line break inside the element.

Case forms

Names of mobs, objects and doors in Russian and Ukrainian are written in a compact form that holds all six cases, so that messages can decline them. A word is stem|nom|gen|dat|acc|ins|prep:

<short_descr l="ru">горс|ть|ти|те|ть|тью|ти пепла</short_descr>
<short_descr l="ru">эскалатор||а|у||ом|е</short_descr>
  • The part before the first | is the stem. The six parts after it are the endings for the nominative, genitive, dative, accusative, instrumental and prepositional cases, in this order. An ending may be empty (||).
  • Every word of a phrase has its own group. A word with no | is not declined.
  • The engine picks the case a message needs (%N1 for the nominative, %N4 for the accusative and so on). English has no case forms: the English short description is plain text with no article ("handful of ash", not "a handful of ash").
  • Cut the stem where the six forms start to differ, even in the middle of a syllable. In Ukrainian the consonants change before some endings (ніж|ка|ки|ці|ку|кою|ці, not ніжк|а|и|і|у|ою|і). Always print the six forms and read them as words.
  • Colour tags may sit inside the form. The engine keeps them balanced.

Keywords

The words a player types to address something.

  • Mobs, objects and exits. One <keyword l="..."> element per language, each with all its aliases separated by spaces. Every language is matched by itself, so a Ukrainian player types the Ukrainian words.
  • Extra descriptions are the opposite. An extra description has exactly one <keyword> element with no l attribute, and it holds the words of all languages: <keyword>tablet табличка</keyword>. Several <keyword l=...> elements on one extra description are not merged. Only one of them survives the next save.
  • Extra exits have per-language keywords, set in the extra exit editor.

Gender

An object has one <gender> (m, f, n, p) for all languages. A Ukrainian noun of a different gender than the Russian one is written naturally, and the shared field keeps the Russian value.

Vnums

A vnum is unique inside its own space, and there are four spaces: rooms, mobs, objects and helps. Room 3001, mob 3001 and object 3001 are three different things and often all exist. A help article has an id instead.

When you search or patch the XML:

  • Always scope the search to one section (<rooms>, <mobiles> or <objects>), or you will find the first node with that number, which is usually the wrong one.
  • Do not use a regular expression to match <node name="N"> ... </node>. Extra descriptions are nested <node> elements, so a non-greedy match stops at the first inner end tag and cuts off the rest. Use an XML parser.

Rooms

Inside <rooms>, one <node name="vnum"> per room.

Element Meaning
name, description Per language.
sector inside city field forest hills mountain water_swim water_noswim air desert underwater.
flags Room flags (? room_flags).
healRate, manaRate Regeneration percent, 100 if absent.
liquid The liquid of a water room.
clan, guilds guilds limits entry by class. clan marks clan territory (no quit for outsiders) and does not block entry by itself.
smell, sound Per language.
exits Compass exits, see below.
extraExits Other exits, see below.
extraDescriptions Keyword and text pairs for look.
resets Mobs and items of the room: OLC-Resets.
behaviors, props See Behaviors and props.

An exit is <node name="north"> (the names are north east south west up down) with these children:

Child Meaning
target The vnum of the room it leads to.
flags Exit flags (isdoor closed locked ...).
key Vnum of the key, 0 or absent for none.
keyword, short_descr Door words and the door name with case forms, per language.
description What look <direction> shows, per language.

An extra exit is a <node> with the children keyword, target, flags, key, max_size_pass, description, room_description, short_desc_from, short_desc_to, msgLeaveRoom, msgEntryRoom, msgLeaveSelf and msgEntrySelf.

  • The pair short_desc_from and short_desc_to is by sentence, not by side of the room: from is the name of the exit in the message sent to the room being left, to the name in the message sent to the room being entered. Both are already declined for their own sentence, so the values are often plain words.
  • msgLeaveRoom and msgEntryRoom are whole sentences in the message format (%1$^C1 is the traveller, %4$N<case> the exit name). Do not end them with a full stop, the engine adds it.
<msgLeaveRoom l="en">%1$^C1 squeezes into %4$N4</msgLeaveRoom>
<msgEntryRoom l="en">%1$^C1 squeezes in from %4$N2</msgEntryRoom>

More in OLC-Rooms.

Mobiles

Inside <mobiles>, one <node name="vnum"> per mob prototype. Elements:

Element Meaning
keyword, short_descr, long_descr, description, smell Per language.
level, alignment, group Numbers.
wealth, hitroll Numbers in the file, but derived from level and tier at boot: OLC-Mobiles.
race Race name.
sex, size, start_pos, default_pos, dam_type, material Single values.
tier, tierStyle Combat tier and style, see OLC-Mobiles.
act, aff, detection, off, imm, res, vuln, form, parts Flag sets as a difference from the race: <act add="sentinel stay_area" del="..."/>.
affects, professions, practicer, religion, clan, behaviors Names from a registry: <affects registry="skill">swim</affects>.
hit, mana, damage, ac Present in files, and overwritten at boot from level and tier: OLC-Mobiles.
spec, behavior Legacy special function and legacy behavior XML.
affectsDel (noaffects) Affects removed from the race defaults.
gram_number Grammatical number, written only when it is not singular.
reviewed Sets whose removals are honored.
props JSON properties of behaviors.

Objects

Inside <objects>, one <node name="vnum"> per object prototype.

Element Meaning
keyword, short_descr, description, sound, smell Per language. description is the line seen on the floor.
type <type name="weapon"> with one child per type field, see below.
level, weight, cost, condition, limit, material, gender Single values. A value equal to the default is omitted (condition 100, limit -1).
extra_flags, wear_flags Space separated flag names.
affects A list of <node> entries, see below.
extraDescriptions Keyword and text pairs for look.
behaviors, props See below.

The type element holds the type values by name instead of v0 to v4. The names are those of the editor: a weapon has weapClass, diceNumber, diceType, weapType and specType, an armor has <ac pierce= bash= slash= exotic=/>, a container has capacity, flags, maxWeight, key, weightMult, a drink has total, left, liquid, flags. Types with no named fields use v0 to v4. The meaning of each value per type is in OLC-Objects.

An affect is:

<affects>
  <node>
    <apply to="hitroll">4</apply>
  </node>
  <node>
    <apply to="learned">10</apply>
    <global registry="skillGroup">combat</global>
  </node>
  <node>
    <bits table="affect_flags">sanctuary</bits>
  </node>
</affects>

apply names the location and holds the modifier, bits names a flag table with its flags, global names a registry (skill, skillGroup, liquid, wearlocation) with its entries.

Helps

Each <helps> node is one article that belongs to the area: the area story, a clan or a lore page.

<node id="2051" level="-1">
  <extra l="en">spiders yevaud</extra>
  <keyword l="en">arachnos</keyword>
  <text l="en">Long, long ago ...</text>
</node>

id is the article's unique number. Pick a free one: ask the server with abc maxhelp right before you commit. level is the lowest trust level that can read it (-1 means everyone, 102 means immortals only), and labels and seealso are optional. keyword and extra (extra keywords) and text come in all three languages and each text is written entirely in its own language. Links to other articles are {hh<id>name{x. More: Help-Articles.

Quests

The <quests> section holds area quests, see Area-Quests.

Behaviors and props

A mob, object or room can carry behaviors:

<behaviors registry="behavior">fire</behaviors>
<props>{"fire":{"fire_power":4}}</props>
  • behaviors is a space separated list of behavior names.
  • props is JSON, keyed by behavior name, holding the properties of each behavior. The JSON text is XML-escaped inside the element. A prototype with no properties writes null.
  • Scripts of the prototype (onGreet and the rest) are not stored in the area file. They live in the Fenia script store, attached to the vnum.
  • In a loaded object, the properties live on the prototype and not on the copy, so scripts read them through the prototype.

Editing by hand

  • Prefer the in-game editors. Edit a file by hand only for bulk changes, and make sure the server will not save that area over your change before the next boot.
  • Use an XML parser. Keep the elements in alphabetical order: the server writes them that way, so a diff stays small.
  • After a hand edit, boot a local server and read the log. A malformed area stops the boot.

See also: Building, OLC, OLC-Rooms, Text-Markup, Writing-Player-Text.

Clone this wiki locally