X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=main.c;h=1db050f91583e7f42bfcbb2ff9ce440c1aefc0a7;hb=7753ad3134be3184981b1889c1c38069f2bce6e0;hp=16d8f915f5660e9b8415168f9a32a82b499763ba;hpb=98b02eeeb1021b24ad477a2180e323984c36c588;p=open-adventure.git diff --git a/main.c b/main.c index 16d8f91..1db050f 100644 --- a/main.c +++ b/main.c @@ -41,7 +41,7 @@ long AMBER, AXE, BACK, BATTERY, BEAR, BIRD, BLOOD, RUBY, RUG, SAPPH, SAY, SIGN, SNAKE, STEPS, STREAM, THROW, TRIDENT, TROLL, TROLL2, URN, VASE, VEND, VOLCANO, WATER; -long WD1, WD1X, WD2, WD2X; +token_t WD1, WD1X, WD2, WD2X; FILE *logfp = NULL, *rfp = NULL; bool oldstyle = false; @@ -77,7 +77,14 @@ int main(int argc, char *argv[]) /* Options. */ - while ((ch = getopt(argc, argv, "l:or:s")) != EOF) { +#ifndef ADVENT_NOSAVE + const char* opts = "l:or:s"; + const char* usage = "Usage: %s [-l logfilename] [-o] [-r restorefilename] [-s] \n"; +#else + const char* opts = "l:os"; + const char* usage = "Usage: %s [-l logfilename] [-o] [-s] \n"; +#endif + while ((ch = getopt(argc, argv, opts)) != EOF) { switch (ch) { case 'l': logfp = fopen(optarg, "w"); @@ -91,6 +98,7 @@ int main(int argc, char *argv[]) oldstyle = true; editline = prompt = false; break; +#ifndef ADVENT_NOSAVE case 'r': rfp = fopen(optarg, "r"); if (rfp == NULL) @@ -99,18 +107,21 @@ int main(int argc, char *argv[]) optarg); signal(SIGINT, sig_handler); break; +#endif case 's': editline = false; break; default: fprintf(stderr, - "Usage: %s [-l logfilename] [-o] [-r restorefilename] [-s] \n", argv[0]); + usage, argv[0]); fprintf(stderr, " where -l creates a log file of your game named as specified'\n"); fprintf(stderr, " -o 'oldstyle' (no prompt, no command editing, displays 'Initialising...')\n"); +#ifndef ADVENT_NOSAVE fprintf(stderr, " -r indicates restoring from specified saved game file\n"); +#endif fprintf(stderr, " -s indicates playing with command editing suppressed\n"); exit(-1); @@ -120,16 +131,6 @@ int main(int argc, char *argv[]) linenoiseHistorySetMaxLen(350); - /* Logical variables: - * - * game.closed says whether we're all the way closed - * game.closng says whether it's closing time yet - * game.clshnt says whether he's read the clue in the endgame - * game.lmwarn says whether he's been warned about lamp going dim - * game.novice says whether he asked for instructions at start-up - * game.panic says whether he's found out he's trapped in the cave - * game.wzdark says whether the loc he's leaving was dark */ - /* Initialize our LCG PRNG with parameters tested against * Knuth vol. 2. by the original authors */ game.lcg_a = 1093; @@ -146,10 +147,11 @@ int main(int argc, char *argv[]) game.zzword = RNDVOC(3, 0); game.newloc = LOC_START; game.loc = LOC_START; - game.limit = 330; + game.limit = GAMELIMIT; if (!rfp) { game.novice = YES(arbitrary_messages[WELCOME_YOU], arbitrary_messages[CAVE_NEARBY], arbitrary_messages[NO_MESSAGE]); - if (game.novice)game.limit = 1000; + if (game.novice) + game.limit = NOVICELIMIT; } else { restore(rfp); } @@ -284,7 +286,7 @@ static 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] = NOWHERE might mean that he's thrown + * that game.place[CHEST] = LOC_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) @@ -305,7 +307,7 @@ static bool spotted_by_pirate(int i) } } /* Force chest placement before player finds last treasure */ - if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == NOWHERE && HERE(LAMP) && game.prop[LAMP] == 1) { + if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == LOC_NOWHERE && HERE(LAMP) && game.prop[LAMP] == 1) { RSPEAK(PIRATE_SPOTTED); movechest = true; } @@ -498,11 +500,10 @@ static void croak(void) * death and exit. */ RSPEAK(DEATH_CLOSING); terminate(endgame); - } - else if (game.numdie == maximum_deaths || !YES(query, yes_response, arbitrary_messages[OK_MAN])) + } else if (game.numdie == maximum_deaths || !YES(query, yes_response, arbitrary_messages[OK_MAN])) terminate(endgame); else { - game.place[WATER] = game.place[OIL] = NOWHERE; + game.place[WATER] = game.place[OIL] = LOC_NOWHERE; if (TOTING(LAMP)) game.prop[LAMP] = 0; for (int j = 1; j <= NOBJECTS; j++) { @@ -619,7 +620,7 @@ static bool playermove(token_t verb, int motion) do { /* * (ESR) This special-travel loop may have to be repeated if it includes - * the plover passage. Same deal for any future cases wgerw we beed to + * the plover passage. Same deal for any future cases where we need to * block travel and then redo it once the blocking condition has been * removed. */ @@ -644,7 +645,7 @@ static bool playermove(token_t verb, int motion) ++kk; game.newloc = labs(TRAVEL[kk]) / 1000; } while - (game.newloc == scratchloc); + (game.newloc == scratchloc); scratchloc = game.newloc; } @@ -652,7 +653,7 @@ static bool playermove(token_t verb, int motion) if (!SPECIAL(game.newloc)) return true; if (game.newloc <= 500) { - game.newloc = game.newloc - SPECIALBASE; + game.newloc -= SPECIALBASE; switch (game.newloc) { case 1: /* Travel 301. Plover-alcove passage. Can carry only @@ -678,7 +679,7 @@ static bool playermove(token_t verb, int motion) ++kk; game.newloc = labs(TRAVEL[kk]) / 1000; } while - (game.newloc == scratchloc); + (game.newloc == scratchloc); scratchloc = game.newloc; continue; /* goto L12 */ case 3: @@ -711,6 +712,7 @@ static bool playermove(token_t verb, int motion) game.prop[BEAR] = 3; game.oldlc2 = game.newloc; croak(); + return true; } } BUG(SPECIAL_TRAVEL_500_GT_L_GT_300_EXCEEDS_GOTO_LIST); @@ -856,7 +858,7 @@ static void lampcheck(void) game.prop[BATTERY] = 1; if (TOTING(BATTERY)) DROP(BATTERY, game.loc); - game.limit = game.limit + 2500; + game.limit += BATTERYLIFE; game.lmwarn = false; } else if (game.limit == 0) { game.limit = -1; @@ -867,7 +869,7 @@ static void lampcheck(void) if (!game.lmwarn && HERE(LAMP)) { game.lmwarn = true; int spk = GET_BATTERIES; - if (game.place[BATTERY] == NOWHERE)spk = LAMP_DIM; + if (game.place[BATTERY] == LOC_NOWHERE)spk = LAMP_DIM; if (game.prop[BATTERY] == 1)spk = MISSING_BATTERYIES; RSPEAK(spk); } @@ -982,7 +984,8 @@ static bool do_command(FILE *cmdin) else continue; /* back to top of main interpreter loop */ } - if (game.loc == 33 && PCT(25) && !game.closng)RSPEAK(SAYS_PLUGH); + if (game.loc == LOC_Y2 && PCT(25) && !game.closng) + RSPEAK(SAYS_PLUGH); listobjects(); @@ -1054,23 +1057,24 @@ L2607: if (V1 == ENTER && WD2 > 0) { WD1 = WD2; WD1X = WD2X; - WD2 = 0; + wordclear(&WD2); } else { + /* FIXME: Magic numbers */ if (!((V1 != 1000 + WATER && V1 != 1000 + OIL) || (V2 != 1000 + PLANT && V2 != 1000 + DOOR))) { if (AT(V2 - 1000)) - WD2 = MAKEWD(16152118); + WD2 = MAKEWD(WORD_POUR); } if (V1 == 1000 + CAGE && V2 == 1000 + BIRD && HERE(CAGE) && HERE(BIRD)) - WD1 = MAKEWD(301200308); + WD1 = MAKEWD(WORD_CATCH); } L2620: - if (WD1 == MAKEWD(23051920)) { + if (wordeq(WD1, MAKEWD(WORD_WEST))) { ++game.iwest; if (game.iwest == 10) RSPEAK(W_IS_WEST); } - if (WD1 == MAKEWD( 715) && WD2 != 0) { + if (wordeq(WD1, MAKEWD(WORD_GO)) && !wordempty(WD2)) { if (++igo == 10) RSPEAK(GO_UNNEEDED); } @@ -1127,7 +1131,7 @@ Laction: /* Get second word for analysis. */ WD1 = WD2; WD1X = WD2X; - WD2 = 0; + wordclear(&WD2); goto L2620; case GO_UNKNOWN: /* Random intransitive verbs come here. Clear obj just in case