Allow direct object to persist across turns.
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index e10239833a1f72c6156294ef3d5faf21364d09fd..7c3d78ecf8ae96dd072d7914afe461da7005b9c7 100644 (file)
--- a/main.c
+++ b/main.c
@@ -39,7 +39,9 @@ long AMBER, AXE, BACK, BATTER, BEAR, BIRD, BLOOD,
                RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
                STEPS, STREAM, THROW, TRIDNT, TROLL, TROLL2,
                URN, VASE, VEND, VOLCAN, WATER;
-long K, WD1, WD1X, WD2, WD2X;
+long WD1, WD1X, WD2, WD2X;
+
+static int K;  /* information leak, should go away */
 
 FILE  *logfp;
 bool oldstyle = false;
@@ -418,11 +420,11 @@ static bool dwarfmove(void)
        return true;
     if (game.dflag == 2)game.dflag=3;
     SETPRM(1,attack,0);
-    K=6;
-    if (attack > 1)K=250;
-    RSPEAK(K);
+    int k=6;
+    if (attack > 1)k=250;
+    RSPEAK(k);
     SETPRM(1,stick,0);
-    RSPEAK(K+1+2/(1+stick));
+    RSPEAK(k+1+2/(1+stick));
     if (stick == 0)
        return true;
     game.oldlc2=game.loc;
@@ -490,32 +492,32 @@ static void croak(FILE *cmdin)
  *  him, so we need game.oldlc2, which is the last place he was
  *  safe.) */
 
-static bool playermove(FILE *cmdin, token_t verb)
+static bool playermove(FILE *cmdin, token_t verb, int motion)
 {
     int LL, K2, KK=KEY[game.loc];
     game.newloc=game.loc;
     if (KK == 0)
        BUG(26);
-    if (K == NUL)
+    if (motion == NUL)
        return true;
-    else if (K == BACK) {
+    else if (motion == BACK) {
        /*  Handle "go back".  Look for verb which goes from game.loc to
         *  game.oldloc, or to game.oldlc2 If game.oldloc has forced-motion.
         *  K2 saves entry -> forced loc -> previous loc. */
-       K=game.oldloc;
-       if (FORCED(K))
-           K=game.oldlc2;
+       motion=game.oldloc;
+       if (FORCED(motion))
+           motion=game.oldlc2;
        game.oldlc2=game.oldloc;
        game.oldloc=game.loc;
        K2=0;
-       if (K == game.loc)K2=91;
+       if (motion == game.loc)K2=91;
        if (CNDBIT(game.loc,4))K2=274;
        if (K2 == 0) {
            for (;;) {
                LL=MOD((labs(TRAVEL[KK])/1000),1000);
-               if (LL != K) {
+               if (LL != motion) {
                    if (LL <= 300) {
-                       if (FORCED(LL) && MOD((labs(TRAVEL[KEY[LL]])/1000),1000) == K)
+                       if (FORCED(LL) && MOD((labs(TRAVEL[KEY[LL]])/1000),1000) == motion)
                            K2=KK;
                    }
                    if (TRAVEL[KK] >= 0) {
@@ -529,7 +531,7 @@ static bool playermove(FILE *cmdin, token_t verb)
                    }
                }
 
-               K=MOD(labs(TRAVEL[KK]),1000);
+               motion=MOD(labs(TRAVEL[KK]),1000);
                KK=KEY[game.loc];
                break; /* fall through to ordinary travel */
            }
@@ -538,7 +540,7 @@ static bool playermove(FILE *cmdin, token_t verb)
            return true;
        }
     }
-    else if (K == LOOK) {
+    else if (motion == LOOK) {
        /*  Look.  Can't give more detail.  Pretend it wasn't dark
         *  (though it may "now" be dark) so he won't fall into a
         *  pit while staring into the gloom. */
@@ -548,7 +550,7 @@ static bool playermove(FILE *cmdin, token_t verb)
        game.abbrev[game.loc]=0;
        return true;
     }
-    else if (K == CAVE) {
+    else if (motion == CAVE) {
        /*  Cave.  Different messages depending on whether above ground. */
        RSPEAK((OUTSID(game.loc) && game.loc != 8) ? 57 : 58);
        return true;
@@ -562,19 +564,19 @@ static bool playermove(FILE *cmdin, token_t verb)
     /* ordinary travel */
     for (;;) {
        LL=labs(TRAVEL[KK]);
-       if (MOD(LL,1000) == 1 || MOD(LL,1000) == K)
+       if (MOD(LL,1000) == 1 || MOD(LL,1000) == motion)
            break;
        if (TRAVEL[KK] < 0) {
            /*  Non-applicable motion.  Various messages depending on
             *  word given. */
            int spk=12;
-           if (K >= 43 && K <= 50)spk=52;
-           if (K == 29 || K == 30)spk=52;
-           if (K == 7 || K == 36 || K == 37)spk=10;
-           if (K == 11 || K == 19)spk=11;
+           if (motion >= 43 && motion <= 50)spk=52;
+           if (motion == 29 || motion == 30)spk=52;
+           if (motion == 7 || motion == 36 || motion == 37)spk=10;
+           if (motion == 11 || motion == 19)spk=11;
            if (verb == FIND || verb == INVENT)spk=59;
-           if (K == 62 || K == 65)spk=42;
-           if (K == 17)spk=80;
+           if (motion == 62 || motion == 65)spk=42;
+           if (motion == 17)spk=80;
            RSPEAK(spk);
            return true;
        }
@@ -584,17 +586,17 @@ static bool playermove(FILE *cmdin, token_t verb)
 
     for (;;) {
        game.newloc=LL/1000;
-       K=MOD(game.newloc,100);
+       motion=MOD(game.newloc,100);
        if (game.newloc <= 300) {
            if (game.newloc <= 100) {
                if (game.newloc == 0 || PCT(game.newloc))
                    break;
                /* else fall through */
-           } if (TOTING(K) || (game.newloc > 200 && AT(K)))
+           } if (TOTING(motion) || (game.newloc > 200 && AT(motion)))
                  break;
            /* else fall through */
        }
-       else if (game.prop[K] != game.newloc/100-3)
+       else if (game.prop[motion] != game.newloc/100-3)
            break;
     L12:
        do {
@@ -674,8 +676,9 @@ static bool playermove(FILE *cmdin, token_t verb)
 static bool do_command(FILE *cmdin)
 {
        long KQ, VERB, KK, V1, V2;
-       long obj, i;
-       static long IGO = 0;
+       long i;
+       static long igo = 0;
+       static long obj = 0;
        enum speechpart part;
 
        /*  Can't leave cave once it's closing (except by main office). */
@@ -994,7 +997,7 @@ L2620:      if (WD1 == MAKEWD(23051920)) {
                RSPEAK(17);
        }
        if (WD1 == MAKEWD( 715) && WD2 != 0) {
-           if (++IGO == 10)
+           if (++igo == 10)
                RSPEAK(276);
        }
 L2630:
@@ -1025,36 +1028,36 @@ L4090:  part=transitive; goto Laction;
 L5000: part=unknown; obj = K;
 Laction:
         switch (action(cmdin, part, VERB, obj)) {
-          case 2: return true;
-          case 8: goto L8;
-          case 2000: goto L2000;
-          case 2012: goto L2012;
-          case 2600: goto L2600;
-          case 2607: goto L2607;
-          case 2630: goto L2630;
-          case 2800:
-             /* Get second word for analysis. */
-              WD1=WD2;
-              WD1X=WD2X;
-              WD2=0;
-              goto L2620;
-          case 8000:
-              /*  Random intransitive verbs come here.  Clear obj just in case
-               *  (see attack()). */
-              SETPRM(1,WD1,WD1X);
-              RSPEAK(257);
-              obj=0;
-              goto L2600;
-          case 19000:
-              /*  Oh dear, he's disturbed the dwarves. */
-              RSPEAK(136);
-              score(0);
-              return true;
-          }
+        case 2: return true;
+        case 8: K=NUL; goto L8;
+        case 2000: goto L2000;
+        case 2012: goto L2012;
+        case 2600: goto L2600;
+        case 2607: goto L2607;
+        case 2630: goto L2630;
+        case 2800:
+            /* Get second word for analysis. */
+            WD1=WD2;
+            WD1X=WD2X;
+            WD2=0;
+            goto L2620;
+        case 8000:
+            /*  Random intransitive verbs come here.  Clear obj just in case
+             *  (see attack()). */
+            SETPRM(1,WD1,WD1X);
+            RSPEAK(257);
+            obj=0;
+            goto L2600;
+        case 19000:
+            /*  Oh dear, he's disturbed the dwarves. */
+            RSPEAK(136);
+            score(0);
+            return true;
+            }
        BUG(99);
 
        /*  Figure out the new location */
-L8:    if (playermove(cmdin, VERB))
+L8:    if (playermove(cmdin, VERB, K))
            return true;
        else
            goto L2000;