/* Object: Bubblebath!
Author: Wobin
Description: Makes funtime bath! ... err... or something...
Uses the argument
({ <expiry time>, ({ <colour>, <fragrance> }) })
*/
#include <effect.h>
#define PATH __DIR__
string query_classification() { return "room.bubblebath"; }
int query_surface_water(object room) {
return room->query_surface() ||
sizeof(filter(all_inventory(room), (: $1->query_baths() :)));
}
void beginning( object room, mixed *args) {
object uproom;
tell_room( room, "As the liquid enters the water it diffuses into "
"a "+ args[1][0] +" coloured cloud.\n" );
if(query_surface_water(room))
tell_room( room, "A gentle fragrance of " + args[1][1] +
" fills the room.\n");
else if(uproom = find_object(room->query_destination(room->query_up_dir())))
uproom->add_effect(PATH + "bubble_bath", args);
room->submit_ee( "bubblebubble", ({10,30}), EE_CONTINUOUS );
room->submit_ee( 0, args[0], EE_REMOVE );
room->add_extra_look( this_object() );
room->add_item(args[1][0] + " bubbles", "These " + args[1][0] + " coloured "
"bubbles fill the room.");
} /* beginning() */
/** @ignore yes */
mixed *merge_effect( object room, mixed *old_arg, mixed *new_arg, int id ) {
int index,count,copy=0;
string type;
object uproom;
tell_room( room, "The bubbles surge as more bubble bath is added.\n" );
room->submit_ee( 0, new_arg[0] + (int)room->expected_tt(), EE_REMOVE );
count = sizeof(old_arg);
for( index = 1; index < count; index++) {
if( new_arg[1][0] == old_arg[index][0] ) {
copy = 1;
break;
}
}
if(!copy) {
old_arg += ({ new_arg[1] });
room->add_extra_look(this_object());
type = (room->query_surface()?"air":"water");
room->add_item( new_arg[1][0] + " bubbles", "These " + new_arg[1][0] +
" coloured bubbles fill the " + type + ".");
tell_room( room, "As the liquid enters the water it diffuses into "
"a "+ new_arg[1][0] +" coloured cloud.\n" );
if(query_surface_water(room))
tell_room( room, "A gentle fragrance of " + new_arg[1][1] +
" fills the air.\n");
else if(uproom = find_object(room->query_destination(room->query_up_dir()))) {
uproom->add_item( new_arg[1][0] + " bubbles", "These " + new_arg[1][0] +
" coloured bubbles fill the " + type + ".");
uproom->add_effect(PATH + "bubble_bath", new_arg);
}
return old_arg;
}
return 0;
} /* merge_effect() */
/** @ignore yes */
void end( object room, mixed *args, int id) {
int index, count;
string type =(room->query_surface()?"fragrant":"colourful");
tell_room( room, "The last of the bubbles disappear with a " + type +
" *pop*.\n" );
room->remove_extra_look( this_object() );
count = sizeof(args);
for (index = 1; index < count; index++ )
room->remove_item( args[index][0] + " bubbles" );
} /* end() */
string extra_look( object room ) {
int *enums; /* effects list */
int count, size;
mixed shades=({}); /* list of colours */
string bubblez; /* description to return */
string type;
enums = room->effects_matching( query_classification() );
type = (room->query_surface()?"smelling":"looking");
if ( !sizeof ( enums )) return "";
/* Since there should be only one effect... */
shades = room->arg_of( enums[0] );
if ( !sizeof ( shades )) return "";
if ( sizeof ( shades ) == 1 )
bubblez = "A multitude of " + shades[1][0] +" coloured bubbles fill the "
"room, " + type + " delicately of " + shades[1][1] + ".\n";
if ( sizeof ( shades ) > 1 ) {
size = sizeof ( shades );
bubblez = "The room is filled with " + shades[1][0];
for ( count = 2; count < size; count++ ) {
if ( count != size-1 ) {
bubblez += ", ";
}
else {
bubblez += " and ";
}
bubblez += shades[count][0];
}
bubblez += " coloured bubbles, floating everywhere.\n";
}
return bubblez;
} /* extra_look() */
void bubblebubble( object room, mixed *args) {
int index = 0;
string type = (query_surface_water(room)?"fragrance":"colours");
string where= (query_surface_water(room)?"air":"water");
/* Get a random index that isn't 0 */
while (!index) index = random(sizeof(args));
tell_room( room, "The gentle " + type + " of " + args[index][1] + " floats "
"through the " + where + " as some of the " + args[index][0] + " bubbles "
"pop.\n");
}