tmi2_fluffos_v2/
tmi2_fluffos_v2/bin/
tmi2_fluffos_v2/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/ChangeLog.old/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/Win32/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/simuls/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/clone/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/command/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/data/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/master/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/log/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/compiler/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/efuns/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/operators/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/u/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/tmp/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/windows/
tmi2_fluffos_v2/lib/
tmi2_fluffos_v2/lib/adm/
tmi2_fluffos_v2/lib/adm/daemons/languages/
tmi2_fluffos_v2/lib/adm/daemons/network/I3/
tmi2_fluffos_v2/lib/adm/daemons/virtual/
tmi2_fluffos_v2/lib/adm/daemons/virtual/template/
tmi2_fluffos_v2/lib/adm/news/
tmi2_fluffos_v2/lib/adm/obj/
tmi2_fluffos_v2/lib/adm/obj/master/
tmi2_fluffos_v2/lib/adm/priv/
tmi2_fluffos_v2/lib/adm/shell/
tmi2_fluffos_v2/lib/adm/tmp/
tmi2_fluffos_v2/lib/cmds/
tmi2_fluffos_v2/lib/d/
tmi2_fluffos_v2/lib/d/Conf/
tmi2_fluffos_v2/lib/d/Conf/adm/
tmi2_fluffos_v2/lib/d/Conf/boards/
tmi2_fluffos_v2/lib/d/Conf/cmds/
tmi2_fluffos_v2/lib/d/Conf/data/
tmi2_fluffos_v2/lib/d/Conf/logs/
tmi2_fluffos_v2/lib/d/Conf/obj/
tmi2_fluffos_v2/lib/d/Conf/text/help/
tmi2_fluffos_v2/lib/d/Fooland/adm/
tmi2_fluffos_v2/lib/d/Fooland/data/
tmi2_fluffos_v2/lib/d/Fooland/data/attic/
tmi2_fluffos_v2/lib/d/Fooland/items/
tmi2_fluffos_v2/lib/d/TMI/
tmi2_fluffos_v2/lib/d/TMI/adm/
tmi2_fluffos_v2/lib/d/TMI/boards/
tmi2_fluffos_v2/lib/d/TMI/data/
tmi2_fluffos_v2/lib/d/TMI/rooms/
tmi2_fluffos_v2/lib/d/grid/
tmi2_fluffos_v2/lib/d/grid/adm/
tmi2_fluffos_v2/lib/d/grid/data/
tmi2_fluffos_v2/lib/d/std/
tmi2_fluffos_v2/lib/d/std/adm/
tmi2_fluffos_v2/lib/data/adm/
tmi2_fluffos_v2/lib/data/adm/daemons/
tmi2_fluffos_v2/lib/data/adm/daemons/doc_d/
tmi2_fluffos_v2/lib/data/adm/daemons/emoted/
tmi2_fluffos_v2/lib/data/adm/daemons/network/http/
tmi2_fluffos_v2/lib/data/adm/daemons/network/services/mail_q/
tmi2_fluffos_v2/lib/data/adm/daemons/network/smtp/
tmi2_fluffos_v2/lib/data/adm/daemons/news/archives/
tmi2_fluffos_v2/lib/data/attic/connection/
tmi2_fluffos_v2/lib/data/attic/user/
tmi2_fluffos_v2/lib/data/std/connection/b/
tmi2_fluffos_v2/lib/data/std/connection/l/
tmi2_fluffos_v2/lib/data/std/user/a/
tmi2_fluffos_v2/lib/data/std/user/b/
tmi2_fluffos_v2/lib/data/std/user/d/
tmi2_fluffos_v2/lib/data/std/user/f/
tmi2_fluffos_v2/lib/data/std/user/l/
tmi2_fluffos_v2/lib/data/std/user/x/
tmi2_fluffos_v2/lib/data/u/d/dm/working/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/smtp/
tmi2_fluffos_v2/lib/doc/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/interactive/
tmi2_fluffos_v2/lib/doc/driverdoc/concepts/
tmi2_fluffos_v2/lib/doc/driverdoc/driver/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/arrays/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/buffers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/compile/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/ed/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/filesystem/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/floats/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/functions/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/general/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/mappings/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/numbers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/parsing/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/constructs/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/preprocessor/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/types/
tmi2_fluffos_v2/lib/doc/driverdoc/platforms/
tmi2_fluffos_v2/lib/doc/mudlib/
tmi2_fluffos_v2/lib/ftp/
tmi2_fluffos_v2/lib/include/driver/
tmi2_fluffos_v2/lib/log/
tmi2_fluffos_v2/lib/log/driver/
tmi2_fluffos_v2/lib/obj/net/
tmi2_fluffos_v2/lib/obj/shells/
tmi2_fluffos_v2/lib/obj/tools/
tmi2_fluffos_v2/lib/std/adt/
tmi2_fluffos_v2/lib/std/board/
tmi2_fluffos_v2/lib/std/body/
tmi2_fluffos_v2/lib/std/fun/
tmi2_fluffos_v2/lib/std/living/
tmi2_fluffos_v2/lib/std/object/
tmi2_fluffos_v2/lib/std/shop/
tmi2_fluffos_v2/lib/std/socket/
tmi2_fluffos_v2/lib/std/user/
tmi2_fluffos_v2/lib/std/virtual/
tmi2_fluffos_v2/lib/student/
tmi2_fluffos_v2/lib/student/kalypso/
tmi2_fluffos_v2/lib/student/kalypso/armor/
tmi2_fluffos_v2/lib/student/kalypso/rooms/
tmi2_fluffos_v2/lib/student/kalypso/weapons/
tmi2_fluffos_v2/lib/u/l/leto/
tmi2_fluffos_v2/lib/u/l/leto/cmds/
tmi2_fluffos_v2/lib/www/errors/
tmi2_fluffos_v2/lib/www/gateways/
tmi2_fluffos_v2/lib/www/images/
tmi2_fluffos_v2/old/
tmi2_fluffos_v2/win32/
// 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);
}