/* DISINTEGRATE */
#define NON_LIVING_SAVE 15
#define NAME "@@query_name:$this_player()$@@" /* gives greater flexibilty */
#define TARG "@@query_name:$this_object()$@@"
status disintergrate(mixed targ, mixed alt_type) {
int cl, i;
string file;
if(!alt_type) alt_type = "alteration";
cl = (objectp(alt_type))
? (int)alt_type->query_cast_level()
: (int)this_player()->query(alt_type);
file = file_name(this_object());
sscanf(file, "%s#%d", file, i);
this_player()->load_spell(({
"target", targ,
"name", "Disintergrate",
"sphere", alt_type,
"cost", 26,
"damage", cl, /* used as a save flag */
"level", 26, /* 30 instant kill - 4 casting time */
"cast time", 3,
"spell object", file,
"casting msg", "A dull grey aura starts forming around your hands.\n",
"casting msg room", "A dull grey aura starts forming around "+NAME+
"'s hands.\n",
}));
return 1;
}
/* call when this object is cloned to target */
status cast_spell(object caster,object target,object prev,int dmg) {
write("A dark grey beam springs from your hands.\n");
say("A dark grey beam springs from "+(string)caster->query_name()+
"'s Hands.\n");
if(!living(target)) {
if(random(15) < random(dmg)) {
call_out("disintergrate_ob",1,target);
}
else {
tell_object(caster,"Nothing Happens...\n");
say("Nothing Happens...\n", caster);
}
return 1;
}
if(!(target->query_npc() || caster->query_npc())) {
tell_room(environment(target), "Nothing happens...\n");
return 1;
}
if(dmg == (int)caster->query_spell_dmg()) { /* did not save */
call_out("disintergrate_ob", 1, target);
}
else if(!dmg) {
write("You see the beam hit "+(string)target->query_name()+".\n"+
capitalize((string)target->query_pronoun())+
" resist the beam.\n");
tell_object(target,"You resist the disintergration beam.\n");
say("The beam has no effect on "+(string)target->query_name()+".\n");
destruct(this_object());
}
else {
write("You see "+(string)target->query_name()+" dodge the beam!\n");
tell_object(target,"You dodge the beam!!\n");
say((string)target->query_name()+" dodges the beam.\n");
destruct(this_object()); /* get rid of cloned object */
}
return 1; /* don't do damage */
}
static void disintergrate_ob(object target) {
string name;
object env;
env = environment();
name = (string)target->query_name();
target->death();
if(env)
tell_object(env,"You see the beam strike "+name+" turn to dust.\n");
say("The dark grey beam turns "+name+" to dust.\n");
if(target) {
destruct(target);
}
else {
target = environment();
if(target->id("corpse")) destruct(target); /* death() has moved us */
}
env = environment();
move_object(clone_object("players/angel/spells/obj/dust"), env);
destruct(this_object());
}
status id(string str) { return (str == "spell"); }
/* Native Mode Move */
#include <move.h>