*
* 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
#define LOSE -1
static int finished;
+#define IGNORE(r) do{if(r);}while(0)
+
static int cave[20][3] =
{
{1,4,7},
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);
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");
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:");
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;
}
{
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!");
+ }
}
}
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];
{
scratchloc = path[k];
check_shot();
- if (finished != NOT)
+ if (finished != NOT) {
return;
+ }
}
}
}
- ammo:
if (finished == NOT)
{
(void) puts("You missed.");
move_superhack();
- if (--pies <= 0)
+ if (--pies <= 0) {
finished = LOSE;
+ }
}
}
{
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!");
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;
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;
PM("Yow! You interrupted the superhack.");
move_superhack();
}
- else if (scratchloc == loc[STARLET1] || scratchloc == loc[STARLET1])
+ else if (scratchloc == loc[STARLET1] || scratchloc == loc[STARLET2])
{
PM("You begin to babble at an unimpressed starlet. You lose!");
finished = LOSE;
}
}
-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");
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')
{
break;
}
}
+ return 0;
}
/* superhack.c ends here */