/
LIB3/
LIB3/D/ADMIN/
LIB3/D/ADMIN/OBJ/
LIB3/D/ADMIN/ROOM/W/
LIB3/D/HOME/
LIB3/D/HOME/CITY/ARENA/
LIB3/D/HOME/CITY/ITEMS/
LIB3/D/HOME/CITY/POSTOFFI/
LIB3/DOC/
LIB3/GLOBAL/SPECIAL/
LIB3/GLOBAL/VIRTUAL/
LIB3/NET/
LIB3/NET/CONFIG/
LIB3/NET/DAEMON/CHARS/
LIB3/NET/GOPHER/
LIB3/NET/INHERIT/
LIB3/NET/OBJ/
LIB3/NET/SAVE/
LIB3/NET/VIRTUAL/
LIB3/OBJ/B_DAY/
LIB3/OBJ/HANDLERS/TERM_TYP/
LIB3/PLAYERS/B/
LIB3/PLAYERS/N/
LIB3/ROOM/
LIB3/SAVE/
LIB3/SAVE/BOARDS/
LIB3/SAVE/ENVIRON/
LIB3/SAVE/POST/
LIB3/STD/COMMANDS/SHADOWS/
LIB3/STD/CREATOR/
LIB3/STD/DOM/
LIB3/STD/EFFECTS/
LIB3/STD/EFFECTS/HEALING/
LIB3/STD/EFFECTS/OTHER/
LIB3/STD/EFFECTS/POISONS/
LIB3/STD/ENVIRON/
LIB3/STD/GUILDS/
LIB3/STD/LIQUIDS/
LIB3/STD/ROOM/
LIB3/STD/TRIGGER/SHADOW/
LIB3/W/
LIB3/W/BANNOR/
LIB3/W/NEWSTYLE/
#include "potion_attrs.h"
#include "library.h"
inherit "/std/object";
#define MY_ROOM "/d/sur/PLAIN/for/picnic"

object *demons, cauldron, coin;

void    setup()
{
    set_weight( 10 );
    set_value( 5 );
    set_name( "shell" );
    add_adjective( "sea" );
    add_alias( "seashell" );
    set_short( "sea shell" );
    set_long( "A large conch shell.  It looks like it has been hollowed " +
	      "out so that it can be played.  Perhaps if you blew into " +
	      "it it might work.\n" );
}

void    init()
{
    ::init();
    this_player()->add_command( "blow", this_object() );
}

int     finish_quest();

int     do_blow( object *indir, string s1, string s2, string prep )
{
    if( sizeof( indir ) )
    {
	write( "Blow " + short( 0 ) + " " + prep + " " + indir->short( 0 ) + "????\n" );

	return 0;
    }
    if( file_name( environment( this_player() ) ) == MY_ROOM )
	return finish_quest();
    write( "You blow the " + short( 0 ) + " and make a horrible noise.\n" );
    say( this_player()->query_cap_name() + " blows into a " + short( 0 ) + " and makes a horrible noise.\n" );

    return 1;
}

int     finish_quest()
{
    object *obs, *obs2, *obs3, ob, fish, frisbee, ladel;
    mixed  *attrs;
    string  failure;
    int     i, j;

    write( "The " + short( 0 ) + " blows amazing loudly.\n" );
    say( this_player()->query_cap_name() + " blows the " + short( 0 ) +
	 " amazingly loudly.\n" );

    if( demons )
    {
	write( "Demons glare at you.\n" );
	say( "Demons glare at " + this_player()->query_cap_name() + ".\n" );
	return 1;
    }
    obs = all_inventory( environment( this_player() ) );
    obs3 = obs;
    obs = map_array( obs, "bingle_bit", this_object() );
    if( (i = member_array( "ladel", obs )) == -1 )
	failure = "no ladel";
    else
	ladel = obs3[ i ];
    if( (i = member_array( "frisbee", obs )) == -1 )
	failure = "no frisbee";
    else
	frisbee = obs3[ i ];
    if( (i = member_array( "cauldron", obs )) == -1 )
	failure = "no caldron";
    else
    {
	cauldron = obs3[ i ];
	obs2 = find_match( "cauldrons", environment( this_player() ) );
	for( i = 0; i < sizeof( obs2 ); i++ )
	{
	    if( (int)obs2[ i ]->query_volume() < 100 ||
		    (int)obs2[ i ]->query_volume() < (int)obs2[ i ]->query_max_volume() / 2 )
		continue;
	    attrs = (mixed *)obs2[ i ]->query_misc_attrs();
	    if( pointerp( attrs ) )
		attrs = attrs[ POTION_NAMES ];
	    if( pointerp( attrs ) && sizeof( attrs ) && attrs[ 0 ][ 0 ] == "yucky ankh water" )
		j++;
	}
	if( !j )
	    failure = "no cauldron full of anhk river water";
    }
    if( (i = member_array( "coin", obs )) == -1 )
	failure = "no coin";
    else
	coin = obs3[ i ];
    if( (i = member_array( "fish", obs )) == -1 )
	failure = "no fish";
    else
	fish = obs3[ i ];
    obs2 = find_match( "toadstools", environment( this_player() ) );
    obs2 = filter_array( obs2, "bongle_array", this_object() );
    if( sizeof( obs2 ) < 4 )
	failure = "not enough toadstools to sit on";
    if( failure )
    {
	write( "A bunch of hungry looking demons show up.\n" );
	write( "They look around the clearing.\n" );
	write( "Mutter to themselves about there being " + failure + ".\n" );
	write( "Demon glares at you.\n" );
	say( "A bunch of hungry looking demons show up.\n" );
	say( "They look around the clearing.\n" );
	say( "Mutter to themselves about there being " + failure + ".\n" );
	say( "Demon glares at " + this_player()->query_cap_name() + ".\n" );
	return 1;
    }
    demons = allocate( 4 );
    for( i = 0; i < sizeof( demons ); i++ )
    {
	demons[ i ] = clone_object( "/std/container" );
	demons[ i ]->set_name( "demon" );
	demons[ i ]->reset_get();
	demons[ i ]->set_long( "A small demon with a manic look in his eyes " +
			       "cooking soup.\n" );
	demons[ i ]->move( environment( this_player() ) );
	obs2[ i ]->move( demons[ i ] );
    }
    coin->reset_get();
    cauldron->reset_get();
    fish->dest_me();
    ladel->move( demons[ 2 ] );
    frisbee->move( demons[ 1 ] );
    say( "The demons grab the fish and stick it into the cauldron.  " +
	 "They then put the frisbee on the top of the cauldron as a " +
	 "lid.  One of the demons grabs the label and stirs the " +
	 "mixture around a bit whilst the other demons blow on " +
	 "cauldron to heat it up.\n" );
    call_out( "do_finish_it", 10 );
    write( "The demons grab the fish and stick it into the cauldron.  " +
	   "They then put the frisbee on the top of the cauldron as a " +
	   "lid.  One of the demons grabs the ladle and stirs the " +
	   "mixture around a bit whilst the other demons blow on " +
	   "cauldron to heat it up.\n" );
    return 1;
}

void    do_finish_it()
{
    object *obs;
    int     i, j;

    say( "The soup is obviously hot now, and all the demons sit down " +
	 "on their toadstools to enjoy the meal.  After finishing the " +
	 "meal, they smile happily.  You hear one of the say on the " +
	 "way out, \"Great way to get a meal, It works every time\".\n" +
	 "The demons leave takeing the table, cauldron and ladel with them.\n" );
    write( "The soup is obviously hot now, and all the demons sit down " +
	   "on their toadstools to enjoy the meal.  After finishing the " +
	   "meal, they smile happily and leave.  You hear one of the " +
	   "demons say on the " +
	   "way out, \"Great way to get a meal, It works every time\".\n" +
	   "The demons leave takeing the table, cauldron and ladel with them.\n" );
    cauldron->dest_me();
    coin->dest_me();
    obs = all_inventory( environment( demons[ 0 ] ) );
    for( i = 0; i < sizeof( obs ); i++ )
	if( interactive( obs[ i ] ) )
	{
	    if( !LIBRARY->set_quest( obs[ i ]->query_name(), "feeding frenzy" ) )
		continue;
	    obs[ i ]->adjust_xp( 5000 );
	}
    for( i = 0; i < sizeof( demons ); i++ )
    {
	obs = all_inventory( demons[ i ] );
	for( j = 0; j < sizeof( obs ); j++ )
	    obs[ j ]->dest_me();
	demons[ i ]->dest_me();
    }
    demons = 0;
}

mixed   bingle_bit( object ob )
{
    return( mixed ) ob->query_property( "feeding_frenzy" );
}

int     bongle_array( object ob )
{
    return( int ) ob->query_property( "feeding_frenzy" ) != 0;
}