Prepare wumpus.c for 1TBS reflow.
[wumpus.git] / wumpus.c
index 191693f35ef67332716641066d899fd2d9aa889d..1c0cdd11f5231ac5f90a7c3ca3c4a9321f6fdc36 100644 (file)
--- a/wumpus.c
+++ b/wumpus.c
@@ -2,10 +2,7 @@
  * wumpus.c --- a faithful translation of the classic "Hunt The Wumpus" game.
  *
  * Translator: Eric S. Raymond <esr@snark.thyrsus.com>
- * Version: $Id$
- *
- * This was the state of the art 20 years ago, in 1972.  We've come a long
- * way, baby.
+ * Version: $Id: wumpus.c,v 1.4 1996/05/17 17:30:35 esr Exp esr $
  *
  * The BASIC source is that posted by Magnus Olsson in USENET article
  * <9207071854.AA21847@thep.lu.se>: he wrote
  *
  * So, pretend for a little while that your workstation is an ASR-33 and
  * limber up your fingers for a trip to nostalgia-land...
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
  */
 
 #include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/socket.h>
 
 /* 5 REM *** HUNT THE WUMPUS ***                                       */
 
@@ -102,22 +107,28 @@ int getnum(prompt)
 char *prompt;
 {
     (void) printf("%s\n?", prompt);
-    (void) fgets(inp, sizeof(inp), stdin);
-    return(atoi(inp));
+    if (fgets(inp, sizeof(inp), stdin))
+        return(atoi(inp));
+    else {
+        fputs("\n",stdout);
+        exit(1);
+    }
 }
 
 int getlet(prompt)
 char *prompt;
 {
     (void) printf("%s\n?", prompt);
-    (void) fgets(inp, sizeof(inp), stdin);
-    return(inp[0]);    
+    if (fgets(inp, sizeof(inp), stdin))
+       return(toupper(inp[0]));
+    else {
+        fputs("\n",stdout);
+        exit(1);
+    }
 }
 
 void print_instructions()
 {
-    char ebuf[BUFSIZ];
-
 /* 375 REM *** INSTRUCTIONS ***                                                */
 /* 380 PRINT "WELCOME TO 'HUNT THE WUMPUS'"                            */
     puts("WELCOME TO 'HUNT THE WUMPUS'");
@@ -219,16 +230,24 @@ void check_hazards()
     /* 635 PRINT "BATS NEARBY!"                                                */
     /* 640 NEXT K                                                      */
     /* 645 NEXT J                                                      */
-    for (k = 0; k < 3; k++)
+    for (j = WUMPUS; j < LOCS; j++)
     {
-       int room = cave[loc[YOU]][k];
-
-       if (room == loc[WUMPUS])
-           (void) puts("I SMELL A WUMPUS!");
-       else if (room == loc[PIT1] || room == loc[PIT2])
-           (void) puts("I FEEL A DRAFT");
-       else if (room == loc[BATS1] || room == loc[BATS2])
-           (void) puts("BATS NEARBY!");
+       for (k = 0; k < 3; k++)
+       {
+           if (cave[loc[YOU]][k] != loc[j]) {
+                 continue;
+           }
+
+           if (j == WUMPUS) {
+                 (void) puts("I SMELL A WUMPUS!");
+           }
+           else if (j == PIT1 || j == PIT2) {
+                 (void) puts("I FEEL A DRAFT");
+           }
+           else if (j == BATS1 || j == BATS2) {
+                 (void) puts("BATS NEARBY!");
+           }
+       }
     }
 
     /* 650 PRINT "YOU ARE IN ROOM "L(1)                                        */
@@ -261,12 +280,15 @@ badin:
     /* 700 IF I$<>"M" THEN 675                                         */
     /* 705 O=2                                                         */
     /* 710 RETURN                                                      */
-    if (c == 'S')
+    if (c == 'S') {
        return(1);
-    else if (c == 'M')
+    }
+    else if (c == 'M') {
        return(0);
-    else
+    }
+    else {
        goto badin;
+    }
 }
 
 
@@ -288,8 +310,9 @@ badrange:
 
     /* 745 IF J9<1 THEN 735                                            */
     /* 750 IF J9>5 THEN 735                                            */
-    if (j9 < 1 || j9 > 5)
+    if (j9 < 1 || j9 > 5) {
        goto badrange;
+    }
 
     /* 755 FOR K=1 TO J9                                               */
     for (k = 0; k < j9; k++)
@@ -299,12 +322,14 @@ badrange:
        path[k] = getnum("ROOM #") - 1;
 
        /* 770 IF K<=2 THEN 790                                         */
-       if (k <= 1)
+       if (k <= 1) {
            continue;
+       }
 
        /* 775 IF P(K)<>P(K-2) THEN 790                                 */
-       if (path[k] != path[k - 2])
+       if (path[k] != path[k - 2]) {
            continue;
+       }
 
        /* 780 PRINT "ARROWS AREN'T THAT CROOKED - TRY ANOTHER ROOM"    */
        (void) puts("ARROWS AREN'T THAT CROOKED - TRY ANOTHER ROOM");
@@ -323,6 +348,11 @@ badrange:
     {
        int     k1;
 
+#ifdef DEBUG
+       (void) printf("Location is %d, looking for tunnel to room %d\n",
+                     scratchloc+1, path[k]+1);
+#endif
+
        /* 810 FOR K1=1 TO 3                                            */
        for (k1 = 0; k1 < 3; k1++)
        {
@@ -340,14 +370,17 @@ badrange:
                 */
                scratchloc = path[k];
 
+#ifdef DEBUG
+               (void) printf("Found tunnel to room %d\n", scratchloc+1);
+#endif
+
                /* this simulates logic at 895 in the BASIC code */
                check_shot();
-               if (finished == NOT)
-                   goto ammo;
-               else
+               if (finished != NOT) {
                    return;
+               }
+               goto nextpath;
            }
-
            /* 820 NEXT K1                                              */
        }
 
@@ -355,13 +388,21 @@ badrange:
        /* 830 L=S(L,FNB(1))                                            */
        scratchloc = cave[scratchloc][FNB()];
 
+#ifdef DEBUG
+       (void) printf("No tunnel for room %d, new location is %d\n",
+                     path[k]+1, scratchloc+1);
+#endif
+
        /* 835 GOTO 900                                                 */
        check_shot();
+       if (finished != NOT) {
+           return;
+       }
 
        /* 840 NEXT K                                                   */
+       nextpath: ;
     }
 
-ammo:
     if (finished == NOT)
     {
        /* 845 PRINT "MISSED"                                           */
@@ -378,8 +419,9 @@ ammo:
        /* 870 A=A-1                                                    */
        /* 875 IF A>0 THEN 885                                          */
        /* 880 F=-1                                                     */
-       if (--arrows <= 0)
+       if (--arrows <= 0) {
            finished = LOSE;
+       }
     }
 
     /* 885 RETURN                                                      */
@@ -418,12 +460,18 @@ void move_wumpus()
 
     /* 945 IF K=4 THEN 955                                             */
     /* 950 L(2)=S(L(2),K)                                              */
-    if (k < 3)
+    if (k < 3) {
        loc[WUMPUS] = cave[loc[WUMPUS]][k];
+    }
+
+#ifdef DEBUG
+    (void) printf("Wumpus location is now room %d\n", loc[WUMPUS]+1);
+#endif
 
     /* 955 IF L(2)<>L THEN 970                                         */
-    if (loc[WUMPUS] != loc[YOU])
+    if (loc[WUMPUS] != loc[YOU]) {
        return;
+    }
 
     /* 960 PRINT "TSK TSK TSK - WUMPUS GOT YOU!"                       */
     (void) puts("TSK TSK TSK - WUMPUS GOT YOU!");
@@ -447,8 +495,9 @@ badmove:
 
     /* 995 IF L<1 THEN 985                                             */
     /* 1000 IF L>20 THEN 985                                           */
-    if (scratchloc < 1 || scratchloc > 20)
+    if (scratchloc < 1 || scratchloc > 20) {
        goto badmove;
+    }
     scratchloc--;
 
     /* 1005 FOR K=1 TO 3                                               */
@@ -456,8 +505,9 @@ badmove:
     {
        /* 1010 REM *** CHECK IF LEGAL MOVE ***                         */
        /* 1015 IF S(L(1),K)=L THEN 1045                                */
-       if (cave[loc[YOU]][k] == scratchloc)
-           goto goodmove;
+       if (cave[loc[YOU]][k] == scratchloc) {
+             goto goodmove;
+       }
 
        /* 1020 NEXT K                                                  */
     }
@@ -488,8 +538,12 @@ goodmove:
        /* 1080 RETURN                                                  */
        (void) puts("... OOPS! BUMPED A WUMPUS!");
        move_wumpus();
+       if (finished < 0) {
+           return;
+       }
+       /* Fall through since Wumpus could have been in a pit or bat room */
     }
-    else if (scratchloc == loc[PIT1] || scratchloc == loc[PIT2])
+    if (scratchloc == loc[PIT1] || scratchloc == loc[PIT2])
     {
        /* 1085 REM *** PIT ***                                         */
        /* 1090 IF L=L(3) THEN 1100                                     */
@@ -499,8 +553,9 @@ goodmove:
        /* 1110 RETURN                                                  */
        (void) puts("YYYYIIIIEEEE . . . FELL IN PIT");
        finished = LOSE;
+       return;
     }
-    else if (scratchloc == loc[BATS1] || scratchloc == loc[BATS2])
+    if (scratchloc == loc[BATS1] || scratchloc == loc[BATS2])
     {
        /* 1115 REM *** BATS ***                                        */
        /* 1120 IF L=L(5) THEN 1130                                     */
@@ -511,20 +566,23 @@ goodmove:
        /* 1145 RETURN                                                  */
        /* 1150 END                                                     */
        (void) puts("ZAP--SUPER BAT SNATCH! ELSEWHEREVILLE FOR YOU!");
-       loc[YOU] = FNA();
+       scratchloc = loc[YOU] = FNA();
+       goto goodmove;
     }
 }
 
-main(argc, argv)
+int main(argc, argv)
 int argc;
 char *argv[];
 {
     int        c;
 
-    if (strcmp(argv[1], "-s") == 0)
-       srand(atol(argv[2]));
-    else
-       srand(time((long *) 0));
+    if (argc >= 2 && strcmp(argv[1], "-s") == 0) {
+       srand(atoi(argv[2]));
+    }
+    else {
+       srand((int)time((long *) 0));
+    }
 
     /* 15 PRINT "INSTRUCTIONS (Y-N)";                                  */
     /* 20 INPUT I$                                                     */
@@ -545,8 +603,9 @@ badlocs:
     /* 175 L(J)=FNA(0)                                                 */
     /* 180 M(J)=L(J)                                                   */
     /* 185 NEXT J                                                      */
-    for (j = 0; j < LOCS; j++)
+    for (j = 0; j < LOCS; j++) {
        loc[j] = save[j] = FNA();
+    }
 
     /* 190 REM *** CHECK FOR CROSSOVERS (IE L(1)=L(2), ETC) ***                */
     /* 195 FOR J=1 TO 6                                                        */
@@ -555,12 +614,16 @@ badlocs:
     /* 210 IF L(J)=L(K) THEN 170                                       */
     /* 215 NEXT K                                                      */
     /* 220 NEXT J                                                      */
-    for (j = 0; j < LOCS; j++)
-       for (k = 0; k < LOCS; k++)
-           if (j == k)
-               continue;
-           else if (loc[j] == loc[k])
-               goto badlocs;
+    for (j = 0; j < LOCS; j++) {
+       for (k = 0; k < LOCS; k++) {
+             if (j == k) {
+                   continue;
+             }
+             else if (loc[j] == loc[k]) {
+                 goto badlocs;
+             }
+       }
+    }
 
     /* 225 REM *** SET NO. OF ARROWS ***                               */
 newgame:    
@@ -595,8 +658,9 @@ nextmove:
        shoot();
 
        /* 285 IF F=0 THEN 255                                          */
-       if (finished == NOT)
+       if (finished == NOT) {
            goto nextmove;
+       }
 
        /* 290 GOTO 310                                                 */
     }
@@ -607,8 +671,9 @@ nextmove:
        move();
 
        /* 305 IF F=0 THEN 255                                          */
-       if (finished == NOT)
+       if (finished == NOT) {
            goto nextmove;
+       }
     }
 
     /* 310 IF F>0 THEN 335                                             */
@@ -629,8 +694,9 @@ nextmove:
     /* 340 FOR J=1 TO 6                                                        */
     /* 345 L(J)=M(J)                                                   */
     /* 350 NEXT J                                                      */
-    for (j = YOU; j < LOCS; j++)
+    for (j = YOU; j < LOCS; j++) {
        loc[j] = save[j];
+    }
 
     /* 355 PRINT "SAME SETUP (Y-N)";                                   */
     /* 360 INPUT I$                                                    */
@@ -638,10 +704,12 @@ nextmove:
 
     /* 365 IF I$<>"Y"THEN 170                                          */
     /* 370 GOTO 230                                                    */
-    if (c != 'Y')
+    if (c != 'Y') {
        goto badlocs;
-    else
+    }
+    else {
        goto newgame;
+    }
 }
 
 /* wumpus.c ends here */