#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#define SEX_NONE 4
#define ROOM_NONE 0
#define EX_NONE 0
#define ITEM_NONE 0
#define EXTRA_NONE 0
#define ITEM_WEAR_NONE 0
#define ACT_NONE 0
#define AFFECT_NONE 0
/* You can define verbose if you want details printed out when
resets are saved. */
/*
#define VERBOSE
*/
#define SKILLSN(sn) (sn != -1 ? skill_table[sn].slot : 0)
#define IS_BUILDER(ch, Area) ( GET_PC(ch,security,8) <= Area->security \
|| strstr( Area->builders, ch->name ) != NULL \
|| strstr( Area->builders, "All" ) != NULL \
|| (IS_NPC(ch) && ch->pIndexData->area == Area) )
/*
* Globals
*/
extern int top_reset;
extern int top_area;
extern int top_exit;
extern int top_ed;
extern int top_room;
AREA_DATA * area_free;
EXTRA_DESCR_DATA * extra_descr_free;
EXIT_DATA * exit_free;
ROOM_INDEX_DATA * room_index_free;
OBJ_INDEX_DATA * obj_index_free;
SHOP_DATA * shop_free;
MOB_INDEX_DATA * mob_index_free;
RESET_DATA * reset_free;
/*
* Memory Recycling
*/
RESET_DATA *new_reset_data( void )
{
RESET_DATA *pReset;
if ( reset_free == NULL )
{
pReset = alloc_perm( sizeof(*pReset) );
top_reset++;
}
else
{
pReset = reset_free;
reset_free = reset_free->next;
}
pReset->next = NULL;
pReset->command = 'X';
pReset->arg1 = 0;
pReset->arg2 = 0;
pReset->arg3 = 0;
return pReset;
}
void free_reset_data( RESET_DATA *pReset )
{
pReset->next = reset_free;
reset_free = pReset;
return;
}
AREA_DATA *new_area( void )
{
AREA_DATA *pArea;
char buf[MAX_INPUT_LENGTH];
if ( area_free == NULL )
{
pArea = alloc_perm( sizeof(*pArea) );
top_area++;
}
else
{
pArea = area_free;
area_free = area_free->next;
}
pArea->next = NULL;
pArea->reset_first = NULL;
pArea->reset_last = NULL;
pArea->name = str_dup( "New area" );
pArea->recall = ROOM_VNUM_TEMPLE;
pArea->area_flags = AREA_ADDED;
pArea->security = 1;
pArea->builders = str_dup( "None" );
pArea->lvnum = 0;
pArea->uvnum = 0;
pArea->age = 0;
pArea->nplayer = 0;
sprintf( buf, "area%d.are", pArea->vnum );
pArea->filename = str_dup( buf );
pArea->vnum = top_area-1;
return pArea;
}
void free_area( AREA_DATA *pArea )
{
RESET_DATA *pReset;
free_string( pArea->name );
free_string( pArea->filename );
free_string( pArea->builders );
for ( pReset = pArea->reset_first; pReset != NULL; pReset = pReset->next )
{
free_reset_data( pReset );
}
pArea->next = area_free->next;
area_free = pArea;
return;
}
EXIT_DATA *new_exit( void )
{
EXIT_DATA *pExit;
if ( exit_free == NULL )
{
pExit = alloc_perm( sizeof(*pExit) );
top_exit++;
}
else
{
pExit = exit_free;
exit_free = exit_free->next;
}
pExit->to_room = NULL;
pExit->next = NULL;
pExit->vnum = 0;
pExit->exit_info = 0;
pExit->key = 0;
pExit->keyword = NULL;
pExit->description = str_dup("");
pExit->rs_flags = 0;
return pExit;
}
void free_exit( EXIT_DATA *pExit )
{
free_string( pExit->keyword );
free_string( pExit->description );
pExit->next = exit_free;
exit_free = pExit;
return;
}
EXTRA_DESCR_DATA *new_extra_descr( void )
{
EXTRA_DESCR_DATA *pExtra;
if ( extra_descr_free == NULL )
{
pExtra = alloc_perm( sizeof(*pExtra) );
top_ed++;
}
else
{
pExtra = extra_descr_free;
extra_descr_free = extra_descr_free->next;
}
pExtra->keyword = NULL;
pExtra->description = NULL;
pExtra->next = NULL;
return pExtra;
}
void free_extra_descr( EXTRA_DESCR_DATA *pExtra )
{
free_string( pExtra->keyword );
free_string( pExtra->description );
pExtra->next = extra_descr_free;
extra_descr_free = pExtra;
return;
}
ROOM_INDEX_DATA *new_room_index( void )
{
ROOM_INDEX_DATA *pRoom;
int door;
if ( room_index_free == NULL )
{
pRoom = alloc_perm( sizeof(*pRoom) );
top_room++;
}
else
{
pRoom = room_index_free;
room_index_free = room_index_free->next;
}
pRoom->next = NULL;
pRoom->people = NULL;
pRoom->contents = NULL;
pRoom->extra_descr = NULL;
pRoom->area = NULL;
for ( door=0; door < MAX_DIR; door++ )
pRoom->exit[door] = NULL;
pRoom->name = &str_empty[0];
pRoom->description = &str_empty[0];
pRoom->vnum = 0;
pRoom->room_flags = 0;
pRoom->light = 0;
pRoom->sector_type = 0;
return pRoom;
}
void free_room_index( ROOM_INDEX_DATA *pRoom )
{
int door;
EXTRA_DESCR_DATA *pExtra;
free_string( pRoom->name );
free_string( pRoom->description );
for ( door = 0; door < MAX_DIR; door++ )
{
if ( pRoom->exit[door] != NULL )
free_exit( pRoom->exit[door] );
}
for ( pExtra = pRoom->extra_descr; pExtra != NULL; pExtra = pExtra->next )
{
free_extra_descr( pExtra );
}
pRoom->next = room_index_free;
room_index_free = pRoom;
return;
}
AFFECT_DATA *new_affect( void )
{
AFFECT_DATA *pAf;
if ( affect_free == NULL )
{
pAf = alloc_perm( sizeof(*pAf) );
top_affect++;
}
else
{
pAf = affect_free;
affect_free = affect_free->next;
}
pAf->next = NULL;
pAf->location = 0;
pAf->modifier = 0;
pAf->type = 0;
pAf->duration = 0;
pAf->bitvector = 0;
return pAf;
}
void free_affect( AFFECT_DATA* pAf )
{
pAf->next = affect_free;
affect_free = pAf;
return;
}
SHOP_DATA *new_shop( void )
{
SHOP_DATA *pShop;
int buy;
if ( shop_free == NULL )
{
pShop = alloc_perm( sizeof(*pShop) );
top_shop++;
}
else
{
pShop = shop_free;
shop_free = shop_free->next;
}
pShop->next = NULL;
pShop->keeper = 0;
for ( buy=0; buy<MAX_TRADE; buy++ )
pShop->buy_type[buy] = ITEM_NONE;
pShop->profit_buy = 100;
pShop->profit_sell = 100;
pShop->open_hour = 0;
pShop->close_hour = 23;
return pShop;
}
void free_shop( SHOP_DATA *pShop )
{
pShop->next = shop_free;
shop_free = pShop;
return;
}
OBJ_INDEX_DATA *new_obj_index( void )
{
OBJ_INDEX_DATA *pObj;
int value;
if ( obj_index_free == NULL )
{
pObj = alloc_perm( sizeof(*pObj) );
top_obj_index++;
}
else
{
pObj = obj_index_free;
obj_index_free = obj_index_free->next;
}
pObj->next = NULL;
pObj->extra_descr = NULL;
pObj->affected = NULL;
pObj->area = NULL;
pObj->name = str_dup( "no name" );
pObj->short_descr = str_dup( "(no short description)" );
pObj->description = str_dup( "(no description)" );
pObj->vnum = 0;
pObj->item_type = ITEM_TRASH;
pObj->extra_flags = 0;
pObj->wear_flags = 0;
pObj->count = 0;
pObj->weight = 0;
pObj->cost = 0;
for ( value=0; value<4; value++ )
pObj->value[value] = 0;
return pObj;
}
void free_obj_index( OBJ_INDEX_DATA *pObj )
{
EXTRA_DESCR_DATA *pExtra;
AFFECT_DATA *pAf;
free_string( pObj->name );
free_string( pObj->short_descr );
free_string( pObj->description );
for ( pAf = pObj->affected; pAf != NULL; pAf = pAf->next )
{
free_affect( pAf );
}
for ( pExtra = pObj->extra_descr; pExtra != NULL; pExtra = pExtra->next )
{
free_extra_descr( pExtra );
}
pObj->next = obj_index_free;
obj_index_free = pObj;
return;
}
MOB_INDEX_DATA *new_mob_index( void )
{
MOB_INDEX_DATA *pMob;
if ( mob_index_free == NULL )
{
pMob = alloc_perm( sizeof(*pMob) );
top_mob_index++;
}
else
{
pMob = mob_index_free;
mob_index_free = mob_index_free->next;
}
pMob->next = NULL;
pMob->spec_fun = NULL;
pMob->spec_name = NULL;
pMob->pShop = NULL;
pMob->area = NULL;
pMob->player_name = str_dup( "no name" );
pMob->short_descr = str_dup( "(no short description)" );
pMob->long_descr = str_dup( "(no long description)" );
pMob->description = str_dup( "" );
pMob->vnum = 0;
pMob->count = 0;
pMob->killed = 0;
pMob->sex = 0;
pMob->level = 0;
pMob->act = 1; /* NPC */
pMob->affected_by = 0;
pMob->alignment = 0;
pMob->hitroll = 0;
pMob->ac = 0;
pMob->hitnodice = 0;
pMob->hitsizedice = 0;
pMob->hitplus = 0;
pMob->damnodice = 0;
pMob->damsizedice = 0;
pMob->damplus = 0;
pMob->gold = 0;
return pMob;
}
void free_mob_index( MOB_INDEX_DATA *pMob )
{
free_string( pMob->player_name );
free_string( pMob->short_descr );
free_string( pMob->long_descr );
free_string( pMob->description );
free_shop( pMob->pShop );
pMob->next = mob_index_free;
mob_index_free = pMob;
return;
}
/*
* End Memory Recycling
*/
AREA_DATA *get_area_data( int vnum )
{
AREA_DATA *pArea;
for (pArea = area_first; pArea != NULL; pArea = pArea->next )
{
if (pArea->vnum == vnum)
return pArea;
}
return NULL;
}
AREA_DATA *get_vnum_area( int vnum )
{
AREA_DATA *pArea;
for ( pArea = area_first; pArea != NULL; pArea = pArea->next )
{
if ( vnum >= pArea->lvnum
&& vnum <= pArea->uvnum )
return pArea;
}
return NULL;
}
char *area_bit_name( int area_flags )
{
static char buf[512];
buf[0] = '\0';
if ( area_flags & AREA_CHANGED ) strcat( buf, " CHANGED" );
else strcat( buf, " changed" );
if ( area_flags & AREA_ADDED ) strcat( buf, " ADDED" );
else strcat( buf, " added" );
return buf+1;
}
int get_area_flags_number( char *argument )
{
if ( !str_cmp( argument, "changed" ) ) return AREA_CHANGED;
if ( !str_cmp( argument, "added" ) ) return AREA_ADDED;
return AREA_NONE;
}
void aedit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
char arg[MAX_STRING_LENGTH];
char arg1[MAX_STRING_LENGTH];
char arg2[MAX_STRING_LENGTH];
char buf [MAX_STRING_LENGTH];
int value;
pArea = (AREA_DATA *)ch->desc->pEdit;
strcpy( arg, argument );
smash_tilde( argument );
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "AEdit: Insufficient security to modify area.\n\r", ch );
}
if ( !str_cmp( arg1, "show" ) || arg_count( arg ) == 0 )
{
sprintf( buf, "%d", pArea->vnum );
do_ashow( ch, buf );
return;
}
if ( !str_cmp( arg1, "done" ) )
{
ch->desc->pEdit = NULL;
ch->desc->connected = CON_PLAYING;
return;
}
if ( !str_cmp( arg1, "?" ) )
{
do_help( ch, "aedit" );
return;
}
if ( !IS_BUILDER( ch, pArea ) )
{
interpret( ch, arg );
return;
}
if ( ( value = get_area_flags_number( arg1 ) ) != AREA_NONE )
{
TOGGLE_BIT(pArea->area_flags, value);
send_to_char( "Flag toggled.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "create" ) )
{
pArea = new_area();
area_last->next = pArea;
ch->desc->pEdit = (void *)pArea;
SET_BIT( pArea->area_flags, AREA_ADDED );
send_to_char( "Area Created.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "name" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: name [$name]\n\r", ch );
return;
}
free_string( pArea->name );
pArea->name = str_dup( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Name set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "filename" ) || !str_cmp( arg1, "file" ) )
{
if ( argument[0] == '\0' )
{
send_to_char( "Syntax: filename [$file]\n\r", ch );
send_to_char( "or file [$file]\n\r", ch );
return;
}
free_string( pArea->filename );
pArea->filename = str_dup( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Filename set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "age" ) )
{
if ( !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: age [#age]\n\r", ch );
return;
}
pArea->age = atoi( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Age set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "recall" ) )
{
if ( !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: recall [#rvnum]\n\r", ch );
return;
}
value = atoi( arg2 );
if ( get_room_index( value ) == NULL && value != 0 )
{
send_to_char( "AEdit: Room vnum does not exist.\n\r", ch );
return;
}
pArea->recall = value;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Recall set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "security" ) )
{
if ( !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: security [#level]\n\r", ch );
return;
}
value = atoi( arg2 );
if ( IS_NPC(ch) || value < GET_PC(ch,security,0) || value > 9 )
{
if ( GET_PC(ch,security,9) != 9 )
{
sprintf( buf, "Valid security range is %d-9.\n\r", PC(ch,security) );
send_to_char( buf, ch );
}
else
{
send_to_char( "Valid security is 9 only.\n\r", ch );
}
return;
}
pArea->security = value;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Security set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "builder" ) )
{
argument = one_argument( argument, arg2 );
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: builder [$name]\n\r", ch );
return;
}
arg2[0] = UPPER( arg2[0] );
if ( strstr( pArea->builders, arg2 ) != '\0' )
{
pArea->builders = string_replace( pArea->builders, arg2, "\0" );
pArea->builders = string_unpad( pArea->builders );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Builder removed.\n\r", ch );
return;
}
else
{
buf[0] = '\0';
if ( strstr( pArea->builders, "None" ) != '\0' )
{
pArea->builders = string_replace( pArea->builders, "None", "\0" );
pArea->builders = string_unpad( pArea->builders );
}
if (pArea->builders[0] != '\0' )
{
strcat( buf, pArea->builders );
strcat( buf, " " );
}
strcat( buf, arg2 );
free_string( pArea->builders );
pArea->builders = string_proper( str_dup( buf ) );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Builder added.\n\r", ch );
return;
}
}
if ( !str_cmp( arg1, "lvnum" ) )
{
if ( !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: lvnum [#lower]\n\r", ch );
return;
}
value = atoi( arg2 );
if ( get_vnum_area( value ) != NULL
&& get_vnum_area( value ) != pArea )
{
send_to_char( "AEdit: Vnum range already assigned.\n\r", ch );
return;
}
pArea->lvnum = value;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Lower vnum set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "uvnum" ) )
{
if ( !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: uvnum [#upper]\n\r", ch );
return;
}
value = atoi( arg2 );
if ( get_vnum_area( value ) != NULL
&& get_vnum_area( value ) != pArea )
{
send_to_char( "AEdit: Vnum range already assigned.\n\r", ch );
return;
}
pArea->uvnum = value;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Upper vnum set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "vnum" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( !is_number( arg1 ) || arg1[0] == '\0'
|| !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: vnum [#lower] [#upper]\n\r", ch );
return;
}
value = atoi( arg1 );
if ( get_vnum_area( value ) != NULL
&& get_vnum_area( value ) != pArea )
{
send_to_char( "AEdit: Lower vnum already assigned.\n\r", ch );
return;
}
pArea->lvnum = value;
send_to_char( "Lower vnum set.\n\r", ch );
value = atoi( arg2 );
if ( get_vnum_area( value ) != NULL
&& get_vnum_area( value ) != pArea )
{
send_to_char( "AEdit: Upper vnum already assigned.\n\r", ch );
return;
}
pArea->uvnum = value;
send_to_char( "Upper vnum set.\n\r", ch );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
interpret( ch, arg );
return;
}
int get_direction_number( char *arg )
{
if ( !str_cmp( arg, "n" ) || !str_cmp( arg, "north" ) ) return DIR_NORTH;
if ( !str_cmp( arg, "e" ) || !str_cmp( arg, "east" ) ) return DIR_EAST;
if ( !str_cmp( arg, "s" ) || !str_cmp( arg, "south" ) ) return DIR_SOUTH;
if ( !str_cmp( arg, "w" ) || !str_cmp( arg, "west" ) ) return DIR_WEST;
if ( !str_cmp( arg, "u" ) || !str_cmp( arg, "up" ) ) return DIR_UP;
if ( !str_cmp( arg, "d" ) || !str_cmp( arg, "down" ) ) return DIR_DOWN;
return MAX_DIR;
}
int get_exit_flag_number( char *arg )
{
if ( !str_cmp( arg, "door" ) ) return EX_ISDOOR;
if ( !str_cmp( arg, "closed" ) ) return EX_CLOSED;
if ( !str_cmp( arg, "locked" ) ) return EX_LOCKED;
if ( !str_cmp( arg, "bashed" ) ) return EX_BASHED;
if ( !str_cmp( arg, "bashproof" ) ) return EX_BASHPROOF;
if ( !str_cmp( arg, "pickproof" ) ) return EX_PICKPROOF;
if ( !str_cmp( arg, "passproof" ) ) return EX_PASSPROOF;
return EX_NONE;
}
char *get_exit_flag_string( int exit )
{
static char buf[512];
buf[0] = '\0';
if ( exit & EX_CLOSED ) strcat( buf, " closed" );
if ( exit & EX_LOCKED ) strcat( buf, " locked" );
if ( exit & EX_BASHED ) strcat( buf, " bashed" );
if ( exit & EX_BASHPROOF ) strcat( buf, " bashproof" );
if ( exit & EX_PICKPROOF ) strcat( buf, " pickproof" );
if ( exit & EX_PASSPROOF ) strcat( buf, " passproof" );
return ( buf[0] != '\0' ) ? buf+1 : "open";
}
void redit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
ROOM_INDEX_DATA *pRoom;
EXIT_DATA *pExit;
EXTRA_DESCR_DATA *ed;
char arg[MAX_STRING_LENGTH];
char arg1[MAX_STRING_LENGTH];
char arg2[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
int value;
int iHash;
int door;
strcpy( arg, argument );
smash_tilde( argument );
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
pRoom = ch->in_room;
pArea = pRoom->area;
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "REdit: Insufficient security to modify room.\n\r", ch );
}
if ( !str_cmp( arg1, "show" ) || arg1[0] == '\0' )
{
sprintf( buf, "%d", pRoom->vnum );
do_rshow( ch, buf );
return;
}
if ( !str_cmp( arg1, "done" ) )
{
ch->desc->pEdit = NULL;
ch->desc->connected = CON_PLAYING;
return;
}
if ( !str_cmp( arg1, "?" ) )
{
do_help( ch, "redit" );
return;
}
if ( !IS_BUILDER( ch, pArea ) )
{
interpret( ch, arg );
return;
}
if ( room_name_bit( arg1 ) != ROOM_NONE )
{
TOGGLE_BIT(pRoom->room_flags, room_name_bit( arg1 ));
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Room flag toggled.\n\r", ch );
return;
}
if ( sector_number( arg1 ) != SECT_MAX )
{
pRoom->sector_type = sector_number( arg1 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Sector type set.\n\r", ch );
return;
}
if ( ( door = get_direction_number( arg1 ) ) != MAX_DIR && arg2[0] != '\0' )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( !str_cmp( arg1, "delete" ) )
{
if ( pRoom->exit[door] == NULL )
{
send_to_char( "REdit: Cannot delete a non-existant exit.\n\r", ch );
return;
}
free_exit( pRoom->exit[door] );
pRoom->exit[door] = NULL;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Exit unlinked.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "link" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: [direction] link [vnum]\n\r", ch );
return;
}
value = atoi( arg2 );
if ( get_room_index( value ) == NULL )
{
send_to_char( "REdit: Cannot link to non-existant room.\n\r", ch );
return;
}
if ( !IS_BUILDER( ch, get_room_index( value )->area ) )
{
send_to_char( "REdit: Remote side not created, not a builder there.\n\r", ch );
return;
}
if ( get_room_index( value )->exit[rev_dir[door]] != NULL )
{
send_to_char( "REdit: Remote side's exit already exists.\n\r", ch );
return;
}
if ( pRoom->exit[door] == NULL )
{
pRoom->exit[door] = new_exit();
}
pRoom->exit[door]->to_room = get_room_index( value );
pRoom->exit[door]->vnum = value;
pRoom = get_room_index( value );
door = rev_dir[door];
pExit = new_exit();
pExit->to_room = ch->in_room;
pExit->vnum = ch->in_room->vnum;
pRoom->exit[door] = pExit;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Exit linked.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "dig" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: [direction] dig <vnum>\n\r", ch );
return;
}
sprintf( buf, "create %s", arg2 );
redit( ch, buf );
sprintf( buf, "%s link %s", dir_name[door], arg2 );
redit( ch, buf );
return;
}
if ( !str_cmp( arg1, "room" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: [direction] room [vnum]\n\r", ch );
return;
}
if ( pRoom->exit[door] == NULL )
{
pRoom->exit[door] = new_exit();
}
value = atoi( arg2 );
if ( get_room_index( value ) == NULL )
{
send_to_char( "REdit: Cannot link to non-existant room.\n\r", ch );
return;
}
pRoom->exit[door]->to_room = get_room_index( value );
pRoom->exit[door]->vnum = value;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Exit set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "key" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: [direction] key [vnum]\n\r", ch );
return;
}
if ( pRoom->exit[door] == NULL )
{
pRoom->exit[door] = new_exit();
}
value = atoi( arg2 );
if ( get_obj_index( value ) == NULL )
{
send_to_char( "REdit: Cannot use a non-existant object as a key.\n\r", ch );
return;
}
pRoom->exit[door]->key = value;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Exit key set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "name" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: [direction] name [string]\n\r", ch );
return;
}
if ( pRoom->exit[door] == NULL )
{
pRoom->exit[door] = new_exit();
}
free_string( pRoom->exit[door]->keyword );
pRoom->exit[door]->keyword = str_dup( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Exit name set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "desc" ) || !str_cmp( arg1, "description" ) )
{
if ( pRoom->exit[door] == NULL )
{
pRoom->exit[door] = new_exit();
}
if ( arg2[0] == '\0' )
{
string_append( ch, &pRoom->exit[door]->description );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( arg2[0] == '+' )
{
string_append( ch, &pRoom->exit[door]->description );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
send_to_char( "Syntax: [direction] desc - line edit\n\r", ch );
send_to_char( " [direction] desc + - line append\n\r",ch );
return;
}
if ( get_exit_flag_number( arg1 ) != EX_NONE )
{
if ( pRoom->exit[door] == NULL )
{
pRoom->exit[door] = new_exit();
}
TOGGLE_BIT(pRoom->exit[door]->rs_flags, get_exit_flag_number( arg1 ));
TOGGLE_BIT(pRoom->exit[door]->exit_info, get_exit_flag_number( arg1 ));
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Exit flag toggled.\n\r", ch );
return;
}
}
if ( !str_cmp( arg1, "ed" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed add [keyword]\n\r", ch );
send_to_char( " ed delete [keyword]\n\r", ch );
send_to_char( " ed edit [keyword]\n\r", ch );
send_to_char( " ed format [keyword]\n\r", ch );
return;
}
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( !str_cmp( arg1, "add" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed add [keyword]\n\r", ch );
return;
}
ed = new_extra_descr();
ed->keyword = str_dup( arg2 );
ed->description = str_dup( "" );
ed->next = pRoom->extra_descr;
pRoom->extra_descr = ed;
string_append( ch, &ed->description );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "edit" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed edit [keyword]\n\r", ch );
return;
}
for ( ed = pRoom->extra_descr; ed != NULL; ed = ed->next )
{
if ( is_name( arg2, ed->keyword ) )
break;
}
if ( ed == NULL )
{
send_to_char( "REdit: Extra description keyword not found.\n\r", ch );
return;
}
string_append( ch, &ed->description );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "append" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed edit [keyword]\n\r", ch );
return;
}
for ( ed = pRoom->extra_descr; ed != NULL; ed = ed->next )
{
if ( is_name( arg2, ed->keyword ) )
break;
}
if ( ed == NULL )
{
send_to_char( "REdit: Extra description keyword not found.\n\r", ch );
return;
}
string_append( ch, &ed->description );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "delete" ) )
{
EXTRA_DESCR_DATA *ped;
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed delete [keyword]\n\r", ch );
return;
}
ped = NULL;
for ( ed = pRoom->extra_descr; ed != NULL; ed = ed->next )
{
if ( is_name( arg2, ed->keyword ) )
break;
ped = ed;
}
if ( ed == NULL )
{
send_to_char( "REdit: Extra description keyword not found.\n\r", ch );
return;
}
if ( ped == NULL )
{
pRoom->extra_descr = ed->next;
}
else
{
ped->next = ed->next;
}
free_extra_descr( ed );
send_to_char( "Extra description deleted.\n\r", ch );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "format" ) )
{
EXTRA_DESCR_DATA *ped;
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed format [keyword]\n\r", ch );
return;
}
ped = NULL;
for ( ed = pRoom->extra_descr; ed != NULL; ed = ed->next )
{
if ( is_name( arg2, ed->keyword ) )
break;
ped = ed;
}
if ( ed == NULL )
{
send_to_char( "REdit: Extra description keyword not found.\n\r", ch );
return;
}
ed->description = format_string( ed->description );
send_to_char( "Extra description formatted.\n\r", ch );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
}
if ( !str_cmp( arg1, "create" ) )
{
value = atoi( arg2 );
if ( arg2[0] == '\0' || value == 0 )
{
send_to_char( "Syntax: create [vnum]\n\r", ch );
return;
}
pArea = get_vnum_area( value );
if ( pArea == NULL )
{
send_to_char( "REdit: That vnum is not assigned an area.\n\r", ch );
return;
}
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "REdit: Vnum in an area you cannot build in.\n\r", ch );
return;
}
if ( get_room_index( value ) != NULL )
{
send_to_char( "REdit: Room vnum already exists.\n\r", ch );
return;
}
pRoom = new_room_index();
pRoom->area = pArea;
pRoom->vnum = value;
if ( value > top_vnum_room ) top_vnum_room = value;
iHash = value % MAX_KEY_HASH;
pRoom->next = room_index_hash[iHash];
room_index_hash[iHash] = pRoom;
ch->desc->pEdit = (void *)pRoom;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Room created.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "name" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: name [name]\n\r", ch );
return;
}
free_string( pRoom->name );
pRoom->name = str_dup( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Name set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "desc" ) || !str_cmp( arg1, "description" ) )
{
if ( arg2[0] == '\0' )
{
string_append( ch, &pRoom->description );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( arg2[0] == '+' )
{
string_append( ch, &pRoom->description );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
send_to_char( "Syntax: desc - line edit\n\r", ch );
send_to_char( " desc + - line append\n\r",ch );
return;
}
if ( !str_cmp( arg1, "format" ) )
{
pRoom->description = format_string( pRoom->description );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "String formatted.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "light" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: light [number]\n\r", ch );
return;
}
value = atoi( arg2 );
pRoom->light = value;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Light set.\n\r", ch);
return;
}
interpret( ch, arg );
return;
}
void show_obj_values( CHAR_DATA *ch, OBJ_INDEX_DATA *obj )
{
char buf[MAX_STRING_LENGTH];
switch( obj->item_type )
{
default:
sprintf( buf, "This object has no values.\n\r" );
send_to_char( buf, ch );
break;
case ITEM_LIGHT:
if ( obj->value[2] == -1 )
sprintf( buf, "Hours of light(v2): Infinite(-1)\n\r" );
else
sprintf( buf, "Hours of light(v2): %d\n\r", obj->value[2] );
send_to_char( buf, ch );
break;
case ITEM_WAND:
case ITEM_STAFF:
sprintf( buf, "(v3) %s\n\rLevel (v0): %d\n\rCharges (v2)/(v1): %d / %d\n\r",
obj->value[3] != -1 ?
capitalize(skill_table[obj->value[3]].name)
: "!NO SPELL!",
obj->value[0], obj->value[2], obj->value[1] );
send_to_char( buf, ch );
break;
case ITEM_SCROLL:
case ITEM_POTION:
case ITEM_PILL:
sprintf( buf, "(v1) %s\n\r(v2) %s\n\r(v3) %s\n\rLevel (v0): %d\n\r",
obj->value[1] != -1 ?
capitalize(skill_table[obj->value[1]].name)
: "!NO SPELL!",
obj->value[2] != -1 ? skill_table[obj->value[2]].name
: "!NO SPELL!",
obj->value[3] != -1 ? skill_table[obj->value[3]].name
: "!NO SPELL!",
obj->value[0] );
send_to_char( buf, ch );
break;
case ITEM_WEAPON:
sprintf( buf, "Type(v3): %s\n\rMin dam(v1): %d\n\rMax dam(v2): %d\n\r",
get_type_weapon(obj->value[3]),
obj->value[1], obj->value[2] );
send_to_char( buf, ch );
break;
case ITEM_CONTAINER:
sprintf( buf, "Weight (v0): %d \n\rFlags (v1): %s\nrKey (v2): %s (%d)\n\r",
obj->value[0], get_flags_container(obj->value[1]),
get_obj_index(obj->value[2])
? get_obj_index(obj->value[2])->short_descr
: "none",
obj->value[2]);
send_to_char( buf, ch );
break;
case ITEM_DRINK_CON:
sprintf( buf, "Contains (v1)/(v0): %d/%d\n\rLiquid (v2): %s\n\rPoisoned? (v3): %s\n\r",
obj->value[1], obj->value[0], get_type_liquid(obj->value[2]),
obj->value[3] != 0 ? "Yes" : "No" );
send_to_char( buf, ch );
break;
case ITEM_FOOD:
sprintf( buf, "Hours of food (v0): %d\n\rPoisoned? (v3): %s\n\r",
obj->value[0], obj->value[3] != 0 ? "Yes" : "No" );
send_to_char( buf, ch );
break;
case ITEM_MONEY:
sprintf( buf, "Amount of Gold (v0): %d\n\r", obj->value[0] );
send_to_char( buf, ch );
break;
}
return;
}
void set_obj_values( CHAR_DATA *ch, OBJ_INDEX_DATA *pObj, int value_num, char *argument)
{
switch( pObj->item_type )
{
default:
break;
case ITEM_LIGHT:
switch ( value_num )
{
default:
do_help( ch, "b_ref item_light" );
break;
case 2:
send_to_char( "HOURS OF LIGHT SET.\n\r\n\r", ch );
pObj->value[2] = atoi( argument );
break;
}
break;
case ITEM_WAND:
case ITEM_STAFF:
switch ( value_num )
{
default:
do_help( ch, "b_ref item_staff_wand" );
break;
case 0:
send_to_char( "SPELL LEVEL SET.\n\r\n\r", ch );
pObj->value[0] = atoi( argument );
break;
case 1:
send_to_char( "TOTAL NUMBER OF CHARGES SET.\n\r\n\r", ch );
pObj->value[1] = atoi( argument );
break;
case 2:
send_to_char( "CURRENT NUMBER OF CHARGES SET.\n\r\n\r", ch );
pObj->value[2] = atoi( argument );
break;
case 3:
send_to_char( "SPELL TYPE SET.\n\r", ch );
pObj->value[3] = skill_lookup( argument );
break;
}
break;
case ITEM_SCROLL:
case ITEM_POTION:
case ITEM_PILL:
switch ( value_num )
{
default:
do_help( ch, "b_ref item_scroll_potion_pill" );
break;
case 0:
send_to_char( "SPELL LEVEL SET.\n\r\n\r", ch );
pObj->value[0] = atoi( argument );
break;
case 1:
send_to_char( "SPELL TYPE 1 SET.\n\r\n\r", ch );
pObj->value[1] = skill_lookup( argument );
break;
case 2:
send_to_char( "SPELL TYPE 2 SET.\n\r\n\r", ch );
pObj->value[2] = skill_lookup( argument );
break;
case 3:
send_to_char( "SPELL TYPE 3 SET.\n\r\n\r", ch );
pObj->value[3] = skill_lookup( argument );
break;
}
break;
case ITEM_WEAPON:
switch ( value_num )
{
default:
do_help( ch, "b_ref item_weapon" );
break;
case 1:
send_to_char( "MINIMUM DAMAGE SET.\n\r\n\r", ch );
pObj->value[1] = atoi( argument );
break;
case 2:
send_to_char( "MAXIMUM DAMAGE SET.\n\r\n\r", ch );
pObj->value[2] = atoi( argument );
break;
case 3:
send_to_char( "WEAPON TYPE SET.\n\r\n\r", ch );
pObj->value[3] = get_weapon_type( argument );
break;
}
break;
case ITEM_CONTAINER:
switch ( value_num )
{
default:
do_help( ch, "b_ref item_container" );
break;
case 0:
send_to_char( "WEIGHT CAPACITY SET.\n\r\n\r", ch );
pObj->value[0] = atoi( argument );
break;
case 1:
send_to_char( "CONTAINER TYPE SET.\n\r\n\r", ch );
pObj->value[1] = get_container_flags( argument );
break;
case 2:
if ( atoi(argument) != 0 )
{
if ( !get_obj_index( atoi( argument ) ) )
{
send_to_char( "THERE IS NO SUCH KEY.\n\r\n\r", ch );
break;
}
if ( get_obj_index( atoi( argument ) )->item_type != ITEM_KEY )
{
send_to_char( "THAT ITEM IS NOT A KEY.\n\r\n\r", ch );
break;
}
}
send_to_char( "CONTAINER KEY SET.\n\r\n\r", ch );
pObj->value[2] = atoi( argument );
break;
}
break;
case ITEM_DRINK_CON:
switch ( value_num )
{
default:
do_help( ch, "b_ref item_drink_con" );
do_help( ch, "liquids" );
break;
case 0:
send_to_char( "MAXIMUM AMOUT OF LIQUID HOURS SET.\n\r\n\r", ch );
pObj->value[0] = atoi( argument );
break;
case 1:
send_to_char( "CURRENT AMOUNT OF LIQUID HOURS SET.\n\r\n\r", ch );
pObj->value[1] = atoi( argument );
break;
case 2:
send_to_char( "LIQUID TYPE SET.\n\r\n\r", ch );
pObj->value[2] = get_liquid_type( argument );
break;
case 3:
send_to_char( "POISON VALUE TOGGLED.\n\r\n\r", ch );
pObj->value[3] = ( pObj->value[3] == 0 ) ? 1 : 0;
break;
}
break;
case ITEM_FOOD:
switch ( value_num )
{
default:
do_help( ch, "b_ref item_food" );
break;
case 0:
send_to_char( "HOURS OF FOOD SET.\n\r\n\r", ch );
pObj->value[0] = atoi( argument );
break;
case 3:
send_to_char( "POISON VALUE TOGGLED.\n\r\n\r", ch );
pObj->value[3] = ( pObj->value[3] == 0 ) ? 1 : 0;
break;
}
break;
case ITEM_MONEY:
switch ( value_num )
{
default:
do_help( ch, "b_ref item_money" );
break;
case 0:
send_to_char( "GOLD AMOUNT SET.\n\r\n\r", ch );
pObj->value[0] = atoi( argument );
break;
}
break;
}
show_obj_values( ch, pObj );
return;
}
void oedit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
OBJ_INDEX_DATA *pObj;
EXTRA_DESCR_DATA *ed;
AFFECT_DATA *pAf;
char arg[MAX_STRING_LENGTH];
char arg1[MAX_STRING_LENGTH];
char arg2[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
int value;
int iHash;
strcpy( arg, argument );
smash_tilde( argument );
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
pObj = (OBJ_INDEX_DATA *)ch->desc->pEdit;
pArea = pObj->area;
if ( !str_cmp( arg1, "show" ) || arg1[0] == '\0' )
{
sprintf( buf, "%d", pObj->vnum );
do_oshow( ch, buf );
return;
}
if ( !str_cmp( arg1, "done" ) )
{
ch->desc->pEdit = NULL;
ch->desc->connected = CON_PLAYING;
return;
}
if ( !str_cmp( arg1, "?" ) )
{
do_help( ch, "oedit" );
return;
}
if ( !str_cmp( arg1, "addaffect" ) )
{
char arg3[MAX_STRING_LENGTH];
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if ( arg1[0] == '\0' || arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: addaffect [location] [#mod]\n\r", ch );
return;
}
pAf = new_affect();
pAf->location = affect_name_loc( arg1 );
pAf->modifier = atoi( arg2 );
pAf->type = -1;
pAf->duration = -1;
pAf->bitvector = 0;
pAf->next = pObj->affected;
pObj->affected = pAf;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Affect added.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "delaffect" ) || !str_cmp( arg1, "remaffect" ) )
{
pAf = pObj->affected;
if ( pAf == NULL )
{
send_to_char( "OEdit: No affect to remove.\n\r", ch );
return;
}
pObj->affected = pObj->affected->next;
free_affect( pAf );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Affect removed.\n\r", ch);
return;
}
if ( ( value = item_name_type( arg1 ) ) != ITEM_NONE )
{
pObj->item_type = value;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Type set.\n\r", ch);
/*
* Clear the values.
*/
pObj->value[0] = 0;
pObj->value[1] = 0;
pObj->value[2] = 0;
pObj->value[3] = 0;
return;
}
if ( ( value = extra_name_bit( arg1 ) ) != EXTRA_NONE )
{
TOGGLE_BIT(pObj->extra_flags, value);
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Extra flag toggled.\n\r", ch);
return;
}
if ( ( value = wear_name_bit( arg1 ) ) != ITEM_WEAR_NONE )
{
TOGGLE_BIT(pObj->wear_flags, value);
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Wear flag toggled.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "name" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: name [string]\n\r", ch );
return;
}
free_string( pObj->name );
pObj->name = str_dup( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Name set.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "short" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: short [string]\n\r", ch );
return;
}
free_string( pObj->short_descr );
pObj->short_descr = str_dup( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Short description set.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "long" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: long [string]\n\r", ch );
return;
}
strcat( arg2, "\n\r" );
free_string( pObj->description );
pObj->description = str_dup( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Long description set.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "value0") || !str_cmp( arg1, "v0" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: value0 [number]\n\r", ch );
send_to_char( "or v0 [number]\n\r", ch );
set_obj_values( ch, pObj, -1, arg2 );
return;
}
set_obj_values( ch, pObj, 0, arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "value1") || !str_cmp( arg1, "v1" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: value1 [number]\n\r", ch );
send_to_char( "or v1 [number]\n\r", ch );
set_obj_values( ch, pObj, -1, arg2 );
return;
}
set_obj_values( ch, pObj, 1, arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "value2") || !str_cmp( arg1, "v2" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: value2 [number]\n\r", ch );
send_to_char( "or v2 [number]\n\r", ch );
set_obj_values( ch, pObj, -1, arg2 );
return;
}
set_obj_values( ch, pObj, 2, arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "value3") || !str_cmp( arg1, "v3" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: value3 [number]\n\r", ch );
send_to_char( "or v3 [number]\n\r", ch );
set_obj_values( ch, pObj, -1, arg2 );
return;
}
set_obj_values( ch, pObj, 3, arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "weight" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: weight [number]\n\r", ch );
return;
}
value = atoi( arg2 );
pObj->weight = value;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Weight set.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "cost" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: cost [number]\n\r", ch );
return;
}
value = atoi( arg2 );
pObj->cost = value;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Cost set.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "create" ) )
{
value = atoi( arg2 );
if ( arg2[0] == '\0' || value == 0 )
{
send_to_char( "Syntax: oedit create [vnum]\n\r", ch );
return;
}
pArea = get_vnum_area( value );
if ( pArea == NULL )
{
send_to_char( "OEdit: That vnum is not assigned an area.\n\r", ch );
return;
}
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "OEdit: Vnum in an area you cannot build in.\n\r", ch );
return;
}
if ( get_obj_index( value ) != NULL )
{
send_to_char( "OEdit: Object vnum already exists.\n\r", ch );
return;
}
pObj = new_obj_index();
pObj->vnum = value;
pObj->area = pArea;
if ( value > top_vnum_obj ) top_vnum_obj = value;
iHash = value % MAX_KEY_HASH;
pObj->next = obj_index_hash[iHash];
obj_index_hash[iHash] = pObj;
ch->desc->pEdit = (void *)pObj;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Object Created.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "ed" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed add [keyword]\n\r", ch );
send_to_char( " ed delete [keyword]\n\r", ch );
send_to_char( " ed edit [keyword]\n\r", ch );
send_to_char( " ed format [keyword]\n\r", ch );
return;
}
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( !str_cmp( arg1, "add" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed add [keyword]\n\r", ch );
return;
}
ed = new_extra_descr();
ed->keyword = str_dup( arg2 );
ed->next = pObj->extra_descr;
pObj->extra_descr = ed;
string_append( ch, &ed->description );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "edit" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed edit [keyword]\n\r", ch );
return;
}
for ( ed = pObj->extra_descr; ed != NULL; ed = ed->next )
{
if ( is_name( arg2, ed->keyword ) )
break;
}
if ( ed == NULL )
{
send_to_char( "OEdit: Extra description keyword not found.\n\r", ch );
return;
}
string_append( ch, &ed->description );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "append" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed edit [keyword]\n\r", ch );
return;
}
for ( ed = pObj->extra_descr; ed != NULL; ed = ed->next )
{
if ( is_name( arg2, ed->keyword ) )
break;
}
if ( ed == NULL )
{
send_to_char( "OEdit: Extra description keyword not found.\n\r", ch );
return;
}
string_append( ch, &ed->description );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "delete" ) )
{
EXTRA_DESCR_DATA *ped;
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed delete [keyword]\n\r", ch );
return;
}
ped = NULL;
for ( ed = pObj->extra_descr; ed != NULL; ed = ed->next )
{
if ( is_name( arg2, ed->keyword ) )
break;
ped = ed;
}
if ( ed == NULL )
{
send_to_char( "OEdit: Extra description keyword not found.\n\r", ch );
return;
}
if ( ped == NULL )
{
pObj->extra_descr = ed->next;
}
else
{
ped->next = ed->next;
}
free_extra_descr( ed );
send_to_char( "Extra description deleted.\n\r", ch );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "format" ) )
{
EXTRA_DESCR_DATA *ped;
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed format [keyword]\n\r", ch );
return;
}
ped = NULL;
for ( ed = pObj->extra_descr; ed != NULL; ed = ed->next )
{
if ( is_name( arg2, ed->keyword ) )
break;
ped = ed;
}
if ( ed == NULL )
{
send_to_char( "OEdit: Extra description keyword not found.\n\r", ch );
return;
}
ed->description = format_string( ed->description );
send_to_char( "Extra description formatted.\n\r", ch );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
}
interpret( ch, arg );
return;
}
int get_mob_sex_number( char* arg )
{
if ( !str_cmp( arg, "neuter" ) ) return SEX_NEUTRAL;
if ( !str_cmp( arg, "male" ) ) return SEX_MALE;
if ( !str_cmp( arg, "female" ) ) return SEX_FEMALE;
return SEX_NONE;
}
SPEC_FUN *get_mob_spec( char* arg )
{
char buf[MAX_STRING_LENGTH];
buf[0] = '\0';
strcat( buf, "spec_" );
strcat( buf, arg );
return spec_lookup( buf );
}
void medit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
MOB_INDEX_DATA *pMob;
char arg[MAX_STRING_LENGTH];
char arg1[MAX_STRING_LENGTH];
char arg2[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
int value;
int iHash;
strcpy( arg, argument );
smash_tilde( argument );
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
value = atoi( arg2 );
pMob = (MOB_INDEX_DATA *)ch->desc->pEdit;
pArea = pMob->area;
if ( !str_cmp( arg1, "show" ) || arg1[0] == '\0' )
{
sprintf( buf, "%d", pMob->vnum );
do_mshow( ch, buf );
return;
}
if ( !str_cmp( arg1, "done" ) )
{
ch->desc->pEdit = NULL;
ch->desc->connected = CON_PLAYING;
return;
}
if ( !str_cmp( arg1, "shop" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( arg1[0] == '\0' )
{
send_to_char( "Syntax: shop hours [#opening] [#closing]\n\r", ch );
send_to_char( " shop profit [#buying%] [#selling%]\n\r", ch );
send_to_char( " shop type [#1-5] [item type]\n\r", ch );
send_to_char( " shop delete\n\r", ch );
return;
}
if ( !str_cmp( arg1, "hours" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( arg1[0] == '\0' || !is_number( arg1 )
|| arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: shop hours [#opening] [#closing]\n\r", ch );
return;
}
if ( pMob->pShop == NULL )
{
pMob->pShop = new_shop();
pMob->pShop->keeper = pMob->vnum;
shop_last->next = pMob->pShop;
}
pMob->pShop->open_hour = atoi( arg1 );
pMob->pShop->close_hour = atoi( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Shop hours set.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "profit" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( arg1[0] == '\0' || !is_number( arg1 )
|| arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: shop profit [#buying%] [#selling%]\n\r", ch );
return;
}
if ( pMob->pShop == NULL )
{
pMob->pShop = new_shop();
pMob->pShop->keeper = pMob->vnum;
shop_last->next = pMob->pShop;
}
pMob->pShop->profit_buy = atoi( arg1 );
pMob->pShop->profit_sell = atoi( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Shop profit set.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "type" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( arg1[0] == '\0' || !is_number( arg1 )
|| arg2[0] == '\0' )
{
send_to_char( "Syntax: shop type [#] [item type]\n\r", ch );
return;
}
if ( atoi( arg1 ) > MAX_TRADE )
{
sprintf( buf, "%d", MAX_TRADE );
send_to_char( "REdit: Shop keepers may only sell ", ch );
send_to_char( buf, ch );
send_to_char( " items max.\n\r", ch );
return;
}
if ( ( value = item_name_type( arg2 ) ) == ITEM_NONE )
{
send_to_char( "REdit: That type of item is not known.\n\r", ch );
return;
}
if ( pMob->pShop == NULL )
{
pMob->pShop = new_shop();
pMob->pShop->keeper = pMob->vnum;
shop_last->next = pMob->pShop;
}
pMob->pShop->buy_type[atoi( arg1 )] = item_name_type( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Shop type set.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "delete" ) )
{
if ( pMob->pShop == NULL )
{
send_to_char( "REdit: Cannot delete a shop that is non-existant.\n\r", ch );
return;
}
free_shop( pMob->pShop );
pMob->pShop = NULL;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Shop deleted.\n\r", ch);
return;
}
send_to_char( "Syntax: shop hours [#opening] [#closing]\n\r", ch );
send_to_char( " shop profit [#buying%] [#selling%]\n\r", ch );
send_to_char( " shop type [#] [item type]\n\r", ch );
send_to_char( " shop delete\n\r", ch );
return;
}
if ( !str_cmp( arg1, "name" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: name [string]\n\r", ch );
return;
}
free_string( pMob->player_name );
pMob->player_name = str_dup( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Name set.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "short" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: short [string]\n\r", ch );
return;
}
free_string( pMob->short_descr );
pMob->short_descr = str_dup( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Short description set.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "long" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: long [string]\n\r", ch );
return;
}
free_string( pMob->long_descr );
strcat( arg2, "\n\r" );
pMob->long_descr = str_dup( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Long description set.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "desc" ) || !str_cmp( arg1, "description" ) )
{
if ( arg2[0] == '\0' )
{
string_append( ch, &pMob->description );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
if ( arg2[0] == '+' )
{
string_append( ch, &pMob->description );
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
send_to_char( "Syntax: desc - line edit\n\r", ch );
send_to_char( " desc + - line append\n\r",ch );
return;
}
if ( get_mob_sex_number( arg1 ) != SEX_NONE )
{
pMob->sex = get_mob_sex_number( arg1 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Sex set.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "level" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: level [number]\n\r", ch );
return;
}
pMob->level = atoi( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Level set.\n\r", ch);
return;
}
if ( ( value = act_name_bit( arg1 ) ) != ACT_NONE )
{
pMob->act ^= value;
SET_BIT( pMob->act, ACT_IS_NPC );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Act flag toggled.\n\r", ch);
return;
}
if ( ( value = affect_name_bit( arg1 ) ) != AFFECT_NONE )
{
pMob->affected_by ^= value;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Affect flag toggled.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "alignment" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: alignment [number]\n\r", ch );
return;
}
pMob->alignment = atoi( arg2 );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Alignment set.\n\r", ch);
return;
}
if ( get_mob_spec( arg ) != NULL )
{
pMob->spec_fun = get_mob_spec( arg );
free_string( pMob->spec_name );
sprintf( buf, "spec_%s", arg );
pMob->spec_name = str_dup( buf );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Spec set.\n\r", ch);
return;
}
if ( !str_cmp( arg, "none" ) )
{
pMob->spec_fun = NULL;
free_string( pMob->spec_name );
pMob->spec_name = str_dup( "" );
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Spec removed.\n\r", ch);
return;
}
if ( !str_cmp( arg1, "create" ) )
{
value = atoi( argument );
if ( argument[0] == '\0' || value == 0 )
{
send_to_char( "Syntax: medit create [vnum]\n\r", ch );
return;
}
pArea = get_vnum_area( value );
if ( pArea == NULL )
{
send_to_char( "MEdit: That vnum is not assigned an area.\n\r", ch );
return;
}
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "MEdit: Vnum in an area you cannot build in.\n\r", ch );
return;
}
if ( get_mob_index( value ) != NULL )
{
send_to_char( "MEdit: Mobile vnum already exists.\n\r", ch );
return;
}
pMob = new_mob_index();
pMob->vnum = value;
pMob->area = pArea;
if ( value > top_vnum_mob ) top_vnum_mob = value;
pMob->act = ACT_IS_NPC;
iHash = value % MAX_KEY_HASH;
pMob->next = mob_index_hash[iHash];
mob_index_hash[iHash] = pMob;
ch->desc->pEdit = (void *)pMob;
SET_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Mobile Created.\n\r", ch );
return;
}
interpret( ch, arg );
return;
}
void do_aedit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
int value;
pArea = ch->in_room->area;
if ( is_number( argument ) )
{
value = atoi( argument );
if ( ( pArea = get_area_data( value ) ) == NULL )
{
send_to_char( "That area vnum does not exist.\n\r", ch );
return;
}
}
else
{
if ( !str_cmp( argument, "reset" ) )
{
reset_area( pArea );
send_to_char( "Area reset.\n\r", ch );
return;
}
else
if ( !str_cmp( argument, "create" ) )
{
pArea = new_area();
area_last->next = pArea;
SET_BIT( pArea->area_flags, AREA_ADDED );
}
}
ch->desc->pEdit = (void *)pArea;
ch->desc->connected = CON_AEDITOR;
return;
}
void do_oedit( CHAR_DATA *ch, char *argument )
{
OBJ_INDEX_DATA *pObj;
AREA_DATA *pArea;
int value;
int iHash;
char arg1[MAX_STRING_LENGTH];
if ( IS_NPC(ch) ) return;
argument = one_argument( argument, arg1 );
if ( is_number( arg1 ) )
{
value = atoi( arg1 );
if ( ( pObj = get_obj_index( value ) ) == NULL )
{
send_to_char( "OEdit: That vnum does not exist.\n\r", ch );
return;
}
ch->desc->pEdit = (void *)pObj;
ch->desc->connected = CON_OEDITOR;
return;
}
else
{
if ( !str_cmp( arg1, "create" ) )
{
value = atoi( argument );
if ( argument[0] == '\0' || value == 0 )
{
send_to_char( "Syntax: oedit create [vnum]\n\r", ch );
return;
}
pArea = get_vnum_area( value );
if ( pArea == NULL )
{
send_to_char( "OEdit: That vnum is not assigned an area.\n\r", ch );
return;
}
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "OEdit: Vnum in an area you cannot build in.\n\r", ch );
return;
}
if ( get_obj_index( value ) != NULL )
{
send_to_char( "OEdit: Object vnum already exists.\n\r", ch );
return;
}
pObj = new_obj_index();
pObj->vnum = value;
pObj->area = pArea;
if ( value > top_vnum_obj ) top_vnum_obj = value;
iHash = value % MAX_KEY_HASH;
pObj->next = obj_index_hash[iHash];
obj_index_hash[iHash] = pObj;
ch->desc->pEdit = (void *)pObj;
SET_BIT( pArea->area_flags, AREA_CHANGED );
ch->desc->connected = CON_OEDITOR;
return;
}
}
send_to_char( "OEdit: There is no default object to edit.\n\r", ch );
return;
}
void do_redit( CHAR_DATA *ch, char *argument )
{
ROOM_INDEX_DATA *pRoom;
AREA_DATA *pArea;
int value;
int iHash;
char arg1[MAX_STRING_LENGTH];
argument = one_argument( argument, arg1 );
pRoom = ch->in_room;
if ( is_number( arg1 ) )
{
value = atoi( arg1 );
if ( ( pRoom = get_room_index( value ) ) == NULL )
{
send_to_char( "REdit: That vnum does not exist.\n\r", ch );
return;
}
}
else
{
if ( !str_cmp( arg1, "create" ) )
{
value = atoi( argument );
if ( argument[0] == '\0' || value == 0 )
{
send_to_char( "Syntax: redit create [vnum]\n\r", ch );
return;
}
pArea = get_vnum_area( value );
if ( pArea == NULL )
{
send_to_char( "REdit: That vnum is not assigned an area.\n\r", ch );
return;
}
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "REdit: Vnum in an area you cannot build in.\n\r", ch );
return;
}
if ( get_room_index( value ) != NULL )
{
send_to_char( "REdit: Room vnum already exists.\n\r", ch );
return;
}
pRoom = new_room_index();
pRoom->area = pArea;
pRoom->vnum = value;
if ( value > top_vnum_room ) top_vnum_room = value;
iHash = value % MAX_KEY_HASH;
pRoom->next = room_index_hash[iHash];
room_index_hash[iHash] = pRoom;
SET_BIT( pArea->area_flags, AREA_CHANGED );
char_from_room( ch );
char_to_room( ch, pRoom );
}
}
ch->desc->connected = CON_REDITOR;
return;
}
void do_medit( CHAR_DATA *ch, char *argument )
{
MOB_INDEX_DATA *pMob;
AREA_DATA *pArea;
int value;
int iHash;
char arg1[MAX_STRING_LENGTH];
argument = one_argument( argument, arg1 );
if ( is_number( arg1 ) )
{
value = atoi( arg1 );
if ( ( pMob = get_mob_index( value ) ) == NULL )
{
send_to_char( "MEdit: That vnum does not exist.\n\r", ch );
return;
}
ch->desc->pEdit = (void *)pMob;
ch->desc->connected = CON_MEDITOR;
return;
}
else
{
if ( !str_cmp( arg1, "create" ) )
{
value = atoi( argument );
if ( argument[0] == '\0' || value == 0 )
{
send_to_char( "Syntax: medit create [vnum]\n\r", ch );
return;
}
pArea = get_vnum_area( value );
if ( pArea == NULL )
{
send_to_char( "MEdit: That vnum is not assigned an area.\n\r", ch );
return;
}
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "MEdit: Vnum in an area you cannot build in.\n\r", ch );
return;
}
if ( get_mob_index( value ) != NULL )
{
send_to_char( "MEdit: Mobile vnum already exists.\n\r", ch );
return;
}
pMob = new_mob_index();
pMob->vnum = value;
pMob->area = pArea;
pMob->act = ACT_IS_NPC;
if ( value > top_vnum_mob ) top_vnum_mob = value;
iHash = value % MAX_KEY_HASH;
pMob->next = mob_index_hash[iHash];
mob_index_hash[iHash] = pMob;
ch->desc->pEdit = (void *)pMob;
SET_BIT( pArea->area_flags, AREA_CHANGED );
ch->desc->connected = CON_MEDITOR;
return;
}
}
send_to_char( "MEdit: There is no default mobile to edit.\n\r", ch );
return;
}
void do_ashow( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
AREA_DATA *pArea;
smash_tilde( argument );
strcpy( arg1, argument );
if ( is_number( arg1 ) )
pArea = get_area_data( atoi( arg1 ) );
else
pArea = ch->in_room->area;
if (!pArea)
pArea = ch->in_room->area;
sprintf( buf, "Name: '%s'\n\r", pArea->name );
send_to_char( buf, ch );
sprintf( buf, "File: '%s'\n\r", pArea->filename );
send_to_char( buf, ch );
sprintf( buf, "Age: %d; Players: %d\n\r", pArea->age, pArea->nplayer );
send_to_char( buf, ch );
sprintf( buf, "Recall: %s (#%d)\n\r", get_room_index( pArea->recall ) != NULL ? get_room_index( pArea->recall )->name : "none", pArea->recall );
send_to_char( buf, ch );
sprintf( buf, "Security: %d; Builders '%s'\n\r", pArea->security, pArea->builders );
send_to_char( buf, ch );
sprintf( buf, "Vnums: %d-%d\n\r", pArea->lvnum, pArea->uvnum );
send_to_char( buf, ch );
sprintf( buf, "Flags: %s\n\r", area_bit_name( pArea->area_flags ) );
send_to_char( buf, ch );
return;
}
void do_rshow( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
CHAR_DATA *rch;
ROOM_INDEX_DATA *location;
char buf [ MAX_STRING_LENGTH ];
char buf1 [ MAX_STRING_LENGTH ];
char arg [ MAX_INPUT_LENGTH ];
int door;
rch = get_char( ch );
one_argument( argument, arg );
location = ( arg[0] == '\0' ) ? ch->in_room : find_location( ch, arg );
if ( !location )
{
send_to_char( "No such location.\n\r", ch );
return;
}
if ( ch->in_room != location && room_is_private( location ) )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
buf1[0] = '\0';
sprintf( buf, "Name: '%s'\n\rArea: [%3d] '%s'\n\r",
location->name,
location->area->vnum,
location->area->name );
strcat( buf1, buf );
sprintf( buf,
"Vnum: %d\n\rSector: %s\n\rLight: %d\n\r",
location->vnum,
sector_name( location->sector_type ),
location->light );
strcat( buf1, buf );
sprintf( buf,
"Room flags: %s\n\rDescription:\n\r%s",
room_bit_name( location->room_flags ),
location->description );
strcat( buf1, buf );
if ( location->extra_descr )
{
EXTRA_DESCR_DATA *ed;
strcat( buf1, "Extra description keywords: '" );
for ( ed = location->extra_descr; ed; ed = ed->next )
{
strcat( buf1, ed->keyword );
if ( ed->next )
strcat( buf1, " " );
}
strcat( buf1, "'\n\r" );
}
strcat( buf1, "Characters:" );
/* Yes, we are reusing the variable rch. - Kahn */
for ( rch = location->people; rch; rch = rch->next_in_room )
{
strcat( buf1, " " );
one_argument( rch->name, buf );
strcat( buf1, buf );
}
strcat( buf1, "\n\rObjects: " );
for ( obj = location->contents; obj; obj = obj->next_content )
{
strcat( buf1, " " );
one_argument( STR(obj, name), buf );
strcat( buf1, buf );
}
strcat( buf1, "\n\r" );
for ( door = 0; door < MAX_DIR; door++ )
{
EXIT_DATA *pexit;
if ( ( pexit = location->exit[door] ) )
{
sprintf( buf,
"Door: %5s. To: %d. Key: %d. Exit flags: %d '%s'.\n\r",
dir_name[door],
pexit->to_room ? pexit->to_room->vnum : 0,
pexit->key,
pexit->exit_info,
(pexit->keyword != NULL) ? pexit->keyword : "" );
strcat( buf1, buf );
if ( pexit->description != NULL && pexit->description[0] != '\0' )
{
sprintf( buf, "%s", pexit->description );
strcat( buf1, buf );
}
}
}
send_to_char( buf1, ch );
return;
}
void do_mshow( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
MOB_INDEX_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "MShow whom?\n\r", ch );
return;
}
if ( ( victim = get_mob_index( atoi( arg ) ) ) == NULL )
{
send_to_char( "Invalid mob index VNUM.\n\r", ch );
return;
}
sprintf( buf, "Name: '%s'\n\rArea %d: '%s'\n\r",
victim->player_name,
victim->area == NULL ? -1 : victim->area->vnum,
victim->area == NULL ? "No Area" : victim->area->name );
send_to_char( buf, ch );
sprintf( buf, "Act: %s\n\r", act_bit_name( victim->act ) );
send_to_char( buf, ch );
sprintf( buf, "Vnum: %d\n\rSex: %s\n\r",
victim->vnum,
victim->sex == SEX_MALE ? "male" :
victim->sex == SEX_FEMALE ? "female" : "neutral" );
send_to_char( buf, ch );
sprintf( buf,
"Level: %d\n\rAlign: %d\n\r",
victim->level, victim->alignment );
send_to_char( buf, ch );
sprintf( buf, "Affected by: %s\n\r",
affect_bit_name( victim->affected_by ) );
send_to_char( buf, ch );
sprintf( buf, "Short description: %s\n\rLong description:\n\r%s",
victim->short_descr,
victim->long_descr );
send_to_char( buf, ch );
sprintf( buf, "Description:\n\r%s", victim->description );
if ( victim->spec_fun != NULL )
{
sprintf( buf, "Spec fun: %s\n\r", victim->spec_name );
send_to_char( buf, ch );
}
if ( victim->pShop != NULL )
{
SHOP_DATA *pShop;
int iTrade;
pShop = victim->pShop;
sprintf( buf, "Shop data (for %d):\n\r Will buy at %d%%, and sell at %d%%.\n\r",
pShop->keeper, pShop->profit_buy, pShop->profit_sell );
send_to_char( buf, ch );
sprintf( buf, " Opens at %d, closes at %d.\n\r",
pShop->open_hour, pShop->close_hour );
send_to_char( buf, ch );
for ( iTrade = 0; iTrade < MAX_TRADE; iTrade++ )
{
if ( pShop->buy_type[iTrade] != ITEM_NONE )
{
sprintf( buf, " Buys %ss (#%d)\n\r",
item_type_name( pShop->buy_type[iTrade] ), iTrade );
send_to_char( buf, ch );
}
}
}
return;
}
void do_oshow( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
AFFECT_DATA *paf;
OBJ_INDEX_DATA *obj;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "OShow what?\n\r", ch );
return;
}
if ( ( obj = get_obj_index( atoi( arg ) ) ) == NULL )
{
send_to_char( "Invalid VNUM reference.\n\r", ch );
return;
}
sprintf( buf, "Name: '%s'\n\rArea %d: '%s'\n\r",
obj->name,
obj->area == NULL ? -1 : obj->area->vnum,
obj->area == NULL ? "No Area" : obj->area->name );
send_to_char( buf, ch );
sprintf( buf, "Vnum: %d\n\rType: %s\n\r",
obj->vnum,
item_type_name( obj->item_type ) );
send_to_char( buf, ch );
sprintf( buf, "Short description: %s\n\rLong description: %s\n\r",
obj->short_descr, obj->description );
send_to_char( buf, ch );
sprintf( buf, "Wear flags: %s\n\rExtra flags: %s\n\r",
wear_bit_name( obj->wear_flags ),
extra_bit_name( obj->extra_flags ) );
send_to_char( buf, ch );
sprintf( buf, "Weight: %d\n\rCost: %d\n\r",
obj->weight, obj->cost );
send_to_char( buf, ch );
show_obj_values( ch, obj );
if ( obj->extra_descr != NULL )
{
EXTRA_DESCR_DATA *ed;
send_to_char( "Extra description keywords: ", ch );
for ( ed = obj->extra_descr; ed != NULL; ed = ed->next )
{
send_to_char( "'", ch );
send_to_char( ed->keyword, ch );
send_to_char( "'", ch );
}
send_to_char( "\n\r", ch );
}
for ( paf = obj->affected; paf != NULL; paf = paf->next )
{
sprintf( buf, "Affects %s by %d.\n\r", affect_loc_name( paf->location ),
paf->modifier );
send_to_char( buf, ch );
}
return;
}
void display_resets( CHAR_DATA *ch )
{
char buf[MAX_STRING_LENGTH];
char final[MAX_STRING_LENGTH];
AREA_DATA *pArea = ch->in_room->area;
RESET_DATA *pReset;
MOB_INDEX_DATA *pMob = NULL;
int iReset = 0;
final[0] = '\0';
for ( pReset = pArea->reset_first; pReset; pReset = pReset->next )
{
OBJ_INDEX_DATA *pObj;
MOB_INDEX_DATA *pMobIndex;
OBJ_INDEX_DATA *pObjIndex;
OBJ_INDEX_DATA *pObjToIndex;
ROOM_INDEX_DATA *pRoomIndex;
final[0] = '\0';
sprintf( final, "%2d- ", ++iReset );
switch ( pReset->command )
{
default:
sprintf( buf, "Bad reset command: %c.", pReset->command );
strcat( final, buf );
break;
case 'M':
if ( !( pMobIndex = get_mob_index( pReset->arg1 ) ) )
{
sprintf( buf, "Load Mobile - Bad Mob %d\n\r", pReset->arg1 );
strcat( final, buf );
continue;
}
if ( !( pRoomIndex = get_room_index( pReset->arg3 ) ) )
{
sprintf( buf, "Load Mobile - Bad Room %d\n\r", pReset->arg3 );
strcat( final, buf );
continue;
}
pMob = pMobIndex;
sprintf( buf, "Loads %s (%d) in %s (%d) (max %d)",
pMob->short_descr, pReset->arg1, pRoomIndex->name,
pReset->arg3, pReset->arg2 );
strcat( final, buf );
/*
* Check for pet shop.
*/
{
ROOM_INDEX_DATA *pRoomIndexPrev;
pRoomIndexPrev = get_room_index( pRoomIndex->vnum - 1 );
if ( pRoomIndexPrev
&& IS_SET( pRoomIndexPrev->room_flags, ROOM_PET_SHOP ) )
sprintf( buf, " as a pet." );
sprintf( buf, "\n\r" );
strcat( final, buf );
}
break;
case 'O':
if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
{
sprintf( buf, "Load Object - Bad Object %d\n\r", pReset->arg1 );
strcat( final, buf );
continue;
}
pObj = pObjIndex;
if ( !( pRoomIndex = get_room_index( pReset->arg3 ) ) )
{
sprintf( buf, "Load Object - Bad Room %d\n\r", pReset->arg3 );
strcat( final, buf );
continue;
}
sprintf( buf, " Loads %s (%d) in %s (%d)\n\r",
pObj->short_descr, pReset->arg1,
pRoomIndex->name, pReset->arg3 );
strcat( final, buf );
break;
case 'P':
if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
{
sprintf( buf, "Put Object - Bad Object %d\n\r", pReset->arg1 );
strcat( final, buf );
continue;
}
pObj = pObjIndex;
if ( !( pObjToIndex = get_obj_index( pReset->arg3 ) ) )
{
sprintf( buf, "Put Object - Bad To Object %d\n\r", pReset->arg3 );
strcat( final, buf );
continue;
}
sprintf( buf, " Loads %s (%d) inside %s (%d)\n\r",
pObj->short_descr,
pReset->arg1,
pObjToIndex->short_descr,
pReset->arg3 );
strcat( final, buf );
break;
case 'G':
case 'E':
if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
{
sprintf( buf, "Give/Equip Object - Bad Object %d\n\r", pReset->arg1 );
strcat( final, buf );
continue;
}
pObj = pObjIndex;
if ( !pMob )
{
sprintf( buf, "Give/Equip Object - No Previous Mobile\n\r" );
strcat( final, buf );
break;
}
if ( pMob->pShop )
{
sprintf( buf, " Loads %s (%d) in the inventory of %s (%d) shopkeeper\n\r",
pObj->short_descr, pReset->arg1,
pMob->short_descr, pMob->vnum );
}
else
sprintf( buf, " Loads %s (%d) %s of %s (%d)\n\r",
pObj->short_descr, pReset->arg1,
(pReset->command == 'G') ? wear_loc_name( WEAR_NONE )
: wear_loc_name( pReset->arg3 ),
pMob->short_descr, pMob->vnum );
strcat( final, buf );
break;
/*
* Doors are automatically set as what they look like when the
* database is edited. I would like to do this will all the
* reset information.
*/
case 'D':
pRoomIndex = get_room_index( pReset->arg1 );
sprintf( buf, "The %s door of %s is reset to %s\n",
dir_name[ pReset->arg2 ],
pRoomIndex->name,
get_exit_flag_string( pReset->arg3 ) );
break;
case 'R':
if ( !( pRoomIndex = get_room_index( pReset->arg1 ) ) )
{
sprintf( buf, "Randomize Exits - Bad Room %d\n\r", pReset->arg1 );
strcat( final, buf );
continue;
}
sprintf( buf, "Exits are randomized in %s (%d)\n\r",
pRoomIndex->name, pReset->arg1 );
strcat( final, buf );
break;
}
send_to_char( final, ch );
}
return;
}
void add_reset( AREA_DATA *area, RESET_DATA *pReset, int index )
{
RESET_DATA *reset;
int iReset = 0;
if ( area->reset_first == NULL )
{
area->reset_first = pReset;
area->reset_last = pReset;
pReset->next = NULL;
return;
}
index--;
if ( index == 0 )
{
pReset->next = area->reset_first;
area->reset_first = pReset;
return;
}
for ( reset = area->reset_first; reset->next != NULL; reset = reset->next )
{
if ( ++iReset == index ) break;
}
pReset->next = reset->next;
reset->next = pReset;
if ( pReset->next == NULL ) area->reset_last = pReset;
return;
}
int get_max_dir( CHAR_DATA *ch, int arg )
{
char buf[MAX_INPUT_LENGTH];
if ( arg < 0 || arg >= MAX_DIR )
{
sprintf( buf, "Doors range from 0 to %d.\n\r", MAX_DIR-1 );
send_to_char( buf, ch );
return -1;
}
else
return arg;
}
void do_resets( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
char arg4[MAX_INPUT_LENGTH];
char arg5[MAX_INPUT_LENGTH];
RESET_DATA *pReset = NULL;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
argument = one_argument( argument, arg4 );
argument = one_argument( argument, arg5 );
if ( arg1[0] == '\0' )
{
if ( ch->in_room->area->reset_first != NULL )
{
send_to_char( "Resets:\n\r", ch );
display_resets( ch );
}
else
send_to_char( "No resets in this area.\n\r", ch );
}
if ( !IS_BUILDER( ch, ch->in_room->area ) )
{
send_to_char( "Resets: Invalid security for editing this area.\n\r",
ch );
return;
}
if ( is_number( arg1 ) )
{
AREA_DATA *pArea = ch->in_room->area;
if ( !str_cmp( arg2, "delete" ) )
{
int insert_loc = atoi( arg1 );
if ( ch->in_room->area->reset_first == NULL )
{
send_to_char( "No resets in this area.\n\r", ch );
return;
}
if ( insert_loc-1 <= 0 )
{
pReset = pArea->reset_first;
pArea->reset_first = pArea->reset_first->next;
if ( pArea->reset_first == NULL )
pArea->reset_last = NULL;
}
else
{
int iReset = 0;
RESET_DATA *prev = NULL;
for ( pReset = pArea->reset_first; pReset != NULL; pReset = pReset->next )
{
if ( ++iReset == insert_loc ) break;
prev = pReset;
}
if ( pReset == NULL )
{
send_to_char( "Reset not found.\n\r", ch );
return;
}
if ( prev != NULL ) prev->next = prev->next->next;
else pArea->reset_first = pArea->reset_first->next;
for ( pArea->reset_last = pArea->reset_first;
pArea->reset_last->next != NULL;
pArea->reset_last = pArea->reset_last->next );
}
free_reset_data( pReset );
send_to_char( "Reset deleted.\n\r", ch );
}
else
if ( (!str_cmp( arg2, "mob" ) && is_number( arg3 ))
|| (!str_cmp( arg2, "obj" ) && is_number( arg3 )) )
{
pReset = new_reset_data();
if ( !str_cmp( arg2, "mob" ) )
{
pReset->command = 'M';
pReset->arg1 = atoi( arg3 );
pReset->arg2 = is_number( arg4 ) ? atoi( arg4 ) : 5; /* Max # */
pReset->arg3 = ch->in_room->vnum;
}
else
if ( !str_cmp( arg2, "obj" ) )
{
pReset->arg1 = atoi( arg3 );
if ( !str_cmp( arg4, "inside" ) || !str_cmp( arg4, "in" ) )
{
pReset->command = 'P';
pReset->arg2 = 0;
pReset->arg3 = is_number( arg5 ) ? atoi( arg5 ) : 1;
}
else if ( !str_cmp( arg4, "room" ) )
{
pReset->command = 'O';
pReset->arg2 = 0;
pReset->arg3 = ch->in_room->vnum;
}
else
{
pReset->arg2 = wear_name_loc( arg4 );
if ( pReset->arg2 == WEAR_NONE )
pReset->command = 'G';
else
pReset->command = 'E';
}
}
add_reset( ch->in_room->area, pReset, atoi( arg1 ) );
send_to_char( "Reset added.\n\r", ch );
}
else
{
send_to_char( "Syntax: RESET <number> OBJ <vnum> <location>\n\r", ch );
send_to_char( " RESET <number> OBJ <vnum> INside <vnum>\n\r", ch );
send_to_char( " RESET <number> OBJ <vnum> room\n\r", ch );
send_to_char( " RESET <number> MOB <vnum> [<max #>]\n\r", ch );
send_to_char( " RESET <number> DELETE\n\r", ch );
}
}
return;
}
void save_area_list()
{
FILE *fp;
AREA_DATA *pArea;
if ( ( fp = fopen( "area.lst", "w" ) ) == NULL )
{
bug( "Save_area_list: fopen", 0 );
perror( "area.lst" );
}
else
{
fprintf( fp, "help.are\n" );
fprintf( fp, "h-immref.hlp\n" );
for( pArea = area_first; pArea != NULL; pArea = pArea->next )
{
fprintf( fp, "%s\n", pArea->filename );
}
fprintf( fp, "$\n" );
fclose( fp );
}
return;
}
char *fix_string( const char *str )
{
static char strfix[MAX_STRING_LENGTH];
int i;
int o;
if ( str == NULL )
return '\0';
for ( o = i = 0; str[i+o] != '\0'; i++ )
{
if (str[i+o] == '\r' || str[i+o] == '~')
o++;
strfix[i] = str[i+o];
}
strfix[i] = '\0';
return strfix;
}
void save_mobiles( FILE *fp, AREA_DATA *pArea )
{
int iHash;
MOB_INDEX_DATA *pMobIndex;
fprintf( fp, "#MOBILES\n" );
for( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
{
for( pMobIndex = mob_index_hash[iHash]; pMobIndex != NULL; pMobIndex = pMobIndex->next )
{
if ( pMobIndex != NULL && pMobIndex->area == pArea )
{
fprintf( fp, "#%d\n", pMobIndex->vnum );
fprintf( fp, "%s~\n", pMobIndex->player_name );
fprintf( fp, "%s~\n", pMobIndex->short_descr );
fprintf( fp, "%s~\n", fix_string( pMobIndex->long_descr ) );
fprintf( fp, "%s~\n", fix_string( pMobIndex->description ) );
fprintf( fp, "%d ", pMobIndex->act );
fprintf( fp, "%d ", pMobIndex->affected_by );
fprintf( fp, "%d S\n", pMobIndex->alignment );
fprintf( fp, "%d ", pMobIndex->level );
fprintf( fp, "%d ", pMobIndex->hitroll );
fprintf( fp, "%d ", pMobIndex->ac );
fprintf( fp, "%dd%d+%d ", pMobIndex->hitnodice,
pMobIndex->hitsizedice,
pMobIndex->hitplus );
fprintf( fp, "%dd%d+%d\n", pMobIndex->damnodice,
pMobIndex->damsizedice,
pMobIndex->damplus );
fprintf( fp, "%d ", pMobIndex->gold );
fprintf( fp, "0\n0 0 " );
fprintf( fp, "%d\n", pMobIndex->sex );
}
}
}
fprintf( fp, "#0\n\n\n\n" );
return;
}
void save_objects( FILE *fp, AREA_DATA *pArea )
{
int iHash;
OBJ_INDEX_DATA *pObjIndex;
AFFECT_DATA *pAf;
EXTRA_DESCR_DATA *pEd;
fprintf( fp, "#OBJECTS\n" );
for( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
{
for( pObjIndex = obj_index_hash[iHash]; pObjIndex != NULL; pObjIndex = pObjIndex->next )
{
if ( pObjIndex != NULL && pObjIndex->area == pArea )
{
fprintf( fp, "#%d\n", pObjIndex->vnum );
fprintf( fp, "%s~\n", pObjIndex->name );
fprintf( fp, "%s~\n", pObjIndex->short_descr );
fprintf( fp, "%s~\n", fix_string( pObjIndex->description ) );
fprintf( fp, "~\n" );
fprintf( fp, "%d ", pObjIndex->item_type );
fprintf( fp, "%d ", pObjIndex->extra_flags );
fprintf( fp, "%d\n", pObjIndex->wear_flags);
switch ( pObjIndex->item_type )
{
default:
fprintf( fp, "%d~ %d~ %d~ %d~\n",
pObjIndex->value[0],
pObjIndex->value[1],
pObjIndex->value[2],
pObjIndex->value[3] );
break;
case ITEM_PILL:
case ITEM_POTION:
case ITEM_SCROLL:
fprintf( fp, "%d~ %s~ %s~ %s~\n",
pObjIndex->value[0],
pObjIndex->value[1] != -1 ?
skill_table[pObjIndex->value[1]].name
: " ",
pObjIndex->value[2] != -1 ?
skill_table[pObjIndex->value[2]].name
: " ",
pObjIndex->value[3] != -1 ?
skill_table[pObjIndex->value[3]].name
: " " );
break;
case ITEM_STAFF:
case ITEM_WAND:
fprintf( fp, "%d~ %d~ %d~ %s~\n",
pObjIndex->value[0],
pObjIndex->value[1],
pObjIndex->value[2],
pObjIndex->value[3] != -1 ?
skill_table[pObjIndex->value[3]].name
: " " );
break;
}
fprintf( fp, "%d ", pObjIndex->weight );
fprintf( fp, "%d 0\n", pObjIndex->cost );
for( pAf = pObjIndex->affected; pAf ; pAf = pAf->next )
{
fprintf( fp, "A\n%d %d\n", pAf->location, pAf->modifier );
}
for( pEd = pObjIndex->extra_descr; pEd ; pEd = pEd->next )
{
fprintf( fp, "E\n%s~\n%s~\n", pEd->keyword,
fix_string( pEd->description ) );
}
}
}
}
fprintf( fp, "#0\n\n\n\n" );
return;
}
void save_rooms( FILE *fp, AREA_DATA *pArea )
{
int iHash;
ROOM_INDEX_DATA *pRoomIndex;
EXTRA_DESCR_DATA *pEd;
EXIT_DATA *pExit;
int door;
fprintf( fp, "#ROOMS\n" );
for( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
{
for( pRoomIndex = room_index_hash[iHash]; pRoomIndex; pRoomIndex = pRoomIndex->next )
{
if ( pRoomIndex->area == pArea )
{
fprintf( fp, "#%d\n", pRoomIndex->vnum );
fprintf( fp, "%s~\n", pRoomIndex->name );
fprintf( fp, "%s~\n", fix_string( pRoomIndex->description ) );
fprintf( fp, "0 " );
fprintf( fp, "%d ", pRoomIndex->room_flags );
fprintf( fp, "%d\n", pRoomIndex->sector_type );
for ( pEd = pRoomIndex->extra_descr; pEd != NULL;
pEd = pEd->next )
{
fprintf( fp, "E\n%s~\n%s~\n", pEd->keyword,
fix_string( pEd->description ) );
}
for( door = 0; door < MAX_DIR; door++ )
{
if ( ( pExit = pRoomIndex->exit[door] )
&& pExit->to_room )
{
int locks = 0;
if ( IS_SET( pExit->rs_flags, EX_ISDOOR )
&& ( !IS_SET( pExit->rs_flags, EX_PICKPROOF ) )
&& ( !IS_SET( pExit->rs_flags, EX_BASHPROOF ) )
&& ( !IS_SET( pExit->rs_flags, EX_PASSPROOF ) ) )
locks = 1;
if ( IS_SET( pExit->rs_flags, EX_ISDOOR )
&& ( IS_SET( pExit->rs_flags, EX_PICKPROOF ) )
&& ( !IS_SET( pExit->rs_flags, EX_BASHPROOF ) )
&& ( !IS_SET( pExit->rs_flags, EX_PASSPROOF ) ) )
locks = 2;
if ( IS_SET( pExit->rs_flags, EX_ISDOOR )
&& ( !IS_SET( pExit->rs_flags, EX_PICKPROOF ) )
&& ( IS_SET( pExit->rs_flags, EX_BASHPROOF ) )
&& ( !IS_SET( pExit->rs_flags, EX_PASSPROOF ) ) )
locks = 3;
if ( IS_SET( pExit->rs_flags, EX_ISDOOR )
&& ( IS_SET( pExit->rs_flags, EX_PICKPROOF ) )
&& ( IS_SET( pExit->rs_flags, EX_BASHPROOF ) )
&& ( !IS_SET( pExit->rs_flags, EX_PASSPROOF ) ) )
locks = 4;
if ( IS_SET( pExit->rs_flags, EX_ISDOOR )
&& ( !IS_SET( pExit->rs_flags, EX_PICKPROOF ) )
&& ( !IS_SET( pExit->rs_flags, EX_BASHPROOF ) )
&& ( IS_SET( pExit->rs_flags, EX_PASSPROOF ) ) )
locks = 5;
if ( IS_SET( pExit->rs_flags, EX_ISDOOR )
&& ( IS_SET( pExit->rs_flags, EX_PICKPROOF ) )
&& ( !IS_SET( pExit->rs_flags, EX_BASHPROOF ) )
&& ( IS_SET( pExit->rs_flags, EX_PASSPROOF ) ) )
locks = 6;
if ( IS_SET( pExit->rs_flags, EX_ISDOOR )
&& ( !IS_SET( pExit->rs_flags, EX_PICKPROOF ) )
&& ( IS_SET( pExit->rs_flags, EX_BASHPROOF ) )
&& ( IS_SET( pExit->rs_flags, EX_PASSPROOF ) ) )
locks = 7;
if ( IS_SET( pExit->rs_flags, EX_ISDOOR )
&& ( IS_SET( pExit->rs_flags, EX_PICKPROOF ) )
&& ( IS_SET( pExit->rs_flags, EX_BASHPROOF ) )
&& ( IS_SET( pExit->rs_flags, EX_PASSPROOF ) ) )
locks = 8;
fprintf( fp, "D%d\n", door );
fprintf( fp, "%s~\n", fix_string( pExit->description ) );
fprintf( fp, "%s~\n", pExit->keyword );
fprintf( fp, "%d %d %d\n", locks,
pExit->key,
pExit->vnum );
}
}
fprintf( fp, "S\n" );
}
}
}
fprintf( fp, "#0\n\n\n\n" );
return;
}
void save_specials( FILE *fp, AREA_DATA *pArea )
{
int iHash;
MOB_INDEX_DATA *pMobIndex;
fprintf( fp, "#SPECIALS\n" );
for( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
{
for( pMobIndex = mob_index_hash[iHash]; pMobIndex; pMobIndex = pMobIndex->next )
{
if ( pMobIndex && pMobIndex->area == pArea && pMobIndex->spec_fun )
{
fprintf( fp, "M %d %s Load to: %s\n", pMobIndex->vnum,
pMobIndex->spec_name,
pMobIndex->short_descr );
}
}
}
fprintf( fp, "S\n\n\n\n" );
return;
}
void save_door_resets( FILE *fp, AREA_DATA *pArea )
{
int iHash;
ROOM_INDEX_DATA *pRoomIndex;
EXIT_DATA *pExit;
int door;
for( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
{
for( pRoomIndex = room_index_hash[iHash]; pRoomIndex; pRoomIndex = pRoomIndex->next )
{
if ( pRoomIndex->area == pArea )
{
for( door = 0; door < MAX_DIR; door++ )
{
if ( ( pExit = pRoomIndex->exit[door] )
&& pExit->to_room
&& ( IS_SET( pExit->rs_flags, EX_CLOSED )
|| IS_SET( pExit->rs_flags, EX_LOCKED ) ) )
#if defined( VERBOSE )
fprintf( fp, "D 0 %d %d %d The %s door of %s is %s\n",
pRoomIndex->vnum,
door,
IS_SET( pExit->rs_flags, EX_LOCKED) ? 2 : 1,
dir_name[ door ],
pRoomIndex->name,
IS_SET( pExit->rs_flags, EX_LOCKED) ? "closed and locked"
: "closed" );
#endif
#if !defined( VERBOSE )
fprintf( fp, "D 0 %d %d %d\n",
pRoomIndex->vnum,
door,
IS_SET( pExit->rs_flags, EX_LOCKED) ? 2 : 1 );
#endif
}
}
}
}
return;
}
void save_resets( FILE *fp, AREA_DATA *pArea )
{
RESET_DATA *pReset;
MOB_INDEX_DATA *pLastMob = NULL;
OBJ_INDEX_DATA *pLastObj;
ROOM_INDEX_DATA *pRoom;
char buf[MAX_STRING_LENGTH];
fprintf( fp, "#RESETS\n" );
save_door_resets( fp, pArea );
for ( pReset = pArea->reset_first; pReset; pReset = pReset->next )
{
switch ( pReset->command )
{
default:
bug( "Save_resets: bad command %c.", pReset->command );
break;
#if defined( VERBOSE )
case 'M':
pLastMob = get_mob_index( pReset->arg1 );
fprintf( fp, "M 0 %d %d %d Load %s\n",
pReset->arg1,
pReset->arg2,
pReset->arg3,
pLastMob->short_descr );
break;
case 'O':
pLastObj = get_obj_index( pReset->arg1 );
pRoom = get_room_index( pReset->arg3 );
fprintf( fp, "O 0 %d 0 %d %s loaded to %s\n",
pReset->arg1,
pReset->arg3,
capitalize(pLastObj->short_descr),
pRoom->name );
break;
case 'P':
pLastObj = get_obj_index( pReset->arg1 );
fprintf( fp, "P 0 %d 0 %d %s put inside %s\n",
pReset->arg1,
pReset->arg3,
capitalize(get_obj_index( pReset->arg1 )->short_descr),
pLastObj->short_descr );
break;
case 'G':
fprintf( fp, "G 0 %d 0 %s is given to %s\n",
pReset->arg1,
capitalize(get_obj_index( pReset->arg1 )->short_descr),
pLastMob ? pLastMob->short_descr : "!NO_MOB!" );
if ( !pLastMob )
{
sprintf( buf, "Save_resets: !NO_MOB! in [%s]", pArea->filename );
bug( buf, 0 );
}
break;
case 'E':
fprintf( fp, "E 0 %d 0 %d %s is loaded %s of %s\n",
pReset->arg1,
pReset->arg3,
capitalize(get_obj_index( pReset->arg1 )->short_descr),
wear_loc_name( pReset->arg3 ),
pLastMob ? pLastMob->short_descr : "!NO_MOB!" );
if ( !pLastMob )
{
sprintf( buf, "Save_resets: !NO_MOB! in [%s]", pArea->filename );
bug( buf, 0 );
}
break;
case 'D':
break;
case 'R':
pRoom = get_room_index( pReset->arg1 );
fprintf( fp, "R 0 %d %d Randomize %s\n",
pReset->arg1,
pReset->arg2,
pRoom->name );
break;
}
#endif
#if !defined( VERBOSE )
case 'M':
pLastMob = get_mob_index( pReset->arg1 );
fprintf( fp, "M 0 %d %d %d\n",
pReset->arg1,
pReset->arg2,
pReset->arg3 );
break;
case 'O':
pLastObj = get_obj_index( pReset->arg1 );
pRoom = get_room_index( pReset->arg3 );
fprintf( fp, "O 0 %d 0 %d\n",
pReset->arg1,
pReset->arg3 );
break;
case 'P':
pLastObj = get_obj_index( pReset->arg1 );
fprintf( fp, "P 0 %d 0 %d\n",
pReset->arg1,
pReset->arg3 );
break;
case 'G':
fprintf( fp, "G 0 %d 0\n", pReset->arg1 );
if ( !pLastMob )
{
sprintf( buf, "Save_resets: !NO_MOB! in [%s]", pArea->filename );
bug( buf, 0 );
}
break;
case 'E':
fprintf( fp, "E 0 %d 0 %d\n",
pReset->arg1,
pReset->arg3 );
if ( !pLastMob )
{
sprintf( buf, "Save_resets: !NO_MOB! in [%s]", pArea->filename );
bug( buf, 0 );
}
break;
case 'D':
break;
case 'R':
pRoom = get_room_index( pReset->arg1 );
fprintf( fp, "R 0 %d %d\n",
pReset->arg1,
pReset->arg2 );
break;
}
#endif
}
fprintf( fp, "S\n\n\n\n" );
return;
}
void save_shops( FILE *fp, AREA_DATA *pArea )
{
SHOP_DATA *pShopIndex;
MOB_INDEX_DATA *pMobIndex;
int iTrade;
int iHash;
fprintf( fp, "#SHOPS\n" );
for( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
{
for( pMobIndex = mob_index_hash[iHash]; pMobIndex; pMobIndex = pMobIndex->next )
{
if ( pMobIndex && pMobIndex->area == pArea && pMobIndex->pShop )
{
pShopIndex = pMobIndex->pShop;
fprintf( fp, "%d ", pShopIndex->keeper );
for ( iTrade = 0; iTrade < MAX_TRADE; iTrade++ )
{
if ( pShopIndex->buy_type[iTrade] != ITEM_NONE )
{
fprintf( fp, "%d ", pShopIndex->buy_type[iTrade] );
}
else
fprintf( fp, "0 ");
}
fprintf( fp, "%d %d ", pShopIndex->profit_buy, pShopIndex->profit_sell );
fprintf( fp, "%d %d\n", pShopIndex->open_hour, pShopIndex->close_hour );
}
}
}
fprintf( fp, "0\n\n\n\n" );
return;
}
void save_area( AREA_DATA *pArea )
{
FILE *fp;
if ( ( fp = fopen( pArea->filename, "w" ) ) == NULL )
{
bug( "Open_area: fopen", 0 );
perror( pArea->filename );
}
fprintf( fp, "#AREADATA\n" );
fprintf( fp, "Name %s~\n", pArea->name );
fprintf( fp, "Builders %s~\n", fix_string( pArea->builders ) );
fprintf( fp, "VNUMs %d %d\n", pArea->lvnum, pArea->uvnum );
fprintf( fp, "Security %d\n", pArea->security );
fprintf( fp, "Recall %d\n", pArea->recall );
fprintf( fp, "End\n\n\n\n" );
save_mobiles( fp, pArea );
save_objects( fp, pArea );
save_rooms( fp, pArea );
save_specials( fp, pArea );
save_resets( fp, pArea );
save_shops( fp, pArea );
fprintf( fp, "#$\n" );
fclose( fp );
return;
}
void do_asave( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
AREA_DATA *pArea;
FILE *fp;
int value;
fp = NULL;
if ( ch == NULL ) /* Do an autosave */
{
save_area_list();
for( pArea = area_first; pArea != NULL; pArea = pArea->next )
{
save_area( pArea );
REMOVE_BIT( pArea->area_flags, AREA_CHANGED );
}
return;
}
smash_tilde( argument );
strcpy( arg1, argument );
if ( arg1[0] == '\0' )
{
send_to_char( "Syntax:\n\r", ch );
send_to_char( " asave list - saves the area.lst file\n\r", ch );
send_to_char( " asave zone - saves the zone you're in\n\r", ch );
send_to_char( " asave changed - saves all changed zones\n\r", ch );
send_to_char( " asave world - saves the world! (db dump)\n\r", ch );
send_to_char( "\n\r", ch );
return;
}
/*
* Snarf the value (which need not be numeric).
*/
value = atoi( arg1 );
if ( ( pArea = get_area_data( value ) ) == '\0' && is_number( arg1 ) )
{
send_to_char( "That area does not exist.\n\r", ch );
return;
}
if ( is_number( arg1 ) )
{
save_area_list();
save_area( pArea );
return;
}
if ( !str_cmp( "world", arg1 ) || !str_cmp( "all", arg1 ) )
{
save_area_list();
for( pArea = area_first; pArea != '\0'; pArea = pArea->next )
{
save_area( pArea );
REMOVE_BIT( pArea->area_flags, AREA_CHANGED );
}
send_to_char( "You saved the world.\n\r", ch );
send_to_all_char( "Database saved.\n\r" );
return;
}
if ( !str_cmp( "changed", arg1 ) )
{
char buf[MAX_INPUT_LENGTH];
save_area_list();
send_to_char( "Saved zones:\n\r", ch );
sprintf( buf, "None.\n\r" );
for( pArea = area_first; pArea != '\0'; pArea = pArea->next )
{
if ( IS_SET(pArea->area_flags, AREA_CHANGED) )
{
save_area( pArea );
sprintf( buf, "%24s - '%s'\n\r", pArea->name, pArea->filename );
send_to_char( buf, ch );
REMOVE_BIT( pArea->area_flags, AREA_CHANGED );
}
}
if ( !str_cmp( buf, "None.\n\r" ) )
send_to_char( buf, ch );
return;
}
if ( !str_cmp( arg1, "list" ) )
{
save_area_list();
return;
}
if ( !str_cmp( arg1, "zone" ) )
{
save_area_list();
save_area( ch->in_room->area );
REMOVE_BIT( pArea->area_flags, AREA_CHANGED );
send_to_char( "Zone saved.\n\r", ch );
return;
}
do_asave( ch, "" );
return;
}
void do_arealist( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
AREA_DATA *pArea;
sprintf( buf, "[%3s] %-32s (%-5s-%5s) %10s %3s [%s]\n\r",
"Num", "Area Name", "lvnum", "uvnum", "Filename", "Sec", "Builders" );
send_to_char( buf, ch );
for ( pArea = area_first; pArea != NULL; pArea = pArea->next )
{
sprintf( buf, "[%3d] %-35s (%-5d-%5d) %13s %2d [%s]\n\r",
pArea->vnum,
pArea->name,
pArea->lvnum,
pArea->uvnum,
pArea->filename,
pArea->security,
pArea->builders );
send_to_char( buf, ch );
}
return;
}