ds2.9a12/bin/
ds2.9a12/extra/
ds2.9a12/extra/crat/
ds2.9a12/extra/creremote/
ds2.9a12/extra/mingw/
ds2.9a12/extra/wolfpaw/
ds2.9a12/fluffos-2.14-ds13/
ds2.9a12/fluffos-2.14-ds13/Win32/
ds2.9a12/fluffos-2.14-ds13/compat/
ds2.9a12/fluffos-2.14-ds13/compat/simuls/
ds2.9a12/fluffos-2.14-ds13/include/
ds2.9a12/fluffos-2.14-ds13/testsuite/
ds2.9a12/fluffos-2.14-ds13/testsuite/clone/
ds2.9a12/fluffos-2.14-ds13/testsuite/command/
ds2.9a12/fluffos-2.14-ds13/testsuite/data/
ds2.9a12/fluffos-2.14-ds13/testsuite/etc/
ds2.9a12/fluffos-2.14-ds13/testsuite/include/
ds2.9a12/fluffos-2.14-ds13/testsuite/inherit/
ds2.9a12/fluffos-2.14-ds13/testsuite/inherit/master/
ds2.9a12/fluffos-2.14-ds13/testsuite/log/
ds2.9a12/fluffos-2.14-ds13/testsuite/single/
ds2.9a12/fluffos-2.14-ds13/testsuite/single/tests/compiler/
ds2.9a12/fluffos-2.14-ds13/testsuite/single/tests/efuns/
ds2.9a12/fluffos-2.14-ds13/testsuite/single/tests/operators/
ds2.9a12/fluffos-2.14-ds13/testsuite/u/
ds2.9a12/lib/cmds/admins/
ds2.9a12/lib/cmds/common/
ds2.9a12/lib/cmds/creators/include/
ds2.9a12/lib/daemon/services/
ds2.9a12/lib/daemon/tmp/
ds2.9a12/lib/doc/
ds2.9a12/lib/doc/bguide/
ds2.9a12/lib/doc/efun/all/
ds2.9a12/lib/doc/efun/arrays/
ds2.9a12/lib/doc/efun/buffers/
ds2.9a12/lib/doc/efun/compile/
ds2.9a12/lib/doc/efun/floats/
ds2.9a12/lib/doc/efun/functions/
ds2.9a12/lib/doc/efun/general/
ds2.9a12/lib/doc/efun/mixed/
ds2.9a12/lib/doc/efun/numbers/
ds2.9a12/lib/doc/efun/parsing/
ds2.9a12/lib/doc/hbook/
ds2.9a12/lib/doc/help/classes/
ds2.9a12/lib/doc/help/races/
ds2.9a12/lib/doc/lfun/
ds2.9a12/lib/doc/lfun/all/
ds2.9a12/lib/doc/lfun/lib/abilities/
ds2.9a12/lib/doc/lfun/lib/armor/
ds2.9a12/lib/doc/lfun/lib/bank/
ds2.9a12/lib/doc/lfun/lib/bot/
ds2.9a12/lib/doc/lfun/lib/clay/
ds2.9a12/lib/doc/lfun/lib/clean/
ds2.9a12/lib/doc/lfun/lib/clerk/
ds2.9a12/lib/doc/lfun/lib/client/
ds2.9a12/lib/doc/lfun/lib/combat/
ds2.9a12/lib/doc/lfun/lib/connect/
ds2.9a12/lib/doc/lfun/lib/container/
ds2.9a12/lib/doc/lfun/lib/corpse/
ds2.9a12/lib/doc/lfun/lib/creator/
ds2.9a12/lib/doc/lfun/lib/daemon/
ds2.9a12/lib/doc/lfun/lib/damage/
ds2.9a12/lib/doc/lfun/lib/deterioration/
ds2.9a12/lib/doc/lfun/lib/donate/
ds2.9a12/lib/doc/lfun/lib/door/
ds2.9a12/lib/doc/lfun/lib/equip/
ds2.9a12/lib/doc/lfun/lib/file/
ds2.9a12/lib/doc/lfun/lib/fish/
ds2.9a12/lib/doc/lfun/lib/fishing/
ds2.9a12/lib/doc/lfun/lib/flashlight/
ds2.9a12/lib/doc/lfun/lib/follow/
ds2.9a12/lib/doc/lfun/lib/ftp_client/
ds2.9a12/lib/doc/lfun/lib/ftp_data_connection/
ds2.9a12/lib/doc/lfun/lib/fuel/
ds2.9a12/lib/doc/lfun/lib/furnace/
ds2.9a12/lib/doc/lfun/lib/genetics/
ds2.9a12/lib/doc/lfun/lib/holder/
ds2.9a12/lib/doc/lfun/lib/id/
ds2.9a12/lib/doc/lfun/lib/interactive/
ds2.9a12/lib/doc/lfun/lib/lamp/
ds2.9a12/lib/doc/lfun/lib/leader/
ds2.9a12/lib/doc/lfun/lib/light/
ds2.9a12/lib/doc/lfun/lib/limb/
ds2.9a12/lib/doc/lfun/lib/living/
ds2.9a12/lib/doc/lfun/lib/load/
ds2.9a12/lib/doc/lfun/lib/look/
ds2.9a12/lib/doc/lfun/lib/manipulate/
ds2.9a12/lib/doc/lfun/lib/meal/
ds2.9a12/lib/doc/lfun/lib/messages/
ds2.9a12/lib/doc/lfun/lib/player/
ds2.9a12/lib/doc/lfun/lib/poison/
ds2.9a12/lib/doc/lfun/lib/position/
ds2.9a12/lib/doc/lfun/lib/post_office/
ds2.9a12/lib/doc/lfun/lib/potion/
ds2.9a12/lib/doc/lfun/lib/room/
ds2.9a12/lib/doc/lfun/lib/server/
ds2.9a12/lib/doc/lfun/lib/spell/
ds2.9a12/lib/doc/lfun/lib/torch/
ds2.9a12/lib/doc/lfun/lib/vendor/
ds2.9a12/lib/doc/lfun/lib/virt_sky/
ds2.9a12/lib/doc/lfun/lib/weapon/
ds2.9a12/lib/doc/lfun/lib/worn_storage/
ds2.9a12/lib/doc/lpc/basic/
ds2.9a12/lib/doc/lpc/concepts/
ds2.9a12/lib/doc/lpc/constructs/
ds2.9a12/lib/doc/lpc/etc/
ds2.9a12/lib/doc/lpc/intermediate/
ds2.9a12/lib/doc/lpc/types/
ds2.9a12/lib/doc/misc/
ds2.9a12/lib/doc/old/
ds2.9a12/lib/domains/
ds2.9a12/lib/domains/Praxis/adm/
ds2.9a12/lib/domains/Praxis/attic/
ds2.9a12/lib/domains/Praxis/cemetery/mon/
ds2.9a12/lib/domains/Praxis/data/
ds2.9a12/lib/domains/Praxis/death/
ds2.9a12/lib/domains/Praxis/mountains/
ds2.9a12/lib/domains/Praxis/obj/armour/
ds2.9a12/lib/domains/Praxis/obj/magic/
ds2.9a12/lib/domains/Praxis/obj/weapon/
ds2.9a12/lib/domains/Praxis/orc_valley/
ds2.9a12/lib/domains/Ylsrim/
ds2.9a12/lib/domains/Ylsrim/adm/
ds2.9a12/lib/domains/Ylsrim/armor/
ds2.9a12/lib/domains/Ylsrim/broken/
ds2.9a12/lib/domains/Ylsrim/fish/
ds2.9a12/lib/domains/Ylsrim/meal/
ds2.9a12/lib/domains/Ylsrim/npc/
ds2.9a12/lib/domains/Ylsrim/obj/
ds2.9a12/lib/domains/Ylsrim/virtual/
ds2.9a12/lib/domains/Ylsrim/weapon/
ds2.9a12/lib/domains/campus/adm/
ds2.9a12/lib/domains/campus/etc/
ds2.9a12/lib/domains/campus/meals/
ds2.9a12/lib/domains/campus/save/
ds2.9a12/lib/domains/campus/txt/ai/charles/
ds2.9a12/lib/domains/campus/txt/ai/charles/bak2/
ds2.9a12/lib/domains/campus/txt/ai/charles/bak2/bak1/
ds2.9a12/lib/domains/campus/txt/ai/charly/
ds2.9a12/lib/domains/campus/txt/ai/charly/bak/
ds2.9a12/lib/domains/campus/txt/jenny/
ds2.9a12/lib/domains/cave/doors/
ds2.9a12/lib/domains/cave/etc/
ds2.9a12/lib/domains/cave/meals/
ds2.9a12/lib/domains/cave/weap/
ds2.9a12/lib/domains/default/creator/
ds2.9a12/lib/domains/default/doors/
ds2.9a12/lib/domains/default/etc/
ds2.9a12/lib/domains/default/vehicles/
ds2.9a12/lib/domains/default/virtual/
ds2.9a12/lib/domains/default/weap/
ds2.9a12/lib/domains/town/txt/shame/
ds2.9a12/lib/domains/town/virtual/
ds2.9a12/lib/domains/town/virtual/bottom/
ds2.9a12/lib/domains/town/virtual/space/
ds2.9a12/lib/estates/
ds2.9a12/lib/ftp/
ds2.9a12/lib/lib/comp/
ds2.9a12/lib/lib/daemons/
ds2.9a12/lib/lib/daemons/include/
ds2.9a12/lib/lib/lvs/
ds2.9a12/lib/lib/user/
ds2.9a12/lib/lib/virtual/
ds2.9a12/lib/log/
ds2.9a12/lib/log/adm/
ds2.9a12/lib/log/archive/
ds2.9a12/lib/log/chan/
ds2.9a12/lib/log/errors/
ds2.9a12/lib/log/law/adm/
ds2.9a12/lib/log/law/email/
ds2.9a12/lib/log/law/names/
ds2.9a12/lib/log/law/sites-misc/
ds2.9a12/lib/log/law/sites-register/
ds2.9a12/lib/log/law/sites-tempban/
ds2.9a12/lib/log/law/sites-watch/
ds2.9a12/lib/log/open/
ds2.9a12/lib/log/reports/
ds2.9a12/lib/log/router/
ds2.9a12/lib/log/secure/
ds2.9a12/lib/log/watch/
ds2.9a12/lib/obj/book_source/
ds2.9a12/lib/obj/include/
ds2.9a12/lib/powers/prayers/
ds2.9a12/lib/powers/spells/
ds2.9a12/lib/realms/template/adm/
ds2.9a12/lib/realms/template/area/armor/
ds2.9a12/lib/realms/template/area/npc/
ds2.9a12/lib/realms/template/area/obj/
ds2.9a12/lib/realms/template/area/room/
ds2.9a12/lib/realms/template/area/weap/
ds2.9a12/lib/realms/template/bak/
ds2.9a12/lib/realms/template/cmds/
ds2.9a12/lib/save/kills/o/
ds2.9a12/lib/secure/cfg/classes/
ds2.9a12/lib/secure/cmds/builders/
ds2.9a12/lib/secure/cmds/creators/include/
ds2.9a12/lib/secure/cmds/players/
ds2.9a12/lib/secure/cmds/players/include/
ds2.9a12/lib/secure/daemon/imc2server/
ds2.9a12/lib/secure/daemon/include/
ds2.9a12/lib/secure/lib/
ds2.9a12/lib/secure/lib/include/
ds2.9a12/lib/secure/lib/net/include/
ds2.9a12/lib/secure/lib/std/
ds2.9a12/lib/secure/log/adm/
ds2.9a12/lib/secure/log/bak/
ds2.9a12/lib/secure/log/intermud/
ds2.9a12/lib/secure/log/network/
ds2.9a12/lib/secure/modules/
ds2.9a12/lib/secure/npc/
ds2.9a12/lib/secure/obj/include/
ds2.9a12/lib/secure/room/
ds2.9a12/lib/secure/save/
ds2.9a12/lib/secure/save/backup/
ds2.9a12/lib/secure/save/boards/
ds2.9a12/lib/secure/tmp/
ds2.9a12/lib/secure/upgrades/files/
ds2.9a12/lib/secure/verbs/creators/
ds2.9a12/lib/std/board/
ds2.9a12/lib/std/lib/
ds2.9a12/lib/tmp/
ds2.9a12/lib/verbs/admins/include/
ds2.9a12/lib/verbs/builders/
ds2.9a12/lib/verbs/common/
ds2.9a12/lib/verbs/common/include/
ds2.9a12/lib/verbs/creators/
ds2.9a12/lib/verbs/creators/include/
ds2.9a12/lib/verbs/rooms/
ds2.9a12/lib/verbs/rooms/include/
ds2.9a12/lib/www/client/
ds2.9a12/lib/www/errors/
ds2.9a12/lib/www/images/
ds2.9a12/lib/www/lpmuds/downloads_files/
ds2.9a12/lib/www/lpmuds/intermud_files/
ds2.9a12/lib/www/lpmuds/links_files/
ds2.9a12/win32/
//  /d/standard/sage_room
//  by Valodin
//  This is where you can learn new languages and fix old ones

#include <lib.h>
#include <daemons.h>
#include <clock.h>

//  This is how many experience points == one second
#define SEC_TO_EXP  3

inherit "/lib/std/room";

#define OLD_LANGUAGES ({ "elvish", "giantish", "orcish", "artrellian", "mischief", "sensuous", "hobbitish", "pseudo-speak", "gnomish" })

mapping queue;

void create() {
    ::create();
    queue = ([]);
    SetProperty("light", 3);
    SetProperty("indoors", 1);
    SetProperty("no steal", 1);
    SetProperty("no attack", 1);
    SetProperty("no magic", 1);
    SetShort( "Sage room");
    SetLong( "The walls of this smoke-filled room are covered with trappings "
      "from far off lands.  In the center of a huge smoke cloud sits a small "
      "white-haired man.  He looks like he is very wise.  There are books on "
      "how to speak different languages.");
    SetItems( 
      ([({"sage", "man", "old man"}) : "The sage is a tiny little "
        "wrinkled man. But he looks very wise.",
        ({"walls", "trappings"}) : "The walls are covered in strange "
        "writings in many languages, but you can hardly see them "
        "through all the smoke from the sage's pipe.", 
        "pipe" : "The sage puffs away on this small water pipe. "
        "The wisps of smoke remind you of the man's beard.",
        ({"book", "books"}) : "As you flip through the books you "
        "decide that you should study a new language."]) );
    AddExit("south", "/domains/Praxis/w_boc_la2", (: "leave_the_room" :) );
}

void init() {
    ::init();
    add_action("ask_sage", "ask");
    add_action("study_lang", "study");
}

int remove_old_lang(object ob) {
    string *langs;
    int i, szl;

    if(!function_exists("query_all_languages", ob))
        return 0;
    langs = ob->query_all_languages();
    for(i = 0, szl = sizeof(langs); i < szl; i++)
        if(member_array(langs[i], OLD_LANGUAGES) != -1)
            ob->remove_language(langs[i]);
    return 1;
}

int fix_languages() {
    write("The sage peers at you intently.");
    if(!remove_old_lang(this_player()))
    {
        write("The sage says: You need new flesh before I can help your mind.");
        return 1;
    }
    //LANG_D->init_languages(this_player());
    write("The sage says: You have been healed, my " + 
      (((string)this_player()->query_gender() == "male") ? "son" :
        "daughter") + ".");
    return 1;
}

int ask_sage(string str)
{
    string trash;

    notify_fail("Ask who, what?\n");
    if(!str)
        return 0;
    if(sscanf(str, "sage%s", trash, trash) == 1)
        notify_fail("What do you want to ask the sage?\n");
    if(sscanf(str, "sage%sfix%s", trash, trash) == 2)
    {
        return fix_languages();
    }
    return 0;
}

int able_to_study(int amount)
{
    int exp;

    exp = (int)this_player()->query_exp();
    if((exp - amount) < 
      (int)ADVANCE_D->get_exp((int)this_player()->query_level()))
        return 0;
    else
        return 1;
}

int coclean(mixed *element, object ob)
{
    if(element[0] != ob)
        return 0;
    else
        return 1;
}

void clean_call_outs(object ob)
{
    mixed *all_callouts;
    int i, acsz;

    all_callouts = call_out_info();
    all_callouts = filter_array(all_callouts, "coclean", this_object(), 
      this_object());
    for(i = 0, acsz = sizeof(all_callouts); i < acsz; i++)
        remove_call_out(all_callouts[i][1]);
    for(i = 0, acsz = sizeof(all_callouts); i < acsz; i++)
        if(all_callouts[i][3] != ob)
            call_out(all_callouts[i][1], all_callouts[i][2], all_callouts[i][3]);
}

int convert_time(string str)
{
    string *times;
    int ret, i, j, tln;

    times = explode(str, " ");
    ret = 0;
    tln = sizeof(times) / 2;
    for(i = 0; i < tln; i++)
    {
        j = to_int(times[2 * i]);
        switch(times[2 * i + 1])
        {
        case "seconds":
        case "second":
            j = j * SECOND;
            break;
        case "minutes":
        case "minute":
            j = j * MINUTE;
            break;
        case "hours":
        case "hour":
            j = j * HOUR;
            break;
        case "days":
        case "day":
            j = j * DAY;
            break;
        case "week":
        case "weeks":
            j = j * WEEK;
            break;
        case "month":
        case "months":
            j = j * MONTH;
            break;
        case "year":
        case "years":
            j = j * YEAR;
            break;
        default:
            return 0;
        }
        ret += j;
    }
    return ret;
}

int study_lang(string str)
{
    string lang, timestr;
    int nmtimespan;

    if(!str)
    {
        write("Study which language for how long?");
        return 1;
    }

    if(queue[this_player()])
    {
        write("The sage says: I cannot teach you two languages at once, my " +
          (((string)this_player()->query_gender() == "male") ? "son." : 
            "daughter."));
        return 1;
    }

    if(!function_exists("learn_language", this_player()))
    {
        write("The sage says: I am sorry, my " + 
          (((string)this_player()->query_gender() == "male") ? "son" : 
            "daughter") + ", but I cannot teach you in your current body.");
        return 1;
    }
    if((sscanf(str, "%s for %s", lang, timestr) != 2) || (lang == "") || 
      (timestr == "") || !(nmtimespan = convert_time(timestr)))
    {
        write("Study which language for how long?");
        return 1;
    }

    lang = lower_case(lang);

    if(nmtimespan <= 0)
    {
        write("The sage shakes his head at you in disgust.");
        return 1;
    }
    if(nmtimespan > DAY)
    {
        write("You decide that you will get hungry and bored long before then.");
        return 1;
    }

    if(!able_to_study(SEC_TO_EXP * nmtimespan))
    {
        write("The sage says: I am sorry, my " + 
          (((string)this_player()->query_gender() == "male") ? "son" : 
            "daughter") + ", but you are not experienced enough to study "
          "for that long.");
        return 1;
    }

    write("You begin studying " + capitalize(lang) + ".  You must stay here and"
      " study until your time has ended in order to learn the langauge.");
    queue[this_player()] = ({ lang, (SEC_TO_EXP * nmtimespan) });
    call_out("advance_em", nmtimespan, this_player());

    //if(member_array(lang, (string *)(LANG_D->all_languages())) == -1)
    //{
    // write("The sage says: " + capitalize(lang) + " is an uncommon language.  "
    //	  "If you did not mean to study it, then you should leave now, my " +
    //	  (((string)this_player()->query_gender() == "male") ? "son." :
    //	   "daughter."));
    //   return 1;
    //}
    return 1;
}

int leave_the_room()
{
    if(queue[this_player()])
    {
        write("You decide to quit studying and go do other things.");
        map_delete(queue, this_player());
        clean_call_outs(this_player());
    }
    return 1;
}

void advance_em(mixed arg)
{
    object ob;
    string lang;
    int exp;

    ob = (object)arg;
    if(!ob || (environment(ob) != this_object()))
    {
        if(ob)
            if(queue[ob])
                map_delete(queue,ob);
        return;
    }

    if(!queue[ob])
        return;

    lang = (string)queue[ob][0];
    exp = (int)queue[ob][1];
    ob->add_exp(-exp);
    ob->learn_language(lang, exp);
    write("You are done studying " + capitalize(lang) + ".");
    map_delete(queue, ob);
}