/**
* This room allows people to create clubs and do fluffy club stuff if
* they need to.
* @author Pinkfish
* @started Sun Oct 4 02:24:46 EDT 1998
*/
#include <clubs.h>
#include <money.h>
#include <move_failures.h>
inherit ROOM_OBJ;
inherit "/std/basic/club_listing";
inherit "/std/room/inherit/club_discuss";
private int _percentage_cut;
private int _room_type;
protected int do_create(string name);
protected int do_create_family(string name);
protected int do_replace(string name);
protected int do_vote(string name, string position, string club);
protected int do_nominate(string name, string position, string club);
protected int do_balance(string name);
protected int do_deposit(string mon, string name, string account, string reason);
protected int do_change(string name, string type);
protected int do_change_option(string name, string type);
protected int do_disband(string name);
protected int do_insignia(string number, int num);
protected int do_recruiter_add(string name, string recruit);
protected int do_recruiter_remove(string name, string recruit);
protected int do_financials(string name, string account);
protected int do_describe(string name);
protected int do_club_list_member(string name);
protected int do_withdrawl(string money, string club, string account, string reason);
protected int do_transfer(string money, string club, string from_account,
string to_account, string reason);
protected int do_force_election(string name);
protected void finish_description(string describe, string name);
protected int do_announcement(string name);
private int check_member_func(string club, string person, string mem);
void create() {
_percentage_cut = 5;
_room_type = CLUB_ROOM_CLUB_OR_FAMILY;
::create();
} /* create() */
private int club_commands_allowed() {
return _room_type != CLUB_ROOM_FAMILY_ONLY;
} /* club_commands_allowed() */
private int family_commands_allowed() {
return _room_type != CLUB_ROOM_CLUB_ONLY;
} /* club_commands_allowed() */
/** @ignore yes */
void init() {
string bit;
basic_room::init();
if (club_commands_allowed()) {
add_help_file("club_control_room");
bit = "club name";
add_command("create", "club called <string'club name'>",
(: do_create($4[0]) :));
add_command("list", "clubs",
(: club_list(TP->query_name(), 0, 0) :) );
add_command("list", "clubs [with member] <string'member name'>",
(: do_club_list_member($4[0]) :));
add_command("list", "club <string'club name'>",
(: club_info($4[0], 1, TP->query_name()) :) );
add_command("vote",
"<word'person'> for <string:small'position'> in <string'club name'>",
(: do_vote($4[0], $4[1], $4[2]) :));
add_command("nominate",
"<word'person'> for <string:small'position'> in <string'club name'>",
(: do_nominate($4[0], $4[1], $4[2]) :));
add_command("disband", "<string'club name'>", (: do_disband($4[0]) :));
add_command("change", "<string'club name'> to {elected}",
(: do_change($4[0], "elected") :) );
add_command("change", "<string'club name'> option {secret|open}",
(: do_change_option($4[0], $4[1]) :) );
add_command("replace", "<number> insignia for <string'club name'>",
(: do_insignia($4[1], $4[0]) :));
add_command("replace", "insignia for <string'club name'>",
(: do_insignia($4[0], 1) :));
add_command("recruiter", "add <string'member'> for <string'club'>",
(: do_recruiter_add($4[1], $4[0]) :));
add_command("recruiter", "remove <string'member'> for <string'club'>",
(: do_recruiter_remove($4[1], $4[0]) :));
add_command("financials", "<string'club'>",
(: do_financials($4[0], CLUB_DEFAULT_ACCOUNT_NAME) :));
add_command("financials", "<string'club'> account <string'account name'>",
(: do_financials($4[0], $4[1]) :));
add_command("description", "of club <string'club name'>",
(: do_describe($4[0]) :));
add_command("announce", "for club <string'club name'>",
(: do_announcement($4[0]) :));
add_command("withdraw", "<string'money'> from <string'club name'> for <string:small'reason'>",
(: do_withdrawl($4[0], $4[1], CLUB_DEFAULT_ACCOUNT_NAME, $4[2]) :));
add_command("withdraw", "<string'money'> from <string'club name'> account <string'account name'> for <string:small'reason'>",
(: do_withdrawl($4[0], $4[1], $4[2], $4[3]) :));
add_command("transfer", "<string'money'> from <string'club name'> account <string'source account'> to <string'desination account'> for <string:small'reason'>",
(: do_transfer($4[0], $4[1], $4[2], $4[3], $4[4]) :));
add_command("election", "force in <string'club'>",
(: do_force_election($4[0]) :));
add_command("balance", "[of] <string'" + bit +"'>",
(: do_balance($4[0]) :));
add_command("deposit", "<string:small'money'> to <string'" + bit + "'>",
(: do_deposit($4[0], $4[1], CLUB_DEFAULT_ACCOUNT_NAME, 0) :));
add_command("deposit", "<string:small'money'> to <string'" + bit + "'> for <string:small'reason'>",
(: do_deposit($4[0], $4[1], CLUB_DEFAULT_ACCOUNT_NAME, $4[2]) :));
add_command("deposit", "<string:small'money'> to <string'" + bit + "'> account <string'account name'>",
(: do_deposit($4[0], $4[1], $4[2], 0) :));
add_command("deposit", "<string:small'money'> to <string'" + bit + "'> account <string'account name'> for <string:small'reason'>",
(: do_deposit($4[0], $4[1], $4[2], $4[3]) :));
club_discuss::init();
}
if (family_commands_allowed()) {
add_help_file("family_control_room");
if (bit) {
bit += "|family name";
} else {
bit = "family name";
}
add_command("create", "family called <string'family name'>",
(: do_create_family($4[0]) :));
add_command("list", "families",
(: club_list(TP->query_name(), 1, 0) :) );
add_command("list", "family <string'family name'>",
(: family_info($4[0], TP->query_name()) :) );
}
add_command("description", "of <string'" + bit + "'>",
(: do_describe($4[0]) :));
} /* init() */
int is_valid_club_name(string name) {
int i;
if (strlen(name) > CLUB_MAX_NAME_LEN) {
return 0;
}
for (i = 0; i < strlen(name); i++) {
if (!((name[i] >= 'a' && name[i] <= 'z') ||
(name[i] >= 'A' && name[i] <= 'Z') ||
name[i] == '\'' ||
name[i] == ' ' ||
name[i] == '_')) {
return 0;
}
}
return 1;
} /* is_valid_club_name() */
/**
* This method sets the type of the room. This controls if the room is to
* be used for clubs, families or both.
* @param type the type of the club
* @see query_club_control_type()
* @example
* // Make the room only handle clubs.
* set_club_control_type(CLUB_ROOM_CLUB_ONLY);
*/
void set_club_control_type(int room_type) {
_room_type = room_type;
} /* set_club_control_type() */
/**
* This method queries the type of the room. This controls if the room is to
* be used for clubs, families or both.
* @return the control type of the room
* @see set_club_control_type()
*/
int query_club_control_type() {
return _room_type;
} /* set_club_control_type() */
/**
* This method is called to try and create a club of the specified name.
* All clubs when they first start are personal clubs. Once they have
* a certain number of members, they can convert to being an elected
* type of club if they wish.
* @param name the name of the club to create
* @return 1 on success, 0 on failure
*/
protected int do_create(string name) {
string place;
/* First check to see if the club already exists. */
if (CLUB_HANDLER->is_club(name)) {
add_failed_mess("Cannot create '" + name + "' as the name already "
"exists.\n");
return 0;
}
if (!is_valid_club_name(name)) {
add_failed_mess("The club name '" + name + "' has invalid characters in "
"it.\n");
return 0;
}
place = query_property("place");
if (!place) {
place = "default";
}
/* Check to make sure they have enough money. */
if (TP->query_value_in(place) < CLUB_STARTUP_COST) {
add_failed_mess("You need " +
MONEY_H->money_value_string(CLUB_STARTUP_COST, place) +
" to start a club.\n");
return 0;
}
write("It will cost you " +
MONEY_H->money_value_string(CLUB_STARTUP_COST, place) +
" to create a club. Do you wish to continue? ");
input_to("confirm_create", 0, name);
return 1;
} /* do_create() */
/**
* This method will confirm the creation of a club.
* @param str the yes or no string
* @param name the name of the club to create
*/
protected void confirm_create(string str, string name) {
object badge;
string place;
place = query_property("place");
if (!place) {
place = "default";
}
str = lower_case(str);
if (strlen(str) < 1 ||
(str[0] != 'n' && str[0] != 'y' && str[0] != 'q')) {
write("Please answer yes or no.\nDo you wish to continue creating "
"the club " + name + " for " +
MONEY_H->money_value_string(CLUB_STARTUP_COST, place) +
"? ");
input_to("confirm_create", 0, name);
return ;
}
if (str[0] == 'n' || str[0] == 'q') {
write("Aborted.\n");
return ;
}
/* Ok, confirmed... */
if (TP->query_value_in(place) < CLUB_STARTUP_COST) {
write("Your money appears to have evaporated. You need " +
MONEY_H->money_value_string(CLUB_STARTUP_COST, place) +
" to start a club.\nAborting club creation.\n");
return 0;
}
/* Create the club. */
if (CLUB_HANDLER->create_club(name,
TP->query_name(),
CLUB_PERSONAL)) {
/* Make them pay! */
TP->pay_money(MONEY_H->create_money_array(CLUB_STARTUP_COST,
place), place);
write("Created the club called '" + name + "'.\n");
/* Give them a badge... */
badge = clone_object(CLUB_BADGE);
badge->set_club(name);
if (badge->move(TP) == MOVE_OK) {
if (!TP->wear_armour(badge)) {
write("You notice a badge turn up and wear itself, this is your "
"membership badge.\n");
} else {
write("You notice a badge turn up and attempt to wear itself, "
"this is your membership badge.\n");
}
} else {
badge->move(environment(TP));
badge->set_worn_by(TP);
write("You notice a badge turn up and wear itself, this is your "
"membership badge.\n");
}
event(users(), "inform", TP->query_cap_name() +
" created the club " + name, "club");
}
} /* confirm_create() */
/**
* This method is called to check the validity of a family name.
* @param name the name of the family.
* @return 1 if valid, 0 if invalid.
*/
int is_valid_family_name(string name) {
string frog, *bits, bit, s1, s2, lname;
lname = lower_case(name);
if( rank(lname) ) {
add_failed_mess("Cannot use the family name '" + name + "' since "
"a player is already using it.\n");
return 0;
}
bits = explode(replace(lname, ({"'", " ", "_", " "})), " ");
foreach(bit in bits) {
if(bit == "the" || bit == "von" || bit == "sto")
continue;
if( PLAYER_H->test_banished(bit)) {
if (creatorp(TP)) {
add_failed_mess("Name banished [" + bit + "].\n");
}
add_failed_mess("Cannot use the family name '" + name + "' since the "
"name has been banished.\n");
return 0;
}
}
/* Check to see if the name without spaces and stuff is banished too. */
frog = replace(name, ({ " ", "", "'", "", "_", "" }));
if( PLAYER_H->test_banished(lower_case(frog))) {
if (creatorp(TP)) {
add_failed_mess("Name banished.\n");
}
add_failed_mess("Cannot use the family name '" + name + "' since the "
"name has been banished.\n");
return 0;
}
if ( ( sscanf( lname, "%sblack%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%sblood%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%scyber%s", s1, s2 ) == 2) ||
( sscanf( lname, "%sdark%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%spenis%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%scock%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%spussy%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%sfuck%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%sshit%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%sdeath%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%sdragon%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%sfish%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%shell%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%smage%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%spink%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%slord%s", s1, s2 ) == 2 ) ||
( sscanf( lname, "%sevil%s", s1, s2 ) == 2) ||
( sscanf( lname, "%sshaydz%s", s1, s2 ) == 2) ||
( sscanf( lname, "%skiller%s", s1, s2 ) == 2) ||
( sscanf( lname, "%sslayer%s", s1, s2 ) == 2) ) {
if (creatorp(TP)) {
add_failed_mess("invalid.\n");
}
add_failed_mess("The family name '" + name + "' is invalid.\n");
return 0;
}
if (!is_valid_club_name(name)) {
if (creatorp(TP)) {
add_failed_mess("invalid.\n");
}
add_failed_mess("The family name '" + name + "' has invalid characters "
"in it.\n");
return 0;
}
if (strlen(name) > MAX_FAMILY_NAME_LEN) {
if (creatorp(TP)) {
add_failed_mess("too long!\n");
}
add_failed_mess("The maximum length of a family name is " +
MAX_FAMILY_NAME_LEN + ".\n");
return 0;
}
return 1;
}
/**
* This method is called to try and create a family of the specified name.
* @param name the name of the family to create
* @return 1 on success, 0 on failure
*/
protected int do_create_family(string name) {
string place;
/* First check to see if the club already exists. */
if (CLUB_HANDLER->is_club(name)) {
if (creatorp(TP)) {
write("exist\n");
}
add_failed_mess("Cannot create '" + name + "' as the name already "
"exists.\n");
return 0;
}
if(!is_valid_family_name(name))
return 0;
place = query_property("place");
if (!place) {
place = "default";
}
/* Check to make sure they have enough money. */
if (TP->query_value_in(place) < FAMILY_STARTUP_COST) {
if (creatorp(TP)) {
write("money.\n");
}
add_failed_mess("You need " +
MONEY_H->money_value_string(FAMILY_STARTUP_COST,
place) +
" to start a family.\n");
return 0;
}
write("It will cost you " +
MONEY_H->money_value_string(FAMILY_STARTUP_COST, place) +
" to create a family. Do you wish to continue? ");
input_to("confirm_create_family", 0, name);
return 1;
} /* do_create_family() */
/**
* This method will confirm the creation of a family.
* @param str the yes or no string
* @param name the name of the family to create
*/
protected void confirm_create_family(string str, string name) {
string place;
place = query_property("place");
if (!place) {
place = "default";
}
str = lower_case(str);
if (strlen(str) < 1 ||
(str[0] != 'n' && str[0] != 'y' && str[0] != 'q')) {
write("Please answer yes or no.\nDo you wish to continue creating "
"the family " + name + " for " +
MONEY_H->money_value_string(FAMILY_STARTUP_COST, place) +
"? ");
input_to("confirm_create_family", 0, name);
return ;
}
if (str[0] == 'n' || str[0] == 'q') {
write("Aborted.\n");
return ;
}
/* Ok, confirmed... */
if (TP->query_value_in(place) < FAMILY_STARTUP_COST) {
write("Your money appears to have evaporated. You need " +
MONEY_H->money_value_string(FAMILY_STARTUP_COST, place) +
" to start a family.\nAborting family creation.\n");
return 0;
}
/* Create the family. */
if (CLUB_HANDLER->create_club(name,
TP->query_name(),
CLUB_FAMILY)) {
if (TP->query_family_name()) {
CLUB_HANDLER->move_family_member(TP->query_family_name(),
TP->query_name(),
name);
} else {
CLUB_HANDLER->add_member(name, TP->query_name());
}
/* Make them pay! */
TP->pay_money(MONEY_H->create_money_array(FAMILY_STARTUP_COST,
place), place);
write("Created the family called '" + name + "'.\n");
TP->set_family_name(name);
event(users(), "inform", TP->query_cap_name() +
" created the family " + name, "club");
}
} /* confirm_create_family() */
/**
* This method nominates a person into a position in a club.
* @param person the person to nominate
* @param position the position to nominate them too
* @param club_name the name of the club
* @return 1 on success, 0 on failure
* @see /obj/handlers/club_handler.c
* @see do_vote()
*/
protected int do_nominate(string person, string position, string club_name) {
string our_name;
our_name = TP->query_name();
if (!CLUB_HANDLER->is_member_of(club_name, our_name)) {
add_failed_mess("You can only nominate people in a club your a "
"member of.\n");
return 0;
}
if (!CLUB_HANDLER->is_member_of(club_name, person)) {
add_failed_mess("You can only nominate people in the club.\n");
return 0;
}
if (!CLUB_HANDLER->is_election_in_progress(club_name)) {
add_failed_mess("This club is not having an election right now.\n");
return 0;
}
if (CLUB_HANDLER->is_voting_in_progress(club_name)) {
add_failed_mess("This club is not accepting nominations right now, "
"it is past the nomination phase.\n");
return 0;
}
if (!CLUB_HANDLER->is_nomination_in_progress(club_name)) {
add_failed_mess("This club not in the nomination phase of "
"voting.\n");
return 0;
}
if (!CLUB_HANDLER->is_valid_position(club_name, position)) {
add_failed_mess("You must nominate them in a valid position.\n"
"Valid positions are " +
sort_and_capitalise(CLUB_HANDLER->query_valid_positions(club_name)) +
".\n");
return 0;
}
if (!CLUB_HANDLER->is_nomination_in_progress(club_name)) {
add_failed_mess("This club is not accepting nominations for positions "
"right now.\n");
return 0;
}
if (!CLUB_HANDLER->is_creator_club(club_name) &&
creatorp(person)) {
add_failed_mess("You cannot nominate a creator to a position in a "
"non-creator club.\n");
return 0;
}
if (CLUB_HANDLER->has_nominated_person(club_name,
position,
person,
our_name)) {
add_failed_mess("You have already nominated " + capitalize(person) +
" for the position " + capitalize(position) + " in '" +
CLUB_HANDLER->query_club_name(club_name) + "'.\n");
return 0;
}
/* Everything seems in order, try and nominate someone. */
if (CLUB_HANDLER->nominate_person(club_name,
position,
person,
our_name)) {
add_succeeded_mess( ({
"$N nominated " + capitalize(person) + " to " +
capitalize(position) + " in " +
CLUB_HANDLER->query_club_name(club_name) + ".\n",
"$N nominated " + capitalize(person) + " to " +
capitalize(position) + " in " +
CLUB_HANDLER->query_club_name(club_name) + ".\n" }) );
if (find_player(lower_case(person)) &&
environment(find_player(lower_case(person))) != TO) {
tell_object(find_player(lower_case(person)),
"You have a weird feeling that " +
TP->the_short() +
" just nominated you for " + capitalize(position) +
".\n");
}
return 1;
}
add_failed_mess("Unable to nominate " + person + " to " +
position + " in '" +
CLUB_HANDLER->query_club_name(club_name) + "'.\n");
return 0;
} /* do_nominate() */
/**
* This method attempts to vote for someone in a club.
* @param person the person to vote for
* @param position the position to vote for them in
* @param club_name the name of the club to vote for them in
* @return 1 on success, 0 on failure
* @see do_nominate()
* @see /obj/handlers/club_handler.c
*/
protected int do_vote(string person, string position, string club_name) {
string our_name;
string *stuff;
our_name = TP->query_name();
if (!CLUB_HANDLER->is_member_of(club_name, our_name)) {
add_failed_mess("You can only vote for people in a club your a "
"member of.\n");
return 0;
}
if (!CLUB_HANDLER->is_member_of(club_name, person)) {
add_failed_mess("You can only vote for people in the club.\n");
return 0;
}
if (!CLUB_HANDLER->is_election_in_progress(club_name)) {
add_failed_mess("This club is not having an election at the moment.\n");
return 0;
}
if (CLUB_HANDLER->is_nomination_in_progress(club_name)) {
add_failed_mess("This club is accepting nominations right now, "
"it is not ready for votes.\n");
return 0;
}
if (!CLUB_HANDLER->is_voting_in_progress(club_name)) {
add_failed_mess("This club is not accepting votes right now.\n");
return 0;
}
if (!CLUB_HANDLER->is_valid_position(club_name, position)) {
add_failed_mess("You must vote for them in a valid position.\n"
"Valid positions are " +
sort_and_capitalise(CLUB_HANDLER->query_valid_positions(club_name)) +
".\n");
return 0;
}
if (!CLUB_HANDLER->is_nominated_for(club_name, position, person)) {
stuff = CLUB_HANDLER->query_nominated_for(club_name, position);
if (sizeof(stuff)) {
add_failed_mess("You must vote for a person that has been "
"nominated for the position.\n" +
sort_and_capitalise(stuff) +
" have been nominated for " + position + " in " +
club_name + ".\n");
} else {
add_failed_mess("No one has been nominated for the position "
+ position + " in " + club_name + ".\n");
}
return 0;
}
if (CLUB_HANDLER->has_person_voted(club_name, position, our_name)) {
add_failed_mess("You can only vote for each position once.\n");
return 0;
}
/* Everything seems in order, try and nominate someone. */
if (CLUB_HANDLER->vote_for_person(club_name,
position,
person,
our_name)) {
add_succeeded_mess(({
"$N vote for $C$" + person + " to " + position + " in " +
CLUB_HANDLER->query_club_name(club_name) + ".\n",
"$N voted for " + position + " in " +
CLUB_HANDLER->query_club_name(club_name) + ".\n" }));
return 1;
}
add_failed_mess("Unable vote for " + person + " to " +
position + " in " + club_name +
CLUB_HANDLER->query_club_name(club_name) + ".\n");
return 0;
} /* do_vote() */
/**
* This method prints the balance of this club.
* @param name the name of the club to get the balance of
* @return 1 on success, 0 on failure
* @see do_deposit()
*/
protected int do_balance(string name) {
string place;
int amount;
string bit;
string *accounts;
string account;
string account_name;
string ret;
if (club_commands_allowed()) {
bit = "club";
}
if (family_commands_allowed()) {
if (bit) {
bit += " or family";
} else {
bit = "family";
}
}
if (!CLUB_HANDLER->is_club(name)) {
add_failed_mess("You must get a balance of an existing " + bit + ".\n");
return 0;
}
if (CLUB_HANDLER->is_family(name)) {
bit = "family";
} else {
bit = "club";
}
if (!CLUB_HANDLER->is_member_of(name, TP->query_name())) {
add_failed_mess("You must be a member of the " + bit +
" to get the balance.\n");
return 0;
}
place = query_property("place");
if (!place) {
place = "default";
}
accounts = CLUB_HANDLER->query_account_names(name);
ret = "";
foreach (account in accounts) {
if (account == CLUB_DEFAULT_ACCOUNT_NAME) {
account_name = "main " + bit + " account";
} else {
account_name = "special " + bit + " account " + account;
}
amount = CLUB_HANDLER->query_balance(name, account);
if (amount < 0) {
ret += "The balance of the " + account_name + " in '" +
CLUB_HANDLER->query_club_name(name) +
"' is in remission by " +
MONEY_H->money_value_string(-amount, place) + ".\n";
} else {
ret += "The balance of the " + account_name + " in '" +
CLUB_HANDLER->query_club_name(name) + "' is " +
MONEY_H->money_value_string(amount, place) + ".\n";
}
}
ret += "The next pay period ends at " +
ctime(CLUB_HANDLER->query_time_fees_due(name)) +
", which will cost " +
MONEY_H->money_value_string(CLUB_HANDLER->query_club_cost_per_period(name), place) + " from the main " + bit + " account.\n",
add_succeeded_mess(({ ret,
"$N checks the balance of '" +
CLUB_HANDLER->query_club_name(name) + "'.\n" }));
return 1;
} /* do_balance() */
/**
* This method allows to you deposit money into the club.
* @param obs the money objects to deposit
* @param name the name of the club to deposit them to
* @param reason the reason of the deposit
* @return 1 on success, 0 on failure
* @see do_balance()
* @see query_percentage_cut()
* @see set_percentage_cut()
*/
protected int do_deposit(string mon, string name, string account, string reason) {
int amt;
int after;
string place;
mixed money;
string bit;
string account_name;
if (club_commands_allowed()) {
bit = "club";
}
if (family_commands_allowed()) {
if (bit) {
bit += " or family";
} else {
bit = "family";
}
}
if (!CLUB_HANDLER->is_club(name)) {
add_failed_mess("You must deposit into an existing " + bit + ".\n");
return 0;
}
if (!CLUB_HANDLER->is_member_of(name, TP->query_name())) {
add_failed_mess("You must be a member of the " + bit +
" to get the balance.\n");
return 0;
}
if (!CLUB_HANDLER->is_creator_club(name) &&
creatorp(TP)) {
add_failed_mess("Creators can only deposit to creator " + bit + "s.\n");
return 0;
}
if (account == CLUB_DEFAULT_ACCOUNT_NAME) {
account_name = "main " + bit + " account";
} else {
account_name = "special " + bit + " account " + account;
}
if (!CLUB_HANDLER->is_account_of(name, account)) {
add_failed_mess("The account " + account_name + " is not in the " +
bit + " '" + CLUB_HANDLER->query_club_name(name) + "'\n");
return 0;
}
if (strlen(reason) > 60) {
add_failed_mess("The reason must be less than 60 characters.\n");
return 0;
}
place = query_property("place");
if (!place) {
place = "default";
}
money = MONEY_H->parse_money(mon, TP, place);
if (intp(money)) {
switch (money) {
case NO_MATCH :
add_failed_mess("You do not have '" + mon + "'.\n");
return 0;
case NO_MONEY :
add_failed_mess("You can only deposit money.\n");
return 0;
default :
add_failed_mess("You can only deposit legal tender.\n");
return 0;
}
}
amt = money->query_value_in(place);
if (place != "default") {
amt += money->query_value_in("default");
}
after = amt - ((amt * _percentage_cut) / 100);
CLUB_HANDLER->add_money(name,
after,
CLUB_TRANSACTION_DEPOSIT,
TP->query_name(),
account,
reason);
money->move("/room/rubbish");
add_succeeded_mess(({ "$N deposit " +
MONEY_H->money_value_string(amt, place) +
", which after expenses is " +
MONEY_H->money_value_string(after, place) +
" to the " +
(CLUB_HANDLER->is_family(name) ? "family" : "club") +
" '" +
CLUB_HANDLER->query_club_name(name) +
"'.\n",
"$N deposits some money to the " +
(CLUB_HANDLER->is_family(name) ? "family" : "club") +
" '" +
CLUB_HANDLER->query_club_name(name) +
"'.\n" }));
return 1;
} /* do_deposit() */
/**
* This method is used when someone wishes to withdraw some money from the
* club account.
* @param money the amount of money to withdraw
* @param club the club to withdraw the money from
* @param account the account to withdraw money from
* @param reason the reason to withdraw money from the account
* @return 1 if suecceded, 0 if failed.
*/
protected int do_withdrawl(string money,
string name,
string account,
string reason) {
string place;
int value;
string bit;
object obj;
string account_name;
string* stuff;
string ret;
if (club_commands_allowed()) {
bit = "club";
}
if (!CLUB_HANDLER->is_club(name)) {
add_failed_mess("You must withdraw from an existing " + bit + ".\n");
return 0;
}
if (!CLUB_HANDLER->is_member_of(name, TP->query_name())) {
add_failed_mess("You must be a member of the " + bit +
" to withdraw money from the club.\n");
return 0;
}
if (account == CLUB_DEFAULT_ACCOUNT_NAME) {
account_name = "main " + bit + " account";
} else {
account_name = "special " + bit + " account " + account;
}
if (!CLUB_HANDLER->is_account_of(name, account)) {
add_failed_mess("The account " + account_name + " is not in the " +
bit + " '" + CLUB_HANDLER->query_club_name(name) + "'\n");
return 0;
}
if (strlen(reason) > 60) {
add_failed_mess("The reason must be less than 60 characters.\n");
return 0;
}
if (!CLUB_HANDLER->is_allowed_to_modify_account(name,
account,
TP->query_name())) {
stuff = CLUB_HANDLER->query_account_allowed_positions(name, account);
ret = "Only the positions " + query_multiple_short(stuff);
stuff = CLUB_HANDLER->query_account_allowed_people(name, account);
if (sizeof(stuff)) {
ret += " and the people " + query_multiple_short(stuff);
}
add_failed_mess(ret + " can withdraw from this account.\n");
return 0;
}
place = query_property("place");
if (!place) {
place = "default";
}
value = MONEY_H->value_from_string(money, place);
if (value > CLUB_HANDLER->query_balance(name, account)) {
add_failed_mess("The " + account_name +
" does not have that much money!\n");
return 0;
}
obj = MONEY_H->make_new_amount(value, place);
if (!obj) {
add_failed_mess("Unable to create the money object.\n");
return 0;
}
if (CLUB_HANDLER->remove_money(name,
value,
CLUB_TRANSACTION_WITHDRAWL,
TP->query_name(),
account,
reason)) {
obj->move(TP);
add_succeeded_mess(({ "$N withdraw " +
MONEY_H->money_value_string(value, place) +
" from the " +
(CLUB_HANDLER->is_family(name) ? "family" : "club") +
" '" +
CLUB_HANDLER->query_club_name(name) +
"'.\n",
"$N withdraws some money from the " +
(CLUB_HANDLER->is_family(name) ? "family" : "club") +
" '" +
CLUB_HANDLER->query_club_name(name) +
"'.\n" }));
return 1;
} else {
obj->dest_me();
add_failed_mess("Unable to remove the money from the account.\n");
return 0;
}
} /* do_withdrawl() */
/**
* This method is used when someone wishes to withdraw some money from the
* club account.
* @param money the amount of money to withdraw
* @param club the club to withdraw the money from
* @param from_account the account to withdraw money from
* @param to_account the account to deposit the money to
* @param reason the reason to withdraw money from the account
* @return 1 if suecceded, 0 if failed.
*/
protected int do_transfer(string money,
string name,
string from_account,
string to_account,
string reason) {
string place;
int value;
string bit;
object obj;
string from_account_name;
string to_account_name;
string* stuff;
string ret;
if (club_commands_allowed()) {
bit = "club";
}
if (!CLUB_HANDLER->is_club(name)) {
add_failed_mess("You must transfer money in an existing " + bit + ".\n");
return 0;
}
if (!CLUB_HANDLER->is_member_of(name, TP->query_name())) {
add_failed_mess("You must be a member of the " + bit +
" to transfer money.\n");
return 0;
}
if (from_account == CLUB_DEFAULT_ACCOUNT_NAME) {
from_account_name = "main " + bit + " account";
} else {
from_account_name = "special " + bit + " account " + from_account;
}
if (to_account == CLUB_DEFAULT_ACCOUNT_NAME) {
to_account_name = "main " + bit + " account";
} else {
to_account_name = "special " + bit + " account " + to_account;
}
if (!CLUB_HANDLER->is_account_of(name, from_account)) {
add_failed_mess("The account " + from_account_name + " is not in the " +
bit + " '" + CLUB_HANDLER->query_club_name(name) + "'\n");
return 0;
}
if (!CLUB_HANDLER->is_account_of(name, to_account)) {
add_failed_mess("The account " + to_account_name + " is not in the " +
bit + " '" + CLUB_HANDLER->query_club_name(name) + "'\n");
return 0;
}
if (strlen(reason) > 60) {
add_failed_mess("The reason must be less than 60 characters.\n");
return 0;
}
if (!CLUB_HANDLER->is_allowed_to_modify_account(name,
from_account,
TP->query_name())) {
stuff = CLUB_HANDLER->query_account_allowed_positions(name, from_account);
ret = "Only the positions " + query_multiple_short(stuff);
stuff = CLUB_HANDLER->query_account_allowed_people(name, from_account);
if (sizeof(stuff)) {
ret += " and the people " + query_multiple_short(stuff);
}
add_failed_mess(ret + " can withdraw from this account.\n");
return 0;
}
place = query_property("place");
if (!place) {
place = "default";
}
value = MONEY_H->value_from_string(money, place);
if (value > CLUB_HANDLER->query_balance(name, from_account)) {
add_failed_mess("The " + from_account_name +
" does not have that much money!\n");
return 0;
}
if (CLUB_HANDLER->remove_money(name,
value,
CLUB_TRANSACTION_TRANSFER,
TP->query_name(),
from_account,
"to " + to_account_name + ": " + reason)) {
CLUB_HANDLER->add_money(name,
value,
CLUB_TRANSACTION_TRANSFER,
TP->query_name(),
to_account,
"from " + from_account_name + ": " + reason);
add_succeeded_mess(({ "$N transfer " +
MONEY_H->money_value_string(value, place) +
" between the " +
(CLUB_HANDLER->is_family(name) ? "family" : "club") +
" '" +
CLUB_HANDLER->query_club_name(name) +
"' accounts " + from_account_name + " and " +
to_account_name + ".\n",
"$N transfers some money between accounts in the " +
(CLUB_HANDLER->is_family(name) ? "family" : "club") +
" '" +
CLUB_HANDLER->query_club_name(name) +
"'.\n" }));
return 1;
} else {
obj->dest_me();
add_failed_mess("Unable to remove the money from the account.\n");
return 0;
}
} /* do_withdrawl() */
private void do_change_inform(string club_name) {
object *people;
object person;
people = map(CLUB_HANDLER->query_members(club_name), (: find_player :));
people -= ({ 0 });
foreach (person in people) {
all_inventory(person)->event_club_change(TP, club_name);
}
} /* do_change_inform() */
/**
* This allows the club to change into a new type.
* @param name the name of the club to change
* @param type the type to change the club into
* @see do_create()
* @see do_disband()
*/
protected int do_change(string name, string type) {
int ret;
if (!CLUB_HANDLER->is_club(name)) {
add_failed_mess("You must change a club that exists.\n");
return 0;
}
if (!CLUB_HANDLER->is_personal_club(name)) {
add_failed_mess("The club must be a founder type before you can change "
"it to another type.\n");
return 0;
}
switch (type) {
case "elected" :
if (CLUB_HANDLER->is_founder_of(name, TP->query_name())) {
if (sizeof(CLUB_HANDLER->query_members(name)) <
CLUB_MINIMUM_ELECTED_MEMBERS) {
add_failed_mess("You must have at least " +
query_num(CLUB_MINIMUM_ELECTED_MEMBERS) +
" to change to an elected club.\n");
} else if (CLUB_HANDLER->change_club_type(name, CLUB_ELECTED)) {
ret = 1;
add_succeeded_mess("$N change$s the type of '" +
CLUB_HANDLER->query_club_name(name) +
"' to elected.\n");
// Inform all the people who were in the club's badges...
call_out((: do_change_inform :), 0, name);
} else {
add_failed_mess("You are unable to change the club type.\n");
}
} else {
add_failed_mess("You must be the founder to change the "
"club type.\n");
}
break;
}
return ret;
} /* do_change() */
/**
* This allows the club to change its options.
* @param name the name of the club to change
* @param option the option to change on the club
* @see do_create()
* @see do_disband()
* @see do_change()
*/
protected int do_change_option(string name, string option) {
int ret;
if (!CLUB_HANDLER->is_club(name)) {
add_failed_mess("You must change a club that exists.\n");
return 0;
}
if (CLUB_HANDLER->is_elected_club(name)) {
add_failed_mess("You must change options through discussion items.\n");
return 0;
}
if (CLUB_HANDLER->is_personal_club(name) &&
!CLUB_HANDLER->is_founder_of(name, TP->query_name())) {
add_failed_mess("You must be the founder of the club to change the "
"options of the club.\n");
return 0;
}
if (!CLUB_HANDLER->is_personal_club(name)) {
add_failed_mess("The club must be a personal club before the options "
"can be changed in this way.\n");
return 0;
}
switch (option) {
case "secret" :
if (CLUB_HANDLER->set_club_secret(name)) {
add_succeeded_mess("$N wipe$s the records on the club '" +
CLUB_HANDLER->query_club_name(name) + "'.\n");
ret = 1;
} else {
add_failed_mess("Unable to change the club to a secret type.\n");
}
break;
case "open" :
if (CLUB_HANDLER->reset_club_secret(name)) {
add_succeeded_mess("$N replace$s the records of the club '" +
CLUB_HANDLER->query_club_name(name) + "'.\n");
ret = 1;
} else {
add_failed_mess("Unable to change the club to an open type.\n");
}
break;
}
return ret;
} /* do_change() */
/**
* This method will forcibly disband the club. This can only be done
* for founder type clubs.
* @param name the name of the club to disband
* @see do_change()
* @see do_create()
* @see disband_confirm()
*/
protected int do_disband(string name) {
if (!CLUB_HANDLER->is_club(name)) {
add_failed_mess("You must disband a club that exists.\n");
return 0;
}
if (CLUB_HANDLER->is_elected_club(name)) {
add_failed_mess("You cannot disband an elected club.\n");
return 0;
}
if (!CLUB_HANDLER->is_personal_club(name)) {
add_failed_mess("The club must be a personal club type for you to "
"be able to disband it.\n");
return 0;
}
if (!CLUB_HANDLER->is_founder_of(name, TP->query_name())) {
add_failed_mess("You must be the founder of the club to disband it.\n");
return 0;
}
write("Are you sure you wish to disband the club '" +
CLUB_HANDLER->query_club_name(name) +
"'? ");
input_to("disband_confirm", 0, name);
add_succeeded_mess("");
return 1;
} /* do_disband() */
/**
* This method is called to confirm the disbanding of the club.
* @param str the response the user type
* @param name the name of the club to disband
* @see do_disband()
* @see do_create()
* @see create_confirm()
*/
protected void disband_confirm(string str, string name) {
string club_name;
str = lower_case(str);
if (str == "" ||
str[0] == 'n' ||
str[0] == 'q') {
write("Canceling disbanding of the club '" + name + "'.\n");
return ;
}
if (str[0] == 'y') {
if (!CLUB_HANDLER->is_club(name)) {
write("The club appears to have been disbanded already.\n");
return 0;
}
if (CLUB_HANDLER->is_elected_club(name)) {
write("The club has changed to an elected club and you cannot "
"disband it.\n");
return 0;
}
if (!CLUB_HANDLER->is_personal_club(name)) {
write("The club must be a personal club for you to be able to "
"disband it.\n");
return 0;
}
if (!CLUB_HANDLER->is_founder_of(name, TP->query_name())) {
write("You must be the founder of the club to disband it.\n");
return 0;
}
club_name = CLUB_HANDLER->query_club_name(name);
CLUB_HANDLER->disband_club(name);
write("You disband the club '" + club_name + "'.\n");
say(TP->the_short() + " disbands the club '" +
club_name + "'.\n");
} else {
write("You must answer yes or no.\n");
write("Are you sure you wish to disband the club '" +
CLUB_HANDLER->query_club_name(name) +
"'? ");
input_to("disband_confirm", 0, name);
}
} /* disband_confirm() */
/**
* This method will create a bunch of insignias for the club.
* @param number the number of insignias to create
* @param name the name of the club to create insignia's for
*/
protected int do_insignia(string name, int num) {
int i;
object *insignias;
object ob;
string place;
if (!CLUB_HANDLER->is_club(name)) {
add_failed_mess("You must create an insignia for a club that exists.\n");
return 0;
}
if (CLUB_HANDLER->is_family(name)) {
add_failed_mess("You cannot create an insignia for a family.\n");
return 0;
}
if (!CLUB_HANDLER->is_member_of(name, TP->query_name())) {
add_failed_mess("You must be a member of the club to create an "
"insignia for it.\n");
return 0;
}
if (num > 1 &&
!CLUB_HANDLER->is_recruiter_of(name, TP->query_name())) {
add_failed_mess("You must be a recruiter to ask for more than one "
"insignia.\n");
return 0;
}
if (num > 20) {
add_failed_mess("You cannot ask for more than 20 insignias.\n");
return 0;
}
place = query_property("place");
if (!place) {
place = "default";
}
/* Check to make sure they have enough money. */
if (TP->query_value_in(place) < (num * CLUB_COST_INSIGNIA)) {
add_failed_mess("You need " +
MONEY_H->money_value_string(CLUB_COST_INSIGNIA * num, place) +
" to pay for " +
query_num(num) + " insignias.\n");
return 0;
}
insignias = ({ });
for (i = 0; i < num; i++) {
ob = clone_object(CLUB_HANDLER->query_insignia_path(name));
ob->set_cond(ob->query_max_cond());
ob->set_club(name);
if (ob->move(TP) == MOVE_OK) {
insignias += ({ ob });
TP->pay_money(MONEY_H->create_money_array(CLUB_COST_INSIGNIA,
place), place);
} else {
ob->dest_me();
}
}
if (!sizeof(insignias)) {
add_failed_mess("Unable to move the insignia into your inventory, "
"insignia not created.\n");
return 0;
} else {
add_succeeded_mess("$N create$s " + query_num(sizeof(insignias)) +
" club '" + CLUB_HANDLER->query_club_name(name) +
"' insignia" +
(sizeof(insignias) > 1 ? "'s" : "") + ".\n");
return 1;
}
} /* do_insignia() */
/**
* This method attempts to add a recruiter to the club.
* @param name the name of the club
* @param recruit the person to add as a recruiter
*/
protected int do_recruiter_remove(string name,
string recruit) {
string *all_names;
string one_name;
if (!CLUB_HANDLER->is_club(name)) {
add_failed_mess("You must remove a recruiter to a club that exists.\n");
return 0;
}
if (CLUB_HANDLER->is_personal_club(name)) {
if (!CLUB_HANDLER->is_founder_of(name, TP->query_name())) {
add_failed_mess("Only the founder can remove recruiters.\n");
return 0;
}
} else if (CLUB_HANDLER->is_elected_club(name)) {
if (!CLUB_HANDLER->is_president_of(name, TP->query_name()) &&
!CLUB_HANDLER->is_vice_president_of(name, TP->query_name())) {
add_failed_mess("Only the president and vice president can remove "
"recruiters.\n");
return 0;
}
} else {
add_failed_mess("Unknown club type.\n");
return 0;
}
all_names = explode(recruit, ",");
if (recruit == "all") {
all_names = CLUB_HANDLER->query_recruiters(name);
}
foreach (one_name in all_names) {
if (!CLUB_HANDLER->is_recruiter_of(name, one_name)) {
add_failed_mess("The person(s) you are removeing must be a recruiter "
" of the club.\n");
all_names -= ({ name });
continue;
}
CLUB_HANDLER->remove_recruiter(name, one_name);
one_name = lower_case(one_name);
if (find_player(one_name) &&
environment(find_player(one_name)) != TO) {
tell_object(find_player(one_name), "You feel suddenly feel like "
"you are unable to "
"recruit people into the club '" +
CLUB_HANDLER->query_club_name(name) +
"'.\n");
}
}
if (!sizeof(all_names)) {
return 0;
}
add_succeeded_mess("$N remove$s " + query_multiple_short(all_names) +
" as " +
(sizeof(all_names) > 1 ? "recruiters " : "a recruiter ") +
"to the club '" + CLUB_HANDLER->query_club_name(name) +
"'.\n");
return 1;
} /* do_recruiter_remove() */
/**
* This method attempts to add a recruiter to the club.
* @param name the name of the club
* @param recruit the person to add as a recruiter
*/
protected int do_recruiter_add(string name, string recruit) {
string *all_names;
string one_name;
if (!CLUB_HANDLER->is_club(name)) {
add_failed_mess("You must add a recruiter to a club that exists.\n");
return 0;
}
if (CLUB_HANDLER->is_personal_club(name)) {
if (!CLUB_HANDLER->is_founder_of(name, TP->query_name())) {
add_failed_mess("Only the founder can add recruiters.\n");
return 0;
}
} else if (CLUB_HANDLER->is_elected_club(name)) {
if (!CLUB_HANDLER->is_president_of(name, TP->query_name()) &&
!CLUB_HANDLER->is_vice_president_of(name, TP->query_name())) {
add_failed_mess("Only the president and vice president can add "
"recruiters.\n");
return 0;
}
} else {
add_failed_mess("Unknown club type.\n");
return 0;
}
all_names = explode(recruit, ",");
if (recruit == "all") {
all_names = CLUB_HANDLER->query_members(name);
}
foreach (one_name in all_names) {
if (!CLUB_HANDLER->is_member_of(name, one_name)) {
add_failed_mess("The person you are making a recruiter must be a "
"member of the club.\n");
all_names -= ({ one_name });
continue;
}
if (CLUB_HANDLER->is_recruiter_of(name, one_name)) {
add_failed_mess("The person you are making a recruiter is already a "
"recruiter of the club.\n");
all_names -= ({ one_name });
continue;
}
CLUB_HANDLER->add_recruiter(name, one_name);
one_name = lower_case(one_name);
if (find_player(one_name) &&
environment(find_player(one_name)) != TO) {
tell_object(find_player(one_name), "You feel suddenly empowered to "
"recruit people into the club '" +
CLUB_HANDLER->query_club_name(name) +
"'.\n");
}
}
if (!sizeof(all_names)) {
return 0;
}
add_succeeded_mess("$N add$s " + query_multiple_short(all_names) +
(sizeof(all_names) == 1? " as a recruiter " : " as recruiters ") +
"to the club '" + CLUB_HANDLER->query_club_name(name) +
"'.\n");
return 1;
} /* do_recruiter_add() */
/**
* This method prints out financial reports for the club.
* @param club_name the name of the club to get financials on
* @return 1 on success, 0 on failure
* @see do_deposit()
* @see do_balance()
*/
protected int do_financials(string name, string account) {
string place;
class club_transaction* transactions;
int i;
int deposit_total;
int withdrawl_total;
string ret;
string account_name;
if (!CLUB_HANDLER->is_club(name)) {
add_failed_mess("The club '" + name + "' does not exist.\n");
return 0;
}
if (!CLUB_HANDLER->is_member_of(name, TP->query_name())) {
add_failed_mess("You must be a member of a club to see its "
"financials.\n");
return 0;
}
if (account == CLUB_DEFAULT_ACCOUNT_NAME) {
account_name = "main club account";
} else {
account_name = "special club account " + account;
}
if (!CLUB_HANDLER->is_account_of(name, account)) {
add_failed_mess("The account " + account_name + " is not in the "
"club '" + CLUB_HANDLER->query_club_name(name) + "'\n");
return 0;
}
place = query_property("place");
if (!place) {
place = "default";
}
ret = "The club '" + CLUB_HANDLER->query_club_name(name) +
"' " + account_name + " has a current balance of " +
MONEY_H->money_value_string(CLUB_HANDLER->query_balance(name), place) +
" and the next pay period ends at " +
ctime(CLUB_HANDLER->query_time_fees_due(name)) +
", which will cost " +
MONEY_H->money_value_string(CLUB_HANDLER->query_club_cost_per_period(name), place) +
".\n";
// Let all players know about the transaction history of the club.
transactions = CLUB_HANDLER->query_transactions(name, account);
for (i = 0; i < sizeof(transactions); i++) {
if (transactions[i]->amount > 0) {
ret += i + ": DEPOSIT " +
MONEY_H->money_value_string(transactions[i]->amount, place) +
" from " + transactions[i]->who +
" at " + ctime(transactions[i]->date) + " (" +
CLUB_HANDLER->query_transaction_type_name(transactions[i]->transaction_type) +
")\n";
if (transactions[i]->information) {
ret += " - " + transactions[i]->information + "\n";
}
deposit_total += transactions[i]->amount;
} else {
ret += i + ": WITHDRAWL " +
MONEY_H->money_value_string(-transactions[i]->amount, place) +
" from " + transactions[i]->who +
" at " + ctime(transactions[i]->date) + " (" +
CLUB_HANDLER->query_transaction_type_name(transactions[i]->transaction_type) +
")\n";
if (transactions[i]->information) {
ret += " - " + transactions[i]->information + "\n";
}
withdrawl_total += -transactions[i]->amount;
}
}
ret += "\nTotal withdrawls: " +
MONEY_H->money_value_string(withdrawl_total, place) + "\n";
ret += "Total deposits : " +
MONEY_H->money_value_string(deposit_total, place) + "\n";
write("$P$Club Financials$P$" + ret);
return 1;
} /* do_financials() */
/**
* This method sets the club description.
* @param name the name of the club to describe
* @see finish_description()
*/
protected int do_describe(string name) {
string bit;
if (club_commands_allowed()) {
bit = "club";
}
if (family_commands_allowed()) {
if (bit) {
bit += " or family";
} else {
bit = "family";
}
}
if (!CLUB_HANDLER->is_club(name)) {
add_failed_mess("The " + bit + " '" + name +
"' must exist for you to describe it.\n");
return 0;
}
if (CLUB_HANDLER->is_elected_club(name)) {
add_failed_mess("You cannot change the description of an elected club, "
"it must be done as a discussion item.\n");
return 0;
}
if (CLUB_HANDLER->is_personal_club(name) &&
!CLUB_HANDLER->is_founder_of(name, TP->query_name())) {
add_failed_mess("You must be the founder of a personal club to "
"change the description.\n");
return 0;
}
if (CLUB_HANDLER->is_family(name) &&
!CLUB_HANDLER->is_founder_of(name, TP->query_name())) {
add_failed_mess("Only the founder of the family can set the "
"description of the family.\n");
return 0;
}
if (!CLUB_HANDLER->is_personal_club(name) &&
!CLUB_HANDLER->is_family(name)) {
add_failed_mess("Unknown club type.\n");
return 0;
}
write("What do you wish to change the description of '" +
CLUB_HANDLER->query_club_name(name) + "' to?\n");
TP->do_edit("", (: finish_description($1, $(name)) :));
add_succeeded_mess("");
return 1;
} /* do_describe() */
/**
* This is the method that is called when the club description has been
* finished edited. It will set the description on the club handler.
* @param describe the new description
* @param name the name of the club to describe
* @see do_describe()
*/
protected void finish_description(string describe, string name) {
if (!describe ||
describe == "") {
write("Aborting setting the description.\n");
return ;
}
CLUB_HANDLER->set_club_description(name, describe);
if (CLUB_HANDLER->is_family(name)) {
write("Set the description of the family '" +
CLUB_HANDLER->query_club_name(name) + "' to:\n" +
CLUB_HANDLER->query_club_description(name) + "\n");
} else {
write("Set the description of the club '" +
CLUB_HANDLER->query_club_name(name) + "' to:\n" +
CLUB_HANDLER->query_club_description(name) + "\n");
}
} /* finish_description() */
/**
* This method sets the percentage cut the room takes for deposits to the
* club account.
* @param cut the nice new percentage cut
* @see query_percentage_cut()
* @see do_deposit()
*/
void set_percentage_cut(int value) {
_percentage_cut = value;
} /* set_percentage_cut() */
/**
* This method returns the percentage cut the room takes for deposits
* to the club account.
* @return the current percentage cut
* @see set_percentage_cut()
* @see do_deposit()
*/
int query_percentage_cut() {
return _percentage_cut;
} /* query_percentage_cut() */
/**
* This method creates the warning message for the club, saying how much
* it costs per year and how everything works. This should probably
* be used in a sign or something in the main room.
* @return the warning message
*/
string query_club_warning_message() {
string place;
string ret;
place = query_property("place");
if (!place) {
place = "default";
}
ret = "";
if (club_commands_allowed()) {
ret += "Clubs have a few rules and regulations associated with them. "
"They cost " + MONEY_H->money_value_string(CLUB_STARTUP_COST, place) +
" to start. Every quarter of a "+mud_name()+" year the club costs " +
MONEY_H->money_value_string(CLUB_COST_PER_YEAR, place) +
" plus " +
MONEY_H->money_value_string(CLUB_COST_PER_MEMBER_PER_YEAR, place) +
" per member. Each insignia will cost " +
MONEY_H->money_value_string(CLUB_COST_INSIGNIA, place) +
" to be made, the cost an insignia is taken from the person "
"requesting the insignia, not the club.\n\n"
"If the club goes into remission for 2 pay periods then the club will "
"be disbanded. If the club is not touched for 8 real weeks then "
"the club will be disbanded. A club is considered touched if a "
"member is added or removed, if an election is held or nominations "
"are added, money is deposited into the account.\n\n"
"Clubs default to being founder controlled clubs, this means the "
"founder has all the control of the club. Once a club gets over " +
CLUB_MINIMUM_ELECTED_MEMBERS +
" members it can change to an elected club, in this mode the "
"committee members of the club are elected to their positions. Once "
"a club gets over " + CLUB_MAXIMUM_ELECTED_MEMBERS + " it must "
"become an elected club. A "
"new election is held every "+mud_name()+" year for all the positions. "
"If the founder of a founder base club leaves the mud or is idle is "
"for 8 real weeks then the club will be disbanded.\n\n"
"Use the command 'create' to create a club, 'disband' to disband a "
"club, 'deposit' to deposit money into a club, 'withdraw' to "
"withdraw money from a club, 'balance' to see "
"the balance of a club, 'list' to see a listing of clubs, "
"'nominate' to nominate someone for a position, 'vote' to vote "
"for someone, 'election' to force an election, "
"'announce' to set an announcement for the club, "
"'discuss' to add discussion items to the club, "
"'replace' to create some club insignias, "
"'change' to change the type and options of a club, "
"'financials' to get "
"some financial information about the club, 'description' to set the "
"description of the club, "
"and 'recruiter' to add a recruiter.\n\n";
}
if (family_commands_allowed()) {
ret += "Families have a few rules and regulations associated with them. "
"They cost "+MONEY_H->money_value_string(FAMILY_STARTUP_COST, place) +
" to start. They have no further costs associated with them but "
"the family name will die out when there are no more active "
"members. You can use the 'relationship' command to create "
"relationships between people. You can use the 'create' command to "
"create families, 'list' to list families and 'description' to set "
"the description of your family.\n";
}
return ret;
} /* query_club_warning_message() */
/**
* This method does a listing of all the clubs that a certain person is
* in.
* @param name the person whose name to check
* @return 1 on success, 0 on failure
* @see /std/basic/club_listing.c
*/
protected int do_club_list_member(string name) {
if( !rank(name) ) {
add_failed_mess(name + " does not play "+mud_name()+".\n");
return 0;
}
if (club_list(TP->query_name(),
0,
(: check_member_func($1, $2, $(name)) :))) {
return 1;
}
add_failed_mess("Could not find any clubs with " + name +
" as a member.\n");
return 0;
} /* do_club_list_member() */
/** @ignore yes */
private void finish_announcement(string str, string name) {
if (!str) {
write("Aborting.\n");
return ;
}
if (CLUB_HANDLER->set_announcement(name,
str)) {
write("Added the announcement to the club " +
CLUB_HANDLER->query_club_name(name) +
".\n");
} else {
write("Unable to add the announcement to the club " +
CLUB_HANDLER->query_club_name(name) +
" for some reason.\n");
}
} /* finish_announcement() */
/**
* This method sets an announcement for the club.
* @return 1 on success, 0 on failure
*/
protected int do_announcement(string name) {
if (!CLUB_HANDLER->is_elected_club(name)) {
add_failed_mess("The club must be an elected club for an announcement "
"to be set.\n");
return 0;
}
if (!CLUB_HANDLER->is_president_of(name, TP->query_name()) &&
!CLUB_HANDLER->is_secretary_of(name, TP->query_name())) {
add_failed_mess("Only the president and secretary can set an "
"announcement.\n");
return 0;
}
write("What announcement do you wish to set?\n");
TP->do_edit(0,
(: finish_announcement :),
0,
0,
name);
return 1;
} /* do_announcement() */
private int check_member_func(string club,
string person,
string mem) {
if (!CLUB_HANDLER->is_member_of(club, mem)) {
return 0;
}
if (CLUB_HANDLER->query_club_secret(club) &&
!CLUB_HANDLER->is_member_of(club, person)) {
return 0;
}
return 1;
} /* check_member_func() */
protected int do_force_election(string name) {
if (!CLUB_HANDLER->is_elected_club(name)) {
add_failed_mess("The club must be elected for you to force an "
"election in it.\n");
return 0;
}
if (!CLUB_HANDLER->is_president_of(name, TP->query_name())) {
add_failed_mess("You must be the president of the club to force an "
"election.\n");
return 0;
}
if (CLUB_HANDLER->is_election_in_progress(name) > time()) {
add_failed_mess("There is already an election in progress, you cannot "
"start another one!\n");
return 0;
}
if (CLUB_HANDLER->query_minimum_next_election(name) > time()) {
add_failed_mess("It is too soon to force an election, that cannot "
"be done until " +
ctime(CLUB_HANDLER->query_minimum_next_election(name)) +
".\n");
return 0;
}
if (!CLUB_HANDLER->start_election(name)) {
add_failed_mess("Could not start the election for some reason.\n");
return 0;
}
add_succeeded_mess("$N start$s an election in " +
CLUB_HANDLER->query_club_name(name) + ".\n");
return 1;
} /* do_force_election() */