// Tremaine 9th September, 2000
inherit "/std/races/carnivore";
void setup() {
set_name( "gryphon" );
set_long( "The gryphon has the head and chest of"
" an eagle, and the rear of a lion.\n");
set_height( 350 );
set_weight( 4000 );
set_sight( ({ 5, 20, 200, 300 }) );
set_stats( ({ 8, 10, -4, 14, -4 }) );
bits= ({
"head", "head", ({ 0, 120, 0,
"left eye", "right eye", "skull" }),
"left eye", "eye", ({ "head", 2, 0 }),
"right eye", "eye", ({ "head", 2, 0 }),
"skull", "cranium", ({ "head", 50, 0 }),
"neck", "neck", ({ 0, 120, 0 }),
"torso", "body", ({ 0, 400, 0,
"heart", "left wing", "right wing" }),
"heart", "heart", ({ "torso", 35, 0 }),
"left wing", "left wing", ({ "torso", 45, 0}),
"right wing", "right wing", ({ "torso", 45, 0 }),
"left front leg", "leg", ({ 0, 140, 0, "left front claw" }),
"left front claw", "claw", ({ "left front leg", 20, 0 }),
"right front leg", "leg", ({ 0, 140, 0, "right front claw" }),
"right front claw", "claw", ({ "right front leg", 20, 0 }),
"left rear leg", "leg", ({ 0, 160, 0, "left rear paw" }),
"left rear paw", "paw", ({ "left rear leg", 20, 0 }),
"right rear paw", "paw", ({ "right rear leg", 20, 0 }),
"tail", "tail", ({ 0, 15, 0 })
});
} /* setup */
string query_desc( object thing ) {
if ( (int)thing->query_gender() == 1 )
return "He is a powerful young male gryphon.\n";
if ( (int)thing->query_gender() == 2 )
return "She is a powerful young female gryphon.\n";
return "It is a powerful young gryphon.\n";
} /* query_desc() */
void new_set_level( mixed *args ) {
int level;
object thing;
if( sizeof(args) < 2 || !args[1] )
return;
level = args[ 0 ];
thing = args[ 1 ];
thing->add_skill_level( "general.health", level * 1.5 );
thing->add_ac( "blunt", "blunt", level );
thing->add_ac( "sharp", "sharp", 2 + level );
thing->add_ac( "pierce", "pierce", 2 * level );
thing->add_ac( "magic", "magic", level / 4);
} /* new_set_level() */
void set_unarmed_attacks( object thing ) {
int number;
number = (int)thing->query_skill_bonus( "fighting.combat.melee.unarmed" );
number = 2 + sqrt( number );
thing->remove_attack( "hands" );
thing->remove_attack( "feet" );
thing->remove_attack( "claws" );
thing->remove_attack( "special" );
if( number < 10 )
number = 10;
thing->add_attack( "claws", 100, ({ number, 10, number }),
"sharp", "unarmed", 0 );
thing->add_attack( "special", 75, ({ 3 * number, number / 2, number }),
"pierce", "unarmed", 0 );
thing->add_attack_message( "special", "pierce", ({
50, ({
"You scratch $hcname$ with your beak.\n",
"$mcname$ scratches you with $mposs$ beak.\n",
"$mcname$ scratches $hcname$ with $mposs$ beak.\n"}),
100, ({
"You jab your beak into $hcname$.\n",
"$mcname$ jabs $mposs$ beak into you.\n",
"$mcname$ jabs $mposs$ beak into $hcname$.\n"}),
140, ({
"You tear into $hcname$.\n",
"$mcname$ tears into you.\n",
"$mcname$ tears $hcname$.\n"}),
180, ({
"You rip into $hcname$'s body with your beak.\n",
"$mcname$ rips into your body with $mposs$ beak.\n",
"$mcname$ rips into $hcname$'s body with $mposs$ beak.\n"}),
230, ({
"You dismember $hcname$.\n",
"$mcname$ dismembers you.\n",
"$mcname$ dismembers $hcname$.\n"}),
0, ({
"You disembowel $hcname$.\n",
"$mcname$ disembowels you.\n",
"$mcname$ disembowels $hcname$.n" })
}) );
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() */