#include <position.h>
#define ANTI_LIGHT_SPELL "/obj/spells/anti-light"
inherit NPC_OBJ;
object owner;
mapping knockers;
int going_away;
void create() {
::create();
add_extra_look( this_object() );
basic_setup("elemental", 1, 0);
set_height( 10 );
set_base_weight( 1 );
adjust_bonus_dex( 25 );
knockers = ([ ]);
add_property( "no fleas", 1 );
add_property( "floating", 1 );
set_cannot_change_position(1);
set_default_position( ({ "zipping about" }) );
return_to_default_position(1);
} /* create() */
string extra_look( object thing ) {
if ( !objectp( owner ) )
return "It seems to be zipping about rather aimlessly.\n";
return "It seems to be mostly zipping about "+
(string)owner->the_short() +".\n";
} /* extra_look() */
int attack_by( object thing ) {
if(!userp(thing)) {
this_object()->stop_fight(thing);
return 1;
}
if ( thing ) {
knockers[ thing ]++;
if ( knockers[ thing ] > 5 ) {
tell_object( thing, "You get fed up with seeing "+ the_short() +
" dodge aside, so you stop fighting it.\n" );
thing->stop_fight( this_object() );
map_delete( knockers, thing );
return 0;
} else
call_out( "zap_bugger", 1, thing );
}
return 1;
} /* attack_by() */
void zap_bugger( object thing ) {
int damage;
if ( !thing )
return;
if ( environment( thing ) != environment() )
return;
tell_object( thing, "A small bolt of lightning shoots from "+
the_short() +" and hits you on the arm.\n" );
tell_room( environment(), "A small bolt of lightning shoots from "+
the_short() +" and hits "+ (string)thing->the_short() +
" on the arm.\n", thing );
damage = roll_MdN( 5, 40 );
damage -= (int)thing->query_ac( "lightning", damage, "arms" );
thing->adjust_hp( -damage, this_object() );
thing->attack_by( this_object() );
} /* zap_bugger() */
void attack_ob( object thing ) { return; }
int query_skill_bonus( string word ) {
string temp;
if ( sscanf( word, "%sdodging%s", temp, temp ) == 2 )
return 1000000;
return ::query_skill_bonus( word );
} /* query_skill_bonus() */
int query_ac( string type, int amount, string zone ) {
if ( type != "magic" )
return amount;
return ::query_ac( type, amount, zone );
} /* query_ac() */
object query_owner() { return owner; }
void set_owner( object thing ) {
owner = thing;
owner->add_follower( this_object() );
} /* set_owner() */
void go_away() {
if ( objectp( owner ) ) {
owner->remove_follower( this_object() );
if ( environment( owner ) == environment() )
tell_object( owner, "Your small blue light crumples to dust.\n" );
tell_room( environment(), "The small blue light crumples to dust.\n",
owner );
} else {
tell_room( environment(), "The small blue light crumples to dust.\n" );
}
move( "/room/rubbish" );
} /* go_away() */
void remove_effect() {
if( objectp( owner ) )
ANTI_LIGHT_SPELL->spell_succeeded( owner, ({ this_object() }), 500 );
}
int do_shoo() {
if( this_player() == owner ) {
call_out( (: remove_effect :), 2 );
this_player()->
add_succeeded_mess( this_object(), "$N $V $D away.\n", ({ }) );
return 1;
} else {
return 0;
}
}
void init() {
::init();
if( !(objectp( owner ) || going_away) ) {
going_away = 1;
call_out( "go_away", 0 );
} else {
if( this_player() == owner )
this_player()->add_command( "shoo", this_object() );
}
} /* init() */
void event_exit( object thing, string mess, object dest ) {
::event_exit( thing, mess, dest );
if ( thing != owner )
return;
if ( find_call_out( "check_owner" ) == -1 )
call_out( "check_owner", 2 );
} /* event_exit() */
void check_owner() {
if ( !objectp( owner ) ) {
go_away();
return;
}
if ( environment() != environment( owner ) &&
environment() != find_object( "/room/rubbish" ) ) {
move( environment( owner ), "$N dart$s into the area and zip$s around "+
(string)owner->the_short() +".",
"$N zip$s off, leaving a faint smell of ozone." );
owner->add_follower( this_object() );
}
} /* check_owner() */