/* Do not remove the headers from this file! see /USAGE for more info. */
// Onyx @ Red Dragon Nov. 1995.
// Demmius @ Brelly's Home updated it for LIMA 0.9r12 June 1996.
// Servo@MudX fixed write_mapping() to handle quotation marks August 1996
// Roommaker for Lima muds.
#include <menu.h>
#include <mudlib.h>
#include <playerflags.h>
#include <commands.h>
#include <security.h> /* ### for now */
#include <edit.h>
inherit MENUS;
inherit M_ACCESS; /* ### for now */
private string lng = "";
private string fpath;
private string fname = "RoomMaker.c";
private string shrt = "RoomMaker Room";
private string wethr = "ROOM";
private int lite = 1;
private int wthr =0;
private mapping xits = ([]);
private mapping tems = ([]);
private mapping bjects = ([]);
private string *clude = ({});
#define RM_VER "v0.9.1"
MENU toplevel;
// submenus of the toplevel (build) menu
MENU roommenu;
// sub menus of the roommenu
MENU itemmenu;
MENU objectmenu;
MENU exitmenu;
MENU filemenu;
MENU descmenu;
MENU_ITEM N_QUIT;
MENU_ITEM goto_main_menu_item;
MENU_ITEM goto_room_menu_item;
MENU_ITEM main_seperator;
// Right now, I'm too lazy to code in a help command, and this menu
// should be pretty self-explanatory anyway.
void get_include(string str){
if ((str[0] != '<') && (str[0] != '"')) str = "<"+str+">";
if (member_array(str,clude) != -1) return;
write (str + "\n");
clude +=({str});
}
void prompt_get_include(){
get_input_then_call((:get_include:),"What file would you like to include? ");
}
void set_fname(string str){
fname = str;
write("File name changed to "+fname+"\n\n");
}
void prompt_set_fname(){
get_input_then_call((: set_fname :),"Change file name to what? ");
}
void set_fpath(string str){
fpath = str;
if (fpath[strlen(fpath)-1] != '/')
fpath+="/";
write("File path changed to "+fpath+"\n\n");
}
void prompt_set_fpath(){
get_input_then_call((: set_fpath :),"Change path name to what? ");
}
void change_light(string str){
sscanf(str,"%d",lite);
write("New light level is "+lite+".\n\n");
}
void prompt_change_light(){
get_input_then_call((: change_light :),"Change light level to what? ");
}
void change_weather(string str){
sscanf(str,"%d",wthr);
if(wthr) wethr = "OUTDOOR_ROOM";
write("New weather is "+wthr+".\n\n");
}
void prompt_change_weather(){
write("Change weather to what?\n");
get_input_then_call((: change_weather :),"(0 for indoors, positive number for outdoors) ");
}
void change_short(string str){
shrt = str;
write("Short desc changed to "+shrt+"\n\n");
}
void prompt_change_short(){
get_input_then_call((: change_short :),"Change short desc to what? ");
}
void make_long(string *long){
write("Long description has been set .\n");
lng = implode(long, "\n");
lng = replace_string(lng, "\"", "\\\"");
}
void change_long(){
write("** Enter long description now **\n");
new(EDIT_OB, EDIT_TEXT, 0, (: make_long :));
}
void idesc(string key, string *item){
write("Item description has been set .\n");
tems[key] = implode(item, "\n");
tems[key] = replace_string(tems[key], "\"", "\\\"");
write("Item "+key+" set to "+tems[key]+"\n\n");
}
void change_idesc(string key){
write("** Enter item description now **\n");
new(EDIT_OB, EDIT_TEXT, tems[key], (: idesc, key :));
}
int is_in_ikey(string check, string key){
mixed key2;
string *expl;
expl = explode(key, ", ");
foreach(key2 in expl)
if (key2 == check) return -1;
return 0;
}
void new_ikey(string str){
tems+=([str : ""]);
change_idesc(str);
}
void prompt_new_ikey(){
get_input_then_call((:new_ikey:),"What would you like the new key to be? ");
}
void list_keys(){
mixed key, value;
write ("Items:\n");
foreach(key, value in tems){
write("Items: "+key+"\n");
write(tems[key]+"\n");
}
}
void new_idesc(string str){
change_idesc(str);
write("Item desc changed to "+tems[str]+"\n\n");
}
void prompt_new_idesc(){
get_input_then_call((: new_idesc :),"Change which keys desc? ");
}
void desc_summary(){
string name;
write("File Name : "+fpath+fname+"\n");
write("Light : "+lite+"\n");
write("Weather : "+wthr+"\n");
write("Short Desc: "+shrt+"\n");
write("Long Desc :\n"+lng+"\n\n");
write("Include Files :\n");
foreach(name in clude)
write(" "+name+"\n");
}
void del_exit(string str){
map_delete(xits,str);
write("Exit "+str+" deleted.\n");
}
void prompt_del_exit(){
get_input_then_call((:del_exit:),"What is the direction of the exit you would like to delete? ");
}
void xdesc(string key, string *item){
write("Exit has been set .\n");
xits[key] = implode(item, "\n");
xits[key] = replace_string(xits[key], "\"", "\\\"");
write("Item "+key+" set to "+xits[key]+"\n\n");
}
void change_exit(string key){
write("** Edit path to room now **\n");
new(EDIT_OB, EDIT_TEXT, xits[key], (: xdesc, key :));
}
void prompt_change_exit(){
get_input_then_call((:change_exit:), "Which exit should be changed? ");
}
void new_exit(string str){
xits += ([str:""]);
change_exit(str);
write ("Added exit "+xits[str]+"\n");
}
void prompt_new_exit(){
get_input_then_call((:new_exit:), "Which direction should the new exit be? ");
}
void del_obj(string str){
map_delete(bjects,str);
write("Object "+str+" deleted.\n");
}
void prompt_del_obj(){
get_input_then_call((:del_obj:),"What is the filename of the object you would like to delete? ");
}
void odesc(string key, string num){
int i;
sscanf(num, "%d", i);
bjects[key] = i;
}
void change_obj(string key){
get_input_then_call((:odesc, key:), "How many times should "+key+" appear?");
}
void prompt_change_obj(){
get_input_then_call((:change_obj:), "Which object should be changed? (please enter the object's file name) ");
}
void new_obj(string str){
bjects += ([str:1]);
change_obj(str);
}
void prompt_new_obj(){
get_input_then_call((:new_obj:), "What is the path to the new object's file? ");
}
void view_objects(){
mixed key,value;
write("Objects:\n");
foreach(key,value in bjects)
write(key + " : " + value + "\n");
}
void view_exits(){
mixed key,value;
write("Exits:\n");
foreach(key,value in xits)
write(key + " : " + value + "\n");
}
string write_mapping( mapping mmap )
{
string retval = "";
mixed *keylist;
if (!sizeof(mmap)) return "";
keylist = keys( mmap );
foreach ( mixed key in keylist ) {
retval = sprintf( "%s\"%s\" : ", retval, key );
if ( intp( mmap[key] ) )
retval = sprintf("%s %d,\n", retval, mmap[key] );
if ( stringp( mmap[key] ) )
retval = sprintf("%s \"%s\",\n", retval, mmap[key] );
}
return retval[0..<3]+"\n";
}
void save_this_room(){
string name;
string afname;
mixed key, value;
string header = "";
afname = fpath+fname;
header += "/* " +fname+"\n";
header += "** Coded by "+this_body()->query_name()+"@"+mud_name()+"\n";
header += "** Code generated with RoomMaker "+RM_VER+" coded by Onyx@RedDragon\n";
header += "** Do not remove this header.\n";
header += "*/\n\n";
foreach (name in clude)
header +="#include "+name+"\n";
header +="\ninherit " + wethr + ";\n\n";
header +="void setup(){\n";
header +=" set_light("+lite+");\n";
header += " set_brief(\"" + shrt + "\");\n";
header +=" set_long(\n";
header +="\"" + lng + "\"";
header +="\n);\n";
foreach (key, value in tems)
header += " add_item(\""+key+"\" , \""+value+"\");\n";
header +=" set_exits( ([\n";
header += write_mapping(xits);
header +=" ]) );\n";
header +=" set_objects( ([\n";
header += write_mapping(bjects);
header +=" ]) );\n";
header +="}";
if (!write_file(afname,header,1)){
printf("Error in writing to file %s (in header)\n", afname);
write("File not saved.\n");
return;
}
write("File saved to "+afname+"\n");
}
void view_room(){
desc_summary();
list_keys();
view_objects();
view_exits();
}
void create() {
set_privilege(1);
toplevel = new_menu(mud_name()+" Build Menu");
roommenu = new_menu("RoomMaker "+RM_VER);
itemmenu = new_menu("Item Menu");
exitmenu = new_menu("Exit Menu");
objectmenu = new_menu("Object Menu");
filemenu = new_menu("File Menu");
descmenu = new_menu("Description Menu");
N_QUIT = new_menu_item("Quit",(:quit_menu_application:),"q");
goto_main_menu_item = new_menu_item("Return to main menu",toplevel,"m");
goto_room_menu_item = new_menu_item("Return to room menu",roommenu, "m");
main_seperator = new_seperator("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
// Add items to the toplevel (build) menu
add_menu_item(toplevel, main_seperator);
add_menu_item(toplevel, new_menu_item("Build a Room", roommenu, "r"));
add_menu_item(toplevel, N_QUIT);
// Add menu items to the roommenu item
add_menu_item(roommenu, main_seperator);
add_menu_item(roommenu, new_menu_item("Edit descriptions",
descmenu, "d"));
add_menu_item(roommenu, new_menu_item("Edit items",
itemmenu, "i"));
add_menu_item(roommenu, new_menu_item("Edit objects",
objectmenu, "o"));
add_menu_item(roommenu, new_menu_item("Edit exits",
exitmenu, "x"));
add_menu_item(roommenu, new_menu_item("Edit file info",
filemenu, "f"));
add_menu_item(roommenu, new_menu_item("View room",
(:view_room:), "v"));
add_menu_item(roommenu, N_QUIT);
add_menu_item(roommenu,goto_main_menu_item);
// Add menu items to the itemmenu item
add_menu_item(itemmenu,main_seperator);
add_menu_item(itemmenu, new_menu_item("Add a new item",
(:prompt_new_ikey:), "a"));
add_menu_item(itemmenu, new_menu_item("View current items",
(:list_keys:), "v"));
add_menu_item(itemmenu, new_menu_item("Edit current descs",
(:prompt_new_idesc:), "e"));
add_menu_item(itemmenu,N_QUIT);
add_menu_item(itemmenu,goto_room_menu_item);
// Add menu items to object menu
add_menu_item(objectmenu,main_seperator);
add_menu_item(objectmenu, new_menu_item("Add new object",
(:prompt_new_obj:), "a"));
add_menu_item(objectmenu, new_menu_item("Edit current object",
(:prompt_change_obj:), "e"));
add_menu_item(objectmenu, new_menu_item("Remove object",
(:prompt_del_obj:), "r"));
add_menu_item(objectmenu, new_menu_item("View objects",
(:view_objects:), "v"));
add_menu_item(objectmenu,N_QUIT);
add_menu_item(objectmenu,goto_room_menu_item);
// Add menu items to exitmenu;
add_menu_item(exitmenu,main_seperator);
add_menu_item(exitmenu, new_menu_item("Add new exit",
(:prompt_new_exit:), "a"));
add_menu_item(exitmenu, new_menu_item("Edit current exits",
(:prompt_change_exit:), "e"));
add_menu_item(exitmenu, new_menu_item("Remove exit",
(:prompt_del_exit:), "r"));
add_menu_item(exitmenu, new_menu_item("List exits",
(:view_exits:), "v"));
add_menu_item(exitmenu,N_QUIT);
add_menu_item(exitmenu,goto_room_menu_item);
// Add items to filemenu
add_menu_item(filemenu,main_seperator);
add_menu_item(filemenu, new_menu_item("Change file name",
(:prompt_set_fname:), "n"));
add_menu_item(filemenu, new_menu_item("Change file path",
(:prompt_set_fpath:), "p"));
add_menu_item(filemenu, new_menu_item("Write room to file",
(:save_this_room:), "f"));
add_menu_item(filemenu,N_QUIT);
add_menu_item(filemenu,goto_room_menu_item);
/// Add items to descmenu
add_menu_item(descmenu,main_seperator);
add_menu_item(descmenu, new_menu_item("Change light level",
(:prompt_change_light:), "h"));
add_menu_item(descmenu, new_menu_item("Change weather",
(:prompt_change_weather:), "w"));
add_menu_item(descmenu, new_menu_item("Change short description",
(:prompt_change_short:), "s"));
add_menu_item(descmenu, new_menu_item("Change long description",
(:change_long:), "l"));
add_menu_item(descmenu, new_menu_item("Add an include file",
(:prompt_get_include:), "a"));
add_menu_item(descmenu, new_menu_item("View description summary",
(:desc_summary:),"v"));
add_menu_item(descmenu,N_QUIT);
add_menu_item(descmenu,goto_room_menu_item);
fpath = wiz_dir(this_body()) + "/";
}
void start_menu() {
init_menu_application(toplevel);
}