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/
#include <lib.h>
#include <daemons.h>
#include <modules.h>

string globaltmp, globalstr, globalstr2, func, data, temporary;
int automated;
object target;
mixed newval;

int GetKey(string str);
varargs mapping GetTheValue(string str, object targ, string tempy, string k1, string v1, mapping MapThing, string passed_fun);

string *key_arr = ({});
mapping NewMap = ([]);

int eventStoreMapping(string savefile, mapping plan){
    string filename = "/tmp/"+savefile;
    if(file_exists(filename) && !check_privs(this_player(),filename)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return 1;
    }
    store_variable("data", plan);
}

varargs int eventStartMappingQuestions(mapping oldmap, object ob, string tmpfile, string auto){
    if(ob) target = ob;
    if(tmpfile) temporary = tmpfile;
    if(auto && auto != "") {
        automated = 1;
        func = auto;
    }

    if(ob && !check_privs(this_player(),ob)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return 1;
    }

    if(file_exists(temporary) && !check_privs(this_player(),temporary)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return 1;
    }
    if(sizeof(oldmap)) NewMap = oldmap;
    else NewMap = ([]);
    key_arr = ({});
    write("If you don't understand these questions, type the letter q on a blank "+
      "line and hit enter.\n");
    write("Please enter the first key element for this mapping:\n");
    input_to( (: GetKey :) );
    return 1;
}

int GetKey(string str){
    if(file_exists(temporary) && !check_privs(this_player(),temporary)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return 1;
    }
    if(str && str == "q" ) {
        write("Aborting modification. For information on mappings, type: help mappings");
        rm(temporary);
        return 1;
    }
    if(!str || str == "" || str == "."){
        if(!sizeof(key_arr)){
            write("Aborting modification. For information on mappings, type: help mappings");
            rm(temporary);
            return 1;
        }
        write("Please enter the value for key "+identify(key_arr)+":\n");
        input_to( (: GetTheValue :) );
        return 1;
    }
    else {
        key_arr += ({ str });
        write("Please enter the next key element, or enter a single dot to "
          "finish entering key elements.");
        input_to( (: GetKey :) );
        return 1;
    }
}

varargs mapping GetTheValue(string str, object targ, string tempy, string k1, string v1, mapping MapThing, string passed_fun){
    int i;
    string repl_key;
    string *mapkeys;

    if(!str && !targ && !tempy && !k1 && !v1){
        return 0;
    }
    if(str == "AUTOMATED"){
        NewMap = ([]);
        automated = 1;
        target = targ;
        key_arr = ({ k1 });
        temporary = tempy;
        str = v1;
        if(sizeof(MapThing)) NewMap = MapThing;
        func = passed_fun;
        unguarded( (: cp(base_name(target)+".c",temporary) :) );
    }
    if(file_exists(temporary) && !check_privs(this_player(),temporary)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return ([]);
    }
    if(!str || str == "" || str == "." || str == "q") {
        write("Aborting modification. For information on mappings, type: help mappings");
        rm(temporary);
        return ([]);
    }

    if(sscanf(str,"%d",i) == 1) newval = i;
    else newval = str;

    mapkeys = keys(NewMap);
    foreach(mixed llave in mapkeys){
        foreach(string nueva_llave in key_arr){
            if(arrayp(llave) && member_array(nueva_llave,llave) != -1) repl_key = llave;
            else if(stringp(llave) && nueva_llave == llave ) repl_key = llave;
        }
    }

    if(repl_key || repl_key != "") map_delete(NewMap, repl_key);
    if(sizeof(key_arr) > 1) NewMap[key_arr] = newval;
    else NewMap[key_arr[0]] = newval;
    if(automated){
        automated = 0;
        if(func) this_object()->eventResumeMappingChange(target, temporary, NewMap, func);
        else this_object()->eventResumeMappingChange(target, temporary, NewMap);
    }
    return copy(NewMap);
}

varargs string eventStringifyMap(mapping source, string key_excl, string val_excl){
    string map_str, key;
    mixed val;

    if(!key_excl) key_excl = ""+time();
    if(!val_excl) val_excl = ""+time();

    map_str = "([\n";

    foreach( key, val in source){
        if(intp(val)){
            map_str += identify(key) + " : " + val +",\n";
        }
        else if(stringp(val) && last(val,1) == "'" && first(val,1) == "'"){
            val = replace_string(val,"'","");
            map_str += identify(key) + " : " + val +",\n";
        }
        else
            map_str += identify(key) + " : " + identify(val) +",\n";
    }
    map_str += "])";
    return map_str;
}



string eventReadThing(string map){
    // This doesn't actually work yet, and perhaps never will,
    // but I'm leaving it here to remind myself to fix it.
    // -Crat

    string new_string;
    int i, iterations;
    string *arr;
    string *new_arr = ({});

    new_string = "";
    arr = explode(map,":");

    foreach(string element in arr){
        string s1, s2, type;
        int num;
        if(!sizeof(new_arr)) new_arr = ({ replace_string(element,"\"", "") });
        else if(sizeof(element) && element != ""){

            if(sscanf(element,"%d ,%s",num,s1) != 2) {
                sscanf(element,"%d,%s",num,s1);
                type = "int";
            }
            if(!s1 || s1 == "") { 
                sscanf(element,"(:%s:)%s", s1, s2);
                type = "function";
            }
            if(!s2 || s2 == "") {
                sscanf(element,"([%s])%s", s1, s2);
                type = "mapping";
            }
            if(!s2 || s2 == "") {
                sscanf(element,"\"%s\"%s", s1, s2);
                type = "string";
            }
            if(!s2 || s2 == "") {
                s1 = element;
                type = "null";
            }

            if(!type || type == ""){
                write("Whoops! An incomprehensible error occurs.");
                return "";
            }

            if(type == "int") new_arr += ({ ""+num });
            else if(type == "function") new_arr += ({ "(: "+s1+" :)" });
            else if(type == "mapping") new_arr += ({ "([ "+s1+" ])" });
            else if(type == "string") new_arr += ({ "\""+s1+"\"" });
            else if(type == "null") new_arr += ({ replace_string(s1,",","",1) });
        }
    }

    iterations = sizeof(new_arr);

    for( i = 0; i < (iterations -2) ; i = i+2  ){
        new_string += new_arr[i]+" : "+new_arr[i+1]+",\n"; 
    }
    new_string += new_arr[iterations -1]+"\n";

    new_string += "])";

    return new_string;
}

int eventSpecialMapHandler(object ob, string func, mixed mode, mixed value){
    string tmp, filename, func2, junk, junk2;
    string *plural_maps;
    int integer;
    mapping NewMap = ([]);
    mapping FirstMap = ([]);
    mapping SecondMap = ([]);

    plural_maps = ({ "SetProperties" });
    if(stringp(value)) value = trim(replace_string(value,mode,""));

    if(stringp(value) && !grepp(lower_case(func),"prop") ){
        if(sscanf(value,"%d",integer) != 1 && 
          sscanf(value,"%d %s",integer,junk) != 2) {
            sscanf(value,"%s %s",tmp,junk);
            if(!tmp || !junk) value = 0;
            else if(sscanf(junk,"%d",integer) != 1) sscanf(junk,"%d %s",integer,junk2);
            if(tmp) mode += " "+tmp;
        } 
        if(integer) value = integer;
        else value = 0;
        if(!intp(value)) value = 0;
    }

    else {
        if(sscanf(value,"%s %s",tmp, junk) == 2){
            mode += " "+tmp;
            value = trim(junk);
        }
    }

    filename = base_name(ob)+".c";
    if(!check_privs(this_player(),filename)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return 1;
    }
    if(!mode || !value){
        write("Invalid entry. Modification cancelled.");
        return 1;
    }

    globalstr = filename;
    unguarded( (: globalstr2 = read_file(globalstr) :) );


    switch(func){
    case "SetProperties" : func2 = "SetProperty";break;
    case "SetSkills" : func2 = "SetSkill";break;
    case "SetStats" : func2 = "SetStat";break;
    }

    FirstMap = this_object()->eventReadPair(filename, func2, 1);
    SecondMap = this_object()->eventReadMapping(filename, ({ func }), 1);
    NewMap = add_maps(FirstMap, SecondMap);
    if(stringp(value) && sscanf(value,"%d",integer) == 1) {
        NewMap[mode] = integer;
    }
    else NewMap[mode] = value;
    globaltmp = generate_tmp(ob);
    unguarded( (: write_file(globaltmp,globalstr2,1) :) );

    if(member_array(func,plural_maps) != -1) 
        this_object()->eventResumeMappingChange(ob,globaltmp,copy(NewMap),func);
    else this_object()->eventAddSettings(ob,globaltmp,copy(NewMap),func2);
    return 1;
}

mapping eventReadPair(string filename, string param, int destructive){
    mixed numerator, denominator;
    int integer;
    string s1, junk, contents, tmp;
    string *file_arr, *line_arr;
    mapping NewMap = ([]);

    if(file_exists(filename) && !check_privs(this_player(),filename)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return ([]);
    }

    globalstr = filename;
    if(file_exists(filename)) {
        unguarded( (: globalstr2 = read_file(globalstr) :) );
    }
    contents = globalstr2;
    file_arr = explode(contents,"\n");
    line_arr = ({});

    foreach(string line in file_arr){
        if(grepp(line,param)) line_arr += ({ line });
    }

    if(!sizeof(line_arr)) return ([]);

    foreach(string element in line_arr){
        element = trim(element);
        if(sscanf(element,param+"(%s);",s1) != -1) sscanf(element,param+"(%s) ;",s1); 
        if(!s1) sscanf(element,param+" (%s);",s1,junk);
        sscanf(s1,"%s,%s",denominator,numerator);
        numerator = trim(numerator);
        denominator = trim(denominator);
        if(sscanf(denominator,"\"%s\"",junk) == 1) denominator = junk;
        if(sscanf(numerator,"%d",integer) == 1) numerator = integer;
        else if(sscanf(numerator,"\"%s\"",junk) == 1) numerator = junk;
        if(stringp(numerator)) numerator = trim(numerator);
        denominator = trim(denominator);
        NewMap[denominator] = numerator;
    }

    if(destructive) {
        globalstr2 = remove_matching_line(globalstr2, param, 1);
        globalstr = generate_tmp();
        unguarded( (: write_file(globalstr,globalstr2,1) :) );
        tmp = globalstr;
        globalstr = filename;
        globalstr2 = tmp;
        unguarded( (: cp(globalstr2, globalstr) :) );
        rm(tmp);
    }
    return copy(NewMap);
}