>
Valhalla v2.07
-- The New and Improved Database Format --
A Pre-release description by quinn@diku.dk
Comments to seifert@valhalla.com
HISTORY
v2.07: Got rid of old format for money definitions.
v2.06: Added 'title' field to zones.
v2.05: Changed 'height' to be a unit field.
v2.03: Added note about importance of proper capitilization of
names.
NAME
dmc - DikuMUD database-compiler.
SYNOPSIS
dmc [-v] [-m] [-s] pathname ...
DESCRIPTION
Dmc is the databse-compiler for DikuMUD (Version 2 and later). It
takes as input a number of source files, and produces a corre-
sponding number of binary datafiles, in a format readable by the
DikuMUD-server.
FILENAMES
A sourcefile should have a filename ending in '.zon'. Files end-
ing in '.zon.Z' are assumed to be compressed, and are piped
through 'zcat' before processing. Output is placed in files with
corresponding filenames, and the suffixes '.data' and '.reset'.
OPTIONS
The argument string is processed from left to right. Options may
appear between filenames, but it should be noted that an option
only takes effect when it is encountered. In most cases, options
should be placed to the left of the filename arguments.
-v Verbose output.
-m Make option. Only compile sourcefiles if they have been modi-
fied more recently than the corresponding output files.
-s Suppress the generation of output files.
GENERAL CONCEPT
The new database format is designed to improve the system on two
factors: Runtime efficiency and user-friendliness (ease of build-
ing). The second part is achieved through the use of a format
that imitates a series of data assignments in a high-level pro-
gramming language. To prevent this higher-level format from af-
fecting the performance of the game, the data files are 'com-
piled' into a binary format that is easily read by the server
program. In some cases, it is possible to store data directly in
the structures used by the server; Thus, data can be read and as-
signed in a single operation. Symbolic names are used for all da-
ta-fields. The Compiler is able to supply default values for
most fields, so the builder frequently only needs to define a few
key values. All units will be referred to by symbolic, user-
selected names within the source files, improving readability.
The compiler will filter the input files through the C-
preprocessor, allowing builders to benefit from the use of in-
cluded files and macro definitions. Predefined macros for often-
used values and names will be automatically included. Each 'zone'
of the game will be contained in one single file, making the pro-
cess of using constructors from foreign sites considerably more
attractive.
The C-PREPROCESSOR
If you're already familiar with this program, you can skip this
section. If not, this is a brief outline of the most important
functions. For details, consult a C-manual (or man cpp).
MACRO SUBSTITUTION
For our purposes, this is the most powerful feature of the pre-
processor. It allows you to enter lines like:
#define DIRTFLOOR {UNIT_FL_NO_WEATHER, UNIT_FL_CAN_BURY}
(note that the '#' must be in column one)
Then, later on in the text, you can write:
flags {DIRTFLOOR, UNIT_FL_SPEC_TICK}
The preprocessor will substitute the 'macro' resulting in:
flags {{UNIT_FL_NO_WEATHER, UNIT_FL_CAN_BURY}, UNIT_FL_SPEC_TICK}
Another function, #include, allows you to include other files in
your zone description. Files containing macro definitions for the
most important values are automatically included.
In addition, of course, the preprocessor permits you to put com-
ments enclosed in /* ... */ anywhere in your file - increasing
the readability.
THE ZONE FILES (data format)
Spaces, Htabs, and linefeeds are considered whitespace and ig-
nored.
A zonefile is split up into 5 sections. A zone-declaration sec-
tion, a mobile (NPC) section, an object section, a room section,
and a reset section. None of the sections actually have to be in
the file, and they may appear in any order.
Each section is preceded by a section header. These are the five
possible headers:
%zone
%rooms
%mobiles
%objects
%reset
The first four sections may be considered lists of definitions.
The last section is can be considered a program in a simple pro-
gramming language.
A definition takes the general form:
field value
Where field is the name of a data field, and value is some value.
Values are of one of 5 types:
Number: A (possibly hexa-) decimal integer, possibly prepended by
a '-'. Hexadecimal numbers are on the normal C-style format (eg.
0x0f3). Hexadecimal digits may be in lower or upper case.
String: A string of characters enclosed in '"'s. Newlines may ap-
pear in the string.
Stringlist: Either a single string (see above), or a construction
like:
{ "Adolf Adolfson", "Adolf", "guard" }
NOTE: A stringlist is used to provide a unit with one or more
names by which the players can refer to it. Due to the way the
parser works, there are some important considerations to make
when writing a stringlist.
An obvious namelist for, say, a small dwarf would be:
names {"small", "small dwarf", "dwarf"}
However, if a player were to type:
hit small dwarf with bottle,
The parser would assume that "small" was the name of the dwarf,
and that "dwarf bottle" was the weapon to be used.
Thus, if one name can form a prefix for another in this style, it
should be placed AFTER that name, e.g.:
names {"small dwarf", "small", "dwarf"}
Note also that the name "small" is really a very questionable way
of referring to a small dwarf, and that maybe "small dwarf" and
"dwarf" should be left as the only alternatives.
Flags: Either a single number, or a list like:
{8, 16, 1, 128}
A list like the above has the effect of binary ORing each member
of the list together. Thus, the list above wouldhave the value
153.
Actually, one would rarely see lists like the above; macro
definitions are supplied for all of the commonly-used flag val-
ues. Thus, you might see:
uflags {UNIT_FL_NO_WEATHER, UNIT_FL_CAN_BURY}
in the definition for a room with a dirt floor.
the '{'...'}' pairs may be nested, to ease the creation of macros
with multi-flag values.
Symbol: Either a standard C-style identifier, denoting some unit
within the zone, or two identifiers, separated by a @ or a /, to
reference a unit in a different zone. The format is:
@
or:
/
The two versions are interchangeable, but it is probably wise to
stick to one format within a single zonefile in order to maintain
readability.
The usual care should be applied when choosing identifiers -
they should be easy to remember and eay to type - especially for
objects that're to be frequently loaded 'manually', eg. by immor-
tals within the game.
Below are descriptions for each of the sections.
ZONE section
The Zone-section defines the global parameters for the current
zone. It is usually wise to place this section in the top of the
file. The fields and their formats are as follows:
title This is the title of the zone, for example Town of
Midgaard, Thieves Guild, Forest of Haon Dor, or whatever. It is
currently only used when players request a list or available ar-
eas in the game. Leaving it undefined will keep it away from the
areas list.
lifespan
This defines the interval between resets for this zone, in min-
utes. Default is 60.
reset
This should be set to one of the macros RESET_NOT, RESET_IFEMPTY,
RESET_ANYHOW. Default is RESET_ANYHOW, which means that the zone
will be reset even if players are present within it.
creators
This should contain the MUD names of the creators of the zone.
Filling out this field will enable immortals to see who to con-
tact in case of zone problems. It also gives the possibility for
directing errors to you directly via mud-mail. Seen via the 'stat
zone' mud-command.
notes
This is a plain text description of the zone for other immortals.
Seen via the 'stat zone' mud-command. It is often a good idea to
include your e-mail address in the notes so that you can be
reached easily by the implementors.
If existing, this entry defines the name of the zone.
Default is the trailing component of the current filename, minus
the trailing ".zon".
ROOM section
This section defines the rooms in the zone. Each room consists of
a symbol, which is the identifier of the room; a number (possibly
zero) room fields, and a trailing 'end', to mark the end of the
room.
The fields are as follows:
movement
How hard it is to walk in and out of the room. The possible val-
ues are defined and described in values.h, and have SECT_ prefix-
es.
romflags
Special flags for this room (room/object/mobile-flags; hence the
name). The values are defined in values.h, and have the prefix
ROOM_FL_.
exit[] to , key , keyword ,
open , descr ;
At least one of the subfields must be defined, and they may ap-
pear in any order. The separating commas are optional, whereas
the trailing semicolon must be present.
The macros NORTH, SOUTH, EAST, WEST, UP, and DOWN denote the ex-
its. Further, the macros north, south, east, west, up, down (low-
ercase) are supplied. The macro north is defined to exit[NORTH],
etc. A valid exit definition is thus:
exit[NORTH] to temple@midgaard keyword "temple";
or:
north to temple@midgaard keyword "temple";
(note that the '{' and '}'s are not needed for the stringlist, if
it contains only a single string.)
The keywords can be used, for example, for the 'enter'-command in
the game (eg, "enter shop").
The description is seen by a player which tries to look in that
direction. If none is defined, he/she sees "You see nothing of
interest.", or some such string.
the to-field says which room the exit leads to (it may be in an-
other zone). If it is left undefined, the exit is 'blocked'.
The flags for the open-subfield are defined in values.h, and have
EX_ prefixes.
The key defines the key which can lock/unlock this door. If none
is defined, the door cannot be locked/unlocked.
UNIT-fields
In addition to the standard room-fields, each unit
(room/mobile/object) has a common set of fields. These are de-
scribed below:
names
The namelist of the unit. Default is a list consisting of a sin-
gle name, namely the identifier of the unit. See the discussion
about stringlists above.
Be aware of the proper use of capital letters. Any proper name
such as Mary, Adolf, Tiamat, Jafar, Hansen and John should be in
caps, whereas names like cityguard, guard, armourer, weaponsmith,
alchymist and mage should be in lowercase only. The reason should
be fairly obvious - if not mail me and I will add a lengthy ex-
planation. The "caps" consideration is exactly the same which
must be used in the "title" section (below).
For example:
names {"Adolf Adolfsson", "Adolf", "cityguard", "guard", "cap-
tain"}
title
For rooms : the string shown before the long description, eg.
"The Temple".
For objects: eg. "an apple", "a dagger", etc.
For mobiles: eg. "the dragon", "the dwarf", "Fido", etc.
Please be conscious of the capitalization of these strings:
Whereas the title of a room should often contain leading capital
letters, this is rarely the case for mobiles and objects. An ex-
ception is a monster like "Puff".
Default is the first name of the namelist.
descr
The long-description of the unit. Again, this is treated somewhat
differently for the various kinds of units.
For rooms: The description people see when they stand in the room
(unless they're in compact mode).
For mobiles: What people see of a mobile if it's in its default
position, Eg. "A big ugly troll looms before you.".
For objects: What people see when the object is lying in the
room.
extra Adds an extra-description to the
unit. An arbitrary number may exist in any unit. An empty
stringlist ('{}') matches the namelist of the current unit.
Hence, if you want to tag a description to the name(s) of a unit,
this is a good shorthand.
key
The object necessary to lock/unlock this unit. Eg:
key goldkey@midgaard
open
Some characteristics related to containers. The flags are the
same as for room-exits (the EX_ prefix macros).
manipulate
Flags describing the handling-characteristics of the unit. The
flags are defined in values.h, with MANIPULATE_ prefixes.
alignment
The alignment of a unit, -1000 is most evil, 0 is neutral, +1000
is most good. Any value in [-1000..-350] is considered evil. Any
value in [+350..+1000] is considered good. Values in between are
neutral. Default is 0.
minv
The level for which this unit is invisible. Default is zero.
flags
Flags describing the unit. The values have the prefix UNIT_FL_
(see values.h)
weight
The weight of the unit.
capacity
The carrying-capacity of the unit.
height
The height a monster in centimeters, the length of a rope, or the
size of a weapon, shield or armour (the latter have their size
specified as the size of the humanoid required to wield them).
One centimeter = 0.3937 inches, and 1 inch = 2.54 cm. 12 inches
is 30.48 cm, 12*6 inches = 72 inches = 182.88 cm
special text time bits
The number of a special routine to associate with this mobile.
An arbitrary number of special routines may be associated with a
mobile. The text-field is optional. If included, it sets the da-
ta-field associated with that function. Note that only some func-
tions use the data-field, and that others elect to set it them-
selves. An example of a special-routine that uses a text-string
stored in the data-field is SFUN_RANSAY, which, at random inter-
vals, feeds the text to the 'say'-command. The