Re: [CODE]: Spheres for spells

From: Edward Glamkowski (EGlamkowski@MATHEMATICA-MPR.COM)
Date: 01/16/98


I've done something similar, borrowing from the school and sphere
concept from AD&D.  DGC also does something similar with the rune
magic system it uses.

The way I did it was to add two variables to the spell_info struct
(long school; long sphere;) then created two separate lists of
bitvectors accordingly (SCHOOL_INVOCATION (1 << 0)
SPHERE_HEALING (1 << 1) etc.) This way I could have a spell belong
to more than one school or sphere, and could have a spell belong to
both schools AND spheres :)

Bitvector manipulation is probably easier here anyway, as if you want
to add more schools or sphere, you just add a new entry to the
bitvector list, instead of adding directly to the spell_info struct.

>----------
>From:  Christoffer Lundberg[SMTP:avatar@ORION.BODEN.SE]
>Sent:  Friday, January 16, 1998 4:32 AM
>To:    CIRCLE@POST.QUEENSU.CA
>Subject:        [CODE]: 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
>


     +------------------------------------------------------------+
     | 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