    SUBROUTINE ADVENTURES

* ADVENTURE game - main program
* Called from either ADVENT.INIT or ADVENT.RESTORE with the
* entire COMMON area populated and ready to run

* Original FORTRAN program by Crowther and Woods
* Pick BASIC translation by Dick Elleray, 1982
* Reworked and revised by David Ruggiero, 1985 & 2019

! Note, in case it's not immediately obvious: [DR]
!
! What's below started life as bespoke PDP-11 FORTRAN code, which was
! translated pretty much literally to early-1980s Reality DataBasic.
! (And in the process, stripped of nearly all comments, as Reality had
! a hard 32KB item size limit in those days, and the size of this
! beastie with comments included blew that WAY out.)
!
! Given this, what's here surely shouldn't be taken as an example of
! how to code properly - or at all - in any modern Multivalue environment.
! In fact, much of what's here is a master class in what _never_ to do:
! massive use of GOTOs, numeric labels, spaghettified logic, and data
! structures with no relation to normal Multivalue constructs.
! You've been warned.

    INCLUDE ADVENT.BP ADVENT.COMMON
    PROMPT ''

    IF PARM="RESUME" THEN
        K=NULLX
        GOTO 8
    END

    X=65; Y=1; Z=0; GOSUB 7030; HINTED(3)=YEA
    IF HINTED(3) THEN LIMIT=660 ELSE LIMIT=330    ;* first time in, they get fresh batteries

2:  IF NEWLOC < 9 AND NEWLOC <>  0 AND CLOSNG THEN
        IR=130; GOSUB 7040
        NEWLOC=LOC
        IF NOT(PANIC) THEN CLOCK2=15
        PANIC=1
    END

    L=LOC; N=3; GOSUB 7000
    IF NEWLOC=LOC OR COND(LOC)=2 OR XBITSET THEN GOTO 74
    FOR I=1 TO 5
        IF NOT(ODLOC(I) <> NEWLOC OR NOT(DSEEN(I))) THEN
            NEWLOC=LOC
            IR=2; GOSUB 7040
            GOTO 74
        END
    NEXT I

74: LOC=NEWLOC
* DWARF STUFF
    IF NOT(LOC) THEN GOTO 99
    L=NEWLOC; N=3; GOSUB 7000
    IF COND(LOC) <> 2 AND NOT(XBITSET) THEN
        IF NOT(DFLAG) AND LOC>=15 THEN DFLAG=1 ELSE GOTO 6000
    END
    GOTO 2000

6000: IF LOC>=15 AND 95<=RND(100) AND DFLAG=1 THEN
        DFLAG=2
        FOR I=1 TO 2
            J=1+RND(5)
            IF RND(100)<50 THEN DLOC(J)=0
        NEXT I
        FOR I=1 TO 5
            IF DLOC(I)=LOC THEN DLOC(I)=DALTLC
            ODLOC(I)=DLOC(I)
        NEXT I
        IR=3; GOSUB 7040
        OBJECT=AXE; WHERE=LOC; GOSUB 7010
        GOTO 2000
    END

    IF DFLAG>=2 THEN
        DTOTAL=0
        ATTACK=0
        STICK=0
        FOR I=1 TO 6
            IF NOT(DLOC(I)) THEN CONTINUE
            J=1
            KK=XKEY(DLOC(I))
            IF KK THEN
6012:           NEWLOC=MOD(INT(ABS(TRAVEL(KK)/1000)),1000)
                IF NEWLOC<=300 THEN
                    L=NEWLOC; N=3; GOSUB 7000
                    IF NEWLOC < 15 OR NEWLOC=ODLOC(I) OR NEWLOC=DLOC(I) OR COND(NEWLOC)=2 OR (I=6 AND XBITSET) OR INT(ABS(TRAVEL(KK))/1000000)=100 OR J>=20 THEN GOTO 6014
                    IF J>1 THEN IF NEWLOC=TK(J-1) THEN GOTO 6014
                    TK(J)=NEWLOC
                    J+=1
                END
6014:           KK+=1
                IF TRAVEL(KK-1)>=0 THEN GOTO 6012
            END

            TK(J)=ODLOC(I)
            IF J>=2 THEN J -= 1
            J = 1+RND(J)
            ODLOC(I) = DLOC(I)
            DLOC(I) = TK(J)
            DSEEN(I) = (DSEEN(I) AND LOC>=15) OR (DLOC(I)=LOC OR ODLOC(I)=LOC)
            IF DSEEN(I) THEN
                DLOC(I) = LOC
                IF I=6 THEN   ;* this IF statement is all pirate stuff
                    IF LOC=CHLOC OR PROP(CHEST)>=0 THEN CONTINUE
                    K=0
                    FOR J=50 TO MAXTRS
                        IF J <> PYRAM OR (LOC <> PLAC(PYRAM) AND LOC <> PLAC(EMRALD)) THEN IF PLACE(J)=-1 THEN GOTO 6022
                        IF PLACE(J)=-1 THEN GOTO 6022
                        HERE=J; GOSUB 7120
                        IF HERE THEN K=1
                    NEXT J
                    HERE=LAMP; GOSUB 7120
                    IF TALLY=TALLY2+1 AND NOT(K) AND NOT(PLACE(CHEST)) AND HERE AND PROP(LAMP)=1 THEN GOTO 6025
                    IF ODLOC(6) <> DLOC(6) AND RND(100)<20 THEN IR=127; GOSUB 7040
                    CONTINUE

6022:               IR=128; GOSUB 7040
                    IF NOT(PLACE(MESSAG)) THEN OBJECT=CHEST; WHERE=CHLOC; GOSUB 7080
                    OBJECT=MESSAG; WHERE=CHLOC2; GOSUB 7080
                    FOR J=50 TO MAXTRS
                        IF J <> PYRAM OR (LOC <> PLAC(PYRAM) AND LOC <> PLAC(EMRALD)) THEN
                            ATT=J; GOSUB 7130
                            IF ATT AND NOT(FIXED(J)) THEN OBJECT=J; WHERE=LOC; GOSUB 7090 ;*CRY
                            IF PLACE(J)=-1 THEN OBJECT=J; WHERE=CHLOC; GOSUB 7010
                        END
                    NEXT J
6024:               DLOC(6)=CHLOC
                    ODLOC(6)=CHLOC
                    DSEEN(6)=0
                    CONTINUE

6025:               IR=186; GOSUB 7040
                    OBJECT=CHEST; WHERE=CHLOC; GOSUB 7080
                    OBJECT=MESSAG; WHERE=CHLOC2; GOSUB 7080
                    GOTO 6024
                END
                DTOTAL += 1
                IF ODLOC(I)=DLOC(I) THEN
                    ATTACK+=1
                    IF KNFLOC >= 0 THEN KNFLOC = LOC
                    IF RND(1000) < 95*(DFLAG-2) THEN STICK += 1
                END
            END
        NEXT I

        IF NOT(DTOTAL) THEN GOTO 2000
        IF DTOTAL=1 THEN IR=4; GOSUB 7040 ELSE CRT; CRT 'There are ':DTOTAL:' threatening little dwarves in the room with you!'
        IF NOT(ATTACK) THEN GOTO 2000
        IF DFLAG=2 THEN DFLAG=3
        IF ATTACK=1 THEN IR=5; GOSUB 7040; K=52 ELSE CRT ATTACK:' of them throw knives at you.'; K=6
        BEGIN CASE
        CASE NOT(STICK); GOTO 2000
        CASE STICK > 1 ; CRT STICK:' of them get you.'
        CASE 1
            IR = K+STICK
            GOSUB 7040
        END CASE
        OLDLC2=LOC
        GOTO 99
    END

2000:     * get and print long or short place desc
    IF MOD(ABB(LOC),ABBNUM) OR NOT(ABBNUM) THEN   ;* ABBNUM = 0 if superbrief mode
        READ OUTSTR FROM ADVENTURE,STEXT:LOC ELSE
            READ OUTSTR FROM ADVENTURE,LTEXT:LOC ELSE CALL ADVFATAL(28)
        END
    END ELSE
        READ OUTSTR FROM ADVENTURE,LTEXT:LOC ELSE CALL ADVFATAL(28)
    END
    GOSUB 7140      ;* dark
    IF DARK THEN
        IF WZDARK AND RND(100)<30 THEN GOTO 90    ;* it's pit city
        READ OUTSTR FROM ADVENTURE,RTEXT:'16' ELSE OUTSTR=''
    END
    GOSUB 7050
    IF PLACE(BEAR)=-1 THEN IR=141; GOSUB 7040
    K=1
    IF COND(LOC)=2 THEN GOTO 8
    IF LOC=33 AND RND(100)<=25 AND NOT(CLOSNG) THEN IR=8; GOSUB 7040  ;* hollow voice says "plugh"
    GOSUB 7140; IF DARK THEN GOTO 2012
    ABB(LOC) += 1
    I = ATLOC(LOC)
    SPACEOUT = 1

    LOOP
        IF NOT(I) THEN GOTO 2012
        OBJ=I
        IF OBJ > 100 THEN OBJ -= 100
        IF OBJ = STEPS AND PLACE(NUGGET)=-1 THEN GOTO 2008
        IF PROP(OBJ) < 0 THEN
            IF CLOSED THEN GOTO 2008
            PROP(OBJ)=0
            IF OBJ=RUG OR OBJ=XCHAIN THEN PROP(OBJ)=1
            TALLY -= 1
            IF TALLY = TALLY2 AND TALLY <> 0 THEN IF LIMIT>35 THEN LIMIT=35
        END

        KK = PROP(OBJ)
        IF LOC = FIXED(STEPS) AND OBJ = STEPS THEN KK=1
        MSG=OBJ; SKIP=KK; GOSUB 7150
2008:   I=LINK(I)
    REPEAT

2009: K=54
2010: SPK=K
2011: IR=SPK; GOSUB 7040
2012: VERB=0
    OBJ=0
    SPACEOUT=0

2600: FOR HINT=4 TO HNTMAX
        IF NOT(HINTED(HINT)) THEN
            L=LOC; N=HINT; GOSUB 7000
            IF NOT(XBITSET) THEN HINTLC(HINT)=-1
            HINTLC(HINT)+=1
            IF HINTLC(HINT)>=HINTS(HINT,1) THEN GOTO 40000
        END
    NEXT HINT

2602: IF CLOSED THEN
        IF PROP(OYSTER)<0 AND PLACE(OYSTER)=-1 THEN MSG=OYSTER; SKIP=1; GOSUB 7150
        FOR I=1 TO OBJECTS
            IF PLACE(I)=-1 AND PROP(I)<0 THEN PROP(I)=-1-PROP(I)
        NEXT I
    END

    GOSUB 7140
    WZDARK=DARK
    IF KNFLOC>0 AND KNFLOC <> LOC THEN KNFLOC=0
    I=RND(100)
    GOSUB 7200

2608: IF FOOBAR>0 THEN FOOBAR = -FOOBAR ELSE FOOBAR=0
    TURNS += 1
    IF VERB = SAY THEN IF WD2 <> '' THEN VERB=0 ELSE GOTO 4090
    IF NOT(TALLY) AND LOC>=15 AND LOC <> 33 THEN CLOCK1 -= 1
    IF NOT(CLOCK1) THEN GOTO 10000
    IF CLOCK1 < 0 THEN CLOCK2 -= 1
    IF NOT(CLOCK2) THEN GOTO 11000
    IF PROP(LAMP) = 1 THEN LIMIT -= 1

    BEGIN CASE
    CASE LIMIT>30   ;* don't bother checking further
        GOTO 19999
    CASE LIMIT<=30 AND (PLACE(BATTER)=LOC OR PLACE(BATTER)=-1) AND NOT(PROP(BATTER)) AND (PLACE(LAMP)=LOC OR PLACE(LAMP)=-1)
        IR=188; GOSUB 7040
        PROP(BATTER)=1
        IF PLACE(BATTER)=-1 THEN OBJECT=BATTER; WHERE=LOC; GOSUB 7010
        LIMIT += 660
        LMWARN=0
    CASE NOT(LIMIT)
        LIMIT=-1; PROP(LAMP)=0
        HERE=LAMP; GOSUB 7120; IF HERE THEN IR=184; GOSUB 7040
    CASE LIMIT<0 AND LOC<=8
        IR=185; GOSUB 7040
        GAVEUP=1
        GOTO 20000
    CASE LIMIT<=30
        HERE=LAMP; GOSUB 7120
        IF HERE AND NOT(LMWARN) THEN
            LMWARN=1; SPK=187
            IF NOT(PLACE(BATTER)) THEN SPK=183
            IF PROP(BATTER)=1 THEN SPK=189
            IR=SPK; GOSUB 7040
        END
    END CASE
19999: K=43
    GOSUB 7160
    IF LIQLOC=WATER THEN K=70
    IF WD1='ENTER' THEN IF (WD2='STREA' OR WD2='WATER') THEN GOTO 2010 ELSE IF WD2 <> '' THEN GOTO 2800
    IF (WD1 <> 'WATER' AND WD1 <> 'OIL') OR (WD2 <> 'PLANT' AND WD2 <> 'DOOR') THEN GOTO 2610
    INIT=1; ID=WD2; GOSUB 7020; ATT=VOCRTN; GOSUB 7140
    IF ATT THEN WD2='POUR'

2610: IF WD1='WEST' THEN
        IWEST+=1
        IF NOT(MOD(IWEST,6)) THEN IR=17; GOSUB 7040
    END
2630: INIT=-1; ID=WD1; GOSUB 7020
    IF VOCRTN=-1 THEN GOTO 3000
    K=MOD(VOCRTN,1000)
    ON (VOCRTN/1000)+1 GOTO 8,5000,4000,2010
2800: WD1=WD2
    WD1X=WD2X
    WD2=''
    GOTO 2610

3000:     * "What?" messages
    SPK=FIELD("60*60*60*61*13","*",RND(5)+1)      ;* randomly pick a message
    IR=SPK; GOSUB 7040
    GOTO 2600

4000: VERB=K
    SPK=ACTSPK(VERB)
    BEGIN CASE
    CASE VERB = SAY AND WD2=''; GOTO 4080
    CASE VERB = SAY; GOTO 4090
    CASE WD2 <> '';  GOTO 2800
    CASE OBJ;  GOTO 4090
    CASE 1 ; GOTO 4080
    END CASE

4080: IF VERB < 1 OR VERB > 36 THEN CALL ADVFATAL(23)
    ON VERB GOTO 8010,8000,8000,8040,2009,8040,9070,9080,8000,8000,2011,9120,9130,8140,9150,8000,8000,8180,8000,8200,8000,9220,9230,8240,8250,8260,8270,8000,8000,8300,8310,8320,8330,8340,8350,8360

4090: IF VERB > 36 OR VERB < 1 THEN CALL ADVFATAL(24)
    ON VERB GOTO 9010,9020,9030,9040,2009,9040,9070,9080,9090,2011,2011,9120,9130,9140,9150,9160,9170,2011,9190,9190,9210,9220,9230,2011,2011,2011,9270,9280,9290,2011,2011,2011,2011,2011,2011,2011

5000: OBJ=K
    HERE=K; GOSUB 7120
    IF FIXED(K) <> LOC AND NOT(HERE) THEN GOTO 5100

5010: IF WD2 <> '' THEN GOTO 2800
    IF VERB THEN GOTO 4090
    CRT 'What do you want to do with the ':OCONV((WD1:WD1X),'MCL'):"?"
    GOTO 2600

5100: IF K=GRATE THEN
        IF LOC>9 AND LOC<15 THEN K=ENTRNC; GOTO 8
        IF LOC=1 OR LOC=4 OR LOC=7 THEN K=DPRSSN; GOTO 8
    END

    IF K=DWARF THEN
        FOR I=1 TO 5
            IF DLOC(I)=LOC AND DFLAG>=2 THEN GOTO 5010
        NEXT I
    END

    GOSUB 7170; HERE=BOTTLE; GOSUB 7120;  GOSUB 7160
    IF (LIQ=K AND HERE) OR K=LIQLOC THEN GOTO 5010
    ATT=PLANT2; GOSUB 7130
    IF OBJ=PLANT AND ATT AND PROP(PLANT2) THEN OBJ=PLANT2; GOTO 5010
    IF OBJ=KNIFE AND KNFLOC=LOC THEN KNFLOC=-1; SPK=116; GOTO 2011
    HERE=ROD2; GOSUB 7120
    IF OBJ=ROD AND HERE THEN OBJ=ROD2; GOTO 5010

5190: IF (VERB=XFIND OR VERB=INVENT) AND WD2='' THEN GOTO 5010
    CRT; CRT 'I see no ':OCONV((WD1:WD1X),'MCL'):' here.'
    GOTO 2012

8:  KK=XKEY(LOC)
    NEWLOC=LOC
    IF NOT(KK) THEN CALL ADVFATAL(26)
    IF K=NULLX THEN GOTO 2
    IF K=BACK THEN GOTO 20
    IF K=LOOK THEN GOTO 30
    IF K=CAVE THEN GOTO 40
    OLDLC2=OLDLOC; OLDLOC=LOC
9:  LL=ABS(TRAVEL(KK))
    IF MOD(LL,1000)=1 OR MOD(LL,1000)=K THEN GOTO 10
    IF TRAVEL(KK)<0 THEN GOTO 50
    KK += 1
    GOTO 9

10: LL=INT(LL/1000)
11: NEWLOC=INT(LL/1000)
    K=MOD(NEWLOC,100)
    IF NEWLOC<300 THEN GOTO 13
    IF PROP(K) <> (NEWLOC/100)-3 THEN GOTO 16
12: IF TRAVEL(KK)<0 THEN CALL ADVFATAL(25)
    KK+=1
    NEWLOC=ABS(TRAVEL(KK)/1000)
    IF NEWLOC=LL THEN GOTO 12
    LL=NEWLOC
    GOTO 11

13: IF NEWLOC<=100 THEN GOTO 14
    ATT=K; GOSUB 7130
    IF PLACE(K)=-1 OR (NEWLOC>200 AND ATT) THEN GOTO 16
    GOTO 12

14: IF NEWLOC AND (RND(100)>=NEWLOC) THEN GOTO 12
16: NEWLOC=MOD(LL,1000)
    IF NEWLOC<=300 THEN GOTO 2
    IF NEWLOC<=500 THEN GOTO 30000
    IR=NEWLOC-500; GOSUB 7040
    NEWLOC=LOC
    GOTO 2

30000: NEWLOC=NEWLOC-300
    IF NEWLOC<1 OR NEWLOC>3 THEN CALL ADVFATAL(20)
    ON NEWLOC GOTO 30100,30200,30300

30100: NEWLOC=99+100-LOC
    IF NOT(HOLDNG) OR (HOLDNG=1 AND PLACE(EMRALD)=-1) THEN GOTO 2
    NEWLOC=LOC
    IR=117; GOSUB 7040
    GOTO 2

30200: WHERE=LOC
    OBJECT=EMRALD
    GOSUB 7010
    GOTO 12

30300: IF PROP(TROLL) <> 1 THEN GOTO 30310
    SKIP=1; MSG=TROLL; GOSUB 7150; PROP(TROLL)=0
    OBJECT=TROLL2; WHERE=0; GOSUB 7080
    OBJECT=TROLL2+100; WHERE=0; GOSUB 7080
    OBJECT=TROLL; WHERE=PLAC(TROLL); GOSUB 7080
    OBJECT=TROLL+100; WHERE=FIXD(TROLL); GOSUB 7080
    OBJECT=CHASM; GOSUB 7180
    NEWLOC=LOC
    GOTO 2

30310: NEWLOC=PLAC(TROLL)+FIXD(TROLL)-LOC
    IF NOT(PROP(TROLL)) THEN PROP(TROLL)=1
    IF NOT(PLACE(BEAR)=-1) THEN GOTO 2
    IR=162; GOSUB 7040
    PROP(CHASM)=1; PROP(TROLL)=2
    OBJECT=BEAR; WHERE=NEWLOC; GOSUB 7010
    FIXED(BEAR)=-1
    PROP(BEAR)=3
    IF PROP(SPICES)<0 THEN TALLY2 += 1
    OLDLC2=NEWLOC
    GOTO 99

20: K=OLDLOC
    IF COND(LOC)=2 THEN K=OLDLC2
    OLDLC2=OLDLOC; OLDLOC=LOC; K2=0
    IF K <> LOC THEN GOTO 21
    IR=91; GOSUB 7040
    GOTO 2

21: LL=MOD(ABS(TRAVEL(KK))/1000,1000)
    IF LL=K THEN GOTO 25
    IF LL>300 THEN GOTO 22
    J=XKEY(LL)
    IF COND(LL)=2 AND MOD(ABS(TRAVEL(J))/1000,1000)=K THEN K2=KK
22: IF TRAVEL(KK)<0 THEN GOTO 23
    KK+=1
    GOTO 21

23: KK=K2
    IF KK THEN GOTO 25
    IR=140
    GOSUB 7040
    GOTO 2

25: K=MOD(ABS(TRAVEL(KK)),1000)
    KK=XKEY(LOC)
    GOTO 9

30: IF DETAIL<3 THEN IR=15; GOSUB 7040
    DETAIL+=1
    WZDARK=0
    ABB(LOC)=0
    GOTO 2

40: IF LOC<8 THEN IR=57 ELSE IR=58
    GOSUB 7040
    GOTO 2

50: SPK=12
    IF (K>=43 AND K<=50) OR K=29 OR K=30 THEN SPK=9
    IF K=7 OR K=36 OR K=37 THEN SPK=10
    IF K=11 OR K=19 THEN SPK=11
    IF VERB=XFIND OR VERB=INVENT THEN SPK=59
    IF K=62 OR K=65 THEN SPK=42
    IF K=17 THEN SPK=80
    IR=SPK; GOSUB 7040
    GOTO 2

90: IR=23; GOSUB 7040
    OLDLC2=LOC
99: IF CLOSNG THEN GOTO 95
    X=81+NUMDIE*2; Y=82+NUMDIE*2; Z=203; GOSUB 7030; YES=YEA
    NUMDIE += 1
    IF NUMDIE = MAXDIE OR NOT(YES) THEN GOTO 20000
    PLACE(WATER)=0
    PLACE(OIL)=0
    IF PLACE(LAMP)=-1 THEN PROP(LAMP)=0
    FOR J=OBJECTS TO 1 STEP -1
        IF PLACE(J)=-1 THEN
            IF J=LAMP THEN WHERE=1 ELSE WHERE=OLDLC2
            OBJECT=J; GOSUB 7010
        END
    NEXT J
    LOC=3
    OLDLOC=LOC
    GOTO 2000

95: IR=131; GOSUB 7040
    NUMDIE+=1
    GOTO 20000

8000: CRT OCONV((WD1:WD1X),'MCT'):' what?'
    OBJ=0
    GOTO 2600

8010:     * 'get' with no object - ok if exactly one item present
    IF NOT(ATLOC(LOC)) THEN GOTO 8000
    IF LINK(ATLOC(LOC)) <> 0 THEN GOTO 8000
    FOR I=1 TO 5
        IF DLOC(I)=LOC AND DFLAG>=2 THEN GOTO 8000
    NEXT I
    OBJ=ATLOC(LOC)

9010: IF PLACE(OBJ)=-1 THEN GOTO 2011
    SPK=25
    IF OBJ=PLANT AND PROP(PLANT)<=0 THEN SPK=115
    IF OBJ=BEAR AND PROP(BEAR)=1 THEN SPK=169
    IF OBJ=XCHAIN AND PROP(BEAR) THEN SPK=170
    IF FIXED(OBJ) THEN GOTO 2011
    IF OBJ <> WATER AND OBJ <> OIL THEN GOTO 9017
    HERE=BOTTLE; GOSUB 7120; GOSUB 7170
    IF HERE AND LIQ=OBJ THEN GOTO 9018
    OBJ=BOTTLE
    IF PLACE(BOTTLE)=-1 AND PROP(BOTTLE)=1 THEN GOTO 9220
    IF PROP(BOTTLE) <> 1 THEN SPK=105
    IF PLACE(BOTTLE) <> -1 THEN SPK=104
    GOTO 2011

9018: OBJ=BOTTLE
9017: IF HOLDNG>=7 THEN IR=92; GOSUB 7040; GOTO 2012 
    IF OBJ=BIRD AND NOT(PROP(BIRD)) THEN
        IF PLACE(ROD)=-1 THEN IR=26; GOSUB 7040; GOTO 2012
        IF PLACE(CAGE) <> -1 THEN IR=27; GOSUB 7040; GOTO 2012
        PROP(BIRD)=1
    END
    IF (OBJ=BIRD OR OBJ=CAGE) AND PROP(BIRD) THEN OBJECT=BIRD+CAGE-OBJ; WHERE=LOC; GOSUB 7090
    OBJECT=OBJ; WHERE=LOC; GOSUB 7090
    GOSUB 7170; K=LIQ
    IF OBJ=BOTTLE AND K THEN PLACE(K)=-1
    GOTO 2009

9020: IF PLACE(ROD2) = -1 AND OBJ=ROD AND PLACE(ROD) <> -1 THEN OBJ=ROD2
    IF PLACE(OBJ) <> -1 THEN GOTO 2011
    HERE=SNAKE; GOSUB 7120
    IF OBJ=BIRD AND HERE THEN
        IR=30; GOSUB 7040
        IF CLOSED THEN GOTO 19000
        OBJECT=SNAKE; WHERE=0; GOSUB 7080
        PROP(SNAKE)=1
9021:   GOSUB 7170
        K=LIQ
        IF K=OBJ THEN OBJ=BOTTLE
        IF OBJ=BOTTLE AND K THEN PLACE(K)=0
        IF OBJ=CAGE AND PROP(BIRD) THEN OBJECT=BIRD; WHERE=LOC; GOSUB 7010
        IF OBJ=BIRD THEN PROP(BIRD)=0
        OBJECT=OBJ; WHERE=LOC; GOSUB 7010
        GOTO 2012
    END
9024: HERE=VEND; GOSUB 7120
    IF OBJ=COINS AND HERE THEN
        OBJECT=COINS; WHERE=0; GOSUB 7080
        OBJECT=BATTER; WHERE=LOC; GOSUB 7010
        MSG=BATTER; SKIP=0; GOSUB 7150
        GOTO 2012
    END
    ATT=DRAGON; GOSUB 7130
    IF OBJ=BIRD AND ATT AND NOT(PROP(DRAGON)) THEN
        IR=154; GOSUB 7040
        OBJECT=BIRD; WHERE=0; GOSUB 7080
        PROP(BIRD)=0
        IF PLACE(SNAKE) = PLAC(SNAKE) THEN TALLY2 += 1
        GOTO 2012
    END
    ATT=TROLL; GOSUB 7130
    IF OBJ=BEAR AND ATT THEN
        IR=163; GOSUB 7040
        OBJECT=TROLL; WHERE=0; GOSUB 7080
        OBJECT=TROLL+100; GOSUB 7080
        OBJECT=TROLL2; WHERE=PLAC(TROLL); GOSUB 7080
        OBJECT=TROLL2+100; WHERE=FIXD(TROLL); GOSUB 7080
        OBJECT=CHASM; GOSUB 7180
        PROP(TROLL)=2
        GOTO 9021
    END
    IF OBJ <> VASE OR LOC=PLAC(PILLOW) THEN
        IR=54; GOSUB 7040
        GOTO 9021
    END
    PROP(VASE)=2
    ATT=PILLOW; GOSUB 7130
    IF ATT THEN PROP(VASE)=0
    MSG=VASE; SKIP=PROP(VASE)+1
    GOSUB 7150
    IF PROP(VASE) THEN FIXED(VASE)=-1
    GOTO 9021

9030: OUTSTR=WD2:WD2X
    IF OUTSTR='' THEN OUTSTR=WD1:WD1X
    IF WD2 <> '' THEN WD1=WD2
    ID=WD1; INIT=-1; GOSUB 7020; I=VOCRTN
    IF I=62 OR I=65 OR I=71 OR I=2025 THEN
        WD2=''
        OBJ=0
        GOTO 2630
    END
    CRT; CRT 'okay, "':OUTSTR:'"'
    GOTO 2012

8040: SPK=28
    HERE=CLAM; GOSUB 7120; IF HERE THEN OBJ=CLAM
    HERE=OYSTER; GOSUB 7120; IF HERE THEN OBJ=OYSTER
    ATT=DOOR; GOSUB 7130; IF ATT THEN OBJ=DOOR
    ATT=GRATE; GOSUB 7130; IF ATT THEN OBJ=GRATE
    HERE=XCHAIN; GOSUB 7120
    IF OBJ AND HERE THEN GOTO 8000
    IF HERE THEN OBJ=XCHAIN
    IF NOT(OBJ) THEN GOTO 2011
9040: IF OBJ=CLAM OR OBJ=OYSTER THEN GOTO 9046
    IF OBJ=DOOR THEN SPK=111
    IF OBJ=DOOR AND PROP(DOOR)=1 THEN SPK=54
    IF OBJ=CAGE THEN SPK=32
    IF OBJ=KEYS THEN SPK=55
    IF OBJ=GRATE OR OBJ=XCHAIN THEN SPK=31
    HERE=KEYS; GOSUB 7120
    IF SPK <> 31 OR NOT(HERE) THEN GOTO 2011
    IF OBJ=XCHAIN THEN GOTO 9048
    IF NOT(CLOSNG) THEN GOTO 9043
    K=130; IF NOT(PANIC) THEN CLOCK2=15
    PANIC=1
    GOTO 2010

9043: K = 34+PROP(GRATE)
    PROP(GRATE)=1
    IF VERB = XLOCK THEN PROP(GRATE)=0
    K += 2*PROP(GRATE)
    GOTO 2010

9046: K=0
    IF OBJ=OYSTER THEN K=1
    SPK=124+K
    IF PLACE(OBJ)=-1 THEN SPK=120+K
    IF PLACE(TRIDNT) <> -1 THEN SPK=122+K
    IF VERB=XLOCK THEN SPK=61
    IF SPK <> 124 THEN GOTO 2011
    OBJECT=CLAM; WHERE=0; GOSUB 7080
    OBJECT=OYSTER; WHERE=LOC; GOSUB 7010
    OBJECT=PEARL; WHERE=105; GOSUB 7010
    GOTO 2011

9048: IF VERB=XLOCK THEN GOTO 9049
    SPK=171
    IF NOT(PROP(BEAR)) THEN SPK=41
    IF NOT(PROP(XCHAIN)) THEN SPK=37
    IF SPK <> 171 THEN GOTO 2011
    PROP(XCHAIN)=0
    FIXED(XCHAIN)=0
    IF PROP(BEAR) <> 3 THEN PROP(BEAR)=2
    FIXED(BEAR)=2-PROP(BEAR)
    GOTO 2011

9049: SPK=172
    IF PROP(XCHAIN) THEN SPK=34
    IF LOC <> PLAC(XCHAIN) THEN SPK=173
    IF SPK <> 172 THEN GOTO 2011
    PROP(XCHAIN)=2
    IF PROP(XCHAIN) = -1 THEN OBJECT=XCHAIN; WHERE=LOC; GOSUB 7010
    FIXED(XCHAIN) = -1
    GOTO 2011

9070: HERE=LAMP; GOSUB 7120
    IF NOT(HERE) THEN GOTO 2011
    SPK=184; IF LIMIT<0 THEN GOTO 2011
    PROP(LAMP)=1; IR=39; GOSUB 7040
    IF WZDARK THEN GOTO 2000
    GOTO 2012

9080: HERE=LAMP; GOSUB 7120
    IF NOT(HERE) THEN GOTO 2011
    PROP(LAMP)=0
    IR=40; GOSUB 7040
    GOSUB 7140; IF DARK THEN IR=16; GOSUB 7040
    GOTO 2012

9090: IF PLACE(OBJ) <> -1 AND (OBJ <> ROD OR PLACE(ROD2) <> -1) THEN SPK=29
    ATT=FISSUR; GOSUB 7130
    IF OBJ <> ROD OR NOT(ATT) OR PLACE(OBJ) <> -1 OR CLOSNG THEN GOTO 2011
    PROP(FISSUR) = 1-PROP(FISSUR)
    MSG=FISSUR; SKIP= 2-PROP(FISSUR); GOSUB 7150
    GOTO 2012

9120: FOR I=1 TO 5
        IF DLOC(I)=LOC AND DFLAG>=2 THEN GOTO 9122
    NEXT I
    I=0
9122: IF OBJ THEN GOTO 9124
    IF I THEN OBJ=DWARF
    HERE=SNAKE; GOSUB 7120
    IF HERE THEN OBJ = OBJ*100+SNAKE
    ATT=DRAGON; GOSUB 7130
    IF ATT AND NOT(PROP(DRAGON)) THEN OBJ = OBJ*100+DRAGON
    ATT=TROLL; GOSUB 7130
    IF ATT THEN OBJ=OBJ*100+TROLL
    HERE=BEAR; GOSUB 7120
    IF HERE AND NOT(PROP(BEAR)) THEN OBJ = OBJ*100+BEAR
    IF OBJ>100 THEN GOTO 8000
    IF OBJ THEN GOTO 9124
    HERE=BIRD; GOSUB 7120
    IF HERE AND VERB <> THROW THEN OBJ = BIRD
    HERE=CLAM; GOSUB 7120
    IF HERE THEN OBJ = OBJ*100+CLAM; GOTO 9123
    HERE=OYSTER; GOSUB 7120
    IF HERE THEN OBJ = OBJ*100+CLAM
9123: IF OBJ > 100 THEN GOTO 8000
9124: IF OBJ <> BIRD THEN GOTO 9125
    SPK=137
    IF CLOSED THEN GOTO 2011
    OBJECT=BIRD; WHERE=0; GOSUB 7080
    PROP(BIRD)=0
    IF PLACE(SNAKE)=PLAC(SNAKE) THEN TALLY2 += 1
    SPK=45
9125: IF NOT(OBJ) THEN SPK=44
    IF OBJ=CLAM OR OBJ=OYSTER THEN SPK=150
    IF OBJ=SNAKE THEN SPK=46
    IF OBJ=DWARF THEN SPK=49
    IF OBJ=DWARF AND CLOSED THEN SPK=48; GOSUB 7040; GOTO 19000
    IF OBJ=DRAGON THEN SPK=167
    IF OBJ=TROLL THEN SPK=157
    IF OBJ=BEAR THEN SPK=165+INT((PROP(BEAR)+1)/2)
    IF OBJ <> DRAGON OR PROP(DRAGON) THEN GOTO 2011
    IR=49; GOSUB 7040
    VERB=0; OBJ=0; GOSUB 7200
    IF WD1 <> 'Y' AND WD1 <> 'YES' THEN GOTO 2608
    MSG=DRAGON; SKIP=1; GOSUB 7150
    PROP(DRAGON)=2
    PROP(RUG)=0
    K=INT((PLAC(DRAGON)+FIXD(DRAGON))/2)
    OBJECT=DRAGON+100; WHERE=-1; GOSUB 7080
    OBJECT=RUG+100; WHERE=0; GOSUB 7080
    OBJECT=DRAGON; WHERE=K; GOSUB 7080
    OBJECT=RUG; WHERE=K; GOSUB 7080
    FOR OBJ=1 TO OBJECTS
        IF PLACE(OBJ)=PLAC(DRAGON) OR PLACE(OBJ)=FIXD(DRAGON) THEN OBJECT=OBJ; WHERE=K; GOSUB 7080
    NEXT I
    LOC=K
    K=NULLX
    GOTO 8

9130: IF OBJ=BOTTLE OR NOT(OBJ) THEN GOSUB 7170; OBJ=LIQ
    IF NOT(OBJ) THEN GOTO 8000
    IF PLACE(OBJ) <> -1 THEN GOTO 2011
    SPK=78
    IF OBJ <> OIL AND OBJ <> WATER THEN GOTO 2011
    PROP(BOTTLE)=1; PLACE(OBJ)=0
    SPK=77; ATT=DOOR; GOSUB 7130; IF ATT THEN GOTO 9132
    ATT=PLANT; GOSUB 7130; IF NOT(ATT) THEN GOTO 2011
    SPK=112; IF OBJ <> WATER THEN GOTO 2011
    MSG=PLANT; SKIP=PROP(PLANT)+1; GOSUB 7150
    PROP(PLANT)=MOD(PROP(PLANT)+2,6)
    PROP(PLANT2)=INT(PROP(PLANT)/2)
    K=NULLX
    GOTO 8

9132: PROP(DOOR)=0
    IF OBJ=OIL THEN PROP(DOOR)=1
    SPK=113+PROP(DOOR)
    GOTO 2011

8140: HERE=FOOD; GOSUB 7120; IF NOT(HERE) THEN GOTO 8000
8142: OBJECT=FOOD; WHERE=0; GOSUB 7080
    SPK=72
    GOTO 2011

9140: IF OBJ=FOOD THEN GOTO 8142
    IF OBJ=BIRD OR OBJ=SNAKE OR OBJ=CLAM OR OBJ=OYSTER OR OBJ=DWARF OR OBJ=DRAGON OR OBJ=TROLL OR OBJ=BEAR THEN SPK=71
    GOTO 2011

9150: LIQLOC=LOC; GOSUB 7160; HERE=BOTTLE; GOSUB 7120
    GOSUB 7170
    IF NOT(OBJ) AND LIQLOC <> WATER AND (LIQ <> WATER OR NOT(HERE)) THEN GOTO 8000
    IF OBJ AND OBJ <> WATER THEN SPK=110
    IF SPK=110 OR LIQ <> WATER OR NOT(HERE) THEN GOTO 2011
    PROP(BOTTLE)=1; PLACE(WATER)=0
    SPK=74
    GOTO 2011

9160: IF OBJ <> LAMP THEN SPK=76
    GOTO 2011

9170: IF PLACE(ROD2) = -1 AND OBJ=ROD AND PLACE(ROD) <> -1 THEN OBJ=ROD2
    IF PLACE(OBJ) <> -1 THEN GOTO 2011
    ATT=TROLL; GOSUB 7130
    IF OBJ>=50 AND OBJ<=MAXTRS AND ATT THEN GOTO 9178
    HERE=BEAR; GOSUB 7120
    IF HERE AND OBJ=FOOD THEN GOTO 9177
    IF OBJ <> AXE THEN GOTO 9020
    FOR I=1 TO 5
        IF DLOC(I)=LOC THEN GOTO 9172
    NEXT I
    SPK=152; ATT=DRAGON; GOSUB 7130
    IF ATT AND NOT(PROP(DRAGON)) THEN GOTO 9175
    SPK=158; ATT=TROLL; GOSUB 7130
    IF ATT THEN GOTO 9175
    HERE=BEAR; GOSUB 7120; IF HERE AND NOT(PROP(BEAR)) THEN GOTO 9176
    OBJ=0
    GOTO 9120

9172: SPK=48; IF RND(3) THEN
        DSEEN(I)=0; SPK=47; DKILL += 1; DLOC(I)=0
        IF DKILL=1 THEN SPK=149
    END
9175: IR=SPK; GOSUB 7040
    OBJECT=AXE; WHERE=LOC; GOSUB 7010; K=NULLX
    GOTO 8

9176: SPK=164; OBJECT=AXE; WHERE=LOC; GOSUB 7010; FIXED(AXE)=-1
    PROP(AXE)=1; OBJECT=BEAR; GOSUB 7180
    GOTO 2011

9177: OBJ=BEAR
    GOTO 9210

9178: SPK=159; OBJECT=OBJ; WHERE=0; GOSUB 7010
    OBJECT=TROLL; GOSUB 7080
    OBJECT=TROLL+100; GOSUB 7080
    OBJECT=TROLL2; WHERE=PLAC(TROLL); GOSUB 7010
    OBJECT=TROLL2+100; WHERE=FIXD(TROLL); GOSUB 7010
    OBJECT=CHASM; GOSUB 7180
    GOTO 2011

8180:     * quit
    X=22; Y=54; Z=203; GOSUB 7030; GAVEUP=YEA
    IF GAVEUP THEN GOTO 20000
    GOTO 2012

9190: ATT=OBJ; GOSUB 7130; IF ATT THEN SPK=94
    GOSUB 7170; GOSUB 7160; ATT=BOTTLE; GOSUB 7130
    IF (LIQ=OBJ AND ATT) OR K=LIQLOC THEN SPK=94
    FOR I=1 TO 5
        IF DLOC(I)=LOC AND DFLAG>=2 AND OBJ=DWARF THEN SPK=94
    NEXT I
    IF CLOSED THEN SPK=138
    IF PLACE(OBJ)=-1 THEN SPK=24
    GOTO 2011

8200: SPK=98
    FOR I=1 TO OBJECTS
        IF I=BEAR OR PLACE(I) <> -1 THEN GOTO 8201
        IF SPK=98 THEN IR=99; GOSUB 7040
        MSG=I; SKIP=-1; GOSUB 7150
        SPK=0
8201: NEXT I
    IF PLACE(BEAR)=-1 THEN SPK=141
    GOTO 2011

9210: IF OBJ <> BIRD THEN GOTO 9212
    SPK=100
    GOTO 2011

9212: IF OBJ <> SNAKE AND OBJ <> DRAGON AND OBJ <> TROLL THEN GOTO 9213
    SPK=102
    IF OBJ=DRAGON AND PROP(DRAGON) THEN SPK=110
    IF OBJ=TROLL THEN SPK=182
    HERE=BIRD; GOSUB 7120
    IF OBJ <> SNAKE OR CLOSED OR NOT(HERE) THEN GOTO 2011
    SPK=101
    OBJECT=BIRD; WHERE=0; GOSUB 7080
    PROP(BIRD)=0; TALLY2 += 1
    GOTO 2011

9213: IF OBJ <> DWARF THEN GOTO 9214
    HERE=FOOD; GOSUB 7120
    IF NOT(HERE) THEN GOTO 2011
    SPK=103; DFLAG+=1
    GOTO 2011

9214: IF OBJ <> BEAR THEN GOTO 9215
    IF NOT(PROP(BEAR)) THEN SPK=102
    IF PROP(BEAR)=3 THEN SPK=110
    HERE=FOOD; GOSUB 7120
    IF NOT(HERE) THEN GOTO 2011
    OBJECT=FOOD; WHERE=0; GOSUB 7080
    PROP(BEAR)=1; FIXED(AXE)=0; PROP(AXE)=0
    SPK=168
    GOTO 2011

9215: SPK=14
    GOTO 2011

9220: IF OBJ=VASE THEN GOTO 9222
    IF OBJ AND OBJ <> BOTTLE THEN GOTO 2011
    HERE=BOTTLE; GOSUB 7120
    IF NOT(HERE) AND NOT(OBJ) THEN GOTO 8000
    SPK=107; GOSUB 7160; IF NOT(LIQLOC) THEN SPK=106
    GOSUB 7170; IF LIQ THEN SPK=105
    IF SPK <> 107 THEN GOTO 2011
    PROP(BOTTLE) = INT(MOD(COND(LOC),4)/2)*2
    GOSUB 7170; K=LIQ
    IF PLACE(BOTTLE) = -1 THEN PLACE(K)=-1
    IF K=OIL THEN SPK=108
    GOTO 2011

9222: SPK=29
    GOSUB 7160; IF NOT(LIQLOC) THEN SPK=144
    IF NOT(LIQLOC) OR PLACE(VASE) <> -1 THEN GOTO 2011
    IR=145; GOSUB 7040
    PROP(VASE)=-1
    GOTO 9024

9230:     * boom
    IF PROP(ROD2)<0 OR NOT(CLOSED) THEN GOTO 2011
    HERE=ROD2; GOSUB 7120
    IF HERE THEN BONUS=135 ELSE IF LOC=115 THEN BONUS=134 ELSE BONUS=133
    IR=BONUS; GOSUB 7040
    GOTO 20000

8240:     * score
    SCORNG=1
    CALL ADVENT.SCORE
    CRT
    CRT "If you were to quit now, you would score ":SCORE:" out of ":MXSCOR:" points, using ":TURNS:" turns."
    TURNS -=1; LIMIT -= (PROP(LAMP)=1)
    GOTO 2012

8250:     * feefiefoefoo
    ID=WD1; INIT=3; GOSUB 7020; K=VOCRTN
    IF FOOBAR <> 1-K THEN
        IF FOOBAR THEN SPK=151 ELSE SPK=42
        GOTO 2011
    END
    FOOBAR=K
    IF K <> 4 THEN GOTO 2009
    FOOBAR=0
    IF PLACE(EGGS)=PLAC(EGGS) OR (PLACE(EGGS)=-1 AND LOC=PLAC(EGGS)) THEN SPK=42; GOTO 2011
    IF NOT(PLACE(EGGS)) AND NOT(PLACE(TROLL)) AND NOT(PROP(TROLL)) THEN PROP(TROLL)=1
    K=2; HERE=EGGS; GOSUB 7120
    IF HERE THEN K=1
    IF LOC=PLAC(EGGS) THEN K=0
    OBJECT=EGGS; WHERE=PLAC(EGGS); GOSUB 7080
    MSG=EGGS; SKIP=K; GOSUB 7150
    GOTO 2012

8270: HERE=MAGIC; GOSUB 7120
    IF HERE THEN OBJ=MAGIC
    HERE=TABLET; GOSUB 7120; IF HERE THEN OBJ=OBJ*100+TABLET
    HERE=MESSAG; GOSUB 7120; IF HERE THEN OBJ = OBJ*100+MESSAG
    IF CLOSED AND PLACE(OYSTER) THEN OBJ=OYSTER
    GOSUB 7140; IF DARK OR OBJ>100 OR NOT(OBJ) THEN GOTO 8000
9270: GOSUB 7140; IF DARK THEN GOTO 5190
    IF OBJ=MAGIC THEN SPK=190
    IF OBJ=TABLET THEN SPK=196
    IF OBJ=MESSAG THEN SPK=191
    IF OBJ=OYSTER AND HINTED(2) AND PLACE(OYSTER)=-1 THEN SPK=194
    IF OBJ <> OYSTER OR HINTED(2) OR PLACE(OYSTER) <> -1 OR NOT(CLOSED) THEN GOTO 2011
    X=192; Y=193; Z=54; GOSUB 7030; HINTED(2)=YEA
    GOTO 2012

9280:     * break/smash/shatter
    IF OBJ=MIRROR THEN SPK=148
    IF OBJ=VASE AND NOT(PROP(VASE)) THEN GOTO 9282
    IF OBJ <> MIRROR OR NOT(CLOSED) THEN GOTO 2011
    IR=197; GOSUB 7040
    GOTO 19000
9282: SPK=198
    IF PLACE(VASE)=-1 THEN OBJECT=VASE; WHERE=LOC; GOSUB 7010
    PROP(VASE)=2
    FIXED(VASE)=-1
    GOTO 2011

9290:     * wake
    IF OBJ <> DWARF OR NOT(CLOSED) THEN GOTO 2011
    IR=199; GOSUB 7040
    GOTO 19000

8300:     * save
    CRT
    CRT "Enter a name to save this game under: ":
    INPUT PARM
    IF PARM='' THEN GOTO 8300
    SCORNG=2
    CALL ADVENT.SCORE
    CALL ADVENT.SAVE          ;* will never return

8310:     * hours - for nostalgia
    CRT
    CRT 'Multivalue Adventure is open all day, everyday.'
    GOTO 2012

8260:     * brief
    ABBNUM=32767    ;* mod(abb,abbnum)=0 only first time
    DETAIL=3
    SPK=156
    GOTO 2011

8320:     * unbrief
    ABBNUM=5
    SPK=200
    GOTO 2011

8330:     * superbrief
    ABBNUM=0
    SPK=201
    GOTO 2011

8340:     * verbose
    ABBNUM=-1       ;* mod(abb,abbnum) always zero
    IR=202; GOSUB 7040
    GOTO 2000

8350:     * do - for no discernable reason
    CRT
    CRT "Do what?"
    SLEEP 1
    CRT "There is a puff of blue smoke and..."
    SLEEP 1
    CRT "the blue smoke clears away."
    GOTO 2012

8360:     * beam me up, scotty
    IF WD1X='' THEN WD1X=-1
    IF WD1X<0 THEN
        CRT LOC
        GOTO 2012
    END
    NEWLOC=WD1X
    GOTO 2

40000: ON HINT-3 GOTO 40400,40500,40600,40700,40800,40010
40010: HINTLC(HINT)=0
    X=HINTS(HINT,3); Y=0; Z=54; GOSUB 7030; YES=YEA
    IF NOT(YES) THEN GOTO 2602
    CRT; CRT "I am prepared to give you a hint, but it will cost you ":HINTS(HINT,2):' points.'
    X=175; Y=HINTS(HINT,4); Z=203; GOSUB 7030; HINTED(HINT)=YEA
    IF HINT=9 THEN TEMP=1 ELSE TEMP=25
    IF HINTED(HINT) AND LIMIT>30 THEN LIMIT+=TEMP*HINTS(HINT,2)
40020: HINTLC(HINT)=0
40030: GOTO 2602
40400: HERE=KEYS; GOSUB 7120
    IF NOT(PROP(GRATE)) AND NOT(HERE) THEN GOTO 40010
    GOTO 40020
40500: HERE=BIRD; GOSUB 7120
    IF HERE AND PLACE(ROD)=-1 AND OBJ=BIRD THEN GOTO 40010
    GOTO 40030
40600: HERE=SNAKE; GOSUB 7120; IF NOT(HERE) THEN GOTO 40020
    HERE=BIRD; GOSUB 7120; IF NOT(HERE) THEN GOTO 40010
    GOTO 40020
40700: IF NOT(ATLOC(LOC)) AND NOT(ATLOC(OLDLOC)) AND NOT(ATLOC(OLDLC2)) AND HOLDNG>1 THEN GOTO 40010
    GOTO 40020
40800: IF PROP(EMRALD) <> -1 AND PROP(PYRAM) <> -1 THEN GOTO 40010
    GOTO 40020

10000:    * closing time!
    PROP(GRATE)=0
    PROP(FISSUR)=0
    MAT DSEEN=0
    OBJECT = TROLL; WHERE=0; GOSUB 7080
    OBJECT = TROLL+100; WHERE=0; GOSUB 7080
    OBJECT = TROLL2; WHERE=PLAC(TROLL); GOSUB 7080
    OBJECT = TROLL2+100; WHERE=FIXD(TROLL2); GOSUB 7080
    OBJECT = CHASM; GOSUB 7180
    IF PROP(BEAR) <> 3 THEN OBJECT=BEAR; WHERE=0; GOSUB 7080
    PROP(XCHAIN)=0; FIXED(XCHAIN)=0
    PROP(AXE)=0; FIXED(AXE)=0
    IR=129; GOSUB 7040
    CLOCK1 = -1
    CLOSNG = 1
    GOTO 19999

11000:    * bonus section setup
    OBJECT=BOTTLE; WHERE=115; GOSUB 7080; PROP(BOTTLE)=-2
    OBJECT=PLANT; WHERE=115; GOSUB 7080; PROP(PLANT)=-1
    OBJECT=OYSTER; GOSUB 7080; PROP(OYSTER)=-1
    OBJECT=LAMP; GOSUB 7080; PROP(LAMP)=-1
    OBJECT=ROD; GOSUB 7080; PROP(ROD)=-1
    OBJECT=DWARF; GOSUB 7080; PROP(DWARF)=-1
    LOC=115; OLDLOC=115; NEWLOC=115
    FOO=-1; OBJECT=GRATE; WHERE=116; GOSUB 7080
    PROP(SNAKE)=-2; OBJECT=SNAKE; GOSUB 7080
    PROP(BIRD)=-2; OBJECT=BIRD; GOSUB 7080
    PROP(CAGE)=-1; OBJECT=CAGE; GOSUB 7080
    PROP(ROD2)=-1; OBJECT=ROD2; WHERE=116; GOSUB 7080
    PROP(MIRROR)=-1; OBJECT=MIRROR; WHERE=115; GOSUB 7080
    FIXED(MIRROR)=116
    FOR I=1 TO OBJECTS
        IF PLACE(I)=-1 THEN OBJECT=I; WHERE=0; GOSUB 7080
    NEXT I
    IR=132; GOSUB 7040
    CLOSED=1
    GOTO 2

19000: IR=136; GOSUB 7040     ;* dwarves all awaken and aren't at all happy

20000:    * bye!
    SCORNG=0
    CALL ADVENT.SCORE         ;* never to return...

7000:     *XBITSET (COND(L),N)
    IF NOT(L) THEN XBITSET=0 ELSE XBITSET=INT(MOD(COND(L)/PWR(2,N),2))
    RETURN

7010:     *DROP: PLACE AN OBJECT AT A GIVEN LOC, PREFIXING IT ONTO THE ATLOC LIST; DECR HOLDNG IF THE OBJECT WAS BEING TOTED
    IF OBJECT>100 THEN FIXED(OBJECT-100)=WHERE ELSE
        IF PLACE(OBJECT)=-1 THEN HOLDNG -= 1
        PLACE(OBJECT)=WHERE
    END
    IF WHERE <= 0 THEN RETURN
    LINK(OBJECT) = ATLOC(WHERE)
    ATLOC(WHERE) = OBJECT
    RETURN

7020:     *VOCAB (ID,INIT) WORDS ARE IN ADVENTURE FILE
    CALL ADVTEXT(ID)
    READ XID FROM ADVENTURE,ID ELSE
        IF INIT < 0 THEN
            VOCRTN=-1
            RETURN
        END ELSE
            CALL ADVFATAL(5)
        END
    END
    IF INIT < 0 THEN Z=1 ELSE Z = INIT+1
    VOCRTN = XID<Z>+0         ;* force numeric
    IF NOT(VOCRTN) THEN VOCRTN = XID<1>+0
    IF INIT > 0 THEN VOCRTN=MOD(VOCRTN,1000)
    RETURN

7030:     *YES:PROC (X,Y,Z)
    IF X THEN IR=X; GOSUB 7040
    GOSUB 7200
    IF WD1='Y' OR WD1='YES' THEN
        IF Y THEN IR=Y; GOSUB 7040
        YEA=1
        RETURN
    END
    IF WD1='N' OR WD1='NO' THEN
        IF Z THEN IR=Z; GOSUB 7040
        YEA=0
        RETURN
    END
    CRT; CRT "Please answer the question."
    GOTO 7030

7040:     *RSPEAK PROC(IR)
    IF NOT(IR) THEN RETURN
    READ OUTSTR FROM ADVENTURE,RTEXT:IR ELSE RETURN

7050: CALL ADVTEXT(OUTSTR)

*SPEAK: PROC (OUTSTR)
    IF OUTSTR='' OR OUTSTR='>$<' THEN RETURN
    CRT
    N=1
    LOOP
        X=OUTSTR<1,N>
    UNTIL X='' DO
        N+=1
        CRT X
    REPEAT
    RETURN

7080:     *MOVE: PROC (OBJECT,WHERE)
    IF OBJECT>100 THEN XFROM=FIXED(OBJECT-100) ELSE XFROM=PLACE(OBJECT)
    IF XFROM>0 AND XFROM<=300 THEN
        PARM=WHERE
        WHERE=XFROM
        GOSUB 7090
        WHERE=PARM
    END
    GOSUB 7010
    RETURN

7090:     *CARRY: PROC (OBJECT,WHERE)
    IF OBJECT <= 100 THEN
        IF PLACE(OBJECT)=-1 THEN RETURN
        PLACE(OBJECT)=-1
        HOLDNG+=1
    END
    IF ATLOC(WHERE) = OBJECT THEN
        ATLOC(WHERE)=LINK(OBJECT)
        RETURN
    END
    TEMP=ATLOC(WHERE)
7097: IF LINK(TEMP)=OBJECT THEN GOTO 7098
    TEMP=LINK(TEMP)
    GOTO 7097
7098: LINK(TEMP)=LINK(OBJECT)
    RETURN

7120:     * here - returns 1 if object is here
* here=(object at loc where we are  or  we're carrying it)
    HERE = (PLACE(HERE)=LOC) OR (PLACE(HERE)=-1)
    RETURN

7130:     * at - returns 1 if object is at this location
    ATT = (PLACE(ATT)=LOC) OR (FIXED(ATT)=LOC)
    RETURN

7140:     * dark - returns 1 if current loc is dark
* dark=not(lighted location) and (lamp ain't lit or lamp ain't here)
    HERE = LAMP; GOSUB 7120
    DARK = NOT(MOD(COND(LOC),2)) AND (NOT(PROP(LAMP)) OR NOT(HERE))
    RETURN

7150:     *PSPEAK
    OUTSTR=PTEXT<MSG>
    CALL ADVTEXT(OUTSTR)
    IF SKIP<0 THEN CRT OUTSTR<1,1>; RETURN
    N=1
    LOOP
        XID=OUTSTR<1,SKIP+2,N>
    UNTIL XID='' OR  XID='>$<' DO
        IF SPACEOUT THEN CRT; SPACEOUT=0
        CRT XID
        N+=1
    REPEAT
    RETURN

7160:     *LIQLOC
    LIQTEMP1=INT(COND(LOC)/2)
    LIQTEMP1=LIQTEMP1*2
    LIQTEMP2=INT(COND(LOC)/4)
    LIQTEMP2=INT(MOD(LIQTEMP2,2))
    LIQTEMP1=INT(MOD(LIQTEMP1,8))-5
    LIQLOC=LIQTEMP1*LIQTEMP2+1
    LIQ2TEMP=INT(LIQLOC/2)
    LIQLOC=(1-LIQLOC)*WATER+(LIQ2TEMP)*(WATER+OIL)
    RETURN

7170:     *LIQ
    IF PROP(BOTTLE) > (-1)-PROP(BOTTLE) THEN LIQ=PROP(BOTTLE) ELSE LIQ = (-1)-PROP(BOTTLE)
    LIQ2TEMP = INT(LIQ/2)
    LIQ = (1-LIQ)*WATER+(LIQ2TEMP)*(WATER+OIL)
    RETURN

7180:     *JUGGLE(OBJECT)
    WHERE = PLACE(OBJECT)
    GOSUB 7080
    WHERE = FIXED(OBJECT)
    OBJECT+=100
    GOSUB 7080
    OBJECT -= 100
    RETURN

7200:     * getin - get command line into WD1, WD1X, WD2, WD2X
    CRT
    INPUT INSTR:
    INSTR = TRIM(OCONV(TRIM(INSTR),'MCU'))        ;* mask to uppercase
    IF INSTR = '' THEN GOTO 7200 ELSE CRT
    WD1 = FIELD(INSTR,' ',1)
    WD1X = WD1[6,99]
    WD1 = WD1[1,5]
    WD2 = FIELD(INSTR,' ',2)
    IF COL2() THEN
        WD2X = WD2[6,99]
        WD2 = WD2[1,5]
    END ELSE
        WD2 = ''
        WD2X = ''
    END
    RETURN
