#include "spells.h"
nosave mixed *effects;
void create() {
effects = ({ });
} /* create() */
/* temp for testing */
mixed query_effects() { return effects; }
int queue_commands() { return sizeof( effects ); }
int add_spell_effect(int no_rnds, string type, string name, object callee,
string func, mixed params) {
int i,j;
if (strsrch(file_name(this_object()),"global")==-1)
tell_object(find_living("shiannar"),
sprintf("add_spell_effect in %s\n",
file_name(this_object())));
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;
if (strsrch(file_name(this_object()),"global")==-1)
tell_object(find_living("shiannar"),
sprintf("remove_spell_effect in %s\n",
file_name(this_object())));
for (i=0;i<sizeof(effects);i+=2)
if ((j=member_array(name, effects[i+1])) != -1) {
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;
if (strsrch(file_name(this_object()),"global")==-1)
tell_object(find_living("shiannar"),
sprintf("query_spell_effect in %s\n",
file_name(this_object())));
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;
this_object()->remove_property("casting");
for (i=0;i<sizeof(effects);i+=2)
for (j=0;j<sizeof(effects[i+1]);j+=2) {
call_out("do_call_out_effect", 1, ({ effects[i+1][j+1], attacker }));
effects[i+1][j+1][SP_NO_RNDS]--;
if ( !effects[i+1][j+1][SP_NO_RNDS] || !effects[i+1][j+1][SP_OBJECT]) {
effects[i+1] = delete(effects[i+1], j, 2);
j -= 2;
if (!sizeof(effects[i+1])) {
effects = delete(effects, i, 2);
i -= 2;
break;
}
}
}
return 0;
} /* do_spell_effects() */
void do_call_out_effect(mixed *params) {
if (params[0][SP_OBJECT])
call_other(params[0][SP_OBJECT],
params[0][SP_FUNC],
params[1],
params[0][SP_PARAM],
params[0][SP_NO_RNDS]);
} /* do_effect() */