/**
* Deals out random gossip to people who request it.
* <p>
* Add rumours!
* @author Pinkfish
*/
#include <gossip.h>
private class gossip_data *gossip, *rumours;
private nosave int call_id, next;
void create() {
seteuid( master()->creator_file( file_name( TO ) ) );
gossip = ({ });
rumours = ({ });
unguarded( (: restore_object(GOSSIP_SAVE_FILE) :) );
} /* create() */
private void save_me() {
int i;
call_id = 0;
if( ( i = sizeof(gossip) ) > GOSSIP_KEEP_LEVEL )
gossip = gossip[i-GOSSIP_KEEP_LEVEL..];
if( ( i= sizeof(rumours) ) > RUMOUR_KEEP_LEVEL )
rumours = rumours[i-RUMOUR_KEEP_LEVEL..];
unguarded( (: save_object(GOSSIP_SAVE_FILE) :) );
} /* save_me() */
/**
* This method returns whether or not we are accepting new gossip.
* @return 1 if we are accepting new gossip, 0 if not
*/
int query_accept_gossip() {
return sizeof(gossip) < GOSSIP_KEEP_LEVEL || next < time();
} /* query_accept_gossip() */
/**
* This method adds a gossip string and is called by the gossip
* effects on NPCs.
* @see /std/shadows/npc/gossip.c
* @param data the gossip data to add
*/
void add_gossip( class gossip_data data ) {
if( !data->who || !data->what || !query_accept_gossip() )
return;
gossip += ({ data });
next = time() + GOSSIP_FREQUENCY;
save_me();
} /* add_gossip() */
/**
* This method removes all gossips with the specified
* gossip string from the gossip array.
* @param match the string to remove
*/
void remove_gossip( string match ) {
if( !match || match == "")
return;
gossip = filter( gossip, (: $1->what != $2 :), match );
save_me();
} /* remove_gossip() */
/**
* Rumours are another method of dealing out gossip.
* Rumours are added by creators...
* @param name the name of the person saying the rumour
* @param mess the rumour message
*/
void add_rumour( string name, string mess ) {
rumours += ({ new( class gossip_data, who : name, what : mess ) });
save_me();
} /* add_rumour() */
/**
* This method removes all rumours with the specified
* rumour string from the rumour array.
* @param match the string to remove
*/
void remove_rumour( string match ) {
if( !match || match == "")
return;
rumours = filter( rumours, (: $1->what != $2 :), match );
save_me();
} /* remove_rumour() */
/**
* This method returns a random piece of gossip.
* This is a class of two elements - the person
* who said the gossip and what they said.
* @return a class of gossip data
*/
class gossip_data query_random_gossip() {
int i;
if( ( i = sizeof(rumours) ) && random(2) )
return rumours[random(i)];
else if( i = sizeof(gossip) )
return gossip[random(i)];
else
return 0;
} /* query_random_gossip() */
/**
* This method returns the complete gossip array
* which NPCs are drawing from.
* @return an array of gossip classes
* @see query_random_gossip()
*/
class gossip_data *query_gossip() { return gossip; }
/**
* This method returns all of the current rumours.
* @return an array of rumour classes
* @see query_random_gossip()
*/
class gossip_data *query_rumours() { return rumours; }
/** @ignore yes */
mixed stats() {
return ({
({"gossip", sizeof(gossip) }),
({"rumours", sizeof(rumours) }),
({"next", next }),
({"accepting gossip", query_accept_gossip() }),
});
} /* stats() */