/** * Playerdist * Shows the geographical distribution of players online * * @author Dasquian * @started 6/10/02 * @changed 29/04/03 pinkfish * Updated to be in the main directory and using 'qwho'. **/ #include <top_ten_tables.h> int cmd(string filter, string arg); string* determine_location( object person ) { mixed *areas, *place; areas = ({ ({ "/d/liaison/NEWBIE", ({ "Misc", "The newbie area" }) }), ({ "/room/air", ({ "Misc", "The air" }) }), ({ "/room/void", ({ "Misc", "The void" }) }), ({ "/room/rubbish", ({ "Misc", "The rubbish room" }) }), ({ "/room/departures", ({ "Misc", "The departures lounge" }) }), ({ "/room/jail", ({ "Misc", "Jail" }) }), ({ "/w/", ({ "Misc", "/w dirs" }) }), ({ "/d/cwc/utils/interview", ({ "CWC", "Interview room" }) }), ({ "/d/cwc/common", ({ "CWC", "Commonroom" }) }), ({ "/d/cwc/Brown_Islands", ({ "CWC", "Brown Islands" }) }), ({ "/d/cwc/Bes_Pelargic/Bad_Poo-Ning/roads/medina", ({ "CWC", "Medina" }) }), ({ "/d/cwc/Bes_Pelargic/Sum_Bing/roads/snail", ({ "CWC", "The Snail" }) }), ({ "/d/cwc/Bes_Pelargic", ({ "CWC", "Bes Pelargic" }) }), ({ "/d/cwc/Hunghung", ({ "CWC", "HungHung" }) }), ({ "/d/cwc/Isle_of_Tonahamen", ({ "CWC", "Isle of Tonahamen" }) }), ({ "/d/cwc/families/mcsweeny", ({ "CWC", "McSweeney Estate" }) }), ({ "/d/cwc/Maps", ({ "CWC", "Terrains" }) }), ({ "/d/cwc", ({ "CWC", "?" }) }), ({ "/d/guilds/assassins/Bes-Pelargic", ({ "CWC", "BP guilds" }) }), ({ "/d/guilds/thieves/Bes-Pelargic", ({ "CWC", "BP guilds" }) }), ({ "/d/guilds/warriors/BesPelargic", ({ "CWC", "BP guilds" }) }), ({ "/d/guilds/warriors/Hunghung", ({ "CWC", "HH guilds" }) }), ({ "/d/guilds/priests/Bes_Pelargic", ({ "CWC", "BP guilds" }) }), ({ "/d/guilds/wizards/Bes_Pelargic", ({ "CWC", "BP guilds" }) }), ({ "/d/guilds/witches/bespelargic", ({ "CWC", "BP guilds" }) }), ({ "/d/underworld/moving_shop/rooms/cwc", ({ "CWC", "F-shop" }) }), ({ "/d/am/utils/interview", ({ "AM", "Interview room" }) }), ({ "/d/am/shades", ({ "AM", "The Shades" }) }), ({ "/d/am/common", ({ "AM", "Commonroom" }) }), ({ "/d/am", ({ "AM", "Ankh-Morpork" }) }), ({ "/d/special/player_shops", ({ "AM", "Tarnach's" }) }), ({ "/d/guilds/merchants", ({ "AM", "Ankh-Morpork" }) }), ({ "/d/guilds/assassins/Ankh-Morpork", ({ "AM", "AM guilds" }) }), ({ "/d/guilds/thieves/Ankh-Morpork", ({ "AM", "AM guilds" }) }), ({ "/d/guilds/warriors/Ankh-Morpork", ({ "AM", "AM guilds" }) }), ({ "/d/guilds/priests/Ankh-Morpork", ({ "AM", "AM guilds" }) }), ({ "/d/guilds/wizards/Ankh-Morpork", ({ "AM", "Unseen University" }) }), ({ "/d/guilds/witches/Ankh-Morpork", ({ "AM", "AM guilds" }) }), ({ "/d/guilds/witches/am", ({ "AM", "AM guilds" }) }), ({ "/d/klatch/utils/interview", ({ "Klatch", "Interview room" }) }), ({ "/d/klatch/common", ({ "Klatch", "Commonroom" }) }), ({ "/d/klatch/djel/city", ({ "Klatch", "KLK" }) }), ({ "/d/klatch/djel/necropolis", ({ "Klatch", "Necropolis" }) }), ({ "/d/klatch/djel/netherworld", ({ "Klatch", "Netherworld" }) }), ({ "/d/klatch/tsort/desert/roads", ({ "Klatch", "Tsort desert road" }) }), ({ "/d/klatch/tsort/desert", ({ "Klatch", "Tsort desert" }) }), ({ "/d/klatch/tsort", ({ "Klatch", "Tsort" }) }), ({ "/d/klatch/Maps", ({ "Klatch", "Terrains" }) }), ({ "/d/klatch", ({ "Klatch", "?" }) }), ({ "/d/guilds/assassins/Khot-lip-khin", ({ "Klatch", "KLK guilds" }) }), ({ "/d/guilds/thieves/Khot-lip-khin", ({ "Klatch", "KLK guilds" }) }), ({ "/d/guilds/warriors/Khot-lip-khin", ({ "Klatch", "KLK guilds" }) }), ({ "/d/guilds/priests/Djelibeybi", ({ "Klatch", "KLK guilds" }) }), ({ "/d/guilds/priests/Khot-lip-khin", ({ "Klatch", "KLK guilds" }) }), ({ "/d/guilds/wizards/Khot-lip-khin", ({ "Klatch", "KLK guilds" }) }), ({ "/d/guilds/wizards/Ephebe", ({ "Klatch", "Ephebe guilds" }) }), ({ "/d/guilds/wizards/Tsort", ({ "Klatch", "Tsort guilds" }) }), ({ "/d/guilds/witches/klk", ({ "Klatch", "KLK guilds" }) }), ({ "/d/ram/utils/interview", ({ "Ram", "Interview room" }) }), ({ "/d/ram/common", ({ "Ram", "Commonroom" }) }), ({ "/d/ram/Gloomy_Forest", ({ "Ram", "Gloomy forest" }) }), ({ "/d/ram/Lancre_Kingdom", ({ "Ram", "Lancre Kingdom" }) }), ({ "/d/ram/Listening_Monks", ({ "Ram", "Listening Monks" }) }), ({ "/d/ram/Razorback", ({ "Ram", "Razorback" }) }), ({ "/d/ram/Slice", ({ "Ram", "Slice" }) }), ({ "/d/ram/Sprite_Caverns", ({ "Ram", "Sprite caverns" }) }), ({ "/d/ram/Temple_of_Soyin", ({ "Ram", "Temple of Soyin" }) }), ({ "/d/ram/Uberwald", ({ "Ram", "Uberwald" }) }), ({ "/d/ram/badass", ({ "Ram", "Bad Ass" }) }), ({ "/d/ram/madstoat", ({ "Ram", "Mad Stoat" }) }), ({ "/d/ram/ohulan", ({ "Ram", "Ohulan-Cutash" }) }), ({ "/d/ram/foothills", ({ "Ram", "Connecting paths" }) }), ({ "/d/ram/bridge", ({ "Ram", "Connecting paths" }) }), ({ "/d/ram/moorland", ({ "Ram", "Connecting paths" }) }), ({ "/d/ram/gorge_road", ({ "Ram", "Connecting paths" }) }), ({ "/d/ram/Lower_Valleys", ({ "Ram", "Connecting paths" }) }), ({ "/d/ram/lancre_town", ({ "Ram", "Lancre Town" }) }), ({ "/d/ram/bandit_camp", ({ "Ram", "Bandit camp" }) }), ({ "/d/ram/druid_circle", ({ "Ram", "Druid circle" }) }), ({ "/d/ram/mountains", ({ "Ram", "Ramtops" }) }), ({ "/d/ram", ({ "Ram", "?" }) }), ({ "/d/guilds/assassins/Ohulan-Cutash", ({ "Ram", "OC guilds" }) }), ({ "/d/guilds/thieves/Madstoat", ({ "Ram", "Mad Stoat guilds" }) }), ({ "/d/guilds/warriors/Lancre", ({ "Ram", "Lancre guilds" }) }), ({ "/d/guilds/priests/Monks-of-Cool", ({ "Ram", "Monks of Cool" }) }), ({ "/d/guilds/priests/Ohulan-Cutash", ({ "Ram", "OC guilds" }) }), ({ "/d/guilds/wizards/Creel-Springs", ({ "Ram", "Creel Springs guilds" }) }), ({ "/d/guilds/witches/badass", ({ "Ram", "Bad Ass guilds" }) }), ({ "/d/guilds/witches/lancre", ({ "Ram", "Lancre guilds" }) }), ({ "/d/guilds/witches/madstoat", ({ "Ram", "Mad Stoat guilds" }) }), ({ "/d/guilds/witches/razorback", ({ "Ram", "Razorback guilds" }) }), ({ "/d/sur/utils/interview", ({ "Sur", "Interview room" }) }), ({ "/d/sur/common", ({ "Sur", "Commonroom" }) }), ({ "/d/sur/Maps", ({ "Sur", "Terrains" }) }), ({ "/d/sur/Dinky", ({ "Sur", "Dinky" }) }), ({ "/d/sur/Sto_Helit", ({ "Sur", "Sto Helit" }) }), ({ "/d/sur/StoLat", ({ "Sur", "Sto Lat" }) }), ({ "/d/sur/Hillshire", ({ "Sur", "Hillshire" }) }), ({ "/d/sur/Holywood", ({ "Sur", "Holywood" }) }), ({ "/d/sur/Nowhere", ({ "Sur", "Nowhere" }) }), ({ "/d/sur/PekanFord", ({ "Sur", "Pekan Ford" }) }), ({ "/d/sur/Sheepridge", ({ "Sur", "Sheepridge" }) }), ({ "/d/sur/Scrogden", ({ "Sur", "Scrogden" }) }), ({ "/d/sur/items/carriage", ({ "Sur", "Carriage" }) }), ({ "/d/sur", ({ "Sur", "?" }) }), ({ "/d/guilds/assassins/Sto-Lat", ({ "Sur", "SL guilds" }) }), ({ "/d/guilds/assassins/Sto-Helit", ({ "Sur", "SH guilds" }) }), ({ "/d/guilds/assassins/Sheepridge", ({ "Sur", "Sheepridge guilds" }) }), ({ "/d/guilds/thieves/Sto-Lat", ({ "Sur", "SL guilds" }) }), ({ "/d/guilds/thieves/Sto-Helit", ({ "Sur", "SH guilds" }) }), ({ "/d/guilds/thieves/Pekan_Ford", ({ "Sur", "PF guilds" }) }), ({ "/d/guilds/warriors/Sto-Lat", ({ "Sur", "SL guilds" }) }), ({ "/d/guilds/priests/Sto-Lat", ({ "Sur", "SL guilds" }) }), ({ "/d/guilds/wizards/Sto-Lat", ({ "Sur", "SL guilds" }) }), ({ "/d/guilds/witches/skund", ({ "Sur", "Skund guilds" }) }), ({ "/d/guilds/witches/stolat", ({ "Sur", "SL guilds" }) }), ({ "/d/forn/utils/interview", ({ "Forn", "Interview room" }) }), ({ "/d/forn/common", ({ "Forn", "Commonroom" }) }), ({ "/d/forn/genua", ({ "Forn", "Genua" }) }), ({ "/d/forn", ({ "Forn", "?" }) }), ({ "/d/guilds/assassins/Genua", ({ "Forn", "Genua guilds" }) }), ({ "/d/special/utils/interview", ({ "Special", "Interview room" }) }), ({ "/d/special/common", ({ "Special", "Commonroom" }) }), ({ "/d/special/ctf", ({ "Special", "CTF" }) }), ({ "/d/special", ({ "Special", "?" }) }), ({ "/d/playtesters/utils/interview", ({ "Playtesters", "Interview room" }) }), ({ "/d/playtesters/common", ({ "Playtesters", "Commonroom" }) }), ({ "/d/playtesters/palace_rooms", ({ "Playtesters", "Palace" }) }), ({ "/d/playtesters", ({ "Playtesters", "?" }) }), ({ "/d/liaison/utils/interview", ({ "Liaison", "Interview room" }) }), ({ "/d/liaison/common", ({ "Liaison", "Commonroom" }) }), ({ "/d/liaison", ({ "Liaison", "?" }) }), ({ "/d/underworld/common", ({ "Underworld", "Commonroom" }) }), ({ "/d/underworld/death", ({ "Underworld", "Death's domain" }) }), ({ "/d/underworld/lspace", ({ "Underworld", "L-space" }) }), ({ "/d/underworld/moving_shop", ({ "Underworld", "T-shop" }) }), ({ "/d/underworld", ({ "Underworld", "?" }) }), ({ "/d/guilds/common", ({ "Guilds", "Commonroom" }) }), ({ "/d/guilds/assassins", ({ "Guilds", "Assassins" }) }), ({ "/d/guilds/thieves", ({ "Guilds", "Thieves" }) }), ({ "/d/guilds/warriors", ({ "Guilds", "Warriors" }) }), ({ "/d/guilds/priests/rooms", ({ "Guilds", "Passage rooms" }) }), ({ "/d/guilds/priests", ({ "Guilds", "Priests" }) }), ({ "/d/guilds/wizards", ({ "Guilds", "Wizards" }) }), ({ "/room/magic_circle", ({ "Guilds", "Witches' circle" }) }), ({ "/d/guilds/witches", ({ "Guilds", "Witches" }) }), ({ "/d/guilds", ({ "Guilds", "?" }) }), ({ "/d/admin/room/domain_control", ({ "Admin", "Domain control" }) }), ({ "/d/admin", ({ "Admin", "?" }) }), ({ "/d", ({ "Other", "Unknown /d room" }) }), }); if( !environment(person) ) { return ({ "Other", "No environment" }); } foreach( place in areas ) { if( strsrch( file_name(environment(person)), place[0] ) == 0 ) { return place[1]; } } return ({ "Other", "Unknown environment" }); } /* determine_location() */ int get_guild_id(object person) { switch(person->query_guild_ob()) { case "/std/guilds/warrior": return 0; case "/std/guilds/assassin": return 1; case "/std/guilds/thief": return 2; case "/std/guilds/wizard": return 3; case "/std/guilds/priest": return 4; case "/std/guilds/witch": return 5; default: return 6; } } /* get_guild_id() */ mapping get_dist( string filter, string arg ) { mapping ps; object *people, person; string *loc; int to_add; people = filter( users(), (: !$1->query_creator() && $1->query_name() != "logon" :) ); ps = ([ ]); foreach( person in people ) { loc = determine_location(person); if( !ps[loc[0]] ) { if( filter == "average" ) { ps[loc[0]] = ({ ([ ]), 0, ({ -1, 0, 0 }) }); } else { ps[loc[0]] = ({ ([ ]), 0, 0 }); } } ps[loc[0]][1]++; if( !ps[loc[0]][0][loc[1]] ) { if( filter == "average" ) { ps[loc[0]][0][loc[1]] = ({ 0, ({ -1, 0, 0 }) }); } else { ps[loc[0]][0][loc[1]] = ({ 0, 0 }); } } ps[loc[0]][0][loc[1]][0]++; switch(filter) { case "verbosity": if( person->query_verbose(arg) ) { ps[loc[0]][2]++; ps[loc[0]][0][loc[1]][1]++; } break; case "average": to_add = 0; if( arg == "guild level" ) { to_add = person->query_level(); } if( arg == "rating" ) { to_add = (int)TOP_TEN_HANDLER->calculate_rating(person); } if( arg == "age" ) { to_add = -person->query_time_on(); } if( to_add < ps[loc[0]][2][0] || ps[loc[0]][2][0] == -1 ) { ps[loc[0]][2][0] = to_add; } ps[loc[0]][2][1] += to_add; if( to_add > ps[loc[0]][2][2] ) { ps[loc[0]][2][2] = to_add; } if( to_add < ps[loc[0]][0][loc[1]][1][0] || ps[loc[0]][0][loc[1]][1][0] == -1 ) { ps[loc[0]][0][loc[1]][1][0] = to_add; } ps[loc[0]][0][loc[1]][1][1] += to_add; if( to_add > ps[loc[0]][0][loc[1]][1][2] ) { ps[loc[0]][0][loc[1]][1][2] = to_add; } break; case "category": if( arg == "guild" ) { if( !ps[loc[0]][2] ) { ps[loc[0]][2] = ({0,0,0,0,0,0,0}); } if( !ps[loc[0]][0][loc[1]][1] ) { ps[loc[0]][0][loc[1]][1] = ({0,0,0,0,0,0,0}); } to_add = get_guild_id(person); ps[loc[0]][2][to_add]++; ps[loc[0]][0][loc[1]][1][to_add]++; } break; default: } } return ps; } /* get_dist() */ int cmd( string filter, string arg, int verbose ) { string place, zone, *guilds; mapping players, zones; int total, i, j; string tmp; string ret; ret = ""; players = get_dist(filter,arg); total = sizeof(filter( users(), (: !$1->query_creator() && $1->query_name() != "logon" :) )); guilds = ({ "Warriors", "Assassins", "Thieves", "Wizards", "Priests", "Witches", "Adventurers" }); tmp = "\n"; tmp+= sprintf( "%-27s", "Distribution of players:" ); if( filter == "category" && arg == "guild" ) { j = (this_player()->query_cols() - 27) / (sizeof(guilds)); for( i=0; i<sizeof(guilds); i++ ) { tmp += sprintf( "%" + j + ".3s", guilds[i] ); } } if( filter == "average" ) { if( arg == "age" ) { j = (this_player()->query_cols() - 27); tmp += sprintf( "%-" + j + "s", " Average age" ); } else { j = (this_player()->query_cols() - 27) / 3; tmp += sprintf( "%" + j + "s", "Lowest" ); tmp += sprintf( "%" + j + "s", "Average" ); tmp += sprintf( "%" + j + "s", "Highest" ); } } tmp += "\n\n"; ret += tmp; foreach( place in keys(players) ) { tmp = "%^YELLOW%^"; tmp+= sprintf( "%-24.24s", place ); tmp+= sprintf( "%3.1i", players[place][1] ); switch( filter ) { case "verbosity": tmp += players[place][2] + "/" + players[place][1] + " verbose " + arg; break; case "average": if( arg == "age" ) { tmp += sprintf( "%-"+ j +"s", " " + query_time_string( players[place][2][1] / players[place][1] ) ); } else { tmp += sprintf( "%"+ j +".1i", players[place][2][0] ); tmp += sprintf( "%"+ j +".1i", players[place][2][1] / players[place][1] ); tmp += sprintf( "%"+ j +".1i", players[place][2][2] ); } break; case "category": if( arg == "guild" ) { for( i=0; i<sizeof(guilds); i++ ) { tmp += sprintf( "%" + j + ".1i", players[place][2][i] ); } } break; default: tmp += " ("; tmp += sprintf( "%3s", ((100 * players[place][1]) / total + "%") ); tmp += ")"; break; } tmp += "%^RESET%^"; tmp += "\n"; ret += tmp; if (verbose) { zones = players[place][0]; foreach( zone in keys( zones ) ) { tmp = sprintf( "%-24.24s", (" - " + zone) ); tmp+= sprintf( "%3.1i", zones[zone][0] ); switch( filter ) { case "verbosity": tmp += " (" + zones[zone][1] + "/" + zones[zone][0] + " verbose " + arg + ")"; break; case "average": if( arg == "age" ) { tmp += sprintf( "%-"+ j +"s", " " + query_time_string( zones[zone][1][1] / zones[zone][0] ) ); } else { tmp += sprintf( "%"+ j +".1i", zones[zone][1][0] ); tmp += sprintf( "%"+ j +".1i", zones[zone][1][1] / zones[zone][0] ); tmp += sprintf( "%"+ j +".1i", zones[zone][1][2] ); } break; case "category": if( arg == "guild" ) { for( i=0; i<sizeof(guilds); i++ ) { if( !zones[zone][1][i] ) { tmp += "%^BLACK%^"; tmp += sprintf( "%" + j + ".1i", zones[zone][1][i] ); tmp += "%^RESET%^"; } else { tmp += sprintf( "%" + j + ".1i", zones[zone][1][i] ); } } } break; default: tmp += " ("; tmp += sprintf( "%3s", ((100 * zones[zone][0]) / total + "%") ); tmp += ")"; break; } tmp += "\n"; ret += tmp; } } if (verbose) { ret += "\n"; } } ret += "Total = " + total + "\n"; write("$P$Distribution$P$" + ret); return 1; } /* cmd() */ mixed *query_patterns() { return ({ "by domain", (: cmd(0, 0, 0) :), //"by verbose <string'type'>", (: cmd("verbosity", $4[0], 0) :), "by guild level", (: cmd("average", "guild level", 0) :), "by rating", (: cmd("average", "rating", 0) :), "by age", (: cmd("average", "age", 0) :), "by guild", (: cmd("category", "guild", 0) :), "verbose by domain", (: cmd(0, 0, 1) :), //"verbose by verbose <string'type'>", (: cmd("verbosity", $4[0], 1) :), "verbose by guild level", (: cmd("average", "guild level", 1) :), "verbose by rating", (: cmd("average", "rating", 1) :), "verbose by age", (: cmd("average", "age", 1) :), "verbose by guild", (: cmd("category", "guild", 1) :), }); } /* query_patterns() */