#include "ctype.h"
#include "sys/types.h"
#include "stdio.h"
#include "stdlib.h"
#include "define.h"
#include "struct.h"
int num_rtable = 0;
rtable_data** rtable_list = NULL;
void renumber_rtable ( char_data*, int, int );
bool can_extract ( int, char_data* );
bool has_reset ( int );
/*
* RTABLE_DATA NEW AND DELETE
*/
Rtable_Data :: Rtable_Data( )
{
name = empty_string;
reset = NULL;
return;
}
Rtable_Data :: ~Rtable_Data( )
{
return;
}
/*
* SUPPORT ROUTINES
*/
bool can_extract( int index, char_data* ch )
{
if( has_reset( index ) ) {
send( ch, "That table still has resets and cannot be extracted.\n\r" );
return FALSE;
}
return TRUE;
}
bool has_reset( int index )
{
reset_data* reset;
species_data* species;
area_data* area;
room_data* room;
int i;
for( i = 0; i < MAX_SPECIES; i++ )
if( ( species = species_list[i] ) != NULL )
for( reset = species->reset; reset != NULL; reset = reset->next )
if( index == reset->vnum
&& !is_set( &reset->flags, RSFLAG_MOB )
&& !is_set( &reset->flags, RSFLAG_OBJECT ) )
return TRUE;
for( area = area_list; area != NULL; area = area->next )
for( room = area->room_first; room != NULL; room = room->next )
for( reset = room->reset; reset != NULL; reset = reset->next )
if( index == reset->vnum
&& !is_set( &reset->flags, RSFLAG_MOB )
&& !is_set( &reset->flags, RSFLAG_OBJECT ) )
return TRUE;
for( i = 0; i < num_rtable; i++ )
for( reset = rtable_list[i]->reset; reset != NULL; reset = reset->next )
if( index == reset->vnum
&& !is_set( &reset->flags, RSFLAG_MOB )
&& !is_set( &reset->flags, RSFLAG_OBJECT ) )
return TRUE;
return FALSE;
}
/*
* EDITING ROUTINE
*/
void do_rtable( char_data* ch, char* argument )
{
rtable_data* rtable;
wizard_data* wizard = (wizard_data*) ch;
int i = wizard->rtable_edit;
int j;
bool flag;
if( matches( argument, "exit" ) || !strcmp( argument, ".." ) ) {
if( i == - 1 )
send( ch, "You already aren't editting a rtable.\n\r" );
else {
send( ch, "You stop editting rtable '%s'.\n\r",
rtable_list[i]->name );
wizard->rtable_edit = -1;
}
return;
}
if( i != -1 ) {
edit_reset( ch, argument, rtable_list[i]->reset, RST_TABLE,
rtable_list[i]->name );
return;
}
if( *argument == '\0' ) {
page_title( ch, "Reset Tables" );
for( i = 0; i < num_rtable; i++ )
send( ch, "[%2i] %s\n\r", i+1, rtable_list[i]->name );
return;
}
if( exact_match( argument, "new" ) ) {
if( *argument == '\0' ) {
send( ch, "Name of new table?\n\r" );
return;
}
rtable = new rtable_data;
rtable->name = alloc_string( argument, MEM_RESET );
insert( rtable_list, num_rtable, rtable, num_rtable );
send( ch, "Rtable '%s' created.\n\r", argument );
return;
}
flag = matches( argument, "delete" );
if( number_arg( argument, i ) ) {
if( --i < 0 || i >= num_rtable ) {
send( ch, "No rtable exists with that index.\n\r" );
return;
}
rtable = rtable_list[i];
if( flag ) {
if( can_extract( i, ch ) ) {
send( ch, "Rtable %d, %s removed.\n\r", i+1, rtable->name );
remove( rtable_list, num_rtable, i );
delete rtable;
}
return;
}
if( *argument == '\0' ) {
wizard->rtable_edit = i;
send( ch, "You are now editing rtable %d, '%s'.\n\r",
i+1, rtable->name );
}
else if( number_arg( argument, j ) ) {
renumber_rtable( ch, i, j );
}
else {
send( ch, "Rtable %d, '%s' renamed '%s'.\n\r",
i+1, rtable->name, argument );
free_string( rtable->name, MEM_RESET );
rtable->name = alloc_string( argument, MEM_RESET );
}
return;
}
send( ch, "Illegal syntax - See help rtable.\n\r" );
}
void renumber_rtable( char_data* ch, int i, int j )
{
area_data* area;
room_data* room;
reset_data* reset;
species_data* species;
int k;
rtable_data* rtable = rtable_list[i];
if( --j < 0 || j >= num_rtable ) {
send( ch, "You can only move a rtable to a sensible position.\n\r" );
return;
}
if( i == j ) {
send( ch, "Moving a rtable to where it already is does nothing\
interesting.\n\r" );
return;
}
remove( rtable_list, num_rtable, i );
insert( rtable_list, num_rtable, rtable, j );
send( ch, "Rtable '%s' moved to position %d.\n\r",
rtable->name, j+1 );
/* RENUMBER RESETS */
for( area = area_list; area != NULL; area = area->next )
for( room = area->room_first; room != NULL; room = room->next )
for( reset = room->reset; reset != NULL; reset = reset->next )
if( !is_set( &reset->flags, RSFLAG_OBJECT )
&& !is_set( &reset->flags, RSFLAG_MOB )
&& renumber( reset->vnum, i, j ) )
area->modified = TRUE;
for( k = 0; k < MAX_SPECIES; k++ )
if( ( species = species_list[k] ) != NULL )
for( reset = species->reset; reset != NULL; reset = reset->next )
if( !is_set( &reset->flags, RSFLAG_OBJECT )
&& !is_set( &reset->flags, RSFLAG_MOB ) )
renumber( reset->vnum, i, j );
return;
}
/*
* DISK ROUTINES
*/
void load_rtables( )
{
FILE* fp;
int i, j;
reset_data* reset;
rtable_data* rtable;
fprintf( stderr, "Loading Reset Tables...\n\r" );
fp = open_file( RTABLE_FILE, "r" );
num_rtable = fread_number( fp );
rtable_list = new rtable_data*[num_rtable];
for( i = 0; i < num_rtable; i++ ) {
rtable = new rtable_data;
rtable->name = fread_string( fp, MEM_RESET );
rtable_list[i] = rtable;
for( ; ; ) {
if( ( j = fread_number( fp ) ) == -1 )
break;
reset = new reset_data;
reset->vnum = j;
reset->flags = fread_number( fp );
reset->chances = fread_number( fp );
reset->value = fread_number( fp );
append( rtable->reset, reset );
}
}
fclose( fp );
}
void save_rtables( )
{
FILE* fp;
reset_data* reset;
if( ( fp = open_file( RTABLE_FILE, "w" ) ) == NULL )
return;
fprintf( fp, "%d\n\n", num_rtable );
for( int i = 0; i < num_rtable; i++ ) {
fprintf( fp, "%s~\n", rtable_list[i]->name );
for( reset = rtable_list[i]->reset; reset != NULL;
reset = reset->next ) {
fprintf( fp, "%d %d %d %d\n", reset->vnum, reset->flags,
reset->chances, reset->value );
}
fprintf( fp, "-1\n\n" );
}
fclose( fp );
}
/*
* RTWHERE
*/
void do_rtwhere( char_data* ch, char* argument )
{
area_data* area;
reset_data* reset;
room_data* room;
species_data* species;
bool found;
int index;
int i;
if( *argument == '\0' ) {
send( ch, "Syntax: rtwhere <table>\n\r" );
return;
}
index = atoi( argument )-1;
found = FALSE;
if( index < 0 || index >= num_rtable ) {
send( ch, "That isn't an acceptable rtable index.\n\r" );
return;
}
/* SEARCH MRESETS */
for( i = 0; i < MAX_SPECIES; i++ ) {
if( ( species = species_list[i] ) == NULL )
continue;
for( reset = species->reset; reset != NULL; reset = reset->next ) {
if( index == reset->vnum
&& !is_set( &reset->flags, RSFLAG_OBJECT )
&& !is_set( &reset->flags, RSFLAG_OBJECT ) ) {
page( ch, " On %d, %s\n\r", i, species->descr->name );
found = TRUE;
}
}
}
/* SEARCH ROOM RESETS */
for( area = area_list; area != NULL; area = area->next ) {
for( room = area->room_first; room != NULL; room = room->next ) {
species = NULL;
for( reset = room->reset; reset != NULL; reset = reset->next ) {
if( is_set( &reset->flags, RSFLAG_MOB ) ) {
species = get_species( reset->vnum );
continue;
}
if( index != reset->vnum
|| is_set( &reset->flags, RSFLAG_OBJECT ) )
continue;
found = TRUE;
if( reset->value == -2 ) {
page( ch, " At room %d, %s\n\r", room->vnum, room->name );
}
else if( species == NULL ) {
page( ch, " [BUG] Illegal reset structure [%d]\n\r",
room->vnum );
}
else {
page( ch, " On %s at %s [%d]\n\r",
species->descr->name, room->name, room->vnum );
}
}
}
}
/* SEARCH TABLES */
for( i = 0; i < num_rtable; i++ )
for( reset = rtable_list[i]->reset; reset != NULL; reset = reset->next )
if( reset->vnum == index
&& !is_set( &reset->flags, RSFLAG_OBJECT ) ) {
page( ch, " In rtable %d, %s.\n\r",
i+1, rtable_list[i]->name );
found = TRUE;
}
if( !found )
page( ch, " no resets found\n\r" );
return;
}