X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=main.c;h=526eda171513899093f5a381e7a218d621d4fc86;hb=d844c2a3913e1c7d331b080a4a09631e515d9364;hp=fbd7de04dd5cd7d69fce6cd65d1578759c5984f5;hpb=d4fc7a88b4aac2f72013e7c681c907de09db349d;p=open-adventure.git diff --git a/main.c b/main.c index fbd7de0..526eda1 100644 --- a/main.c +++ b/main.c @@ -43,19 +43,17 @@ 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 int action(FILE *, long, long, long); - -void sig_handler(int signo) +static void sig_handler(int signo) { - if (signo == SIGINT) + if (signo == SIGINT){ if (logfp != NULL) fflush(logfp); + } exit(0); } @@ -79,7 +77,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"); @@ -93,6 +91,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; @@ -125,11 +131,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); @@ -243,7 +253,7 @@ 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); @@ -255,36 +265,36 @@ static void checkhints(FILE *cmdin) } } -bool spotted_by_pirate(int i) +static bool spotted_by_pirate(int i) { if (i != PIRATE) return false; /* 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) return true; int snarfed=0; bool movechest = false, robplayer = false; - for (int j=MINTRS; j<=MAXTRS; j++) { + for (int treasure=MINTRS; treasure<=MAXTRS; treasure++) { /* Pirate won't take pyramid from plover room or dark * room (too easy!). */ - if (j==PYRAM && (game.loc==PLAC[PYRAM] || game.loc==PLAC[EMRALD])) { + if (treasure==PYRAM && (game.loc==PLAC[PYRAM] || game.loc==PLAC[EMRALD])) { continue; } - if (TOTING(j) || HERE(j)) + if (TOTING(treasure) || HERE(treasure)) ++snarfed; - if (TOTING(j)) { + if (TOTING(treasure)) { movechest = true; robplayer = true; } } /* 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; } @@ -304,12 +314,12 @@ bool spotted_by_pirate(int i) } if (robplayer) { RSPEAK(PIRATE_POUNCES); - for (int j=MINTRS; j<=MAXTRS; j++) { - if (!(j == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))) { - if (AT(j) && game.fixed[j] == 0) - CARRY(j,game.loc); - if (TOTING(j)) - DROP(j,game.chloc); + for (int treasure=MINTRS; treasure<=MAXTRS; treasure++) { + if (!(treasure == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))) { + if (AT(treasure) && game.fixed[treasure] == 0) + CARRY(treasure,game.loc); + if (TOTING(treasure)) + DROP(treasure,game.chloc); } } } @@ -475,14 +485,13 @@ static void croak(FILE *cmdin) * death and exit. */ RSPEAK(DEATH_CLOSING); score(endgame); - } else { - /* FIXME: Arithmetic on message numbers */ - if (!YES(cmdin,WATCH_IT+game.numdie*2,WHICH_WAY+game.numdie*2,OK_MAN)) - score(endgame); - if (game.numdie == MAXDIE) + + } + /* 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); - game.place[WATER]=0; - game.place[OIL]=0; + else { + game.place[WATER] = game.place[OIL] = NOWHERE; if (TOTING(LAMP)) game.prop[LAMP]=0; for (int j=1; j<=NOBJECTS; j++) { @@ -754,7 +763,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; @@ -807,7 +816,7 @@ static bool closecheck(void) for (int i=1; i<=NOBJECTS; i++) { if (TOTING(i)) - DSTROY(i); + DESTROY(i); } RSPEAK(CAVE_CLOSED); @@ -848,7 +857,7 @@ static void lampcheck(void) 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); } @@ -904,8 +913,8 @@ static void listobjects(void) static bool do_command(FILE *cmdin) /* Get and execute a command */ { - long kq, verb, V1, V2; - long i, k, kmod; + long verb=0, V1, V2; + long kmod, defn; static long igo = 0; static long obj = 0; enum speechpart part; @@ -923,7 +932,7 @@ static bool do_command(FILE *cmdin) * coming from place forbidden to pirate (dwarves rooted in * place) let him get out (and attacked). */ if (game.newloc != game.loc && !FORCED(game.loc) && !CNDBIT(game.loc,NOARRR)) { - for (i=1; i<=NDWARVES-1; i++) { + for (size_t i=1; i<=NDWARVES-1; i++) { if (game.odloc[i] == game.newloc && game.dseen[i]) { game.newloc=game.loc; RSPEAK(DWARF_BLOCK); @@ -941,7 +950,7 @@ static bool do_command(FILE *cmdin) for (;;) { if (game.loc == 0) croak(cmdin); - char* msg = locations[game.loc].description.small; + const char* msg = locations[game.loc].description.small; if (MOD(game.abbrev[game.loc],game.abbnum) == 0 || msg == 0) msg=locations[game.loc].description.big; if (!FORCED(game.loc) && DARK(game.loc)) { @@ -983,7 +992,7 @@ static bool do_command(FILE *cmdin) if (game.closed) { if (game.prop[OYSTER] < 0 && TOTING(OYSTER)) PSPEAK(OYSTER,1); - for (i=1; i<=NOBJECTS; i++) { + for (size_t i=1; i<=NOBJECTS; i++) { if (TOTING(i) && game.prop[i] < 0) game.prop[i] = -1-game.prop[i]; } @@ -1022,12 +1031,14 @@ static bool do_command(FILE *cmdin) } else lampcheck(); - k=WHERE_QUERY; - if (LIQLOC(game.loc) == WATER)k=FEET_WET; V1=VOCAB(WD1,-1); V2=VOCAB(WD2,-1); if (V1 == ENTER && (V2 == STREAM || V2 == 1000+WATER)) { - RSPEAK(k); + if(LIQLOC(game.loc) == WATER){ + RSPEAK(FEET_WET); + } else { + RSPEAK(WHERE_QUERY); + } goto L2012; } if (V1 == ENTER && WD2 > 0) { @@ -1053,9 +1064,9 @@ static bool do_command(FILE *cmdin) if (++igo == 10) RSPEAK(GO_UNNEEDED); } - L2630: - i=VOCAB(WD1,-1); - if (i == -1) { + Lookup: + defn = VOCAB(WD1,-1); + if (defn == -1) { /* Gee, I don't understand. */ if (fallback_handler(rawbuf)) continue; @@ -1063,9 +1074,8 @@ static bool do_command(FILE *cmdin) RSPEAK(DONT_KNOW); goto L2600; } - kmod=MOD(i,1000); - kq=i/1000+1; - switch (kq-1) + kmod=MOD(defn,1000); + switch (defn/1000) { case 0: if (playermove(cmdin, verb, kmod)) @@ -1089,7 +1099,7 @@ static bool do_command(FILE *cmdin) case GO_CLEAROBJ: goto L2012; case GO_CHECKHINT: goto L2600; case GO_CHECKFOO: goto L2607; - case GO_LOOKUP: goto L2630; + case GO_LOOKUP: goto Lookup; case GO_WORD2: /* Get second word for analysis. */ WD1=WD2;