inherit "/std/effect_shadow"; #include <move_failures.h> #include <ranged_response.h> #define BP tell_object( find_player("gerbil"), "BP.\n"); #define TG tell_object( find_player("gerbil"), #define ERROR "/w/gerbil/TOYS/error_handler" object *trackers = ({ }); object last; int run; void add_tracker( object ob ) { if( member_array( ob, trackers ) == -1 ) trackers += ({ ob }); } varargs int move( mixed dest, string inmess, string outmess ) { int i; i = player->move( dest, inmess, outmess ); if( !player ) return i; if( i == MOVE_OK ) trackers->target_moved( player, dest ); return i; } void remove_tracker( object ob ) { if( member_array( ob, trackers ) != -1 ) { trackers -= ({ ob }); } if( !sizeof( trackers ) ) remove_this_effect(); } object *query_trackers() { return trackers; } void diag() { TG query_multiple_short( trackers->query_short() ) + " : tracker check...\n"); } object do_death( object ob ) { trackers->target_died( player ); if( last ) { ERROR->log_kills( last, player ); return player->do_death( ob ); } return player->do_death( ob ); } void set_last_person_who_shot_me( object ob ) { last = ob; } void run_from_firer( object firer, object launcher ) { string *str, *exits, dir; int i; exits = environment( player )->query_dest_dirs(); if( !sizeof( exits ) ) { return; } for( i=0;i<sizeof( exits );i+=2) { str += ({ exits[i] }); } exits = launcher->query_return_path(); str -= ({ exits[sizeof(exits) - 1] }); if( !sizeof( str ) ) { dir = exits[sizeof(exits) - 1]; } else { dir = str[random( sizeof( str ) )]; } player->do_command( dir ); call_out( "run_from_firer", 2, firer, launcher ); } varargs void run_to_firer( object firer, object launcher, string path ) { if( !path ) { path = launcher->query_return_path(); } player->do_command( path[0] ); if( sizeof( path ) > 2 ) { path = path[1..]; call_out( "run_to_firer", 1, firer, launcher, path ); } else { run = 0; } } void npc_fired_upon( object firer, object bullet, object launcher ) { int i, j; mixed res; if( !player->query_ranged_response() ) { i = player->query_level(); j = firer->query_level(); if( i > j ) { player->attack_firer(); } else { player->run_from_firer(); } } else { res = player->query_ranged_response(); if( functionp( res ) ) { // call function return; } switch( res ) { case FIGHT : if( !run ) { run = 1; run_from_firer( firer, launcher ); } break; case RUN : run_to_firer( firer, launcher ); break; case STAND : break; default : break; } } }