Eliminate a global variable.
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index 4e066cb0191309f1133cd0f6c1670e2f5afbf7e2..c780cd70962b1dab1d80ab97a5ff48197fd39341 100644 (file)
--- a/main.c
+++ b/main.c
@@ -21,14 +21,14 @@ long AMBER, AXE, BACK, BATTER, BEAR, BIRD, BLOOD,
                BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
                CLAM, COINS, DOOR, DPRSSN, DRAGON, DWARF, EGGS,
                EMRALD, ENTER, ENTRNC, FIND, FISSUR, FOOD,
                BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
                CLAM, COINS, DOOR, DPRSSN, DRAGON, DWARF, EGGS,
                EMRALD, ENTER, ENTRNC, FIND, FISSUR, FOOD,
-               GRATE, HINT, I, INVENT, J, JADE, K, KEYS,
-               KNIFE, L, LAMP, LOCK, LOOK, MAGZIN,
+               GRATE, HINT, I, INVENT, JADE, K, KEYS,
+               KNIFE, LAMP, LOCK, LOOK, MAGZIN,
                MESSAG, MIRROR, NUGGET, NUL, OGRE, OIL, OYSTER,
                PEARL, PILLOW, PLANT, PLANT2, PYRAM, RESER, ROD, ROD2,
                RUBY, RUG, SAPPH, SAY, SECT, SIGN, SNAKE, SPK,
                STEPS, STREAM, THROW, TRIDNT, TROLL, TROLL2,
                URN, VASE, VEND,
                MESSAG, MIRROR, NUGGET, NUL, OGRE, OIL, OYSTER,
                PEARL, PILLOW, PLANT, PLANT2, PYRAM, RESER, ROD, ROD2,
                RUBY, RUG, SAPPH, SAY, SECT, SIGN, SNAKE, SPK,
                STEPS, STREAM, THROW, TRIDNT, TROLL, TROLL2,
                URN, VASE, VEND,
-               VOLCAN, VRSION = 25, WATER, WD1, WD1X, WD2, WD2X;
+               VOLCAN, WATER, WD1, WD1X, WD2, WD2X;
 FILE  *logfp;
 bool oldstyle = false;
 lcg_state lcgstate;
 FILE  *logfp;
 bool oldstyle = false;
 lcg_state lcgstate;
@@ -267,9 +267,9 @@ static bool dwarfmove(void)
            return true;
        game.dflag=2;
        for (I=1; I<=2; I++) {
            return true;
        game.dflag=2;
        for (I=1; I<=2; I++) {
-           J=1+randrange(NDWARVES-1);
+           int j=1+randrange(NDWARVES-1);
            if(PCT(50))
            if(PCT(50))
-               game.dloc[J]=0;
+               game.dloc[j]=0;
        }
        for (I=1; I<=NDWARVES-1; I++) {
            if(game.dloc[I] == game.loc)
        }
        for (I=1; I<=NDWARVES-1; I++) {
            if(game.dloc[I] == game.loc)
@@ -294,7 +294,7 @@ static bool dwarfmove(void)
        if(game.dloc[I] == 0)
            continue;
        /*  Fill TK array with all the places this dwarf might go. */
        if(game.dloc[I] == 0)
            continue;
        /*  Fill TK array with all the places this dwarf might go. */
-       J=1;
+       int j=1;
        kk=KEY[game.dloc[I]];
        if(kk != 0)
            do {
        kk=KEY[game.dloc[I]];
        if(kk != 0)
            do {
@@ -303,24 +303,24 @@ static bool dwarfmove(void)
                bool avoided = (game.newloc > 300 ||
                                !INDEEP(game.newloc) ||
                                game.newloc == game.odloc[I] ||
                bool avoided = (game.newloc > 300 ||
                                !INDEEP(game.newloc) ||
                                game.newloc == game.odloc[I] ||
-                               (J > 1 && game.newloc == TK[J-1]) ||
-                               J >= 20 ||
+                               (j > 1 && game.newloc == TK[j-1]) ||
+                               j >= 20 ||
                                game.newloc == game.dloc[I] ||
                                FORCED(game.newloc) ||
                                (I == PIRATE && CNDBIT(game.newloc,3)) ||
                                labs(TRAVEL[kk])/1000000 == 100);
                if (!avoided) {
                                game.newloc == game.dloc[I] ||
                                FORCED(game.newloc) ||
                                (I == PIRATE && CNDBIT(game.newloc,3)) ||
                                labs(TRAVEL[kk])/1000000 == 100);
                if (!avoided) {
-                   TK[J++] = game.newloc;
+                   TK[j++] = game.newloc;
                }
                ++kk;
            } while
                (TRAVEL[kk-1] >= 0);
                }
                ++kk;
            } while
                (TRAVEL[kk-1] >= 0);
-       TK[J]=game.odloc[I];
-       if(J >= 2)
-           --J;
-       J=1+randrange(J);
+       TK[j]=game.odloc[I];
+       if(j >= 2)
+           --j;
+       j=1+randrange(j);
        game.odloc[I]=game.dloc[I];
        game.odloc[I]=game.dloc[I];
-       game.dloc[I]=TK[J];
+       game.dloc[I]=TK[j];
        game.dseen[I]=(game.dseen[I] && INDEEP(game.loc)) || (game.dloc[I] == game.loc || game.odloc[I] == game.loc);
        if(!game.dseen[I]) continue;
        game.dloc[I]=game.loc;
        game.dseen[I]=(game.dseen[I] && INDEEP(game.loc)) || (game.dloc[I] == game.loc || game.odloc[I] == game.loc);
        if(!game.dseen[I]) continue;
        game.dloc[I]=game.loc;
@@ -334,23 +334,27 @@ static bool dwarfmove(void)
            if(game.loc == game.chloc || game.prop[CHEST] >= 0)
                continue;
            K=0;
            if(game.loc == game.chloc || game.prop[CHEST] >= 0)
                continue;
            K=0;
-           for (J=MINTRS; J<=MAXTRS; J++) {
+           for (int j=MINTRS; j<=MAXTRS; j++) {
                /*  Pirate won't take pyramid from plover room or dark
                *  room (too easy!). */
                /*  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(j == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))
                    goto L6020;
                    goto L6020;
-               if(TOTING(J)) {
+               if(TOTING(j)) {
                    goto L6021;
                }
            L6020:
                    goto L6021;
                }
            L6020:
-               if(HERE(J))
+               if(HERE(j))
                    K=1;
            }
                    K=1;
            }
+           /* Force chest placement before player finds last treasure */
            if(game.tally == 1 && K == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP] == 1) {
                RSPEAK(186);
                MOVE(CHEST,game.chloc);
                MOVE(MESSAG,game.chloc2);
            if(game.tally == 1 && K == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP] == 1) {
                RSPEAK(186);
                MOVE(CHEST,game.chloc);
                MOVE(MESSAG,game.chloc2);
-               goto L6024;
+               game.dloc[PIRATE]=game.chloc;
+               game.odloc[PIRATE]=game.chloc;
+               game.dseen[PIRATE]=false;
+               continue;
            }
            if(game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
                RSPEAK(127);
            }
            if(game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
                RSPEAK(127);
@@ -364,15 +368,14 @@ static bool dwarfmove(void)
                MOVE(MESSAG,game.chloc2);
            }
            RSPEAK(128);
                MOVE(MESSAG,game.chloc2);
            }
            RSPEAK(128);
-           for (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 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);
                }
            }
                }
            }
-       L6024:
            game.dloc[PIRATE]=game.chloc;
            game.odloc[PIRATE]=game.chloc;
            game.dseen[PIRATE]=false;
            game.dloc[PIRATE]=game.chloc;
            game.odloc[PIRATE]=game.chloc;
            game.dseen[PIRATE]=false;
@@ -412,6 +415,39 @@ static bool dwarfmove(void)
     return false;
 }
 
     return false;
 }
 
+static void croak(FILE *cmdin)
+/*  Okay, he's dead.  Let's get on with it. */
+{
+    if(game.closng) {
+       /*  He died during closing time.  No resurrection.  Tally up a
+        *  death and exit. */
+       RSPEAK(131);
+       ++game.numdie;
+       score(0);
+    } else {
+       ++game.numdie;
+       if(!YES(cmdin,79+game.numdie*2,80+game.numdie*2,54))
+           score(0);
+       if(game.numdie == MAXDIE)
+           score(0);
+       game.place[WATER]=0;
+       game.place[OIL]=0;
+       if(TOTING(LAMP))
+           game.prop[LAMP]=0;
+       for (int j=1; j<=NOBJECTS; j++) {
+           int i=NOBJECTS + 1 - j;
+           if(TOTING(i)) {
+               int k=game.oldlc2;
+               if(i == LAMP)
+                   k=1;
+               DROP(i,k);
+           }
+       }
+       game.loc=3;
+       game.oldloc=game.loc;
+    }
+}
+
 static bool do_command(FILE *cmdin) {
        long LL, KQ, VERB, KK, K2, V1, V2;
        long obj, i;
 static bool do_command(FILE *cmdin) {
        long LL, KQ, VERB, KK, K2, V1, V2;
        long obj, i;
@@ -441,13 +477,14 @@ static bool do_command(FILE *cmdin) {
        game.loc=game.newloc;
 
        if (!dwarfmove())
        game.loc=game.newloc;
 
        if (!dwarfmove())
-           goto L99;
+           croak(cmdin);
 
 /*  Describe the current location and (maybe) get next command. */
 
 /*  Print text for current loc. */
 
 
 /*  Describe the current location and (maybe) get next command. */
 
 /*  Print text for current loc. */
 
-L2000: if(game.loc == 0) goto L99;
+L2000: if(game.loc == 0)
+           croak(cmdin);
        KK=STEXT[game.loc];
        if(MOD(game.abbrev[game.loc],game.abbnum) == 0 || KK == 0)KK=LTEXT[game.loc];
        if(FORCED(game.loc) || !DARK(0)) goto L2001;
        KK=STEXT[game.loc];
        if(MOD(game.abbrev[game.loc],game.abbnum) == 0 || KK == 0)KK=LTEXT[game.loc];
        if(FORCED(game.loc) || !DARK(0)) goto L2001;
@@ -611,7 +648,7 @@ L3000:      SETPRM(1,WD1,WD1X);
 
 L4000: I=4000; VERB=K; goto Laction;
 L4090: I=4090; goto Laction;
 
 L4000: I=4000; VERB=K; goto Laction;
 L4090: I=4090; goto Laction;
-L5000: I=5000;
+L5000: I=5000; obj = K;
 Laction:
         switch (action(cmdin, I, VERB, obj)) {
           case 2: return true;
 Laction:
         switch (action(cmdin, I, VERB, obj)) {
           case 2: return true;
@@ -770,28 +807,27 @@ L30310: game.newloc=PLAC[TROLL]+FIXD[TROLL]-game.loc;
        game.fixed[BEAR]= -1;
        game.prop[BEAR]=3;
        game.oldlc2=game.newloc;
        game.fixed[BEAR]= -1;
        game.prop[BEAR]=3;
        game.oldlc2=game.newloc;
-        goto L99;
+       croak(cmdin);
+       goto L2000;
 
 /*  End of specials. */
 
 
 /*  End of specials. */
 
-
 L21:   LL=MOD((labs(TRAVEL[KK])/1000),1000);
        if(LL != K) {
 L21:   LL=MOD((labs(TRAVEL[KK])/1000),1000);
        if(LL != K) {
-               if(LL <= 300) {
-                       J=KEY[LL];
-                       if(FORCED(LL) && MOD((labs(TRAVEL[J])/1000),1000) == K)
-                               K2=KK;
-               }
-               if(TRAVEL[KK] < 0)
-                   goto L23;
-               KK=KK+1;
-               goto L21;
-
-L23:           KK=K2;
-               if(KK == 0) {
-                       RSPEAK(140);
-                       return true;
-               }
+           if(LL <= 300) {
+               if(FORCED(LL) && MOD((labs(TRAVEL[KEY[LL]])/1000),1000) == K)
+                   K2=KK;
+           }
+           if(TRAVEL[KK] < 0)
+               goto L23;
+           KK=KK+1;
+           goto L21;
+
+       L23:            KK=K2;
+           if(KK == 0) {
+               RSPEAK(140);
+               return true;
+           }
        }
 
        K=MOD(labs(TRAVEL[KK]),1000);
        }
 
        K=MOD(labs(TRAVEL[KK]),1000);
@@ -833,38 +869,8 @@ L50:       SPK=12;
 
 L90:   RSPEAK(23);
        game.oldlc2=game.loc;
 
 L90:   RSPEAK(23);
        game.oldlc2=game.loc;
-
-/*  Okay, he's dead.  Let's get on with it. */
-
-L99:   if(game.closng) {
-       /*  He died during closing time.  No resurrection.  Tally up a
-        *  death and exit. */
-           RSPEAK(131);
-           ++game.numdie;
-           score(0);
-       } else {
-           ++game.numdie;
-           if(!YES(cmdin,79+game.numdie*2,80+game.numdie*2,54))
-               score(0);
-           if(game.numdie == MAXDIE)
-               score(0);
-           game.place[WATER]=0;
-           game.place[OIL]=0;
-           if(TOTING(LAMP))
-               game.prop[LAMP]=0;
-           for (J=1; J<=NOBJECTS; J++) {
-               I=NOBJECTS + 1 - J;
-               if(TOTING(I)) {
-                   K=game.oldlc2;
-                   if(I == LAMP)
-                       K=1;
-                   DROP(I,K);
-               }
-           }
-           game.loc=3;
-           game.oldloc=game.loc;
-           goto L2000;
-       }
+       croak(cmdin);
+       goto L2000;
 
 /*  Cave closing and scoring */
 
 
 /*  Cave closing and scoring */