Prepare superhack.c for 1TBS reflow.
[wumpus.git] / superhack.c
index 82d480907a6238a75d50027700f511b8520af4c2..8ddd148cfec9e9095ad0b9ad88974a0db3b51c12 100644 (file)
@@ -3,22 +3,28 @@
  *
  * Author: Eric S. Raymond <esr@snark.thyrsus.com>
  *
- * My update of a classic adventure game.  The C is crude because it's
- * a hack on a line-by-line translation of a BASIC `Hunt The Wumpus'.
- * This code is no relation to the elaborate dungeon game called `Hack'.
+ * My update of a classic adventure game.  This code is no relation to
+ * the elaborate dungeon game called `Hack'.
  *
  * Any resemblance to persons living or dead is strictly coincidental.  And
  * if you believe *that*...
+ *
+ * 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>
 
 static int path[5];
 static int j, k, scratchloc, pies;
 static char inp[BUFSIZ];               /* common input buffer */
 
+#define NUMBERS "0123456789"
 #define YOU    0
 #define RMS    1
 #define STARLET1       2
@@ -35,6 +41,8 @@ static int loc[LOCS];
 #define LOSE   -1
 static int finished;
 
+#define IGNORE(r) do{if(r);}while(0)
+
 static int cave[20][3] =
 {
     {1,4,7},
@@ -69,8 +77,9 @@ int getlet(prompt)
 char *prompt;
 {
     (void) printf("%s? ", prompt);
-    if(fgets(inp, sizeof(inp), stdin))
+    if (fgets(inp, sizeof(inp), stdin)) {
       return(tolower(inp[0]));
+    }
     else {
       fputs("\n",stdout);
       exit(1);
@@ -81,8 +90,6 @@ char *prompt;
 
 void print_instructions()
 {
-    char ebuf[BUFSIZ];
-
     PM("Welcome to `Hunt the Superhack'\n")
 
 PM("   The superhack lives on the 9th floor of 45 Technology Square in");
@@ -105,7 +112,7 @@ PM("Cambridge, Massachusetts.  Your mission is to throw a pie in his face.\n");
     PM("   If a pie hits the superhack, you win. If it hits you, you lose!\n");
 
     (void) fputs("<Press return to continue>", stdout);
-    (void) fgets(inp, sizeof(inp), stdin);
+    IGNORE(fgets(inp, sizeof(inp), stdin));
     (void) putchar('\n');
 
     PM("Hazards:");
@@ -159,9 +166,11 @@ int where;
 
  retry:
     newloc = FNA();
-    for (j = 0; j < LOCS; j++)
-       if (loc[j] == newloc)
+    for (j = 0; j < LOCS; j++) {
+      if (loc[j] == newloc) {
            goto retry;
+      }
+    }
 
     loc[where] = newloc;
 }
@@ -207,14 +216,18 @@ void check_hazards()
     {
        int room = cave[loc[YOU]][k];
 
-       if (room == loc[RMS])
+       if (room == loc[RMS]) {
            (void) puts("I smell a superhack!");
-       else if (room == loc[STARLET1] || room == loc[STARLET2])
+       }
+       else if (room == loc[STARLET1] || room == loc[STARLET2]) {
            (void) puts("I smell perfume!");
-       else if (room == loc[DROID1] || room == loc[DROID2])
+       }
+       else if (room == loc[DROID1] || room == loc[DROID2]) {
            (void) puts("Droids nearby!");
-       else if (room == loc[LUSER1] || room == loc[LUSER2])
+       }
+       else if (room == loc[LUSER1] || room == loc[LUSER2]) {
            (void) puts("Lusers nearby!");
+       }
     }
 }
 
@@ -223,20 +236,22 @@ void throw()
     extern void check_shot(), move_superhack();
     int        j9;
 
-    j9 = sscanf(inp + isalpha(inp[0]), "%d %d %d %d %d",
+    j9 = sscanf(inp + strcspn(inp, NUMBERS), "%d %d %d %d %d",
                    &path[0], &path[1], &path[2], &path[3], &path[4]);
+
     if (j9 < 1)
     {
        PM("Sorry, I didn't see any room numbers after your throw command.");
        return;
     }
 
-    for (k = 0; k < j9; k++)
-       if (path[k] == path[k - 2])
+    for (k = 0; k < j9; k++) {
+       if (k >= 2 && path[k] == path[k - 2])
        {
            (void) puts("Pies can't fly that crookedly --- try again.");
            return;
        }
+    }
 
     scratchloc = loc[YOU];
 
@@ -250,8 +265,9 @@ void throw()
            {
                scratchloc = path[k];
                check_shot();
-               if (finished != NOT)
+               if (finished != NOT) {
                    return;
+               }
            }
 
        }
@@ -262,7 +278,6 @@ void throw()
 
     }
 
- ammo:
     if (finished == NOT)
     {
        (void) puts("You missed.");
@@ -271,8 +286,9 @@ void throw()
 
        move_superhack();
 
-       if (--pies <= 0)
+       if (--pies <= 0) {
            finished = LOSE;
+       }
     }
 
 }
@@ -296,11 +312,13 @@ void move_superhack()
 {
     k = FNC();
 
-    if (k < 3)
+    if (k < 3) {
        loc[RMS] = cave[loc[RMS]][k];
+    }
 
-    if (loc[RMS] != loc[YOU])
+    if (loc[RMS] != loc[YOU]) {
        return;
+    }
 
     (void) puts("The superhack flames you to a crisp.  You lose!");
 
@@ -310,7 +328,7 @@ void move_superhack()
 
 void move()
 {
-    if (sscanf(inp + isalpha(inp[0]), "%d", &scratchloc) < 1)
+    if (sscanf(inp + strcspn(inp, NUMBERS), "%d", &scratchloc) < 1)
     {
        PM("Sorry, I didn't see a room number after your `m' command.");
        return;
@@ -318,9 +336,11 @@ void move()
 
     scratchloc--;
 
-    for (k = 0; k < 3; k++)
-       if (cave[loc[YOU]][k] == scratchloc)
-           goto goodmove;
+    for (k = 0; k < 3; k++) {
+         if (cave[loc[YOU]][k] == scratchloc) {
+               goto goodmove;
+         }
+    }
 
     PM("You can't get there from here!");
     return;
@@ -351,27 +371,32 @@ goodmove:
     }
 }
 
-main(argc, argv)
-int argc;
-char *argv[];
+int main(int argc, char *argv[])
 {
-    if (argc >= 2 && strcmp(argv[1], "-s") == 0)
-       srand(atoi(argv[2]));
-    else
-       srand((int)time((long *) 0));
+    if (argc >= 2 && strcmp(argv[1], "-s") == 0) {
+         srand(atoi(argv[2]));
+    }
+    else {
+         srand((int)time((long *) 0));
+    }
 
     for (;;)
     {
     badlocs:
-       for (j = 0; j < LOCS; j++)
-           loc[j] = FNA();
+       for (j = 0; j < LOCS; j++) {
+             loc[j] = FNA();
+       }
 
-       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;
+             }
+           }
+       }
 
        (void) puts("Hunt the Superhack");
 
@@ -387,12 +412,15 @@ char *argv[];
 
            c = getlet("Throw, move or help [t,m,?]");
 
-           if (c == 't')
+           if (c == 't') {
                throw();
-           else if (c == 'm')
+           }
+           else if (c == 'm') {
                move();
-           else if (c == '?')
+           }
+           else if (c == '?') {
                print_instructions();
+           }
 #ifdef DEBUG
            else if (c == 'd')
            {
@@ -424,6 +452,7 @@ char *argv[];
            break;
        }
     }
+    return 0;
 }
 
 /* superhack.c ends here */