mud/lib/daemon/map.c
2020-09-06 05:43:07 -07:00

262 lines
8.5 KiB
C

#include <lib.h>
#include <daemons.h>
#include <save.h>
#define FLOW_DEBUGGING 0
#ifndef MAP_CACHE
#define MAP_CACHE 1
#endif
inherit LIB_DAEMON;
mapping MapMap, MapCache;
static int heart_count = 1, sweepflag, roomcount, caching = 0;
static string SaveFile;
static string *sweeprooms = ({});
void create(){
#if WIZMAP
SaveFile = save_file(SAVE_MAP);
if(!file_exists(SaveFile) && file_exists(old_savename(SaveFile))){
cp(old_savename(SaveFile), SaveFile);
}
if(file_exists(SaveFile)){
RestoreObject(SaveFile, 1);
}
set_heart_beat(1);
#endif
}
void zero(){
MapMap = ([]);
MapCache = ([]);
SaveObject(SaveFile, 1);
}
void heart_beat(){
if(!(heart_count % 900)){ //Every 15 minutes save the cache
SaveObject(SaveFile, 1);
}
if(!(heart_count % 64800)){ //Every 18 hours refresh the cache
if(!sweepflag){
sweepflag = 1;
sweeprooms = keys(MapMap);
}
}
if(sweepflag){
if(sizeof(sweeprooms) <= roomcount){
sweepflag = 0;
roomcount = 0;
return;
}
if(MapMap[sweeprooms[roomcount]]["name"]){
this_object()->GetMap(MapMap[sweeprooms[roomcount]]["name"], 8, 1);
}
else {
map_delete(MapMap, sweeprooms[roomcount]);
map_delete(MapCache, sweeprooms[roomcount]);
}
roomcount++;
}
heart_count++;
}
int eventDestruct(){
SaveObject(SaveFile, 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, int forced){
#if WIZMAP
string ret = "";
int i,x,line,tempy,tmpres, res = size;
mapping Lines = ([]);
mapping myspot;
string mycoords;
mapping start;
if(!(MASTER_D->GetPerfOK())){
return ret;
}
if(!size) size = 4;
if(size > 15 && !creatorp(this_player())) size = 6;
if(!args) args = base_name(environment(this_player()));
if(objectp(args)) args = base_name(args);
myspot=ROOMS_D->GetGridMap(args);
if(!myspot) return 0;
mycoords = myspot["coord"];
res = size;
if(!MapCache) MapCache = ([]);
if(!myspot["coords"] || ( mycoords == "0,0,0" &&
ROOMS_D->GetRoomZero() != args )){
ret = "%^RED%^Map unavailable.%^RESET%^";
return ret;
}
if(!forced && 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+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;
#else
/* Wizmapping not enabled in config.h */
return "";
#endif
}