nightmare3_fluffos_v2/
nightmare3_fluffos_v2/bin/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/ChangeLog.old/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/Win32/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/compat/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/compat/simuls/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/include/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/clone/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/command/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/data/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/etc/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/include/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/inherit/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/inherit/master/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/log/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/single/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/single/tests/compiler/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/single/tests/efuns/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/single/tests/operators/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/u/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/tmp/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/windows/
nightmare3_fluffos_v2/lib/cmds/ambassador/
nightmare3_fluffos_v2/lib/cmds/database/
nightmare3_fluffos_v2/lib/cmds/hm/
nightmare3_fluffos_v2/lib/cmds/soul/
nightmare3_fluffos_v2/lib/daemon/cfg/
nightmare3_fluffos_v2/lib/daemon/cfg/mon_races/
nightmare3_fluffos_v2/lib/daemon/cfg/races/
nightmare3_fluffos_v2/lib/daemon/include/
nightmare3_fluffos_v2/lib/daemon/save/
nightmare3_fluffos_v2/lib/daemon/services/
nightmare3_fluffos_v2/lib/daemon/soul/
nightmare3_fluffos_v2/lib/doc/
nightmare3_fluffos_v2/lib/doc/TestPlans/
nightmare3_fluffos_v2/lib/doc/approval/
nightmare3_fluffos_v2/lib/doc/approval/QC/
nightmare3_fluffos_v2/lib/doc/approval/balance/
nightmare3_fluffos_v2/lib/doc/build/
nightmare3_fluffos_v2/lib/doc/build/armours/
nightmare3_fluffos_v2/lib/doc/build/economy/
nightmare3_fluffos_v2/lib/doc/build/etc/
nightmare3_fluffos_v2/lib/doc/build/monster/
nightmare3_fluffos_v2/lib/doc/build/room/
nightmare3_fluffos_v2/lib/doc/build/virtual/
nightmare3_fluffos_v2/lib/doc/build/weapon/
nightmare3_fluffos_v2/lib/doc/classes/
nightmare3_fluffos_v2/lib/doc/efun/
nightmare3_fluffos_v2/lib/doc/etc/
nightmare3_fluffos_v2/lib/doc/help/creator/
nightmare3_fluffos_v2/lib/doc/help/hm/
nightmare3_fluffos_v2/lib/doc/law/
nightmare3_fluffos_v2/lib/doc/lpc/basic/
nightmare3_fluffos_v2/lib/doc/lpc/data_types/
nightmare3_fluffos_v2/lib/doc/lpc/etc/
nightmare3_fluffos_v2/lib/doc/lpc/intermediate/
nightmare3_fluffos_v2/lib/doc/lpc/types/
nightmare3_fluffos_v2/lib/doc/mudlib/
nightmare3_fluffos_v2/lib/doc/mudlib/features/
nightmare3_fluffos_v2/lib/domains/Examples/etc/
nightmare3_fluffos_v2/lib/domains/Examples/room/
nightmare3_fluffos_v2/lib/domains/Examples/virtual/
nightmare3_fluffos_v2/lib/domains/Examples/virtual/exaA/
nightmare3_fluffos_v2/lib/domains/Examples/virtual/exaB/
nightmare3_fluffos_v2/lib/domains/Examples/weapon/
nightmare3_fluffos_v2/lib/domains/Praxis/
nightmare3_fluffos_v2/lib/domains/Praxis/adm/
nightmare3_fluffos_v2/lib/domains/Praxis/attic/
nightmare3_fluffos_v2/lib/domains/Praxis/cemetary/
nightmare3_fluffos_v2/lib/domains/Praxis/cemetary/mon/
nightmare3_fluffos_v2/lib/domains/Praxis/data/
nightmare3_fluffos_v2/lib/domains/Praxis/death/
nightmare3_fluffos_v2/lib/domains/Praxis/mountains/
nightmare3_fluffos_v2/lib/domains/Praxis/obj/armour/
nightmare3_fluffos_v2/lib/domains/Praxis/obj/magic/
nightmare3_fluffos_v2/lib/domains/Praxis/obj/weapon/
nightmare3_fluffos_v2/lib/domains/Praxis/orc_valley/
nightmare3_fluffos_v2/lib/domains/Praxis/quests/
nightmare3_fluffos_v2/lib/domains/Praxis/standardOld/
nightmare3_fluffos_v2/lib/include/
nightmare3_fluffos_v2/lib/log/
nightmare3_fluffos_v2/lib/log/errors/
nightmare3_fluffos_v2/lib/log/reports/
nightmare3_fluffos_v2/lib/log/watch/
nightmare3_fluffos_v2/lib/news/
nightmare3_fluffos_v2/lib/secure/cfg/
nightmare3_fluffos_v2/lib/secure/cmds/ambassador/
nightmare3_fluffos_v2/lib/secure/cmds/mortal/
nightmare3_fluffos_v2/lib/secure/save/users/d/
nightmare3_fluffos_v2/lib/secure/std/
nightmare3_fluffos_v2/lib/std/hm/
nightmare3_fluffos_v2/lib/std/living/
nightmare3_fluffos_v2/lib/std/room/
nightmare3_fluffos_v2/lib/std/user/
nightmare3_fluffos_v2/lib/std/virtual/
nightmare3_fluffos_v2/lib/www/
nightmare3_fluffos_v2/lib/www/errors/
nightmare3_fluffos_v2/lib/www/gateways/
nightmare3_fluffos_v2/win32/
//	/std/party.c
//	party daemon for the Nightmare mudlib
//	created by Descartes of Borg 10 Nov 1992

#include <party.h>

mapping party;
mapping invited;

string party_member(object ob);
void manage_party(string group);
void remove_party(string group);
void remove_invitation(mixed *bing);
int invited_now(object ob, string str);

void create() {
    party = ([]);
    invited = ([]);
    call_out("manage_all_parties", 300);
}

int add_member(object ob, string group) {
    if(!party) party = ([]);
    if(party_member(ob)) return ALREADY_MEMBER;
    if(!party[group]) {
        tell_object(ob, "You are the leader of party "+group+".\n");
        party[group] = ({});
    }
    party[group] += ({ ob });
    if(invited) if(invited[group]) if(member_array(ob, invited[group]) != -1) {
	remove_invitation( ({ ob, group, 1 }) );
    }
    ob->set_party(group);
    manage_party(group);
    return OK;
}

int remove_member(object ob) {
    string group;

    if(!party) return NOT_MEMBER;
    group = party_member(ob);
    if(!group) return NOT_MEMBER;
    party[group] -= ({ ob });
    tell_object(ob, "You are no longer in the party "+group+".\n");
    ob->set_party(0);
    manage_party(group);
    return OK;
}

string party_member(object ob) {
    string *groups;
    int i;

    if(!party) return 0;
    groups = keys(party);
    for(i=0; i<sizeof(groups); i++) {
        if(member_array(ob, party[groups[i]]) != -1) return groups[i];
    }
    return 0;
}

int change_leader(object ob) {
    string group;
    object *this_party;
    int x;

    if(!party) return NOT_MEMBER;
    group = party_member(ob);
    if(!group) return NOT_MEMBER;
    manage_party(group);
    this_party = party[group];
    x = member_array(ob, this_party);
    if(!x) return ALREADY_LEADER;
    this_party[x] = this_party[0];
    this_party[0] = ob;
    tell_object(ob, "You are now the leader of party "+group+".\n");
    party[group] = this_party;
    manage_party(group);
    return OK;
}

void manage_party(string group) {
    object *tmp;
    object *who;
    object ob;
    int i, j;

    tmp = ({});
    if(!party) return;
    if(!party[group]) return;
    if(!sizeof(party[group])) {
        remove_party(group);
        return;
    }
    ob = party[group][0];
    who = party[group];
    for(i=0; i<sizeof(who); i++) {
        if(!who[i]) continue;
        if(!living(who[i]) || !interactive(who[i])) {
            who[i]->set_party(0);
            continue;
        }
        tmp += ({ who[i] });
    }
    if(!sizeof(tmp)) {
        remove_party(group);
        return;
    }
    if(tmp[0] != ob) tell_object(tmp[0], "You are now the leader of the party "+group+".\n");
    party[group] = tmp;
    return;
    tmp = ({});
    for(i=0; i<sizeof(party[group]); i++) {
        if((who = party[group][i]->query_attackers())) {
            for(j=0; j<sizeof(who); j++) {
                if(member_array(who[j], tmp) == -1) tmp += ({ who[j] });
            }
        }
    }
    for(i=0; i < sizeof(party[group]); i++) party[group][i]->set_attackers(tmp);
}

void remove_party(string group) {
    if(!party) return;
    if(undefinedp(party[group])) return;
    map_delete(party, group);
}

void calculate_exp(string group, int exp, object tmp) {
    int tot, x, i;

    if(!party) {
        previous_object()->fix_exp(exp, tmp);
        return;
    }
    if(!party[group]) {
        previous_object()->fix_exp(exp, tmp);
        return;
    }
    if(sizeof(party[group]) == 1) {
	previous_object()->fix_exp(exp, tmp);
	return 0;
    }
    manage_party(group);
    for(i=0, tot=0; i<sizeof(party[group]); i++) {
	x = (int)party[group][i]->query_level();
        tot += x;
    }
    for(i=0; i<sizeof(party[group]); i++) {
        x = (int)party[group][i]->query_level();
        party[group][i]->fix_exp((x*exp)/tot+1, tmp);
    }
}

string *query_parties() {
    if(!party) return 0;
    return keys(party);
}

object *query_party_members(string group) {
    if(!party) return 0;
    if(!party[group]) return 0;
    manage_party(group);
    return party[group];
}

object query_leader(string str) {
    if(!party) return 0;
    if(!party[str]) return 0;
    manage_party(str);
    return party[str][0];
}

void notify_party(string str, string what) {
    int i, sz;

    if(!party) return;
    if(!party[str]) return;
    manage_party(str);
    sz = sizeof(party[str]);
    for(i=0; i<sz; i++) {
           tell_object(party[str][i], "<"+str+" info> "+what+"\n");
    }
}

void add_invited(object ob, string str) {
    if(!invited) return;
    if(!invited[str]) invited[str] = ({});
    invited[str] += ({ ob });
    call_out("remove_invitation", 60, ({ ob, str, 0 }));
}

object *query_invited(string str) {
    if(!invited) return 0;
    if(!invited[str]) return 0;
    return invited[str];
}

int invited_now(object ob, string str) {
    if(!invited) return 0;
    if(!invited[str]) return 0;
    if(member_array(ob, invited[str]) == -1) return 0;
    return 1;
}

void remove_invitation(mixed *bing) {
    if(!invited) return;
    if(!invited[bing[1]]) return;
    if(member_array(bing[0], invited[bing[1]]) == -1) return;
    invited[bing[1]] -= ({ bing[0] });
    if(!bing[2]) tell_object(bing[0], "You are no longer invited to be a member of the party.\n");
}

void manage_all_parties() {
    string *grps;
    int i;

    if(i = sizeof(grps = keys(party)))
      while(i--) manage_party(grps[i]);
    call_out("manage_all_parties", 300);
}