dsII/extra/wolfpaw/
dsII/lib/cmds/admins/
dsII/lib/cmds/common/
dsII/lib/cmds/creators/include/
dsII/lib/cmds/creators/include/SCCS/
dsII/lib/daemon/services/
dsII/lib/doc/
dsII/lib/domains/Ylsrim/
dsII/lib/domains/Ylsrim/adm/
dsII/lib/domains/Ylsrim/armor/
dsII/lib/domains/Ylsrim/broken/
dsII/lib/domains/Ylsrim/fish/
dsII/lib/domains/Ylsrim/meal/
dsII/lib/domains/Ylsrim/npc/
dsII/lib/domains/Ylsrim/virtual/
dsII/lib/domains/Ylsrim/weapon/
dsII/lib/domains/campus/adm/
dsII/lib/domains/campus/etc/
dsII/lib/domains/campus/meals/
dsII/lib/domains/campus/npc/
dsII/lib/domains/campus/txt/
dsII/lib/domains/campus/txt/ai/charles/
dsII/lib/domains/campus/txt/ai/charles/bak2/
dsII/lib/domains/campus/txt/ai/charles/bak2/bak1/
dsII/lib/domains/campus/txt/ai/charly/
dsII/lib/domains/campus/txt/ai/charly/bak/
dsII/lib/domains/campus/txt/jenny/
dsII/lib/domains/default/creator/
dsII/lib/domains/default/doors/
dsII/lib/domains/default/etc/
dsII/lib/domains/default/weap/
dsII/lib/domains/town/doors/
dsII/lib/domains/town/txt/
dsII/lib/domains/town/virtual/
dsII/lib/lib/comp/
dsII/lib/lib/lvs/
dsII/lib/lib/user/
dsII/lib/lib/virtual/
dsII/lib/log/archive/
dsII/lib/log/chan/
dsII/lib/log/errors/
dsII/lib/log/open/
dsII/lib/obj/book_source/
dsII/lib/obj/include/
dsII/lib/realms/template/
dsII/lib/realms/template/area/armor/
dsII/lib/realms/template/area/npc/
dsII/lib/realms/template/area/obj/
dsII/lib/realms/template/area/room/
dsII/lib/realms/template/area/weap/
dsII/lib/realms/template/bak/
dsII/lib/realms/template/cmds/
dsII/lib/save/
dsII/lib/save/kills/o/
dsII/lib/secure/cfg/
dsII/lib/secure/cfg/classes/
dsII/lib/secure/cfg/races/SCCS/
dsII/lib/secure/cmds/creators/include/
dsII/lib/secure/cmds/players/
dsII/lib/secure/cmds/players/include/
dsII/lib/secure/daemon/include/
dsII/lib/secure/lib/
dsII/lib/secure/lib/include/
dsII/lib/secure/lib/net/
dsII/lib/secure/lib/net/include/
dsII/lib/secure/lib/std/
dsII/lib/secure/modules/
dsII/lib/secure/npc/
dsII/lib/secure/obj/include/
dsII/lib/secure/room/
dsII/lib/secure/save/boards/
dsII/lib/secure/save/postal/c/cratylus/
dsII/lib/secure/save/votes/
dsII/lib/secure/tmp/
dsII/lib/secure/verbs/creators/
dsII/lib/shadows/
dsII/lib/spells/
dsII/lib/tmp/
dsII/lib/verbs/admins/include/
dsII/lib/verbs/common/
dsII/lib/verbs/common/include/
dsII/lib/verbs/creators/include/
dsII/lib/verbs/players/include/SCCS/
dsII/lib/verbs/rooms/
dsII/lib/verbs/rooms/include/
dsII/lib/www/
dsII/v22.2b14/
dsII/v22.2b14/Win32/
dsII/v22.2b14/compat/
dsII/v22.2b14/compat/simuls/
dsII/v22.2b14/testsuite/
dsII/v22.2b14/testsuite/clone/
dsII/v22.2b14/testsuite/command/
dsII/v22.2b14/testsuite/data/
dsII/v22.2b14/testsuite/etc/
dsII/v22.2b14/testsuite/include/
dsII/v22.2b14/testsuite/inherit/
dsII/v22.2b14/testsuite/inherit/master/
dsII/v22.2b14/testsuite/log/
dsII/v22.2b14/testsuite/single/
dsII/v22.2b14/testsuite/single/tests/compiler/
dsII/v22.2b14/testsuite/single/tests/efuns/
dsII/v22.2b14/testsuite/single/tests/operators/
dsII/v22.2b14/testsuite/u/
dsII/v22.2b14/tmp/
dsII/win32/
/*    /lib/virtual/virt_map.c
 *    From DeadSouls Object Library
 *    Provides a map for map based virtual rooms
 *    Created by Dvarsk 980310
 *    Version: @(#) virt_map.c 1.3@(#)
 *    Last modified: 98/08/25
 */      

#include <lib.h>

inherit LIB_DAEMON;

private mapping Location=([]);
private mixed AreaMap;
private string Virt_Room= "";

/******************* virt_map.c required overrides ************/

varargs string array BaseMap(){ //override with actual map
    return 
    ({
      //   0
      //   012
      ({"000",//0
	"010",//1
	"000",//2
      })});
}

/******************* virt_map.c attributes ********************/

int *GetLocations(string str){return Location[str]; }

varargs mixed GetAreaMap(int x, int y, int z){ 
    if(nullp(x) || nullp(y) || nullp(z)) return copy(AreaMap);
    if(	   x<0 
      || y<0 
      || z<0
      || z>sizeof(AreaMap)
      || y>sizeof(AreaMap[0])
      || x>sizeof(AreaMap[0][0]))
	return "0";
    return copy(AreaMap[z][y][x..x]);

}

varargs mixed SetAreaMap(int y,int x ,int z, string str){
    if(nullp(x)||nullp(y)||nullp(z)){
	string x_line="";
	string * y_line=({});
	AreaMap=BaseMap();
	z=sizeof(AreaMap);
	y=sizeof(AreaMap[0]);
	x=sizeof(AreaMap[0][0]);
	while (x --) x_line += "0";
	while (y --) y_line += ({x_line});
	return AreaMap = ({y_line}) +AreaMap + ({y_line});
    }
    else return AreaMap[z][y][x..x]=str;
}

int SetVirtFile( string file){
    string str;
    if( str = catch(call_other(file, "???")) ) {
	if( creatorp() ) message("error", str, previous_object());
	return 0;
    }
    Virt_Room=file+"/";
    SetAreaMap();
    return 1;
}

/******************* virt_map.c events ************************/

int * RecurseLocations(){
    mixed map=GetAreaMap();
    int *locat;
    int z=random(sizeof(map)-2)+1;
    int y=random(sizeof(map[z]));
    int x=random(sizeof(map[z][y]));

    if(map[z][y][x..x]!="1") 
	return RecurseLocations(); // Is it within the general land?
    foreach(string tmp in keys(Location)){ //Is something else here?
	locat=Location[tmp];
	if(locat[0]==x && locat[1]==y && locat[2]==z) 
	    return RecurseLocations(); 
    }
    return ({x,y,z});
}

varargs void InitializeLocations(string tmp){
    if(!nullp(tmp)){
	if(!Location[tmp][0] && !Location[tmp][1] 
	  && !Location[tmp][2])
	    Location[tmp]=RecurseLocations(); 
	SetAreaMap(Location[tmp][1], Location[tmp][0], 
	  Location[tmp][2], tmp);
	(Virt_Room+(Location[tmp][0] ) + "," 
	  + (Location[tmp][1]) + ","
	  + (Location[tmp][2]))->ResetLocation();
    }
    else foreach(tmp in keys(Location)){
	Location[tmp]=RecurseLocations();
	SetAreaMap(Location[tmp][1], Location[tmp][0],
	  Location[tmp][2], tmp);
	(Virt_Room+(Location[tmp][0] ) + "," + (Location[tmp][1])
	  + "," +(Location[tmp][2]))->ResetLocation(); 
    }

}

// call this if all the locations randomly move around
void SwitchLocations(){
    int * old_location;
    mixed areas=BaseMap();

    foreach(string tmp in keys(Location)){
	if(Location[tmp][3]) continue;
	old_location=copy(Location[tmp]);
	Location[tmp]=({0,0,0}); 
	SetAreaMap(old_location[1], old_location[0], 
	  old_location[2], areas[(old_location[2]-1)]
	  [old_location[1]][old_location[0]..old_location[0]]);
	Location[tmp]=RecurseLocations();
	(Virt_Room + (old_location[0]) + ","
	  + (old_location[1]) + "," 
	  + (old_location[2]))->ResetLocation();
	SetAreaMap(Location[tmp][1], Location[tmp][0],
	  old_location[2], tmp);
	(Virt_Room + (Location[tmp][0] ) + ","
	  + (Location[tmp][1]) + "," 
	  + (old_location[2]))->ResetLocation();

    }
}

/******************* virt_map.c driver applies ****************/

varargs static void create(string virt_file) {
    daemon::create();
    SetNoClean(1);
    if(!nullp(virt_file)) SetVirtFile(virt_file);
    else SetVirtFile(base_name(this_object()));
}

/******************* virt_map.c optional settings *************/

// AddLocation(string str, int array where)
// string = unique identifier
// where==({0,0,0}) will randomly place the location

int AddLocation(string str, int array where){ 
    if(!nullp(Location[str])) return 0;
    Location[str]=where; 
    InitializeLocations(str);
    return 1;
}

int RemoveLocation(string str){ 
    int * location=Location[str];
    mixed areas=BaseMap();
    if(nullp(location)) return 0;
    SetAreaMap(location[1],location[0],location[2],
      areas[(location[2]-1)][location[1]]
      [location[0]..location[0]]);
    (Virt_Room + (location[0] ) + ","
      + (location[1]) + "," 
      + (location[2]))->ResetLocation();
    map_delete(Location,str);
    return 1;
}