// room description language (rdl) compiler
// written by Truilkan@TMI - 92/05
// Modified by Buddha@TMI on 5-14-92 for the room_0.
#include <uid.h>
#ifdef DEBUG
#define BUG(x) tell_object(find_player("buddha"),x);
#else
#define BUG(x)
#endif
#define MY_ROOM "/std/room"
int query_prevent_shadow() { return 1; }
object compile_object(string s) {
string *lines;
mapping objects;
mapping exits;
mapping items;
string path, long, short, word, tmp, name, item_name;
int current, max, l, in_item;
object robj;
objects = ([]);
exits = ([]);
items = ([]);
BUG("inside b_server\n");
s += ".b";
if (file_size(s) == -1) return 0;
seteuid(creator_file(s));
robj = new(MY_ROOM);
lines = explode(read_file(s),"\n");
max = sizeof(lines);
in_item = 0;
for (current = 0; current < max; ) {
BUG("line = " + lines[current] + "\n");
if (word = lines[current])
sscanf(lines[current],"%s %*s",word);
switch (word) {
case "//" : // comment
break;
case "}" :
in_item--;
item_name = "";
break;
case "item:" :
sscanf(lines[current],"item: %s",item_name);
current++; // skip the {
in_item++;
items[item_name] = allocate_mapping(2);
break;
case "object:" :
if(sscanf(lines[current],"object: %s %s",name,path) == 2)
objects += ([ name : path ]);
break;
case "exit:" :
if(sscanf(lines[current],"exit: %s %s",name,path) == 2)
exits += ([ name : path ]);
break;
case "light:" :
sscanf(lines[current],"light: %d",l);
robj->set("light", l);
break;
case "long:" :
current++;
for (long = ""; lines[current] != "**"; current++) {
long += lines[current] + "\n";
}
BUG("setting long: " + long);
if (!in_item)
robj->set("long", long);
else {
items[item_name]["long"] = long;
}
break;
case "short:" :
sscanf(lines[current],"short: %s",tmp);
if (!in_item)
robj->set("short", tmp);
else items[item_name]["short"] = tmp;
break;
default :
break;
}
current++;
}
if (keys(exits)) robj->set("exits", exits);
if (keys(items)) robj->set("items", items);
if (keys(objects)) robj->set("objects", objects);
return robj;
}