/* Bird race object. Made by Ceres and stolen from the vulture object.
Modified by Dragonkin for new race system (this race shouldn't exist btw) */
inherit "/std/races/bird_base";
void setup() {
set_name( "bird" );
set_long( "A general, unspecified bird.\n" );
set_height( 15 );
set_weight( 60 );
set_stats( ({ 0, 14, -4, -4, -6 }) );
} /* setup() */
void new_set_level( mixed *args ) {
int weight;
object thing;
thing = args[ 1 ];
if ( !thing )
return;
weight = (thing->query_weight() / 20);
thing->add_ac( "blunt", "blunt", weight / 2 );
thing->add_ac( "pierce", "pierce", weight );
thing->add_ac( "sharp", "sharp", weight );
} /* new_set_level() */
void set_unarmed_attacks( object thing ) {
int number;
number = (int)thing->query_skill_bonus( "fighting.combat.melee.unarmed" );
number = sqrt( number / 4 ) + ( thing->query_weight() / 20 );
thing->remove_attack( "hands" );
thing->remove_attack( "feet" );
thing->remove_attack( "beak" );
thing->remove_attack( "claws" );
thing->add_attack( "beak", 50, ({ number / 2, 2, number / 2 }),
"pierce", "unarmed", 0 );
thing->add_attack( "claws", 75, ({ number, 5, number / 2 }),
"sharp", "unarmed", 0 );
thing->set_combat_response("dodge");
} /* set_unarmed_attacks() */
void eat_bit( mixed main_bits, object corpse, object race_obj,
object eater ) {
int which_bit;
mixed *sub_bits;
object new_bit;
if( !eater ) return;
which_bit = 3 * random( sizeof( main_bits ) / 3 );
sub_bits = main_bits[ which_bit + 2 ];
if( sizeof( sub_bits ) > 3 ) {
call_out( "eat_bit", 0,
race_obj->query_bit(
sub_bits[ random( sizeof(sub_bits ) - 3 ) + 3 ] ),
corpse, race_obj, eater );
return;
}
if( member_array( main_bits[ which_bit ],
(mixed *)corpse->query_bits_left() ) == -1 ) {
eater->remove_property( "busy" );
return;
}
new_bit = corpse->make_bit( main_bits[which_bit] );
corpse->add_bit_gone( main_bits[ which_bit ] );
if( !( race_obj->query_eat( main_bits[ which_bit ] ) ) ) {
tell_room( environment( eater ), "The " + (string)eater->short() +
" rips " + add_a( main_bits[ which_bit ] ) + " from " +
(string)corpse->short() + " and drops it.\n" );
new_bit->move( environment(eater) );
eater->remove_property( "busy" );
return;
}
tell_room( environment( eater ), "The " + (string)eater->short() +
" tears " + add_a( main_bits[ which_bit ] ) + " from " +
(string)corpse->short() + " and begins eating.\n" );
new_bit->dest_me();
call_out( "finish_eating", 30 * sub_bits[ 1 ] +
random( 60 * sub_bits[ 1 ] ) + random( 30 ), eater );
} /* eat_bit() */
void finish_eating( object eater ) {
if( !eater )
return;
eater->remove_property( "busy", 1 );
} /* finish_eating() */
void player_heart_beat( string word, object eater ) {
int i;
object race_obj, *stuff;
if( !environment( eater ) ) return;
if( eater->query_property( "busy" ) ) return;
stuff = all_inventory( environment( eater ) ) - ({ eater });
if( !sizeof( stuff ) ) return;
for( i = 0; i < sizeof( stuff ); i++ )
if( !( stuff[ i ]->id( "corpse" ) ) ) {
stuff -= ({ stuff[ i ] });
i--;
}
if( !sizeof( stuff ) ) return;
eater->add_property( "busy", 1 );
i = random( sizeof( stuff ) );
race_obj = stuff[ i ]->query_race_ob();
call_out( "eat_bit", 0, race_obj->query_bits(), stuff[ i ], race_obj,
eater );
} /* player_heart_beat() */