Heya all,
I'm in the final stages of adding spell affects to items.
So I can have glasses of detect invis, boots of stealth, etc etc. All
works fine bar 1 aspect.
My stystem works as follows.
In equip_char in handler.c, when a new item is equiped by a character it
checks if the item has any spell/skill affects on it. If it has spell
affects it calls mag_affects in magic.c with the spell affect and a
savingthrow of -1 so I can tell there that its from an object. In
magic.c I change savingthrow to SAVING_ROD if its -1 and set from_object
variable to 1. Then at the bottom I have this:
if (from_object)
for (i = 0; i < MAX_SPELL_AFFECTS; i++)
af[i].duration = -1;
That all works great.
Now part 2.
In unequip_char in handler.c I again check if the item being removed has
a spell affect(s) on it. If it does I remove them all with
affect_from_char, I then go through all the characters equiped items and
see if any of them give the character the spell I just removed. If so I
add it back to the character as I did in equip_char. Again this all
works fine.
Now to the problem.
If I wear an item that gives me say, detect invis, then I cast detect
invis on myself and then remove the item I can't work out how to keep
the affect from the spell on me. Any ideas on how I can do this would be
greatly appreciated.
Some code snippets
from equip_char
/* Add Object Spell Affects */
if (GET_OBJ_SPELL(obj, 0) > 0)
for (i = 0; i < MAX_OBJ_SPELLS; i++)
if ((skill = GET_OBJ_SPELL(obj, i)) > 0) {
if (IS_OBJ_SPELL(obj, i))
mag_affects(GET_OBJ_SPELLLVL(obj, i), ch, ch, skill, -1);
else if (IS_OBJ_SKILL(obj, i)) {
amount = GET_SKILL(ch, skill) + GET_OBJ_SPELLLVL(obj, i);
SET_SKILL(ch, skill, amount);
}
if (strcmp(GET_OBJ_YMESSAGE(obj, i), "None"))
act(GET_OBJ_YMESSAGE(obj, i), TRUE, ch, obj, 0, TO_CHAR);
if (strcmp(GET_OBJ_RMESSAGE(obj, i), "None"))
act(GET_OBJ_RMESSAGE(obj, i), TRUE, ch, obj, 0, TO_ROOM);
}
from unequip_char
/* Remove Object Spell Affects */
if (GET_OBJ_SPELL(obj, 0) > 0)
for (i = 0; i < MAX_OBJ_SPELLS; i++) {
if ((skill = GET_OBJ_SPELL(obj, i)) > 0) {
if (IS_OBJ_SPELL(obj, i)) {
affect_from_char(ch, skill);
for (j = 0; j < NUM_WEARS; j++)
if (tobj = GET_EQ(ch, j))
if ((GET_OBJ_SPELL(tobj, 0) > 0) && (tobj != obj))
for (k = 0; k < MAX_OBJ_SPELLS; k++)
if ((GET_OBJ_SPELL(tobj, k) == skill) &&
(IS_OBJ_SPELL(tobj, k)))
mag_affects(GET_OBJ_SPELLLVL(tobj, k), ch, ch,
skill, -1);
}
else if (IS_OBJ_SKILL(obj, i)) {
amount = MAX(0, (GET_SKILL(ch, skill) -= GET_OBJ_SPELLLVL(obj,
i)));
SET_SKILL(ch, skill, amount);
}
}
}
Gavry
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST