Adventure-related 1980s Printouts from the University of Waterloo

I believe I printed these files way back in 1986. I did nothing with them until transcribing them in March 2015. Hopefully I didn't make too many errors.

Printouts 1 and 2 are an incomplete set of data files for a version of Adventure. But does it use the F language or is this something else? Printouts 3 thru 6 are the C code for a program, copyright 1985 by Ken Wellsch, that seems to use the data files to run the adventure. It seems clear that the program, using a different set of data files, could run a competely different adventure game.

Besides Ken Wellsch (K.C.W), the only other name mentioned is a "Jim" who added a bug fix in action.d.

Table of Contents


Printout 1

This printout claims to be from January 4, 1980 — but since there's several comments from 1984 within it, the printout date must be treated with contempt. Perhaps the computer I was printing from had an incorrect system date when I printed this?

comcave


# This ordering is very important, don't change it!
NOLIST
INCLUDE adv_db/nulls.d
INCLUDE adv_db/bits.d
INCLUDE adv_db/place.d
INCLUDE adv_db/objects.d
INCLUDE adv_db/objsyn.d
INCLUDE adv_db/verbs.d
INCLUDE adv_db/text.d
INCLUDE adv_db/vars.d
INCLUDE adv_db/labels.d
INCLUDE adv_db/moves.d
INCLUDE adv_db/action.d
INCLUDE adv_db/define.d
INCLUDE adv_db/init.d
INCLUDE adv_db/repeat.d

objsyn.d


SYNON  KEYS,KEY,SET
SYNON  LAMP,READLAMP,LANTERN
SYNON  PILLOW,VELVET
SYNON  MAGAZINES,ISSUES,SPELUNKER,"SPELUNKER"
SYNON  DWARF,DWARVES
SYNON  KNIFE,KNIVES
SYNON  FOOD,RATIONS
SYNON  BOTTLE,JAR
SYNON  WATER,H2O
SYNON  PLANT,BEANSTALK
SYNON  SHADOW,FIGURE
SYNON  VOLCANO,GEYSER,GORGE
SYNON  MACHINE,VENDING
SYNON  CARPET,MOSS,CURTAINS
SYNON  GOLD,NUGGET
SYNON  SILVER,BARS
SYNON  CHEST,BOX,TREASURE
SYNON  EGGS,EGG,NEST
SYNON  VASE,MING
SYNON  POTTERY,SHARDS
SYNON  PYRAMID,PLATINUM
SYNON  RUG,PERSIAN
SYNON  CAGE,WICKER
SYNON  JEWELRY,JEWELS
SYNON  CASKET,OPALS
SYNON  BRACELET,JADE
SYNON  SCULPTURE,CRYSTAL
SYNON  RING,MITHRAL
SYNON  SPYGLASS,SCRIMSHAW
SYNON  BAG,PIECES,EIGHT
SYNON  VIAL,PHIAL
SYNON  STATUE,MINOTAUR
SYNON  YACHT,RUBY,RUBAIYAT
SYNON  DJINN,DJANN,GENIE
SYNON  TURTLE,TORTOISE,DARWIN
SYNON  BEADS,INDIAN,STRING,TURQUOISE

vars.d


VARIABLE       HERE,THERE,ARG1,ARG2,STATUS
VARIABLE       LAMPLIFE
VARIABLE       I,J,K,L
VARIABLE       INVCT
VARIABLE       DEATHS,PENALTIES,SCOREX,MAXSCORE,TURNS,ADMIN,MOVES
VARIABLE       FOOBAR
VARIABLE       DWARFCOUNT,CLOCK,CLOSURE,QUITTING,OK
VARIABLE       TIME,HINT.TIME
VARIABLE       STRENGTH,MUSHTIME,DRAGTIME,LASTCLOCK
VARIABLE       PASSWORD,DWARROWS,SAFEEXIT,ESCAPE,CAMEO.TIME

moves.d


AT     ROAD
       MOVE ROAD,HILL
       MOVE WEST,HILL
       MOVE UP,HILL
       MOVE ENTER,BUILDING
       MOVE BUILDING,BUILDING
       MOVE INWARD,BUILDING
       MOVE EAST,BUILDING
       MOVE DOWNSTREAM,VALLEY
       MOVE GULLY,VALLEY
       MOVE STREAM,VALLEY
       MOVE SOUTH,VALLEY
       MOVE DOWN,VALLEY
       MOVE FOREST,FOREST
       MOVE NORTH,FOREST
       MOVE EAST,FOREST
       MOVE DEPRESSION,DEPRESSION
AT     HILL
       MOVE ROAD,ROAD
       MOVE BUILDING,ROAD
       MOVE FORWARD,ROAD
       MOVE EAST,ROAD
       MOVE NORTH,ROAD
       MOVE FOREST,FOREST
       MOVE NORTH,FOREST
       MOVE SOUTH,FOREST
AT     BUILDING
       MOVE ROAD,ROAD
       MOVE OUT,ROAD
       MOVE OUTDOORS,ROAD
       MOVE WEST,ROAD
       IFLT  CLOSURE,2      {is the cave open?}
          SMOVE XYZZY,DEBRIS,FOOF
          SMOVE PLUGH,Y2,FOOF
       FIN
*
       IFKEY BACK              {bug fix K.C.W. Nov. 23, 1984}
          LDA I,DEBRIS
          IFEQ I,THERE
             SAY CANTGOBACK
             QUIT
          FIN
          LDA I,Y2
          IFEQ I,THERE
             SAY CANTGOBACK
             QUIT
          FIN
       FIN
*
AT     BUILDING
       ANYOF STREAM,DOWNSTREAM
       SAY   PIPEFIT
       QUIT
AT     VALLEY
       MOVE UPSTREAM,ROAD
       MOVE BUILDING,ROAD
       MOVE NORTH,ROAD
       MOVE FOREST,FOREST
       MOVE EAST,FOREST
       MOVE WEST,FOREST
       MOVE UP,FOREST
       MOVE DEPRESSION,DEPRESSION
       ANYOF SOUTH,DOWN,DOWNSTREAM
       IFLT  CLOSURE,2
          GOTO  SLIT
       ELSE
          GOTO  FAKE.SLIT
       FIN
       QUIT
AT     FOREST
       MOVE VALLEY,VALLEY
       MOVE EAST,VALLEY
       MOVE DOWN,VALLEY
       MOVE WEST,FOREST
       MOVE SOUTH,FOREST
AT     FOREST
       ANYOF     FOREST,FORWARD,NORTH
       CHANCE    50
           GOTO FOREST
       ELSE
           GOTO FOREST2
       FIN
       QUIT
AT     FOREST2
       MOVE ROAD,ROAD
       MOVE NORTH,ROAD
       MOVE VALLEY,VALLEY
       MOVE EAST,VALLEY
       MOVE WEST,VALLEY
       MOVE DOWN,VALLEY
       MOVE FOREST,FOREST
       MOVE SOUTH,FOREST
AT     SLIT
       MOVE BUILDING,ROAD
       MOVE UPSTREAM,VALLEY
       MOVE NORTH,VALLEY
       MOVE FOREST,FOREST
       MOVE EAST,FOREST
       MOVE WEST,FOREST
       MOVE DOWNSTREAM,DEPRESSION
       MOVE ROCK,DEPRESSION
       MOVE BED,DEPRESSION
       MOVE SOUTH,DEPRESSION
AT     FAKE.SLIT
       MOVE BUILDING,ROAD
       MOVE UPSTREAM,VALLEY
       MOVE NORTH,VALLEY
       MOVE FOREST,FOREST
       MOVE EAST,FOREST
       MOVE WEST,FOREST
       MOVE DOWNSTREAM,DEPRESSION
       MOVE ROCK,DEPRESSION
       MOVE BED,DEPRESSION
       MOVE SOUTH,DEPRESSION
AT     SLIT
       ANYOF     SLIT,STREAM,DOWN,ENTER
       SAY  DONTFITSLIT
       QUIT
AT     FAKE.SLIT
       ANYOF SLIT,STREAM,DOWN,ENTER
       SET   CLOSURE,5      {victory!}
       BIC   STATUS,FASTMODE
       BIC   STATUS,QUICKIE
       SAY   TREASUREROOM   {describe the booty}
       SET   QUITTING,0
       CALL  FINIS          {end the game in triumph}
AT     DEPRESSION
       MOVE  FOREST,FOREST
       MOVE  EAST,FOREST2
       MOVE  WEST,FOREST
       MOVE  SOUTH,FOREST2
       MOVE  BUILDING,ROAD
       IFKEY BACK       { bug fix. K.C.W }
               LDA  I,INCAVE
               IFEQ I,THERE
                  AND
               IFEQ GRATE,0     { locked }
                       SAY CANTPASSLOCK
                       QUIT
               FIN
       FIN
       ANYOF UPSTREAM,GULLY,NORTH,SLIT
       IFLT  CLOSURE,2
          GOTO  SLIT
       ELSE
          GOTO  FAKE.SLIT
       FIN
       QUIT
AT     DEPRESSION
       ANYOF     IN,DOWN,ENTER
       IFEQ GRATE,1
           GOTO INCAVE
       ELSE
           SAY  CANTPASSLOCK
       FIN
       QUIT
AT     INCAVE
       ANYOF     UP,OUT,LEAVE,SURFACE
       IFEQ GRATE,1
           GOTO DEPRESSION
       ELSE
           SAY  CANTPASSLOCK
       FIN
       QUIT
AT     INCAVE
       MOVE CRAWL,COBBLES
       MOVE COBBLES,COBBLES
       MOVE INWARD,COBBLES
       MOVE WEST,COBBLES
       MOVE PIT,PIT
       MOVE DEBRIS,DEBRIS
       IFKEY BACK              { bug fix. K.C.W }
               LDA  I,DEPRESSION
               IFEQ GRATE,0    { locked }
                       SAY CANTPASSLOCK
                       QUIT
               FIN
       FIN
AT     COBBLES
       MOVE OUT,INCAVE
       MOVE SURFACE,INCAVE
       MOVE NULL,INCAVE
       MOVE ENTRANCE,INCAVE
       MOVE EAST,INCAVE
       MOVE INWARD,DEBRIS
       MOVE DARK,DEBRIS
       MOVE WEST,DEBRIS
       MOVE DEBRIS,DEBRIS
       MOVE PIT,PIT
AT     DEBRIS
       MOVE ENTRANCE,INCAVE
       MOVE CRAWL,COBBLES
       MOVE COBBLES,COBBLES
       MOVE PASSAGE,COBBLES
       MOVE LOW,COBBLES
       MOVE EAST,COBBLES
       MOVE CANYON,CANYON
       MOVE INWARD,CANYON
       MOVE UP,CANYON
       MOVE WEST,CANYON
       MOVE PIT,PIT
       IFEQ  GRATE,1
          MOVE  DEPRESSION,DEPRESSION
       ELSE
          SMOVE DEPRESSION,INCAVE,CANTPASSLOCK
       FIN
*
       IFKEY BACK              {bug fix K.C.W. Nov. 23, 1984}
          LDA I,BUILDING
          IFEQ I,THERE
             SAY CANTGOBACK
             QUIT
          FIN
       FIN
*
AT     DEBRIS
       KEYWORD  XYZZY
       IFGT  CLOSURE,1
          OR
       BIT   ADMIN,NOMAGIC
          SAY   NOTHING
          BIS   ADMIN,PANICED
          QUIT
       ELSE
          SMOVE XYZZY,BUILDING,FOOF
       FIN
       QUIT
AT     CANYON
       MOVE ENTRANCE,INCAVE
       MOVE DOWN,DEBRIS
       MOVE EAST,DEBRIS
       MOVE DEBRIS,DEBRIS
       MOVE INWARD,BIRDCHAMBER
       MOVE UP,BIRDCHAMBER
       MOVE WEST,BIRDCHAMBER
       MOVE PIT,PIT
       IFEQ  GRATE,1
          MOVE  DEPRESSION,DEPRESSION
       ELSE
          SMOVE DEPRESSION,INCAVE,CANTPASSLOCK
       FIN
AT     BIRDCHAMBER
       MOVE ENTRANCE,INCAVE
       MOVE DEBRIS,DEBRIS
       MOVE CANYON,CANYON
       MOVE EAST,CANYON
       MOVE PASSAGE,PIT
       MOVE PIT,PIT
       MOVE WEST,PIT
       IFEQ  GRATE,1
          MOVE  DEPRESSION,DEPRESSION
       ELSE
          SMOVE DEPRESSION,INCAVE,CANTPASSLOCK
       FIN
AT     PIT
       MOVE ENTRANCE,INCAVE
       MOVE DEBRIS,DEBRIS
       MOVE PASSAGE,BIRDCHAMBER
       MOVE EAST,BIRDCHAMBER
       MOVE DOWN,MISTS
       IFEQ  GRATE,1
          MOVE  DEPRESSION,DEPRESSION
       ELSE
          SMOVE DEPRESSION,INCAVE,CASTPASSLOCK
       FIN
AT     PIT
       ANYOF    DOWN,STEPS,PIT
       IFHAVE   GOLD
           SAY  BROKENECK
             GOTO MISTS
           CALL CORONER
       ELSE
           GOTO MISTS
       FIN
       QUIT
AT     PIT
       ANYOF     WEST,CRACK
       SAY  MISTCRACK
       QUIT
AT     PIT
       KEYWORD  JUMP
       GOTO  MISTS
       CALL  SPLATTER
       QUIT
AT     MISTS
       MOVE LEFT,GOLDROOM
       MOVE SOUTH,GOLDROOM
       MOVE  EAST,SANDSTONE
       MOVE FORWARD,EASTOFFISSURE
       MOVE HALL,EASTOFFISSURE
       MOVE WEST,EASTOFFISSURE
       MOVE STAIRS,MTKING
       MOVE DOWN,MTKING
       MOVE NORTH,MTKING
       MOVE Y2,JUMBLE
AT     MISTS
       ANYOF     UP,PIT,STEPS,DOME,PASSAGE,ENTER
       IFHAVE    GOLD
           SAY  UNCLIMBABLE
       ELSE
           GOTO PIT
       FIN
       QUIT
AT     EASTOFFISSURE
       MOVE HALL,MISTS
       MOVE EAST,MISTS
       IFKEY BACK              { bug fix. K.C.W }
               LDA  I,WESTOFFISSURE
               IFEQ I,THERE
                  AND
               IFEQ FISSURE,0  { no bridge }
                       SAY NOWAYACROSS
                       QUIT
               FIN
       FIN
AT     EASTOFFISSURE
       ANYOF     FORWARD,OVER,WEST
       IFEQ FISSURE,0
          SAY   NOWAYACROSS
       ELSE
           GOTO WESTOFFISSURE
       FIN
       QUIT
AT     EASTOFFISSURE
       KEYWORD   JUMP
       IFEQ FISSURE,1
           SAY  TRYTHEBRIDGE
       ELSE
          GOTO  CAVERN
          CALL  SPLATTER
       FIN
       QUIT
AT     GOLDROOM
       MOVE HALL,MISTS
       MOVE OUT,MISTS
       MOVE NORTH,MISTS
AT     MTKING
       MOVE STAIRS,MISTS
       MOVE UP,MISTS
       MOVE EAST,MISTS
AT     MTKING
       ANYOF     NORTH,LEFT,SOUTH,RIGHT,WEST,FORWARD,SW,SECRET
       ANYOF     NW,SE,NE,DOWN
       IFNEAR    SNAKE
           SAY  SNAKEBLOCKS
           QUIT
       ELSE
           MOVE NORTH,LOWNSPASSAGE
           MOVE LEFT,LOWNSPASSAGE
           MOVE SOUTH,SOUTHSIDE
           MOVE RIGHT,SOUTHSIDE
           MOVE WEST,WESTSIDE
           MOVE FORWARD,WESTSIDE
           MOVE DOWN,VAULT
           MOVE NORTHEAST,MORION
           MOVE NORTHWEST,CORRID.3
           MOVE SOUTHEAST,CORRID.1
           MOVE SECRET,SECRETEW.TITE
           CHANCE    35        {Assumes "SW" typed here}
                MOVE SW,SECRETEW.TITE
           ELSE
                SAY  YOUDIDNTMOVE
           FIN
           QUIT
AT     WEND2PIT
       MOVE EAST,EEND2PIT
       MOVE CROSS,EEND2PIT
       MOVE WEST,SLAB
       MOVE SLAB,SLAB
       MOVE DOWN,WESTPIT
       MOVE PIT,WESTPIT
AT     WEND2PIT
       KEYWORD   HOLE
       SAY  TOO.FAR.UP
       QUIT
AT     EASTPIT
       MOVE UP,EEND2PIT
       MOVE OUT,EEND2PIT
AT     WESTPIT
       MOVE UP,WEND2PIT
       MOVE OUT,WEND2PIT
AT     WESTPIT
       KEYWORD  CLIMB
       IFEQ  PLANT,0
          SAY   NOCLIMBUP
       ELSE
          IFEQ  PLANT,2
             SAY   SHORTPLANT
             GOTO  WEND2PIT
          ELSE
             SAY   LONGPLANT
             GOTO NARROWCORRIDOR
          FIN
       FIN
       QUIT
AT     WESTPIT
       KEYWORD  GET,PLANT
       SAY   GET..PLANT
       QUIT
AT     WESTOFFISSURE
       MOVE WEST,WENDMISTS
AT     WESTOFFISSURE
       ANYOF     FORWARD,OVER,EAST
       IFEQ FISSURE,0
          SAY  NOWAYACROSS
       ELSE
          GOTO EASTOFFISSURE
       FIN
       QUIT
AT     WESTOFFISSURE
       KEYWORD   JUMP
       IFEQ FISSURE,1
           SAY  TRYTHEBRIDGE
       ELSE
          GOTO  CAVERN
           CALL SPLATTER
       FIN
       QUIT
AT     WESTOFFISSURE
       IFKEY BACK              { bug fix. K.C.W. }
               LDA  I,EASTOFFISSURE
               IFEQ I,THERE
                  AND
               IFEQ FISSURE,0  { no bridge }
                       SAY NOWAYACROSS
                       QUIT
               FIN
       FIN
       KEYWORD   NORTH
       SAY  MISTCRAWL
       GOTO WENDMISTS
       QUIT
AT     LOWNSPASSAGE
       MOVE HALL,MTKING
       MOVE OUT,MTKING
       MOVE SOUTH,MTKING
       MOVE NORTH,Y2
       MOVE Y2,Y2
       MOVE DOWN,DIRTY
       MOVE HOLE,DIRTY
AT     SOUTHSIDE
       MOVE HALL,MTKING
       MOVE OUT,MTKING
       MOVE NORTH,MTKING
AT     WESTSIDE
       MOVE HALL,MTKING
       MOVE OUT,MTKING
       MOVE EAST,MTKING
       MOVE WEST,CROSSOVER
       MOVE UP,CROSSOVER
AT     Y2
       MOVE SOUTH,LOWNSPASSAGE
       MOVE EAST,JUMBLE
       MOVE JUMBLE,JUMBLE
       MOVE WEST,WINDOW
*
       IFKEY BACK              {bug fix K.C.W. Nov. 23, 1984}
          LDA I,BUILDING
          IFEQ I,THERE
             SAY CANTGOBACK
             QUIT
          FIN
          LDA I,PLOVER
          IFEQ I,THERE
             SAY CANTGOBACK
             QUIT
          FIN
       FIN
*
AT     Y2
       ANYOF    PLUGH,PLOVER
       IFGT  CLOSURE,1
          OR
       BIT   ADMIN,NOMAGIC
          SAY   NOTHING
          BIS   ADMIN,PANICED
          QUIT
       ELSE
          SMOVE PLUGH,BUILDING,FOOF
          SMOVE PLOVER,PLOVER,FOOF
       FIN
AT     JUMBLE
       MOVE DOWN,Y2
       MOVE Y2,Y2
       MOVE UP,MISTS
AT     WINDOW
       KEYWORD  JUMP
       SAY   BROKENECK
       GOTO  MIRRORCNYN
       CALL  CORONER
AT     DIRTY
       MOVE EAST,BRINK
       MOVE CRAWL,BRINK
       MOVE UP,LOWNSPASSAGE
       MOVE HOLE,LOWNSPASSAGE
       MOVE WEST,DUSTY
       MOVE BEDQUILT,BEDQUILT
AT     BRINK
       MOVE WEST,DIRTY
       MOVE CRAWL,DIRTY
       MOVE DOWN,STREAMPIT
       MOVE PIT,STREAMPIT
       MOVE CLIMB,STREAMPIT
AT     STREAMPIT
       MOVE CLIMB,BRINK
       MOVE UP,BRINK
       MOVE OUT,BRINK
AT     STREAMPIT
       ANYOF     SLIT,STREAM,DOWN,UPSTREAM,DOWNSTREAM
       SAY  DONTFITSLIT
       QUIT
AT     DUSTY
       MOVE EAST,DIRTY
       MOVE PASSAGE,DIRTY
       MOVE DOWN,COMPLEX
       MOVE HOLE,COMPLEX
       MOVE BEDQUILT,BEDQUILT
AT     WENDMISTS
       MOVE SOUTH,MAZEA.42
       MOVE UP,MAZEA.42
       MOVE PASSAGE,MAZEA.42
       MOVE CLIMB,MAZEA.42
       MOVE EAST,WESTOFFISSURE
       MOVE WEST,LONGHALLEAST
       MOVE CRAWL,LONGHALLEAST
AT     WENDMISTS
       KEYWORD  NORTH
       SAY   MISTCRAWL
       GOTO  WESTOFFISSURE
       QUIT
AT     MAZEA.42
       MOVE UP,WENDMISTS
       MOVE NORTH,MAZEA.42
       MOVE EAST,MAZEA.43
       MOVE SOUTH,MAZEA.45
       MOVE WEST,MAZEA.80
AT     MAZEA.43
       MOVE WEST,MAZEA.42
       MOVE SOUTH,MAZEA.44
       MOVE EAST,MAZEA.45
AT     MAZEA.44
       MOVE WEST,MAZEA.43
       MOVE DOWN,MAZEA.48
       MOVE SOUTH,MAZEA.50
       MOVE NORTH,MAZEA.82
AT     MAZEA.45
       MOVE WEST,MAZEA.42
       MOVE NORTH,MAZEA.43
       MOVE EAST,MAZEA.46
       MOVE SOUTH,MAZEA.47
       MOVE UP,MAZEA.87
       MOVE DOWN,MAZEA.87
AT     MAZEA.46
       MOVE WEST,MAZEA.45
       MOVE OUT,MAZEA.45
AT     MAZEA.47
       MOVE EAST,MAZEA.45
       MOVE OUT,MAZEA.45
AT     MAZEA.48
       MOVE UP,MAZEA.44
       MOVE OUT,MAZEA.44
AT     MAZEA.49
       MOVE EAST,MAZEA.50
       MOVE WEST,MAZEA.51
AT     MAZEA.50
       MOVE EAST,MAZEA.44
       MOVE WEST,MAZEA.49
       MOVE DOWN,MAZEA.51
       MOVE SOUTH,MAZEA.52
AT     MAZEA.51
       MOVE WEST,MAZEA.49
       MOVE UP,MAZEA.50
       MOVE EAST,MAZEA.52
       MOVE SOUTH,MAZEA.53
AT     MAZEA.52
       MOVE WEST,MAZEA.50
       MOVE EAST,MAZEA.51
       MOVE SOUTH,MAZEA.52
       MOVE UP,MAZEA.53
       MOVE NORTH,MAZEA.55
       MOVE DOWN,MAZEA.86
AT     MAZEA.53
       MOVE WEST,MAZEA.51
       MOVE NORTH,MAZEA.52
       MOVE SOUTH,MAZEA.54
AT     MAZEA.54
       MOVE WEST,MAZEA.53
       MOVE OUT,MAZEA.53
AT     MAZEA.55
       MOVE WEST,MAZEA.52
       MOVE NORTH,MAZEA.55
       MOVE DOWN,MAZEA.56
       MOVE EAST,MAZEA.57.PIT
AT     MAZEA.56
       MOVE UP,MAZEA.55
       MOVE OUT,MAZEA.55
AT     MAZEA.57.PIT
       MOVE DOWN,BIRDCHAMBER
       MOVE CLIMB,BIRDCHAMBER
       MOVE WEST,MAZEA.55
       MOVE SOUTH,MAZEA.58
       MOVE NORTH,MAZEA.83
       MOVE EAST,MAZEA.84
AT     MAZEA.58
       MOVE EAST,MAZEA.57.PIT
       MOVE OUT,MAZEA.57.PIT
AT     LONGHALLEAST
       MOVE EAST,WENDMISTS
       MOVE UP,WENDMISTS
       MOVE CRAWL,WENDMISTS
       MOVE WEST,LONGHALLWEST
       MOVE NORTH,CROSSOVER
       MOVE DOWN,CROSSOVER
       MOVE HOLE,CROSSOVER
AT     LONGHALLWEST
       MOVE EAST,LONGHALLEAST
       MOVE NORTH,CROSSOVER
       MOVE SOUTH,MAZED.107
AT     CROSSOVER
       MOVE WEST,LONGHALLEAST
       MOVE NORTH,DEADEND1
       MOVE EAST,WESTSIDE
       MOVE SOUTH,LONGHALLWEST
AT     DEADEND1
       MOVE SOUTH,CROSSOVER
       MOVE OUT,CROSSOVER
AT     COMPLEX
       MOVE UP,DUSTY
       MOVE CLIMB,DUSTY
       MOVE WEST,BEDQUILT
       MOVE BEDQUILT,BEDQUILT
       MOVE NORTH,SHELL
       MOVE SHELL,SHELL
       MOVE EAST,ANTEROOM
AT     BEDQUILT
       MOVE EAST,COMPLEX
       MOVE WEST,SWISS
       MOVE SLAB,SLAB
AT     BEDQUILT
       ANYOF     NORTH,SOUTH,UP,DOWN
       CHANCE    65
           SAY  CRAWL..CAVEIN
           QUIT
       ELSE
          MOVE  DOWN,ANTEROOM
           CHANCE    75
                MOVE NORTH,LOW
                MOVE UP,DUSTY
                MOVE SOUTH,SLAB
           ELSE
                MOVE NORTH,SECRETJUNCTION
                MOVE UP,SECRETNSCPAS
                MOVE SOUTH,TALLEWCNYN
          FIN
       FIN
AT     BEDQUILT
       KEYWORD   NW
       CHANCE   50
          SAY   YOUDIDNTMOVE
       ELSE
          GOTO  ORIENTAL
       FIN
       QUIT
AT     SWISS
       MOVE NE,BEDQUILT
       MOVE WEST,EEND2PIT
       MOVE CANYON,TALLEWCNYN
       MOVE EAST,SOFT
       MOVE ORIENTAL,ORIENTAL
       MOVE  SOFT,SOFT
       ANYOF NW,SOUTH
          CHANCE   65
             MOVE  NW,ORIENTAL
             SAY   YOUDIDNTMOVE
          ELSE
             MOVE  SOUTH,TALLEWCNYN
             SAY   YOUDIDNTMOVE
          FIN
          QUIT
       FIN
AT     EEND2PIT
       MOVE EAST,SWISS
       MOVE WEST,WEND2PIT
       MOVE CROSS,WEND2PIT
       MOVE DOWN,EASTPIT
       MOVE PIT,EASTPIT
AT     SLAB
       MOVE SOUTH,WEND2PIT
       MOVE UP,SECRETNSCYN
       MOVE CLIMB,SECRETNSCYN
       MOVE NORTH,BEDQUILT
       MOVE  BEDQUILT,BEDQUILT
AT     SECRETNSCYN
       MOVE DOWN,SLAB
       MOVE SLAB,SLAB
       MOVE NORTH,MIRRORCNYN
       MOVE MIRROR,MIRRORCNYN
       MOVE RESERVOIR,RESERVOIR
       MOVE  SOUTH,SECRETCYNNE1
AT     SECRETNSCPAS
       MOVE NORTH,SECRETJUNCTION
       MOVE DOWN,BEDQUILT
       MOVE PASSAGE,BEDQUILT
       MOVE SOUTH,STALACT
AT     SECRETJUNCTION
       MOVE SE,BEDQUILT
       MOVE SOUTH,SECRETNSCPAS
       MOVE NORTH,WINDOW2
AT     LOW
       MOVE BEDQUILT,BEDQUILT
       MOVE SW,SLOPING
       MOVE NORTH,DEADEND2
       MOVE SE,ORIENTAL
       MOVE ORIENTAL,ORIENTAL
AT     DEADEND2
       MOVE SOUTH,LOW
       MOVE CRAWL,LOW
       MOVE OUT,LOW
AT     SECRETEW.TITE
       MOVE EAST,MTKING
       MOVE DOWN,NSCANYONWIDE
AT     SECRETEW.TITE
       KEYWORD   WEST
       IFEQ DRAGON,0       * If it's alive...
           GOTO SECRETCYNNE2
       ELSE
           GOTO SECRETCYNNE1
       FIN
       QUIT
AT     NSCANYONWIDE
       MOVE SOUTH,TIGHTERSTILL
       MOVE NORTH,TALLEWCNYN
AT     TIGHTERSTILL
       MOVE NORTH,NSCANYONWIDE
AT     TALLEWCNYN
       MOVE EAST,NSCANYONWIDE
       MOVE WEST,DEADEND3
       MOVE NORTH,SWISS
       MOVE CRAWL,SWISS
AT     DEADEND3
       MOVE SOUTH,TALLEWCNYN
AT     MAZEA.80
       MOVE NORTH,MAZEA.42
       MOVE WEST,MAZEA.80
       MOVE SOUTH,MAZEA.80
       MOVE EAST,MAZEA.81
AT     MAZEA.81
       MOVE WEST,MAZEA.80
       MOVE OUT,MAZEA.80
AT     MAZEA.82
       MOVE SOUTH.MAZEA.44
       MOVE OUT,MAZEA.44
AT     MAZEA.83
       MOVE SOUTH,MAZEA.57.PIT
       MOVE EAST,MAZEA.84
       MOVE WEST,MAZEA.85
AT     MAZEA.84
       MOVE NORTH,MAZEA.57.PIT
       MOVE WEST,MAZEA.83
       MOVE NW,MAZEA.114
AT     MAZEA.85
       MOVE EAST,MAZEA.83
       MOVE OUT,MAZEA.83
AT     MAZEA.86
       MOVE UP,MAZEA.52
       MOVE OUT,MAZEA.52
AT     MAZEA.87
       MOVE UP,MAZEA.45
       MOVE DOWN,MAZEA.45
AT     NARROWCORRIDOR
       MOVE DOWN,WESTPIT
       MOVE CLIMB,WESTPIT
       MOVE EAST,WESTPIT
       MOVE WEST,GIANT
       MOVE GIANT,GIANT
AT     NARROWCORRIDOR
       KEYWORD  JUMP
       GOTO  WESTPIT
       CALL  SPLATTER
AT     INCLINE
       MOVE NORTH,CAVERN
       MOVE CAVERN,CAVERN
       MOVE PASSAGE,CAVERN
       SMOVE DOWN,LOW,OOF
       SMOVE CLIMB,LOW,OOF
AT     GIANT
       MOVE SOUTH,NARROWCORRIDOR
       MOVE CORRIDOR,NARROWCORRIDOR
       MOVE EAST,TUNNEL.1
       MOVE NORTH,IMMENSENSPASS
AT     IMMENSENSPASS
       MOVE SOUTH,GIANT
       MOVE GIANT,GIANT
       MOVE PASSAGE,GIANT
AT     IMMENSENSPASS
       ANYOF     NORTH,ENTER,CAVERN
       IFEQ DOOR,0
           SAY  DOORNEEDSOIL
       ELSE
           GOTO CAVERN
       FIN
       QUIT
AT     CAVERN
       MOVE SOUTH,IMMENSENSPASS
       MOVE OUT,IMMENSENSPASS
       MOVE GIANT,GIANT
       MOVE WEST,INCLINE
       MOVE INCLINE,INCLINE
AT     CAVERN
       ANYOF DOWN,JUMP       {jumping into whirlpool}
       QUERY WHIRLPOOL?
          LDA   J,LAMP
          SET   K,0
          ITOBJ I
             IFHAVE   I
                AND
                NOT
             IFEQ  I,J
                APPORT   I,YLEM
                ADD   K,1
             FIN
          EOI
          IFHAVE   LAMP
             SET   INVCT,1
             IFEQ  K,0
                SAY   FLOW.DOWN
             ELSE
                SAY   FLOW.RIP
             FIN
          ELSE
             SET   INVCT,0
             IFEQ  K,0
                SAY   FLOW.DARK
             ELSE
                SAY   FLOW.D.RIP
             FIN
          FIN
          GOTO  RESERVOIR.N
          SAY   WHIRL.LAND
       ELSE
          SAY   OK
       FIN
       QUIT
AT     SOFT
       MOVE WEST,SWISS
       MOVE OUT,SWISS
       MOVE  SWISS,SWISS
AT     ORIENTAL
       MOVE SE,SWISS
       MOVE WEST,LOW
       MOVE CRAWL,LOW
       MOVE UP,MISTY
       MOVE NORTH,MISTY
       MOVE CAVERN,MISTY
AT     MISTY
       MOVE SOUTH,ORIENTAL
       MOVE ORIENTAL,ORIENTAL
       MOVE WEST,ALCOVE
AT     MISTY
       KEYWORD  JUMP
       GOTO  CAVERN
       CALL  SPLATTER
       QUIT
AT     ALCOVE
       ANYOF LAST,PASSAGE,PLOVER
       IFEQ  INVCT,0
          GOTO PLOVER
       ELSE
          IFEQ  INVCT,1
             IFHAVE   EMERALD
                GOTO PLOVER
             ELSE
                SAY   WONT..FIT
             FIN
          ELSE
             SAY   WONT..FIT
          FIN
       FIN
       QUIT
AT     ALCOVE
       MOVE NW,MISTY
       MOVE CAVERN,MISTY
AT     PLOVER
       AT    PLOVER       {'cause can get here via "SAY PLOVER" too}
       KEYWORD  PLOVER
       IFEQ  STATUS,1
          OR
       IFKEY SAY
          IFHAVE   EMERALD
             DROP  EMERALD
          FIN
          SAY   FOOF
          GOTO Y2
          SET THERE,0          { bug fix. K.C.W }
          QUIT
       FIN
AT     PLOVER
       ANYOF WEST,PASSAGE,ALCOVE
       IFEQ  INVCT,0
          GOTO ALCOVE
       ELSE
          IFEQ  INVCT,1
             IFHAVE   EMERALD
                GOTO ALCOVE
             ELSE
                SAY   WONT..FIT
             FIN
          ELSE
             SAY   WONT..FIT
          FIN
       FIN
       QUIT
AT     PLOVER
       MOVE NE,DARK
       MOVE DARK,DARK
AT     DARK
       MOVE SOUTH,PLOVER
       MOVE PLOVER,PLOVER
       MOVE OUT,PLOVER
AT     ARCHED
       MOVE DOWN,SHELL
       MOVE SHELL,SHELL
       MOVE  UP,ARCH.COR.1
       MOVE  EAST,ARCH.COR.1
AT     SHELL
       MOVE UP,ARCHED
       MOVE HALL,ARCHED
       MOVE DOWN,RAGGEDCORRID
       MOVE  CORRIDOR,RAGGEDCORRID
AT     SHELL
       ANYOF     SOUTH,COMPLEX
       IFHAVE    CLAM
           SAY  CLAM.2.BIG
       ELSE
           IFHAVE    OYSTER
                SAY  OYSTER.2.BIG
           ELSE
                GOTO COMPLEX
       EOF
       QUIT
AT     RAGGEDCORRID
       MOVE UP,SHELL
       MOVE SHELL,SHELL
       MOVE DOWN,CULDESAC
AT     CULDESAC
       MOVE UP,RAGGEDCORRID
       MOVE OUT,RAGGEDCORRID
       MOVE  CORRIDOR,RAGGEDCORRID
       MOVE SHELL,SHELL
AT     ANTEROOM
       MOVE UP,COMPLEX
       MOVE WEST,BEDQUILT
       MOVE EAST,WITTSEND
AT     MAZED.107
       MOVE SOUTH,MAZED.131
       MOVE SW,MAZED.132
       MOVE NE,MAZED.133
       MOVE SE,MAZED.134
       MOVE UP,MAZED.135
       MOVE NW,MAZED.136
       MOVE EAST,MAZED.137
       MOVE WEST,MAZED.138
       MOVE NORTH,MAZED.139
       MOVE DOWN,LONGHALLWEST
AT     WITTSEND
       ANYOF     NORTH,SOUTH,EAST,UP,DOWN,NE,NW,SE,SW
       CHANCE    95
           GOTO WITTSEND
       ELSE
           GOTO ANTEROOM
       FIN
       QUIT
AT     WITTSEND
       KEYWORD   WEST
       GOTO  WITTSEND
       QUIT
AT     MIRRORCNYN
       KEYWORD  MIRROR
       SAY   TOO.FAR.UP
       QUIT
AT     MIRRORCNYN
       MOVE SOUTH,SECRETNSCYN
       MOVE NORTH,RESERVOIR
       MOVE RESERVOIR,RESERVOIR
AT     WINDOW2
       MOVE WEST,SECRETJUNCTION
AT     WINDOW2
       KEYWORD  JUMP
       SAY   BROKENECK
       GOTO  MIRRORCNYN
       CALL  CORONER
AT     STALACT
       MOVE NORTH,SECRETNSPAS
AT     STALACT
       ANYOF     DOWN,JUMP,CLIMB
       CHANCE    40
           GOTO MAZEA.50
       ELSE
           CHANCE    50
                GOTO MAZEA.53
           ELSE
                GOTO MAZEA.45
       EOF
       QUIT
AT     MAZED.112
       MOVE SW,MAZED.131
       MOVE NORTH,MAZED.132
       MOVE EAST,MAZED.133
       MOVE NW,MAZED.134
       MOVE SE,MAZED.135
       MOVE NE,MAZED.136
       MOVE WEST,MAZED.137
       MOVE DOWN,MAZED.138
       MOVE UP,MAZED.139
       MOVE SOUTH,MAZED.140
AT     RESERVOIR
       MOVE SOUTH,MIRRORCNYN
       MOVE OUT,MIRRORCNYN
       MOVE MIRROR,MIRRORCNYN
       IFKEY BACK              { bug fix. K.C.W. }
               LDA  I,RESERVOIR.N
               IFEQ I,THERE
                       SAY CANT.SWIM
                       QUIT
               FIN
       FIN
       ANYOF NORTH,CROSS
       SAY   CANT.SWIM
       QUIT
AT     RESERVOIR.N
       MOVE  NORTH,WARM
       MOVE  PASSAGE,WARM
       MOVE  WARM,WARM
       MOVE  BALCONY,BALCONY
       IFKEY BACK              { bug fix. K.C.W }
               LDA  I,CAVERN
               IFEQ I,THERE
                       SAY IAMGAME
                       QUIT
               FIN
               LDA  I,RESERVOIR
               IFEQ I,THERE
                       SAY CANT.SWIM
                       QUIT
               FIN
       FIN
       ANYOF SOUTH,CROSS
       IFNEAR   TURTLE
          SAY   TURTLE.BACK
          APPORT   TURTLE,LIMBO
          GOTO  RESERVOIR
       ELSE
          SAY   CANT.SWIM
       FIN
       QUIT
AT     WARM
       MOVE  SOUTH,RESERVOIR.N
       MOVE  RESERVOIR,RESERVOIR.N
       MOVE  NORTHEAST,BALCONY
       MOVE  BALCONY,BALCONY
AT     BALCONY
       MOVE  WEST,WARM
       MOVE  OUT,WARM
       MOVE  WARM,WARM
       MOVE  RESERVOIR,RESERVOIR.N
       KEYWORD  JUMP
       GOTO  YLEM
       CALL  SPLATTER
AT     MAZEA.114
       MOVE SE,MAZEA.84
AT     SWOFCHASM
       MOVE SW,SLOPING
       MOVE SLOPING,SLOPING
       MOVE CORRIDOR,SLOPING
AT     SWOFCHASM
       KEYWORD  THROW
       IFEQ  STATUS,1
          OR
       IFNEAR   TROLL2
          PROCEED
       ELSE
          IFKEY AXE
             OR
          IFKEY SWORD
             IFHAVE   ARG2
                NAME   EL.CHEAPO,ARG2
                DROP ARG2
             ELSE
                PROCEED
             FIN
          ELSE
             BIT   ARG2,OBJECT
                BIT   ARG2,VALUED
                   IFHAVE   ARG2
                      IFKEY EGGS
                        BIT   TROLL,SPECIAL1
                           SET   TROLL,6  {wary}
                           SAY   TROLL
                           SET   TROLL,0
                           APPORT   EGGS,YLEM {destroy eggs}
                           QUIT
                        FIN
                      FIN
                      NAME  BOUGHTHIMOFF,ARG2
                      SET   TROLL,1
                      APPORT   TROLL,LIMBO
                      APPORT   TROLL2,SWOFCHASM
                      APPORT   ARG2,LIMBO
                   ELSE
                      PROCEED
                   FIN
                ELSE
                   PROCEED
                FIN
             ELSE
                PROCEED
             FIN
          FIN
       FIN
       QUIT
AT     SWOFCHASM
       ANYOF CROSS,NE
       IFGT  CHASM,0
          SAY   NO.BRIDGE
       ELSE
          IFEQ  TROLL,0
             SAY   TROLL.SEZ.NO
          ELSE
             IFEQ  TROLL,2
                SET   TROLL,3
                SAY   TROLL
                SET   TROLL,0
                APPORT  TROLL,SWOFCHASM
                APPORT   TROLL2,LIMBO
             ELSE
                IFEQ  TROLL,1
                   SET   TROLL,2
                FIN
                GOTO  NEOFCHASM
             FIN
          FIN
       FIN
       QUIT
AT     SWOFCHASM
       KEYWORD  JUMP
       IFEQ  CHASM,0
          SAY   TRYTHEBRIDGE
       ELSE
          GOTO  YLEM
          CALL  SPLATTER
       FIN
       QUIT
AT     SLOPING
       MOVE DOWN,LOW
       MOVE UP,SWOFCHASM
       MOVE  CHASM,SWOFCHASM
       MOVE  LOW,LOW
       MOVE  OUT,LOW
AT     SECRETCYNNE1
       KEYWORD RUG
       IFEQ  DRAGON,0
          SAY   DRAGON.RUG
          QUIT
       FIN
AT     SECRETCYNNE1
       MOVE NORTH,SECRETNSCYN
       MOVE OUT,SECRETNSCYN
AT     SECRETCYNNE1
       ANYOF     FORWARD,EAST
       IFEQ DRAGON,0
           SAY  PAST.DRAGON
       ELSE
           GOTO SECRETEW.TITE
       FIN
       QUIT
AT     SECRETCYNNE2
       KEYWORD RUG
       IFEQ  DRAGON,0
          SAY   DRAGON.RUG
          QUIT
       FIN
AT     SECRETCYNNE2
       MOVE EAST,SECRETEW.TITE
       MOVE OUT,SECRETEW.TITE
AT     SECRETCYNNE2
       ANYOF     FORWARD,NORTH
       IFEQ DRAGON,0
          SAY  PAST.DRAGON
       ELSE
          GOTO SECRETNSCYN
       FIN
       QUIT
AT     NEOFCHASM
       KEYWORD  RELEASE,BEAR
       HAVE  BEAR
       NEAR  TROLL
       SET   TROLL,4
       SAY   BEAR..TROLL
       APPORT   TROLL,LIMBO
       APPORT   TROLL,SWOFCHASM
       DROP  BEAR
       QUIT
AT     NEOFCHASM
       KEYWORD  THROW
       IFEQ  STATUS,1
          OR
       IFNEAR   TROLL2
          PROCEED
       ELSE
          IFKEY AXE
             OR
          IFKEY SWORD
             IFHAVE   ARG2
                NAME   EL.CHEAPO,ARG2
                DROP ARG2
             ELSE
                PROCEED
             FIN
          ELSE
             BIT   ARG2,OBJECT
                BIT   ARG2,VALUED
                   IFHAVE   ARG2
                       IFKEY EGGS
                         BIT   TROLL.SPECIAL1
                            SET   TROLL,6  {wary}
                            SAY   TROLL
                            SET   TROLL,0
                            APPORT   EGGS,YLEM {destroy eggs}
                            QUIT
                         FIN
                       FIN
                       NAME  BOUGHTHIMOFF,ARG2
                       SET   TROLL,1
                       APPORT   TROLL,LIMBO
                       APPORT   TROLL2,SWOFCHASM
                       APPORT   ARG2,LIMBO
                   ELSE
                       PROCEED
                   FIN
                ELSE
                   PROCEED
                FIN
             ELSE
                PROCEED
             FIN
          FIN
       FIN
       QUIT
AT     NEOFCHASM
       ANYOF CROSS,SW
       IFGT  CHASM,0
          SAY   NO.BRIDGE
       ELSE
          IFEQ  TROLL,0
             SAY   TROLL.SEZ.NO
          ELSE
             IFEQ  TROLL,2
                SET   TROLL,3
                SAY   TROLL
                SET   TROLL,0
                APPORT  TROLL,SWOFCHASM
                APPORT   TROLL2,LIMBO
             ELSE
                IFEQ  TROLL,1
                   SET   TROLL,2
                FIN
                IFHAVE   BEAR
                   SAY   BEAR..BRIDGE
                   SET   CHASM,1
                   APPORT   TROLL2,LIMBO
                   GOTO  YLEM
                   CALL  CORONER
                ELSE
                   IFEQ  TROLL,4  {scared him off?}
                       AND
                   BIT   TROLL,SPECIAL1 {already stole eggs back?}
                       IFNEAR   BEAR
                         GET   BEAR
                         SET   CHASM,1
                         SAY   REVENGE
                       ELSE
                         SET   CHASM,2
                         SAY   REVENGE.1
                       FIN
                       APPORT   TROLL2,LIMBO
                       GOTO  YLEM
                       CALL  CORONER
                   ELSE
                       GOTO  SWOFCHASM
                   FIN
                FIN
             FIN
          FIN
       FIN
       QUIT
AT     NEOFCHASM
       KEYWORD  JUMP
       IFEQ  CHASM,0
          SAY   TRYTHEBRIDGE
       ELSE
          GOTO  YLEM
          CALL  SPLATTER
       FIN
       QUIT
AT     NEOFCHASM
       MOVE NE,CORRIDOR
       MOVE  CORRIDOR,CORRIDOR
       MOVE FORK,FORK
       MOVE VIEW,BREATHTAKER
       MVOE BARREN,BARREN
AT     CORRIDOR
       MOVE  CHASM,NEOFCHASM
       MOVE WEST,NEOFCHASM
       MOVE EAST,FORK
       MOVE FORK,FORK
       MOVE VIEW,BREATHTAKER
       MOVE BARREN,BARREN
AT     FORK
       MOVE  CHASM,NEOFCHASM
       MOVE WEST,CORRIDOR
       MOVE  CORRIDOR,CORRIDOR
       MOVE NE,WARMJUNCTN
       MOVE LEFT,WARMJUNCTN
       MOVE SE,LIMESTONE
       MOVE RIGHT,LIMESTONE
       MOVE DOWN,LIMESTONE
       MOVE VIEW,BREATHTAKER
       MOVE BARREN,BARREN
AT     WARMJUNCTN
       MOVE SOUTH,FORK
       MOVE FORK,FORK
       MOVE NORTH,BREATHTAKER
       MOVE VIEW,BREATHTAKER
       MOVE EAST,BOULDERS
       MOVE CRAWL,BOULDERS
AT     BREATHTAKER
       MOVE SOUTH,WARMJUNCTN
       MOVE PASSAGE,WARMJUNCTN
       MOVE OUT,WARMJUNCTN
       MOVE FORK,FORK
       IFKEY BACK              { bug fix. K.C.W. }
               LDA  I,FACES
               IFEQ I,THERE
                  AND
               IFEQ GORGE,0    { no bridge }
                       SAY NO.ARCH
                       QUIT
               FIN
       FIN
AT     BREATHTAKER
       ANYOF     JUMP,DOWN,CLIMB
       GOTO  YLEM
       CALL  SPLATTER             * let him plummet to a painful death.
AT     BREATHTAKER
       ANYOF VALLEY,CROSS,GORGE,NORTH
       IFEQ  GORGE,0
          SAY   NO.ARCH
       ELSE
          IFHAVE   BEAR
             SAY   LEAVE.BEAR
          ELSE
             IFHAVE   RING
                NOT
                BIT   FACES,BEENHERE
                   SAY   FUMES.MISS
                FIN
                GOTO  FACES
             ELSE
                SAY   FUMES.BURN
                GOTO  YLEM
                CALL  CORONER
             FIN
          FIN
       FIN
       QUIT
AT     BOULDERS
       MOVE WEST,WARMJUNCTN
       MOVE OUT,WARMJUNCTN
       MOVE CRAWL,WARMJUNCTN
       MOVE FORK,FORK
       MOVE VIEW,BREATHTAKER
AT     LIMESTONE
       MOVE NORTH,FORK
       MOVE UP,FORK
       MOVE FORK,FORK
       MOVE SOUTH,BARREN
       MOVE DOWN,BARREN
       MOVE BARREN,BARREN
       MOVE VIEW,BREATHTAKER
AT     BARREN
       MOVE WEST,LIMESTONE
       MOVE UP,LIMESTONE
       MOVE FORK,FORK
       MOVE EAST,BEARHERE
       MOVE INWARD,BEARHERE
       MOVE BARREN,BEARHERE
       MOVE ENTER,BEARHERE
       MOVE VIEW,BREATHTAKER
AT     BEARHERE
       KEYWORD  GET,AXE
       NEAR  AXE
       IFHAVE   AXE
          OR
       IFEQ  AXE,0
          PROCEED
       ELSE
          NAME  CANTGETAXE,ARG2
          QUIT
       FIN
AT     BEARHERE
       MOVE WEST,BARREN
       MOVE OUT,BARREN
       MOVE FORK,FORK
       MOVE VIEW,BREATHTAKER
AT     MAZED.131
       MOVE WEST,MAZED.107
       MOVE SE,MAZED.132
       MOVE NW,MAZED.133
       MOVE SW,MAZED.134
       MOVE NE,MAZED.135
       MOVE UP,MAZED.136
       MOVE DOWN,MAZED.137
       MOVE NORTH,MAZED.138
       MOVE SOUTH,MAZED.139
       mOVE EAST,MAZED.112
AT     MAZED.132
       MOVE NW,MAZED.107
       MOVE UP,MAZED.131
       MOVE NORTH,MAZED.133
       MOVE SOUTH,MAZED.134
       MOVE WEST,MAZED.135
       MOVE SW,MAZED.136
       MOVE NE,MAZED.137
       MOVE EAST,MAZED.138
       MOVE DOWN,MAZED.139
       MOVE SE,MAZED.112
AT     MAZED.133
       MOVE UP,MAZED.107
       MOVE DOWN,MAZED.131
       MOVE WEST,MAZED.132
       MOVE NE,MAZED.134
       MOVE SW,MAZED.135
       MOVE EAST,MAZED.136
       MOVE NORTH,MAZED.137
       MOVE NW,MAZED.138
       MOVE SE,MAZED.139
       MOVE SOUTH,MAZED.112
AT     MAZED.134
       MOVE NE,MAZED.107
       MOVE NORTH,MAZED.131
       MOVE NW,MAZED.132
       MOVE SE,MAZED.133
       MOVE EAST,MAZED.135
       MOVE DOWN,MAZED.136
       MOVE SOUTH,MAZED.137
       MOVE UP,MAZED.138
       MOVE WEST,MAZED.139
       MOVE SW,MAZED.112
AT     MAZED.135
       MOVE NORTH,MAZED.107
       MOVE SE,MAZED.131
       MOVE DOWN,MAZED.132
       MOVE SOUTH,MAZED.133
       MOVE EAST,MAZED.134
       MOVE WEST,MAZED.136
       MOVE SW,MAZED.137
       MOVE NE,MAZED.138
       MOVE NW,MAZED.139
       MOVE UP,MAZED.112
AT     MAZED.136
       MOVE EAST,MAZED.107
       MOVE WEST,MAZED.131
       MOVE UP,MAZED.132
       MOVE SW,MAZED.133
       MOVE DOWN,MAZED.134
       MOVE SOUTH,MAZED.135
       MOVE NW,MAZED.137
       MOVE SE,MAZED.138
       MOVE NE,MAZED.139
       MOVE NORTH,MAZED.112
AT     MAZED.137
       MOVE SE,MAZED.107
       MOVE NE,MAZED.131
       MOVE SOUTH,MAZED.132
       MOVE DOWN,MAZED.133
       MOVE UP,MAZED.134
       MOVE NW,MAZED.135
       MOVE NORTH,MAZED.136
       MOVE SW,MAZED.138
       MOVE EAST,MAZED.139
       MOVE WEST,MAZED.112
AT     MAZED.138
       MOVE DOWN,MAZED.107
       MOVE EAST,MAZED.131
       MOVE NE,MAZED.132
       MOVE UP,MAZED.133
       MOVE WEST,MAZED.134
       MOVE NORTH,MAZED.135
       MOVE SOUTH,MAZED.136
       MOVE SE,MAZED.137
       MOVE SW,MAZED.139
       MOVE NW,MAZED.112
AT     MAZED.139
       MOVE SW,MAZED.107
       MOVE NW,MAZED.131
       MOVE EAST,MAZED.132
       MOVE WEST,MAZED.133
       MOVE NORTH,MAZED.134
       MOVE DOWN,MAZED.135
       MOVE SE,MAZED.136
       MOVE UP,MAZED.137
       MOVE SOUTH,MAZED.138
       MOVE NE,MAZED.112
AT     MAZED.140
       MOVE NORTH,MAZED.112
       MOVE OUT,MAZED.112
AT     MAZED.140
       KEYWORD  DROP,COINS
       HAVE  COINS
       APPORT   COINS,LIMBO
       APPORT   BATTERIES,HERE
       SAY   OK
       SAY   BATTERIES
       QUIT
AT     LIMBO
       MOVE  OUT,BUILDING *kludge*
AT     SANDSTONE
       MOVE  WEST,MISTS
       MOVE  OUT,MISTS
       MOVE  MISTS,MISTS
AT     MORION
       MOVE  SOUTH,MTKING
       MOVE  OUT,MTKING
AT     VAULT
       ANYOF UP,OUT,NORTH
       IFEQ  SAFE,1
          SAY   SAFE.BLOCKS
       ELSE
          GOTO  MTKING
       FIN
       QUIT
AT     VAULT
       IFKEY BACK              { bug fix. K.C.W. }
               LDA  I,INSAFE
               IFEQ I,THERE
                  AND
               IFEQ SAFE,0     { closed }
                       SAY CANTENTERSAFE
                       QUIT
               FIN
       FIN
       KEYWORD  IN
       IFEQ  SAFE,1
          SET   SAFEEXIT,HERE
          GOTO  INSAFE
       ELSE
          SAY   CANTENTERSAFE
       FIN
       QUIT
AT     INSAFE   { inside the safe - strange stuff happens here!}
       KEYWORD  OUT    {it's the only way you can go}
       GOTO  SAFEEXIT {which was set when you came in}
       QUIT
AT     INSAFE   {special handling for the safe, within the safe!}
       KEYWORD  SAFE
       IFEQ  STATUS,1
          NAME  WHAT.DO,ARG2
       ELSE
          IFKEY CLOSE
             SAY   NO.HANDLE
          ELSE
             IFKEY OPEN
                NAME  ALREADY.OPEN,ARG2
             ELSE
                SAY   HAH!
             FIN
          FIN
       FIN
       QUIT
AT     CORRID.1
       MOVE  SOUTH,MTKING
       MOVE  NORTH,CORRID.2
AT     CORRID.2
       MOVE  SOUTH,CORRID.1
       MOVE  WEST,CORRID.1
       MOVE  NORTH,TOOL
       MOVE  EAST,TOOL
AT     TOOL
       MOVE  OUT,CORRID.2
       MOVE  SOUTH,CORRID.2
AT     CORRID.3
       MOVE  SOUTH,MTKING
       MOVE  NORTH,SPHERICAL
       MOVE  EAST,CUBICLE
AT     CUBICLE
       MOVE  OUT,CORRID.3
       MOVE  CORRIDOR,CORRID.3
       MOVE  SOUTH,CORRID.3
AT     SPHERICAL
       MOVE  OUT,CORRID.3
       MOVE  NORTH,CORRID.3
       MOVE  CORRIDOR,CORRID.3
AT     TUNNEL.1
       MOVE  SOUTH,GIANT
       MOVE  NORTH,GLASSY
AT     GLASSY
       MOVE  SOUTH,TUNNEL.1
AT     GLASSY
       ANYOF NORTH,LAIR
       IFNEAR   OGRE
          SAY   OGRE.BLOCKS
       ELSE
          GOTO  LAIR
       FIN
       QUIT
AT     LAIR
       MOVE  EAST,BRINK.1
       MOVE  WEST,GLASSY
AT     BRINK.1
       MOVE  NORTH,LAIR
       MOVE  WEST,BRINK.2
       MOVE  EAST,BRINK.3
        MOVE  NORTH,LAIR
AT     BRINK.1
       KEYWORD  JUMP
       CALL  PLUNGE
AT     BRINK.2
       MOVE  NORTH,BRINK.1
       MOVE  SOUTHEAST,ICE
AT     BRINK.2
       KEYWORD  JUMP
       CALL  PLUNGE
AT     ICE
       MOVE  NORTHWEST,BRINK.2
       SMOVE  DOWN,SLIDE,OOF
       SMOVE  EAST,SLIDE,OOF
       SMOVE  SLIDE,SLIDE,OOF
AT     SLIDE
       ANYOF SLIDE,UP,NORTH,CLIMB
       SAY   SLIDE.SLIPPERY
       QUIT
AT     SLIDE
       MOVE  SOUTH,ICECAVE.2A
       MOVE  NORTHWEST,ICECAVE.4
AT     ICECAVE.1
       MOVE  WEST,ICECAVE.2
       MOVE  NORTH,ICECAVE.1A
AT     ICECAVE.1A
       MOVE  SOUTH,ICECAVE.1
AT     ICECAVE.2
       MOVE  EAST,ICECAVE.1
       MOVE  WEST,ICECAVE.3
       MOVE  NORTH,ICECAVE.2A
AT     ICECAVE.2A
       MOVE  NORTH,SLIDE
       MOVE  SOUTH,ICECAVE.2
AT     ICECAVE.3
       MOVE  EAST,ICECAVE.2
       MOVE  NORTH,ICECAVE.3A
AT     ICECAVE.3A
       MOVE  SOUTH,ICECAVE.3
AT     ICECAVE.4
       MOVE  EAST,SLIDE
       MOVE  WEST,ICECAVE.5
AT     ICECAVE.5
       MOVE  NORTHEAST,ICECAVE.4
       MOVE  SOUTH,ICECAVE.6
AT     ICECAVE.6
       MOVE  NORTH,ICECAVE.5
       MOVE  SOUTH,ICECAVE.7
       MOVE  WEST,ICECAVE.9
AT     ICECAVE.7
       MOVE  NORTH,ICECAVE.6
AT     ICECAVE.8
       MOVE  NORTH,ICECAVE.9
AT     ICECAVE.9
       MOVE  EAST,ICECAVE.6
       MOVE  SOUTH,ICECAVE.8
       MOVE  NORTH,ICECAVE.10
AT     ICECAVE.10
       MOVE  SOUTH,ICECAVE.9
       MOVE  NORTHWEST,ICECAVE.11
AT     ICECAVE.11
       MOVE  EAST,ICECAVE.10
       MOVE  WEST,ICECAVE.12
AT     ICECAVE.12
       MOVE  NORTHEAST,ICECAVE.11
       MOVE  SOUTH,ICECAVE.12A
       MOVE  WEST,ICECAVE.15
AT     ICECAVE.12A
       MOVE  NORTH,ICECAVE.12
       MOVE  SOUTH,ICECAVE.13
AT     ICECAVE.13
       MOVE  NORTH,ICECAVE.12A
AT     ICECAVE.14
       MOVE  NORTH,ICECAVE.15A
AT     ICECAVE.15
       MOVE  EAST,ICECAVE.12
       MOVE  SOUTH,ICECAVE.15A
       MOVE  NORTHWEST,ICECAVE.16
AT     ICECAVE.15A
       MOVE  SOUTH,ICECAVE.14
       MOVE  NORTH,ICECAVE.15
AT     ICECAVE.16
       MOVE  EAST,ICECAVE.15
       MOVE  WEST,ICECAVE.17
AT     ICECAVE.17
       MOVE  NORTHEAST,ICECAVE.16
       MOVE  SOUTH,ICECAVE.18
AT     ICECAVE.18
       MOVE  NORTH,ICECAVE.17
       MOVE  SOUTH,ICECAVE.19
       MOVE  WEST,ICECAVE.21
       MOVE  NORTHWEST,ICECAVE.22
AT     ICECAVE.19
       MOVE  NORTH,ICECAVE.18
       MOVE  WEST,ICECAVE.20
AT     ICECAVE.20
       MOVE  EAST,ICECAVE.19
       MOVE  NORTH,ICECAVE.21
AT     ICECAVE.21
       MOVE  EAST,ICECAVE.18
       MOVE  SOUTH,ICECAVE.20
AT     ICECAVE.22
       MOVE  SOUTHEAST,ICECAVE.18
       MOVE  NORTHWEST,ICECAVE.23
AT     ICECAVE.23
       MOVE  EAST,ICECAVE.22
       MOVE  WEST,ICECAVE.24
AT     ICECAVE.24
       MOVE  NORTHEAST,ICECAVE.23
       MOVE  SOUTH,ICECAVE.25
       MOVE  WEST,ICECAVE.29
AT     ICECAVE.25
       MOVE  NORTH,ICECAVE.24
       MOVE  SOUTH,ICECAVE.26
       MOVE  WEST,ICECAVE.28
       MOVE  NORTHWEST,ICECAVE.28A
AT     ICECAVE.26
       MOVE  NORTH,ICECAVE.25
       MOVE  NORTHWEST,ICECAVE.27
AT     ICECAVE.27
       MOVE  SOUTHEAST,ICECAVE.26
       MOVE  NORTH,ICECAVE.28
AT     ICECAVE.28
       MOVE  EAST,ICECAVE.25
       MOVE  SOUTH,ICECAVE.27
AT     ICECAVE.28A
       MOVE  SOUTHEAST,ICECAVE.25
       MOVE  NORTH,ICECAVE.29
AT     ICECAVE.29
       MOVE  EAST,ICECAVE.24
       MOVE  SOUTH,ICECAVE.28A
       MOVE  NORTHWEST,ICECAVE.30
AT     ICECAVE.30
       MOVE  EAST,ICECAVE.29
       SMOVE THURB,ICE,FOOF
AT     BRINK.3
       MOVE  NORTH,BRINK.1
       MOVE  NORTHEAST,CRACK.1
       MOVE  CRACK,CRACK.1
AT     BRINK.3
       KEYWORD  JUMP
       CALL  PLUNGE
AT     CRACK.1
       MOVE  SOUTHWEST,BRINK.3
       MOVE  SOUTHEAST,CRACK.2
AT     CRACK.2
       MOVE  WEST,CRANK.1
AT     CRACK.2
       KEYWORD  SOUTH
       IFNEAR   SLIME
          SAY   SLIMED
          CALL  CORONER
       ELSE
          GOTO  CRACK.3
       FIN
       QUIT
AT     CRACK.3
       MOVE  NORTH,CRACK.2
       MOVE  SOUTH,CRACK.4
       MOVE  CRAWL,CRACK.4
AT     CRACK.4
       MOVE  NORTH,CRACK.3
       MOVE  OUT,CRACK.3
       MOVE  CRAWL,CRACK.3
AT     ARCH.COR.1
       MOVE  WEST,ARCHED
AT     ARCH.COR.1
       KEYWORD  EAST
       IFEQ  QUICKSAND,0
          OR
       IFHAVE   CLAM
          OR
       IFHAVE   OYSTER
          SET   QUICKSAND,0
          BIT   QUICKSAND,SPECIAL1
             SAY   SCHLURP2
          ELSE
             SAY   SCHLURP
             BIS   QUICKSAND,SPECIAL1
          FIN
          GOTO  YLEM
          CALL  CORONER
       ELSE
          GOTO  ARCH.COR.2
          SET   QUICKSAND,0
       FIN
       QUIT
AT     ARCH.COR.2
       MOVE  NORTH,ARCH.FORK
AT     ARCH.COR.2
       KEYWORD   WEST
       IFEQ  QUICKSAND,0
          BIT   QUICKSAND,SPECIAL1
             SAY   SCHLURP2
          ELSE
             SAY   SCHLURP
             BIS   QUICKSAND,SPECIAL1
          FIN
          GOTO  YLEM
          CALL  CORONER
       ELSE
          GOTO  ARCH.COR.1
          SET   QUICKSAND,0
       FIN
       QUIT
AT     ARCH.FORK
       MOVE  SOUTH,ARCH.COR.2
       MOVE  NORTH,FOURIER
       MOVE  EAST,JONAH
       MOVE  JONAH,JONAH
       MOVE  FOURIER,FOURIER
AT     FOURIER
       MOVE  NORTHWEST,ARCH.FORK
       MOVE  SOUTHWEST,SHELF
AT     SHELF
       MOVE  WEST,FOURIER
       MOVE  DOWN,BEACH
       MOVE  STEPS,BEACh
AT     BEACH
       ANYOF UP,SHELF,STEPS,WEST
       SET   DINGHY,1
       GOTO  SHELF
       QUIT
AT     BEACH
       ANYOF WATER,FILL,DRINK
       SAY   SALT.H20.BAD
       QUIT
AT     JONAH
       MOVE  SOUTH,IN.JONAH
       MOVE  WEST,ARCH.FORK
AT     IN.JONAH
       MOVE  NORTH,JONAH
       MOVE  OUT,JONAH
AT     FACES
       MOVE  NORTH,BY.FIGURE
       IFKEY BACK              { bug fix. K.C.W. }
               LDA  I,BREATHTAKER
               IFEQ I,THERE
                  AND
               IFEQ GORGE,0    { no bridge }
                       SAY NO.ARCH
                       QUIT
               FIN
       FIN
AT     FACES
       ANYOF CROSS,GORGE,SOUTH
       IFEQ  GORGE,0
          SAY   NO.ARCH
       ELSE
          IFHAVE   RING
             IFHAVE   SCEPTRE
                SAY   GHOST.BANG
                GOTO  YLEM
                SET   GORGE,0
                CALL  CORONER
             ELSE
                GOTO  BREATHTAKER
             FIN
          ELSE
             SAY   FUMES.BURN
             GOTO  YLEM
             CALL  CORONER
          FIN
       FIN
       QUIT
AT     BY.FIGURE
       IFEQ  STATUE,1
          MOVE  NORTHWEST,PLAIN.1
          MOVE  NORTH,BASQUE.1
          MOVE  NORTHEAST,BANSHEE.1
       FIN
       MOVE  SOUTH,FACES
AT     PLAIN.1
       MOVE  SOUTH,BY.FIGURE
       IFKEY NORTH
          SET   FOG.0
          APPORT   FOG,PLAIN.2
          GOTO  PLAIN.2
          QUIT
       FIN
AT     PLAIN.2
       ANYOF NORTH,EAST,SOUTH,WEST
       ANYOF NE,NW,SE,SW
       ITLIST   I     {if this turkey left anything here in the fog.}
          IFNEAR   I
             AND
             NOT
          IFHAVE   I
             AND
          BIT   I,PORTABLE  {he's going to lose it forever!}
             APPORT   I,YLEM
          FIN
       EOI
       LDA   I,EAST
       ADD   1,GLOW
       IFEQ  I,ARG2
          AND
       IFEQ  STATUS,2
          OR
       IFEQ  I,ARG1
          AND
       IFNEAR   GLOW     {by luck? or did he know for sure?}
          GOTO  PLAIN.3
          SET   FOG.8    {so it's not obvious}
       ELSE
          GOTO  PLAIN.2  {bad moves - stumble back here!}
       FIN
       QUIT
AT     PLAIN.3
       IFKEY DOWN
          GOTO  NONDESCRIPT
          APPORT   FOG,PLAIN.1
          QUIT
       FIN
AT     PLAIN.3
       ANYOF NORTH,EAST,SOUTH,WEST
       ANYOF NE,NW,SE,SW
       GOTO  PLAIN.2
       SET   FOG,0    {so it starts changing again}
       QUIT
AT     NONDESCRIPT
       MOVE  NORTH,PENTAGRAM
       MOVE  PENTAGRAM,PENTAGRAM
AT     NONDESCRIPT
       ANYOF UP,SOUTH
       APPORT   FOG,PLAIN.2
       GOTO  PLAIN.3
       QUIT
AT     PENTAGRAM
       KEYWORD FLASK
       ANYOF DROP,THROW
       HAVE  FLASK
       IFEQ  FLASK,1
          DROP  FLASK
          SAY   SET.FLASK.DOWN
          SET   FLASK,0
          QUIT
       FIN
AT     PENTAGRAM
       MOVE  WEST,NONDESCRIPT
       MOVE  OUT,NONDESCRIPT
       MOVE  NONDESCRIPT,NONDESCRIPT
       MOVE  NORTH,CHIMNEY
       MOVE  CRACK,CHIMNEY
       MOVE  CHIMNEY,CHIMNEY
AT     CHIMNEY
       MOVE  UP,TUBE
       MOVE  CLIMB,TUBE
       MOVE  TUBE,TUBE
       MOVE  SOUTH,PENTAGRAM
       MOVE  PENTAGRAM,PENTAGRAM
       MOVE  CRACK,PENTAGRAM
AT     TUBE
       MOVE  DOWN,CHIMNEY
       MOVE  CHIMNEY,CHIMNEY
       MOVE  CLIMB,CHIMNEY
       MOVE  TUBE,TUBE.SLIDE
       MOVE  SLIDE,TUBE.SLIDE
       MOVE  SOUTH,TUBE.SLIDE
AT     TUBE.SLIDE
       SMOVE SOUTH,PLAIN.1,OOF
       SMOVE DOWN,PLAIN.1,OOF
       SMOVE SLIDE,PLAIN.1,OOF
       MOVE  NORTH,TUBE
       MOVE  CHIMNEY,CHIMNEY
       MOVE  TUBE,CHIMNEY
AT     BASQUE.1
       MOVE  SOUTH,BY.FIGURE
       IFKEY NORTH
          GOTO  BASQUE.2
          ADD   BASILISK,1
          IFEQ  BASILISK,1
             SAY   BAS.GRUMBLE
          FIN
          QUIT
       FIN
AT     BASQUE.2
       MOVE  NORTH,BASQUE.FORK
       IFKEY SOUTH
          SUB   BASILISK,1
          IFEQ  BASILISK,0
             IFHAVE   PLATE
                SAY   PETRIFY.SELF
                SET   BASILISK,2
             ELSE
                SAY   PETRIFY.ME
                CALL  CORONER
             FIN
          FIN
          GOTO  BASQUE.1
          QUIT
       FIN
AT     BASQUE.FORK
       MOVE  NORTH,PEELGRUNT
       MOVE  PEELGRUNT,PEELGRUNT
       MOVE  SOUTH,BASQUE.2
       MOVE  DOWn,ON.STEPS
       MOVE  STEPS,ON.STEPS
AT     PEELGRUNT
       ANYOF SOUTH,OUT.FORK
       IFEQ  SAFE,1
          SAY   SAFE.BLOCKS
       ELSE
          GOTO  BASQUE.FORK
       FIN
       QUIT
AT     PEELGRUNT
       IFKEY BACK              { bug fix. K.C.W. }
               LDA  I,INSAFE
               IFEQ I,THERE
                  AND
               IFEQ SAFE,0     { closed }
                       SAY CANTENTERSAFE
                       QUIT
               FIN
       FIN
       KEYWORD  IN
       IFEQ  SAFE,1
          SET   SAFEEXIT,HERE
          GOTO  INSAFE
       ELSE
          SAY   CANTENTERSAFE
       FIN
       QUIT
AT     ON.STEPS
       MOVE  UP,BASQUE.FORK
       MOVE  DOWN,STEPS.EXIT
       MOVE  STEPS,STEPS.EXIT
AT     STEPS.EXIT
       MOVE  UP,ON.STEPS
       MOVE  DOWN,STORAGE
       MOVE  NORTH,FAKE.Y2
       MOVE  STEPS,STORAGE
       MOVE  EXIT,FAKE.Y2
AT     STORAGE
       MOVE  UP,STEPS.EXIT
       MOVE  STEPS,STEPS.EXIT
AT     FAKE.Y2
       MOVE  SOUTH,STEPS.EXIT
       MOVE  WEST,CATACOMBS.1
       MOVE  EAST,FAKE.JUMBLE
AT     FAKE.Y2
       ANYOF PLUGH,PLOVER
       BIT   ADMIN,NOMAGIC
          SAY   NOTHING
       ELSE
          SAY   FOOF
          GOTO  PLATFORM
       FIN
       QUIT
AT     FAKE.JUMBLE
       MOVE  DOWN,FAKE.Y2
       MOVE  WEST,FAKE.Y2
       MOVE  UP,CATACOMBS.1
AT     AUDIENCE
       MOVE  EAST,AUDIENCE.E
       MOVE  WEST,CATACOMBS.11
AT     AUDIENCE.E
       MOVE  WEST.AUDIENCE
AT     CATACOMBS.1
       MOVE  SOUTH,CATACOMBS.2
       ANYOF NORTH,NW,WEST,SW,SE,EAST,NE,UP,DOWN
       GOTO  CATACOMBS.1
       QUIT
AT     CATACOMBS.2
       MOVE  SW,CATACOMBS.3
       ANYOF NORTH,NW,WEST,SOUTH,SE,EAST,NE,UP,DOWN
       GOTO  CATACOMBS.1
       QUIT
AT     CATACOMBS.3
       MOVE  NW,CATACOMBS.4
       ANYOF NORTH,WEST,SW,SOUTH,SE,EAST,NE,UP,DOWN
       GOTO  CATACOMBS.2
       QUIT
AT     CATACOMBS.4
       MOVE  SOUTH,CATACOMBS.5
       ANYOF NORTH,NW,WEST,SW,SE,EAST,NE,UP,DOWN
       GOTO  CATACOMBS.3
       QUIT
AT     CATACOMBS.5
       MOVE  DOWN,CATACOMBS.6
       ANYOF NORTH,NW,WEST,SW,SOUTH,SE,EAST,NE,UP
       GOTO  CATACOMBS.4
       QUIT
AT     CATACOMBS.6
       MOVE  WEST,CATACOMBS.7
       ANYOF NORTH,NW,SW,SOUTH,SE,EAST,NE,UP,DOWN
       GOTO  CATACOMBS.5
       QUIT
AT     CATACOMBS.7
       MOVE  NW,CATACOMBS.8
       ANYOF NORTH,WEST,SW,SOUTH,SE,EAST,NE,UP,DOWN
       GOTO  CATACOMBS.6
       QUIT
AT     CATACOMBS.8
       MOVE  NORTH,CATACOMBS.9
       ANYOF NW,WEST,SW,SOUTH,SE,EAST,NE,UP,DOWN
       GOTO  CATACOMBS.7
       QUIT
AT     CATACOMBS.9
       MOVE  SOUTH,CATACOMBS.10
       ANYOF NORTH,NW,WEST,SW,SE,EAST,NE,UP,DOWN
       GOTO  CATACOMBS.8
       QUIT
AT     CATACOMBS.10
       MOVE  NORTH,CATACOMBS.11
       ANYOF NW,WEST,SW,SOUTH,SE,EAST,NE,UP,DOWN
       GOTO  CATACOMBS.9
       QUIT
AT     CATACOMBS.11
       MOVE  SW.CATACOMBS.12
       MOVE  EAST,AUDIENCE
       ANYOF NORTH,NW,WEST,SOUTH,SE,NE,UP,DOWN
       GOTO  CATACOMBS.10
       QUIT
AT     CATACOMBS.12
       MOVE  EAST,CATACOMBS.13
       ANYOF NORTH,NW,WEST,SW,SOUTH,SE,NE,UP,DOWN
       GOTO  CATACOMBS.11
       QUIT
AT     CATACOMBS.13
       MOVE  SE,CATACOMBS.14
       ANYOF NORTH,NW,WEST,SW,SOUTH,EAST,NE,UP,DOWN
       GOTO  CATACOMBS.12
       QUIT
AT     CATACOMBS.14
       MOVE  NE,CATACOMBS.15
       ANYOF NORTH,NW,WEST,SW,SOUTH,SE,EAST,UP,DOWN
       GOTO  CATACOMBS.13
       QUIT
AT     CATACOMBS.15
       MOVE  EAST,CATACOMBS.16
       ANYOF NORTH,NW,WEST,SW,SOUTH,SE,NE,UP,DOWN
       GOTO  CATACOMBS.14
       QUIT
AT     CATACOMBS.16
       MOVE SE,CATACOMBS.17
       ANYOF NORTH,NW,WEST,SW,SOUTH,EAST,NE,UP,DOWN
       GOTO  CATACOMBS.15
       QUIT
AT     CATACOMBS.17
       MOVE  DOWN,CATACOMBS.18
       ANYOF NORTH,NW,WEST,SW,SOUTH,SE,EAST,NE,UP
       GOTO  CATACOMBS.16
       QUIT
AT     CATACOMBS.18
       MOVE  SOUTH,CATACOMBS.19
       ANYOF NORTH,NW,WEST,SW,SE,EAST,NE,UP,DOWN
       GOTO  CATACOMBS.17
       QUIT
AT     CATACOMBS.19
       MOVE  NORTH,FAKE.Y2
       ANYOF NW,WEST,SW,SOUTH,SE,EAST,NE,UP,DOWN
       GOTO  CATACOMBS.18
       QUIT
AT     BANSHEE.1
       MOVE  NORTHWEST,BY.FIGURE
       MOVE  NORTH,GOLDEN
       MOVE  GOLDEN,GOLDEN
AT     GOLDEN
       MOVE  NORTHEAST,ARABESQUE
       MOVE  NORTHWEST,TRANSLUCENT
       MOVE  ARABESQUE,ARABESQUE
       MOVE  TRANSLUCENT,TRANSLUCENT
       MOVE  SOUTH,BANSHEE.1
AT     ARABESQUE
       MOVE  SOUTH,GOLDEN
       MOVE  OUT,GOLDEN
       MOVE  GOLDEN,GOLDEN
AT     TRANSLUCENT
       ANYOF OUT,EAST,GOLDEN
       NOT
       BIT   GOBLINS,SPECIAL1
          BIS   GOBLINS,SPECIAL1
          APPORT   GOBLINS,HERE
          SET   GOBLINS,-1
       FIN
       GOTO  GOLDEN
       QUIT
AT     PLATFORM
       SMOVE PLUGH,FAKE.Y2,FOOF
       SMOVE PLOVER,FAKE.Y2,FOOF
AT     PLATFORM
       ANYOF DOWN,CLIMB,NORTH,SOUTH,EAST,WEST,NORTHEAST
       ANYOF NORTHWEST,SOUTHEAST,SOUTHWEST,JUMP
       SAY   SIZZLE
       GOTO  YLEM
       CALL  CORONER
AT     CYLINDRICAL
       ANYOF ZORTON,XYZZY,THURB,SNOEZE,SAMOHT,PLUGH,NOSIDE,MELENKURION
       ANYOF KNERL,KLAETU,FOO,FOE,FIE,FEE,BLERBI,PHUGGG
       IFKEY SAY
          SET   I,ARG2
       ELSE
          IFEQ  STATUS,1
             SET   I,ARG1
          ELSE
             SET   I,0
          FIN
       FIN
       LDA   J,ZORTON
       SUB   I,J
       IFEQ  I,ESCAPE
          IFKEY BLERBI
             SET   CLOSURE,4
             SET   FOOF
             GOTO  ROAD
          ELSE
             SAY   OK!
             ADD   ESCAPE,1
          FIN
       ELSE
          SET   ESCAPE,0
          SAY   NOTHING
       FIN
       QUIT

verbs.d


VERB   SAY,CHANT,SING,UTTER,MUMBLE
VERB   SAVE,SUSPEND,PAUSE
VERB   RESTORE
VERB   UPSTREAM
VERB   DOWNSTREAM
VERB   FORWARD,CONTINUE,ONWARD
VERB   BACK,RETURN,RETREAT
VERB   OUT,OUTSIDE,EXIT,LEAVE
VERB   ENTRANCE
VERB   GULLY
VERB   STREAM
VERB   ROCK,ROCKS
VERB   BED,STREAMBED
VERB   CRAWL,CRAWLS
VERB   IN,INWARD,INSIDE,ENTER
VERB   SURFACE
VERB   NULL,NOWHERE
VERB   PASSAGE,TUNNEL
VERB   VIEW
VERB   HOLE
VERB   STAIRS
VERB   UP,UPWARD,U,ABOVE,ASCEND
VERB   DOWN,D,DOWNWARDS,DESCEND
VERB   OUTDOORS
VERB   CRACK
VERB   DOME
VERB   LEFT
VERB   RIGHT
VERB   HALL
VERB   JUMP
VERB   CROSS,ACROSS,OVER
VERB   EAST,E
VERB   WEST,W
VERB   NORTH,N
VERB   SOUTH,S
VERB   NE,NORTHEAST
VERB   SE,SOUTHEAST
VERB   SW,SOUTHWEST
VERB   NW,NORTHWEST
VERB   SECRET
VERB   CLIMB
VERB   LOOK,EXAMINE,TOUCH,DESCRIBE
VERB   GET,CARRY,TAKE,KEEP,CATCH,STEAL,CAPTURE,TOTE
VERB   DROP,RELEASE,FREE,DISCARD,DUMP
VERB   OPEN,UNLOCK
VERB   CLOSE,LOCK
VERB   ON,LIGHT
VERB   OFF,EXTINGUISH
VERB   WAVE,SHAKE,SWING
VERB   PLACATE,CALM,TAME
VERB   WALK,RUN,TRAVEL,GO,PROCEED,EXPLORE,GOTO,FOLLOW,TURN
VERB   KILL,ATTACK,FIGHT,HIT,STRIKE,SLAY
VERB   POUR
VERB   EAT,DEVOUR
VERB   DRINK
VERB   RUB
VERB   THROW,TOSS
VERB   QUIT,STOP,Q
VERB   FIND,WHERE
VERB   INVENTORY
VERB   FEED
VERB   FILL
VERB   SCORE
VERB   BRIEF
VERB   READ,PERUSE
VERB   BREAK,SHATTER,SMASH
VERB   RIDE
VERB   HOURS
VERB   FUM
VERB   SESAME,OPENSESAME,ABRA,ABRACADABRA,SHAZAM,HOCUS,POCUS,CADABRA
VERB   HELP,?
VERB   TREE,TREES
VERB   DIG,EXCAVATE
VERB   LOST
VERB   MIST
VERB   INFO,INFORMATION
VERB   SWIM
VERB   LPSD
VERB   FAST
VERB   FULL
VERB   NEWS
VERB   CAVE
VERB   FIX,REPAIR
VERB   WIZARD
VERB   ZORTON
VERB   XYZZY
VERB   THURB
VERB   SNOEZE
VERB   SAMOHT
VERB   PLUGH
VERB   PHUGGG
VERB   NOSIDE
VERB   MELENKURION
VERB   KNERL
VERB   KLAETU
VERB   FOO
VERB   FOE
VERB   FIE
VERB   FEE
VERB   BLERBI

init.d


INITIAL
       SAY   BLANK
       RANDOM   I,100       {kick the random number generator}
       ITOBJ I
          APPORT   I,LIMBO
       EOI
INITIAL              * Initialize portability of some objects
       BIS  KEYS,PORTABLE
       BIS  LAMP,PORTABLE
       BIS  CASE,PORTABLE
       BIS  ROD,PORTABLE
       BIS  DYNAMITE,PORTABLE
       BIS  BIRD,PORTABLE
       BIS  PILLOW,PORTABLE
       BIS  CLAM,PORTABLE
       BIS  OYSTER,PORTABLE
       BIS  MAGAZINES,PORTABLE
       BIS  KNIFE,PORTABLE
       BIS  FOOD,PORTABLE
       BIS  BOTTLE,PORTABLE
       BIS  WATER,PORTABLE
       BIS  OIL,PORTABLE
       BIS  AXE,PORTABLE
       BIS  BEAR,PORTABLE
       BIS  BATTERIES,PORTABLE
       BIS  GOLD,PORTABLE
       BIS  DIAMONDS,PORTABLE
       BIS  SILVER,PORTABLE
       BIS  JEWELRY,PORTABLE
       BIS  COINS,PORTABLE
       BIS  CHEST,PORTABLE
       BIS  EGGS,PORTABLE
       BIS  TRIDENT,PORTABLE
       BIS  VASE,PORTABLE
       BIS  POTTERY,PORTABLE
       BIS  EMERALD,PORTABLE
       BIS  PYRAMID,PORTABLE
       BIS  PEARL,PORTABLE
       BIS  RUG,PORTABLE
       BIS  SPICES,PORTABLE
       BIS  CHAIN,PORTABLE
       BIS  RING,PORTABLE
       BIS  SPYGLASS,PORTABLE
       BIS  BAG,PORTABLE
       BIS  HELMET,PORTABLE
       BIS  TEETH,PORTABLE
       BIS  VIAL,PORTABLE
       BIS  MUSHROOM,PORTABLE
       BIS  SCULPTURE,PORTABLE
       BIS  BRACELET,PORTABLE
       BIS  CASKET,PORTABLE
       BIS  SWORD,PORTABLE
       BIS  CROWN,PORTABLE
       BIS  SCEPTRE,PORTABLE
       BIS  YACHT,PORTABLE
       BIS  FLASK,PORTABLE
       BIS  PLATE,PORTABLE
       BIS  BEADS,PORTABLE
INIT           * Set FREEBIE objects
       BIS  BIRD,FREEBIE
       BIS  OIL,FREEBIE
       BIS  WATER,FREEBIE
       BIS  BEAR,FREEBIE
INIT           * Specify which rooms are self-lit (lamp not needed)
       BIS  ROAD,LIT
       BIS  HILL,LIT
       BIS  BUILDING,LIT
       BIS  VALLEY,LIT
       BIS  FOREST,LIT
       BIS  FOREST2,LIT
       BIS  SLIT,LIT
       BIS  FAKE.SLIT,LIT
       BIS  DEPRESSION,LIT
       BIS  INCAVE,LIT
       BIS  COBBLES,LIT
       BIS  PLOVER,LIT
       BIS  BREATHTAKER,LIT
       BIS  LAIR,LIT
       BIS  SHELF,LIT
       BIS  BEACH,LIT
       BIS  PLAIN.2,LIT
       BIS  PLAIN.3,LIT
       BIS  FACES,LIT
       BIS  BY.FIGURE,LIT
       BIS  AUDIENCE,LIT
       BIS  TRANSLUCENT,LIT
       BIS  PLATFORM,LIT
       BIS  CYLINDRICAL,LIT
       BIS  TREASUREROOM,LIT
       BIS  BALCONY,LIT
INITIAL           * Set dwarf-inhibits for appropriate places
       BIS  INCAVE,NODWARF
       BIS  COBBLES,NODWARF
       BIS  ALCOVE,NODWARF
       BIS  PLOVER,NODWARF
       BIS  DARK,NODWARF
       BIS  SWOFCHASM,NODWARF
       BIS  NEOFCHASM,NODWARF
       BIS  CORRIDOR,NODWARF
       BIS  FORK,NODWARF
       BIS  WARMJUNCTN,NODWARF
       BIS  BREATHTAKER,NODWARF
       BIS  BOULDERS,NODWARF
       BIS  LIMESTONE,NODWARF
       BIS  BARREN,NODWARF
       BIS  BEARHERE,NODWARF
       BIS  MAZEA.114,NODWARF
       BIS  EASTPIT,NODWARF
       BIS  WESTPIT,NODWARF
       BIS  STREAMPIT,NODWARF
       BIS  FACES,NODWARF
       BIS  BY.FIGURE,NODWARF
       BIS  PLAIN.1,NODWARF
       BIS  PLAIN.2,NODWARF
       BIS  PLAIN.3,NODWARF
       BIS  NONDESCRIPT,NODWARF
       BIS  PENTAGRAM,NODWARF
       BIS  CHIMNEY,NODWARF
       BIS  TUBE,NODWARF
       BIS  TUBE.SLIDE,NODWARF
       BIS  BASQUE.1,NODWARF
       BIS  BASQUE.2,NODWARF
       BIS  BASQUE.FORK,NODWARF
       BIS  PEELGRUNT,NODWARF
       BIS  ON.STEPS,NODWARF
       BIS  STEPS.EXIT,NODWARF
       BIS  STORAGE,NODWARF
       BIS  FAKE.Y2,NODWARF
       BIS  FAKE.JUMBLE,NODWARF
       BIS  CATACOMBS.1,NODWARF
       BIS  CATACOMBS.2,NODWARF
       BIS  CATACOMBS.3,NODWARF
       BIS  CATACOMBS.4,NODWARF
       BIS  CATACOMBS.5,NODWARF
       BIS  CATACOMBS.6,NODWARF
       BIS  CATACOMBS.7,NODWARF
       BIS  CATACOMBS.8,NODWARF
       BIS  CATACOMBS.9,NODWARF
       BIS  CATACOMBS.10,NODWARF
       BIS  CATACOMBS.11,NODWARF
       BIS  CATACOMBS.12,NODWARF
       BIS  CATACOMBS.13,NODWARF
       BIS  CATACOMBS.14,NODWARF
       BIS  CATACOMBS.15,NODWARF
       BIS  CATACOMBS.16,NODWARF
       BIS  CATACOMBS.17,NODWARF
       BIS  CATACOMBS.18,NODWARF
       BIS  CATACOMBS.19,NODWARF
       BIS  AUDIENCE,NODWARF
       BIS  AUDIENCE.E,NODWARF
       BIS  BANSHEE.1,NODWARF
       BIS  GOLDEN,NODWARF
       BIS  ARABESQUE,NODWARF
       BIS  TRANSLUCENT,NODWARF
       BIS  RESERVOIR.N,NODWARF
       BIS  WARM,NODWARF
       BIS  BALCONY,NODWARF
       BIS  INSAFE,NODWARF
INITIAL                 (Specify what places aren't in the cave)
       BIS  ROAD,NOTINCAVE
       BIS  HILL,NOTINCAVE
       BIS  BUILDING,NOTINCAVE
       BIS  VALLEY,NOTINCAVE
       BIS  FOREST,NOTINCAVE
       BIS  FOREST2,NOTINCAVE
       BIS  SLIT,NOTINCAVE
       BIS  DEPRESSION,NOTINCAVE
       BIS  FAKE.SLIT,NOTINCAVE
INITIAL              {indicate where "BACK" command invalid}
*
* Most of the rooms in the mazes are NOBACK-type places to give
* the adventurer heartburn and a possible ulcer.  The two rooms that
* are at the very entrances of their respective mazes (MAXEA.42 and
* MAZED.107) are not NOBACK-types, so that if you accidentally
* wander into the mazes you can escape quickly by saying "GO BACK".
* You still can't use "BACK" when in these rooms if you got there
* from another room in the maze, because the room you came from
* has the "NOBACK" bit set.
*
       BIS  MAZEA.43,NOBACK
       BIS  MAZEA.44,NOBACK
       BIS  MAZEA.45,NOBACK
       BIS  MAZEA.46,NOBACK
       BIS  MAZEA.47,NOBACK
       BIS  MAZEA.48,NOBACK
       BIS  MAZEA.49,NOBACK
       BIS  MAZEA.50,NOBACK
       BIS  MAZEA.51,NOBACK
       BIS  MAZEA.52,NOBACK
       BIS  MAZEA.53,NOBACK
       BIS  MAZEA.54,NOBACK
       BIS  MAZEA.55,NOBACK
       BIS  MAZEA.56,NOBACK
       BIS  MAZEA.57.PIT,NOBACK
       BIS  MAZEA.58,NOBACK
       BIS  MAZEA.80,NOBACK
       BIS  MAZEA.81,NOBACK
       BIS  MAZEA.82,NOBACK
       BIS  MAZEA.83,NOBACK
       BIS  MAZEA.84,NOBACK
       BIS  MAZEA.85,NOBACK
       BIS  MAZEA.86,NOBACK
       BIS  MAZEA.87,NOBACK
       BIS  MAZED.112,NOBACK
       BIS  MAZED.114,NOBACK
       BIS  MAZED.131,NOBACK
       BIS  MAZED.132,NOBACK
       BIS  MAZED.133,NOBACK
       BIS  MAZED.134,NOBACK
       BIS  MAZED.135,NOBACK
       BIS  MAZED.136,NOBACK
       BIS  MAZED.137,NOBACK
       BIS  MAZED.138,NOBACK
       BIS  MAZED.139,NOBACK
       BIS  MAZED.140,NOBACK
       BIS  INCLINE,NOBACK
       BIS  STALACT,NOBACK
       BIS  SWOFCHASM,NOBACK
       BIS  NEOFCHASM,NOBACK
       BIS  WITTSEND,NOBACK
       BIS  ALCOVE,NOBACK
       BIS  PLOVER,NOBACK
       BIS  DARK,NOBACK
       BIS  NSCANYONWIDE,NOBACK
       BIS  ICECAVE.1,NOBACK
       BIS  ICECAVE.2,NOBACK
       BIS  ICECAVE.3,NOBACK
       BIS  ICECAVE.4,NOBACK
       BIS  ICECAVE.5,NOBACK
       BIS  ICECAVE.6,NOBACK
       BIS  ICECAVE.7,NOBACK
       BIS  ICECAVE.8,NOBACK
       BIS  ICECAVE.9,NOBACK
       BIS  ICECAVE.10,NOBACK
       BIS  ICECAVE.11,NOBACK
       BIS  ICECAVE.12,NOBACK
       BIS  ICECAVE.13,NOBACK
       BIS  ICECAVE.14,NOBACK
       BIS  ICECAVE.15,NOBACK
       BIS  ICECAVE.16,NOBACK
       BIS  ICECAVE.17,NOBACK
       BIS  ICECAVE.18,NOBACK
       BIS  ICECAVE.19,NOBACK
       BIS  ICECAVE.20,NOBACK
       BIS  ICECAVE.21,NOBACK
       BIS  SLIDE,NOBACK
       BIS  ICE,NOBACK
       BIS  CATACOMBS.1,NOBACK
       BIS  CATACOMBS.2,NOBACK
       BIS  CATACOMBS.3,NOBACK
       BIS  CATACOMBS.4,NOBACK
       BIS  CATACOMBS.5,NOBACK
       BIS  CATACOMBS.6,NOBACK
       BIS  CATACOMBS.7,NOBACK
       BIS  CATACOMBS.8,NOBACK
       BIS  CATACOMBS.9,NOBACK
       BIS  CATACOMBS.10,NOBACK
       BIS  CATACOMBS.11,NOBACK
       BIS  CATACOMBS.12,NOBACK
       BIS  CATACOMBS.13,NOBACK
       BIS  CATACOMBS.14,NOBACK
       BIS  CATACOMBS.15,NOBACK
       BIS  CATACOMBS.16,NOBACK
       BIS  CATACOMBS.17,NOBACK
       BIS  CATACOMBS.18,NOBACK
       BIS  CATACOMBS.19,NOBACK
       BIS  FACES,NOBACK
       BIS  PLAIN.1,NOBACK
       BIS  PLAIN.2,NOBACK
       BIS  BASQUE.1,NOBACK
       BIS  CYLINDRICAL,NOBACK
       BIS  PLATFORM,NOBACK
       BIS  SHELL,NOBACK   {so he can't sneak out with the clam}
       BIS  ARCH.COR.1,NOBACK {so he can't retreat over the quicksand}
       BIS  ARCH.COR.2,NOBACK {so he can't retreat over the quicksand}
INITIAL                            {set in-maze bits}
       BIS  MAZEA.42,INMAZE
       BIS  MAZEA.43,INMAZE
       BIS  MAZEA.44,INMAZE
       BIS  MAZEA.45,INMAZE
       BIS  MAZEA.46,INMAZE
       BIS  MAZEA.47,INMAZE
       BIS  MAZEA.48,INMAZE
       BIS  MAZEA.49,INMAZE
       BIS  MAZEA.50,INMAZE
       BIS  MAZEA.51,INMAZE
       BIS  MAZEA.52,INMAZE
       BIS  MAZEA.53,INMAZE
       BIS  MAZEA.54,INMAZE
       BIS  MAZEA.55,INMAZE
       BIS  MAZEA.56,INMAZE
       BIS  MAZEA.57.PIT,INMAZE
       BIS  MAZEA.58,INMAZE
       BIS  MAZEA.80,INMAZE
       BIS  MAZEA.81,INMAZE
       BIS  MAZEA.82,INMAZE
       BIS  MAZEA.83,INMAZE
       BIS  MAZEA.84,INMAZE
       BIS  MAZEA.85,INMAZE
       BIS  MAZEA.86,INMAZE
       BIS  MAZEA.87,INMAZE
       BIS  MAZED.107,INMAZE
       BIS  MAZED.112,INMAZE
       BIS  MAZED.114,INMAZE
       BIS  MAZED.131,INMAZE
       BIS  MAZED.132,INMAZE
       BIS  MAZED.133,INMAZE
       BIS  MAZED.134,INMAZE
       BIS  MAZED.135,INMAZE
       BIS  MAZED.136,INMAZE
       BIS  MAZED.137,INMAZE
       BIS  MAZED.138,INMAZE
       BIS  MAZED.139,INMAZE
       BIS  MAZED.140,INMAZE
       BIS  SLIDE,INMAZE
       BIS  ICECAVE.1,INMAZE
       BIS  ICECAVE.1A,INMAZE
       BIS  ICECAVE.2,INMAZE
       BIS  ICECAVE.2A,INMAZE
       BIS  ICECAVE.3,INMAZE
       BIS  ICECAVE.3A,INMAZE
       BIS  ICECAVE.4,INMAZE
       BIS  ICECAVE.5,INMAZE
       BIS  ICECAVE.6,INMAZE
       BIS  ICECAVE.7,INMAZE
       BIS  ICECAVE.8,INMAZE
       BIS  ICECAVE.9,INMAZE
       BIS  ICECAVE.10,INMAZE
       BIS  ICECAVE.11,INMAZE
       BIS  ICECAVE.12,INMAZE
       BIS  ICECAVE.12A,INMAZE
       BIS  ICECAVE.13,INMAZE
       BIS  ICECAVE.14,INMAZE
       BIS  ICECAVE.15,INMAZE
       BIS  ICECAVE.15A,INMAZE
       BIS  ICECAVE.16,INMAZE
       BIS  ICECAVE.17,INMAZE
       BIS  ICECAVE.18,INMAZE
       BIS  ICECAVE.19,INMAZE
       BIS  ICECAVE.20,INMAZE
       BIS  ICECAVE.21,INMAZE
       BIS  ICECAVE.22,INMAZE
       BIS  ICECAVE.23,INMAZE
       BIS  ICECAVE.24,INMAZE
       BIS  ICECAVE.25,INMAZE
       BIS  ICECAVE.26,INMAZE
       BIS  ICECAVE.27,INMAZE
       BIS  ICECAVE.28,INMAZE
       BIS  ICECAVE.28A,INMAZE
       BIS  ICECAVE.29,INMAZE
       BIS  ICECAVE.30,INMAZE
INITIAL                              {specify rooms with only 1 exit}
       BIS  GOLDROOM,ONE.EXIT
       BIS  SOUTHSIDE,ONE.EXIT
       BIS  SANDSTONE,ONE.EXIT
       BIS  WINDOW,ONE.EXIT
       BIS  WINDOW2,ONE.EXIT
       BIS  MAZEA.46,ONE.EXIT
       BIS  MAZEA.47,ONE.EXIT
       BIS  MAZEA.48,ONE.EXIT
       BIS  MAZEA.49,ONE.EXIT
       BIS  MAZEA.54,ONE.EXIT
       BIS  MAZEA.56,ONE.EXIT
       BIS  MAZEA.58,ONE.EXIT
       BIS  DEADEND1,ONE.EXIT
       BIS  DEADEND2,ONE.EXIT
       BIS  DEADEND3,ONE.EXIT
       BIS  MAZEA.81,ONE.EXIT
       BIS  MAZEA.82,ONE.EXIT
       BIS  MAZEA.85,ONE.EXIT
       BIS  MAZEA.86,ONE.EXIT
       BIS  SOFT,ONE.EXIT
       BIS  CULDESAC,ONE.EXIT
       BIS  RESERVOIR,ONE.EXIT
       BIS  BALCONY,ONE.EXIT
       BIS  MAZED.140,ONE.EXIT
       BIS  INSAFE,ONE.EXIT
       BIS  TOOL,ONE.EXIT
       BIS  CUBICLE,ONE.EXIT
       BIS  SPHERICAL,ONE.EXIT
       BIS  ICECAVE.1A,ONE.EXIT
       BIS  ICECAVE.3A,ONE.EXIT
       BIS  ICECAVE.7,ONE.EXIT
       BIS  ICECAVE.8,ONE.EXIT
       BIS  ICECAVE.13,ONE.EXIT
       BIS  ICECAVE.14,ONE.EXIT
       BIS  CRACK.4,ONE.EXIT
       BIS  BEACH,ONE.EXIT
INITIAL                               {specify openable objects}
       BIS  GRATE,OPENABLE
       BIS  DOOR,OPENABLE
       BIS  CLAM,OPENABLE
       BIS  OYSTER,OPENABLE
       BIS  FLASK,OPENABLE
       BIS  CHAIN,OPENABLE
       BIS  SAFE,OPENABLE
       BIS  VIAL,OPENABLE
INITIAL                               {specify invisible objects}
       BIS  STEPS,INVISIBLE
       BIS  FISSURE,INVISIBLE
       BIS  MIRROR,INVISIBLE
       BIS  STALACTITE,INVISIBLE
       BIS  DRAWING,INVISIBLE
       BIS  PIRATE,INVISIBLE
       BIS  STATUE,INVISIBLE
       BIS  VOLCANO,INVISIBLE
       BIS  QUICKSAND,INVISIBLE
       BIS  THRONE,INVISIBLE
       BIS  CARPET,INVISIBLE
       BIS  DWARF,INVISIBLE
       BIS  KNIFE,INVISIBLE
       BIS  FOG,INVISIBLE
       BIS  PLANT2,INVISIBLE
INITIAL                               {set hint-exists bits}
       BIS  MAZEA.42,HINTABLE
       BIS  MAZEA.43,HINTABLE
       BIS  MAZEA.44,HINTABLE
       BIS  MAZEA.45,HINTABLE
       BIS  MAZEA.46,HINTABLE
       BIS  MAZEA.47,HINTABLE
       BIS  MAZEA.48,HINTABLE
       BIS  MAZEA.49,HINTABLE
       BIS  MAZEA.50,HINTABLE
       BIS  MAZEA.51,HINTABLE
       BIS  MAZEA.52,HINTABLE
       BIS  MAZEA.53,HINTABLE
       BIS  MAZEA.54,HINTABLE
       BIS  MAZEA.55,HINTABLE
       BIS  MAZEA.56,HINTABLE
       BIS  MAZEA.57.PIT,HINTABLE
       BIS  MAZEA.58,HINTABLE
       BIS  MAZEA.80,HINTABLE
       BIS  MAZEA.81,HINTABLE
       BIS  MAZEA.82,HINTABLE
       BIS  MAZEA.83,HINTABLE
       BIS  MAZEA.84,HINTABLE
       BIS  MAZEA.85,HINTABLE
       BIS  MAZEA.86,HINTABLE
       BIS  MAZEA.87,HINTABLE
       BIS  MAZED.107,HINTABLE
       BIS  MAZED.112,HINTABLE
       BIS  MAZED.114,HINTABLE
       BIS  MAZED.131,HINTABLE
       BIS  MAZED.132,HINTABLE
       BIS  MAZED.133,HINTABLE
       BIS  MAZED.134,HINTABLE
       BIS  MAZED.135,HINTABLE
       BIS  MAZED.136,HINTABLE
       BIS  MAZED.137,HINTABLE
       BIS  MAZED.138,HINTABLE
       BIS  MAZED.139,HINTABLE
       BIS  MAZED.140,HINTABLE
       BIS  BIRDCHAMBER,HINTABLE
       BIS  DEPRESSION,HINTABLE
       BIS  MTKING,HINTABLE
       BIS  WITTSEND,HINTABLE
       BIS  PLOVER,HINTABLE
       BIS  ALCOVE,HINTABLE
       BIS  DARK,HINTABLE
       BIS  SLIDE,HINTABLE
       BIS  ICECAVE.1,HINTABLE
       BIS  ICECAVE.1A,HINTABLE
       BIS  ICECAVE.2,HINTABLE
       BIS  ICECAVE.2A,HINTABLE
       BIS  ICECAVE.3,HINTABLE
       BIS  ICECAVE.3A,HINTABLE
       BIS  ICECAVE.4,HINTABLE
       BIS  ICECAVE.5,HINTABLE
       BIS  ICECAVE.6,HINTABLE
       BIS  ICECAVE.7,HINTABLE
       BIS  ICECAVE.8,HINTABLE
       BIS  ICECAVE.9,HINTABLE
       BIS  ICECAVE.10,HINTABLE
       BIS  ICECAVE.11,HINTABLE
       BIS  ICECAVE.12,HINTABLE
       BIS  ICECAVE.12A,HINTABLE
       BIS  ICECAVE.13,HINTABLE
       BIS  ICECAVE.14,HINTABLE
       BIS  ICECAVE.15,HINTABLE
       BIS  ICECAVE.15A,HINTABLE
       BIS  ICECAVE.16,HINTABLE
       BIS  ICECAVE.17,HINTABLE
       BIS  ICECAVE.18,HINTABLE
       BIS  ICECAVE.19,HINTABLE
       BIS  ICECAVE.20,HINTABLE
       BIS  ICECAVE.21,HINTABLE
       BIS  ICECAVE.22,HINTABLE
       BIS  ICECAVE.23,HINTABLE
       BIS  ICECAVE.24,HINTABLE
       BIS  ICECAVE.25,HINTABLE
       BIS  ICECAVE.26,HINTABLE
       BIS  ICECAVE.27,HINTABLE
       BIS  ICECAVE.28,HINTABLE
       BIS  ICECAVE.28A,HINTABLE
       BIS  ICECAVE.29,HINTABLE
       BIS  ICECAVE.30,HINTABLE
       BIS  ICECAVE.PLAIN.2,HINTABLE
INITIAL              {Declare water-holes}
       BIS  BUILDING,H20HERE
       BIS  ROAD,H20HERE
       BIS  VALLEY,H20HERE
       BIS  SLIT,H20HERE
       BIS  STREAMPIT,H20HERE
       BIS  CAVERN,H20HERE
       BIS  RESERVOIR,H20HERE
       BIS  RESERVOIR.N,H20HERE
INIT           {indicate where throwing things sends them elsewhere}
       BIS  PIT,THROWER
       BIS  EASTOFFISSURE,THROWER
       BIS  WESTOFFISSURE,THROWER
       BIS  WEND2PIT,THROWER
       BIS  EEND2PIT,THROWER
       BIS  LOWNSPASSAGE,THROWER
       BIS  WINDOW,THROWER
       BIS  WINDOW2,THROWER
       BIS  BRINK,THROWER
       BIS  DUSTY,THROWER
       BIS  MAZEA.57.PIT,THROWER
       BIS  SECRETNSCYN,THROWER
       BIS  SECRETNSCPAS,THROWER
       BIS  SECRETEW.TITE,THROWER
       BIS  INCLINE,THROWER
       BIS  CAVERN,THROWER
       BIS  MISTY,THROWER
       BIS  RESERVOIR,THROWER
       BIS  RESERVOIR.N,THROWER
       BIS  STALACT,THROWER
       BIS  BALCONY,THROWER
       BIS  SWOFCHASM,THROWER
       BIS  NEOFCHASM,THROWER
       BIS  BREATHTAKER,THROWER
       BIS  FACES,THROWER
       BIS  TUBE,THROWER
       BIS  TUBE.SLIDE,THROWER
       BIS  BASQUE.FORK,THROWER
       BIS  ON.STEPS,THROWER
       BIS  STEPS.EXIT,THROWER
       BIS  BRINK.1,THROWER
       BIS  BRINK.2,THROWER
       BIS  ICE,THROWER
       BIS  BRINK.3,THROWER
       BIS  SHELF,THROWER
       BIS  PLATFORM,THROWER
INITIAL              * Declare the treasures
       BIS  GOLD,VALUED
       BIS  DIAMONDS,VALUED
       BIS  SILVER,VALUED
       BIS  JEWELRY,VALUED
       BIS  COINS,VALUED
       BIS  CHEST,VALUED
       BIS  EGGS,VALUED
       BIS  TRIDENT,VALUED
       BIS  VASE,VALUED
       BIS  EMERALD,VALUED
       BIS  PYRAMID,VALUED
       BIS  PEARL,VALUED
       BIS  RUG,VALUED
       BIS  SPICES,VALUED
       BIS  CHAIN,VALUED
       BIS  CASKET,VALUED
       BIS  SCULPTURE,VALUED
       BIS  BRACELET,VALUED
       BIS  RING,VALUED
       BIS  SPYGLASS,VALUED
       BIS  BAG,VALUED
       BIS  HELMET,VALUED
       BIS  CROWN,VALUED
       BIS  SCEPTRE,VALUED
       BIS  YACHT,VALUED
       BIS  BRACELET,VALUED
       BIS  BEADS,VALUED
INIT           * Declare unstable objects
       BIS  CHEST,UNSTABLE
       BIS  SCULPTURE,UNSTABLE
       BIS  CASE,UNSTABLE
       BIS  CASKET,UNSTABLE
       BIS  TEETH,UNSTABLE
       BIS  MUSHROOM,UNSTABLE
       BIS  BAG,UNSTABLE
       BIS  CROWN,UNSTABLE
       BIS  YACHT,UNSTABLE
       BIS  PLATE,UNSTABLE
       BIS  BEADS,UNSTABLE
       BIS  FLASK,UNSTABLE
INITIAL        {declare mortal (killable) things}
       BIS  TROLL,MORTAL
       BIS  DWARF,MORTAL
       BIS  DRAGON,MORTAL
       BIS  SNAKE,MORTAL
       BIS  BLOB,MORTAL
       BIS  BEAR,MORTAL
       BIS  CLAM,MORTAL
       BIS  OYSTER,MORTAL
       BIS  OGRE,MORTAL
       BIS  BIRD,MORTAL
       BIS  DJINN,MORTAL
       BIS  GOBLINS,MORTAL
       BIS  BASILISK,MORTAL
       BIS  GONG,MORTAL     {strange but true - you can HIT GONG}
*
*        Declare edible objects
*
       BIS  FOOD,EDIBLE
       BIS  MUSHROOM,EDIBLE
INITIAL              * Move objects to their starting places
       APPORT KEYS,BUILDING
       APPORT LAMP,BUILDING
       APPORT GRATE,DEPRESSION
       APPORT CAGE,COBBLES
       APPORT ROD,DEBRIS
       APPORT STEPS,PIT
       APPORT BIRD,BIRDCHAMBER
       APPORT DOOR,IMMENSENSPASS
       APPORT PILLOW,SOFT
       APPORT SNAKE,MTKING
       APPORT FISSURE,EASTOFFISSURE
       APPORT TABLET,DARK
       APPORT CLAM,SHELL
       APPORT MAGAZINES,ANTEROOM
       APPORT FOOD,BUILDING
       APPORT BOTTLE,BUILDING
       APPORT PLANT,WESTPIT
       APPORT PLANT2,WEND2PIT
       APPORT STALACTITE,STALACT
       APPORT SHADOW,WINDOW
       APPORT DRAWING,ORIENTAL
       APPORT DRAGON,SECRETCYNNE1
       APPORT CHASM,SWOFCHASM
       APPORT TROLL,SWOFCHASM
       APPORT BEAR,BEARHERE
       APPORT VOLCANO,BREATHTAKER
       APPORT MACHINE,MAZED.140
       APPORT CARPET,SOFT
       APPORT GOLD,GOLDROOM
       APPORT DIAMONDS,WESTOFFISSURE
       APPORT SILVER,LOWNSPASSAGE
       APPORT JEWELRY,SOUTHSIDE
       APPORT COINS,WESTSIDE
       APPORT EGGS,GIANT
       APPORT TRIDENT,CAVERN
       APPORT VASE,ORIENTAL
       APPORT EMERALD,PLOVER
       APPORT PYRAMID,DARK
       APPORT SPICES,BOULDERS
       APPORT CHAIN,BEARHERE
       APPORT   SPYGLASS,IN.JONAH
       APPORT   BAG,BEACH
       APPORT   DINGHY,BEACH
       APPORT   HELMET,MORION
       APPORT   VIAL,SPHERICAL
       APPORT   MUSHROOM,CUBICLE
       APPORT   SCULPTURE,ICECAVE.14
       APPORT   CASKET,CRACK.4
       APPORT   SAFE,VAULT
       APPORT   QUICKSAND,ARCH.COR.1
       APPORT   SLIME,CRACK.2
       APPORT   SWORD,SANDSTONE
       APPORT   OGRE,GLASSY
       APPORT   THRONE,AUDIENCE.E
       APPORT   SKELETON,AUDIENCE.E
       APPORT   SCEPTRE,AUDIENCE.E
       APPORT   CROWN,INSAFE
       APPORT   STATUE,BY.FIGURE
       APPORT   FOG,PLAIN.2
       APPORT   YACHT,NONDESCRIPT
       APPORT   BRACELET,TRANSLUCENT
       APPORT   FLASK,ARABESQUE
       APPORT   BASILISK,BASQUE.1
       APPORT   PLATE,STORAGE
       APPORT   BEADS,BALCONY
       APPORT   GONG,RESERVOIR.N
INITIAL           * Declare schizoid objects
       BIS  GRATE,SCHIZOID
       BIS  STEPS,SCHIZOID
       BIS  FISSURE,SCHIZOID
       BIS  PLANT2,SCHIZOID
       BIS  SHADOW,SCHIZOID
       BIS  DRAGON,SCHIZOID
       BIS  CHASM,SCHIZOID
       BIS  TROLL,SCHIZOID
       BIS  TROLL2,SCHIZOID
       BIS  QUICKSAND,SCHIZOID
       BIS  SAFE,SCHIZOID
       BIS  FOG,SCHIZOID      {weird case - see PHOG routine}
       BIS  GORGE,SCHIZOID
       BIS  BASILISK,SCHIZOID
INITIAL           * Wake up user and greet him.
       RANDOM   I,100       {kick the random number generator}
       GOTO  ROAD
       LDA   OK,OK!
       RANDOM   CLOCK,10
       ADD   CLOCK,15
       SET   LAMPLIFE,300
       RANDOM   DWARFCOUNT,3
       ADD   DWARFCOUNT,3
       CHANCE   10     { up the chance just a little K.C.W }
          RANDOM   CAMEO.TIME,400
          ADD      CAMEO.TIME,100
       ELSE
          SET      CAMEO.TIME,0
       FIN
       SET   CHAIN,1
       SET   FOG,8
       SET   FLASK,1
       SET   INVCT,0
       SET   STRENGTH,7
       SAY    LOGON
       EXECUTIVE   5,I     {get prime-time flag}
       IFGT  I,0
          LDA   J,CAVE.NOT.OPEN-1
          ADD   J,I
          SAY   J
          IFEQ  I,1
             EXECUTIVE   6,J
          FIN
          SAY   BLANK
          SAY   CAN.DEMO
          QUERY WANT.DEMO
             SAY   BLANK
             SAY   OK!
             SAY   BLANK
       BIS  ADMIN.DEMO
          ELSE
             SAY   TA.TA
             STOP
          FIN
       FIN
       QUERY HITHERE
          SAY   INTRO
       FIN
       SAY   BLANK
INITIAL
       QUIT

nulls.d


NULL      THE,A,IT,AN,THAT,THIS,TO

Printout 2

bits.d


*
*      Define control bits
*
*      First: bits set in ARG1 and ARG2 to indicate word type
*
SYNON    15,OBJECT
SYNON    14,VERB
SYNON    13,PLACE
SYNON    12,BADWORD
*
*      Next, bits set in STATUS variable
*
SYNON    0,MOVED       * We moved last turn
SYNON    1,QUICKIE      * BRIEF output mode in effect
SYNON    2,FASTMODE     * FAST output mode in effect
SYNON    3,FULLDISP     * Display full place description
*
*      Next, bits related to places
*
SYNON    0,LIT          * Place is self-illuminated
SYNON    1,BEENHERE     * We've been here at least once
SYNON    2,NODWARF      * Dwarves can't go here
SYNON    3,NOBACK       * Can't use BACK to go to/from this place
SYNON    4,NOTINCAVE    * This place is not in the cave
SYNON    5,HINTABLE     * There may be a hint for this place
SYNON    6,H20HERE      * Water is available here
SYNON    7,INMAZE       * This room is in one of the mazes
SYNON    8,ONE.EXIT     * Only one exit out of room - dwarves can block
*                      * your way and force you to fight them.
SYNON    9,THROWER      * Throwing objects here will send them elsewhere.
*                      * unless you're throwing them at something
*                      * special (like a troll or dwarf).
*
*      Next, bits related to objects
*
SYNON    0,PORTABLE     * Object can be carried
SYNON    1,SEEN         * We've seen the object
SYNON    2,VALUED       * It's a treasure - must be left in the building
SYNON    3,SCHIZOID     * It's schizoid - in 2 places at once
SYNON    4,UNSTABLE     * Unstable objects get kicked from state 0
*                      into state 1 the first time they're picked
*                      up - applies only to objects that aren't
*                      special-cased anywhere in the code.
SYNON    5,MORTAL       * This is a killable entity
SYNON    6,OPENABLE     * Object can be opened/unlocked
SYNON    7,INVISIBLE    * Object can't be seen.
SYNON    8,EDIBLE       * Object can be eaten (food/mushroom)
SYNON    9,FREEBIE      * Object is effectively weightless
SYNON    10,SPECIAL1    * Special control bit 1 - depends on context
SYNON    11,SPECIAL2    * Special control bit 2 - depends on context
*
*      Define bits for the ADMIN variable
*
SYNON    0,DEMO              * Demonstration game
SYNON    1,TICKER             * Call TICK label after each move, if set.
SYNON    3,NOMAGIC           * Magic words are being suppressed
SYNON    4,PANICED           * He paniced during closure
SYNON    5,OLORIN             * He's a wizard
SYNON    6,RANOUT             * His lamp just died.
*
*      Define administrative control parameters
*
SYNON    30,MINTIME     {# of minutes you must wait after SAVE}
SYNON    30,MAX.DEMO    {maximum # of moves in demo games}
SYNON    600,MAX.GAME   {maximum # of moves in real games}
SYNON    20,HINT.COST   {what each hint costs you}
*
*      Define worth of each CLOSURE phase
*
SYNON    20,CLOSE.CREDIT   {each phase of CLOSURE is worth 20 points}
*
*      The phases of cave closure are as follows:
*
*      0 - cave open and operating normally
*      1 - ditto - all treasures are in well-house
*      2 - "Cave closing soon"
*      3 - "Cave closed" - in cylindrical room
*      4 - escaped from cylindrical room, back outside cave
*      5 - located the treasure room, wins game!
*

define.d


DEFINE HERE,THERE,ARG1,ARG2,STATUS
DEFINE ROAD
DEFINE HILL
DEFINE BUILDING,HOUSE
DEFINE VALLEY
DEFINE FOREST
DEFINE SLIT
DEFINE DEPRESSION
DEFINE COBBLES
DEFINE DEBRIS
DEFINE CANYON
DEFINE PIT
DEFINE MISTS
DEFINE MTKING
DEFINE Y2
DEFINE JUMBLE,WALL,BROKEN
DEFINE WINDOW
DEFINE DIRTY
DEFINE BRINK
DEFINE DUSTY
DEFINE CROSSOVER
DEFINE COMPLEX
DEFINE BEDQUILT
DEFINE SWISS
DEFINE SLAB
DEFINE LOW
DEFINE INCLINE
DEFINE GIANT
DEFINE CAVERN
DEFINE SOFT
DEFINE ORIENTAL
DEFINE MISTY
DEFINE ALCOVE
DEFINE PLOVER
DEFINE DARK
DEFINE ARCHED
DEFINE SHELL
DEFINE ANTEROOM
DEFINE RESERVOIR
DEFINE SLOPING
DEFINE CORRIDOR
DEFINE FORK
DEFINE BOULDERS
DEFINE LIMESTONE
DEFINE BARREN
DEFINE LIMBO
DEFINE LAIR
DEFINE ICE
DEFINE GLASSY
DEFINE TOOL
DEFINE MORION
DEFINE VAULT
DEFINE CUBICLE
DEFINE SPHERICAL
DEFINE SLIDE
DEFINE SHELF
DEFINE BEACH
DEFINE FOURIER
DEFINE JONAH
DEFINE FACES
DEFINE NONDESCRIPT
DEFINE PENTAGRAM
DEFINE PEELGRUNT
DEFINE STORAGE
DEFINE AUDIENCE
DEFINE ARABESQUE
DEFINE TRANSLUCENT
DEFINE INSAFE
DEFINE PLATFORM
DEFINE SANDSTONE
DEFINE CHIMNEY
DEFINE TUBE
DEFINE WARM
DEFINE BALCONY

action.d


*
*      This module defines the actions to be taken when certain
*      verb, verb/object, or object/object word sequences are
*      spoken.  BEWARE:  When defining a set of alternate actions
*      to be taken for different uses of a word, you must ALWAYS
*      use the same definition of the word - do NOT define ANY
*      actions for the word's synonyms if any, or you will lose
*      some of your action controls!
*
ACTION GET
       IFEQ  LAMP,0   {off?
          OR
          NOT
       IFNEAR   LAMP  {missing the lamp?}
          AND
          NOT
       BIT   HERE,LIT {place is not illuminated}
          CALL  GROPE.FOR.IT   {have to grope around for it}
       FIN
       DEFAULT   PORTABLE {hope this works!}
       ANYOF BIRD,CAGE,BOTTLE,OIL,WATER,CHAIN,BEAR,INVENTORY,CLAM
       ANYOF SWORD,SCEPTRE,KNIFE
       IFKEY BIRD
          CALL GETBIRD
       ELSE
          IFKEY CAGE
             CALL  GETCAGE
          ELSE
             IFKEY BOTTLE
                CALL  GETBOTTLE
             ELSE
                IFKEY OIL
                   CALL GETOIL
                ELSE
                   IFKEY WATER
                       CALL  GETWATER
                   ELSE
                       IFKEY CHAIN
                         CALL  GETCHAIN
                       ELSE
                         IFKEY BEAR
                            CALL  GETBEAR
                         ELSE
                            IFKEY INVENTORY
                               CALL  INVENTORY
                            ELSE
                               IFKEY SWORD
                                  CALL  GETSWORD
                               ELSE
                                  IFKEY SCEPTRE
                                     CALL  GETSCEPTRE
                                  ELSE
                                     IFKEY KNIFE
                                        CALL  GETKNIFE
                                     FIN
                                  FIN
                               FIN
                            FIN
                         FIN
                       FIN
                   FIN
                FIN
             FIN
          FIN
       FIN
ACTION GET       * Generalized last-case "get" routine
       IFEQ  STATUS,1
          PROCEED
       FIN
       BIT   ARG2,OBJECT
       ELSE
          SAY   HAH!
          QUIT
       FIN
       IFHAVE   ARG2
          SAY   YOUHAVEIT
          QUIT
       FIN
       IFNEAR   ARG2
       ELSE
          NAME  IDONTSEE,ARG2
          QUIT
       FIN
       BIT   ARG2,PORTABLE
       ELSE
          SAY   HAH!
          QUIT
       FIN
       IFLT  INVCT,STRENGTH
          GET   ARG2
          SAY   OK
          BIT ARG2,UNSTABLE
             EVAL  J,ARG2
             IFEQ  J,0
                DEPOSIT  ARG2,1
             FIN
          FIN
       ELSE
          SAY   ARMSAREFULL
       FIN
       QUIT
ACTION DROP
       ANYOF BIRD,CAGE,BOTTLE,OIL,WATER,VASE,VIAL,DJINN,BEAR
       IFKEY BIRD
          CALL DROPBIRD
       ELSE
          IFKEY CAGE
             CALL  DROPCAGE
          ELSE
             IFKEY BOTTLE
                CALL  DROPBOTTLE
             ELSE
                IFKEY OIL
                   OR
                IFKEY WATER
                   CALL DROPLIQUID
                ELSE
                   IFKEY VASE
                       CALL  DROPVASE
                   ELSE
                       IFKEY VIAL
                         CALL  DROPVIAL
                       ELSE
                         IFKEY DJINN
                            CALL  FREEDJINN
                         ELSE
                            IFKEY BEAR
                               CALL  DROPBEAR
                            FIN
                         FIN
                       FIN
                   FIN
                FIN
             FIN
          FIN
       FIN
       PROCEED
ACTION DROP            * Generalized "drop" control
       IFEQ  STATUS,1
          PROCEED
       FIN
       BIT   ARG2,OBJECT
       ELSE
          SAY   HAH!
          QUiT
       FIN
       IFHAVE   ARG2
          DROP  ARG2
          SAY   OK
       ELSE
          SAY   NOTCARRYING
       FIN
       QUIT
ACTION WALK
       IFEQ  STATUS,1
          NAME  WHICHWAY,ARG1
       ELSE
          IFKEY NORTH
             OR
          IFKEY SOUTH
             OR
          IFKEY EAST
             OR
          IFKEY WEST
             OR
          IFKEY NORTHEAST
             OR
          IFKEY NORTHWEST
             OR
          IFKEY SOUTHEAST
             OR
          IFKEY SOuTHWEST
             OR
          IFKEY UP
             OR
          IFKEY DOWN
             OR
          IFKEY BACK
             OR
          IFKEY CAVE
             OR
          IFKEY OUT
             OR
          IFKEY IN
             CALL  ARG2
          ELSE
             BIT   ARG2,PLACE
                IFAT  ARG2
                   SAY   NEEDDETAIL
                ELSE
                   SAY   NO.CAN.GO
                FIN
             ELSE
                SAY   HUH??
             FIN
          FIN
       FIN
       QUIT
ACTION DIG
       SAY   NEEDSHOVEL
       QUIT
ACTION CAVE
       AT VALLEY,FOREST,FOREST2,STREAM,ROAD,SLIT,DEPRESSION,BUILDING
       SAY   WHEREISCAVE
       QUIT
ACTION CAVE
       SAY   NEEDDETAIL
       QUIT
ACTION WATER DOOR
       IFNEAR   DOOR
          IFHAVE   WATER
             APPORT   WATER,LIMBO
             SET   BOTTLE,1
             SAY   HINGES..RUST
             SET   DOOR,0
          ELSE
             NAME  YOUDONTHAVE,ARG1
          FIN
       ELSE
          NAME  IDONTSEE,ARG2
       FIN
       QUIT
ACTION OIL   DOOR
       IFNEAR   DOOR
          IFHAVE   OIL
             APPORT   OIL,LIMBO
             SET   BOTTLE,1
             SET   DOOR,1
             SAY   OIL..DOOR
          ELSE
             NAME  YOUDONTHAVE,ARG1
          FIN
       ELSE
          NAME  IDONTSEE,ARG2
       FIN
       QUIT
AcTION WATER PLANT
       IFNEAR   PLANT
          IFHAVE   WATER
             APPORT   WATER,LIMBO
             SET   BOTTLE,1
             ADD   PLANT,1
             SAY   PLANT
             ADD   PLANT,1
             IFEQ  PLANT,6
                SET   PLANT,0
                BIS   PLANT2,INVISIBLE
             ELSE
                BIC   PLANT2,INVISIBLE
             FIN
             GOTO  HERE
             SET   PLANT2,PLANT
          ELSE
             NAME  YOUDONTHAVE,ARG1
          FIN
       ELSE
          NAME  IDONTSEE,ARG2
       FIN
       QUIT
ACTION OIL PLANT
       IFNEAR   PLANT
          IFHAVE   OIL
             APPORT   OIL,LIMBO
             SET   BOTTLE,1
             SAY   OIL..PLANT
          ELSE
             NAME  YOUDONTHAVE,ARG1
          FIN
       ELSE
          NAME  IDONTSEE,ARG2
       FIN
       QUIT
AcTION OIL
       IFEQ  STATUS,1
          IFNEAR   BOTTLE
             AND
          IFEQ  BOTTLE,2
             OR
          IFHAVE   OIL
             OR
          IFAT  EASTPIT
             NAME  WHAT.DO,ARG1
          ELSE
             NAME  IDONTSEE,ARG1
          FIN
       ELSE
          SAY   HAH!
       FIN
       QUIT
ACTION WATER
       IFEQ  STATUS,1
          IFNEAR   BOTTLE
             AND
          IFEQ  BOTTLE,0
             OR
          IFHAVE   WATER
             OR
          BIT   HERE,H20HERE
             NAME  WHAT.DO,ARG1
          ELSE
             NAME  IDONTSEE,ARG1
          FIN
       ELSE
          SAY   HAH!
       FIN
       QUIT
ACTION THROW
       ANYOF AXE,SWORD
       CALL  WEAPONRY
ACTION THROW FOOD
       HAVE  FOOD
       IFNEAR   TROLL
          SAY   FEED..TROLL
       ELSE
          IFNEAR   DWARF
             SAY   FED..DWARF
             DROP  FOOD
             BIS   DWARF,SPECIAL2 {enrage the dwarf}
          ELSE
             IFNEAR   BEAR
                SAY   BEAR..URRP
                APPORT   FOOD,LIMBO
                SET   BEAR,1
                IFEQ  AXE,1
                   SET   AXE,0
                FIN
             ELSE
                PROCEED
             FIN
          FIN
       FIN
       QUIT
ACTION THROW TEETH
       HAVE  TEETH
       SET   TEETH,0
       NEAR   GOBLINS
       SAY   WARRIORS
       APPORT   TEETH,LIMBO
       APPORT   GOBLINS,LIMBO
       QUIT
ACTION THROW VIAL
       HAVE  VIAL
       CALL  BREAK.VIAL
ACTION WAVE
       IFGT  STATUS,1
          NOT
          BIT   ARG2,OBJECT
             SAY   HAH!
             QUIT
          FIN
          IFHAVE   ARG2
          ELSE
             SAY   NOTCARRYING
             QUIT
          FIN
       FIN
       IFKEY ROD
          IFNEAR   FISSURE
             IFLT  CLOSURE,2
                ADD   FISSURE,1
                SAY   FISSURE
                IFEQ  FISSURE,2
                   SET   FISSURE,0
                   BIS   FISSURE,INVISIBLE
                ELSE
                   BIC   FISSURE,INVISIBLE
                FIN
             ELSE
                SAY   NOTHING
             FIN
          ELSE
             IFNEAR   QUICKSAND
                SAY   NOTHING.OBVIOUS
                SET   QUICKSAND,1    {harden the quicksand for a while}
             ELSE
                IFNEAR   GORGE
                   AND
                IFLT  CLOSURE,2
                   ADD   GORGE,1
                   SAY   GORGE
                   ADD   GORGE,1
                   IFEQ  GORGE,4
                      SET   GORGE,0
                      BIS   GORGE,INVISIBLE
                   ELSE
                      BIC   GORGE,INVISIBLE
                   FIN
                ELSE
                   SAY   NOTHING
                FIN
             FIN
          FIN
       ELSE
          IFKEY AXE
             OR
          IFKEY SWORD
             CALL  WEAPONRY
          ELSE
             SAY   NOTHING
          FIN
       FIN
       QUIT
ACTION THROW         * Generalized "throw" control
       IFEQ  STATUS,2
          BIT   ARG2,OBJECT {throwing objects}
             IFHAVE   ARG2  {that you happen to be carrying}
                AND
             BIT   HERE,THROWER {thrown from, to someplace else}
                CALL  UPCHUCK     {find the destination and print}
             FIN               {the message}
          FIN
       FIN
       CALL  DROP
ACTION NORTH
       CALL  NO.MOVE.POSSIBLE
       QUIT
ACTION SOUTH
       CALL  NO.MOVE.POSSIBLE
       QUIT
ACTION UP
       SAY   NOCANGO
       QUIT
ACTION DOWN
       SAY   NOCANGO
       QUIT
ACTION EAST
       CALL  NO.MOVE.POSSIBLE
       QUIT
ACTION WEST
       CALL  NO.MOVE.POSSIBLE
       QUIT
ACTION NORTHEAST
       CALL  NO.MOVE.POSSIBLE
       QUIT
ACTION NORTHWEST
       CALL  NO.MOVE.POSSIBLE
       QUIT
ACTION SOUTHEAST
       CALL  NO.MOVE.POSSIBLE
       QUIT
ACTION SOUTHWEST
       CALL  NO.MOVE.POSSIBLE
       QUIT
ACTION INVENTORY
       SET   J,0
       ITOBJ I
          IFHAVE   I
             IFEQ  J,0
                SAY   YOUNOWHAVE
                SET   J,1
             FIN
             SAY   I
          FIN
       EOI
       IFEQ  J,0
          SAY   ARMSAREEMPTY
       FIN
       QUIT
ACTION LOOK
       ANYOF MIST,TREES
       CALL ARG2
ACTION LOOK
       IFNEAR   LAMP
          AND
       IFEQ  LAMP,1
          OR
       BIT   HERE,LIT
          SET   J,0
          BIT   STATUS,FASTMODE
          ELSE
             BIS   STATUS,FULLDISP
             SET   J,1
          FIN
          SAY   HERE
          BIC   STATUS,FULLDISP
          BIS   HERE,BEENHERE
          ITLIST I
             IFNEAR   I
                AND
                NOT
             IFHAVE   I
                IFEQ  J,1
                   AND
                   NOT
                BIT   I,INVISIBLE
                   SET   J,0
                   SAY   BLANK
                FIN
                BIS   I,SEEN
                SAY   I
             FIN
          EOI
          IFNEAR   DWARF
             IFEQ  DWARROWS,1
                SAY   DWARFHERE
             ELSE
                VALUE DWARVESHERE,DWARROWS
             FIN
          FIN
          IFHAVE   BEAR
             SAY   I.C.A.BEAR
          FIN
       ELSE
          SAY   NOLIGHTHERE
       FIN
       QUIT
ACTION LIGHT
       IFKEY LAMP
          IFNEAR   LAMP
             IFLT  LAMPLIFE,40
                IFNEAR   BATTERIES
                   AND
                IFEQ  BATTERIES,0
                   SAY   NEW.BATTERIES
                   SET   BATTERIES,1
                   ADD   LAMPLIFE,300
                   BIC   LAMP,SPECIAL1  {clear "recharged" flag}
                   BIC   LAMP,SPECIAL1  {clear "recharged already" flag}
                FIN
             FIN
             IFGT  LAMPLIFE,0
                SAY   LAMPNOWON
                IFLT  LAMP,1
                   BIT   HERE,LIT
                   ELSE
                      SET   LAMP,1
                      CALL  LOOK
                   FIN
                FIN
                SET   LAMP,1
                CALL  PHOG
             ELSE
                SAY   LAMP.IS.DEAD
             FIN
          ELSE
             NAME  IDONTSEE,ARG2 { (is this right?) }
          FIN
       ELSE
          IFGT  STATUS,1
             SAY   DUNNO.HOW
          ELSE
             IFNEAR   LAMP
             IFLT  LAMPLIFE,40
                IFNEAR   BATTERIES
                   IFEQ  BATTERIES,0
                       SAY   NEW.BATTERIES
                       SET   BATTERIES,1
                       ADD   LAMPLIFE,300
                       BIC   LAMP,SPECIAL1   {clear "recharged already" flag}
                   FIN
                FIN
             FIN
                IFGT  LAMPLIFE,0
                   SAY   LAMPNOWON
                   SET   I,LAMP
                   SET   LAMP,1
                   CALL  PHOG
                   IFLT  I,1
                       AND
                       NOT
                   BIT   HERE,LIT
                       CALL  LOOK
                   FIN
                ELSE
                   SAY   LAMP.IS.DEAD
                FIN
             ELSE
                SAY   NOLIGHTHERE
             FIN
          FIN
       FIN
       QUIT
ACTION EXTINGUISH
       IFKEY LAMP
          OR
       IFEQ  STATUS,1
          IFNEAR   LAMP
             SET   LAMP,0
             SAY   LAMPNOWOFF
             BIT   HERE,LIT
             ELSE
                SAY   ITISNOWDARK
             FIN
             CALL  PHOG
          ELSE
             IFKEY LAMP
                NAME  IDONTSEE,ARG2
             ELSE
                PROCEED
             FIN
          FIN
       ELSE
          SAY   DUNNO.HOW
       FIN
       QUIT
ACTION OPEN
       DEFAULT  OPENABLE
       KEYWORD  GRATE
       NEAR   GRATE
       IFHAVE   KEYS
          IFGT  CLOSURE,1
             OR
          BIT   ADMIN,NOMAGIC
             SAY   GRATE.STUCK
             IFGT  CLOSURE,1
                BIS   ADMIN,PANICED
                BIT   GRATE,SPECIAL1
                ELSE
                   BIS   GRATE,SPECIAL1
                   SAY   GRATE.CLOSED
                FIN
             FIN
          ELSE
             SET   GRATE,1
             SAY   GRATEUNLOCKED
             BIC   DEPRESSION,HINTABLE
          FIN
       ELSE
          SAY   NEEDKEYS
       FIN
       QUIT
ACTION OPEN  CHAIN
       NEAR   CHAIN
       IFHAVE   KEYS
          IFEQ  CHAIN,0
             SAY   CHAIN.UNLOCKED
          ELSE
             IFEQ  CHAIN,1
                IFEQ  BEAR,0
                   SAY   BEAR..CHAIN
                ELSE
                   SAY   CHAIN.UNLOCKED
                   SET   CHAIN,0
                   SET   BEAR,2
                FIN
             ELSE
                SAY   CHAIN.UNLOCKED
                SET   CHAIN,0
             FIN
          FIN
       ELSE
          SAY   NEEDKEYS
       FIN
       QUIT
ACTION OPEN DOOR
       NEAR   DOOR
       SAY   NOLOCK
       QUIT
ACTION OPEN  KEYS
       SAY   UNLOCKKEYS
       QUIT
ACTION OPEN  SAFE
       NEAR  SAFE
       IFEQ  SAFE,0
          SAY   NO.KEYHOLE
       ELSE
          IFEQ  SAFE,1
             NAME  ALREADY.OPEN,ARG2
          ELSE
             SAY   IT.IS.MELTED
          FIN
       FIN
       QUIT
ACTION OPEN CLAM
       NEAR   CLAM
       IFHAVE   CLAM
          SAY   DROP.THE.CLAM
       ELSE
          IFHAVE   TRIDENT
             APPORT   CLAM,LIMBO
             APPORT   OYSTER,HERE
             APPORT   PEARL,CULDESAC
             SAY   CLAM..OPENED
          ELSE
             SAY   NEED.TRIDENT
          FIN
       FIN
       QUIT
ACTION OPEN OYSTER
       NEAR   OYSTER
       IFHAVE   OYSTER
          SAY   DROP.THE.OYSTER
       ELSE
          IFHAVE   TRIDENT
             SAY   OYSTER..OPENED
          ELSE
             SAY   NEED.TRIDNT2
          FIN
       FIN
       QUIT
ACTION OPEN VIAL
       NEAR  VIAL
       CALL  BREAK,VIAL
ACTION OPEN FLASK
       NEAR  FLASK
       IFLT  FLASK,2
          IFLOC FLASK,PENTAGRAM
             APPORT   DJINN,PENTAGRAM
             SAY   POLITE.DJINN
          ELSE
             SAY   RUDE.DJINN
          FIN
          SET   FLASK,2
       ELSE
          NAME  ALREADY.OPEN,ARG2
       FIN
       QUIT
ACTION OPEN PENTAGRAM {weird case - opening a place!}
       IFAT  PENTAGRAM
          IFNEAR   DJINN
             SAY   DJINN.ADVICE
             APPORT   DJINN,LIMBO
             BIS   DJINN,SPECIAL1
          ELSE
             SAY   EMPTY.PENTA
          FIN
       ELSE
          NAME  IDONTSEE,ARG2
       FIN
       QUIT
ACTION CLOSE
       DEFAULT  OPENABLE
       KEYWORD  GRATE
       NEAR GRATE
       SET   GRATE,0
       SAY   GRATELOCKED
       QUIT
ACTION CLOSE CHAIN
       NEAR   CHAIN
       IFAT  BEARHERE
          IFEQ  CHAIN,0
             IFNEAR   BEAR
                DROP BEAR
                SET   BEAR,1
                SET   CHAIN,1
             ELSE
                SET   CHAIN,2
             FIN
          FIN
          SAY   LOCK..CHAIN
          IFHAVE   CHAIN
             DROP  CHAIN
          FIN
       ELSE
          SAY   LOCK..CHAIN?
       FIN
       QUIT
ACTION CLOSE DOOR
       NEAR   DOOR
       SAY   NOLOCK
       QUIT
ACTION CLOSE SAFE
       NEAR  SAFE
       IFEQ  SAFE,1
          SAY   SAFE.SHUTS
          SET   SAFE,0
       ELSE
          NAME  ALREADY.SHUT,ARG2
       FIN
       QUIT
ACTION CLOSE FLASK
       NEAR  FLASK
       IFEQ  FLASK,0
          NAME  ALREADY.SHUT,ARG2
       ELSE
          NAME  DUNNO.HAO,ARG2
       FIN
       QUIT
ACTION HELP
       BIT   HERE,HINTABLE     { modification by K.C.W next 5 lines }
          CALL HINT.LOGIC
       ELSE
          SAY HELPDATA
       FIN
       QUIT
ACTION INFO
       SAY   INFO.2
       QUIT
ACTION QUIT
       QUERY WANTTOQUIT
          SET   QUITTING,1
          CALL  FINIS
       FIN
       SAY   OK
       QUIT
ACTION BRIEF
       SAY   BRIEF.OK
       BIS   STATUS,QUICKIE
       BIC   STATUS,FASTMODE
       LDA   OK,OK!
       QUIT
ACTION LPSD
       IFEQ  STATUS,1
          OR
       NOT
       BIT   ADMIN,OLORIN
          SAY   WHAT?
          QUIT
       FIN
       BIT   ARG2,PLACE
          GOTO  ARG2
       ELSE
          SAY   WHAT?
       FIN
       QUIT
ACTION KILL
       DEFAULT  MORTAL      {find default enemy in one exists}
       ANYOF TROLL,DWARF,DRAGON,SNAKE,BIRD,BEAR,OYSTER,CLAM,OGRE,BLOB
       ANYOF DJINN,GOBLINS,BASILISK,GONG
       NEAR   ARG2
       IFKEY TROLL
          CALL  KILLTROLL
       ELSE
          IFKEY DWARF
             CALL  KILLDWARF
          ELSE
             IFKEY DRAGON
                CALL  KILLDRAGON
             ELSE
                IFKEY SNAKE
                   CALL  KILLSNAKE
                ELSE
                   IFKEY BLOB
                       CALL  KILLBLOB
                   ELSE
                       IFKEY BEAR
                         CALL KILLBEAR
                       ELSE
                         IFKEY CLAM
                            OR
                         IFKEY OYSTER
                            CALL  KILLBIVALVE
                         ELSE
                            IFKEY OGRE
                               CALL  KILLOGRE
                            ELSE
                               IFKEY BIRD
                                  CALL  KILLBIRD
                               ELSE
                                  IFKEY DJINN
                                     CALL  KILLDJINN
                                  ELSE
                                     IFKEY GOBLINS
                                        CALL  KILLGOBLINS
                                     ELSE
                                        IFKEY BASILISK
                                           CALL  KILLBASILISK
                                        ELSE
                                           IFKEY GONG
                                               CALL  HITGONG
                                           FIN
                                        FIN
                                     FIN
                                  FIN
                               FIN
                            FIN
                         FIN
                       FIN
                   FIN
                FIN
             FIN
          FIN
       FIN
       QUIT
ACTION KILL
       IFEQ  STATUS,1
          SAY  PACIFIST
          QUIT
       FIN
ACTION FAST
       BIC   STATUS,QUICKIE
       BIS   STATUS,FASTMODE
       SAY   OK
       LDA   OK,SOK!
       QUIT
ACTION FULL
       BIC   STATUS,QUICKIE
       BIC   STATUS,FASTMODE
       LDA   OK,OK!
       SAY   OK
       QUIT
ACTION FEED
       ANYOF BEAR,TROLL,BIRD,SNAKE,DWARF,DRAGON,BASILISK,GOBLINS
       IFNEAR   ARG2
          IFKEY BEAR
             IFNEAR   FOOD
                SAY   BEAR..URRP
                SET   BEAR,1
                IFHAVE   FOOD
                FIN
                APPORT   FOOD,LIMBO
                IFEQ  AXE,1
                   SET   AXE,0
                FIN
             ELSE
                SAY   SNAKEWONTEAT
             FIN
          ELSE
             IFKEY TROLL
                SAY   FEED..TROLL
             ELSE
                IFKEY SNAKE
                   IFHAVE   BIRD
                      SAY   SNAKE..BIRD
                      APPORT   BIRD,LIMBO
                   ELSE
                      SAY   SNAKEWONTEAT
                   FIN
                ELSE
                   IFKEY DWARF
                       SAY   FED..DWARF
                       BIS   DWARF,SPECIAL2 {makes him mad}
                   ELSE
                       IFKEY BIRD
                         SAY   BIRDSEED
                       ELSE
                         IFKEY DRAGON
                            IFEQ  DRAGON,0
                               SAY   SNAKEWONTEAT
                            ELSE
                               SAY   IT.IS.DEAD
                            FIN
                         ELSE
                            IFKEY BASILISK
                               IFLT  BASILISK,2
                                  SAY   SNAKEWONTEAT
                               ELSE
                                  SAY   IT.IS.DEAD
                               FIN
                            ELSE
                               IFKEY GOBLINS
                                  SAY   GOBL.EAT.YOU
                               FIN
                            FIN
                         FIN
                       FIN
                   FIN
                FIN
             FIN
          FIN
       ELSE
          NAME   IDONTSEE,ARG2
       FIN
       QUIT
ACTION FEED
       IFEQ  STATUS,1
          SAY   HUH??
       ELSE
          SAY   HAH!
       FIN
       QUIT
ACTION SCORE
       SET   QUITTING,1
       CALL  GETSCORE
       VALUE IFYOUQUIT,SCOREX
       VALUE IFYOUQUIT2,MAXSCORE
       QUERY WANTTOQUIT
          SAY   OK
          CALL  FINIS
       ELSE
          SAY   OK
       FIN
       QUIT
ACTION JUMP
       SAY   NOJUMPING
       QUIT
ACTION IN
       SAY   INFROMOUT
       QUIT
ACTION OUT
       SAY   INFROMOUT
       QUIT
ACTION ABRA
       SAY   MAGICKWORD
       QUIT
ACTION FEE
       ANYOF FIE,FOE,FOO,FUM
       SET   FOOBAR,0
       SAY   NOTHING
       QUIT
ACTION FEE
       SET   FOOBAR,1
       SAY   OK
       QUIT
ACTION FIE
       IFEQ  FOOBAR,0
          SET   FOOBAR,2
          SAY   OK
       ELSE
          SET   FOOBAR,0
          SAY   NOTHING
       FIN
       QUIT
ACTION FOE
       IFEQ  FOOBAR,1
          SET   FOOBAR,3
          SAY   OK
       ELSE
          SET   FOOBAR,0
          SAY   NOTHING
       FIN
       QUIT
ACTION FOO
       IFEQ  FOOBAR,2
          IFLOC EGGS,GIANT
             OR
          IFLOC EGGS,YLEM   {threw 'em into the chasm}
             SAY   NOTHING
          ELSE
             IFNEAR   EGGS
                SET   EGGS,1
             ELSE
                IFAT  GIANT
                   SET   EGGS,0
                ELSE
                   SET   EGGS,2
                FIN
             FIN
             IFHAVE   EGGS
                DROP  EGGS
             FIN
             SAY   EGGS
             SET   EGGS,0
             IFLOC EGGS,LIMBO  {if the eggs were given in toll}
                BIS   TROLL,SPECIAL1    {can't be fooled twice}
                IFEQ  TROLL,1  {bought off, not crossed}
                   OR
                IFEQ  TROLL,2  {bought off, crossed}
                   IFNEAR   TROLL2   {at the chasm with a good bridge}
                       SET   TROLL,5  {irate}
                       SAY   TROLL    {bitch, bitch!}
                   FIN
                   SET   TROLL,0     {normal troll mode}
                   APPORT   TROLL,SWOFCHASM   {fetch him back}
                   APPORT   TROLL2,LIMBO      {discard fake troll}
                FIN
             FIN
             APPORT   EGGS,GIANT
          FIN
       ELSE
          SAY   NOTHING
       FIN
       SET   FOOBAR,0
       QUIT
ACTION FUM
       SET   FOOBAR,0
       SAY   NOTHING
       QUIT
ACTION XYZZY
       SAY   NOTHING
       QUIT
ACTION PLUGH
       SAY   NOTHING
       QUIT
ACTION FIND  CAVE
       BIT   HERE,NOTINCAVE
          AND
          NOT
       BIT   INCAVE,BEENHERE
          SAY   WHEREISCAVE
       ELSE
          SAY   NEEDDETAIL
       FIN
       QUIT
ACTION FIND
       IFGT  STATUS,1
          BIT   ARG2,OBJECT
             IFNEAR   ARG2
                IFHAVE   ARG2
                   SAY   ITISHERENOW
                ELSE
                   SAY   HERESOMEWHERE
                FIN
             ELSE
                SAY   CANTFIND
             FIN
             QUIT
          ELSE
             BIT   ARG2,PLACE
                IFAT  ARG2
                   SAY   YOU.ARE.THERE
                ELSE
                   SAY   CANTFIND
                FIN
             ELSE
                SAY   WHAT?
             FIN
             QUIT
          FIN
       FIN
ACTION SWIM
       SAY   DUNNO.HOW
       QUIT
ACTION BREAK VASE
       NEAR  VASE
       SAY   THROW,VASE
       IFHAVE   VASE
       FIN
       APPORT   VASE,LIMBO
       APPORT   SHARDS,HERE
       QUIT
ACTION BREAK VIAL
       NEAR  VIAL
       CALL  BREAK,VIAL
ACTION FIX   VASE
       NEAR  POTTERY
       SAY   NO.CAN.FIX
       QUIT
ACTION FILL VASE
       NEAR  VASE
       BIT   HERE,H20HERE
          OR
       IFAT  EASTPIT
          SAY   SHATTER.VASE
          IFHAVE   VASE
          FIN
          APPORT   VASE,LIMBO
          APPORT   SHARDS,HERE
       ELSE
          SAY   NOTHING,VASE
       FIN
       QUIT
ACTION FILL BOTTLE
       NEAR  BOTTLE
       IFEQ  BOTTLE,1
          BIT   HERE,H20HERE
             SAY   BOTTLE..H20
             SET   BOTTLE,0
             IFHAVE   BOTTLE
                GET   WATER
             FIN
          ELSE
             IFAT  EASTPIT
                SAY   BOTTLE..OIL
                SET   BOTTLE,2
                IFHAVE   BOTTLE
                   GET   OIL
                FIN
             ELSE
                SAY   NOTHING2FILL
             FIN
          FIN
       ELSE
          SAY   BOTTLEWASFULL
       FIN
       QUIT
ACTION FILL
       IFGT  STATUS,1
          SAY   CANTFILLTHAT
          QUIT
       FIN
ACTION POUR WATER
       IFHAVE   WATER
          APPORT   WATER,LIMBO
          SET   BOTTLE,1
          IFNEAR   PLANT
             ADD   PLANT,1
             SAY   PLANT
             ADD   PLANT,1
             IFEQ  PLANT,6
                SET   PLANT,0
                BIS   PLANT2,INVISIBLE
             ELSE
                BIC   PLANT2,INVISIBLE
             FIN
             GOTO  HERE
             SET   PLANT2,PLANT
          ELSE
             IFNEAR   DOOR
                SET   HINGES..RUST
                SET   DOOR,0
             ELSE
                SAY   POURWATER
             FIN
          FIN
       ELSE
          NAME  YOUDONTHAVE,WATER
       FIN
       QUIT
ACTION POUR OIL
       IFHAVE   OIL
          APPORT   OIL,LIMBO
          SET   BOTTLE,1
          IFNEAR   PLANT
             SAY   OIL..PLANT
          ELSE
             IFNEAR   DOOR
                SAY   OIL..DOOR
                SET   DOOR,1
             ELSE
                SAY   POURWATER
             FIN
          FIN
       ELSE
          NAME   YOUDONTHAVE,ARG2
       FIN
       QUIT
ACTION PLACATE
       ANYOF DWARF,SNAKE,BIRD,DRAGON,TROLL,BEAR,PIRATE,OGRE,BASILISK,GOBLINS
       NEAR  ARG2
       SAY   IAMGAME
       QUIT
ACTION EAT
       DEFAULT  EDIBLE
       NEAR  MUSHROOM
       IFEQ  STATUS,1
          OR
       IFKEY MUSHROOM
          IFHAVE   MUSHROOM
             DROP  MUSHROOM
          FIN
          SET   MUSHROOM,2
          SET   MUSHTIME,30
          ADD   MUSHTIME,LASTCLOCK
          APPORT   MUSHROOM,LIMBO
          SET   STRENGTH,12
          QUIT
       FIN
ACTION EAT
       NEAR   FOOD
       IFEQ  STATUS,1
          OR
       IFKEY FOOD
          IFHAVE   FOOD
          FIN
          APPORT   FOOD,LIMBO
          SAY   URRP
          QUIT
       FIN
ACTION EAT
       ANYOF DWARF,DRAGON,BIRD,SNAKE,BEAR,TROLL,PLANT,OGRE
       ANYOF BASILISK,GOBLINS
       IFNEAR   ARG2
          SAY   BLEAH
       ELSE
          NAME  IDONTSEE,ARG2
       FIN
       QUIT
ACTION EAT
       IFEQ  STATUS,1
          SAY   NO.FOOD
          QUIT
       ELSE
          BIT   ARG2,OBJECT
             IFNEAR   ARG2
                SAY   REPULSIVE
                QUIT
             FIN
          FIN
       FIN
ACTION RUB   LAMP
       NEAR  LAMP
       NAME  RUBLAMP,ARG2
       QUIT
ACTION RUB
       IFGT  STATUS,1
          BIT   ARG2,OBJECT
             IFNEAR   ARG2
                SAY   PECULIAR
                QUIT
             FIN
          FIN
       FIN
ACTION BACK
       BIT   HERE,NOBACK
          OR
       BIT   THERE,NOBACK
          OR
       IFEQ  THERE,0
          SAY   CANTGOBACK
       ELSE
          GOTO  THERE
       FIN
       QUIT
ACTION MIST
       SAY   THISISMIST
       QUIT
ACTION TREES   { Bug fix. Add TREES routine Jim 6/12/85 }
       BIT HERE,NOTINCAVE      { Can see trees anywhere above ground }
          SAY INFOREST
       ELSE
          SAY NO.TREES.HERE
       FIN
       QUIT
ACTION SAY
       ANYOF PLUGH,XYZZY,PLOVER,THURB,MELENKURION,NOSIDE,SAMOHT
       ANYOF KNERL,ZORTON,KLAETU,SNOEZE,BLERBI,PHUGGG
       CALL  ARG2
       QUIT
ACTION SAY
       IFEQ  STATUS,2
          QUIT
       FIN
ACTION SAVE
       BIT   ADMIN,DEMO
          SAY   SUSP.DEMO
       ELSE
          SET   I,1
          NOT
          BIT   ADMIN,OLORIN
             VALUE MUSTWAIT,MINTIME
             QUERY IS.THIS.OK?
             ELSE
                SET   I,0
             FIN
          FIN
          IFGT  I,0
             SVAR  4,TIME
             MULT  TIME,60
             SVAR  5,I
             ADD   TIME,1
             EXECUTIVE   1,I      {save program image}
             IFEQ  I,0
                BIT   ADMIN,OLORIN
                   QUERY CONTINUE.NOW?
                       SAY   OK
                       SAY   BLANK
                       QUIT
                   FIN
                FIN
                SAY   OK
                SAY   BLANK
                STOP
             ELSE
                SAY   CANT.SAVE
             FIN
          ELSE
             SAY   OK
          FIN
       FIN
       QUIT
ACTION RESTORE
       EXECUTE  5,I      {get prime-time factor}
       IFGT  I,0      {if something forbids adventures}
          NOT
          BIT   ADMIN,OLORIN
             LDA   J,RESTORE.PRIME-1
             ADD   J,I
             SAY   J
             QUIT
          FIN
       FIN
       BIT   ADMIN,OLORIN
          SET   I,1
       ELSE
          SET   I,0
       FIN
       EXECUTIVE 7,I   {save value of I over RESTORE attempt}
       EXECUTE  2,I       {attempt to restore image}
       IFEQ  I,0         {all well}
          SVAR  4,I      {get hours}
          SVAR  5,J      {get minutes}
          MULT  I,60
          ADD   I,J
          IFLT  I,TIME
             ADD   I,720
             ADD   I,720    {1440 is too big}
          FIN
          SUB   I,TIME
          EXECUTIVE   8,J   {restore pushed value}
          IFEQ  J,1
             BIS   ADMIN,OLORIN
          ELSE
             BIC   ADMIN,OLORIN
          FIN
          BIT   ADMIN,OLORIN {if he's a wizard}
             OR
          IFGT  I,MINTIME
             IFEQ  LAMP,1   {if the lamp is on}
                ADD   LAMPLIFE,1  {compensate for following move}
             FIN
             BIT   ADMIN,OLORIN  {if we're a wizard}
                QUERY SAVE.THE.IMAGE
                ELSE
                   EXECUTIVE   3,I   {flush the image}
                FIN
             ELSE
                EXECUTIVE   3,I      {flush user-mode image}
             FIN
             EXECUTIVE   4,I   {flush the cache out}
             GOTO  HERE
             SAY   OK
             SAY   BLANK
          ELSE
             VALUE TOO.SOON,MINTIME
             SAY   BLANK
             STOP     {must stop - we already did the restore!}
          FIN
       ELSE
          IFEQ  I,1   {no file, or no image}
             SAY   NO.IMAGE
             SUB   TURNS,1  {let him try again}
          ELSE     {response 2 = checksum failed!}
             SAY   EXPLOSION   {well-house blew up}
             EXECUTE  3,I      {delete the record}
          FIN
       FIN
       QUIT
ACTION DRINK
       IFEQ  STATUS,1
          OR
       IFKEY WATER
          BIT   HERE,H20HERE
             SAY   SLURP
             QUIT
          ELSE
             IFNEAR   BOTTLE
                AND
             IFEQ  BOTTLE,0
                SAY  WATERGONE
                APPORT   WATER,LIMBO
                SET   BOTTLE,1
                QUIT
             FIN
          FIN
          IFKEY WATER
             NAME  IDONTSEE,ARG2
          ELSE
             SAY   CANTDRINK
          FIN
       ELSE
          BIT   ARG2,OBJECT
             IFNEAR   ARG2
                SAY   HAH!
             ELSE
                NAME  IDONTSEE,ARG2
             FIN
          ELSE
             SAY   HAH!
          FIN
       FIN
       QUIT
ACTION NEWS
       SAY   NEWSDATA
       QUIT
ACTION READ
       IFGT  STATUS,1
          BIT   ARG2,OBJECT
             IFNEAR   ARG2
                IFKEY    MAGAZINES
                   CALL  READ,MAGAZINES
                ELSE
                   IFKEY    MESSAGE
                       CALL  READ,MESSAGE
                   ELSE
                       IFKEY    TABLET
                         CALL  READ,TABLET
                       ELSE
                         NAME  DUNNO.HAD,ARG1
                       FIN
                   FIN
                FIN
             ELSE
                NAME  IDONTSEE,ARG2
             FIN
          ELSE
             SAY   HAH!
          FIN
       ELSE
          PROCEED
       FIN
       QUIT
ACTION HOURS
       SAY   HOURS.ARE
       EXECUTIVE   6,I
       QUIT
ACTION WIZARD
       QUERY R.U.A.WIZARD?
          SAY   PROVE.IT
          INPUT
          SET   I,1      {sense switch number}
          SVAR  8,I      {read sense switch 1}
          IFEQ  I,1
             AND
          IFKEY SLIME
             SAY   SO.YOU.ARE
             BIC   ADMIN,DEMO
             BIS   ADMIN,OLORIN
          ELSE
             SAY   OH.POOH
             ADD   PENALTIES,10
          FIN
       ELSE
          SAY   OK
       FIN
       QUIT
ACTION CLIMB
       SAY   NOCANCLIMB
       QUIT
ACTION LOST
       SAY   IMCONFUSED
       QUIT
ACTION MELENKURION
       IFNEAR   STATUE
          AND
       IFEQ  STATUE,0
          SET   STATUE,1
          SAY   CRUMBLE
       ELSE
          SAY   NOTHING
       FIN
       QUIT
ACTION NOSIDE SAMOHT
       BIT   LAMP,SPECIAL1
          OR
       BIT   HERE,LIT
          OR
          NOT
       BIT   LAIR,BEENHERE
          OR
          NOT
       IFNEAR   LAMP
          SAY   NOTHING
       ELSE
          IFHAVE   LAMP
             SAY   FZAP
             CALL  CORONER
          ELSE
             IFGT  LAMPLIFE,40
                APPORT   LAMP,YLEM
                SET   BATTERIES,1    {so lamp doesn't come back}
                SET   LAMP,0
                SET   LAMPLIFE,0
                CHANCE   50
                   SAY   LAMP.GOES.POOF
                   SAY   ITISNOWDARK
                ELSE
                   SAY   LAMP.EXPLODES
                   CALL  CORONER
                FIN
             ELSE
                SAY   LAMP.RECHARGED
                ADD   LAMPLIFE,150
                SET   LAMP,1
                BIS   LAMP,SPECIAL1
             FIN
          FIN
       FIN
       QUIT
ACTION NOSIDE
       SAY NOTHING
       QUIT
ACTION SAMOHT
       SAY NOTHING
       QUIT
ACTION THURB
       SAY NOTHING
       QUIT
ACTION KNERL
       CALL  PASSPHRASE
ACTION ZORTON
       CALL  PASSPHRASE
ACTION KLAETU
       CALL  PASSPHRASE
ACTION SNOEZE
       CALL  PASSPHRASE
ACTION BLERBI
       CALL  PASSPHRASE
ACTION RIDE
       IFEQ  STATUS,1
          OR
       IFKEY TURTLE
          AND
       IFNEAR   TURTLE
          SAY   TURTLE.BACK
          GOTO  RESERVOIR
          APPORT   TURTLE.LIMBO
          QUIT
       FIN
ACTION PHUGGG
       BIS   DJINN,SPECIAL2    {he needn't tell us about it}
       BIT   HERE,NOTINCAVE
          SAY   NOTHING
       ELSE
          IFNEAR   BOTTLE
             AND
          IFEQ  BOTTLE,0
             OR
          BIT   HERE,H20HERE
             CHANCE   85
                SAY   NOTHING
             ELSE
                CHANCE   95
                   SAY   JELLYFISH
                   CALL  CORONER
                ELSE
                   SAY   CAVE.DESTROYED
                   STOP
                FIN
             FIN
          ELSE
             IFNEAR   AXE
                OR
             IFNEAR   SWORD
                IFNEAR   AXE
                   SAY   ZOT.AXE
                   IFHAVE   AXE
                   FIN
                   APPORT   AXE,LIMBO
                FIN
                IFNEAR   SWORD
                   SAY   ZOT.SWORD
                   IFHAVE   SWORD
                   FIN
                   APPORT   SWORD,LIMBO
                FIN
             ELSE
                RANDOM   I,3
                MULT  I,2
                IFGT  DWARROWS,1
                   ADD   I,1
                FIN
                IFNEAR   DWARF
                   CHANCE   70
                       LDA   J,IT.WORKED
                       ADD   I,J
                       SAY   I
                       APPORT   DWARF,LIMBO
                       SUB   DWARFCOUNT,DWARROWS
                       SET   DWARROWS,0
                   ELSE
                       LDA   J,IT.DIDNT.WORK
                       ADD   I,J
                       SAY   I
                       CALL  CORONER
                   FIN
                ELSE
                   SAY   NOTHING
                FIN
             FIN
          FIN
       FIN
       QUIT

Printout 3

adv.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

main ()
{
        srandom (time(0)+getpid()) ;

        setup () ;
        opendb (ADV) ;
        webster () ;

#ifdef PSTAB
        pstab () ;
#endif PSTAB

        process (INITIAL) ;

        forever
                process (REPEAT) ;
}

int setup ()
{
        register int i ;

        for ( i = 0 ; i < OBJECTS ; i++ )
        {
                objval[i] = 0 ;
                objbit[i] = XOBJECT ;
                objloc[i] = 0 ;
        }

        for ( i = 0 ; i < PLACES ; i++ )
        {
                plcbit[i] = XPLACE ;
        }

        for ( i = 0 ; i < VARS ; i++ )
        {
                varval[i] = 0 ;
                varbit[i] = XVERB ;
        }

#ifdef CACHE
        ClrCache () ;
#endif CACHE

        return ;
}

int opendb(name)
  char *name ;
{
        dbunit = openk (name) ;

        if ( dbunit == ERROR )
                error ("Opendb","unable to open %s!",name) ;
        return ;
}

advglob.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

char opn [MAXOPS] =
{
        2, 0, 1, 2, 1, 2, 2, 2, 1, 1,
        1, 2, 2, 1, 0, 0, 0, 0, 2, 2,
        0, 1, 1, 1, 1, 2, 2, 2, 1, 1,
        2, 2, 2, 1, 0, 1, 1, 1, 1, 2,
        2, 2, 2, 2, 1, 0, 0, 0, 1, 0,
        2, 1, 2, 3, 0, 2, 2, 2
} ;

char ltab[MAXOPS] =
{
        0,0,0,0,0,0,0,1,0,1,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,1,1,1,1,
        1,1,1,1,1,1,0,0,0,0,0,0,0,0,
        0,0,0,1,0,0,1,0,0,0,0,0,0,0,
        0,0
} ;

struct symstr *symtab [TABSIZ] =
{
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
} ;

char clss [] =
{
        INITIAL,
        LABEL,
        VERB,
        VERB,
        PLACE,
        PLACE,
        PLACE,
        TEXT,
        OBJECT,
        OBJECT,
        OBJECT,
        VARIABLE,
        NULL,
        0
} ;

char token [MAXLINE] ;

int linlen = 0 ;
int linewd [LINELEN] ;

char lex[LEXLEN][LEXSIZ] ;

short int objval[OBJECTS] ;
short int objbit[OBJECTS] ;
short int objloc[OBJECTS] ;

short int plcbit[PLACES] ;

short int varval[VARS] ;
short int varbit[VARS] ;

short int codebuf[BUFSIZE] ;
char textbuf[TBUFSIZE] ;

int nrep, ninit, nvars, nobj, nplace ;
int here, there, status, argwd[LINELEN] ;

int dbunit = -1 ;

adefs.h


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#define ADV             "adv"
#define FREEZER         "freezer"
#define INITIAL         0
#define REPEAT          500
#define ERROR           (-1)
#define OBJECTS         120
#define PLACES          307
#define VARS            50
#define SYMTABREC       13000
#define MAXKEY          14000
#define MAXOPS          58
#define BUFSIZE         500
#define TBUFSIZE        3000
#define CACHESIZE       100
#define MAXCACHE        4096
#define TABSIZ          128
#define LEXSIZ          20
#define MAXLINE         134

#define YES             1
#define NO              0
#define EOS             0
#define NIL             ((struct symstr *)0)
#define OK              1
#define MATCH           6

#define ADD              0
#define AND              1
#define ANYOF            2
#define APPORT           3
#define AT               4
#define BIC              5
#define BIS              6
#define BIT              7
#define CALL             8
#define CHANCE           9
#define DEFAULT         10
#define DEPOSIT         11
#define DIVIDE          12
#define DROP            13
#define ELSE            14
#define EOF             15
#define EOI             16
#define EOR             17
#define EVAL            18
#define EXEC            19
#define FIN             20
#define GET             21
#define GOTO            22
#define HAVE            23
#define IFAT            24
#define IFEQ            25
#define IFGE            26
#define IFGT            27
#define IFHAVE          28
#define IFKEY           29
#define IFLE            30
#define IFLOC           31
#define IFLT            32
#define IFNEAR          33
#define INPUT           34
#define ITLIST          35
#define ITOBJ           36
#define IFPLACE         37
#define KEYWORD         38
#define LDA             39
#define LOCATE          40
#define MOVE            41
#define MULT            42
#define NAME            43
#define NEAR            44
#define NOT             45
#define OR              46
#define PROCEED         47
#define QUERY           48
#define QUIT            49
#define RANDOM          50
#define SAY             51
#define SET             52
#define SMOVE           53
#define STOP            54
#define SUB             55
#define SVAR            56
#define VALUE           57

#define LINELEN         2
#define LEXLEN          5
#define MAXCALLS        10
#define MAXDOS          2

#define OBJKEY          8000
#define MAXOBJECTS      120
#define MAXOTEXT        20
#define MAXOCODE        4
#define PLACEKEY        4000
#define MAXPLACES       350
#define MAXPCODE        8
#define VERBKEY         2000
#define MAXVERBS        160
#define MAXVCODE        12

#define MOVED           001
#define BRIEF           002
#define FAST            004
#define LOOKING         010
#define BEEN            002
#define DUAL            010

#define XOBJECT         010000
#define XVERB           004000
#define XPLACE          002000
#define BADWORD         001000

#define INIT            0
#define LABEL           1
#define VERB            2
#define PLACE           3
#define TEXT            4
#define OBJECT          5
#define VARIABLE        6
#define NULL            7

#define INHAND          (-1)
#define REPLACE         '#'
#define NULLTXT         7000
#define BLANKTXT        7001
#define OKTXT           7002

#define forever         for(;;)

#define class(key)      (clss[(key)/1000])
#define indx(key)       ((key)%1000)
#define logical(instr)  (ltab[(instr)])
#define opnum(opcode)   (opn[(opcode)])
#define where(key)      (objloc[indx(key)])

#define CACHE                            /* see `cache.c' for details */

struct symstr
{
        char            *s_nam ;
        struct symstr   *s_nxt ;
        short int        s_val ;
} ;

extern char opn [] ;
extern struct symstr *symtab [] ;

extern char ltab[] ;

extern char token [] ;

extern int linlen ;
extern int linewd [] ;

extern char lex[LEXLEN][LEXSIZ] ;

extern short int objval[], objbit[], objloc[] ;

extern short int plcbit[] ;

extern short int varval[], varbit[] ;

extern short int codebuf[] ;
extern char textbuf[] ;

extern int nrep, ninit, nvars, nobj, nplace ;
extern int here, there, status, arowd[] ;

extern int dbunit ;
extern char clss[] ;

command.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

int command ()
{
        register int i, k ;
        int cnt, val ;

        linlen = 0 ;
        for ( i = 0 ; i < LINELEN ; i++ )
                linewd[i] = -1 ;

        cnt = readln (lex) ;

        for ( i = 0 ; i < cnt ; i++ )
        {
                low2up (lex[i]) ;
                val = find(lex[i]) ;
                if ( class(val) == NULL )
                        continue ;
                linewd[linlen++] = val ;
        }

        for ( i = 0 ; i < LINELEN ; i++ )
        {
                switch (class(linewd[i]))
                {
                        case OBJECT:
                        case PLACE:
                                k = bitval(linewd[i]) ;
                                break ;

                        case VERB:
                                k = XVERB ;
                                break ;

                        default:
                                k = 0 ;
                                break ;
                }
                if ( linewd[i] < 0 )
                        k = BADWORD ;
                setval (argwd[i],linewd[i]) ;
                setbit (argwd[i],k) ;
        }

        setval (status,linlen) ;
        if ( linlen <= 0 )
                return ;

        switch ( class(linewd[0]) )
        {
                case VERB:
                        setbit(status,(bitval(status)|XVERB)) ;
                        break ;

                case OBJECT:
                        setbit(status,(bitval(status)|XOBJECT)) ;
                        break ;

                case PLACE:
                        setbit(status,(bitval(status)|XPLACE)) ;
                        break ;
        }

        return ;
}

int low2up (word)
  register char *word ;
{
        for ( ; *word ; word++ )
                if ( (*word) >= 'a' && (*word) <= 'z' )
                        *word += ( 'A' - 'a' ) ;
        return ;
}

#undef NULL
#undef EOF
#include <stdio.h>
#define LINESIZE        134

int readln (words)
  char words[LEXLEN][LEXSIZ] ;
{
        register int cnt, i ;
        register char *b ;
        char buffer[LINESIZE] ;

        printf ("? ") ;

        if ( fgets (buffer,LINESIZE,stdin) == NULL )
                exit (1) ;

#ifdef STATUS
        if ( strcmp (buffer,"~status\n") == 0 )
        {
                pcstat () ;
                (void) strcpy (buffer,"LOOK\n") ;
        }
#endif STATUS

        cnt = 0;
        for ( cnt = 0, b = buffer ; *b != '\n' && *b != '\0' ; )
        {
                while ( *b == ' ' || *b == '\t' )
                        b++ ;

                for ( i = 0 ; *b != ' ' && *b != '\t' && *b != '\n' && *b != '\0' ; b++ )
                        if ( i < (LEXSIZ-1) )
                                words[cnt][i++] = *b ;

                words[cnt][i] = EOS ;
                if ( i > 0 )
                        if ( ++cnt >= LEXLEN )
                                break ;
        }
        return (cnt) ;
}

process.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

#ifdef SHOWOP
        extern int CurKey ;
#endif SHOWOP

int process (key)
  int key ;
{
        int rec, calls, dos, endb ;
        int srec[MAXCALLS], sbp[MAXCALLS], sdos[MAXCALLS] ;
        int dover[MAXDOS], dopnt[MAXDOS], domod[MAXDOS] ;
        short int instr, op[3] ;
        register int bp, i, j ;
        int n ;

        rec = key ;
        calls = 0 ;
        dos = 0 ;

        forever
        {
                bp = 0 ;
                while ( rec == ERROR || ( endb = rdcode (rec) ) == ERROR )
                {
                        if ( calls <= 0 )
                                return ;
                        rec = srec [calls] ;
                        bp = sbp [calls] ;
                        dos = sdos [calls] ;
                        calls-- ;
                }

#ifdef SHOWOP
                CurKey = rec ;
#endif SHOWOP
                while ( bp < endb )
                {
                        instr = codebuf [bp] ;
                        if ( logical (instr) )
                        {
                                bp = condition (bp,codebuf,endb) ;
                                continue ;
                        }
                        bp++ ;
                        n = opnum (instr) ;
                        for ( i = 0 ; i < n ; i++, bp++ )
                                op [i] = codeful [bp] ;
#ifdef SHOWOP
                        showop (YES,instr,op) ;
#endif SHOWOP
                        switch (instr)
                        {
                          case ADD:

                                setval (op[0],(eval(op[0])+eval(op[1]))) ;
                                continue ;

                          case ANYOF:

                                bp -= 2 ;
                                for ( j = 0 ; codebuf [bp] == ANYOF ; bp+=2 )
                                        for ( i = 0 ; i < LINELEN ; i++ )
                                            if ( codebuf [bp+1] == linewd [i] )
                                                        j++ ;
                                if ( j > 0 )
                                        continue ;
                                break ;

                          case APPORT:

                                movobj ( ref (op[0]), ref (op[1]) ) ;
                                continue ;

                          case AT:

                                bp -= 2 ;
                                i = eval (here) ;
                                for ( j = 0 ; codebuf [bp] == AT ; bp += 2 )
                                        if ( codebuf [bp+1] == i )
                                                j++ ;
                                if ( j > 0 )
                                        continue ;
                                break ;

                          case BIC:

                                setbit (op[0],bitval(op[0])&(~bitval(op[1]))) ;
                                continue ;

                          case BIS:

                                setbit (op[0],bitval(op[0])|bitval(op[1])) ;
                                continue ;

                          case CALL:

                                if ( (++calls) >= MAXCALLS )
                                   error ("Process","call stack overflow (%d)!",
                                           calls) ;
                                srec [calls] = rec ;
                                sbp  [calls] = bp ;
                                sdos [calls] = dos ;
                                rec = ref ( op[0] ) ;
                                j = class ( rec ) ;
                                if ( j == OBJECT )
                                        rec += (MAXOTEXT * MAXOBJECTS) ;
                                else
                                        if ( j == PLACE )
                                                rec += ( 2 * MAXPLACES ) ;
                                break ;

                          case DEFAULT:

                                if ( linlen != 1 )
                                        continue ;
                                j = 0;
                                for ( i = OBJKEY ; indx(i) < nobj ; i++ )
                                {
                                        if ( near (i) == NO ||
                                        (bitval(i)&bitval(op[0])) == 0 )
                                                continue ;
                                        if ( j != 0 )
                                        {
                                                j = 0 ;
                                                break ;
                                        }
                                        j = i ;
                                }
                                if ( j == 0 )
                                        continue ;
                                setval (argwd[1],j) ;
                                setbit (argwd[1],bitval(j)) ;
                                linewd[1] = j ;
                                setval (status,2) ;
                                linlen = 2 ;
                                continue ;

                          case DEPOSIT:

                                setval (ref(op[0]),eval(op[1])) ;
                                continue ;

                          case DIVIDE:

                                setval (op[0],(eval(op[0])/eval(op[1]))) ;
                                continue ;

                          case DROP:

                                movobj ( ref (op[0]), eval (here) ) ;
                                continue ;

                          case ELSE:

                                bp = flushc (bp,codebuf,endb) ;
                                continue ;

                          case EOF:

                                continue ;

                          case EOI:

                                i = eval ( dovar[dos] ) ;
                                switch ( domod[dos] )
                                {
                                        /* only iterate with nearby objects */
                                        case ITLIST:

                                                do
                                                {
                                                        if ( indx(++i) >= nobj )
                                                        {
                                                                dos-- ;
                                                                break ;
                                                        }
                                                }
                                                while ( near (i) != YES ) ;
                                                if ( indx(i) >= nobj )
                                                        continue ;
                                                break ;

                                        case ITOBJ :

                                                if ( indx(++i) >= nobj )
                                                {
                                                        dos-- ;
                                                        continue ;
                                                }
                                                break ;

                                        case ITPLACE :

                                                if ( indx(++i) >= nplace )
                                                {
                                                        dos-- ;
                                                        continue ;
                                                }
                                                break ;
 
                                        default :
                                                error ("Process",
                                                        "unknown IT* type!") ;
                                                break ;
                                }
                                setval (dovar[dos],i) ;
                                bp = dopnt[dos] ;
                                continue ;

                          case EVAL:

                                setval (op[0],eval(ref(op[1]))) ;
                                continue ;

                          case EXEC:

                                executive (op[0],op[1]) ;
                                continue ;

                          case FIN:

                                continue ;

                          case GET:

                                j = ref ( op[0] ) ;
                                movobj (j,INHAND) ;
                                i = eval (j) ;
                                if ( i < 0 )
                                        setval (j,-1-i) ;
                                continue ;

                          case GOTO:

                                /* must do this so "back" will work */
                                i = eval (here) ;
                                j = bitval (here) ;

                                setval (here,ref(op[0])) ;
                                setbit (here,bitval(ref(op[0]))) ;
                                setval (there,i) ;
                                setbit (there,j) ;
                                setbit (status,(bitval(status)|MOVED)) ;
                                continue ;

                          case HAVE:

                                if ( where ( ref (op[0]) ) == INHAND )
                                        continue ;
                                break ;

                          case INPUT:

                                command () ;
                                continue ;

                          case ITLIST:

                                dos++ ;
                                dovar[dos] = op[0] ;
                                /* do first object and all others nearby */
                                setval (op[0],OBJKEY) ;
                                dopnt[dos] = bp ;
                                domod[dos] = ITLIST ;
                                continue ;

                          case ITOBJ:

                                dos++ ;
                                dovar[dos] = op[0] ;
                                setval (op[0],OBJKEY) ;
                                dopnt[dos] = bp ;
                                domod[dos] = ITOBJ ;
                                continue ;

                          case ITPLACE:

                                dos++ ;
                                dovar[dos] = op[0] ;
                                setval (op[0],PLACEKEY) ;
                                dopnt[dos] = bp ;
                                domod[dos] = ITPLACE ;
                                continue ;

                          case KEYWORD:

                                for ( i = 0 ; i < LINELEN ; i++ )
                                        if ( op[0] == linewd[i] )
                                                break ;
                                if ( i < LINELEN )
                                        continue ;
                                break ;

                          case LDA:

                                setval (op[0],op[1]) ;
                                continue ;

                          case LOCATE:

                                setval (op[0],where(ref(op[1]))) ;
                                continue ;

                          case MOVE:

                                if ( op[0] != linewd[0] )
                                {
                                        if ( linlen < 2 )
                                                continue ;
                                        if ( op[0] != linewd[1] )
                                                continue ;
                                }
                                i = eval (here) ;
                                j = bitval (here) ;
                                setval (here,ref(op[1])) ;
                                setbit (here,bitval(ref(op[1]))) ;
                                setval (there,i) ;
                                setbit (there,j) ;
                                setbit (status,(bitval(status)|MOVED)) ;
                                return ;

                          case MULT:

                                setval (op[0],(eval(op[0])*eval(op[1]))) ;
                                continue ;

                          case NAME:

                                for ( i = 0 ; i < LINELEN ; i++ )
                                        if ( op[1] == argwd[i] )
                                        {
                                                saynam (ref(op[0]),op[1]) ;
                                                break ;
                                        }
                                if ( i >= LINELEN )
                                        saynam (ref(op[0]),ref(op[1])) ;
                                continue ;

                          case NEAR:

                                i = ref ( op[0] ) ;
                                if ( where (i) == INHAND || near (i) == YES )
                                        continue ;
                                break ;

                          case PROCEED:

                                break ;

                          case QUIT:

                                return ;

                          case RANDOM:

                                setval (op[0],rnd(eval(op[1]))) ;
                                continue ;

                          case SAY:

                                say ( ref (op[0]) ) ;
                                continue ;

                          case SET:

                                setval (op[0],eval(op[1])) ;
                                continue ;

                          case SMOVE:

                                if ( op[0] != linewd[0] )
                                {
                                        if ( linlen < 2 )
                                                continue ;
                                        if ( op[0] != linewd[1] )
                                                continue ;
                                }
                                i = eval (here) ;
                                j = bitval (here) ;
                                setval (here,ref(op[1])) ;
                                setbit (here,bitval(ref(op[1]))) ;
                                setval (there,i);
                                setbit (there,j);
                                setbit (status,(bitval(status)|MOVED)) ;
                                say (op[2]) ;
                                return ;

                          case STOP:

                                fini () ;

                          case SUB:

                                setval (op[0],(eval(op[0])-eval(op[1]))) ;
                                continue ;

                          case SVAR:

                                i = eval (op[1]) ;
                                i = svar (eval(op[0]),i) ;
                                setval (op[1],i) ;
                                continue ;

                          case VALUE:

                                sayval (ref(op[0]),ref(op[1])) ;
                                continue ;

                          default:

                                error ("Process","unrecognized opcode %d!",
                                        instr) ;
                                break ;

                        }
                        break ;
                }

                if ( instr != CALL )
                        rec = nextrec (rec) ;
        }
}

int nextrec (key)
  register int key ;
{
        register int n ;

        switch (class(key))
        {
                case INITIAL:
                        if ( key < REPEAT )
                        {
                                if ( ++key >= ninit )
                                        key = ERROR ;
                        }
                        else
                        {
                                if ( ++key >= nrep+REPEAT )
                                        key = ERROR ;
                        }
                        break ;

                case LABEL:
                        key = ERROR ;
                        break ;

                case VERB:
                        key += MAXVERBS ;
                        n = key - VERBKEY ;
                        n /= MAXVERBS ;
                        if ( n >= MAXVCODE )
                                key = ERROR ;
                        break ;

                case PLACE:
                        key += MAXPLACES ;
                        n = key - PLACEKEY ;
                        n /= MAXPLACES ;
                        n -= 2 ;
                        if ( n >= MAXPCODE )
                                key = ERROR ;
                        break ;

                case OBJECT:
                        key += MAXOBJECTS ;
                        n = key - OBJKEY ;
                        n /= MAXOBJECTS ;
                        n -= MAXOTEXT ;
                        if ( n >= MAXOCODE )
                                key = ERROR ;
                        break ;

                default:
                        error ("Nextkey","bad key %d!",key) ;
                        break ;
        }
        return (key) ;
}

int fini ()
{
        closek (dbunit) ;
        exit (0) ;
}

webster.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

int webster ()
{
        register int key, i, j ;
        int totsym, size, val ;

        key = SYMTABREC ;
        if ( ( size = readk (dbunit,key,codebuf,BUFSIZE*2) ) == ERROR )
                error ("Webster","unable to access symbol table (%d)!",key) ;
        if ( size != sizeof(short int) )
                error ("Webster","bad symbol table size record (%d)!",size) ;

        for ( totsym = codebuf[0] ; totsym > 0 ; )
        {
                key++ ;
                if ( ( size = readk (dbunit,key,codebuf,BUFSIZE*2) ) < 1 )
                        error ("Webster","bad sym table count (%d)!",totsym) ;
                size /= sizeof(short int) ;

                for ( i = 0 ; i < size ; )
                {
                        for ( j = 0 ; codebuf[i] != EOS ; j++, i++ )
                                token[j] = codebuf[i] ;
                        token[j] = token[6] = EOS ;
                        val = codebuf[i+1] ;
                        i += 2 ;
                        define (token,val) ;
                        totsym-- ;
                }
        }

        nrep = find ("<NREP>") ;
        ninit = find ("<NINIT>") ;
        nvars = find ("<NVARS>") ;
        nobj = find ("<NOBJ>") ;
        nplace = find ("<NPLACE>") ;
        here = find ("HERE") ;
        there = find ("THERE") ;
        status = find ("STATUS") ;
        argwd[0] = find ("ARG1") ;
        argwd[1] = find ("ARG2") ;

        if ( nrep < 1 )
                error ("Webster","missing repeat code (%d)!",nrep) ;
        if ( nobj > OBJECTS )
                error ("Webster","too many objects (%d>%d)!",nobj,OBJECTS) ;
        if ( nplace > PLACES )
                error ("Webster","too many places (%d>%d)!",nplace,PLACES) ;
        if ( nvars > VARS )
                error ("Webster","too many variables (%d>%d)!",nvars,VARS) ;
        if ( class(here) != VARIABLE || class(there) != VARIABLE ||
             class(argwd[0]) != VARIABLE || class(argwd[1]) != VARIABLE ||
             class(status) != VARIABLE )
                error ("Webster","missing special variable!") ;

        return ;        
}

Printout 4

cache.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

#ifdef CACHE
struct ctabstr
{
        short int  c_key ;
        short int  c_siz ;

} ;

static int full = NO ;
static struct ctabstr ctab[CACHESIZE] ;
static short int cache[MAXCACHE] ;
static int cachesize = 0 ;
#endif CACHE
/*
**      rdcode -- fetch the code addressed by key.
**
**      Note: an open (chain) hashing strategy was tried
**            on the cache table, with no significant speed
**            increase! This seems puzzling, but since the
**            hashing takes more memory, why bother with it?
**
*/

int rdcode (key)
  int key ;
{
        register int endb  ;

#ifdef CACHE
        if ( ( endb = GetCache (key) ) > 0 )    /* already in memory? */
                return (endb) ;
#endif CACHE

        if ( ( endb = readk (dbunit,key,codebuf,BUFSIZE*2) ) < 1 )
                return (ERROR) ;

        endb = (endb+1)/2 ;

#ifdef CACHE
        if ( full )
                return (endb) ;

        if ( ok2sav (key) == NO )
                return (endb) ;

        PutCache (key,endb) ;            /* lets keep a copy around */
#endif CACHE

        return (endb) ;
}

#ifdef CACHE
/*
**      ok2sav -- determine whether the code for the given key
**                should be saved (if possible).
**                Note: there is no need to save the INIT code,
**                      but certainly saving the REPEAT code is
**                      well worthwhile.
*/

static int ok2sav (key)
  int key ;
{
        register int val ;

        if ( key >= REPEAT && key < 1000 )       /* save `REPEAT' code */
                return (YES) ;

        switch ( class (key) )
        {

                case VERB :
                case OBJECT :
                case LABEL :
                case PLACE :
                                val = YES ;
                                break ;
                default :
                                val = NO ;
                                break ;
        }
        return (val) ;
}

static int PutCache (key,size)
  int key, size ;
{
        register int i ;

        if ( size <= 0 )
                return ;

        for ( i = 0 ; i < (CACHESIZE-1) ; i++ )
        {
                if ( ctab[i].c_key == key )
                        return ;
                if ( ctab[i].c_key == -1 )
                {
                        ctab[i+1].c_key = -1 ;
                        break ;
                }
        }

        if ( i == (CACHESIZE-1) )       /* cache address table is full */
        {
                full = YES ;
                return ;
        }

        if ( (cachesize+size) >= MAXCACHE ) /* cache memory is (almost) full */
        {
                if ( (MAXCACHE-cachesize) < 50 ) /* less than 50 bytes left */
                        full = YES ;
                return ;
        }

        ctab[i].c_key = key ;
        ctab[i[.c_siz = size ;
        ctab[i].c_cod = &(cache[cachesize]) ;

        cachesize += size ;

        wcopy (codebuf,ctab[i].c_cod,size) ;

        return ;
}

static int GetCache (key)
  int key ;
{
        register int i, size ;

        for ( i = 0 ; i < CACHESIZE ; i++ )
        {
                if ( ctab[i].c_key == key )
                        break ;
                if ( ctab[i].c_key == -1 )
                        return (ERROR) ;
        }

        size = ctab[i].c_siz ;
        if ( size <= 0 )
                return (ERROR) ;
        wcopy (ctab[i].c_cod,codebuf,size) ;
        return (size) ;
}

int ClrCache ()
{
        register int i ;

        full = NO ;
        cachesize = 0 ;
        for ( i = 0 ; i < CACHESIZE ; i++ )
                ctab[i].c_key = -1 ;

        return ;
}

int wcopy (a,b,n)
  register short int *a, *b ;
  register int n ;
{
        while ( n-- )
                *b++ = *a++ ;
        return ;
}

#ifdef STATUS

int pcstat ()
{
        register int i ;

        printf ("Cache Status: (%s) -- (%d) of (%d) available\n\n",
                (full?"full":"active"),(MAXCACHE-cachesize),MAXCACHE) ;

        for ( i = 0 ; i < (CACHESIZE-1) ; )
        {
                if ( ctab[i].c_key == -1 )
                        break ;
                printf ("\t[%d] key(%d) size(%d)\n",
                        i,ctab[i].c_key,ctab[i].c_siz) ;
        }

        printf ("\n") ;
        return ;
}

#endif STATUS

#endif CACHE

conditio.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

int condition (bp,cbuf,len)
  int bp, len ;
  short int cbuf[] ;
{
        register int i, cond, instr ;
        int op[3], imode ;
        int n, negate, passon ;

        negate = 0 ;
        passon = 0 ;
        imode  = 0 ;

        forever
        {
                instr = cbuf [bp++] ;
                n = opnum (instr) ;
                for ( i = 0 ; i < n ; i++, bp++ )
                        op[i] = cbuf [bp] ;

                if ( bp > len )
                        error ("Condition","bad opcode %d!",instr) ;

#ifdef SHOWOP
                showop (YES,instr,op);
#endif SHOWOP

                if ( instr == NOT )
                {
                        negate =  !negate ;
                        continue ;
                }

                switch (instr)
                {
                        case BIT:
                                cond = ( (bitval(op[0]) & bitval(op[1])) != 0 );
                                break ;

                        case CHANCE:
                                cond = ( eval (op[0]) > rnd (100) ) ;
                                break ;

                        case IFAT:
                                cond = ( ref (op[0]) == eval (here) ) ;
                                break ;

                        case IFEQ:
                                cond = ( eval (op[0]) == eval (op[1]) ) ;
                                break ;

                        case IFGE:
                                cond = ( eval (op[0]) >= eval (op[1]) ) ;
                                break ;

                        case IFGT:
                                cond = ( eval (op[0}) > eval (op[1]) ) ;
                                break ;

                        case IFHAVE:
                                cond = ( where ( ref (op[0]) ) == INHAND ) ;
                                break ;

                        case IFKEY:
                                cond = 0 ;
                                for ( i = 0 ; i < linlen ; i++ )
                                        if ( (cond = (op[0] == linewd[i])) )
                                                break ;
                                break ;

                        case IFLE:
                                cond = ( eval (op[0]) <= eval (op[1]) ) ;
                                break ;

                        case IFLOC:
                                cond = ( where ( ref(op[0]) ) == ref (op[1]) ) ;
                                break ;

                        case IFLT:
                                cond = ( eval (op[0]) < eval (op[1]) ) ;
                                break ;

                        case IFNEAR:
                                cond = ( where < ref (op[0]) ) == INHAND ||
                                        near ( ref (op[0]) ) == YES ) ;
                                break ;

                        case QUERY:
                                cond = (query ( ref (op[0]) ) == YES) ;
                                break ;

                        default:
                                error ("Condition","bad opcode %d!",instr) ;
                                break ;
                }

                cond = ((cond||negate)&&(!(cond&&negate))) ;

                switch ( lmode )
                {
                        case OR :
                                cond = ( cond || passon ) ;
                                break ;

                        case AND :
                                cond = ( cond && passon ) ;
                                break ;

                        case EOR :
                                cond = ((cond||passon)&&(!(cond&&passon))) ;
                                break ;
                }

                switch ( cbuf[bp] )
                {
                        case OR :
                                lmode = OR ;
                                break ;

                        case AND :
                                lmode = AND ;
                                break ;

                        case EOR :
                                lmode = EOR ;
                                break ;

                        default :
                                if ( cond )
                                        return (bp) ;
                                return (flushc (bp,cbuf,len)) ;
                }

                bp++ ;
                passon = cond ;
                negate = 0;
        }
}

int flushc (bp,cbuf,len)
  register int bp ;
  int len ;
  short int cbuf[] ;
{
        register int instr, level ;
        int new, n ;

        for ( level = 1, new = 1 ; level > 0 ; )
        {
                if ( bp >= len )
                        error ("Flushc","nonterminating condition!") ;

                instr = cbuf[bp++] ;

#ifdef SHOWOP
                showop (NO,instr,&(cbuf[bp])) ;
#endif SHOWOP

                if ( instr == NOT )
                        continue ;

                bp += opnum (instr) ;

                if ( logical (instr) )
                {
                        if ( new )
                                level++ ;
                        n = cbuf[bp] ;
                        if ( n == OR || n == AND || n == EOR )
                        {
                                new = 0 ;
                                bp++ ;
                        }
                        else
                                new = 1 ;
                        continue ;
                }

                if ( instr == ELSE && level <= 1 )
                        break ;
                if ( instr == FIN )
                        level-- ;
                else
                        if ( instr == EOF )
                                break ;
        }
        return (bp) ;
}

int query (op)
  short int op ;
{
        register int c, d ;

        forever
        {
                say (op) ;
                printf ("? ") ;
                c = getchar () ;
                while ( (d=getchar()) != '\n' )
                        if ( d == EOF )
                                break ;
                if ( c == 'y' || c == 'Y' )
                        return (YES) ;
                if ( c == 'n' || c == 'N' )
                        return (NO) ;
        }
}

error.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include <stdio.h>

/*VARARGS1*/
int error (rnam,a1,a2,a3,a4,a5,a6,a7,a8,a9)
char *rname, *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8, *a9 ;
{
        fprintf (stderr,"%s: ",rnam) ;
        fprintf (stderr,a1,a2,a3,a4,a5,a6,a7,a8,a9) ;
        fprintf (stderr,"\n") ;
        exit (1) ;
}

Printout 5

exec.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

int executive (a,b)
  int a, b ;
{
       static int saveval ;

       switch (a)
       {
               case 1:
                       if ( savgm() == ERROR )
                               setval (b,1) ;
                       else
                               setval (b,0) ;
                       break ;

               case 2:
                       if ( resgm() == ERROR )
                               setval (b,1) ;
                       else
                               setval (b,0) ;
                       break ;

               case 3:
                       if ( delgm() == ERROR )
                               setval (b,1) ;
                       else
                               setval (b,0) ;
                       break ;

               case 4:
#ifdef CACHE
                       ClrCache () ;
#endif CACHE
                       setval (b,0) ;
                       break ;

               case 5:
                       setval (b,prime()) ;
                       break ;

               case 6:
                       setval (b,0) ;
                       break ;

               case 7:
                       saveval = eval (b) ;
                       break ;

               case 8:
                       setval (b,saveval) ;
                       break ;

               default:
                       error ("Execute","bad mode %d!",a) ;
                       break ;
       }
       return ;
}

int ssw (a)
  int a ;
{
       register char *p ;
       extern char *getenv() ;

       if ( ( p = getenv("WIZARD") ) == 0 )
               return (0) ;

       if ( strcmp (p,"Gandalf") == 0 )
               return (1) ;
       return (0) ;
}

#include <time.h>

int svar (a,b)
  int a, b ;
{
       struct tm *tp, *localtime() ;
       long int time(), clock ;
       register int c ;

       clock = time (0) ;
       tp = localtime (&clock) ;

       switch (a)
       {
               case 0:
               case 1:
               case 2:
                       c = 0 ;
                       break ;
               case 3:
                       c = tp->tm_wday ;
                       break ;
               case 4:
                       c = tp->tm_hour ;
                       break ;
               case 5:
                       c = tp->tm_min ;
                       break ;
               case 6:
                       c = tp->tm_sec ;
                       break ;
               case 7:
                       c = 0 ;
                       break ;
               case 8:
                       c = ssw (b) ;
                       break ;
               default:
                       c = 0 ;
                       break ;
       }
       return (c) ;
}

int prime ()
{
       return (0) ;
}

int rnd (n)
  int n ;
{
       return ((random())%n) ;
}

Printout 6

In this printout, I failed to write down the filenames on the printout, so I'm guessing the filenames based on which files are named by the makefile at the end.

savgm.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

#define READONLY       0
#define WRITEONLY      1
#define READWRITE      2

struct saveb
{
        int s_uid ;
        short int s_ov[OBJECTS], s_ob[OBJECTS], s_ol[OBJECTS] ;
        short int s_pb[PLACES] ;
        short int s_vv[VARS], s_vb[VARS] ;
} ;

int savgm ()
{
        register int i ;
        register int uid ;
        register int fd ;

        if ( ( fd = open (FREEZER,READWRITE) ) < 0 )
        {
                if ( ( fd = creat (FREEZER,0600) ) < 0 )
                        return (ERROR) ;
                close (fd) ;
                if ( ( fd = open (FREEZER,READWRITE) ) < 0 )
                        return (ERROR) ;
        }

        uid = getuid() + 1 ;

        forever
        {
                if ( read(fd,(char *)&sb.sizeof(sb)) != sizeof(sb) )
                        break ;
                if ( sb.s_uid == uid || sb.s_uid == 0 )
                {
                        (void) lseek (fd,-(sizeof(sb)),1) ;
                        break ;
                }
        }

        sb.s_uid = uid ;

        for ( i = 0 ; i < OBJECTS ; i++ )
        {
                sb.s_ov[i] = objval[i] ;
                sb.s_ob[i] = objbit[i] ;
                sb.s_ol[i] = objloc[i] ;
        }

        for ( i = 0 ; i < PLACES ; i++ )
        {
                sb.s_pb[i] = plcbit[i] ;
        }

        for ( i = 0 ; i < VARS ; i++ )
        {
                sb.s_vv[i] = varval[i] ;
                sb.s_vb[i] = varbit[i] ;
        }

        if ( write (fd,(char *)&sb.sizeof(sb)) != sizeof(sb) )
        {
                (void) close(fd) ;
                return (ERROR) ;
        }
        (void) close(fd) ;
        return (OK) ;
}

int resgm ()
{
        register int i ;
        register int uid ;
        register int fd ;

        if ( ( fd = open (FREEZER,READONLY) ) < 0 )
                return (ERROR) ;

        uid = getuid() + 1 ;

        forever
        {
                if ( read(fd,(char *)&sb,sizeof(sb)) != sizeof(sb) )
                {
                        (void) close (fd) ;
                        return (ERROR) ;
                }
                if ( sb.s_uid == uid )
                        break ;
        }

        for ( i = 0 ; i < OBJECTS ; i++ )
        {
                objval[i] = sb.s_ov[i] ;
                objbit[i] = sb.s_ob[i] ;
                objloc[i] = sb.s_ol[i] ;
        }

        for ( i = 0 ; i < PLACES ; i++ )
        {
                plcbit[i] = sb.s_pb[i] ;
        }

        for ( i = 0 ; i < VARS ; i++ )
        {
                varval[i] = sb.s_vv[i] ;
                varbit[i] = sb.s_vb[i] ;
        }

        (void) close(fd) ;
        return (OK) ;
}

int delgm ()
{
        register int uid ;
        register int fd ;

        if ( ( fd = open (FREEZER,READWRITE) ) < 1 )
                return (ERROR) ;

        uid = getuid() + 1 ;

        forever
        {
                if ( read(fd,(char *)&sb,sizeof(sb)) != sizeof(sb) )
                {
                        (void) close (fd) ;
                        return (ERROR) ;
                }
                if ( sb.s_uid == uid )
                        break ;
        }

        sb.s_uid = 0 ;
        (void) lseek (fd,-(sizeof(sb)),1) ;
        if ( write (fd,(char *)&sb,sizeof(sb)) != sizeof(sb) )
        {
                (void) close(fd) ;
                return (ERROR) ;
        }
        (void) close(fd) ;
        return (OK) ;
}

say.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

int say (key)
  register int key ;
{
        register int rec ;

        if ( key == NULLTXT )
                return ;
        if ( key == BLANKTXT )
        {
                printf ("\n") ;
                return ;
        }
        if ( key == OKTXT )
        {
                printf ("Ok.\n") ;
                return ;
        }

        if ( ( rec = saykey (key) ) < 0 )
                return ;

        if ( readk (dbunit,rec,textbuf,TBUFSIZE) < 1 )
                return ;

        printf ("%s",textbuf) ;
        return ;
}

int sayval (key,val)
  int key, val ;
{
        register int rec, i, endb ;

        rec = saykey (key) ;

        if ( ( endb = readk (dbunit,rec,textbuf,TBUFSIZE) ) < 1 )
                error ("Sayval","bad text key %d!",key) ;

        for ( i = 0 ; i < endb ; i++ )
        {
                if ( textbuf[i] == REPLACE )
                {
                        printf ("%d",val) ;
                        continue ;
                }
                putchar(textbuf[i]) ;
        }
        return ;
}

int saykey (key)
  register int key ;
{
        register int rec, b ;

        switch (class(key))
        {
                case OBJECT:
                        if ( where (key) != INHAND )
                        {
                                if ( eval (key) < 0 )
                                        return (ERROR) ;
                                rec = key + ( (eval(key) + 1) * MAXOBJECTS ) ;
                        }
                        else
                                rec = key ;
                        break ;

                case PLACE:
                        b = bitval (status) ;
                        if ( (b&LOOKING) )
                                rec = key + MAXPLACES ;
                        else
                                if ( (b&BRIEF) && (bitval(key)&BEEN) )
                                        rec = key ;
                                else
                                        if ( (b&FAST) )
                                                rec = key ;
                                        else
                                                rec = key + MAXPLACES ;
                        break ;

                case TEXT:
                        rec = key ;
                        break ;

                default:
                        error ("Saykey","bad key %d!",key) ;
                        break ;
        }
        return (rec) ;
}

int saynam (key,op)
  int key, op ;
{
        register int i, j ;
        int rec, endb ;
        char word[20] ;

        for ( j = 0 ; j < LINELEN ; j++ )
                if ( op == argwd[j] || op == ref(argwd[j]) )
                        break ;
        if ( j < LINELEN )
                (void) strncpy (word,lex[j],20) ;
        else
                if ( findnam (op,word) != op )
                        error ("Saynam","bad name %d!",op) ;

        rec = saykey (key) ;
        if ( ( endb = readk (dbunit,rec,textbuf,TBUFSIZE) ) < 1 )
                error ("Saynam","bad key %d!",rec) ;

        up2low (word) ;

        for ( i = 0 ; i < endb ; i++ )
        {
                if ( textbuf[i] == REPLACE )
                {
                        printf ("%s",word) ;
                        continue ;
                }
                putchar (textbuf[i]) ;
        }
        return ;
}

int findnam (val,s)
  int val ;
  char *s ;
{
        register struct symstr *p ;
        register int i ;

        for ( i = 0 ; i < TABSIZ; i++ )
                for ( p = symtab[i] ; p != NIL ; p = p->s_nxt )
                {
                        if ( p->s_val == val )
                        {
                                (void) strcpy (s,p->s_nam) ;
                                return (val) ;
                        }
                }
        return (ERROR) ;
}

int up2low (word)
  register char *word ;
{
        for ( ; *word ; word++ )
                if ( (*word) >= 'A' && (*word) <= 'Z' )
                        *word += ( 'a' - 'A' ) ;
        return ;
}

showop.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

static char *ops [MAXOPS] =
{
        "ADD",          "AND",          "ANYOF",        "APPORT",
        "AT",           "BIC",          "BIS",          "BIT",
        "CALL",         "CHANCE",       "DEFAULT",      "DEPOSIT",
        "DIVIDE",       "DROP",         "ELSE",         "EOF",
        "EOI",          "EOR",          "EVAL",         "EXEC",
        "FIN",          "GET",          "GOTO",         "HAVE",
        "IFAT",         "IFEQ",         "IFGE",         "IFGT",
        "IFHAVE",       "IFKEY",        "IFLE",         "IFLOC",
        "IFLT",         "IFNEAR",       "INPUT",        "ITLIST",
        "ITOBJ",        "ITPLACE",      "KEYWORD",      "LDA",
        "LOCATE",       "MOVE",         "MULT",         "NAME",
        "NEAR",         "NOT",          "OR",           "PROCEED",
        "QUERY",        "QUIT",         "RANDOM",       "SAY",
        "SET",          "SMOVE",        "STOP",         "SUB",
        "SVAR",         "VALUE"
} ;

int CurKey = -1 ;

int showop (active,op,args)
  int active, op ;
  short int args[3] ;
{
        register int n, i ;

        if ( active )
                printf ("%5d: ",CurKey) ;
        else
                printf ("(skip) ") ;

        if ( op < 0 || op >= 58 )
        {
                printf ("bad opcode (%d)\n",op) ;
                return ;
        }

        printf ("%-7,7s",ops[op]) ;

        n = opnum (op) ;

        for ( i = 0 ; i < n ; i++ )
                printf (" %5d",args[i]) ;

        printf ("\n") ;
        return ;
}

symtab.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

#define SMEMSIZ         450

static struct symstr smem[SMEMSIZ] ;
static int psmem = SMEMSIZ ;

int define (nam,val)
  char *nam ;
  int val ;
{
        register struct symstr *p ;
        register int h ;
        extern char *strsav () ;

        /* assume the symbol does not exist */

        if ( psmem <= 0 )
                error ("Symbol Define","symbol table full on `%s'",nam) ;

        p = &(smem[--psmem]) ;

        p->s_nam = strsav (nam) ;
        p->s_val = val ;

        h = hash (nam) ;
        p->s_nxt = symtab[h] ;
        symtab[h] = p ;

        return ;
}

int find (name)
  char *name ;
{
        register struct symstr *p ;

        for ( p = symtab[hash(name)] ; p != NIL ; p = p->s_nxt )
        {
                if ( strncmp (name,p->s_nam,MATCH) == 0 )
                {
                        return (p->s_val) ;
                }
        }
        return (ERROR) ;
}

int hash (s)
  register char *s ;
{
        register int h, i ;

        for (i = h = 0 ; *s != EOS && i < MATCH ; i++ )
                h += *s++ ;

        return ( ( h % TABSIZ ) ) ;       
}

#define CMEMSIZ         2600

static char cmem[CMEMSIZ] ;
static int  pcmem = 0 ;

char *strsav (s)
  char *s ;
{
        register char *p ;
        register int n ;

        n = strlen(s) + 1 ;
        if ( (pcmem+n) >= CMEMSIZ )
                error ("Strsave","Out of symbol space on `%-10.10s'\n",s) ;

        p = &(cmem[pcmem]) ;
        pcmem += n ;
        (void) strcpy (p,s) ;
        return (p) ;
}

#ifdef PSTAB

int pstab ()
{
        register int i, j ;
        register struct symstr *p ;

        for ( i = j = 0 ; i < TABSIZ ; i++ )
        {
                for ( p = symtab[i] ; p != NIL ; p = p->s_nxt )
                {
                        printf ("   %-6.6s  %5d",p->s_nam,p->s_val) ;
                        if ( (++j)%4 == 0 )
                                printf ("\n") ;
                }
        }
        printf ("\n\n") ;

        printf ("Total number of symbols in symbol table is %d\n",j) ;
        printf ("Total symbol structures still available is %d\n",psmem) ;
        printf ("Total character storage space used is %d\n",pcmem) ;

        return ;
}

#endif PSTAB

util.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

#ifndef class

        int class (key)
          int key ;
        {
                if ( key < 0 || key > MAXKEY )
                        return (clss[0]) ;
                return (clss[key/1000]) ;
        }

#endif class

int eval (key)
  int key ;
{
        register int val ;

        switch (class(key))
        {
                case INIT:
                        val = key ;
                        break ;

                case OBJECT:
                        val = objval[indx(key)] ;
                        break ;

                case VARIABLE:
                        val = varval[indx(key)] ;
                        break ;

                default:
                        error ("Eval","bad key %d!",key) ;
                        break ;
        }
        return (val) ;
}

#ifndef indx

        int indx (key)
           int key ;
        {
                 register int i, m ;

                 i = key % 1000 ;

                 switch (class(key))
                 {
                         case OBJECT:
                                 m = OBJECTS ;
                                 break ;

                         case PLACE:
                                 m = PLACES ;
                                 break ;

                         case VARIABLE:
                                 m = VARS ;
                                 break ;

                         default:
                                 error ("Indx","bad key %d!",key) ;
                                 break ;
                 }
                 if ( i < 0 || i >= m )
                         error ("Indx","bad index %d for key %d!",i,key) ;
                 return (i) ;
        }

#endif indx

#ifndef logical

        int logical (instr)
          short int instr ;
        {
                if ( instr < 0 || instr >= MAXOPS )
                        error ("Logical","bad opcode %d!",instr) ;
                return (ltab[instr]) ;
        }

#endif logical

int movobj (key,loc)
  int key, loc ;
{
        if ( class(key) != OBJECT )
                error ("Movobj","not an object %d!",key) ;
        objloc[indx(key)] = loc ;
        return ;
}

int near (key)
  int key ;
{
        register int w, b, h ;

        w = where (key) ;
        b = bitval (key) ;
        h = eval(here) ;

        if ( w == h || ( w == (h-1) && (b&DUAL) ) )
                return (YES) ;
        return (NO) ;
}

#ifndef opnum

        int opnum (opcode)
          int opcode ;
        {
                if ( opcode < 0 || opcode >= MAXOPS )
                        error ("Opnum","bad opcode %d",opcode) ;

                return (opn[opcode]) ;
        }

#endif opnum

int ref (key)
  int key ;
{
        if ( class(key) == VARIABLE )
                return (varval[indx(key)]) ;
        return (key) ;
}

#ifndef where

        int where (key)
          int key ;
        {
                if ( class(key) != OBJECT )
                        error ("Where","not object key %d!",key) ;
                return (objloc[indx(key)]) ;
        }

#endif where

values.c


/*
**                 Copyright (c) 1985  Ken Wellsch
**
**    Permission is hereby granted to all users to possess, use, copy,
**    distribute, and modify the programs and files in this package
**    provided it is not for direct commercial benefit and secondly,
**    that this notice and all modification information be kept and
**    maintained in the package.
**
*/

#include "adefs.h"

static int powof2[16] =
{
        000001, 000002, 000004, 000010,
        000020, 000040, 000100, 000200,
        000400, 001000, 002000, 004000,
        010000, 020000, 040000, 0100000
} ;

int bitval (key)
  register int key ;
{
        register int val ;

        switch (class(key))
        {
                case INIT:
                        if ( key < 0 || key > 15 )
                                error ("Bitval","bad key %d!",key) ;
                        val = powof2[key] ;
                        break ;

                case OBJECT:
                        val = objbit[indx(key)] ;
                        break ;

                case VARIABLE:
                        val = varval[indx(key)] ; /* single indirection */
                        switch (class(val))
                        {
                                case OBJECT:
                                        val = objbit[indx(val)] ;
                                        break ;

                                case PLACE:
                                        val = plcbit[indx(val)] ;
                                        break ;

                                default:
                                        val = varbit[indx(key)] ;
                                        break ;
                        }
                        break ;

                case PLACE:
                        val = plcbit[indx(key)] ;
                        break ;

                default:
                        error ("Bitval","bad key %d!",key) ;
                        break ;
        }
        return (val) ;
}

int setbit (key, bits)
  int key, bits ;
{
        register int val ;

        switch (class(key))
        {
                case OBJECT:
                        objbit[indx(key)] = bits ;
                        break ;

                case VARIABLE:
                        varbit[indx(key)] = bits ;
                        val = varval[indx(key)] ;
                        switch (class(val))
                        {
                                case OBJECT:
                                        objbit[indx(val)] = bits ;
                                        break ;

                                case PLACE:
                                        plcbit[indx(val)] = bits ;
                                        break ;
                        }
                        break ;

                case PLACE:
                        plcbit[indx(key)] = bits ;
                        break ;

                default:
                        error ("SetBit","bad key %d!",key) ;
                        break ;
        }
        return ;
}

int setval (key, val)
  int key, val ;
{
        switch (class(key))
        {
                case OBJECT:
                        objval[indx(key)] = val ;
                        break ;

                case VARIABLE:
                        varval[indx(key)] = val ;
                        break ;

                default:
                        error ("Setval","bad key %d!",key) ;
                        break ;
        }
        return ;
}

makefile


#
# Makefile for the Adventure interpreter.
#       (c) Ken Wellsch 1985
#
CFLAGS = -0
KLIB = ../kio/klib.a
ALIB = alib.a

MAIN =  adv.c

SRC =   error.c advglob.c cache.c command.c condition.c \
        exec.c process.c savgm.c say.c showop.c symtab.c \
        util.c values.c webster.c

OBJ =   error.o advglob.o cache.o command.o condition.o \
        exec.o process.o savgm.o say.o showop.o symtab.o \
        util.o values.o webster.o

HEADER = adefs.h

adv: $(ALIB)
        cc $(CFLAGS) $(MAIN) alib.a $(KLIB) -o adv
        size adv

$(SRC):: $(HEADER)
        touch $@

$(ALIB): $(SRC)
        -ar x $(ALIB)
        cc $(CFLAGS) -c $?
        rm -f $(ALIB)
        -ar ru $(ALIB) $(OBJ)
        rm -f *.o
        ranlib $(ALIB)

clean:
        rm *.o

backup:
        cp Makefile $(HEADER) $(SRC) $(MAIN) bkup

lint:
        lint $(SRC) $(MAIN)

print:
        lpr -Phw -p -J "ADV" Makefile $(HEADER) $(MAIN) $(SRC)