-
Notifications
You must be signed in to change notification settings - Fork 3
Class
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.
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!
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.