/** player stat record book coded by Raskolnikov Sept 1996 **/ #define STATS "/open/stats/" #define THISOB "/obj/misc/stat_book" inherit "/std/object.c"; int auto_record, reset_countdown, countdown; string auto_stat, *autorecording; object owner; void create() { ::create(); auto_record = 0; autorecording = ({ }); reset_countdown = 50; countdown = 50; } void setup() { set_name("stat book"); add_alias("book"); set_short("Stat Book"); set_main_plural("Stat Books"); set_long("Raskolnikov's Book of Stats.\n\n"); set_read_mess("\nThis book allows the user to record player stats.\n\n" "To record a new stat type 'record <name>'\n" "To list all stats currently being tracked type 'list stats'\n" "To view the totals accumlated for a stat type 'total <name>'\n" "To view the totals for all stats type 'total all'\n" "To view the last update of stat type 'view <name>'\n" "To view the entire record of a stat type 'view <name>'\n" "To auto record a stat type 'autorecord <name>'\n" "To auto record all stats currently on file type 'autorecord all'\n" "To set how often (in HBs) to auto record " "(default = 50) type 'howoften <how often>'\n" "To list stats currently being auto recorded type 'list " "autorecord'\n" "To stop autorecording a stat type 'reset <name>'\n" "To turn off all autorecording type 'reset autorecord'\n" "To get user info type 'getinfo users|autorecording'\n" ); set_heart_beat(1); call_out("set_owner", 3); reset_drop(); } void set_owner() { owner = environment(this_object()); } object query_owner() { return owner; } void record_stat(string name) { int i, stat_total, stat_average; object *all, *all_players, me; mixed thane, mudlibber, lord, god; mixed overall_players, overall_total, overall_average; if(!name) { notify_fail("Stat Book usage for record: record <name>\n"); return 0; } me = previous_object(); thane = "/secure/thanes"->query_of(me->query_name()); mudlibber = "/secure/mudlibber"->query_boo(me->query_name()); lord = "/secure/lords"->query_boo(me->query_name()); god = "/secure/gods"->query_boo(me->query_name()); if(!thane && !mudlibber && !lord && !god && (me != this_object()) ) { notify_fail("You need to at least be a thane to record.\n"); return 0; } all = users(); stat_total = 0; all_players = ({ }); for(i=0;i<sizeof(all);i++) { if(!function_exists("query_"+name, environment(this_object()))) { notify_fail("That is not a valid category. You must enter a " "known player.c query.\nEx. To record total ac " "type 'record total_ac'\n\n"); return 0; } if(!all[i]->query_creator()) all_players += ({ all[i] }); } for(i=0;i<sizeof(all_players);i++) stat_total += call_other(all_players[i], "query_"+name); stat_average = stat_total / sizeof(all_players); write_file(STATS+name, "Total number of players " "surveyed : "+sizeof(all_players)+"\nAverage : "+stat_average+"\n" "Date and time : "+ctime(time())+"\n", 0); if(file_size(STATS+name+"_total") == -1) write_file(STATS+name+"_total", sizeof(all_players)+"\n"+stat_total+"\n", 1); else { overall_players = read_file(STATS+name+"_total", 1, 1); overall_total = read_file(STATS+name+"_total", 2, 1); sscanf(overall_players, "%d", overall_players); sscanf(overall_total, "%d", overall_total); overall_players += sizeof(all_players); overall_total += stat_total; overall_average = overall_total / overall_players; write_file(STATS+name+"_total", overall_players+"\n"+overall_total+"\n" ""+overall_average+"\n", 1); } if(me == this_object()) return; tell_object(this_player(), capitalize(name)+" recorded\n\n"); this_object()->current_stat(name); return; } void stat_totals(string name) { int i; string overall_players, overall_average, file, last_update, *files, *stat; if(!name) { notify_fail("Stat Book usage for totals: total <name>\n"); return 0; } if(name == "all") { files = get_dir(STATS+"*total"); printf("%-=*s %-=*s %-=*s", this_player()->query_cols()/3, "Stat", this_player()->query_cols()/3, "Total Players", this_player()->query_cols()/3, "Total Average"); write("\n"); for(i=0;i<sizeof(files);i++) { overall_players = read_file(STATS+files[i], 1, 1); overall_average = read_file(STATS+files[i], 3, 1); stat = explode(files[i], "_"); stat -= ({ stat[sizeof(stat) - 1] }); file = implode(stat, "_"); printf("%-=*s %-=*s %-=*s", this_player()->query_cols()/3, file, this_player()->query_cols()/3, overall_players, this_player()->query_cols()/3, overall_average); } write("\n"); return; } if(!file_size(STATS+name+"_total")) { notify_fail("No such stat on file: "+name+"\n"); return 0; } overall_players = read_file(STATS+name+"_total", 1, 1); overall_average = read_file(STATS+name+"_total", 3, 1); last_update = read_file(STATS+name, file_length(STATS+name), 1); tell_object(this_player(), "Total Players Surveyed: " ""+overall_players+"\n" "Total Average for "+name+": "+overall_average+"\n" "Last Update, "+last_update+"\n"); return; } void view_stat(string name) { if(!name) { notify_fail("Stat Book usage for view: view <name>\n"); return 0; } if(file_size(STATS+name) == -1) { notify_fail("No such stat on file: "+name+"\n"); return 0; } tell_object(this_player(), read_file(STATS+name, 1, file_length(STATS+name)) ); return; } void current_stat(string name) { if(!name) { notify_fail("Stat Book usage for current status: " "current <name>\n"); return 0; } if(file_size(STATS+name) == -1) { notify_fail("No such stat on file: "+name+"\n"); return 0; } if(!this_player()) return; tell_object(this_player(), read_file(STATS+name, (file_length(STATS+name) - 2), 3) ); return; } void list_stats(string str) { string *files, output; if(!str || ((str != "stats") && (str != "autorecord"))) { notify_fail("Stat Book usage for list: " "list stats|autorecord\n"); return 0; } if(str == "stats") { files = get_dir(STATS); files -= get_dir(STATS+"*total"); tell_object(this_player(), "List of Stats accumulated " "thus far:\n\n"); output = implode(files, "\n"); printf("%-#*s", this_player()->query_cols(), output+"\n"); return; } tell_object(this_player(), "Autorecording:\n\n"); output = implode(autorecording, "\n"); printf("%-#*s", this_player()->query_cols(), output+"\n"); tell_object(this_player(), "\n\nevery "+reset_countdown+" HBs.\n"); return; } void set_auto_record(string str) { int no_auto_record; object me; mixed thane, mudlibber, lord, god; me = this_player(); thane = "/secure/thanes"->query_of(me->query_name()); mudlibber = "/secure/mudlibber"->query_boo(me->query_name()); lord = "/secure/lords"->query_boo(me->query_name()); god = "/secure/gods"->query_boo(me->query_name()); if(!thane && !mudlibber && !lord && !god) { notify_fail("You need to at least be a thane to " "autorecord.\n"); return 0; } if(!str) { notify_fail("Stat Book usage for auto record: " "autorecord <name>|all\n"); return 0; } if(str == "all") { no_auto_record = this_object()->get_user_info("check"); if(no_auto_record) { notify_fail("Someone is currently autorecording therefore " "you may not. Type 'getinfo autorecording' to find out " "more details.\n"); return 0; } auto_record = 0; autorecording = ({ }); autorecording = get_dir(STATS); autorecording -= get_dir(STATS+"*total"); auto_record = 1; this_object()->add_static_property("autorecording", 1); this_object()->list_stats("autorecord"); return; } auto_stat = str; if(file_size(STATS+auto_stat) == -1) { notify_fail("No such stat on file: "+auto_stat+"\n"); return 0; } if(member_array(auto_stat, autorecording) != -1) { notify_fail(capitalize(auto_stat)+" is already being recorded.\n"); return 0; } auto_record = 0; autorecording += ({ auto_stat }); auto_record = 1; tell_object(this_player(), "Auto record set to record " ""+auto_stat+" every "+reset_countdown+" HBs\n"); return; } void reset_auto_record(string str) { if(!str) { notify_fail("Stat Book usage for turning auto record : " "off: reset <name>|autorecord\n"); return 0; } if(str == "autorecord") { auto_record = 0; autorecording = ({ }); this_object()->remove_property("autorecording"); tell_object(this_player(), "All auto recording turned off.\n"); return; } auto_stat = str; if(file_size(STATS+auto_stat) == -1) { notify_fail("No such stat on file: "+auto_stat+"\n"); return 0; } if(member_array(auto_stat, autorecording) == -1) { notify_fail("Not currently auto recording "+auto_stat+"\n"); return 0; } autorecording -= ({ auto_stat }); tell_object(this_player(), "Auto recording of "+auto_stat+" " "turned off.\n"); return; } void set_countdown(string str) { int check, param; check = sscanf(str, "%d", param); if(check != 1) { notify_fail("Stat Book usage for setting auto record " "time: howoften <howoften>\n"); return 0; } reset_countdown = param; if(reset_countdown < 50) { notify_fail("The minimum allowable value for how often " "you wish to record a stat is 50 HBs.\n"); return 0; } countdown = param; tell_object(this_player(), "Autorecording set to "+param+" HBs.\n"); return; } void heart_beat() { int i; if(!auto_record) return; switch(countdown--) { case -1: for(i=0;i<sizeof(autorecording);i++) this_object()->record_stat(autorecording[i]); countdown = reset_countdown; break; } } void get_user_info(string str) { int i; string *user_names, names; object *all_obs, *all_users, ob_owner; if(!str || ((str != "users") && (str != "autorecording") && (str != "check"))) { notify_fail("Stat Book usage for getting user info : " "getinfo users|autorecording\n"); return 0; } all_obs = children(THISOB); all_users = ({ }); user_names = ({ }); for(i=0;i<sizeof(all_obs);i++) if(environment(all_obs[i])) all_users += ({ all_obs[i]->query_owner() }); if(str == "users") { for(i=0;i<sizeof(all_users);i++) user_names += ({ all_users[i]->query_cap_name() }); tell_object(this_player(), "Current Users of Stat Book\n\n"); names = implode(user_names, "\n"); printf("%-#*s", this_player()->query_cols(), names+"\n"); write("\n"); return; } if(str == "check") { for(i=0;i<sizeof(all_obs);i++) { if(all_obs[i]->query_static_property("autorecording") == 1) return; else return 0; } } for(i=0;i<sizeof(all_users);i++) { ob_owner = all_obs[i]->query_owner(); tell_object(this_player(), ob_owner->query_cap_name()+" is "); all_obs[i]->list_stats("autorecord"); } return; } void init() { ::init(); add_action("record_stat", "record"); add_action("stat_totals", "total"); add_action("view_stat", "view"); add_action("current_stat", "current"); add_action("list_stats", "list"); add_action("set_auto_record", "autorecord"); add_action("reset_auto_record", "reset"); add_action("set_countdown", "howoften"); add_action("get_user_info", "getinfo"); }