/
Envy20/
Envy20/log/
Envy20/player/
EnvyMud Release 2.0
Monday, 25th December 1995

Kahn		michael@uclink.berkeley.edu
Hatchet		hatchet@uclink.berkeley.edu



=== Classes

The central organizing table for classes is class_table, which is an array of
type 'struct class_type' (defined in 'merc.h') and is defined in 'const.c'.
Mobs have class 0, and players have classes 0 through MAX_CLASS-1.

The fields of class_table are:

    char *	who_name;

	This three-letter name is used for the 'who' listing.  It's also used
	for the list of classes shown to new characters for selecting a class,
	and for matching the player's input in selecting a class.

    int 	attr_prime;

	This attribute is initialized to 16 for new chars of this class.  It
	costs only three practices to train one's prime attribute, versus five
	practices for any other attribute.  In addition, characters may
	increase their prime attribute (only) over 18 by using magic items.

    int 	weapon;

	This object (vnum) is given to new characters of this class for their
	first weapon.

    int 	guild;

	This room (vnum) is off limits to characters of other classes.

    int 	skill_adept;

	This is the maximum level to which a character of this class may train
	a skill or spell.

    int 	thac0_00;		/* Thac0 for level  0		*/
    int 	thac0_47;		/* Thac0 for level 47		*/

	These are thac0's (To Hit Armor Class 0) for a level 0 character and a
	level 47 character of this class.  Thac0 for any particular level is
	computed by linear interpolation.

    int 	hp_min;			/* Min hp gained on leveling	*/
    int 	hp_max;			/* Max hp gained on leveling	*/
    bool	fMana;			/* Class gains mana on level	*/

	The fields hp_min and hp_max are the minimum and maximum hit points
	gained on advancing a level (in addition to the constitution bonus).
	If fMana is true, than the class gains mana when leveling.



=== Adding a new class

This section enumerates the changes that need to be made to the base level
Envy 1.0 code necessary for the addition of a new class.  These changes
presuppose that certain functions (spells, skills) and structures (skill
definitions, poses, titles, etc.) are already made.  These assumptions
are summarized at the end of the file.  For more detailed information
on adding skills and spells, see 'skill.txt'.

MERC.H		- Increase MAX_SKILL by as many skills/spells as you add
------		- Increase MAX_CLASS by one
		- Declare external variables for gsn numbers, as defined
		  in DB.C, in the following form:

extern  int  gsn_<skill/spell_name>

		- DECLARE_DO_FUN( do_<skill_name> ) for all skills
		- DECLARE_SPELL_FUN( spell_<spell_name> ) for all spells
		  --- note that do_<skill_name> and spell_<spell_name>
		      are the C function names of the skills/spells
		      as they exist in magic.c and/or other files

DB.C		- Declare variables for gsn numbers, which are grabbed
----		  by MERC.H for use in all other files:

int             gsn_<skill/spell_name>

		  --- note that gsn numbers are usually used for all
		      skills, and are occasionally used for spells.
                      They are used to speed things up, rather than
                      call skill_lookup each time a skill/spell is used.
		      Don't worry about assigning values to them, they
		      are assigned automatically on startup.

INTERP.C	- Add to cmd_table[ ] any skills (or anything else) that
--------	  will need to be recognized by their name as a command.
		  for example, 

    { "shadow form",    do_shadow,      POS_STANDING,    0,  LOG_NORMAL },

ACT_COMM.C	- Add class poses (17 poses in standard Envy 1.0) to
----------	  pose_table.  Be careful (in this and ANY insert) to
		  keep the proper format with comma separators...arrays
		  will get very screwed up if you miss a comma (see
		  the example in INTERP.C above

CONST.C		- Add class definition (structure) to class_table
-------		- Add class titles (54 * 2 + 2) to title_table
                - #define CLASS_<class name> <class number> below others
		- Change ALL skill_level's in skill_table to have
		  MAX_CLASS values, i.e.

        "armor",                {     5,     1, L_APP, L_APP, L_APP, L_APP },

		  This spell now has 6 values, corresponding to 6
		  classes.  (This step is probably the most painful.)
		- Add all skill/spell definitions to skill_table.
		- If your class will have access to existing skills
		  and/or spells, change the value you added above (L_APP)
		  to the appropriate level for your class

MAGIC.C		- Add code (spell_<name> functions) for all new spells.
-------		  Best location would probably be at the end of the file,
		  though order is immaterial.

ACT_MOVE.C	- Add code (do_<name> functions) for all skills.  This
----------        is assuming that the skills particular to your class
		  involve movement in some way; if not, then these new
		  skills can be placed in the appropriate ACT_####.C file

SPECIAL.C	- If your class will have mobs that use spec_funs
---------         (usually guildmasters, waiters, etc), do the
		  following:
		  - Add spec_fun declaration for spec_cast_<class name>
		  - Add spec_cast_<class name> str_cmp in spec_lookup
		  - Add bool spec_cast_<class name> (function) code

MIDGAARD.ARE	- Assuming that you will be placing the guild for the new
------------	  class in Midgaard, you must find free vnum's for the
		  added rooms/mobs/objects, and do the following:
		  - #MOBILES:  Add Guild Mobs
		  - #OBJECTS:  Add any NEW objects used by Guild Mobs
		  - #ROOMS:    Add Guild Rooms, AND edit any room(s)
                               that connect to your Guild
		  - #RESETS:   Add resets for Guild Mobs
                  - #SHOPS:    Add shop for Guild Waiter (if desired)
		  - #SPECIALS: Add spec_fun for Guild Mobs (if desired)

HELP.ARE	- Add all HELPS for new spells, skills, class, or any
--------	  other helps that will aid players
		- Modify existing helps, if desired, to include similar
		  skills/spells (i.e., add Levitation to help for Fly,
		  rather than create a new HELP for Levitation alone)


NECESSARY FILES AND/OR FUNCTIONS:
---------------------------------
ACT_COMM.C	- poses
CONST.C		- class definition for class_table
CONST.C		- class titles for title_table
CONST.C		- skill/spell definitions for skill_table
MAGIC.C		- spell code
ACT_####.C	- skill code (usually in ACT_MOVE.C)
SPECIAL.C	- spec_fun code (if any)
MIDGAARD.ARE	- Guild Mobs/Rooms and related code
HELP.ARE	- Helps for your new class

Clearly, adding a new class is time-consuming, but a little preparation
can go a long way in reducing your headaches!



=== Immortal Levels

The immortal levels are Hero, Apprentice, Junior, Senior and Director at levels
50 - 54.  Because immortal commands were rewritten as skills, simply being a
Junior does not mean that you will automatically have access to all immortal
commands at that level.  Instead, the commands are assigned by the Implementor
Director, based on both level and group, which is one of Builder, Coder, or
Implementor.  See cmd_table[] in interp.c or skill_table[] in const.c for the
minimum level necessary to use these commands.