Spell Sphere System [by Christoffer Lundberg]
Snippet Posted Wednesday, August 12th @ 11:37:23 PM, by George Greer in the Skills dept.
Added Apr 27, 1998. Click the link below to read it or download it.

From: Christoffer Lundberg <avatar@ORION.BODEN.SE>
Subject: Spheres for spells

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


<< Spells how to? [by Rasdan] | Reply | View as text | Flattened | Spell/Skill List [by Raven Jade Kenago] >>

 


Related Links
  download
Related Articles
More by greerga
 
 

CircleMUD Snippets
 
Note: Not all of these snippets will work perfectly with your version of code, so be prepared to fix one or two bugs that may arise, and please let me know what you needed to do to fix it. Sending a corrected version is always welcome.
Finally, if you wish to use any of the snippets from this page, you are more than welcome, just mention the authors in your credits. If you wish to release any of these snippets to the public on another site, contact me FIRST.