#include <lib.h>
#include <daemons.h>
#include <save.h>
#define FLOW_DEBUGGING 0
inherit LIB_DAEMON;
mapping MapMap, MapCache;
static int caching = 0;
void create(){
if( file_size( SAVE_MAP __SAVE_EXTENSION__ ) > 0 )
unguarded( (: restore_object, SAVE_MAP, 1 :) );
set_heart_beat(300);
}
void zero(){
MapMap = ([]);
MapCache = ([]);
}
void heart_beat(){
unguarded( (: save_object(SAVE_MAP, 1) :) );
}
int eventDestruct(){
unguarded( (: save_object(SAVE_MAP, 1) :) );
return daemon::eventDestruct();
}
int RemoveCache(string str){
if(MapCache && MapCache[str]){
MapCache[str] = 0;
return 1;
}
return 0;
}
int SetCaching(int x){
if(x) caching = 1;
else caching = 0;
return caching;
}
int GetCaching(){
return caching;
}
varargs mixed GetMap(mixed args, int size) {
string ret = "";
int i,x,line,tempy,tmpres, res = size;
mapping Lines = ([]);
mapping myspot;
string mycoords;
mapping start;
//tc(identify(previous_object())+" asked for a map of "+identify(args),"cyan");
if(!args) args = base_name(environment(this_player()));
if(objectp(args)) args = base_name(args);
myspot=ROOMS_D->GetGridMap(args);
mycoords = myspot["coord"];
if(size) res = size;
if(!MapCache) MapCache = ([]);
if(!myspot["coords"] || ( mycoords == "0,0,0" &&
ROOMS_D->GetRoomZero() != args )){
ret = "%^RED%^Map unavailable.%^RESET%^";
return ret;
}
if(caching && MapCache[mycoords]){
return MapCache[mycoords];
}
start = ([ "x" : myspot["coords"]["x"] - (res/2),
"y" : myspot["coords"]["y"] + (res/2),
"z" : myspot["coords"]["z"] ]);
if(!MapMap) MapMap = ([]);
if(sizeof(MapMap) >= 64000) MapMap = ([]);
for(tempy = start["y"]; tempy > start["y"] - res; tempy--){
mapping ppos = ([]);
int xcount;
line+=2;
for(tmpres = start["x"];tmpres < start["x"] + res;tmpres++){
string room, coord = tmpres+","+tempy+","+start["z"];
mixed tmp = ROOMS_D->GetGrid(coord);
xcount+=2;
if(tmp){
room = tmp["room"];
MapMap[coord] = ([ "name" : room ]);
}
if(!Lines[line]){
string pre = (tempy > -1 ? " " : "");
Lines[line] = pre + (tempy % 10) + repeat_string(" ",60);
}
if(!Lines[line+1]){
Lines[line+1] = " " + repeat_string(" ",60);
}
if(!Lines[line-1]){
Lines[line-1] = " " + repeat_string(" ",60);
}
if(MapMap[coord]){
mapping gridmap;
mapping dirs;
object croom;
if(!MapMap[coord]["name"]) continue;
gridmap = ROOMS_D->GetGridMap(MapMap[coord]["name"]);
if(!sizeof(gridmap)) continue;
if(gridmap["exits"]) dirs = gridmap["exits"];
if(mycoords == coord){
Lines[line][xcount+2] = '@';
}
else {
#if FLOW_DEBUGGING
object flow;
croom = find_object(MapMap[coord]["name"]);
if(croom && flow = present("flow",croom)){
int press = flow->GetPressure();
if(press == 1) Lines[line][xcount+2] = '1';
if(press == 2) Lines[line][xcount+2] = '2';
if(press == 3) Lines[line][xcount+2] = '3';
if(press == 4) Lines[line][xcount+2] = '4';
if(press > 4) Lines[line][xcount+2] = '5';
}
else Lines[line][xcount+2] = '#';
#else
Lines[line][xcount+2] = '#';
#endif
}
Lines[line][xcount+3] = ' ';
if(sizeof(dirs)){
foreach(string dir in keys(dirs)){
switch(dir){
case "north" :
if(Lines[line-1])
Lines[line-1][xcount+2] = '|';
break;
case "south" :
if(Lines[line+1])
Lines[line+1][xcount+2] = '|';
break;
case "east" :
Lines[line][xcount+3] = '-';
break;
case "west" :
Lines[line][xcount+1] = '-';
break;
case "northeast" :
if(Lines[line-1]){
if(Lines[line-1][xcount+3] == '\\')
Lines[line-1][xcount+3] = 'X';
else
Lines[line-1][xcount+3] = '/';
}
break;
case "northwest" :
if(Lines[line-1]){
if(Lines[line-1][xcount+1] == '/')
Lines[line-1][xcount+1] = 'X';
else
Lines[line-1][xcount+1] = '\\';
}
break;
case "southeast" :
if(Lines[line+1]){
if(Lines[line+1][xcount+3] == '/')
Lines[line+1][xcount+3] = 'X';
else
Lines[line+1][xcount+3] = '\\';
}
break;
case "southwest" :
if(Lines[line+1]){
if(Lines[line+1][xcount+1] == '\\')
Lines[line+1][xcount+1] = 'X';
else
Lines[line+1][xcount+1] = '/';
}
break;
}
}
}
}
else {
}
}
xcount = 0;
}
if(line == size * 2 ){
int xcount = size;
string pre;
x = start["x"]-1;
Lines[line] = repeat_string(" ",60);
Lines[line+1] = " ";
while(xcount){
x++;
if(x < 0) pre = "-";
else pre = " ";
Lines[line+1] += pre + abs((x % 10));
xcount--;
}
//Lines[line-0] = repeat_string("-0",30);
//Lines[line+1] = repeat_string("+1",30);
Lines[line+2] = repeat_string("+2",30);
}
for(i = sizeof(Lines), x = 0;x < i;x++){
if(Lines[x]) ret += Lines[x]+"\n";
}
ret = replace_string(ret,"@","%^RED%^@%^RESET%^");
#if FLOW_DEBUGGING
ret = replace_string(ret,"1","%^GREEN%^A%^RESET%^");
ret = replace_string(ret,"2","%^YELLOW%^B%^RESET%^");
ret = replace_string(ret,"3","%^CYAN%^C%^RESET%^");
ret = replace_string(ret,"4","%^BLUE%^D%^RESET%^");
ret = replace_string(ret,"5","%^MAGENTA%^F%^RESET%^");
#endif
MapCache[mycoords] = ret;
return ret;
}