/* This function is the very heart of the entire magic system. All invocations * of all types of magic -- objects, spoken and unspoken PC and NPC spells, the * works -- all come through this function eventually. This is also the entry * point for non-spoken or unrestricted spells. Spellnum 0 is legal but silently * ignored here, to make callers simpler. */ int call_magic(struct char_data *caster, struct char_data *cvict, struct obj_data *ovict, int spellnum, int level, int casttype) { int savetype; if (spellnum < 1 || spellnum > TOP_SPELL_DEFINE) return (0); if (!cast_wtrigger(caster, cvict, ovict, spellnum)) return 0; if (!cast_otrigger(caster, ovict, spellnum)) return 0; if (!cast_mtrigger(caster, cvict, spellnum)) return 0; if (ROOM_FLAGGED(IN_ROOM(caster), ROOM_NOMAGIC)) { send_to_char(caster, "Your magic fizzles out and dies.\r\n"); act("$n's magic fizzles out and dies.", FALSE, caster, 0, 0, TO_ROOM); return (0); } if (ROOM_FLAGGED(IN_ROOM(caster), ROOM_PEACEFUL) && (SINFO.violent || IS_SET(SINFO.routines, MAG_DAMAGE))) { send_to_char(caster, "A flash of white light fills the room, dispelling your violent magic!\r\n"); act("White light from no particular source suddenly fills the room, then vanishes.", FALSE, caster, 0, 0, TO_ROOM); return (0); } if (cvict && MOB_FLAGGED(cvict, MOB_NOKILL)) { send_to_char(caster, "This mob is protected.\r\n"); return (0); } /* determine the type of saving throw */ switch (casttype) { case CAST_STAFF: case CAST_SCROLL: case CAST_POTION: case CAST_WAND: savetype = SAVING_ROD; break; case CAST_SPELL: savetype = SAVING_SPELL; break; default: savetype = SAVING_BREATH; break; } if (IS_SET(SINFO.routines, MAG_DAMAGE)) if (mag_damage(level, caster, cvict, spellnum, savetype) == -1) return (-1); /* Successful and target died, don't cast again. */ if (IS_SET(SINFO.routines, MAG_AFFECTS)) mag_affects(level, caster, cvict, spellnum, savetype); if (IS_SET(SINFO.routines, MAG_UNAFFECTS)) mag_unaffects(level, caster, cvict, spellnum, savetype); if (IS_SET(SINFO.routines, MAG_POINTS)) mag_points(level, caster, cvict, spellnum, savetype); if (IS_SET(SINFO.routines, MAG_ALTER_OBJS)) mag_alter_objs(level, caster, ovict, spellnum, savetype); if (IS_SET(SINFO.routines, MAG_GROUPS)) mag_groups(level, caster, spellnum, savetype); if (IS_SET(SINFO.routines, MAG_MASSES)) mag_masses(level, caster, spellnum, savetype); if (IS_SET(SINFO.routines, MAG_AREAS)) mag_areas(level, caster, spellnum, savetype); if (IS_SET(SINFO.routines, MAG_SUMMONS)) mag_summons(level, caster, ovict, spellnum, savetype); if (IS_SET(SINFO.routines, MAG_CREATIONS)) mag_creations(level, caster, spellnum); if (IS_SET(SINFO.routines, MAG_ROOMS)) mag_rooms(level, caster, spellnum); if (IS_SET(SINFO.routines, MAG_MANUAL)) switch (spellnum) { case SPELL_CHARM: MANUAL_SPELL(spell_charm); break; case SPELL_CREATE_WATER: MANUAL_SPELL(spell_create_water); break; case SPELL_DETECT_POISON: MANUAL_SPELL(spell_detect_poison); break; case SPELL_ENCHANT_WEAPON: MANUAL_SPELL(spell_enchant_weapon); break; case SPELL_IDENTIFY: MANUAL_SPELL(spell_identify); break; case SPELL_LOCATE_OBJECT: MANUAL_SPELL(spell_locate_object); break; case SPELL_SUMMON: MANUAL_SPELL(spell_summon); break; case SPELL_WORD_OF_RECALL: MANUAL_SPELL(spell_recall); break; case SPELL_TELEPORT: MANUAL_SPELL(spell_teleport); break; } return (1); }
/* * This function is the very heart of the entire magic system. All * invocations of all types of magic -- objects, spoken and unspoken PC * and NPC spells, the works -- all come through this function eventually. * This is also the entry point for non-spoken or unrestricted spells. * Spellnum 0 is legal but silently ignored here, to make callers simpler. */ int call_magic(struct char_data *caster, struct char_data *cvict, struct obj_data *ovict, struct spell_info_type *sptr, int level, int casttype, char *tar_str) { int savetype; if (!magic_enabled) return (0); if (caster->nr != real_mobile(DG_CASTER_PROXY)) { if (ROOM_FLAGGED(IN_ROOM(caster), ROOM_NOMAGIC)) { send_to_char("Your magic fizzles out and dies.\r\n", caster); act("$n's magic fizzles out and dies.", FALSE, caster, 0, 0, TO_ROOM); return (0); } if (ROOM_FLAGGED(IN_ROOM(caster), ROOM_PEACEFUL) && (sptr->violent || IS_SET(sptr->routines, MAG_DAMAGE))) { send_to_char("A flash of white light fills the room, dispelling your " "violent magic!\r\n", caster); act("White light from no particular source suddenly fills the room, " "then vanishes.", FALSE, caster, 0, 0, TO_ROOM); return (0); } } /* determine the type of saving throw */ switch (casttype) { case CAST_STAFF: case CAST_SCROLL: case CAST_POTION: case CAST_WAND: savetype = SAVING_ROD; break; case CAST_SPELL: savetype = SAVING_SPELL; break; default: savetype = SAVING_BREATH; break; } if (IS_SET(sptr->routines, MAG_DAMAGE)) if (mag_damage(level, caster, cvict, sptr, savetype) == -1) return (-1); /* Successful and target died, don't cast again. */ if (IS_SET(sptr->routines, MAG_AFFECTS)) mag_affects(level, caster, cvict, sptr, savetype); if (IS_SET(sptr->routines, MAG_UNAFFECTS)) mag_unaffects(level, caster, cvict, sptr, savetype); if (IS_SET(sptr->routines, MAG_POINTS)) mag_points(level, caster, cvict, sptr, savetype); if (IS_SET(sptr->routines, MAG_ALTER_OBJS)) mag_alter_objs(level, caster, ovict, sptr, savetype); if (IS_SET(sptr->routines, MAG_GROUPS)) mag_groups(level, caster, sptr, savetype); if (IS_SET(sptr->routines, MAG_MASSES)) mag_masses(level, caster, sptr, savetype); if (IS_SET(sptr->routines, MAG_AREAS)) mag_areas(level, caster, sptr, savetype); if (IS_SET(sptr->routines, MAG_SUMMONS)) mag_summons(level, caster, ovict, sptr, savetype); if (IS_SET(sptr->routines, MAG_CREATIONS)) mag_creations(level, caster, sptr); if (IS_SET(sptr->routines, MAG_MANUAL)) switch (sptr->number) { case SPELL_CHARM: MANUAL_SPELL(spell_charm); break; case SPELL_CREATE_WATER: MANUAL_SPELL(spell_create_water); break; case SPELL_DETECT_POISON: MANUAL_SPELL(spell_detect_poison); break; case SPELL_ENCHANT_WEAPON: MANUAL_SPELL(spell_enchant_weapon); break; case SPELL_IDENTIFY: MANUAL_SPELL(spell_identify); break; case SPELL_LOCATE_OBJECT: MANUAL_SPELL(spell_locate_object); break; case SPELL_SUMMON: MANUAL_SPELL(spell_summon); break; case SPELL_WORD_OF_RECALL: MANUAL_SPELL(spell_recall); break; case SPELL_TELEPORT: MANUAL_SPELL(spell_teleport); break; case SPELL_MINOR_IDENTIFY: MANUAL_SPELL(spell_minor_identify); break; case SPELL_PORTAL: MANUAL_SPELL(spell_portal); break; case SPELL_ARCANE_WORD: MANUAL_SPELL(spell_arcane_word); break; case SPELL_ARCANE_PORTAL: MANUAL_SPELL(spell_arcane_portal); break; } return (1); }