<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<center>
<table border="1" bordercolor="gray" cellpadding="10" cellspacing="0" width="90%">
<tbody>
<tr>
<td colspan="2" align="left" bgcolor="#dfdfdf" width="100%">
<h1>
CoffeeMud 5.2 Game Builders Guide
</h1>
</td>
</tr>
<tr>
<td align="left" valign="top" width="20%">
<ul>
<li>Introduction</li>
<li><a href="#cmfs">CoffeeMud File System</a></li>
<li><a href="#ables">Abilities</a></li>
<li><a href="#classes">Classes</a></li>
<li><a href="#factions">Factions</a></li>
<li><a href="#quests">Quests</a></li>
<li><a href="#holidays">Holidays</a></li>
<li><a href="#socials">Socials</a></li>
<li><a href="#polls">Polls</a></li>
<li><a href="#clans">Clans</a></li>
<span style="text-decoration: underline;"><br>
</span>
</ul>
</td>
<td align="left" valign="top">
<p style="text-align: center;" align="left"><strong><img src="images/mug.jpg"></strong></p>
<strong style="color: rgb(255, 0, 0);"><font size="5">Introduction</font></strong><br>
<br>
The purpose of this document is to cover aspects of Archon game
creation that are not directly related to Area/Map creation, which is
already covered in detail in the <a href="ArchonGuide.html">Archons Guide.</a><br>
<br>
<p><a name="cmfs"><strong><font color="#008000" size="5"> The
CoffeeMud File System (CMFS)</font></strong></a> </p>
<p>This is a complicated topic, but one that all builders and Archons should
understand. Sooner or later, every CoffeeMud adminstrator
is going to want to modify some of the local files in the CoffeeMud
folder. This may include the quests, or skill lists, or hopefully
the intro.txt file located in resources/text directory! Builders
will also want to add files, including MOBPROG script files that run
in the Scriptable behavior, item and mob CMARE files for the RandomMobs
behavior or for other scripts, Quest scripts, and other things.
</p>
<p>Pretty soon, your directories are packed with stuff customized to your
mud. This can create issues for back-ups, meaning that not
only do you have to back-up your database (or your data directory)
but you have to backup all those files that have been modified and
added, since they play as integral a role in your world as the rooms
and areas do. All those files can also create upgrade issues, as
modified files can get accidently overwritten when a new version of CoffeeMud
is overlayed in your installation directory. Lastly, this can create
security issues, as the builders might accidently delete the wrong file,
or make a mistake, creating problems for the admins as they try to recover.</p>
<p>To help solve these problems, the CoffeeMud engine uses a kind of mirrored
file system called <strong>CMFS</strong> to store some files in
your local directory (your hard drive), some files in your database,
and some files in both at the same time. When the exact same
file in the exact same directory is found in BOTH the local file system
and in the database, the one in the database is always preferred.
That way, should the file in the database (called a <strong>VFS</strong> file)
become corrupted or deleted, the one in the local file system will
remain safe. Furthermore, since files in the database (VFS
files) are always accessed before the same file in the local file system,
you can overwrite the files in the local file system with upgrades without
worrying about losing your changed files. And lastly, CoffeeMud
provides a security system that allows you to grant access to users on a
folder level, and also to specify whether the user can access the local
file system, or only the database VFS files and folders.</p>
<p>The CMFS includes everything in your CoffeeMud installation directory/folder,
and all the other folders therein. In fact, CoffeeMud is
utterly unable to access any files OUTSIDE of your CoffeeMud installation
folder, giving the server administrator an added level of comfort.
The CMFS is also able to access the VFS files in the CoffeeMud database,
and to give them preference over identically named files in your local
file system.</p>
<p>CMFS employs the UNIX standard for separating directorys and folders.
This means that the forward slash / character is used when separating
one folder from another when naming a file. The CMFS path
<strong>/resources/text/intro.txt</strong> would, for example, refer
to the file called intro.txt inside the text directory, which is inside
the resources directory, which is in your CoffeeMud installation folder.</p>
<p>If that file had been previously copied into the same directory in the
VFS database, then the CMFS would prefer that version over the
one that remains in the local file system. You may modify the
file <strong>resources/text/intro.txt, </strong>update it, and save
it without needing to remember that you are really changing a file
in the database. CoffeeMud will always remember to prefer to
the one in the VFS to the one on your local hard drive, if it has been
copied or saved there. </p>
<p>If for some reason you absolutely need to ensure that ONLY the local
file system version of a file or ONLY the VFS version of a file
is referenced by CoffeeMud, you may do so by prepending a special
string to your file paths. The string is double-colon :: to
force access of a VFS file, and double-forward-slash // to force
access of a local file system file. For instance, if the Scriptable
prog resources/progs/myprog.script is located in both your local
and VFS file systems, then you can force Scriptable to use the VFS
version by using <strong>::resources/progs/myprog.script
</strong>as your path name. If you needed to force Scriptable
to load the local file system version of the file <strong>//resources/progs/myprog.script
</strong>would do the trick. Again, <strong>resources/progs/myprog.script
</strong>alone, without any special prepended file, will prefer
the VFS file, but will use the local file if a VFS file is unavailable.
This is the preferred behavior, so your Scriptable filenames should
employ the normal path naming standard except under very extraordinary
circumstances.</p>
<p>Files can be copied into the VFS from the local file system using the Archon
SHELL command. If you were to go into the coffeemud resources folder
using this command:</p>
<p><strong><font face="Courier New">shell cd /resources</font></strong></p>
<p>if you now view the directory</p>
<p><strong><font face="Courier New">shell dir</font></strong></p>
<p>you'll see all the files in your local filesystem in the resources folder
in your coffeemud installation directory. Now, you may copy
all of the files in this directory into the *same* directory in the
VFS database by entering:</p>
<p><strong><font face="Courier New">shell copy * ::/resources</font></strong></p>
<p>the copy command here is followed by a wild-card character, the asterisk,
to designate ALL files in the resources directory. The next
parameter is the destination folder. In this case, we specify
our destination as ::/resources, which would be the same directory,
but in the VFS system. Notice that we did not have to create
a VFS folder called /resources before we did this. The VFS always
has a mirror copy of all the local file system folders. However,
it requires you to use the SHELL COPY command to create a mirror of
the files themselves. Now, look at the directory again:</p>
<p><strong><font face="Courier New">shell dir /resources</font></strong></p>
<p>We displayed the directory this time using an absolute path name, just
to show you the syntax. You are still looking at the same
directory you saw when you entered <strong><font face="Courier New">shell dir</font></strong>. In fact, you can
enter that command again to prove it. You'll see that all of
the files have little "+" marks next to them. This means that
the files exist both in your local file system *AND* in the VFS.
Now suppose we did something silly, like delete our local file system
version of resources/socials.txt. This could be done with the following
command:</p>
<p><strong><font face="Courier New">shell delete //resources/socials.txt</font></strong></p>
<p>Notice that we used the double-slash // to designate that we want to delete
the LOCAL version. Had we not put those two slashes in front,
it would have preferred the VFS copy of socials.txt and deleted that
one instead. Now, look at the directory again:</p>
<p><strong><font face="Courier New">shell dir *</font></strong></p>
<p>This time we displayed the directory using an * wildcard, just to demonstrate
that we can use mask characters when displaying directories.
The command is doing the same thing the previous two <strong><font face="Courier New">shell dir</font></strong> commands did, just in a different
way. Now, you'll see that most of the files still have the
"+" sign in front, but now <strong>socials.txt</strong> only
has a "-" character. This means that the file exists only
in the VFS database, and not on our local hard drive. We
can copy it back to our local file system by doing: </p>
<p><strong><font face="Courier New">shell copy ::socials.txt //</font></strong></p>
<p>You'll see that I changed the syntax of the copy command around again to
demonstrate some of the previous lessons. We use the :: characters
in front of the filename socials.txt to specify that we want to
copy the VFS version of the file. Since the VFS version is
always preferred and accessed first, the copy command would have
worked just fine without the two :: characters in front. The
last parameter is just two slash marks. When no directory or
folder is specified, the default and current directory is used.
In this case, we only specified the two slash marks to denote the local
file system, and we did not specify a destination folder. This
means that the file socials.txt will be copied into the current folder,
on the local file system only.</p>
<p>There are numerous other shell commands you can make use of, such as <strong><font face="Courier New">makedirectory</font></strong> to create new folders,
<strong><font face="Courier New">edit</font></strong> to modify a text
file, <strong><font face="Courier New">findfile</font></strong> to hunt
down a file with a given name, or <strong><font face="Courier New">searchtext</font></strong>
to find a file containing a given text string. The shell command
is a useful tool for mirror your local files in your VFS database
for safety, convenience, and easy back-ups.</p>
<p>The last topic concerning the CMFS is about security. At the top
of this Guide, the subject of security codes was discussed.
Well, CMFS provides its own security codes to limit access to files
and folders in either the local file system, the VFS, or both.
</p>
<p>By default, a user is not allowed to access any files in either file system,
unless they are an Archon or have been given a CMFS security code.
The two security codes are <strong>FS: [ABSOLUTE_PATH]</strong>
and <strong>VFS: [ABSOLUTE_PATH]. </strong>In cmfs security
codes, the [absolute path] is a path name starting from inside your
coffeemud directory, with no path-separating slashes except
to separate directories or to designate that the last file is really a directory
by using a trailing forward slash. </p>
<p>For example, to give a user access ONLY to files in the VFS database folder
/resources/text/, you would give the user security code <strong>VFS:
RESOURCES/TEXT/ </strong>The user would then have permission to view
or delete any of the VFS database versions of files that have been
copied into that directory from the local file system. The user
would also have permission to create new files or create new directories
in the VFS inside that folder. Directories and files created by
such a user, who only has a VFS security code, would not create ANY
files in your local file system. All files would reside only in
the VFS database. This user would not even be able to copy existing
local file system files into the VFS to modify, since he does not have
access. </p>
<p>To give the same user access to BOTH the local file system and VFS versions
of the resources/text directory, the security code would need to
changed to <strong>FS: RESOURCES/TEXT/ </strong>Using FS instead
of VFS gives the user access to both local and database versions of
those files. </p>
Of course, by default, an Archon has access to both versions of the entire
coffeemud installation folder. It would be as if the Archon
had the security code <strong>FS:</strong> With no directory specified,
the Archon has local file system (and implied VFS) access to
the root directory and everything underneath it. For that reason,
when limiting access to the file system, it is best to use the VFS:
security code, and to always designate a limited directory path in which
your adminitrative user may play (upload their files, save their scripts,
etc).
<p style="text-align: center;" align="left"><strong></strong></p>
<strong><font color="blue" size="5"><a name="ables">Abilities (Skills/Spells/Chants/etc..)</a></font></strong>
<p>In the lexicon of the Archons, the word "Ability" encompasses a
great many powers and skills, both natural and man-made. An
ability may behave as an Affect, as a Skill, or as Both. </p>
<p>An ability behaving as an Affect means that it is acting as a
discrete aspect of some existing thing, whether that thing is a room,
an exit, an item, or a mob. Such aspects may include the property
of great strength, great damaging ability, immunity to certain
affects, or simply the garbling of normal speech. An ability
taking on this role is both passive and reactionary; passive when it is
embueing its host with great strength or damage, and reactionary when
it is providing immunity or garbling speech. </p>
<p>An ability that is behaving as a Skill means that it allows its host
(which is always a MOB in this case) to interact with the world around
it, to change it, derive information from it, or beslow Affects upon
it. Such interactions can include kicking, making sick,
poisoning, identifying, catching on fire, and many other things.
An ability taking on this role is entirely active, though once
the active interaction ends, that same Ability may either end (as a
kick), leave itself behind on its target to remain as an Affect as
described above (as catching on fire would).</p>
<p>CoffeeMud contains over a thousand different java-coded Abilities
which fall into numerous other categories and genera of various
descriptions. The most important of those categories, however,
are their Ability Type. CoffeeMud has numerous different ability
types, which include Properties (which always act only as Affects), or
Skills, Spells, Prayers, Chants, Diseases, Poisons, etc. (all of which
can act purely as Skills, act purely as an Affects, or act as Both
depending on the context in which it is used). Whenever you place
the name of an ability in the Affects list of a mob, item, room, or
exit, you are telling CoffeeMud to use only the Affect/property aspect
of that skill. When you place the same ability name in the same
mob's Abilities list, you are telling CoffeeMud to reserve the ability
for use as a Skill. For example, when you add
Spell_GiantStrength to a GenMob's affects list, you are saying that
this mob is permanently stronger than normal, but when you place it on
the GenMob's abilities list, you are saying that you want the mob to be
able to invoke the skill at a later date (by casting the spell).</p>
<p>CoffeeMud also allows you to define abilities outside of the
java-realm. This can be done from the command line using the
CREATE command. If you want to create a new skill called Poke,
for instance, you might enter:</p>
<p><strong>CREATE ABILITY Skill_Poke</strong></p>
<p>And it would be done. The "Skill_Poke" is the abilities
Ability ID. The fact that it starts with "Skill_" is merely for
descriptive purposes, and is not required. Generally speaking, it
is a good idea to give your abilities Ability ID's that start with the
general kind of ability it is, for instance "Spell_", "Chant_",
"Prayer_", etc.</p>
<p>Whenever creating or modifying a new ability,
the Archon is presented with a menu of selections and options available
to customize the class. Here is a description of those options:</p>
<table style="width: 100%;" bgcolor="yellow" border="1" cellpadding="1" cellspacing="1" width="100%">
<tbody>
<tr>
<td width="25%"><strong>Property</strong></td>
<td width="75%"><strong>Description</strong></td>
</tr>
<tr>
<td><em>Skill Name</em></td>
<td>the name of the ability. Make this anything you like, but uniqueness is important for making help file entries.</td>
</tr>
<tr>
<td><em>Type, Domain</em></td>
<td>the skill type and domain (if
any). Enter the type, a comma, and a domain (or nothing).
Enter ? to get a list of skill and domain types.</td>
</tr>
<tr>
<td><em>Command Words</em></td>
<td>the command invocation word.
This need not be unique to your skill! For instance, use CAST for
spells, and the command word will automatically require the skills name
to be included for invocation. Use commas to seperate different
invocation words. This can be blank for Properties.</td>
</tr>
<tr>
<td><em>Minimum Range</em></td>
<td>for combat/targeted skills,
how far away the invoker must be to use the skill. Use ? to
get a list of possible values.</td>
</tr>
<tr>
<td><em>Maximum Range</em></td>
<td>
<p>for combat/targeted skills, how close the invoker must be to
use the skill. Use ? to get a list of possible values. </p>
</td>
</tr>
<tr>
<td><em>Affect String</em></td>
<td>what is displayed in the Affects
list when players and mobs are affected by this ability. Enter
nothing, or NULL to show nothing at all.</td>
</tr>
<tr>
<td><em>Is Auto-invoking</em></td>
<td>whether this skill is
automatically applied to a player as an affect when they learn the
skill. If true, the ability will show no casting message, and
proceed directly to affecthood.</td>
</tr>
<tr>
<td><em>Skill Flags</em></td>
<td>0 or more comma-delimeted flags that describe the affects of your skill to the rest of the mud engine. Use ? to get a list.</td>
</tr>
<tr>
<td><em>Override cost</em></td>
<td>designate the cost of using this
skill in mana/movement/etc. A value of -1 means to use the
default system as defined in your coffeemud.ini file. A value of
0 means its free. A value from 0-99999 means to always use
that amount. A value of 2147483647 means to always use all
of the mobs mana/move points. A value of 2147483647-100 to
2147483647 means to use that percentage of the mobs mana/move points.</td>
</tr>
<tr>
<td><em>Cost Type</em></td>
<td>one or more flags designating the
type of mob resource used to invoke the skills, whether it be move,
mana, hit points, or some combination. Enter ? for a list.</td>
</tr>
<tr>
<td><em>Can Affect</em></td>
<td>the types of objects which, when
invoked, this skill will remain on as an affect. The list is
comma-delimited. Make sure this is a subset of the Can Target
list! Enter ? for a list.</td>
</tr>
<tr>
<td><em>Can Target</em></td>
<td>the types of object which, when
invoked, this skill will target. If the value is 0, it will
target only the invoker. Enter ? for a list.</td>
</tr>
<tr>
<td><em>Quality Code</em></td>
<td>whether this skill is malicious
(hurts the target), beneficial to self or others (always gives a combat
benefit), ok to self or others (sometimes gives a combat benefit under
certain circumstances), or indifferent (usually for role-playing
skils). Enter ? for a list.</td>
</tr>
<tr>
<td><em>Affect Adjustments</em></td>
<td>For skills that affect their
targets (see Can Affect), this is the list of affects and their values.
It is modelled on the same syntax and format of the property
Prop_HereAdjuster, so enter HELP Prop_HereAdjuster for information on
the syntax for this field. Entering ? will show you that help.</td>
</tr>
<tr>
<td><em>Caster Mask</em></td>
<td>a mask to determine if the invoker
is allowed, under the circumstances, to use this skill. Enter ? or help
on Prop_HaveZapper for more information on the syntax for CoffeeMud
"Zapper" masks.</td>
</tr>
<tr>
<td><em>Scriptable Parm</em></td>
<td>a Scriptable-behavior parameter
denoting the script that is active during invocation of this skill and
during its tenure as an affect. See the Scriptable Guide for
detailed information on how to use mobprog scripts. Enter ? for
some short help on acceptable parameters here. *special note:
during successful invocation of this ability, a special trigger event
will occur that can be handled by an IMASK_PROG p <ability id>.
Such a script trigger would, for example, be the appropriate
place to put damage commands for skills that do damage.</td>
</tr>
<tr>
<td><em>Target Mask</em></td>
<td>a mask to determine if the target is allowed, under the circumstances,
to be targeted by this skill. Enter ? or help on Prop_HaveZapper for more
information on the syntax for CoffeeMud "Zapper" masks.</td>
</tr>
<tr>
<td><em>Fizzle Message</em></td>
<td>the message shown when the mob or
player fails their profficiency check for this skill. Use
<S-NAME> as a substitute for the invoker, and <T-NAME> as a
substitute for the name of the target.</td>
</tr>
<tr>
<td><em>Auto-Cast Message</em></td>
<td>the message shown when the skill
is invoked from a wand, scroll or other automatic means. Use
<S-NAME> as a substitute for the invoker,
and <T-NAME> as a substitute for the name of the target.</td>
</tr>
<tr>
<td><em>Normal-Cast Message</em></td>
<td>the message shown when the skill successfully invoked. Use <S-NAME> as a substitute for the
invoker,
and <T-NAME> as a substitute for the name of the target.</td>
</tr>
<tr>
<td><em>Post-Cast Message</em></td>
<td>the message shown after the skill
is invoked, if the target did not make a saving throw against it.
Use <S-NAME> as a substitute for the
invoker,
and <T-NAME> as a substitute for the name of the target.</td>
</tr>
<tr>
<td><em>Attack-Type</em></td>
<td>an optional field for malicious
skills. this is the secondary type of attack being made,
where the primary attack type is determined by the skill type (magic
for spells, chants, prayers, etc). for instance, for a
flame-shooting spell, FIRE would be an appropriate value. Use ?
for a list.</td>
</tr>
</tbody>
</table>
<p>As you can tell if you read through the above, most of the meat of the work done by Generic Abilities is </p>
<p style="text-align: center;" align="left"></p>
<strong><font color="blue" size="5"><a name="classes">Character Classes</a></font></strong>
<p>A character class is a designation chosen by players that
limits the scope of skills and abilities they will have available to
them as they advance in level. </p>
<p>CoffeeMud supports several different class-systems through its
coffeemud.ini file (the CLASSSYSTEM entry). One such option is the
Single-class system, whereby the player can select a single class to
play throughout their characters gaming career. Another is the
Sub-classing system, whereby the player selects a parent-class to play,
but may add/change to any of that parent classes sub-classes to gain a
different selection of skills as they go forward in levels. A
third is the multi-classing system, whereby the player can select an
initial class, but may add/change to any other class to gain a
different selection of skills as they go forward in levels. The
last option is to disable the class system altogether, which
essentially only means that the player is not allowed to choose which
class they play, but are secretly forced into a single class that
determines their skill selection. See your coffeemud.ini file for
more information on this feature.</p>
<p>CoffeeMud includes numerous character classes by default that
give players access to the hundreds of skills in the CoffeeMud
codebase. However, they doesn't mean there isn't room for change,
improvement, or addition. </p>
<p>Customized player or mob classes can be used as skill templates for mobs created using the
Fighterness (or similar) behaviors, or as genuine player classes
for your game. Either way, here is how it is done:</p>
<p><strong>CREATE CLASS Boxer</strong></p>
<p>And it would be done. The name Boxer is just an example.
You can enter any non-space string to serve as an official ID for
your character class. You can even specify the name of an
existing code-base class, such as Fighter or Mage. If you specify
your own name, you are creating a new class from scratch. If you
specify an existing class name, you are essentially "over-riding" that
standard class. This can be a quick and easy way to disable
existing standard classes, since you can create a generic character
class called Fighter, for instance, then set it so that players can not
select it, which effectively disables that character class.</p>
<p>After a character class is created using the CREATE CLASS
command, it can be deleted or modified later using the DESTROY CLASS or
MODIFY CLASS commands.</p>
<p>Whenever creating or modifying a new class,
the Archon is presented with a menu of selections and options available
to customize the class. Here is a description of those options:</p>
<p></p>
<table style="width: 100%;" bgcolor="yellow" border="1" cellpadding="1" cellspacing="1" width="100%">
<tbody>
<tr>
<td width="25%"><strong>Property</strong></td>
<td width="75%"><strong>Description</strong></td>
</tr>
<tr>
<td><em>Number of Names</em></td>
<td>the number of displayable names this class
has. Normally just 1.</td>
</tr>
<tr>
<td><em>Name #x</em></td>
<td>a displayable name of the class. Each
displayable name applies based on a class level.</td>
</tr>
<tr>
<td><em>Name #x Class Level</em></td>
<td>a class level at which this displayable
name begins to apply.</td>
</tr>
<tr>
<td><em>Base Class</em></td>
<td>the base class category into
which the class fits. Usually this is the same as the ID you
specified when doing CREATE CLASS. However, if you are
using a subclass system
and you want this class to belong to a set of subclasses under a base
class, and this particular class is NOT the base class, then this
field should be set to the class ID of the base class it falls under.</td>
</tr>
<tr>
<td><em>Availability</em></td>
<td>
<p> whether or not players may access this class at creation, in spells,
or never. </p>
</td>
</tr>
<tr>
<td><em>HP Divisor</em></td>
<td>amount by which the players constitution
is divided by when calculated hit point gains per level.</td>
</tr>
<tr>
<td><em>HP Dice</em></td>
<td>number of dice rolls which the player gets
per level for bonus hit points. If this class rolls 2d6 for hit points, this would be the "2" part.</td>
</tr>
<tr>
<td><em>HP Die</em></td>
<td>the maximum roll on each die roll made per
level for hit points. If this class rolls 2d6 for hit points, this would be the "6" part.</td>
</tr>
<tr>
<td><em>Mana Divisor</em></td>
<td>amount by which the players intelligence
is divided by when calculated mana gains per level.</td>
</tr>
<tr>
<td><em>Mana Dice</em></td>
<td>number of dice rolls which the player gets
per level for bonus mana. If this class rolls 2d6 for mana, this would be the "2" part.</td>
</tr>
<tr>
<td><em>Mana Die</em></td>
<td>the maximum roll on each die roll made per
level for mana. If this class rolls 2d6 for mana, this would be the "6" part.</td>
</tr>
<tr>
<td><em>Practices/Level</em></td>
<td>the number of practice points gained by
this class per level.</td>
</tr>
<tr>
<td><em>Attack/Level</em></td>
<td>the number of attack points, modified by
a formula based on the mobs attack attribute, gained per level.</td>
</tr>
<tr>
<td><em>Attack Attribute</em></td>
<td>the primary attribute used with the above
to determine the number of attack points gained per level.</td>
</tr>
<tr>
<td><em>Practices/1st Level</em></td>
<td>the number of practice points received by
this class at first level.</td>
</tr>
<tr>
<td><em>Trains/1st Level</em></td>
<td>the number of training sessions received
by this class at first level.</td>
</tr>
<tr>
<td><em>Level/Dmg Pt</em></td>
<td>the number of levels between gains of 1
point of base damage.</td>
</tr>
<tr>
<td><em>Movement/Level</em></td>
<td>the number of movement points, modified
by a formula based on the mobs strength, gained per level.</td>
</tr>
<tr>
<td><em>Armor Restr.</em></td>
<td>the type of armor restrictions for using
skills in this class, if any.</td>
</tr>
<tr>
<td><span style="font-style: italic;">Armor Restr Spells</span></td>
<td>normally, armor restrictions apply when any class skill
is used. If this field is true, however, armor restrictions apply
only when a class spell/chant/prayer is cast.</td>
</tr>
<tr>
<td><em>Limitations</em></td>
<td>This is an open text field. Mention any
special limitations of the class.</td>
</tr>
<tr>
<td><em>Bonuses</em></td>
<td>This is an open text field. Mention any
special bonuses to being this class.</td>
</tr>
<tr>
<td><em>Qualifications</em></td>
<td>This is a mask to determine which players
qualify for it. List any racial, or stat requirements to becomming
this class. Use ? for more information on the mask.</td>
</tr>
<tr>
<td><em>EStat Adjustments</em></td>
<td>adjustments, positive or negative, to attack,
defence, and other stats. Use ? for a list.</td>
</tr>
<tr>
<td><em>CharStat Adjustments</em></td>
<td>adjustments, positive or negative, to strength,
saving throws, and other stats. Use ? for a list.</td>
</tr>
<tr>
<td><em>CharStat Settings</em></td>
<td>hard settings for strength, saving throws,
and other stats. Use ? for a list.</td>
</tr>
<tr>
<td><em>CharState Adjustments</em></td>
<td>adjustments, positive or negative, to hit
points, mana, and other stats. Use ? for a list.</td>
</tr>
<tr>
<td><em>Starting CharState Adjustments</em></td>
<td>adjustments, positive or negative, to the
default hit points, mana, and other stats for starting players of
this class.</td>
</tr>
<tr>
<td><em>Extra Class Flags</em></td>
<td>Whether race, level, or the gaining/losing
of experience applies to this class. By default, they do.</td>
</tr>
<tr>
<td><em>Weapon Restr.</em></td>
<td>This is a list of the weapon classes which
players of this class will fumble using.</td>
</tr>
<tr>
<td><span style="font-style: italic;">Weapon Mat. Req.</span></td>
<td>A list of the raw materials out of which a players weapon must be made in order to avoid fumbling.</td>
</tr>
<tr>
<td><em>Outfit</em></td>
<td>This is a list of any equipment outfitted
to players who join this class.</td>
</tr>
<tr>
<td><em>Class Abilities</em></td>
<td>a list of abilities available to those who
become this class. the proficiency given is the default proficiency
which players/mobs of this class start out with. Also listed
here is the class level at which the skill becomes available,
whether it is automatically gained (true), or merely qualified
for (false), whether it is a secret skill or not, and any miscellaneous
parameters for this skill.</td>
</tr>
<tr>
<td><em>Number of Security Code Sets</em></td>
<td>If this class is intended to administrators
or builders, you may specify one or more sets of security codes
or security groups (see above section on CoffeeMud Security).
Each set begins to apply at a given class level for that set.
All previous sets at lower levels continue to apply as
well.</td>
</tr>
<tr>
<td><em>Security Codes in Set#x</em></td>
<td>The space-delimited list of security codes
or groups which applies to this set.</td>
</tr>
<tr>
<td><em>Class Level for Set#x</em></td>
<td>The class level at which this set of
security codes or groups begins to apply, in addition to any
previous sets.</td>
</tr>
<tr>
<td>Stat-Modifying Class</td>
<td>the name of a standard character class which will be
used for special stat adjustments from java code, such as a thiefs
level-based defence bonus, or druids mana bonus at their monument.
If you are creating a generic char. class on top of an existing
standard one, you will need to use the fully qualified class name of
the form:
com.planet_ink.coffee_mud.CharClasses.<charclassname> in
order to access the standard version.</td>
</tr>
<tr>
<td>Special-Event Class</td>
<td>the name of a standard character class which will be
used for special
event processing from java code, such as a clerics alignement
restrictions when praying, or an Artisan's expertience gains while
crafting.. If you are creating a
generic char. class on top of an existing standard one, you will need
to use the fully qualified class name of the form:
com.planet_ink.coffee_mud.CharClasses.<charclassname> in
order to
access the standard version.</td>
</tr>
</tbody>
</table>
<p></p>
<p><strong><font color="blue" size="5"><a name="factions">Factions</a></font></strong></p>
<p>A faction can be viewed very simply as a glorified tattoo with
a number value. Normal Tattoos are simply flags which a mob or
player
can have: either you do or do not have the tattoo. A Faction is a
kind of flag a mob or player
can have that has a special a numeric value assigned to
it.
Another way to view a faction is as a relationship between a mob or
player and some idea, such as Goodness, Evilness, Orc Affinity,
Reputation,
or some other idea. For example, in CoffeeMud, a mob or players
Alignment is implemented as a Faction. The Alignment can be
thought
of as having a tattoo called alignment along with a numeric value
assigned to it. Alignment can also be thought of as the
relationship
between the mob or player, and evilness, goodness, or neutrality.</p>
<p>The faction system in CoffeeMud is a powerful engine for defining what
factions exist, how the factions are assigned, how the value of
factions rise or fall in value, how value changes are reflected
in other factions, and what impact the value of a faction has on
experience gain, ability usage, and ability skill gain. Since
the values of factions are available for use in Properties
such as Prop_WearZapper, Prop_ReqEntry, and all other features which
respect Zapper Masks, factions can also potentially impact which items
can be used, which rooms can be entered, the price of goods, the availability
of Deities, and many other things as well. As an example, the
alignment faction typically impacts all of the things mentioned
above and more.</p>
<p>Now, as was said before, factions have numeric values. These values
can be positive, like 2389473, negative, or even 0. The range
of values which are valid for a given faction are defined by the
limits of the divisions or Ranges of a faction. </p>
<p>A <strong>Range</strong> is a numeric division of a faction you have defined.
A Range has a displayable name, a special code name for use in Zapper Masks,
and of course a low and high value. A Range can also be tied back
to CoffeeMud's built in "virtue meter", which allows you to define a Range
as always granting the mob or player whose faction value falls into that
range goodness, evilness, or neutrality. The lowest value of the lowest
Range, and the highest value of the highest Range define the overall limits
of the values of the faction itself. No player or mob may have a value
for a faction which falls outside those highest and lowest values of the
highest and lowest Ranges. For this reason, ranges are the most
important part of a faction.</p>
<p>Another important aspect are the range <strong>Change Triggers</strong>.
One of the ways factions differ from simple tattoos is that CoffeeMud
can manage the rise and fall in the values of the faction on a given
mob or player automatically. The way these changes are triggered
and managed is first through Change Triggers, which are applied when
both the source and target of an action have standing or value in the
faction, and when the source and target are different creatures.
Each Change Trigger defines 1) What triggers the change (the Trigger),
2) Whether value is gained or lost in the faction when the trigger occurs
(the Direction), 3) What percentage of the amount of change (after all
other modifiers) is applied to the value (the Amount Factor), 4)
several miscellanous flags to define the circumstances under which the
trigger is applied (the Flags), and 5) a Zapper mask to determine what
criteria the target of the Trigger must meet for this trigger to apply.
The valid Triggers include: Murder, Time (a change occurs every 40 seconds
or so), a type of skill being used, the domain of a spell being cast, a
flag associated with a skill being used, or Add Outsider, which allows
the faction to be added to those who do not have the faction, so long as
they meet the other requirements. Valid Directions of change include:
Up, Down, Opposite (opposite direction of the value of the creature killed
and proportional in value to the distance between the faction value in
the source and the target), Minimum (automatically gains minimum value),
Maximum (automatically gains maximum value), Add (gains the faction if
they don't have it -- useful with the Add Outsider trigger), Away (gain
if monsters value for this faction is lower, lose if higher), and Towards
(gain if monsters value for this faction is higher, lose if lower).
Valid Flags include: OUTSIDER, which allows the trigger to apply even if
the target of the trigger (not the source) does not have standing in this
faction, SELFOK, which allows the trigger to apply even when the source
or target are the same person, and JUST100, which overrides the normal
modifications of a change (based on experience or other factors) and uses
100 points as a base amount for the change from this trigger.</p>
<p>Now, lets discuss how to list existing factions:</p>
<p><strong>LIST FACTIONS</strong></p>
<p>The list that is shown with this command reflects the list of those factions
which have been loaded into CoffeeMuds memory. Factions are
loaded into memory when their identifiers/filenames are added to
the FACTIONS entry in your "coffeemud.ini" file. Factions may
also be loaded if a mob or player is loaded who has a faction which
has already been defined. Creating new factions, as you can now
guess, is a two part step. One step is to add its identifier/filename
to the FACTIONS entry of your "coffeemud.ini" file, after the file has
been created. To create the new faction identifier/filename, you must
do the following:</p>
<p><strong>CREATE FACTION orc_affinity.ini</strong></p>
<p>This command will create a new file in your CoffeeMud/resources directory
or folder for the new faction. This file will contain the default
setting for your brand new faction, whose ID (identifier) will be ORC_AFFINITY.CMVars.
You will now be automatically taken into the Faction Editor. If you
had wanted simply to modify an existing faction, you might have entered:</p>
<p><strong>MODIFY FACTION resources/reputation.ini</strong></p>
<p>The modify command will take you into the editor for an existing faction,
regardless of whether it appears on the LIST FACTIONS list, so
long as the filename/identifier given refers to an existing faction
file. The Faction editor contains numerous other complex
and interesting fields to change, which we will now describe.</p>
<p>
<table style="width: 100%;" bgcolor="yellow" border="1" cellpadding="1" cellspacing="1" width="100%">
<tbody>
<tr>
<td width="25%"><strong>Property</strong></td>
<td width="75%"><strong>Description</strong></td>
</tr>
<tr>
<td><em>Name</em></td>
<td>the displayable name of the faction, not
to be confused with its official identifier, which you may not change.</td>
</tr>
<tr>
<td><em>Division/Ranges List</em></td>
<td>the defined ranges for this faction.
See the above discussion on ranges for the meaning of the fields.</td>
</tr>
<tr>
<td><em>Show In Score</em></td>
<td>whether this faction is listed with the
players information when they use the SCORE command. The FACTIONS
command is always available for a player to list their factions
and values regardless of whether this setting is true or false.</td>
</tr>
<tr>
<td><em>Show In MOB Editor</em></td>
<td>whether this faction gets its very own entry
in the command-line mob editor, or the MUDGrinder mob editor.
The Factions field is always listed in the mob editor for changing
the factions and their values on players and mobs regardless of
whether this setting is true or false.</td>
</tr>
<tr>
<td><em>Automatic assigned values</em></td>
<td>optional field showing which mobs or players
will automatically be given this faction and some value in it.
This is a semicolon-delimited list, where each entry begins
with the value to assign, and is followed by a mask to determine
who the value gets assigned to. For example: "100 -race
+elf ; 500 -race +dwarf" would mean that all elf players and
mobs receive this faction with a value of 100, and all dwarf players
and mobs receive this faction with a value of 500. If this
field is empty, noone is assigned a value automatically. If
this field only contains a number, or if any entry contains only a
number (no mask), then everyone will receive this faction.</td>
</tr>
<tr>
<td><em>Other default values</em></td>
<td>required field defining the values that
mobs or players will be assigned whenever this faction is granted
to them by scripts, triggers, or by some other means.
The syntax of this field is similar to the "Automatic
assigned values" field above. At least one entry, however,
must be without a mask, so as to make sure that a default value
exists for every possible player or mob.</td>
</tr>
<tr>
<td><em>New player value choice</em></td>
<td>an optional list of values, semicolon delimited,
which players will get to choose from when they create their
characters for the first time. Each value in this list should
correspond to, or fall into, a different Division/Range
listed above. If this field is empty, players will not
be given this faction at creation time.</td>
</tr>
<tr>
<td><em>Choices introduction text</em></td>
<td>if the previous field contained entries,
then this field will become available. It is the optional filename
of a text file in your Coffeemud/resources directory or folder
which describes the choices available to the player.</td>
</tr>
<tr>
<td><em>Rate Modifier</em></td>
<td>normally 100%, this field is a fudge factor
for all instances where some value is gained or lost in this faction.
Typically gained values can be halfed, doubled, or changed in
any other way by modifying this value.</td>
</tr>
<tr>
<td><em>Affect on Experience</em></td>
<td>whether and/or how values in this faction
affect the amount of experience gained by players for killing
monsters. If the value is None, then this faction
does not affect experience gained by players for killing monsters.
Otherwise, the amount of faction gained or lost is a function
of the base number of experience points earned, and modified
by the value of this field: Extreme means the amount gained or lost
is always towards one extreme end of this factions Ranges, and always
in a direction away from the value that the monster had.
Higher means the amount is always gained. Lower means the
amount is always lost. Followhigher means the amount is
always gained, and in proportion to how high the value of the monsters
faction is. Followlower means the amount is always lost,
and in proportion to how low the value of the monsters faction
is.</td>
</tr>
<tr>
<td><em>Faction Change Adjustments</em></td>
<td>like the Rate Modifier above, this field
affects the values of gains and losses in this faction. It allows
you to change the value of Gains or Losses based on whether the
player or mob with the faction matches the given Zapper Mask.
Both the Gain and Loss values should be positive, as they reflect
a percentage change in the gain, and a percentage change in
the loss only.</td>
</tr>
<tr>
<td><em>Cross-Faction Relations</em></td>
<td>defines whether and/or how the value of
other factions may rise or fall when the value of this faction changes.
Each entry is the name of second faction, along with a positive
or negative percentage of the value gained or lost in this faction,
which will then be applied to the second faction.</td>
</tr>
<tr>
<td><em>Change Triggers</em></td>
<td>the events which cause the value of a faction
on a player to rise and fall. Usually triggers are applied
when an action is performed on a target creature by a source
creature, both of whom have standing in the faction. See
the description above for more information on the fields defined
for each Change Trigger.</td>
</tr>
<tr>
<td><em>Ability Allowances</em></td>
<td>this defines the circumstances under which
a player may always use a particular time of skill, spell, or
whatever, unimpeded and with full privileges. Each entry
contains a list of flags to determine which skills, spells, chants,
etc are being selected along with the range into which a players
value in this faction must fall for the ability to be used unimpeded
and with full privileges. Requirements defined by Ability
Allowances will typically determine whether proficiency is
every gained in a skill, and whether certain class restrictions
are overridden.</td>
</tr>
</tbody>
</table>
</p>
<br>
<p align="left"><span class="453251818-08032003"><span class="453251818-08032003"><span class="453251818-08032003"><span class="453251818-08032003"><span class="453251818-08032003"><span class="453251818-08032003"><span class="453251818-08032003"><span class="453251818-08032003"><span class="453251818-08032003"></span></span></span></span></span></span></span></span></span><strong><font color="green" size="5"><a name="quests">Quests</a></font></strong></p>
<p>Quests are tasks which can be completed by players for prizes, typically
quest points, experience, money, or all three. Quest tasks,
the monitoring of their completion and status, as well as their availability,
can all be automated by CoffeeMud.</p>
<p>The built-in Quest system in CoffeeMud allows you to automatic all of
the following processes: </p>
<ul>
<li>scheduling of quests by a variety of means, and managing a quest
"duration"</li>
<li>setting special quest-start criteria based on the players currently
online</li>
<li>the selection of random mobs, items, rooms, and areas from the
map by various criteria</li>
<li>the introduction of new mobs and/or items from saved text files,
and thier automatic removal when the quest is done</li>
<li>adding various skills, affects, behaviors to any of the aforementioned
objects and their automatic removal when the quest is done</li>
<li>adding scripts to any of the aforementioned objects and having
those scripts removed when the quest is done</li>
<li>special variables and designation for making your own logic problem
quests (mysteries)</li>
</ul>
<p>A quest is designated by a long set of definitions and pseudo-commands
called a <span style="color: rgb(204, 0, 0);">QUEST-SCRIPT</span>. The
quests are created by an Archon using the <strong>CREATE QUEST</strong>
[SCRIPT] command from the command line. Where [SCRIPT] is a either a complete
quest script, where each command line is terminated by a semicolon (;),
or a load command of the form LOAD=[SCRIPT PATH]. If you enter a complete
quest script, make sure that any embedded semicolons are escaped like "\;".
An example of a create script using a load command (the more common
case) is as follows:</p>
<p><strong>CREATE QUEST</strong> LOAD=quests/murdermystery/murdermystery.quest</p>
<p>All LOAD commands use the resources directory inside your coffeemud
install directory as the default path. Therefore, if you installed
coffeemud in C:\CoffeeMud, the above LOAD command will look for the
file in C:\CoffeeMud\resources\quests\murdermystery\murdermystery.quest.</p>
<p>Quests may be started automatically (autoquests) from inside the
quest script by including the SET WAIT and SET INTERVAL commands,
or they may be started manually by using the <strong>MODIFY
QUEST</strong> [QUEST NAME] command. </p>
<p>Quests can be listed, to see their status, using the <strong>LIST QUESTS</strong>
command. </p>
<p>Quests can be removed from the list using the <strong>DESTROY QUEST</strong>
[QUEST NAME] command.</p>
<p>Quests can be saved using the <strong>SAVE QUESTS</strong> command. Quests
saved this way will be restored during the next CoffeeMud reboot. Any
time the CREATE QUEST command is used, you will need to follow it with a
SAVE QUESTS if you want your quest to remain. </p>
<p><font style="background-color: aquamarine;" color="#4169e1" size="4"><strong>Quest
Scripts</strong></font></p>
<p>When creating a new quest using the <strong>CREATE QUEST</strong> [SCRIPT]
command, whether you use the load command to specify an external
script, or include the script directly into the create command,
the quest script commands are as follows:</p>
<p><span style="color: rgb(51, 102, 102);">SET NAME</span> <span style="color: rgb(102, 51, 102);">[QUEST NAME] </span>- the *unique* name
of your quest. This is a required command! </p>
<p><span style="color: rgb(51, 102, 102);">SET DURATION</span> <span style="color: rgb(102, 51, 102);">[#TICKS]</span> - # of ticks (4 second periods)
the quest will last once started. This is a required command! </p>
<p style="color: rgb(51, 0, 0);"><span style="color: rgb(51, 102, 102);">SET
WAIT</span><span style="color: rgb(102, 51, 102);"> [#TICKS]</span> - minimum
# ticks to wait between auto-starts of the quest. Required for auto-quests
only!</p>
<p style="color: rgb(51, 0, 0);"><span style="color: rgb(51, 102, 102);">SET SPAWNABLE <span style="color: rgb(102, 51, 102);">[TRUE/ALL]</span></span>
- whether this quest will, when started, spawn a copy of itself and run
the copy instead. This allows the same quest to run more than
once at the same time, though it will share its name as well as its
list of winners. If
the ALL flag is given, the quest manager will attempt to spawn off
every single STEP of the quest all at once. This can create chaos
unless STEP BREAK is used instead of STEP. See information on the
STEP and SET PRESERVE commands below.</p>
<p style="color: rgb(51, 0, 0);"><span style="color: rgb(51, 102, 102);">SET
DATE</span> <span style="color: rgb(102, 51, 102);">[#DAY]-[#MONTH] </span>-
The real-life start-date of the quest. This is a valid substitute for the
SET WAIT requirement.</p>
<p style="color: rgb(51, 0, 0);"><span style="color: rgb(51, 102, 102);">SET
MUDDAY</span> <span style="color: rgb(102, 51, 102);">[#DAY]-[#MONTH]</span>
- The start mud-date of the quest, according to the default global
mud calendar. This is a valid substitute for the SET WAIT requirement.</p>
<p><span style="color: rgb(51, 102, 102);">SET INTERVAL</span><span style="color: rgb(102, 51, 102);"> [#TICKS]</span> - random # ticks (1-#TICKS)
to wait between auto-starting the quest, AFTER the WAIT period
(see above) is over. Required for auto-quests! </p>
<p><span style="color: rgb(51, 102, 102);">SET MINPLAYERS</span><span style="color: rgb(102, 51, 102);"> [#PLAYERS]</span> - Minimum number of players
who must be online for a timed quest to automatically start. See
SET PLAYERMASK.</p>
<p><span style="color: rgb(51, 102, 102);">SET PLAYERMASK</span> <span style="color: rgb(102, 51, 102);">[MASKSTRING]</span> - If this string is
empty or not specified, then anyone is considered a player for the
purposes of the MINPLAYERS setting above. However, you can specify
a "zapper mask" to narrow down the definition of a player. See
HELP Prop_HaveZapper for the list of valid mask values to put here.</p>
<p><span style="color: rgb(51, 102, 102);">SET RUNLEVEL</span><span style="color: rgb(102, 51, 102);"> [#LEVEL]</span>
- Normally, a timed quest will always run when its time comes up.
Setting a value above -1 will prevent this quest from running
when its time comes up if
another quest is also running at the same or LOWER run level.
This does not affect spawned quest copies, which will always run
even when another of the same name (and runlevel) is active.</p>
<p><span style="color: rgb(51, 102, 102);">SET PRESERVE</span><span style="color: rgb(102, 51, 102);"> [#STEPS]</span>-
If a number greater than 0 is issued, then when a STEP command is
encountered and the commands following it are executed due to a
MPSTEPQUEST Scriptable command, then any
objects, behaviors, abilities, or affects which are specified after the
SET PRESERVE, but BEFORE the STEP command will not be cleaned up by the
quest manager until the specified number of STEPS have been encountered
and executed. This allows, for instance, a mob, once appropriated
and specified by a quest, to continue being used in subsequent steps
without being restored by the quest manager to a natural state.
An MPSTOPQUEST command, or an expired duration, will always cause
the entire quest to cease executing and all objects to be cleaned up.</p>
<span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">STEP </span>- The
purpose of this command is to allow your quest to run in several
different steps or stages. Placing this command in your quest
script will cause the script to end execution when it is encountered.
The quest will run
normally until it is ordered to proceed with the next step using the
Scriptable command MPSTEPQUEST. When the MPSTEPQUEST command
is issued, the quest script will clean up any
objects or data defined by statements prior to this STEP command, and
begin processing new quest script commands which follow it. A SET
DURATION command must follow a STEP command in order to ensure that the
quest will continue to run following execution of the post-STEP
commands, otherwise any duration settings from previous steps will be
re-used. Numerous STEP commands may be places in your quest
scripts. An MPSTOPQUEST command, or an expired duration, however, will always cause the
entire quest to cease executing and all objects to be cleaned up. See also SET PRESERVE. </p>
<p><span style="color: rgb(51, 102, 102);">STEP <span style="color: rgb(102, 51, 102);">BREAK</span></span><span style="color: rgb(102, 51, 102);">-</span>
This command will cause the quest script to stop evaluating any further
settings. Statements after a STEP BREAK, including any SETS,
LOADS, or any other statements, will not be executed. This
is used in conjunction with SET SPAWNABLE ANY to allow quest scripts
which have been broken into several descrete steps to run
independently. A SET SPAWNABLE ANY quest is considered
successfully run when this command is encountered.</p>
<p><span style="color: rgb(51, 102, 102);">IMPORT MOBS</span><span style="color: rgb(102, 51, 102);"> [XML FILE PATH]</span> - this will import
a list of custom mobs from a .CMARE file generated using the EXPORT ROOM
MOBS command. The parameter must be the path and file name of the file, using
the same format as the LOAD= command mentioned above. This list can
then be accessed with the LOAD MOB, or LOAD MOBGROUP command. </p>
<p><span style="color: rgb(51, 102, 102);">IMPORT ITEMS</span><span style="color: rgb(102, 51, 102);"> [XML FILE PATH] </span>- this will import
a list of custom items from a .CMARE file generated using the EXPORT ROOM
ITEMS command. The parameter must be the path and file name of the file,
using the same format as the LOAD= command mentioned above. This list
can then be accessed with the LOAD ITEM or LOAD ITEMGROUP command. </p>
<p><span style="color: rgb(51, 102, 102);">SET AREA</span> <span style="color: rgb(102, 51, 102);">([AREA NAME OR NAMES]) </span>- will set
the current designated area to the area specified. Although this
does nothing in itself, it is important for the several commands
which load mobs and items. The area name ANY may be given to choose
a random area. Several area names may be specified as choices
by setting the first area name as ANY, followed by your other area
name choices, separated by spaces. If no area name is given,
this will CLEAR the area designation. This can have a profound impact
on how subsequent mob or item loading, or room setting commands work.</p>
<p><span style="color: rgb(51, 102, 102);">SET AREA</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- serves the same purpose
as the above command of the same name, but the argument is an object specifier.
See Object Specifiers below this command listing. If the object
resolves to a group of objects, a random one from the group will be chosen.</p>
<p><span style="color: rgb(51, 102, 102);">SET AREAGROUP</span> <span style="color: rgb(102, 51, 102);">([AREA NAME OR NAMES]) </span>-
essentially the same as set ROOMGROUP below, this will set the current
designated roomgroup to the rooms in the area(s) specified. Although
this does nothing in itself, it is important for the several commands
which load mobs and items. The area name ANY may be given to choose a
random area. Several area names may be specified, separated by
spaces and word-grouped with double-quotes. If no area name is
given,
this will CLEAR the ROOMGROUP designation. This can have a profound
impact
on how subsequent mob or item loading, or room setting commands work.
This command will automatically clear the AREA setting.</p>
<span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">SET ROOMGROUP</span> <span style="color: rgb(102, 51, 102);">([ROOM NAME])</span> - will set the ROOMGROUP
to the set specified. If an area has been previously designated, and not
cleared (see SET AREA), then the rooms will be selected from the designated
area according to the room name criteria. Otherwise, rooms from the whole
map will be chosen. If a room name of ANY is given, then the rooms will
be chosen randomly from the world, or the area if designated. Several
room names may be specified as choices by setting the first room name as
ANY, followed by your other room name choices, separated by spaces.
If no room name is given, this will effectly clear the ROOMGROUP designation
(but it will not clear the area designation!). Valid room names include
map room IDs such as MyArea#123, or key words from the titles or descriptions
of rooms.</p>
<p><span style="color: rgb(51, 102, 102);">SET </span><span style="color: rgb(51, 102, 102);">ROOMGROUP</span> <span style="color: rgb(102, 51, 102);"></span><span style="color: rgb(102, 51, 102);">[OBJECT] </span>- serves the same purpose
as the above command of the same name, but the argument is an object specifier.
See Object Specifiers below this command listing.<span style="color: rgb(102, 51, 102);"></span> </p>
<p><span style="color: rgb(51, 102, 102);">SET ROOM</span> <span style="color: rgb(102, 51, 102);">([ROOM NAME]) </span>- will set the current
designated room to the set specified. If a room or area has been previously
designated, and not cleared (see SET AREA), then the room will be selected
from the designated area according to the room name criteria. Otherwise,
a room from the whole map will be chosen. If a room name of ANY is given,
then the room will be chosen randomly from the world, or the area if designated. Several
room names may be specified as choices by setting the first room name as
ANY, followed by your other room name choices, separated by spaces.
If no room name is given, this will effectly clear the room designation
(but it will not clear the area designation!). Valid room names include
map room IDs such as MyArea#123, or key words from the titles or descriptions
of rooms.</p>
<p><span style="color: rgb(51, 102, 102);">SET ROOM</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- serves the same purpose
as the above command of the same name, but the argument is an object specifier.
See Object Specifiers below this command listing. If the
object resolves to a group of objects, a random one from the group will
be chosen.</p>
<p><span style="color: rgb(51, 102, 102);">SET ROOMGROUPAROUND</span> <span style="color: rgb(102, 51, 102);">[#RADIUS] ([ROOM NAME])</span>- will set
the ROOMGROUP to the set of rooms up to RADIUS rooms from the previously
set ROOM. The rooms will be selected from the set of rooms which are up
to RADIUS rooms away from the currently set ROOM (see SET ROOM/SET
LOCALE). The radius must then be greater than 0. If the following
room name of ANY is given, then all rooms in the radius are grouped. Several
room names may be specified as choices by setting the first room name as
ANY, followed by your other room name choices, separated by spaces.
If no room name is given, this will effectly clear the ROOMGROUP designation
(but it will not clear the area designation!). Valid room names
include map room IDs such as MyArea#123, or key words from the titles or
descriptions of rooms.</p>
<p><span style="color: rgb(51, 102, 102);">SET LOCALEGROUP</span> <span style="color: rgb(102, 51, 102);">([LOCALE])</span> - will set the ROOMGROUP
to the ones with the specified class name. If an area has been previously
designated, and not cleared (see SET AREA), then the rooms will be selected
from the designated area according to the locale criteria. Otherwise, rooms
from the whole map will be chosen. If a locale name of ANY is given, then
the rooms will be chosen randomly from the world, or the area if designated. Several
locale types may be specified as choices by setting the first locale type
as ANY, followed by your other locale type choices, separated by spaces.
If no locale is given, this will effectly clear the ROOMGROUP designation
(but it will not clear the area designation!). Valid locale names
may be Locale class names such as MountainSurface, StdRoom, etc, or they
may be locale types such as stone, wooden, underwater, mountains, etc.</p>
<p><span style="color: rgb(51, 102, 102);">SET </span><span style="color: rgb(51, 102, 102);">LOCALEGROUP</span> <span style="color: rgb(102, 51, 102);"></span><span style="color: rgb(102, 51, 102);">[OBJECT] </span>- serves the same purpose
as the above command of the same name, but the argument is an object specifier.
See Object Specifiers below this command listing. </p>
<p><span style="color: rgb(51, 102, 102);">SET LOCALEGROUPAROUND</span>
<span style="color: rgb(102, 51, 102);">([#RADIUS] [LOCALE])</span> -
will set the ROOMGROUP to the ones with the specified class name. The
rooms will be selected from the set of rooms which areup to RADIUS rooms
away from the currently set ROOM (see SET LOCALE/SET ROOM). The radius must
then be greater than 0. If the following locale name of ANY is given,
then all rooms in the radius are grouped. Several room names may
be specified as choices by setting the first locale name as ANY, followed
by your other locale name choices, separated by spaces.
If no locale name is given, this will effectly clear the ROOMGROUP
designation (but it will not clear the area designation!). Valid
locale names may be Locale class names such as MountainSurface, StdRoom,
etc, or they may be locale types such as stone, wooden, underwater, mountains,
etc.</p>
<p><span style="color: rgb(51, 102, 102);">SET LOCALE</span><span style="color: rgb(102, 51, 102);"> ([LOCALE])</span> - will set the current
designated room to the one with the specified class name. If a
room or area has been previously designated, and not cleared (see
SET AREA), then the room will be selected from the designated area
according to the locale criteria. Otherwise, a room from the whole map
will be chosen. If a locale of ANY is given, then the room will be chosen
randomly from the world, or the area if designated. Several
locale types may be specified as choices by setting the first locale
type as ANY, followed by your other locale type choices, separated by
spaces. If no locale is given, this will effectly clear the room
designation (but it will not clear the area designation!). Valid
locale names may be Locale class names such as MountainSurface, StdRoom,
etc, or they may be locale types such as stone, wooden, underwater, mountains,
etc.</p>
<p><span style="color: rgb(51, 102, 102);">SET LOCALE</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- serves the same purpose
as the above command of the same name, but the argument is an object specifier.
See Object Specifiers below this command listing. If the
object resolves to a group of objects, a random one from the group will
be chosen. </p>
<p><span style="color: rgb(51, 102, 102);">SET MOBGROUP</span> <span style="color: rgb(102, 51, 102);">(RESELECT) ([MOB NAME]) </span>- will designate
a set of mobs with the given name. If the name ends with MASK=...,
then a mask similar in functionality to the one described in the
Prop_HaveZapper will apply in addition to the name mask entered before
the MASK= string. The mobs chosen will be selected from those in
the designated ROOMGROUP (if one is designated), AREA (if
one is designated) or the world. The mobs must exist somewhere in the map
for this command to work. Normally a mob will not be placed in the
mobgroup if the mob has been previously set with SET MOB, or SET MOBTYPE.
The RESELECT flag is an optional first flag which, if specified, designates
that mobs may be placed in the mobgroup even if previously set, so
long as the RESELECT flag was also used in the previous SET MOB or SET MOBTYPE
command.</p>
<p><span style="color: rgb(51, 102, 102);">SET </span><span style="color: rgb(51, 102, 102);">MOBGROUP</span> <span style="color: rgb(102, 51, 102);"></span><span style="color: rgb(102, 51, 102);">[OBJECT] </span>- serves the same purpose
as the above command of the same name, but the argument is an object specifier.
See Object Specifiers below this command listing </p>
<p><span style="color: rgb(51, 102, 102);">SET MOB</span><span style="color: rgb(102, 51, 102);"> </span> <span style="color: rgb(102, 51, 102);">(RESELECT) </span><span style="color: rgb(102, 51, 102);">([MOB NAME])</span> - will set the current
mob to one with the given mob name. If the name ends with MASK=..., then
a mask similar in functionality to the one described in the Prop_HaveZapper
will apply in addition to the mob name entered before the MASK= string.
Ths mob chosen will be selected from a MOBGROUP if one has been set. Otherwise,
the mob chosen will be selected from those in the designated ROOMGROUP (if
one is designated), or the AREA (if one is designated) or finally the world.
The mob must exist somewhere one of those groups for this command to work.
If a room has been previously designated, then this command will bring the
chosen mob to that room. If a room or area has not been designated (or was
cleared), then this command will designate a new room and area. Normally
a mob will not be chosen by this command if the mob has been previously
set with SET MOB, or SET MOBTYPE. The RESELECT flag is an optional
first flag which, if specified, designates that a mob may be chosen if previously
chosen, so long as the RESELECT flag was also used in the previous SET MOB
or SET MOBTYPE command.</p>
<p><span style="color: rgb(51, 102, 102);">SET MOB</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- serves the same purpose
as the above command of the same name, but the argument is an object specifier.
See Object Specifiers below this command listing. If the
object resolves to a group of objects, a random one from the group will
be chosen. </p>
<p><span style="color: rgb(51, 102, 102);">SET MOBTYPE</span><span style="color: rgb(102, 51, 102);"> (RESELECT) ([CLASS])</span> - will set
the current mob to one with the given class name. Ths mob chosen
will be selected from a MOBGROUP if one has been set. Otherwise, the
mob chosen will be selected from those in the designated ROOMGROUP (if
one is designated), AREA (if one is designated) or the world. The mob
must exist somewhere in the map for this command to work. If a room
has been previously designated, then this command will bring the mob
to that room. If a room or area has not been designated (or was cleared),
then this command will designate a new room and area. Normally
a mob will not be chosen by this command if the mob has been previously set
with SET MOB, or SET MOBTYPE. The RESELECT flag is an optional first
flag which, if specified, designates that a mob may be chosen if previously
chosen, so long as the RESELECT flag was also used in the previous SET MOB
or SET MOBTYPE command.</p>
<p><span style="color: rgb(51, 102, 102);">SET MOBTYPE</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- serves the same purpose
as the above command of the same name, but the argument is an object specifier.
See Object Specifiers below this command listing. If the
object resolves to a group of objects, a random one from the group will
be chosen. </p>
<p><span style="color: rgb(51, 102, 102);">SET ITEMGROUP</span> <span style="color: rgb(102, 51, 102);">(RESELECT) </span><span style="color: rgb(102, 51, 102);">([ITEM NAME]) </span>- will designate a
set of items with the given name. If the name ends with MASK=..., then a
mask similar in functionality to the one described in the Prop_HaveZapper
will apply in addition to the item name entered before the MASK= string.
The items chosen will be selected from those in the designated ROOMGROUP
(if one is designated), the AREA (if one is designated) or the
world. The items must exist somewhere in the map for this command to work.
Normally an item will not be placed in the itemgroup if the item has
been previously set with SET ITEM, or SET ITEMTYPE. The RESELECT flag
is an optional first flag which, if specified, designates that items may
be placed in the itemgroup even if previously set, so long as the RESELECT
flag was also used in the previous SET ITEM or SET ITEMTYPE command.</p>
<p><span style="color: rgb(51, 102, 102);">SET </span><span style="color: rgb(51, 102, 102);">ITEMGROUP</span> <span style="color: rgb(102, 51, 102);"></span><span style="color: rgb(102, 51, 102);">[OBJECT] </span>- serves the same purpose
as the above command of the same name, but the argument is an object specifier.
See Object Specifiers below this command listing</p>
<p><span style="color: rgb(51, 102, 102);">SET ITEM</span> <span style="color: rgb(102, 51, 102);">(RESELECT) </span><span style="color: rgb(102, 51, 102);">([ITEM NAME])</span> - will set the current
item to one with the given name. The item chosen will be selected
from those in the designated ROOMGROUP (if one is designated),
AREA (if one is designated) or the world. The item must exist
somewhere in a room on the map for this command to work. If a room
has been previously designated, then this command will bring the
item to that room. If a room or area has not been designated (or was
cleared), then this command will designate a new room and area. Normally
an item will not be chosen by this command if the item has been previously
set with SET ITEM, or SET ITEMTYPE. The RESELECT flag is an optional
first flag which, if specified, designates that an item may be chosen if
previously chosen, so long as the RESELECT flag was also used in the previous
SET ITEM or SET ITEMTYPE command.</p>
<p><span style="color: rgb(51, 102, 102);">SET ITEM</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- serves the same purpose
as the above command of the same name, but the argument is an object specifier.
See Object Specifiers below this command listing. If the
object resolves to a group of objects, a random one from the group will
be chosen. </p>
<p><span style="color: rgb(51, 102, 102);">SET ITEMTYPE</span> <span style="color: rgb(102, 51, 102);">(RESELECT) </span><span style="color: rgb(102, 51, 102);">([CLASS])</span> - will set the current
item to one with the given class name. The item chosen will be selected from
those in the designated ROOMGROUP (if one is designated), AREA (if one is
designated) or the world. The item must exist somewhere in a room on the
map for this command to work. If a room has been previously designated, then
this command will bring the item to that room. If a room or area has not
been designated (or was cleared), then this command will designate a new
room and area. Normally an item will not be chosen by this command
if the item has been previously set with SET ITEM, or SET ITEMTYPE. The
RESELECT flag is an optional first flag which, if specified, designates
that an item may be chosen if previously chosen, so long as the RESELECT
flag was also used in the previous SET ITEM or SET ITEMTYPE command.
</p>
<p><span style="color: rgb(51, 102, 102);">LOAD MOBGROUP</span> <span style="color: rgb(102, 51, 102);">([#NUMBER]) [MOB NAME] </span>- will instantiate
all (or optionally, the given number) mobs of the given name from the
set of mobs imported using the IMPORT MOBS command above. If the mob name
ends with MASK=..., then a mask similar in functionality to the one described
in the Prop_HaveZapper will apply in addition to the mob name entered before
MASK= string. This selected mobs will be set as the current MOBGROUP. If
a room, roomgroup, or area has been previously designated, then this command
will create each mob in that room or random room in the area. If a room
or area has not been designated (or was cleared), then this command will
designate a random room and area. This command will also designate
the current mob to the last one loaded. </p>
<p><span style="color: rgb(51, 102, 102);">LOAD MOB</span> <span style="color: rgb(102, 51, 102);">[MOB NAME]</span> - will instantiate a mob
of the given name from the list of mobs imported using the IMPORT
MOBS command above. If the name ends with MASK=..., then a mask similar
in functionality to the one described in the Prop_HaveZapper will
apply in addition to the name mask entered. This selected mob will be
set as the current mob. If a room, roomgroup, or area has been previously
designated, then this command will create the mob in that room. If a
room or area has not been designated (or was cleared), then this command
will designate a random room and area. </p>
<p><span style="color: rgb(51, 102, 102);">LOAD ITEMGROUP</span><span style="color: rgb(51, 102, 102);"></span> <span style="color: rgb(102, 51, 102);">([#NUMBER])</span> <span style="color: rgb(102, 51, 102);">[ITEM NAME] </span>- will instantiate all (or
optionally, the given number) items of the given name from the list
of items imported using the IMPORT ITEMS command above. This items will be
set as the current ITEMGROUP. If a room, roomgroup, or area has been previously
designated, then this command will create the item in that room. If a room
or area has not been designated (or was cleared), then this command will
designate a random room and area. This command will also designate
the current item to the last one loaded.</p>
<p><span style="color: rgb(51, 102, 102);">LOAD ITEM</span> <span style="color: rgb(102, 51, 102);">[ITEM NAME]</span> - will instantiate an
item of the given name from the list of items imported using the
IMPORT ITEMS command above. This item will be set as the current
item. If a room, roomgroup, or area has been previously designated,
then this command will create the item in that room. If a room or
area has not been designated (or was cleared), then this command will
designate a random room and area. </p>
<p><span style="color: rgb(51, 102, 102);">GIVE ITEM</span> - will give the
currently designated item (designated using the SET ITEM, or LOAD ITEM
command) to the last designated mob or mobs (designated using the SET
MOB, SET MOBGROUP, LOAD MOBGROUP, or LOAD MOB commands).</p>
<p><span style="color: rgb(51, 102, 102);">GIVE STAT<span style="color: rgb(102, 51, 102);"> [STAT ID] [VALUE]</span></span><span style="color: rgb(102, 51, 102);"> </span>-
will give the currently designated object (designated using the SET
ITEM/MOB/ROOM/AREA, or LOAD ITEM/MOB command) a new value for their
internal stat designated by the STAT ID. This is an advanced
coding feature; use it wisely.. </p>
<span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">GIVE BEHAVIOR</span> <span style="color: rgb(102, 51, 102);">[BEHAVIOR ID] ([PARAMETERS]) </span>- The
behavior ID must be a valid behavior class name. The parameters are any
parameters you wish to pass to the behavior. This command will give the
most recently designated mob, item, area, room or mobgroup (designated using
the set or load commands), itemgroup, or roomgroup the above behavior. The
parameters above are optional, and include any text that would be valid
for the behavior id specified. The text may also optionally include
embedded references to other quest objects. See below Object Specifiers
in Parameters below for more information on using this feature.</p>
<p><span style="color: rgb(51, 102, 102);"> GIVE ABILITY</span><span style="color: rgb(102, 51, 102);"> [ABILITY ID] ([PARAMETERS]) </span>- The
ability ID must be a valid ability class name. The parameters are any parameters
you wish to pass to the ability. This command will give the currently designated
mob, or mobgroup (designated using the set or load commands) the above ability. The
parameters above are optional, and include any text that would be valid
for the ability id specified. The text may also optionally include
embedded references to other quest objects. See below Object Specifiers
in Parameters below for more information on using this feature. </p>
<p><span style="color: rgb(51, 102, 102);">GIVE AFFECT</span> <span style="color: rgb(102, 51, 102);">[ABILITY ID] ([PARAMETERS]</span>) - The
ability ID must be a valid ability class name. The parameters are
any parameters you wish to pass to the ability. This command will
give the currently designated mob, item, room, area, or mobgroup (designated
using the set or load commands), itemgroup, or roomgroup the above affect. The
parameters above are optional, and include any text that would be valid
for the ability id specified. The text may also optionally include
embedded references to other quest objects. See below Object Specifiers
in Parameters below for more information on using this feature. </p>
<p><span style="color: rgb(51, 102, 102);">GIVE FOLLOWER</span> <span style="color: rgb(102, 51, 102);">[MOB NAME]</span> - The mob name is a mob
which will be selected from the list of previously designated mobs (designated
using the LOAD MOB, SET MOB, or SET MOBTYPE commands). This mob will be
made into a follower of the mob most recently designated using the SET MOB,
SET MOBTYPE, or LOAD MOB command. This command does not change the current
mob designation, nor does it change the location of either mob.</p>
<p><span style="color: rgb(51, 102, 102);">TAKE BEHAVIOR</span> <span style="color: rgb(102, 51, 102);">[BEHAVIOR ID]</span>- The behavior ID must
be a valid behavior class name. This command will take from the most
recently designated mob, item, area, room or mobgroup (designated using
the set or load commands), itemgroup, or roomgroup the above behavior. </p>
<p> <span style="color: rgb(51, 102, 102);">TAKE</span><span style="color: rgb(51, 102, 102);"> ABILITY</span><span style="color: rgb(102, 51, 102);"> [ABILITY ID] </span>- The ability ID must
be a valid ability class name. This command will take from the currently
designated mob, or mobgroup (designated using the set or load commands) the
above ability. </p>
<p> <span style="color: rgb(51, 102, 102);">TAKE</span><span style="color: rgb(51, 102, 102);"> AFFECT</span> <span style="color: rgb(102, 51, 102);">[ABILITY ID] </span> - The ability
ID must be a valid ability class name. This command will take from
the currently designated mob, item, room, area, or mobgroup (designated
using the set or load commands), itemgroup, or roomgroup the above affect.
</p>
<span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">RESET</span><span style="color: rgb(102, 51, 102);"></span>- If a ROOM has been designated using
SET ROOM, or by any other previously described method, this command will
cause that room to reset, or re-load from the database. If a ROOM
is not currently set (or has been unset), but a ROOMGROUP or an AREA has
been set, this command will cause all rooms in that set (respectively) to
reload from the database. Doing either can be somewhat time consuming,
and may disrupt any players in the rooms affected, as it will cause items
to vanish from the floor, and make players and mobs unable to move until
the process is completed.</p>
<p><span style="color: rgb(51, 102, 102);"><SCRIPT></span> - This designates
the beginning of embedded Javascript in your quest script.
The end is designated by a corresponding </SCRIPT> tag on
its own line. See the next section for more details.</p>
<p><span style="color: rgb(51, 102, 102);">LOAD= <span style="color: rgb(102, 51, 102);">([QUEST FILE]) ([ARGUMENT] ... [ARGUMENT])
</span></span>- This command will cause the specified external quest
script file to be loaded and executed as if it were embedded at the
current point in the script. The quest filename is
of the same format mentioned above. When LOAD= is used as a command
inside a script, you can also specify one or more space-delimited arguments
which will be accessible inside the target quest script as Object Specifiers.
The first argument given, whether it is itself an Object Specifier,
or a simple string, will be accessible inside the target quest script as
ARG1, the second as ARG2, and so forth. A special case exists, however,
if one of the arguments evaluates to an Object Specifier which represents
a group of objects (such as MOBGROUP or ITEMGROUP). If that case occurs,
the LOAD= command will execute once for every object inside the group! See
the discussion of Object Specifiers and Object Spcifiers in Parameters for
more information.</p>
<p><span style="color: rgb(51, 102, 102);"><OPTION> <span style="color: rgb(102, 51, 102);">([QUEST SCRIPT COMMANDS]) <span style="color: rgb(51, 102, 102);"></OPTION></span></span></span><span style="color: rgb(51, 102, 102);"><span style="color: rgb(102, 51, 102);"> </span></span>-
Putting quest script commands inside of <OPTION> tags means that, for
every execution of the quest script, only ONE of the <OPTION>
tags will be have their script commands executed. The one chosen will
be selected at random. If only one <OPTION> tag exists, it will
be chosen every time, of course. <span style="color: rgb(102, 51, 102);"></span></p>
<p><span style="color: rgb(102, 0, 0); font-weight: bold;">* Note About #</span><span style="font-weight: bold;">. </span> In a quest script, anywhere the
# sign is used above (such as [#TICKS] or [#PLAYERS], you may enter a normal
old every day number (34) or you may enter a valid arithmetic expression
using real or integer numbers and any of the following operators: + - * \
() ?</p>
<p><span style="color: rgb(102, 0, 0); font-weight: bold;"><a name="questcrobjsp"></a>* Object Specifiers</span><span style="font-weight: bold;">. </span> Many of the SET ... commands,
such as SET MOBGROUP, SET MOB, SET ITEMGROUP, SET ROOM, etc, have forms which
allow you to designate their value using an [OBJECT] string. An [OBJECT]
string is one of the following basic quest-script values: "LOADEDMOBS", "LOADEDITEMS",
"AREA", "ROOM", "MOBGROUP", "ITEMGROUP", "ROOMGROUP", "ITEM", "ENVOBJ", "STUFF",
"MOB", or one of the following mystery quest-script values: "FACTION",
"FACTIONGROUP", "AGENT", "AGENTGROUP", "ACTION", "ACTIONGROUP", "TARGET",
"TARGETGROUP", "MOTIVE", "MOTIVEGROUP", "WHEREHAPPENED", "WHEREHAPPENEDGROUP",
"WHEREAT", "WHEREATGROUP", "WHENHAPPENED", "WHENHAPPENEDGROUP", "WHENAT",
"WHENATGROUP", "TOOL", "TOOLGROUP". Using the SET command in this
way allows you to either COPY an objects value, or re-designate it for the
purposes of one of the GIVE ... commands. If the quest script was
executed from inside of another using the LOAD= script command, and arguments
were specified from the above objects, you may also have access to argument
object specifiers, such as ARG1, ARG2, ... ARGN. There will be one
such object specifier available for each argument passed to the script.
Please note that some object specifiers return single objects (such
as MOB, ITEM, ROOM) and some return collections of objects (such as ROOMGROUP,
MOBGROUP, ITEMGROUP). Object specifiers can also be combined using
+ and - characters. For instance, MOBGROUP-MOB would return the group
of mobs in the MOBGROUP minus the specified MOB while the specifier MOB+ITEM
would refer to an object group containing both the specified MOB and the
specified ITEM.</p>
<p><span style="color: rgb(102, 0, 0); font-weight: bold;">* Object Specifiers
in Parameters</span><span style="font-weight: bold;">. </span>When
specifing parameters for the GIVE BEHAVIOR, GIVE ABILITY, or GIVE AFFECT
command, you may embed the names of one or more of the Object Specifiers
by prefixing the Object Specifier code string with a $ character, and concluding
it with a space or other non-alphanumeric character. For instance,
the command: "GIVE BEHAVIOR Scriptable GREET_PROG 100\; say I love
$MOB!!!\;~\;" would embed the name string for the MOB object specifier inside
the in-line script. In addition to this capability, you may also
put a special character after the $ and before the object specifier to manipulate
how the name of the object is generated. Special characters are: '_'
(to make the name in uppercase), '&' to remove any prefixed english
article words from the name, or '|' to replace all spaces in the name with
| characters (which is very useful for QuestChat parameters).</p>
<p><font style="background-color: aquamarine;" color="#4169e1" size="4"><strong>Mystery
Objects in Quest scripts:</strong></font></p>
<p>In addition to the normal quest objects mentioned above, such as MOB,
ITEM, ROOM and so forth, there are also extranous objects and groups intended
for use when building logic problem mysteries. The commands for setting
these are as follows:</p>
<p><span style="color: rgb(51, 102, 102);">SET AGENT</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the AGENT variable
to the [OBJECT]. Will also set the MOB object. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing. If the object resolves to a group
of objects, a random one from the group will be chosen.</p>
<p><span style="color: rgb(51, 102, 102);">SET AGENTGROUP</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the AGENTGROUP
variable to the [OBJECT]. Will also set the MOBGROUP object to the
same, as well as designate one random mob from the group as the AGENT and
the MOB. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<p><span style="color: rgb(51, 102, 102);">SET AGENTGROUP</span> <span style="color: rgb(102, 51, 102);">[#NUMBER] </span>- Sets the AGENTGROUP
variable to the currently set MOBGROUP, selecting at most NUMBER mobs randomly
from that list. Will also set the MOBGROUP object to the same, as
well as designate one random mob from the group as the AGENT and the MOB.
See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<p><span style="color: rgb(51, 102, 102);">SET WHEREHAPPENED</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the WHEREHAPPENED
variable to the [OBJECT]. Will also set the ROOM object. See
<a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing. If the object resolves
to a group of objects, a random one from the group will be chosen.</p>
<p><span style="color: rgb(51, 102, 102);">SET WHEREHAPPENEDGROUP</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the WHEREHAPPENEDGROUP
variable to the [OBJECT]. Will also set the ROOMGROUP object to the
same, as well as designate one random room from the group as the WHEREHAPPENED
and the ROOM. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<p><span style="color: rgb(51, 102, 102);">SET WHEREHAPPENEDGROUP</span> <span style="color: rgb(102, 51, 102);">[#NUMBER] </span>- Sets the WHEREHAPPENEDGROUP
variable to the currently set ROOMGROUP, selecting at most NUMBER rooms randomly
from that list. Will also set the ROOMGROUP object to the same, as
well as designate one random room from the group as the WHEREHAPPENED
and the ROOM. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<p><span style="color: rgb(51, 102, 102);">SET WHEREAT</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the WHEREAT
variable to the [OBJECT]. Will also set the ROOM object. See
<a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing. If the object resolves
to a group of objects, a random one from the group will be chosen.</p>
<p><span style="color: rgb(51, 102, 102);">SET </span><span style="color: rgb(51, 102, 102);">WHEREATGROUP</span> <span style="color: rgb(102, 51, 102);">[</span><span style="color: rgb(102, 51, 102);">OBJECT] </span>- Sets the WHEREATGROUP
variable to the [OBJECT]. Will also set the ROOMGROUP object to the
same, as well as designate one random room from the group as the WHEREAT
and the ROOM. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<p><span style="color: rgb(51, 102, 102);">SET </span><span style="color: rgb(51, 102, 102);">WHEREATGROUP</span> <span style="color: rgb(102, 51, 102);">[</span><span style="color: rgb(102, 51, 102);">#NUMBER] </span>- Sets the WHEREATGROUP
variable to the currently set ROOMGROUP, selecting at most NUMBER rooms randomly
from that list. Will also set the ROOMGROUP object to the same, as
well as designate one random room from the group as the WHEREAT and
the ROOM. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<p><span style="color: rgb(51, 102, 102);">SET WHENHAPPENED</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the WHENHAPPENED
variable to the timeclock [OBJECT]. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this
command listing. If the object resolves to a group of objects,
a random one from the group will be chosen.</p>
<p><span style="color: rgb(51, 102, 102);">SET WHENHAPPENED</span> <span style="color: rgb(102, 51, 102);">[#HOURS-DIFFERENCE] </span>- Sets the
WHENHAPPENED variable to the current time plus or minus the hours difference
specified. See<a href="ArchonTome.html#questcrobjsp"> Object Specifiers</a>
above this command listing.
If the object resolves to a group of objects, a random one from the
group will be chosen.</p>
<span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">SET WHENHAPPENEDGROUP</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the WHENHAPPENEDGROUP
variable to the [OBJECT]. Will also designate one random time
from the group as the WHENHAPPENED. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above
this command listing.</p>
<p><span style="color: rgb(51, 102, 102);">SET WHENHAPPENEDGROUP</span> <span style="color: rgb(102, 51, 102);">[#</span><span style="color: rgb(102, 51, 102);">HOURS-DIFFERENCE</span><span style="color: rgb(102, 51, 102);">] ... </span><span style="color: rgb(102, 51, 102);">[#</span><span style="color: rgb(102, 51, 102);">HOURS-DIFFERENCE</span><span style="color: rgb(102, 51, 102);">] </span>- Sets the WHENHAPPENEDGROUP
list to the current time plus or minus the list of hours-differences given.
Will also designate one random time from the group as the WHENHAPPENED.
See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<p><span style="color: rgb(51, 102, 102);">SET WHENAT</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the WHENHAPPENED
variable to the timeclock [OBJECT]. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this
command listing. If the object resolves to a group of objects,
a random one from the group will be chosen.</p>
<p><span style="color: rgb(51, 102, 102);">SET WHENAT</span> <span style="color: rgb(102, 51, 102);">[#HOURS-DIFFERENCE] </span>- Sets the
WHENAT variable to the current time plus or minus the hours difference specified.
See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing. If the
object resolves to a group of objects, a random one from the group will
be chosen.</p>
<span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">SET WHENATGROUP</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the WHENATGROUP
variable to the [OBJECT]. Will also designate one random time
from the group as the WHENAT. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this
command listing.</p>
<p><span style="color: rgb(51, 102, 102);">SET WHENATGROUP</span> <span style="color: rgb(102, 51, 102);">[#</span><span style="color: rgb(102, 51, 102);">HOURS-DIFFERENCE</span><span style="color: rgb(102, 51, 102);">] ... </span><span style="color: rgb(102, 51, 102);">[#</span><span style="color: rgb(102, 51, 102);">HOURS-DIFFERENCE</span><span style="color: rgb(102, 51, 102);">] </span>- Sets the WHENATGROUP
list to the current time plus or minus the list of hours-differences given.
Will also designate one random time from the group as the WHENAT.
See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<p><span style="color: rgb(51, 102, 102);">SET FACTION</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the FACTION
variable to the faction string [OBJECT]. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above
this command listing. If the object resolves to a group of objects,
a random one from the group will be chosen.</p>
<p><span style="color: rgb(51, 102, 102);">SET FACTION</span> <span style="color: rgb(102, 51, 102);">[FACTION NAME] </span>- Sets the FACTION
variable to one of the given name or ANY to choose a random one.</p>
<span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">SET FACTIONGROUP</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the FACTIONGROUP
variable to the [OBJECT]. Will also designate one random faction from
the group as the FACTION. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command
listing.</p>
<span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">SET FACTIONGROUP</span> <span style="color: rgb(102, 51, 102);">[#NUMBER] </span>- Sets the FACTIONGROUP
variable to NUMBER random factions, or ALL to set it to all of them. Will
also designate one random faction from the group as the FACTION. See
<a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">SET FACTIONGROUP</span> <span style="color: rgb(102, 51, 102);">[FACTION NAME] ... [FACTION NAME] </span>-
Sets the FACTIONGROUP variable to the set of factions designated by the faction
names. Will also designate one random faction from the group as the
FACTION. The faction names are space delimited, and names grouped with
double-quotes. </p>
<span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">SET TARGET </span><span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the TARGET variable
to the [OBJECT]. Will also set the MOB or ITEM object depending on
what gets designated. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.
If the object resolves to a group of objects, a random one from the
group will be chosen.</p>
<p><span style="color: rgb(51, 102, 102);">SET TARGETGROUP</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the TARGETGROUP
variable to the [OBJECT]. Will also set the MOBGROUP or ITEMGROUP
object to the same (depending on what type of group is designated), as well
as designate one random object from the group as the TARGET, and either
the MOB or ITEM. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<p><span style="color: rgb(51, 102, 102);">SET TARGETGROUP</span> <span style="color: rgb(102, 51, 102);">[#NUMBER] </span>- Sets the TARGETGROUP
variable to the currently set MOBGROUP (if one is currently set) or ITEMGROUP
if not. It will select at most NUMBER objects randomly from that list.
Will also re-set the MOBGROUP or ITEMGROUP object to the same, as
well as designate one random mob or item from the group as the TARGET and
either the MOB or ITEM. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">SET TOOL </span><span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the TOOL variable
to the [OBJECT]. Will also set the MOB or ITEM object depending on
what gets designated. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.
If the object resolves to a group of objects, a random one from the
group will be chosen.</p>
<p><span style="color: rgb(51, 102, 102);">SET TOOLGROUP</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the TOOLGROUP
variable to the [OBJECT]. Will also set the MOBGROUP or ITEMGROUP
object to the same (depending on what type of group is designated), as well
as designate one random object from the group as the TOOL, and either the
MOB or ITEM. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<p><span style="color: rgb(51, 102, 102);">SET TOOLGROUP</span> <span style="color: rgb(102, 51, 102);">[#NUMBER] </span>- Sets the TOOLGROUP
variable to the currently set MOBGROUP (if one is currently set) or ITEMGROUP
if not. It will select at most NUMBER objects randomly from that list.
Will also re-set the MOBGROUP or ITEMGROUP object to the same, as
well as designate one random mob or item from the group as the TOOL and
either the MOB or ITEM. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<p><span style="color: rgb(51, 102, 102);">SET MOTIVE</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the MOTIVE variable
to the string [OBJECT]. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command
listing. If the object resolves to a group of objects, a random
one from the group will be chosen.</p>
<p><span style="color: rgb(51, 102, 102);">SET </span><span style="color: rgb(51, 102, 102);">MOTIVE</span> <span style="color: rgb(102, 51, 102);">[STRING] </span>- Sets the MOTIVE variable
to the string.</p>
<span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">SET </span><span style="color: rgb(51, 102, 102);">MOTIVE</span><span style="color: rgb(51, 102, 102);">GROUP</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the MOTIVEGROUP
variable to the [OBJECT]. Will also designate one random string from
the group as the MOTIVE. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<span style="color: rgb(51, 102, 102);"></span><span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">SET </span><span style="color: rgb(51, 102, 102);">MOTIVEGROUP</span> <span style="color: rgb(102, 51, 102);">[STRING] .. [STRING] </span>- Sets the MOTIVEGROUP
to the set of strings specified. Will also designate one random string
from the group as the MOTIVE. The strings are space delimited, and
words grouped with double-quotes.</p>
<span style="color: rgb(51, 102, 102);"></span><span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">SET ACTION</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the ACTION variable
to the string [OBJECT]. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command
listing. If the object resolves to a group of objects, a random
one from the group will be chosen.</p>
<p><span style="color: rgb(51, 102, 102);">SET </span><span style="color: rgb(51, 102, 102);">ACTION</span> <span style="color: rgb(102, 51, 102);">[STRING] </span>- Sets the ACTION variable
to the string.</p>
<span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">SET </span><span style="color: rgb(51, 102, 102);">ACTION</span><span style="color: rgb(51, 102, 102);">GROUP</span> <span style="color: rgb(102, 51, 102);">[OBJECT] </span>- Sets the ACTIONGROUP
variable to the [OBJECT]. Will also designate one random string from
the group as the ACTION. See <a href="ArchonTome.html#questcrobjsp">Object Specifiers</a>
above this command listing.</p>
<span style="color: rgb(51, 102, 102);"></span><span style="color: rgb(51, 102, 102);"></span>
<p><span style="color: rgb(51, 102, 102);">SET </span><span style="color: rgb(51, 102, 102);">ACTIONGROUP</span> <span style="color: rgb(102, 51, 102);">[STRING] .. [STRING] </span>- Sets the ACTIONGROUP
to the set of strings specified. Will also designate one random string
from the group as the ACTION. The strings are space delimited, and
words grouped with double-quotes.</p>
<span style="color: rgb(51, 102, 102);"></span><span style="color: rgb(51, 102, 102);"></span>
<p><font style="background-color: aquamarine;" color="#4169e1" size="4"><strong>JavaScripting
in Quest scripts:</strong></font></p>
<p>The CoffeeMud quest manager engine will allow you embed Javascript into
your quest scripts for the purpose of assisting in setting up your
quests. The Javascript must be located between the <SCRIPT>
and </SCRIPT> quest script commands to be recognized.
</p>
<p class="MsoNormal"><span style="font-size: 14pt; color: blue;"><font color="#000000"><font size="3">Javascript is a wholly different language
than the standard Scriptable/MOBPROG language OR the quest
script language described in this document. You should
read the JavaScripting section of the CoffeeMud </font><a href="Programming.html"><font size="3">Programming Guide</font></a><font size="3"> for more information, as well as the following web
sites which discuss the usage and syntax of the Javascript language
itself: </font><a href="http://www.mozilla.org/js/"><font size="3">http://www.mozilla.org/js/</font></a><font size="3"> and </font><a href="http://www.mozilla.org/rhino/"><font size="3">http://www.mozilla.org/rhino/</font></a><font size="3"> .</font></font></span></p>
<p class="MsoNormal"><span style="font-size: 14pt; color: blue;"><font color="#000000" size="3"><span style="font-size: 14pt; color: blue;"><font color="#000000" size="3">Aside from the above information about JavaScripting
in CoffeeMud, there are still a few more details to learn about
JavaScripting in your quest scripts. Although</font></span><span style="font-size: 14pt; color: blue;"><font color="#000000" size="3"> Javascript
does not require semicolon line delimeters and it will not likely
cause problems, you should be aware that the quest manager engine
will strip out all semicolons as part of its command parsing process.
For this reason, if you absolutely must keep a semicolon ANYWHERE
in your javascript, whether as part of a displayable string, or a
line delimeter, it must first be escaped: \;</font></span></font></span></p>
<p>The quest manager engine will also make a couple of useful methods available
to your Javascript for assisting in setting up your quests.
One is the <font face="Courier New"><font size="2">Quest quest() </font></font><font face="Times New Roman">method, which, as you can see, returns a Quest object
which represents to the current quest script. The Quest object
returned has numerous useful methods on them for doing things like
determining which mobs and items were selected by the SET commands
as described above (<font face="Courier New" size="2">isQuestObject,
getQuestObject, getQuestMob, getQuestItem</font>). There are
also methods for properly adding other such mobs and items to
your quest (<font face="Courier New" size="2">runtimeRegisterObject</font>),
or for adding abilities, behaviors, or effects to existing objects
( <font face="Courier New" size="2">runtimeRegisterAbility, runtimeRegisterEffect,
runtimeRegisterBehavior</font>). You should check out the
Quest interface for more information on these methods; they are located
in the file Quest.java, which is in the com/planet_ink/coffee_mud/interfaces
package.</font></p>
<p>Another method provided to Javascript by the quest manager is the <font face="Courier New" size="2">QuestState setupState() <font face="Times New Roman" size="3">method. The QuestState object
made available by this method contains information on the current
state of your quest Script. There are several
useful properties of the object, such as <font face="Courier New" size="2">area, room, mob, mobGroup, item,</font>
and <font face="Courier New" size="2">envObject</font> which will refer
to the last such objects SET by your quest script before Javascript
was executed. The Vectors </font></font><font size="2"><font size="3"><span style="font-family: monospace;">loadedMobs</span></font></font><font face="Courier New" size="2"><font face="Times New Roman" size="3"> and </font></font><font size="2"><font size="3"><span style="font-family: monospace;">loadedItems</span></font></font><font face="Courier New" size="2"><font face="Times New Roman" size="3"> are available
with any items or mobs gained from the IMPORT command, regardless of whether
they were LOADed. There is also the </font></font><font size="2"><font size="3"><span style="font-family: monospace;">mysteryData</span></font></font><font face="Courier New" size="2"><font face="Times New Roman" size="3"> object
with all the objects and Vectors SET for building logic problem mysteries.</font></font></p>
<p><font style="background-color: aquamarine;" color="#4169e1" size="4"><strong>Final
Quest Notes:</strong></font></p>
<p>This stuff may seem complicated, but just make sure you carefully examine
the sample quests found in the CoffeeMud resources directory! Also,
remember that quest script errors are always sent out to your mud.log,
so check their often when starting up a new quest!
</p>
<p class="MsoNormal"><a name="holidays"><strong><font color="#008000" size="5">Holidays</font></strong></a></p>
Holidays are a special/reserved quest defined by file /resources/quests/holidays/holidays.quest. <br>
<br>
They are very simple Scriptless quests that can be started at random
intervals, or on certain mud dates, or real-life dates. The
holidays will only impact the areas specified by the holiday settings,
and only the mobs in those areas specified in the settings, and
only with the features you specify. <br>
<br>
Use LIST HOLIDAYS to see a list of all defined holidays and the
areas hey are defined for. By default, 3 special-case weather
related holidays are included which impact any area that meets
their special criteria. <br>
<br>
You can use MODIFY HOLIDAY <name> to change the settings for
a holiday, DESTROY HOLIDAY <name> to delete one, or CREATE
HOLIDAY name to create a new one that will automatically apply to
the area the creator is standing in when it is created.<br>
<br>
Here are the standard settings for holidays:<br>
<br>
<br>
<table style="text-align: left; background-color: rgb(255, 255, 153); width: 100%;" border="1" cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td><span style="font-weight: bold;">Property</span></td>
<td><span style="font-weight: bold;">Description</span></td>
</tr>
<tr>
<td style="font-style: italic;">Holiday Name</td>
<td>A unique name for your holiday. It should be unique not only among holidays, but also among quests.</td>
</tr>
<tr>
<td style="font-style: italic;">Schedule Type</td>
<td>The type of time-trigger for the holiday, whether a random interval, a mud-date, or a real-life date.</td>
</tr>
<tr>
<td style="font-style: italic;">Interval Ticks</td>
<td>If the time trigger is a random interval, this is the
math expression to derive that interval. You may use normal math
operators like +-/*(), as well as the special ? operator to generate a
random number. 1?5 would mean a random number between 1-5.</td>
</tr>
<tr>
<td style="font-style: italic;">Mud-Day</td>
<td>If the time trigger is a mud-date, this is that date in month-day numeric format (like 1-30).</td>
</tr>
<tr>
<td style="font-style: italic;">Real Life Date</td>
<td>If the time trigger is a real-life date, this is that date in month-day numeric format (like 12-31).</td>
</tr>
<tr>
<td style="font-style: italic;">Duration Ticks</td>
<td>The number of ticks (4 second periods) that the changes specified below will be in effect once the holiday triggers.</td>
</tr>
<tr>
<td style="font-style: italic;">Areas List</td>
<td>The list of areas to apply the holiday to. Area names are space separated, with multiple words grouped in double quotes.</td>
</tr>
<tr>
<td style="font-style: italic;">Mask for mobs that apply</td>
<td>A zapper-mask that determines which mobs inside the
designated area will benefit from the changes specified below.
See Prop_HaveZapper for an example of a zapper mask, or just hit
? at the prompt here.</td>
</tr>
<tr>
<td style="font-style: italic;">Mood setting</td>
<td>If this entry is blank, it has no effect.
Otherwise, it is the name of the MOOD to force all the mobs to be
in during your holiday. Use ? for a list.</td>
</tr>
<tr>
<td style="font-style: italic;">Aggressive Setting</td>
<td>If this entry is blank, it has no effect.
Otherwise, it makes all the mobs aggressive during your holiday.
Use ? to get a list of valid parameters. Remember that this
field must not be blank if you want it to work!</td>
</tr>
<tr>
<td style="font-style: italic;">Price Factor</td>
<td>This change will only apply to mob shopkeepers.
It is a list of price-changes to make to specified items during
the holiday. See help on GenShopKeeper for more information on
Price Factors. You can specify as many different price-factors
for as many different types of items as you need to.</td>
</tr>
<tr>
<td style="font-style: italic;">MudChat for words...</td>
<td>This is a list of trigger words that mobs will respond
to when spoken to, and what they will respond. You can have as
many trigger words groupings as you like, with as many responses to
those trigger words as you need. Each response begins with a
single digit weight, to show how often that selection should be chosen
among the others.</td>
</tr>
<tr>
<td style="font-style: italic;">MOB Behavior</td>
<td>A list of Behaviors to apply to mobs during your
holiday. See the Archon's Guide under GenMOB for more information
on this, as it works the exact same way. Use ? for a list, and ?
will also work in the parameters for help.</td>
</tr>
<tr>
<td style="font-style: italic;">MOB Property</td>
<td>A list of Affects/Effects to apply to mobs during your
holiday. Again, see the Archon's Guide for more information on
how this works. Use ? for a list, and ? will also work in the
parameters for help.</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><a name="socials"><strong><font color="#008000" size="5">Socials</font></strong></a></p>
<p>Socials are those miscellaneous and happy little emoting blurbs that help
make muds a more fun and realistic place for players to interact. Without
them, players couldn't smile, roll their eyes, or flip anyone off without
considerable typing. The command line includes a social creator and
editor:</p>
<p><strong><font style="background-color: moccasin;">CREATE SOCIAL TWIGGLE</font></strong><br>
<br>
This starts the creation process for a social called
TWIGGLE. There are actually four different kinds of TWIGGLE
we will make: TWIGGLE (no parameters), TWIGGLE SELF, TWIGGLE ALL,
and TWIGGLE (to a target). This is type 1 of 4.<br>
<br>
<em>You wave your arms...<br>
Social name 'TWIGGLE' Enter new.<br>
: <br>
</em><br>
This is here in case you want to change the social
name before you create it. Doubtful, so just hit ENTER and skip
it.<br>
<br>
<em>(No change)<br>
Target=NONE<br>
Change T)arget, S)elf, A)ll, or N)one: </em><br>
<br>
This is where you choose the social type. For type1
socials, this would be None.<br>
<br>
<em>(No change)<br>
You see 'null'. Enter new.<br>
: <br>
</em><br>
This is what you as a player would see when you
perform the social.<br>
<br>
<strong>You wiggle your toes.</strong><br>
<br>
<em>Your action type=MOVEMENT<br>
Change W)ords, M)ovement (small), S)ound, L)arge
Movement <br>
</em><br>
This is the requirement of the social. Small movement
just needs hands, fingers, toes, lips, and other small body movements,
while large movements require legs, and often moving the entire
body. I tend to not use the Words one, and I leave sounds for, well,
yelling and such. This particular social involves toes, thus it's
a M)ovement. Type "<strong>M</strong>" for that.</p>
<p><em>Others see 'null'. Enter new.<br>
: <br>
</em><br>
This is what the people in the room see when you
perform a social.<br>
<br>
<strong><S-NAME> wiggles <S-HIS-HER>
toes.</strong><br>
<br>
<S-NAME> means Source Name. Character performing
the social is the source. I'll have a list of usable tags at the
end of this tutorial for you.<br>
<br>
<strong>Others Effect type=HANDS<br>
Change W)ords, M)ovement (w/noise), S)ound, V)isual,
H)ands: <br>
</strong><br>
This is what others in the room need to be able
to know you're performing a social. This social involves toe wiggling,
so I would recommend Visual. If you're curious about Hands, that
would be left for handshakes, highfives, etc. </p>
<p>And that concludes the creation of our TWIGGLE social, type 1.<br>
<br>
<strong><font style="background-color: moccasin;">CREATE SOCIAL TWIGGLE SELF</font></strong><br>
<br>
Ahh. Part 2, the SELF portion.<br>
<br>
<em>You wave your arms...<br>
Social name 'TWIGGLE' Enter new.<br>
: <br>
</em><br>
Like the above, you don't need to change the name.<br>
<br>
<em>(No change)<br>
Target=NONE<br>
Change T)arget, S)elf, A)ll, or N)one: <br>
</em><br>
Because this portion is the SELF portion, choose
"<strong>S</strong>". <br>
<br>
<em>You see 'null'. Enter new.<br>
: <br>
</em><br>
This is what you see when you perform the social
TWIGGLE SELF.<br>
<br>
<strong>You glaze over while you try to wiggle your
toes at yourself.</strong><br>
<br>
<em>Your action type=MOVEMENT<br>
Change W)ords, M)ovement (small), S)ound, L)arge
Movement<br>
</em><br>
You need toes to wiggle them, right? <strong>M</strong>)ovement
for that. <br>
<br>
<em>Others see 'null'. Enter new.<br>
:<br>
</em><br>
What the others in the room see when you perform
the social.<br>
<br>
<strong><S-NAME> wiggles <S-HIS-HER>
toes at <S-HIM-HERSELF>. Very odd.<br>
</strong><br>
<em>Others Effect type=HANDS<br>
Change W)ords, M)ovement (w/noise), S)ound, V)isual,
H)ands:<br>
</em><br>
They need to see it happen, right? I would guess
it's a <strong>V</strong>)isual requirement.</p>
<p>And that concludes the creation of our type 2 TWIGGLE social.</p>
<p><strong><font style="background-color: moccasin;">CREATE SOCIAL TWIGGLE
ALL</font><br>
</strong><br>
Yay! Type 3! The ALL is the Target Name.<br>
<br>
<em>You wave your arms...<br>
Social name 'TWIGGLE' Enter new.<br>
: <br>
</em><br>
I doubt you would still need to change the name.
You have type one and two. Why make 3 different?<br>
<br>
<em>(No change)<br>
Target=NONE<br>
Change T)arget, S)elf, A)ll, or N)one:<br>
</em><br>
It's the ALL portion of social creation, so choose
"<strong>A</strong>".<br>
<br>
<em>You see 'null'. Enter new.<br>
:<br>
</em><br>
What you would see when you perform TWIGGLE [Target]
(ex: TWIGGLE VIRAX).<br>
<br>
<strong>You wiggle your toes at everyone. How wierd.</strong><br>
<br>
The display would replace the tag with the appropriate
name, and in this example it would be Virax.<br>
<br>
<em>Your action type=MOVEMENT<br>
Change W)ords, M)ovement (small), S)ound, L)arge
Movement<br>
</em><br>
We have toes we'll need to wiggle. <strong>M</strong>)ovement.<br>
<br>
<em>Others see 'null'. Enter new.<br>
:<br>
</em><br>
What those twiggled at people witness.<br>
<br>
<strong><S-NAME> wiggles <S-HIS-HER>
toes at everyone. Very strange.</strong><br>
<br>
<em>Others Effect type=HANDS<br>
Change W)ords, M)ovement (w/noise), S)ound, V)isual,
H)ands:<br>
</em><br>
I'd say another thing they would have to see. Don't
you? <strong>V</strong>)isual.<br>
<br>
<strong><font style="background-color: moccasin;">CREATE SOCIAL TWIGGLE <T-NAME></font><br>
<br>
</strong>Yay! Type 4! The TARGET! <T-NAME>
is the Target Name.<br>
<br>
<em>You wave your arms...<br>
Social name 'TWIGGLE' Enter new.<br>
: <br>
</em><br>
I doubt you would still need to change the name.
You have type one, two, and three. Why make 4 different?<br>
<br>
<em>(No change)<br>
Target=NONE<br>
Change T)arget, S)elf, A)ll, or N)one:<br>
</em><br>
It's the TARGET portion of social creation, so choose
"<strong>T</strong>".<br>
<br>
<em>You see 'null'. Enter new.<br>
:<br>
</em><br>
What you would see when you perform TWIGGLE [Target]
(ex: TWIGGLE VIRAX).<br>
<br>
<strong>You wiggle your toes at <T-NAME>. How
cute.</strong><br>
<br>
The display would replace the tag with the appropriate
name, and in this example it would be Virax.<br>
<br>
<em>Your action type=MOVEMENT<br>
Change W)ords, M)ovement (small), S)ound, L)arge
Movement<br>
</em><br>
We have toes we'll need to wiggle. <strong>M</strong>)ovement.<br>
<br>
<em>Others see 'null'. Enter new.<br>
:<br>
</em><br>
What those bystanders witness.<br>
<br>
<strong><S-NAME> wiggles <S-HIS-HER>
toes at <T-NAME>. Very strange.</strong><br>
<br>
<em>Others Effect type=HANDS<br>
Change W)ords, M)ovement (w/noise), S)ound, V)isual,
H)ands:<br>
</em><br>
I'd say another thing they would have to see. Don't
you? <strong>V</strong>)isual.<br>
<br>
<em>Target sees 'null'. Enter new.<br>
:<br>
</em><br>
If you were the unfortunate victim, this is what
you would see.<br>
<br>
<strong><S-NAME> wiggles <S-HIS-HER>
toes at you.</strong><br>
<br>
<em>Target Effect type=HEARING NOISE<br>
Change W)ords, M)ovement (w/noise), S)ound, V)isual,
H)ands:<br>
</em><br>
You see them wiggling their toes, so this would
also be <strong>V</strong>)isual.<br>
<br>
<em>You see when no target 'null'. Enter new.<br>
:<br>
</em><br>
This is what you would see if the target you want
to use the social against isn't there.<br>
<br>
<strong>Sorry. They aren't here for that lovely toe
wiggle.</strong><br>
<br>
This concludes the social creation process. Enjoy
creating your own socials, folks! To modify an existing social,
purely use MODIFY SOCIAL [NAME] (i.e. MODIFY SOCIAL BONK, MODIFY SOCIAL
HIGHFIVE <T-NAME>) or even MODIFY SOCIAL PAT SELF) What this
does is it goes through the command list like you are creating that
particular social, but with the information that is already stored on
it. What you can do is just hit ENTER until you get to the part of the
social you want to change and change it accordingly.</p>
<p><font style="background-color: moccasin;">======= AND NOW FOR THE LIST
OF TAGS =======</font> <br>
<S-HIS-HER> Outputs 'Your' if Observer=Source,
otherwise 'His'/'Her'. <br>
<S-HIM-HER> Outputs 'You' if Observer=Source,
otherwise 'Him'/'Her'. <br>
<S-NAME> Outputs 'You' if Observer=Source,
otherwise the Name. <br>
<S-NAMESELF> Outputs 'Yourself' if Observer=Source,
otherwise the Name <br>
<S-HE-SHE> Outputs 'You' if Observer=Source,
otherwise 'He'/'She' <br>
<S-SIRMADAM> Outputs 'Sir'/'Madam' <br>
<S-IS-ARE> Outputs 'Are' if Observer=Source,
otherwise 'Is'. <br>
<S-HAS-HAVE> Outputs 'Have' if Observer=Source,
otherwise 'Has'. <br>
<S-YOUPOSS> Outputs 'Your' if Observer=Source,
otherwise the Name`s <br>
<S-HIM-HERSELF> Outputs 'Yourself' if Observer=Source,
otherwise the 'Himself'/'Herself' <br>
<S-HIS-HERSELF> Outputs 'Yourself' if Observer=Source,
otherwise the 'Hisself'/'Herself' <br>
<T-HIS-HER> Outputs 'You' if Observer=Target,
otherwise 'His'/'Her'. <br>
<T-HIM-HER> Outputs 'You' if Observer=Target,
otherwise 'Him'/'Her'. <br>
<T-NAME> Outputs 'You' if Observer=Target,
otherwise the Name. <br>
<T-NAMESELF> Outputs 'Yourself' if Observer=Target,
otherwise the Name <br>
<T-HE-SHE> Outputs 'You' if Observer=Target,
otherwise 'He'/'She' <br>
<T-SIRMADAM> Outputs 'Sir'/'Madam' <br>
<T-IS-ARE> Outputs 'Are' if Observer=Target,
otherwise 'Is'. <br>
<T-HAS-HAVE> Outputs 'Have' if Observer=Target,
otherwise 'Has'. <br>
<T-YOUPOSS> Outputs 'Your' if Observer=Target,
otherwise the Name with an '`s' <br>
<T-HIM-HERSELF> Outputs 'Yourself' if Observer=Source,
otherwise the 'Himself'/'Herself' <br>
<T-HIS-HERSELF> Outputs 'Yourself' if Observer=Source,
otherwise the 'Hisself'/'Herself'</p>
<p class="MsoNormal"><a name="polls"><strong><font color="#008000" size="5">Polls</font></strong></a></p>
<p>Polls can be an entertaining and sometimes amusing way to measure
the thoughts of players. CoffeeMud supports single-selection
voting among options which you can designate. Polls are created
with the CREATE command, reviewed with the LIST command, modified with
the MODIFY command, removed with the DELETE command, and participated
during the login process and/or via the use of the POLL command.</p>
<p><strong>CREATE POLL</strong></p>
<p>This command will create a new blank poll. When a poll is created
or modified, you are presented with a list of properties to fill
in. Pressing enter will leave the property unchanged.
The properties include:</p>
<p>
<table style="width: 100%;" bgcolor="yellow" border="1" cellpadding="1" cellspacing="1" width="100%">
<tbody>
<tr>
<td width="25%"><strong>Property</strong></td>
<td width="75%"><strong>Description</strong></td>
</tr>
<tr>
<td><em>Name</em></td>
<td>the internal name of the poll. This
is just to tell them apart when LISTing your polls.</td>
</tr>
<tr>
<td><em>Introduction</em></td>
<td>the text that is displayed to the user when
they participate in the poll.</td>
</tr>
<tr>
<td><em>Results Header</em></td>
<td>a short line of text to designate the results
for the poll.</td>
</tr>
<tr>
<td><em>Qual Mask</em></td>
<td>a mask to limit the participants in your
poll. This string is similar in functionality to the one
described in the Prop_HaveZapper. Enter HELP Prop_HaveZapper
for information on masking your poll participants.</td>
</tr>
<tr>
<td><em>Poll Active</em></td>
<td>whether the poll is presently available
for participation, or is closed to participation. This
flag is automatically set to false if an expiration date (below)
is used and passes. Normally a poll must be made inactive
before results can be viewed.</td>
</tr>
<tr>
<td><em>Preview Results</em></td>
<td>whether the participant can see the results
immediately after voting, or must wait until the poll is made
inactive.</td>
</tr>
<tr>
<td><em>Allow Abstentions</em></td>
<td>whether participants can abstain from selecting
one of your options by choosing not to vote.</td>
</tr>
<tr>
<td><em>Use IP Addresses</em></td>
<td>whether a single ip address can designate
a vote. Helps prevent multi-playing users from getting
multiple votes.</td>
</tr>
<tr>
<td><em>Hide Results</em></td>
<td>whether anyone other than Archons or those
with the POLLS security flag can ever view the results of this poll.</td>
</tr>
<tr>
<td><em>POLL CMD Only</em></td>
<td>whereas normally one can participate in
a poll either at login, or via the POLL command, this flag will make
it so that the POLL command must be used.</td>
</tr>
<tr>
<td><em>Expiration Date</em></td>
<td>optional field designating the date/time
when the poll will be automatically set to inactive. If this
field is empty or NA, the poll must be made manually inactive using
the MODIFY POLL command.</td>
</tr>
<tr>
<td><em>New Vote Options</em></td>
<td>the list of options the participants may
choose between.</td>
</tr>
</tbody>
</table>
</p>
<br>
<p class="MsoNormal"><a name="clans"><strong><font color="#008000" size="5">Clans</font></strong></a></p>
<p>Clans serve many purposes in the CoffeeMud engine. They provide
a way for multiple players to own property, conquer areas, and exert control.
They also provide a means of expressing politics between themselves
and other groups, or even with each other. Clans can allow ranking
players to order each other around, to create special magical items, to
keep a collective treasury, to collect taxes from other players, and to
override normal PK (playerkill) settings. Clans can be tyrannical,
run by a select few, run by elected members, or run collectively. Clans
can even be used as an alternative means of learning new Classes.<br>
</p>
<p>By default, clans can be created and managed entirely by players. This
ability can be removed by disabling the several clan creation and management
commands from the coffeemud.ini file using the DISABLE= field. Regardless,
there is also an Archon mechanism for creating and managing clans.</p>
<p><strong>CREATE CLAN <clanname></strong></p>
<p>This command will create a clan with the given name. You can then
enter the following commands at any time:<br>
</p>
<p><strong>DESTROY CLAN <clanname> </strong></p>
<p><strong>MODIFY CLAN <clanname></strong></p>
<p>When a clan modified, you are presented with a list of properties to fill
in. Pressing enter will leave the property unchanged.
The properties include:</p>
<table style="width: 100%;" bgcolor="yellow" border="1" cellpadding="1" cellspacing="1" width="100%">
<tbody>
<tr>
<td width="25%"><strong>Property</strong></td>
<td width="75%"><strong>Description</strong></td>
</tr>
<tr>
<td><em>Name</em></td>
<td>the name of the clan can never be changed.
It can only be destroyed. Name your clans carefully!<br>
</td>
</tr>
<tr>
<td><em>Government Type</em></td>
<td>how the players rule the clan -- as a tyranny
(Clan), a oligarchy (Guild), a republic (Union), a theocracy, or a democracy
(Fellowship)<br>
</td>
</tr>
<tr>
<td><em>Clan Premise</em><br>
</td>
<td>a description of the clan for all to read</td>
</tr>
<tr>
<td><em>Clan Experience</em><br>
</td>
<td>the number of experience points the clan
has earned, usually through taxation<br>
</td>
</tr>
<tr>
<td><em>Morgue RoomID</em><br>
</td>
<td>the room ID of the room where the bodies
of the members of the clan appear when they die. This room must be properly
owned by the Clan using a property like Prop_RoomForSale.<br>
</td>
</tr>
<tr>
<td><em>Clan Home RoomID</em></td>
<td>the room ID of the room where the members
of the clan appear when they cast Clan Home spell. This room must
be properly owned by the Clan using a property like Prop_RoomForSale.<br>
</td>
</tr>
<tr>
<td><em>Clan Donation RoomID</em><br>
</td>
<td>the room ID of the room where items appear
when a member of the clan casts the Clan Donate spell. This room must
be properly owned by the Clan using a property like Prop_RoomForSale.</td>
</tr>
<tr>
<td><em>Clan Qualifications</em><br>
</td>
<td>this is a mask describing what sort of people
are allowed to apply and join the clan using the CLANAPPLY command. The
mask is a standard CoffeeMud ZapperMask. You can use ? for a description
at the prompt.<br>
</td>
</tr>
<tr>
<td><em>Clan Auto-Class</em><br>
</td>
<td>the name of a character class which all
players who join the clan also gain for free. Normally not used, this
field can be filled in when the Archon wishes to have clan based classes.<br>
</td>
</tr>
<tr>
<td><em></em>Clan Auto-Role<br>
</td>
<td>the role (rank/position) of the player who
enters the CLANAPPLY command. Normally this is set to Applicant,
meaning that the clan must approve all new members. Setting this
value to something else can override that behavior.<br>
</td>
</tr>
<tr>
<td><em>Clan Status</em><br>
</td>
<td>depending upon your coffeemud.ini settings,
clans can be in a state of pending (awaiting a sufficient number of players
to become active), a state of Active, or a state of Fading (because an insufficient
number of members has logged in lately, again settable in the coffeemud.ini
file). This state is changed automatically by CoffeeMud, but can
be altered here.<br>
</td>
</tr>
<tr>
<td><em>Clan Members</em></td>
<td>the list of all current members and their
position/rank/role within the clan. This list can be altered manually
here.</td>
</tr>
</tbody>
</table>
<p><br>
</p>
<p style="text-align: left;"><strong></strong></p>
<p style="text-align: left;"><strong>
</strong></p>
</td>
</tr>
</tbody>
</table>
</center>
</body>
</html>