'MODULE 0 MAIN    ******HANGTOWN******  10-3-90
'MULTIPLE REVISIONS ON 1-25-91
'GOLD HINT BURN HINT KEY HINT REVEAL HINT RESTORE 30 6MAR92
'TIMER AND STRT CHANGE  2-3-94
'TIME$, DATE$, AND SAVE GAME FIX 7-30-95
'SNIp fixes 1-3-96
'REPORT STUFF 3-5-96  HANGDATA.TXT 10-24-96

   CLS:DIM FLAG(30),OBJ$(18),OBJ2$(18)
   STRT=TIMER
   CALL LOGON
   LOCATE 12,12:PRINT "ONE MOMENT PLEASE...."
   CALL SETUP              'MODULE 1 SET UP VARIABLES
   CALL TURN               'MODULE 2 RUN TURNS
   CALL CLOSING            'MODULE 3 END OF GAME STUFF
END

'MODULE 0.1 LOGON
SUB LOGON
  SHARED ANSWER$()
  DIM ANSWER$(305)
  INPUT "YOUR NAME-NUMBER PLEASE";ANSWER$(0)
  LET ANSWER$(0)=ANSWER$(0)+"  "+TIME$+"  "+DATE$
END SUB



'MODULE 1 SETUP
SUB SETUP
   CALL ROOMINFO           'MODULE 1.1 READ ROOM INFORMATION
   CALL ROOMOBJECTS        'MODULE 1.2 READ ROOM OBJECTS
   CALL MOVEMENTTABLE      'MODULE 1.3 READ MOVEMENT TABLE
   CALL INVENTORY          'MODULE 1.4 INITIALIZE INVENTORY ARRAY
                           '             TO AN EMPTY LIST
   CALL OTHERS             'MODULE 1.5 INITIALIZE OTHER VARIABLES
END SUB

'MODULE 1.1 ROOMINFO
SUB ROOMINFO
   SHARED DESCRIPTION$(),NUMBERROOMS,DESCRIBEFLAG(),ROOMDESCRIBE$(),ROOMDES2$()
   READ NUMBERROOMS
   DIM DESCRIPTION$(NUMBERROOMS),DESCRIBEFLAG(NUMBERROOMS),ROOMDESCRIBE$(NUMBERROOMS)
   DIM ROOMDES2$(NUMBERROOMS)
   FOR I = 1 TO NUMBERROOMS
       READ DESCRIPTION$(I)
   NEXT I
   DATA 33, LEDGE just inside WELL*, RATTLESNAKE WELLS, HANGTOWN SQUARE, SCAFFOLD, SANDY DESERT
   DATA LAST CHANCE SALOON, STREET, HARDROCK JAIL, STEEP'S TEA ROOM, STREET, GOLDEN WELL* HOTEL
   DATA DOCTOR'S OFFICE, STREET, LIVERY STABLE, PASTURE, STREET, LIMPING HORSE CORRAL
   DATA MINER'S SHACK, STREET, FIELD, TOP OF BOULDER, CELLAR, MINESHAFT, MINESHAFT
   DATA MINESHAFT, MINESHAFT, MINESHAFT, MINESHAFT, MINESHAFT, MINESHAFT, MINESHAFT
   DATA MINESHAFT, RANGE

   FOR I=1 TO NUMBERROOMS
      LET DESCRIBEFLAG(I)=1
      LET ROOMDESCRIBE$(I)="EMPTY"
      LET ROOMDES2$(I)="EMPTY"
   NEXT I
   FOR I=1 TO 15
      READ DESCRIBEROOM
      LET DESCRIBEFLAG(DESCRIBEROOM)=0
      READ ROOMDESCRIBE$(DESCRIBEROOM)
      READ ROOMDES2$(DESCRIBEROOM)
   NEXT I
   DATA 2,"Your blood chills with fear at the sight of the huge and horrible"
   DATA "RATTLESNAKE guarding the WELL.  You know that one of you must die!"
   DATA 3,"Curiously, you find yourself in the TOWN SQUARE of a dry, dusty,"
   DATA "apparently deserted gold rush town."
   DATA 4,"You stand at the top of a gruesome SCAFFOLD.  The hangperson"
   DATA "left his/her well-worn noose here. Is this a PC PC or what?"
   DATA 5,"The DESERT seems to stretch out forever to the EAST."
   DATA "It's hard to walk in the soft sand."
   DATA 6,"As you enter the aroma that greets you isn't the stale smoke and "
   DATA "whiskey smell you expected.  You feel magic in the air here."
   DATA 7,"From the STREET you can see the town JAIL to the EAST.      "
   DATA "You wonder why the JAIL door was left locked."
   DATA 9,"An elegantly-dressed but crabby-looking ENGLISHMAN looks at you as"
   DATA "you enter the TEA ROOM, then turns away.  He needs a nice CUP of TEA."
  DATA 10,"All you can see to the SOUTH are hoof prints and wagon ruts,"
   DATA "frozen forever in the hard-baked dirt of the town STREET."
  DATA 11,"The curiously named HOTEL looks pretty run down.  "
   DATA "Hopefully, you won't have to spend the night here."
  DATA 12,"You can almost hear the elevator music in the DOCTOR'S OFFICE. "
   DATA "You see all of the earliest issues of INVESTMENT MAGAZINE."
  DATA 13,"The ROCK you see in the STREET could do a lot of damage if"
   DATA "thrown accurately."
  DATA 14,"With HAY on the floor, the LIVERY STABLE looks more comfortable"
   DATA "than the HOTEL.  There is a small milk-pail here, but no COW."
  DATA 15,"Here in the PASTURE is the most pathetic COW you've ever seen. "
   DATA "GET her some food before it's too late!"
  DATA 17,"Here in the LIMPING HORSE CORRAL you see some SUGAR cubes that"
   DATA "are still in good condition.  Horses love 'em."
  DATA 20,"Here in the FIELD is a huge BOULDER with sheer walls.  To"
   DATA "CLIMB it, You'll need something to stand upon."

END SUB

'MODULE 1.2 ROOM OBJECT INFORMATION
SUB ROOMOBJECTS
   SHARED ROOMOBJECT$(),NUMBERROOMS
   DIM ROOMOBJECT$(NUMBERROOMS,15)
       FOR I=1 TO NUMBERROOMS
           FOR J=1 TO 15
               LET ROOMOBJECT$(I,J)="EMPTY"
           NEXT J
       NEXT I
END SUB

'MODULE 1.3 MOVEMENTTABLE
SUB MOVEMENTTABLE
   SHARED MOVEMENTTABLE(),NUMBERROOMS
   DIM MOVEMENTTABLE(NUMBERROOMS,6)
   FOR I=1 TO NUMBERROOMS
       FOR J = 1 TO 6
          READ MOVEMENTTABLE(I,J)
       NEXT J
   NEXT I
   DATA 0,0,0,0,2,0,0,0,3,0,0,0,0,7,5,2,4,0
   DATA 0,0,0,0,0,3,0,0,5,3,0,0,0,0,7,0,0,0
   DATA 3,10,8,6,0,0,0,0,0,7,0,0,0,0,10,0,0,0
   DATA 7,13,11,9,0,0,0,0,0,10,0,0,0,0,13,0,0,0
   DATA 10,16,14,12,0,0,0,0,0,13,0,0,0,0,16,0,0,0
   DATA 13,19,17,15,0,0,0,0,0,16,0,0,0,0,19,0,0,0
   DATA 16,33,20,18,0,0,0,0,0,19,0,0,0,0,0,0,0,20
   DATA 0,0,0,0,18,25,0,27,24,0,0,0,0,28,25,23,0,0
   DATA 0,29,26,24,22,0,0,30,0,25,0,0,23,31,28,0,0,0
   DATA 24,0,28,27,0,0,25,32,30,28,0,0,26,0,0,29,0,0
   DATA 27,0,0,0,0,0,29,0,0,0,0,0,19,0,0,0,0,0

END SUB

'MODULE 1.4 INVENTORY
SUB INVENTORY
   SHARED INVENTORY$()
   DIM INVENTORY$(5)
   FOR I=1 TO 5
       LET INVENTORY$(I)="EMPTY"
   NEXT I
END SUB

'MODULE 1.5 OTHERS
SUB OTHERS
   SHARED GAMESTATE$,ROOM,TURNNUMBER,ROOMOBJECT$(),THING$,INVENTORY$(),_
       FLAG(),OBJ$(),OBJ2$(),DESCRIBEFLAG(),ROOMDESCRIBE$(),ROOMDES2$(),_
       CONVERTNUM
   LET ROOM = 3               'START IN HANGTOWN SQUARE
   LET TURNNUMBER =0
   DANGEROUS=1
   LET THING$=""
   FOR I=1 TO 30:LET FLAG(I)=0:NEXT I      'SET FLAGS TO 0
         'FLAG #  MEANING OF 0      FLAG# MEANING OF 0
         ' 1      GAME NOT OVER       2   DOG NOT GONE
         'FOR 1, 1 MEANS GAME WON -1 GAME LOST 2 MEANS GAME QUIT
         ' 3      SNAKE NOT KILLED    4   TEA NOT MADE
         ' 5      COW NOT FED         6   JAIL DOOR LOCKED
         ' 7      LANTERN NOT CARRIED 8   KITTEN NOT FED
         ' 9      THORN NOT OUT      10   KETTLE NOT FILLED
         '11      BUCKET EMPTY       12   ROPE NOT TIED TO BUCKET
         '13    SAFE HINGE NOT OILED  14  NOT CHASED BY DOG
         '14 IS USED TO EXIT TURN BUT NOT EXIT THE GAME
         '15 SAFE NOT OPENED          16 SILVER NOT DUG
         '17 KEY NOT DUG              18 EMERALD NOT DROPPED
         '19 ROOM NOT DANGEROUS       20 NEVER BEEN TO LANTERN ROOM22
         '21 COYOTE HINT NOT GIVEN    22 COFFEE NOT NAMED
        '23 PAIL NOT FILLED WITH MILK 24 2ND DOG HINT NOT GIVEN
        '25 GOLD HINT NOT GIVEN       26 KEY HINT NOT GIVEN
   LET ROOMOBJECT$(1,1)="GOLD!"         'STARTING LOCATIONS FOR OBJECTS
   LET ROOMOBJECT$(2,1)="WELL*"
   LET ROOMOBJECT$(2,2)="SNAKE"
   LET ROOMOBJECT$(2,3)="BUCKET"
   LET ROOMOBJECT$(3,1)="SIGN*"
   LET ROOMOBJECT$(4,1)="ROPE"
   LET ROOMOBJECT$(5,1)="EMPTYKEY"
   LET ROOMOBJECT$(6,1)="KETTLE"
   LET ROOMOBJECT$(6,2)="SIGN*"
   LET ROOMOBJECT$(6,3)="EMPTYMIRROR*"
   LET ROOMOBJECT$(6,4)="EMPTYSILVER!"
   LET ROOMOBJECT$(7,1)="DOOR*"
   LET ROOMOBJECT$(8,1)="CUP"
   LET ROOMOBJECT$(9,1)="STOVE*"
   LET ROOMOBJECT$(9,2)="SIGN*"
   LET ROOMOBJECT$(9,4)="CHAIR"
   LET ROOMOBJECT$(9,5)="EMPTYEMERALD!"
   LET ROOMOBJECT$(10,1)="EMPTYRUBY!"
   LET ROOMOBJECT$(11,1)="SAFE*"
   LET ROOMOBJECT$(11,2)="EMPTYJADE!"
   LET ROOMOBJECT$(11,3)="MATCHES"
   LET ROOMOBJECT$(12,1)="MAGAZINES"
   LET ROOMOBJECT$(12,2)="TWEEZERS"
   LET ROOMOBJECT$(12,3)="MINERAL-OIL"
   LET ROOMOBJECT$(13,1)="ROCK"
   LET ROOMOBJECT$(14,1)="SHOVEL"
   LET ROOMOBJECT$(14,2)="HAY"
   LET ROOMOBJECT$(14,3)="PAIL"
   LET ROOMOBJECT$(15,1)="COW*"
   LET ROOMOBJECT$(17,1)="SUGAR"
   LET ROOMOBJECT$(18,1)="TEA"
   LET ROOMOBJECT$(18,2)="CELLAR*"
   LET ROOMOBJECT$(20,1)="BOULDER*"
   LET ROOMOBJECT$(21,1)="MAP"
   LET ROOMOBJECT$(22,1)="LANTERN"
   LET ROOMOBJECT$(31,1)="EMPTYDIAMONDS!"
   LET ROOMOBJECT$(33,1)="EMPTYTURQUOISE!"

   LET CONVERTNUM=18
   FOR I=1 TO CONVERTNUM              'READ IN WORD!* CONVERSIONS
       READ OBJ$(I),OBJ2$(I)
   NEXT I
   DATA GOLD,GOLD!,WELL,WELL*,SIGN,SIGN*,DOOR,DOOR*,STOVE,STOVE*,EMERALD,_
       EMERALD!,RUBY,RUBY!,DIAMONDS,DIAMONDS!,COW,COW*,CELLAR,CELLAR*,_
       BOULDER,BOULDER*,JADE,JADE!,SILVER,SILVER!,TURQUOISE,TURQUOISE!,_
       MINERAL,MINERAL-OIL,OIL,MINERAL-OIL,SAFE,SAFE*,MIRROR,MIRROR*

END SUB

'MODULE 2 TURN
SUB TURN
   SHARED FLAG(),TURNNUMBER
   DO UNTIL FLAG(1) <> 0
       FLAG(14)=0
       TURNNUMBER = TURNNUMBER + 1
       IF TURNNUMBER=295 THEN BEEP 3:_
          PRINT "Type   SAVE GAME  and then  QUIT":_
          PRINT "You can then return to this spot by typing":_
          PRINT "HANGTOWN (at the DOS prompt) and later,":_
          PRINT "as a command, RESTORE GAME":_
          PRINT "Please forgive the necessary inconvenience."
       IF TURNNUMBER=300 THEN FLAG(1)=2
       CALL DESCRIBE      'MODULE 2.1 DESCRIBE THE ROOM
       CALL COMMANDS      'MODULE 2.2 INPUT THE COMMANDS
       CALL EVALUATE      'MODULE 2.3 EVALUATE COMMANDS
   LOOP
END SUB

'MODULE 2.1 DESCRIBE THE CURRENT ROOM
SUB DESCRIBE
   SHARED DESCRIPTION$(),ROOM,MOVEMENTTABLE(),ROOMOBJECT$(),FLAG(),_
       TURNNUMBER,INVENTORY$(),THING$,OBJECT$,DESCRIBEFLAG(),ROOMDESCRIBE$(),_
       ROOMDES2$()

   IF TURNNUMBER=1 THEN CALL GAMESTARTER   'MODULE 2.1.1
   IF DESCRIBEFLAG(ROOM)=0 THEN PRINT ROOMDESCRIBE$(ROOM):_
      PRINT ROOMDES2$(ROOM):DESCRIBEFLAG(ROOM)=1:GOTO JUMPOVER
   IF DESCRIBEFLAG(ROOM)=1 AND DESCRIPTION$(ROOM)="STREET" THEN _
       PRINT "You find yourself in the STREET"
   IF DESCRIBEFLAG(ROOM)=1 AND DESCRIPTION$(ROOM)<>"STREET" THEN _
       PRINT "You find yourself at the ";:PRINT DESCRIPTION$(ROOM)
   JUMPOVER:     'HOPELESS KLUDGE I MUST BE GETTING TIRED
   DELAY 0.3
   PRINT "The noticeable exits are: ";
   IF MOVEMENTTABLE(ROOM,1)<>0 THEN PRINT "NORTH ";
   IF MOVEMENTTABLE(ROOM,2)<>0 THEN PRINT "SOUTH ";
   IF MOVEMENTTABLE(ROOM,3)<>0 THEN PRINT "EAST ";
   IF MOVEMENTTABLE(ROOM,4)<>0 THEN PRINT "WEST ";
   IF MOVEMENTTABLE(ROOM,5)<>0 THEN PRINT "UP ";
   IF MOVEMENTTABLE(ROOM,6)<>0 THEN PRINT "DOWN ";
   PRINT
   DELAY 0.3
   PRINT "The noticeable objects are: ";
   COUNTER=0
   FOR I=1 TO 15
       LET STUFF$= ROOMOBJECT$(ROOM,I)
       IF LEFT$(STUFF$,5)<>"EMPTY" THEN PRINT "   ";ROOMOBJECT$(ROOM,I);_
         :COUNTER=COUNTER+1
   NEXT I
   IF COUNTER=0 THEN PRINT "noticeably absent!";
   PRINT
   DELAY 0.3
   PRINT "You are carrying: ";
           COUNTER=0
           FOR I= 1 TO 5
               IF INVENTORY$(I)<>"EMPTY" THEN COUNTER=COUNTER + 1:_
                   PRINT INVENTORY$(I);"   ";
           NEXT I
           IF COUNTER = 0 THEN PRINT "nothing at all."
    PRINT
    DELAY 0.3
   OBJECT$="SNAKE"
       IF FLAG(21)=0 AND TURNNUMBER>90 AND FLAG(2)=0 AND FNPRESENT=1 THEN_
         PRINT "A coyote strolls by, sees the dead SNAKE and runs away":_
         FLAG(21)=1
       IF FLAG(24)=0 AND FLAG(21)=1 AND DESCRIPTION$(ROOM)="STREET" AND _
         TURNNUMBER>120 THEN  FLAG(24)=1:__
         PRINT "A tourist tells you his dog ran off after seeing a dead SNAKE."

   IF ROOM =22 AND FLAG(20)=0 THEN PRINT "The glowing LANTERN is quite bright":_
       FLAG(20)=1

   IF ROOM = 10 AND FLAG(4)=1 AND FLAG(8)=0 THEN PRINT_
      "There is a shy and hungry KITTEN here"
   IF ROOM = 9 AND FLAG(4)=0 THEN PRINT "There is an unhappy ENGLISHMAN* here"
   OBJECT$="SUGAR"
      IF ROOM=33 AND FLAG(4)=1 AND FNPRESENT = 0 AND FLAG(9)=0 THEN _
         PRINT "You see a limping HORSE. You'll need a bribe to lure him over."
      IF ROOM = 33 AND FLAG(4)=1 AND FNPRESENT = 1 AND FLAG(9)=0 THEN_
         PRINT "The HORSE with a THORN in his hoof is nibbling on the SUGAR"
   THING$="LANTERN"
      IF ROOM=23 OR ROOM=24 OR ROOM=25 OR ROOM=26 OR ROOM=27 OR ROOM=28_
         OR ROOM=29 OR ROOM=30 OR ROOM=31 OR ROOM=32 THEN FLAG(19)=1 ELSE FLAG(19)=0
      IF FLAG(19)=1 AND FNCARRY=0 THEN PRINT "Too dark -- Dangerous!":_
          DANGEROUS=DANGEROUS + 1
      IF DANGEROUS=8 THEN PRINT "You bumped your head in the dark": _
         FLAG(1)=-1:EXIT SUB
   IF ROOM=15 AND FLAG(5)=0 THEN PRINT "There's a mighty hungry COW here"
   IF ROOM=15 AND FLAG(5)=1 THEN PRINT "There is a contented COW here"
   THING$="SNAKE": IF ROOM =18 AND FLAG(2)=0 AND FNCARRY=0 THEN CLS:PRINT:PRINT:_
      PRINT "A vicious DOG chases you out of the shack and back into the STREET":_
      FLAG(14)=1:ROOM=19:EXIT SUB
   IF ROOM=18 AND FLAG(2)=0 AND FNCARRY=1 THEN FLAG(2)=1:PRINT _
      "The DOG was frightened off by the dead RATTLESNAKE"
   IF TURNNUMBER=150 AND FLAG(17)=0 AND FLAG(26)=0 THEN FLAG(26)=1:_
      PRINT "The JAIL door KEY is buried somewhere."
   IF SCORE=86 AND FLAG(25)=0 THEN FLAG(25)=1:_
      PRINT "A stranger asks you the name of the HOTEL."
   PRINT
END SUB

'MODULE 2.1.1 GAME STARTER -- PRINT OUT INTRODUCTORY REMARKS
SUB GAMESTARTER
    CLS
    PRINT
    PRINT "                WELCOME TO HANGTOWN"
    PRINT
    PRINT
    PRINT "Come away with me on an exciting adventure to "
    PRINT "HANGTOWN, home of the GOLD rush!  Cope with "
    PRINT "mad dogs and ENGLISHMEN!  Save endangered animals!"
    PRINT "GET TREASURES!     MAKE TEA!"
    PRINT
    PRINT "Give COMMANDs as verb then object, such as  GO NORTH,"
    PRINT "SAVE GAME, RESTORE GAME, READ SIGN, KILL SNAKE,"
    PRINT "and GO CELLAR."
    PRINT
    PRINT "Exceptions to this two-word sentence rule are single-letter"
    PRINT "COMMANDs such as  N to GO NORTH, U to GO UP, AND D to GO"
    PRINT "DOWN."
    PRINT
    PRINT "P.S. Don't try to GET objects ending in an *, e.g., BOULDER*,"
    PRINT "as they are quite unobtainable-- comprendez, podner?"
    PRINT
    PRINT "And if you get stuck, just keep trying things, because"
    PRINT "After a certain number of turns, a hint will show up."
    PRINT "Press ENTER to begin"
    DO WHILE LEN(INKEY$)=0:LOOP
    CLS
END SUB

'MODULE 2.1.2 ERASER ERASES ONE LINE OF TEXT
SUB ERASER
   REM    FOR I=1 TO 12:PRINT "          ";:NEXT I
END SUB

'MODULE 2.2 COMMANDS
SUB COMMANDS
   SHARED VERB$, OBJECT$,ROOM,DESCRIPTION$(),FLAG(),INVENTORY$(),_
       ROOMOBJECT$(),OBJ$(),OBJ2$(),C$,ANSWER$(),TURNNUMBER,CONVERTNUM

   IF FLAG(1)<>0 THEN EXIT SUB
   IF FLAG(14)=1 THEN EXIT SUB
   ' BE SURE THAT INPUT IS OK  DUMMY2=0
   DUMMY2=0
  DO UNTIL DUMMY2=1
   'C$=THE INPUTTED COMMAND SENTENCE - MAY BE MORE THAN 2 WORDS
   'BUT ONLY THE FIRST TWO WORDS ARE ACCEPTED
   ' THE FIRST IS CALLED VERB$ AND THE SECOND OBJECT$
   LET C$=""
   PRINT:PRINT
   PRINT "*****************************************************************"
   DO UNTIL C$<>""
       INPUT "COMMAND";C$                 'GET THE RAW SENTENCE
   LOOP

   REM SPACES TAKE OFF LEADING AND PERHAPS TRAINING CHR$(32)'S
   DO WHILE RIGHT$(C$,1)=CHR$(32)
     LET C$=LEFT$(C$,LEN(C$)-1)
   LOOP

   LET C$=UCASE$(C$)

   LET I=1                                'LETTER COUNTER

   DO WHILE NOT (ASC (MID$(C$,I,1)) = 32) AND NOT (I= LEN(C$))
                                          'LOOP TO LOOK FOR FIRST SPACE
       LET I = I + 1                      'WHICH SHOULD DENOTE END OF FIRST
   LOOP                                   'WORD

   LET VERB$=MID$(C$,1,I)                 'ASSIGN THOSE CHARACTERS TO VERB$

LET ANSWER$(TURNNUMBER)=C$

   LET OBJECT$ = MID$(C$,I+1,LEN(C$))     'ASSIGN REST OF SENTENCE TO OBJECT$


   IF LEN(OBJECT$)<>0 THEN VERB$=LEFT$(VERB$,LEN(VERB$)-1)
   FOR J=1 TO 18                          'CONVERT OBJECT$ LACKING * OR !
       IF OBJECT$=OBJ$(J) THEN LET OBJECT$=OBJ2$(J)
   NEXT J
   'CHECK FOR EXTRA WORDS
   COUNTER=0
   FOR J=1 TO LEN(OBJECT$)
     LET DUMMY$=MID$(OBJECT$,J,1)
     IF DUMMY$=CHR$(32) THEN COUNTER=COUNTER+1
   NEXT J
   IF COUNTER<>0 THEN PRINT "One space (two words) only, please." _
     ELSE DUMMY2=1

LOOP
END SUB

'MODULE 2.3 EVALUATE THE COMMANDS
SUB EVALUATE
   SHARED VERB$, OBJECT$,ROOM,DIRECTION,MOVEMENTTABLE(),NUMBERROOMS,_
       ROOMOBJECT$(),ITEMNUMBER,TURNNUMBER,THING$,INVENTORY$(),FLAG()
   IF FLAG(1)<>0 THEN EXIT SUB
   IF FLAG(14)=1 THEN EXIT SUB
   SELECT CASE VERB$
       CASE "QUIT"
           LET FLAG(1)=2   'GAME NOT WON(1) OR LOST(-1):EXIT SELECT
       CASE "SAVE"
           IF OBJECT$<>"GAME" THEN PRINT "TRY-  SAVE GAME":EXIT SELECT
           OPEN "HANGSAV.BAS" FOR OUTPUT AS #1

           WRITE #1,ROOM


           FOR I=1 TO 5
               LET DUMMY$=""
               FOR J=1 TO LEN(INVENTORY$(I))
                LET DUMMY$=DUMMY$+CHR$(ASC(MID$(INVENTORY$(I),J,1))+4)
               NEXT J
               WRITE #1,DUMMY$
           NEXT I
           FOR I=1 TO NUMBERROOMS
              FOR J=1 TO 15
               LET DUMMY$=""
               FOR K=1 TO LEN (ROOMOBJECT$(I,J))
                LET DUMMY$=DUMMY$+CHR$(ASC(MID$(ROOMOBJECT$(I,J),K,1))+4)
               NEXT K
               WRITE #1,DUMMY$
              NEXT J
           NEXT I
           FOR I=1 TO 30
               WRITE  #1,FLAG(I)
           NEXT I
           CLOSE #1

           PRINT "OK
           EXIT SELECT
       CASE "RESTORE", "LOAD"
           IF OBJECT$<> "GAME" THEN PRINT "RESTORE GAME":EXIT SELECT
           OPEN "HANGSAV.BAS" FOR INPUT AS #1

           INPUT #1,ROOM


           FOR I=1 TO 5
             INPUT #1,DUMMY$
               LET INVENTORY$(I)=""
               FOR J=1 TO LEN(DUMMY$)
                LET INVENTORY$(I)=INVENTORY$(I)+CHR$(ASC(MID$(DUMMY$,J,1))-4)
               NEXT J
           NEXT I
           FOR I=1 TO NUMBERROOMS
              FOR J=1 TO 15
               INPUT #1,DUMMY$
               LET ROOMOBJECT$(I,J)=""
               FOR K=1 TO LEN (DUMMY$)
                LET ROOMOBJECT$(I,J)=ROOMOBJECT$(I,J)+CHR$(ASC(MID$(DUMMY$,K,1))-4)
               NEXT K
              NEXT J
           NEXT I


           FOR I=1 TO 30
               INPUT  #1,FLAG(I)
           NEXT I

           CLOSE #1
           PRINT "OK
           EXIT SELECT

       CASE "INVENTORY","I"
           COUNTER=0
           PRINT "   You carry: ";
           FOR I= 1 TO 5
               IF INVENTORY$(I)<>"EMPTY" THEN COUNTER=COUNTER + 1:_
                   PRINT INVENTORY$(I);"   ";
           NEXT I
           IF COUNTER = 0 THEN PRINT "nothing at all" :EXIT SELECT
           PRINT:EXIT SELECT

       CASE "GO","MOVE","N","S","E","W","U","D"
           IF LEN (VERB$)=1 THEN OBJECT$=VERB$
           IF OBJECT$="NORTH" OR OBJECT$="N" THEN DIRECTION = 1
           IF OBJECT$="SOUTH" OR OBJECT$="S" THEN DIRECTION = 2
           IF OBJECT$="EAST"  OR OBJECT$="E" THEN DIRECTION = 3
           IF OBJECT$="WEST"  OR OBJECT$="W" THEN DIRECTION = 4
           IF OBJECT$="UP"    OR OBJECT$="U" THEN DIRECTION = 5
           IF OBJECT$="DOWN"  OR OBJECT$="D" THEN DIRECTION = 6
           IF OBJECT$="WELL*" AND FLAG(3)=0 THEN_
              PRINT "SNAKE won't let me":EXIT SELECT
           IF ROOM=2 AND OBJECT$="WELL*" AND FLAG(3)=1 THEN PRINT "OK":_
              ROOM=1:EXIT SELECT
           IF ROOM=7 AND FLAG(6)=0 AND DIRECTION = 3 THEN_
              PRINT "Can't enter JAIL - door is locked":EXIT SELECT
           IF ROOM=18 AND OBJECT$="CELLAR*" THEN PRINT "OK":ROOM=22:EXIT SELECT
           IF MOVEMENTTABLE (ROOM,DIRECTION) = 0 THEN _
               PRINT "You can't GO that way" ELSE _
               LET ROOM = MOVEMENTTABLE (ROOM,DIRECTION)
           EXIT SELECT

       CASE "GET","TAKE","PLUCK","EXTRACT","PULL","REMOVE"
           IF ROOM=1 AND OBJECT$="WATER" THEN_
               PRINT "Too dangerous from the LEDGE":EXIT SELECT
           IF ROOM=2 AND OBJECT$="WATER" AND FLAG(3)=0 THEN _
              PRINT "The SNAKE won't let me":EXIT SELECT
           THING$="BUCKET"
           IF ROOM = 2 AND OBJECT$="WATER" AND FLAG(3)=1 AND FNCARRY = 0_
              THEN PRINT "You'll need a BUCKET.":EXIT SELECT
           IF ROOM =2 AND FNCARRY = 1 AND OBJECT$="WATER" AND FLAG(12)=0 THEN PRINT_
               "The BUCKET won't reach the WATER.":EXIT SELECT
           IF ROOM = 2 AND OBJECT$="WATER" AND FLAG(3)=1 AND FNCARRY = 1_
              AND FLAG(12)=1 THEN PRINT "OK":_
              FLAG(11)=1:EXIT SELECT
           THING$="PAIL"
              IF FLAG(5)=1 AND ROOM=15 AND FNCARRY=0 AND OBJECT$="MILK" THEN _
                 PRINT "You'll need a PAIL":EXIT SELECT
              IF FLAG(5)=1 AND ROOM = 15 AND OBJECT$="MILK" AND FNCARRY=1 THEN _
                 PRINT "OK":FLAG(23)=1: EXIT SELECT
              IF FLAG(5)=0 AND ROOM=15 AND OBJECT$="MILK" THEN_
                 PRINT "The hungry COW is too nervous":EXIT SELECT
              IF ROOM<>15 AND OBJECT$="MILK" THEN PRINT "Find a COW":EXIT SELECT
           LET THING$="TWEEZERS"
              IF OBJECT$="THORN" AND FNCARRY=0 THEN _
                 PRINT "You'll need something to remove the THORN with.":_
                 EXIT SELECT
              IF ROOM=33 AND FLAG(4)=1 AND FNCARRY=1 AND FLAG(9)=0 AND OBJECT$="THORN" THEN _
                 PRINT "The happy HORSE shakes something from its mane and runs away":_
                 ROOMOBJECT$(33,1)="TURQUOISE!":FLAG(9)=1:EXIT SELECT
           IF OBJECT$="LANTERN" THEN FLAG(7)=1
           IF ROOM=10 AND OBJECT$="KITTEN" THEN _
              PRINT "Too shy - Runs away from you":EXIT SELECT

           LET HOLDING$=OBJECT$
           LET OBJECT$="SUGAR"
           IF ROOM = 33 AND FLAG(4)=1 AND HOLDING$= "HORSE" AND _
              FNPRESENT=0 AND FLAG(9)=0 THEN _
              PRINT "The HORSE won't come to you without a bribe":EXIT SELECT
           LET OBJECT$=HOLDING$

           IF  FNPRESENT = 0 THEN PRINT "I don't see  ";OBJECT$:EXIT SELECT
           IF RIGHT$(OBJECT$,1)="*" THEN PRINT "I can't handle it":EXIT SELECT
           IF OBJECT$="LANTERN" THEN FLAG(7)=1

           IF RIGHT$(OBJECT$,5)="SNAKE" AND FLAG(3)=0 THEN PRINT_
              "I don't handle live SNAKES, thank you very much":EXIT SELECT

           FOR I=1 TO 5
               IF INVENTORY$(I)="EMPTY" THEN INVENTORY$(I)=OBJECT$:_
                   PRINT "GOT IT":ROOMOBJECT$(ROOM,ITEMNUMBER)="EMPTY":_
                   EXIT SELECT
           NEXT I
           PRINT "You're carrying too much.  Drop something!"
       CASE "PUT","DROP","GIVE"
           IF OBJECT$="MILK"  THEN PRINT "Try  DROP PAIL":EXIT SELECT
           THING$=OBJECT$
           IF OBJECT$="PAIL" AND ROOM=10 AND FLAG(8)=0 AND _
               FNCARRY = 1 THEN FLAG(8)=1:_
               PRINT "The now full KITTEN returns with a pack rat.":_
               PRINT "The pack rat drops something and runs off, ":_
               PRINT "with the KITTEN in hot pursuit":_
               ROOMOBJECT$(10,1)="RUBY!":_
               PRINT:EXIT SELECT
           IF OBJECT$="MILK" AND ROOM=9 THEN PRINT "Try  DROP PAIL":EXIT SELECT
           IF OBJECT$="WATER" THEN PRINT "Try  FILL KETTLE ":EXIT SELECT
           THING$=OBJECT$
           IF FNCARRY=0 THEN PRINT "You don't have the ";OBJECT$:EXIT SELECT
           'PREVENTS DROPPING TWO OF ANYTHING ANYWHERE
           IF FNPRESENT=1 THEN PRINT "Not again.":EXIT SELECT
           IF OBJECT$="LANTERN" THEN FLAG(7)=0
           IF OBJECT$="HAY" AND ROOM=15 THEN FLAG(5)=1
           FOR J=1 TO 15
               IF ROOMOBJECT$(ROOM,J)="EMPTY"THEN ROOMOBJECT$(ROOM,J)=OBJECT$_
                   :LET INVENTORY$(ITEMNUMBER)="EMPTY" :PRINT "OK":_
                   EXIT SELECT
           NEXT J
           PRINT "This room is full, take it elsewhere":EXIT SELECT
       CASE "LOOK","EXAMINE","INSPECT"
           IF ROOM=2 AND OBJECT$="WELL*" THEN PRINT _
              "I see GOLD!  Maybe I should GO WELL*":EXIT SELECT
           IF ROOM=6 AND OBJECT$="MIRROR*" THEN _
              PRINT "The rest of the sign can now be seen.  It says:":_
              PRINT "      ITEM #2          Sometimes I'm perky,":_
              PRINT "                       Sometimes I'm a drip;":_
              PRINT "                       When I'm freshly brewed,":_
              PRINT "                       Would you like a sip?":_
              PRINT:EXIT SELECT
           IF OBJECT$="SIGN*" THEN PRINT "Try  READ SIGN*  ":EXIT SELECT
           IF OBJECT$="MAP" THEN PRINT "Try -   READ MAP":EXIT SELECT
           PRINT "I don't see anything unexpected":EXIT SELECT
       CASE "READ"
           IF ROOM=9 AND OBJECT$="SIGN*" THEN PRINT "To MAKE TEA --":_
               PRINT "Bring here and DROP the following -":_
               PRINT "TEA, KETTLE, WATER, MILK, MATCHES, SUGAR, ":_
               PRINT "CUP, and something to burn, then type MAKE TEA":EXIT SELECT
           IF ROOM=3 AND OBJECT$="SIGN*" THEN PRINT "The SIGN* says -":_
               PRINT "DROP TREASURES! Such as GOLD! here and type  SCORE  ":EXIT SELECT
           IF ROOM=6 AND OBJECT$="SIGN*" THEN _
               PRINT "         The SIGN* says: Some things you need,":_
               PRINT "                         Can be found here;":_
               PRINT "                         Just say the word,":_
               PRINT "                         And they'll appear.":_
               PRINT "           ITEM #1:      I hang on the wall,":_
               PRINT "                         With nothing to do;":_
               PRINT "                         When you LOOK at me,":_
               PRINT "                         You see only you.":_
               PRINT "       You can't make out the last 4 or 5 lines.":_
               PRINT "       They look backwards or something.":_
               PRINT:EXIT SELECT
           IF ROOM=6 AND OBJECT$="MIRROR*" THEN _
               PRINT "Try -    LOOK MIRROR":EXIT SELECT

           THING$="MAP":IF OBJECT$="MAP" AND FNCARRY=0 THEN PRINT "You don't have the MAP":EXIT SELECT
           THING$="MAP":IF OBJECT$="MAP" AND FNCARRY=1 THEN _
               PRINT "Says  DOWN WEST WEST SOUTH SOUTH DIG":EXIT SELECT
           PRINT "Try READ SIGN* or  READ MAP":EXIT SELECT
      CASE "OIL","LUBRICATE","GREASE"
          THING$="MINERAL-OIL"
              IF FNCARRY=0 THEN PRINT "You don't have the MINERAL-OIL":EXIT SELECT
          IF ROOM=11 THEN PRINT "OK":FLAG(13)=1:EXIT SELECT
          PRINT "Not here":EXIT SELECT
      CASE "DRINK","EAT"
         PRINT "What is it with you and food?":EXIT SELECT
     CASE "SCORE"
         IF ROOM <>3 THEN PRINT "Return to the TOWN SQUARE":EXIT SELECT
         SCORE=2
         FOR I=1 TO 10
             LET STUFF$=ROOMOBJECT$(3,I)
             IF RIGHT$(STUFF$,1)="!" THEN SCORE=SCORE + 14
         NEXT I
         PRINT "Your SCORE is ";SCORE
         IF SCORE=100 THEN PRINT "You win!!!!  Fantastic Job!!!  YAHOO!!":FLAG(1)=1:EXIT SELECT
         PRINT (100-SCORE);" points to go":EXIT SELECT
     CASE "CLIMB"
         IF OBJECT$="WELL" OR OBJECT$="WELL*" THEN PRINT "Try GO WELL*":EXIT SELECT
         THING$="CHAIR"
             IF ROOM=20 AND FNCARRY=1 THEN_
                PRINT "PUT or DROP CHAIR here first.":EXIT SELECT
             OBJECT$="CHAIR":IF ROOM=20 AND FNPRESENT=0 THEN_
                PRINT "The BOULDER is too high, GET something to stand on":_
                EXIT SELECT
             IF ROOM=20 THEN PRINT "Good climbing!":ROOM=21:EXIT SELECT
         PRINT "Come down from there!":EXIT SELECT
     CASE "TIE","CONNECT","ATTACH"
        IF LEFT$(OBJECT$,2)="UP" THEN PRINT "Try  TIE ROPE ":EXIT SELECT
        THING$="ROPE":IF FNCARRY=0 THEN PRINT "You'll need the ROPE":EXIT SELECT
        THING$="BUCKET":IF FNCARRY=0 THEN PRINT "GET the BUCKET":EXIT SELECT
        IF OBJECT$="DOG" THEN PRINT "You want me to try to TIE up a vicious DOG?  HA! HA!":_
            EXIT SELECT
        IF OBJECT$="ROPE" OR OBJECT$="BUCKET" THEN PRINT "One end of the rope is tied to the BUCKET"_
            :FLAG(12)=1:EXIT SELECT
        PRINT "I hardly know you!":EXIT SELECT

     CASE "UNTIE","UNDO"
         IF FLAG(12)=1 AND (OBJECT$="ROPE" OR OBJECT$="BUCKET") THEN_
             PRINT "OK":FLAG(12)=0:EXIT SELECT
     CASE "LOWER"
         PRINT "Try  GET WATER":EXIT SELECT
     CASE "MILK"
         PRINT "Try  GET MILK":EXIT SELECT
     CASE "KILL"
         THING$="ROCK"
             IF FNCARRY=0 AND ROOM=2 THEN PRINT "You'll need a suitable weapon":_
                 EXIT SELECT
             IF FNCARRY=1 AND ROOM=2 AND FLAG(3)=0 THEN_
                 PRINT "The dead RATTLESNAKE is still frightening.":_
                 LET ROOMOBJECT$(2,2)="SNAKE":FLAG(3)=1:EXIT SELECT
         PRINT "You must think I'm crazy!":EXIT SELECT
     CASE "UNLOCK"
         IF OBJECT$="SAFE" THEN PRINT "Try-  OPEN SAFE":EXIT SELECT
         THING$="KEY"
             IF FNCARRY=0 THEN PRINT "You'll need a KEY":EXIT SELECT
             IF ROOM=7 THEN PRINT "The JAIL DOOR* is unlocked. You can GO EAST":FLAG(6)=1:_
                 EXIT SELECT
         PRINT "No lock here":EXIT SELECT
     CASE "OPEN"
         IF ROOM=11 AND OBJECT$="SAFE*" AND FLAG(13)=0 THEN _
             PRINT "The rusty hinge needs OIL to open":EXIT SELECT
         IF ROOM=11 AND OBJECT$="SAFE*" AND FLAG(13)=1 AND FLAG(15)=0 THEN _
             PRINT "I see JADE!":ROOMOBJECT$(11,2)="JADE!":_
             FLAG(15)=1:EXIT SELECT
         IF ROOM=11 AND OBJECT$="SAFE*" AND FLAG(15)=1 THEN _
             PRINT "It is open!":EXIT SELECT
         IF OBJECT$="DOOR*" AND FLAG(6)=0 THEN _
             PRINT "The JAIL DOOR is locked!":EXIT SELECT
         IF ROOM=7 AND OBJECT$="DOOR*" AND FLAG(6)=1 THEN _
             PRINT "The JAIL DOOR is open, GO EAST to enter":EXIT SELECT
         PRINT "No........You can't make me":EXIT SELECT
    CASE "THROW"
        IF ROOM=2 THEN PRINT "Try  KILL SNAKE ":EXIT SELECT
        PRINT "Not here":EXIT SELECT
    CASE "DIG","SHOVEL"
        THING$="SHOVEL"
            IF FNCARRY=0 THEN PRINT "You'll need a SHOVEL":EXIT SELECT
            IF ROOM=31 OR ROOM=5 THEN PRINT "I hit something"
            IF ROOM=31 AND FLAG(16)=0 THEN ROOMOBJECT$(31,1)="DIAMONDS!":_
                FLAG(16)=1:EXIT SELECT
            IF ROOM=5 AND FLAG(17)=0 THEN ROOMOBJECT$(5,1)="KEY":_
                FLAG(17)=1:EXIT SELECT
        PRINT "The substrate is too hard here to dig":EXIT SELECT
    CASE "MAKE","PREPARE"
        IF OBJECT$<>"TEA" THEN PRINT "Don't know how":EXIT SELECT
        IF FNPRESENT = 0 THEN PRINT "You'll need TEA":EXIT SELECT
        OBJECT$="KETTLE":IF FNPRESENT=0 OR FLAG(10)=0 THEN _
           PRINT "You'll need a KETTLE FILLed with WATER.":EXIT SELECT
        OBJECT$="PAIL":IF FNPRESENT=0 OR FLAG(23)=0 THEN _
           PRINT "You'll need a PAIL FILLed with MILK.":EXIT SELECT
        OBJECT$="SUGAR":IF FNPRESENT=0 THEN PRINT "You'll need the SUGAR ":EXIT SELECT
        OBJECT$="MATCHES":IF FNPRESENT=0 THEN PRINT "You'll need some MATCHES":EXIT SELECT
        OBJECT$="CUP":IF FNPRESENT=0 THEN PRINT "You'll need a CUP":EXIT SELECT
        OBJECT$="MAGAZINES":IF FNPRESENT=0 THEN PRINT "You'll need something to burn":EXIT SELECT

        IF FLAG(18)=0 THEN FLAG(4)=1:_
             FLAG(18)=1 :ROOMOBJECT$(9,2)="EMERALD!":_
             PRINT "The grateful ENGLISHMAN leaves a big tip":EXIT SELECT
        IF FLAG(18)=1 THEN PRINT "Not again!":EXIT SELECT
        PRINT "PUT the items you need in the TEA ROOM":EXIT SELECT
    CASE "FILL"
        THING$="KETTLE"
        IF OBJECT$="KETTLE" AND FNCARRY=1 AND FLAG(11)=1 THEN _
           FLAG(10)=1:PRINT "The KETTLE is FILLed.":EXIT SELECT
        IF OBJECT$="KETTLE" AND FNPRESENT=1 AND FLAG(11)=1 THEN _
           FLAG(10)=1:PRINT "The KETTLE is FILLed.":EXIT SELECT

        IF OBJECT$="BUCKET" AND ROOM=2 THEN PRINT "Try GET WATER":EXIT SELECT
        IF OBJECT$="PAIL" AND ROOM=15 THEN PRINT "Try  GET MILK":EXIT SELECT
        PRINT "You'll need a KETTLE or a BUCKET or a PAIL":EXIT SELECT

    CASE "ENTER"
        PRINT "Try GO WELL* or GO CELLAR*":EXIT SELECT

    CASE "BURN"
        IF OBJECT$="HAY" THEN PRINT "Too green --- Won't BURN.":EXIT SELECT
        PRINT "Don't play with fire!":EXIT SELECT

    CASE "MIRROR*","MIRROR"
         PRINT "Suddenly you notice a MIRROR* on the wall":_
         PRINT "opposite the SIGN*":LET ROOMOBJECT$(6,3)="MIRROR*":EXIT SELECT

    CASE "SAY"
        PRINT "Just type the word you were going to say":EXIT SELECT

    CASE "COFFEE"
        IF FLAG(22)=0 THEN PRINT "Suddenly you smell and then see some":_
            PRINT "fresh coffee on the bar.  So does a passing prospector":_
            PRINT "who takes it, leaving some SILVER! in exchange.":_
            LET ROOMOBJECT$(6,4)="SILVER!":FLAG(22)=1:EXIT SELECT
        PRINT "All that's left of the coffee is the aroma":EXIT SELECT

    CASE "FEED"
       PRINT "Try the word  GIVE  followed by the name of the food.":_
          EXIT SELECT
    CASE "USE"
      PRINT "Try - DIG or UNLOCK or TIE or PLUCK":EXIT SELECT
    CASE "REVEAL"
      PRINT "Just type the name of the object by itself.":EXIT SELECT
     CASE ELSE
         IF ROOM=6 AND OBJECT$="MIRROR*" THEN _
            PRINT "Try -   LOOK MIRROR":EXIT SELECT
         IF OBJECT$="CELLAR*" THEN _
            PRINT "Try-    GO CELLAR":EXIT SELECT
         IF OBJECT$="WELL*" THEN PRINT "Try-  GO WELL":EXIT SELECT
         PRINT "I don't know that verb":EXIT SELECT
   END  SELECT
END SUB

'MODULE 2.3.1 DEFINE THE FUNCTION- IS THE OBJECT PRESENT?
DEF FNPRESENT
   SHARED ROOMOBJECT$(),OBJECT$,ITEMNUMBER
        FOR J=1 TO 15
            IF ROOMOBJECT$(ROOM,J)=OBJECT$ THEN _
                FNPRESENT=1:ITEMNUMBER=J:EXIT DEF
        NEXT J
        FNPRESENT=0
END DEF

'MODULE 2.3.2 DEFINE THE FUNCTION- IS IT BEING CARRIED?
DEF FNCARRY
   SHARED INVENTORY$(),THING$,ITEMNUMBER
   FOR I = 1 TO 5
       IF INVENTORY$(I)=THING$ THEN FNCARRY = 1: ITEMNUMBER = I: EXIT DEF
   NEXT I
   FNCARRY=0
END DEF

'MODULE 2.4 UPDATE DATA
SUB UPDATE
END SUB

'MODULE 3 CLOSING
SUB CLOSING
   SHARED FLAG(),TURNNUMBER,ANSWER$(),STRT
   FOR I=1 TO 6:PRINT:NEXT I
   INPUT "Be sure that your disk is in the drive and press ENTER";DUMMY$

      DIM DTA(40),DTA$(10)
      OPEN "REPORT.DTA" FOR INPUT AS #1
        REM RETRIEVES OLD DATA FROM REPORT.DTA
        FOR I=1 TO 40
          INPUT #1,DTA(I)
        NEXT I
        FOR I=1 TO 10
          INPUT #1,DTA$(I)
        NEXT I
      CLOSE #1

     LET DTA(13)=FLAG(1):LET DTA(38)=DTA(38)+INT((TIMER-STRT)/6)
      OPEN "REPORT.DTA" FOR OUTPUT AS #1
        REM SENDS UPDATED DATA TO REPORT.DTA (WITH NAIME$)
        FOR I=1 TO 40
          WRITE #1,DTA(I)
        NEXT I
        FOR I=1 TO 10
          WRITE #1,DTA$(I)
        NEXT I
      CLOSE #1

   OPEN "HANGDATA.TXT" FOR APPEND AS #2
   PRINT #2, DATE$,TIME$
   FOR I=0 TO TURNNUMBER
        IF INT(I/5)=I/5 THEN PRINT #2, ANSWER$(I) ELSE PRINT #2,ANSWER$(I),
   NEXT I
   PRINT #2,INT((STRT-TIMER)/6),
   PRINT #2,INT(1000*RND(0))
   CLOSE #2
   PRINT "This game is over.  Type HANGTOWN to play again."
END SUB

'END OF PROGRAM