// $Id: spells2.cc,v 1.10.2.17 2000/07/03 06:20:30 aasen Exp $ // $Revision: 1.10.2.17 $ $Author: aasen $ $Date: 2000/07/03 06:20:30 $ // //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 // ///********************** spells2.cc *******************************/// /* These are mostly clerical spells. They have no fatalities and no battle will be started. */ #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 <math.h> #include "spells2.h" #include <PtrArray.h> #include "zone.h" void do_cast_locate(const String* targ, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = LOCATE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (targ->Strlen() < 1) { show("Locate what?\n", agg); return; }//if else if (targ->Strlen() == 1) { show("You need to be more specific.\n", agg); return; }//if if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { if (!is_canned) agg.MANA -= spell_mana; int zon; int end; int begin; if (agg.getImmLevel() > 5) { // Search the entire game!! end = Cur_Max_Room_Num; begin = 1; } else { zon = room_list[agg.getCurRoomNum()].getZoneNum(); end = ZoneCollection::instance().elementAt(zon).getEndRoomNum(); begin = ZoneCollection::instance().elementAt(zon).getBeginRoomNum(); } Cell<critter*> ccll; critter* ptr; Cell<object*> ocll; for (int i = begin; i<= end; i++) { // TODO: Optimize this..move it into room class so we don't have // to make coppies of the list! --BEN List<critter*> tmp_crits(room_list[i].getCrits()); tmp_crits.head(ccll); while ((ptr = ccll.next())) { do_locate_object(*ptr, targ, agg, i, 0, lvl); }//while room_list[i].getInv()->head(ocll); while ((ptr = ccll.next())) { do_locate_object(*ptr, targ, agg, i, 0, lvl); }//while }//for }//if it worked else { //not canned AND lost concentration show("You have a hard time locating your thoughts!\n", agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 2; }//do_cast_locate void cast_locate(const String* victim, critter& pc) { int spell_num = LOCATE_SKILL_NUM; /* check out pc */ if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if /* all checks have been passed, lets do it */ do_cast_locate(victim, pc, FALSE, 0); }//do_cast_locate void do_cast_wizard_eye(object& vict, critter& pc, int is_canned, int lvl) { String buf(100); int spell_num = WIZARD_EYE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, pc); int lost_con = FALSE; if (!pc.pc) return; if (!is_canned) lvl = pc.LEVEL; if (is_canned || !(lost_con = lost_concentration(pc, spell_num))) { if (!is_canned) pc.MANA -= spell_mana; if (!vict.obj_proc) { vict.obj_proc = new obj_spec_data; vict.OBJ_FLAGS.turn_on(63); }//if if (vict.obj_proc->w_eye_owner) { show("That object is already being used for a wizard's eye!\n", pc); return; }//if else if (pc.pc->w_eye_obj) { show("You are already watching something!\n", pc); return; }//if else { Sprintf(buf, "Your perspective shifts slightly as you begin to see from the point of view of the %S.", name_of_obj(vict, pc.SEE_BIT)); show(buf, pc); vict.obj_proc->w_eye_owner = &pc; pc.pc->w_eye_obj = &vict; }// }//if it worked else { //not canned AND lost concentration show(LOST_CONCENTRATION_MSG_SELF, pc); emote("obviously forgot part of the spell!", pc, ROOM, TRUE); if (!is_canned) pc.MANA -= spell_mana / 2; }//else lost concentration pc.PAUSE += 1; }//do_cast_wizard_eye void cast_wizard_eye(int i_th, const String* victim, critter& pc) { object* vict = NULL; int spell_num = WIZARD_EYE_SKILL_NUM; /* check out pc */ if (!(vict = have_obj_named(pc.inv, i_th, victim, pc.SEE_BIT, ROOM))) { vict = ROOM.haveObjNamed(i_th, victim, pc.SEE_BIT); if (vict && !vict->isModified()) { vict = obj_to_sobj(*vict, ROOM.getInv(), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if }//if else { if (!vict->isModified()) { vict = obj_to_sobj(*vict, &(pc.inv), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if } if (!vict) { show("On which item??\n", pc); return; }//if if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if /* all checks have been passed, lets do it */ do_cast_wizard_eye(*vict, pc, FALSE, 0); }//do_cast_wizard_eye void do_cast_recharge(object& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = RECHARGE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { if (!is_canned) agg.MANA -= spell_mana; vict.CHARGES++; Sprintf(buf, "You pour all your energy into %S.\n", long_name_of_obj(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "pours all %s energy into %S.\n", get_his_her(agg), long_name_of_obj(vict, agg.SEE_BIT)); }//if it worked else { //not canned AND lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 2; }//do_cast_recharge void cast_recharge(int i_th, const String* victim, critter& pc) { object* vict = NULL; int spell_num = RECHARGE_SKILL_NUM; if (!(vict = have_obj_named(pc.inv, i_th, victim, pc.SEE_BIT, ROOM))) { show("Recharge what??\n", pc); return; }//if if (!vict->IN_LIST) { vict = obj_to_sobj(*vict, &(pc.inv), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if if (!vict->OBJ_FLAGS.get(51)) { show("That is not a type of wand!\n", pc); return; }//if if (vict->RECHARGE <= 0) { show("That can't be recharged any more times.\n", pc); return; }//if if (vict->CHARGES != 0) { show("It already contains as much power as you could place in it!\n", pc); return; }//if /* all checks have been passed, lets do it */ do_cast_recharge(*vict, pc, FALSE, 0); }//do_cast_recharge void do_cast_identify(object& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = IDENTIFY_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { if (!is_canned) agg.MANA -= spell_mana; // Do lore with extra info. do_lore(vict, agg, TRUE); }//if it worked else { //not canned AND lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; }//do_cast_identify void cast_identify(int i_th, const String* victim, critter& pc) { object* vict = NULL; int spell_num = IDENTIFY_SKILL_NUM; if (!(vict = have_obj_named(pc.inv, i_th, victim, pc.SEE_BIT, ROOM))) { vict = ROOM.haveObjNamed(i_th, victim, pc.SEE_BIT); }//if if (!vict) { show("Identify what??\n", pc); return; }//if if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if /* all checks have been passed, lets do it */ do_cast_identify(*vict, pc, FALSE, 0); }//do_cast_identify void do_cast_bind_wound(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = BIND_WOUND_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; stat_spell_cell* ptr; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { show("Ok.\n", agg); ptr->bonus_duration += lvl/2; }//if else { Put(new stat_spell_cell(spell_num, lvl + 5), vict.affected_by); vict.HP_REGEN += BIND_WOUND_EFFECT; if (&vict == &agg) { show("You wrap your wounds in magical bandages.\n", vict); Sprintf(buf, "wraps %s wounds in magical bandages.", get_his_her(vict)); emote(buf, vict, room_list[vict.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You wrap %S's wounds in magical bandages.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S wraps your wounds in magical bandages.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "wraps %S's wounds with magical bandages.", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if it worked else { //not canned AND lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; }//do_cast_bind_wound void cast_bind_wound(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = BIND_WOUND_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Who do you wish to bandage??\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 if (!ok_to_do_action(vict, "KMSNB", spell_num, pc)) { return; }//if /* all checks have been passed, lets do it */ do_cast_bind_wound(*vict, pc, FALSE, 0); }//cast_bind_wound void do_cast_shadows_blessing(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = SHADOWS_BLESSING_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; stat_spell_cell* ptr; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { show("Ok.\n", agg); ptr->bonus_duration += lvl/2; }//if else { Put(new stat_spell_cell(spell_num, lvl + 5), vict.affected_by); vict.AC += SHADOWS_BLESSING_EFFECT; if (&vict == &agg) { show("You cloak yourself in a veil of shadows!\n", vict); Sprintf(buf, "cloaks %s in a veil of shadows!", get_himself_herself(vict)); emote(buf, vict, room_list[vict.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You cloak %S in a veil of shadows.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S cloaks you in a veil of shadows!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "cloaks %S in a veil of shadows!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if it worked else { //not canned AND lost concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; }//do_cast_shadows_blessing void cast_shadows_blessing(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = SHADOWS_BLESSING_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Who do you wish to cover in shadows??\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 if (!ok_to_do_action(vict, "KMSN", spell_num, pc)) { return; }//if /* all checks have been passed, lets do it */ do_cast_shadows_blessing(*vict, pc, FALSE, 0); }//do_cast_shadows_blessing void do_cast_cure_blind(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = CURE_BLINDNESS_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { int pnum; stat_spell_cell* ptr = is_affected_by((pnum = BLINDNESS_SKILL_NUM), vict); if (!is_canned) agg.MANA -= spell_mana; if (!ptr) { show("Ok.\n", agg); }//if else { rem_effects_crit(pnum, vict, FALSE); //no longer affected by blindness vict.affected_by.loseData(ptr); if (&vict == &agg) { show("You can see again!\n", agg); Sprintf(buf, "cures %s blindness.", get_himself_herself(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You cure %S's blindness.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S cures your blindness.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "cures %S's blindness!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); Sprintf(buf, "seems to have lost %s concentration!", get_his_her(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; }//do_cast_cure_blind void cast_cure_blind(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = CURE_BLINDNESS_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to make see again??\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_cure_blind(*vict, pc, FALSE, 0); }//do_cast_cure_blind void do_cast_remove_poison(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = REMOVE_POISON_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { int pnum; stat_spell_cell* ptr = is_affected_by((pnum = POISON_SKILL_NUM), vict); if (!is_canned) agg.MANA -= spell_mana; if (!ptr) { show("Ok.\n", agg); }//if else { rem_effects_crit(pnum, vict, FALSE); //no longer affected by poison vict.affected_by.loseData(ptr); if (&vict == &agg) { show("You cure yourself!\n", agg); Sprintf(buf, "cures %s of a poisoning.", get_himself_herself(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You remove poison from %S's body.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S cures you of a poisoning.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "cures %S of a poisoning!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); Sprintf(buf, "seems to have lost %s concentration!", get_his_her(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; }//do_cast_remove_poison void cast_remove_poison(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = REMOVE_POISON_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to rid of poison??\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_remove_poison(*vict, pc, FALSE, 0); }//do_cast_remove_poison void do_cast_flesh_to_stone(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); short did_hit = TRUE; short do_join_in_battle = FALSE; int spell_num = FLESH_TO_STONE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if ((is_canned && (did_hit = did_spell_hit(vict, CRONIC, agg, lvl, TRUE))) || (!is_canned && !(lost_con = lost_concentration(agg, spell_num)) && (did_hit = did_spell_hit(agg, CRONIC, vict)))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl / 3; show("Ok.\n", agg); }//if else if (vict.LEVEL > agg.LEVEL) { Put(new stat_spell_cell(STONE_SKIN_SKILL_NUM, lvl + 5), vict.affected_by); vict.DAM_REC_MOD += STONE_SKIN_EFFECT_DRM; vict.DEX += STONE_SKIN_EFFECT_DEX; if (&vict == &agg) { show("Your skin turns as hard as stone!\n", agg); }//if else { Sprintf(buf, "You turn %S's skin as hard as stone.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S turns you skin as hard as stone!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "turns %S's skin as hard as stone!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else } // else if (vict.LEVEL > agg.LEVEL) else { Put(new stat_spell_cell(spell_num, lvl/2), vict.affected_by); vict.CRIT_FLAGS.turn_on(14); if (&vict == &agg) { show("You have been petrified!\n", agg); }//if else { Sprintf(buf, "You petrify %S!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S petrifies you!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "petrifies %S!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else if (!did_hit) { do_join_in_battle = TRUE; Sprintf(buf, "You fail to petrify %S!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S fails to petrify you!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "fails to petrify %S!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//if missed else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("feels a little weak in the head!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; if (do_join_in_battle && !HaveData(&vict, agg.IS_FIGHTING )) join_in_battle(agg, vict); } void cast_flesh_to_stone(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = FLESH_TO_STONE_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to petrify??\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, "KMSVN", spell_num, pc)) { return; }//if do_cast_flesh_to_stone(*vict, pc, FALSE, 0); } void do_cast_sleep(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); short did_hit = TRUE; int spell_num = SLEEP_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if ((vict.getLevel() <= agg.getLevel()) && ((is_canned && (did_hit = did_spell_hit(vict, CRONIC, agg, lvl, TRUE))) || (!is_canned && !(lost_con = lost_concentration(agg, spell_num)) && (did_hit = did_spell_hit(agg, CRONIC, vict))))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { show("They are already asleep!\n", agg); }//if else { Put(new stat_spell_cell(spell_num, lvl/6 + 1), vict.affected_by); vict.CRIT_FLAGS.turn_on(15); //is perm_sleeped vict.setPosn(POS_SLEEP); if (&vict == &agg) { show("You put yourself to sleep!\n", agg); Sprintf(buf, "puts %s to sleep for a while!", get_himself_herself(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You put %S to sleep!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S forces sleep to fall over your eyes...\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "forces %S to sleep!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else if (!did_hit) { Sprintf(buf, "You fail to put %S to sleep!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S fails to force you to sleep.\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "fails to force %S to go to sleep!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//if missed else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); Sprintf(buf, "seems to have lost %s concentration!", get_his_her(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; }//do_cast_sleep void cast_sleep(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = SLEEP_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to put to sleep??\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, "BKMSVN", spell_num, pc)) { return; }//if do_cast_sleep(*vict, pc, FALSE, 0); }//cast_sleep void do_cast_strength(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = STRENGTH_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl / 2; show("Ok.\n", agg); }//if else { Put(new stat_spell_cell(spell_num, lvl), vict.affected_by); vict.STR += STRENGTH_EFFECT; if (&vict == &agg) { show("You feel stronger!\n", agg); }//if else { Sprintf(buf, "You make %S's stronger!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S makes you stronger!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "gives %S strength!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("feels a little weak in the head!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; }//do_cast_strength void cast_strength(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = STRENGTH_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to strengthen??\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_strength(*vict, pc, FALSE, 0); }//do_cast_strength void do_cast_remove_curse(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = REMOVE_CURSE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; stat_spell_cell* ptr = is_affected_by(CURSE_SKILL_NUM, vict); if (!ptr) { Sprintf(buf, "%S isn't cursed.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); return; }//if if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { if (!is_canned) agg.MANA -= spell_mana; rem_effects_crit(CURSE_SKILL_NUM, vict, TRUE); vict.affected_by.loseData(ptr); //might be redundant if (&vict == &agg) { show("You feel a curse lifted from your body!\n", agg); }//if else { Sprintf(buf, "You lift a curse from %S's soul!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S removes a curse on your soul!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "removes a curse from %S!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); if (d(1,10) == 1) { show("OOPS, the curse has transferred to YOU!!\n", agg); do_cast_curse(agg, agg, FALSE, 0); }//if }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); Sprintf(buf, "lost %s concentration!", get_his_her(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; }//do_cast_remove_curse (mob) void do_cast_remove_curse(object& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = REMOVE_CURSE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; stat_spell_cell* ptr = is_affected_by(CURSE_SKILL_NUM, vict); if (!ptr) { Sprintf(buf, "%S isn't cursed.\n", name_of_obj(vict, agg.SEE_BIT)); show(buf, agg); return; }//if if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { if (!is_canned) agg.MANA -= spell_mana; rem_effects_obj(CURSE_SKILL_NUM, vict); vict.affected_by.loseData(ptr); //might be redundant Sprintf(buf, "You lift a curse from %S!\n", long_name_of_obj(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "removes a curse from %S!", long_name_of_obj(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); Sprintf(buf, "lost %s concentration!", get_his_her(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; }//do_cast_remove_curse (obj) void cast_remove_curse(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = REMOVE_CURSE_SKILL_NUM; object* obj = NULL; if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { obj = have_obj_named(pc.inv, i_th, victim, pc.SEE_BIT, ROOM); if (obj) { if (!obj->IN_LIST) { obj = obj_to_sobj(*obj, &(pc.inv), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if }//if else { obj = ROOM.haveObjNamed(i_th, victim, pc.SEE_BIT); if (obj) { if (!obj->IN_LIST) { obj = obj_to_sobj(*obj, ROOM.getInv(), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if }//if else { show("Remove curse from what??\n", pc); return; }//else }//else /* if here then have a valid object */ do_cast_remove_curse(*obj, pc, FALSE, 0); }//if else { if (vict->isMob()) { vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if do_cast_remove_curse(*vict, pc, FALSE, 0); }//else }//cast_remove_curse void cast_curse(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = CURSE_SKILL_NUM; object* obj = NULL; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { obj = have_obj_named(pc.inv, i_th, victim, pc.SEE_BIT, ROOM); if (obj) { if (!obj->IN_LIST) { obj = obj_to_sobj(*obj, &(pc.inv), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if }//if else { obj = ROOM.haveObjNamed(i_th, victim, pc.SEE_BIT); if (obj) { if (!obj->IN_LIST) { obj = obj_to_sobj(*obj, ROOM.getInv(), TRUE, i_th, victim, pc.SEE_BIT, ROOM); }//if }//if else { show("Curse what??\n", pc); return; }//else }//else /* if here then have a valid object */ if (!ok_to_do_action(NULL, "KMSN", spell_num, pc)) { return; }//if do_cast_curse(*obj, pc, FALSE, 0); }//if else { 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 do_cast_curse(*vict, pc, FALSE, 0); }//else }//cast_curse void do_cast_curse(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); short did_hit = TRUE; int spell_num = CURSE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if ((is_canned && (did_hit = did_spell_hit(vict, CRONIC, agg, lvl, TRUE))) || (!is_canned && !(lost_con = lost_concentration(agg, spell_num)) && (did_hit = did_spell_hit(agg, CRONIC, vict)))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl / 3; show("Ok.\n", agg); }//if else { Put(new stat_spell_cell(spell_num, lvl/2 + 5), vict.affected_by); vict.STR += CURSE_STR_EFFECT; vict.MA_REGEN += CURSE_MA_REGEN_EFFECT; if (&vict == &agg) { show("You feel cursed!\n", agg); }//if else { Sprintf(buf, "You lay a curse on %S!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S lays a curse on you!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "lays a curse on %S!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else if (!did_hit) { Sprintf(buf, "Your curse does not stick to %S!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S tries and fails to lay a curse on you!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "fails to lay a curse on %S!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//if didn't hit else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); Sprintf(buf, "loses %s concentration.", get_his_her(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; }//do_cast_curse (mob) void do_cast_curse(object& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = CURSE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl / 3; show("Ok.\n", agg); }//if else { Put(new stat_spell_cell(spell_num, lvl/2 + 5), vict.affected_by); vict.OBJ_FLAGS.turn_on(5); //no_drop Sprintf(buf, "You lay a curse on %S!\n", long_name_of_obj(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "lays a curse on %S!", long_name_of_obj(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); Sprintf(buf, "loses %s concentration.", get_his_her(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; }//do_cast_curse (obj) void do_cast_blindness(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); short did_hit = TRUE; int spell_num = BLINDNESS_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if ((is_canned && (did_hit = did_spell_hit(vict, CRONIC, agg, lvl, TRUE))) || (!is_canned && !(lost_con = lost_concentration(agg, spell_num)) && (did_hit = did_spell_hit(agg, CRONIC, vict)))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl / 3; show("Ok.\n", agg); }//if else { Put(new stat_spell_cell(spell_num, lvl/2), vict.affected_by); vict.SEE_BIT &= ~(1024); //turn off the flag if (&vict == &agg) { show("You have been blinded!\n", agg); }//if else { Sprintf(buf, "You blind %S!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S blinds you!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "blinds %S!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else if (!did_hit) { Sprintf(buf, "You fail to blind %S!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S fails to blind you!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "fails to blind %S!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//if missed else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("feels a little weak in the head!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; }//do_cast_blindness void cast_blindness(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = BLINDNESS_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to blind??\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, "KMSVN", spell_num, pc)) { return; }//if do_cast_blindness(*vict, pc, FALSE, 0); }//cast_blindness void do_cast_weaken(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); short did_hit = TRUE; int spell_num = WEAKEN_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if ((is_canned && (did_hit = did_spell_hit(vict, CRONIC, agg, lvl, TRUE))) || (!is_canned && !(lost_con = lost_concentration(agg, spell_num)) && (did_hit = did_spell_hit(agg, CRONIC, vict)))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl / 3; show("Ok.\n", agg); }//if else { Put(new stat_spell_cell(spell_num, lvl/2), vict.affected_by); vict.STR += WEAKEN_EFFECT; if (&vict == &agg) { show("You feel weaker!\n", agg); }//if else { Sprintf(buf, "You drain some of %S's strength!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S drains your strength!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "drains %S's strength!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else if (!did_hit) { Sprintf(buf, "You fail to drain some of %S's strength!\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S fails to drain your strength!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "fails to drain %S's strength!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//did_hit else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("feels a little weak in the head!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; }//do_cast_weaken void cast_weaken(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = WEAKEN_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to weaken??\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, "KMSVN", spell_num, pc)) { return; }//if do_cast_weaken(*vict, pc, FALSE, 0); }//do_cast_weaken void do_cast_fly(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = FLY_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl/3; show("Ok.\n", agg); }//if else { Put(new stat_spell_cell(spell_num, lvl/2 + 5), vict.affected_by); vict.CRIT_FLAGS.turn_on(3); if (&vict == &agg) { show("Your feet leave the ground and only the wind slows you down!", agg); }//if else { Sprintf(buf, "You cause %S to start flying.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S causes you to start flying!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "causes %S to start flying!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; // increment pause_count }//do_cast_fly void cast_fly(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = FLY_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to make fly??\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_fly(*vict, pc, FALSE, 0); }//cast_fly void do_cast_haste(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = HASTE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (d(1,15) == 15) { //ouch, lost some CON!! show( "As you cast the spell you feel it tear something from your very soul!\n", agg); agg.CON--; }//if if (ptr) { ptr->bonus_duration += lvl/4 + 2; show("Ok.\n", agg); }//if else { Put(new stat_spell_cell(spell_num, lvl/4 + 4), vict.affected_by); vict.ATTACKS++; if (&vict == &agg) { show("Your reflexes are taken to a whole new level!\n", agg); emote("moves with a quickness quite unlike before!\n", agg, room_list[agg.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You hasten %S's movement.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S hastens your movements!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "hastens %S's movements!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; // increment pause_count }//do_cast_haste void cast_haste(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = HASTE_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to hasten??\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_haste(*vict, pc, FALSE, 0); }//do_cast_haste void do_cast_dispel_magic(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = DISPEL_MAGIC_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { int mana_count = 0; Cell<stat_spell_cell*> cll(vict.affected_by); stat_spell_cell* ptr; while ((ptr = cll.next())) { mana_count += get_mana_cost(ptr->stat_spell); rem_effects_crit(ptr->stat_spell, vict, TRUE); }//while clear_ptr_list(vict.affected_by); if (!is_canned && (agg.pc) && (agg.MANA < mana_count * 2) && d(1,4) == 4) { show("You try to absorb too much power and part of your memory is erased!\n", agg); int tmp; if (agg.SKILLS_KNOWN.Min(tmp)) { int p_learned = get_percent_lrnd(tmp, agg); if (p_learned != -1) { int new_p_learned = max(p_learned - d(1,25), 1); agg.SKILLS_KNOWN.Insert(tmp, new_p_learned); }//if }//find a psuedo random one }//if if (!is_canned) { agg.MANA -= mana_count; if (agg.MANA < 0) agg.MANA = 0; }//if if (&vict == &agg) { show("You are purged of all your magic!\n", agg); Sprintf(buf, "has been stripped of all %s magic!", get_his_her(vict)); emote(buf, vict, room_list[vict.getCurRoomNum()], TRUE); }//if else { Sprintf(buf, "You remove %S's magical protection.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S removes your magical protection!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "removes %S's magical protection!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; // increment pause_count }//do_cast_dispel_magic void do_cast_dispel_magic(object& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = DISPEL_MAGIC_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { int mana_count = 0; Cell<stat_spell_cell*> cll(vict.affected_by); stat_spell_cell* ptr; while ((ptr = cll.next())) { mana_count += get_mana_cost(ptr->stat_spell); rem_effects_obj(ptr->stat_spell, vict); }//while clear_ptr_list(vict.affected_by); if (!is_canned && (agg.pc) && (agg.MANA < mana_count * 2) && d(1,4) == 4) { show( "You try to absorb too much power and part of your memory is erased!\n", agg); int tmp; if (agg.SKILLS_KNOWN.Min(tmp)) { int p_learned = get_percent_lrnd(tmp, agg); if (p_learned != -1) { int new_p_learned = max(p_learned - d(1,25), 1); agg.SKILLS_KNOWN.Insert(tmp, new_p_learned); }//if }//find a psuedo random one }//if if (!is_canned) { agg.MANA -= mana_count; if (agg.MANA < 0) agg.MANA = 0; }//if Sprintf(buf, "You remove %S's magical protection.\n", name_of_obj(vict, agg.SEE_BIT)); show(buf, agg); buf.Cap(); Sprintf(buf, "removes %S's magical protection!", name_of_obj(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE); }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; // increment pause_count } // do_cast_dispel_magic void cast_dispel_magic(int i_th, const String* victim, critter& pc) { critter* vict = NULL; object* targ = NULL; int spell_num = DISPEL_MAGIC_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (ok_to_do_action(vict, "KSNV", spell_num, pc)) { if (!vict) { //no critter found... targ = ROOM.haveObjNamed(i_th, victim, pc.SEE_BIT); if (targ) { //found an object // so, cast it on an object, then do_cast_dispel_magic(*targ, pc, FALSE, 0); }//if found an object else {// didn't find anything show("What do you wish to purge of magic??\n", pc); }//didn't find anything }//if no critter found else { //found a critter if (vict->isMob()) {//is a mob vict = mob_to_smob(*vict, pc.getCurRoomNum(), TRUE, i_th, victim, pc.SEE_BIT); }//if critter's a mob // Okay, cast it on a critter then do_cast_dispel_magic(*vict, pc, FALSE, 0); } // else, found a critter }//if }//do_cast_dispel_magic void do_cast_fireproof(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = FIREPROOF_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl/2 +5; show("Ok.\n", agg); }//if else { Put(new stat_spell_cell(spell_num, lvl + 5), vict.affected_by); vict.HEAT_RESIS += FIRE_PROOF_EFFECT; if (&vict == &agg) { show("You feel almost immune from heat!\n", agg); }//if else { Sprintf(buf, "You lend protection from fire to %S.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S protects you from excessive heat!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "lends %S some protection from fire!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; // increment pause_count }//do_cast_fireproof void cast_fireproof(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = FIREPROOF_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to make fireproof??\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_fireproof(*vict, pc, FALSE, 0); }//do_cast_fireproof void do_cast_magic_shield(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = MAGIC_SHIELD_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl/2; show("Ok.\n", agg); }//if else { Put(new stat_spell_cell(spell_num, lvl), vict.affected_by); vict.AC += MAGIC_SHIELD_AC_EFFECT; vict.SPEL_RESIS += MAGIC_SHIELD_SAC_EFFECT; if (&vict == &agg) { show("A magical shield forms around you!\n", agg); }//if else { Sprintf(buf, "You envelop %S in a magical shield.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S envelops you in a magical shield!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "envelops %S in a magical shield!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; // increment pause_count }//do_cast_magic_shield void cast_magic_shield(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = MAGIC_SHIELD_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to shield??\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_magic_shield(*vict, pc, FALSE, 0); }//cast_magic_shield void do_cast_sanctuary(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = SANCTUARY_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); stat_spell_cell* sptr = is_affected_by(STONE_SKIN_SKILL_NUM, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl/2 +5; show("Ok.\n", agg); }//if else if (vict.DAM_REC_MOD <= 70) { show("You can protect them no better!\n", agg); }//if else if (sptr) { agg.show("Sanctuary cannot be used with Stone skin.\n"); } else { Put(new stat_spell_cell(spell_num, lvl + 5), vict.affected_by); vict.DAM_REC_MOD += SANCTUARY_EFFECT_DRM; if (&vict == &agg) { show("You are protected by a glowing white light!\n", agg); }//if else { Sprintf(buf, "You surround %S with a protective white light.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S surrounds you with a protective white light!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "surrounds %S with a protective white light!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; // increment pause_count }//do_cast_sanctuary void cast_sanctuary(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = SANCTUARY_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Who??\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_sanctuary(*vict, pc, FALSE, 0); }//cast_sanctuary void do_cast_prismatic_globe(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = PRISMATIC_GLOBE_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl/2; show("You strengthen the globe.\n", agg); }//if else { Put(new stat_spell_cell(spell_num, lvl + 5), vict.affected_by); vict.AC += PRISMATIC_GLOBE_EFFECT_AC; vict.MOV += PRISMATIC_GLOBE_EFFECT_MOV; if (&vict == &agg) { show("An almost impermeable globe surrounds you!\n", agg); }//if else { Sprintf(buf, "You surround %S with a prismatic globe.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S surrounds you with a prismatic globe!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "surrounds %S with a prismatic globe!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; // increment pause_count }//do_cast_prismatic_globe void cast_prismatic_globe(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = PRISMATIC_GLOBE_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Who??\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_prismatic_globe(*vict, pc, FALSE, 0); }//do_cast_prismatic_globe void do_cast_stone_skin(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = STONE_SKIN_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); stat_spell_cell* sptr = is_affected_by(SANCTUARY_SKILL_NUM, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl/2 +5; show("Ok.\n", agg); }//if else if (vict.DAM_REC_MOD <= 40) { show("You can protect them no better!\n", agg); }//if else if (sptr) { agg.show("Stone skin cannot be used with Sanctuary.\n"); } else { Put(new stat_spell_cell(spell_num, lvl + 5), vict.affected_by); vict.DAM_REC_MOD += STONE_SKIN_EFFECT_DRM; vict.DEX += STONE_SKIN_EFFECT_DEX; if (&vict == &agg) { show("Your skin turns as hard as stone!\n", agg); }//if else { Sprintf(buf, "You turn %S's skin as hard as stone.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S turns you skin as hard as stone!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "turns %S's skin as hard as stone!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; // increment pause_count }//do_cast_stone_skin void cast_stone_skin(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = STONE_SKIN_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Who??\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_stone_skin(*vict, pc, FALSE, 0); }//cast_stone_skin void do_cast_armor(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = ARMOR_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl/2 +5; show("Ok.\n", agg); }//if else if ((ptr = is_affected_by(DIVINE_PROTECTION_SKILL_NUM, vict))) { show("You are already protected by divine protection.\n", agg); //can't be affected by both at once }//if divine_protection already else { Put(new stat_spell_cell(spell_num, lvl + 5), vict.affected_by); vict.AC += ARMOR_EFFECT; vict.SPEL_RESIS += ARMOR_EFFECT_M; if (&vict == &agg) { show("You feel better protected!\n", agg); Sprintf(buf, "protects %s.", get_himself_herself(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, NULL); }//if else { Sprintf(buf, "You lend protection to %S.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S protects you!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "lends %S some divine protection!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; // increment pause_count }//do_cast_armor void cast_armor(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = ARMOR_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to armor??\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_armor(*vict, pc, FALSE, 0); }//do_cast_armor void do_cast_absorb_blows(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = ABSORB_BLOWS_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl/2; show("Ok.\n", agg); }//if else { Put(new stat_spell_cell(spell_num, lvl), vict.affected_by); if (&vict == &agg) { show( "You weave an interdimensional lattice of magical streams around yourself!\n", agg); }//if else { Sprintf(buf, "You wrap %S in an interdimensional lattice of power.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S wraps you in an interdimensional lattice of power!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "wraps %S in an interdimensional lattice of power!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; // increment pause_count }//do_cast_absorb_blows void cast_absorb_blows(critter& pc) { critter* vict = NULL; int spell_num = ABSORB_BLOWS_SKILL_NUM; if (!ok_to_do_action(vict, "KMSN", spell_num, pc)) { return; }//if /* all checks have been passed, lets do it */ do_cast_absorb_blows(pc, pc, FALSE, 0); }//do_cast_absorb_blows void do_cast_divine_protection(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = DIVINE_PROTECTION_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { stat_spell_cell* ptr = is_affected_by(spell_num, vict); if (!is_canned) agg.MANA -= spell_mana; if (ptr) { ptr->bonus_duration += lvl/2 +5; show("Ok.\n", agg); }//if else if ((ptr = is_affected_by(ARMOR_SKILL_NUM, vict))) { show("Ok.\n", agg); //can't be affected by both at once }//if armored already else { Put(new stat_spell_cell(spell_num, lvl + 5), vict.affected_by); vict.AC += DIVINE_PROTECTION_EFFECT; if (&vict == &agg) { show("You feel much better protected!\n", agg); }//if else { Sprintf(buf, "You lend divine protection to %S.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S protects you with divine forces!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "lends %S some divine protection!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; // increment pause_count }//do_cast_divine_protection void cast_divine_protection(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = DIVINE_PROTECTION_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to protect??\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_divine_protection(*vict, pc, FALSE, 0); }//do_cast_divine_protection void do_locate_object(object &obj, const String* targ, critter& pc, int rm_num, int sanity, int lvl) { obj_ptr_log << "OBJ_LOC " << &obj << endl; if ((sanity > 10) || !detect(pc.SEE_BIT, room_list[rm_num].getVisBit() | obj.OBJ_VIS_BIT)) { return; }//if if (!IsEmpty(obj.inv)) { Cell<object*> cll(obj.inv); object* ptr; while ((ptr = cll.next())) { do_locate_object(*ptr, targ, pc, rm_num, sanity + 1, lvl); }//while }//if /* Must be magical (affect stats) before you can locate it. */ if (obj.isMagic() || pc.isImmort()) { if ((obj.getLevel() <= lvl) || (pc.isImmort())) { String buf(100); if (obj.isNamed(*targ)) { if (pc.isImmort()) { Sprintf(buf, "ROOM: %i [%i]%S: %P40%S.\n", rm_num, obj.getIdNum(), long_name_of_obj(obj, ~0), &(room_list[rm_num].short_desc)); } else { Sprintf(buf, "%S: %P40%S.\n", long_name_of_obj(obj, ~0), &(room_list[rm_num].short_desc)); } buf.Cap(); show(buf, pc); }//if it's named thusly. }//if }//if }//do locate object (object) void do_locate_object(critter &crit, const String* targ, critter& pc, int rm_num, int sanity, int lvl) { if ((sanity > 10) || !detect(pc.SEE_BIT, room_list[rm_num].getVisBit() | crit.VIS_BIT)) { return; }//if if (!IsEmpty(crit.inv)) { Cell<object*> cll(crit.inv); object* ptr; while ((ptr = cll.next())) { do_locate_object(*ptr, targ, pc, rm_num, sanity + 1, lvl); }//while }//if for (int i = 1; i<MAX_EQ; i++) { if (crit.EQ[i]) { do_locate_object(*(crit.EQ[i]), targ, pc, rm_num, sanity + 1, lvl); }//if }//for }//do locate object (critter) //added by aasen void cast_sober(int i_th, const String* victim, critter& pc) { critter* vict = NULL; int spell_num = SOBER_SKILL_NUM; vict = ROOM.haveCritNamed(i_th, victim, pc); if (!vict) { show("Whom do you wish to sober??\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_sober(*vict, pc, FALSE, 0); }//cast_sober //added by aasen void do_cast_sober(critter& vict, critter& agg, int is_canned, int lvl) { String buf(100); int spell_num = SOBER_SKILL_NUM; int spell_mana = get_mana_cost(spell_num, agg); int lost_con = FALSE; if (!is_canned) lvl = agg.LEVEL; if (is_canned || !(lost_con = lost_concentration(agg, spell_num))) { if (!is_canned) agg.MANA -= spell_mana; if (vict.DRUGGED < 1) { show("That person is not drugged.\n", agg); }//if else { if (&vict == &agg) { vict.DRUGGED = -2; show("You feel great except for a splitting headache!\n", agg); Sprintf(buf, "clears %s head.", get_himself_herself(agg)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, NULL); }//if else { agg.DRUGGED = vict.DRUGGED; vict.DRUGGED = -2; Sprintf(buf, "You take the drugs from %S.\n", name_of_crit(vict, agg.SEE_BIT)); show(buf, agg); Sprintf(buf, "%S absorbs your minds poison!\n", name_of_crit(agg, vict.SEE_BIT)); buf.Cap(); show(buf, vict); Sprintf(buf, "%S absorbs some mind poison!", name_of_crit(vict, ~0)); emote(buf, agg, room_list[agg.getCurRoomNum()], TRUE, &vict); }//else }//else }//if worked else { //not canned && LOST concentration show(LOST_CONCENTRATION_MSG_SELF, agg); emote("obviously forgot part of the spell!", agg, room_list[agg.getCurRoomNum()], TRUE); if (!is_canned) agg.MANA -= spell_mana / 2; }//else lost concentration agg.PAUSE += 1; // increment pause_count }//do_cast_sober