#include "main.h"
#include "modify.h"
#ifdef LOG
#include <xlog.h>
#endif
#include <stdio.h>
#define C_VERSION 1
void fread_main( CAMP *c, FILE *fp );
bool save_campaign( CAMP *c )
{
FILE *fp = NULL;
if ( c == NULL )
{
#ifdef LOG_CAMPAIGN
L( "Save_Campaign", "Null campaign", 0 );
#endif
return FALSE;
}
if ( CHECK_STR(c->filename) ) {
#ifdef LOG_CAMPAIGN
L( "Save_Campaign", "Null filename", 0 );
#endif
return FALSE;
}
if ( (fp = fopen( c->filename, "w")) == NULL )
return FALSE;
fprintf( fp, "#CAMPAIGN\n\n" );
fprintf( fp, "Version %d\n", C_VERSION );
fprintf( fp, "Filename %s~\n", c->filename );
fprintf( fp, "Author %s~\n", c->author );
fprintf( fp, "Name %s~\n", c->name );
fprintf( fp, "World %s~\n", c->world_name );
fprintf( fp, "LLow %d\n", c->level_range[0] );
fprintf( fp, "LHigh %d\n", c->level_range[1] );
fprintf( fp, "EndMain\n\n" );
fprintf( fp, "#END\n" );
fclose(fp);
if ( c->modified == TRUE )
c->modified = FALSE;
return TRUE;
}
bool close_campaign( CAMP *c )
{
if ( c == NULL )
{
#ifdef LOG_CAMPAIGN
L( "Close_Campaign", "Null campaign", 0 );
#endif
return FALSE;
}
DISPOSE(c->filename);
DISPOSE(c->author);
DISPOSE(c->name);
DISPOSE(c->world_name);
DISPOSE(c);
c = NULL; return TRUE;
}
CAMP *open_campaign( FILE *fp )
{
CAMP *c = NULL;
if ( fp == NULL )
{
#ifdef LOG
L( "Open_Campaign", "Null File!", 0 );
#endif
return NULL;
}
if ( c == NULL ) CREATE( c, CAMP, 1 );
for ( ; ; )
{
char letter;
char *word;
letter = fread_letter( fp );
if ( letter != '#' )
{
#ifdef LOG
L( "Open_Campaign", "# not found.", 0 );
#endif
break;
}
word = fread_word( fp );
if ( !stricmp( word, "CAMPAIGN" ) )
{
fread_main( c, fp );
break;
}
else
if ( !strcmp( word, "END" ) )
break;
else
{
#ifdef LOG
L( "Open_Campaign", "bad section: %s", word );
#endif
break;
}
}
fclose( fp );
return c;
}
#ifdef SKEY
#undef SKEY
#endif
#define SKEY( literal, field, value ) \
if ( !stricmp( word, literal ) ) \
{ \
field = value; \
fMatch = TRUE; \
break; \
}
void fread_main( CAMP *c, FILE *fp )
{
short version;
char *word;
bool fMatch;
if ( c == NULL )
{
#ifdef LOG
L( "Fread_Main", "Null Campaign", 0 );
#endif
return;
}
for ( ; ; )
{
word = feof( fp ) ? "EndMain" : fread_word( fp );
fMatch = FALSE;
switch ( toupper(word[0]) )
{
case 'A':
SKEY( "Author", c->author, fread_string( fp ) );
break;
case 'E':
if ( !stricmp(word, "EndMain" ) )
{
if ( c->level_range[0] > 40 )
c->level_range[0] = 40;
if ( c->level_range[1] > 40 )
c->level_range[1] = 40;
c->modified = FALSE;
return; }
break;
case 'F':
SKEY( "Filename", c->filename, fread_string( fp ) );
break;
case 'N':
SKEY( "Name", c->name, fread_string( fp ) );
break;
case 'V':
SKEY( "Version", version, fread_number( fp ) );
break;
case 'W':
SKEY( "World", c->world_name, fread_string( fp ) );
break;
case 'L':
SKEY( "LLow", c->level_range[0], fread_number( fp ) );
SKEY( "LHigh", c->level_range[1], fread_number( fp ) );
break;
}
if ( !fMatch )
{
#ifdef LOG
L( "Fread_Main", "No match: %s", word );
#endif
}
}
}