home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
games
/
volume13
/
xsokoban2
/
part02
/
save.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-01-13
|
6KB
|
206 lines
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#if ! defined(vax)
# include <netinet/in.h>
#endif
#include "sokoban.h"
extern char *malloc();
extern FILE *fopen();
extern char *username;
extern char map[MAXROW + 1][MAXCOL + 1];
extern short level, moves, pushes, packets, savepack, rows, cols;
extern POS ppos;
static long savedbn;
static char *sfname;
static FILE *savefile;
static struct stat sfstat;
short
savegame()
{
short ret = 0;
signal(SIGINT, SIG_IGN);
sfname = malloc(strlen(SAVEPATH) + strlen(username) + 6);
sprintf(sfname, "%s/%s.sav", SAVEPATH, username);
#ifdef __MSDOS__
if ((savefile = fopen(sfname, "wb")) == NULL)
ret = E_FOPENSAVE;
else {
if (fwrite(map, 1, MAXROW * MAXCOL, savefile) != MAXROW * MAXCOL)
ret = E_WRITESAVE;
else if (fwrite(&ppos, 1, sizeof(POS), savefile) != sizeof(POS))
ret = E_WRITESAVE;
else if (fwrite(&level, 1, 2, savefile) != 2)
ret = E_WRITESAVE;
else if (fwrite(&moves, 1, 2, savefile) != 2)
ret = E_WRITESAVE;
else if (fwrite(&pushes, 1, 2, savefile) != 2)
ret = E_WRITESAVE;
else if (fwrite(&packets, 1, 2, savefile) != 2)
ret = E_WRITESAVE;
else if (fwrite(&savepack, 1, 2, savefile) != 2)
ret = E_WRITESAVE;
else if (fwrite(&rows, 1, 2, savefile) != 2)
ret = E_WRITESAVE;
else if (fwrite(&cols, 1, 2, savefile) != 2)
ret = E_WRITESAVE;
else {
fclose(savefile);
if (stat(sfname, &sfstat) != 0)
ret = E_STATSAVE;
else if ((savefile = fopen(sfname, "ab")) == NULL)
ret = E_FOPENSAVE;
else {
if (fwrite(&sfstat, 1, sizeof(sfstat), savefile) != sizeof(sfstat))
ret = E_WRITESAVE;
#else
packets = htons(packets);
pushes = htons(pushes);
moves = htons(moves);
level = htons(level);
cols = htons(cols);
savepack = htons(savepack);
rows = htons(rows);
ppos.x = htons(ppos.x);
ppos.y = htons(ppos.y);
if ((savefile = fopen(sfname, "w")) == NULL)
ret = E_FOPENSAVE;
else {
savedbn = fileno(savefile);
if (write(savedbn, &(map[0][0]), MAXROW * MAXCOL) != MAXROW * MAXCOL)
ret = E_WRITESAVE;
else if (write(savedbn, &ppos, sizeof(POS)) != sizeof(POS))
ret = E_WRITESAVE;
else if (write(savedbn, &level, 2) != 2)
ret = E_WRITESAVE;
else if (write(savedbn, &moves, 2) != 2)
ret = E_WRITESAVE;
else if (write(savedbn, &pushes, 2) != 2)
ret = E_WRITESAVE;
else if (write(savedbn, &packets, 2) != 2)
ret = E_WRITESAVE;
else if (write(savedbn, &savepack, 2) != 2)
ret = E_WRITESAVE;
else if (write(savedbn, &rows, 2) != 2)
ret = E_WRITESAVE;
else if (write(savedbn, &cols, 2) != 2)
ret = E_WRITESAVE;
else
fclose(savefile);
if (stat(sfname, &sfstat) != 0)
ret = E_STATSAVE;
else if ((savefile = fopen(sfname, "a")) == NULL)
ret = E_FOPENSAVE;
else if (write(savedbn, &sfstat, sizeof(sfstat)) != sizeof(sfstat))
ret = E_WRITESAVE;
#endif
fclose(savefile);
}
#ifndef __MSDOS__
ppos.x = ntohs(ppos.x);
ppos.y = ntohs(ppos.y);
pushes = ntohs(pushes);
moves = ntohs(moves);
level = ntohs(level);
packets = ntohs(packets);
cols = ntohs(cols);
rows = ntohs(rows);
savepack = ntohs(savepack);
#endif
if ((ret == E_WRITESAVE) || (ret == E_STATSAVE))
unlink(sfname);
signal(SIGINT, SIG_DFL);
return (ret);
}
short
restoregame()
{
short ret = 0;
struct stat oldsfstat;
signal(SIGINT, SIG_IGN);
sfname = malloc(strlen(SAVEPATH) + strlen(username) + 6);
sprintf(sfname, "%s/%s.sav", SAVEPATH, username);
#ifdef __MSDOS__
if (stat(sfname, &oldsfstat) < -1)
ret = E_NOSAVEFILE;
else {
if ((savefile = fopen(sfname, "rb")) == NULL)
ret = E_FOPENSAVE;
else {
if (fread(map, 1, MAXROW * MAXCOL, savefile) != MAXROW * MAXCOL)
ret = E_READSAVE;
else if (fread(&ppos, 1, sizeof(POS), savefile) != sizeof(POS))
ret = E_READSAVE;
else if (fread(&level, 1, 2, savefile) != 2)
ret = E_READSAVE;
else if (fread(&moves, 1, 2, savefile) != 2)
ret = E_READSAVE;
else if (fread(&pushes, 1, 2, savefile) != 2)
ret = E_READSAVE;
else if (fread(&packets, 1, 2, savefile) != 2)
ret = E_READSAVE;
else if (fread(&savepack, 1, 2, savefile) != 2)
ret = E_READSAVE;
else if (fread(&rows, 1, 2, savefile) != 2)
ret = E_READSAVE;
else if (fread(&cols, 1, 2, savefile) != 2)
ret = E_READSAVE;
else if (fread(&sfstat, 1, sizeof(sfstat), savefile) != sizeof(sfstat))
#else
if (stat(sfname, &oldsfstat) < -1)
ret = E_NOSAVEFILE;
else {
if ((savefile = fopen(sfname, "r")) == NULL)
ret = E_FOPENSAVE;
else {
savedbn = fileno(savefile);
if (read(savedbn, &(map[0][0]), MAXROW * MAXCOL) != MAXROW * MAXCOL)
ret = E_READSAVE;
else if (read(savedbn, &ppos, sizeof(POS)) != sizeof(POS))
ret = E_READSAVE;
else if (read(savedbn, &level, 2) != 2)
ret = E_READSAVE;
else if (read(savedbn, &moves, 2) != 2)
ret = E_READSAVE;
else if (read(savedbn, &pushes, 2) != 2)
ret = E_READSAVE;
else if (read(savedbn, &packets, 2) != 2)
ret = E_READSAVE;
else if (read(savedbn, &savepack, 2) != 2)
ret = E_READSAVE;
else if (read(savedbn, &rows, 2) != 2)
ret = E_READSAVE;
else if (read(savedbn, &cols, 2) != 2)
ret = E_READSAVE;
else if (read(savedbn, &sfstat, sizeof(sfstat)) != sizeof(sfstat))
#endif
ret = E_READSAVE;
}
ppos.x = ntohs(ppos.x);
ppos.y = ntohs(ppos.y);
level = ntohs(level);
moves = ntohs(moves);
pushes = ntohs(pushes);
packets = ntohs(packets);
savepack = ntohs(savepack);
rows = ntohs(rows);
cols = ntohs(cols);
unlink(sfname);
}
signal(SIGINT, SIG_DFL);
return (ret);
}