137 lines
2.8 KiB
C
137 lines
2.8 KiB
C
|
/** Adventure translated from Fortran to "C"
|
||
|
and ported to Minix by:
|
||
|
Robert R. Hall
|
||
|
San Diego, Calif 92115
|
||
|
hall@crash.cts.com
|
||
|
*/
|
||
|
|
||
|
/** program ADVENT.C *
|
||
|
* "advent.c" allocates GLOBAL storage space by *
|
||
|
* #defining EXTERN before #including "advdec.h". */
|
||
|
|
||
|
|
||
|
#include <string.h>
|
||
|
#include <ctype.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <time.h>
|
||
|
#include <stdio.h>
|
||
|
#include <errno.h>
|
||
|
#include "advent.h" /* #define preprocessor equates */
|
||
|
#include "advdec.h"
|
||
|
|
||
|
#ifndef TEXTDIR
|
||
|
#define TEXTDIR ""
|
||
|
#endif
|
||
|
|
||
|
char textdir[] = TEXTDIR; /* directory where text files
|
||
|
live. */
|
||
|
|
||
|
_PROTOTYPE(int main, (int, char **));
|
||
|
_PROTOTYPE(static void opentxt, (void));
|
||
|
_PROTOTYPE(static void file_error, (char *));
|
||
|
|
||
|
int main(argc, argv)
|
||
|
int argc;
|
||
|
char **argv;
|
||
|
{
|
||
|
opentxt();
|
||
|
initialize();
|
||
|
rspeak(325);
|
||
|
if (argc == 2)
|
||
|
restore(argv[1]);
|
||
|
else {
|
||
|
g.hinted[3] = yes(65, 1, 0);
|
||
|
g.limit = (g.hinted[3] ? 800 : 550);
|
||
|
}
|
||
|
gaveup = FALSE;
|
||
|
srand((unsigned) time(NULL)); /* seed random */
|
||
|
while (!gaveup)
|
||
|
turn();
|
||
|
fclose(fd1);
|
||
|
fclose(fd2);
|
||
|
fclose(fd3);
|
||
|
fclose(fd4);
|
||
|
return (EXIT_SUCCESS); /* exit = ok */
|
||
|
} /* main */
|
||
|
|
||
|
/*
|
||
|
Open advent?.txt files
|
||
|
*/
|
||
|
static void opentxt()
|
||
|
{
|
||
|
static char filename[sizeof(textdir) + 16];
|
||
|
static FILE **fp[] = {0, &fd1, &fd2, &fd3, &fd4};
|
||
|
int i;
|
||
|
for (i = 1; i <= 4; i++) {
|
||
|
sprintf(filename, "%sadvent%d.dat", textdir, i);
|
||
|
*fp[i] = fopen(filename, "r");
|
||
|
if (!*fp[i])
|
||
|
file_error(filename);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
save adventure game
|
||
|
*/
|
||
|
void saveadv(username)
|
||
|
char *username;
|
||
|
{
|
||
|
int cnt;
|
||
|
FILE *savefd;
|
||
|
|
||
|
savefd = fopen(username, "wb");
|
||
|
if (savefd == NULL) {
|
||
|
perror(username);
|
||
|
return;
|
||
|
}
|
||
|
cnt = fwrite((void *) &g, 1, sizeof(struct playinfo), savefd);
|
||
|
if (cnt != sizeof(struct playinfo)) {
|
||
|
fprintf(stderr, "wrote %d of %u bytes\n",
|
||
|
cnt, (unsigned) sizeof(struct playinfo));
|
||
|
if (ferror(savefd)) {
|
||
|
fprintf(stderr, "errno is: 0x%.4x\n", errno);
|
||
|
perror(username);
|
||
|
}
|
||
|
}
|
||
|
if (fclose(savefd) == -1) {
|
||
|
perror(username);
|
||
|
}
|
||
|
printf("Saved in %s.\n", username);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
restore saved game handler
|
||
|
*/
|
||
|
void restore(username)
|
||
|
char *username;
|
||
|
{
|
||
|
int cnt;
|
||
|
FILE *restfd;
|
||
|
|
||
|
restfd = fopen(username, "rb");
|
||
|
if (restfd == NULL)
|
||
|
file_error(username);
|
||
|
cnt = fread((void *) &g, 1, sizeof(struct playinfo), restfd);
|
||
|
if (cnt != sizeof(struct playinfo)) {
|
||
|
fprintf(stderr, "read %d bytes, expected %u\n",
|
||
|
cnt, (unsigned) sizeof(struct playinfo));
|
||
|
if (ferror(restfd)) {
|
||
|
fprintf(stderr, "errno is: 0x%.4x\n", errno);
|
||
|
perror(username);
|
||
|
}
|
||
|
}
|
||
|
if (fclose(restfd) == -1) {
|
||
|
perror(username);
|
||
|
}
|
||
|
printf("Restored from %s.\n", username);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
static void file_error(filename)
|
||
|
char *filename;
|
||
|
{
|
||
|
perror(filename);
|
||
|
exit(EXIT_FAILURE);
|
||
|
}
|