// File: /std/user/team.c
// written by Zeus for TMI-2 or compatible mudlibs
// originally used arrays to hold member objects
// modified to use mapping to hold member objects
// hopefully this should increase efficiency of move_team
// as it doesn't have to query for cap_names when calling
// move_player. Added player's invitation, an idea from
// Nightmare's party daemon.
#define TIMEOUT 60
#define NAME (string)this_object()->query("name")
#define CAPNAME (string)this_object()->query("cap_name")
#define LEADER (string)this_object()->query("leader")
#define MAX 3
private static mapping members;
private static object *invited;
private static object startenv;
void disband_team();
void disband_member(object ob, int flag);
void init_team() {
members = ([]);
invited = ({});
this_object()->set("leader", NAME);
}
// This function should be called from quit(), die(), net_dead()
// in user.c to clean up team status when a player quits, dies
// or goes netdead
void check_team() {
object ob;
write ("I'm a frog!\n") ;
if((LEADER) && ((NAME) == (LEADER))) {
write ("Damn, I'm a BLUE frog!\n") ;
disband_team();
return;
}
if((LEADER) && ((NAME) != (LEADER))) {
ob = find_living(LEADER);
if(!ob) return;
ob->disband_member(this_object(), 0);
return;
}
}
void invite_player(object ob) {
if(!ob || ob->query("leader") || sizeof(members) > MAX ||
members[(string)ob->query("cap_name")]) {
write("You can't invite "+ob->query("cap_name")+" to join your party.\n");
return;
}
if(member_array(ob, invited) != -1) {
write("You have already invited "+ob->query("cap_name")+".\n");
return;
}
invited += ({ ob });
write("You invited "+ob->query("cap_name")+" to join your party.\n");
tell_object(ob, CAPNAME+" invited you to join "+
possessive((string)this_object()->query("gender"))+" party.\n");
call_out("remove_invitation", TIMEOUT, ({ ob, 1 }) );
return;
}
void remove_invitation(mixed arg) {
if(!arg[0] || !pointerp(invited) || sizeof(invited) == 0 ||
member_array(arg[0], invited) == -1) return;
if(!living(arg[0]) || arg[0]->query("ghost")) {
invited -= ({ arg[0] });
return;
}
if(arg[1]) tell_object(arg[0], "Your invitation to join "+CAPNAME+
"'s party has expired.\n");
invited -= ({ arg[0] });
}
void add_member(object ob) {
if(member_array(ob, invited) == -1) {
tell_object(ob, "You are have not been invited by "+CAPNAME+".\n");
return;
}
if(sizeof(members) > MAX || members[(string)ob->query("cap_name")]) {
tell_object(ob, CAPNAME+" can't add you to "+
possessive((string)this_object()->query("gender"))+" party.\n");
return;
}
remove_invitation( ({ ob, 0 }) );
ob->set("leader", NAME);
members += ([ (string)ob->query("cap_name") : ob ]);
tell_object(ob, "You join "+CAPNAME+"'s party.\n");
tell_object(this_object(), ob->query("cap_name")+" joins your party.\n");
say(ob->query("cap_name")+" joins "+CAPNAME+"'s party.\n",
({ ob, this_object() }) );
return;
}
// This function is called from /cmds/std/_go.c by the leader object
// to move party members.
void move_team(object env) {
if(!mapp(members) || sizeof(members) == 0) return;
if(!startenv) startenv = env;
call_out("handle_move", 0, environment(this_object()) );
return;
}
void handle_move(object env) {
string *names;
int i, flag;
if(!mapp(members) || sizeof(members) == 0 || !startenv) return;
if(environment(this_object()) != env) return;
names = keys(members);
for(i = 0; i < sizeof(names); i++) {
if(!members[names[i]]) continue;
if(environment(members[names[i]]) != startenv) {
tell_object(members[names[i]], "Your party moved without you.\n");
continue;
}
members[names[i]]->move_player(environment(this_object()),
names[i]+" follows "+CAPNAME);
flag = 1;
}
if(flag) write("Your party followed you.\n");
startenv = 0;
}
void disband_team() {
string *names;
int i;
write ("Damn, I'm an UGLY blue frog!\n") ;
if(!mapp(members)) return;
write ("None uglier!\n") ;
names = keys(members);
for(i = 0; i < sizeof(names); i++) {
if(!members[names[i]]) continue;
members[names[i]]->set("leader", 0);
tell_object(members[names[i]], CAPNAME+" disbanded the party.\n");
}
members = 0;
invited = 0;
this_object()->set("leader", 0);
tell_object(this_object(), "Your party is now disbanded.\n");
}
void disband_member(object ob, int flag) {
if(!mapp(members) || sizeof(members) == 0 ||
!members[(string)ob->query("cap_name")]) return;
if(flag) tell_object(members[(string)ob->query("cap_name")], CAPNAME+
" removed you from "+possessive((string)this_object()->query("gender"))+
" party.\n");
else tell_object(members[(string)ob->query("cap_name")],
"You leave "+CAPNAME+"'s party.\n");
ob->set("leader", 0);
map_delete(members, (string)ob->query("cap_name"));
if(flag) tell_object(this_object(), "You remove "+(string)ob->query("cap_name")+
" from your party.\n");
else tell_object(this_object(), (string)ob->query("cap_name")+
" has left your party.\n");
return;
}
object *query_members() {
return values(members);
}