/**
* This class contains all the stuff needed to control families in a
* player.
* @author Pinkfish
* @started Fri Oct 30 07:53:30 PST 1998
*/
#include <clubs.h>
/**
* The class for family information in the family stuff for the player.
* This is used internaly to the player object and should not be used
* elsewhere.
* @member name the family name
* @member adjectives the adjectives
* @member id the id
* @member titles the allowed played titles
* @member cur_title the current player title
*/
class family_information {
string name;
string *adjectives;
string id;
string *titles;
string cur_title;
string *clubs;
}
// The name of the variable is this because we need to
// preserve save file integrity.
private class family_information _family_name;
string query_name();
/**
* This method creates the family information class and fills in all the
* defaults.
*/
private class family_information create_family_info() {
class family_information bing;
bing = new(class family_information);
bing->adjectives = ({ });
bing->titles = ({ "mr", "miss", "mrs", "ms" });
bing->clubs = ({ });
return bing;
} /* create_family_info() */
/**
* Update the adjectives.
*/
private void update_adjectives() {
if( !_family_name )
return;
_family_name->adjectives = ({ });
_family_name->id = 0;
if( _family_name->name ) {
_family_name->adjectives = explode( lower_case(_family_name->name), " ")[0..<2];
_family_name->id = explode( lower_case(_family_name->name), " ")[<1];
}
if( _family_name->cur_title )
_family_name->adjectives += explode( _family_name->cur_title, " ");
} /* update_adjectives() */
/**
* This method adds the players title into the list of allowed titles.
* @param title the title to add into the list
* @see set_player_title()
* @see remove_player_title()
* @return 1 if the title was added successfuly, 0 if it exists
* @example
* player->add_player_title("lord");
*/
int add_player_title(string title) {
title = lower_case(title);
if( !_family_name )
_family_name = create_family_info();
if( member_array( title, _family_name->titles ) == -1 ) {
_family_name->titles += ({ title });
return 1;
}
return 0;
} /* add_player_title() */
/**
* This method removes the players title from the list of allowed titles.
* @param title the title to remove from the list
* @see set_player_title()
* @see add_player_title()
*/
void remove_player_title(string title) {
title = lower_case(title);
if( !_family_name )
_family_name = create_family_info();
if( member_array( title, _family_name->titles ) != -1 )
_family_name->titles -= ({ title });
} /* remove_player_title() */
/**
* This method sets the current family name of the player.
* @param name the new family name
* @see query_family_name()
* @return 1 if successfully set
*/
int set_family_name( string name ) {
// Not a family, or not a member.
if( name && ( !CLUB_HANDLER->is_family(name) ||
!CLUB_HANDLER->is_member_of( name, query_name() ) ) )
return 0;
if( !classp(_family_name) )
_family_name = create_family_info();
if( _family_name->name )
CLUB_HANDLER->remove_member( _family_name->name, query_name() );
if( name )
_family_name->name = CLUB_HANDLER->query_club_name(name);
else
_family_name = 0;
update_adjectives();
return 1;
} /* set_family_name() */
/**
* This method checks to make sure the players current family name
* is still valid. This will be called on startup and at various
* other times.
* @see set_family_name()
*/
void check_family_name() {
class family_information frog;
string bing;
if( !classp(_family_name) && _family_name ) {
bing = (string)_family_name;
_family_name = create_family_info();
set_family_name(bing);
}
if( classp(_family_name) && sizeof(_family_name) == 5 ) {
frog = new(class family_information);
frog->adjectives = _family_name->adjectives;
frog->id = _family_name->id;
frog->cur_title = _family_name->cur_title;
frog->name = _family_name->name;
frog->titles = _family_name->titles;
frog->clubs = ({ });
_family_name = frog;
}
if( _family_name && _family_name->name ) {
if( !CLUB_HANDLER->is_family(_family_name->name) ||
!CLUB_HANDLER->is_member_of(_family_name->name, query_name() ) ) {
_family_name->name = 0;
}
}
if( _family_name && strlen(_family_name->cur_title) > 20 ) {
tell_object( TO, "%^YELLOW%^Your title is too long! "
"Resetting.\n%^RESET%^");
_family_name->cur_title = 0;
}
update_adjectives();
remove_player_title("mad");
} /* check_family_name() */
/**
* This method queries the current family name of the player.
* @return the name of the family, 0 if none set
* @see set_family_name()
*/
string query_family_name() {
if( stringp(_family_name) )
return (string)_family_name;
if( _family_name )
return _family_name->name;
return 0;
} /* query_family_name() */
/**
* This method returns the current title of the player.
* @return the current title of the player, 0 if none set
* @see query_family_name()
*/
string query_player_title() {
if( _family_name && _family_name->cur_title )
return CAP(_family_name->cur_title);
return 0;
} /* query_player_title() */
/**
* This method returns all the player titles as a nice list.
* @return all the player titles
*/
string *query_all_player_titles() {
if( !_family_name )
_family_name = create_family_info();
return _family_name->titles;
} /* query_all_player_titles() */
/**
* This method sets the current title of the player.
* @param title the new title to set
* @return 1 if successful, 0 on failure
* @see query_player_title()
*/
int set_player_title( string title ) {
string* bits;
if( !_family_name )
_family_name = create_family_info();
if( strlen(title) > 20 )
return 0;
// Allow them to setup combination titles.
bits = ( title ? explode( title, " ") : ({ }) );
if( sizeof( filter( bits, (: member_array(
$1, _family_name->titles ) != -1 :) ) ) == sizeof(bits) &&
sizeof(bits) <= 1 ) {
_family_name->cur_title = ( title ? implode( map( bits,
(: CAP($1) :) ), " ") : 0 );
update_adjectives();
return 1;
}
return 0;
} /* set_player_title() */
/**
* This method adds a club to current list of known clubs on the
* family.
* @param club the club to add
*/
int add_player_club(string club) {
class family_information frog;
if( !club )
return 0;
club = CLUB_HANDLER->normalise_name(club);
if( !CLUB_HANDLER->is_club(club) )
return 0;
if( !_family_name )
_family_name = create_family_info();
if( classp(_family_name) && sizeof(_family_name) == 5 ) {
frog = new(class family_information);
frog->adjectives = _family_name->adjectives;
frog->id = _family_name->id;
frog->cur_title = _family_name->cur_title;
frog->name = _family_name->name;
frog->titles = _family_name->titles;
frog->clubs = ({ });
_family_name = frog;
}
if( member_array( club, _family_name->clubs ) == -1 ) {
_family_name->clubs += ({ club });
return 1;
}
return 0;
} /* add_player_club() */
/**
* This method removes a club from the list of know clubs.
* @param club the club to remove
*/
void remove_player_club(string club) {
if( !club )
return;
if( !_family_name )
return;
club = CLUB_HANDLER->normalise_name(club);
_family_name->clubs -= ({ club });
} /* remove_player_club() */
/**
* This method returns the current know clubs the player is a meber of
* @return the array of known clubs
*/
string *query_player_clubs() {
if( !_family_name )
return ({ });
return _family_name->clubs;
} /* query_player_clubs() */
/**
* @ignore yes
* Adjectives which are added because of the family.
*/
string *parse_command_id_list() {
if( _family_name && _family_name->id )
return ({ _family_name->id });
return ({ });
} /* parse_command_id_list() */
/**
* @ignore yes
* Adjectives which are added because of the family.
*/
string *parse_command_plural_id_list() {
if( _family_name && _family_name->id )
return ({ pluralize(_family_name->id) });
return ({ });
} /* parse_command_id_list() */
/**
* @ignore yes
* Adjectives which are added because of the family.
*/
string *parse_command_adjectiv_id_list() {
if( _family_name )
return _family_name->adjectives;
return ({ });
} /* parse_command_id_list() */