#include "spells.h" void do_call_out_effect(mixed *params); static int spell_hp; #define SP_DIV 5 static mixed *effects; void create() { effects = ({ }); } /* create() */ /* temp for testing */ mixed query_effects() { return effects; } int add_spell_effect(int no_rnds, string type, string name, object callee, string func, mixed params) { int i,j; if ( type == "spell" ) spell_hp = this_object()->query_hp(); else spell_hp = -1; if ((i=member_array(type, effects)) != -1) if ((j=member_array(name, effects[i+1])) == -1) effects[i+1] += ({ name, ({ no_rnds, callee, func, params }) }); else effects[i+1][j+1] = ({ no_rnds, callee, func, params }); else effects += ({ type, ({ name, ({ no_rnds, callee, func, params }) }) }); } /* add_spell_effect() */ int remove_spell_effect(string name) { int i, j; for (i=0;i<sizeof(effects);i+=2) if ((j=member_array(name, effects[i+1])) != -1) { if(effects[i+1][j+1][1]) effects[i+1][j+1][1]->remove_me(this_object()); effects[i+1] = delete(effects[i+1], j, 2); if (!sizeof(effects[i+1])) { effects = delete(effects, i, 2); i -= 2; } } return 1; } /* remove_spell_effect() */ mixed query_spell_effect(string name) { int i, j; if ((i=member_array(name, effects)) == -1) return 0; if (sizeof(effects[i+1])) return effects[i..i]+effects[0..1]; return 0; } /* query_spell_effect() */ mixed *query_spell_effects_type(string type) { int i, j; mixed *ret; if ((i=member_array(type, effects)) == -1) return ({ }); ret = ({ }); for (j=0;j<sizeof(effects);j+=2) ret += ({ effects[i], effects[i+1][j..j+1] }); return ret; } /* query_spell_effects_type() */ int do_spell_effects(object attacker) { int i, j; // Taniwha 1997, clean up on silence if(!ETO) { TO->remove_property("casting"); TO->move("/room/void"); return 0; } this_object()->remove_property("casting"); for ( i=sizeof(effects)-2; i>=0; i-=2) for ( j=sizeof(effects[i+1])-2; j>=0; j-=2) { if( (spell_hp - (int)this_object()->query_hp()) > ((int)this_object()->query_max_hp()/SP_DIV) ) { tell_room(environment(this_object()), (string)this_object()->query_cap_name()+ " winces, and loses concentration !\n",({this_object()})); tell_object(this_object(),"You flinch under the assault, " "and lose your concentration!\n"); effects[i+1] = delete(effects[i+1],j,2); } else { if(effects[i] == "spell"){ if(this_object()->query_property("nocast") || environment(this_object())->query_property("nocast")){ remove_spell_effect(effects[i+1][j]); return 0; } } do_call_out_effect( ({effects[i+1][j+1],attacker}) ); if (!--effects[i+1][j+1][SP_NO_RNDS]) effects[i+1] = delete(effects[i+1], j, 2); } } return 0; } /* do_spell_effects() */ void do_call_out_effect(mixed *params) { this_object()->adjust_xp(call_other(params[0][SP_OBJECT], params[0][SP_FUNC], this_object(), // params[1], params[0][SP_PARAM], params[0][SP_NO_RNDS])); } /* do_effect() */