Here's some code I've done, although it's not used with this MUD.
These functions handle reading, storing, and writing to a game data file. It stores global variables, such as how many times the game has been run.
In the main header file: Define the game data file:
Code:
#define GAME_DATA_FILE "../game.dat" /* Stores global variables */
Define the struct:
Code:
typedef struct game_data GAME_DATA;
Allow it to be used outside this header file:
Code:
extern struct game_data gamedat;
The actual struct:
Code:
struct game_data
{
sh_int gamestate;
int defaulthp;
int battlenum;
sh_int samechars;
sh_int joining;
};
Define functions used to load/save/check the file:
Code:
void fread_gamedata ( GAME_DATA *sys, FILE *fp );
bool load_gamedata ( GAME_DATA *sys );
void save_gamedata ( GAME_DATA game );
In save.c: Read the game data file:
Code:
void fread_gamedata( GAME_DATA *sys, FILE *fp )
{
char *word;
bool done = FALSE, found;
word = fread_word(fp);
while (!done)
{
found = FALSE;
switch (word[0])
{
case 'B':
IREAD( "BattleNum", sys->battlenum );
break;
case 'D':
IREAD( "DefaultHP", sys->defaulthp );
break;
case 'E':
if (compares(word, "EOF")) {done = TRUE; found = TRUE; break;}
break;
case 'G':
IREAD( "GameState", sys->gamestate );
break;
case 'J':
IREAD( "Joining", sys->joining );
break;
case 'S':
IREAD( "SameChars", sys->samechars );
break;
default:
bug("Fread_gamedata: default case.", word );
return;
}
if (!found)
{
bug("Fread_gamedata: unexpected '%s' in game_data.", word );
}
if (!done) word = fread_word(fp);
}
}
Load the game data file:
Code:
bool load_gamedata( GAME_DATA *sys )
{
FILE *fp;
bool found;
found = FALSE;
if ( ( fp = fopen( GAME_DATA_FILE, "r" ) ) != NULL )
{
fread_gamedata( sys, fp );
fclose( fp );
}
return found;
}
Save the game data file:
Code:
void save_gamedata( GAME_DATA game )
{
FILE *fp;
if ( ( fp = fopen( GAME_DATA_FILE, "w" ) ) == NULL )
{
bug( "save_gamedata: fopen" );
perror( GAME_DATA_FILE );
}
else
{
fprintf( fp, "GameState %d\n", game.gamestate );
fprintf( fp, "DefaultHP %d\n", game.defaulthp );
fprintf( fp, "BattleNum %d\n", game.battlenum );
fprintf( fp, "SameChars %d\n", game.samechars );
fprintf( fp, "Joining %d\n", game.joining );
fprintf( fp, "EOF" );
}
fclose( fp );
return;
}
In socket.c: Ref the struct to use:
Code:
GAME_DATA gamedat;
Finally, load the damn data:
Code:
load_gamedata(&gamedat);
And done.