Adding Creation Spells (chapter 3, part 2)


The Rangers' weapon of choice should be a bow, and it would be nice if they did not have to worry about where to get one. There are two bows described in the object files included with the game, a hunting bow, which says it is not recommended for combat, and a golden bow, which is a special bow which must be earned in area 50. This being the case, we will build a special "Archer Bow" for their use, and code a spell that lets them conjure one.


Open the world object file "30.obj", and find the top of object #3030, the torch, at about line 177. Between the torch and the flail above it, insert the following section:

#3026
bow archer~
an Archer bow~
A green Archer bow is here.~
~
5 dmnopq 8193
0 3 5 11
3 30 20
E
bow archer~
This is an Archer bow, custom wrought for the Rangers' guild.  An
excellent weapon, but useful solely to members of that guild.  Every good
Ranger should learn to make and use one. 
~



This will create the Archer bow, and make it a weapon which can be wielded only by Rangers, cannot be sold to any shopkeeper and cannot be "donated". After all, the Rangers are all supposed to be able to make one themselves. At this point, you might also want to assign this weapon to the Huntress guildguard we built in the previous chapter. Close "30.obj" and open "30.zon". At about line 74, there is a pair of lines which places the guildguard and assigns her a sword:

 
M 0 3029 1 3070         Ranger Guard
E 1 3022 100 16                 Long Sword

Replace these with the following lines:

M 0 3029 1 3070         Ranger Guard
E 1 3026 999 16                 Archer Bow



Further down, let's do the same for the Rangers' waitress. The following group of lines, at about line 100, creates the waitress and gives her certain items, including her weapon:

M 0 3030 1 3071         Rangers' Waitress
G 1 3003 100                    Firebreather
G 1 3004 100                    Local Bottle
E 1 3021 100 16                 Small Sword

Replace these lines with the following:

M 0 3030 1 3071         Rangers' Waitress
G 1 3003 100                    Firebreather
G 1 3004 100                    Local Bottle
E 1 3026 999 16                 Archer Bow



These two characters will now be armed with bows instead of swords. This is not actually necessary, but under the circumstances that these characters are part of the Rangers guild it is a nice touch. To allow for players to have the bows and still have them equipped on the two non-player characters, the "maximum existing" values for the weapons have been boosted here from 100 to 999. Close "30.zon" and open "30.mob". We should make one last alteration to their descriptions here, and they will be all set. At about line 258, change the Huntress's short description line, the third line for mobile #3029 to the following: A huntress plays with her bow as she guards the entrance.


Now, at about line 274, change the long description for the waitress, mobile #3030, to the following:


This 14-year-old girl might fool a member of another guild, but you know that she's one tough cookie. She very friendly, a little flirtatious even, but woe to anyone who angers her. She specializes in punctured egos and Swiss cheese corpses.


Once that is done, close "30.mob" and we will start on adding the spell for the Rangers to create this bow for their own use.


Open "spells.h" and find the "SPELL_x" definitions, starting at line 39. After the last one, at around line 90, insert the following line:

#define SPELL_CREATE_BOW             52



Close "spells.h" and open "constants.c". Jump down to about line 701, where you will find the beginning of the spell_wear_off_msg string array constant:

const char *spell_wear_off_msg[] = {
  "RESERVED DB.C",              /* 0 */
  "You feel less protected.",   /* 1 */
  "!Teleport!",
  "You feel less righteous.",
  "You feel a cloak of blindness disolve."
  "!Burning Hands!",            /* 5 */
  "!Call Lightning",
  "You feel more self-confident.",
  "You feel your strength return.",
  "!Clone!",
  "!Color Spray!",              /* 10 */
  "!Control Weather!",
  "!Create Food!",
  "!Create Water!",
  "!Cure Blind!",
  "!Cure Critic!",              /* 15 */
  "!Cure Light!",
  "You feel more optimistic.",
  "You feel less aware.",
  "Your eyes stop tingling.",
  "The detect magic wears off.",/* 20 */
  "The detect poison wears off.",
  "!Dispel Evil!",
  "!Earthquake!",
  "!Enchant Weapon!",
  "!Energy Drain!",             /* 25 */
  "!Fireball!",
  "!Harm!",
  "!Heal!",
  "You feel yourself exposed.",
  "!Lightning Bolt!",           /* 30 */
  "!Locate object!",
  "!Magic Missile!",
  "You feel less sick.",
  "You feel less protected.",
  "!Remove Curse!",             /* 35 */
  "The white aura around your body fades.",
  "!Shocking Grasp!",
  "You feel less tired.",
  "You feel weaker.",
  "!Summon!",                   /* 40 */
  "!Ventriloquate!",
  "!Word of Recall!",
  "!Remove Poison!",
  "You feel less aware of your suroundings.",
  "!Animate Dead!",             /* 45 */
  "!Dispel Good!",
  "!Group Armor!",
  "!Group Heal!",
  "!Group Recall!",
  "Your night vision seems to fade.",   /* 50 */
  "Your feet seem less boyant.",
  "!UNUSED!"
};



While "create bow" isn't the type of spell that needs to wear off, we should nonetheless make a note of our new spell here. At about line 754, between the "Your feet seem less boyant.", line, which is the entry for the Waterwalk spell, and the "!UNUSED!" which follows it, insert the following line:

 
  "!Create Bow!",


Now close "constants.c" and open "spell_parser.c", and once again you will find spells defined starting on line 37. At about line 94, you will find the start of the "!UNUSED!", entries:

 
  "group recall",
  "infravision",                /* 50 */
  "waterwalk",
  "!UNUSED!",
  "!UNUSED!",
  "!UNUSED!",
  "!UNUSED!",

Change the first one to "create bow", as follows:

  "group recall",
  "infravision",                /* 50 */
  "waterwalk",
  "create bow",
  "!UNUSED!",
  "!UNUSED!",
  "!UNUSED!",


Starting at about line 856, you will find the function mag_assign_spells, which registers spells and skills for player use. As with the "bearhug" skill, we need to add an entry for our "create bow" spell. This time, however, we are going to enter it as one of the magic abilities. Also, there is already a template in place for creating items, a group of functions which already are used by the "create food" spell, and which can be modified to also handle the "create bow" spell. Around line 1000, you will find the spello function calls for the last of the "castable" spells and the beginning of the non-castable spells and the skills:

  spello(SPELL_SENSE_LIFE, 20, 10, 2, POS_STANDING,
        TAR_CHAR_ROOM | TAR_SELF_ONLY, FALSE, MAG_AFFECTS);

  /* NON-castable spells should appear here */
  spello(SPELL_IDENTIFY, 0, 0, 0, 0,
        TAR_CHAR_ROOM | TAR_OBJ_INV | TAR_OBJ_ROOM, FALSE, MAG_MANUAL);

Between the last castable spell and the first non-castable spell, insert
the following lines: 

  spello(SPELL_CREATE_BOW, 30, 5, 4, POS_STANDING,
        TAR_IGNORE, FALSE, MAG_CREATIONS);


This registers the spell with the spell interpreter, and sets it to use the existing MAG_CREATIONS functions.


We now need to modify these functions to handle our new spell. Close "spell_parser.c" and open "magic.c". The function mag_creations starts at about line 1092. About 9 lines down is the following switch statement:

  switch (spellnum) {
  case SPELL_CREATE_FOOD:
    z = 10;
    break;
  default:
    send_to_char("Spell unimplemented, it would seem.\r\n", ch);
    return;
    break;
  }


Right before the default case, we need to add the following lines to implement the "create bow" spell:

  case SPELL_CREATE_BOW:
    z = 3026;
    break;


Now close "magic.c" and open "class.c". We need to enable the new spell for the Rangers to learn and use, so go down once again to the Rangers section of init_spell_levels at about line 562, and add the following line:

  spell_level(SPELL_CREATE_BOW, CLASS_RANGER, 1);


Finally, close "class.c", delete any compiler object files you might have in your "src" directory from previous compiles, and make or re-make the program. If everything is in order, your Rangers should now be able to cast "create bow" at any level.