lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* 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;
}