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 <modules.h>
#include <commands.h>

string tmpfile, contents, globalstr, globalstr1, globalstr2, globalstr3;
string my_room_file, other_room_file, tmpfile;
string my_room_contents, other_room_contents;
string *global_array;

varargs int eventReceiveId(object door, string *id, string cote){
    string ret_id = implode(id,":");
    if(!cote) cote = this_object()->eventEvaluateDoorSide(door);
    this_object()->eventProcessDoor(door, "SetId", ret_id, cote);
    return 1;
} 

mapping GetDoorKeys(string str){
    string dir, junk1, junk2;
    string *lines;
    mapping KeyMap = ([]);

    globalstr = str;
    unguarded( (: global_array = this_object()->eventReadLines(read_file(globalstr)) :) );
    lines = global_array;
    if(!sizeof(lines)) return ([]);
    foreach(string line in lines){
        if(grepp(line, "SetKeys")){
            sscanf(line,"%sKeys(%s,%s",junk1, dir, junk2);
            dir = this_object()->eventCleanString(dir);
            KeyMap[dir] = line;
        }
    }

    return copy(KeyMap);
}

varargs mixed eventChangeDoor(mixed door, string property, mixed value, string cote){
    object porte;
    string *sides, *props;
    string map_string = "";
    int lockable;
    mapping KeyMap = this_object()->GetDoorKeys(door);

    if(stringp(door)) porte = load_object(door);
    else if(objectp(door)) porte = door;

    if(!porte) return 0;

    sides = porte->GetSides();

    foreach(string side in sides){
        mapping TmpMap1 = ([]);
        TmpMap1 = porte->GetSide(side);
        props = keys(TmpMap1);

        switch(property){
        case "SetId" : property = "id";break;
        case "SetLong" : property = "long";break;
        case "SetShort" : property = "short";break;
        case "SetCanLock" : property = "lockable";break;
        case "SetKey" : property = "key";break;
        }
        if(member_array(property, props) != -1 ){
            if(!cote) TmpMap1[property] = value;
            else if(cote && cote == side && property == "id")
                TmpMap1[property] = explode(value,":");
            else if(cote && cote == side) TmpMap1[property] = value;
        }

        if(!TmpMap1["lockable"]) lockable = 0;
        else lockable = TmpMap1["lockable"];
        map_string += "SetSide(\""+side+"\", ([\"id\" : "+identify(TmpMap1["id"])+",\n";
        map_string += "\"short\" : \""+TmpMap1["short"]+"\",\n";
        map_string += "\"long\" : \""+TmpMap1["long"]+"\",\n";
        map_string +="\"lockable\" : "+lockable+" ]) );\n";
        if(property == "key") {
            if(!cote || cote == side) map_string += "SetKeys(\""+side+"\", ({\""+value+"\"}) );\n\n";
            else if(KeyMap[side])  map_string += KeyMap[side] + "\n\n";
        }
        if(property != "key" && KeyMap[side]){
            map_string += KeyMap[side] + "\n\n";
        }
    }

    return map_string;
}

varargs int eventProcessDoor(mixed door, string property, mixed value, string cote){
    object porte;
    int closed, locked;
    string other_room;

    if(!door || ! property ){
        write("Wrong number of arguments to eventProcessDoor");
        return 0;
    }

    if(!value) value = 0;

    if(objectp(door)) door = base_name(door);
    if(last(door,2) != ".c") door += ".c";
    if(!file_exists(door)){
        write("No such door file.");
        return 0;
    }

    porte = load_object(door);
    tmpfile = generate_tmp(porte);

    if(property == "closed" || property == "SetClosed") closed = value;
    else closed = this_object()->eventReadValue(door, "SetClosed");
    if(property == "locked" || property == "SetLocked") locked = value;
    else locked = this_object()->eventReadValue(door, "SetLocked");;

    contents = "#include <lib.h>\n\n";
    contents += "inherit LIB_DOOR;\n\n";
    contents += "static void create() {\n";
    contents += "door::create();\n\n";
    if(cote) contents += this_object()->eventChangeDoor(door, property, value, cote)+"\n";
    else contents += this_object()->eventChangeDoor(door, property, value)+"\n";
    contents += "SetClosed("+closed+");\n";
    contents += "SetLocked("+locked+");\n";
    contents += "}\n";
    unguarded( (: write_file(tmpfile,contents,1) :) );
    this_object()->eventGeneralStuff(tmpfile);
    globalstr2 = door;
    unguarded( (: cp(tmpfile, globalstr2) :) );
    unguarded( (: rm(tmpfile) :) );
    reload(door);
    reload(environment(this_player()));
    other_room = this_object()->GetOtherRoom(door);
    if(other_room) reload(other_room);
    return 1;
}

int eventDeleteDoor(string door){
    string this_room, other_room;
    this_room = base_name(environment(this_player()))+".c";
    other_room = this_object()->GetOtherRoom(door)+".c";
    foreach( string room in ({this_room, other_room}) ){
        globalstr = room;
        unguarded( (: globalstr2 = read_file(globalstr) :) );
        globalstr2 = remove_matching_line(globalstr2, door);
        globalstr3 = generate_tmp(load_object(door));
        unguarded( (: write_file(globalstr3, globalstr2, 1) :) );
        unguarded( (: cp(globalstr3, globalstr) :) );
        unguarded( (: rm(globalstr3) :) );
        reload(room);
    }
    return 1;
}

string GetOtherRoom(string door){
    string other_room, dir_str;
    foreach(string dir in environment(this_player())->GetDoors()){
        if(grepp(environment(this_player())->GetDoor(dir), door)) dir_str =
            dir;
    }
    other_room = environment(this_player())->GetExit(dir_str);
    if(other_room) return other_room;
    else return "";
}

string eventEvaluateDoorSide(object door){
    string *door_array, *door_sides;
    string dir_str, ret_str;

    door_array = environment(this_player())->GetDoors();
    door_sides = door->GetSides();

    foreach(string dir in door_array){
        if(load_object(environment(this_player())->GetDoor(dir)) == door) dir_str = dir;
    }

    if(!dir_str) return "";

    foreach(string side in door_sides){
        if(side == dir_str) ret_str = side;
    }

    return ret_str;
}

int eventCreateDoor(string dir, string filename){
    object my_room, other_room;
    object *everyone_here, *everyone_there;
    string *temp_array = ({});
    string contents, rep_str, opp_dir, new_line;

    tmpfile = generate_tmp(filename);

    my_room = environment(this_player());
    my_room_file = base_name(my_room)+".c";
    other_room_file = my_room->GetExit(dir)+".c";
    if(!file_exists(other_room_file)) {
        tell_room(my_room,"The new door fades away and disappears.");
        return 0;
    }
    unguarded( (: my_room_contents = read_file(my_room_file) :) );
    unguarded( (: other_room_contents = read_file(other_room_file) :) );
    other_room = load_object(other_room_file);
    everyone_here = get_livings(my_room,1);
    everyone_there = get_livings(other_room,1);

    contents = read_file("/obj/door.c");

    if(grepp(contents,"DIR_X")) rep_str = "X";
    else rep_str = "Y";

    contents = replace_string(contents, "DIR_"+rep_str, dir);
    contents = replace_string(contents, rep_str+"_SIDE", dir);

    opp_dir = opposite_dir(dir);
    if(opp_dir && opp_dir != "" && grepp(contents,"DIR_Y")){
        rep_str = "Y";
        contents = replace_string(contents, "DIR_"+rep_str, opp_dir);
        contents = replace_string(contents, rep_str+"_SIDE", opp_dir);
    }

    temp_array = explode(my_room_contents,"\n");
    foreach(string line in temp_array) {
        if(grepp(line,"SetDoor")){
            if(grepp(line,truncate(filename,2)) || grepp(line,"\""+dir+"\"")){
                my_room_contents = remove_matching_line(my_room_contents, line);
            }
        }
    }

    new_line = "SetDoor(\""+dir+"\", \""+filename+"\");";
    my_room_contents = this_object()->eventAppendLast(my_room_contents,"create", "\n"+new_line+"\n");

    temp_array = explode(other_room_contents,"\n");
    foreach(string line in temp_array) {
        if(grepp(line,"SetDoor")){
            if(grepp(line,truncate(filename,2)) || grepp(line,"\""+opp_dir+"\"")){
                other_room_contents = remove_matching_line(other_room_contents, line);
            }
        }
    }

    new_line = "SetDoor(\""+opp_dir+"\", \""+filename+"\");";
    other_room_contents = this_object()->eventAppendLast(other_room_contents,"create","\n"+new_line+"\n");

    globalstr2 = filename;
    globalstr3 = contents;

    unguarded( (: write_file( tmpfile, globalstr3,1 ) :) );
    this_object()->eventGeneralStuff(tmpfile);
    unguarded( (: cp(tmpfile, globalstr2) :) );

    globalstr3 = my_room_contents;
    unguarded( (: write_file( tmpfile, globalstr3,1 ) :) );
    this_object()->eventGeneralStuff(tmpfile);
    unguarded( (: cp(tmpfile, my_room_file) :) );

    globalstr3 = other_room_contents;
    unguarded( (: write_file( tmpfile, globalstr3,1 ) :) );
    this_object()->eventGeneralStuff(tmpfile);
    unguarded( (: cp(tmpfile, other_room_file) :) );

    reload(filename);
    reload(my_room_file);
    reload(other_room_file);

    unguarded( (: rm(tmpfile) :) );

    return 1;


}