/******************************************************************************
Snippet: Wilderness system (v1.0).
Author: Richard Woolcock (aka KaVir).
Date: 2nd September 1998.
******************************************************************************
File: wild_io.c
Purpose: Deals with input/output files.
******************************************************************************
This code is copyright (C) 1998 by Richard Woolcock. It may be used and
distributed freely, as long as you do not remove this copyright notice.
******************************************************************************/
/******************************************************************************
Required libraries
******************************************************************************/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "wild.h"
/******************************************************************************
Local literals
******************************************************************************/
#define WORLD_DIR "../world/" /* World files */
/******************************************************************************
Local operation prototypes
******************************************************************************/
bool world_exists args( ( int x, int y ) );
/******************************************************************************
Global operations
******************************************************************************/
void wild_write( int x, int y )
{
char strsave[MAX_INPUT_LENGTH];
FILE *fp;
int loopx, loopy, xx, yy;
int linecount = 0;
if ( x < 0 || x >= (WILDERNESS_SIZE/100) ||
y < 0 || y >= (WILDERNESS_SIZE/100) )
{
bug( "Map location out of range.", 0 );
return;
}
xx = x * 100;
yy = y * 100;
fflush( fpReserve );
fclose( fpReserve );
sprintf( strsave, "%sX%d.Y%d", WORLD_DIR, x, y );
if ( ( fp = fopen( strsave, "w" ) ) == NULL )
bug("Cannot Open map data file.", 0);
else
{
for ( loopx = 0; loopx < 100; loopx++ )
{
for ( loopy = 0; loopy < 100; loopy++ )
{
fprintf( fp, "%c", map_data(loopx+xx,loopy+yy) );
if (++linecount % 80 == 0)
fprintf( fp, "\n");
}
}
}
fflush( fp );
fclose( fp );
fpReserve = fopen( NULL_FILE, "r" );
return;
}
void wild_read( int x, int y )
{
char strsave[MAX_INPUT_LENGTH];
char letter;
FILE *fp;
int loopx, loopy, xx, yy;
bool done_reading = FALSE;
bool yet_finished;
if ( x < 0 || x >= (WILDERNESS_SIZE/100) ||
y < 0 || y >= (WILDERNESS_SIZE/100) )
{
bug( "Map location out of range.", 0 );
return;
}
xx = x * 100;
yy = y * 100;
if ( !world_exists(x, y) )
{
for ( loopx = 0; loopx < 100; loopx++ )
{
for ( loopy = 0; loopy < 100; loopy++ )
{
set_map_data(loopx+xx,loopy+yy, map_big(x,y));
}
}
wild_write(x,y);
return;
}
fflush( fpReserve );
fclose( fpReserve );
sprintf( strsave, "%sX%d.Y%d", WORLD_DIR, x, y );
if ( ( fp = fopen( strsave, "r" ) ) != NULL )
{
for ( loopx = 0; loopx < 100; loopx++ )
{
for ( loopy = 0; loopy < 100; loopy++ )
{
if ( done_reading == TRUE )
set_map_data(loopx+xx, loopy+yy, WILD_PLAINS);
else if ( ( letter = fread_letter( fp ) ) == EOF)
{
done_reading = TRUE;
set_map_data(loopx+xx, loopy+yy, WILD_PLAINS);
}
else
{
yet_finished = FALSE;
while ( !yet_finished )
{
switch ( letter )
{
default:
if ( ( letter = fread_letter( fp ) ) == EOF )
{
done_reading = TRUE;
set_map_data(loopx+xx, loopy+yy, WILD_PLAINS);
yet_finished = TRUE;
}
break;
case 'a': case 'b': case 'c': case 'd':
case 'e': case 'f': case 'g': case 'h':
case 'i': case 'j': case 'k': case 'l':
case 'm': case 'n': case 'o': case 'p':
case 'q': case 'r': case 's': case 't':
case 'u': case 'v': case 'w': case 'x':
case 'y': case 'z': case '_': case '@':
case 'A': case 'B': case 'C': case 'D':
case 'E': case 'F': case 'G': case 'H':
case 'I': case 'J': case 'K': case 'L':
case 'M': case 'N': case 'O': case 'P':
case 'Q': case 'R': case 'S': case 'T':
case 'U': case 'V': case 'W': case 'X':
case 'Y': case 'Z': case '1': case '2':
case '3': case '4': case '5': case '6':
case '7': case '8': case '9': case '0':
set_map_data(loopx+xx, loopy+yy, letter);
yet_finished = TRUE;
break;
}
}
}
}
}
}
else
{
bug( "wild_read: fopen", 0 );
perror( strsave );
}
fflush( fp );
fclose( fp );
fpReserve = fopen( NULL_FILE, "r" );
return;
}
void world_read( void )
{
int x, y;
for ( x = 0; x < 10; x++ )
{
for ( y = 0; y < 10; y++ )
{
set_map_changed(x, y, FALSE);
wild_read(x,y);
}
}
return;
}
/******************************************************************************
Local operations
******************************************************************************/
bool world_exists( int x, int y )
{
FILE *fp;
char buf [MAX_STRING_LENGTH];
bool found = FALSE;
fflush( fpReserve );
fclose( fpReserve );
sprintf( buf, "%sX%d.Y%d", WORLD_DIR, x, y );
if ( ( fp = fopen( buf, "r" ) ) != NULL )
{
found = TRUE;
fflush( fp );
fclose( fp );
fpReserve = fopen( NULL_FILE, "r" );
}
return ( found );
}