lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* 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);
}