[CODE]: Spheres for spells

From: Christoffer Lundberg (avatar@ORION.BODEN.SE)
Date: 01/16/98


All of you out there that have played TCS (The Creator's Shadow)
and wondered: How could I add a sphere-system to my MUD?

Well, have no fear, Avatar is here.

-=-=-=-=-=-=-=-
+     means add this line
-     means remove this line
!     means change this line
&     this is how the change (!) should look afterwards
-=-=-=-=-=-=-=-
First, you must add the spheres to the struct spell_info_type in spells.h

struct spell_info_type {
   byte min_position;   /* Position for caster   */
   int mana_min;        /* Min amount of mana used by a spell (highest lev) */
   int mana_max;        /* Max amount of mana used by a spell (lowest lev) */
   int mana_change;     /* Change in mana used by spell from lev to lev */

   int min_level[NUM_CLASSES];
   int routines;
   byte violent;
   int targets;         /* See below for use with TAR_XXX  */
+  int fire;
+  int water;
+  int air;
+  int earth;
};

-=-=-=-=-=-=-=-
Second, you must add a lot of numbers and stuff in spell_parser.c

/* Assign the spells on boot up */
void spello(int spl, int max_mana, int min_mana, int mana_change, int minpos,
                 int targets, int violent, int routines,
+                int fire, int water, int air, int earth)
{
  int i;

  for (i = 0; i < NUM_CLASSES; i++)
    spell_info[spl].min_level[i] = LVL_IMMORT;
  spell_info[spl].mana_max = max_mana;
  spell_info[spl].mana_min = min_mana;
  spell_info[spl].mana_change = mana_change;
  spell_info[spl].min_position = minpos;
  spell_info[spl].targets = targets;
  spell_info[spl].violent = violent;
  spell_info[spl].routines = routines;
+ spell_info[spl].fire = fire;
+ spell_info[spl].water = water;
+ spell_info[spl].air = air;
+ spell_info[spl].earth = earth;
}

void unused_spell(int spl)
{
  int i;

  for (i = 0; i < NUM_CLASSES; i++)
    spell_info[spl].min_level[i] = LVL_IMPL + 1;
  spell_info[spl].mana_max = 0;
  spell_info[spl].mana_min = 0;
  spell_info[spl].mana_change = 0;
  spell_info[spl].min_position = 0;
  spell_info[spl].targets = 0;
  spell_info[spl].violent = 0;
  spell_info[spl].routines = 0;
+ spell_info[spl].fire = 0;
+ spell_info[spl].water = 0;
+ spell_info[spl].air = 0;
+ spell_info[spl].earth = 0;
}

!  define skillo(skill) spello(skill, 0, 0, 0, 0, 0, 0, 0);

&  define skillo(skill) spello(skill, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
                                                           ^  ^  ^  ^
                                                           |  |  |  |
                                                           Fi Wa Ai Ea

Now, you must change ALL spello(SPELL_???.......
to match the above base define.

example.    spello(SPELL_HEAL, 50, 20, 2, POS_STANDING,
                  TAR_CHAR_ROOM, FALSE, MAG_POINTS | MAG_UNAFFECTS,
                  0, 100, 50, 0);

This means that SPELL_HEAL is the name, it costs 50 mana when you receive
it, minimum-cost is 20 and the mana-cost is reduced with 2 every level
beyond the one you receive it. It can be directed to anyone in the room,
and can only be casted when you are standing. It is not aggressive, it
has the function to restore points(in this case Hitpoints), and to remove
blindness on the target.
The limit of Fire is 0 (no fire needed for healing or removing of
blindness), Water is 100 (water is the source of healing and restoration),
Air is 50 (removal and disenchanting) and Earth is 0 (not needed).

You can come up with your own system when it comes to the Sphere-limits.
Ours is more than level-based. You can seek out the Great Elemental Kings
to learn some of their knowledges, and more...

-=-=-=-=-=-=
Then, in the function do_cast, add the following checks after the check if
you have enough mana.

if (SPHERE(ch, FIRE) < SINFO.fire) {
   send_to_char(The message you like to have.\r\n", ch);
   return;
}
if (SPHERE(ch, WATER) < SINFO.water) {
  send_to_char(The message you like to have.\r\n", ch);
  return;
}
if (SPHERE(ch, AIR) < SINFO.air) {
  send_to_char(The message you like to have.\r\n", ch);
  return;
}
if (SPHERE(ch, EARTH) < SINFO.earth) {
  send_to_char(The message you like to have.\r\n", ch);
  return;
}
-=-=-=-=-=-=-=-=-
Add the structure of the spheres to structs.h. Use one of the free ubyte
places.

ubyte spheres[4];
-=-=-=-=-=-=-=-=-=-=-
In utils.h, add the structure of locating the spheres for checks and
stuff.

#define SPHERE(ch, i)

and, define the spheres

#define FIRE    1
#define WATER   2
#define AIR     3
#define EARTH   4
-=-=-=-=-=-=-=-=-=-=-
If you have any problems, email me at avatar@orion.boden.se
If you use this code, please add me to the credits

/Avatar

                #############################################
                #       You have recieved this E-mail       #
                #    from Avatar at avatar@orion.boden.se   #
                #       If you want you can write back      #
                # if you don't want to then get outta here  #
                #         (Ouch, me 'urt me 'ead)           #
                #############################################


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/15/00 PST