/* Do not remove the headers from this file! see /USAGE for more info. */ #include <mudlib.h> #include <log.h> inherit M_DAEMON_DATA; mapping quests = ([]); nosave int total_points; #define PRIV_REQUIRED "Mudlib:daemons" private void calculate_total_points() { int i; string* keys; total_points = 0; keys = keys( quests ); i = sizeof( keys ); while( i-- ) total_points += quests[keys[i]][1]; } int add_quest( string quest, int value, string base, string major_milestone ) { if(!check_privilege(PRIV_REQUIRED)) return 0; if(quests[quest]) { write("D'oh, that quest already exists.\n"); return 0; } LOG_D->log(LOG_QUEST, sprintf("%-30s worth %d pts, added by %s.\n", base, value, this_body()->query_name())); if(base[<2..] == ".c") { base = base[0..<3]; } quests[quest] = ({ base , value , 0, major_milestone }); calculate_total_points(); save_me(); return 1; } int delete_quest( string quest ) { if(!check_privilege(PRIV_REQUIRED) || !quests[quest]) return 0; map_delete( quests, quest ); save_me(); calculate_total_points(); return 1; } int quest_exists(string q) { return quests[q]; } int grant_points( object solver, string quest ) { if( base_name( previous_object() ) != quests[quest][0] ) return 0; if( !solver->add_quest( quest, quests[quest][1] ) ) return 0; quests[quest][2]++; tell( solver, sprintf("Your score has gone up by %d points.\n", quests[quest][1]) ); save_me(); #ifdef USE_STATUS_LINE if( this_body()->has_status_line()) this_body()->update_status_line(); #endif return 1; } string array get_goals_for_quests_cmd() { return map(filter(keys(quests), (: quests[$1][3] :)), (: sprintf("%s (%s)", $1, quests[$1][3]) :)); } string dump_final_goals() { string* keys; int i; string output; int total1; int total2; keys = keys( quests ); keys = sort_array( keys, -1); i = sizeof( keys ); output = ""; while( i-- ) { if(quests[keys[i]][3]) { output += sprintf("%-17s-> %-2d pts, %d solves (%s)\n", keys[i], quests[keys[i]][1], quests[keys[i]][2], quests[keys[i]][0]); total1 += quests[keys[i]][1]; } total2 += quests[keys[i]][1]; } output += sprintf("\nTotal points: %d in main goals, %d total\n",total1, total2); return output; } // Dumps all the quest items, and not just the final goals string quest_dump(string fname) { string* keys; int i; string output; int total; keys = keys( quests ); keys = sort_array( keys, -1); i = sizeof( keys ); output = ""; while( i-- ) { output += sprintf("%-17s-> %-2d pts, %d solves (%s)\n", keys[i], quests[keys[i]][1], quests[keys[i]][2], quests[keys[i]][0]); total += quests[keys[i]][1]; } output += sprintf("\nTotal points: %d\n",total); if ( fname ) write_file(fname, output, 1); return output; } string show_quest( string quest ) { if( !quests[quest] ) return sprintf("%s: no such quest milestone.\n", quest); return sprintf("%-20s-> %-2d points, %d solves, home: %O",quest, quests[quest][1], quests[quest][2], quests[quest][0]); } create() { ::create(); if (!quests) quests = ([]); calculate_total_points(); } int total_points() { return total_points; }