/
LIB3/
LIB3/D/ADMIN/
LIB3/D/ADMIN/OBJ/
LIB3/D/ADMIN/ROOM/W/
LIB3/D/HOME/
LIB3/D/HOME/CITY/ARENA/
LIB3/D/HOME/CITY/ITEMS/
LIB3/D/HOME/CITY/POSTOFFI/
LIB3/DOC/
LIB3/GLOBAL/SPECIAL/
LIB3/GLOBAL/VIRTUAL/
LIB3/NET/
LIB3/NET/CONFIG/
LIB3/NET/DAEMON/CHARS/
LIB3/NET/GOPHER/
LIB3/NET/INHERIT/
LIB3/NET/OBJ/
LIB3/NET/SAVE/
LIB3/NET/VIRTUAL/
LIB3/OBJ/B_DAY/
LIB3/OBJ/HANDLERS/TERM_TYP/
LIB3/PLAYERS/B/
LIB3/PLAYERS/N/
LIB3/ROOM/
LIB3/SAVE/
LIB3/SAVE/BOARDS/
LIB3/SAVE/ENVIRON/
LIB3/SAVE/POST/
LIB3/STD/COMMANDS/SHADOWS/
LIB3/STD/CREATOR/
LIB3/STD/DOM/
LIB3/STD/EFFECTS/
LIB3/STD/EFFECTS/HEALING/
LIB3/STD/EFFECTS/OTHER/
LIB3/STD/EFFECTS/POISONS/
LIB3/STD/ENVIRON/
LIB3/STD/GUILDS/
LIB3/STD/LIQUIDS/
LIB3/STD/ROOM/
LIB3/STD/TRIGGER/SHADOW/
LIB3/W/
LIB3/W/BANNOR/
LIB3/W/NEWSTYLE/
/* 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 "/open/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 ) )
	{
	    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 );
    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();
}