/**
* 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>
#include <player.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.
* @element name the family name
* @element adjectives the adjectives
* @element id the id
* @element titles the allowed played titles
* @element cur_title the current player title
*/
class family_information {
string name;
string* adjectives;
string id;
string* titles;
string cur_title;
string* clubs;
string force_title;
int force_timeout;
}
#define FAMILY_CLASS_SIZE 8
//
// The name of the variable is this because we need to preserve save file
// integrity.
//
private class family_information _family_name;
string query_name();
int set_family_name(string name);
int add_player_title(string title);
void remove_player_title(string title);
/**
* 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() */
/**
* This is used by the refresh code.
*/
protected void setup_default_titles() {
if (!_family_name) {
return;
}
_family_name->titles = ({ "mr", "miss", "mrs", "ms" });
}
/**
* Update the adjectives.
*/
private void update_adjectives() {
if (!_family_name) {
return ;
}
_family_name->adjectives = ({ });
_family_name->id = 0;
if (_family_name &&
_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 &&
_family_name->cur_title) {
_family_name->adjectives += explode(_family_name->cur_title, " ");
}
} /* update_adjectives() */
/**
* 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 (classp(_family_name) &&
sizeof(_family_name) == 6) {
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->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(this_object(),
"%^YELLOW%^Your title is too long! Resetting.\n%^RESET%^");
_family_name->cur_title = 0;
}
if (_family_name &&
_family_name->cur_title) {
if (member_array(lower_case(_family_name->cur_title),
_family_name->titles) == -1) {
tell_object(this_object(),
"%^YELLOW%^Your title is invalid! Resetting.\n%^RESET%^");
_family_name->cur_title = 0;
}
}
update_adjectives();
// Make it check to make sure ther clubs still exist
if (_family_name && _family_name->clubs) {
_family_name->clubs = filter(_family_name->clubs,
(: CLUB_HANDLER->is_club($1) :));
}
} /* check_family_name() */
/**
* This method sets the current family name of the player.
* @param name the new family name
* @see query_family_name()
* @return 1 if successfuly 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 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() {
check_family_name();
if (_family_name && classp(_family_name) &&
_family_name->force_title) {
if (-this_object()->query_time_on() > _family_name->force_timeout) {
_family_name->force_title = 0;
} else {
return capitalize(_family_name->force_title);
}
}
if (_family_name && classp(_family_name) &&
_family_name->cur_title) {
return capitalize(_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;
}
//
// Check and see if the title is valid.
//
if (!title ||
member_array(lower_case(title), _family_name->titles) != -1) {
if (title) {
bits = explode(title, " ");
_family_name->cur_title = implode(map(bits, (: capitalize($1) :)), " ");
} else {
_family_name->cur_title = 0;
}
update_adjectives();
return 1;
}
return 0;
} /* set_player_title() */
/**
* This method sets the forced title for the player.
* @param force_title the new title
* @param timeout the length of time for it to timeout
* @return 1 on success, 0 on failure
*/
int set_forced_title(string title, int timeout) {
_family_name->force_title = title;
_family_name->force_timeout = -this_object()->query_time_on() + timeout;
tell_object(this_object(), "%^CYAN%^You feel that other peoples perception "
"of you has changed and you title is being "
"misinterpreted.%^RESET%^\n");
return 1;
}
/**
* This method returns the title that has been forced upon you.
* @return the forced title
*/
string query_forced_title() {
return _family_name->force_title;
}
/**
* 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 });
}
if (_family_name->cur_title == title) {
_family_name->cur_title = 0;
}
} /* remove_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 0;
}
club = CLUB_HANDLER->normalise_name(club);
if (!_family_name) {
return ;
}
_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() */