Re: [Circle] race dependant spells

From: Daniel Koepke (
Date: 11/10/96

On Mon, 11 Nov 1996, Nic Suzor wrote:

> i thought about that, but it would mean that everyone would be able to
> practice those spells, and see them etc, but only ogres could cast... its a
> little messy, i was hoping for a cleaner way to do them...

To 'struct spell_info_type' (in spells.h) add: 

  bool races[NUM_RACES];
  bool race_dependant; /* automatically set by spell_race() */

Now add the following function to spell_parser.c:

  void spell_race(int spell, int race) {
    char buf[256];
    int bad = 0;

    if (spell < 0 || spell > TOP_SPELL_DEFINE) {
      sprintf(buf, "SYSERR: attempting assign to illegal spellnum %d", spell);

    if (race < 0 || race >= NUM_RACES) {
      sprintf(buf, "SYSERR: assigning '%s' to illegal race %d",
	      skill_name(spell), race);
      bad = 1;

    if (!bad) {
      spell_info[spell].races[race] = TRUE;
      spell_info[spell].race_dependant = TRUE;

Add the following lines to 'void spello()':

  for (i = 0; i < NUM_RACES; i++)
    spell_info[spell].races[i] = FALSE;
  spell_info[spell].race_dependant = FALSE;

The following macro will also be of some use:

  #define CAN_CAST(ch, s)	(GET_LEVEL(ch) >= LVL_IMMORT   || \
				 !spell_info[s].race_dependant || \

Now in spec_procs.c, do the following (my new lines are marked with
a plus sign at the beginning; you'll need to remove those.  Any that
are not marked with the + are context lines to show you where to put
them), these changes occur somewhere around line 121.

    if (GET_LEVEL(ch) >= spell_info[i].min_level[(int) GET_CLASS(ch)])
+     if (CAN_CAST(ch)) {

Now in SPECIAL(guild), find the following line:

  if (skill_num < 1 ||

And change it to:

  if (skill_num < 1 || !CAN_CAST(ch) ||

You can do the same in do_cast if you want to present a special
message when someone tries to cast a spell their race is not
capable of casting; although since they can't learn the spell and
they can't see it in the practice list (unless they are immortal)
I suppose it doesn't really matter.

Daniel Koepke
Forgive me father, for I am sin.
Back after a brief excursion to Alaska.

| Ensure that you have read the CircleMUD Mailing List FAQ: |
|   |

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