/****************************************************************************
* Eldhamud Codebase V2.0 *
* ------------------------------------------------------------------------ *
* EldhaMUD code (C) 2003-2008 by Robert Powell (Tommi) *
* EldhaMUD Team: Celest, Altere and Krelowyn *
* ------------------------------------------------------------------------ *
* *
* OasisOLC II for Smaug 1.40 written by Evan Cortens(Tagith) *
* *
* Based on OasisOLC for CircleMUD3.0bpl9 written by Harvey Gilpin *
* *
****************************************************************************
* *
* Room editing module (medit.c) *
* *
****************************************************************************/
#include <stdio.h>
#include <string.h>
#include "./Headers/mud.h"
#include "./Headers/olc.h"
/*------------------------------------------------------------------------*/
/* function prototypes */
int get_rflag args( ( char *flag ) );
DECLARE_DO_FUN( do_redit_reset );
void redit_disp_extradesc_menu args( ( DESCRIPTOR_DATA * d ) );
void redit_disp_exit_menu args( ( DESCRIPTOR_DATA * d ) );
void redit_disp_exit_flag_menu args( ( DESCRIPTOR_DATA * d ) );
void redit_disp_flag_menu args( ( DESCRIPTOR_DATA * d ) );
void redit_disp_sector_menu args( ( DESCRIPTOR_DATA * d ) );
void redit_disp_menu args( ( DESCRIPTOR_DATA * d ) );
void redit_setup_new args( ( DESCRIPTOR_DATA * d ) );
void free_room args( ( ROOM_INDEX_DATA * room ) );
/*-----------------------------------------------------------------------*/
/* Global variable declarations/externals */
/* EXIT_DATA *get_exit_number( ROOM_INDEX_DATA *room, int xit ); */
void oedit_disp_extra_choice args( ( DESCRIPTOR_DATA * d ) );
extern char *const ex_flags[];
extern int top_ed;
/*-----------------------------------------------------------------------*/
void do_oredit( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
DESCRIPTOR_DATA *d;
ROOM_INDEX_DATA *room;
if( IS_NPC( ch ) || !ch->desc )
{
send_to_char( "I don't think so...\n\r", ch );
return;
}
argument = one_argument( argument, arg );
if( argument[0] == STRING_NULL )
room = ch->in_room;
else
{
if( is_number( arg ) )
{
argument = one_argument( argument, arg );
room = get_room_index( atoi( arg ) );
}
else
{
send_to_char( "Vnum must be specified in numbers!\n\r", ch );
return;
}
}
if( !room )
{
send_to_char( "That room does not exist!\n\r", ch );
return;
}
/*
* Make sure the room isnt already being edited
*/
for( d = first_descriptor; d; d = d->next )
if( d->connected == CON_REDIT )
if( d->olc && OLC_VNUM( d ) == room->vnum )
{
ch_printf( ch, "That room is currently being edited by %s.\n\r", d->character->name );
return;
}
if( !can_rmodify( ch, room ) )
return;
do_immtalk( ch, "BrB, Going into Oasis OLC" );
act( AT_ACTION, "$n starts using OLC.", ch, NULL, NULL, TO_ROOM );
d = ch->desc;
CREATE( d->olc, OLC_DATA, 1 );
OLC_VNUM( d ) = room->vnum;
OLC_CHANGE( d ) = FALSE;
d->character->dest_buf = room;
d->connected = CON_REDIT;
redit_disp_menu( d );
return;
}
void do_rcopy( CHAR_DATA * ch, char *argument )
{
return;
}
bool is_inolc( DESCRIPTOR_DATA * d )
{
/*
* safeties, not that its necessary really...
*/
if( !d || !d->character )
return FALSE;
if( IS_NPC( d->character ) )
return FALSE;
/*
* objs
*/
if( d->connected == CON_OEDIT )
return TRUE;
/*
* mobs
*/
if( d->connected == CON_MEDIT )
return TRUE;
/*
* rooms
*/
if( d->connected == CON_REDIT )
return TRUE;
return FALSE;
}
/*
* Log all changes to catch those sneaky bastards =)
*/
/* void olc_log( DESCRIPTOR_DATA *d, char *argument ) */
void olc_log( DESCRIPTOR_DATA * d, char *format, ... )
{
ROOM_INDEX_DATA *room = d->character->dest_buf;
OBJ_DATA *obj = d->character->dest_buf;
CHAR_DATA *victim = d->character->dest_buf;
char logline[MAX_STRING_LENGTH];
va_list args;
if( !d )
{
bug( "olc_log: called with null descriptor", 0 );
return;
}
va_start( args, format );
vsprintf( logline, format, args );
va_end( args );
sprintf( log_buf, "Log %s:", d->character->name );
if( d->connected == CON_REDIT )
sprintf( log_buf, "%s ROOM(%d): ", log_buf, room->vnum );
else if( d->connected == CON_OEDIT )
sprintf( log_buf, "%s OBJ(%d): ", log_buf, obj->pIndexData->vnum );
else if( d->connected == CON_MEDIT )
{
if( IS_NPC( victim ) )
sprintf( log_buf, "%s MOB(%d): ", log_buf, victim->pIndexData->vnum );
else
sprintf( log_buf, "%s PLR(%s): ", log_buf, victim->name );
}
else
{
bug( "olc_log: called with a bad connected state", 0 );
return;
}
sprintf( log_buf, "%s%s", log_buf, logline );
log_string_plus( log_buf, LOG_BUILD, get_trust( d->character ) );
return;
}
/**************************************************************************
Menu functions
**************************************************************************/
/*
* Nice fancy redone Extra Description stuff :)
*/
void redit_disp_extradesc_prompt_menu( DESCRIPTOR_DATA * d )
{
char buf[MAX_STRING_LENGTH];
EXTRA_DESCR_DATA *ed;
ROOM_INDEX_DATA *room = d->character->dest_buf;
int counter = 0;
for( ed = room->first_extradesc; ed; ed = ed->next )
{
sprintf( buf, "&P%2d&w) %-40.40s\n\r", counter++, ed->keyword );
send_to_char_color( buf, d->character );
}
send_to_char( "\n\rWhich extra description do you want to edit? ", d->character );
}
void redit_disp_extradesc_menu( DESCRIPTOR_DATA * d )
{
ROOM_INDEX_DATA *room = d->character->dest_buf;
int count = 0;
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
ch_printf_color( d->character,"&c Extra Descriptions Menu EldhaMUD OLC\n\r", 0 );
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
if( room->first_extradesc )
{
EXTRA_DESCR_DATA *ed;
for( ed = room->first_extradesc; ed; ed = ed->next )
{
ch_printf_color( d->character, "&P%2d&w) Keyword: &O%s\n\r", ++count, ed->keyword );
}
send_to_char( "\n\r", d->character );
}
ch_printf_color( d->character, "&PA&w) Add a new description\n\r" );
ch_printf_color( d->character, "&PR&w) Remove a description\n\r" );
ch_printf_color( d->character, "&PQ&w) Quit\n\r" );
ch_printf_color( d->character, "\n\rEnter choice: " );
OLC_MODE( d ) = REDIT_EXTRADESC_MENU;
}
/* For exits */
void redit_disp_exit_menu( DESCRIPTOR_DATA * d )
{
/*
* char buf[MAX_STRING_LENGTH];
*/
ROOM_INDEX_DATA *room = d->character->dest_buf;
EXIT_DATA *pexit;
int i, cnt, endline;
OLC_MODE( d ) = REDIT_EXIT_MENU;
endline = d->character->pcdata->pagerlen;
for( i = 0; i <= endline; i++ )
{
send_to_char( "\n\r", d->character );
}
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
ch_printf_color( d->character,"&c Exits Menu EldhaMUD OLC\n\r", 0 );
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
for( cnt = 0, pexit = room->first_exit; pexit; pexit = pexit->next )
{
ch_printf_color( d->character,
/*
* sprintf( buf,
*/
"&P%2d&w) %-10.10s to %-5d. Key: %d Flags: %d Keywords: %s.\n\r",
++cnt,
dir_name[pexit->vdir],
pexit->to_room ? pexit->to_room->vnum : 0,
pexit->key, pexit->exit_info, pexit->keyword[0] != STRING_NULL ? pexit->keyword : "(none)" );
}
if( room->first_exit )
send_to_char( "\n\r", d->character );
send_to_char_color( "&PA&w) Add a new exit\n\r", d->character );
send_to_char_color( "&PR&w) Remove an exit\n\r", d->character );
send_to_char_color( "&PQ&w) Quit\n\r", d->character );
send_to_char( "\n\rEnter choice: ", d->character );
return;
}
void redit_disp_exit_edit( DESCRIPTOR_DATA * d )
{
/*
* ROOM_INDEX_DATA *room = d->character->dest_buf;
*/
char flags[MAX_STRING_LENGTH];
EXIT_DATA *pexit = d->character->spare_ptr;
int i;
flags[0] = STRING_NULL;
for( i = 0; i <= MAX_EXFLAG; i++ )
if( pexit->exit_info && IS_SET( pexit->exit_info, i ) )
{
strcat( flags, ex_flags[i] );
strcat( flags, " " );
}
OLC_MODE( d ) = REDIT_EXIT_EDIT;
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
ch_printf_color( d->character,"&c Exits Creation Menu EldhaMUD OLC\n\r", 0 );
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
ch_printf_color( d->character, "&P1&w) Direction : &c%s\n\r", dir_name[pexit->vdir] );
ch_printf_color( d->character, "&P2&w) To Vnum : &c%d\n\r", pexit->to_room ? pexit->to_room->vnum : -1 );
ch_printf_color( d->character, "&P3&w) Key : &c%d\n\r", pexit->key );
ch_printf_color( d->character, "&P4&w) Keyword : &c%s\n\r",
( pexit->keyword && pexit->keyword[0] != STRING_NULL ) ? pexit->keyword : "(none)" );
ch_printf_color( d->character, "&P5&w) Flags : &c%s\n\r", flags[0] != STRING_NULL ? flags : "(none)" );
ch_printf_color( d->character, "&P6&w) Description: &c%s\n\r",
( pexit->description && pexit->description[0] != STRING_NULL ) ? pexit->description : "(none)" );
ch_printf_color( d->character, "&PQ&w) Quit\n\r" );
ch_printf_color( d->character, "\n\rEnter choice: " );
return;
}
void redit_disp_exit_dirs( DESCRIPTOR_DATA * d )
{
int i;
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
ch_printf_color( d->character,"&c Exit Directions EldhaMUD OLC\n\r", 0 );
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
for( i = 0; i <= DIR_SOMEWHERE; i++ )
{
ch_printf_color( d->character, "&P%2d&w) %s\n\r", i, dir_name[i] );
}
send_to_char( "\n\rChoose a direction: ", d->character );
return;
}
/* For exit flags */
void redit_disp_exit_flag_menu( DESCRIPTOR_DATA * d )
{
EXIT_DATA *pexit = d->character->spare_ptr;
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
int i;
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
ch_printf_color( d->character,"&c Flags Menu EldhaMUD OLC\n\r", 0 );
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
for( i = 0; i <= MAX_EXFLAG; i++ )
{
if( ( i == EX_RES1 ) || ( i == EX_RES2 ) || ( i == EX_PORTAL ) )
continue;
ch_printf_color( d->character, "&P%2d&w) %-20.20s\n\r", i + 1, ex_flags[i] );
}
buf1[0] = STRING_NULL;
for( i = 0; i <= MAX_EXFLAG; i++ )
if( IS_SET( pexit->exit_info, i ) )
{
strcat( buf1, ex_flags[i] );
strcat( buf1, " " );
}
sprintf( buf, "\n\rExit flags: &c%s&w\n\r" "Enter room flags, 0 to quit: ", buf1 );
send_to_char_color( buf, d->character );
OLC_MODE( d ) = REDIT_EXIT_FLAGS;
}
/* For room flags */
void redit_disp_flag_menu( DESCRIPTOR_DATA * d )
{
char buf[MAX_STRING_LENGTH];
ROOM_INDEX_DATA *room = d->character->dest_buf;
int counter, columns = 0;
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
ch_printf_color( d->character,"&c Flags Menu EldhaMUD OLC\n\r", 0 );
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
for( counter = 0; counter < ROOM_MAX; counter++ )
{
sprintf( buf, "&P%d&w) %-20.20s ", counter + 1, r_flags[counter] );
if( !( ++columns % 2 ) )
strcat( buf, "\n\r" );
send_to_char_color( buf, d->character );
}
ch_printf_color( d->character, "\n\rRoom flags: &c%s&w\n\rEnter room flags, 0 to quit : ",
ext_flag_string( &room->room_flags, r_flags ) );
OLC_MODE( d ) = REDIT_FLAGS;
}
char *const asector_names[] = {
"inside", "city", "field", "forest", "hills", "mountain", "water_swim",
"water_noswim", "underwater", "air", "desert", "river", "oceanfloor",
"underground", "jungle", "swamp", "tundra", "ice", "ocean", "lava", "shore"
};
/* for sector type */
void redit_disp_sector_menu( DESCRIPTOR_DATA * d )
{
char buf[MAX_STRING_LENGTH];
int counter, columns = 0;
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
ch_printf_color( d->character,"&c Sector Menu EldhaMUD OLC\n\r", 0 );
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
for( counter = 0; counter < 21; counter++ )
{
/* if ( counter == SECT_DUNNO )
continue;
*/
sprintf( buf, "&P%d&w) %-20.20s ", counter, asector_names[counter] );
if( !( ++columns % 2 ) )
strcat( buf, "\n\r" );
send_to_char_color( buf, d->character );
}
send_to_char( "\r\nEnter sector type : ", d->character );
OLC_MODE( d ) = REDIT_SECTOR;
}
/* the main menu */
void redit_disp_menu( DESCRIPTOR_DATA * d )
{
char buf[MAX_STRING_LENGTH];
ROOM_INDEX_DATA *room = d->character->dest_buf;
char *sect;
switch ( room->sector_type )
{
default:
sect = "?";
break;
case SECT_INSIDE:
sect = "Inside";
break;
case SECT_CITY:
sect = "City";
break;
case SECT_FIELD:
sect = "Field";
break;
case SECT_FOREST:
sect = "Forest";
break;
case SECT_HILLS:
sect = "Hills";
break;
case SECT_MOUNTAIN:
sect = "Mountains";
break;
case SECT_WATER_SWIM:
sect = "Swim";
break;
case SECT_WATER_NOSWIM:
sect = "Noswim";
break;
case SECT_UNDERWATER:
sect = "Underwater";
break;
case SECT_AIR:
sect = "Air";
break;
case SECT_DESERT:
sect = "Desert";
break;
case SECT_RIVER:
sect = "River";
break;
case SECT_OCEANFLOOR:
sect = "Oceanfloor";
break;
case SECT_UNDERGROUND:
sect = "Underground";
break;
case SECT_JUNGLE:
sect = "Jungle";
break;
case SECT_SWAMP:
sect = "Swamp";
break;
case SECT_TUNDRA:
sect = "Tundra";
break;
case SECT_ICE:
sect = "Ice";
break;
case SECT_OCEAN:
sect = "Ocean";
break;
case SECT_LAVA:
sect = "Lava";
break;
case SECT_SHORE:
sect = "Shore";
break;
}
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
ch_printf_color( d->character,"&c Main Menu EldhaMUD OLC\n\r", 0 );
ch_printf_color( d->character,"&D--------------------------------------------------------------------------------\n\r");
sprintf( buf,
"&w Room Vnum : [&c%d&w] Zone Name: [&c%-30.30s&w]\n\r"
"&P1&w) Name : &O%s\n\r"
"&P2&w) Description :\n\r &O%s\n\r"
"&P3&w) Room flags : &c%s\n\r"
"&P4&w) Sector type : &c%s\n\r"
"&P5&w) Tunnel : &c%d\n\r"
"&P6&w) TeleDelay : &c%d\n\r"
"&P7&w) TeleVnum : &c%d\n\r"
"&PA&w) Exit menu\n\r"
"&PB&w) Extra descriptions menu\r\n"
"&PQ&w) Quit\r\n"
"Enter choice : ",
OLC_NUM( d ),
room->area ? room->area->name : "None????",
room->name,
room->description,
ext_flag_string( &room->room_flags, r_flags ), sect, room->tunnel, room->tele_delay, room->tele_vnum );
set_char_color( AT_PLAIN, d->character );
send_to_char_color( buf, d->character );
OLC_MODE( d ) = REDIT_MAIN_MENU;
}
EXTRA_DESCR_DATA *redit_find_extradesc( ROOM_INDEX_DATA * room, int number )
{
int count = 0;
EXTRA_DESCR_DATA *ed;
for( ed = room->first_extradesc; ed; ed = ed->next )
{
if( ++count == number )
return ed;
}
return NULL;
}
void do_redit_reset( CHAR_DATA * ch, char *argument )
{
ROOM_INDEX_DATA *room = ch->dest_buf;
EXTRA_DESCR_DATA *ed = ch->spare_ptr;
switch ( ch->substate )
{
case SUB_ROOM_DESC:
if( !ch->dest_buf )
{
/*
* If theres no dest_buf, theres no object, so stick em back as playing
*/
send_to_char( "Fatal error, report to Tagith.\n\r", ch );
bug( "do_redit_reset: sub_obj_extra: NULL ch->dest_buf", 0 );
ch->substate = SUB_NONE;
ch->desc->connected = CON_PLAYING;
return;
}
STRFREE( room->description );
room->description = copy_buffer( ch );
stop_editing( ch );
ch->dest_buf = room;
ch->desc->connected = CON_REDIT;
ch->substate = SUB_NONE;
olc_log( ch->desc, "Edited room description" );
redit_disp_menu( ch->desc );
return;
case SUB_ROOM_EXTRA:
STRFREE( ed->description );
ed->description = copy_buffer( ch );
stop_editing( ch );
ch->dest_buf = room;
ch->spare_ptr = ed;
ch->substate = SUB_NONE;
ch->desc->connected = CON_REDIT;
oedit_disp_extra_choice( ch->desc );
OLC_MODE( ch->desc ) = REDIT_EXTRADESC_CHOICE;
olc_log( ch->desc, "Edit description for exdesc %s", ed->keyword );
return;
}
}
/**************************************************************************
The main loop
**************************************************************************/
void redit_parse( DESCRIPTOR_DATA * d, char *arg )
{
ROOM_INDEX_DATA *room = d->character->dest_buf;
ROOM_INDEX_DATA *tmp;
EXIT_DATA *pexit = d->character->spare_ptr;
EXTRA_DESCR_DATA *ed = d->character->spare_ptr;
char arg1[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int number = 0;
switch ( OLC_MODE( d ) )
{
case REDIT_CONFIRM_SAVESTRING:
switch ( *arg )
{
case 'y':
case 'Y':
/*
* redit_save_internally(d);
*/
sprintf( log_buf, "OLC: %s edits room %d", d->character->name, OLC_NUM( d ) );
log_string_plus( log_buf, LOG_BUILD, d->character->level );
cleanup_olc( d );
send_to_char( "Room saved to memory.\r\n", d->character );
break;
case 'n':
case 'N':
cleanup_olc( d );
break;
default:
send_to_char( "\n\r\n\rInvalid Command Selection!\r\n", d->character );
send_to_char( "Do you wish to save this room internally? : ", d->character );
break;
}
return;
case REDIT_MAIN_MENU:
switch ( *arg )
{
case 'q':
case 'Q':
/*
* if (OLC_CHANGE(d))
* { *. Something has been modified .*
* send_to_char( "Do you wish to save this room internally? : ", d->character );
* OLC_MODE(d) = REDIT_CONFIRM_SAVESTRING;
* }
* else
*/
cleanup_olc( d );
return;
case '1':
send_to_char( "Enter room name:-\r\n| ", d->character );
OLC_MODE( d ) = REDIT_NAME;
break;
case '2':
OLC_MODE( d ) = REDIT_DESC;
d->character->substate = SUB_ROOM_DESC;
d->character->last_cmd = do_redit_reset;
send_to_char( "Enter room description:-\r\n", d->character );
if( !room->description )
room->description = STRALLOC( "" );
start_editing( d->character, room->description );
break;
case '3':
redit_disp_flag_menu( d );
break;
case '4':
redit_disp_sector_menu( d );
break;
case '5':
send_to_char( "How many people can fit in the room? ", d->character );
OLC_MODE( d ) = REDIT_TUNNEL;
break;
case '6':
send_to_char( "How long before people are teleported out? ", d->character );
OLC_MODE( d ) = REDIT_TELEDELAY;
break;
case '7':
send_to_char( "Where are they teleported to? ", d->character );
OLC_MODE( d ) = REDIT_TELEVNUM;
break;
case 'a':
case 'A':
redit_disp_exit_menu( d );
break;
case 'b':
case 'B':
redit_disp_extradesc_menu( d );
break;
default:
send_to_char( "\n\r\n\rInvalid Command Selection!\n\r", d->character );
redit_disp_menu( d );
break;
}
return;
case REDIT_NAME:
STRFREE( room->name );
room->name = STRALLOC( arg );
olc_log( d, "Changed name to %s", room->name );
break;
case REDIT_DESC:
/*
* we will NEVER get here
*/
bug( "Reached REDIT_DESC case in redit_parse", 0 );
break;
case REDIT_FLAGS:
if( is_number( arg ) )
{
number = atoi( arg );
if( number == 0 )
break;
else if( number < 0 || number > ROOM_MAX )
{
send_to_char( "Invalid flag, try again: ", d->character );
return;
}
else
{
number -= 1; /* Offset for 0 */
xTOGGLE_BIT( room->room_flags, number );
olc_log( d, "%s the room flag %s",
xIS_SET( room->room_flags, number ) ? "Added" : "Removed", r_flags[number] );
}
}
else
{
while( arg[0] != STRING_NULL )
{
arg = one_argument( arg, arg1 );
number = get_rflag( arg1 );
if( number > 0 )
{
xTOGGLE_BIT( room->room_flags, number );
olc_log( d, "%s the room flag %s",
xIS_SET( room->room_flags, number ) ? "Added" : "Removed", r_flags[number] );
}
}
}
redit_disp_flag_menu( d );
return;
case REDIT_SECTOR:
number = atoi( arg );
if( number < 0 || number >= SECT_MAX )
{
send_to_char( "\n\r\n\rInvalid Command Selection!\n\r", d->character );
redit_disp_sector_menu( d );
return;
}
else
room->sector_type = number;
olc_log( d, "Changed sector to %s", asector_names[number] );
break;
case REDIT_TUNNEL:
number = atoi( arg );
room->tunnel = URANGE( 0, number, 1000 );
olc_log( d, "Changed tunnel amount to %d", room->tunnel );
break;
case REDIT_TELEDELAY:
number = atoi( arg );
room->tele_delay = number;
olc_log( d, "Changed teleportation delay to %d", room->tele_delay );
break;
case REDIT_TELEVNUM:
number = atoi( arg );
room->tele_vnum = URANGE( 1, number, MAX_VNUM );
olc_log( d, "Changed teleportation vnum to %d", room->tele_vnum );
break;
case REDIT_EXIT_MENU:
switch ( UPPER( arg[0] ) )
{
default:
if( is_number( arg ) )
{
number = atoi( arg );
pexit = get_exit_num( room, number );
if( pexit )
{
d->character->spare_ptr = pexit;
redit_disp_exit_edit( d );
return;
}
}
redit_disp_exit_menu( d );
return;
case '0':
d->character->spare_ptr = NULL;
break;
case 'A':
OLC_MODE( d ) = REDIT_EXIT_ADD;
redit_disp_exit_dirs( d );
return;
case 'R':
OLC_MODE( d ) = REDIT_EXIT_DELETE;
send_to_char( "Delete which exit? ", d->character );
return;
case 'Q':
d->character->spare_ptr = NULL;
break;
}
break;
case REDIT_EXIT_EDIT:
switch ( UPPER( arg[0] ) )
{
case 'Q':
d->character->spare_ptr = NULL;
redit_disp_exit_menu( d );
return;
case '1':
/*
* OLC_MODE(d) = REDIT_EXIT_DIR;
* redit_disp_exit_dirs(d);
*/
send_to_char( "This option can only be changed by remaking the exit.\n\r", d->character );
break;
case '2':
OLC_MODE( d ) = REDIT_EXIT_VNUM;
send_to_char( "Which room does this exit go to? ", d->character );
return;
case '3':
OLC_MODE( d ) = REDIT_EXIT_KEY;
send_to_char( "What is the vnum of the key to this exit? ", d->character );
return;
case '4':
OLC_MODE( d ) = REDIT_EXIT_KEYWORD;
send_to_char( "What is the keyword to this exit? ", d->character );
return;
case '5':
OLC_MODE( d ) = REDIT_EXIT_FLAGS;
redit_disp_exit_flag_menu( d );
return;
case '6':
OLC_MODE( d ) = REDIT_EXIT_DESC;
send_to_char( "Description:\n\r] ", d->character );
return;
}
redit_disp_exit_edit( d );
return;
case REDIT_EXIT_DESC:
if( !arg || arg[0] == STRING_NULL )
pexit->description = STRALLOC( "" );
else
{
sprintf( buf, "%s\n\r", arg );
pexit->description = STRALLOC( buf );
}
olc_log( d, "Changed %s description to %s", dir_name[pexit->vdir], arg ? arg : "none" );
redit_disp_exit_edit( d );
return;
case REDIT_EXIT_ADD:
if( is_number( arg ) )
{
number = atoi( arg );
if( number < DIR_NORTH || number > DIR_SOMEWHERE )
{
send_to_char( "Invalid direction, try again: ", d->character );
return;
}
d->character->tempnum = number;
}
else
{
number = get_dir( arg );
pexit = get_exit( room, number );
if( pexit )
{
send_to_char( "An exit in that direction already exists.\n\r", d->character );
redit_disp_exit_menu( d );
return;
}
d->character->tempnum = number;
}
OLC_MODE( d ) = REDIT_EXIT_ADD_VNUM;
send_to_char( "Which room does this exit go to? ", d->character );
return;
case REDIT_EXIT_ADD_VNUM:
number = atoi( arg );
if( ( tmp = get_room_index( number ) ) == NULL )
{
send_to_char( "Non-existant room.\n\r", d->character );
OLC_MODE( d ) = REDIT_EXIT_MENU;
redit_disp_exit_menu( d );
return;
}
pexit = make_exit( room, tmp, d->character->tempnum );
pexit->keyword = STRALLOC( "" );
pexit->description = STRALLOC( "" );
pexit->key = -1;
pexit->exit_info = 0;
act( AT_IMMORT, "$n reveals a hidden passage!", d->character, NULL, NULL, TO_ROOM );
d->character->spare_ptr = pexit;
olc_log( d, "Added %s exit to %d", dir_name[pexit->vdir], pexit->vnum );
OLC_MODE( d ) = REDIT_EXIT_EDIT;
redit_disp_exit_edit( d );
return;
case REDIT_EXIT_DELETE:
if( !is_number( arg ) )
{
send_to_char( "Exit must be specified in a number.\n\r", d->character );
redit_disp_exit_menu( d );
}
number = atoi( arg );
pexit = get_exit_num( room, number );
if( !pexit )
{
send_to_char( "That exit does not exist.\n\r", d->character );
redit_disp_exit_menu( d );
}
olc_log( d, "Removed %s exit", dir_name[pexit->vdir] );
extract_exit( room, pexit );
redit_disp_exit_menu( d );
return;
case REDIT_EXIT_VNUM:
number = atoi( arg );
if( number < 0 || number > MAX_VNUM )
{
send_to_char( "Invalid room number, try again : ", d->character );
return;
}
if( get_room_index( number ) == NULL )
{
send_to_char( "That room does not exist, try again: ", d->character );
return;
}
pexit->vnum = number;
olc_log( d, "%s exit vnum changed to %d", dir_name[pexit->vdir], pexit->vnum );
redit_disp_exit_menu( d );
return;
case REDIT_EXIT_KEYWORD:
STRFREE( pexit->keyword );
pexit->keyword = STRALLOC( arg );
olc_log( d, "Changed %s keyword to %s", dir_name[pexit->vdir], pexit->keyword );
redit_disp_exit_edit( d );
return;
case REDIT_EXIT_KEY:
number = atoi( arg );
if( number < 0 || number > MAX_VNUM )
send_to_char( "Invalid vnum, try again: ", d->character );
else
{
pexit->key = number;
redit_disp_exit_edit( d );
}
olc_log( d, "%s key vnum is now %d", dir_name[pexit->vdir], pexit->key );
return;
case REDIT_EXIT_FLAGS:
number = atoi( arg );
if( number == 0 )
{
redit_disp_exit_edit( d );
return;
}
if( ( number < 0 ) || ( number > MAX_EXFLAG + 1 )
|| ( 1 << ( number - 1 ) == EX_RES1 )
|| ( 1 << ( number - 1 ) == EX_RES2 ) || ( 1 << ( number - 1 ) == EX_PORTAL ) )
{
send_to_char( "That's not a valid choice!\r\n", d->character );
redit_disp_exit_flag_menu( d );
}
number -= 1;
TOGGLE_BIT( pexit->exit_info, 1 << number );
olc_log( d, "%s %s to %s exit",
IS_SET( pexit->exit_info, 1 << number ) ? "Added" : "Removed", ex_flags[number], dir_name[pexit->vdir] );
redit_disp_exit_flag_menu( d );
return;
case REDIT_EXTRADESC_DELETE:
ed = redit_find_extradesc( room, atoi( arg ) );
if( !ed )
{
send_to_char( "Not found, try again: ", d->character );
return;
}
olc_log( d, "Deleted exdesc %s", ed->keyword );
UNLINK( ed, room->first_extradesc, room->last_extradesc, next, prev );
STRFREE( ed->keyword );
STRFREE( ed->description );
DISPOSE( ed );
top_ed--;
redit_disp_extradesc_menu( d );
return;
case REDIT_EXTRADESC_CHOICE:
switch ( UPPER( arg[0] ) )
{
case 'Q':
if( !ed->keyword || !ed->description )
{
send_to_char( "No keyword and/or description, junking...", d->character );
UNLINK( ed, room->first_extradesc, room->last_extradesc, next, prev );
STRFREE( ed->keyword );
STRFREE( ed->keyword );
DISPOSE( ed );
top_ed--;
}
d->character->spare_ptr = NULL;
redit_disp_extradesc_menu( d );
return;
case '1':
OLC_MODE( d ) = REDIT_EXTRADESC_KEY;
send_to_char( "Keywords, seperated by spaces: ", d->character );
return;
case '2':
OLC_MODE( d ) = REDIT_EXTRADESC_DESCRIPTION;
d->character->substate = SUB_ROOM_EXTRA;
d->character->last_cmd = do_redit_reset;
send_to_char( "Enter new extradesc description: \n\r", d->character );
start_editing( d->character, ed->description );
return;
}
break;
case REDIT_EXTRADESC_KEY:
/*
* if ( SetRExtra( room, arg ) )
* {
* send_to_char( "A extradesc with that keyword already exists.\n\r", d->character );
* redit_disp_extradesc_menu(d);
* return;
* }
*/
olc_log( d, "Changed exkey %s to %s", ed->keyword, arg );
STRFREE( ed->keyword );
ed->keyword = STRALLOC( arg );
oedit_disp_extra_choice( d );
OLC_MODE( d ) = REDIT_EXTRADESC_CHOICE;
return;
case REDIT_EXTRADESC_MENU:
switch ( UPPER( arg[0] ) )
{
case 'Q':
break;
case 'A':
CREATE( ed, EXTRA_DESCR_DATA, 1 );
LINK( ed, room->first_extradesc, room->last_extradesc, next, prev );
ed->keyword = STRALLOC( "" );
ed->description = STRALLOC( "" );
top_ed++;
d->character->spare_ptr = ed;
olc_log( d, "Added new exdesc" );
oedit_disp_extra_choice( d );
OLC_MODE( d ) = REDIT_EXTRADESC_CHOICE;
return;
case 'R':
OLC_MODE( d ) = REDIT_EXTRADESC_DELETE;
send_to_char( "Delete which extra description? ", d->character );
return;
default:
if( is_number( arg ) )
{
ed = redit_find_extradesc( room, atoi( arg ) );
if( !ed )
{
send_to_char( "Not found, try again: ", d->character );
return;
}
d->character->spare_ptr = ed;
oedit_disp_extra_choice( d );
OLC_MODE( d ) = REDIT_EXTRADESC_CHOICE;
}
else
redit_disp_extradesc_menu( d );
return;
}
break;
default:
/*
* we should never get here
*/
bug( "Reached default case in parse_redit", 0 );
break;
}
/*
* Log the changes, so we can keep track of those sneaky bastards
*/
/*
* Don't log on the flags cause it does that above
*/
/*
* if ( OLC_MODE(d) != REDIT_FLAGS )
* olc_log( d, arg );
*/
/*
* . If we get this far, something has be changed .
*/
OLC_CHANGE( d ) = TRUE;
redit_disp_menu( d );
}