/* object to simplify the creation of normal rooms on the mud */
inherit "std/object";
inherit "obj/roomgen/monster";
inherit "obj/roomgen/armour";
inherit "obj/roomgen/weapon";
inherit "obj/roomgen/object";
inherit "obj/roomgen/item";
inherit "obj/roomgen/alias";
inherit "obj/roomgen/exit";
inherit "obj/roomgen/misc";
#define MAIN_HELP "/doc/roomgen/main_help"
#define SAVE_DIR "/save/roomgen/"
string file_name, temp_file_name, extra_code;
static string tmp_file_name;
void main_menu();
void setup() {
set_short("room generator");
set_long(
"This is a room generator designed to simplify the process of creating "+
"simple rooms, or skeletons for more complex rooms. Version 1.00\n"+
"Usage : make <room name> [recover]\n");
add_adjective("room");
set_name("generator");
add_alias("roomgen");
add_alias("generator");
set_main_plural("roomgens");
add_plural("room generators");
add_plural("generators");
}
void init() {
add_action("make_room", "make");
}
void init_data() {
init_monster_data();
init_armour_data();
init_weapon_data();
init_object_data();
init_item_data();
init_alias_data();
init_exit_data();
init_misc_data();
extra_code = "";
}
void get_file_data(string fname) {
string str, temp;
str = read_file(fname);
parse_misc(str);
parse_exit(str);
parse_item(str);
parse_alias(str);
parse_object(str);
parse_weapon(str);
parse_armour(str);
parse_monster(str);
sscanf(str, "%s/* PLEASE ADD ALL ADITIONAL CODE AFTER THIS LINE */\n%s",
temp, extra_code);
}
int make_room(string str) {
string temp, *path;
if(!str || str == "") {
notify_fail("Usage : make <filename> [recover]\n");
return 0;
}
seteuid(geteuid(this_player()));
init_data();
if(sscanf(str, "%s/%s", temp)) {
string *names;
names = explode(str, "/");
temp_file_name = SAVE_DIR + this_player()->query_name() + "." +
names[sizeof(names) - 1];
}
else {
temp_file_name = SAVE_DIR + this_player()->query_name() + "." + str;
}
if(sscanf(str, "%s recover", file_name) == 1) {
temp_file_name = SAVE_DIR + this_player()->query_name() +
"." + file_name;
if(restore_object(temp_file_name,1)) {
write("recovered " + file_name + "\n");
main_menu();
return 1;
}
else {
notify_fail("no temporary saved file to recover.\n");
return 0;
}
}
str = (string)this_player()->get_path(str);
if(!sscanf(str, "%s.c", temp)) {
str += ".c";
}
file_name = str;
path = explode(file_name, "/");
set_path(implode(path[0..sizeof(path)-2], "/"));
if(file_size(file_name) == -2) {
notify_fail(file_name + " is a directory.\n");
return 0;
}
if(file_size(file_name) != -1) {
write("Reading data from existing file : " + file_name + ".\n");
get_file_data(file_name);
}
main_menu();
return 1;
}
void review() {
review_misc();
review_exit();
review_item();
review_alias();
review_object();
review_weapon();
review_armour();
review_monster();
get_key("main_menu");
}
void generate_file(string fname) {
string str;
str = "";
str += get_room_inherit();
str += "\n#include \"path.h\"\n";
str += object_vars();
str += weapon_vars();
str += armour_vars();
str += monster_vars();
if(num_monsters()) {
str += "make_monsters() {\n" + dump_monsters() + "}\n\n";
}
if(num_objects()) {
str += "make_objects() {\n" + dump_objects() + "}\n\n";
}
if(num_weapons()) {
str += "make_weapons() {\n" + dump_weapons() + "}\n\n";
}
if(num_armours()) {
str += "make_armours() {\n" + dump_armours() + "}\n\n";
}
if(num_armours() || num_weapons() || num_monsters() || num_objects()) {
str += "void reset() {\n";
if(num_objects()) {
str += " make_objects();\n";
}
if(num_monsters()) {
str += " make_monsters();\n";
}
if(num_weapons()) {
str += " make_weapons();\n";
}
if(num_armours()) {
str += " make_armours();\n";
}
str += "}\n\n";
}
str += "void setup() {\n";
str += dump_misc();
str += dump_exits();
str += dump_items();
str += dump_aliases();
str += "}\n\n";
str += "/* PLEASE ADD ALL ADITIONAL CODE AFTER THIS LINE */\n";
str += extra_code;
write("writing file : " + fname + "\n");
if(file_size(fname) >= 0) {
rm(fname);
}
write_file(fname, str);
rm(temp_file_name);
}
void main_menu() {
write("saving temporary file : " + temp_file_name + "\n");
save_object(temp_file_name,1);
write("Please select from the following commands:\n"+
" 1. misc\n"+
" 2. exits\n"+
" 3. items\n"+
" 4. aliases\n"+
" 5. objects\n"+
" 6. monsters\n"+
" edit - drop into ed\n"+
" show - review room and contents\n"+
" init - initialise\n"+
" help - help on how to use the room generator\n"+
" save - save room and exit\n"+
" exit - exit without saving\n"+
"Selection : ");
input_to("handle_main_menu");
}
void handle_main_menu(string str) {
switch(str) {
case "help":
cat(MAIN_HELP);
get_key("main_menu");
return;
case "save":
generate_file(file_name);
rm(temp_file_name);
return;
case "exit":
rm(temp_file_name);
write("Ok.\n");
return;
case "1":
misc_menu();
return;
case "2":
exit_menu();
return;
case "3":
item_menu();
return;
case "4":
alias_menu();
return;
case "5":
object_menu();
return;
case "6":
monster_menu();
return;
case "show":
review();
return;
case "init":
init_data();
return;
case "edit":
tmp_file_name = "/tmp/rgen-"+(string)this_player()->query_name();
generate_file(tmp_file_name);
ed(tmp_file_name, "finish_ed");
return;
case "":
main_menu();
return;
default:
write("Selection : ");
input_to("handle_main_menu");
return;
}
}
string get_name(string str) {
return "this_object()";
}
void finish_ed() {
init_data();
get_file_data(tmp_file_name);
rm(tmp_file_name);
main_menu();
}