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