summaryrefslogtreecommitdiffstats
path: root/adventure
diff options
context:
space:
mode:
authorjtc <jtc@NetBSD.org>1994-10-21 20:51:44 +0000
committerjtc <jtc@NetBSD.org>1994-10-21 20:51:44 +0000
commita861bdee374ea33fbbe20e45cd8d3f644374c835 (patch)
tree20f77e0423e6294672f4d175bc7a787ca87ddebf /adventure
parentfb73c52b499ea55b081fc042440f4524842c68b6 (diff)
downloadbsdgames-darwin-a861bdee374ea33fbbe20e45cd8d3f644374c835.tar.gz
bsdgames-darwin-a861bdee374ea33fbbe20e45cd8d3f644374c835.tar.zst
bsdgames-darwin-a861bdee374ea33fbbe20e45cd8d3f644374c835.zip
adventure(6), from 44lite
Diffstat (limited to 'adventure')
-rw-r--r--adventure/Makefile16
-rw-r--r--adventure/adventure.657
-rw-r--r--adventure/crc.c134
-rw-r--r--adventure/done.c138
-rw-r--r--adventure/glorkz1815
-rw-r--r--adventure/hdr.h164
-rw-r--r--adventure/init.c216
-rw-r--r--adventure/io.c514
-rw-r--r--adventure/main.c580
-rw-r--r--adventure/save.c184
-rw-r--r--adventure/setup.c125
-rw-r--r--adventure/subr.c828
-rw-r--r--adventure/vocab.c223
-rw-r--r--adventure/wizard.c133
14 files changed, 5127 insertions, 0 deletions
diff --git a/adventure/Makefile b/adventure/Makefile
new file mode 100644
index 00000000..834502a8
--- /dev/null
+++ b/adventure/Makefile
@@ -0,0 +1,16 @@
+# @(#)Makefile 8.1 (Berkeley) 6/12/93
+
+PROG= adventure
+SRCS= main.c init.c done.c save.c subr.c vocab.c wizard.c io.c data.c crc.c
+MAN6= adventure.0
+CFLAGS+=-traditional-cpp
+HIDEGAME=hidegame
+CLEANFILES+=setup data.c
+
+data.c: glorkz setup
+ ./setup ${.CURDIR}/glorkz > data.c
+
+setup: setup.c hdr.h
+ ${CC} -o setup ${.CURDIR}/setup.c
+
+.include <bsd.prog.mk>
diff --git a/adventure/adventure.6 b/adventure/adventure.6
new file mode 100644
index 00000000..8df2e8bb
--- /dev/null
+++ b/adventure/adventure.6
@@ -0,0 +1,57 @@
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" The game adventure was originally written in Fortran by Will Crowther
+.\" and Don Woods. It was later translated to C and enhanced by Jim
+.\" Gillogly. This code is derived from software contributed to Berkeley
+.\" by Jim Gillogly at The Rand Corporation.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)adventure.6 8.1 (Berkeley) 5/31/93
+.\"
+.Dd May 31, 1993
+.Dt ADVENTURE 6
+.Os
+.Sh NAME
+.Nm adventure
+.Nd an exploration game
+.Sh SYNOPSIS
+.Nm adventure
+.Op saved-file
+.Sh DESCRIPTION
+The object of the game is to locate and explore Colossal Cave, find the
+treasures hidden there, and bring them back to the building with you.
+The program is self-descriptive to a point, but part of the game is to
+discover its rules.
+.Pp
+To terminate a game, enter
+.Dq quit ;
+to save a game for later resumption, enter
+.Dq suspend .
diff --git a/adventure/crc.c b/adventure/crc.c
new file mode 100644
index 00000000..f6293259
--- /dev/null
+++ b/adventure/crc.c
@@ -0,0 +1,134 @@
+/*-
+ * Copyright (c) 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * James W. Williams of the University of Maryland.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)crc.c 8.1 (Berkeley) 5/31/93";
+static char ORIGINAL_sccsid[] = "@(#)crc.c 5.2 (Berkeley) 4/4/91";
+#endif /* not lint */
+
+typedef unsigned long u_long;
+
+u_long crctab[] = {
+ 0x7fffffff,
+ 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+ 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e,
+ 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
+ 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d,
+ 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0,
+ 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63,
+ 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa,
+ 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75,
+ 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180,
+ 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
+ 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87,
+ 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+ 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5,
+ 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
+ 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4,
+ 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b,
+ 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea,
+ 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541,
+ 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc,
+ 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f,
+ 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
+ 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e,
+ 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c,
+ 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
+ 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b,
+ 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2,
+ 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671,
+ 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8,
+ 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767,
+ 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6,
+ 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
+ 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795,
+ 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+ 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b,
+ 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
+ 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82,
+ 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d,
+ 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8,
+ 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff,
+ 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee,
+ 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d,
+ 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
+ 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c,
+ 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+ 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02,
+ 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+};
+
+/*
+ * crc --
+ * Compute a POSIX.2 checksum. This routine modified by Jim Gillogly
+ * to work on sequential data rather than on a file. Initial call to
+ * crc_start initializes the sum, and subsequent calls to crc update
+ * it.
+ */
+
+u_long crcval;
+int step;
+
+crc_start()
+{
+ crcval = step = 0;
+}
+
+u_long crc(ptr, nr) /* Process nr bytes at a time; ptr points to them */
+char *ptr;
+int nr;
+{
+ register int i;
+ register char *p;
+
+ while (nr > 0)
+ for (p = ptr; nr--; ++p)
+ {
+ if (!(i = crcval >> 24 ^ *p))
+ {
+ i = step++;
+ if (step >= sizeof(crctab)/sizeof(crctab[0]))
+ step = 0;
+ }
+ crcval = (crcval << 8) ^ crctab[i];
+ }
+ return crcval & 0xffffffff; /* Mask to 32 bits. */
+}
diff --git a/adventure/done.c b/adventure/done.c
new file mode 100644
index 00000000..fd286fd2
--- /dev/null
+++ b/adventure/done.c
@@ -0,0 +1,138 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * The game adventure was originally written in Fortran by Will Crowther
+ * and Don Woods. It was later translated to C and enhanced by Jim
+ * Gillogly. This code is derived from software contributed to Berkeley
+ * by Jim Gillogly at The Rand Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)done.c 8.1 (Berkeley) 5/31/93";
+#endif /* not lint */
+
+/* Re-coding of advent in C: termination routines */
+
+#include "hdr.h"
+
+score() /* sort of like 20000 */
+{ register int scor,i;
+ mxscor=scor=0;
+ for (i=50; i<=maxtrs; i++)
+ { if (ptext[i].txtlen==0) continue;
+ k=12;
+ if (i==chest) k=14;
+ if (i>chest) k=16;
+ if (prop[i]>=0) scor += 2;
+ if (place[i]==3&&prop[i]==0) scor += k-2;
+ mxscor += k;
+ }
+ scor += (maxdie-numdie)*10;
+ mxscor += maxdie*10;
+ if (!(scorng||gaveup)) scor += 4;
+ mxscor += 4;
+ if (dflag!=0) scor += 25;
+ mxscor += 25;
+ if (closng) scor += 25;
+ mxscor += 25;
+ if (closed)
+ { if (bonus==0) scor += 10;
+ if (bonus==135) scor += 25;
+ if (bonus==134) scor += 30;
+ if (bonus==133) scor += 45;
+ }
+ mxscor += 45;
+ if (place[magzin]==108) scor++;
+ mxscor++;
+ scor += 2;
+ mxscor += 2;
+ for (i=1; i<=hntmax; i++)
+ if (hinted[i]) scor -= hints[i][2];
+ return(scor);
+}
+
+done(entry) /* entry=1 means goto 13000 */ /* game is over */
+int entry; /* entry=2 means goto 20000 */ /* 3=19000 */
+{ register int i,sc;
+ if (entry==1) mspeak(1);
+ if (entry==3) rspeak(136);
+ printf("\n\n\nYou scored %d out of a ",(sc=score()));
+ printf("possible %d using %d turns.\n",mxscor,turns);
+ for (i=1; i<=clsses; i++)
+ if (cval[i]>=sc)
+ { speak(&ctext[i]);
+ if (i==clsses-1)
+ { printf("To achieve the next higher rating");
+ printf(" would be a neat trick!\n\n");
+ printf("Congratulations!!\n");
+ exit(0);
+ }
+ k=cval[i]+1-sc;
+ printf("To achieve the next higher rating, you need");
+ printf(" %d more point",k);
+ if (k==1) printf(".\n");
+ else printf("s.\n");
+ exit(0);
+ }
+ printf("You just went off my scale!!!\n");
+ exit(0);
+}
+
+
+die(entry) /* label 90 */
+int entry;
+{ register int i;
+ if (entry != 99)
+ { rspeak(23);
+ oldlc2=loc;
+ }
+ if (closng) /* 99 */
+ { rspeak(131);
+ numdie++;
+ done(2);
+ }
+ yea=yes(81+numdie*2,82+numdie*2,54);
+ numdie++;
+ if (numdie==maxdie || !yea) done(2);
+ place[water]=0;
+ place[oil]=0;
+ if (toting(lamp)) prop[lamp]=0;
+ for (i=100; i>=1; i--)
+ { if (!toting(i)) continue;
+ k=oldlc2;
+ if (i==lamp) k=1;
+ drop(i,k);
+ }
+ loc=3;
+ oldloc=loc;
+ return(2000);
+}
diff --git a/adventure/glorkz b/adventure/glorkz
new file mode 100644
index 00000000..c65c8fd3
--- /dev/null
+++ b/adventure/glorkz
@@ -0,0 +1,1815 @@
+1
+1 You are standing at the end of a road before a small brick building.
+1 Around you is a forest. A small stream flows out of the building and
+1 down a gully.
+2 You have walked up a hill, still in the forest. The road slopes back
+2 down the other side of the hill. There is a building in the distance.
+3 You are inside a building, a well house for a large spring.
+4 You are in a valley in the forest beside a stream tumbling along a
+4 rocky bed.
+5 You are in open forest, with a deep valley to one side.
+6 You are in open forest near both a valley and a road.
+7 At your feet all the water of the stream splashes into a 2-inch slit
+7 in the rock. Downstream the streambed is bare rock.
+8 You are in a 20-foot depression floored with bare dirt. Set into the
+8 dirt is a strong steel grate mounted in concrete. A dry streambed
+8 leads into the depression.
+9 You are in a small chamber beneath a 3x3 steel grate to the surface.
+9 A low crawl over cobbles leads inward to the west.
+10 You are crawling over cobbles in a low passage. There is a dim light
+10 at the east end of the passage.
+11 You are in a debris room filled with stuff washed in from the surface.
+11 A low wide passage with cobbles becomes plugged with mud and debris
+11 here, but an awkward canyon leads upward and west. A note on the wall
+11 says "Magic word XYZZY".
+12 You are in an awkward sloping east/west canyon.
+13 You are in a splendid chamber thirty feet high. The walls are frozen
+13 rivers of orange stone. An awkward canyon and a good passage exit
+13 from east and west sides of the chamber.
+14 At your feet is a small pit breathing traces of white mist. An east
+14 passage ends here except for a small crack leading on.
+15 You are at one end of a vast hall stretching forward out of sight to
+15 the west. There are openings to either side. Nearby, a wide stone
+15 staircase leads downward. The hall is filled with wisps of white mist
+15 swaying to and fro almost as if alive. A cold wind blows up the
+15 staircase. There is a passage at the top of a dome behind you.
+16 The crack is far too small for you to follow.
+17 You are on the east bank of a fissure slicing clear across the hall.
+17 The mist is quite thick here, and the fissure is too wide to jump.
+18 This is a low room with a crude note on the wall. The note says,
+18 "You won't get it up the steps".
+19 You are in the Hall of the Mountain King, with passages off in all
+19 directions.
+20 You are at the bottom of the pit with a broken neck.
+21 You didn't make it.
+22 The dome is unclimbable.
+23 You are at the west end of the Twopit Room. There is a large hole in
+23 the wall above the pit at this end of the room.
+24 You are at the bottom of the eastern pit in the Twopit Room. There is
+24 a small pool of oil in one corner of the pit.
+25 You are at the bottom of the western pit in the Twopit Room. There is
+25 a large hole in the wall about 25 feet above you.
+26 You clamber up the plant and scurry through the hole at the top.
+27 You are on the west side of the fissure in the Hall of Mists.
+28 You are in a low N/S passage at a hole in the floor. The hole goes
+28 down to an E/W passage.
+29 You are in the south side chamber.
+30 You are in the west side chamber of the Hall of the Mountain King.
+30 A passage continues west and up here.
+31 >$<
+32 You can't get by the snake.
+33 You are in a large room, with a passage to the south, a passage to the
+33 west, and a wall of broken rock to the east. There is a large "Y2" on
+33 a rock in the room's center.
+34 You are in a jumble of rock, with cracks everywhere.
+35 You're at a low window overlooking a huge pit, which extends up out of
+35 sight. A floor is indistinctly visible over 50 feet below. Traces of
+35 white mist cover the floor of the pit, becoming thicker to the right.
+35 Marks in the dust around the window would seem to indicate that
+35 someone has been here recently. Directly across the pit from you and
+35 25 feet away there is a similar window looking into a lighted room. A
+35 shadowy figure can be seen there peering back at you.
+36 You are in a dirty broken passage. To the east is a crawl. To the
+36 west is a large passage. Above you is a hole to another passage.
+37 You are on the brink of a small clean climbable pit. A crawl leads
+37 west.
+38 You are in the bottom of a small pit with a little stream, which
+38 enters and exits through tiny slits.
+39 You are in a large room full of dusty rocks. There is a big hole in
+39 the floor. There are cracks everywhere, and a passage leading east.
+40 You have crawled through a very low wide passage parallel to and north
+40 of the Hall of Mists.
+41 You are at the west end of Hall of Mists. A low wide crawl continues
+41 west and another goes north. To the south is a little passage 6 feet
+41 off the floor.
+42 You are in a maze of twisty little passages, all alike.
+43 You are in a maze of twisty little passages, all alike.
+44 You are in a maze of twisty little passages, all alike.
+45 You are in a maze of twisty little passages, all alike.
+46 Dead end
+47 Dead end
+48 Dead end
+49 You are in a maze of twisty little passages, all alike.
+50 You are in a maze of twisty little passages, all alike.
+51 You are in a maze of twisty little passages, all alike.
+52 You are in a maze of twisty little passages, all alike.
+53 You are in a maze of twisty little passages, all alike.
+54 Dead end
+55 You are in a maze of twisty little passages, all alike.
+56 Dead end
+57 You are on the brink of a thirty foot pit with a massive orange column
+57 down one wall. You could climb down here but you could not get back
+57 up. The maze continues at this level.
+58 Dead end
+59 You have crawled through a very low wide passage parallel to and north
+59 of the Hall of Mists.
+60 You are at the east end of a very long hall apparently without side
+60 chambers. To the east a low wide crawl slants up. To the north a
+60 round two foot hole slants down.
+61 You are at the west end of a very long featureless hall. The hall
+61 joins up with a narrow north/south passage.
+62 You are at a crossover of a high N/S passage and a low E/W one.
+63 Dead end
+64 You are at a complex junction. A low hands and knees passage from the
+64 north joins a higher crawl from the east to make a walking passage
+64 going west. There is also a large room above. The air is damp here.
+65 You are in Bedquilt, a long east/west passage with holes everywhere.
+65 To explore at random select north, south, up, or down.
+66 You are in a room whose walls resemble Swiss cheese. Obvious passages
+66 go west, east, NE, and NW. Part of the room is occupied by a large
+66 bedrock block.
+67 You are at the east end of the Twopit Room. The floor here is
+67 littered with thin rock slabs, which make it easy to descend the pits.
+67 There is a path here bypassing the pits to connect passages from east
+67 and west. There are holes all over, but the only big one is on the
+67 wall directly over the west pit where you can't get to it.
+68 You are in a large low circular chamber whose floor is an immense slab
+68 fallen from the ceiling (Slab Room). East and west there once were
+68 large passages, but they are now filled with boulders. Low small
+68 passages go north and south, and the south one quickly bends west
+68 around the boulders.
+69 You are in a secret N/S canyon above a large room.
+70 You are in a secret N/S canyon above a sizable passage.
+71 You are in a secret canyon at a junction of three canyons, bearing
+71 north, south, and SE. The north one is as tall as the other two
+71 combined.
+72 You are in a large low room. Crawls lead north, SE, and SW.
+73 Dead end crawl.
+74 You are in a secret canyon which here runs e/w. It crosses over a
+74 very tight canyon 15 feet below. If you go down you may not be able
+74 to get back up.
+75 You are at a wide place in a very tight N/S canyon.
+76 The canyon here becomes too tight to go further south.
+77 You are in a tall E/W canyon. A low tight crawl goes 3 feet north and
+77 seems to open up.
+78 The canyon runs into a mass of boulders -- dead end.
+79 The stream flows out through a pair of 1 foot diameter sewer pipes.
+79 It would be advisable to use the exit.
+80 You are in a maze of twisty little passages, all alike.
+81 Dead end
+82 Dead end
+83 You are in a maze of twisty little passages, all alike.
+84 You are in a maze of twisty little passages, all alike.
+85 Dead end
+86 Dead end
+87 You are in a maze of twisty little passages, all alike.
+88 You are in a long, narrow corridor stretching out of sight to the
+88 west. At the eastern end is a hole through which you can see a
+88 profusion of leaves.
+89 There is nothing here to climb. Use "up" or "out" to leave the pit.
+90 You have climbed up the plant and out of the pit.
+91 You are at the top of a steep incline above a large room. You could
+91 climb down here, but you would not be able to climb up. There is a
+91 passage leading back to the north.
+92 You are in the Giant Room. The ceiling here is too high up for your
+92 lamp to show it. Cavernous passages lead east, north, and south. On
+92 the west wall is scrawled the inscription, "Fee fie foe foo" [sic].
+93 The passage here is blocked by a recent cave-in.
+94 You are at one end of an immense north/south passage.
+95 You are in a magnificent cavern with a rushing stream, which cascades
+95 over a sparkling waterfall into a roaring whirlpool which disappears
+95 through a hole in the floor. Passages exit to the south and west.
+96 You are in the Soft Room. The walls are covered with heavy curtains,
+96 the floor with a thick pile carpet. Moss covers the ceiling.
+97 This is the Oriental Room. Ancient oriental cave drawings cover the
+97 walls. A gently sloping passage leads upward to the north, another
+97 passage leads SE, and a hands and knees crawl leads west.
+98 You are following a wide path around the outer edge of a large cavern.
+98 Far below, through a heavy white mist, strange splashing noises can be
+98 heard. The mist rises up through a fissure in the ceiling. The path
+98 exits to the south and west.
+99 You are in an alcove. A small NW path seems to widen after a short
+99 distance. An extremely tight tunnel leads east. It looks like a very
+99 tight squeeze. An eerie light can be seen at the other end.
+100 You're in a small chamber lit by an eerie green light. An extremely
+100 narrow tunnel exits to the west. A dark corridor leads ne.
+101 You're in the Dark-Room. A corridor leading south is the only exit.
+102 You are in an arched hall. A coral passage once continued up and east
+102 from here, but is now blocked by debris. The air smells of sea water.
+103 You're in a large room carved out of sedimentary rock. The floor and
+103 walls are littered with bits of shells embedded in the stone. A
+103 shallow passage proceeds downward, and a somewhat steeper one leads
+103 up. A low hands and knees passage enters from the south.
+104 You are in a long sloping corridor with ragged sharp walls.
+105 You are in a cul-de-sac about eight feet across.
+106 You are in an anteroom leading to a large passage to the east. Small
+106 passages go west and up. The remnants of recent digging are evident.
+106 A sign in midair here says "Cave under construction beyond this point.
+106 Proceed at own risk. [Witt construction company]"
+107 You are in a maze of twisty little passages, all different.
+108 You are at Witt's End. Passages lead off in *all* directions.
+109 You are in a north/south canyon about 25 feet across. The floor is
+109 covered by white mist seeping in from the north. The walls extend
+109 upward for well over 100 feet. Suspended from some unseen point far
+109 above you, an enormous two-sided mirror is hanging parallel to and
+109 midway between the canyon walls. (The mirror is obviously provided
+109 for the use of the dwarves, who as you know, are extremely vain.) A
+109 small window can be seen in either wall, some fifty feet up.
+110 You're at a low window overlooking a huge pit, which extends up out of
+110 sight. A floor is indistinctly visible over 50 feet below. Traces of
+110 white mist cover the floor of the pit, becoming thicker to the left.
+110 Marks in the dust around the window would seem to indicate that
+110 someone has been here recently. Directly across the pit from you and
+110 25 feet away there is a similar window looking into a lighted room. A
+110 shadowy figure can be seen there peering back at you.
+111 A large stalactite extends from the roof and almost reaches the floor
+111 below. You could climb down it, and jump from it to the floor, but
+111 having done so you would be unable to reach it to climb back up.
+112 You are in a little maze of twisting passages, all different.
+113 You are at the edge of a large underground reservoir. An opaque cloud
+113 of white mist fills the room and rises rapidly upward. The lake is
+113 fed by a stream, which tumbles out of a hole in the wall about 10 feet
+113 overhead and splashes noisily into the water somewhere within the
+113 mist. The only passage goes back toward the south.
+114 Dead end
+115 You are at the northeast end of an immense room, even larger than the
+115 Giant Room. It appears to be a repository for the "Adventure"
+115 program. Massive torches far overhead bathe the room with smoky
+115 yellow light. Scattered about you can be seen a pile of bottles (all
+115 of them empty), a nursery of young beanstalks murmuring quietly, a bed
+115 of oysters, a bundle of black rods with rusty stars on their ends, and
+115 a collection of brass lanterns. Off to one side a great many dwarves
+115 are sleeping on the floor, snoring loudly. A sign nearby reads: "Do
+115 not disturb the dwarves!" An immense mirror is hanging against one
+115 wall, and stretches to the other end of the room, where various other
+115 sundry objects can be glimpsed dimly in the distance.
+116 You are at the southwest end of the Repository. To one side is a pit
+116 full of fierce green snakes. On the other side is a row of small
+116 wicker cages, each of which contains a little sulking bird. In one
+116 corner is a bundle of black rods with rusty marks on their ends. A
+116 large number of velvet pillows are scattered about on the floor. A
+116 vast mirror stretches off to the northeast. At your feet is a large
+116 steel grate, next to which is a sign which reads, "Treasure Vault.
+116 Keys in Main Office."
+117 You are on one side of a large, deep chasm. A heavy white mist rising
+117 up from below obscures all view of the far side. A SW path leads away
+117 from the chasm into a winding corridor.
+118 You are in a long winding corridor sloping out of sight in both
+118 directions.
+119 You are in a secret canyon which exits to the north and east.
+120 You are in a secret canyon which exits to the north and east.
+121 You are in a secret canyon which exits to the north and east.
+122 You are on the far side of the chasm. A ne path leads away from the
+122 chasm on this side.
+123 You're in a long east/west corridor. A faint rumbling noise can be
+123 heard in the distance.
+124 The path forks here. The left fork leads northeast. A dull rumbling
+124 seems to get louder in that direction. The right fork leads southeast
+124 down a gentle slope. The main corridor enters from the west.
+125 The walls are quite warm here. From the north can be heard a steady
+125 roar, so loud that the entire cave seems to be trembling. Another
+125 passage leads south, and a low crawl goes east.
+126 You are on the edge of a breath-taking view. Far below you is an
+126 active volcano, from which great gouts of molten lava come surging
+126 out, cascading back down into the depths. The glowing rock fills the
+126 farthest reaches of the cavern with a blood-red glare, giving every-
+126 thing an eerie, macabre appearance. The air is filled with flickering
+126 sparks of ash and a heavy smell of brimstone. The walls are hot to
+126 the touch, and the thundering of the volcano drowns out all other
+126 sounds. Embedded in the jagged roof far overhead are myriad twisted
+126 formations composed of pure white alabaster, which scatter the murky
+126 light into sinister apparitions upon the walls. To one side is a deep
+126 gorge, filled with a bizarre chaos of tortured rock which seems to
+126 have been crafted by the devil himself. An immense river of fire
+126 crashes out from the depths of the volcano, burns its way through the
+126 gorge, and plummets into a bottomless pit far off to your left. To
+126 the right, an immense geyser of blistering steam erupts continuously
+126 from a barren island in the center of a sulfurous lake, which bubbles
+126 ominously. The far right wall is aflame with an incandescence of its
+126 own, which lends an additional infernal splendor to the already
+126 hellish scene. A dark, foreboding passage exits to the south.
+127 You are in a small chamber filled with large boulders. The walls are
+127 very warm, causing the air in the room to be almost stifling from the
+127 heat. The only exit is a crawl heading west, through which is coming
+127 a low rumbling.
+128 You are walking along a gently sloping north/south passage lined with
+128 oddly shaped limestone formations.
+129 You are standing at the entrance to a large, barren room. A sign
+129 posted above the entrance reads: "Caution! Bear in room!"
+130 You are inside a barren room. The center of the room is completely
+130 empty except for some dust. Marks in the dust lead away toward the
+130 far end of the room. The only exit is the way you came in.
+131 You are in a maze of twisting little passages, all different.
+132 You are in a little maze of twisty passages, all different.
+133 You are in a twisting maze of little passages, all different.
+134 You are in a twisting little maze of passages, all different.
+135 You are in a twisty little maze of passages, all different.
+136 You are in a twisty maze of little passages, all different.
+137 You are in a little twisty maze of passages, all different.
+138 You are in a maze of little twisting passages, all different.
+139 You are in a maze of little twisty passages, all different.
+140 Dead end
+-1 End
+2
+1 You're at end of road again.
+2 You're at hill in road.
+3 You're inside building.
+4 You're in valley.
+5 You're in forest.
+6 You're in forest.
+7 You're at slit in streambed.
+8 You're outside grate.
+9 You're below the grate.
+10 You're in Cobble Crawl.
+11 You're in Debris Room.
+13 You're in Bird Chamber.
+14 You're at top of small pit.
+15 You're in Hall of Mists.
+17 You're on east bank of fissure.
+18 You're in Nugget of Gold Room.
+19 You're in Hall of Mt King.
+23 You're at west end of Twopit Room.
+24 You're in east pit.
+25 You're in west pit.
+33 You're at "Y2".
+35 You're at window on pit.
+36 You're in dirty passage.
+39 You're in Dusty Rock room.
+41 You're at west end of Hall of Mists.
+57 You're at brink of pit.
+60 You're at east end of Long Hall.
+61 You're at west end of Long Hall.
+64 You're at Complex Junction.
+66 You're in Swiss Cheese room.
+67 You're at east end of Twopit Room.
+68 You're in Slab Room.
+71 You're at junction of three secret canyons.
+74 You're in secret E/W canyon above tight canyon.
+88 You're in narrow corridor.
+91 You're at steep incline above large room.
+92 You're in Giant Room.
+95 You're in cavern with waterfall.
+96 You're in Soft Room.
+97 You're in Oriental Room.
+98 You're in Misty Cavern.
+99 You're in Alcove.
+100 You're in Plover Room.
+101 You're in Dark-Room.
+102 You're in Arched Hall.
+103 You're in Shell Room.
+106 You're in Anteroom.
+108 You're at Witt's End.
+109 You're in Mirror Canyon.
+110 You're at window on pit.
+111 You're at top of stalactite.
+113 You're at Reservoir.
+115 You're at NE end.
+116 You're at SW end.
+117 You're on SW side of chasm.
+118 You're in sloping corridor.
+122 You're on NE side of chasm.
+123 You're in corridor.
+124 You're at fork in path.
+125 You're at junction with warm walls.
+126 You're at Breath-taking View.
+127 You're in Chamber of Boulders.
+128 You're in limestone passage.
+129 You're in front of barren room.
+130 You're in Barren Room.
+-1
+3
+1 2 2 44 29
+1 3 3 12 19 43
+1 4 5 13 14 46 30
+1 5 6 45 43
+1 8 63
+2 1 2 12 7 43 45 30
+2 5 6 45 46
+3 1 3 11 32 44
+3 11 62
+3 33 65
+3 79 5 14
+4 1 4 12 45
+4 5 6 43 44 29
+4 7 5 46 30
+4 8 63
+5 4 9 43 30
+5 50005 6 7 45
+5 6 6
+5 5 44 46
+6 1 2 45
+6 4 9 43 44 30
+6 5 6 46
+7 1 12
+7 4 4 45
+7 5 6 43 44
+7 8 5 15 16 46
+7 595 60 14 30
+8 5 6 43 44 46
+8 1 12
+8 7 4 13 45
+8 303009 3 19 30
+8 593 3
+9 303008 11 29
+9 593 11
+9 10 17 18 19 44
+9 14 31
+9 11 51
+10 9 11 20 21 43
+10 11 19 22 44 51
+10 14 31
+11 303008 63
+11 9 64
+11 10 17 18 23 24 43
+11 12 25 19 29 44
+11 3 62
+11 14 31
+12 303008 63
+12 9 64
+12 11 30 43 51
+12 13 19 29 44
+12 14 31
+13 303008 63
+13 9 64
+13 11 51
+13 12 25 43
+13 14 23 31 44
+14 303008 63
+14 9 64
+14 11 51
+14 13 23 43
+14 150020 30 31 34
+14 15 30
+14 16 33 44
+15 18 36 46
+15 17 7 38 44
+15 19 10 30 45
+15 150022 29 31 34 35 23 43
+15 14 29
+15 34 55
+16 14 1
+17 15 38 43
+17 312596 39
+17 412021 7
+17 412597 41 42 44 69
+17 27 41
+18 15 38 11 45
+19 15 10 29 43
+19 311028 45 36
+19 311029 46 37
+19 311030 44 7
+19 32 45
+19 35074 49
+19 211032 49
+19 74 66
+20 0 1
+21 0 1
+22 15 1
+23 67 43 42
+23 68 44 61
+23 25 30 31
+23 648 52
+24 67 29 11
+25 23 29 11
+25 724031 56
+25 26 56
+26 88 1
+27 312596 39
+27 412021 7
+27 412597 41 42 43 69
+27 17 41
+27 40 45
+27 41 44
+28 19 38 11 46
+28 33 45 55
+28 36 30 52
+29 19 38 11 45
+30 19 38 11 43
+30 62 44 29
+31 524089 1
+31 90 1
+32 19 1
+33 3 65
+33 28 46
+33 34 43 53 54
+33 35 44
+33 159302 71
+33 100 71
+34 33 30 55
+34 15 29
+35 33 43 55
+35 20 39
+36 37 43 17
+36 28 29 52
+36 39 44
+36 65 70
+37 36 44 17
+37 38 30 31 56
+38 37 56 29 11
+38 595 60 14 30 4 5
+39 36 43 23
+39 64 30 52 58
+39 65 70
+40 41 1
+41 42 46 29 23 56
+41 27 43
+41 59 45
+41 60 44 17
+42 41 29
+42 42 45
+42 43 43
+42 45 46
+42 80 44
+43 42 44
+43 44 46
+43 45 43
+44 43 43
+44 48 30
+44 50 46
+44 82 45
+45 42 44
+45 43 45
+45 46 43
+45 47 46
+45 87 29 30
+46 45 44 11
+47 45 43 11
+48 44 29 11
+49 50 43
+49 51 44
+50 44 43
+50 49 44
+50 51 30
+50 52 46
+51 49 44
+51 50 29
+51 52 43
+51 53 46
+52 50 44
+52 51 43
+52 52 46
+52 53 29
+52 55 45
+52 86 30
+53 51 44
+53 52 45
+53 54 46
+54 53 44 11
+55 52 44
+55 55 45
+55 56 30
+55 57 43
+56 55 29 11
+57 13 30 56
+57 55 44
+57 58 46
+57 83 45
+57 84 43
+58 57 43 11
+59 27 1
+60 41 43 29 17
+60 61 44
+60 62 45 30 52
+61 60 43
+61 62 45
+61 100107 46
+62 60 44
+62 63 45
+62 30 43
+62 61 46
+63 62 46 11
+64 39 29 56 59
+64 65 44 70
+64 103 45 74
+64 106 43
+65 64 43
+65 66 44
+65 80556 46
+65 68 61
+65 80556 29
+65 50070 29
+65 39 29
+65 60556 45
+65 75072 45
+65 71 45
+65 80556 30
+65 106 30
+66 65 47
+66 67 44
+66 80556 46
+66 77 25
+66 96 43
+66 50556 50
+66 97 72
+67 66 43
+67 23 44 42
+67 24 30 31
+68 23 46
+68 69 29 56
+68 65 45
+69 68 30 61
+69 331120 46
+69 119 46
+69 109 45
+69 113 75
+70 71 45
+70 65 30 23
+70 111 46
+71 65 48
+71 70 46
+71 110 45
+72 65 70
+72 118 49
+72 73 45
+72 97 48 72
+73 72 46 17 11
+74 19 43
+74 331120 44
+74 121 44
+74 75 30
+75 76 46
+75 77 45
+76 75 45
+77 75 43
+77 78 44
+77 66 45 17
+78 77 46
+79 3 1
+80 42 45
+80 80 44
+80 80 46
+80 81 43
+81 80 44 11
+82 44 46 11
+83 57 46
+83 84 43
+83 85 44
+84 57 45
+84 83 44
+84 114 50
+85 83 43 11
+86 52 29 11
+87 45 29 30
+88 25 30 56 43
+88 20 39
+88 92 44 27
+89 25 1
+90 23 1
+91 95 45 73 23
+91 72 30 56
+92 88 46
+92 93 43
+92 94 45
+93 92 46 27 11
+94 92 46 27 23
+94 309095 45 3 73
+94 611 45
+95 94 46 11
+95 92 27
+95 91 44
+96 66 44 11
+97 66 48
+97 72 44 17
+97 98 29 45 73
+98 97 46 72
+98 99 44
+99 98 50 73
+99 301 43 23
+99 100 43
+100 301 44 23 11
+100 99 44
+100 159302 71
+100 33 71
+100 101 47 22
+101 100 46 71 11
+102 103 30 74 11
+103 102 29 38
+103 104 30
+103 114618 46
+103 115619 46
+103 64 46
+104 103 29 74
+104 105 30
+105 104 29 11
+105 103 74
+106 64 29
+106 65 44
+106 108 43
+107 131 46
+107 132 49
+107 133 47
+107 134 48
+107 135 29
+107 136 50
+107 137 43
+107 138 44
+107 139 45
+107 61 30
+108 95556 43 45 46 47 48 49 50 29 30
+108 106 43
+108 626 44
+109 69 46
+109 113 45 75
+110 71 44
+110 20 39
+111 70 45
+111 40050 30 39 56
+111 50053 30
+111 45 30
+112 131 49
+112 132 45
+112 133 43
+112 134 50
+112 135 48
+112 136 47
+112 137 44
+112 138 30
+112 139 29
+112 140 46
+113 109 46 11 109
+114 84 48
+115 116 49
+116 115 47
+116 593 30
+117 118 49
+117 233660 41 42 69 47
+117 332661 41
+117 303 41
+117 332021 39
+117 596 39
+118 72 30
+118 117 29
+119 69 45 11
+119 653 43 7
+120 69 45
+120 74 43
+121 74 43 11
+121 653 45 7
+122 123 47
+122 233660 41 42 69 49
+122 303 41
+122 596 39
+122 124 77
+122 126 28
+122 129 40
+123 122 44
+123 124 43 77
+123 126 28
+123 129 40
+124 123 44
+124 125 47 36
+124 128 48 37 30
+124 126 28
+124 129 40
+125 124 46 77
+125 126 45 28
+125 127 43 17
+126 125 46 23 11
+126 124 77
+126 610 30 39
+127 125 44 11 17
+127 124 77
+127 126 28
+128 124 45 29 77
+128 129 46 30 40
+128 126 28
+129 128 44 29
+129 124 77
+129 130 43 19 40 3
+129 126 28
+130 129 44 11
+130 124 77
+130 126 28
+131 107 44
+131 132 48
+131 133 50
+131 134 49
+131 135 47
+131 136 29
+131 137 30
+131 138 45
+131 139 46
+131 112 43
+132 107 50
+132 131 29
+132 133 45
+132 134 46
+132 135 44
+132 136 49
+132 137 47
+132 138 43
+132 139 30
+132 112 48
+133 107 29
+133 131 30
+133 132 44
+133 134 47
+133 135 49
+133 136 43
+133 137 45
+133 138 50
+133 139 48
+133 112 46
+134 107 47
+134 131 45
+134 132 50
+134 133 48
+134 135 43
+134 136 30
+134 137 46
+134 138 29
+134 139 44
+134 112 49
+135 107 45
+135 131 48
+135 132 30
+135 133 46
+135 134 43
+135 136 44
+135 137 49
+135 138 47
+135 139 50
+135 112 29
+136 107 43
+136 131 44
+136 132 29
+136 133 49
+136 134 30
+136 135 46
+136 137 50
+136 138 48
+136 139 47
+136 112 45
+137 107 48
+137 131 47
+137 132 46
+137 133 30
+137 134 29
+137 135 50
+137 136 45
+137 138 49
+137 139 43
+137 112 44
+138 107 30
+138 131 43
+138 132 47
+138 133 29
+138 134 44
+138 135 45
+138 136 46
+138 137 48
+138 139 49
+138 112 50
+139 107 49
+139 131 50
+139 132 43
+139 133 44
+139 134 45
+139 135 30
+139 136 48
+139 137 29
+139 138 46
+139 112 47
+140 112 45 11
+-1
+4
+2 road
+2 hill
+3 enter
+4 upstr
+5 downs
+6 fores
+7 forwa
+7 conti
+7 onwar
+8 back
+8 retur
+8 retre
+9 valle
+10 stair
+11 out
+11 outsi
+11 exit
+11 leave
+12 build
+12 house
+13 gully
+14 strea
+15 rock
+16 bed
+17 crawl
+18 cobbl
+19 inwar
+19 insid
+19 in
+20 surfa
+21 null
+21 nowhe
+22 dark
+23 passa
+23 tunne
+24 low
+25 canyo
+26 awkwa
+27 giant
+28 view
+29 upwar
+29 up
+29 u
+29 above
+29 ascen
+30 d
+30 downw
+30 down
+30 desce
+31 pit
+32 outdo
+33 crack
+34 steps
+35 dome
+36 left
+37 right
+38 hall
+39 jump
+40 barre
+41 over
+42 acros
+43 east
+43 e
+44 west
+44 w
+45 north
+45 n
+46 south
+46 s
+47 ne
+48 se
+49 sw
+50 nw
+51 debri
+52 hole
+53 wall
+54 broke
+55 y2
+56 climb
+57 look
+57 exami
+57 touch
+57 descr
+58 floor
+59 room
+60 slit
+61 slab
+61 slabr
+62 xyzzy
+63 depre
+64 entra
+65 plugh
+66 secre
+67 cave
+69 cross
+70 bedqu
+71 plove
+72 orien
+73 caver
+74 shell
+75 reser
+76 main
+76 offic
+77 fork
+1001 keys
+1001 key
+1002 lamp
+1002 headl
+1002 lante
+1003 grate
+1004 cage
+1005 wand
+1005 rod
+1006 wand
+1006 rod (must be next object after "real" rod)
+1007 steps
+1008 bird
+1009 door
+1010 pillo
+1010 velve
+1011 snake
+1012 fissu
+1013 table
+1014 clam
+1015 oyste
+1016 magaz
+1016 issue
+1016 spelu
+1016 "spel
+1017 dwarf
+1017 dwarv
+1018 knife
+1018 knive
+1019 food
+1019 ratio
+1020 bottl
+1020 jar
+1021 water
+1021 h2o
+1022 oil
+1023 mirro
+1024 plant
+1024 beans
+1025 plant (must be next object after "real" plant)
+1026 stala
+1027 shado
+1027 figur
+1028 axe
+1029 drawi
+1030 pirat
+1031 drago
+1032 chasm
+1033 troll
+1034 troll (must be next object after "real" troll)
+1035 bear
+1036 messa
+1037 volca
+1037 geyse (same as volcano)
+1038 machi
+1038 vendi
+1039 batte
+1040 carpe
+1040 moss
+1050 gold
+1050 nugge
+1051 diamo
+1052 silve
+1052 bars
+1053 jewel
+1054 coins
+1055 chest
+1055 box
+1055 treas
+1056 eggs
+1056 egg
+1056 nest
+1057 tride
+1058 vase
+1058 ming
+1058 shard
+1058 potte
+1059 emera
+1060 plati
+1060 pyram
+1061 pearl
+1062 rug
+1062 persi
+1063 spice
+1064 chain
+2001 carry
+2001 take
+2001 keep
+2001 catch
+2001 steal
+2001 captu
+2001 get
+2001 tote
+2002 drop
+2002 relea
+2002 free
+2002 disca
+2002 dump
+2003 say
+2003 chant
+2003 sing
+2003 utter
+2003 mumbl
+2004 unloc
+2004 open
+2005 nothi
+2006 lock
+2006 close
+2007 light
+2007 on
+2008 extin
+2008 off
+2009 wave
+2009 shake
+2009 swing
+2010 calm
+2010 placa
+2010 tame
+2011 walk
+2011 run
+2011 trave
+2011 go
+2011 proce
+2011 conti
+2011 explo
+2011 goto
+2011 follo
+2011 turn
+2012 attac
+2012 kill
+2012 slay
+2012 fight
+2012 hit
+2012 strik
+2013 pour
+2014 eat
+2014 devou
+2015 drink
+2016 rub
+2017 throw
+2017 toss
+2018 quit
+2019 find
+2019 where
+2020 inven
+2020 inv
+2021 feed
+2022 fill
+2023 blast
+2023 deton
+2023 ignit
+2023 blowu
+2024 score
+2025 fee
+2025 fie
+2025 foe
+2025 foo
+2025 fum
+2026 brief
+2027 read
+2027 perus
+2028 break
+2028 shatt
+2028 smash
+2029 wake
+2029 distu
+2030 suspe
+2030 pause
+2030 save
+2031 hours
+3001 fee
+3002 fie
+3003 foe
+3004 foo
+3005 fum
+3050 sesam
+3050 opens
+3050 abra
+3050 abrac
+3050 shaza
+3050 hocus
+3050 pocus
+3051 help
+3051 ?
+3064 tree
+3064 trees
+3066 dig
+3066 excav
+3068 lost
+3069 mist
+3079 fuck
+3139 stop
+3142 info
+3142 infor
+3147 swim
+-1
+5
+1 Set of keys
+000 There are some keys on the ground here.
+2 Brass lantern
+000 There is a shiny brass lamp nearby.
+100 There is a lamp shining nearby.
+3 *Grate
+000 The grate is locked.
+100 The grate is open.
+4 Wicker cage
+000 There is a small wicker cage discarded nearby.
+5 Black rod
+000 A three foot black rod with a rusty star on an end lies nearby.
+6 Black rod
+000 A three foot black rod with a rusty mark on an end lies nearby.
+7 *Steps
+000 Rough stone steps lead down the pit.
+100 Rough stone steps lead up the dome.
+8 Little bird in cage
+000 A cheerful little bird is sitting here singing.
+100 There is a little bird in the cage.
+9 *Rusty door
+000 The way north is barred by a massive, rusty, iron door.
+100 The way north leads through a massive, rusty, iron door.
+10 Velvet pillow
+000 A small velvet pillow lies on the floor.
+11 *Snake
+000 A huge green fierce snake bars the way!
+100 >$< (Chased away)
+12 *Fissure
+000 >$<
+100 A crystal bridge now spans the fissure.
+200 The crystal bridge has vanished!
+13 *Stone tablet
+000 A massive stone tablet embedded in the wall reads:
+000 "Congratulations on bringing light into the Dark-Room!"
+14 Giant clam >grunt!<
+000 There is an enormous clam here with its shell tightly closed.
+15 Giant oyster >groan!<
+000 There is an enormous oyster here with its shell tightly closed.
+100 Interesting. There seems to be something written on the underside of
+100 The oyster.
+16 "Spelunker Today"
+000 There are a few recent issues of "Spelunker Today" magazine here.
+19 Tasty food
+000 There is food here.
+20 Small bottle
+000 There is a bottle of water here.
+100 There is an empty bottle here.
+200 There is a bottle of oil here.
+21 Water in the bottle
+22 Oil in the bottle
+23 *Mirror
+000 >$<
+24 *Plant
+000 There is a tiny little plant in the pit, murmuring "Water, water, ..."
+100 The plant spurts into furious growth for a few seconds.
+200 There is a 12-foot-tall beanstalk stretching up out of the pit,
+200 bellowing "WATER!! WATER!!"
+300 The plant grows explosively, almost filling the bottom of the pit.
+400 There is a gigantic beanstalk stretching all the way up to the hole.
+500 You've over-watered the plant! It's shriveling up! It's, it's...
+25 *Phony plant (seen in twopit room only when tall enough)
+000 >$<
+100 The top of a 12-foot-tall beanstalk is poking out of the west pit.
+200 There is a huge beanstalk growing out of the west pit up to the hole.
+26 *Stalactite
+000 >$<
+27 *Shadowy figure
+000 The shadowy figure seems to be trying to attract your attention.
+28 Dwarf's axe
+000 There is a little axe here.
+100 There is a little axe lying beside the bear.
+29 *Cave drawings
+000 >$<
+30 *Pirate
+000 >$<
+31 *Dragon
+000 A huge green fierce dragon bars the way!
+100 Congratulations! You have just vanquished a dragon with your bare
+100 hands! (Unbelievable, isn't it?)
+200 The body of a huge green dead dragon is lying off to one side.
+32 *Chasm
+000 A rickety wooden bridge extends across the chasm, vanishing into the
+000 mist. A sign posted on the bridge reads, "Stop! Pay troll!"
+100 The wreckage of a bridge (and a dead bear) can be seen at the bottom
+100 of the chasm.
+33 *Troll
+000 A burly troll stands by the bridge and insists you throw him a
+000 treasure before you may cross.
+100 The troll steps out from beneath the bridge and blocks your way.
+200 >$< (Chased away)
+34 *Phony troll
+000 The troll is nowhere to be seen.
+35 >$< (Bear uses rtext 141)
+000 There is a ferocious cave bear eying you from the far end of the room!
+100 There is a gentle cave bear sitting placidly in one corner.
+200 There is a contented-looking bear wandering about nearby.
+300 >$< (Dead)
+36 *Message in second maze
+000 There is a message scrawled in the dust in a flowery script, reading:
+000 "This is not the maze where the pirate leaves his treasure chest."
+37 *Volcano and/or geyser
+000 >$<
+38 *Vending machine
+000 There is a massive vending machine here. The instructions on it read:
+000 "Drop coins here to receive fresh batteries."
+39 Batteries
+000 There are fresh batteries here.
+100 Some worn-out batteries have been discarded nearby.
+40 *Carpet and/or moss
+000 >$<
+50 Large gold nugget
+000 There is a large sparkling nugget of gold here!
+51 Several diamonds
+000 There are diamonds here!
+52 Bars of silver
+000 There are bars of silver here!
+53 Precious jewelry
+000 There is precious jewelry here!
+54 Rare coins
+000 There are many coins here!
+55 Treasure chest
+000 The pirate's treasure chest is here!
+56 Golden eggs
+000 There is a large nest here, full of golden eggs!
+100 The nest of golden eggs has vanished!
+200 Done!
+57 Jeweled trident
+000 There is a jewel-encrusted trident here!
+58 Ming vase
+000 There is a delicate, precious, Ming vase here!
+100 The vase is now resting, delicately, on a velvet pillow.
+200 The floor is littered with worthless shards of pottery.
+300 The Ming vase drops with a delicate crash.
+59 Egg-sized emerald
+000 There is an emerald here the size of a plover's egg!
+60 Platinum pyramid
+000 There is a platinum pyramid here, 8 inches on a side!
+61 Glistening pearl
+000 Off to one side lies a glistening pearl!
+62 Persian rug
+000 There is a Persian rug spread out on the floor!
+100 The dragon is sprawled out on a Persian rug!!
+63 Rare spices
+000 There are rare spices here!
+64 Golden chain
+000 There is a golden chain lying in a heap on the floor!
+100 The bear is locked to the wall with a golden chain!
+200 There is a golden chain locked to the wall!
+-1
+6
+1 Somewhere nearby is Colossal Cave, where others have found fortunes in
+1 treasure and gold, though it is rumored that some who enter are never
+1 seen again. Magic is said to work in the cave. I will be your eyes
+1 and hands. Direct me with commands of 1 or 2 words. I should warn
+1 you that I look at only the first five letters of each word, so you'll
+1 have to enter "northeast" as "ne" to distinguish it from "north".
+1 (Should you get stuck, type "help" for some general hints. For
+1 information on how to end your adventure, etc., type "info".)
+1 - - -
+1 This program was originally developed by Will Crowther. Most of the
+1 features of the current program were added by Don Woods. Address
+1 complaints about the UNIX version to Jim Gillogly (jim@rand.org).
+2 A little dwarf with a big knife blocks your way.
+3 A little dwarf just walked around a corner, saw you, threw a little
+3 axe at you (which missed), cursed, and ran away.
+4 There is a threatening little dwarf in the room with you!
+5 One sharp nasty knife is thrown at you!
+6 None of them hit you!
+7 One of them gets you!
+8 A hollow voice says "Plugh".
+9 There is no way to go that direction.
+10 I am unsure how you are facing. Use compass points or nearby objects.
+11 I don't know in from out here. Use compass points or name something
+11 in the general direction you want to go.
+12 I don't know how to apply that word here.
+13 I don't understand that!
+14 I'm game. Would you care to explain how?
+15 Sorry, but I am not allowed to give more detail. I will repeat the
+15 long description of your location.
+16 It is now pitch dark. If you proceed you will likely fall into a pit.
+17 If you prefer, simply type w rather than west.
+18 Are you trying to catch the bird?
+19 The bird is frightened right now and you cannot catch it no matter
+19 what you try. Perhaps you might try later.
+20 Are you trying to somehow deal with the snake?
+21 You can't kill the snake, or drive it away, or avoid it, or anything
+21 like that. There is a way to get by, but you don't have the necessary
+21 resources right now.
+22 Do you really want to quit now?
+23 You fell into a pit and broke every bone in your body!
+24 You are already carrying it!
+25 You can't be serious!
+26 The bird was unafraid when you entered, but as you approach it becomes
+26 disturbed and you cannot catch it.
+27 You can catch the bird, but you cannot carry it.
+28 There is nothing here with a lock!
+29 You aren't carrying it!
+30 The little bird attacks the green snake, and in an astounding flurry
+30 drives the snake away.
+31 You have no keys!
+32 It has no lock.
+33 I don't know how to lock or unlock such a thing.
+34 It was already locked.
+35 The grate is now locked.
+36 The grate is now unlocked.
+37 It was already unlocked.
+38 You have no source of light.
+39 Your lamp is now on.
+40 Your lamp is now off.
+41 There is no way to get past the bear to unlock the chain, which is
+41 probably just as well.
+42 Nothing happens.
+43 Where?
+44 There is nothing here to attack.
+45 The little bird is now dead. Its body disappears.
+46 Attacking the snake both doesn't work and is very dangerous.
+47 You killed a little dwarf.
+48 You attack a little dwarf, but he dodges out of the way.
+49 With what? Your bare hands?
+50 Good try, but that is an old worn-out magic word.
+51 I know of places, actions, and things. Most of my vocabulary
+51 describes places and is used to move you there. To move, try words
+51 like forest, building, downstream, enter, east, west, north, south,
+51 up, or down. I know about a few special objects, like a black rod
+51 hidden in the cave. These objects can be manipulated using some of
+51 the action words that I know. Usually you will need to give both the
+51 object and action words (in either order), but sometimes I can infer
+51 the object from the verb alone. Some objects also imply verbs; in
+51 particular, "inventory" implies "take inventory", which causes me to
+51 give you a list of what you're carrying. The objects have side
+51 effects; for instance, the rod scares the bird. Usually people having
+51 trouble moving just need to try a few more words. Usually people
+51 trying unsuccessfully to manipulate an object are attempting something
+51 beyond their (or my!) capabilities and should try a completely
+51 different tack. To speed the game you can sometimes move long
+51 distances with a single word. For example, "building" usually gets
+51 you to the building from anywhere above ground except when lost in the
+51 forest. Also, note that cave passages turn a lot, and that leaving a
+51 room to the north does not guarantee entering the next from the south.
+51 Good luck!
+52 It misses!
+53 It gets you!
+54 OK
+55 You can't unlock the keys.
+56 You have crawled around in some little holes and wound up back in the
+56 main passage.
+57 I don't know where the cave is, but hereabouts no stream can run on
+57 the surface for long. I would try the stream.
+58 I need more detailed instructions to do that.
+59 I can only tell you what you see as you move about and manipulate
+59 things. I cannot tell you where remote things are.
+60 I don't know that word.
+61 What?
+62 Are you trying to get into the cave?
+63 The grate is very solid and has a hardened steel lock. You cannot
+63 enter without a key, and there are no keys nearby. I would recommend
+63 looking elsewhere for the keys.
+64 The trees of the forest are large hardwood oak and maple, with an
+64 occasional grove of pine or spruce. There is quite a bit of under-
+64 growth, largely birch and ash saplings plus nondescript bushes of
+64 various sorts. This time of year visibility is quite restricted by
+64 all the leaves, but travel is quite easy if you detour around the
+64 spruce and berry bushes.
+65 Welcome to Adventure!! Would you like instructions?
+66 Digging without a shovel is quite impractical. Even with a shovel
+66 progress is unlikely.
+67 Blasting requires dynamite.
+68 I'm as confused as you are.
+69 Mist is a white vapor, usually water, seen from time to time in
+69 caverns. It can be found anywhere but is frequently a sign of a deep
+69 pit leading down to water.
+70 Your feet are now wet.
+71 I think I just lost my appetite.
+72 Thank you, it was delicious!
+73 You have taken a drink from the stream. The water tastes strongly of
+73 minerals, but is not unpleasant. It is extremely cold.
+74 The bottle of water is now empty.
+75 Rubbing the electric lamp is not particularly rewarding. Anyway,
+75 nothing exciting happens.
+76 Peculiar. Nothing unexpected happens.
+77 Your bottle is empty and the ground is wet.
+78 You can't pour that.
+79 Watch it!
+80 Which way?
+81 Oh dear, you seem to have gotten yourself killed. I might be able to
+81 help you out, but I've never really done this before. Do you want me
+81 to try to reincarnate you?
+82 All right. But don't blame me if something goes wr......
+82 --- Poof!! ---
+82 You are engulfed in a cloud of orange smoke. Coughing and gasping,
+82 you emerge from the smoke and find....
+83 You clumsy oaf, you've done it again! I don't know how long I can
+83 keep this up. Do you want me to try reincarnating you again?
+84 Okay, now where did I put my orange smoke?.... >poof!<
+84 Everything disappears in a dense cloud of orange smoke.
+85 Now you've really done it! I'm out of orange smoke! You don't expect
+85 me to do a decent reincarnation without any orange smoke, do you?
+86 Okay, if you're so smart, do it yourself! I'm leaving!
+90 >>> Messages 81 thru 90 are reserved for "obituaries". <<<
+91 Sorry, but I no longer seem to remember how it was you got here.
+92 You can't carry anything more. You'll have to drop something first.
+93 You can't go through a locked steel grate!
+94 I believe what you want is right here with you.
+95 You don't fit through a two-inch slit!
+96 I respectfully suggest you go across the bridge instead of jumping.
+97 There is no way across the fissure.
+98 You're not carrying anything.
+99 You are currently holding the following:
+100 It's not hungry (it's merely pinin' for the fjords). Besides, you
+100 have no bird seed.
+101 The snake has now devoured your bird.
+102 There's nothing here it wants to eat (except perhaps you).
+103 You fool, dwarves eat only coal! Now you've made him *really* mad!!
+104 You have nothing in which to carry it.
+105 Your bottle is already full.
+106 There is nothing here with which to fill the bottle.
+107 Your bottle is now full of water.
+108 Your bottle is now full of oil.
+109 You can't fill that.
+110 Don't be ridiculous!
+111 The door is extremely rusty and refuses to open.
+112 The plant indignantly shakes the oil off its leaves and asks, "water?"
+113 The hinges are quite thoroughly rusted now and won't budge.
+114 The oil has freed up the hinges so that the door will now move,
+114 although it requires some effort.
+115 The plant has exceptionally deep roots and cannot be pulled free.
+116 The dwarves' knives vanish as they strike the walls of the cave.
+117 Something you're carrying won't fit through the tunnel with you.
+117 You'd best take inventory and drop something.
+118 You can't fit this five-foot clam through that little passage!
+119 You can't fit this five-foot oyster through that little passage!
+120 I advise you to put down the clam before opening it. >strain!<
+121 I advise you to put down the oyster before opening it. >wrench!<
+122 You don't have anything strong enough to open the clam.
+123 You don't have anything strong enough to open the oyster.
+124 A glistening pearl falls out of the clam and rolls away. Goodness,
+124 this must really be an oyster. (I never was very good at identifying
+124 bivalves.) Whatever it is, it has now snapped shut again.
+125 The oyster creaks open, revealing nothing but oyster inside. It
+125 promptly snaps shut again.
+126 You have crawled around in some little holes and found your way
+126 blocked by a recent cave-in. You are now back in the main passage.
+127 There are faint rustling noises from the darkness behind you.
+128 Out from the shadows behind you pounces a bearded pirate! "Har, har,"
+128 he chortles, "I'll just take all this booty and hide it away with me
+128 chest deep in the maze!" He snatches your treasure and vanishes into
+128 the gloom.
+129 A sepulchral voice reverberating through the cave, says, "Cave closing
+129 soon. All adventurers exit immediately through Main Office."
+130 A mysterious recorded voice groans into life and announces:
+130 "This exit is closed. Please leave via Main Office."
+131 It looks as though you're dead. Well, seeing as how it's so close to
+131 closing time anyway, I think we'll just call it a day.
+132 The sepulchral voice intones, "The cave is now closed." As the echoes
+132 fade, there is a blinding flash of light (and a small puff of orange
+132 smoke). . . . As your eyes refocus, you look around and find...
+133 There is a loud explosion, and a twenty-foot hole appears in the far
+133 wall, burying the dwarves in the rubble. You march through the hole
+133 and find yourself in the Main Office, where a cheering band of
+133 friendly elves carry the conquering adventurer off into the sunset.
+134 There is a loud explosion, and a twenty-foot hole appears in the far
+134 wall, burying the snakes in the rubble. A river of molten lava pours
+134 in through the hole, destroying everything in its path, including you!
+135 There is a loud explosion, and you are suddenly splashed across the
+135 walls of the room.
+136 The resulting ruckus has awakened the dwarves. There are now several
+136 threatening little dwarves in the room with you! Most of them throw
+136 knives at you! All of them get you!
+137 Oh, leave the poor unhappy bird alone.
+138 I dare say whatever you want is around here somewhere.
+139 I don't know the word "stop". Use "quit" if you want to give up.
+140 You can't get there from here.
+141 You are being followed by a very large, tame bear.
+142 If you want to end your adventure early, say "quit". To suspend your
+142 adventure such that you can continue later, say "suspend" (or "pause"
+142 or "save"). To see what hours the cave is normally open, say "hours".
+142 To see how well you're doing, say "score". To get full credit for a
+142 treasure, you must have left it safely in the building, though you get
+142 partial credit just for locating it. You lose points for getting
+142 killed, or for quitting, though the former costs you more. There are
+142 also points based on how much (if any) of the cave you've managed to
+142 explore; in particular, there is a large bonus just for getting in (to
+142 distinguish the beginners from the rest of the pack), and there are
+142 other ways to determine whether you've been through some of the more
+142 harrowing sections. If you think you've found all the treasures, just
+142 keep exploring for a while. If nothing interesting happens, you
+142 haven't found them all yet. If something interesting *does* happen,
+142 it means you're getting a bonus and have an opportunity to garner many
+142 more points in the Master's Section. I may occasionally offer hints
+142 if you seem to be having trouble. If I do, I'll warn you in advance
+142 how much it will affect your score to accept the hints. Finally, to
+142 save paper, you may specify "brief", which tells me never to repeat
+142 the full description of a place unless you explicitly ask me to.
+143 Do you indeed wish to quit now?
+144 There is nothing here with which to fill the vase.
+145 The sudden change in temperature has delicately shattered the vase.
+146 It is beyond your power to do that.
+147 I don't know how.
+148 It is too far up for you to reach.
+149 You killed a little dwarf. The body vanishes in a cloud of greasy
+149 black smoke.
+150 The shell is very strong and is impervious to attack.
+151 What's the matter, can't you read? Now you'd best start over.
+152 The axe bounces harmlessly off the dragon's thick scales.
+153 The dragon looks rather nasty. You'd best not try to get by.
+154 The little bird attacks the green dragon, and in an astounding flurry
+154 gets burnt to a cinder. The ashes blow away.
+155 On what?
+156 Okay, from now on I'll only describe a place in full the first time
+156 you come to it. To get the full description, say "look".
+157 Trolls are close relatives with the rocks and have skin as tough as
+157 that of a rhinoceros. The troll fends off your blows effortlessly.
+158 The troll deftly catches the axe, examines it carefully, and tosses it
+158 back, declaring, "Good workmanship, but it's not valuable enough."
+159 The troll catches your treasure and scurries away out of sight.
+160 The troll refuses to let you cross.
+161 There is no longer any way across the chasm.
+162 Just as you reach the other side, the bridge buckles beneath the
+162 weight of the bear, which was still following you around. You
+162 scrabble desperately for support, but as the bridge collapses you
+162 stumble back and fall into the chasm.
+163 The bear lumbers toward the troll, who lets out a startled shriek and
+163 scurries away. The bear soon gives up the pursuit and wanders back.
+164 The axe misses and lands near the bear where you can't get at it.
+165 With what? Your bare hands? Against *his* bear hands??
+166 The bear is confused; he only wants to be your friend.
+167 For crying out loud, the poor thing is already dead!
+168 The bear eagerly wolfs down your food, after which he seems to calm
+168 down considerably and even becomes rather friendly.
+169 The bear is still chained to the wall.
+170 The chain is still locked.
+171 The chain is now unlocked.
+172 The chain is now locked.
+173 There is nothing here to which the chain can be locked.
+174 There is nothing here to eat.
+175 Do you want the hint?
+176 Do you need help getting out of the maze?
+177 You can make the passages look less alike by dropping things.
+178 Are you trying to explore beyond the Plover Room?
+179 There is a way to explore that region without having to worry about
+179 falling into a pit. None of the objects available is immediately
+179 useful in discovering the secret.
+180 Do you need help getting out of here?
+181 Don't go west.
+182 Gluttony is not one of the troll's vices. Avarice, however, is.
+183 Your lamp is getting dim. You'd best start wrapping this up, unless
+183 You can find some fresh batteries. I seem to recall there's a vending
+183 machine in the maze. Bring some coins with you.
+184 Your lamp has run out of power.
+185 There's not much point in wandering around out here, and you can't
+185 explore the cave without a lamp. So let's just call it a day.
+186 There are faint rustling noises from the darkness behind you. As you
+186 turn toward them, the beam of your lamp falls across a bearded pirate.
+186 He is carrying a large chest. "Shiver me timbers!" he cries, "I've
+186 been spotted! I'd best hie meself off to the maze to hide me chest!"
+186 With that, he vanishes into the gloom.
+187 Your lamp is getting dim. You'd best go back for those batteries.
+188 Your lamp is getting dim. I'm taking the liberty of replacing the
+188 batteries.
+189 Your lamp is getting dim, and you're out of spare batteries. You'd
+189 best start wrapping this up.
+190 I'm afraid the magazine is written in Dwarvish.
+191 "This is not the maze where the pirate leaves his treasure chest."
+192 Hmmm, this looks like a clue, which means it'll cost you 10 points to
+192 read it. Should I go ahead and read it anyway?
+193 It says, "there is something strange about this place, such that one
+193 of the words I've always known now has a new effect."
+194 It says the same thing it did before.
+195 I'm afraid I don't understand.
+196 "Congratulations on bringing light into the Dark-Room!"
+197 You strike the mirror a resounding blow, whereupon it shatters into a
+197 myriad tiny fragments.
+198 You have taken the vase and hurled it delicately to the ground.
+199 You prod the nearest dwarf, who wakes up grumpily, takes one look at
+199 you, curses, and grabs for his axe.
+200 Is this acceptable?
+201 There's no point in suspending a demonstration game.
+202 You awaken only to discover your bits have been dissolving while you
+202 slept. You disappear in a cloud of greasy black smoke.
+-1
+7
+1 3
+2 3
+3 8 9
+4 10
+5 11
+6 0
+7 14 15
+8 13
+9 94 -1
+10 96
+11 19 -1
+12 17 27
+13 101 -1
+14 103
+15 0
+16 106
+17 0 -1
+18 0
+19 3
+20 3
+21 0
+22 0
+23 109 -1
+24 25 -1
+25 23 67
+26 111 -1
+27 35 110
+28 0
+29 97 -1
+30 0 -1
+31 119 121
+32 117 122
+33 117 122
+34 0 0
+35 130 -1
+36 0 -1
+37 126 -1
+38 140 -1
+39 0
+40 96 -1
+50 18
+51 27
+52 28
+53 29
+54 30
+55 0
+56 92
+57 95
+58 97
+59 100
+60 101
+61 0
+62 119 121
+63 127
+64 130 -1
+-1
+8
+1 24
+2 29
+3 0
+4 33
+5 0
+6 33
+7 38
+8 38
+9 42
+10 14
+11 43
+12 110
+13 29
+14 110
+15 73
+16 75
+17 29
+18 13
+19 59
+20 59
+21 174
+22 109
+23 67
+24 13
+25 147
+26 155
+27 195
+28 146
+29 110
+30 13
+31 13
+-1
+9
+0 1 2 3 4 5 6 7 8 9 10
+0 100 115 116 126
+2 1 3 4 7 38 95 113 24
+1 24
+3 46 47 48 54 56 58 82 85 86
+3 122 123 124 125 126 127 128 129 130
+4 8
+5 13
+6 19
+7 42 43 44 45 46 47 48 49 50 51
+7 52 53 54 55 56 80 81 82 86 87
+8 99 100 101
+9 108
+-1
+10
+35 You are obviously a rank amateur. Better luck next time.
+100 Your score qualifies you as a Novice class Adventurer.
+130 You have achieved the rating: "Experienced Adventurer".
+200 You may now consider yourself a "Seasoned Adventurer".
+250 You have reached "Junior Master" status.
+300 Your score puts you in Master Adventurer Class C.
+330 Your score puts you in Master Adventurer Class B.
+349 Your score puts you in Master Adventurer Class A.
+9999 All of Adventuredom gives tribute to you, Adventurer Grandmaster!
+-1
+11
+2 9999 10 0 0
+3 9999 5 0 0
+4 4 2 62 63
+5 5 2 18 19
+6 8 2 20 21
+7 75 4 176 177
+8 25 5 178 179
+9 20 3 180 181
+-1
+12
+1 A large cloud of green smoke appears in front of you. It clears away
+1 to reveal a tall wizard, clothed in grey. He fixes you with a steely
+1 glare and declares, "This adventure has lasted too long." With that
+1 he makes a single pass over you with his hands, and everything around
+1 you fades away into a grey nothingness.
+2 Even wizards have to wait longer than that!
+3 I'm terribly sorry, but Colossal Cave is closed. Our hours are:
+4 Only wizards are permitted within the cave right now.
+5 We do allow visitors to make short explorations during our off hours.
+5 Would you like to do that?
+6 Colossal Cave is open to regular adventurers at the following hours:
+7 Very well.
+8 Only a wizard may continue an adventure this soon.
+9 I suggest you resume your adventure at a later time.
+10 Do you wish to see the hours?
+11 Do you wish to change the hours?
+12 New magic word (null to leave unchanged):
+13 New magic number (null to leave unchanged):
+14 Do you wish to change the message of the day?
+15 Okay. You can save this version now.
+16 Are you a wizard?
+17 Prove it! Say the magic word!
+18 That is not what I thought it was. Do you know what I thought it was?
+19 Oh dear, you really *are* a wizard! Sorry to have bothered you . . .
+20 Foo, you are nothing but a charlatan!
+21 New hours specified by defining "prime time". Give only the hour
+21 (E.g. 14, not 14:00 or 2pm). Enter a negative number after last pair.
+22 New hours for Colossal Cave:
+23 Limit lines to 70 chars. End with null line.
+24 Line too long, retype:
+25 Not enough room for another line. Ending message here.
+26 Do you wish to (re)schedule the next holiday?
+27 To begin how many days from today?
+28 To last how many days (zero if no holiday)?
+29 To be called what (up to 20 characters)?
+30 Too small! Assuming minimum value (45 minutes).
+31 Break out of this and save your core-image.
+32 Be sure to save your core-image...
+-1
+0
+ glorkz 8.1 93/05/31
diff --git a/adventure/hdr.h b/adventure/hdr.h
new file mode 100644
index 00000000..3072f9bd
--- /dev/null
+++ b/adventure/hdr.h
@@ -0,0 +1,164 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * The game adventure was originally written in Fortran by Will Crowther
+ * and Don Woods. It was later translated to C and enhanced by Jim
+ * Gillogly. This code is derived from software contributed to Berkeley
+ * by Jim Gillogly at The Rand Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)hdr.h 8.1 (Berkeley) 5/31/93
+ */
+
+/* ADVENTURE -- Jim Gillogly, Jul 1977
+ * This program is a re-write of ADVENT, written in FORTRAN mostly by
+ * Don Woods of SAIL. In most places it is as nearly identical to the
+ * original as possible given the language and word-size differences.
+ * A few places, such as the message arrays and travel arrays were changed
+ * to reflect the smaller core size and word size. The labels of the
+ * original are reflected in this version, so that the comments of the
+ * fortran are still applicable here.
+ *
+ * The data file distributed with the fortran source is assumed to be called
+ * "glorkz" in the directory where the program is first run.
+ */
+
+/* hdr.h: included by c advent files */
+
+int datfd; /* message file descriptor */
+int delhit;
+int yea;
+extern char data_file[]; /* Virtual data file */
+
+#define TAB 011
+#define LF 012
+#define FLUSHLINE while (getchar()!='\n')
+#define FLUSHLF while (next()!=LF)
+
+int loc,newloc,oldloc,oldlc2,wzdark,gaveup,kq,k,k2;
+char *wd1,*wd2; /* the complete words */
+int verb,obj,spk;
+extern int blklin;
+int saved,savet,mxscor,latncy;
+
+#define SHORT 50 /* How short is a demo game? */
+
+#define MAXSTR 20 /* max length of user's words */
+
+#define HTSIZE 512 /* max number of vocab words */
+struct hashtab /* hash table for vocabulary */
+{ int val; /* word type &index (ktab) */
+ char *atab; /* pointer to actual string */
+} voc[HTSIZE];
+
+#define SEED 1815622 /* "Encryption" seed */
+
+struct text
+#ifdef OLDSTUFF
+{ int seekadr; /* DATFILE must be < 2**16 */
+#endif OLDSTUFF
+{ char *seekadr; /* Msg start in virtual disk */
+ int txtlen; /* length of msg starting here */
+};
+
+#define RTXSIZ 205
+struct text rtext[RTXSIZ]; /* random text messages */
+
+#define MAGSIZ 35
+struct text mtext[MAGSIZ]; /* magic messages */
+
+int clsses;
+#define CLSMAX 12
+struct text ctext[CLSMAX]; /* classes of adventurer */
+int cval[CLSMAX];
+
+struct text ptext[101]; /* object descriptions */
+
+#define LOCSIZ 141 /* number of locations */
+struct text ltext[LOCSIZ]; /* long loc description */
+struct text stext[LOCSIZ]; /* short loc descriptions */
+
+struct travlist /* direcs & conditions of travel*/
+{ struct travlist *next; /* ptr to next list entry */
+ int conditions; /* m in writeup (newloc / 1000) */
+ int tloc; /* n in writeup (newloc % 1000) */
+ int tverb; /* the verb that takes you there*/
+} *travel[LOCSIZ],*tkk; /* travel is closer to keys(...)*/
+
+int atloc[LOCSIZ];
+
+int plac[101]; /* initial object placement */
+int fixd[101],fixed[101]; /* location fixed? */
+
+int actspk[35]; /* rtext msg for verb <n> */
+
+int cond[LOCSIZ]; /* various condition bits */
+
+extern int setbit[16]; /* bit defn masks 1,2,4,... */
+
+int hntmax;
+int hints[20][5]; /* info on hints */
+int hinted[20],hintlc[20];
+
+int place[101], prop[101],link[201];
+int abb[LOCSIZ];
+
+int maxtrs,tally,tally2; /* treasure values */
+
+#define FALSE 0
+#define TRUE 1
+
+int keys,lamp,grate,cage,rod,rod2,steps,/* mnemonics */
+ bird,door,pillow,snake,fissur,tablet,clam,oyster,magzin,
+ dwarf,knife,food,bottle,water,oil,plant,plant2,axe,mirror,dragon,
+ chasm,troll,troll2,bear,messag,vend,batter,
+ nugget,coins,chest,eggs,tridnt,vase,emrald,pyram,pearl,rug,chain,
+ spices,
+ back,look,cave,null,entrnc,dprssn,
+ enter, stream, pour,
+ say,lock,throw,find,invent;
+
+int chloc,chloc2,dseen[7],dloc[7], /* dwarf stuff */
+ odloc[7],dflag,daltlc;
+
+int tk[21],stick,dtotal,attack;
+int turns,lmwarn,iwest,knfloc,detail, /* various flags & counters */
+ abbnum,maxdie,numdie,holdng,dkill,foobar,bonus,clock1,clock2,
+ saved,closng,panic,closed,scorng;
+
+int demo,newloc,limit;
+
+char *malloc();
+char *decr();
+unsigned long crc();
+
+/* We need to get a little tricky to avoid strings */
+#define DECR(a,b,c,d,e) decr('a'+'+','b'+'-','c'+'#','d'+'&','e'+'%')
diff --git a/adventure/init.c b/adventure/init.c
new file mode 100644
index 00000000..77a948af
--- /dev/null
+++ b/adventure/init.c
@@ -0,0 +1,216 @@
+/*-
+ * Copyright (c) 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * The game adventure was originally written in Fortran by Will Crowther
+ * and Don Woods. It was later translated to C and enhanced by Jim
+ * Gillogly. This code is derived from software contributed to Berkeley
+ * by Jim Gillogly at The Rand Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)init.c 8.1 (Berkeley) 6/2/93";
+#endif /* not lint */
+
+/* Re-coding of advent in C: data initialization */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include "hdr.h"
+
+int blklin = TRUE;
+
+int setbit[16] = {1,2,4,010,020,040,0100,0200,0400,01000,02000,04000,
+ 010000,020000,040000,0100000};
+
+
+init(command) /* everything for 1st time run */
+char *command; /* command we were called with */
+{
+ rdata(); /* read data from orig. file */
+ linkdata();
+ poof();
+}
+
+char *decr(a,b,c,d,e)
+char a,b,c,d,e;
+{
+ static char buf[6];
+
+ buf[0] = a-'+';
+ buf[1] = b-'-';
+ buf[2] = c-'#';
+ buf[3] = d-'&';
+ buf[4] = e-'%';
+ buf[5] = 0;
+ return buf;
+}
+
+linkdata() /* secondary data manipulation */
+{ register int i,j;
+
+ /* array linkages */
+ for (i=1; i<=LOCSIZ; i++)
+ if (ltext[i].seekadr!=0 && travel[i] != 0)
+ if ((travel[i]->tverb)==1) cond[i]=2;
+ for (j=100; j>0; j--)
+ if (fixd[j]>0)
+ { drop(j+100,fixd[j]);
+ drop(j,plac[j]);
+ }
+ for (j=100; j>0; j--)
+ { fixed[j]=fixd[j];
+ if (plac[j]!=0 && fixd[j]<=0) drop(j,plac[j]);
+ }
+
+ maxtrs=79;
+ tally=0;
+ tally2=0;
+
+ for (i=50; i<=maxtrs; i++)
+ { if (ptext[i].seekadr!=0) prop[i] = -1;
+ tally -= prop[i];
+ }
+
+ /* define mnemonics */
+ keys = vocab(DECR(k,e,y,s,\0), 1);
+ lamp = vocab(DECR(l,a,m,p,\0), 1);
+ grate = vocab(DECR(g,r,a,t,e), 1);
+ cage = vocab(DECR(c,a,g,e,\0),1);
+ rod = vocab(DECR(r,o,d,\0,\0),1);
+ rod2=rod+1;
+ steps=vocab(DECR(s,t,e,p,s),1);
+ bird = vocab(DECR(b,i,r,d,\0),1);
+ door = vocab(DECR(d,o,o,r,\0),1);
+ pillow= vocab(DECR(p,i,l,l,o), 1);
+ snake = vocab(DECR(s,n,a,k,e), 1);
+ fissur= vocab(DECR(f,i,s,s,u), 1);
+ tablet= vocab(DECR(t,a,b,l,e), 1);
+ clam = vocab(DECR(c,l,a,m,\0),1);
+ oyster= vocab(DECR(o,y,s,t,e), 1);
+ magzin= vocab(DECR(m,a,g,a,z), 1);
+ dwarf = vocab(DECR(d,w,a,r,f), 1);
+ knife = vocab(DECR(k,n,i,f,e), 1);
+ food = vocab(DECR(f,o,o,d,\0),1);
+ bottle= vocab(DECR(b,o,t,t,l), 1);
+ water = vocab(DECR(w,a,t,e,r), 1);
+ oil = vocab(DECR(o,i,l,\0,\0),1);
+ plant = vocab(DECR(p,l,a,n,t), 1);
+ plant2=plant+1;
+ axe = vocab(DECR(a,x,e,\0,\0),1);
+ mirror= vocab(DECR(m,i,r,r,o), 1);
+ dragon= vocab(DECR(d,r,a,g,o), 1);
+ chasm = vocab(DECR(c,h,a,s,m), 1);
+ troll = vocab(DECR(t,r,o,l,l), 1);
+ troll2=troll+1;
+ bear = vocab(DECR(b,e,a,r,\0),1);
+ messag= vocab(DECR(m,e,s,s,a), 1);
+ vend = vocab(DECR(v,e,n,d,i), 1);
+ batter= vocab(DECR(b,a,t,t,e), 1);
+
+ nugget= vocab(DECR(g,o,l,d,\0),1);
+ coins = vocab(DECR(c,o,i,n,s), 1);
+ chest = vocab(DECR(c,h,e,s,t), 1);
+ eggs = vocab(DECR(e,g,g,s,\0),1);
+ tridnt= vocab(DECR(t,r,i,d,e), 1);
+ vase = vocab(DECR(v,a,s,e,\0),1);
+ emrald= vocab(DECR(e,m,e,r,a), 1);
+ pyram = vocab(DECR(p,y,r,a,m), 1);
+ pearl = vocab(DECR(p,e,a,r,l), 1);
+ rug = vocab(DECR(r,u,g,\0,\0),1);
+ chain = vocab(DECR(c,h,a,i,n), 1);
+
+ back = vocab(DECR(b,a,c,k,\0),0);
+ look = vocab(DECR(l,o,o,k,\0),0);
+ cave = vocab(DECR(c,a,v,e,\0),0);
+ null = vocab(DECR(n,u,l,l,\0),0);
+ entrnc= vocab(DECR(e,n,t,r,a), 0);
+ dprssn= vocab(DECR(d,e,p,r,e), 0);
+ enter = vocab(DECR(e,n,t,e,r), 0);
+
+ pour = vocab(DECR(p,o,u,r,\0), 2);
+ say = vocab(DECR(s,a,y,\0,\0),2);
+ lock = vocab(DECR(l,o,c,k,\0),2);
+ throw = vocab(DECR(t,h,r,o,w), 2);
+ find = vocab(DECR(f,i,n,d,\0),2);
+ invent= vocab(DECR(i,n,v,e,n), 2);
+
+ /* initialize dwarves */
+ chloc=114;
+ chloc2=140;
+ for (i=1; i<=6; i++)
+ dseen[i]=FALSE;
+ dflag=0;
+ dloc[1]=19;
+ dloc[2]=27;
+ dloc[3]=33;
+ dloc[4]=44;
+ dloc[5]=64;
+ dloc[6]=chloc;
+ daltlc=18;
+
+ /* random flags & ctrs */
+ turns=0;
+ lmwarn=FALSE;
+ iwest=0;
+ knfloc=0;
+ detail=0;
+ abbnum=5;
+ for (i=0; i<=4; i++)
+ if (rtext[2*i+81].seekadr!=0) maxdie=i+1;
+ numdie=holdng=dkill=foobar=bonus=0;
+ clock1=30;
+ clock2=50;
+ saved=0;
+ closng=panic=closed=scorng=FALSE;
+}
+
+
+
+trapdel() /* come here if he hits a del */
+{ delhit++; /* main checks, treats as QUIT */
+ signal(2,trapdel); /* catch subsequent DELs */
+}
+
+
+startup()
+{
+ time_t time();
+
+ demo=Start(0);
+ srand((int)(time((time_t *)NULL))); /* random seed */
+ /* srand(371); /* non-random seed */
+ hinted[3]=yes(65,1,0);
+ newloc=1;
+ delhit = 0;
+ limit=330;
+ if (hinted[3]) limit=1000; /* better batteries if instrucs */
+}
diff --git a/adventure/io.c b/adventure/io.c
new file mode 100644
index 00000000..c6ae4fe5
--- /dev/null
+++ b/adventure/io.c
@@ -0,0 +1,514 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * The game adventure was originally written in Fortran by Will Crowther
+ * and Don Woods. It was later translated to C and enhanced by Jim
+ * Gillogly. This code is derived from software contributed to Berkeley
+ * by Jim Gillogly at The Rand Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)io.c 8.1 (Berkeley) 5/31/93";
+#endif /* not lint */
+
+/* Re-coding of advent in C: file i/o and user i/o */
+
+#include "hdr.h"
+#include <stdio.h>
+
+
+getin(wrd1,wrd2) /* get command from user */
+char **wrd1,**wrd2; /* no prompt, usually */
+{ register char *s;
+ static char wd1buf[MAXSTR],wd2buf[MAXSTR];
+ int first, numch;
+
+ *wrd1=wd1buf; /* return ptr to internal string*/
+ *wrd2=wd2buf;
+ wd2buf[0]=0; /* in case it isn't set here */
+ for (s=wd1buf, first=1, numch=0;;)
+ { if ((*s=getchar())>='A' && *s <='Z') *s = *s - ('A' -'a');
+ /* convert to upper case */
+ switch(*s) /* start reading from user */
+ { case '\n':
+ *s=0;
+ return;
+ case ' ':
+ if (s==wd1buf||s==wd2buf) /* initial blank */
+ continue;
+ *s=0;
+ if (first) /* finished 1st wd; start 2nd */
+ { first=numch=0;
+ s=wd2buf;
+ break;
+ }
+ else /* finished 2nd word */
+ { FLUSHLINE;
+ *s=0;
+ return;
+ }
+ default:
+ if (++numch>=MAXSTR) /* string too long */
+ { printf("Give me a break!!\n");
+ wd1buf[0]=wd2buf[0]=0;
+ FLUSHLINE;
+ return;
+ }
+ s++;
+ }
+ }
+}
+
+
+confirm(mesg) /* confirm irreversible action */
+char *mesg;
+{ register int result;
+ printf("%s",mesg); /* tell him what he did */
+ if (getchar()=='y') /* was his first letter a 'y'? */
+ result=1;
+ else result=0;
+ FLUSHLINE;
+ return(result);
+}
+
+yes(x,y,z) /* confirm with rspeak */
+int x,y,z;
+{ register int result;
+ register char ch;
+ for (;;)
+ { rspeak(x); /* tell him what we want*/
+ if ((ch=getchar())=='y')
+ result=TRUE;
+ else if (ch=='n') result=FALSE;
+ FLUSHLINE;
+ if (ch=='y'|| ch=='n') break;
+ printf("Please answer the question.\n");
+ }
+ if (result==TRUE) rspeak(y);
+ if (result==FALSE) rspeak(z);
+ return(result);
+}
+
+yesm(x,y,z) /* confirm with mspeak */
+int x,y,z;
+{ register int result;
+ register char ch;
+ for (;;)
+ { mspeak(x); /* tell him what we want*/
+ if ((ch=getchar())=='y')
+ result=TRUE;
+ else if (ch=='n') result=FALSE;
+ FLUSHLINE;
+ if (ch=='y'|| ch=='n') break;
+ printf("Please answer the question.\n");
+ }
+ if (result==TRUE) mspeak(y);
+ if (result==FALSE) mspeak(z);
+ return(result);
+}
+
+/* FILE *inbuf,*outbuf; */
+
+char *inptr; /* Pointer into virtual disk */
+
+int outsw = 0; /* putting stuff to data file? */
+
+char iotape[] = "Ax3F'\003tt$8h\315qer*h\017nGKrX\207:!l";
+char *tape = iotape; /* pointer to encryption tape */
+
+next() /* next virtual char, bump adr */
+{
+ int ch;
+
+ ch=(*inptr ^ random()) & 0xFF; /* Decrypt input data */
+ if (outsw) /* putting data in tmp file */
+ { if (*tape==0) tape=iotape; /* rewind encryption tape */
+ *inptr = ch ^ *tape++; /* re-encrypt and replace value */
+ }
+ inptr++;
+ return(ch);
+}
+
+char breakch; /* tell which char ended rnum */
+
+rdata() /* "read" data from virtual file*/
+{ register int sect;
+ register char ch;
+
+ inptr = data_file; /* Pointer to virtual data file */
+ srandom(SEED); /* which is lightly encrypted. */
+
+ clsses=1;
+ for (;;) /* read data sections */
+ { sect=next()-'0'; /* 1st digit of section number */
+#ifdef VERBOSE
+ printf("Section %c",sect+'0');
+#endif
+ if ((ch=next())!=LF) /* is there a second digit? */
+ {
+ FLUSHLF;
+#ifdef VERBOSE
+ putchar(ch);
+#endif
+ sect=10*sect+ch-'0';
+ }
+#ifdef VERBOSE
+ putchar('\n');
+#endif
+ switch(sect)
+ { case 0: /* finished reading database */
+ return;
+ case 1: /* long form descriptions */
+ rdesc(1);
+ break;
+ case 2: /* short form descriptions */
+ rdesc(2);
+ break;
+ case 3: /* travel table */
+ rtrav(); break;
+ case 4: /* vocabulary */
+ rvoc();
+ break;
+ case 5: /* object descriptions */
+ rdesc(5);
+ break;
+ case 6: /* arbitrary messages */
+ rdesc(6);
+ break;
+ case 7: /* object locations */
+ rlocs(); break;
+ case 8: /* action defaults */
+ rdflt(); break;
+ case 9: /* liquid assets */
+ rliq(); break;
+ case 10: /* class messages */
+ rdesc(10);
+ break;
+ case 11: /* hints */
+ rhints(); break;
+ case 12: /* magic messages */
+ rdesc(12);
+ break;
+ default:
+ printf("Invalid data section number: %d\n",sect);
+ for (;;) putchar(next());
+ }
+ if (breakch!=LF) /* routines return after "-1" */
+ FLUSHLF;
+ }
+}
+
+char nbf[12];
+
+
+rnum() /* read initial location num */
+{ register char *s;
+ tape = iotape; /* restart encryption tape */
+ for (s=nbf,*s=0;; s++)
+ if ((*s=next())==TAB || *s=='\n' || *s==LF)
+ break;
+ breakch= *s; /* save char for rtrav() */
+ *s=0; /* got the number as ascii */
+ if (nbf[0]=='-') return(-1); /* end of data */
+ return(atoi(nbf)); /* convert it to integer */
+}
+
+char *seekhere;
+
+rdesc(sect) /* read description-format msgs */
+int sect;
+{ register char *s,*t;
+ register int locc;
+ char *seekstart, *maystart, *adrstart;
+ char *entry;
+
+ seekhere = inptr; /* Where are we in virtual file?*/
+ outsw=1; /* these msgs go into tmp file */
+ for (oldloc= -1, seekstart=seekhere;;)
+ { maystart=inptr; /* maybe starting new entry */
+ if ((locc=rnum())!=oldloc && oldloc>=0 /* finished msg */
+ && ! (sect==5 && (locc==0 || locc>=100)))/* unless sect 5*/
+ { switch(sect) /* now put it into right table */
+ { case 1: /* long descriptions */
+ ltext[oldloc].seekadr=seekhere;
+ ltext[oldloc].txtlen=maystart-seekstart;
+ break;
+ case 2: /* short descriptions */
+ stext[oldloc].seekadr=seekhere;
+ stext[oldloc].txtlen=maystart-seekstart;
+ break;
+ case 5: /* object descriptions */
+ ptext[oldloc].seekadr=seekhere;
+ ptext[oldloc].txtlen=maystart-seekstart;
+ break;
+ case 6: /* random messages */
+ if (oldloc>RTXSIZ)
+ { printf("Too many random msgs\n");
+ exit(0);
+ }
+ rtext[oldloc].seekadr=seekhere;
+ rtext[oldloc].txtlen=maystart-seekstart;
+ break;
+ case 10: /* class messages */
+ ctext[clsses].seekadr=seekhere;
+ ctext[clsses].txtlen=maystart-seekstart;
+ cval[clsses++]=oldloc;
+ break;
+ case 12: /* magic messages */
+ if (oldloc>MAGSIZ)
+ { printf("Too many magic msgs\n");
+ exit(0);
+ }
+ mtext[oldloc].seekadr=seekhere;
+ mtext[oldloc].txtlen=maystart-seekstart;
+ break;
+ default:
+ printf("rdesc called with bad section\n");
+ exit(0);
+ }
+ seekhere += maystart-seekstart;
+ }
+ if (locc<0)
+ { outsw=0; /* turn off output */
+ seekhere += 3; /* -1<delimiter> */
+ return;
+ }
+ if (sect!=5 || (locc>0 && locc<100))
+ { if (oldloc!=locc)/* starting a new message */
+ seekstart=maystart;
+ oldloc=locc;
+ }
+ FLUSHLF; /* scan the line */
+ }
+}
+
+
+rtrav() /* read travel table */
+{ register int locc;
+ register struct travlist *t;
+ register char *s;
+ char buf[12];
+ int len,m,n,entries;
+ for (oldloc= -1;;) /* get another line */
+ { if ((locc=rnum())!=oldloc && oldloc>=0) /* end of entry */
+ {
+ t->next = 0; /* terminate the old entry */
+ /* printf("%d:%d entries\n",oldloc,entries); */
+ /* twrite(oldloc); */
+ }
+ if (locc== -1) return;
+ if (locc!=oldloc) /* getting a new entry */
+ { t=travel[locc]=(struct travlist *) malloc(sizeof (struct travlist));
+ /* printf("New travel list for %d\n",locc); */
+ entries=0;
+ oldloc=locc;
+ }
+ for (s=buf;; *s++) /* get the newloc number /ASCII */
+ if ((*s=next())==TAB || *s==LF) break;
+ *s=0;
+ len=length(buf)-1; /* quad long number handling */
+ /* printf("Newloc: %s (%d chars)\n",buf,len); */
+ if (len<4) /* no "m" conditions */
+ { m=0;
+ n=atoi(buf); /* newloc mod 1000 = newloc */
+ }
+ else /* a long integer */
+ { n=atoi(buf+len-3);
+ buf[len-3]=0; /* terminate newloc/1000 */
+ m=atoi(buf);
+ }
+ while (breakch!=LF) /* only do one line at a time */
+ { if (entries++) t=t->next=(struct travlist *) malloc(sizeof (struct travlist));
+ t->tverb=rnum();/* get verb from the file */
+ t->tloc=n; /* table entry mod 1000 */
+ t->conditions=m;/* table entry / 1000 */
+ /* printf("entry %d for %d\n",entries,locc); */
+ }
+ }
+}
+
+#ifdef DEBUG
+
+twrite(loq) /* travel options from this loc */
+int loq;
+{ register struct travlist *t;
+ printf("If");
+ speak(&ltext[loq]);
+ printf("then\n");
+ for (t=travel[loq]; t!=0; t=t->next)
+ { printf("verb %d takes you to ",t->tverb);
+ if (t->tloc<=300)
+ speak(&ltext[t->tloc]);
+ else if (t->tloc<=500)
+ printf("special code %d\n",t->tloc-300);
+ else
+ rspeak(t->tloc-500);
+ printf("under conditions %d\n",t->conditions);
+ }
+}
+
+#endif DEBUG
+
+rvoc()
+{ register char *s; /* read the vocabulary */
+ register int index;
+ char buf[6];
+ for (;;)
+ { index=rnum();
+ if (index<0) break;
+ for (s=buf,*s=0;; s++) /* get the word */
+ if ((*s=next())==TAB || *s=='\n' || *s==LF
+ || *s==' ') break;
+ /* terminate word with newline, LF, tab, blank */
+ if (*s!='\n' && *s!=LF) FLUSHLF; /* can be comments */
+ *s=0;
+ /* printf("\"%s\"=%d\n",buf,index);*/
+ vocab(buf,-2,index);
+ }
+/* prht(); */
+}
+
+
+rlocs() /* initial object locations */
+{ for (;;)
+ { if ((obj=rnum())<0) break;
+ plac[obj]=rnum(); /* initial loc for this obj */
+ if (breakch==TAB) /* there's another entry */
+ fixd[obj]=rnum();
+ else fixd[obj]=0;
+ }
+}
+
+rdflt() /* default verb messages */
+{ for (;;)
+ { if ((verb=rnum())<0) break;
+ actspk[verb]=rnum();
+ }
+}
+
+rliq() /* liquid assets &c: cond bits */
+{ register int bitnum;
+ for (;;) /* read new bit list */
+ { if ((bitnum=rnum())<0) break;
+ for (;;) /* read locs for bits */
+ { cond[rnum()] |= setbit[bitnum];
+ if (breakch==LF) break;
+ }
+ }
+}
+
+rhints()
+{ register int hintnum,i;
+ hntmax=0;
+ for (;;)
+ { if ((hintnum=rnum())<0) break;
+ for (i=1; i<5; i++)
+ hints[hintnum][i]=rnum();
+ if (hintnum>hntmax) hntmax=hintnum;
+ }
+}
+
+
+rspeak(msg)
+int msg;
+{ if (msg!=0) speak(&rtext[msg]);
+}
+
+
+mspeak(msg)
+int msg;
+{ if (msg!=0) speak(&mtext[msg]);
+}
+
+
+speak(msg) /* read, decrypt, and print a message (not ptext) */
+struct text *msg;/* msg is a pointer to seek address and length of mess */
+{
+ register char *s, nonfirst;
+
+ s = msg->seekadr;
+ nonfirst=0;
+ while (s - msg->seekadr < msg->txtlen) /* read a line at a time */
+ { tape=iotape; /* restart decryption tape */
+ while ((*s++ ^ *tape++) != TAB); /* read past loc num */
+ /* assume tape is longer than location number */
+ /* plus the lookahead put together */
+ if ((*s ^ *tape) == '>' &&
+ (*(s+1) ^ *(tape+1)) == '$' &&
+ (*(s+2) ^ *(tape+2)) == '<') break;
+ if (blklin && !nonfirst++) putchar('\n');
+ do
+ { if (*tape == 0) tape = iotape;/* rewind decryp tape */
+ putchar(*s ^ *tape);
+ } while ((*s++ ^ *tape++) != LF); /* better end with LF */
+ }
+}
+
+
+pspeak(m,skip) /* read, decrypt an print a ptext message */
+int m; /* msg is the number of all the p msgs for this place */
+int skip; /* assumes object 1 doesn't have prop 1, obj 2 no prop 2 &c*/
+{
+ register char *s,nonfirst;
+ char *numst, save;
+ struct text *msg;
+ char *tbuf;
+
+ msg = &ptext[m];
+ if ((tbuf=(char *) malloc(msg->txtlen + 1)) == 0) bug(108);
+ memcpy(tbuf, msg->seekadr, msg->txtlen + 1); /* Room to null */
+ s = tbuf;
+
+ nonfirst=0;
+ while (s - tbuf < msg->txtlen) /* read line at a time */
+ { tape=iotape; /* restart decryption tape */
+ for (numst=s; (*s^= *tape++)!=TAB; s++); /* get number */
+
+ save = *s; /* Temporarily trash the string (cringe) */
+ *s++ = 0; /* decrypting number within the string */
+
+ if (atoi(numst) != 100 * skip && skip >= 0)
+ { while ((*s++^*tape++)!=LF) /* flush the line */
+ if (*tape==0) tape=iotape;
+ continue;
+ }
+ if ((*s^*tape)=='>' && (*(s+1)^*(tape+1))=='$' &&
+ (*(s+2)^*(tape+2))=='<') break;
+ if (blklin && ! nonfirst++) putchar('\n');
+ do
+ { if (*tape==0) tape=iotape;
+ putchar(*s^*tape);
+ } while ((*s++^*tape++)!=LF); /* better end with LF */
+ if (skip<0) break;
+ }
+ free(tbuf);
+}
diff --git a/adventure/main.c b/adventure/main.c
new file mode 100644
index 00000000..6de4c37d
--- /dev/null
+++ b/adventure/main.c
@@ -0,0 +1,580 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * The game adventure was originally written in Fortran by Will Crowther
+ * and Don Woods. It was later translated to C and enhanced by Jim
+ * Gillogly. This code is derived from software contributed to Berkeley
+ * by Jim Gillogly at The Rand Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright (c) 1991, 1993\n\
+ The Regents of the University of California. All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/2/93";
+#endif /* not lint */
+
+/* Re-coding of advent in C: main program */
+
+#include <sys/file.h>
+#include <stdio.h>
+#include "hdr.h"
+
+
+main(argc,argv)
+int argc;
+char **argv;
+{
+ extern int errno;
+ register int i;
+ int rval,ll;
+ struct text *kk;
+ extern trapdel();
+
+ init(); /* Initialize everything */
+ signal(2,trapdel);
+
+ if (argc > 1) /* Restore file specified */
+ { /* Restart is label 8305 (Fortran) */
+ i = restore(argv[1]); /* See what we've got */
+ switch(i)
+ {
+ case 0: /* The restore worked fine */
+ yea=Start(0);
+ k=null;
+ unlink(argv[1]);/* Don't re-use the save */
+ goto l8; /* Get where we're going */
+ case 1: /* Couldn't open it */
+ exit(0); /* So give up */
+ case 2: /* Oops -- file was altered */
+ rspeak(202); /* You dissolve */
+ exit(0); /* File could be non-adventure */
+ } /* So don't unlink it. */
+ }
+
+ startup(); /* prepare for a user */
+
+ for (;;) /* main command loop (label 2) */
+ { if (newloc<9 && newloc!=0 && closng)
+ { rspeak(130); /* if closing leave only by */
+ newloc=loc; /* main office */
+ if (!panic) clock2=15;
+ panic=TRUE;
+ }
+
+ rval=fdwarf(); /* dwarf stuff */
+ if (rval==99) die(99);
+
+ l2000: if (loc==0) die(99); /* label 2000 */
+ kk = &stext[loc];
+ if ((abb[loc]%abbnum)==0 || kk->seekadr==0)
+ kk = &ltext[loc];
+ if (!forced(loc) && dark(0))
+ { if (wzdark && pct(35))
+ { die(90);
+ goto l2000;
+ }
+ kk = &rtext[16];
+ }
+ l2001: if (toting(bear)) rspeak(141); /* 2001 */
+ speak(kk);
+ k=1;
+ if (forced(loc))
+ goto l8;
+ if (loc==33 && pct(25)&&!closng) rspeak(8);
+ if (!dark(0))
+ { abb[loc]++;
+ for (i=atloc[loc]; i!=0; i=link[i]) /*2004 */
+ { obj=i;
+ if (obj>100) obj -= 100;
+ if (obj==steps && toting(nugget)) continue;
+ if (prop[obj]<0)
+ { if (closed) continue;
+ prop[obj]=0;
+ if (obj==rug||obj==chain)
+ prop[obj]=1;
+ tally--;
+ if (tally==tally2 && tally != 0)
+ if (limit>35) limit=35;
+ }
+ ll = prop[obj]; /* 2006 */
+ if (obj==steps && loc==fixed[steps])
+ ll = 1;
+ pspeak(obj, ll);
+ } /* 2008 */
+ goto l2012;
+ l2009: k=54; /* 2009 */
+ l2010: spk=k;
+ l2011: rspeak(spk);
+ }
+ l2012: verb=0; /* 2012 */
+ obj=0;
+ l2600: checkhints(); /* to 2600-2602 */
+ if (closed)
+ { if (prop[oyster]<0 && toting(oyster))
+ pspeak(oyster,1);
+ for (i=1; i<100; i++)
+ if (toting(i)&&prop[i]<0) /*2604 */
+ prop[i] = -1-prop[i];
+ }
+ wzdark=dark(0); /* 2605 */
+ if (knfloc>0 && knfloc!=loc) knfloc=1;
+ getin(&wd1,&wd2);
+ if (delhit) /* user typed a DEL */
+ { delhit=0; /* reset counter */
+ copystr("quit",wd1); /* pretend he's quitting*/
+ *wd2=0;
+ }
+ l2608: if ((foobar = -foobar)>0) foobar=0; /* 2608 */
+ /* should check here for "magic mode" */
+ turns++;
+ if (demo && turns>=SHORT) done(1); /* to 13000 */
+
+ if (verb==say && *wd2!=0) verb=0;
+ if (verb==say)
+ goto l4090;
+ if (tally==0 && loc>=15 && loc!=33) clock1--;
+ if (clock1==0)
+ { closing(); /* to 10000 */
+ goto l19999;
+ }
+ if (clock1<0) clock2--;
+ if (clock2==0)
+ { caveclose(); /* to 11000 */
+ continue; /* back to 2 */
+ }
+ if (prop[lamp]==1) limit--;
+ if (limit<=30 && here(batter) && prop[batter]==0
+ && here(lamp))
+ { rspeak(188); /* 12000 */
+ prop[batter]=1;
+ if (toting(batter)) drop(batter,loc);
+ limit=limit+2500;
+ lmwarn=FALSE;
+ goto l19999;
+ }
+ if (limit==0)
+ { limit = -1; /* 12400 */
+ prop[lamp]=0;
+ rspeak(184);
+ goto l19999;
+ }
+ if (limit<0&&loc<=8)
+ { rspeak(185); /* 12600 */
+ gaveup=TRUE;
+ done(2); /* to 20000 */
+ }
+ if (limit<=30)
+ { if (lmwarn|| !here(lamp)) goto l19999; /*12200*/
+ lmwarn=TRUE;
+ spk=187;
+ if (place[batter]==0) spk=183;
+ if (prop[batter]==1) spk=189;
+ rspeak(spk);
+ }
+ l19999: k=43;
+ if (liqloc(loc)==water) k=70;
+ if (weq(wd1,"enter") &&
+ (weq(wd2,"strea")||weq(wd2,"water")))
+ goto l2010;
+ if (weq(wd1,"enter") && *wd2!=0) goto l2800;
+ if ((!weq(wd1,"water")&&!weq(wd1,"oil"))
+ || (!weq(wd2,"plant")&&!weq(wd2,"door")))
+ goto l2610;
+ if (at(vocab(wd2,1))) copystr("pour",wd2);
+
+ l2610: if (weq(wd1,"west"))
+ if (++iwest==10) rspeak(17);
+ l2630: i=vocab(wd1,-1);
+ if (i== -1)
+ { spk=60; /* 3000 */
+ if (pct(20)) spk=61;
+ if (pct(20)) spk=13;
+ rspeak(spk);
+ goto l2600;
+ }
+ k=i%1000;
+ kq=i/1000+1;
+ switch(kq)
+ { case 1: goto l8;
+ case 2: goto l5000;
+ case 3: goto l4000;
+ case 4: goto l2010;
+ default:
+ printf("Error 22\n");
+ exit(0);
+ }
+
+ l8:
+ switch(march())
+ { case 2: continue; /* i.e. goto l2 */
+ case 99:
+ switch(die(99))
+ { case 2000: goto l2000;
+ default: bug(111);
+ }
+ default: bug(110);
+ }
+
+ l2800: copystr(wd2,wd1);
+ *wd2=0;
+ goto l2610;
+
+ l4000: verb=k;
+ spk=actspk[verb];
+ if (*wd2!=0 && verb!=say) goto l2800;
+ if (verb==say) obj= *wd2;
+ if (obj!=0) goto l4090;
+ l4080:
+ switch(verb)
+ { case 1: /* take = 8010 */
+ if (atloc[loc]==0||link[atloc[loc]]!=0) goto l8000;
+ for (i=1; i<=5; i++)
+ if (dloc[i]==loc&&dflag>=2) goto l8000;
+ obj=atloc[loc];
+ goto l9010;
+ case 2: case 3: case 9: /* 8000 : drop,say,wave */
+ case 10: case 16: case 17: /* calm,rub,toss */
+ case 19: case 21: case 28: /* find,feed,break */
+ case 29: /* wake */
+ l8000: printf("%s what?\n",wd1);
+ obj=0;
+ goto l2600;
+ case 4: case 6: /* 8040 open,lock */
+ spk=28;
+ if (here(clam)) obj=clam;
+ if (here(oyster)) obj=oyster;
+ if (at(door)) obj=door;
+ if (at(grate)) obj=grate;
+ if (obj!=0 && here(chain)) goto l8000;
+ if (here(chain)) obj=chain;
+ if (obj==0) goto l2011;
+ goto l9040;
+ case 5: goto l2009; /* nothing */
+ case 7: goto l9070; /* on */
+ case 8: goto l9080; /* off */
+ case 11: goto l8000; /* walk */
+ case 12: goto l9120; /* kill */
+ case 13: goto l9130; /* pour */
+ case 14: /* eat: 8140 */
+ if (!here(food)) goto l8000;
+ l8142: dstroy(food);
+ spk=72;
+ goto l2011;
+ case 15: goto l9150; /* drink */
+ case 18: /* quit: 8180 */
+ gaveup=yes(22,54,54);
+ if (gaveup) done(2); /* 8185 */
+ goto l2012;
+ case 20: /* invent=8200 */
+ spk=98;
+ for (i=1; i<=100; i++)
+ { if (i!=bear && toting(i))
+ { if (spk==98) rspeak(99);
+ blklin=FALSE;
+ pspeak(i,-1);
+ blklin=TRUE;
+ spk=0;
+ }
+ }
+ if (toting(bear)) spk=141;
+ goto l2011;
+ case 22: goto l9220; /* fill */
+ case 23: goto l9230; /* blast */
+ case 24: /* score: 8240 */
+ scorng=TRUE;
+ printf("If you were to quit now, you would score");
+ printf(" %d out of a possible ",score());
+ printf("%d.",mxscor);
+ scorng=FALSE;
+ gaveup=yes(143,54,54);
+ if (gaveup) done(2);
+ goto l2012;
+ case 25: /* foo: 8250 */
+ k=vocab(wd1,3);
+ spk=42;
+ if (foobar==1-k) goto l8252;
+ if (foobar!=0) spk=151;
+ goto l2011;
+ l8252: foobar=k;
+ if (k!=4) goto l2009;
+ foobar=0;
+ if (place[eggs]==plac[eggs]
+ ||(toting(eggs)&&loc==plac[eggs])) goto l2011;
+ if (place[eggs]==0&&place[troll]==0&&prop[troll]==0)
+ prop[troll]=1;
+ k=2;
+ if (here(eggs)) k=1;
+ if (loc==plac[eggs]) k=0;
+ move(eggs,plac[eggs]);
+ pspeak(eggs,k);
+ goto l2012;
+ case 26: /* brief=8260 */
+ spk=156;
+ abbnum=10000;
+ detail=3;
+ goto l2011;
+ case 27: /* read=8270 */
+ if (here(magzin)) obj=magzin;
+ if (here(tablet)) obj=obj*100+tablet;
+ if (here(messag)) obj=obj*100+messag;
+ if (closed&&toting(oyster)) obj=oyster;
+ if (obj>100||obj==0||dark(0)) goto l8000;
+ goto l9270;
+ case 30: /* suspend=8300 */
+ spk=201;
+ if (demo) goto l2011;
+ printf("I can suspend your adventure for you so");
+ printf(" you can resume later, but\n");
+ printf("you will have to wait at least");
+ printf(" %d minutes before continuing.",latncy);
+ if (!yes(200,54,54)) goto l2012;
+ datime(&saved,&savet);
+ ciao(argv[0]); /* Do we quit? */
+ continue; /* Maybe not */
+ case 31: /* hours=8310 */
+ printf("Colossal cave is closed 9am-5pm Mon ");
+ printf("through Fri except holidays.\n");
+ goto l2012;
+ default: bug(23);
+ }
+
+ l4090:
+ switch(verb)
+ { case 1: /* take = 9010 */
+ l9010: switch(trtake())
+ { case 2011: goto l2011;
+ case 9220: goto l9220;
+ case 2009: goto l2009;
+ case 2012: goto l2012;
+ default: bug(102);
+ }
+ l9020: case 2: /* drop = 9020 */
+ switch(trdrop())
+ { case 2011: goto l2011;
+ case 19000: done(3);
+ case 2012: goto l2012;
+ default: bug(105);
+ }
+ l9030: case 3:
+ switch(trsay())
+ { case 2012: goto l2012;
+ case 2630: goto l2630;
+ default: bug(107);
+ }
+ l9040: case 4: case 6: /* open, close */
+ switch(tropen())
+ { case 2011: goto l2011;
+ case 2010: goto l2010;
+ default: bug(106);
+ }
+ case 5: goto l2009; /* nothing */
+ case 7: /* on 9070 */
+ l9070: if (!here(lamp)) goto l2011;
+ spk=184;
+ if (limit<0) goto l2011;
+ prop[lamp]=1;
+ rspeak(39);
+ if (wzdark) goto l2000;
+ goto l2012;
+
+ case 8: /* off */
+ l9080: if (!here(lamp)) goto l2011;
+ prop[lamp]=0;
+ rspeak(40);
+ if (dark(0)) rspeak(16);
+ goto l2012;
+
+ case 9: /* wave */
+ if ((!toting(obj))&&(obj!=rod||!toting(rod2)))
+ spk=29;
+ if (obj!=rod||!at(fissur)||!toting(obj)||closng)
+ goto l2011;
+ prop[fissur]=1-prop[fissur];
+ pspeak(fissur,2-prop[fissur]);
+ goto l2012;
+ case 10: case 11: case 18: /* calm, walk, quit */
+ case 24: case 25: case 26: /* score, foo, brief */
+ case 30: case 31: /* suspend, hours */
+ goto l2011;
+ l9120: case 12: /* kill */
+ switch(trkill())
+ { case 8000: goto l8000;
+ case 8: goto l8;
+ case 2011: goto l2011;
+ case 2608: goto l2608;
+ case 19000: done(3);
+ default: bug(112);
+ }
+ l9130: case 13: /* pour */
+ if (obj==bottle||obj==0) obj=liq(0);
+ if (obj==0) goto l8000;
+ if (!toting(obj)) goto l2011;
+ spk=78;
+ if (obj!=oil&&obj!=water) goto l2011;
+ prop[bottle]=1;
+ place[obj]=0;
+ spk=77;
+ if (!(at(plant)||at(door))) goto l2011;
+ if (at(door))
+ { prop[door]=0; /* 9132 */
+ if (obj==oil) prop[door]=1;
+ spk=113+prop[door];
+ goto l2011;
+ }
+ spk=112;
+ if (obj!=water) goto l2011;
+ pspeak(plant,prop[plant]+1);
+ prop[plant]=(prop[plant]+2)% 6;
+ prop[plant2]=prop[plant]/2;
+ k=null;
+ goto l8;
+ case 14: /* 9140 - eat */
+ if (obj==food) goto l8142;
+ if (obj==bird||obj==snake||obj==clam||obj==oyster
+ ||obj==dwarf||obj==dragon||obj==troll
+ ||obj==bear) spk=71;
+ goto l2011;
+ l9150: case 15: /* 9150 - drink */
+ if (obj==0&&liqloc(loc)!=water&&(liq(0)!=water
+ ||!here(bottle))) goto l8000;
+ if (obj!=0&&obj!=water) spk=110;
+ if (spk==110||liq(0)!=water||!here(bottle))
+ goto l2011;
+ prop[bottle]=1;
+ place[water]=0;
+ spk=74;
+ goto l2011;
+ case 16: /* 9160: rub */
+ if (obj!=lamp) spk=76;
+ goto l2011;
+ case 17: /* 9170: throw */
+ switch(trtoss())
+ { case 2011: goto l2011;
+ case 9020: goto l9020;
+ case 9120: goto l9120;
+ case 8: goto l8;
+ case 9210: goto l9210;
+ default: bug(113);
+ }
+ case 19: case 20: /* 9190: find, invent */
+ if (at(obj)||(liq(0)==obj&&at(bottle))
+ ||k==liqloc(loc)) spk=94;
+ for (i=1; i<=5; i++)
+ if (dloc[i]==loc&&dflag>=2&&obj==dwarf)
+ spk=94;
+ if (closed) spk=138;
+ if (toting(obj)) spk=24;
+ goto l2011;
+ l9210: case 21: /* feed */
+ switch(trfeed())
+ { case 2011: goto l2011;
+ default: bug(114);
+ }
+ l9220: case 22: /* fill */
+ switch(trfill())
+ { case 2011: goto l2011;
+ case 8000: goto l8000;
+ case 9020: goto l9020;
+ default: bug(115);
+ }
+ l9230: case 23: /* blast */
+ if (prop[rod2]<0||!closed) goto l2011;
+ bonus=133;
+ if (loc==115) bonus=134;
+ if (here(rod2)) bonus=135;
+ rspeak(bonus);
+ done(2);
+ l9270: case 27: /* read */
+ if (dark(0)) goto l5190;
+ if (obj==magzin) spk=190;
+ if (obj==tablet) spk=196;
+ if (obj==messag) spk=191;
+ if (obj==oyster&&hinted[2]&&toting(oyster)) spk=194;
+ if (obj!=oyster||hinted[2]||!toting(oyster)
+ ||!closed) goto l2011;
+ hinted[2]=yes(192,193,54);
+ goto l2012;
+ l9280: case 28: /* break */
+ if (obj==mirror) spk=148;
+ if (obj==vase&&prop[vase]==0)
+ { spk=198;
+ if (toting(vase)) drop(vase,loc);
+ prop[vase]=2;
+ fixed[vase]= -1;
+ goto l2011;
+ }
+ if (obj!=mirror||!closed) goto l2011;
+ rspeak(197);
+ done(3);
+
+ l9290: case 29: /* wake */
+ if (obj!=dwarf||!closed) goto l2011;
+ rspeak(199);
+ done(3);
+
+ default: bug(24);
+ }
+
+ l5000:
+ obj=k;
+ if (fixed[k]!=loc && !here(k)) goto l5100;
+ l5010: if (*wd2!=0) goto l2800;
+ if (verb!=0) goto l4090;
+ printf("What do you want to do with the %s?\n",wd1);
+ goto l2600;
+ l5100: if (k!=grate) goto l5110;
+ if (loc==1||loc==4||loc==7) k=dprssn;
+ if (loc>9&&loc<15) k=entrnc;
+ if (k!=grate) goto l8;
+ l5110: if (k!=dwarf) goto l5120;
+ for (i=1; i<=5; i++)
+ if (dloc[i]==loc&&dflag>=2) goto l5010;
+ l5120: if ((liq(0)==k&&here(bottle))||k==liqloc(loc)) goto l5010;
+ if (obj!=plant||!at(plant2)||prop[plant2]==0) goto l5130;
+ obj=plant2;
+ goto l5010;
+ l5130: if (obj!=knife||knfloc!=loc) goto l5140;
+ knfloc = -1;
+ spk=116;
+ goto l2011;
+ l5140: if (obj!=rod||!here(rod2)) goto l5190;
+ obj=rod2;
+ goto l5010;
+ l5190: if ((verb==find||verb==invent)&&*wd2==0) goto l5010;
+ printf("I see no %s here\n",wd1);
+ goto l2012;
+ }
+}
diff --git a/adventure/save.c b/adventure/save.c
new file mode 100644
index 00000000..8dea684b
--- /dev/null
+++ b/adventure/save.c
@@ -0,0 +1,184 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * The game adventure was originally written in Fortran by Will Crowther
+ * and Don Woods. It was later translated to C and enhanced by Jim
+ * Gillogly. This code is derived from software contributed to Berkeley
+ * by Jim Gillogly at The Rand Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)save.c 8.1 (Berkeley) 5/31/93";
+#endif /* not lint */
+
+#include <stdio.h>
+#include "hdr.h"
+
+struct savestruct
+{
+ void *address;
+ int width;
+};
+
+struct savestruct save_array[] =
+{
+ &abbnum, sizeof(abbnum),
+ &attack, sizeof(attack),
+ &blklin, sizeof(blklin),
+ &bonus, sizeof(bonus),
+ &chloc, sizeof(chloc),
+ &chloc2, sizeof(chloc2),
+ &clock1, sizeof(clock1),
+ &clock2, sizeof(clock2),
+ &closed, sizeof(closed),
+ &closng, sizeof(closng),
+ &daltlc, sizeof(daltlc),
+ &demo, sizeof(demo),
+ &detail, sizeof(detail),
+ &dflag, sizeof(dflag),
+ &dkill, sizeof(dkill),
+ &dtotal, sizeof(dtotal),
+ &foobar, sizeof(foobar),
+ &gaveup, sizeof(gaveup),
+ &holdng, sizeof(holdng),
+ &iwest, sizeof(iwest),
+ &k, sizeof(k),
+ &k2, sizeof(k2),
+ &knfloc, sizeof(knfloc),
+ &kq, sizeof(kq),
+ &latncy, sizeof(latncy),
+ &limit, sizeof(limit),
+ &lmwarn, sizeof(lmwarn),
+ &loc, sizeof(loc),
+ &maxdie, sizeof(maxdie),
+ &mxscor, sizeof(mxscor),
+ &newloc, sizeof(newloc),
+ &numdie, sizeof(numdie),
+ &obj, sizeof(obj),
+ &oldlc2, sizeof(oldlc2),
+ &oldloc, sizeof(oldloc),
+ &panic, sizeof(panic),
+ &saved, sizeof(saved),
+ &savet, sizeof(savet),
+ &scorng, sizeof(scorng),
+ &spk, sizeof(spk),
+ &stick, sizeof(stick),
+ &tally, sizeof(tally),
+ &tally2, sizeof(tally2),
+ &tkk, sizeof(tkk),
+ &turns, sizeof(turns),
+ &verb, sizeof(verb),
+ &wd1, sizeof(wd1),
+ &wd2, sizeof(wd2),
+ &wzdark, sizeof(wzdark),
+ &yea, sizeof(yea),
+ atloc, sizeof(atloc),
+ dloc, sizeof(dloc),
+ dseen, sizeof(dseen),
+ fixed, sizeof(fixed),
+ hinted, sizeof(hinted),
+ link, sizeof(link),
+ odloc, sizeof(odloc),
+ place, sizeof(place),
+ prop, sizeof(prop),
+ tk, sizeof(tk),
+
+ NULL, 0
+};
+
+save(outfile) /* Two passes on data: first to get checksum, second */
+char *outfile; /* to output the data using checksum to start random #s */
+{
+ FILE *out;
+ struct savestruct *p;
+ char *s;
+ long sum;
+ int i;
+
+ crc_start();
+ for (p = save_array; p->address != NULL; p++)
+ sum = crc(p->address, p->width);
+ srandom((int) sum);
+
+ if ((out = fopen(outfile, "wb")) == NULL)
+ {
+ fprintf(stderr,
+ "Hmm. The name \"%s\" appears to be magically blocked.\n",
+ outfile);
+ return 1;
+ }
+ fwrite(&sum, sizeof(sum), 1, out); /* Here's the random() key */
+ for (p = save_array; p->address != NULL; p++)
+ {
+ for (s = p->address, i = 0; i < p->width; i++, s++)
+ *s = (*s ^ random()) & 0xFF; /* Lightly encrypt */
+ fwrite(p->address, p->width, 1, out);
+ }
+ fclose(out);
+ return 0;
+}
+
+restore(infile)
+char *infile;
+{
+ FILE *in;
+ struct savestruct *p;
+ char *s;
+ long sum, cksum;
+ int i;
+
+ if ((in = fopen(infile, "rb")) == NULL)
+ {
+ fprintf(stderr,
+ "Hmm. The file \"%s\" appears to be magically blocked.\n",
+ infile);
+ return 1;
+ }
+ fread(&sum, sizeof(sum), 1, in); /* Get the seed */
+ srandom((int) sum);
+ for (p = save_array; p->address != NULL; p++)
+ {
+ fread(p->address, p->width, 1, in);
+ for (s = p->address, i = 0; i < p->width; i++, s++)
+ *s = (*s ^ random()) & 0xFF; /* Lightly decrypt */
+ }
+ fclose(in);
+
+ crc_start(); /* See if she cheated */
+ for (p = save_array; p->address != NULL; p++)
+ cksum = crc(p->address, p->width);
+ if (sum != cksum) /* Tsk tsk */
+ return 2; /* Altered the file */
+ /* We successfully restored, so this really was a save file */
+ /* Get rid of the file, but don't bother checking that we did */
+ return 0;
+}
diff --git a/adventure/setup.c b/adventure/setup.c
new file mode 100644
index 00000000..06371f5f
--- /dev/null
+++ b/adventure/setup.c
@@ -0,0 +1,125 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Jim Gillogly at The Rand Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright (c) 1991, 1993\n\
+ The Regents of the University of California. All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)setup.c 8.1 (Berkeley) 5/31/93";
+#endif /* not lint */
+
+/*
+ * Setup: keep the structure of the original Adventure port, but use an
+ * internal copy of the data file, serving as a sort of virtual disk. It's
+ * lightly encrypted to prevent casual snooping of the executable.
+ *
+ * Also do appropriate things to tabs so that bogus editors will do the right
+ * thing with the data file.
+ *
+ */
+
+#define SIG1 " * Jim Gillogly"
+#define SIG2 " * Sterday, 6 Thrimidge S.R. 1993, 15:24"
+
+#include <stdio.h>
+#include "hdr.h" /* SEED lives in there; keep them coordinated. */
+
+#define USAGE "Usage: setup file > data.c (file is typically glorkz)\n"
+
+#define YES 1
+#define NO 0
+
+void fatal();
+
+#define LINE 10 /* How many values do we get on a line? */
+
+main(argc, argv)
+int argc;
+char *argv[];
+{
+ FILE *infile;
+ int c, count, linestart;
+
+ if (argc != 2) fatal(USAGE);
+
+ if ((infile = fopen(argv[1], "r")) == NULL)
+ fatal("Can't read file %s.\n", argv[1]);
+ puts("/*\n * data.c: created by setup from the ascii data file.");
+ puts(SIG1);
+ puts(SIG2);
+ puts(" */");
+ printf("\n\nchar data_file[] =\n{");
+ srandom(SEED);
+ count = 0;
+ linestart = YES;
+
+ while ((c = getc(infile)) != EOF)
+ {
+ if (linestart && c == ' ') /* Convert first spaces to tab */
+ {
+ printf("0x%02x,", ('\t' ^ random()) & 0xFF);
+ while ((c = getc(infile)) == ' ' && c != EOF);
+ /* Drop the non-whitespace character through */
+ linestart = NO;
+ }
+ switch(c)
+ {
+ case '\t':
+ linestart = NO; /* Don't need to convert spaces */
+ break;
+ case '\n':
+ linestart = YES; /* Ready to convert spaces again */
+ break;
+ }
+ if (count++ % LINE == 0) /* Finished a line? */
+ printf("\n\t");
+ printf("0x%02x,", (c ^ random()) & 0xFF);
+ }
+ puts("\n\t0\n};");
+ fclose(infile);
+ exit(0);
+}
+
+
+void fatal(format, arg)
+char *format;
+{
+ fprintf(stderr, format, arg);
+ exit(1);
+}
diff --git a/adventure/subr.c b/adventure/subr.c
new file mode 100644
index 00000000..3e2ef7b2
--- /dev/null
+++ b/adventure/subr.c
@@ -0,0 +1,828 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * The game adventure was originally written in Fortran by Will Crowther
+ * and Don Woods. It was later translated to C and enhanced by Jim
+ * Gillogly. This code is derived from software contributed to Berkeley
+ * by Jim Gillogly at The Rand Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)subr.c 8.1 (Berkeley) 5/31/93";
+#endif /* not lint */
+
+/* Re-coding of advent in C: subroutines from main */
+
+# include "hdr.h"
+
+/* Statement functions */
+toting(objj)
+int objj;
+{ if (place[objj] == -1) return(TRUE);
+ else return(FALSE);
+}
+
+here(objj)
+int objj;
+{ if (place[objj]==loc || toting(objj)) return(TRUE);
+ else return(FALSE);
+}
+
+at(objj)
+int objj;
+{ if (place[objj]==loc || fixed[objj]==loc) return(TRUE);
+ else return (FALSE);
+}
+
+liq2(pbotl)
+int pbotl;
+{ return((1-pbotl)*water+(pbotl/2)*(water+oil));
+}
+
+liq(foo)
+{ register int i;
+ i=prop[bottle];
+ if (i>-1-i) return(liq2(i));
+ else return(liq2(-1-i));
+}
+
+liqloc(locc) /* may want to clean this one up a bit */
+int locc;
+{ register int i,j,l;
+ i=cond[locc]/2;
+ j=((i*2)%8)-5;
+ l=cond[locc]/4;
+ l=l%2;
+ return(liq2(j*l+1));
+}
+
+bitset(l,n)
+int l,n;
+{ if (cond[l] & setbit[n]) return(TRUE);
+ return(FALSE);
+}
+
+forced(locc)
+int locc;
+{ if (cond[locc]==2) return(TRUE);
+ return(FALSE);
+}
+
+dark(foo)
+{ if ((cond[loc]%2)==0 && (prop[lamp]==0 || !here(lamp)))
+ return(TRUE);
+ return(FALSE);
+}
+
+pct(n)
+int n;
+{ if (ran(100)<n) return(TRUE);
+ return(FALSE);
+}
+
+
+fdwarf() /* 71 */
+{ register int i,j;
+ register struct travlist *kk;
+
+ if (newloc!=loc&&!forced(loc)&&!bitset(loc,3))
+ { for (i=1; i<=5; i++)
+ { if (odloc[i]!=newloc||!dseen[i]) continue;
+ newloc=loc;
+ rspeak(2);
+ break;
+ }
+ }
+ loc=newloc; /* 74 */
+ if (loc==0||forced(loc)||bitset(newloc,3)) return(2000);
+ if (dflag==0)
+ { if (loc>=15) dflag=1;
+ return(2000);
+ }
+ if (dflag==1) /* 6000 */
+ { if (loc<15||pct(95)) return(2000);
+ dflag=2;
+ for (i=1; i<=2; i++)
+ { j=1+ran(5);
+ if (pct(50)&&saved== -1) dloc[j]=0; /* 6001 */
+ }
+ for (i=1; i<=5; i++)
+ { if (dloc[i]==loc) dloc[i]=daltlc;
+ odloc[i]=dloc[i]; /* 6002 */
+ }
+ rspeak(3);
+ drop(axe,loc);
+ return(2000);
+ }
+ dtotal=attack=stick=0; /* 6010 */
+ for (i=1; i<=6; i++) /* loop to 6030 */
+ { if (dloc[i]==0) continue;
+ j=1;
+ for (kk=travel[dloc[i]]; kk!=0; kk=kk->next)
+ { newloc=kk->tloc;
+ if (newloc>300||newloc<15||newloc==odloc[i]
+ ||(j>1&&newloc==tk[j-1])||j>=20
+ ||newloc==dloc[i]||forced(newloc)
+ ||(i==6&&bitset(newloc,3))
+ ||kk->conditions==100) continue;
+ tk[j++]=newloc;
+ }
+ tk[j]=odloc[i]; /* 6016 */
+ if (j>=2) j--;
+ j=1+ran(j);
+ odloc[i]=dloc[i];
+ dloc[i]=tk[j];
+ dseen[i]=(dseen[i]&&loc>=15)||(dloc[i]==loc||odloc[i]==loc);
+ if (!dseen[i]) continue; /* i.e. goto 6030 */
+ dloc[i]=loc;
+ if (i==6) /* pirate's spotted him */
+ { if (loc==chloc||prop[chest]>=0) continue;
+ k=0;
+ for (j=50; j<=maxtrs; j++) /* loop to 6020 */
+ { if (j==pyram&&(loc==plac[pyram]
+ || loc==plac[emrald])) goto l6020;
+ if (toting(j)) goto l6022;
+ l6020: if (here(j)) k=1;
+ } /* 6020 */
+ if (tally==tally2+1 && k==0 && place[chest]==0
+ &&here(lamp) && prop[lamp]==1) goto l6025;
+ if (odloc[6]!=dloc[6]&&pct(20))
+ rspeak(127);
+ continue; /* to 6030 */
+ l6022: rspeak(128);
+ if (place[messag]==0) move(chest,chloc);
+ move(messag,chloc2);
+ for (j=50; j<=maxtrs; j++) /* loop to 6023 */
+ { if (j==pyram && (loc==plac[pyram]
+ || loc==plac[emrald])) continue;
+ if (at(j)&&fixed[j]==0) carry(j,loc);
+ if (toting(j)) drop(j,chloc);
+ }
+ l6024: dloc[6]=odloc[6]=chloc;
+ dseen[6]=FALSE;
+ continue;
+ l6025: rspeak(186);
+ move(chest,chloc);
+ move(messag,chloc2);
+ goto l6024;
+ }
+ dtotal++; /* 6027 */
+ if (odloc[i]!=dloc[i]) continue;
+ attack++;
+ if (knfloc>=0) knfloc=loc;
+ if (ran(1000)<95*(dflag-2)) stick++;
+ } /* 6030 */
+ if (dtotal==0) return(2000);
+ if (dtotal!=1)
+ { printf("There are %d threatening little dwarves ",dtotal);
+ printf("in the room with you.\n");
+ }
+ else rspeak(4);
+ if (attack==0) return(2000);
+ if (dflag==2) dflag=3;
+ if (saved!= -1) dflag=20;
+ if (attack!=1)
+ { printf("%d of them throw knives at you!\n",attack);
+ k=6;
+ l82: if (stick<=1) /* 82 */
+ { rspeak(k+stick);
+ if (stick==0) return(2000);
+ }
+ else
+ printf("%d of them get you!\n",stick); /* 83 */
+ oldlc2=loc;
+ return(99);
+ }
+ rspeak(5);
+ k=52;
+ goto l82;
+}
+
+
+march() /* label 8 */
+{ register int ll1,ll2;
+
+ if ((tkk=travel[newloc=loc])==0) bug(26);
+ if (k==null) return(2);
+ if (k==cave) /* 40 */
+ { if (loc<8) rspeak(57);
+ if (loc>=8) rspeak(58);
+ return(2);
+ }
+ if (k==look) /* 30 */
+ { if (detail++<3) rspeak(15);
+ wzdark=FALSE;
+ abb[loc]=0;
+ return(2);
+ }
+ if (k==back) /* 20 */
+ { switch(mback())
+ { case 2: return(2);
+ case 9: goto l9;
+ default: bug(100);
+ }
+ }
+ oldlc2=oldloc;
+ oldloc=loc;
+l9:
+ for (; tkk!=0; tkk=tkk->next)
+ if (tkk->tverb==1 || tkk->tverb==k) break;
+ if (tkk==0)
+ { badmove();
+ return(2);
+ }
+l11: ll1=tkk->conditions; /* 11 */
+ ll2=tkk->tloc;
+ newloc=ll1; /* newloc=conditions */
+ k=newloc%100; /* k used for prob */
+ if (newloc<=300)
+ { if (newloc<=100) /* 13 */
+ { if (newloc!=0&&!pct(newloc)) goto l12; /* 14 */
+ l16: newloc=ll2; /* newloc=location */
+ if (newloc<=300) return(2);
+ if (newloc<=500)
+ switch(specials())/* to 30000 */
+ { case 2: return(2);
+ case 12: goto l12;
+ case 99: return(99);
+ default: bug(101);
+ }
+ rspeak(newloc-500);
+ newloc=loc;
+ return(2);
+ }
+ if (toting(k)||(newloc>200&&at(k))) goto l16;
+ goto l12;
+ }
+ if (prop[k]!=(newloc/100)-3) goto l16; /* newloc still conditions*/
+l12: /* alternative to probability move */
+ for (; tkk!=0; tkk=tkk->next)
+ if (tkk->tloc!=ll2 || tkk->conditions!=ll1) break;
+ if (tkk==0) bug(25);
+ goto l11;
+}
+
+
+
+mback() /* 20 */
+{ register struct travlist *tk2,*j;
+ register int ll;
+ if (forced(k=oldloc)) k=oldlc2; /* k=location */
+ oldlc2=oldloc;
+ oldloc=loc;
+ tk2=0;
+ if (k==loc)
+ { rspeak(91);
+ return(2);
+ }
+ for (; tkk!=0; tkk=tkk->next) /* 21 */
+ { ll=tkk->tloc;
+ if (ll==k)
+ { k=tkk->tverb; /* k back to verb */
+ tkk=travel[loc];
+ return(9);
+ }
+ if (ll<=300)
+ { j=travel[loc];
+ if (forced(ll) && k==j->tloc) tk2=tkk;
+ }
+ }
+ tkk=tk2; /* 23 */
+ if (tkk!=0)
+ { k=tkk->tverb;
+ tkk=travel[loc];
+ return(9);
+ }
+ rspeak(140);
+ return(2);
+}
+
+
+specials() /* 30000 */
+{ switch(newloc -= 300)
+ { case 1: /* 30100 */
+ newloc = 99+100-loc;
+ if (holdng==0||(holdng==1&&toting(emrald))) return(2);
+ newloc=loc;
+ rspeak(117);
+ return(2);
+ case 2: /* 30200 */
+ drop(emrald,loc);
+ return(12);
+ case 3: /* to 30300 */
+ return(trbridge());
+ default: bug(29);
+ }
+}
+
+
+trbridge() /* 30300 */
+{ if (prop[troll]==1)
+ { pspeak(troll,1);
+ prop[troll]=0;
+ move(troll2,0);
+ move(troll2+100,0);
+ move(troll,plac[troll]);
+ move(troll+100,fixd[troll]);
+ juggle(chasm);
+ newloc=loc;
+ return(2);
+ }
+ newloc=plac[troll]+fixd[troll]-loc; /* 30310 */
+ if (prop[troll]==0) prop[troll]=1;
+ if (!toting(bear)) return(2);
+ rspeak(162);
+ prop[chasm]=1;
+ prop[troll]=2;
+ drop(bear,newloc);
+ fixed[bear] = -1;
+ prop[bear]=3;
+ if (prop[spices]<0) tally2++;
+ oldlc2=newloc;
+ return(99);
+}
+
+
+badmove() /* 20 */
+{ spk=12;
+ if (k>=43 && k<=50) spk=9;
+ if (k==29||k==30) spk=9;
+ if (k==7||k==36||k==37) spk=10;
+ if (k==11||k==19) spk=11;
+ if (verb==find||verb==invent) spk=59;
+ if (k==62||k==65) spk=42;
+ if (k==17) spk=80;
+ rspeak(spk);
+ return(2);
+}
+
+bug(n)
+int n;
+{ printf("Please tell jim@rand.org that fatal bug %d happened.\n",n);
+ exit(0);
+}
+
+
+checkhints() /* 2600 &c */
+{ register int hint;
+ for (hint=4; hint<=hntmax; hint++)
+ { if (hinted[hint]) continue;
+ if (!bitset(loc,hint)) hintlc[hint]= -1;
+ hintlc[hint]++;
+ if (hintlc[hint]<hints[hint][1]) continue;
+ switch(hint)
+ { case 4: /* 40400 */
+ if (prop[grate]==0&&!here(keys)) goto l40010;
+ goto l40020;
+ case 5: /* 40500 */
+ if (here(bird)&&toting(rod)&&obj==bird) goto l40010;
+ continue; /* i.e. goto l40030 */
+ case 6: /* 40600 */
+ if (here(snake)&&!here(bird)) goto l40010;
+ goto l40020;
+ case 7: /* 40700 */
+ if (atloc[loc]==0&&atloc[oldloc]==0
+ && atloc[oldlc2]==0&&holdng>1) goto l40010;
+ goto l40020;
+ case 8: /* 40800 */
+ if (prop[emrald]!= -1&&prop[pyram]== -1) goto l40010;
+ goto l40020;
+ case 9:
+ goto l40010; /* 40900 */
+ default: bug(27);
+ }
+ l40010: hintlc[hint]=0;
+ if (!yes(hints[hint][3],0,54)) continue;
+ printf("I am prepared to give you a hint, but it will ");
+ printf("cost you %d points.\n",hints[hint][2]);
+ hinted[hint]=yes(175,hints[hint][4],54);
+ l40020: hintlc[hint]=0;
+ }
+}
+
+
+trsay() /* 9030 */
+{ register int i;
+ if (*wd2!=0) copystr(wd2,wd1);
+ i=vocab(wd1,-1);
+ if (i==62||i==65||i==71||i==2025)
+ { *wd2=0;
+ obj=0;
+ return(2630);
+ }
+ printf("\nOkay, \"%s\".\n",wd2);
+ return(2012);
+}
+
+
+trtake() /* 9010 */
+{ register int i;
+ if (toting(obj)) return(2011); /* 9010 */
+ spk=25;
+ if (obj==plant&&prop[plant]<=0) spk=115;
+ if (obj==bear&&prop[bear]==1) spk=169;
+ if (obj==chain&&prop[bear]!=0) spk=170;
+ if (fixed[obj]!=0) return(2011);
+ if (obj==water||obj==oil)
+ { if (here(bottle)&&liq(0)==obj)
+ { obj=bottle;
+ goto l9017;
+ }
+ obj=bottle;
+ if (toting(bottle)&&prop[bottle]==1)
+ return(9220);
+ if (prop[bottle]!=1) spk=105;
+ if (!toting(bottle)) spk=104;
+ return(2011);
+ }
+l9017: if (holdng>=7)
+ { rspeak(92);
+ return(2012);
+ }
+ if (obj==bird)
+ { if (prop[bird]!=0) goto l9014;
+ if (toting(rod))
+ { rspeak(26);
+ return(2012);
+ }
+ if (!toting(cage)) /* 9013 */
+ { rspeak(27);
+ return(2012);
+ }
+ prop[bird]=1; /* 9015 */
+ }
+l9014: if ((obj==bird||obj==cage)&&prop[bird]!=0)
+ carry(bird+cage-obj,loc);
+ carry(obj,loc);
+ k=liq(0);
+ if (obj==bottle && k!=0) place[k] = -1;
+ return(2009);
+}
+
+
+dropper() /* 9021 */
+{ k=liq(0);
+ if (k==obj) obj=bottle;
+ if (obj==bottle&&k!=0) place[k]=0;
+ if (obj==cage&&prop[bird]!=0) drop(bird,loc);
+ if (obj==bird) prop[bird]=0;
+ drop(obj,loc);
+ return(2012);
+}
+
+trdrop() /* 9020 */
+{
+ if (toting(rod2)&&obj==rod&&!toting(rod)) obj=rod2;
+ if (!toting(obj)) return(2011);
+ if (obj==bird&&here(snake))
+ { rspeak(30);
+ if (closed) return(19000);
+ dstroy(snake);
+ prop[snake]=1;
+ return(dropper());
+ }
+ if (obj==coins&&here(vend)) /* 9024 */
+ { dstroy(coins);
+ drop(batter,loc);
+ pspeak(batter,0);
+ return(2012);
+ }
+ if (obj==bird&&at(dragon)&&prop[dragon]==0) /* 9025 */
+ { rspeak(154);
+ dstroy(bird);
+ prop[bird]=0;
+ if (place[snake]==plac[snake]) tally2--;
+ return(2012);
+ }
+ if (obj==bear&&at(troll)) /* 9026 */
+ { rspeak(163);
+ move(troll,0);
+ move(troll+100,0);
+ move(troll2,plac[troll]);
+ move(troll2+100,fixd[troll]);
+ juggle(chasm);
+ prop[troll]=2;
+ return(dropper());
+ }
+ if (obj!=vase||loc==plac[pillow]) /* 9027 */
+ { rspeak(54);
+ return(dropper());
+ }
+ prop[vase]=2; /* 9028 */
+ if (at(pillow)) prop[vase]=0;
+ pspeak(vase,prop[vase]+1);
+ if (prop[vase]!=0) fixed[vase] = -1;
+ return(dropper());
+}
+
+
+tropen() /* 9040 */
+{ if (obj==clam||obj==oyster)
+ { k=0; /* 9046 */
+ if (obj==oyster) k=1;
+ spk=124+k;
+ if (toting(obj)) spk=120+k;
+ if (!toting(tridnt)) spk=122+k;
+ if (verb==lock) spk=61;
+ if (spk!=124) return(2011);
+ dstroy(clam);
+ drop(oyster,loc);
+ drop(pearl,105);
+ return(2011);
+ }
+ if (obj==door) spk=111;
+ if (obj==door&&prop[door]==1) spk=54;
+ if (obj==cage) spk=32;
+ if (obj==keys) spk=55;
+ if (obj==grate||obj==chain) spk=31;
+ if (spk!=31||!here(keys)) return(2011);
+ if (obj==chain)
+ { if (verb==lock)
+ { spk=172; /* 9049: lock */
+ if (prop[chain]!=0) spk=34;
+ if (loc!=plac[chain]) spk=173;
+ if (spk!=172) return(2011);
+ prop[chain]=2;
+ if (toting(chain)) drop(chain,loc);
+ fixed[chain]= -1;
+ return(2011);
+ }
+ spk=171;
+ if (prop[bear]==0) spk=41;
+ if (prop[chain]==0) spk=37;
+ if (spk!=171) return(2011);
+ prop[chain]=0;
+ fixed[chain]=0;
+ if (prop[bear]!=3) prop[bear]=2;
+ fixed[bear]=2-prop[bear];
+ return(2011);
+ }
+ if (closng)
+ { k=130;
+ if (!panic) clock2=15;
+ panic=TRUE;
+ return(2010);
+ }
+ k=34+prop[grate]; /* 9043 */
+ prop[grate]=1;
+ if (verb==lock) prop[grate]=0;
+ k=k+2*prop[grate];
+ return(2010);
+}
+
+
+trkill() /* 9120 */
+{ register int i;
+ for (i=1; i<=5; i++)
+ if (dloc[i]==loc&&dflag>=2) break;
+ if (i==6) i=0;
+ if (obj==0) /* 9122 */
+ { if (i!=0) obj=dwarf;
+ if (here(snake)) obj=obj*100+snake;
+ if (at(dragon)&&prop[dragon]==0) obj=obj*100+dragon;
+ if (at(troll)) obj=obj*100+troll;
+ if (here(bear)&&prop[bear]==0) obj=obj*100+bear;
+ if (obj>100) return(8000);
+ if (obj==0)
+ { if (here(bird)&&verb!=throw) obj=bird;
+ if (here(clam)||here(oyster)) obj=100*obj+clam;
+ if (obj>100) return(8000);
+ }
+ }
+ if (obj==bird) /* 9124 */
+ { spk=137;
+ if (closed) return(2011);
+ dstroy(bird);
+ prop[bird]=0;
+ if (place[snake]==plac[snake]) tally2++;
+ spk=45;
+ }
+ if (obj==0) spk=44; /* 9125 */
+ if (obj==clam||obj==oyster) spk=150;
+ if (obj==snake) spk=46;
+ if (obj==dwarf) spk=49;
+ if (obj==dwarf&&closed) return(19000);
+ if (obj==dragon) spk=147;
+ if (obj==troll) spk=157;
+ if (obj==bear) spk=165+(prop[bear]+1)/2;
+ if (obj!=dragon||prop[dragon]!=0) return(2011);
+ rspeak(49);
+ verb=0;
+ obj=0;
+ getin(&wd1,&wd2);
+ if (!weq(wd1,"y")&&!weq(wd1,"yes")) return(2608);
+ pspeak(dragon,1);
+ prop[dragon]=2;
+ prop[rug]=0;
+ k=(plac[dragon]+fixd[dragon])/2;
+ move(dragon+100,-1);
+ move(rug+100,0);
+ move(dragon,k);
+ move(rug,k);
+ for (obj=1; obj<=100; obj++)
+ if (place[obj]==plac[dragon]||place[obj]==fixd[dragon])
+ move(obj,k);
+ loc=k;
+ k=null;
+ return(8);
+}
+
+
+trtoss() /* 9170: throw */
+{ register int i;
+ if (toting(rod2)&&obj==rod&&!toting(rod)) obj=rod2;
+ if (!toting(obj)) return(2011);
+ if (obj>=50&&obj<=maxtrs&&at(troll))
+ { spk=159; /* 9178 */
+ drop(obj,0);
+ move(troll,0);
+ move(troll+100,0);
+ drop(troll2,plac[troll]);
+ drop(troll2+100,fixd[troll]);
+ juggle(chasm);
+ return(2011);
+ }
+ if (obj==food&&here(bear))
+ { obj=bear; /* 9177 */
+ return(9210);
+ }
+ if (obj!=axe) return(9020);
+ for (i=1; i<=5; i++)
+ { if (dloc[i]==loc)
+ { spk=48; /* 9172 */
+ if (ran(3)==0||saved!= -1)
+ l9175: { rspeak(spk);
+ drop(axe,loc);
+ k=null;
+ return(8);
+ }
+ dseen[i]=FALSE;
+ dloc[i]=0;
+ spk=47;
+ dkill++;
+ if (dkill==1) spk=149;
+ goto l9175;
+ }
+ }
+ spk=152;
+ if (at(dragon)&&prop[dragon]==0)
+ goto l9175;
+ spk=158;
+ if (at(troll)) goto l9175;
+ if (here(bear)&&prop[bear]==0)
+ { spk=164;
+ drop(axe,loc);
+ fixed[axe]= -1;
+ prop[axe]=1;
+ juggle(bear);
+ return(2011);
+ }
+ obj=0;
+ return(9120);
+}
+
+
+trfeed() /* 9210 */
+{ if (obj==bird)
+ { spk=100;
+ return(2011);
+ }
+ if (obj==snake||obj==dragon||obj==troll)
+ { spk=102;
+ if (obj==dragon&&prop[dragon]!=0) spk=110;
+ if (obj==troll) spk=182;
+ if (obj!=snake||closed||!here(bird)) return(2011);
+ spk=101;
+ dstroy(bird);
+ prop[bird]=0;
+ tally2++;
+ return(2011);
+ }
+ if (obj==dwarf)
+ { if (!here(food)) return(2011);
+ spk=103;
+ dflag++;
+ return(2011);
+ }
+ if (obj==bear)
+ { if (prop[bear]==0) spk=102;
+ if (prop[bear]==3) spk=110;
+ if (!here(food)) return(2011);
+ dstroy(food);
+ prop[bear]=1;
+ fixed[axe]=0;
+ prop[axe]=0;
+ spk=168;
+ return(2011);
+ }
+ spk=14;
+ return(2011);
+}
+
+
+trfill() /* 9220 */
+{ if (obj==vase)
+ { spk=29;
+ if (liqloc(loc)==0) spk=144;
+ if (liqloc(loc)==0||!toting(vase)) return(2011);
+ rspeak(145);
+ prop[vase]=2;
+ fixed[vase]= -1;
+ return(9020); /* advent/10 goes to 9024 */
+ }
+ if (obj!=0&&obj!=bottle) return(2011);
+ if (obj==0&&!here(bottle)) return(8000);
+ spk=107;
+ if (liqloc(loc)==0) spk=106;
+ if (liq(0)!=0) spk=105;
+ if (spk!=107) return(2011);
+ prop[bottle]=((cond[loc]%4)/2)*2;
+ k=liq(0);
+ if (toting(bottle)) place[k]= -1;
+ if (k==oil) spk=108;
+ return(2011);
+}
+
+
+closing() /* 10000 */
+{ register int i;
+
+ prop[grate]=prop[fissur]=0;
+ for (i=1; i<=6; i++)
+ { dseen[i]=FALSE;
+ dloc[i]=0;
+ }
+ move(troll,0);
+ move(troll+100,0);
+ move(troll2,plac[troll]);
+ move(troll2+100,fixd[troll]);
+ juggle(chasm);
+ if(prop[bear]!=3) dstroy(bear);
+ prop[chain]=0;
+ fixed[chain]=0;
+ prop[axe]=0;
+ fixed[axe]=0;
+ rspeak(129);
+ clock1 = -1;
+ closng=TRUE;
+ return(19999);
+}
+
+
+caveclose() /* 11000 */
+{ register int i;
+ prop[bottle]=put(bottle,115,1);
+ prop[plant]=put(plant,115,0);
+ prop[oyster]=put(oyster,115,0);
+ prop[lamp]=put(lamp,115,0);
+ prop[rod]=put(rod,115,0);
+ prop[dwarf]=put(dwarf,115,0);
+ loc=115;
+ oldloc=115;
+ newloc=115;
+
+ put(grate,116,0);
+ prop[snake]=put(snake,116,1);
+ prop[bird]=put(bird,116,1);
+ prop[cage]=put(cage,116,0);
+ prop[rod2]=put(rod2,116,0);
+ prop[pillow]=put(pillow,116,0);
+
+ prop[mirror]=put(mirror,115,0);
+ fixed[mirror]=116;
+
+ for (i=1; i<=100; i++)
+ if (toting(i)) dstroy(i);
+ rspeak(132);
+ closed=TRUE;
+ return(2);
+}
diff --git a/adventure/vocab.c b/adventure/vocab.c
new file mode 100644
index 00000000..d0604336
--- /dev/null
+++ b/adventure/vocab.c
@@ -0,0 +1,223 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * The game adventure was originally written in Fortran by Will Crowther
+ * and Don Woods. It was later translated to C and enhanced by Jim
+ * Gillogly. This code is derived from software contributed to Berkeley
+ * by Jim Gillogly at The Rand Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)vocab.c 8.1 (Berkeley) 5/31/93";
+#endif /* not lint */
+
+/* Re-coding of advent in C: data structure routines */
+
+# include "hdr.h"
+
+dstroy(object)
+int object;
+{ move(object,0);
+}
+
+juggle(object)
+int object;
+{ register int i,j;
+
+ i=place[object];
+ j=fixed[object];
+ move(object,i);
+ move(object+100,j);
+}
+
+
+move(object,where)
+int object,where;
+{ register int from;
+
+ if (object<=100)
+ from=place[object];
+ else
+ from=fixed[object-100];
+ if (from>0 && from<=300) carry(object,from);
+ drop(object,where);
+}
+
+
+put(object,where,pval)
+int object,where,pval;
+{ move(object,where);
+ return(-1-pval);
+}
+
+carry(object,where)
+int object,where;
+{ register int temp;
+
+ if (object<=100)
+ { if (place[object]== -1) return;
+ place[object] = -1;
+ holdng++;
+ }
+ if (atloc[where]==object)
+ { atloc[where]=link[object];
+ return;
+ }
+ for (temp=atloc[where]; link[temp]!=object; temp=link[temp]);
+ link[temp]=link[object];
+}
+
+
+drop(object,where)
+int object,where;
+{ if (object>100) fixed[object-100]=where;
+ else
+ { if (place[object]== -1) holdng--;
+ place[object]=where;
+ }
+ if (where<=0) return;
+ link[object]=atloc[where];
+ atloc[where]=object;
+}
+
+
+vocab(word,type,value) /* look up or store a word */
+char *word;
+int type; /* -2 for store, -1 for user word, >=0 for canned lookup*/
+int value; /* used for storing only */
+{ register int adr;
+ register char *s,*t;
+ int hash, i;
+ struct hashtab *h;
+
+ for (hash=0,s=word,i=0; i<5 &&*s; i++) /* some kind of hash */
+ hash += *s++; /* add all chars in the word */
+ hash = (hash*3719)&077777; /* pulled that one out of a hat */
+ hash %= HTSIZE; /* put it into range of table */
+
+ for(adr=hash;; adr++) /* look for entry in table */
+ { if (adr==HTSIZE) adr=0; /* wrap around */
+ h = &voc[adr]; /* point at the entry */
+ switch(type)
+ { case -2: /* fill in entry */
+ if (h->val) /* already got an entry? */
+ goto exitloop2;
+ h->val=value;
+ h->atab=malloc(length(word));
+ for (s=word,t=h->atab; *s;)
+ *t++ = *s++ ^ '=';
+ *t=0^'=';
+ /* encrypt slightly to thwart core reader */
+ /* printf("Stored \"%s\" (%d ch) as entry %d\n", */
+ /* word, length(word), adr); */
+ return(0); /* entry unused */
+ case -1: /* looking up user word */
+ if (h->val==0) return(-1); /* not found */
+ for (s=word, t=h->atab;*t ^ '=';)
+ if ((*s++ ^ '=') != *t++)
+ goto exitloop2;
+ if ((*s ^ '=') != *t && s-word<5) goto exitloop2;
+ /* the word matched o.k. */
+ return(h->val);
+ default: /* looking up known word */
+ if (h->val==0)
+ { printf("Unable to find %s in vocab\n",word);
+ exit(0);
+ }
+ for (s=word, t=h->atab;*t ^ '=';)
+ if ((*s++ ^ '=') != *t++) goto exitloop2;
+ /* the word matched o.k. */
+ if (h->val/1000 != type) continue;
+ return(h->val%1000);
+ }
+
+ exitloop2: /* hashed entry does not match */
+ if (adr+1==hash || (adr==HTSIZE && hash==0))
+ { printf("Hash table overflow\n");
+ exit(0);
+ }
+ }
+}
+
+
+copystr(w1,w2) /* copy one string to another */
+char *w1,*w2;
+{ register char *s,*t;
+ for (s=w1,t=w2; *s;)
+ *t++ = *s++;
+ *t=0;
+}
+
+weq(w1,w2) /* compare words */
+char *w1,*w2; /* w1 is user, w2 is system */
+{ register char *s,*t;
+ register int i;
+ s=w1;
+ t=w2;
+ for (i=0; i<5; i++) /* compare at most 5 chars */
+ { if (*t==0 && *s==0)
+ return(TRUE);
+ if (*s++ != *t++) return(FALSE);
+ }
+ return(TRUE);
+}
+
+
+length(str) /* includes 0 at end */
+char *str;
+{ register char *s;
+ register int n;
+ for (n=0,s=str; *s++;) n++;
+ return(n+1);
+}
+
+prht() /* print hash table */
+{ register int i,j,l;
+ char *c;
+ struct hashtab *h;
+ for (i=0; i<HTSIZE/10+1; i++)
+ { printf("%4d",i*10);
+ for (j=0; j<10; j++)
+ { if (i*10+j>=HTSIZE) break;
+ h= &voc[i*10+j];
+ putchar(' ');
+ if (h->val==0)
+ { printf("-----");
+ continue;
+ }
+ for (l=0, c=h->atab; l<5; l++)
+ if ((*c ^ '=')) putchar(*c++ ^ '=');
+ else putchar(' ');
+ }
+ putchar('\n');
+ }
+}
diff --git a/adventure/wizard.c b/adventure/wizard.c
new file mode 100644
index 00000000..4eaf0555
--- /dev/null
+++ b/adventure/wizard.c
@@ -0,0 +1,133 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * The game adventure was originally written in Fortran by Will Crowther
+ * and Don Woods. It was later translated to C and enhanced by Jim
+ * Gillogly. This code is derived from software contributed to Berkeley
+ * by Jim Gillogly at The Rand Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)wizard.c 8.1 (Berkeley) 6/2/93";
+#endif /* not lint */
+
+/* Re-coding of advent in C: privileged operations */
+
+# include "hdr.h"
+
+datime(d,t)
+int *d,*t;
+{ int tvec[2],*tptr;
+ int *localtime();
+
+ time(tvec);
+ tptr=localtime(tvec);
+ *d=tptr[7]+365*(tptr[5]-77); /* day since 1977 (mod leap) */
+ /* bug: this will overflow in the year 2066 AD */
+ /* it will be attributed to Wm the C's millenial celebration */
+ *t=tptr[2]*60+tptr[1]; /* and minutes since midnite */
+} /* pretty painless */
+
+
+char magic[6];
+
+poof()
+{
+ strcpy(magic, DECR(d,w,a,r,f));
+ latncy = 45;
+}
+
+Start(n)
+{ int d,t,delay;
+
+ datime(&d,&t);
+ delay=(d-saved)*1440+(t-savet); /* good for about a month */
+
+ if (delay >= latncy)
+ { saved = -1;
+ return(FALSE);
+ }
+ printf("This adventure was suspended a mere %d minute%s ago.",
+ delay, delay == 1? "" : "s");
+ if (delay <= latncy/3)
+ { mspeak(2);
+ exit(0);
+ }
+ mspeak(8);
+ if (!wizard())
+ { mspeak(9);
+ exit(0);
+ }
+ saved = -1;
+ return(FALSE);
+}
+
+wizard() /* not as complex as advent/10 (for now) */
+{ register int wiz;
+ char *word,*x;
+ if (!yesm(16,0,7)) return(FALSE);
+ mspeak(17);
+ getin(&word,&x);
+ if (!weq(word,magic))
+ { mspeak(20);
+ return(FALSE);
+ }
+ mspeak(19);
+ return(TRUE);
+}
+
+ciao(cmdfile)
+char *cmdfile;
+{ register char *c;
+ register int outfd, size;
+ char fname[80], buf[512];
+ extern unsigned filesize;
+
+ printf("What would you like to call the saved version?\n");
+ for (c=fname;; c++)
+ if ((*c=getchar())=='\n') break;
+ *c=0;
+ if (save(fname) != 0) return; /* Save failed */
+ printf("To resume, say \"adventure %s\".\n", fname);
+ printf("\"With these rooms I might now have been familiarly acquainted.\"\n");
+ exit(0);
+}
+
+
+ran(range)
+int range;
+{
+ long rand(), i;
+
+ i = rand() % range;
+ return(i);
+}