X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=main.c;h=a6fea59070fffdc6d5e3cc6ec759862f3b61ae46;hb=300d2461799808a5acb8f6f4a866325c0e50d996;hp=1c1b299017a91b740e9b8def7cef69d04eb1ac09;hpb=49edca485d31556f1aeec231ce78c4d5df3b565e;p=open-adventure.git diff --git a/main.c b/main.c index 1c1b299..a6fea59 100644 --- a/main.c +++ b/main.c @@ -43,20 +43,20 @@ long AMBER, AXE, BACK, BATTER, BEAR, BIRD, BLOOD, URN, VASE, VEND, VOLCAN, WATER; long WD1, WD1X, WD2, WD2X; -FILE *logfp; +FILE *logfp = NULL, *rfp = NULL; bool oldstyle = false; bool editline = true; bool prompt = true; extern void initialise(); -extern void score(long); extern int action(FILE *, long, long, long); void sig_handler(int signo) { - if (signo == SIGINT) + if (signo == SIGINT){ if (logfp != NULL) fflush(logfp); + } exit(0); } @@ -80,7 +80,7 @@ int main(int argc, char *argv[]) /* Options. */ - while ((ch = getopt(argc, argv, "l:os")) != EOF) { + while ((ch = getopt(argc, argv, "l:or:s")) != EOF) { switch (ch) { case 'l': logfp = fopen(optarg, "w"); @@ -94,6 +94,14 @@ int main(int argc, char *argv[]) oldstyle = true; editline = prompt = false; break; + case 'r': + rfp = fopen(optarg, "r"); + if (rfp == NULL) + fprintf(stderr, + "advent: can't open save file %s for read\n", + optarg); + signal(SIGINT, sig_handler); + break; case 's': editline = false; break; @@ -126,11 +134,15 @@ int main(int argc, char *argv[]) /* Start-up, dwarf stuff */ game.zzword=RNDVOC(3,0); - game.novice=YES(stdin, WELCOME_YOU,CAVE_NEARBY,ARB_0); game.newloc = LOC_START; game.loc = LOC_START; game.limit=330; - if (game.novice)game.limit=1000; + if (!rfp){ + game.novice=YES(stdin, WELCOME_YOU,CAVE_NEARBY,NO_MESSAGE); + if (game.novice)game.limit=1000; + } else { + restore(rfp); + } if (logfp) fprintf(logfp, "seed %ld\n", seedval); @@ -141,7 +153,7 @@ int main(int argc, char *argv[]) break; } /* show score and exit */ - score(1); + score(quitgame); } static bool fallback_handler(char *buf) @@ -244,13 +256,13 @@ static void checkhints(FILE *cmdin) /* Fall through to hint display */ game.hintlc[hint]=0; - if (!YES(cmdin,HINTS[hint][3],ARB_0,OK_MAN)) + if (!YES(cmdin,HINTS[hint][3],NO_MESSAGE,OK_MAN)) return; SETPRM(1,HINTS[hint][2],HINTS[hint][2]); RSPEAK(HINT_COST); game.hinted[hint]=YES(cmdin,WANT_HINT,HINTS[hint][4],OK_MAN); - if (game.hinted[hint] && game.limit > 30) - game.limit=game.limit+30*HINTS[hint][2]; + if (game.hinted[hint] && game.limit > WARNTIME) + game.limit += WARNTIME*HINTS[hint][2]; } } } @@ -263,8 +275,8 @@ bool spotted_by_pirate(int i) /* The pirate's spotted him. He leaves him alone once we've * found chest. K counts if a treasure is here. If not, and - * tally=1 for an unseen chest, let the pirate be spotted. - * Note that game.place[CHEST]=0 might mean that he's thrown + * tally=1 for an unseen chest, let the pirate be spotted. Note + * that game.place[CHEST] = NOWHERE might mean that he's thrown * it to the troll, but in that case he's seen the chest * (game.prop=0). */ if (game.loc == game.chloc || game.prop[CHEST] >= 0) @@ -285,7 +297,7 @@ bool spotted_by_pirate(int i) } } /* Force chest placement before player finds last treasure */ - if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP] == 1) { + if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == NOWHERE && HERE(LAMP) && game.prop[LAMP] == 1) { RSPEAK(PIRATE_SPOTTED); movechest = true; } @@ -475,15 +487,14 @@ static void croak(FILE *cmdin) /* He died during closing time. No resurrection. Tally up a * death and exit. */ RSPEAK(DEATH_CLOSING); - score(0); - } else { - /* FIXME: Arithmetic on message numbers */ - if (!YES(cmdin,WATCH_IT+game.numdie*2,WHICH_WAY+game.numdie*2,OK_MAN)) - score(0); - if (game.numdie == MAXDIE) - score(0); - game.place[WATER]=0; - game.place[OIL]=0; + score(endgame); + + } + /* FIXME: Arithmetic on message numbers */ + else if (game.numdie == MAXDIE || !YES(cmdin,WATCH_IT+game.numdie*2,WHICH_WAY+game.numdie*2,OK_MAN)) + score(endgame); + else { + game.place[WATER] = game.place[OIL] = NOWHERE; if (TOTING(LAMP)) game.prop[LAMP]=0; for (int j=1; j<=NOBJECTS; j++) { @@ -755,7 +766,7 @@ static bool closecheck(void) MOVE(TROLL2,PLAC[TROLL]); MOVE(TROLL2+NOBJECTS,FIXD[TROLL]); JUGGLE(CHASM); - if (game.prop[BEAR] != 3)DSTROY(BEAR); + if (game.prop[BEAR] != 3)DESTROY(BEAR); game.prop[CHAIN]=0; game.fixed[CHAIN]=0; game.prop[AXE]=0; @@ -808,7 +819,7 @@ static bool closecheck(void) for (int i=1; i<=NOBJECTS; i++) { if (TOTING(i)) - DSTROY(i); + DESTROY(i); } RSPEAK(CAVE_CLOSED); @@ -832,7 +843,7 @@ static void lampcheck(void) * Second is for other cases of lamp dying. 12400 is when it * goes out. Even then, he can explore outside for a while * if desired. */ - if (game.limit<=30 && HERE(BATTER) && game.prop[BATTER]==0 && HERE(LAMP)) + if (game.limit <= WARNTIME && HERE(BATTER) && game.prop[BATTER]==0 && HERE(LAMP)) { RSPEAK(REPLACE_BATTERIES); game.prop[BATTER]=1; @@ -845,11 +856,11 @@ static void lampcheck(void) game.prop[LAMP]=0; if (HERE(LAMP)) RSPEAK(LAMP_OUT); - } else if (game.limit <= 30) { + } else if (game.limit <= WARNTIME) { if (!game.lmwarn && HERE(LAMP)) { game.lmwarn=true; int spk=GET_BATTERIES; - if (game.place[BATTER] == 0)spk=LAMP_DIM; + if (game.place[BATTER] == NOWHERE)spk=LAMP_DIM; if (game.prop[BATTER] == 1)spk=MISSING_BATTERIES; RSPEAK(spk); } @@ -1059,7 +1070,7 @@ static bool do_command(FILE *cmdin) if (i == -1) { /* Gee, I don't understand. */ if (fallback_handler(rawbuf)) - return true; + continue; SETPRM(1,WD1,WD1X); RSPEAK(DONT_KNOW); goto L2600; @@ -1107,7 +1118,7 @@ static bool do_command(FILE *cmdin) case GO_DWARFWAKE: /* Oh dear, he's disturbed the dwarves. */ RSPEAK(DWARVES_AWAKEN); - score(0); + score(endgame); return true; default: BUG(99);