Repository navigation
Area Format
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
lattribute. 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
- One file per area, named
<name>.are.xml. The set of files to load is listed inarea.lst.xml(an<arealist>of<node>elements) in the same folder. - The folder is the
areaDirsetting of the server configuration. A local setup uses the demo areas in theareas.localfolder of thedreamland_worldrepository. - 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.
<?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>">.
<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.
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,ruorua. A legacy element with nolis 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.
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 (
%N1for the nominative,%N4for 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.
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 nolattribute, 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.
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.
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.
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_fromandshort_desc_tois by sentence, not by side of the room:fromis the name of the exit in the message sent to the room being left,tothe 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. -
msgLeaveRoomandmsgEntryRoomare whole sentences in the message format (%1$^C1is 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.
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. |
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.
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.
The <quests> section holds area quests, see Area-Quests.
A mob, object or room can carry behaviors:
<behaviors registry="behavior">fire</behaviors>
<props>{"fire":{"fire_power":4}}</props>-
behaviorsis a space separated list of behavior names. -
propsis 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 writesnull. - Scripts of the prototype (
onGreetand 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.
- 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.
Start here
Get running
Contribute
- Contribute
- Contributing Workflow
- Code Style
- Accessibility
- Writing Player Text
- Game Design Principles
Build areas
- Building
- OLC
- OLC Rooms
- OLC Mobiles
- OLC Objects
- OLC Resets
- OLC Line Editor
- OLC Other Editors
- Area Format
- Area Quests
- Mob Forms and Parts
Fenia
- Fenia
- Fenia Language
- Fenia Triggers
- Fenia Gotchas
- Fenia API
- Fenia Scripts
- Fenia Behaviors
- Fenia Skills and Spells
- Fenia Cookbook
- Fenia Grammar
Engine
- Engine Architecture
- Engine Time and Pulses
- Output Format
- Mechanics Combat
- Mechanics World
- Data Configs
- Item Power
Localization
Clients
More