/* Blood Loss Effect for use with vampire bites. * * based on the drunk effect by ceres. * * * * Archana 4/20/97 * * * * Updated to cause vampirism on death, various other modifications as * * well to make is simpler and add more descriptions. * * * * Arguements are: int duration * * See also "vampirebite_shadow.c" and "vampirecorpse_effect.c" * * * * Lemming, 03/07/2000 */ #include <effect.h> #include <living.h> #include <move_failures.h> #include <player.h> mapping compass = ([ "north" : 1, "northeast" : 1, "east" : 1, "southeast" : 1, "south" : 1, "southwest" : 1, "west" : 1, "northwest" : 1 ]); void come_around( object person ); /** @ignore yes */ string query_classification() { return "body.bite.vampire"; } /** @ignore yes */ string query_shadow_ob() { return "/std/shadows/npc/vampirebite_shadow"; } /** @ignore yes */ int survive_death() { return 1; } /** @ignore yes */ int beginning( object person, int extent, int id ) { int con, time; tell_object( person, "Pain shoots through your veins, exploding inside " "your head, making you scream in agony as the effect of the vampire's " "bite fills your body.\n" ); person->add_extra_look( this_object() ); person->adjust_bonus_int(-2); person->adjust_bonus_wis(-2); person->adjust_bonus_str(-2); person->adjust_bonus_dex(-2); person->submit_ee( "bite_pain", ({ 10, 60 }), EE_CONTINUOUS ); // The duration should be similar to the old /global/player drunk // effect, ie, time = 2*extent/query_con(). con = person->query_con(); if( con < 1 ) con = 1; time = 2 * extent / con; person->submit_ee( 0, time, EE_REMOVE ); return time; } /* beginning() */ /** @ignore yes */ int merge_effect( object person, int old_time, int new_extent, int id ) { int con, new_time; con = person->query_con(); if( con < 1 ) con = 1; new_time = ( 2 * new_extent / con ) + person->expected_tt(); person->submit_ee( 0, new_time, EE_REMOVE ); return new_time; } /* merge_effect() */ /** @ignore yes */ void restart( object person, int time, int id ) { person->adjust_bonus_int(-2); person->adjust_bonus_wis(-2); person->adjust_bonus_str(-2); person->adjust_bonus_dex(-2); } /* restart() */ /** @ignore yes */ void end( object person, int time, int id ) { if( person->query_property( PASSED_OUT_PROP ) ) come_around( person ); person->adjust_bonus_int(2); person->adjust_bonus_wis(2); person->adjust_bonus_str(2); person->adjust_bonus_dex(2); tell_object( person, "The firey pain screaming through your veins and " "incessant pounding inside your head finally wear off, leaving you " "with a mild headache.\n" ); } /* end() */ /** @ignore yes */ void bite_pain( object person, int time, int id ) { int timeleft, selector; timeleft = (int)person->expected_tt(); if( person->query_property( PASSED_OUT_PROP ) ) { switch( random(3) ) { case 0 : tell_room( environment(person), person->one_short() + " shakes " "slightly in silent agony.\n", person ); break; case 1 : tell_room( environment(person), person->one_short() + " moans, " "writhing on the ground.\n", person ); break; case 2 : tell_room( environment(person), person->one_short() + " opens " + person->query_possessive() + " eyes, stares around wildly as if " "in a fever, and passes out again with a groan.\n", person ); break; } return; } selector = random( timeleft ) / person->query_con() / 5; switch( selector ) { case 0 : break; case 1 : case 2 : switch( random(4) ) { case 0 : person->new_parser( "gasp in pain" ); break; case 1 : person->new_parser( "moan agonisingly" ); break; case 2 : person->new_parser( "stumble" ); break; default : person->new_parser( "dloh head in pain" ); break; } break; case 3 : case 4 : case 5 : switch( random(4) ) { case 0 : tell_object( person, "You clutch your head and groan in agony as " "the effect of the vampires bite burns through you.\n" ); tell_room( environment( person ), person->the_short() + " clutches " + person->query_possessive() + " head and groans " "in agony.\n", person ); break; case 1 : tell_object( person, "You stagger about, your vision blurring and " "fading for a moment while your head throbs with pain.\n" ); tell_room( environment( person ), person->the_short() + " staggers about, " + person->query_possessive() + " eyes " "drifting in and out of focus.\n", person ); break; case 2 : tell_object( person, "You feel yourself go lightheaded and the " "pain fades for just a moment, before slamming back into you " "like a hammer to the forehead.\n" ); tell_room( environment( person ), person->the_short() + " pales " "as the blood drains from " + person->query_possessive() + " face, then clenches " + person->query_possessive() + " teeth " "and groans with pain.\n", person ); break; default : tell_object( person, "The fire flooding through your veins causes " "you to scream in agony, your body racked with pain.\n" ); tell_room( environment( person ), person->the_short() + " leans " + person->query_possessive() + " head back and screams in " "pain.\n", person ); break; } break; default : if( timeleft > 100 ) { switch( random(2) ) { case 0 : tell_object( person, "The world goes black. You have "+ "passed out.\n" ); tell_room( environment( person ), "The blood drains from " + person->the_short() + "'s face, and " + person->query_pronoun() + " collapses heavily to the " "ground.\n", person ); person->add_property( PASSED_OUT_PROP, 1 ); person->submit_ee( "come_around", ({ 50, 80 }), EE_ONCE ); break; case 1 : person->submit_ee( "wander_about", 3, EE_ONCE ); break; } } } } /* bite_pain() */ /** @ignore yes */ void come_around( object person ) { tell_object( person, "You feel a pounding headache coming on and realise " "you are finally conscious.\n" ); tell_room( environment( person ), person->the_short() + " groans " "painfully, opens " + person->query_possessive() + " eyes and slowly " "picks " + person->query_objective() + "self up.\n", person ); person->remove_property( PASSED_OUT_PROP ); } /* come_around() */ /** @ignore yes */ void wander_about( object person, int time, int id ) { int i, flag; string *direcs; if( person->query_property( PASSED_OUT_PROP ) || !environment( person ) ) return; if( random( 4 ) ) person->submit_ee( "wander_about", ({ 8, 8 }), EE_ONCE ); direcs = (string *)environment( person )->query_direc(); while( sizeof( direcs ) && !flag ) { i = random( sizeof( direcs ) ); if( /* !environment( person )->query_obvious_exit( direcs[ i ] ) || */ !environment( person )->query_door_open( direcs[ i ] ) ) { direcs = delete( direcs, i, 1 ); continue; } person->add_property( UNKNOWN_MOVE, 1 ); if( compass[direcs[i]] ) flag = person->exit_command( 0, ({ direcs[ i ], "$N attempt$s to " "walk in one direction and instead stumble$s off towards the " "$T." }) ); else flag = person->exit_command( 0, ({ direcs[ i ], "$N stumble$s off " "towards the $T." }) ); tell_object( person, "You attempt to get up and walk and just " "manage to stumble around a bit.\n" ); person->remove_property( UNKNOWN_MOVE ); if( !flag ) direcs = delete( direcs, i, 1 ); } } /* wander_about() */ string extra_look( object player, mixed *args ) { return capitalize(player->query_pronoun()+" looks rather pale with cold," " clammy skin and a look of dizziness.\n"); } /* extra_look() */