/*
* r.c [virtual object compiler]
* description: a room description language (rdl) compiler
* history:
* 05/01/92 [truilkan] - created original file
* 12/08/92 [wayfarer] - rewritten to use huthar's generic compiler
* 02/01/93 [truilkan] - modified to work on tmi-2
* todo:
* - add new language features: aliased commands,
* messages to other users via automatic commands
*/
#include <config.h>
inherit "/std/virtual/compiler";
#define ROOM_TEMPLATE "/adm/daemons/virtual/template/room"
/*
* global statics used as state variables
*/
static string state;
static string current_item;
string extension() { return ".r"; }
string default_base_object()
{
return ROOM_TEMPLATE;
}
int base_object(string value, object nothing)
{
int val;
val = (int)this_object()->make_target(value);
if (!val) {
write ("Error loading template object "+value + "\n");
return 0;
}
return 1;
}
int description(string value, object ob)
{
ob->set_description(value);
return 1;
}
int name(string value, object ob)
{
ob->set_name(value);
return 1;
}
void add_aliased_exit(string *cmds, string room, object ob)
{
int i;
mapping exits;
exits = ([]);
for (i = 0; i < sizeof(cmds); i++)
exits[cmds[i]] = room;
ob->add_exits(exits);
return;
}
int exit(string value, object ob)
{
string cmd, room, *cmds;
mapping e;
int i;
if (sscanf(value,"%s %s",cmd,room) != 2)
return 2;
if (cmds = explode(cmd,","))
add_aliased_exit(cmds,room,ob);
else {
e = ([]);
e[cmd] = room;
ob->add_exits(e);
}
return 1;
}
// note: should this cause the compile to fail when the object doesn't load?
int obj(string value, object ob)
{
object thing;
string *pf;
pf = path_file(filename);
value = replace_string(value,"./",pf[0] + "/");
thing = new(value);
if (thing)
thing->move(ob);
return 1;
}
int load(string value, object ob)
{
object thing;
string *pf;
pf = path_file(filename);
value = replace_string(value,"./",pf[0] + "/");
thing = call_other(value, "???");
return 1;
}
int light(string value, object ob)
{
int val;
sscanf(value, "%d", val);
ob->set_light(val);
return 1;
}
int action(string value, object ob)
{
return 1;
}
int item(string value, object ob)
{
string *items;
if (current_item) {
write
("*Compile error: didn't finish defining item "+current_item+"\n");
return 2;
}
items = explode(value,",");
if (items && sizeof(items)) {
current_item = items[0];
ob->add_room_item_with_aliases(items[0],items[1..(sizeof(items)-1)]);
} else {
current_item = value;
ob->add_room_item(value);
}
return 1;
}
int item_description(string value, object ob)
{
if (!current_item) {
write ("*Compile error: no item to describe.\n");
return 2;
}
ob->describe_item(current_item,value);
return 1;
}
void item_done()
{
current_item = 0;
}