#include "define.h"
#include "struct.h"
area_data* area_list;
const char* area_status [ MAX_AREA_STATUS ] = {
"open", "worthless", "abandoned", "progressing", "pending",
"blank", "immortal" };
/*
* AREA_DATA CLASS
*/
Area_Data :: Area_Data( )
{
record_new( sizeof( area_data ), MEM_AREA );
room_first = NULL;
age = 15;
nplayer = 0;
modified = TRUE;
}
/*
* DISK ROUTINES
*/
bool set_area_file( char_data* ch, char* arg, const char*& name )
{
FILE* fp;
area_data* area;
int i;
for( i = 0; arg[i] != '\0'; i++ )
if( !isalpha( arg[i] ) ) {
send( ch, "An area file name may only contain letters.\r\n" );
return FALSE;
}
if( i < 3 || i > 12 ) {
send( ch, "An area file name must be between 3 and 12 letters.\r\n" );
return FALSE;
}
for( area = area_list; area != NULL; area = area->next )
if( !strcasecmp( area->file, arg ) ) {
send( ch, "There is already an area with that filename.\r\n" );
return FALSE;
}
if( ( fp = open_file( AREA_LIST, "w" ) ) == NULL )
return FALSE;
swap( arg, (char*&) name );
for( area = area_list; area != NULL; area = area->next ) {
fprintf( fp, "%s\n", area->file );
if( area->file == name ) {
save_area( area );
}
}
fprintf( fp, "$\n\n" );
fclose( fp );
swap( arg, (char*&) name );
return TRUE;
}
void load_area( const char* file )
{
char* tmp = static_string( );
area_data* area;
FILE* fp;
sprintf( tmp, "%s.are", file );
fp = open_file( AREA_DIR, tmp, "r", TRUE );
area = new area_data;
area->file = alloc_string( file, MEM_AREA );
if( strcmp( fread_word( fp ), "#AREA" ) )
panic( "Load_area: missing header" );
area->name = fread_string( fp, MEM_AREA );
area->creator = fread_string( fp, MEM_AREA );
area->help = fread_string( fp, MEM_AREA );
area->level = fread_number( fp );
area->reset_time = fread_number( fp );
area->status = fread_number( fp );
fprintf( stdout, " -%s\r\n", area->name );
append( area_list, area );
load_rooms( fp, area );
fclose( fp );
}
bool save_area( area_data* area, bool forced )
{
char* tmp = static_string( );
action_data* action;
room_data* room;
exit_data* exit;
FILE* fp;
if( !forced && !area->modified )
return FALSE;
sprintf( tmp, "%s.are", area->file );
if( ( fp = open_file( AREA_DIR, tmp, "w" ) ) == NULL )
return FALSE;
fprintf( fp, "#AREA\n" );
fprintf( fp, "%s~\n", area->name );
fprintf( fp, "%s~\n", area->creator );
fprintf( fp, "%s~\n\n", area->help );
fprintf( fp, "%d %d\n", area->level, area->reset_time );
fprintf( fp, "%d\n", area->status );
fprintf( fp, "#ROOMS\n\n" );
for( room = area->room_first; room != NULL; room = room->next ) {
fprintf( fp, "#%d\n", room->vnum );
fprintf( fp, "%s~\n", room->name );
fprintf( fp, "%s~\n", room->description );
fprintf( fp, "%s~\n", room->comments );
fprintf( fp, "%d %d %d 0\n", room->room_flags,
room->sector_type, room->size );
for( int i = 0; i < room->exits; i++ ) {
exit = room->exits[i];
fprintf( fp, "D%d\n", exit->direction );
fprintf( fp, "%s~\n", exit->name );
fprintf( fp, "%s~\n", exit->keywords );
fprintf( fp, "%d %d %d %d %d %d\n", exit->exit_info,
exit->key, exit->to_room->vnum,
exit->strength, exit->light, exit->size );
}
write_extras( fp, room->extra_descr );
for( action = room->action; action != NULL; action = action->next )
write( fp, action );
write( fp, room->reset );
fprintf( fp, "S\n\n" );
}
fprintf( fp, "#0\n\n" );
fclose( fp );
area->modified = FALSE;
return TRUE;
}
/*
* AREA LIST COMMAND
*/
void room_range( area_data* area, int& low, int& high, int &nRooms )
{
room_data* room;
low = 99999;
high = 0;
nRooms = 0;
for( room = area->room_first; room != NULL; room = room->next ) {
nRooms++;
low = min( low, room->vnum );
high = max( high, room->vnum );
}
return;
}
/*
* AREA/ROOM SUMMARY COMMANDS
*/
void do_areas( char_data* ch, char* argument )
{
char tmp [ TWO_LINES ];
area_data* area;
int min;
int max;
int nRooms;
int i;
int status;
int length = strlen( argument );
if( ch->link == NULL )
return;
if( *argument == '\0' ) {
page_title( ch, "Areas" );
for( i = 0, area = area_list; area != NULL; area = area->next ) {
if( area->help != empty_string && area->status == AREA_OPEN )
page( ch, "%24s%s", area->name, (i++)%3 != 2 ? "" : "\r\n" );
}
if( i%3 != 0 )
page( ch, "\r\n" );
page( ch, "\r\n" );
page_centered( ch, "[ Type area <name> to see more information. ]" );
return;
}
if( is_apprentice( ch ) ) {
status = -1;
if( strncasecmp( argument, "summary", length ) )
for( status = 0; status < MAX_AREA_STATUS; status++ )
if( !strncasecmp( argument, area_status[status], length ) )
break;
if( status != MAX_AREA_STATUS ) {
sprintf( tmp, "%25s %11s %5s %s\r\n", "Area Name",
"Vnum Range", "#Plyr", "Creator" );
page_underlined( ch, tmp );
for( i = 0; i < MAX_AREA_STATUS; i++ ) {
if( status != -1 && i != status )
continue;
*tmp = '\0';
for( area = area_list; area != NULL; area = area->next ) {
if( area->status != i )
continue;
if( *tmp == '\0' ) {
page( ch, "\r\n" );
sprintf( tmp, "--- %s ---", area_status[i] );
tmp[4] = toupper( tmp[4] );
page_centered( ch, tmp );
page( ch, "\r\n" );
}
room_range( area, min, max, nRooms );
page( ch, "%25s %6d-%-6d %3d %s\r\n",
area->name, min, max, area->nplayer, area->creator );
}
}
return;
}
}
for( area = area_list; area != NULL; area = area->next )
if( area->help != empty_string && area->status == AREA_OPEN
&& !strncasecmp( area->name, argument, length ) )
break;
if( area == NULL ) {
send( ch, "No area matching that name found.\r\n" );
return;
}
page( ch, " Name: %s\r\n", area->name );
page( ch, " Creator: %s\r\n", area->creator );
if( is_builder( ch ) ) {
room_range( area, min, max, nRooms );
page( ch, " Rooms: %d\r\n", nRooms );
page( ch, " Vnum Range: %d to %d\r\n", min, max );
}
page( ch, "Approx. Level: %d\r\n\r\n", area->level );
help_link( ch->link, area->help );
return;
}
void do_roomlist( char_data* ch, char* )
{
room_data* room;
if( ( room = Room( ch->array->where ) ) == NULL ) {
send( ch, "You aren't in a room.\r\n" );
return;
}
page_underlined( ch, "Vnum Name of Room\r\n" );
for( room = room->area->room_first; room != NULL; room = room->next )
page( ch, "%-6d %s\r\n", room->vnum, room->name );
}