inherit "/cmds/base";
#define TP this_player()
#define STATS ({"con", "dex", "int", "str", "wis"})
#define GUILDS ({"assassin", "priest", "thief", "warrior", "witch", "wizard"})
#define TREES ({"covert", "crafts", "faith", "fighting", "magic", "other" })
string get_stat(string s) {
switch(s) {
case "S": return "str";
case "I": return "int";
case "W": return "wis";
case "D": return "dex";
case "C": return "con";
}
}
int cmd() {
object user;
string guild_ob, stat, str;
mapping stats;
int val, m, i;
mapping tmp;
mapping mode;
stats = ([ ]);
foreach(user in users()) {
if(user->query_creator() || user->query_known_command("rearrange"))
continue;
tmp = ([]);
guild_ob = user->query_guild_ob();
if(guild_ob)
guild_ob = guild_ob->query_name();
if(stats[guild_ob])
tmp = stats[guild_ob];
else {
foreach(stat in STATS) {
tmp[stat] = ({ 0, 0, 0, 0 });
}
}
if(!mode)
mode = ([ ]);
if(!mode[guild_ob])
mode[guild_ob] = ([ ]);
foreach(stat in STATS) {
val = call_other(user, "query_real_" + stat);
tmp[stat][0] += 1;
tmp[stat][1] += val;
if(tmp[stat][2] > val || !tmp[stat][2]) {
tmp[stat][2] = val;
}
if(tmp[stat][3] < val) {
tmp[stat][3] = val;
}
if(!mode[guild_ob][stat])
mode[guild_ob][stat] = ([ val : 1 ]);
else if(!mode[guild_ob][stat][val])
mode[guild_ob][stat][val] = 1;
else
mode[guild_ob][stat][val] += 1;
}
stats[guild_ob] = tmp;
}
write("stat: min max mode ave\n");
foreach(guild_ob in keys(stats)) {
if(!guild_ob)
continue;
printf("\n%s:\n", guild_ob);
str = "";
foreach(stat in STATS) {
// Find the mode.
m = 0;
foreach(i in keys(mode[guild_ob][stat]))
if(mode[guild_ob][stat][i] > m) {
val = i;
m = mode[guild_ob][stat][i];
}
str += sprintf(" %s: %2d %2d %2d %2d\n",
stat,
stats[guild_ob][stat][2], stats[guild_ob][stat][3],
val, stats[guild_ob][stat][1] / stats[guild_ob][stat][0]);
}
printf("%-#*s", this_player()->query_cols(), str);
}
printf("\n");
return 1;
}
int guild(string gstr) {
string user, stat, gob, tstr, guild;
mapping count, total;
int val, i;
foreach(guild in GUILDS) {
if(gstr && gstr != guild && gstr != guild+"s" &&
gstr != guild+"es")
continue;
gob = "/std/guilds/" + guild;
count = ([ ]);
total = ([ ]);
foreach(user in users()) {
if(user->query_guild_ob() != gob || user->query_creator() ||
user->query_known_command("rearrange"))
continue;
foreach(stat in STATS) {
total[stat] += 1;
val = call_other(user, "query_real_" + stat);
if(!count[stat])
count[stat] = ([ val : 1 ]);
if(!count[stat][val])
count[stat][val] = 1;
else
count[stat][val] += 1;
}
}
if(!sizeof(count))
return notify_fail("No players in that guild.\n");
write("\nStats for " + guild + "\n");
foreach(stat in STATS)
printf("%-13s", " " + capitalize(stat));
write("\n");
for(val = 8; val <= 23; val++) {
foreach(stat in STATS) {
tstr = "";
for(i=0; i<((count[stat][val] * 10) / total[stat]); i++)
tstr += "#";
printf("%2d %-10s", val, tstr);
}
write("\n");
}
}
return 1;
}
int stats(string sstr) {
string user, guild, tstr, st;
mapping count, total;
int val, i;
foreach(st in STATS) {
if(sstr && st[0] != sstr[0])
continue;
count = ([ ]);
total = ([ ]);
foreach(user in users()) {
if(user->query_creator() || user->query_known_command("rearrange"))
continue;
guild = replace(user->query_guild_ob(), "/std/guilds/", "");
if(!guild)
continue;
val = call_other(user, "query_real_" + st);
if(!count[guild])
count[guild] = ([ val : 1 ]);
else
count[guild][val] += 1;
total[guild] += 1;
}
if(!sizeof(count))
return notify_fail("No players in that guild.\n");
write("\nValues for " + capitalize(st) + "\n");
foreach(guild in GUILDS)
printf("%-13s", " " + capitalize(guild));
write("\n");
for(val = 8; val <= 23; val++) {
foreach(guild in GUILDS) {
tstr = "";
for(i=0; i<((count[guild][val] * 10) / total[guild]); i++) {
tstr += "#";
}
printf("%2d %-10s", val, tstr);
}
write("\n");
}
}
return 1;
}
int primaries() {
string guild, skill, st, stats;
mapping count;
int i, total;
string str;
write("Guild Primaries\n");
foreach(guild in GUILDS) {
write(guild + "\n");
count = ([ ]);
total = 0;
str = "";
foreach(skill in ("/std/guilds/" + guild)->query_skills()) {
stats = "/std/skills"->query_skill_stat(skill);
total += sizeof(stats);
for(i=0; i<sizeof(stats); i++) {
st = get_stat(stats[i..i]);
count[st] += 1;
}
}
foreach(st in STATS) {
str += sprintf(" %s: %2d%%\n",
capitalize(st), (count[st] * 100) / total);
}
printf("%-#*s", this_player()->query_cols(), str);
write("\n");
}
return 1;
}
int skills() {
string tree, skill, st, stats;
mapping count;
int i, total;
string str;
write("Guild Primaries\n");
foreach(tree in TREES) {
write(tree + "\n");
count = ([ ]);
total = 0;
str = "";
foreach(skill in ("/std/skills")->query_all_children(tree)) {
stats = "/std/skills"->query_skill_stat(skill);
total += sizeof(stats);
for(i=0; i<sizeof(stats); i++) {
st = get_stat(stats[i..i]);
count[st] = 1;
}
}
foreach(st in STATS) {
str += sprintf(" %s: %2d%%\n",
capitalize(st), (count[st] * 100) / total);
}
printf("%-#*s", this_player()->query_cols(), str);
write("\n");
}
return 1;
}
mixed *query_patterns() {
return ({ "", (: cmd() :),
"guild", (: guild(0) :),
"guild <word'guild'>", (: guild($4[0]) :),
"stat", (: stats(0) :),
"stat <word'guild'>", (: stats($4[0]) :),
"primaries", (: primaries() :),
"skills", (: skills() :) });
} /* query_patterns() */