/****************************************************************************
* ResortMUD 4.0 Beta by Ntanel, Garinan, Badastaz, Josh, Digifuzz, Senir, *
* Kratas, Scion, Shogar and Tagith. Special thanks to Thoric, Nivek, *
* Altrag, Arlorn, Justice, Samson, Dace, HyperEye and Yakkov. *
****************************************************************************
* Copyright (C) 1996 - 2001 Haslage Net Electronics: MudWorld *
* of Lorain, Ohio - ALL RIGHTS RESERVED *
* The text and pictures of this publication, or any part thereof, may not *
* be reproduced or transmitted in any form or by any means, electronic or *
* mechanical, includes photocopying, recording, storage in a information *
* retrieval system, or otherwise, without the prior written or e-mail *
* consent from the publisher. *
****************************************************************************
* GREETING must mention ResortMUD programmers and the help file named *
* CREDITS must remain completely intact as listed in the SMAUG license. *
****************************************************************************/
/**************************************************************************\
* *
* OasisOLC II for Smaug 1.40 written by Evan Cortens(Tagith) *
* *
* Based on OasisOLC for CircleMUD3.0bpl9 written by Harvey Gilpin *
* *
**************************************************************************
* *
* Object editing module (oedit.c) v1.0 *
* *
\**************************************************************************/
#include <stdio.h>
#include <string.h>
#include "mud.h"
#include "olc.h"
/* External functions */
extern int top_affect;
extern int top_ed;
extern int top_obj_index;
extern OBJ_INDEX_DATA *obj_index_hash[MAX_KEY_HASH];
int get_risflag args( ( char *flag ) );
void medit_disp_aff_flags args( ( DESCRIPTOR_DATA * d ) );
void medit_disp_ris args( ( DESCRIPTOR_DATA * d ) );
/* Internal functions */
DECLARE_DO_FUN( do_oedit_reset );
void oedit_disp_layer_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_container_flags_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_lever_flags_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_extradesc_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_weapon_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_val1_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_val2_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_val3_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_val4_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_val5_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_val6_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_type_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_extra_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_wear_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_disp_spells_menu args( ( DESCRIPTOR_DATA * d ) );
void oedit_liquid_type args( ( DESCRIPTOR_DATA * d ) );
void oedit_setup_new args( ( DESCRIPTOR_DATA * d ) );
void oedit_setup_existing args( ( DESCRIPTOR_DATA * d, int real_num ) );
void oedit_save_to_disk args( ( DESCRIPTOR_DATA * d ) ); /* Unused */
void oedit_save_internally args( ( DESCRIPTOR_DATA * d ) );
void oedit_setup args( ( DESCRIPTOR_DATA * d, int vnum ) );
/*------------------------------------------------------------------------*/
void cleanup_olc( DESCRIPTOR_DATA * d )
{
if( d->olc )
{
if( d->character )
{
d->character->dest_buf = NULL;
act( AT_ACTION, "$n stops using OLC.", d->character, NULL, NULL, TO_CANSEE );
}
d->connected = CON_PLAYING;
DISPOSE( d->olc );
}
return;
}
/*
* Starts it all off
*/
void do_ooedit( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
DESCRIPTOR_DATA *d;
OBJ_DATA *obj;
if( IS_NPC( ch ) )
{
send_to_char( "I don't think so...\r\n", ch );
return;
}
one_argument( argument, arg );
if( arg[0] == '\0' )
{
send_to_char( "OEdit what?\r\n", ch );
return;
}
if( ( obj = get_obj_world( ch, arg ) ) == NULL )
{
send_to_char( "Nothing like that in hell, earth, or heaven.\r\n", ch );
return;
}
/*
* Make sure the object isnt already being edited
*/
for( d = first_descriptor; d; d = d->next )
if( d->connected == CON_OEDIT )
if( d->olc && OLC_VNUM( d ) == obj->pIndexData->vnum )
{
ch_printf( ch, "That object is currently being edited by %s.\r\n", d->character->name );
return;
}
if( !can_omodify( ch, obj ) )
return;
d = ch->desc;
CREATE( d->olc, OLC_DATA, 1 );
OLC_VNUM( d ) = obj->pIndexData->vnum;
OLC_CHANGE( d ) = FALSE;
OLC_VAL( d ) = 0;
d->character->dest_buf = obj;
d->connected = CON_OEDIT;
oedit_disp_menu( d );
act( AT_ACTION, "$n starts using OLC.", ch, NULL, NULL, TO_CANSEE );
return;
}
void do_ocopy( CHAR_DATA * ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
int ovnum, cvnum;
OBJ_INDEX_DATA *orig;
OBJ_INDEX_DATA *copy;
EXTRA_DESCR_DATA *ed, *ced;
AFFECT_DATA *paf, *cpaf;
MPROG_DATA *mprog, *cprog;
int iHash;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if( !arg1 || !arg2 )
{
send_to_char( "Usage: ocopy <original> <new>\r\n", ch );
return;
}
ovnum = atoi( arg1 );
cvnum = atoi( arg2 );
#ifdef LEVEL_LESSERC
if( get_trust( ch ) < LEVEL_LESSERC )
#else
if( get_trust( ch ) < LEVEL_LESSER )
#endif
{
AREA_DATA *pArea;
if( !ch->pcdata || !( pArea = ch->pcdata->area ) )
{
send_to_char( "You must have an assigned area to copy objects.\r\n", ch );
return;
}
if( cvnum < pArea->low_o_vnum || cvnum > pArea->hi_o_vnum )
{
send_to_char( "That number is not in your allocated range.\r\n", ch );
return;
}
}
if( get_obj_index( cvnum ) )
{
send_to_char( "That object already exists.\r\n", ch );
return;
}
if( ( orig = get_obj_index( ovnum ) ) == NULL )
{
send_to_char( "How can you copy something that doesnt exist?\r\n", ch );
return;
}
CREATE( copy, OBJ_INDEX_DATA, 1 );
copy->vnum = cvnum;
copy->name = QUICKLINK( orig->name );
copy->first_affect = NULL;
copy->last_affect = NULL;
copy->first_extradesc = NULL;
copy->last_extradesc = NULL;
copy->short_descr = QUICKLINK( orig->short_descr );
copy->description = QUICKLINK( orig->description );
copy->action_desc = QUICKLINK( orig->action_desc );
copy->item_type = orig->item_type;
copy->extra_flags = orig->extra_flags;
copy->magic_flags = orig->magic_flags;
copy->wear_flags = orig->wear_flags;
copy->value[0] = orig->value[0];
copy->value[1] = orig->value[1];
copy->value[2] = orig->value[2];
copy->value[3] = orig->value[3];
copy->value[4] = orig->value[4];
copy->value[5] = orig->value[5];
copy->weight = orig->weight;
copy->cost = orig->cost;
copy->rent = orig->rent;
copy->layers = orig->layers;
for( ced = orig->first_extradesc; ced; ced = ced->next )
{
CREATE( ed, EXTRA_DESCR_DATA, 1 );
ed->keyword = QUICKLINK( ced->keyword );
ed->description = QUICKLINK( ced->description );
LINK( ed, copy->first_extradesc, copy->last_extradesc, next, prev );
top_ed++;
}
for( cpaf = orig->first_affect; cpaf; cpaf = cpaf->next )
{
CREATE( paf, AFFECT_DATA, 1 );
paf->type = cpaf->type;
paf->duration = cpaf->duration;
paf->location = cpaf->location;
paf->modifier = cpaf->modifier;
paf->bitvector = cpaf->bitvector;
LINK( paf, copy->first_affect, copy->last_affect, next, prev );
top_affect++;
}
if( orig->mudprogs )
{
CREATE( mprog, MPROG_DATA, 1 );
copy->mudprogs = mprog;
for( cprog = orig->mudprogs; cprog; cprog = cprog->next )
{
mprog->type = cprog->type;
xSET_BIT( copy->progtypes, mprog->type );
mprog->arglist = QUICKLINK( cprog->arglist );
mprog->comlist = QUICKLINK( cprog->comlist );
if( cprog->next )
{
CREATE( mprog->next, MPROG_DATA, 1 );
mprog = mprog->next;
}
else
mprog->next = NULL;
}
}
copy->count = 0;
iHash = cvnum % MAX_KEY_HASH;
copy->next = obj_index_hash[iHash];
obj_index_hash[iHash] = copy;
top_obj_index++;
set_char_color( AT_PLAIN, ch );
send_to_char( "Object copied.\r\n", ch );
return;
}
/**************************************************************************
Menu functions
**************************************************************************/
void oedit_disp_progs( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
MPROG_DATA *mprg;
int count;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
for( count = 0, mprg = obj->pIndexData->mudprogs; mprg; mprg = mprg->next )
{
ch_printf_color( d->character, "&g%2d&w) &c%s\r\n", ++count, mprog_type_to_name( mprg->type ) );
}
if( obj->pIndexData->mudprogs )
send_to_char( "\r\n", d->character );
ch_printf_color( d->character, "&gA&w) Add a new program\r\n" );
ch_printf_color( d->character, "&gR&w) Remove an existing program\r\n" );
ch_printf_color( d->character, "&gQ&w) Quit\r\n" );
ch_printf_color( d->character, "\r\nEnter choice: " );
OLC_MODE( d ) = OEDIT_MPROGS;
}
void oedit_disp_prog_types( DESCRIPTOR_DATA * d )
{
int count;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
for( count = ACT_PROG; count < USE_PROG; count++ )
ch_printf_color( d->character, "&g%2d&w) %s\r\n", count, mprog_type_to_name( count ) );
send_to_char( "\r\nEnter type: ", d->character );
return;
}
void oedit_disp_prog_choice( DESCRIPTOR_DATA * d )
{
MPROG_DATA *mprg = d->character->spare_ptr;
char buf[MAX_STRING_LENGTH];
int i = 0;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
if( mprg->comlist )
{
strcat( buf, "\r\n" );
while( mprg->comlist[i++] != '\n' )
sprintf( buf, "%s%c", buf, mprg->comlist[i] );
}
else
buf[0] = '\0';
ch_printf_color( d->character, "&gA&w) Type: &c%s\r\n", mprog_type_to_name( mprg->type ) );
ch_printf_color( d->character, "&gB&w) Args: &c%s\r\n", mprg->arglist );
ch_printf_color( d->character, "&gC&w) Prog: %s\r\n", buf );
ch_printf_color( d->character, "&gQ&w) Quit\r\n" );
send_to_char( "\r\nEnter choice: ", d->character );
return;
}
/* For container flags */
void oedit_disp_container_flags_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
CHAR_DATA *ch = d->character;
char buf[MAX_STRING_LENGTH];
int i;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
for( i = 0; i < 5; i++ )
{
sprintf( buf, "&g%d&w) %s\r\n", i + 1, container_flags[i] );
send_to_char_color( buf, ch );
}
sprintf( buf, "Container flags: &c%s&w\r\n", flag_string( obj->value[1], container_flags ) );
send_to_char_color( buf, ch );
send_to_char( "Enter flag, 0 to quit : ", ch );
}
/*
* Display lever flags menu
*/
void oedit_disp_lever_flags_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
char buf[MAX_STRING_LENGTH];
int counter;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
for( counter = 0; counter < 29; counter++ )
{
sprintf( buf, "&g%2d&w) %s\r\n", counter + 1, trig_flags[counter] );
send_to_char_color( buf, d->character );
}
sprintf( buf, "Lever flags: &c%s&w\r\nEnter flag, 0 to quit: ", flag_string( obj->value[0], trig_flags ) );
send_to_char_color( buf, d->character );
return;
}
/*
* Fancy layering stuff, trying to lessen confusion :)
*/
void oedit_disp_layer_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
OLC_MODE( d ) = OEDIT_LAYERS;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
send_to_char( "Choose which layer, or combination of layers fits best: \r\n\r\n", d->character );
ch_printf_color( d->character, "[&c%s&w] &g1&w) Nothing Layers\r\n", ( obj->pIndexData->layers == 0 ) ? "X" : " " );
ch_printf_color( d->character, "[&c%s&w] &g2&w) Silk Shirt\r\n", IS_SET( obj->pIndexData->layers, 1 ) ? "X" : " " );
ch_printf_color( d->character, "[&c%s&w] &g3&w) Leather Vest\r\n", IS_SET( obj->pIndexData->layers, 2 ) ? "X" : " " );
ch_printf_color( d->character, "[&c%s&w] &g4&w) Light Chainmail\r\n", IS_SET( obj->pIndexData->layers, 4 ) ? "X" : " " );
ch_printf_color( d->character, "[&c%s&w] &g5&w) Leather Jacket\r\n", IS_SET( obj->pIndexData->layers, 8 ) ? "X" : " " );
ch_printf_color( d->character, "[&c%s&w] &g6&w) Light Cloak\r\n", IS_SET( obj->pIndexData->layers, 16 ) ? "X" : " " );
ch_printf_color( d->character, "[&c%s&w] &g7&w) Loose Cloak\r\n", IS_SET( obj->pIndexData->layers, 32 ) ? "X" : " " );
ch_printf_color( d->character, "[&c%s&w] &g8&w) Cape\r\n", IS_SET( obj->pIndexData->layers, 64 ) ? "X" : " " );
ch_printf_color( d->character, "[&c%s&w] &g9&w) Magical Effects\r\n",
IS_SET( obj->pIndexData->layers, 128 ) ? "X" : " " );
ch_printf_color( d->character, "\r\nLayer or 0 to exit: " );
}
/* For extra descriptions */
void oedit_disp_extradesc_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
CHAR_DATA *ch = d->character;
int count = 0;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
if( obj->pIndexData->first_extradesc )
{
EXTRA_DESCR_DATA *ed;
for( ed = obj->pIndexData->first_extradesc; ed; ed = ed->next )
{
ch_printf_color( ch, "&g%2d&w) Keyword: &O%s\r\n", ++count, ed->keyword );
}
}
if( obj->first_extradesc )
{
EXTRA_DESCR_DATA *ed;
for( ed = obj->first_extradesc; ed; ed = ed->next )
{
ch_printf_color( ch, "&g%2d&w) Keyword: &O%s\r\n", ++count, ed->keyword );
}
}
if( obj->pIndexData->first_extradesc || obj->first_extradesc )
send_to_char( "\r\n", d->character );
ch_printf_color( d->character, "&gA&w) Add a new description\r\n" );
ch_printf_color( d->character, "&gR&w) Remove a description\r\n" );
ch_printf_color( d->character, "&gQ&w) Quit\r\n" );
ch_printf_color( d->character, "\r\nEnter choice: " );
OLC_MODE( d ) = OEDIT_EXTRADESC_MENU;
}
void oedit_disp_extra_choice( DESCRIPTOR_DATA * d )
{
EXTRA_DESCR_DATA *ed = d->character->spare_ptr;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
ch_printf_color( d->character, "&g1&w) Keyword: &O%s\r\n", ed->keyword );
ch_printf_color( d->character, "&g2&w) Description: \r\n&O%s&w\r\n", ed->description );
ch_printf_color( d->character, "\r\nChange which option? " );
OLC_MODE( d ) = OEDIT_EXTRADESC_CHOICE;
}
/* Ask for *which* apply to edit and prompt for some other options */
void oedit_disp_prompt_apply_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
CHAR_DATA *ch = d->character;
AFFECT_DATA *paf;
int counter = 0;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
for( paf = obj->pIndexData->first_affect; paf; paf = paf->next )
{
ch_printf_color( d->character, " &g%2d&w) ", counter++ );
showaffect( ch, paf );
/*
* ch_printf_color( d->character, "&cAffects &w%s &cby &w%d.\r\n", affect_loc_name( paf->location ), paf->modifier );
*/
}
for( paf = obj->first_affect; paf; paf = paf->next )
{
ch_printf_color( d->character, " &g%2d&w) ", counter++ );
showaffect( ch, paf );
/*
* ch_printf_color( d->character, "&cAffects &w%s &cby &w%d.\r\n", affect_loc_name( paf->location ), paf->modifier );
*/
}
send_to_char_color( " \r\n &gA&w) Add an affect\r\n", ch );
send_to_char_color( " &gR&w) Remove an affect\r\n", ch );
send_to_char_color( " &gQ&w) Quit\r\n", ch );
send_to_char( "\r\nEnter option or affect#: ", ch );
OLC_MODE( d ) = OEDIT_AFFECT_MENU;
return;
}
/*. Ask for liquid type .*/
void oedit_liquid_type( DESCRIPTOR_DATA * d )
{
char buf[MAX_STRING_LENGTH];
int counter, col = 0;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
for( counter = 0; counter < LIQ_MAX; counter++ )
{
sprintf( buf, " &w%2d&g) &c%-20.20s ", counter, liq_table[counter].liq_name );
if( ++col % 3 == 0 )
strcat( buf, "\r\n" );
send_to_char_color( buf, d->character );
}
send_to_char_color( "\r\n&wEnter drink type: ", d->character );
OLC_MODE( d ) = OEDIT_VALUE_3;
return;
}
/*
* Display the menu of apply types
*/
void oedit_disp_affect_menu( DESCRIPTOR_DATA * d )
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *ch = d->character;
int counter, col = 0;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
for( counter = 0; counter < MAX_APPLY_TYPE; counter++ )
{
/*
* Don't want people choosing these ones
*/
if( counter == 0 || counter == APPLY_EXT_AFFECT )
continue;
sprintf( buf, "&g%2d&w) %-20.20s ", counter, a_types[counter] );
if( ++col % 3 == 0 )
strcat( buf, "\r\n" );
send_to_char_color( buf, ch );
}
send_to_char( "\r\nEnter apply type (0 to quit): ", ch );
OLC_MODE( d ) = OEDIT_AFFECT_LOCATION;
return;
}
/*
* Display menu of weapon types
*/
void oedit_disp_weapon_menu( DESCRIPTOR_DATA * d )
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *ch = d->character;
int counter, col = 0;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
for( counter = 0; counter < 18; counter++ )
{
sprintf( buf, "&g%2d&w) %-20.20s ", counter, attack_table[counter] );
if( ++col % 2 == 0 )
strcat( buf, "\r\n" );
send_to_char_color( buf, ch );
}
send_to_char( "\r\nEnter weapon type: ", ch );
return;
}
/* spell type */
void oedit_disp_spells_menu( DESCRIPTOR_DATA * d )
{
send_to_char( "Enter the name of the spell: ", d->character );
}
/* object value 0 */
void oedit_disp_val1_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
OLC_MODE( d ) = OEDIT_VALUE_1;
switch ( obj->item_type )
{
case ITEM_LIGHT:
/*
* values 0 and 1 are unused.. jump to 2
*/
oedit_disp_val3_menu( d );
break;
case ITEM_SALVE:
case ITEM_PILL:
case ITEM_SCROLL:
case ITEM_WAND:
case ITEM_STAFF:
case ITEM_POTION:
send_to_char( "Spell level : ", d->character );
break;
case ITEM_MISSILE_WEAPON:
case ITEM_WEAPON:
send_to_char( "Condition : ", d->character );
break;
case ITEM_ARMOR:
send_to_char( "Current AC : ", d->character );
break;
/*
* case ITEM_QUIVER:
* case ITEM_KEYRING:
*/
case ITEM_PIPE:
case ITEM_CONTAINER:
case ITEM_DRINK_CON:
case ITEM_FOUNTAIN:
send_to_char( "Capacity : ", d->character );
break;
case ITEM_FOOD:
send_to_char( "Hours to fill stomach : ", d->character );
break;
case ITEM_MONEY:
send_to_char( "Amount of gold coins : ", d->character );
break;
case ITEM_HERB:
/*
* Value 0 unused, skip to 1
*/
oedit_disp_val2_menu( d );
break;
case ITEM_LEVER:
case ITEM_SWITCH:
oedit_disp_lever_flags_menu( d );
break;
case ITEM_TRAP:
send_to_char( "Charges: ", d->character );
break;
default:
oedit_disp_menu( d );
}
}
/* object value 1 */
void oedit_disp_val2_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
OLC_MODE( d ) = OEDIT_VALUE_2;
switch ( obj->item_type )
{
case ITEM_PILL:
case ITEM_SCROLL:
case ITEM_POTION:
oedit_disp_spells_menu( d );
break;
case ITEM_SALVE:
case ITEM_HERB:
send_to_char( "Charges: ", d->character );
break;
case ITEM_PIPE:
send_to_char( "Number of draws: ", d->character );
break;
case ITEM_WAND:
case ITEM_STAFF:
send_to_char( "Max number of charges : ", d->character );
break;
case ITEM_WEAPON:
send_to_char( "Number of damage dice : ", d->character );
break;
case ITEM_FOOD:
send_to_char( "Condition: ", d->character );
break;
case ITEM_CONTAINER:
oedit_disp_container_flags_menu( d );
break;
case ITEM_DRINK_CON:
case ITEM_FOUNTAIN:
send_to_char( "Quantity : ", d->character );
break;
case ITEM_ARMOR:
send_to_char( "Original AC: ", d->character );
break;
case ITEM_LEVER:
case ITEM_SWITCH:
if( IS_SET( obj->value[0], TRIG_CAST ) )
oedit_disp_spells_menu( d );
else
send_to_char( "Vnum: ", d->character );
break;
default:
oedit_disp_menu( d );
}
}
/* object value 2 */
void oedit_disp_val3_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
OLC_MODE( d ) = OEDIT_VALUE_3;
switch ( obj->item_type )
{
case ITEM_LIGHT:
send_to_char( "Number of hours (0 = burnt, -1 is infinite) : ", d->character );
break;
case ITEM_PILL:
case ITEM_SCROLL:
case ITEM_POTION:
oedit_disp_spells_menu( d );
break;
case ITEM_WAND:
case ITEM_STAFF:
send_to_char( "Number of charges remaining : ", d->character );
break;
case ITEM_WEAPON:
send_to_char( "Size of damage dice : ", d->character );
break;
case ITEM_CONTAINER:
send_to_char( "Vnum of key to open container (-1 for no key) : ", d->character );
break;
case ITEM_DRINK_CON:
case ITEM_FOUNTAIN:
oedit_liquid_type( d );
break;
default:
oedit_disp_menu( d );
}
}
/* object value 3 */
void oedit_disp_val4_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
OLC_MODE( d ) = OEDIT_VALUE_4;
switch ( obj->item_type )
{
case ITEM_SCROLL:
case ITEM_POTION:
case ITEM_WAND:
case ITEM_STAFF:
oedit_disp_spells_menu( d );
break;
case ITEM_WEAPON:
oedit_disp_weapon_menu( d );
break;
case ITEM_DRINK_CON:
case ITEM_FOUNTAIN:
case ITEM_FOOD:
send_to_char( "Poisoned (0 = not poisoned) : ", d->character );
break;
default:
oedit_disp_menu( d );
}
}
/* object value 4 */
void oedit_disp_val5_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
OLC_MODE( d ) = OEDIT_VALUE_5;
switch ( obj->item_type )
{
case ITEM_SALVE:
oedit_disp_spells_menu( d );
break;
case ITEM_FOOD:
send_to_char( "Food value: ", d->character );
break;
case ITEM_MISSILE_WEAPON:
send_to_char( "Range: ", d->character );
break;
default:
oedit_disp_menu( d );
}
}
/* object value 5 */
void oedit_disp_val6_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
OLC_MODE( d ) = OEDIT_VALUE_6;
switch ( obj->item_type )
{
case ITEM_SALVE:
oedit_disp_spells_menu( d );
break;
default:
oedit_disp_menu( d );
}
}
/* object type */
void oedit_disp_type_menu( DESCRIPTOR_DATA * d )
{
char buf[MAX_STRING_LENGTH];
int counter, col = 0;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
for( counter = 0; counter < MAX_ITEM_TYPE; counter++ )
{
sprintf( buf, "&g%2d&w) %-20.20s ", counter, o_types[counter] );
if( ++col % 3 == 0 )
strcat( buf, "\r\n" );
send_to_char_color( buf, d->character );
}
send_to_char( "\r\nEnter object type: ", d->character );
return;
}
/* object extra flags */
void oedit_disp_extra_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
char buf[MAX_STRING_LENGTH];
int counter, col = 0;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
for( counter = 0; counter < MAX_ITEM_FLAG; counter++ )
{
sprintf( buf, "&g%2d&w) %-20.20s ", counter + 1, capitalize( o_flags[counter] ) );
if( ++col % 2 == 0 )
strcat( buf, "\r\n" );
send_to_char_color( buf, d->character );
}
sprintf( buf, "\r\nObject flags: &c%s&w\r\nEnter object extra flag (0 to quit): ",
ext_flag_string( &obj->extra_flags, o_flags ) );
send_to_char_color( buf, d->character );
return;
}
/*
* Display wear flags menu
*/
void oedit_disp_wear_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
char buf[MAX_STRING_LENGTH];
int counter, col = 0;
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
for( counter = 0; counter <= ITEM_WEAR_MAX; counter++ )
{
if( 1 << counter == ITEM_DUAL_WIELD )
continue;
sprintf( buf, "&g%2d&w) %-20.20s ", counter + 1, capitalize( w_flags[counter] ) );
if( ++col % 2 == 0 )
strcat( buf, "\r\n" );
send_to_char_color( buf, d->character );
}
sprintf( buf, "\r\nWear flags: &c%s&w\r\nEnter wear flag, 0 to quit: ", flag_string( obj->wear_flags, w_flags ) );
send_to_char_color( buf, d->character );
return;
}
/* display main menu */
void oedit_disp_menu( DESCRIPTOR_DATA * d )
{
OBJ_DATA *obj = d->character->dest_buf;
char buf[MAX_STRING_LENGTH];
write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 );
/*
* . Build first half of menu .
*/
set_char_color( AT_PLAIN, d->character );
sprintf( buf,
"-- Item number : [&c%d&w]\r\n"
"&g1&w) Name : &O%s\r\n"
"&g2&w) S-Desc : &O%s\r\n"
"&g3&w) L-Desc :-\r\n&O%s\r\n"
"&g4&w) A-Desc :-\r\n&O%s\r\n"
"&g5&w) Type : &c%s\r\n"
"&g6&w) Extra flags : &c%s\r\n",
obj->pIndexData->vnum,
obj->name,
obj->short_descr,
obj->description,
obj->action_desc ? obj->action_desc : "<not set>\r\n",
capitalize( item_type_name( obj ) ), ext_flag_string( &obj->extra_flags, o_flags ) );
send_to_char_color( buf, d->character );
/*
* Build second half of the menu
*/
sprintf( buf, "&g7&w) Wear flags : &c%s\r\n" "&g8&w) Weight : &c%d\r\n" "&g9&w) Cost : &c%d\r\n" "&gA&w) Rent(unused): &c%d\r\n" "&gB&w) Timer : &c%d\r\n" "&gC&w) Level : &c%d\r\n" /* -- Object level . */
"&gD&w) Layers : &c%d\r\n"
"&gE&w) Values : &c%d %d %d %d %d %d\r\n"
"&gF&w) Affect menu\r\n"
"&gG&w) Extra descriptions menu\r\n"
"&gQ&w) Quit\r\n"
"Enter choice : ",
flag_string( obj->wear_flags, w_flags ),
obj->weight,
obj->cost,
obj->pIndexData->rent,
obj->timer,
obj->level,
obj->pIndexData->layers,
obj->value[0], obj->value[1], obj->value[2], obj->value[3], obj->value[4], obj->value[5] );
send_to_char_color( buf, d->character );
OLC_MODE( d ) = OEDIT_MAIN_MENU;
return;
}
/***************************************************************************
Object affect editing/removing functions
***************************************************************************/
void edit_object_affect( DESCRIPTOR_DATA * d, int number )
{
OBJ_DATA *obj = d->character->dest_buf;
int count = 0;
AFFECT_DATA *paf;
for( paf = obj->pIndexData->first_affect; paf; paf = paf->next )
{
if( count == number )
{
d->character->spare_ptr = paf;
OLC_VAL( d ) = TRUE;
oedit_disp_affect_menu( d );
return;
}
count++;
}
for( paf = obj->first_affect; paf; paf = paf->next )
{
if( count == number )
{
d->character->spare_ptr = paf;
OLC_VAL( d ) = TRUE;
oedit_disp_affect_menu( d );
return;
}
count++;
}
send_to_char( "Affect not found.\r\n", d->character );
return;
}
void remove_affect_from_obj( OBJ_DATA * obj, int number )
{
int count = 0;
AFFECT_DATA *paf;
if( obj->pIndexData->first_affect )
{
for( paf = obj->pIndexData->first_affect; paf; paf = paf->next )
{
if( count == number )
{
UNLINK( paf, obj->pIndexData->first_affect, obj->pIndexData->last_affect, next, prev );
DISPOSE( paf );
--top_affect;
return;
}
count++;
}
}
if( obj->first_affect )
{
for( paf = obj->first_affect; paf; paf = paf->next )
{
if( count == number )
{
UNLINK( paf, obj->first_affect, obj->last_affect, next, prev );
DISPOSE( paf );
--top_affect;
return;
}
count++;
}
}
return;
}
EXTRA_DESCR_DATA *oedit_find_extradesc( OBJ_DATA * obj, int number )
{
int count = 0;
EXTRA_DESCR_DATA *ed;
for( ed = obj->pIndexData->first_extradesc; ed; ed = ed->next )
{
if( ++count == number )
return ed;
}
for( ed = obj->first_extradesc; ed; ed = ed->next )
{
if( ++count == number )
return ed;
}
return NULL;
}
MPROG_DATA *oedit_find_prog( OBJ_DATA * obj, int number )
{
MPROG_DATA *mprg;
int count;
for( count = 0, mprg = obj->pIndexData->mudprogs; mprg; mprg = mprg->next )
{
if( ++count == number )
return mprg;
}
return NULL;
}
/*
* Bogus command for resetting stuff
*/
void do_oedit_reset( CHAR_DATA * ch, char *argument )
{
OBJ_DATA *obj = ch->dest_buf;
EXTRA_DESCR_DATA *ed = ch->spare_ptr;
MPROG_DATA *mprg = ch->spare_ptr;
int mode = OLC_MODE( ch->desc );
switch ( ch->substate )
{
default:
return;
case SUB_OBJ_EXTRA:
if( !ch->dest_buf )
{
send_to_char( "Fatal error, report to Tagith.\r\n", ch );
bug( "do_oedit_reset: sub_obj_extra: NULL ch->dest_buf", 0 );
ch->substate = SUB_NONE;
return;
}
/*
* OLC_DESC(ch->desc) = ch->spare_ptr;
*/
STRFREE( ed->description );
ed->description = copy_buffer( ch );
stop_editing( ch );
ch->dest_buf = obj;
ch->spare_ptr = ed;
ch->substate = SUB_NONE;
ch->desc->connected = CON_OEDIT;
OLC_MODE( ch->desc ) = OEDIT_EXTRADESC_CHOICE;
oedit_disp_extra_choice( ch->desc );
return;
case SUB_OBJ_LONG:
if( !ch->dest_buf )
{
send_to_char( "Fatal error, report to Tagith.\r\n", ch );
bug( "do_oedit_reset: sub_obj_long: NULL ch->dest_buf", 0 );
ch->substate = SUB_NONE;
return;
}
STRFREE( obj->description );
obj->description = copy_buffer( ch );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
{
STRFREE( obj->pIndexData->description );
obj->pIndexData->description = QUICKLINK( obj->description );
}
stop_editing( ch );
ch->dest_buf = obj;
ch->desc->connected = CON_OEDIT;
ch->substate = SUB_NONE;
OLC_MODE( ch->desc ) = OEDIT_MAIN_MENU;
oedit_disp_menu( ch->desc );
return;
case SUB_MPROG_EDIT:
if( mprg->comlist )
STRFREE( mprg->comlist );
mprg->comlist = copy_buffer( ch );
stop_editing( ch );
ch->dest_buf = obj;
ch->desc->connected = ch->tempnum;
ch->substate = SUB_NONE;
OLC_MODE( ch->desc ) = mode;
oedit_disp_prog_choice( ch->desc );
return;
}
}
/*
* This function interprets the arguments that the character passed
* to it based on which OLC mode you are in at the time
*/
void oedit_parse( DESCRIPTOR_DATA * d, char *arg )
{
OBJ_DATA *obj = d->character->dest_buf;
AFFECT_DATA *paf = d->character->spare_ptr;
AFFECT_DATA *npaf;
EXTRA_DESCR_DATA *ed = d->character->spare_ptr;
MPROG_DATA *mprg = d->character->spare_ptr;
MPROG_DATA *mprog = obj->pIndexData->mudprogs;
char arg1[MAX_INPUT_LENGTH];
int number = 0, max_val, min_val, value;
/*
* bool found;
*/
switch ( OLC_MODE( d ) )
{
case OEDIT_CONFIRM_SAVESTRING:
switch ( *arg )
{
case 'y':
case 'Y':
send_to_char( "Saving object to memory.\r\n", d->character );
/*
* oedit_save_internally(d);
*/
case 'n':
case 'N':
cleanup_olc( d );
return;
default:
send_to_char( "Invalid choice!\r\n", d->character );
send_to_char( "Do you wish to save this object internally?\r\n", d->character );
return;
}
case OEDIT_MAIN_MENU:
/*
* switch to whichever mode the user selected, display prompt or menu
*/
switch ( UPPER( arg[0] ) )
{
case 'Q':
/*
* send_to_char( "Do you wish to save this object internally?: ", d->character );
* OLC_MODE(d) = OEDIT_CONFIRM_SAVESTRING;
*/
cleanup_olc( d );
return;
case '1':
send_to_char( "Enter namelist : ", d->character );
OLC_MODE( d ) = OEDIT_EDIT_NAMELIST;
break;
case '2':
send_to_char( "Enter short desc : ", d->character );
OLC_MODE( d ) = OEDIT_SHORTDESC;
break;
case '3':
send_to_char( "Enter long desc :-\r\n| ", d->character );
OLC_MODE( d ) = OEDIT_LONGDESC;
break;
case '4':
/*
* lets not
*/
send_to_char( "Enter action desc :-\r\n", d->character );
OLC_MODE( d ) = OEDIT_ACTDESC;
break;
case '5':
oedit_disp_type_menu( d );
OLC_MODE( d ) = OEDIT_TYPE;
break;
case '6':
oedit_disp_extra_menu( d );
OLC_MODE( d ) = OEDIT_EXTRAS;
break;
case '7':
oedit_disp_wear_menu( d );
OLC_MODE( d ) = OEDIT_WEAR;
break;
case '8':
send_to_char( "Enter weight : ", d->character );
OLC_MODE( d ) = OEDIT_WEIGHT;
break;
case '9':
send_to_char( "Enter cost : ", d->character );
OLC_MODE( d ) = OEDIT_COST;
break;
case 'A':
send_to_char( "Enter cost per day : ", d->character );
OLC_MODE( d ) = OEDIT_COSTPERDAY;
break;
case 'B':
send_to_char( "Enter timer : ", d->character );
OLC_MODE( d ) = OEDIT_TIMER;
break;
case 'C':
send_to_char( "Enter level : ", d->character );
OLC_MODE( d ) = OEDIT_LEVEL;
break;
case 'D':
if( IS_SET( obj->wear_flags, ITEM_WEAR_BODY )
|| IS_SET( obj->wear_flags, ITEM_WEAR_ABOUT )
|| IS_SET( obj->wear_flags, ITEM_WEAR_ARMS )
|| IS_SET( obj->wear_flags, ITEM_WEAR_FEET )
|| IS_SET( obj->wear_flags, ITEM_WEAR_HANDS )
|| IS_SET( obj->wear_flags, ITEM_WEAR_LEGS ) || IS_SET( obj->wear_flags, ITEM_WEAR_WAIST ) )
{
oedit_disp_layer_menu( d );
OLC_MODE( d ) = OEDIT_LAYERS;
}
else
send_to_char( "The wear location of this object is not layerable.\r\n", d->character );
break;
case 'E':
oedit_disp_val1_menu( d );
break;
case 'F':
oedit_disp_prompt_apply_menu( d );
break;
case 'G':
oedit_disp_extradesc_menu( d );
break;
case 'H':
oedit_disp_progs( d );
break;
default:
oedit_disp_menu( d );
break;
}
return; /* end of OEDIT_MAIN_MENU */
case OEDIT_EDIT_NAMELIST:
STRFREE( obj->name );
obj->name = STRALLOC( arg );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
{
STRFREE( obj->pIndexData->name );
obj->pIndexData->name = QUICKLINK( obj->name );
}
olc_log( d, "Changed name to %s", obj->name );
break;
case OEDIT_SHORTDESC:
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( arg );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
{
STRFREE( obj->pIndexData->short_descr );
obj->pIndexData->short_descr = QUICKLINK( obj->short_descr );
}
olc_log( d, "Changed short to %s", obj->short_descr );
break;
case OEDIT_LONGDESC:
STRFREE( obj->description );
obj->description = STRALLOC( arg );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
{
STRFREE( obj->pIndexData->description );
obj->pIndexData->description = QUICKLINK( obj->description );
}
olc_log( d, "Changed longdesc to %s", obj->description );
break;
case OEDIT_ACTDESC:
STRFREE( obj->action_desc );
obj->action_desc = STRALLOC( arg );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
{
STRFREE( obj->pIndexData->action_desc );
obj->pIndexData->action_desc = QUICKLINK( obj->action_desc );
}
olc_log( d, "Changed actiondesc to %s", obj->action_desc );
break;
case OEDIT_TYPE:
if( is_number( arg ) )
number = atoi( arg );
else
number = get_otype( arg );
if( ( number < 1 ) || ( number >= MAX_ITEM_TYPE ) )
{
send_to_char( "Invalid choice, try again : ", d->character );
return;
}
else
{
obj->item_type = ( short ) number;
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
obj->pIndexData->item_type = obj->item_type;
}
olc_log( d, "Changed object type to %s", o_types[number] );
break;
case OEDIT_EXTRAS:
while( arg[0] != '\0' )
{
arg = one_argument( arg, arg1 );
if( is_number( arg1 ) )
{
number = atoi( arg1 );
if( number == 0 )
{
oedit_disp_menu( d );
return;
}
number -= 1; /* Offset for 0 */
if( number < 0 || number > MAX_ITEM_FLAG )
{
oedit_disp_extra_menu( d );
return;
}
}
else
{
number = get_oflag( arg1 );
if( number < 0 || number > MAX_BITS )
{
oedit_disp_extra_menu( d );
return;
}
}
if( number == ITEM_PROTOTYPE
&& get_trust( d->character ) < LEVEL_GREATER && !is_name( "protoflag", d->character->pcdata->bestowments ) )
send_to_char( "You cannot change the prototype flag.\r\n", d->character );
else
{
xTOGGLE_BIT( obj->extra_flags, number );
olc_log( d, "%s the flag %s", xIS_SET( obj->extra_flags, number ) ? "Added" : "Removed", o_flags[number] );
}
/*
* If you used a number, you can only do one flag at a time
*/
if( is_number( arg ) )
break;
}
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
obj->pIndexData->extra_flags = obj->extra_flags;
oedit_disp_extra_menu( d );
return;
case OEDIT_WEAR:
if( is_number( arg ) )
{
number = atoi( arg );
if( number == 0 )
break;
else if( number < 0 || number > ITEM_WEAR_MAX + 1 )
{
send_to_char( "Invalid flag, try again: ", d->character );
return;
}
else
{
number -= 1; /* Offset to accomodate 0 */
TOGGLE_BIT( obj->wear_flags, 1 << number );
olc_log( d, "%s the wearloc %s",
IS_SET( obj->wear_flags, 1 << number ) ? "Added" : "Removed", w_flags[number] );
}
}
else
{
while( arg[0] != '\0' )
{
arg = one_argument( arg, arg1 );
number = get_wflag( arg1 );
if( number != -1 )
{
TOGGLE_BIT( obj->wear_flags, 1 << number );
olc_log( d, "%s the wearloc %s",
IS_SET( obj->wear_flags, 1 << number ) ? "Added" : "Removed", w_flags[number] );
}
}
}
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
obj->pIndexData->wear_flags = obj->wear_flags;
oedit_disp_wear_menu( d );
return;
case OEDIT_WEIGHT:
number = atoi( arg );
obj->weight = number;
olc_log( d, "Changed weight to %d", obj->weight );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
obj->pIndexData->weight = obj->weight;
break;
case OEDIT_COST:
number = atoi( arg );
obj->cost = number;
olc_log( d, "Changed cost to %d", obj->cost );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
obj->pIndexData->cost = obj->cost;
break;
case OEDIT_COSTPERDAY:
number = atoi( arg );
obj->pIndexData->rent = number;
olc_log( d, "Changed rent to %d", obj->pIndexData->rent );
break;
case OEDIT_TIMER:
number = atoi( arg );
obj->timer = number;
olc_log( d, "Changed timer to %d", obj->timer );
break;
case OEDIT_LEVEL:
number = atoi( arg );
obj->level = URANGE( 0, number, MAX_LEVEL );
olc_log( d, "Changed object level to %d", obj->level );
break;
case OEDIT_LAYERS:
/*
* Like they say, easy on the user, hard on the programmer :)
*/
/*
* Or did I just make that up....
*/
number = atoi( arg );
switch ( number )
{
case 0:
oedit_disp_menu( d );
return;
case 1:
obj->pIndexData->layers = 0;
break;
case 2:
TOGGLE_BIT( obj->pIndexData->layers, 1 );
break;
case 3:
TOGGLE_BIT( obj->pIndexData->layers, 2 );
break;
case 4:
TOGGLE_BIT( obj->pIndexData->layers, 4 );
break;
case 5:
TOGGLE_BIT( obj->pIndexData->layers, 8 );
break;
case 6:
TOGGLE_BIT( obj->pIndexData->layers, 16 );
break;
case 7:
TOGGLE_BIT( obj->pIndexData->layers, 32 );
break;
case 8:
TOGGLE_BIT( obj->pIndexData->layers, 64 );
break;
case 9:
TOGGLE_BIT( obj->pIndexData->layers, 128 );
break;
default:
send_to_char( "Invalid selection, try again: ", d->character );
return;
}
olc_log( d, "Changed layers to %d", obj->pIndexData->layers );
oedit_disp_layer_menu( d );
return;
case OEDIT_VALUE_1:
number = atoi( arg );
switch ( obj->item_type )
{
case ITEM_LEVER:
case ITEM_SWITCH:
if( number < 0 || number > 29 )
oedit_disp_lever_flags_menu( d );
else
{
if( number != 0 )
{
TOGGLE_BIT( obj->value[0], 1 << ( number - 1 ) );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
TOGGLE_BIT( obj->pIndexData->value[0], 1 << ( number - 1 ) );
oedit_disp_val1_menu( d );
}
else
oedit_disp_val2_menu( d );
}
break;
default:
obj->value[0] = number;
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
obj->pIndexData->value[0] = number;
oedit_disp_val2_menu( d );
}
olc_log( d, "Changed v0 to %d", obj->value[0] );
return;
case OEDIT_VALUE_2:
number = atoi( arg );
switch ( obj->item_type )
{
case ITEM_PILL:
case ITEM_SCROLL:
case ITEM_POTION:
if( !is_number( arg ) )
number = skill_lookup( arg );
obj->value[1] = number;
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
obj->pIndexData->value[1] = number;
oedit_disp_val3_menu( d );
break;
case ITEM_LEVER:
case ITEM_SWITCH:
if( IS_SET( obj->value[0], TRIG_CAST ) )
number = skill_lookup( arg );
obj->value[1] = number;
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
obj->pIndexData->value[1] = number;
oedit_disp_val3_menu( d );
break;
case ITEM_CONTAINER:
number = atoi( arg );
if( number < 0 || number > 31 )
oedit_disp_container_flags_menu( d );
else
{
/*
* if 0, quit
*/
if( number != 0 )
{
number = 1 << ( number - 1 );
TOGGLE_BIT( obj->value[1], number );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
TOGGLE_BIT( obj->pIndexData->value[1], number );
oedit_disp_val2_menu( d );
}
else
oedit_disp_val3_menu( d );
}
break;
default:
obj->value[1] = number;
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
obj->pIndexData->value[1] = number;
oedit_disp_val3_menu( d );
break;
}
olc_log( d, "Changed v1 to %d", obj->value[1] );
return;
case OEDIT_VALUE_3:
number = atoi( arg );
/*
* Some error checking done here
*/
switch ( obj->item_type )
{
case ITEM_SCROLL:
case ITEM_POTION:
case ITEM_PILL:
min_val = -1;
max_val = top_sn - 1;
if( !is_number( arg ) )
number = skill_lookup( arg );
break;
case ITEM_WEAPON:
min_val = 1;
max_val = 100;
break;
case ITEM_DRINK_CON:
case ITEM_FOUNTAIN:
min_val = 0;
max_val = LIQ_MAX;
break;
default:
/*
* Would require modifying if you have bvnum
*/
min_val = -32000;
max_val = 32000;
break;
}
obj->value[2] = URANGE( min_val, number, max_val );
olc_log( d, "Changed v2 to %d", obj->value[2] );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
obj->pIndexData->value[2] = obj->value[2];
oedit_disp_val4_menu( d );
return;
case OEDIT_VALUE_4:
number = atoi( arg );
switch ( obj->item_type )
{
case ITEM_PILL:
case ITEM_SCROLL:
case ITEM_POTION:
case ITEM_WAND:
case ITEM_STAFF:
min_val = -1;
max_val = top_sn - 1;
if( !is_number( arg ) )
number = skill_lookup( arg );
break;
case ITEM_WEAPON:
min_val = 0;
max_val = MAX_ATTACK_TYPE - 1;
if( number < min_val || number > max_val )
{
oedit_disp_val4_menu( d );
return;
}
break;
default:
min_val = -32000;
max_val = 32000;
break;
}
obj->value[3] = URANGE( min_val, number, max_val );
olc_log( d, "Changed v3 to %d", obj->value[3] );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
obj->pIndexData->value[3] = obj->value[3];
oedit_disp_val5_menu( d );
break;
case OEDIT_VALUE_5:
number = atoi( arg );
switch ( obj->item_type )
{
case ITEM_SALVE:
if( !is_number( arg ) )
number = skill_lookup( arg );
min_val = -1;
max_val = top_sn - 1;
break;
case ITEM_FOOD:
min_val = 0;
max_val = 32000;
break;
default:
min_val = -32000;
max_val = 32000;
break;
}
obj->value[4] = URANGE( min_val, number, max_val );
olc_log( d, "Changed v4 to %d", obj->value[4] );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
obj->pIndexData->value[4] = obj->value[4];
oedit_disp_val6_menu( d );
break;
case OEDIT_VALUE_6:
number = atoi( arg );
switch ( obj->item_type )
{
case ITEM_SALVE:
if( !is_number( arg ) )
number = skill_lookup( arg );
min_val = -1;
max_val = top_sn - 1;
break;
default:
min_val = -32000;
max_val = 32000;
break;
}
obj->value[5] = URANGE( min_val, number, max_val );
olc_log( d, "Changed v5 to %d", obj->value[5] );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
obj->pIndexData->value[5] = obj->value[5];
break;
case OEDIT_AFFECT_MENU:
number = atoi( arg );
switch ( arg[0] )
{
default: /* if its a number, then its prolly for editing an affect */
if( is_number( arg ) )
edit_object_affect( d, number );
else
oedit_disp_prompt_apply_menu( d );
return;
case 'r':
case 'R':
/*
* Chop off the 'R', if theres a number following use it, otherwise
* prompt for input
*/
arg = one_argument( arg, arg1 );
if( arg && arg[0] != '\0' )
{
number = atoi( arg );
remove_affect_from_obj( obj, number );
oedit_disp_prompt_apply_menu( d );
}
else
{
send_to_char( "Remove which affect? ", d->character );
OLC_MODE( d ) = OEDIT_AFFECT_REMOVE;
}
return;
case 'a':
case 'A':
CREATE( paf, AFFECT_DATA, 1 );
d->character->spare_ptr = paf;
oedit_disp_affect_menu( d );
return;
case 'q':
case 'Q':
d->character->spare_ptr = NULL;
break;
}
break; /* If we reach here, we're done */
case OEDIT_AFFECT_LOCATION:
if( is_number( arg ) )
{
number = atoi( arg );
if( number == 0 )
{
/*
* Junk the affect
*/
d->character->spare_ptr = NULL;
DISPOSE( paf );
break;
}
}
else
number = get_atype( arg );
if( number < 0 || number >= MAX_APPLY_TYPE || number == APPLY_EXT_AFFECT )
{
send_to_char( "Invalid location, try again: ", d->character );
return;
}
paf->location = number;
OLC_MODE( d ) = OEDIT_AFFECT_MODIFIER;
/*
* Insert all special affect handling here ie: non numerical stuff
*/
/*
* And add the apropriate case statement below
*/
if( number == APPLY_AFFECT )
{
d->character->tempnum = 0;
medit_disp_aff_flags( d );
}
else if( number == APPLY_RESISTANT || number == APPLY_IMMUNE || number == APPLY_SUSCEPTIBLE )
{
d->character->tempnum = 0;
medit_disp_ris( d );
}
else if( number == APPLY_WEAPONSPELL || number == APPLY_WEARSPELL || number == APPLY_REMOVESPELL )
oedit_disp_spells_menu( d );
else
send_to_char( "\r\nModifier: ", d->character );
return;
case OEDIT_AFFECT_MODIFIER:
switch ( paf->location )
{
case APPLY_AFFECT:
case APPLY_RESISTANT:
case APPLY_IMMUNE:
case APPLY_SUSCEPTIBLE:
if( is_number( arg ) )
{
number = atoi( arg );
if( number == 0 )
{
value = d->character->tempnum;
break;
}
TOGGLE_BIT( d->character->tempnum, 1 << ( number - 1 ) );
}
else
{
while( arg[0] != '\0' )
{
arg = one_argument( arg, arg1 );
if( paf->location == APPLY_AFFECT )
number = get_aflag( arg1 );
else
number = get_risflag( arg1 );
if( number < 0 )
ch_printf( d->character, "Invalid flag: %s\r\n", arg1 );
else
TOGGLE_BIT( d->character->tempnum, 1 << number );
}
}
if( paf->location == APPLY_AFFECT )
medit_disp_aff_flags( d );
else
medit_disp_ris( d );
return;
case APPLY_WEAPONSPELL:
case APPLY_WEARSPELL:
case APPLY_REMOVESPELL:
if( is_number( arg ) )
{
number = atoi( arg );
if( IS_VALID_SN( number ) )
value = number;
else
{
send_to_char( "Invalid sn, try again: ", d->character );
return;
}
}
else
{
value = bsearch_skill_exact( arg, gsn_first_spell, gsn_first_skill - 1 );
if( value < 0 )
{
ch_printf( d->character, "Invalid spell %s, try again: ", arg );
return;
}
}
break;
default:
value = atoi( arg );
break;
}
/*
* Link it in
*/
if( !value || OLC_VAL( d ) == TRUE )
{
paf->modifier = value;
olc_log( d, "Modified affect to: %s by %d", a_types[paf->location], value );
OLC_VAL( d ) = FALSE;
oedit_disp_prompt_apply_menu( d );
return;
}
CREATE( npaf, AFFECT_DATA, 1 );
npaf->type = -1;
npaf->duration = -1;
npaf->location = URANGE( 0, paf->location, MAX_APPLY_TYPE );
npaf->modifier = value;
xCLEAR_BITS( npaf->bitvector );
npaf->next = NULL;
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
LINK( npaf, obj->pIndexData->first_affect, obj->pIndexData->last_affect, next, prev );
else
LINK( npaf, obj->first_affect, obj->last_affect, next, prev );
++top_affect;
olc_log( d, "Added new affect: %s by %d", a_types[npaf->location], npaf->modifier );
DISPOSE( paf );
d->character->spare_ptr = NULL;
oedit_disp_prompt_apply_menu( d );
return;
case OEDIT_AFFECT_RIS:
/*
* Unnecessary atm
*/
number = atoi( arg );
if( number < 0 || number > 32 )
{
send_to_char( "Unknown flag, try again: ", d->character );
return;
}
return;
case OEDIT_AFFECT_REMOVE:
number = atoi( arg );
remove_affect_from_obj( obj, number );
olc_log( d, "Removed affect #%d", number );
oedit_disp_prompt_apply_menu( d );
return;
case OEDIT_EXTRADESC_KEY:
/*
* if ( SetOExtra( obj, arg ) || SetOExtraProto( obj->pIndexData, arg ) )
* {
* send_to_char( "A extradesc with that keyword already exists.\r\n", d->character );
* oedit_disp_extradesc_menu(d);
* return;
* }
*/
olc_log( d, "Changed exdesc %s to %s", ed->keyword, arg );
STRFREE( ed->keyword );
ed->keyword = STRALLOC( arg );
oedit_disp_extra_choice( d );
return;
case OEDIT_EXTRADESC_DESCRIPTION:
/*
* Should never reach this
*/
break;
case OEDIT_EXTRADESC_CHOICE:
number = atoi( arg );
switch ( number )
{
case 0:
OLC_MODE( d ) = OEDIT_EXTRADESC_MENU;
oedit_disp_extradesc_menu( d );
return;
case 1:
OLC_MODE( d ) = OEDIT_EXTRADESC_KEY;
send_to_char( "Enter keywords, speperated by spaces: ", d->character );
return;
case 2:
OLC_MODE( d ) = OEDIT_EXTRADESC_DESCRIPTION;
d->character->substate = SUB_OBJ_EXTRA;
d->character->last_cmd = do_oedit_reset;
send_to_char( "Enter new extra description - :\r\n", d->character );
if( !ed->description )
ed->description = STRALLOC( "" );
start_editing( d->character, ed->description );
return;
}
break;
case OEDIT_EXTRADESC_DELETE:
ed = oedit_find_extradesc( obj, atoi( arg ) );
if( !ed )
{
send_to_char( "Extra description not found, try again: ", d->character );
return;
}
olc_log( d, "Deleted exdesc %s", ed->keyword );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
UNLINK( ed, obj->pIndexData->first_extradesc, obj->pIndexData->last_extradesc, next, prev );
else
UNLINK( ed, obj->first_extradesc, obj->last_extradesc, next, prev );
STRFREE( ed->keyword );
STRFREE( ed->description );
DISPOSE( ed );
top_ed--;
oedit_disp_extradesc_menu( d );
return;
case OEDIT_EXTRADESC_MENU:
switch ( UPPER( arg[0] ) )
{
case 'Q':
break;
case 'A':
CREATE( ed, EXTRA_DESCR_DATA, 1 );
if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) )
LINK( ed, obj->pIndexData->first_extradesc, obj->pIndexData->last_extradesc, next, prev );
else
LINK( ed, obj->first_extradesc, obj->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 );
return;
case 'R':
OLC_MODE( d ) = OEDIT_EXTRADESC_DELETE;
send_to_char( "Delete which extra description? ", d->character );
return;
default:
if( is_number( arg ) )
{
ed = oedit_find_extradesc( obj, atoi( arg ) );
if( !ed )
{
send_to_char( "Not found, try again: ", d->character );
return;
}
d->character->spare_ptr = ed;
oedit_disp_extra_choice( d );
}
else
oedit_disp_extradesc_menu( d );
return;
}
break;
case OEDIT_MPROGS:
switch ( UPPER( arg[0] ) )
{
case 'A':
if( obj->pIndexData->mudprogs != NULL )
for( ; mprog->next; mprog = mprog->next );
CREATE( mprg, MPROG_DATA, 1 );
if( obj->pIndexData->mudprogs )
mprog->next = mprg;
else
obj->pIndexData->mudprogs = mprg;
mprg->next = NULL;
d->character->spare_ptr = mprg;
oedit_disp_prog_choice( d );
return;
case 'R':
send_to_char( "Delete which prog? ", d->character );
OLC_MODE( d ) = OEDIT_MPROGS_DELETE;
return;
case 'Q':
break;
default:
if( is_number( arg ) )
{
mprg = oedit_find_prog( obj, atoi( arg ) );
if( !mprg )
{
send_to_char( "Not found, try again: ", d->character );
return;
}
d->character->spare_ptr = mprg;
oedit_disp_prog_choice( d );
}
else
oedit_disp_progs( d );
return;
}
break;
case OEDIT_MPROGS_CHOICE:
switch ( UPPER( arg[0] ) )
{
case 'A':
OLC_MODE( d ) = OEDIT_MPROGS_TYPE;
oedit_disp_prog_types( d );
return;
case 'B':
OLC_MODE( d ) = OEDIT_MPROGS_ARG;
send_to_char( "What are the arguments to the program? ", d->character );
return;
case 'C':
if( mprg->type < 1 )
{
send_to_char( "The program must have a type before you can edit it.", d->character );
return;
}
d->character->substate = SUB_MPROG_EDIT;
d->character->last_cmd = do_oedit_reset;
d->character->tempnum = CON_OEDIT;
if( !mprg->comlist )
mprg->comlist = STRALLOC( "" );
start_editing( d->character, mprg->comlist );
return;
case 'Q':
oedit_disp_progs( d );
return;
}
break;
case OEDIT_MPROGS_TYPE:
d->character->tempnum = mprg->type;
if( !is_number( arg ) )
{
number = get_mpflag( arg );
if( number < 0 )
{
send_to_char( "Invalid program type, try again: ", d->character );
return;
}
}
else
{
number = atoi( arg );
if( number < 0 || number > USE_PROG )
{
send_to_char( "Invalid program type, try again: ", d->character );
return;
}
}
mprg->type = number;
olc_log( d, "Changed prog %s to %s",
d->character->tempnum > 0 ? mprog_type_to_name( d->character->tempnum ) : "(none)",
mprog_type_to_name( number ) );
oedit_disp_prog_choice( d );
return;
case OEDIT_MPROGS_DELETE:
mprg = oedit_find_prog( obj, atoi( arg ) );
if( !mprg )
{
send_to_char( "Not found, try again: ", d->character );
return;
}
STRFREE( mprg->arglist );
STRFREE( mprg->comlist );
DISPOSE( mprg );
mprg = mprg->next;
oedit_disp_progs( d );
return;
default:
bug( "Oedit_parse: Reached default case!", 0 );
break;
}
/*
* . If we get here, we have changed something .
*/
OLC_CHANGE( d ) = TRUE; /*. Has changed flag . */
oedit_disp_menu( d );
}