/* -*- LPC -*- */ /* * $Locker: $ * $Id: chatter.c,v 1.10 2003/07/14 19:41:13 ceres Exp $ * */ /** * The standard chatter inheritable for room chats. * @author Pinkfish * @see /std/room.c * @see room_chat */ #include <room.h> nosave int _off; nosave object _room; nosave mixed *_chats; /** * Allows the chat interval to be changed. * @param min minimum interval between chats (seconds) * @param max maximum interval between chats (seconds) */ void set_chat_min_max( int min,int max ) { if (_chats) { _chats[0]=min; _chats[1]=max; } } /* set_chat_min_max() */ /** * Gives the chatter a room to chat at and the chat args. * @param my_room room object * @param chat_args chat data: ({ min, max, chats array }) * @see room_chat * @see query_room_chats * @see /std/room/basic/chatter */ void setup_chatter( object my_room, mixed *chat_args ) { _off = 1; _room = my_room; if( !arrayp( chat_args ) ) { chat_args = ({ chat_args }); } _chats = chat_args + ({ 0 }); } /* setup_chatter() */ /** @ignore yes */ void dest_me() { destruct( this_object() ); } /* dest_me() */ /** @ignore yes */ void make_chat() { int saying; mixed stuff; if(!_room) { dest_me(); return; } if ( !_chats || sizeof(_chats) < 3 || !sizeof(_chats[2]) || !sizeof( filter( all_inventory( _room ), (: interactive($1) :), this_object() ) ) ) { _off = 1; return; } saying = random( sizeof( _chats[ 2 ] ) ); if ( saying == _chats[ 3 ] ) { saying = ( saying + 1 ) % sizeof( _chats[ 2 ] ); } _chats[ 3 ] = saying; stuff = _chats[ 2 ][ saying ]; if (stringp(stuff)) { if ( stuff[ 0 ] == '#' ) { call_other( _room, stuff[ 1 .. 99 ] ); } else { tell_room( _room, _chats[ 2 ][ saying ] +"\n" ); } } if ( intp( stuff ) ) { map( filter( all_inventory( _room ), (: $1 && living( $1 ) && $1->query_creator() :) ), (: tell_creator( $1, "Warning: " "room_chat array contains integer argument. Did you mix up " "the syntax with load_chat()'s?\n" ) :) ); } ROOM_HANDLER->add_chatter( this_object(), _chats[ 0 ] + random( _chats[ 1 ] - _chats[ 0 ] + 1 ) ); } /* make_chat() */ /** * Checks that the chatter is on and being activated * properly from the room_handler. * @see /std/room/basic/chatter * @see /obj/handlers/room_handler */ void check_chat() { if ( !_off || !pointerp( _chats ) ) { return; } _off = 0; ROOM_HANDLER->add_chatter( this_object(), ( _chats[ 0 ] + random( _chats[ 1 ] - _chats[ 0 ] + 1 ) ) / 2 ); } /* check_chat() */ /** * Adds more chats to the existing set of room chats * managed by this chatter object. * @param new_chats an array of new chat strings * @see remove_room_chats * @see query_room_chats * @see /std/room/basic/chatter */ void add_room_chats( string *new_chats ) { if (sizeof(new_chats)) { if (sizeof(_chats[2])) { _chats[2] = _chats[2] + new_chats; } else { _chats[2]= new_chats; } } } /* add_room_chats() */ /** * Removes chats from the set of room chats * managed by this chatter object. If there are no chats * left the chatter is destructed. * @param dead_chats an array of chat strings to remove * @see add_room_chats * @see query_room_chats * @see /std/room/basic/chatter */ void remove_room_chats( string *dead_chats ) { if (sizeof(_chats[2])) { _chats[2] = _chats[2] - dead_chats; } if (!sizeof(_chats[2])) { destruct(this_object()); } } /* remove_room_chats() */ /** * Returns the the set of room chats * managed by this chatter object. * @return pointer to the mixed array of chat args * @example * ({ 120, 240, ({ "A frog gimbles the curtains.", * "A truly revolting smell drifts insidiously " * "from the rug." }) }) * @see add_room_chats * @see remove_room_chats * @see room_chat * @see /std/room/basic/chatter */ mixed *query_room_chats() { return _chats; } /** @ignore yes */ int clean_up( int parent ) { /* Clones of this object are pointless without a room to chat to. */ if (parent) return 0; if (!_room || _room->query_chatter() != this_object()) dest_me(); }