This almost oughta have it's own snippet (hint, hint, Alex =)
It's actually not too difficult, although it can be time consuming.
First, create the objects that are the material components (this is
particularly time consuming if you have a lot of them...).
Write down the vnums of each one as you go along (1 = silver powder,
2 = vampire ichor, etc.)
Then, in order to use mag_materials: first, create a function something
to the effect of:
/* return 1 if caster has components, 0 if they don't */
int has_material(struct char_data *caster, int spellnum) {
int x = 0;
/* prototype for mag_materials, for reference:
int mag_materials(struct char_data *ch, int item0, int item1,
int item2, int extract, int verbose);
*/
switch(spellnum) {
SPELL_FIREBALL:
x = mag_materials(caster, 1, 2, NULL, TRUE, FALSE);
break;
SPELL_HEAL:
x = mag_materials(caster, 3, NULL, NULL, TRUE, TRUE);
break;
default:
x = 1; /* No material components necessary, so check successful */
break;
}
/* You may want a check for clerics that they have a holy symbol,
* and if not, set x = 0. Alternately, make another function,
* similar to this one, that checks for holy symbols for clerics
* only for certain spells... For example: */
if (IS_CLERIC(caster) && x == 1) { /* If x == 0, we already failed
anyway */
x = has_holy_symbol(caster, spellnum);
}
return x;
}
/* Return 1 if carrying holy symbol, 0 otherwise */
/* Can theoretically be used for other things (warding off vampires),
* and not just spell casting (just call with spellnum = -1)... */
/* In fact, it might be good to make a generalized function:
int has_object(struct char_data *caster, int vnum); assuming this
doesn't already exist, which it might - I haven't looked ;) */
int has_holy_symbol(struct char_data *caster, int spellnum) {
/* Go through caster's inventory and check for holy symbol - *
* code for doing this exists elsewhere, so find it and copy *
* it accordingly ;P Pseudo-code: */
int y = 0;
search inventory and equipped for holy symbol;
if (holy symbol is found)
y = 1;
else
y = 0;
switch (spellnum) {
SPELL_HEAL:
SPELL_CURE_BLIND:
SPELL_TURN_UNDEAD:
return y;
break;
default: /* No holy symbol required, so always return success */
return 1;
break;
}
}
Then in do_cast() in spell_parser.c, right before "You throws the
dice and takes your chances" ;) add in a call to this function:
if (has_material(ch, spellnum)) {
/* throws the dice... */
} else {
/* leave do_cast without casting the spell */
/* Probably want to send some sort of message to caster, and
* maybe to room as well? */
}
That should do it. I'm doing all this in the mailer, so I may easily
have overlooked something, but this should be at least 99% of it...
>----------
>From: Christoffer Lundberg[SMTP:avatar@ORION.BODEN.SE]
>Sent: Friday, January 09, 1998 3:32 AM
>To: CIRCLE@POST.QUEENSU.CA
>Subject: [CODE] [QUESTION]: Reagent-based spells
>
>As some, if not all of you, know that there is a mag-function called
>mag_ingredients or something. I've tried to add a spell in this function,
>but probably I must have put it in the wrong place.
>Where should I put a spell in mag_ingredients?
>
>There must be a switch(spellnum) somewhere, but where?
>Could anybody who have done this help me out and tell me where
>the switch should be placed...
>
>/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 |
> +------------------------------------------------------------+
>
+------------------------------------------------------------+
| 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