Added CircleMUD 3.1 as initial commit

This commit is contained in:
Polonkai Gergely
2012-03-03 21:35:30 +01:00
commit 9e36096953
368 changed files with 132435 additions and 0 deletions

34
doc/OLD-DOCS/README Normal file
View File

@@ -0,0 +1,34 @@
This directory contains documentation on various aspects of the game.
Area builders will be most interested in database.doc, dbsup.doc, defs.doc,
shop.doc, and values.doc. These five files can be mailed automatically
with the "do_mail" script in this directory. do_mail takes the recipient
as its only command-line argument. For example, to mail the documentation
to CircleMUD's author, you'd type "do_mail jelson@cs.jhu.edu".
CONTENTS:
--------
COLOR.DOC - Programmer's manual on how to use color codes
COMM.DOC - The game-to-player communications system, most importantly
the act() procedure
DATABASE.DOC - The format of the most important data files
DBSUP.DOC - Detailed information on each field in database.doc
DEFS.DOC - Important document on what rules should be followed
when creating a part of the world, to avoid complete chaos
HACKER.DOC - Insight into the art & science of programming (courtesy MERC)
HANDLER.DOC - Descriptions of most of the basic 'database handling'
procedures, found in handler.c
LICENSE.DOC - The conditions under which this game is distributed
NOTE: THIS FILE MUST ALWAYS BE PRESENT
RELEASE.DOC - CircleMUD release history
RUNNING.DOC - Directions for compiling, running, and maintaining the game
SHOP.DOC - Describes how to create a shop file
SOCIALS.DOC - Description of the 'social action' system
SPELL_INFO.DOC - Doc on spells, especially how damage is calculated
SPELLS.DOC - Info on the spell/affection system
TIME.DOC - How time is in DikuMud compared to real world
UTILS.DOC - Description of the CircleMUD maintenance utilities
VALUES.DOC - The 4 generic values for items, described in detail
WIZHELP.DOC - Description of all god commands

9
doc/OLD-DOCS/README-DOCS Normal file
View File

@@ -0,0 +1,9 @@
3/6/95
-----
This directory contains the documentation distributed with CircleMUD 2.2.
This directory and all the files in it will eventually disappear. They
are here now to serve as a reference while I write the new documentation.
--JE

31
doc/OLD-DOCS/coding.doc Normal file
View File

@@ -0,0 +1,31 @@
/**************************************************************************
* Copyright (C) 1993 - see 'license.doc' for complete information. *
**************************************************************************/
HOW TO CONVERT YOUR IDEAS INTO REALITY
A CircleMUD Coding Manual
Table of Contents
---------------------------------------------------------------------------
i. Introduction
1. Overview and Coding Basics
1.1. The Way Things Work -- Overview
1.2. CircleMUD's Structures and Lists
1.3. Frequently Used Functions
2. Changing the Code
2.1. Adding Commands
2.2. Adding Socials
2.3. Adding Spells
2.4. Adding Skills
2.5. Writing Special Procedures
2.6. Adding Classes
2.9. Adding Color
3. Changing the World
3.1. Adding Areas
3.2. Removing Areas
3.2. Writing Areas

134
doc/OLD-DOCS/color.doc Normal file
View File

@@ -0,0 +1,134 @@
/**************************************************************************
* Copyright (C) 1993 - see 'license.doc' for complete information. *
**************************************************************************/
USING COLOR IN CIRCLEMUD
"color.doc"
CircleMUD allows you to create colorful messages by using ANSI control
sequences. Each player may select what "level" of color he/she desires
from the four levels "off", "sparse", "normal", and "complete." Each
player can select his/her color level by using the COLOR command from
within the MUD; you as the programmer must decide which messages will be
colored for each of the color levels.
All files in which you wish to use color must have the line:
#include "screen.h"
after all other includes in the beginning of the file.
There are 8 colors available -- "normal", red, green, yellow, blue, magenta,
cyan and white. They are accessible by sending control sequences as part of
another string, for example:
sprintf(buf, "If you're %shappy%s and you know it clap %d of your hands.\n\r",
x, y, num_of_hands);
send_to_char(buf, ch);
In this example, x and y are the "on" and "off" sequences for the color you
want. There are 2 main series of color macros available for you to use
(don't actually use "x" and "y", of course!): the K series and the CC series.
The CC (Conditional Color) series is recommended for most general use.
The name of the actual sequence starts with the name of its series, plus
a 3-letter color code, as follows:
Normal : NRM
Red : RED
Yellow : YEL
Green : GRN
Blue : BLU
Magenta: MAG
Cyan : CYN
White : WHT
For example, white in the K series is KWHT; blue in the CC series
is CCBLU() (arguments defined below).
The K series requires no arguments, and is simply a macro to the ANSI
color code. Therefore, if you use a K-series color code, the color will
ALWAYS be sent, even if the person you're sending it to has color off.
This is very bad -- people who do not have ANSI-compatible terminals
will see garbage characters instead of colors. The K series is mainly
used to print colors to a string if the player's color level will later
be tested manually (for an example, see do_gen_com in act.comm.c).
The recommended series is the CC series (i.e. CCNRM(), CCRED(), etc.)
The CC series macros require two arguments -- a pointer to the character
to whom the string is being sent, and the minimum color level the player
must be set to in order to see the color. Color sent as 'sparse' (C_SPR)
will be seen by people with color set to sparse, normal, or complete;
color sent as 'normal' (C_NRM) will be seen only by people with color
set to normal or complete; color sent as 'complete' (C_CMP) will be seen
only by people with color set to complete.
To illustrate the above, an example is in order:
#include "screen.h" /* include screen.h in all files that you use color in */
ACMD(do_showcolor)
{
char buf[300];
sprintf(buf, "Don't you just love %scolor%s, %scolor%s, %sCOLOR%s!\n\r",
CCBLU(ch, C_CMP), CCNRM(ch, C_CMP),
CCYEL(ch, C_NRM), CCNRM(ch, C_NRM),
CCRED(ch, C_SPR), CCNRM(ch, C_SPR));
send_to_char(buf, ch);
}
What does this do? For people with color set to Complete, it prints:
Don't you just love color, color, COLOR!
(blue) (yellow) (red)
People who have color set to Normal will see:
Don't you just love color, color, COLOR!
(yellow) (red)
People who have color set to Sparse will see:
Don't you just love color, color, COLOR!
(red)
People who have color set to Off will see:
Don't you just love color, color, COLOR!
(no color, as you'd expect)
There are several common pitfalls with using the CC series of color macros:
* Do not confuse CCNRM with C_NRM. CCNRM() is a macro to turn the color
back to normal; C_NRM is a color level of "normal".
* Always make sure that every pair of "on" and "off" codes are at the
same color level. For example:
WRONG: sprintf(buf, "%sCOLOR%s\n\r", CCBLU(ch, C_NRM), CCNRM(ch, C_CMP));
This is wrong because if someone has their color level set to Normal,
the CCBLU code will be sent but the CCNRM command will not, causing all
subsequent output to be blue.
WRONG: sprintf(buf, "%sCOLOR%s\n\r", CCBLU(ch, C_CMP), CCNRM(ch, C_NRM));
The above statement is also wrong, although not as bad. In this case,
someone with color set to Normal will (correctly) not get the CCBLU code,
but will then unnecessarily get the CCNRM code. Never send a color code if
you don't have to -- the codes are several bytes long, and cause a noticable
pause at 2400 baud.
* This should go without saying, but don't ever send color at the C_OFF
level.
* Special precautions must be taken when sending a colored string to a
large group of people -- you can't use the color level of "ch" (the
person sending the string) -- each person receiving the string must
get a string appropriately colored for his/her level. In such cases,
it's usually best to set up two strings (one colored and one not),
and test each player's color level individually (see do_gen_com in
act.comm.c for an example).

146
doc/OLD-DOCS/comm.doc Normal file
View File

@@ -0,0 +1,146 @@
/* ************************************************************************
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
************************************************************************* */
Descriptions of the message-to-character routines of comm.c
void send_to_char(char *messg, struct char_data *ch)
Places messg in the output queue for ch, for later sending.
void send_to_all(char *messg)
Sends a message to all players.
void send_to_except(char *messg, struct char_data *ch)
Sends to all players, except the one pointed to by ch.
void send_to_room(char *messg, int room)
Sends messg to all players in the room.
void send_to_room_except(char *messg, int room, struct char_data *ch)
Send to all in room, with the exception of ch.
The following routine takes the place of all the old perform-routines. It is
to gradually replace these in the old code, and is to be used exclusively in
all additions.
FUNCTION ACT --- Process and send string to characters in a room.
SYNOPSIS
#include "comm.h"
act(string, hide_invisible, ch, obj, vict_obj, type)
char *string; /* the string to send */
int hide_invisible, /* hide the action if vict can't see us? */
type; /* who gets the string */
struct char_data *ch; /* the 'performing' character */
struct obj_data *obj; /* an object */
void *vict_obj; /* an object OR a char OR an ascii string */
DESCRIPTION
This function is used to send a string to one or more characters in a room. The
string may contain certain control characters which are expanded before the
string is sent.
Obj and vict_obj are ignored if no reference is made to them (via CONTROL
CHARACTERS), and if type (see below) is set to TO_ROOM. Thus, null-pointers
may be supplied in this case. Ch should always be defined. If String is a
null-pointer or if string points to a null-character, nothing will be sent.
When the string has been parsed, it is capitalized and a newline is added.
CONTROL CHARACTERS
Each control character is preceded by a '$'.
$n - Write name, short description, or "someone", for ch, depending on
whether ch is a PC, a NPC, or an invisible PC/NPC.
$N - Like $n, except insert the text for vict_obj. NOTE: vict_obj must
point to an object of type struct char_data.
$m - "him", "her", or "it", depending on the gender of ch.
$M - Like $m, for vict_obj. NOTE: vict_obj must be a pointer of type
struct char_data.
$s - "his", "her", or "it", depending on the gender of ch.
$S - Like $s, for vict_obj.
$e - "he", "she", "it", depending on the gender of ch.
$E - Like $e, for vict_obj.
$o - Name or "something" for obj, depending on visibility.
$O - Like $o, for vict_obj. NOTE: vict_obj must be a pointer of type
struct obj_data.
$p - Short description or "something" for obj.
$P - Like $p for vict_obj.
$a - "an" or "a", depending on the first character of obj's name.
$A - Like $a, for vict_obj.
$T - Prints the string pointed to by vict_obj.
$F - Processes the string pointed to by vict_obj with fname() prior to
printing.
$u - Processes the buffer and uppercases the first letter of the previous
word (the word immediately prior to the control code). If there is
no previous word, no action is taken. -- CircleMUD addition (09/18/00)
$U - Processes the buffer and uppercases the first letter of the following
word (the word immediately after to the control code). If there is
no following word, no action is taken. -- CircleMUD addition (09/18/00)
$$ - Print the character '$'.
HIDE_INVISIBLE
If this parameter is nonzero, the action will be hidden to those who are
unable to see ch.
TYPE
This value determines who the string is sent to. It may take one of four
values (the macros are defined in comm.h).
TO_ROOM - Send the string to everybody in the room, except ch.
TO_VICT - Send the string to the character (!) pointed to by vict_obj.
TO_NOTVICT - Send the string to everybody in the room except ch and vict_obj.
TO_CHAR - Send the string to the ch.
EXAMPLES
act("$n smiles happily.", TRUE, ch, 0, 0, TO_ROOM);
(eg: Rainbird smiles happily.)
act("You kiss $M.", FALSE, ch, 0, vict, TO_CHAR);
(eg: You kiss her.)
act("$n gives $p to $N.", TRUE, ch, obj, vict, TO_NOTVICT);
(eg: Dave gives a small sword to the giant.)
act("$n gives you $p.", FALSE, ch, obj, vict, TO_VICT);
(eg: Dave gives you a small sword.)
act("$n puts $p in $s $O.", TRUE, ch, obj1, obj2, TO_ROOM);
(eg: Jones puts a small sword in his sack.)

389
doc/OLD-DOCS/database.doc Normal file
View File

@@ -0,0 +1,389 @@
/* ************************************************************************
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
************************************************************************* */
DATABASE DOCUMENTATION
"database.doc"
1. The world file:
==================
This file contains all the rooms, and is loaded once and for all at
boot-time. It follows the this format:
--------------------------------------------
#<virtual number>
<name>~
<description>~
<zone nr>
<room_flags>
<sector_type>
{<direction fields and extra descriptions>}
'S'
#<virtual number>
.
.
.
#99999
$~
Explanation of fields:
----------------------
<Direction fields> follow this format:
D<exit number>
<general description>~
<keyword list>~
<Door flag> <key number> <to_room>
Extra descriptions
------------------
Format:
'E'
<blank separated keyword list>~
<description>~
-----
NOTE:
All the text fields above may be left blank, but the '~' should always be
there.
On the 'virtual' number:
Since the rooms for this game are expected to be written by several people,
we have made it possible to number the rooms freely. Thus, it is possible to,
say, number the rooms in zone 0 from 0 to 1000, the rooms in zone 1 from 1000
to 2000, and so on. Rooms can then be added to the room file without
upsetting the various references to rooms. In the reset command-tables, as well
as in the exits, references to a given room are made via the virtual number
rather than the array index. At boot-time, these references are substituted
with the actual array indices in order to improve the game-time execution
speed. In such places (ie the special routines for mobs/objs/rooms) where
this substitution cannot take place, a function 'real_room', with prototype
int real_room(int virtual_number)
must be used. This functions performs a binary search on the array of rooms,
looking for a room with a given virtual number. If found, the function
returns the index to this room; if not, the game is halted.
Note: Since a binary search is used, the rooms MUST be sorted (in the
room-file) after their virtual number.
-----------------------------------------------------------------------------
2. Objects and monsters
=======================
The objects and mobiles are stored in two separate files. They are loaded
once at boot-time, and then each time their zone is reset, according to the
information stored in the ZONE-FILE.
The world is split up into a number of zones that are updated independently.
The exact nature of these updates are defined by the contents of the ZONE-FILE.
-----------------------------------------------------------------------------
2.1. The Monster file:
======================
The format of this file is as follows:
#<virtual number>
<namelist>~
<short description>~
<long description>~
<description>~
<action flags> <affection flags> <alignment> <Detailed/Simple flag>
IF <Old/Simple flag> != 'S' {
<strength> <intelligence> <wisdom> <dexterity> <constitution>
<hit low> <hit high> <armour> <mana> <movement> <gold> <exp>
<position> <default> <sex> <class> <level> <age> <weight> <height>
<condition 0> <condition 1> <condition 2>
<savingthrow 0> <savingthrow 1> <savingthrow 2> <savingthrow 3> <savingthrow 4>
} else { /* Simple monsters flag is 'S' */
<Level> <Thac0> <AC> <Hit Points (format is xdy+z)> <Damage (as HP)>
<Gold> <Exp>
<position> <default position> <sex>
}
#<virtual number>
.
.
.
#<virtual number>
$~
-----------------------------------------------------------------------------
2.3. The object file:
=====================
The format is as follows:
#<virtual number>
<namelist>~
<short description>~
<long description>~
<action description>~
<type flag> <extra flag> <wear flag>
<value 0> <value 1> <value 2> <value 3>
<weight> <value> <cost/day>
'E'
<keyword-list>~
<extra description>~
'E'
<keyword-list>~
<extra description>~
.
.
.
'E'
<keyword-list>~
<extra description>~
'A'
<location> <modifier>
.
.
'A'
<location> <modifier>
#<virtual number>
.
.
.
#<virtual number>
'$~'
-----------------------------------------------------------------------------
2.3. The zone-file
==================
The zone-file contains the following information for each zone:
a) The top room-number of the zone. A room belongs to a zone X if:
zone[X-1].top < virtual_room_number <= zone[X]
for X > 0. Rooms belong to zone 0 if their number is between 0 and the
top of zone 0.
b) The LIFESPAN of the zone. When the age of the zone (measured in minutes
after last reset) reaches this number, the zone is queued for reset. The
zone is then reset as soon as possible (more or less), depending on the
value of the RESET_MODE-variable.
c) The RESET_MODE. This may take on of three values:
0: Don't reset the zone at all. In this case, the age of the zone is never
updated, and it will never be queued for reset. Thus, the value of the
lifespan-field is effectively ignored.
1: Reset the zone as soon as it is deserted, ie as soon as there are no
players located within the zone.
2: Reset the zone no matter who or what is in it.
d) The COMMAND TABLE. This is a series of commands to execute at reset. The
table is terminated by the pseudo-command 'S', and thus follows the
following format:
<command>
<command>
.
.
.
<command>
'S'
Each command consists of a letter, identifying the command-type, followed
by three or four arguments. The first argument, common to all the commands,
is called the 'if-flag'. If it is true (nonzero), the command is executed
ONLY if the preceding command was executed. If it is false (zero), the
command is executed anyway.
The commands:
M (load a mobile):
Format: 'M' <if-flag> <mobile nr> <max existing> <room nr>
mobile nr and room nr should be self-explanatory. The 'max
existing' parameter specifies the maximum permissible number of
existing units. In other words: If you only want one manifestation
of a given monster, you just specify the number '1'. If the max
number is about to be exceeded, the command won't be executed.
O (load an object):
Format: 'O' <if-flag> <object nr> <max existing> <room nr>
Load an object and place it in a room. (NOT -1)
G (give object to mobile):
Format: 'G' <if-flag> <object nr> <max existing>
Loads an object, and gives it to the last monster referenced (ie. by the
M-command).
Of course, this command doesn't make sense if a new mobile+object
pair has not just been created, which is where the if-flag comes
in handy. :)
E (object to equipment list of mobile)
Format: 'E' <if-flag> <object nr> <max existing> <equipment position>
Loads object and places it in the Equipment list of the last monster
referenced.
Note that it is NOT necessary to precede this command with a 'G' command.
Equipment position is one of:
WEAR_LIGHT 0
WEAR_FINGER_R 1
WEAR_FINGER_L 2
WEAR_NECK_1 3
WEAR_NECK_2 4
WEAR_BODY 5
WEAR_HEAD 6
WEAR_LEGS 7
WEAR_FEET 8
WEAR_HANDS 9
WEAR_ARMS 10
WEAR_SHIELD 11
WEAR_ABOUT 12
WEAR_WAISTE 13
WEAR_WRIST_R 14
WEAR_WRIST_L 15
WIELD 16
HOLD 17
P (put object in object):
Format: 'P' <if-flag> <object_nr1> <max existing> <object nr2>
Loads object1 and places it in object2.
D (set state of door)
Format: 'D' <if-flag> <room nr> <exit nr> <state>
State being one of:
0: Open.
1: Closed.
2: Closed and locked.
R (remove object from room)
Format: 'R' <if-flag> <room_nr> <object_nr>
More commands will probably be needed, and will be added as required.
Format of the zone-file:
---------------------------------------
#<arbitrary number (ignored)>
<name>~
<top of zone>
<lifespan>
<reset mode>
<command>
<command>
.
.
.
<command>
'S'
#<arbitrary number>
.
.
.
#<arbitrary number>
$~
2.2. The monster file:
----------------------
The format of this file is as follows:
----------------------------------------------
#<virtual number>
<namelist>~
<short description>~
<long description>~
<description>~
<action flags> <affection flags> <Detailed/Simple flag>
IF <Old/Simple flag> != 'S' {
<strength> <intelligence> <wisdom> <dexterity> <constitution>
<hit low> <hit high> <armour> <mana> <movement> <gold> <exp>
<position> <default> <sex> <class> <level> <age> <weight> <height>
<condition 0> <condition 1> <condition 2>
<savingthrow 0> <savingthrow 1> <savingthrow 2> <savingthrow 3> <savingthrow 4>
} else { /* Simple monsters flag should be 'D' */
<Level> <Thac0> <AC> <Hit Points (format is xdy+z)> <Damage (as HP)>
<Gold> <Exp>
<position> <default position> <sex>
}
#<virtual number>
.
.
.
#<virtual number>
$~
----------------------------------------------
On the skill fields:
Format:
--------------
S<skill number>
<learned> <affected by> <duration> <recognize>
--------------
On the virtual numbers:
This number may be considered the 'label' of the mobile, for use in eg. the
zonefile (see also the text about the roomfile format). When the mobile is to
be referenced from within the code itself, the function real_mobile
(real_object for objects) can be used to find indices to the file-index tables
(this is only of use when writing special routines). These functions are
automatically called from read_object/read_mobile, depending on their 'type'
parameter (see db.doc).

600
doc/OLD-DOCS/dbsup.doc Normal file
View File

@@ -0,0 +1,600 @@
/* ************************************************************************
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
************************************************************************* */
DATABASE SUPPLEMENTAL DOCUMENTATION
"dbsup.doc"
World File field description:
=============================
Main structure notes:
---------------------
#<virtual number> is:
A number for the given room. No two rooms may have the same number.
The <virtual number> must always increase when browsing down the
world file (but increments can be larger than one).
<name>~<NL>:
This name is the "title" of the room. This title is also used in special
procedures like:
"exits"
"brief mode"
<description>~<NL>:
This is the general description of the room.
<zone nr> is:
The number of the zone in which this room is located. This number is used
for resetting zones and monster zone movement. See the zone file.
<room_flags> are:
A bitvector consisting of the room conditions as:
DARK 1 Light must be used to see anything.
DEATH 2 A player 'dies' (no xp lost) when entering.
It is a good idea to:
*Have these rooms light, because then EXITS will show
the room title, for example "In Boiling Water".
*Make exits to all rooms from which one can enter the
death_room, then the "death cry" will be heard by
other members of the group considering following...
NO_MOB 4 No monsters may walk around in here
INDOORS 8 This is inside (a house,cave or dungeon for example)
LAWFULL 16 ???
NEUTRAL 32 ???
CHAOTIC 64 ???
NO_MAGIC 128 Not implemented.
TUNNEL 256 ???
PRIVATE 512 It is impossible to teleport to this room if it
already contains two characters. The 'teleport'
spell will never teleport a player into this room.
GODROOM 1024 Super-private room: Immortals can not 'goto' this room.
BFS_MARK 2048 RESERVED FOR INTERNAL USE -- do not use.
??? means that the flag isn't used yet (and you Shouldn't use it either!)
<sector_type> is:
This determines how many movement points are used when moving through
a location of the type - use one of the numbers 0..7 (they are NOT the
movement-points used - merely indexes to a lookup-table):
SECT_INSIDE 0 Uses as if walking indoors
SECT_CITY 1 Uses as if walking in a city
SECT_FIELD 2 Uses as if walking in a field
SECT_FOREST 3 Uses as if walking in a forest
SECT_HILLS 4 Uses as if walking in hills
SECT_MOUNTAIN 5 Uses as if climbing in mountains
SECT_WATER_SWIM 6 Uses as if swimming
SECT_WATER_NOSWIM 7 Impossible to swim water - requires a boat
Direction fields:
-----------------
<Exit number> is one of:
0 = North
1 = East
2 = South
3 = West
4 = Up
5 = Down
<general description><NL>~<NL>:
What a player will see if he types 'look <direction>'
<keyword list>~<NL>:
used for commands like 'open', 'close', etc. should be 'door' for ordinary
doors. Example: An exit from a given room leads through a cupboard. The
keyword list for this exit might look like this:
"cupboard door~"
<Door flag> [NL]:
If <Door Flag> is 1, the exit can be locked/unlocked/opened/closed/picked.
If it is 2, the exit can only be locked/unlocked/opened/closed.
If it is 0, these commands won't work. (The exit can still be closed at
reset, however; maybe to be opened by some special routine, like a concealed
handle).
The state of the doors after reset may be controlled by a command in the
reset-command table (see the zone file). The initial state of a door is
open.
<Key Number> [NL]:
The number of the object which can unlock/lock the door (in the direction
given). If a player carries/holds this object, he can lock/unlock.
<Key Number> == -1 means no keyhole. If <Door flag> is 0, the value of this
field is ignored.
<to_room> <NL>:
The virtual number of the room to which the exit leads. If this number is
-1 (NOWHERE), the exit doesn't lead anywhere. This might be useful for
adding an exit-description in a direction which doesn't actually lead
anywhere.
** Note about doors. You must make a door in both rooms that the door
is set between.
Extra descriptions:
-------------------
<blank separated keyword list>~<NL> is:
A list of the keywords that will allow the extra description to be
displayed. The keywords must must be seperated by blanks.
<description><NL>~<NL>:
The description that is show when a player types 'look at <keyword>'
and keyword matches one of the above.
Example of a room entry is the database:
----------------------------------------
#100
The Lego temple~
You stand in a tiny, red temple built entirely from Lego bricks. It is,
sadly, not a very interesting place, and perhaps you should leave through
the portal which leads south to a sunny garden.
~
1 12 0
D2
You see the grand portal of the Lego church. Beyond is an inviting garden.
~
portal grand~
1 2 107
E
portal~
The portal is high and arched, built out of lego bricks of the finest quality.
~
E
brick~
The bricks are all in bright different colours.
~
S
#101
.
.
.
Facts about this room is:
Room number 100
Zone number 1
Room Flags (8+4=12) INDOORS and NO_MOB
Sector Type Inside (movement loss calc only)
One exit (D2) to the south with 'look south' description
Door Flag 1
Key no. 2
Leads to room 107
Extra description for the portal and bricks.
-------------------------------------------------------------------------
Monster fields description:
===========================
#<virtual number><NL> is:
The monsters virtual number. Rules are same as for room virtual numbers.
<namelist><!NL>~<NL>
The space-separated name alias list.
<short description><!NL>~<NL>
This string will be displayed when the monster take action, for example
if it is "The Beastly Fido", and fido leaves south the message will be
"The Beastly Fido leaves south."
<long description><NL>~<NL>
This description is displayed when the monster is in it's "default"
position. When not in the default position, a message like:
"<short description> is sleeping here." could be displayed.
<description><NL>~<NL>
This will be displayed when a player looks at the monster.
<action flags>[NL]
This bitvector define how the monster behave. The bits mean:
ACT_SPEC 1 This means that there is a special programmed C
procedure connected to the monster. When this bit
is set the monster "function pointer" must be
assigned in the "spec_assign.c" file.
ACT_SENTINEL 2 When this bit is set the monster will NOT
move around in the world.
ACT_SCAVENGER 4 When this bit is set, monsters will pick up stuff
lying on the ground. It will pick up the most
expensive items first.
ACT_ISNPC 8 RESERVED FOR INTERNAL USE
ACT_NICE_THIEF 16 When this bit is set, a monster will not attack
a thief which has been caught in the act of
stealing from this monster.
ACT_AGGRESSIVE 32 When this bit is set, the monster will attack and
attempt to kill any player it can get it's claws on.
It will not attack players it can't see (for example
dark rooms or when player is invisible, unless the
monster can detect invisibility)
ACT_STAY_ZONE 64 When this bit is set, the monster will never move
into another zone of the world (this is good for
keeping your monsters in your own adventure).
ACT_WIMPY 128 When this bit is set, the monster will flee when it's
getting percentwise low on hitpoints.
If the monster is both aggressive and wimpy, then it
will only attack players that are NOT awake! (ie. also
suffering players).
ACT_AGGRESSIVE_EVIL
256 When this bit is set, the monster will attack players
with evil alignment.
ACT_AGGRESSIVE_GOOD
512 When this bit is set, the monster will attack players
with good alignment.
ACT_AGGRESSIVE_NEUTRAL
1024 When this bit is set, the monster will attack players
who are neutrally aligned.
ACT_MEMORY 2056 When this bit is set, the monster will remember
players who attack it, and attack the player back
if it sees him or her again.
<affection flags>[NL]
This is a bitvector that indicates what the monster is affected by.
Puff could for example be able to "detect invisible" or maybe
"sanctuary" (1/2 damage). A lot of these bits are meant for players
only (in a context with a spell), and should NOT be used when indicated.
The bits are:
AFF_BLIND 1 RESERVED PLAYERS
AFF_INVISIBLE 2 The monster is invisible
AFF_DETECT_EVIL 4 RESERVED PLAYERS
AFF_DETECT_INVISIBLE 8 The monster can see invisible players
(Especially good for aggressive npc's)
AFF_DETECT_MAGIC 16 RESERVED PLAYERS
AFF_SENCE_LIFE 32 RESERVED PLAYERS
AFF_HOLD 64 ??? DO NOT USE
AFF_SANCTUARY 128 The monster has sanctuary (1/2 damage)
AFF_GROUP 256 RESERVED PLAYERS
AFF_CURSE 1024 ??? DO NOT USE
AFF_FLAMING 2048 ??? DO NOT USE
AFF_POISON 4096 RESERVED PLAYERS
AFF_PROTECT_EVIL 8192 ??? DO NOT USE
AFF_PARALYSIS 16384 ??? DO NOT USE
AFF_MORDEN_SWORD 32768 ??? DO NOT USE
AFF_FLAMING_SWORD 65536 ??? DO NOT USE
AFF_SLEEP 131072 RESERVED PLAYERS
AFF_DODGE 262144 ??? DO NOT USE
AFF_SNEAK 524288 The message "The xxx leaves direction" will
not be displayed when the monster moves
out/in to a room.
AFF_HIDE 1048576 The monster will be hidden, and can only
be detected by a "sense life" spell
AFF_FEAR 2097152 ??? DO NOT USE
AFF_CHARM 4194304 The monster will act as charmed when a
"follow <player>" is entered. Note that
players can't force monsters to follow
them.
AFF_FOLLOW 8388608 RESERVED PLAYERS
AFF_WIMPY 16777216 RESERVED PLAYERS
AFF_INFRARED 33554432 Allows monsters to see in the dark.
<Alignment Flag>[NL]
This is the monsters alignment, read as:
+1000 .. +350 Good Alignment
+349 .. -349 Neutral Alignment
-350 ..-1000 Evil Alignment
<Detailed/Simple flag><NL>
This flag must be entered as a uppercase "S". S indicates that "Simple"
monster data follow. Anything but an S will be interpreted as if
"Detailed" monster data is to follow. We will NOT describe detailed
monsters as they are VERY detailed.
<Level>
This is the level of the monster. See "defs.doc" for guidelines when
setting the level.
<THAC0>
The monsters THAC0.
See the file "defs.doc" for an explanation of armour vs. THAC0, and
guidelines for THAC0.
THAC0 is an abbrevation for "To Hit Armour Class Zero".
<AC>
The monsters armour class. See "defs.doc" for guidelines regarding
armour.
<Hit Points (format is xdy+z)>
This defines the number of hitpoints a given monster has. If this is
entered into the file:
... ... 3d8+10 ...
the monster will have 10 hitpoints plus the result of rolling 3 dice
with 8 side, and adding their sum. All the numbers (even zero), the
plus sign, and the letter 'd' MUST be entered!!! Example:
..... 1d6+0 ....
<Damage (as HP)><NL>
This is the damage a monster will cause when it is using NO weapons
(the Bare hand damage). The format is exacly like the one described
for hit points. A thing to note about damage:
The number after the plus sign, is the "strength bonus". This bonus
will apply to any weapons used, and bare hands too. Example:
..... 1d4+10
This monster will damage between 11 and 14 hitpoints each round. If the
monster picks up and wields a tiny stick which give 1d2 damage, then the
monster will now damage by : 1d2 + 10 points.
<Gold>
The amout of gold carried by the monster.
<Exp><NL>
The experience this monster has. Follow guidelines in "defs.doc".
<position>
This defines the monster's position when loaded into the game.
A position is one of:
POSITION_DEAD 0 DO NOT USE
POSITION_MORTALLYW 1 DO NOT USE
POSITION_INCAP 2 DO NOT USE
POSITION_STUNNED 3 DO NOT USE
POSITION_SLEEPING 4 The monster is sleeping.
POSITION_RESTING 5 The monster is resting.
POSITION_SITTING 6 The monster is sitting.
POSITION_FIGHTING 7 DO NOT USE.
POSITION_STANDING 8 The monster is standing.
<default position>
This is the position into which the monster will return after
a fight. This position also defines when the <long description>
is displayed - see above.
<sex><NL>
This is the monsters sex, on of:
SEX_NEUTRAL 0
SEX_MALE 1
SEX_FEMALE 2
No further explanation is needed (hopefully).
Object fields description:
==========================
#<virtual number><NL>
See rules for rooms above.
<namelist>~<NL>:
Same as for monsters above.
<short description>~<NL>
This string will be displayed when the object is used. For example
if it is "a rubber raft", and a player drops it, then a message like:
"Monthy drops a rubber raft."
could be displayed.
<long description>~<NL>
This description is displayed when the object is lying on the ground.
For example, if it is "A furled umbrella lies here.~" then this message
is displayed when the umbrella is lying on the ground.
<action description>~<NL>
Do not use.
<type flag>[NL]
This defines what kind of item you are defining, it can be one of:
ITEM_LIGHT 1 Item is a light.
ITEM_SCROLL 2 Not yet implemented
ITEM_WAND 3 Not yet implemented
ITEM_STAFF 4 Not yet implemented
ITEM_WEAPON 5 Item is a weapon
ITEM_FIREWEAPON 6 Not yet implemented
ITEM_MISSILE 7 Not yet implemented
ITEM_TREASURE 8 Item is a treasure (not money)
ITEM_ARMOR 9 Item is armour.
ITEM_POTION 10 Not yet implemented
ITEM_WORN 11 ???
ITEM_OTHER 12 Item is other
ITEM_TRASH 13 Item is trash
ITEM_TRAP 14 Not yet implemented
ITEM_CONTAINER 15 Item is a container
ITEM_NOTE 16 Item is a note that can be written upon (with a pen)
ITEM_DRINKCON 17 Item is a drink container, for example a bottle or
a barrel or a wine-skin.
A drinkcontainer whit contents must *always* have
two names: 1. The name of the drink, 2. the name
of the container, example:
tea cup~
ITEM_KEY 18 Item is a key
ITEM_FOOD 19 Item is food.
ITEM_MONEY 20 Item is money.
ITEM_PEN 21 Item is a pen.
ITEM_BOAT 22 Item is a boat, which must be carried by a player if
the player wishes to enter NOSWIM room sector types.
ITEM_FOUNTAIN 23 Item is a fountain (characters can drink from it
without having it in inventory).
<extra flag>[NL]
This bitvector defines mostly special effects:
ITEM_GLOW 1 The item is glowing.
ITEM_HUM 2 The item is "humming"/"buzzing".
ITEM_DARK 4 ???
ITEM_LOCK 8 ???
ITEM_EVIL 16 ???
ITEM_INVISIBLE 32 Item is invisible.
ITEM_MAGIC 64 Item will show a magical aura when 'detect magic'
is used.
ITEM_NODROP 128 Item can not be dropped (cursed for example)
ITEM_BLESS 256 Item is blessed.
ITEM_ANTI_GOOD 512 Item not usable by good people
ITEM_ANTI_EVIL 1024 Item not usable by evil people
ITEM_ANTI_NEUTRAL 2048 Item not usable by neutral people
ITEM_NORENT 4096 Players can not rent item
ITEM_NODONATE 8192 Players can not donate item
ITEM_NOINVIS 16384 Player can not make item invisible
<wear flag><NL>
This bitvector defines if items can be taken, and if they can be worn:
ITEM_TAKE 1 Item is takeable.
ITEM_WEAR_FINGER 2 Can be worn on a finger (rings usually)
ITEM_WEAR_NECK 4 Can be worn around neck.
ITEM_WEAR_BODY 8 Can be worn on body.
ITEM_WEAR_HEAD 16 Can be worn on head.
ITEM_WEAR_LEGS 32 Can be worn on legs.
ITEM_WEAR_FEET 64 Can be worn on feet
ITEM_WEAR_HANDS 128 Can be worn on hands (gauntlets, etc)
ITEM_WEAR_ARMS 256 Can be worn on arms.
ITEM_WEAR_SHIELD 512 Can be used as a shield.
ITEM_WEAR_ABOUT 1024 ???
ITEM_WEAR_WAISTE 2048 Can be worn around the waiste (belt)
ITEM_WEAR_WRIST 4096 Can be worn on wrist (bracelets)
ITEM_WIELD 8192 Can be wielded and used as a weapon
ITEM_HOLD 16384 Item can be held in a hand.
ITEM_THROW 32768 Not yet implemented.
Item can be thrown.
<value 0> <value 1> <value 2> <value 3> <NL>
These values are very central. They define the ability of items based on
the items <Item Type>. These values are defined in "values.doc". Note that
if you define an item as being anything but a weapon, you shouldn't set
the 'wield' flag. Many similar obvious rules apply. Example of 4 values:
If the <Item Type> == ITEM_CONTAINER then the values are interpeted as:
Value[0]: Maximum weight the container can contain.
Value[1]: Container flags:
CLOSEABLE - 1
PICKPROOF - 2
CLOSED - 4
LOCKED - 8
Value[2]: The item-number of the object which can open the object.
-1 means no lockability.
Value[3]: Internal use for Corpses that must "rot".
<weight>[NL]
The weight of the item in pounds.
<value>[NL]
The value of the item if sold - see "defs.doc" for ideas on prices.
<cost/day><NL>
The cost to store the item in the reception overnight.
Several extra descriptions or none at all may appear. They follow the room
format exactly.
'E'<NL>
<keyword-list>~<NL>
Exactly as in rooms.
<extra description><NL>~<NL>
Exactly as in rooms.
Between zero and two "affect's" may be set on an item. The affects could
for example modify a characters strength, height etc. The affect only goes
into affect when the character wear, wield or hold the item. The affect
is removed when the character removes the items.
'A'<NL>
When items are worn using wear/wield/grab/hold commands, the 'A' will
allow the items to affect a characters various abilities. Currently
a maximum of 2 'A' are allowed.
<location>[NL]
<location> is one of the below numbers, indicating which ability
will be changed.
APPLY_NONE 0 DO NOT USE.
APPLY_STR 1
APPLY_DEX 2
APPLY_INT 3
APPLY_WIS 4
APPLY_CON 5
APPLY_SEX 6 DO NOT USE.
APPLY_CLASS 7 DO NOT USE.
APPLY_LEVEL 8 DO NOT USE.
APPLY_AGE 9
APPLY_CHAR_WEIGHT 10
APPLY_CHAR_HEIGHT 11
APPLY_MANA 12 DO NOT USE.
APPLY_HIT 13 The MAXIMUM number of hitpoints.
APPLY_MOVE 14 DO NOT USE.
APPLY_GOLD 15 DO NOT USE.
APPLY_EXP 16 DO NOT USE.
APPLY_AC 17
APPLY_ARMOR 17 Same as APPLY_AC
APPLY_HITROLL 18 The bonus/penalty to hit the opponent.
APPLY_DAMROLL 19 The bouns/penalty to damage the opponent.
APPLY_SAVING_PARA 20 These five are saving throws.
APPLY_SAVING_ROD 21
APPLY_SAVING_PETRI 22
APPLY_SAVING_BREATH 23
APPLY_SAVING_SPELL 24 This is the most used saving throw.
<modifier><NL>
The modifier is added to the APPLY_XXX ability of the character
when he uses an item, and is subtracted when he stops using it.
Take great care when using this. This is an example of an item of
improve strength and armour class. Example:
A
1 2
A
17 -2
This adds +2 to the strength, and adds -2 to the AC (thus improving it).
No more 'A'ffects is allowed at this time.
-------------------------------------------------------------------------
Abbrevations:
=============
<contents> indicates that the contents MUST be entered.
[contents] indicates that the contents can OPTIONALLY be entered.
<NL> is Newline (return)
! This indicates "NOT" - for example <!NL> means NO newline (i.e. it is
forbidden to use newline here).

373
doc/OLD-DOCS/defs.doc Normal file
View File

@@ -0,0 +1,373 @@
/* ************************************************************************
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
************************************************************************* */
DIKUMUD DEFINITIONS AND STANDARDS TO OBEY
"defs.doc"
PC's ~ Players
NPC's ~ Non Players (Monsters)
<name> is used for short names
[x..y] is used to indicate min and max
PC's level [0..20], level [21..24] is special, not useable in gameplay.
NPC's level [0..30]
All PC's and NPC's have following abilities <ABIL>:
Strength <STR>
<PC> [3..18/100]
<NPC> [0..25]
Dexterity <DEX>
<PC> [3..18]
<NPC> [0..25]
Intelligence <INT>
<PC> [3..18]
<NPC> [0..25]
Wisdom <WIS>
<PC> [3..18]
<NPC> [0..25]
Constitution <CON>
<PC> [3..18]
<NPC> [0..25]
All PC's must select one of four classes :
Magic User <MU>
Cleric <CL>
Thief <TH>
Warrior <WA>
Every PC class have a Primary ability (requisite) <PR> :
<MU> <INT>
<CL> <WIS>
<TH> <DEX>
<WA> <STR>
When creating a new <PC>, the <PC>'s <ABIL> are calculated as:
NOTE: This is when being raised from level 0 to level 1!
The size of the <ABIL> dice, is determined by rolling 4 1d6 dice,
and adding the sum of the three largest dice.
The <ABIL> is sorted and assigned a <PC> in descending order,
depending on the class.
<MU> == <INT> <WIS> <DEX> <STR> <CON>
<CL> == <WIS> <INT> <STR> <DEX> <CON>
<TH> == <DEX> <STR> <CON> <INT> <WIS>
<WA> == <STR> <DEX> <CON> <WIS> <INT>
<HP> base is set as 10
<MANA> is allways set to 100
Set level as 1
Set exp as 1
Set theives abilities as basic.
Call the "Advance Level" routines!
Hitpoints:
<HP> ~ Hitpoints
<PC>'s gain in the following range when advancing a level.
<WA> [10..15] Average (12.5)
<TH> [7..13] Average (10.0)
<CL> [5..10] Average (7.5)
<MA> [3..8] Average (5.5)
Advancing a level (<PC>'s only):
<HP> is gained as above
"Spells to learn" is increased by
MIN(1, WIS_APPLY) for <WA> & <TH>
else
MIN(2, WIS_APPLY) for <MU> & <CL>
<NPC> <ABIL> follow <PC>'s <ABIL> up to level 20, with the
exception that NPC may have 0 in abilities. Only unusual
<NPC>'s are assigned abilities.
<PR> may be in 18/00..100 for Warriors ONLY!
============================= MONSTER LOOKUP ==============================
This is general guidelines for creating monsters. This is when creating
"S"impel monsters. Detailed monsters require a great deal of care when
designing, and it is not really worth it.
The idea is that a X level fighter is equal to about a X level monster!
This implies that the <THAC0> ought to decrease by one every level
(starting at '20' on level 1 - minimum is '1' from level 20+). The damage
given by a monster is also important - average weapon damage is at the
moment 1d8.
Level AVERAGE AVERAGE SUGGESTED SUGGESTED SUGGESTED
<HP> <EXP> <THAC0> <AC> <DAM>
0 [001..010] [25] 20 10 1d4+0 (2.5)
1 [011..022] [100] 20 9 1d5+0 (3.0)
2 [023..035] [200] 19 8 1d6+0 (3.5)
3 [036..047] [350] 18 7 1d7+0 (4.0)
4 [048..060] [600] 17 6 1d8+0 (4.5)
5 [061..072] [900] 16 5 2d4+0 (5.0)
6 [073..085] [1500] 15 4 1d8+1 (5.5)
7 [086..097] [2250] 14 4 2d4+1 (6.0)
8 [098..110] [3750] 13 3 2d5+1 (7.0)
9 [111..122] [6000] 12 3 2d5+1 (7.0)
10 [123..135] [9000] 11 2 2d6+1 (8.0)
11 [136..147] [11000] 10 2 2d6+1 (8.0)
12 [148..160] [13000] 9 2 2d7+1 (9.0)
13 [161..172] [16000] 8 2 2d7+1 (9.0)
14 [173..185] [18000] 7 1 2d8+1 (10.0)
15 [186..197] [21000] 6 1 2d8+2 (11.0)
16 [198..210] [24000] 5 1 2d8+2 (11.0)
17 [211..222] [28000] 4 1 3d6+2 (12.5)
18 [223..235] [30000] 3 0 3d6+2 (12.5)
19 [236..247] [35000] 2 0 3d6+3 (13.5)
20 [248..260] [40000] 1 0 3d6+4 (14.5) /* Minor Demons */
Above level 20 is for NPC's only
21 [261..350] [50000] 0 -1 3d7+4 (16.0)
22 [351..400] [60000] 0 -1 3d8+4 (17.5)
23 [401..450] [80000] 0 -2 3d8+4 (17.5) /* Shopkeepers, Important Guards */
24 [451..500] [100000] 0 -3 3d8+4 (17.5) /* Guildmasters */
25 [501..550] [130000] 0 -4 4d6+4 (18.0)
26 [551..600] [155000] 0 -6 4d6+4 (18.0) /* Major Demons/ Devils */
27 [601..650] [200000] 0 -7 4d6+4 (18.0) /* Demi Gods */
28 [651..700] [310000] 0 -8 4d6+5 (19.0) /* Lesser Gods */
29 [701..900] [450000] 0 -9 4d7+5 (21.0) /* Demon Lords/Arch Devils */
30 [901..1000] [600000] 0 -10 4d8+5 (23.0)/* Greater Gods */
------------------------------ GUIDELINES ---------------------------------
MAGICAL ITEMS:
--------------
In DikuMud it is possible to create all kinds of Magic items - but to avoid
chaos (having 1st levels kill 20 level dragons) these rules for Magic must
be obeyed.
It is possible to create almost any item. Items can (example) change the
<STR>, <DEX>, <WIS>, <INT>, <CON>, <HP>, Age, Weight, Height, XP,
etc. None of these changes are directly permanent in effetct, but may be
so indirectly - example:
Iggy found a helmet of Increase Wisdom/Intelligence (some + modifier).
When Iggy wears this helmet - these abilities improve, when he removes
the helmet they return to their original state. Thus no direct change
has happened. BUT if Iggy practices spells (upon which INT and WIS
determines the rate & success) he will learn them much faster than
normal. This was an example of an indirect change.
Good ideas when making Magic Items:
NEVER use large modifiers, exceptional items should modify at most by +3.
This includes, swords, armours, ability changes.
Impose a penalty on the Item - for example make a helmet of wisdom may
at the same time reduce the constitution. Or maybe a ring of masochism -
when you wear it your MAX-HITPOINT increase by +200, when you remove it
they disappear again. The ring likes to remove itself from the finger.
============================================================================
MONSTER CLASSIFICATIONS:
------------------------
Major Demon == Balrog/etc.
Demon Lords == Orcus/etc.
Demi Gods == ??
Lesser Gods == Heimdal/Sif/etc.
Greater Gods == Thor/Odin/etc.
Arch Devil == Asmodeus/etc.
When creating monsters pay attention to the table above.
Example of Monsters:
--------------------
============================================================================
--------------------------------------------
CHARACTER & MONSTER ARMOR:
<AC> range from [10..-10] this is what it means :
AC 10 = Naked person
AC 0 = Very heavily armoured person (Full plate mail at *all* body parts)
AC -10 = Armored Tank (Hopefully impossible for players)
--------------------------------------------
Percentwise Coverage of Armour
and allowed AC range
Location Protects Range
-------- -------- -----
Body 30% [1..10]
Head 20% [1..10]
Legs 20% [1..10]
Feet 10% [1..10]
Arms 10% [1..10]
Hands 10% [1..10]
Shield 10% [1..10]
Magic 10% [1..10]
--------------------------------------------
PRICE GUIDELINES
AC BODY LEGS HEAD ARMS FEET ARMOUR
---- ---- ---- ---- ---- ---- ------
+1 100 50 50 25 25 Cloth (Heavy)
+2 200 100 100 50 50 Soft Leather
+3 500 150 150 75 75 Studded Leather
+4 1,000 500 500 250 250 Scale Mail
+5 2,500 1,250 1,250 625 625 Chain Mail
+6 7,000 3,500 3,500 1,750 1,750 Bronze Plate Mail
+7 18,000 9,000 9,000 4,500 4,500 Plate Mail
+8 35,000 17,500 17,500 8,750 8,750 Field Plate Mail
+9 50,000 25,000 25,000 12,500 12,500 Full Plate
+10 75,000 37,500 37,500 18,750 18,750 Anti Bomb ShieldPlate
*Hands and shields should be regarded as arms.
--------------------------------------------
IMPORTANT NOTICE
Rare items may only exist in minimal quantities!
Especially you should limit the occurence of
magical protection, since it is easy to carry.
============================================================================
Weapons & Carrying capacity
---------------------------
The weight of a weapon determines the strength needed to wield the weapon,
these values should be used:
STR Max. Weapon Weight Carrying capacity
--- ------------------ -----------------
0 0 0
1 1 3
2 2 3
3 3 10
4 4 25
5 5 55
6 6 80
7 7 90
8 8 100
9 9 100
10 10 115
11 11 115
12 12 140
13 13 140
14 14 170
15 15 170
16 16 195
17 18 220
18 20 255
18/01..50 22 280
18/51..75 24 305
18/76..90 26 330
18/91..99 28 380
18/100 30 480
Strength above 18/100 is only used by NPC's - not used by players.
No weapon may ever exceed 30 pounds in weight.
There are three kind of weapons :
(P)iercing
(S)lashing (Not useable by Clerics)
(B)ludgeoning
Backstabbing is only possible with piercing weapons.
No weapon may ever exceed 4d6 damage (as total of magic bouns too)!
(4d6 is 14 damage as average since 4*((1+6)/2)==14)
No weapon may ever exceed 30 pounds in weight.
No shop-produced weapon may exceed 2d8 in total damage or weigh more
than 20 pounds.
Read notes regarding Magic before making a monster-slayer +50 +70
with +800 to strength
PRIMARY BUYABLE WEAPONS <PBW>:
Name Damage Type Cost Weight Cost_pr_day
--------------- ----- ---- ---- ------ -----------
Dagger 1d4 P 10 1 Cost/3
Small sword 1d6 P 60 3 Cost/3
Long sword 1d8 S 600 8 Cost/3
Wooden Club 1d3 B 12 3 Cost/3
War hammer 1d5 B 50 6 Cost/3
===========================================================================
Notes:
<THAC0> this is the number needed to roll on a 20-sided dice to hit
opponent <AC> equivalent of zero. A 20 is always considered
a hit, a 1 is always a miss. Example:
Your <THAC0> is 14 (ei. level 7 fighter). You are fighting
an opponent with <AC> '3'. Thus to hit <AC> 0 you must
roll a 14 or greater. To hit <AC> 3 you must then roll
11 (14-3) or greater. If you had to hit <AC> '-3' you
would have to roll 17 (14-(-3)) or greater on a 20 sided
dice.

6
doc/OLD-DOCS/do_mail Executable file
View File

@@ -0,0 +1,6 @@
mail -s "CircleMUD World Builders' Documentation (1/5)" $1 < database.doc
mail -s "CircleMUD World Builders' Documentation (2/5)" $1 < dbsup.doc
mail -s "CircleMUD World Builders' Documentation (3/5)" $1 < defs.doc
mail -s "CircleMUD World Builders' Documentation (4/5)" $1 < shop.doc
mail -s "CircleMUD World Builders' Documentation (5/5)" $1 < values.doc

117
doc/OLD-DOCS/files.doc Normal file
View File

@@ -0,0 +1,117 @@
/**************************************************************************
* Copyright (C) 1993 - see 'license.doc' for complete information. *
**************************************************************************/
CircleMUD File Manifest
The main circle directory has the following subdirectories and files:
README - Information for the new CircleMudder
automaint - shell script to perform maintenance .. see running.doc
autorun - shell script to run the MUD .. see running.doc
bin/ - directory of all the compiled programs (binaries)
doc/ - documentation
lib/ - MUD data (playerfile, world files, etc.)
log/ - system logs
src/ - source code
syslog - the current system log
The bin/ directory contains only binaries: 'circle' (the main MUD) and
its utilities, which are described in utils.doc.
The doc/ directory has its own README file, describing the contents of
each of the documentation files.
The lib/ directory contains the following subdirectories:
etc - Files which the MUD uses internally (playerfile, mail, etc.)
misc - Misc. database files meant to be changed (i.e. socials)
plrobjs - Player object hierarchy and utility scripts
text - Text files such as MOTD, news, help, etc.
world - The world hierarchy
The lib/etc directory contains the following files (the MUD actively maintains
these files while it is running; they should not be modified unless the game
is down):
Board.* - Binary files with the contents of the bulletin boards
badsites - List of banned sites
hcontrol - Binary file with the state of the house control system
players - Binary file containing data on all players
plrmail - Binary file containing player mail
The lib/misc directory contains the following files:
bugs - Bugs reported by players with the 'bug' command
ideas - Ideas from players from 'idea' command
messages - Spell and skill damage messages
socials - Text file with text of the socials
typos - Typos reported by players with the 'typo' command
xnames - Text file of invalid names
The lib/plrobjs contains the following files and directories:
a-e \
f-j \
k-o \ Subdirectories where player objects files are stored
p-t /
u-z /
zzz/
purgedir - Script to purge an object dir (meant for use by purgeobjs)
purgeobjs - Script to purge player objects (see utils.doc)
searchfor - Script to search for objects in obj files (see utils.doc)
The lib/text directory contains the following files:
background - Background story (for option 3 from main menu)
credits - Text for 'credits' command
handbook - Text for Immortal Handbook ('handbook' command)
help - Text for 'help' command with no arguments
help_table - File of all help entries for 'help' command
immlist - Text for 'immlist' command
imotd - Immortal MOTD -- seen by immortals on login
info - Text for 'info' command
motd - MOTD -- seen by mortals on login
news - Text for 'news' command
policies - Text for 'policy' command
wizlist - Text for 'wizlist' command
The lib/world directory contains the following subdirectories:
mob - Contains *.mob files (mobile files)
obj - Contains *.obj files (object files)
shp - Contains *.shp files (shop files)
wld - Contains *.wld files (world files)
zon - Contains *.zon files (zone files)
Each of the 5 subdirectories in the lib/world directory also contains
two additional files -- one called 'index', which specifies which files
in that directory should be loaded when the MUD boots, and 'index.mini',
which specifies which files should be loaded if the MUD is booted with
the -m (mini-mud) option.
The log/ directory contains several files of the form syslog.n, where n
is a small number. These are the most recent CircleMUD syslogs.
In addition, it contains the following more permanent system logs:
badpws - Records of bad password attempts
delete - Players who have self-deleted
dts - Players who have hit death traps
errors - MUD system errors ("SYSERR" messages)
levels - Records of all levels gained by all players
newplayers - Records of the creation of new players
rentgone - Players who have lost their items in rent
restarts - List of times at which the MUD rebooted
rip - Player deaths
usage - Mud system usage (player load & memory usage info)
The src directory contains all of the C and header files for the MUD,
along with a Makefile. The src/util directory contains source for
CircleMUD's utility programs. See running.doc for more information
on how to compile the MUD. See utils.doc for more information on how
to use CircleMUD's utilities.

214
doc/OLD-DOCS/hacker.doc Normal file
View File

@@ -0,0 +1,214 @@
=============================================================================
The following documentation is excerpted from Merc 2.0's 'hacker.txt' file.
It was written by Furey of MERC Industries and is included here with his
permission. I've packaged it with Circle (very slightly changed in a couple
of places, i.e. specific filenames) because it offers good advice and insight
into the art and science of software engineering.
=============================================================================
=== 'I'm running a Mud so I can learn C programming!'
Yeah, right.
The purpose of this document is to record some of our knowledge, experience and
philosophy. No matter what your level, we hope that this document will help
you become a better software engineer.
Remember that engineering is work, and NO document will substitute for your
own thinking, learning and experimentation.
=== How to Learn in the First Place
(1) Play with something.
(2) Read the documentation on it.
(3) Play with it some more.
(4) Read documentation again.
(5) Play with it some more.
(6) Read documentation again.
(7) Play with it some more.
(8) Read documentation again.
(9) Get the idea?
The idea is that your mind can accept only so much 'new data' in a single
session. Playing with something doesn't introduce very much new data, but it
does transform data in your head from the 'new' category to the 'familiar'
category. Reading documentation doesn't make anything 'familiar', but it
refills your 'new' hopper.
Most people, if they even read documentation in the first place, never return
to it. They come to a certain minimum level of proficiency and then never
learn any more. But modern operating systems, languages, networks, and even
applications simply cannot be learned in a single session. You have to work
through the two-step learning cycle MANY times to master it.
=== Basic Unix Tools
'man' -- gives you online manual pages
'grep' -- stands for 'global regular expression print'
'vi'
'emacs'
'jove' -- use whatever editor floats your boat
but learn the hell out of it
you should know EVERY command in your editor
'ctags' -- makes 'tags' for your editor
allows you to goto functions by name in any source file
'>'
'>>'
'<'
'|' -- input and output redirection
get someone to show you, or dig it out of 'man csh'
These are the basic day-in day-out development tools. Developing without
knowing how to use ALL of these well is like driving a car without knowing how
to change gears.
=== Debugging: Theory
Debugging is a science. You formulate a hypothesis, make predictions based on
the hypothesis, run the program and provide it experimental input, observe its
behavior, and confirm or refute the hypothesis.
A good hypothesis is one which makes surprising predictions which then come
true; predictions that other hypotheses don't make.
The first step in debugging is not to write bugs in the first place. This
sounds obvious, but sadly, is all too often ignored.
If you build a program, and you get ANY errors or ANY warnings, you should fix
them before continuing. C was designed so that many buggy ways of writing code
are legal, but will draw warnings from a suitably smart compiler (such as 'gcc'
with the '-Wall' flag enabled). It takes only minutes to check your warnings
and to fix the code that generates them, but it takes hours to find bugs
otherwise.
'Desk checking' (proof reading) is almost a lost art in 1993. Too bad. You
should desk check your code before even compiling it, and desk-check it again
periodically to keep it fresh in mind and find new errors. If you have someone
in your group whose ONLY job it is to desk-check other people's code, that
person will find and fix more bugs than everyone else combined.
One can desk-check several hundred lines of code per hour. A top-flight
software engineer will write, roughly, 99% accurate code on the first pass,
which still means one bug per hundred lines. And you are not top flight.
So ... you will find several bugs per hour by desk checking. This is a very
rapid bug fixing technique. Compare that to all the hours you spend screwing
around with broken programs trying to find ONE bug at a time.
The next technique beyond desk-checking is the time-honored technique of
inserting 'print' statements into the code, and then watching the logged
values. Within Circle code, you can call 'printf' or 'fprintf' to dump
interesting values at interesting times. Where and when to dump these values
is an art, which you will learn only with practice.
If you don't already know how to redirect output in your operating system, now
is the time to learn. On Unix, type the command 'man csh', and read the part
about the '>' operator. You should also learn the difference between
'standard output' (e.g. output from 'printf') and 'error output' (e.g. output
from 'fprintf').
Ultimately, you cannot fix a program unless you understand how it's operating
in the first place. Powerful debugging tools will help you collect data, but
they can't interpret it, and they can't fix the underlying problems. Only you
can do that.
When you find a bug ... your first impulse will be to change the code, kill the
manifestation of the bug, and declare it fixed. Not so fast! The bug you
observe is often just the symptom of a deeper bug. You should keep pursuing
the bug, all the way down. You should grok the bug and cherish it in fullness
before causing its discorporation.
Also, when finding a bug, ask yourself two questions: 'what design and
programming habits led to the introduction of the bug in the first place?'
And: 'what habits would systematically prevent the introduction of bugs like
this?'
=== Debugging: Tools
When a Unix process accesses an invalid memory location, or (more rarely)
executes an illegal instruction, or (even more rarely) something else goes
wrong, the Unix operating system takes control. The process is incapable of
further execution and must be killed. Before killing the process, however, the
operating system does something for you: it opens a file named 'core' and
writes the entire data space of the process into it.
Thus, 'dumping core' is not a cause of problems, or even an effect of problems.
It's something the operating system does to help you find fatal problems which
have rendered your process unable to continue.
One reads a 'core' file with a debugger. The two most popular debuggers on
Unix are 'adb' and 'gdb', although occasionally one finds 'dbx'. Typically
one starts a debugger like this: 'adb bin/circle' or 'gdb bin/circle lib/core'.
The first thing, and often the only thing, you need to do inside the debugger
is take a stack trace. In 'adb', the command for this is '$c'. In gdb,
the command is 'backtrace'. In dbx, the command is 'where'. The stack trace
will tell you what function your program was in when it crashed, and what
functions were calling it. The debugger will also list the arguments to these
functions. Interpreting these arguments, and using more advanced debugger
features, requires a fair amount of knowledge about assembly language
programming.
If you have access to a program named 'Purify' ... learn how to use it.
=== Profiling
Here is how to profile a program:
(1) Remove all the .o files and the 'circle' executable:
rm src/*.o bin/circle
(2) Edit your makefile, and change the PROFILE= line:
PROFILE = -p
(3) Remake circle:
make
(4) Run circle as usual. Shutdown the game with shutdown when you have run long
enough to get a good profiling base. If you crash the game, or kill the
process externally, you won't get profiling information.
(5) Run the 'prof' command:
prof bin/circle > prof.out
(6) Read prof.out. Run 'man prof' to understand the format of the output.
For advanced profiling, you can use 'PROFILE = -pg' in step (2), and use the
'gprof' command in step 5. The 'gprof' form of profiling gives you a report
which lists exactly how many times any function calls any other function. This
information is valuable for debugging as well as performance analysis.
Availability of 'prof' and 'gprof' varies from system to system. Almost every
Unix system has 'prof'. Only some systems have 'gprof'.
=== Books for Serious Programmers
Out of all the thousands of books out there, three stand out:
Kernighan and Plaugher, _The Elements of Programming Style_.
Kernighan and Ritchie, _The C Programming Language_.
Brooks, _The Mythical Man Month_

79
doc/OLD-DOCS/handler.doc Normal file
View File

@@ -0,0 +1,79 @@
/* ************************************************************************
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
************************************************************************* */
Description of module 'handler.c'.
*** Note: All the routines that takes something away from something assumes
that something is actually in/carried by something!
void char_from_room(struct char_data *ch)
Removes ch from whatever room he's in.
void char_to_room(struct char_data *ch, int room)
Places ch in room.
void object_to_char(struct obj_data *object, struct char_data *ch)
Gives object to ch.
void object_from_char(struct obj_data *object)
Takes object away from The character who is carrying it.
struct obj_data *find_object_in_list(char *name, struct obj_data *list)
This procedure assumes that list points to the head of a content-list of
objects. It then tries to locate the object with a given name within that
list. If succesful, the function returns a pointer to that object; if not,
it returns a null pointer.
struct obj_data *find_obj(char *name)
This function searches the 'global' list of objects (pointed to by
'object_list') for an object with a given name. It then returns either
a null pointer or a pointer to that object (note that in this version,
it will always return the first occurence of an object with a given name).
struct char_data *get_char_room(char *name, int room)
Searches room for character with 'name'. Returns null or pointer to that
character.
struct char_data *get_char(char *name)
Searches the entire world for a character. Assumes that all characters are
in a list pointed to by character_list (This might need changing).
void object_to_room(struct obj_data *object, int room)
Puts an object in a room.
void object_from_room(struct obj_data *object)
void object_to_object(struct obj_data *obj, *obj_to)
void object_from_object(struct obj_data *obj, *obj_from)
void extract_char(struct char_data *ch)
Extracts a character completely from the world, and leaves his stuff in
the room (might be useful.. might not..).
**** Higher level versions of the 'find' routines.
These routines work like the above versions, with the exception that they are
supplied with a pointer to a character as well as a keyword to look for. they
then return nil if they fail to locate the object/character OR if the character
'using' the routine can't see the searched-for object/character.
struct char_data *get_char_room_vis(struct char_data *ch, char *name)
struct char_data *get_char_vis(struct char_data *ch, char *name)
struct obj_data *find_object_in_list_vis(struct char_data *ch, char *name,
struct obj_data *list)
/*search the entire world for an object, and return a pointer */
struct obj_data *find_obj_vis(struct char_data *ch, char *name)

13
doc/OLD-DOCS/header Normal file
View File

@@ -0,0 +1,13 @@
/**************************************************************************
* Copyright (C) 1993 - see 'license.doc' for complete information. *
**************************************************************************/
HOW TO CONVERT YOUR IDEAS INTO REALITY
A CircleMUD Coding Manual
Table of Contents
---------------------------------------------------------------------------
i. Introduction
1. Overview and Coding Basics

117
doc/OLD-DOCS/license.doc Normal file
View File

@@ -0,0 +1,117 @@
This file contains the original DikuMUD license. Since CircleMUD is based
on DikuMUD, the DikuMUD license applies to CircleMUD. Note well: the use
of CircleMUD in any capacity implies that you have read, understood, and
agreed to abide by the terms and conditions set down by this license.
Jeremy Elson
Department of Computer Science
Johns Hopkins University
Baltimore, MD 21218 USA
---------------------------------------------------------------------------
/* ************************************************************************
* Copyright (C) 1990, 1991 *
* All Rights Reserved *
************************************************************************* */
DikuMud License
Program & Concept created by
Sebastian Hammer
Prss. Maries Alle 15, 1
1908 Frb. C.
DENMARK
(email quinn@freja.diku.dk)
Michael Seifert
Nr. Soeg. 37C, 1, doer 3
1370 Copenhagen K.
DENMARK
(email seifert@freja.diku.dk)
Hans Henrik St{rfeldt
Langs} 19
3500 V{rl|se
DENMARK
(email bombman@freja.diku.dk)
Tom Madsen
R|de Mellemvej 94B, 64
2300 Copenhagen S.
DENMARK
(email noop@freja.diku.dk)
Katja Nyboe
Kildeg}rdsvej 2
2900 Hellerup
31 62 82 84
DENMARK
(email katz@freja.diku.dk)
This document contains the rules by which you can use, alter or publish
parts of DikuMud. DikuMud has been created by the above five listed persons
in their spare time, at DIKU (Computer Science Instutute at Copenhagen
University). You are legally bound to follow the rules described in this
document.
Rules:
!! DikuMud is NOT Public Domain, shareware, careware or the like !!
You may under no circumstances make profit on *ANY* part of DikuMud in
any possible way. You may under no circumstances charge money for
distributing any part of dikumud - this includes the usual $5 charge
for "sending the disk" or "just for the disk" etc.
By breaking these rules you violate the agreement between us and the
University, and hence will be sued.
You may not remove any copyright notices from any of the documents or
sources given to you.
This license must *always* be included "as is" if you copy or give
away any part of DikuMud (which is to be done as described in this
document).
If you publish *any* part of dikumud, we as creators must appear in the
article, and the article must be clearly copyrighted subject to this
license. Before publishing you must first send us a message, by
snail-mail or e-mail, and inform us what, where and when you are
publishing (remember to include your address, name etc.)
If you wish to setup a version of DikuMud on any computer system, you
must send us a message , by snail-mail or e-mail, and inform us where
and when you are running the game. (remember to include
your address, name etc.)
Any running version of DikuMud must include our names in the login
sequence. Furthermore the "credits" command shall always cointain
our name, addresses, and a notice which states we have created DikuMud.
You are allowed to alter DikuMud, source and documentation as long as
you do not violate any of the above stated rules.
Regards,
The DikuMud Group
Note:
We hope you will enjoy DikuMud, and encourage you to send us any reports
on bugs (when you find 'it'). Remember that we are all using our spare
time to write and improve DikuMud, bugs, etc. - and changes will take their
time. We have so far put extremely many programming hours into this project.
If you make any major improvements on DikuMud we would be happy to
hear from you. As you will naturally honor the above rules, you will receive
new updates and improvements made to the game.

298
doc/OLD-DOCS/release.doc Normal file
View File

@@ -0,0 +1,298 @@
CircleMUD Release History
-------------------------
This document is basically just a a compliation of all the README files
which accompanied each release of CircleMUD. At the end is the post
to rec.games.mud.diku which originally anounced CircleMUD as a publically
available MUD source code.
Version 2.20: November 17, 1993
Version 2.11: September 19, 1993
Version 2.10: September 1, 1993
Version 2.02: Early August
Version 2.01: July 20, 1993
Version 2.00: July 16, 1993
The latest version of Circle is 2.20, released on November 17, 1993.
Version 2.20 supercedes version 2.11, which was released on September 19, 1993.
Version 2.20 November 17, 1993
--------------------------------
New features:
o A completely new output buffering system which is far more network-efficient,
and somewhat more memory- and speed-efficient, than the original Diku system.
Definitely a major win for people with slow Net links. (Details available
by request, but this was discussed on rgmd recently.) Several other
functions (such as do_where() and do_who()) have been rewritten to take
advantage of the new system.
o Redesigned stat screens with better readability
o Command-line substitution via the "^" character (works identically to the
csh command)
o Code sent by Jeff Fink (thanks Jeff!): Help now handles ambiguous cases
correctly (i.e., "help color" will give you help for color and not
colorspray)
o vstat command to stat mobiles and object by virtual number
o updated documentation
And, bug fixes of varying degrees of severity:
o SunOS Bus errors on stealing
o +hit item bug
o Switched immort re-login bug
o Mob memory bug
o Poison/Stat bug (I think this one is native to Diku Gamma 0.0 -- the
function hit_gain was responsible for subtracting hits when a char is
poisoned, so you'd lose hits when someone statted you.)
o Stat room bug under Solaris and IRIX
o Ungroup bug
o "goto 3.guard" now works (takes you to the third guard instead of room 3)
o various other minor fixes
------------------------------------------------------------------------------
Version 2.11 September 19, 1993
----------------------------------
Changes in 2.11 (from 2.10):
Mostly bug fixes, including:
-- SET FILE bug
-- SIGBUS/unaligned data errors under SunOS and other OS's
-- Move limit modifier bug
-- wrist-wearing bug
-- Compilation problems with utility.c under some operating systems
The only notable change is that the hit_limit, move_limit, and mana_limit
functions have been removed (for many reasons). From the players' point of
view, this means that a character no longer gains movement points with age.
Hit, move, and mana gain speeds are still a function of age, however.
============================================================================
Version 2.10 was released on September 1, 1993.
Changes in 2.10 (from 2.01):
o Rewritten get/put/drop/junk/donate/give/wear/remove, so that "all" and
"all.x" work in a much wider variety of cases. Loosely based on code
sent in by Jeff Fink.
o "Track" function based on breadth-first search
o Configurable auto-save feature to automatically crash-save players
periodically
o More intense error-checking in object saving system to detect problems
with file permissions
o Many configuration options added to config.c
o Option to make death traps automatically have dump spec-proc assigned
o ASPELL and ACAST macros added to match the ACMD macros; spells1.c,
spells2.c, spell_parser.c, and magic.c changed to use the macros.
o SKILL macro split into GET_SKILL and SET_SKILL macros so that error
checking can be done
o Enhanced documentation -- a help entry now exists for every command
o Linux compatibility, and further steps to SVR4 compatibility which will
make it into Circle eventually. (Note: you must make a change in one
line of the Makefile for Linux compatibility.)
o All functions now prototyped before use
Jeremy Elson
August 31, 1993
=========================================================================
=========================================================================
Version 2.01 is basically the same as 2.00; most of the changes are for
making the MUD more portable, based on mail I've received after the
release of version 2.00.
-- Problems with OPEN_MAX and SEEK_x resolved
-- Some problems with the Makefile fixed
-- Compiles much more cleanly with the -Wall option
-- A couple of minor bugs fixed
-- A few small fixes to the documentation
July 20, 1993
--------------------------------------------------------------------------
CircleMUD was developed and tested under Ultrix 4.0; your mileage may vary.
If I have time, I'll try and port it to other machines. If you port it and
want to share your work with others, feel free to drop me a line.
The CircleMUD 'press release' is included below, in case you haven't seen
it and want to.
Good Luck!
Jeremy Elson aka Rasmussen (Ras)
July 16, 1993
---------------------------------------------------------------------------
Wake the kids and find the dog, because it's the FTP release of
C I R C L E M U D 2 . 0
That's right -- CircleMUD 2.0 is done and is now available for anonymous FTP
at ftp.cs.jhu.edu!
CircleMUD is highly developed from the programming side, but highly UNdeveloped
on the game-playing side. So, if you're looking for a huge MUD with billions
of spells, skills, classes, races, and areas, Circle will probably disappoint
you severely. Circle still has only the 4 original Diku classes, the original
spells, the original skills, and about a dozen areas.
On the other hand, if you're looking for a highly stable, well-developed,
well-organized "blank slate" MUD on which you can put your OWN ideas for
spells, skills, classes, and areas, then Circle might be just what you're
looking for.
Just take a gander at some of Circle's nifty features:
-- In-memory mobile and object prototypes and string sharing for
decreased memory usage and blazingly fast zone resets
-- All large realloc()s have been removed and replaced by boot-time
record counting and a single malloc() for superior memory efficiency
-- Split world/obj/mob/zon/shp files for easy addition of areas; plus,
all the world files are still in the original Diku format for
compatibility with existing areas
-- Boot-time and run-time error checking of most data files with
diagnostic messages a lot more helpful than "segmentation fault"!
-- Player mail system and bank
-- Rewritten board system: boards are now stable, robust, more
intelligent, and easily expandable -- adding a new board is
as easy as adding another line to an array
-- ANSI color codes with a fully documented programmers' interface
-- On-line system logs
-- Optional automatically regenerating wizlist -- a final end
to new immortals constantly asking you when they'll be added
to the immlist!
-- "config.c" file allows you to change aspects of the game such
as playerkilling/playerthieving legality, max number of objects
rentable, and nameserver usage -- WITHOUT recompiling the
entire MUD!
-- All text (help, mortal/immort MOTDs, etc.) is rebootable at
run-time with the "reboot" command
-- All players are given a unique serial number -- no more messy,
time consuming str_cmp()s when you're trying to identify people!
-- Fully integrated and robust rent/crash system -- allows normal
renting, cryo-renting, crash protection, and forced rent
(at an increased price) after an hour of idling
-- All the standard wizard stuff you're used to: level-sensitive
invisibility, settable poofin/poofouts, wizline
-- Advanced 'set' command which allows you to set dozens of aspects
of players -- even if they aren't logged in! "Stat" also allows
you to stat people who aren't logged in!
-- Intelligent 'autorun' script handles different types of reboots,
organizing your system logs, and more!
-- Circle comes with more than a dozen utilities, all fully
documented, to make maintenance a snap!
-- And much, much more!
Unfortunately, the original Circle had more than its fair share of Bad People
when it was alive, but it DID lead to an impressive list of security and
"asshole control" features:
-- 3 types of sitebanning available: 'all' to refuse all connections,
'new' to refuse new players, or 'select' to refuse new players and
all registered players who don't have a SITEOK flag.
-- 'wizlock' allows you to close the game to all new players or all
players below a certain level.
-- Handy 'mute' command squelches a player off of all public
communication channels
-- Handy 'freeze' command freezes a player in his tracks: the MUD
totally ignores all commands from that player until he's thawed.
-- Even handier DELETE flag allows you to delete players on the fly.
-- 'set' command (mentioned above) allows you to freeze/unfreeze/
delete/siteok/un-siteok players -- even if they aren't logged in!
-- Bad password attempts are written to the system log and saved;
if someone tries to hack your account, you see "4 LOGIN FAILURES
SINCE LAST SUCCESSFUL LOGIN" next time you log on.
-- Passwords don't echo to the screen; allows 3 bad PW attempts
before disconnecting you.
-- Players aren't allowed to choose their character's name as their
password -- you'd be surprised how many do!
-- "xnames" text file specifies a list of invalid name substrings
to prevent creation of characters with overly profane names.
Listen to all the rave reviews of CircleMUD 2.0!
"How long ago was that deadline you set for yourself?" -- My Friend
"NO ONE should be denied the power of computation." -- My Professor
"Multi-user WHAT?" -- My Mom
Give it a try -- what do you have to lose other than your GPA/job, friends,
and life?
---------------------------------------------------------------------------
Circle's complete source code and areas are available now for anonymous FTP
at ftp.cs.jhu.edu (128.220.13.50) in the directory pub/CircleMUD.
I welcome comments and constructive criticism about CircleMUD and would be
happy to discuss any design decisions I've made, but I'm not particularly
receptive to lunatics frothing at the mouth and thus will probably ignore
you if you flame me.
Also, remember the odds here: one person (me) against 29,000 lines of
code (Circle), so there are bound to be some mistakes in there somewhere.
Good luck, and happy Mudding,
Jeremy Elson aka Ras

402
doc/OLD-DOCS/running.doc Normal file
View File

@@ -0,0 +1,402 @@
/**************************************************************************
* Copyright (C) 1993 - see 'license.doc' for complete information. *
**************************************************************************/
----- Compiling, Running, and Maintaining CircleMUD -----
This manual is meant to be read by implementors just getting started with
CircleMUD. This should be the first document you should read after reading
the main README file.
It should be the first documentation you read (after the
README file in theIt describes how to get the MUD compiled, configured, and
running; use of command-line options and system logs; and required daily
maintenance.
This i
Table of Contents
---------------------------------------------------------------------------
1. Compiling Circle
1.1. Compatibility Issues
1.2. How-To
2. Configuring Circle
3. Running Circle
3.1. Execution and 'autorun'
3.2. Command-Line Options
4. System Logs
4.1. Player Information
4.2. Usage Information
4.3. Errors
1. Compiling Circle
-------------------
1.1. Compatibility Issues
Ultrix 4.0 was used as CircleMUD's development platform up through v2.00;
starting with 2.10, Linux 0.99.11 was used instead. If you have Ultrix,
Linux, or another BSD-compatible system, and the gcc compiler, you should
be able to compile right out of the electronix box. If you don't have gcc,
try using cc -- on some systems such as AIX, the cc compiler is ANSI
compliant.
The author has personally compiled CircleMUD under the following systems:
Ultrix 4.0
IRIX 4.0.1, 4.0.4, 4.0.5
SunOS 4.1.1, 4.1.3
AIX 3.2
Linux 0.99.11
ConvexOS V10.2
Others have reported successfully compiling Circle under many other
systems; if you have a BSD-compatible system, chances of getting Circle
to compile easily are pretty good. Non-BSD systems will probably have
trouble with certain functions; getting Circle to compile for the first time
on such systems may be difficult and time-consuming. SVR4 compatibility is
on the horizon; many functions have already been converted to be SVR4
compatible, but the code has not yet been fully ported.
The Makefile has options to compile the MUD under Linux, AIX, and IRIX.
It also has an option for SVR4 but, as mentioned above, it does not
yet completely work. The unmodified Makefile should work with many other
including those listed above.
If you port Circle to another operating system and wish to share your work
with others, feel free to mail me your changes so that they can be included
in future releases of CircleMUD (if any). You'll be given credit, of
course. :)
1.2. How-To
The /src directory contains the source code for the main MUD; /src/utils
has the source for a dozen or so MUD maintenance utilities. The makefile
is in the /src directory; type 'make' while in that directory to compile
only the Circle server, type 'make utils' to compile all the utilities, or
type 'make all' to compile everything. You can also make an individual
utility by typing 'make x', where x is the name of the utility you want to
compile. Complete documentation of the utility programs can be found in
utils.doc.
The Makefile directs all compiled programs to the /bin directory. Although
not necessary, you may want to put Circle's /bin directory in your $PATH.
2. Configuring Circle
---------------------
Your first instinct will probably be to put the game up as fast as possible
to see if it works. That's fine, but there are some files you should be
aware of before you put the game up 'for real'. This is just a partial
list -- see 'files.doc' for a complete description of all the files in the
Circle distribution.
First, you'll probably want to take a look at 'config.c' -- it has dozens
of variables you can set to configure various aspects of CircleMUD.
The place where most of your day-to-day changes will be is in the lib/text
directory; that's where the help files, MOTD (Message Of The Day), imotd
(MOTD for immortals), and other text files are all kept.
In particular, you should make sure to put something in your 'policy' file --
it's better to have definite rules from the beginning than to have problems
later on when people try to bend you as far as they can. Also, you should
put tips for new immortals in the 'handbook' file (i.e., "Don't help any
mortals", "Don't kill mobiles", "Don't run through puddles", "Don't bring
glassware into the pool area", etc.)
The area hierarchy is lib/world. lib/world has 5 subdirectories -- wld,
mob, obj, shp, and zon, which is where the world, mobile, object, shop,
and zone files go, respectively. Each directory has a set of world
files in it with the correct extension (i.e., the obj subdir will have
a bunch of files ending with ".obj", such as 30.obj, 31.obj, etc.) plus
two special files -- 'index' and 'index.mini'. You can control which files
are loaded by Circle simply by changing the list of files listed in 'index'.
'index.mini' controls which (smaller) set of world files should be loaded
in the debugging mode (Mini-Mud Mode, explained below.)
3. Running Circle
-----------------
3.1. Execution and 'autorun'
Circle should always be run from circle's "root" directory, not the /bin
directory. You can run it manually by typing 'bin/circle' (useful for
testing and debugging). For running the game "for real", it's better
to use the 'autorun' shell script provided in Circle's root directory.
Autorun lets Circle run itself for long periods of time. It continuously
runs the game as well as removing old system logs, moving newer system logs
to the /log directory, and saving certain log entries to permanent files.
Autorun can be controlled by creating files with certain names. You can
use the 'touch' command to create a file, and, of course, the 'rm' command
to remove a file. If a file called '.fastboot' exists, the Circle will reboot
immediately if it crashes or is shut down instead of waiting 40 seconds as
it normally does. A file called '.killscript' will cause the script to
terminate itself; i.e., if you want to bring the game down. If you want
to temporarily prevent the MUD from rebooting, create a file called 'pause';
the script will go into a wait loop until 'pause' is removed.
Although you can create these files manually, the SHUTDOWN command from
within the MUD has several command-line options which will create these
files for you. See the SHUTDOWN help entry in wizhelp.doc for more
information.
It's not uncommon for CircleMUD to run for a week without crashing. The
game can be rebooted manually with the SHUTDOWN command, or automatically.
Once a day, at a time specified by the REBOOT_AT macro in modify.c, the
game checks for the existence of the file "reboot" in the selected data
directory. If the file exists, the game is rebooted (it terminates nicely,
with a nonzero return value). If the size of the file is nonzero, its contents
are processed by "sh" (with a system() call). If the processing returns
with a nonzero status, the file is renamed to "reboot.FAILED", and the
rebooting is called off. If it returns zero, the file is moved to
"reboot.SUCCEEDED", and the game is rebooted.
The first character to log in to the MUD (i.e., when the playerfile is
empty) will be made the maximum level. You should fix your stats using
the RESTORE command when you first create the character. To make more
God characters, use the ADVANCE command.
3.2. Command-Line Options
There are a number of command-line options which Circle will recognize.
You can use these when running Circle manually, or put them in the FLAGS
variable in your autorun script to use them all the time.
The syntax is:
circle [-m] [-q] [-r] [-s] [-d <path>] [<port #>]
-m: "Mini-Mud Mode". Mini-mud will be one of your most powerful debugging
tools; it causes Circle to boot with an abridged world, cutting the
boot time down to several seconds. It is useful for testing features
which are not world-related (i.e, new commands or spells).
CircleMUD uses split world files (in the lib/world heirarchy); each
directory (i.e., wld, obj, mob, shp, and zon) has a file called 'index'
which specifies which files should be loaded at boot-time. The file
'index.mini' specifies which parts of the world should be loaded with
the -m option.
-q: Quick boot - prevents checking of timed out object files. Every time
Circle boots, it checks every object file to see if it has timed out;
if so, it is deleted. This is done primarily to save disk space. If
time is more important to you than space, use the -q option. -q is
automatically activated when you use -m.
-r: Restrict game to new players. Allows you to decide at run-time whether
the game is open to new players or not; -r is equivalent to typing
"wizlock 1" (see wizhelp.doc for more information).
-s: Disable special routines. This option prevents special procedures from
being assigned. It is still supported but obsolete because Circle checks
to make sure each mob exists before assigning a spec_proc to it.
-d: Select data directory. This is useful if you want to keep one or more
sets of game data in addition to the standard set. For example, you may
wish to make a copy of the entire world in a separate directory, so that
you can test additions to the code or worldfile without subjecting the
players to unnecessary hazards. The default data directory is 'lib'.
Any coredumps (may they never happen to you!) will take place in the
selected directory.
port : Select the port on which the game is to wait for connections.
Default port is 4000; you can change the default in config.c and
the PORT= line of the autorun script.
4. System Logs
--------------
CircleMUD writes a wide variety of information to its log file (called
"syslog"). During Circle's boot sequence, the syslog keeps a record of
everything the MUD is doing to initialize itself; this can be useful to
determine what the problem is if the MUD dies while it is booting. Once
the game is up and running, the syslog contains information about players
(i.e., when they connect, disconnect, rent, unrent, quit, die, hit death
traps, etc.) as well as status information about the game itself. The
game-related information falls generally into 2 categories: usage
information and errors.
4.1. Player Information
The player information recorded by Circle's system logs will serve you
very well as your players start to make wild claims about strange bugs
resulting in them losing equipment or points. Many mudders prey on the
insecurities of a new mud administrator who is terrified that his or her
MUD is riddled with bugs and will do anything to satisfy grumpy players --
don't let yourself fall into that trap! CircleMUD is bound to contain
bugs, but most of the core systems have been well tested, so you should
take claims such as "I magically lost all my stuff!" with a grain of salt
and check your system logs.
If a player ever asks you for reimbursement of equipment, money, gold,
experience points, or whatever, your gut reaction should always be to
check the logs first.
As a sidebar, let me point out that the value of system logs is twofold:
1) they actually provide you with valuable information, and 2) they make
your players paranoid. When I first started mudding and I heard about
this mysterious "system log", it made me incredibly paranoid. Now that
I've done a good deal of MUD administration, I've seen the same paranoia
in _many_ other players.
That paranoia is a very good thing. The system logs become an abstract
and shapeless but omnipresent force on the MUD. Players hear about "the
System Log" and then get paranoid that everything they do is being
recorded, so they tend to behave, lest the evil System Log betray their
wrongdoings to the Gods.
For this reason, when you go to check your logs, it's a good idea to
say something like "Hold on -- let me go check the system logs, OK?"
because it reinforces the syslog's presence in the collective psyche
of your players.
Back to the point. When someone claims that they've been wronged by the
evil system, always check the logs. The logs give you power to say things
like "What do you mean your items disappeared in rent -- it says right here
in the logs 'Rasmussen has quit the game.' -- you didn't rent at all, you
just QUIT!"
The logs also record when a player's items are dumped due to insufficient
funds (remember -- rent is calculated per day on a PER-SECOND basis! If you
rent at the rate of 100 coins per day and come back 36 hours later, you'll
be charged 150 coins!). Plus, when someone rents, it records in the logs how
much rent cost per day and how much the player had, to diffuse disputes such
as "But I had enough money!!"
In short: the system logs are your friends. Love them.
The autorun script saves 6 levels of raw system logs. In addition, it
greps the logs for certain pieces of extra-juicy information to save
indefinitely.
4.2. Usage Information
Every 5 minutes, the game counts how many people are playing and records
that information in the system log. Optionally, if you #define RUSAGE
in comm.c, it will also record system resource information such as CPU time
and memory used. The usage information currently logged by Circle is,
as you can see, somewhat sparse; local MUD admins are encouraged to add
to this code as is appropriate for their particular site.
Usage information isn't critical, but it is interesting to look at the
usage patterns to determine when your peak playing hours are. If you're
good at using 'cut' and other Unix utilities, you can even dazzle your
friends by graphing your MUD's system usage.
[ Note: friends not included with the CircleMUD distribution. ]
4.3. Errors
Just as your first gut instinct should be to look at the logs if a player
starts begging you for something, your first gut instinct in the event of
a crash or unexpected shutdown should also be to look at the system logs.
A Unix utility called 'tail' is used to look at the last few lines of a
text file; it's very useful for looking at the last entries in the system
log to see the last thing that happened before the shutdown. Often, Circle
will report an error in the logs just before it crashes. This method is
particularly useful if the MUD crashes during its boot sequence, because
the logging during boot is intensive.
If Circle shuts down unexpectedly and there is no core dump in the /lib
directory, the game probably detected an internal error and killed itself.
Such shutdowns are always preceeded by entries in the system log describing
the error.
If there's no error message at the end of the log, then there probably
IS a core dump, so you can use 'dbx', 'gdb', etc. to examine the core
dump and determine the reason for the crash. The file 'hacker.doc',
generously provided by Furey of MERC Industries, offers useful insight
into the art and science of debugging -- you'd be well advised to give it
a look-see.
Circle sometimes encouters a serious but non-fatal error; in this case,
the error will be written to the system log with the prefix SYSERR, but
the MUD will not shut itself down. You should always be aware of any
SYSERRs which occur -- they are often useful for forseeing imminent danger
or averting problems before they become critical. If a SYSERR does
occur, try to determine if a change you've made recently has caused it.
Ignoring SYSERRs is like ignoring compiler warnings: you can be tempted
to ignore them because the game keeps going even if they exist, but you
can easily get yourself into trouble by not listening. The autorun script
saves all SYSERRs to the file log/errors.
Day-To-Day MUD Administration
-----------------------------
Okay, so now you have your wonderful CircleMUD up and running and all is
right with the world. Right?
Well, technically, yes. Circle requires very little day-to-day attention
in order to keep the progam itself running smoothly. But the MUD itself
is just a series of instructions running on a computer, processing data.
Never lose sight of the fact that there will be dozens, hundreds, or maybe
even thousands of people connecting to your MUD -- and they are NOT
programs. They're people!
What I'm getting at is this: from the technical side, there are relatively
few things you have to do to keep the game running. But you can't just plop
a MUD on the Internet and then ignore it! Spend time on your MUD. Try to
keep up with the boards, and make an effort to respond to the complaints,
ideas, and suggestions posted there. Take a look at the 'bug', 'typo', and
'idea' files from time to time -- and maybe even respond to some of the ideas
using Mudmail. Try to respond to Mudmail you receive from players in a
timely manner. Make sure that your 'news', 'policy' and other text files
are up-to-date and suit the political climate on your MUD.
If you can't or just don't want to deal with the player politics, make sure
sure that you choose someone who can and will, and make them responsible for
dealing with it. If no one does it, your MUD will stagnate and die.
Maintaining CircleMUD
---------------------
CircleMUD requires little technical maintenance. You should look at the
log/errors file regularly to make sure there are no recurring problems.
Also, you probably will want to 'purge' the playerfile on a regular basis
(i.e., remove "deadweight" characters). You can decide how often to purge
the playerfile -- every day if disk space is tight, or every month if it
isn't. The purgeplay utility program (included) removes deadweight players.
You should run the 'purgeobjs' script (in the lib/plrobjs) directory after
you purge the playerfile -- it removes the object files of players who no
longer exist in the playerfile.
The 'automaint' script in the main circle directory will automatically purge
the playerfile and player objects for you. DO NOT RUN THIS SCRIPT WHILE
THE MUD IS RUNNING! Doing so will make your life (more) difficult.
Good luck with your MUD!
-- Jeremy Elson
jelson@cs.jhu.edu

243
doc/OLD-DOCS/shop.doc Normal file
View File

@@ -0,0 +1,243 @@
/* ************************************************************************
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
************************************************************************* */
NEW FORMAT:
CircleMUD v3.0 now has a new shop file format. Since the old format
is still compatible, I've kept the old documetation at the end of
this file. If you'd like to convert shop files in the old format to that
of the new format, compile and run the utility shopconv. When writing new
files, you need to tell CircleMUD that the shopfile is in the new format
by including the following line BEFORE any shops in the file:
CircleMUD v3.0 Shop File~
The rest of the file is formatted as follows:
#<num>~
Shop Number (Used only for display purposes)
<num 1>
<num 2>
<num 3>
.
.
.
<num n>
-1
These numbers refer to the objects the shop produces. The numbers are
virtual numbers. The list MUST end with a -1.
<Profit when selling>
The object value is multiplied by this value when sold. This is a
floating point value. Must be >= 1.0
<Profit when buying>
The object value is multiplied by this value when bought. This is a
floating point value. Must be <= 1.0
<type 1> [namelist 1]
<type 2> [namelist 2]
<type 3> [namelist 3]
.
.
.
<type n> [namelist n]
-1
These lines contain the types of items that the shop will buy. The first
argument, called "type" is the type of item (see dbsup.doc). Numerical,
or english forms are valid (5 or WEAPON, 9 or ARMOR, etc) In addition,
you can provide optional keywords to give specific keywords that must
be present on the item. For further details on these expressions, see the
notes following the new file format. This list must be terminated by a -1.
<Message When Item to buy is non existing>~
<Message When item trying to sell is non existing>~
<Message When shop does not buy offered item>~
<Message when shop can't afford item>~
<Message when player can't afford item>~
<Message when buying an item>~
Price is %d
<Message when selling an item>~
Price is %d
<Temper>
When player can't afford an item, the shopkeeper tells them they
can't afford the item and then:
0 - The shopkeeper pukes on the player.
1 - The shopkeeper smokes his joint.
other - No action besides message above.
<Bitvector>
Allows you to set certain values for the shop.
WILL_START_FIGHT 1 /* Players can attack shopkeeper */
WILL_BANK_MONEY 2 /* Shopkeeper puts money > 15000
into the bank */
A brief note: Shopkeepers should be hard (if even possible) to kill.
The benefits players can receive from killing them is enough to unbalance
most non monty-haul campaigns.
<Shop Keeper Mobile Number>
Virtual number of the shopkeeper.
<With Who>
Designate certain alignments or classes that the shop will not
trade with. To determine this value, choose all elements on
the list below that you do not want sold to, and add their values.
TRADE_NOGOOD 1
TRADE_NOEVIL 2
TRADE_NONEUTRAL 4
TRADE_NOMAGIC_USER 8
TRADE_NOCLERIC 16
TRADE_NOTHIEF 32
TRADE_NOWARRIOR 64
<Room 1>
<Room 2>
<Room 3>
.
.
.
<Room n>
-1
The virtual numbers the mobile must be in for the shop to be effective.
(So trans'ed shopkeepers can't sell in the desert). The list must be
terminated by a -1.
<Time when open start 1>
<Time when open end 1>
The hours between which the shop is open.
<Time when open start 2>
<Time when open end 2>
The hours between which the shop is open.
ITEM NAME LISTS:
Name lists are formed by boolean expressions. The following operators
are available:
',^ = Not *, & = And +, | = Or
The precedence is Parenthesis, Not, And, Or. For example, the following line:
WEAPON [sword & long|short | warhammer | ^golden & bow] & magic
This shop will buy the following items of type WEAPON:
1) sword long magic
2) short magic (the first & is done before the first | )
3) warhammer magic
4) ^golden bow magic
Note that the ^ in front of golden affects ONLY golden, and nothing else
in the listing. Basically, the above expression could be written in
english as:
[(sword and long) or short or warhammer or (not golden and bow)] and magic
If I wanted the shop to only buy "short magic" only if they were also swords,
I would have to change the expression to:
WEAPON [sword & (long|short) | warhammer | ^golden & bow] & magic
^-Changes--^
You can also include object extra flags (listed in dbsup.doc). The previous
example used "magic" as a keyword that had to be on the object. If we wanted
to make it so that the MAGIC flag had to be set on the item, we would change
"magic" to "MAGIC." Similar changes could be made to add other flags such as
"HUM" or "GLOW." It should be noted that these expressions are case sensitive
and that all keywords should appear in lower-case, while the flag names should
be in all caps.
OLD FORMAT:
Default DIKU shop files have the following format:
#<xx>~
Shop Number (Used only for display purposes)
<num1>
<num2>
<num3>
<num4>
<num5>
These numbers refer to the objects the shop produces.
The numbers are virtual numbers.
<Profit when selling>
The object value is multiplied by this value when sold. This is a
floating point value. Must be >= 1.0
<Profit when buying>
The object value is multiplied by this value when bought. This is a
floating point value. Must be <= 1.0
<num1>
<num2>
<num3>
<num4>
<num5>
These five numbers are the item-types traded with by the shop.
See dbsup.doc.
<Message When Item to buy is non existing>~
<Message When item trying to sell is non existing>~
<Message When wrong item-type sold>~
<Message when shop can't afford item>~
<Message when player can't afford item>~
<Message when buying an item>~
Price is %d
<Message when selling an item>~
Price is %d
<Temper>
When player can't afford an item, the shopkeeper tells them they
can't afford the item and then:
0 - The shopkeeper pukes on the player.
1 - The shopkeeper smokes his joint.
other - No action besides message above.
<Bitvector>
Allows you to set certain values for the shop:
WILL_START_FIGHT 1 /* Players can attack shopkeeper */
WILL_BANK_MONEY 2 /* Shopkeeper puts money > 15000
into the bank */
A brief note: Shopkeepers should be hard (if even possible) to kill.
The benefits players can receive from killing them is enough to unbalance
most non monty-haul campaigns.
<Shop Keeper Mobile Number>
Virtual number of the shopkeeper.
<With Who>
Designate certain alignments or classes that the shop will not
trade with. To determine this value, choose all elements on
the list below that you do not want sold to, and add their values.
TRADE_NOGOOD 1
TRADE_NOEVIL 2
TRADE_NONEUTRAL 4
TRADE_NOMAGIC_USER 8
TRADE_NOCLERIC 16
TRADE_NOTHIEF 32
TRADE_NOWARRIOR 64
<Shop Room Number>
The virtual number the mobile must be in for the shop to be effective.
(So trans'ed shopkeepers can't sell in the desert).
<Time when open start 1>
<Time when open end 1>
The hours between which the shop is open.
<Time when open start 2>
<Time when open end 2>
The hours between which the shop is open.

90
doc/OLD-DOCS/socials.doc Normal file
View File

@@ -0,0 +1,90 @@
/* ************************************************************************
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
************************************************************************* */
HANDLING 'SOCIALS' IN CIRCLEMUD
A general system exists to handle the 'social' commands -- those which
generally have no game-related purpose other than to convey emotions
between players. Socials are also useful for creating advanced DikuMUD
adventures and quests through the use of speical procedures; for example,
you could add a 'detonate' social which, within your quest, is handled by
a special procedure to cause something to explode.
Socials are all handled through the generalized command do_action. The
text file lib/text/socials contains information on the game's socials.
New socials can be added by 1) adding the name and level of the social
to the master command list in interpreter.c (giving do_action as the
function pointer), and 2) adding information for the new social to the
lib/text/socials file.
In Circle 3.0, socials in the file are specified by name (instead of by
command number, as was true of the original Diku and versions of Circle
before 3.0.). In the standard Circle distribution, the socials appear
in alphabetical order in the file, but they can appear in any order and
can be rearranged if necessary.
The file is formatted as follows:
--------------------------------------------
<command name> <hide-flag> <minimum position of victim>
<messg to character if no argument>
<messg to others if no argument>
<messg to char if victim found> <---If this field is empty,
<messg to others if victim found> <-
<messg to victim> | then these fields must be
<messg to char if victim not found> | skipped, and the action will
<messg to char if vict is char> | ignore arguments.
<messg to others if vict is char> <-
<command name> <hide-flag> <minimum position of victim>
.
.
.
.
.
$~
-------------------------------------------------
Each social must contain either 1) only the first two messages (if the social
ignores arguments), or 2) all eight messages (if the social takes an argument).
Each message must be contained in one line.
The command-name indicates which social is being specified. The hide-flag
can be either 0 or 1; if 1, the social is hidden from OTHERS if they cannot
see the character performing the social. The action is not hidden from the
VICTIM, even if s/he cannot see the character performing the social, although
in such cases the character's name will, of course, be replaced with "someone".
Where it makes sense to do so, text fields may be left empty. This is done by
putting a '#' in the first column on the line. Doing so is legal in the
following fields:
a: messg to others if no arg
b: messg to others if victim found
c: messg to others if vict is char
Note again that if the field _messg to char if victim found_ is empty, then
the following fields must be omitted entirely (not even the '~'), and the
action will ignore any arguments supplied.
The procedure sends the text strings through act(), and they may contain
control codes (see the documentation for the act() function for details.)
Note that not all of act()'s control codes may be used; for example, codes
which refer to objects such as $p.
For the sake of efficiency, no tests or sanity checks are made on the
consistency or logic of the act() codes found in the social messages.
Hence, grave disorder may result if, say, the code '$N' occurs in a text
field that doesn't refer to a victim; like _messg to others if no arg_.
In previous versions of Circle, such grave disorder often manifested itself
in the form of crashes. However, the act() function itself in Circle 3.0
and above does sanity checks to make sure it's not dereferencing null
pointers, hopefully with the result of avoiding crashes. Nevertheless,
great care should be taken in making sure that the $ codes of socials are
used consistently and correctly.

144
doc/OLD-DOCS/spell_info.doc Normal file
View File

@@ -0,0 +1,144 @@
/* ************************************************************************
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
************************************************************************* */
OFFENSIVE SPELL AVERAGE DAMAGE CHARTS
Upon learning a new spell, the manauser will always be able to cast
two of these spells. For each level, the manauser will be abel to cast
one additional spell of the type learned. The maximum abel to learn is
different between each spell, but for most offensive spells it is 7.
The number of spells that can be cast assume that everybody has got
100 mana points.
General Idea:
A M.U. Should be abel to kill a victim 3 levels below himself, by
using all his MANA points for offensive spells. This include
saving_throw calculations.
Saving throw has effect (level of victim = L, damage of spell = D)
Actual_Average_Damage = (L/20*(D/2))+(((20-L)/20)*D)
where L in [1..18] (Means saving never better than 2)
If you want to know how much dam, say E, a L level victim,
get from D dam, then:
Effective_Dam (E) = D/(1-(L/40))
---------------------------------------------------------------------------
TABLE:
LVL is level of victim.
HP is hit_points.
ERM is spell damage to effectively remove HPR
SAV is assumed saving throw
A.DIF. is Aprroximate adjusted difference.
LVL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
SAV 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 2
HP 22 35 47 60 72 85 97 110 122 135 147 160 172 185 197 210 222 235 247 260
ERM 22 37 51 67 82 100 118 138 157 180 203 229 255 285 315 350 386 427 470 495
A.DIF 15 15 16 16 18 18 20 20 23 23 26 26 30 30 35 35 41 43 -
---------------------------------------------------------------------------
Table of WHEN a MU can kill a Level X opponent by using 100 MANA points only.
MU Level 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Opponent 0 0 0 1 2 3 5 6 7 8 9 10 12 13 14 15 16 17 18 20
---------------------------------------------------------------------------
Magic Users New Damage Table. The damage listed by each spell shows how
much damage can be given by using 100 mana points at the apropriate level.
To make it worth-while to learn new damaging spells, a spell which is
"overlapped" by a new spell will give less damage than the exact calculated
average.
Spell 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Mag Mis 6 10 16 18 32 45 " " " " " " " " " " " " " "
Chill* 16 22 34 47 76 93 " " " " " " " " " " " "
Burn Han 37 51 79 96 112 132 " " " " " " " " " "
Shock 82 100 115 135 151 174 " " " " " " " "
Lightb 118 138 154 177 225 251 " " " " " "
Spray 157 180 229 255 280 310 " " " "
Energy 11 17 22 28 33 39 39 39(11)
Fireb 285 315 350 386 427 495
*Chill Touch may reduce STR by -1 when failing saving throw.
Clerics
Spell 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Earthq *
Dispel Evil *
Call Lightn X
Harm X
Dispel Evil is special (0..100) (7 Max)
Earthquake is special (7 Max)
Call Lightning is special (7 Max)
Harm is fairly special (3 Max)
*** NEW *** Spell listing By Level and Class
LEVEL Magic User Cleric
(1) Magic Missile (1) Armor
(1) Ventriloquate (1) Cure Light
(2) Detect Magic (2) Create Water
(2) Detect Invisible (2) Detect Poison
(3) Chill Touch (3) Create Food
(3) - (3) Detect Magic
(4) Invisibility (4) Cure Blind
(4) - (4) Detect Evil
(5) Burning Hands (5) Bless
(5) Armor (5) Detect Invisible
(6) Locate Object (6) Blindness
(6) - (6) Protection from Evil
(7) Shocking Grasp (7) Earthquake
(7) Strength (7) Sense Life
(8) Blindness (8) Summon
(8) Teleport with Error (8) Poison
(9) Lightning Bolt (9) Cure Critic
(9) - (9) Remove Poison
(10) Control Weather (10) Locate Object
(10) - (10) Dispel Evil
(11) Color Spray (11) Word of Recall
(11) - (11) -
(12) Enchant Weapon (12) Call Lightning
(12) Curse (12) Remove Curse
(13) Energy Drain (13) Control Weather
(13) - (13) Sanctuary
(14) Sleep (14) Heal
(14) Charm Person (14) -
(15) Clone (15) Harm
(15) Fireball (15) -

85
doc/OLD-DOCS/spells.doc Normal file
View File

@@ -0,0 +1,85 @@
/* ************************************************************************
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
************************************************************************* */
OUT OF DATE I THINK (MS)
Description of affected_type structure:
struct affected_type
{
byte type; /* The type of spell that caused this */
byte duration; /* For how long its effects will last */
byte modifier; /* This is added to apropriate ability */
byte location; /* Tells which ability to change(APPLY_XXX)*/
long bitvector; /* Tells which bits to set (AFF_XXX) */
struct affected_type *next;
};
The type is set to the constants defined in spells.h. These are any of
SPELL_XXX, ei. SPELL_ARMOR.
Duration will be decreased at each time update.
Location is determined by the APPLY_XXX, ei. APPLY_STR to change strength.
Modifier will be added to the apropriate APPLY_XXX
Bitvector will set bits in the char_data->char_special_data.affected_by
---------------------------------
Description of handler.c routines:
void affect_location_apply ( struct char_data *ch,
struct affected_type *af, int type);
/* This procedure will (depending on type) Apply or Remove a characters */
/* special bonus to abilities, which have been gained by spells */
When Type is 1, Modifier will be added to an ability, and Bitvector will
set bits in the "char_data->char_special_data.affected_by" bitvector. When
Type == 0, Modifier is subtracted, and bits are removed.
void affect_to_char( struct char_data *ch, struct affected_type *af )
This procedure allocates new memory for an affected_type structure, and
inserts a copy of "*af" in the char_data->affected linked list. After
insertion, the "affect_location_apply" is called, with type == 1.
void affect_remove( struct char_data *ch, struct affected_type *af )
This procedure is the reverse of affect_to_char. Upon calling "af" MUST
point to the structure(element) in the linked list that is to be removed.
If not, the program will do an "exit()". Memory used is released, and
"affect_location_apply" is called, with type == 0.
BEWARE! Some spells may have several structures, since they must change
more than one attribute! Calling affect_from_char does not mean that you
have removed every occurence of a certain spell. But you can be sure that
bits are masked out! Use affect_from_char below.
---------------------------------
void affect_from_char( struct char_data *ch, byte skill )
This fixes the warning above, by calling affect_remove with every
structure that has same spelltype set as skill.
bool affected_by_spell( struct char_data *ch, byte skill )
This procedure will check if a character is affected by a spell (the
SPELL_XXX constants are used). Returns FALSE if not, otherwise TRUE.

12
doc/OLD-DOCS/time.doc Normal file
View File

@@ -0,0 +1,12 @@
/* ************************************************************************
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
************************************************************************* */
Time of DikuMud
DikuMud has 7 days per week
35 days per month
17 months per year
DikuMud time is 48 times faster than the real time. One hour of game
time passes every 75 seconds of real time.

219
doc/OLD-DOCS/utils.doc Normal file
View File

@@ -0,0 +1,219 @@
/**************************************************************************
* Copyright (C) 1993 - see 'license.doc' for complete information. *
* Jeremy Elson; 7/12/93 *
**************************************************************************/
CIRCLEMUD UTILITIES
"utils.doc"
There are currently 12 utilities and several shell scripts which come with
CircleMUD to help you run and maintain it. This file documents them.
Brief Synopsis
--------------
AUTOWIZ Automatically generate a wizlist and an immlist from the
playerfile.
DELOBJS Delete the object files (i.e. crash-save, rent, cryo-rent,
etc.) of players who no longer exist in the playerfile.
HASMAIL Return an exit status of 0 or 1, depending on if the
recipient specified has MUDmail waiting or not.
LISTRENT Show the contents of one of more object files.
MAILINDEX Generate a list of all mail contained in a mail file.
MUDPASSWD Change the password of a MUD character in a playerfile.
PURGEPLAY Create a new playerfile with deadweight characters removed.
READMAIL Print mail contained in a mail file.
SHOWPLAY List players contained in a playerfile.
SIGN Present a sign on a port (i.e. "MUD will be down today").
SPLIT Split a large file into several smaller files.
SYNTAX_CHECK Check the syntax of a set of world files.
Detailed Documentation
----------------------
AUTOWIZ
Autowiz is not really meant to be run by a person; the MUD automatically
executes it every time someone reaches immortality or is promoted to an
immort or higher level.
It must be compiled and in the circle/bin directory in order for the
automatic wizlist system to work, of course.
DELOBJS
delobjs <playerfile> <file1> <file2> <filen>
Delobjs generates an index of all players in the playerfile, then checks
each file listed on the command line to make sure that the object file
has a corresponding player in the player index. If the player does not
exist, the object file is deleted.
Although this program can be run manually, it is much easier simply to
use the "purgeobjs" script in the lib/plrobjs directory. That script
will automatically run delobjs on every file in each of the 5 object
directory, and save a list of the files deleted to a file called DELETED.
LISTRENT
listrent <file1> <file2> ... <filen>
Listrent will simply list the contents of an object save file. You can
list as many files as you like on the command line; the contents of each
file will be listed.
Included in the lib/plrobjs directory is a script called 'searchfor', which
you can use to see who in the game has certain items. For example, if you
wanted to see who had object #3001 rented, you would switch into the
lib/plrobjs directory and type "searchfor 3001".
HASMAIL
hasmail <mail-file> <recipient-name>
Hasmail has no output -- it just returns a 0 or 1, depending on if you
have mail waiting or not. It's useful for putting something like this
in your .login (assuming you use csh):
set NAME = ras
if ( { hasmail ~/circle/lib/misc/plrmail $NAME } ) then
echo "You have mud-mail waiting."
endif
MAILINDEX and READMAIL
CircleMUD's mail files are binary files -- they can't be read with 'cat',
'more', etc. The MAILINDEX and READMAIL commands allow you to see the
contents of a mail file.
Obviously, there are a lot of serious privacy issues which go along with
programs like this. For exactly that reason, I didn't even write these
utilities for months after I wrote the mail system. I eventually broke
down and wrote them because there is no way to save Mudmail after you've
read it from within the MUD, but READMAIL allows you to do just that --
read your mail without deleting it.
As a footnote, the MUDmail system was intentionally designed so that
one is not able to save mail after having read it. I have a tendency
to save all of my (real) email, as do many other people, and I didn't
want hundreds of mud players to start saving all their MUDmail at the
expense of my disk.
Now that I've loaded these utilities with excessive moral baggage, I'll
describe how they are used.
mailindex <mailfile>
readmail <mailfile> <recipient-name>
MAILINDEX will show you a list of all letters currently in the mail file,
in the following format:
Recipient 1
Sender 1
[...]
Sender n
Recipient 2
Sender 1
[...]
Sender n
[...]
Recipient m
Sender 1
[...]
Sender n
READMAIL will show you all mail addressed to the recipient you specify.
MUDPASSWD
mudpasswd <playerfile> <character> <new-password>
MUDPASSWD is used to change the password of a character in the playerfile.
It can be done while the game is running, but "set passwd" from within the
game is probably safer.
MUDPASSWD is useful for people who forget their passwords, etc. SET PASSWD
does the same thing.
PURGEPLAY
purgeplay <playerfile-name>
PURGEPLAY will read all the characters in the playerfile you specify, and
output a new playerfile called 'players.new', with "deadweight" characters
removed. The original playerfile will not be changed. Characters meeting
one or more of the following criteria will not be included in players.new:
- Buggy characters (i.e., non-alphabetic name or invalid level)
- Characters with a DELETED flag
- Level 0 characters (connected but never entered game)
- If a character is NOT cryo-rented, the following timeouts apply:
- Level 1 characters who have not played in 4 days
- Level 2-4 characters who have not played in 7 days
- Level 5-10 characters who have not played in 30 days
- Level 11-30 characters who have not played in 60 days
- Level 31 characters who have not played in 90 days
- If a character IS cryo-rented, the timout for levels 1-31 is 90 days.
- A CHARACTER WITH A NODELETE FLAG WILL NOT BE REMOVED, even if
the character meets one or more of the above criteria.
PURGEPLAY will generate a report of all characters which were not included
in players.new and the reason for their omission.
SIGN
sign <filename | '-'> <port #>
SIGN is used for putting a message on a port, i.e., "BazookaMUD is currently
down for repairs." The second argument can either be the name of a text
file or a dash; if it is a dash, SIGN will prompt you for the sign text.
Port # is, of course, the port on which you'd like the sign to be displayed.
SPLIT
Split reads text files from standard input and writes a series of files
to disk as output. Its intended usage it to take a large diku world
file and split it into several smaller, more managable files. You'll
probably only need to use it if you're porting a large world file from
some other MUD to Circle.
To use SPLIT, insert a line containing only "=filename" at each point
in the original file where you'd like SPLIT to start writing to a
new file. When SPLIT reaches a line starting with '=', it will begin
writing all subsequent lines to a file called 'filename' until the next
'=' or EOF is encountered. #99999 is appended to the end of each file.
A file called 'index' is created, containing a list of all files which
were created (see running.doc for more information about index files.)
SYNTAX_CHECK
syntax_check <zone number>
Syntax_check is a utility for checking that world files are formatted
correctly. It should be run from the main lib/world directory. If you
type 'syntax_check 30', it will check the files wld/30.wld, obj/30.obj,
mob/30.mob, and zon/30.zon.

312
doc/OLD-DOCS/values.doc Normal file
View File

@@ -0,0 +1,312 @@
/* ************************************************************************
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
************************************************************************* */
ITEM VALUE DOCUMENTATION
"values.doc"
These values are used, as illustrated below, with the different
item types. The various item types are shown in dbsup.doc.
ITEM_LIGHT (1)
Value[0]: Not Used
Value[1]: Not Used
Value[2]: Number of hours the light can be used for. Zero hours means that
the light has gone out. A negative number will create an eternal
light source.
Value[3]: Not Used
ITEM_SCROLL (2)
Value[0]: Level of the spell on the scroll.
Value[1]: Which spell (see list somewhere around the end of file)
Value[2]: Which spell
Value[3]: Which spell
The values(1-3) are three (or less) different spells, mixed 'on' the scroll.
Unused spells should be set to -1.
ITEM_WAND (3)
Value[0]: Level of spell in wand.
Value[1]: Max Charges (1..X)
Value[2]: Charges Left
Value[3]: Which spell in wand (see list somewhere around the end of file)
ITEM_STAFF (4)
Value[0]: Level of spell in staff.
Value[1]: Max Charges (1..X)
Value[2]: Charges Left
Value[3]: Which spell in staff (see list somewhere around the end of file)
ITEM_WEAPON (5)
Value[0]: Not Used
Value[1]: Number of dice to roll for damage
Value[2]: Size of dice to roll for damage
Value[3]: The weapon type. Type is one of:
NUMBER CATEGORY Message type
2 : Slash "whip/whips"
3 : Slash "slash/slashes"
6 : Bludgeon "crush/crushes"
7 : Bludgeon "pound/pounds"
11 : Pierce "pierce/pierces"
New types can be added as needed.
ITEM_FIREWEAPON (6)
Value[0]: -
Value[1]: -
Value[2]: -
Value[3]: -
ITEM_MISSILE (7)
Value[0]: -
Value[1]: -
Value[2]: -
Value[3]: -
ITEM_TREASURE (8)
Value[0]: -
Value[1]: -
Value[2]: -
Value[3]: -
ITEM_ARMOR (9)
Value[0]: The effective AC. >0 enhances the armour class. <0 reduces the
the armour class (cursed armour for example).
Value[1]: -
Value[2]: -
Value[3]: -
ITEM_POTION (10)
Value[0]: Level of the spell in the potion.
Value[1]: Which spell (Listed elsewhere in this file)
Value[2]: Which spell
Value[3]: Which spell
The values(1-3) are three (or less) different spells, mixed in the potion.
Unused spells should be set to -1.
Eg.
Value 0 : 30 (Level)
Value 1 : 27 (Harm)
Value 2 : 17 (Curse)
Value 3 : 4 (Blindness)
(* Don't drink this - It's bad for your health! *)
ITEM_WORN (11)
Value[0]: -
Value[1]: -
Value[2]: -
Value[3]: -
ITEM_OTHER (12)
Value[0]: -
Value[1]: -
Value[2]: -
Value[3]: -
ITEM_TRASH (13)
Value[0]: -
Value[1]: -
Value[2]: -
Value[3]: -
ITEM_TRAP (14)
Value[0]: -
Value[1]: -
Value[2]: -
Value[3]: -
ITEM_CONTAINER (15)
Value[0]: Maximum weight the container can contain.
Value[1]: Container flags:
CLOSEABLE 1
PICKPROOF 2
CLOSED 4
LOCKED 8
Value[2]: The item-number of the object which can open the object. -1 means
no lockability.
Value[3]: Internal use for Corpses that must "rot".
ITEM_NOTE (16)
Value[0]: Tounge (language of writing). Not yet used.
Value[1]: -
Value[2]: -
Value[3]: -
ITEM_DRINKCON (17)
Value[0]: Maximum drink-units the drink-container can contain.
Value[1]: Number of drink-units that are left in the container.
Value[2]: The type of liquid in the drink-container, one of:
Type nr. Effect
Drunkness Fullness Thirst
LIQ_WATER 0 0 1 10
LIQ_BEER 1 3 2 5
LIQ_WINE 2 5 2 5
LIQ_ALE 3 2 2 5
LIQ_DARKALE 4 1 2 5
LIQ_WHISKY 5 6 1 4
LIQ_LEMONADE 6 0 1 8
LIQ_FIREBRT 7 10 0 0
LIQ_LOCALSPC 8 3 3 3
LIQ_SLIME 9 0 4 -8
LIQ_MILK 10 0 3 6
LIQ_TEA 11 0 1 6
LIQ_COFFE 12 0 1 6
LIQ_BLOOD 13 0 2 -1
LIQ_SALTWATER 14 0 1 -2
LIQ_CLEARWATER 15 0 0 13
The above values for drunkness/fullness/thirst are used per
four "units" drunk. The values are expressed in HOURS!
Example:
Dragon empties a bottle (say 7 units) of saltwater.
His Drunkness is not changed ((7/4)*0)
His Fullness increases by ((7/4)*1) hours
His Thirst increases by ((7/4)*-2) hours, thus making
him More thirsty.
The hours above are numbers between 0 and 24. 24 hours is
maximum for drunkness/fullness/thirst. When hours are zero
for any drunkness/fullness/thirst the person will be
sober, hungry, or thirsty respectively.
Value[3]: if this value is non-zero, then the drink is poisoned.
ITEM_KEY (18)
Value[0]: The key-type. This value must match the lock-type the door
that the key can open.
Value[1]: -
Value[2]: -
Value[3]: -
ITEM_FOOD (19)
Value[0]: The number of hours, that this food will fill the stomach
Value[1]: -
Value[2]: -
Value[3]: If this value is non-zero, the food is poisoned.
ITEM_MONEY (20)
Value[0]: The number of gold coins "in the pile of coins".
Value[1]: -
Value[2]: -
Value[3]: -
ITEM_PEN (21)
Value[0]: -
Value[1]: -
Value[2]: -
Value[3]: -
ITEM_BOAT (22)
Value[0]: -
Value[1]: -
Value[2]: -
Value[3]: -
ITEM_FOUNTAIN (23)
Value[0]: Maximum drink-units the drink-container can contain.
Value[1]: Number of drink-units that are left in the container.
Value[2]: The type of liquid in the drink-container; definitions
are the same as for ITEM_DRINKCON.
Value[3]: Drink is posioned if non-zero.
-------------------------------------------------------------------------
IMPORTANT NOTICE!!
Since the level versus average damage calculations are performed as shown
in "spell_info.doc" all the offensive spells are individually much stronger
than higher level spells. For example:
1 fireball of level 15 gives more damage than one of level 16 which give
more damage than level 17 which give more damage than level 18 which
give more.... etc.
Thus please make all offensive potions/scrolls/etc. as the basic level
they are designed for. You can see the level below. You can see the spells
average damage, by looking at the spell versus the level of the spell,
divided by the number of spells learned at that particular level. Example:
Level 9 Lightning bolt give (102/2) average damage. Divided by 2, because
this is the level at which it is first learned (You can almost
always cast two spells are first learned level). At level 10 it
gives (120/3) average damage.
Looking at the table in "spell_info.doc", you should know that each spell
is designed so that it will kill a victim three levels below the mana user,
if the manauser ONLY cast his spell....
-------------------------------------------------------------------------
The Y/N rows below indicate which potions/scrolls/wands/staffs that are
possible to make. The MIN_LEV is the Minimum Level DEMANDED by the item
you are making. The game will crash if making level less than demanded.
-------------------------------------------------------------------------
POTION SCROLL WAND STAFF MIN_LEV
TYPE_UNDEFINED -1 Y Y Y Y -
SPELL_RESERVED_DBC 0 N N N N -
SPELL_ARMOR 1 Y Y Y N >0
SPELL_TELEPORT 2 Y Y Y Y >0
SPELL_BLESS 3 Y Y Y N ...
SPELL_BLINDNESS 4 Y Y Y Y
SPELL_BURNING_HANDS 5 N N N N == 5
SPELL_CALL_LIGHTNING 6 Y Y N Y >=12
SPELL_CHARM_PERSON 7 N Y N Y
SPELL_CHILL_TOUCH 8 N N N N == 3
SPELL_CLONE 9 Y Y Y N
SPELL_COLOUR_SPRAY 10 N Y Y N ==11
SPELL_CONTROL_WEATHER 11 N N N N
SPELL_CREATE_FOOD 12 N Y N N
SPELL_CREATE_WATER 13 N N N N
SPELL_CURE_BLIND 14 Y N N Y
SPELL_CURE_CRITIC 15 Y N N Y
SPELL_CURE_LIGHT 16 Y N N Y
SPELL_CURSE 17 Y Y N Y
SPELL_DETECT_EVIL 18 Y N N Y
SPELL_DETECT_INVISIBLE 19 Y N N Y
SPELL_DETECT_MAGIC 20 Y N N Y
SPELL_DETECT_POISON 21 Y Y N N
SPELL_DISPEL_EVIL 22 Y Y Y Y == 10
SPELL_EARTHQUAKE 23 N Y N Y == 7
SPELL_ENCHANT_WEAPON 24 N Y N N
SPELL_ENERGY_DRAIN 25 Y Y Y Y == 13
SPELL_FIREBALL 26 N Y Y N == 15
SPELL_HARM 27 Y N N Y == 15
SPELL_HEAL 28 Y N N Y
SPELL_INVISIBLE 29 Y Y Y Y
SPELL_LIGHTNING_BOLT 30 N Y Y N == 9
SPELL_LOCATE_OBJECT 31 N N N N
SPELL_MAGIC_MISSILE 32 N Y Y N == 1
SPELL_POISON 33 Y N N Y
SPELL_PROTECT_FROM_EVIL 34 Y Y Y Y
SPELL_REMOVE_CURSE 35 Y Y N Y
SPELL_SANCTUARY 36 Y Y N Y
SPELL_SHOCKING_GRASP 37 N N N N == 7
SPELL_SLEEP 38 Y Y Y Y
SPELL_STRENGTH 39 Y Y N Y
SPELL_SUMMON 40 N N N N
SPELL_VENTRILOQUATE 41 N N N N
SPELL_WORD_OF_RECALL 42 Y Y Y Y
SPELL_REMOVE_POISON 43 Y N N Y
SPELL_SENCE_LIFE 44 Y N N Y
SPELL_IDENTIFY *53* N Y N N