/* program ADVENT.C *\ \* WARNING: "advent.c" allocates GLOBAL storage space by *\ \* including "advdef.h". *\ \* All other modules use "advdec.h" */ #include "stdio.h" /* drv = 1.1st file 2.def 3.A */ #include "advent.h" /* #define preprocessor equates */ #include "advword.h" /* definition of "word" array */ #include "advcave.h" /* definition of "cave" array */ #include "advtext.h" /* definition of "text" arrays */ #include "advdef.h" #define strchr index extern int fclose(); extern int fgetc(); extern FILE *fopen(); extern int fputc(); extern long ftell(); extern int printf(); extern int setmem(); extern int scanf(); extern int sscanf(); extern char *strcat(); extern char *strchr(); extern unsigned strlen(); extern int tolower(); main(argc, argv) int argc; char **argv; { int rflag; /* user restore request option */ rflag = 0; dbugflg = 0; while (--argc > 0) { ++argv; if (**argv != '-') break; switch(tolower(argv[0][1])) { case 'r': ++rflag; continue; case 'd': ++dbugflg; continue; default: printf("unknown flag: %c\n", argv[0][1]); continue; } /* switch */ } /* while */ if (dbugflg < 2) dbugflg = 0; /* must request three times */ opentxt(); initplay(); if (rflag) restore(); else if (yes(65, 1, 0)) limit = 1000; else limit = 330; saveflg = 0; srand(511); /* seed random */ while(!saveflg) turn(); if (saveflg) saveadv(); fclose(fd1); fclose(fd2); fclose(fd3); fclose(fd4); exit(0); /* exit = ok */ } /* main */ /* ************************************************************ */ /* Initialize integer arrays with sscanf */ scanint(pi, str) int *pi; char *str; { while (*str) { if ((sscanf(str, "%d,", pi++)) < 1) bug(41); /* failed before EOS */ while (*str++ != ',') /* advance str pointer */ ; } return; } /* Initialization of adventure play variables */ initplay() { turns = 0; /* initialize location status array */ setmem(cond, (sizeof(int))*MAXLOC, 0); scanint(&cond[1], "5,1,5,5,1,1,5,17,1,1,"); scanint(&cond[13], "32,0,0,2,0,0,64,2,"); scanint(&cond[21], "2,2,0,6,0,2,"); scanint(&cond[31], "2,2,0,0,0,0,0,4,0,2,"); scanint(&cond[42], "128,128,128,128,136,136,136,128,128,"); scanint(&cond[51], "128,128,136,128,136,0,8,0,2,"); scanint(&cond[79], "2,128,128,136,0,0,8,136,128,0,2,2,"); scanint(&cond[95], "4,0,0,0,0,1,"); scanint(&cond[113], "4,0,1,1,"); scanint(&cond[122], "8,8,8,8,8,8,8,8,8,"); /* initialize object locations */ setmem(place, (sizeof(int))*MAXOBJ, 0); scanint(&place[1], "3,3,8,10,11,0,14,13,94,96,"); scanint(&place[11], "19,17,101,103,0,106,0,0,3,3,"); scanint(&place[23], "109,25,23,111,35,0,97,"); scanint(&place[31], "119,117,117,0,130,0,126,140,0,96,"); scanint(&place[50], "18,27,28,29,30,"); scanint(&place[56], "92,95,97,100,101,0,119,127,130,"); /* initialize second (fixed) locations */ setmem(fixed, (sizeof(int))*MAXOBJ, 0); scanint(&fixed[3], "9,0,0,0,15,0,-1,"); scanint(&fixed[11], "-1,27,-1,0,0,0,-1,"); scanint(&fixed[23], "-1,-1,67,-1,110,0,-1,-1,"); scanint(&fixed[31], "121,122,122,0,-1,-1,-1,-1,0,-1,"); scanint(&fixed[62], "121,-1,"); /* initialize default verb messages */ scanint(actmsg, "0,24,29,0,33,0,33,38,38,42,14,"); scanint(&actmsg[11], "43,110,29,110,73,75,29,13,59,59,"); scanint(&actmsg[21], "174,109,67,13,147,155,195,146,110,13,13,"); /* initialize various flags and other variables */ setmem(visited, (sizeof(int))*MAXLOC, 0); setmem(prop, (sizeof(int))*MAXOBJ, 0); setmem(&prop[50], (sizeof(int))*(MAXOBJ-50), 0xff); wzdark = closed = closing = holding = detail = 0; limit = 100; tally = 15; tally2 = 0; newloc = 3; loc = oldloc = oldloc2 = 1; knfloc = 0; chloc = 114; chloc2 = 140; /* dloc[DWARFMAX-1] = chloc */ scanint(dloc, "0,19,27,33,44,64,114,"); scanint(odloc, "0,0,0,0,0,0,0,"); dkill = 0; scanint(dseen, "0,0,0,0,0,0,0,"); clock = 30; clock2 = 50; panic = 0; bonus = 0; numdie = 0; daltloc = 18; lmwarn = 0; foobar = 0; dflag = 0; gaveup = 0; saveflg = 0; return; } /* Open advent?.txt files */ opentxt() { fd1 = fopen("advent1.txt", "r"); if (!fd1) { printf("Sorry, I can't open advent1.txt...\n"); exit(); } fd2 = fopen("advent2.txt", "r"); if (!fd2) { printf("Sorry, I can't open advent2.txt...\n"); exit(); } fd3 = fopen("advent3.txt", "r"); if (!fd3) { printf("Sorry, I can't open advent3.txt...\n"); exit(); } fd4 = fopen("advent4.txt", "r"); if (!fd4) { printf("Sorry, I can't open advent4.txt...\n"); exit(); } } /* save adventure game */ saveadv() { char *sptr; int savefd; char username[13]; printf("What do you want to name the saved game? "); scanf("%s", username); if (sptr = strchr(username, '.')) *sptr = '\0'; /* kill extension */ if (strlen(username) > 8) username[8] = '\0'; /* max 8 char filename */ strcat(username, ".adv"); savefd = fopen(username, "wb"); if (savefd == NULL) { printf("Sorry, I can't create the file...%s\n", \ username); exit(); } for (sptr = &turns; sptr < &lastglob; sptr++) { if (fputc(*sptr, savefd) == EOF) { printf("Write error on save file...%s\n", \ username); exit(); } } if (fclose(savefd) == -1) { printf("Sorry, I can't close the file...%s\n", \ username); exit(); } printf("OK -- \"C\" you later...\n"); } /* restore saved game handler */ restore() { char username[13]; int restfd, c; char *sptr; printf("What is the name of the saved game? "); scanf("%s", username); if (sptr = strchr(username, '.')) *sptr = '\0'; /* kill extension */ if (strlen(username) > 8) username[8] = '\0'; /* max 8 char filename */ strcat(username, ".adv"); restfd = fopen(username, "rb"); if (restfd == NULL) { printf("Sorry, I can't open the file...%s\n", \ username); exit(); } for (sptr = &turns; sptr < &lastglobal; sptr++) { if ((c = fgetc(restfd)) == -1) { printf("Read error on save file...%s\n", \ username); exit(); } *sptr = c; } if (fclose(restfd) == -1) { printf("Warning -- can't close save file...%s\n", \ username); } }