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: /adm/daemons/party_d.c
// written by Descartes of Borg 921110
// ported to TMI-2 by Zeus, about 932204
// It should be used with /cmds/std/_party.c

#define NAME(x) (string)x->query("name")
#define LEADER(x) (string)x->query("leader")
#define CAPNAME(x) (string)x->query("cap_name")
#define POSS(x) possessive((string)x->query("gender"))
#define TIMEOUT 60
#define MAX 4

private mapping members, invited;

void create() {
     members = ([]);
     invited = ([]);
}

void form_party(object le) {
     if(pointerp(members[NAME(le)])) return;
     members += ([ NAME(le) : ({}) ]);
     invited += ([ NAME(le) : ({}) ]);
     le->set("leader", NAME(le));
     write("You form a new party.\n");
     say(CAPNAME(le)+" forms a new party.\n");
}

void invite_member(object le, object me) {
     if(!pointerp(invited[NAME(le)])) return;
     if(sizeof(members[NAME(le)]) == MAX) {
          write("You can't add anymore members.\n");
          return;
     }
     if(member_array(me, members[NAME(le)]) != -1) {
          write("You have already invited "+CAPNAME(me)+".\n");
          return;
     }
     invited[NAME(le)] += ({ me });
     write("You invited "+CAPNAME(me)+" to join your party.\n");
     tell_object(me, CAPNAME(le)+" invited you to join "+
          POSS(le)+" party.\n");
     say(CAPNAME(le)+" invited "+CAPNAME(me)+" to join "+
          POSS(le)+" party.\n", ({ me }) );
     call_out("remove_invitation", TIMEOUT, ({ le, me, 1 }) );
}

void remove_invitation(mixed arg) {
     if(!pointerp(invited[NAME(arg[0])]) ||
     member_array(arg[1], invited[NAME(arg[0])]) == -1) return;
     if(arg[2]) {
          tell_object(arg[1], "Your invitation to join "+
               CAPNAME(arg[0])+"'s party has expired.\n");
          tell_object(arg[0], CAPNAME(arg[1])+
               "'s invitation to join your party has expired.\n");
     }
     invited[NAME(arg[0])] -= ({ arg[1] });
}

void add_member(object le, object me) {
     if(!pointerp(members[NAME(le)])) return;
     if(sizeof(members[NAME(le)]) == MAX) {
          write(CAPNAME(le)+" can't add you to "+POSS(le)+" party.\n");
          return;
     }
     if(member_array(me, members[NAME(le)]) != -1) {
          write("You are already a member of "+CAPNAME(le)+"'s party.\n");
          return;
     }
     if(member_array(me, invited[NAME(le)]) == -1) {
          write("You have not been invited by "+CAPNAME(le)+".\n");
          return;
     }
     remove_invitation( ({ le, me, 0 }) );
     members[NAME(le)] += ({ me });
     me->set("leader", NAME(le));
     write("You join "+CAPNAME(le)+"'s party.\n");
     tell_object(le, CAPNAME(me)+" joins your party.\n");
     say(CAPNAME(me)+" joins "+CAPNAME(le)+"'s party.\n", ({ le }) );
}

void disband_party(object le) {
     int i, sz;

     if(!pointerp(members[NAME(le)])) return;
     sz = sizeof(members[NAME(le)]);
     for(i = 0; i < sz; i++) {
          if(!members[NAME(le)][i]) continue;
          members[NAME(le)][i]->set("leader", 0);
          tell_object(members[NAME(le)][i], "Your party has been disbanded.\n");
     }
     members[NAME(le)] = 0;
     invited[NAME(le)] = 0;
     map_delete(members, NAME(le));
     map_delete(invited, NAME(le));
     le->set("leader", 0);
     tell_object(le, "Your party has been disbanded.\n");
}

void disband_member(object le, object me, int flag) {
     if(!pointerp(members[NAME(le)]) ||
     member_array(me, members[NAME(le)]) == -1) return;
     members[NAME(le)] -= ({ me });
     me->set("leader", 0);
     if(flag) {
          tell_object(me, CAPNAME(le)+" removed you from "+POSS(le)+" party.\n");
          tell_object(le, "You removed "+CAPNAME(me)+" from your party.\n");
     } else {
          tell_object(me, "You leave "+CAPNAME(le)+"'s party.\n");
          tell_object(le, CAPNAME(me)+" left your party.\n");
     }
}

void check_party(object le) {
     object ob;

     if(!(LEADER(le))) return;
     if((LEADER(le)) == (NAME(le))) {
          disband_party(le);
          return;
     }
     ob = find_living(LEADER(le));
     if(!ob) return;
     disband_member(ob, le, 0);
}

object *query_members(object le) {
     return members[NAME(le)];
}
void change_leader(object le, object me) {
     int i, sz;

     if(!pointerp(members[NAME(le)]) ||
     member_array(me, members[NAME(le)]) == -1) return;
     members[NAME(le)] -= ({ me });
     members[NAME(le)] += ({ le });
     sz = sizeof(members[NAME(le)]);
     for(i = 0; i < sz; i++) {
          if(!members[NAME(le)][i]) continue;
          members[NAME(le)][i]->set("leader", NAME(me));
          tell_object(members[NAME(le)][i], CAPNAME(me)+
               " becomes the new leader of your party.\n");
     }
     members += ([ NAME(me) : members[NAME(le)] ]);
     invited += ([ NAME(me) : invited[NAME(le)] ]);
     members[NAME(le)] = 0;
     invited[NAME(le)] = 0;
     map_delete(members, NAME(le));
     map_delete(invited, NAME(le));
     me->set("leader", NAME(me));
     tell_object(me, "You become the new leader of your party.\n");
}

void party_list(object le) {
     int i, sz;

     if(!pointerp(members[NAME(le)])) return;
     sz = sizeof(members[NAME(le)]);
     write("Your party has "+(sz+1)+" "+((sz+1) > 1 ? "members" : "member")+
          ".\n");
     write("  "+CAPNAME(le)+" [Party Leader]\n");
     for(i = 0; i < sz; i++) {
          if(!members[NAME(le)][i]) continue;
          write("  "+CAPNAME(members[NAME(le)][i])+"\n");
     }
}