/* -*- LPC -*- */
/**
* This command is used by the player to create a relationship with another
* person into the current family they are in.
* @author Pinkfish
* @started November 1st 1998
*/
#include <clubs.h>
inherit "/cmds/base";
string show_relationship(object from, object to, string rel, object telling);
/**
* This method creates a realtionship with someone else.
*/
int do_relationship(string relationship, object *players, int force) {
object player;
string family;
string my_family;
string their_family;
string rel;
class family_response_data frog;
int ok;
string *relations;
my_family = this_player()->query_family_name();
if (!my_family) {
add_failed_mess("You must be in a family to form a relationship with "
"someone.\n");
return 0;
}
my_family = CLUB_HANDLER->query_club_name(my_family);
rel = CLUB_HANDLER->query_ungendered_relationship(relationship);
if (!rel) {
add_failed_mess("The relationship '" + relationship +
"' is not valid. The valid relationships are " +
query_multiple_short(
CLUB_HANDLER->query_all_relationships()) +
".\n");
return 0;
}
relationship = rel;
foreach (player in players) {
// Make sure the family name is correct.
player->check_family_name();
their_family = player->query_family_name();
relations = CLUB_HANDLER->query_relationships_to(my_family,
this_player()->query_name(),
player->query_name());
if (!their_family && sizeof(relations)) {
//
// They lost their family somehow, so zap all these
// relationships.
//
foreach (rel in relations) {
CLUB_HANDLER->remove_relationship(my_family,
this_player()->query_name(),
their_family,
player->query_name(),
rel);
}
}
rel = CLUB_HANDLER->query_relationship_gender(relationship,
player->query_female());
if (sizeof(relations)) {
if (member_array(relationship, relations) != -1 &&
force) {
family = my_family;
tell_object(player, this_player()->the_short() +
" offers to use "
"the relationship of " + rel + " with "
"you in the family " + my_family + " to allow "
"you to join the family. WARNING! "
"This "
"will cause you to join the family.\n" +
"This will setup the relationships of: " +
show_relationship(this_player(), player,
relationship, player) + "\n" +
"To accept the offer type:\n"
"accept relationship from " +
this_player()->query_name() + " to " +
my_family + " as " + rel + "\n");
frog = new(class family_response_data);
frog->family = family;
frog->relationship = relationship;
player->add_respond_command(CLUB_FAMILY_RESPOND_TYPE,
this_player(),
frog);
ok++;
add_succeeded_mess(({
"$N offer$s to setup a relationship of " +
rel + " with $I.\nThis will setup the "
"relationships of: " +
show_relationship(this_player(), player,
relationship, this_player()) + "\n",
"$N offer$s to setup a relationship of " +
rel + " with $I.\n",
}),
({ player }));
} else {
add_failed_mess("You are already related to $I, you can only force "
"them to join your family.\n", ({ player }) );
}
} else if (player->query_family_name()) {
if (!force) {
// Ok, they are already in a family.
if (!CLUB_HANDLER->is_valid_interfamily_relationship(relationship)) {
add_failed_mess("$I is in a family already and '" +
rel +
"' is not a valid interfamily relationship.\n");
continue;
}
family = player->query_family_name();
tell_object(player, this_player()->the_short() +
" offers to setup "
"a relationship of " + rel + " with "
"you. This will not cause you to change the "
"family.\n" +
"This will setup the relationships of: " +
show_relationship(this_player(), player,
relationship, player) + "\n" +
"To accept the offer type:\n"
"accept relationship from " +
this_player()->query_name() +
" as " + rel + "\n");
} else {
if (!CLUB_HANDLER->is_valid_join_family_relationship(relationship)) {
add_failed_mess("$I is in a family already and the "
"relationship '" + rel +
"' is not valid to cause them to join "
"your family.\n");
continue;
}
family = my_family;
tell_object(player, this_player()->the_short() +
" offers to setup "
"a relationship of " + rel + " with "
"you in the family " + my_family + ". WARNING! "
"This "
"will cause you to join the family.\n" +
"This will setup the relationships of: " +
show_relationship(this_player(), player,
relationship, player) + "\n" +
"To accept the offer type:\n"
"accept relationship from " +
this_player()->query_name() + " to " +
my_family + " as " + rel + "\n");
}
frog = new(class family_response_data);
frog->family = family;
frog->relationship = relationship;
player->add_respond_command(CLUB_FAMILY_RESPOND_TYPE,
this_player(),
frog);
ok++;
add_succeeded_mess(({
"$N offer$s to setup a relationship of " +
rel + " with $I.\nThis will setup the "
"relationships of: " +
show_relationship(this_player(), player,
relationship, this_player()) + "\n",
"$N offer$s to setup a relationship of " +
rel + " with $I.\n",
}),
({ player }));
} else {
tell_object(player, this_player()->the_short() + " offers to setup "
"a relationship of " + rel + " with "
"you in the family " + my_family + ". WARNING! "
"This "
"will cause you to join the family.\n" +
"This will setup the relationships of: " +
show_relationship(this_player(), player,
relationship, player) + "\n" +
"To accept the offer type:\n"
"accept relationship from " +
this_player()->query_name() + " to " +
my_family + " as " + rel + "\n");
frog = new(class family_response_data);
frog->family = my_family;
frog->relationship = relationship;
player->add_respond_command(CLUB_FAMILY_RESPOND_TYPE,
this_player(),
frog);
ok++;
add_succeeded_mess(({
"$N offer$s to setup a relationship of " +
rel + " with $I.\nThis will setup the "
"relationships of: " +
show_relationship(this_player(), player,
relationship, this_player()) + "\n",
"$N offer$s to setup a relationship of " +
rel + " with $I.\n",
}),
({ player }));
}
}
return ok;
} /* do_relationship() */
string show_relationship(object from, object to, string rel, object telling) {
string opp;
string from_arg;
string to_arg;
opp = CLUB_HANDLER->query_opposite_relationship(rel);
if (from == telling) {
from_arg = "are";
} else {
from_arg = "is";
}
if (to == telling) {
to_arg = "are";
} else {
to_arg = "is";
}
return from->the_short() + " " + from_arg + " the " +
CLUB_HANDLER->query_relationship_gender(rel, from->query_female()) +
" of " + to->the_short() + " and " +
to->the_short() + " " + to_arg + " the " +
CLUB_HANDLER->query_relationship_gender(opp, to->query_female()) +
" of " + from->the_short() + ".";
} /* show_relationship() */
int list_relationships() {
string *relationships;
relationships = CLUB_HANDLER->query_all_relationships();
relationships = map(sort_array(relationships, 1), (: capitalize($1) :));
printf("The currently allowed relationships are:\n %-=*s\n",
this_player()->query_cols() - 4,
query_multiple_short(relationships) + ".");
return 1;
} /* list_relationships() */
mixed *query_patterns() {
return ({ "<string'relationship'> with <indirect:player:here>",
(: do_relationship($4[0], $1, 0) :),
"<string'relationship'> with <indirect:player:here> and join family",
(: do_relationship($4[0], $1, 1) :),
"list",
(: list_relationships() :) });
} /* query_patterns() */