/* MTF v1.0 Rywfol 990910 */
#include "mtfincl.h";
mapping get_exits(int ypos, int xpos, mixed *map, mapping keys) {
int x, y;
mapping exits = ([ ]);
string *keylist, room;
keylist = keys(keys);
room = map[ypos][xpos][0];
// check the rooms either side of this one.
for(y = -1; y < 2; y++) {
if(y+ypos < 0)
continue;
if(y+ypos >= sizeof(map))
continue;
for(x = -1; x < 2; x++) {
if(x+xpos < 0)
continue;
if(x+xpos >= sizeof(map[y+ypos]))
continue;
if(!x && !y)
continue;
if(map[y+ypos][x+xpos] != 0) {
//debug_printf("Room %s has exit to %d,%d [%d,%d]", room, x+xpos,y+ypos, x, y);
exits[DIRECTIONS[y+1][x+1]] = upper_case(map[y+ypos][x+xpos][3]) +
" + \"" + map[y+ypos][x+xpos][0] + "\"";
}
}
}
// debug_printf("%O", exits);
return exits;
}
int write_this_file(string istring, string dir, string fname, string sname,
mapping exits) {
string str, tmp, exit;
int i;
// debug_printf("Creating %s", fname);
str = "#include \"path.h\";\n\n";
str += "inherit " + istring + ";\n";
str += "\n";
str += "void setup() {\n";
str += " set_short(\"" + sname + "\");\n";
str += " set_long(\"This is " + sname + " it hasn't had its long \"\n";
str += " \"description set yet.\\n\");\n";
str += " set_light( 80 );\n";
// Remove extra exits.
for(i=0; i<sizeof(LIST); i++) {
if(exits[LIST[i]] &&
exits[LIST[(i+1) % sizeof(LIST)]] &&
exits[LIST[(i+2) % sizeof(LIST)]]) {
/* debug_printf("Removing %s[%d] and %s[%d], keeping %s[%d]",
LIST[(i) % sizeof(LIST)], i,
LIST[(i+2) % sizeof(LIST)], i+2,
LIST[(i+1) %sizeof(LIST)], i+1);
*/
map_delete(exits, LIST[(i)]);
map_delete(exits, LIST[(i+2) % sizeof(LIST)]);
}
}
foreach(exit in keys(exits)) {
str += sprintf(" add_exit(\"%s\", %s, \"road\");\n",
exit, exits[exit]);
}
str += "}\n";
if(file_size(dir) != -2) {
// debug_printf("Creating directory %s", dir);
mkdir(dir);
tmp = "#include \"../path.h\"\n";
tmp += "#undef PATH\n";
tmp += "#define PATH __DIR__\n";
write_file(dir + "/path.h", tmp, 1);
}
return write_file( dir + "/" + fname + ".c", str, 1 );
}
mixed *read_map(string mapfile, mapping keys) {
int i, j;
mixed *map;
string *lines;
lines = explode(read_file(mapfile), "\n");
map = allocate(sizeof(lines));
for(i=0; i<sizeof(lines); i++) {
map[i] = allocate(strlen(lines[i]));
for(j=0; j<strlen(lines[i]); j++) {
if(keys[lines[i][j]]) {
// inc the room count.
keys[lines[i][j]][0] = to_int(keys[lines[i][j]][0]) + 1;
// then give this room a filename.
map[i][j] = ({ keys[lines[i][j]][2] + keys[lines[i][j]][0] }) +
keys[lines[i][j]];
} else {
map[i][j] = 0;
}
}
}
log_file("/w/ceres/tmp.log", "%O", map);
return map;
}
// Read the key file into a mapping.
mapping read_keys(string keyfile) {
mapping keys;
string line, *lines;
keys = ([ ]);
lines = explode(read_file(keyfile), "\n");
foreach(line in lines)
keys[line[0]] = explode(line[1..], "\t");
return keys;
}
int map_to_files( string mapfile, string fdir, string keyfile ) {
int tot;
string *file_tmp;
string pstr;
int x, y;
mapping keys;
mixed *temp_map, temp_exits;
if(!mapfile || mapfile == "")
return NO_MAP_FILE;
file_tmp = this_player()->get_files(mapfile);
if(!file_tmp || sizeof(file_tmp) != 1 || file_size(file_tmp[0]) < 1)
return NO_MAP_FILE;
else
mapfile = file_tmp[0];
if(!fdir || fdir == "")
file_tmp = ({ this_player()->query_path() });
else
file_tmp = this_player()->get_files(fdir);
if(!file_tmp || sizeof(file_tmp) != 1 || file_size(file_tmp[0]) != -2)
return NO_FILE_DIR;
else
fdir = file_tmp[0];
if(!keyfile || keyfile == "" )
keyfile = DEFAULT_KEYS;
file_tmp = this_player()->get_files(keyfile);
if(sizeof(file_tmp) != 1 || file_size(file_tmp[0]) < 1)
return NO_KEY_FILE;
else
keyfile = file_tmp[0];
keys = read_keys(keyfile);
temp_map = read_map(mapfile, keys);
// debug_printf("Map read %O", temp_map);
// go through the map line by line.
for(y = 0; y < sizeof(temp_map); y++) {
reset_eval_cost();
for(x = 0; x < sizeof(temp_map[ y ]); x++) {
if(temp_map[y][x] != 0) {
temp_exits = get_exits(y, x, temp_map, keys);
if(sizeof(temp_map[y][x]) < 5) {
// debug_printf("%O", temp_map[y][x]);
return;
}
tot += write_this_file(temp_map[y][x][2],
fdir + "/" + temp_map[y][x][3],
temp_map[y][x][0], temp_map[y][x][4],
temp_exits);
}
}
}
//debug_printf("finished with files.");
pstr = "/* Created at " + ctime( time() ) + " */\n";
pstr += "#define CITY \"" + fdir + "/\"\n";
foreach(x in keys(keys))
pstr += "#define " + upper_case(keys[x][2]) + " CITY + \"" + keys[x][2] +
"/\"\n";
tot += write_file( fdir+ "/path.h", pstr, 1 );
return tot;
}