lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* Do not remove the headers from this file! see /USAGE for more info. */

// TEAM_D - Daemon for storing groups of players on the mud and
//          awarding experience proportionally to those players
//          if experience is used.
// March 1, 1997: Iizuka@Lima Bean created.

#ifdef PARTIES_SAVE
inherit M_DAEMON_DATA;
#else
#define save_me()
#define restore_me()
#endif

class team_member
{
   int shares;
   int access;      // 1 is highest. >1 is lower.
}

class team
{
   string  name;
   mapping members;
   string  password;
   int     min_level;
   int     max_level;
   int     max_active;
}

private void fix_shares(class team);

private int DIFF = 5;
private mapping parties = ([ ]);

nomask void fix_shares(class team team_data)
{
#if 0
   int total_shares;
   class team_member array members = values(team_data->members);

   foreach(class team_member member in members)
   {
      total_shares += member->shares;
   }
#endif
}

nomask int register_team(string name, string owner, string password)
{
   class team new_team = new(class team);
   class team_member new_owner = new(class team_member);

   if(parties[name])
      return 0;

   // When we first create the team, the creator
   // has 100% of the experience shares and has
   // the highest access level.
   new_owner->shares         = 100;
   new_owner->access         = 1;

   new_team->name           = name;
   (class team_member)new_team->members = ([ owner : new_owner ]);
   ((class team_member)(new_team->members[owner]))->shares = 100;
   new_team->password       = password;
   parties += ([ lower_case(name) : new_team ]);
   save_me();
   return 1;
}

private int filter_shares(class team_member m, mixed extra)
{
   return m->shares;
}

nomask int award_experience(string name, int amount)
{
   class team tmp = parties[lower_case(name)];
   string array team_members = keys(tmp->members);
   int x = 0, total = 0;
   int array shares = filter_array(values(tmp->members), (: filter_shares :));

   foreach(x in shares)
      total += x;

   if(total != 100)
   {
      fix_shares(tmp);
      x = total = 0;
      foreach(x in shares)
         total += x;
      if(total != 100)
         return 0;         // ERROR
   }

   foreach(string s in team_members)
      find_body(s)->add_experience(amount *((class team_member)tmp->members)->shares * 0.01);

   return 1;
}

nomask int add_member(string new_member, string pname, string password)
{
   object body = find_body(lower_case(new_member));
   class team_member member = new(class team_member);

   pname = lower_case(pname);
   if(password != ((class team)parties[pname])->password)
      return 0;

   // If the difference in levels between the new member
   // and any existing member of the team is greater
   // than DIFF, do not add the new member.
   if(body->query_level() > ((class team)parties[pname])->min_level + DIFF
      || body->query_level() < ((class team)parties[pname])->max_level - DIFF)
         return 0;

   // Update the new minimum and maximum levels for the team if needed.
   if(body->query_level() > ((class team)parties[pname])->max_level)
      ((class team)parties[pname])->max_level = body->query_level();
   if(body->query_level() < ((class team)parties[pname])->min_level)
      ((class team)parties[pname])->min_level = body->query_level();

   member->shares = 0;
   member->access = sizeof(((class team)parties[pname])->members) + 1;
   ((class team)parties[pname])->members[new_member] = member;
   fix_shares(parties[pname]);

   save_me();
   return 1; // Member has been added
}

nomask int remove_member(string member, string pname)
{
   pname = lower_case(pname);
   if(!((class team)parties[pname])->members[member])
   {
      return 0; // no such member
   }
   else
   {
      map_delete(((class team)parties[pname])->members, member);
      fix_shares(parties[pname]);
   }

   save_me();
   return 1;
}

nomask string locate_access_member(string pname, int access)
{
   string array members;

   pname = lower_case(pname);
   members = keys(((class team)parties[pname])->members);
   foreach(string name in members)
   {
      if((((class team_member)((class team)parties[pname])->members[name]))->access == access)
         return name;
   }
   return 0;
}

// Because two users cannot have the same access levels, when one member's
// access changes, at least one other member's must also. When a user is
// assigned access level X, every user between access level X and the
// user's current access level have their access level incremented (which,
// in game terms, means lowered) =)
private int change_access(string pname, string member, int access)
{
   string current_member;
   int old_access;

   pname = lower_case(pname);
   current_member = locate_access_member(pname, access);
   old_access = (((class team_member)((class team)parties[pname])->members[member]))->access;
   (((class team_member)((class team)parties[pname])->members[current_member]))->access = old_access;
   (((class team_member)((class team)parties[pname])->members[member]))->access = access;

   save_me();
   return 1;
}

nomask string locate_user(string name)
{
   string array p = keys(parties);

   foreach(string s in p)
   {
      if(member_array(name, keys(((class team)parties[s])->members)) != -1)
         return s;
   }
//   return filter(keys(parties), (: member_array(name,
//            keys(((class team)parties[$1])->members)) :));
}

nomask string array list_all_parties()
{
   return keys(parties);
}

nomask string array query_team_members(string pname)
{
   return keys(((class team)parties[lower_case(pname)])->members);
}

nomask int query_member_access(string pname, string member)
{
   return (((class team_member)((class team)parties[lower_case(pname)])->members[member]))->access;
}

// Find a user in the team 'pname' with a given access level.
nomask string locate_member_by_access(string pname, int access)
{
   string array m;

   pname = lower_case(pname);
   m = keys(((class team)parties[pname])->members);
   foreach(string s in m)
   {
      if((((class team_member)((class team)parties[pname])->members[s]))->access == access)
      return s;
   }
   return 0;
}

// The maximum number of members that can be active in one login.
nomask int query_max_active(string pname)
{
   return ((class team)parties[lower_case(pname)])->max_active;
}

nomask void set_max_active(string pname, int n)
{
   ((class team)parties[lower_case(pname)])->max_active = n;
   save_me();
}

nomask string array query_active_members(string pname)
{
   int max;
   string array all;

   pname = lower_case(pname);
   max = ((class team)parties[pname])->max_active;
   all = ({ });
   // If there is no limit, list all users. Default is no limit.
   if(max == 0)
      return query_team_members(pname);

   for(int x = 0; x < max; x++)
      all += ({ locate_member_by_access(pname, x) });

   return all;
}

nomask void remove_team(string pname)
{
   map_delete(parties, lower_case(pname));
   save_me();
}

nomask int team_exists(string pname)
{
   return pname ? (parties[lower_case(pname)] ? 1 : 0) : 0;
}

void create()
{
   restore_me();
}