Fix another ob1 error.
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index c1272c4281ae0b14b8edb10851ca209535d62baf..15e723086487d0cebcf23de6c84653ef274c45d1 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;
@@ -115,15 +115,15 @@ int main(int argc, char *argv[])
             fprintf(stderr,
                     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;
         }
@@ -184,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) {
@@ -457,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;
@@ -847,12 +848,11 @@ 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;
@@ -925,11 +925,11 @@ static void listobjects(void)
 static bool do_command(FILE *cmdin)
 /* Get and execute a command */
 {
-    long verb = 0, V1, V2;
+    long V1, V2;
     long kmod, defn;
     static long igo = 0;
-    static long obj = 0;
-    enum speechpart part;
+    static struct command_t command;
+    command.verb = 0;
 
     /*  Can't leave cave once it's closing (except by main office). */
     if (OUTSID(game.newloc) && game.newloc != 0 && game.closng) {
@@ -979,7 +979,7 @@ static bool do_command(FILE *cmdin)
         if (TOTING(BEAR))RSPEAK(TAME_BEAR);
         speak(msg);
         if (FORCED(game.loc)) {
-            if (playermove(verb, 1))
+            if (playermove(command.verb, 1))
                 return true;
             else
                 continue;      /* back to top of main interpreter loop */
@@ -990,9 +990,9 @@ static bool do_command(FILE *cmdin)
         listobjects();
 
 L2012:
-        verb = 0;
-        game.oldobj = obj;
-        obj = 0;
+        command.verb = 0;
+        game.oldobj = command.obj;
+        command.obj = 0;
 
 L2600:
         checkhints();
@@ -1024,18 +1024,22 @@ L2600:
 L2607:
         game.foobar = (game.foobar > 0 ? -game.foobar : 0);
         ++game.turns;
-        if (game.turns == game.thresh) {
-            speak(turn_threshold_messages[game.trndex]);
-            game.trnluz = game.trnluz + TRNVAL[game.trndex] / 100000;
-            ++game.trndex;
-            game.thresh = -1;
-            if (game.trndex <= TRNVLS)
-                game.thresh = MOD(TRNVAL[game.trndex], 100000) + 1;
-        }
-        if (verb == SAY && WD2 > 0)
-            verb = 0;
-        if (verb == SAY) {
-            part = transitive;
+
+       /* If a turn threshold has been met, apply penalties and tell
+        * the player about it. */
+       for (int i = 0; i < turn_threshold_count; ++i)
+         {
+           if (game.turns == turn_thresholds[i].threshold + 1)
+             {
+               game.trnluz += turn_thresholds[i].point_loss;
+               speak(turn_thresholds[i].message);
+             }
+         }
+
+        if (command.verb == SAY && WD2 > 0)
+            command.verb = 0;
+        if (command.verb == SAY) {
+            command.part = transitive;
             goto Laction;
         }
         if (closecheck()) {
@@ -1057,23 +1061,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);
         }
@@ -1090,17 +1095,17 @@ Lookup:
         kmod = MOD(defn, 1000);
         switch (defn / 1000) {
         case 0:
-            if (playermove(verb, kmod))
+            if (playermove(command.verb, kmod))
                 return true;
             else
                 continue;      /* back to top of main interpreter loop */
         case 1:
-            part = unknown;
-            obj = kmod;
+            command.part = unknown;
+            command.obj = kmod;
             break;
         case 2:
-            part = intransitive;
-            verb = kmod;
+            command.part = intransitive;
+            command.verb = kmod;
             break;
         case 3:
             RSPEAK(kmod);
@@ -1110,11 +1115,11 @@ Lookup:
         }
 
 Laction:
-        switch (action(cmdin, part, verb, obj)) {
+        switch (action(cmdin, command)) {
         case GO_TERMINATE:
             return true;
         case GO_MOVE:
-            playermove(verb, NUL);
+            playermove(command.verb, NUL);
             return true;
         case GO_TOP:
             continue;  /* back to top of main interpreter loop */
@@ -1130,14 +1135,14 @@ 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
              *  (see attack()). */
             SETPRM(1, WD1, WD1X);
             RSPEAK(DO_WHAT);
-            obj = 0;
+            command.obj = 0;
             goto L2600;
         case GO_DWARFWAKE:
             /*  Oh dear, he's disturbed the dwarves. */