// Missile spell. Mobydick, 10-31-92. In a state of flux.
#include <mudlib.h>
inherit DAEMON ;
void block_attack (int time) ;
object query_attacker() ;
object *query_attackers() ;
varargs int cast (string str, int obj) {
object target ;
int sp, cost, skill ;
if (str=="NONE") {
target = this_player()->query_current_attacker() ;
} else {
target = present(str,environment(this_player())) ;
}
if (!target) {
write ("Cast a magic missile at whom?\n") ;
return 1 ;
}
if (target==this_player()) {
write ("That seems like a pretty bad idea.\n") ;
return 1 ;
}
if (!living(target)) {
write("Please don't damage the furniture.\n") ;
return 1 ;
}
if ((int)target->query("no_attack")==1) {
write ("You are not permitted to attack that.\n") ;
return 1 ;
}
// if obj==1, then the call came from an object and we don't want to
// assess the spell point cost.
if (obj!=1) {
sp = this_player()->query("spell_points") ;
skill = this_player()->query_skill("Combat spells") ;
cost = 100/(skill+10) ;
if (sp<cost) {
write ("You haven't got enough spell points to cast it.\n") ;
return 1 ;
}
this_player()->set ("spell_points", sp-cost) ;
}
if (str!="NONE") {
write ("You attack "+str+"!\n") ;
}
this_player()->kill_ob(target) ;
call_out( "new_missile_cast(target)", 1, this_player() );
this_player()->improve_skill("Combat spells", 5) ;
return 1 ;
}
int new_missile_cast( object target ) {
target = query_attacker() ;
block_attack(4) ;
write ("You begin casting magic missile...\n") ;
call_out( "new_missile_effect(target)", 4, this_player() );
}
void new_missile_effect( object target ) {
int hp, damage, skill ;
if (!present(target,environment(this_player())) || target->query("hit_points")<0) {
tell_object(this_object(), "Your target is no longer here.\n") ;
return ;
}
skill = this_player()->query_skill ("Combat spells") ;
damage = random(6+skill/10)+5+skill/5 ;
if(damage) target->set("last_attacker", this_player());
target->receive_damage(damage) ;
tell_object(target,"Suddenly you are hit by a magic missile spell!\n);
tell_room(environment(this_player()), this_player()->query("cap_name")+"hits "+target->query("cap_name")+" with a magic missile!\n", ({ this_player(), target }) ) ;
tell_object(this_player(), "You cast a magic missile at "+target->query("name")+" and hit!\n") ;
tell_object(this_player(),"You cast magic missile at "+target->query("na
}