// $Id: ez_spll.cc,v 1.13.2.9 2000/03/05 05:13:10 justin Exp $ // $Revision: 1.13.2.9 $ $Author: justin $ $Date: 2000/03/05 05:13:10 $ // //ScryMUD Server Code //Copyright (C) 1998 Ben Greear // //This program is free software; you can redistribute it and/or //modify it under the terms of the GNU General Public License //as published by the Free Software Foundation; either version 2 //of the License, or (at your option) any later version. // //This program is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied warranty of //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //GNU General Public License for more details. // //You should have received a copy of the GNU General Public License //along with this program; if not, write to the Free Software //Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // To contact the Author, Ben Greear: greear@cyberhighway.net, (preferred) // greearb@agcs.com // ///********************** ez_spll.cc **********************/// #include "ez_spll.h" #include "commands.h" #include "command2.h" #include <stdio.h> #include "misc.h" #include "misc2.h" #include "battle.h" #include "classes.h" #include "spells.h" #include "skills.h" #include "spec_prc.h" #include <PtrArray.h> #include "MudStats.h" #include "SkillSpell.h" void cast_detect_resistances(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = DETECT_RESISTANCES_SKILL_NUM; if (!(vict = ROOM.haveCritNamed(i_th, victim, pc))) { show("You don't see that person.\n", pc); return; }//if if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if do_cast_detect_resistances(*vict, pc, FALSE, 0); } void do_cast_detect_resistances(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = DETECT_RESISTANCES_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int res_num; const char resistances[5][12] = { "", "heat", "cold", "electricity", "magic" }; if (!is_canned) lvl = agg.LEVEL; short did_hit = TRUE; short lost_con = TRUE; if ((is_canned && (did_hit = did_spell_hit(vict, NORMAL, agg, lvl, TRUE))) || (!is_canned && !(lost_con = lost_concentration(agg, spell_num)) && (did_hit = did_spell_hit(agg, NORMAL, vict)))) { if (!is_canned) agg.MANA -= spell_mana; for (res_num=1; res_num <= 4; res_num ++) { if (d(1,4) > 1) { if (vict.short_cur_stats[res_num+28] > 100) { Sprintf(buf, "A well placed blast of %s would probably take %S out!\n", resistances[res_num], name_of_crit(vict, agg.SEE_BIT)); } else if (vict.short_cur_stats[res_num+28] > 60) { Sprintf(buf, "You could inflict serious %s damage upon %S!\n", resistances[res_num], name_of_crit(vict, agg.SEE_BIT)); } else if (vict.short_cur_stats[res_num+28] > 20) { Sprintf(buf, "%S seem slightly vulnerable to %s.\n", name_of_crit(vict, agg.SEE_BIT), resistances[res_num]); } else if (vict.short_cur_stats[res_num+28] > 0) { Sprintf(buf, "%S is just barely vulnerable to %s.\n", name_of_crit(vict, agg.SEE_BIT), resistances[res_num]); } else if (vict.short_cur_stats[res_num+28] > -20) { Sprintf(buf, "%S is just barely resistant to %s.\n", name_of_crit(vict, agg.SEE_BIT), resistances[res_num]); } else if (vict.short_cur_stats[res_num+28] > -60) { Sprintf(buf, "%S seem slightly resistant to %s.\n", name_of_crit(vict, agg.SEE_BIT), resistances[res_num]); } else if (vict.short_cur_stats[res_num+28] > -100) { Sprintf(buf, "You doubt you could even scratch %S with an attack of %s.\n", name_of_crit(vict, agg.SEE_BIT), resistances[res_num]); } else { Sprintf(buf,"%S seems impervious to %s.\n", name_of_crit(vict, agg.SEE_BIT), resistances[res_num]); } } else { Sprintf(buf, "You are uncertain of %S's resistance to %s.\n", name_of_crit(vict, agg.SEE_BIT), resistances[res_num]); } agg.show(buf); } }//if !lost_con else if (!did_hit) { Sprintf(buf, "You are uncertain of %S's vulnerabilities.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); }//if missed else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; } void cast_detect_alignment(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = DETECT_ALIGNMENT_SKILL_NUM; if (!(vict = ROOM.haveCritNamed(i_th, victim, pc))) { show("You don't see that person.\n", pc); return; }//if if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if do_cast_detect_alignment(*vict, pc, FALSE, 0); //does no error checking }//cast_detect_alignment void do_cast_detect_alignment(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = DETECT_ALIGNMENT_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); /* Check for: lost concentration, did_hit */ /* Do: damage to vict, mana from agg, messages to all involved, */ /* increment pause_count, */ if (!is_canned) lvl = agg.LEVEL; short did_hit = TRUE; short lost_con = TRUE; if ((is_canned && (did_hit = did_spell_hit(vict, NORMAL, agg, lvl, TRUE))) || (!is_canned && !(lost_con = lost_concentration(agg, spell_num)) && (did_hit = did_spell_hit(agg, NORMAL, vict)))) { if (!is_canned) agg.MANA -= spell_mana; if (vict.ALIGN < -350) { Sprintf(buf, "This looks like one bad %s!\n", get_dude_chic(vict)); }//if else if (vict.ALIGN < 350) { Sprintf(buf, "This %s seems like an ok person.\n", get_dude_chic(vict)); }//if else { Sprintf(buf, "This %s is a real holy roller!\n", get_dude_chic(vict)); }//if show(buf, agg); }//if !lost_con else if (!did_hit) { Sprintf(buf, "You fail to ascertain %S's personality.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); }//if missed else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; }//do_cast_detect_alignment void cast_detect_poison(int i_th, const String* victim, critter& pc) { object* vict = NULL; int spell_num = DETECT_POISON_SKILL_NUM; if (!(vict = ROOM.haveObjNamed(i_th, victim, pc.SEE_BIT))) { vict = have_obj_named(pc.inv, i_th, victim, pc.SEE_BIT, ROOM); if (!vict) { show("You don't see that person.\n", pc); return; }//if }//if if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if do_cast_detect_poison(*vict, pc, FALSE, 0); //does no error checking }//cast_detect_poison void do_cast_detect_poison(object& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = DETECT_POISON_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { if (!is_canned) agg.MANA -= spell_mana; if (vict.obj_proc && vict.obj_proc->obj_spec_data_flags.get(3)) { Sprintf(buf, "You get a STRONG reaction from %S!\n", long_name_of_obj(vict, agg.SEE_BIT)); show(buf, agg); }//if else { Sprintf(buf, "%S seems to be safe from poison.\n", long_name_of_obj(vict, agg.SEE_BIT)); buf.Cap(); show(buf, agg); }//else }//if !lost_con else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; }//do_cast_detect_poison void cast_detect_invisibility(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = DETECT_INVISIBILITY_SKILL_NUM; if (!(vict = ROOM.haveCritNamed(i_th, victim, pc))) { show("You don't see that person.\n", pc); return; }//if if (vict->isMob()) { vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if if (!ok_to_do_action(vict, "KMSN", spell_num, pc)) { return; }//if do_cast_detect_invisibility(*vict, pc, FALSE, 0); //does no error checking }//cast_detect_invisibility void do_cast_detect_invisibility(critter& vict, critter& agg, int is_canned, int lvl) { stat_spell_cell* sp = NULL; String buf(100); short do_effects = FALSE; int spell_num = DETECT_INVISIBILITY_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if ((sp = is_affected_by(spell_num, vict))) { show("Ok.\n", agg); }//if else { if (&vict == &agg) { show("You become aware of formerly invisible things.\n", vict); emote("seems to see things formerly invisible.", agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You allow %S to see invisible things.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S allows you to see invisible things.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "allows %S to see invisible things.", name_of_crit(vict, ~0)); emote(buf, agg, room_list[vict.getCurRoomNum()], TRUE, &vict); }//else }//else, not already affected }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { if (sp) sp->bonus_duration += lvl/2; else Put(new stat_spell_cell(spell_num, lvl/2), vict.affected_by); vict.SEE_BIT |= 2; //can now see invisible }//if }//do_cast_detect_invisibility void cast_infravision(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = INFRAVISION_SKILL_NUM; if (victim->Strlen()) { if (!(vict = ROOM.haveCritNamed(i_th, victim, pc))) { show("You don't see that person.\n", pc); return; }//if } else { vict = &pc; } if (vict->isMob()) { vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if if (!ok_to_do_action(vict, "KMSN", spell_num, pc)) { return; }//if do_cast_infravision(*vict, pc, FALSE, 0); //does no error checking }//cast_infravision void do_cast_infravision(critter& vict, critter& agg, int is_canned, int lvl) { stat_spell_cell* sp = NULL; String buf(100); short do_effects = FALSE; int spell_num = INFRAVISION_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if ((sp = is_affected_by(spell_num, vict))) { agg.show(CS_OK); }//if else { if (&vict == &agg) { show("You can now see in the dark.\n", vict); emote("can now see in the dark.", agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You allow %S to see in the dark.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S allows you to see in the dark.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "allows %S to see in the dark.", name_of_crit(vict, ~0)); emote(buf, agg, room_list[vict.getCurRoomNum()], TRUE, &vict); }//else }//else, not already affected }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { if (sp) sp->bonus_duration += lvl/2; else Put(new stat_spell_cell(spell_num, lvl/2), vict.affected_by); vict.SEE_BIT |= 1; //can now see in the dark }//if }//do_cast_infravision void cast_detect_hidden(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = DETECT_HIDDEN_SKILL_NUM; if (victim->Strlen()) { if (!(vict = ROOM.haveCritNamed(i_th, victim, pc))) { show("You don't see that person.\n", pc); return; }//if } else { vict = &pc; } if (vict->isMob()) { vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if if (!ok_to_do_action(vict, "KMSN", spell_num, pc)) { return; }//if do_cast_detect_hidden(*vict, pc, FALSE, 0); //does no error checking }//cast_detect_hidden void do_cast_detect_hidden(critter& vict, critter& agg, int is_canned, int lvl) { stat_spell_cell* sp = NULL; String buf(100); short do_effects = FALSE; int spell_num = DETECT_HIDDEN_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if ((sp = is_affected_by(spell_num, vict))) { show("Ok.\n", agg); }//if else { if (&vict == &agg) { show("You become aware of things not seen before.\n", vict); emote("seems to see things a little more clearly.", agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You allow %S to detect hidden things.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S allows you to see things not seen by others.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "allows %S to see things not easily seen.", name_of_crit(vict, ~0)); emote(buf, agg, room_list[vict.getCurRoomNum()], TRUE, &vict); }//else }//else, not already affected }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { if (sp) sp->bonus_duration += lvl/2; else Put(new stat_spell_cell(spell_num, lvl/2), vict.affected_by); vict.SEE_BIT |= 4; //can now see hidden }//if }//do_cast_detect_hidden void cast_bless(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = BLESS_SKILL_NUM; mudlog.dbg("In cast_bless.\n"); if (!(vict = ROOM.haveCritNamed(i_th, victim, pc))) { show("You don't see that person.\n", pc); return; }//if if (vict->isMob()) { vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if if (!ok_to_do_action(vict, "KMSN", spell_num, pc)) { return; }//if mudlog.dbg("Just before do_cast_bless.\n"); do_cast_bless(*vict, pc, FALSE, 0); //does no error checking }//cast_bless void do_cast_bless(critter& vict, critter& agg, int is_canned, int lvl) { stat_spell_cell* sp = NULL; String buf(100); short do_effects = FALSE; int spell_num = BLESS_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); mudlog.dbg("In do_cast_bless.\n"); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if ((sp = is_affected_by(spell_num, vict))) { show("Ok.\n", agg); }//if else { if (&vict == &agg) { show("You feel blessed by a god.\n", vict); emote("seems a little luckier.", agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You give your god's blessing to %S.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S gives you %s god's blessing.\n", agg.getName(vict.SEE_BIT), get_his_her(agg)); buf.Cap(); show(buf, vict); Sprintf(buf, "gives %s god's blessing to %S.\n", get_his_her(agg), name_of_crit(vict, ~0)); emote(buf, agg, room_list[vict.getCurRoomNum()], TRUE, &vict); }//else }//else, not already affected }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { if (sp) sp->bonus_duration += lvl/3; else { Put(new stat_spell_cell(spell_num, 5 + lvl/2), vict.affected_by); vict.HIT += BLESS_EFFECTS; }//else }//if }//do_cast_bless void cast_pfg(critter& pc) { critter* vict = NULL; int spell_num = PFG_SKILL_NUM; if (!ok_to_do_action(vict, "KMSN", spell_num, pc)) { return; }//if do_cast_pfg(pc, pc, FALSE, 0); //does no error checking }//cast_pfg void do_cast_pfg(critter& vict, critter& agg, int is_canned, int lvl) { stat_spell_cell* sp = NULL; String buf(100); short do_effects = FALSE; int spell_num = PFG_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (vict.ALIGN > 350) { if (&vict == &agg) { show("You are too good to be protected by an evil god!\n", agg); }//if else { Sprintf(buf, "%S is too good to be protected by an evil god!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); }//else return; }//if if ((sp = is_affected_by(PFE_SKILL_NUM, vict))) { if (&vict == &agg) { show("You are already protected by a benelovent deity!\n", agg); }//if else { Sprintf(buf, "%S is already protected by a benelovent deity.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); }//else return; }//if if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if ((sp = is_affected_by(spell_num, vict))) { show("Ok.\n", agg); }//if else { if (&vict == &agg) { show("You feel protected from good.\n", vict); emote("is protected from good.", agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You protect %S from good.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S protects you from good.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "protects %S from good.", name_of_crit(vict, ~0)); emote(buf, agg, room_list[vict.getCurRoomNum()], TRUE, &vict); }//else }//else, not already affected }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { if (sp) sp->bonus_duration += lvl/2; else { Put(new stat_spell_cell(spell_num, 10 + lvl/2), vict.affected_by); vict.CRIT_FLAGS.turn_on(25); //pfg now }//else }//if }//do_cast_pfg void cast_pfe(critter& pc) { critter* vict = NULL; int spell_num = PFE_SKILL_NUM; if (!ok_to_do_action(vict, "KMSN", spell_num, pc)) { return; }//if do_cast_pfe(pc, pc, FALSE, 0); //does no error checking }//cast_pfe void do_cast_pfe(critter& vict, critter& agg, int is_canned, int lvl) { stat_spell_cell* sp = NULL; String buf(100); short do_effects = FALSE; int spell_num = PFE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (vict.ALIGN < -350) { if (&vict == &agg) { show("You are too evil to be protected by a benign god!\n", agg); }//if else { Sprintf(buf, "%S is too evil to be protected by a benign god!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); }//else return; }//if if ((sp = is_affected_by(PFG_SKILL_NUM, vict))) { if (&vict == &agg) { show("You are already protected by a malevolent deity!\n", agg); }//if else { Sprintf(buf, "%S is already protected by a malevolent deity.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); }//else return; }//if if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if ((sp = is_affected_by(spell_num, vict))) { show("Ok.\n", agg); }//if else { if (&vict == &agg) { show("You feel protected from evil.\n", vict); emote("is protected from evil.", agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You protect %S from evil.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S protects you from evil.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "protects %S from evil.", name_of_crit(vict, ~0)); emote(buf, agg, room_list[vict.getCurRoomNum()], TRUE, &vict); }//else }//else, not already affected }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { if (sp) sp->bonus_duration += lvl/2; else { Put(new stat_spell_cell(spell_num, 10 + lvl/2), vict.affected_by); vict.CRIT_FLAGS.turn_on(24); //pfe now }//else }//if }//do_cast_pfe void cast_detect_magic(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = DETECT_MAGIC_SKILL_NUM; if (victim->Strlen()) { if (!(vict = ROOM.haveCritNamed(i_th, victim, pc))) { show("You don't see that person.\n", pc); return; }//if } else { vict = &pc; } if (!vict->pc) { show("Ok.\n", pc); //mobs don't need det_magic }//if if (!ok_to_do_action(vict, "KMSN", spell_num, pc)) { return; }//if do_cast_detect_magic(*vict, pc, FALSE, 0); //does no error checking }//cast_detect_magic void do_cast_detect_magic(critter& vict, critter& agg, int is_canned, int lvl) { stat_spell_cell* sp = NULL; String buf(100); short do_effects = FALSE; int spell_num = DETECT_MAGIC_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if ((sp = is_affected_by(spell_num, vict))) { show("Ok, extending protection.\n", agg); }//if else { if (&vict == &agg) { show("You become aware of subtle flows of magical power.\n", vict); emote("seems to see things not seen before.", agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You allow %S to detect magical energies.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S allows you to see the subtle flows of magical powers.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "does something strange to %S's eyes.\n", name_of_crit(vict, ~0)); emote(buf, agg, room_list[vict.getCurRoomNum()], TRUE, &vict); }//else }//else, not already affected }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { if (vict.pc) { if (sp) sp->bonus_duration += lvl/3; else Put(new stat_spell_cell(spell_num, lvl/3), vict.affected_by); vict.PC_FLAGS.turn_on(18); //can now det magic }//if a pc }//if }//do_cast_detect_magic void cast_create_water(int i_th, const String* victim, critter& pc) { int spell_num = CREATE_WATER_SKILL_NUM; if (mudlog.ofLevel(DBG)) { mudlog << "In cast_create_water, i: " << i_th << " vict: " << *victim << endl; } if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if object* obj = have_obj_named(pc.inv, i_th, victim, pc.SEE_BIT, ROOM); if (!obj) { pc.show("You have to place the water in something!\n"); pc.show("As in: cast 'create water' jug.\n"); return; } if (!obj->IN_LIST) { obj = obj_to_sobj(*obj, &(pc.inv), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if if (!obj->OBJ_FLAGS.get(59) && obj->bag) { show("That cannot hold water!\n", pc); return; }//if do_cast_create_water(*obj, pc, FALSE, 0); //does no error checking }//cast_create_water void do_cast_create_water(object& vict, critter& agg, int is_canned, int lvl) { String buf(100); short do_effects = FALSE; int spell_num = CREATE_WATER_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (mudlog.ofLevel(DBG)) { mudlog << "In do cast_create_water, i: " << endl; } if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (!vict.bag) { mudlog.log(ERROR, "ERROR: non-bag sent to do_cast_create_water."); return; }//if if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { object* obj_ptr = Top(vict.inv); if (obj_ptr && obj_ptr->OBJ_NUM != 7) { show("You need to empty it first!\n", agg); return; }//if else if (vict.BAG_FLAGS.get(2)) { show("You must open it first.\n", agg); return; }//if do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; Sprintf(buf, "You fill %S to the top!\n", long_name_of_obj(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "fills %S to the top!", long_name_of_obj(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { clear_obj_list(vict.inv); vict.CHARGES = 0; vict.CHARGES = vict.OBJ_MAX_WEIGHT - vict.OBJ_CUR_WEIGHT; vict.gainInv(&(obj_list[7])); }//if }//do_cast_create_water void cast_enchant_weapon(int i_th, const String* victim, critter& pc) { int spell_num = ENCHANT_WEAPON_SKILL_NUM; if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if object* obj = have_obj_named(pc.inv, i_th, victim, pc.SEE_BIT, ROOM); if (!obj) { pc.show("You don't see that weapon.\n"); return; } if (!obj->IN_LIST) { obj = obj_to_sobj(*obj, &(pc.inv), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if if (obj->isMagic()) { show("That cannot hold any more magic!\n", pc); return; }//if if (!obj->OBJ_FLAGS.get(30)) { show("That isn't a weapon!\n", pc); return; }//if do_cast_enchant_weapon(*obj, pc, FALSE, 0); //does no error checking }//cast_enchant_weapon void do_cast_enchant_weapon(object& vict, critter& agg, int is_canned, int lvl) { mudlog.log(TRC, "In do_cast_enchant_weapon..\n"); String buf(100); short do_effects = FALSE; int spell_num = ENCHANT_WEAPON_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; Sprintf(buf, "You cause %S to glow with a faint blue light.\n", long_name_of_obj(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "causes %S to glow with a faint blue light.", long_name_of_obj(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { /* first do dice incrementation */ int i; for (i = 0; i<4; i++) { if (d(1,4) == 2) { vict.OBJ_DAM_DICE_SIDES++; } else if (d(1,4) == 4) { vict.OBJ_DAM_DICE_COUNT++; } }//for /* now increment HIT and DAM affects */ stat_spell_cell* dm_ptr = has_stat_affect(8, vict); stat_spell_cell* ht_ptr = has_stat_affect(7, vict); // You always get at least one... if (!ht_ptr) Put((ht_ptr = new stat_spell_cell(7, 1)), vict.stat_affects); else ht_ptr->bonus_duration++; for (i = 0; i<4; i++) { dm_ptr = has_stat_affect(8, vict); ht_ptr = has_stat_affect(7, vict); if (d(1, 6) == 2) { if (!dm_ptr) Put((dm_ptr = new stat_spell_cell(8, 1)), vict.stat_affects); else dm_ptr->bonus_duration++; }//if else if (d(1,6) == 6) { if (!ht_ptr) Put((ht_ptr = new stat_spell_cell(7, 1)), vict.stat_affects); else ht_ptr->bonus_duration++; }//else }//for }//if }//do_cast_enchant_weapon void cast_enchant_armor(int i_th, const String* victim, critter& pc) { int spell_num = ENCHANT_ARMOR_SKILL_NUM; if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if object* obj = have_obj_named(pc.inv, i_th, victim, pc.SEE_BIT, ROOM); if (!obj) { pc.show("You don't see that object around..\n"); return; } if (!obj->IN_LIST) { obj = obj_to_sobj(*obj, &(pc.inv), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if if (obj->isMagic()) { show("That cannot hold any more magic!\n", pc); return; }//if if (obj->OBJ_FLAGS.get(30)) { show("That's a weapon!\n", pc); return; }//if do_cast_enchant_armor(*obj, pc, FALSE, 0); //does no error checking }//cast_enchant_armor void do_cast_enchant_armor(object& vict, critter& agg, int is_canned, int lvl) { String buf(100); short do_effects = FALSE; int spell_num = ENCHANT_ARMOR_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; Sprintf(buf, "You cause %S to glow with a faint white light.\n", long_name_of_obj(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "causes %S to glow with a faint white light.", long_name_of_obj(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { stat_spell_cell* ac_ptr = has_stat_affect(9, vict); stat_spell_cell* spll_ptr = has_stat_affect(32, vict); /* first do AC decrementation */ if (!ac_ptr) Put(new stat_spell_cell(9, -(lvl/3)), vict.stat_affects); else ac_ptr->bonus_duration -= (lvl/3); /* spell resistance decrementation (less is good) */ if (!spll_ptr) Put(new stat_spell_cell(32, -(lvl/3)), vict.stat_affects); else spll_ptr->bonus_duration -= (lvl/3); }//if }//do_cast_enchant_armor void cast_fire_blade(int i_th, const String* victim, critter& pc) { int spell_num = FIRE_BLADE_SKILL_NUM; if (!ok_to_do_action(NULL, "KMSNB", spell_num, pc)) { return; }//if object* obj = have_obj_named(pc.inv, i_th, victim, pc.SEE_BIT, ROOM); if (!obj) { show("You don't see that here.\n", pc); return; }//if if (!obj->IN_LIST) { obj = obj_to_sobj(*obj, &(pc.inv), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if if (!(obj->OBJ_FLAGS.get(43) || obj->OBJ_FLAGS.get(41))) { show("This can't be enchanted thus.\n", pc); return; }//if do_cast_fire_blade(*obj, pc, FALSE, 0); //does no error checking }//cast_fire_blade void do_cast_fire_blade(object& vict, critter& agg, int is_canned, int lvl) { stat_spell_cell* sp = NULL; String buf(100); short do_effects = FALSE; int spell_num = FIRE_BLADE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if ((sp = is_affected_by(spell_num, vict))) { show("Ok\n", agg); }//if else { Sprintf(buf, "You make %S glow with a magical heat!\n", long_name_of_obj(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "makes %S glow with a magical heat!\n", long_name_of_obj(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//else, not already affected }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { if ((sp = is_affected_by(FROST_BLADE_SKILL_NUM, vict))) { vict.affected_by.loseData(sp); delete sp; }//if sp = is_affected_by(spell_num, vict); if (sp) sp->bonus_duration += lvl/3; else { Put(new stat_spell_cell(spell_num, lvl/2), vict.affected_by); }//else }//if }//do_cast_fire_blade void cast_frost_blade(int i_th, const String* victim, critter& pc) { int spell_num = FROST_BLADE_SKILL_NUM; if (!ok_to_do_action(NULL, "KMSNB", spell_num, pc)) { return; }//if object* obj = have_obj_named(pc.inv, i_th, victim, pc.SEE_BIT, ROOM); if (!obj) { show("You don't see that here.\n", pc); return; }//if if (!obj->IN_LIST) { obj = obj_to_sobj(*obj, &(pc.inv), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if if (!(obj->OBJ_FLAGS.get(43) || obj->OBJ_FLAGS.get(41))) { show("This can't be enchanted thus.\n", pc); return; }//if do_cast_frost_blade(*obj, pc, FALSE, 0); //does no error checking }//cast_frost_blade void do_cast_frost_blade(object& vict, critter& agg, int is_canned, int lvl) { stat_spell_cell* sp = NULL; String buf(100); short do_effects = FALSE; int spell_num = FROST_BLADE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if ((sp = is_affected_by(spell_num, vict))) { show("Ok\n", agg); }//if else { Sprintf(buf, "You make %S very cold!\n", long_name_of_obj(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "makes %S very cold!\n", long_name_of_obj(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//else, not already affected }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { if ((sp = is_affected_by(FIRE_BLADE_SKILL_NUM, vict))) { vict.affected_by.loseData(sp); delete sp; sp = is_affected_by(FROST_BLADE_SKILL_NUM, vict); }//if if (sp) sp->bonus_duration += lvl/3; else { Put(new stat_spell_cell(spell_num, lvl/2), vict.affected_by); }//else }//if }//do_cast_frost_blade void cast_rune_edge(int i_th, const String* victim, critter& pc) { int spell_num = RUNE_EDGE_SKILL_NUM; if (!ok_to_do_action(NULL, "KMSNB", spell_num, pc)) { return; }//if object* obj = have_obj_named(pc.inv, i_th, victim, pc.SEE_BIT, ROOM); if (!obj) { show("You don't see that here.\n", pc); return; }//if if (!obj->IN_LIST) { obj = obj_to_sobj(*obj, &(pc.inv), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if if (!(obj->OBJ_FLAGS.get(43) || obj->OBJ_FLAGS.get(41))) { show("This can't be sharpened.\n", pc); return; }//if do_cast_rune_edge(*obj, pc, FALSE, 0); //does no error checking }//cast_rune_edge void do_cast_rune_edge(object& vict, critter& agg, int is_canned, int lvl) { stat_spell_cell* sp = NULL; String buf(100); short do_effects = FALSE; int spell_num = RUNE_EDGE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); /* Check for: lost concentration, did_hit */ /* Do: damage to vict, mana from agg, messages to all involved, */ /* increment pause_count, */ if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if ((sp = is_affected_by(spell_num, vict))) { show("Ok\n", agg); }//if else { Sprintf(buf, "You magically sharpen %S to a keen edge!\n", long_name_of_obj(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "magically sharpens %S to a keen edge!\n", long_name_of_obj(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//else, not already affected }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { if (sp) sp->bonus_duration += lvl/3; else { Put(new stat_spell_cell(spell_num, lvl/2), vict.affected_by); vict.OBJ_DAM_DICE_SIDES += RUNE_EDGE_EFFECTS; }//else }//if }//do_cast_rune_edge void cast_invisibility(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = INVISIBILITY_SKILL_NUM; if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if if (!(vict = ROOM.haveCritNamed(i_th, victim, pc))) { object* obj = ROOM.haveObjNamed(i_th, victim, pc.SEE_BIT); if (!obj) { obj = have_obj_named(pc.inv, i_th, victim, pc.SEE_BIT, ROOM); if (!obj) { show("You don't see that here.\n", pc); return; }//if if (!obj->IN_LIST) { obj = obj_to_sobj(*obj, &(pc.inv), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if }//if if (!obj->IN_LIST) { obj = obj_to_sobj(*obj, ROOM.getInv(), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if /* if here, then have a valid obj */ do_cast_invisibility(*obj, pc, FALSE, 0); }//if no vict else { //got a valid vict if (vict->isMob()) { vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if do_cast_invisibility(*vict, pc, FALSE, 0); //does no error checking }//else }//cast_invisibility void do_cast_invisibility(critter& vict, critter& agg, int is_canned, int lvl) { stat_spell_cell* sp = NULL; String buf(100); short do_effects = FALSE; int spell_num = INVISIBILITY_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if ((sp = is_affected_by(spell_num, vict))) { show("Ok\n", agg); }//if else { if (&vict == &agg) { show("You fade from sight!\n", vict); emote("fades from sight.", agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You cause %S to fade from sight.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S causes you to fade from sight.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "causes %S to disappear from sight.\n", name_of_crit(vict, ~0)); emote(buf, agg, room_list[vict.getCurRoomNum()], TRUE, &vict); }//else }//else, not already affected }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { if (sp) sp->bonus_duration += lvl/3; else Put(new stat_spell_cell(spell_num, lvl/3), vict.affected_by); vict.VIS_BIT |= 2; }//if }//do_cast_invisibility (mob) void do_cast_invisibility(object& vict, critter& agg, int is_canned, int lvl) { stat_spell_cell* sp = NULL; String buf(100); short do_effects = FALSE; int spell_num = INVISIBILITY_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; if (is_canned || (!(lost_con = lost_concentration(agg, spell_num)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if ((sp = is_affected_by(spell_num, vict))) { show("Ok\n", agg); }//if else { Sprintf(buf, "You cause %S to fade from sight.\n", long_name_of_obj(vict, agg.SEE_BIT)); show(buf, agg); }//else, not already affected }//if did_hit else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { if (sp) sp->bonus_duration += lvl/3; else Put(new stat_spell_cell(spell_num, lvl/3), vict.affected_by); vict.OBJ_VIS_BIT |= 2; }//if }//do_cast_invisibility (object) void cast_mirror_image(critter& pc) { int spell_num = MIRROR_IMAGE_SKILL_NUM; if (!ok_to_do_action(NULL, "KMSNB", spell_num, pc)) { return; }//if /* all checks have been passed, lets do it */ do_cast_mirror_image(pc, FALSE, 0); //does no error checking }//cast_mirror_image void do_cast_mirror_image(critter& pc, int is_canned, int lvl) { String buf(100); short do_effects = FALSE; int spell_num = MIRROR_IMAGE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, pc); if (!is_canned) lvl = pc.LEVEL; if (is_canned || !lost_concentration(pc, spell_num)) { do_effects = TRUE; if (!is_canned) pc.MANA -= spell_mana; int num_mirs = 2 + d(1, lvl/6); Sprintf(buf, "You create %i mirror images of yourself.\n", num_mirs); show(buf, pc); Sprintf(buf, "creates %i mirrors of %s.", num_mirs, get_himself_herself(pc)); emote(buf, pc, ROOM, TRUE); pc.mirrors = max(num_mirs, pc.mirrors); }//if did_hit else { //lost concentration show(LOST_CONCENTRATION_MSG_SELF, pc); emote(LOST_CONCENTRATION_MSG_OTHER, pc, ROOM, FALSE); if (!is_canned) pc.MANA -= spell_mana / 2; }//else pc.PAUSE++; }//do_cast_mirror_image void cast_cure_serious(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = CURE_SERIOUS_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Who do you wish to heal??\n", pc); return; }//if if (vict->isMob()) { vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if if (!ok_to_do_action(vict, "KMSN", spell_num, pc)) { return; }//if /* all checks have been passed, lets do it */ do_cast_cure_serious(*vict, pc, FALSE, 0); //does no error checking }//cast_cure_serious void do_cast_cure_serious(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); short do_effects = FALSE; int spell_num = CURE_SERIOUS_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; if (is_canned || !lost_concentration(agg, spell_num)) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if (&vict == &agg) { show("You cure yourself.\n", vict); Sprintf(buf, "cures %s.", get_himself_herself(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You cure %S.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S cures you.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "cures %S.\n", name_of_crit(vict, ~0)); emote(buf, agg, room_list[vict.getCurRoomNum()], TRUE); }//else }//if did_hit else { //lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { vict.HP += (short)(((float)(10 + d(1,15)) / spell_objs_ratio(spell_num))); if (vict.HP > vict.HP_MAX) vict.HP = vict.HP_MAX; }//if }//do_cast_cure_serious void cast_cure_critical(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = CURE_CRITICAL_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Who do you wish to cure??\n", pc); return; }//if if (vict->isMob()) { vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if if (!ok_to_do_action(vict, "KMSN", spell_num, pc)) { return; }//if /* all checks have been passed, lets do it */ do_cast_cure_critical(*vict, pc, FALSE, 0); //does no error checking }//cast_cure_critical void do_cast_cure_critical(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); short do_effects = FALSE; int spell_num = CURE_CRITICAL_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; if (is_canned || !lost_concentration(agg, spell_num)) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if (&vict == &agg) { show("You cure yourself!\n", vict); Sprintf(buf, "cures %s.", get_himself_herself(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You cure %S.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S cures you.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "cures %S.\n", name_of_crit(vict, ~0)); emote(buf, agg, room_list[vict.getCurRoomNum()], TRUE); }//else }//if did_hit else { //lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { vict.HP += (20 + d(1, lvl)); if (vict.HP > vict.HP_MAX) vict.HP = vict.HP_MAX; }//if }//do_cast_cure_critical void cast_heal(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = HEAL_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Who do you wish to heal??\n", pc); return; }//if if (vict->isMob()) { vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if if (!ok_to_do_action(vict, "KMSN", spell_num, pc)) { return; }//if /* all checks have been passed, lets do it */ do_cast_heal(*vict, pc, FALSE, 0); //does no error checking }//cast_heal void do_cast_heal(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); short do_effects = FALSE; int spell_num = HEAL_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; if (is_canned || !lost_concentration(agg, spell_num)) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if (&vict == &agg) { show("You heal yourself!\n", vict); Sprintf(buf, "heals %s.", get_himself_herself(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You heal %S.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S heals you.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "heals %S.\n", name_of_crit(vict, ~0)); emote(buf, agg, room_list[vict.getCurRoomNum()], TRUE); }//else }//if did_hit else { //lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { vict.HP += (d(4, lvl) + 150); if (vict.HP > vict.HP_MAX) vict.HP = vict.HP_MAX; }//if }//do_cast_heal void cast_restore(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = RESTORE_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Who do you wish to restore??\n", pc); return; }//if if (vict->isMob()) { vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if if (!ok_to_do_action(vict, "KMSN", spell_num, pc)) { return; }//if /* all checks have been passed, lets do it */ do_cast_restore(*vict, pc, FALSE, 0); //does no error checking }//cast_restore void do_cast_restore(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); short do_effects = FALSE; int spell_num = RESTORE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); /* Check for: lost concentration, did_hit */ /* Do: damage to vict, mana from agg, messages to all involved, */ /* increment pause_count, */ if (!is_canned) lvl = agg.LEVEL; if (is_canned || !lost_concentration(agg, spell_num)) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if (&vict == &agg) { show("You restore yourself!\n", vict); Sprintf(buf, "restores %s.", get_himself_herself(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You restore %S.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S restores you.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "restores %S.\n", name_of_crit(vict, ~0)); emote(buf, agg, room_list[vict.getCurRoomNum()], TRUE); }//else }//if did_hit else { //lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { vict.HP += (d(7, 100) + 2 * lvl); if (vict.HP > vict.HP_MAX) vict.HP = vict.HP_MAX; }//if }//do_cast_restore void cast_entangle(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = ENTANGLE_SKILL_NUM; if (victim->Strlen() == 0) vict = Top(pc.IS_FIGHTING); else vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Who do you wish to entangle??\n", pc); return; }//if if (vict->isMob()) { vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if if (!ok_to_do_action(vict, "KMSNV", spell_num, pc)) { return; }//if if (!(vict = check_for_diversions(*vict, "GSM", pc))) return; /* all checks have been passed, lets do it */ do_cast_entangle(*vict, pc, FALSE, 0); //does no error checking }//cast_entangle void cast_web(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = WEB_SKILL_NUM; if (victim->Strlen() == 0) vict = Top(pc.IS_FIGHTING); else vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Who do you wish to web??\n", pc); return; }//if if (vict->isMob()) { vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if if (!ok_to_do_action(vict, "KMSNV", spell_num, pc)) { return; }//if if (!(vict = check_for_diversions(*vict, "GSM", pc))) return; /* all checks have been passed, lets do it */ do_cast_web(*vict, pc, FALSE, 0); //does no error checking }//cast_web void do_cast_web(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); short do_effects = FALSE; short do_join_in_battle = TRUE; int spell_num = WEB_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short did_hit = TRUE; short lost_con = TRUE; if ((is_canned && (did_hit = did_spell_hit(vict, AGILITY, agg, lvl, TRUE))) || (!is_canned && !(lost_con = lost_concentration(agg, spell_num)) && (did_hit = did_spell_hit(agg, AGILITY, vict)))) { do_effects = TRUE; if (!is_canned) agg.MANA -= spell_mana; if (&vict == &agg) { show("You cover yourself with a fine web!\n", vict); emote("is suddenly covered in a fine, sticky web.", agg, room_list[agg.getCurRoomNum()], TRUE); do_join_in_battle = FALSE; }//if else { Sprintf(buf, "You cover %S in a sticky web!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S has covered you with a fine web of something!!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "covers %S with a fine, sticky web.\n", name_of_crit(vict, ~0)); emote(buf, agg, room_list[vict.getCurRoomNum()], TRUE); }//else }//if did_hit else if (!did_hit) { //missed if (!is_canned) agg.MANA -= spell_mana; if (&agg == &vict) { show("Your web falls around your feet.\n", agg); do_join_in_battle = FALSE; }//if else { Sprintf(buf, "Your web misses %S.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S fails to catch you in %s web!\n", name_of_crit(agg, vict.SEE_BIT), get_his_her(agg)); buf.Cap(); show(buf, vict); }//else }//else, missed else if (lost_con) {//lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else agg.PAUSE++; if (do_effects) { stat_spell_cell* sp; Cell<stat_spell_cell*> cll(vict.affected_by); while ((sp = cll.next())) { if (sp->stat_spell == spell_num) { sp->bonus_duration += (int)((float)(lvl) / 3.0); return; }//if }//while Put(new stat_spell_cell(spell_num, lvl/3), vict.affected_by); vict.DEX += WEB_DEX_AUGMENTATION; vict.MV_REGEN += WEB_MV_REGEN_AUGMENTATION; }//if if (do_join_in_battle && !HaveData(&vict, agg.IS_FIGHTING)) { join_in_battle(agg, vict); }//if }//do_cast_web void do_cast_entangle(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); short do_effects = FALSE; short do_join_in_battle = TRUE; int spell_num = ENTANGLE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short did_hit = TRUE; short lost_con = FALSE; if ((is_canned && (did_hit = did_spell_hit(vict, AGILITY, agg, lvl, TRUE))) || (!is_canned && !(lost_con = lost_concentration(agg, spell_num)) && (did_hit = did_spell_hit(agg, AGILITY, vict)))) { do_effects = TRUE; if (&vict == &agg) { show("You entangle yourself, great!!\n", vict); emote("is suddenly covered in a thick, sticky web.", agg, room_list[agg.getCurRoomNum()], TRUE); do_join_in_battle = FALSE; }//if else { Sprintf(buf, "You tangle %S in a thick sticky web!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S has covered you with a strong web of something!!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "covers %S with a strong, sticky web.\n", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//else }//if did_hit else if (!did_hit) { //missed if (&agg == &vict) { show("Your web falls around your feet.\n", agg); do_join_in_battle = FALSE; }//if else { Sprintf(buf, "Your web misses %S.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S fails to catch you in %s web!\n", name_of_crit(agg, vict.SEE_BIT), get_his_her(agg)); buf.Cap(); show(buf, vict); }//else agg.PAUSE += 1; // increment pause_count }//else, missed with canned magic else { //lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; agg.PAUSE += 1; }//else if (do_effects) { stat_spell_cell* sp; Cell<stat_spell_cell*> cll(vict.affected_by); while ((sp = cll.next())) { if (sp->stat_spell == spell_num) { sp->bonus_duration += (int)((float)(lvl) / 3.0); return; }//if }//while Put(new stat_spell_cell(spell_num, lvl/3), vict.affected_by); vict.DEX += ENTANGLE_DEX_AUGMENTATION; vict.MV_REGEN += ENTANGLE_MV_REGEN_AUGMENTATION; }//if if (do_join_in_battle && !HaveData(&vict, agg.IS_FIGHTING)) { join_in_battle(agg, vict); }//if }//do_cast_entangle void cast_faerie_fire(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = FAERIE_FIRE_SKILL_NUM; if (victim->Strlen() == 0) vict = Top(pc.IS_FIGHTING); else vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Who do you wish to cast faerie fire on??\n", pc); return; }//if /* got a victim, now check for mob/smob */ if (vict->isMob()) { vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if /* all checks have been passed, lets do it */ if (!ok_to_do_action(vict, "KMSNV", spell_num, pc)) { return; }//if do_cast_faerie_fire(*vict, pc, FALSE, 0); //does no error checking }//cast_faerie_fire void do_cast_faerie_fire(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); short do_effects = FALSE; short do_join_in_battle = TRUE; int spell_num = FAERIE_FIRE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; short lost_con = TRUE; short did_hit = TRUE; if ((is_canned && (did_hit = did_spell_hit(vict, NORMAL, agg, lvl, TRUE))) || (!is_canned && !(lost_con = lost_concentration(agg, spell_num)) && (did_hit = did_spell_hit(agg, NORMAL, vict)))) { do_effects = TRUE; do_join_in_battle = TRUE; if (!is_canned) agg.MANA -= spell_mana; if (&vict == &agg) { show("You glow with an eerie purplish light!!\n", vict); emote("suddenly glows with an eerie purplish light.", agg, room_list[agg.getCurRoomNum()], TRUE); do_join_in_battle = FALSE; }//if else { Sprintf(buf, "You make %S glow with an eerie purplish light!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S makes you glow with a purplish light!!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "makes %S glow with an eerie purplish light.", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//else }//if did_hit else if (!did_hit) { //missed do_join_in_battle = TRUE; show("Your spell goes awry and the ground glows for an instant.", agg); Sprintf(buf, "%S fails to catch you on faerie fire!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); if (!is_canned) agg.MANA -= spell_mana; }//if else if (lost_con) { show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else if (do_effects) { stat_spell_cell* sp; Cell<stat_spell_cell*> cll(vict.affected_by); while ((sp = cll.next())) { if (sp->stat_spell == spell_num) { sp->bonus_duration += (int)((float)(lvl) / 3.0); return; }//if }//while Put(new stat_spell_cell(spell_num, lvl/3), vict.affected_by); vict.AC += FAERIE_FIRE_AC_AUGMENTATION; }//if if (do_join_in_battle && !HaveData(&vict, agg.IS_FIGHTING)) { join_in_battle(agg, vict); }//if }//do_cast_faerie_fire void cast_calm(critter& pc) { int spell_num = CALM_SKILL_NUM; /* all checks have been passed, lets do it */ if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if do_cast_calm(pc, FALSE, 0); //does no error checking }//cast_calm void do_cast_calm(critter& agg, int is_canned, int lvl) { String buf(100); short do_effects = FALSE; int spell_num = CALM_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); if (!is_canned) lvl = agg.LEVEL; if (is_canned) { do_effects = TRUE; show("You bring peace to the room.\n", agg); emote("brings peace to all!", agg, room_list[agg.getCurRoomNum()], TRUE); }//if canned else {//not canned // Immorts will always have this work... if (!lost_concentration(agg, spell_num) || agg.isImmort()) { do_effects = TRUE; show("You bring peace to the room!\n", agg); emote("brings peace to all.\n", agg, room_list[agg.getCurRoomNum()], TRUE); agg.MANA -= spell_mana; agg.PAUSE += 1; // increment pause_count }//if ! lost concentration else { //lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote(LOST_CONCENTRATION_MSG_OTHER, agg, *(agg.getCurRoom()), FALSE); agg.MANA -= spell_mana / 2; agg.PAUSE += 1; }//else }//else !canned if (do_effects) { int rm_num = agg.getCurRoomNum(); List<critter*> tmp_lst(room_list[rm_num].getCrits()); Cell<critter*> cll(tmp_lst); critter* ptr; List<critter*> affected; while ((ptr = cll.next())) { if (room_list[rm_num].haveCritter(ptr)) { if (!ptr->IS_FIGHTING.isEmpty()) { ptr->IS_FIGHTING.clear(); //no more battle affected.append(ptr); } }//if }//while affected.head(cll); while ((ptr = cll.next())) { if ((room_list[rm_num].haveCritter(ptr)) && (room_list[rm_num].haveCritter(&agg))) { do_was_calmed_procs(*ptr, agg); //maybe they really don't like it!! }//if }//while }//if }//do_cast_calm