/** * This effect is used in a quest in the Dwarf bread museum. Simulates * a loose tooth that will be knocked out elsewhere. Added from eating * dwarf bread. * <p> * The effect does not time out. The argument is an integer of how many * 'stages' to advance the looseness of the tooth. If arg is -1, effect * will end with a tooth dropping out if old arg was over 5. * <p> * @author Wonko * @classification body.loose.tooth * @see help::effects */ #include <effect.h> #define TO this_object() #define AUDIENCE environment( player ) #define PLYRNAME player->the_short() #define PLYRPRON player->query_pronoun() #define PLYRPOSS player->query_possessive() #define PLYROBJE player->query_objective() /** @ignore yes */ string query_classification() { return "body.loose.tooth"; } /** @ignore yes */ int query_indefinite() { return 1; } /** @ignore yes */ void beginning( object player, int stages ) { player->add_property( "body.loose.tooth", 1, 60 + random( 30 ) ); player->submit_ee( "start_mess", 2, EE_ONCE ); player->submit_ee( "rand_mess", ({ 60, 90 }), EE_CONTINUOUS ); } /* beginning() */ /** @ignore yes */ int merge_effect( object player, int stages, int newstages ) { if( newstages == -1 ) { if( stages > 5 ) { player->submit_ee( 0, 0, EE_REMOVE ); return newstages; } return stages; } stages += newstages; player->add_property( "body.loose.tooth", 1, 60 + random( 30 ) ); player->submit_ee( "merge_mess", 2, EE_ONCE ); return stages; } /* merge_effect() */ /** @ignore yes */ void merge_mess( object player, int stages ) { switch( stages ) { case 2 : tell_object( player, "Your loose tooth seems a bit looser.\n" ); break; case 3 : tell_object( player, "That tooth is now quite loose.\n" ); break; case 4 : tell_object( player, "Your loose tooth is really wiggling about quite " "a lot.\n" ); break; case 5 : tell_object( player, "That tooth can't be hanging in there by very " "much now.\n" ); break; default : tell_object( player, "You guess one good jolt will cause that loose " "tooth to come out.\n" ); } tell_room( AUDIENCE, PLYRNAME + " looks appears to have something wrong " "with " + PLYRPOSS + " mouth.\n", player ); } /* merge_mess() */ /** @ignore yes */ void start_mess( object player ) { tell_object( player, "You notice that dwarf bread has loosened a tooth " "slightly.\n" ); tell_room( AUDIENCE, PLYRNAME + " seems to be have noticed something " "unpleasant in " + PLYRPOSS + " mouth.\n", player ); } /* start_mess() */ /** @ignore yes */ void end( object player, int stages ) { object tooth; if( !player->query_property( "dead" ) && stages == -1 ) { tell_object( player, "That jolt finally frees your loose tooth, which " "flies out of your mouth and bounces around in a rather sickening " "manner.\n" ); tell_room( AUDIENCE, "A tooth is jolted from " + PLYRPOSS + " mouth and " "it bounces around a bit.\n", player ); tooth = clone_object( "/std/object" ); tooth->set_name( "tooth" ); tooth->set_short( "human tooth" ); tooth->add_adjective( "human" ); tooth->add_plural( ({ "human teeth", "teeth" }) ); tooth->set_long( "This is a tooth from a human.\n" ); tooth->add_property( "DBM owner", player->query_name() ); tooth->move( AUDIENCE ); } } /* end() */ /** @ignore yes */ void rand_mess( object player ) { switch( random( 5 ) ) { case 0 : tell_object( player, "You prod your loose tooth with your tongue.\n" ); break; case 1 : tell_object( player, "You reach into your mouth and wiggle the loose " "tooth around a bit.\n" ); break; case 2 : tell_object( player, "Your loose tooth makes you wonder vaguely about " "dwarf dentistry.\n" ); break; case 3 : tell_object( player, "You can't help from inspecting your loose tooth " "with your tongue.\n" ); break; case 4 : tell_object( player, "You wonder if eating more dwarf bread would help " "loosen your tooth further.\n" ); break; } } /* rand_mess() */