/* 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();
}