Comment polishing.
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index 16d8f915f5660e9b8415168f9a32a82b499763ba..e16362a0c1b2c767259288744ae4cfe4409d3979 100644 (file)
--- 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,20 +107,23 @@ 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");
+                    "        -l create 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");
+                    "        -r restore from specified saved game file\n");
+#endif
             fprintf(stderr,
-                    "        -s indicates playing with command editing suppressed\n");
+                    "        -s suppress command editing\n");
             exit(-1);
             break;
         }
@@ -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);
     }
@@ -182,11 +184,9 @@ static bool fallback_handler(char *buf)
     return false;
 }
 
-/*  Check if this loc is eligible for any hints.  If been here
- *  long enough, branch to help section (on later page).  Hints
- *  all come back here eventually to finish the loop.  Ignore
- *  "HINTS" < 4 (special stuff, see database notes).
- */
+/*  Check if this loc is eligible for any hints.  If been here long
+ *  enough, display.  Ignore "HINTS" < 4 (special stuff, see database
+ *  notes). */
 static void checkhints(void)
 {
     if (COND[game.loc] >= game.conds) {
@@ -284,7 +284,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 +305,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;
     }
@@ -455,12 +455,15 @@ static bool dwarfmove(void)
     if (attack == 0)
         return true;
     if (game.dflag == 2)game.dflag = 3;
-    SETPRM(1, attack, 0);
-    int k = 6;
-    if (attack > 1)k = THROWN_KNIVES;
-    RSPEAK(k);
-    SETPRM(1, stick, 0);
-    RSPEAK(k + 1 + 2 / (1 + stick));   /* FIXME: Arithmetic on message number */
+    if (attack > 1){
+       SETPRM(1, attack, 0);
+       RSPEAK(THROWN_KNIVES);
+       SETPRM(1, stick, 0);
+       RSPEAK(stick > 1 ? MULTIPLE_HITS : (stick == 1 ? ONE_HIT : NONE_HIT));
+    } else {
+       RSPEAK(KNIFE_THROWN);
+       RSPEAK(MISSES_YOU);
+    }
     if (stick == 0)
         return true;
     game.oldlc2 = game.loc;
@@ -498,11 +501,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 +621,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 +646,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 +654,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 +680,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 +713,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);
@@ -845,18 +848,17 @@ static void lampcheck(void)
         --game.limit;
 
     /*  Another way we can force an end to things is by having the
-     *  lamp give out.  When it gets close, we come here to warn
-     *  him.  First following ar, if the lamp and fresh batteries are
+     *  lamp give out.  When it gets close, we come here to warn him.
+     *  First following arm checks if the lamp and fresh batteries are
      *  here, in which case we replace the batteries and continue.
-     *  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. */
+     *  Second is for other cases of lamp dying.  Eve after it goes
+     *  out, he can explore outside for a while if desired. */
     if (game.limit <= WARNTIME && HERE(BATTERY) && game.prop[BATTERY] == 0 && HERE(LAMP)) {
         RSPEAK(REPLACE_BATTERIES);
         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