IMD 1.18: 12/07/2013 8:49:58  >      {#{#${ BOOTSTRA; .   -,N5#$`$0Ć0#Ė Fatal I/O Error$&%13$$x#$xx$xĖ SYSTEM.ia  7 x y#""""$7  Ԥ$&%%y%%y%&Ė#x$$x##xĖ Need & ,3 !)ռ!$$' % %%  %R* )%yxĊ)%y*%{xć+ + )xxć' )xxʋ5%ʄ !' +, %} ć% ċ;) #,U !$$' %%#++,%}%} %% % %x&&%ć&$%~ć&'#%ʇ& ʇ& ʇ& ʇ&ć&%& ć& ć& %x# )%ć%}%} { %}ć& Ċ.% %%} %}%}((%ɒ %}$ "%}$%#($ "x%$x$%xĊ $y %xć$%x 4 "Ė,PASCALSYĄ  4 ć |  xxć 2x2$ }$+ & $$$2xԤ9;9!  #x ʆ  2xć  6 ć 6$ $xĄ $x  4|zʇ ʇ 凁 zՍ $ʇ z y x y { x xx$ȇ $ʇ ć xx"3 x"%y% y%ɀx% %x Ċ$$ +INTRINS PASCAL DRIVERS DRVINFO 0$ :ā:x  7 Ōx    "8 ; <<<1<5<5<4<4<<6xx< < ; ; 46 8іJf<)  #SERIALDR1 zڟ #Ė=  FLOPPYDRL$ʉ!"!! Ā"xv# ##'#' !xڟ%'& $x %!'!x$ yĖ'ʄ %&| & " %%%Ĉ %4%% %&  &Ċ&&&y "%Z"&&&&&&$'' '$"$ɰ'ʊ '!!"0ĈĖ # (#8# ڟ $yx('"" """"  "!'x I@-@##&+*(!ɢ#Ąʄ# # )# # ' #AĊ #Q+'+$+#z$x# ܀#z $xڟDFΟ' $x $x@ &x '&$!'%&"x='&$'$&"x''ɟ'ɒ '$&"x  . .y ߇/yx'/ɐ ..zy (H&$++ $ * /x *.*! &(( Ը%*/x!*++* +(l(('&%$# ! I`=( z  O^%hAstro City Bonds  50  Bigg Corporation  1  Metro Properties  0  Pioneer Mutal  4  Oak Creek Realty  7  Standard Drilling  0  City Bus Lines  0  Tiny Auto Company  2  Uranium Mining  6  Valley Electric  3 "12 7 9 7 8 6 5 -2  11 -5 -8 "14 -6 10 8 6 4 7 6 11 13 -10 "13 10 7 5 4 3 -1 -3 -5 -8 -10 "10 -10 -5 -6 -4 3 -3 -8 -7 6 -15 "10 30 -20 -40 40 -15 45 -20 30 25 -20 "20 6 12 3 8 5 6 7 10 4 -20 "21 -19 21 16 @@@@ GAMES0B1A STOCK.DATA.TEXThSTOCK.DOC.TEXT * CHASE.TEXT H+ r*6 OTHELLO.TEXT+ z6F OTHELL1.TEXT+ zFV OTHELL2.TEXT+ zVfOTHELLINIT.TEXTfzBLACKJACK.TEXT z DEBTS.TEXT H+  STORE.DATA H+  SNOOPY.TEXTH+ ܟ REQUESTS.TEXT+ $WUMP.CAVE0.TEXTrWUMP.CAVE1.TEXTWUMP.CAVE2.TEXTCWUMP.CAVE4.TEXTCWUMP.CAVE5.TEXTC WUMPUS.TEXTH+ WWUMP.CAVE3.TEXTC TEACH.WUMPUS+ C CASTLES.DOCH+ E CASTLES.TEXT+ F@ ADVS1.TEXT H+ @H ADVS2.TEXT H+ yH^ ADVS3.TEXT H+ y^h ADVS4.TEXT H+ yhv ADVS5.TEXT H+ yv ADVS6.TEXT H+ ᢜ ADVS7.TEXT H+ -y ADVS8.TEXT H+ y ADVS9.TEXT H+ y ADVS10.TEXTH+  ADVS11.TEXTH+ syADV.TEXT0 H+  ADVINIT.TEXT+  ADVSUBS.TEXT+ j> ADVVERB.TEXT+ ɡ>B ADV.MISCINFO+ jBV ADV.DOC.TEXT+ !VmADVDATA+ | STOCK.TEXT+ L STOCK.CODEl+ L CHASE.CODEl+ L DEBTS.CODEl+ L CASTLES.CODE+ L ADVINIT.CODE+ |=ADVMSGS+ |=gADV.CODEl+ |goBLACKJACK.CODE ٤ NEW.MISCINFO+ 駂TEST.LIST.TEXT 駈NOT.IN.LIB.TEXTNOT.IN.LIB.CODE WV.UNIT.TEXT+ 駓LIB.NAMES.TEXT  TEST.LIB.TEXT @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GAMES0B1A STOCK.DATA.TEXThSTOCK.DOC.TEXT * CHASE.TEXT H+ r*6 OTHELLO.TEXT+ z6F OTHELL1.TEXT+ zFV OTHELL2.TEXT+ zVfOTHELLINIT.TEXTfzBLACKJACK.TEXT z DEBTS.TEXT H+  STORE.DATA H+  SNOOPY.TEXTH+ ܟ REQUESTS.TEXT+ $WUMP.CAVE0.TEXTrWUMP.CAVE1.TEXTWUMP.CAVE2.TEXTCWUMP.CAVE4.TEXTCWUMP.CAVE5.TEXTC WUMPUS.TEXTH+ WWUMP.CAVE3.TEXTC TEACH.WUMPUS+ C CASTLES.DOCH+ E CASTLES.TEXT+ F@ ADVS1.TEXT H+ @H ADVS2.TEXT H+ yH^ ADVS3.TEXT H+ y^h ADVS4.TEXT H+ yhv ADVS5.TEXT H+ yv ADVS6.TEXT H+ ᢜ ADVS7.TEXT H+ -y ADVS8.TEXT H+ y ADVS9.TEXT H+ y ADVS10.TEXTH+  ADVS11.TEXTH+ syADV.TEXT0 H+  ADVINIT.TEXT+  ADVSUBS.TEXT+ j> ADVVERB.TEXT+ ɡ>B ADV.MISCINFO+ jBV ADV.DOC.TEXT+ !VmADVDATA+ | STOCK.TEXT+ L STOCK.CODEl+ L CHASE.CODEl+ L DEBTS.CODEl+ L CASTLES.CODE+ L ADVINIT.CODE+ |=ADVMSGS+ |=gADV.CODEl+ |goBLACKJACK.CODE ٤ NEW.MISCINFO+ 駂TEST.LIST.TEXT 駈NOT.IN.LIB.TEXTNOT.IN.LIB.CODE WV.UNIT.TEXT+ 駓LIB.NAMES.TEXT  TEST.LIB.TEXT @ AX HORIZONTAL FIELD DIMENSION} (YMAX = 14; {MAX VERTICAL FIELD DIMENSION} ( (TOP = 2; {SPACE ABOVE FIELD} (SIDE = 5; {SPACE TO LEFT OF FIELD} ( (CLRSCRN = 26;  {CLEAR SCREEN CODE}    VAR FIELD : PACKED ARRAY[0..XMAX,0..YMAX] OF CHAR; (AGAIN,PLAY : BOOLEAN; (WIN : BOOLEAN; (MI,MJ : INTEGER; {COORDINATES OF THE MAN} (R : INTEGER; {NUMBER OF ROBOTS LEFT} (RI,RJ : ARRAY[1..ROBMAX] OF INTEGER; {ROBOT COORDINATES} (RNUM : REAL; (DIFF : INTEGER; {DIFFICULTY} (IDIFF : 0..10; {INITIAL DIFFICULTY} (GAMENU : INTEGER; {GAME NUMBER} (M : CHAR; (NROB : INTEGER; {NUMBER OF ROBOTS} (WINS : INTEGER; {NUMBER OF GAMES WON}  GOODCHAR : SET OF CHAR; {GOOD CHARACTERS}  MOVES : INTEGER; {COUNT OF MOVES} (CRASH : INTEGER; {NO OF ROBOTS "CRASHED"}   FUNCTION RND(LO,HI:INTEGER):INTEGER; {RANDOM NUMBER GENERATOR}  VAR Q :REAL;  I  :INTEGER;  BEGIN "REPEAT $RNUM:=RNUM*21.182813+31.415917; $RNUM:=RNUM-TRUNC(RNUM); $I:=TRUNC(RNUM*HI); "UNTIL I>LO; "RND:=I;  END; $    PROCEDURE DOMOVE(COL,ROW:INTEGER;SYMBOL:CHAR); {DISPLAY SYMBOL AT I,J ON FIELD}  BEGIN 4 8 -10 10 -11 18 -23 "25 22 18 -14 -12 -8 10 14 -18 -22 -25 #8 -2 7 4 3 5 4 6 -4 -4 -7  -2 26 18 23 20 17 19 11 13 14 24 !-10 16 23 28 15 21 24 18 31 -8 24 "-7 25 11 -2 15 13 17 14 1 19 23 "-9 8 12 11 7 -2 9 11 14 -1 20 "-2 -14 46 56 -20 37 -5 67 -11 9 51 "-9 21 18 19 15 23 26 15 18 25 27 "-7 14 -5 30 13 23 13 22 18 -10 38 !-16 -4 34 29 -10 19 -7 18 -14 13 33 "-4 17 15 14 12 14 15 13 10 19 18  O^ 17 September 1980   I am not aware of any portion of this program as being from another program.  Stock is a computer implementation of a bookshelf game "Stocks & Bonds" owned  and published by Avalon Hill.   The program was developed on a Heathkit (H-11) and a Southwest Technical  Products (SWTP-82) terminial using Pascal II.0.   The idiosyncrasies of the program are:   1. It is scope dependent.   2. I have no random number generator and I am simulating one from the line $clock. Therefore, there must be a line clock and it must be on.   3. It uses CHR(12), form feed, to clear the screen and home the cursor.  4. The program data is initialized from a text file named $STOCK:STOCK.DATA.TEXT   Questions can be directed to:  Homer Baker  Phoenix Union High School District  2526 W. Osborn Road  Phoenix, AZ 85017   Phone:(602) 257-3086  Home :(602) 967-0064   PROB P P1 P2 MAP MOVE M C A B 62pmO^r  PROGRAM CHASE;  CONST MAN = 'O'; {SYMBOL FOR THE MAN} (EDGE = 'I'; {SYMBOL FOR THE FENCE} (OBST = '*'; {SYMBOL FOR AN OBSTRUCTION} (ROBOT = 'R';  {SYMBOL FOR A ROBOT} (BLANK = ' '; {AN ASCII BLANK} ' (DROB = 3; {STARTING NO OF ROBOTS} (ROBMAX = 20; {MAX NO OF ROBOTS ALLOWED} (XMAX = 39; {M &FIELD[RI[L],RJ[L]]:=BLANK; &DOMOVE(RI[L],RJ[L],BLANK); &IF MI>RI[L] THEN RI[L]:=RI[L]+1; &IF MIRJ[L] THEN RJ[L]:=RJ[L]+1; &IF MJ 200 DO RNUM:=RNUM-200;  CLEARSCREEN; "WRITELN(' HOW GOOD A PLAYER ARE YOU ?'); "WRITELN; "WRITELN(' BEGINNER - B'); "WRITELN(' INTERMEDIATE - I'); "WRITELN(' EXPERT - E'); "WRITELN(' OLD PRO - P');  WRITELN; "WRITE(' TYPE IN YOUR SKILL '); "READ (SK);  WRITELN;  WHILE NOT (SK IN ['B','I','E','P']) DO "BEGIN $GOTOXY(10,10); $WRITE(' WHAT WAS THAT AGAIN PLEASE ? ',CHR(7)); $READ (SK); $WRITELN "END;  CASE SK OF $'B': IDIFF:=0; $'I': IDIFF:=1; $'E': IDIFF:=3; $'P': IDIFF:=5; "END;  END;    PROCEDURE INITIALIZE; {SET UP BLANK FIELD SURROUNDED BY FENCE}  VAR I,J:INTEGER;  BEGIN "FOR I:=0 TO XMAX DO "BEGIN $FOR J:=0 TO YMAX DO $IF((I=0) OR (I=XMAX) OR (J=0) OR (J=YMAX)) THEN FIELD[I,J]:=EDGE &ELSE FIELD[I,J]:=BLANK #END;  END; {END OF INITIALIZE}    PROCEDURE INNERFIELD; {SET UP MAN, ROBOTS AND OBSTRUCTIONS}  VAR I,J,L,POSTS:INTEGER;  BEGIN "MI:=RND(0,XMAX); MJ:=RND(0,YMAX); {LOCATE MAN AT ANY RANDOM POSITION} "FIELD[MI,MJ]:=MAN; "R:=NROB; "FOR L:=1 TO R DO {NOW DO R ROBOTS}  BEGIN $REPEAT &I:=RND(0,XMAX);J:=RND(0,YMAX); $UNTIL FIELD[I,J]=BLANK; $FIELD[I,J]:=ROBOT; " RI[L]:=I; $RJ[L]:=J "END;  POSTS:=RND(25,35); {NOW SET UP 25 TO 35 POSTS} "FOR L:=1 TO POSTS DO "BEGIN $REPEAT &IF DIFF>3 THEN &BEGIN (I:=RND(0,XMAX); (J:=RND(0,YMAX) $ END ELSE &BEGIN (I:=RND(1,XMAX-1); (J:=RND(1,YMAX-1) &END; $UNTIL FIELD[I,J]=BLANK; $FIELD[I,J]:=OBST $END;  END; {END OF INNERFIELD}    PROCEDURE MAP; {DISPLAY PLAYING FIELD}  VAR I,J:INTEGER;  BEGIN "CLEARSCREEN; "WRITELN('GAME DIFF ROBOTS WINS MOVE':79); "WRITE(' ':44,GAMENU:3,DIFF:5,R:8,WINS:10,MOVES:8); "GOTOXY(0,0); "FOR J:=0 TO YMAX DO "BEGIN $FOR I:=0 TO XMAX DO WRITE(FIELD[I,J]); " WRITELN "END; "WRITELN; "WRITELN('1 2 3 Q = QUIT'); "WRITELN('4 X 6 5 = NO MOVE'); "WRITE('7 8 9  MOVE => ');  END; {END OF MAP}   PROCEDURE MOVE; {ENTER YOUR MOVE FROM KEYBOARD}  VAR M : INTEGER;  C : CHAR;  BAD : BOOLEAN;  BEGIN "BAD:=FALSE; "REPEAT $WRITE(' ',CHR(8)); $READ (C); $IF NOT (C IN GOODCHAR) THEN $BEGIN &GOTOXY(4,21); &BAD:=TRUE; &WRITE('BAD MOVE, PLEASE TRY AGAIN ':33,CHR(7)) $END; "UNTIL (C IN GOODCHAR); "IF BAD THEN $BEGIN $ GOTOXY(4,21); &WRITE(' ':40); $ GOTOXY(10,22); $END; "IF C='Q' THEN $BEGIN %PLAY:=FALSE; %WIN:=FALSE $END; "M:=ORD(C)-48; "FIELD[MI,MJ]:=BLANK; "DOMOVE(MI,MJ,BLANK); &CASE M OF "1: BEGIN MI:=MI-1; MJ:=MJ-1 END; "2: MJ:=MJ-1; "3: BEGIN MI:=MI+1; MJ:=MJ-1 END; "4: MI:=MI-1; "5: ; "6: MI:=MI+1; "7: BEGIN MI:=MI-1; MJ:=MJ+1 END; "8: MJ:=MJ+1; "9: BEGIN MI:=MI+1; MJ:=MJ+1 END %END; "MOVES:=MOVES+1; "IF FIELD[MI,MJ] = BLANK THEN " BEGIN &DOMOVE(MI,MJ,MAN); &FIELD[MI,MJ]:=MAN " END ELSE "BEGIN $IF FIELD[MI,MJ] = EDGE THEN $BEGIN &WIN:=FALSE; &PLAY:=FALSE; &WRITELN('OUCH, YOU GOT ELECTROCUTED!') $END ELSE $BEGIN &IF FIELD[MI,MJ] = ROBOT THEN &WRITELN('THWACK! YOU RAN INTO A ROBOT (TURKEY!)') ELSE &WRITELN('ZZAP! YOU RAN INTO AN ELECTIFIED POST'); &WIN:=FALSE; &PLAY:=FALSE $END; "END;  END; {END OF MOVE PROCEDURE}    PROCEDURE ROBOTMOVE; {COMPUTE MOVE FOR R OR FEWER ROBOTS}  VAR M,L,I,J:INTEGER;  BEGIN "FOR L:=1 TO NROB DO "BEGIN $IF((RI[L]<>0) AND (WIN)) THEN $BEGIN  ove: ARRAY[1..30] OF movedesc; 4END;  position = RECORD 4border: BOOLEAN; 4corner: BOOLEAN; 4diagnexttocorner: BOOLEAN; 4incenter4by4: BOOLEAN; 4adjacentsq: ARRAY[direction] OF squareloc; 2(* "special" border squares are those border squares *) 2(* adjacent to a corner or adjacent to board midline; there *) 2(* are 2 pairs of such squares on each border. Sample pair: *) 2(* (1,2) and (1,4); for each we want a pointer to the other *) 2(* and to the border square between them (1,3). *) 4CASE specialbordersq: BOOLEAN OF 6TRUE: (otherofpair,between: squareloc); 4END;   VAR #board:  ARRAY[coordinate,coordinate] OF position; #status,crtstatus: gamestatus; #square: squareloc; #legallist: movelist; #move: movedesc; #opposdir: ARRAY[direction] OF direction; #legalmoves: ARRAY[color] OF INTEGER; #colorword: ARRAY[color] OF STRING[5]; #usercolor: color; #lastchange: REAL; (*time of last square change on crt*)    (*$I OTHELLINIT*)  (*$I OTHELL1*)  (*$I OTHELL2*)  BEGIN (*PROGRAM OTHELLO*)  REPEAT #initgame; #findlegalmoves(status,legallist); #legalmoves[white] := legallist.movecount; #REPEAT &play(white); &findlegalmoves(status,legallist); RITELN(MOVES:8); (DOMOVE(30,18,BLANK) {INPUT NEXT MOVE} &END; &MOVE; {LETS YOU MOVE} &IF(PLAY) THEN ROBOTMOVE {MOVES THE ROBOTS} $END; $GOTOXY(0,21); $WRITE('WOULD YOU LIKE TO PLAY AGAIN (Y OR N) '); " READ(M); $IF M='N' THEN AGAIN:=FALSE ELSE $BEGIN &PLAY:=TRUE; &GAMENU:=GAMENU+1; &IF WIN THEN &BEGIN (WINS:=WINS+1; (IF WINS>2 THEN DIFF:=IDIFF+1; (IF WINS>5 THEN DIFF:=IDIFF+2; $ IF WINS>8 THEN DIFF:=IDIFF+3; (IF WINS>11 THEN DIFF:=IDIFF+4; (IF WINS>15 THEN DIFF:=IDIFF+6; (IF WINS>20 THEN DIFF:=IDIFF+8; (IF WINS>30 THEN DIFF:=IDIFF+12; (NROB:=DROB+2*DIFF &END; $END; "END;  END.  A O^Rz (* COPYRIGHT (C) 1979 Software Supply. All rights reserved. *)  (*$S+*)  (* UCSD Pascal *) PROGRAM OTHELLO; (* Steve Brecher 16-Jun-79 *)   (* The position evaluation weights were derived from a FORTRAN program *)  (* headed "from Creative Computing/Klaus E Liebold/4-26-78". *)   (* This program provides playing instructions to the user on request. *)   CONST #(* The game pieces are shown on the screen as 2 rows of 3 characters, e.g. *) #(* OOO  *) #(* OOO *) #(* If your crt has a "block" character (like the cursor on some crts), that*) #(* is good for the white piece, and capital letter O is good for black, *) #(* especially if it has a rectangular shape. Otherwise, choose characters *) #(* that are centered within the character dot matrix; try to maximize the *) #(* difference in intensity between the black and white pieces while maxi- *) #(* mizing the absolute intensity of the black piece. Avoid characters with*) #(* semantic content, e.g. "W" and "B" are not so good. *) #whiteascii = 96; (*ascii value of char making up piece of first mover*) #blackascii = 79; (* " " " " " " " " 2nd " *) #minticks = 22.0; (*min # clock ticks between crt square updates *) # (*--should be long enough for a distinct, separate *) 8(*terminal bell sound on each square updated *) #spaces = ' '; # TYPE #coordinate = 1..8; #color = (white,black); #squareloc = RECORD 4CASE onboard: BOOLEAN OF 6TRUE: (row,col: coordinate); 4END; #direction = (north,south,east,west,sw,ne,se,nw); (*pairs of opposites*)  squarestatus = RECORD 4CASE occupied: BOOLEAN OF 6TRUE: (occupier: color ); 6FALSE: (adjacentpieces: ARRAY[color] OF SET of direction); 4END; #gamestatus = RECORD 4boardstatus: ARRAY[coordinate,coordinate] OF squarestatus; 4nextmover: color; 4lastmoveloc: squareloc; 4score: ARRAY[color] OF INTEGER; 4END;   movedesc = RECORD 4moveloc: squareloc; 4points: INTEGER; 4dirsflipped: SET OF direction; 4bordrsqsflipped: INTEGER; 4bordnoncorn: BOOLEAN; 4END; #movelist = RECORD 4movecount: INTEGER; 4okm /IF sq.onboard THEN BEGIN 2direcflips := 1; 2stopdirec := FALSE; 2REPEAT 5sqstatus := boardstatus[sq.row,sq.col]; 5IF sqstatus.occupied THEN 8IF sqstatus.occupier = oppcolor THEN BEGIN ;direcflips := direcflips + 1; ;sq := board[sq.row,sq.col].adjacentsq[direc]; ;END 8ELSE ;stopdirec := TRUE 5ELSE BEGIN 8direcflips := 0; 8stopdirec := TRUE; 8END; 5UNTIL ( stopdirec OR (NOT sq.onboard) ); 2IF (stopdirec AND (direcflips>0)) THEN BEGIN 5flips := flips + direcflips; 5gooddirs := gooddirs + [direc]; 5IF board[x,y].border AND board[sq.row,sq.col].border THEN 8borderflips := borderflips + direcflips; 5END; 2END; (*IF sq.onboard...*) ) END; (*IF direc IN...*) )IF flips > 0 THEN BEGIN ,movecount := movecount + 1; ,WITH okmove[movecount] DO BEGIN /moveloc.onboard := TRUE; /moveloc.row := x; /moveloc.col := y; /points := flips; /dirsflipped := gooddirs; /bordrsqsflipped := borderflips; /END; ,END; )END; (*IF possible...*) # END; (*FOR x :=...FOR y :=...*) #END; (*WITH status, legallist...*)  END; (*findlegalmoves*)   PROCEDURE inputmove(mover: color; legallist: movelist; VAR move: movedesc);  VAR #x,y: coordinate;  xch,ych: CHAR;  i,listindex: INTEGER;   c: CHAR;  BEGIN  listindex := 0;  REPEAT #REPEAT &GOTOXY(0,23); &WRITE('Enter move for ',colorword[mover],': '); &GOTOXY(22,23); &READ(xch,ych); &IF ych IN ['1'..'8'] THEN BEGIN (*Want xy but we'll accept yx*) )c := ych;&legalmoves[black] := legallist.movecount; &play(black); &findlegalmoves(status,legallist); &legalmoves[white] := legallist.movecount; &UNTIL (legalmoves[white]=0) and (legalmoves[black]=0);  UNTIL userquits;  END.  A O^Rz  FUNCTION flipof(*oldcolor: color): color*);  BEGIN  IF oldcolor = white THEN #flipof := black  ELSE #flipof := white;  END; (*flipof*)   PROCEDURE updatecrt(*VAR oldstatus,newstatus: gamestatus*);  VAR #x,y: coordinate; #direc:  direction;  square: squareloc;   PROCEDURE showpiece(square: squareloc);  &PROCEDURE changecrtsq(square: squareloc); &CONST )bell = 7; &VAR )s: PACKED ARRAY[1..3] OF CHAR; )c: CHAR; )crtline,crtcol: INTEGER; # h,l: INTEGER; & now: REAL; &BEGIN &WITH square DO BEGIN )IF newstatus.boardstatus[row,col].occupier = white THEN ,c := CHR(whiteascii) )ELSE ,c := CHR(blackascii); )FILLCHAR(s,3,c); )crtline := (3*row) - 3; )crtcol := 26 + (6*col); )END; &REPEAT )TIME(h,l); )now := l; )IF now < 0.0 THEN ,now := now + 65536.0; )now := (h*65536.0) + now; )UNTIL (now - lastchange) > minticks; &GOTOXY(crtcol,crtline); &WRITE(s); &GOTOXY(crtcol,crtline+1); &WRITE(s,CHR(bell)); &lastchange := now; &END; (*changecrtsq*) # #BEGIN (*showpiece*) #WITH square DO &IF newstatus.boardstatus[row,col].occupied THEN )IF NOT oldstatus.boardstatus[row,col].occupied THEN ,changecrtsq(square) )ELSE IF oldstatus.boardstatus[row,col].occupier <> 1newstatus.boardstatus[row,col].occupier THEN 1changecrtsq(square); #END; (*showpiece*)   BEGIN (*updatecrt*)  WITH newstatus DO BEGIN #showpiece(lastmoveloc); #FOR direc := north to nw DO BEGIN &square := lastmoveloc; &WHILE boardstatus[square.row,square.col].occupied AND ,board[square.row,square.col].adjacentsq[direc].onboard DO BEGIN )square := board[square.row,square.col].adjacentsq[direc]; )showpiece(square); )END; (*WHILE...*) &END; (*FOR direc...*)  GOTOXY(9,2); #WRITE(score[white]:2); #GOTOXY(9,3); #write(score[black]:2); #END; (*WITH newstatus...*)  GOTOXY(0,0);  END; (*updatecrt*)   PROCEDURE findlegalmoves(VAR status: gamestatus; VAR legallist: movelist);  VAR #x,y: coordinate;  sq: squareloc; #flips,direcflips: INTEGER; #borderflips: INTEGER; #stopdirec: BOOLEAN;  oppcolor: color;  direc: direction;  trydirs,gooddirs: SET OF direction;  possible: BOOLEAN; #sqstatus: squarestatus;  BEGIN  WITH status, legallist DO BEGIN #oppcolor := flipof(nextmover); #movecount := 0; #FOR x := 1 TO 8 DO FOR y := 1 TO 8 DO BEGIN &possible := FALSE; &WITH boardstatus[x,y] DO )IF NOT occupied THEN ,IF adjacentpieces[oppcolor] <> [] THEN BEGIN /possible := TRUE; & trydirs := adjacentpieces[oppcolor]; /END; &IF possible THEN BEGIN )gooddirs := []; )flips := 0; & borderflips := 0; )FOR direc := north TO nw DO ,IF direc IN trydirs THEN BEGIN /sq := board[x,y].adjacentsq[direc]; /sq := board[sq.row,sq.col].adjacentsq[direc];  WHILE okmove[i].points > baseval DO )i := i+1; &WHILE okmove[j].points < baseval DO )j := j-1; &IF i <= j THEN BEGIN )movetemp := okmove[i]; )okmove[i] := okmove[j]; )okmove[j] := movetemp; )i := i+1; )j := j-1; )END; &UNTIL i > j; #IF l < j THEN sortmoves(okmove, l, j ); #IF i < r THEN sortmoves(okmove, i, r ) #END (* sortmoves *) ;  PROCEDURE checkresponses(mover: color; VAR move: movedesc;  VAR responses: movelist; bestsofar: INTEGER);  (*$G+*) #LABEL 0; #VAR &contingent,c,r: INTEGER; &x,y: coordinate; &sq: squareloc; &direc: direction; &oppcolor: color; &afterresp:  gamestatus; &cornercounter: BOOLEAN; &respondmove: movedesc; # counterresp: movelist; #BEGIN #oppcolor := flipof(mover); #WITH move DO BEGIN &contingent := 0; &r := 1; &REPEAT )respondmove := responses.okmove[r]; )IF NOT board[moveloc.row,moveloc.col].incenter4by4 THEN ,FOR direc := north TO nw DO WITH respondmove DO /IF direc IN dirsflipped THEN WITH moveloc DO 2IF board[row,col].adjacentsq[direc] = move.moveloc THEN BEGIN 6move.points := move.points - 5; 6IF move.points <= bestsofar THEN 9EXIT(checkresponses); ) END; )afterresp := aftermove; )makemove(afterresp,respondmove,FALSE); )IF bordnoncorn THEN WITH moveloc DO  )ych := xch; )xch := c; )END; &IF ych IN ['a'..'h'] THEN )ych := CHR(ORD(ych)-32); &UNTIL ((xch IN ['1'..'8']) AND (ych IN ['A'..'H'])); #x := ORD(xch) - ORD('1') + 1; #y := ORD(ych) - ORD('A') + 1;  i := 1; #REPEAT &IF legallist.okmove[i].moveloc.row = x THEN )IF legallist.okmove[i].moveloc.col = y THEN ,listindex := i; &i := i+1; &UNTIL ((i>legallist.movecount) OR (listindex <> 0));  UNTIL listindex <> 0;  move := legallist.okmove[listindex];  END; (*inputmove*)   PROCEDURE makemove(*VAR status: gamestatus; VAR move: movedesc; updateadjacent: `BOOLEAN*);  VAR #direc,direc2: direction; #sq,sq2: squareloc;  oppcolor: color; #flips: INTEGER; #emptyneighbors: SET of direction;  BEGIN  WITH status, move DO BEGIN #lastmoveloc := moveloc; #WITH boardstatus[moveloc.row,moveloc.col] DO BEGIN &emptyneighbors := [north..nw] - adjacentpieces[white] D- adjacentpieces[black]; &occupied := TRUE; &occupier := nextmover; # END; #oppcolor := flipof(nextmover); #flips := 0; #FOR direc := north TO nw DO &IF direc IN dirsflipped THEN BEGIN )sq := board[moveloc.row,moveloc.col].adjacentsq[direc]; )REPEAT ) IF updateadjacent THEN /FOR direc2 := north TO nw DO 2IF NOT (direc2 IN [direc,opposdir[direc]]) THEN BEGIN 5sq2 := board[sq.row,sq.col].adjacentsq[direc2]; 5IF sq2.onboard THEN WITH boardstatus[sq2.row,sq2.col] DO 8IF NOT occupied THEN BEGIN ;adjacentpieces[nextmover]:=adjacentpieces[nextmover] X+ [opposdir[direc2]]; ;adjacentpieces[oppcolor]:=adjacentpieces[oppcolor] X- [opposdir[direc2]]; ;END; 5END; ,boardstatus[sq.row,sq.col].occupier := nextmover; ,flips := flips + 1; ,sq := board[sq.row,sq.col].adjacentsq[direc]; ,UNTIL boardstatus[sq.row,sq.col].occupier = nextmover;  END # ELSE # IF updateadjacent THEN ,IF direc IN emptyneighbors THEN BEGIN /sq := board[moveloc.row,moveloc.col].adjacentsq[direc]; /IF sq.onboard THEN 2WITH boardstatus[sq.row,sq.col] DO 5adjacentpieces[nextmover] := adjacentpieces[nextmover] + R[opposdir[direc]]; /END; #score[nextmover] := score[nextmover] + flips + 1; #score[oppcolor] := score[oppcolor] - flips; #nextmover := oppcolor; #END;  END; (*makemove*)   A O^Rz  PROCEDURE calcmove( mover: color; VAR status: gamestatus;  VAR legallist: movelist; VAR bestmove: movedesc);  TYPE #movearray = ARRAY[1..30] OF movedesc;  VAR #bestsofar,cornmoves,m,respcornmoves: INTEGER; #move,movetemp: movedesc; #aftermove: gamestatus; #responses: movelist;   PROCEDURE checkposition(VAR legallist: movelist; VAR cornmoves: INTEGER); #VAR &m,bestm,bestyet: INTEGER; #BEGIN #bestyet := -MAXINT; #cornmoves := 0; #FOR m := 1 TO legallist.movecount DO WITH legallist.okmove[m], Mboard[moveloc.row,moveloc.col] DO # BEGIN &bordnoncorn := FALSE; &IF incenter4by4 THEN )points := points + 10 &ELSE BEGIN )IF corner THEN BEGIN ,points := points + 60; ,cornmoves := cornmoves + 1; ,END )ELSE IF border THEN BEGIN 1bordnoncorn := TRUE; 1points := points + 25; 1END .ELSE IF diagnexttocorner THEN 6points := points - 50; )END; &IF points > bestyet THEN BEGIN )bestyet := points; )bestm := m; )end; &END; (*FOR m := 1 TO legallist.movecount...*) #movetemp := legallist.okmove[1]; #legallist.okmove[1] := legallist.okmove[bestm]; #legallist.okmove[bestm] := movetemp; #END; (*checkposition*)   PROCEDURE sortmoves(VAR okmove: movearray;  l,r: INTEGER) (*into descending order by points*) ; #VAR # i,j,baseval: INTEGER; #BEGIN #i := l; #j := r; #baseval := okmove[(i+j) DIV 2].points; #REPEAT &  (* COPYRIGHT (C) 1979 Software Supply. All rights reserved. *)  (* included file for OTHELLO *)   PROCEDURE updatecrt(VAR oldstatus,newstatus: gamestatus);  FORWARD;  FUNCTION flipof(oldcolor: color): color;  FORWARD;  PROCEDURE makemove(VAR status: gamestatus; VAR move: movedesc; updateadjacent: `BOOLEAN);  FORWARD;   SEGMENT PROCEDURE initgame;  CONST #backspace = 8;  VAR #x,y: coordinate; #direc: direction;  answer: CHAR; #h,l,h0,l0: INTEGER; (*for testing whether clock is on*)  #PROCEDURE defineboard; #BEGIN #FOR x := 1 TO 8 DO FOR y := 1 TO 8 DO WITH board[x,y] DO BEGIN &border := (x IN [1,8]) OR (y IN [1,8]); &corner := (x IN [1,8]) AND (y IN [1,8]); &incenter4by4 := (x IN [3..6]) AND (y IN [3..6]); &diagnexttocorner := (x IN [2,7]) AND (y IN [2,7]); &FOR direc := north TO nw DO WITH adjacentsq[direc] DO BEGIN )CASE direc OF ,north: onboard := x>1; ,ne: onboard := (x>1) AND (y<8); ,east: onboard := y<8; ,se: onboard := (x<8) AND (y<8); ,south: onboard := x<8; ,sw: onboard := (x<8) AND (y>1); ,west: onboard := y>1; ,nw: onboard := (x>1) AND (y>1); ,END; (*CASE*) )IF onboard THEN BEGIN ,CASE direc OF /north,ne,nw: row := x-1; /east,west: row := x; /south,se,sw: row := x+1; /END; ,CASE direc OF /nw,west,sw: col := y-1; /north,south: col := y; /ne,east,se: col := y+1; /END; ,END; )END; (*FOR direc...WITH adjacentsq...*) &specialbordersq := border AND (NOT corner) AND <( (x I,IF afterresp.boardstatus[row,col].occupier = oppcolor THEN BEGIN /bordnoncorn := FALSE; /points := points - 65; (*40, plus the 25 given in checkposition*) /IF points <= bestsofar THEN 2EXIT(checkresponses); /END ) ELSE /contingent := contingent + 8*respondmove.bordrsqsflipped; )WITH respondmove.moveloc DO ,IF board[row,col].corner THEN BEGIN /points := points - 55; /IF cornmoves > 1 THEN 2IF board[moveloc.row,moveloc.col].corner THEN 5points := points -20; /IF points <= bestsofar THEN 2EXIT(checkresponses); /END; )FOR x:=1 TO 8 DO FOR y:=1 TO 8 DO WITH afterresp.boardstatus[x,y] DO ,IF occupied THEN /IF occupier = mover THEN 2FOR direc := north TO nw DO WITH afterresp DO BEGIN 5sq.row := x; 5sq.col := y; 5REPEAT 8sq := board[sq.row,sq.col].adjacentsq[direc]; 8IF NOT sq.onboard THEN ;GOTO 0; 8IF NOT boardstatus[sq.row,sq.col].occupied THEN ;GOTO 0 8UNTIL boardstatus[sq.row,sq.col].occupier = oppcolor; 5END; )makemove(afterresp,respondmove,TRUE); )findlegalmoves(afterresp,counterresp); )cornercounter := FALSE; )c := 1; )WITH counterresp DO ,WHILE ( (c <= movecount) AND (NOT cornercounter) ) DO BEGIN /WITH okmove[c].moveloc DO 2IF board[row,col].corner THEN 5cornercounter := TRUE; /c := c + 1; /END; )IF NOT cornercounter THEN BEGIN ,points := points -190;  IF points <= bestsofar THEN /EXIT(checkresponses);  END;  0: )IF afterresp.score[mover] = 0 THEN BEGIN ,points := -MAXINT+1; (*might be our only choice, so +1*) ,EXIT(checkresponses); ,END; )r := r + 1; )UNTIL r > responses.movecount; &IF bordnoncorn THEN BEGIN )points := points - contingent; )WITH board[moveloc.row,moveloc.col] DO ,IF specialbordersq THEN WITH otherofpair, Istatus.boardstatus[row,col] DO /IF occupied THEN 2IF occupier = mover THEN 5WITH status.boardstatus[between.row,between.col] DO 8IF NOT occupied THEN ;points := points - 90; )END;  END; (*WITH move...*) #END; (*checkresponses*) #  BEGIN (*calcmove*)  GOTOXY(0,23);  WRITE('Calculating move for ',colorword[mover],'...');  checkposition(legallist,cornmoves);  IF legallist.movecount > 2 THEN  sortmoves(legallist.okmove,2,legallist.movecount);  bestsofar := -MAXINT;  FOR m := 1 TO legallist.movecount DO BEGIN #move := legallist.okmove[m]; #aftermove := status; #makemove(aftermove,move,TRUE); #findlegalmoves(aftermove,responses); #WITH move DO BEGIN &IF responses.movecount = 0 THEN )points := points + 100 &ELSE )IF points > bestsofar THEN BEGIN ,checkposition(responses,respcornmoves); ,checkresponses(mover,move,responses,bestsofar); & END; &IF points > bestsofar THEN BEGIN )bestsofar := points; )bestmove := move; )END; &END; (*WITH move...*) #END; (*FOR m := 1 TO legallist.movecount...*)  END; (*calcmove*)   PROCEDURE play(mover: color);  BEGIN  GOTOXY(0,20+ORD(mover));  IF legalmoves[mover] > 0 THEN BEGIN #WRITE(spaces); #IF mover = usercolor THEN &inputmove(mover,legallist,move) #ELSE &calcmove(mover,status,legallist,move); #makemove(status,move,TRUE); #updatecrt(crtstatus,status); #crtstatus := status; #END  ELSE BEGIN #WRITE('(No legal moves for ',colorword[mover],')'); #status.nextmover := flipof(mover); #END;  END; (*play*)   FUNCTION userquits: BOOLEAN;  VAR #playagain: CHAR;  BEGIN  GOTOXY(0,20);  WRITELN(spaces); WRITELN(spaces); WRITELN; WRITE(spaces);  GOTOXY(0,23);  WRITE('Start a new game? (y/n): ');  READ(playagain);  userquits := NOT (playagain IN ['Y','y']);  END; (*userquits*)   A O^R ] := 'black';  END; (*initgame*)  2 1 3 ? V ?^윖N [2,4,5,7]) OR (y IN [2,4,5,7]) ); &IF specialbordersq THEN BEGIN )otherofpair.onboard := TRUE; )between.onboard := TRUE; )IF x IN [1,8] THEN BEGIN ,otherofpair.row := x; ,between.row := x; ,IF y IN [2,5] THEN BEGIN /otherofpair.col := y+2; /between.col := y+1; /END ,ELSE BEGIN /otherofpair.col := y-2; /between.col := y-1; /END; ,END )ELSE BEGIN ,otherofpair.col := y; ,between.col := y; ,IF x IN [2,5] THEN BEGIN /otherofpair.row := x+2; /between.row := x+1; /END ,ELSE BEGIN /otherofpair.row := x-2; /between.row := x-1; /END; ,END; )END; (*IF specialbordersq...*) &END; (*FOR x:= ... FOR y:= ... WITH board[x,y]...*) #END; (*defineboard*) $ #PROCEDURE showemptyboard; #CONST &vertdivs = '| | | | | | | | |'; &horzdivs = '|-----|-----|-----|-----|-----|-----|-----|-----|'; &colnames = ' A B C D E F G H '; # blanks = ' '; #VAR &gamerow : coordinate; #BEGIN #GOTOXY(0,0); #FOR gamerow := 1 TO 8 DO BEGIN &IF gamerow>1 THEN (* "IF" because no room for topmost border line *) )writeln(blanks,horzdivs); &writeln(blanks:29,gamerow,vertdivs); &writeln(blanks,vertdivs); &END; #write(blanks,colnames); #GOTOXY(4,0); #WRITELN('Score'); #WRITELN('-----------'); #WRITELN(CHR(whiteascii),'/White:'); #WRITELN(CHR(blackascii),'/Black:'); #END; (*showemptyboard*) "  PROCEDURE instructions; #VAR &i: INTEGER; #PROCEDURE page1; &BEGIN &WRITELN('A move consists of placing '); &WRITELN('one of your pieces on an '); &WRITELN('unoccupied square which is '); &WRITELN('adjacent (vertically, hori- '); &WRITELN('zontally, or diagonally) to '); &WRITELN('a square occupied by your '); &WRITELN('opponent so that a straight '); &WRITELN('line starting at your piece '); &WRITELN('and continuing in the direc-'); &WRITELN('tion of the adjacent oppon- '); &WRITELN('ent hits one of your other '); &WRITELN('pieces before hitting an un-'); &WRITELN('occupied square. All of the'); &WRITELN('opponent''s pieces which that'); &WRITELN('line crosses are converted '); &WRITELN('to become your pieces. Thus'); &WRITELN('each move "flips" at least '); &WRITELN('one opposing piece.  '); &WRITE (' (Tap space bar for more...)'); # END; (*page1*) #PROCEDURE page2; &BEGIN &WRITELN('Example: a legal move for '); &WRITELN('white on the first play '); &WRITELN('would be 3E, 4F, 6D, or 5C. '); &WRITELN('To make a move at, e.g., 3E '); &WRITELN('you may type any of: 3E, 3e,'); &WRITELN('E3, or e3. '); &WRITELN('If you have no legal move, '); &WRITELN('you must pass. The object '); &WRITELN('of the game is to end up '); &WRITELN('occupying more squares than '); &WRITELN('does your opponent. '); &WRITELN('Hints on strategy: Usually '); &WRITELN('the board position of a move'); &WRITELN('is more important than the '); &WRITELN('number of pieces it "flips".'); &WRITELN('Try to occupy the borders '); &WRITELN('(especially corners!) and '); &WRITELN('avoid giving them to your '); &WRITE ('opponent. (Tap space bar...)'); # END; (*page2*) #BEGIN (*instructions*) #GOTOXY(0,5); #WRITE('Want instructions? (y/n): '); #READ(answer); #IF NOT (answer IN ['N','n']) THEN BEGIN &GOTOXY(0,5); &page1; &READ(answer); &GOTOXY(0,5); &page2; &READ(answer); &GOTOXY(0,5); &FOR i := 5 TO 22 DO )WRITELN(spaces); &WRITE(spaces); &END #ELSE BEGIN &GOTOXY(0,5); &WRITE(spaces); &END; #END; (*instructions*) &  BEGIN (*initgame*)  lastchange := 0;  TIME(h0,l0);  defineboard;  FOR direc := north TO NW DO #IF odd(ORD(direc)) THEN  opposdir[direc] := pred(direc) #ELSE &opposdir[direc] := succ(direc);  TIME(h,l);  IF (h=h0) AND (l=l0) THEN BEGIN #GOTOXY(20,11); #WRITE('Please turn on the clock.'); #WHILE l=l0 DO &TIME(h,l); #END;  showemptyboard;  WITH status DO BEGIN #score[white] := 0; #score[black] := 0; #FOR x := 1 TO 8 DO FOR y := 1 TO 8 DO WITH boardstatus[x,y] DO BEGIN # occupied := FALSE; # adjacentpieces[white] := []; &adjacentpieces[black] := []; &END; #END;  crtstatus := status;  move.dirsflipped := [];  move.points := 0;  WITH status DO BEGIN #FOR x := 4 TO 5 DO FOR y := 4 TO 5 DO BEGIN &move.moveloc.row := x; &move.moveloc.col := y; &IF x=y THEN )nextmover := white &ELSE )nextmover := black; &makemove(status,move,TRUE); &updatecrt(crtstatus,status);  crtstatus := status; &END; (*FOR...FOR...*) #nextmover := white; #END; (*WITH status...*)  instructions;  GOTOXY(0,6);  WRITELN('White goes first -- Which');  WRITELN('color do you want to play:');  REPEAT #GOTOXY(3,8);  WRITE('W)hite or B)lack? ',CHR(backspace));  READ(answer); #UNTIL answer IN ['W','w','B','b'];  IF answer IN ['W','w'] THEN #usercolor := white  ELSE #usercolor := black;  GOTOXY (0,6);  WRITELN(spaces); WRITELN(spaces); WRITELN(spaces);  colorword[white] := 'white';  colorword[black   BEGIN !CLEREOL(XBET,YBET); !WRITE('HOUSE LIMIT IS $200.. BET LIMIT ? (Y/N) '); !READ(B); !IF B<>'N' THEN BET:=200 !ELSE "BEGIN #REPEAT #CLEREOL(XBET,YBET); #WRITE('HOUSE LIMIT IS $200.. BET PLEASE ? '); #READLN(BET); "UNTIL BET<201 !END; {REPEAT}  END; {PLAYERIN}   PROCEDURE SHOHOLE; !VAR CN:INTEGER; !BEGIN "GOTOXY(XHOLE,YHOLE); "CN:=YHOLE-YHAND0; "WRITE(CN:3,')',HOLRANK:6,' OF ',HOLSUIT); !END; {SHOHOLE} "  PROCEDURE DEAL; !VAR "K,CARD:INTEGER; !BEGIN "K:=CARDSLEFT; "CARD:=DECK[K]; "RANSUIT(CARD); "NAMECARD; "CARDSLEFT:=CARDSLEFT-1; "IF CARDSLEFT=0 THEN SHUFFLE; ! IF PERSON=PLAYER THEN HANDSIZE[1]:=HANDSIZE[1]+1 ! ELSE HANDSIZE[2]:=HANDSIZE[2]+1; !END; {DEAL}   PROCEDURE DEAL2; !VAR #C:INTEGER; !BEGIN "FOR C:=1 TO 2 DO #BEGIN $FOR PERSON:=PLAYER TO DEALER DO %BEGIN &DEAL; &SCORE; &IF (PERSON=DEALER) AND (C=1) THEN NOSHOW &ELSE SHOWHAND %END; {PERSON} #END; {FOR} !END; {DEAL2} !  PROCEDURE TEST21; !BEGIN "IF (HANDVAL[1]=21) OR (HANDVAL[2]=21) THEN  BEGIN $BJACK:=TRUE; $SHOHOLE; $IF HANDVAL[1]=HANDVAL[2] THEN %BEGIN &PUSH:=TRUE; &CLEREOL(XOVER,YOVER); &WRITE('* * DOUBLE BLACKJACK !!! - PUSH -'); $END {PUSH} #ELSE IF HANDVAL[1]=21 THEN $BEGIN $ WIN:=TRUE; %BET:=BET+BET DIV 2; %CLEREOL(XOVER,YOVER); %WRITE('* * * BLACKJACK !! - PAY 1.5 TIMES BET '); $END {PLAYERS BLACKJACK} #ELSE $BEGIN %CLEREOL(XOVER,YOVER); %WRITE('* * DEALER HAS A BLACKJACK !!'); $END; #END; {BJACK:=TRUE} "END; {TEST21 - NO BLACKJACK} "  PROCEDURE DEALPLAYPROGRAM BLACKJK; ! !{GAME OF BLACKJACK WRITTEN IN PASCAL BY T.R. STOKES} ! !CONST "XINST = 10; {VARIOUS X-Y COORDS FOR SCREEN MESSAGES} "YINST = 3; "XWIN = 11; "YWIN = 2; "XBET = 8; "YBET = 1; "XOVER = 5; "YOVER = 4; ! YHAND0= 6; {LEVEL-1 OF CARDS PLAYED} " !TYPE "VEGAS = (PLAYER,DEALER); " !VAR "DECK :ARRAY[1..52] OF INTEGER; "RANK,SUIT :INTEGER; "NAMRANK,NAMSUIT :STRING; "CARDSLEFT :INTEGER; "SEED :INTEGER; "PERSON :VEGAS; "HANDVAL :ARRAY[1..2] OF INTEGER; "NACES :ARRAY[1..2] OF INTEGER; "HANDSIZE :ARRAY[1..2] OF INTEGER; "BET,DOLLARS  :INTEGER; "BUST,BJACK,PUSH,WIN :BOOLEAN; "XPLYR,YPLYR :INTEGER; "XDELR,YDELR :INTEGER; "I,J :INTEGER; {GENERAL PURPOSE INDICES} "CARDVAL :INTEGER; "REPLY :CHAR; "CHOICE :SET OF CHAR; "XHOLE,YHOLE :INTEGER; "HOLSUIT,HOLRANK :STRING; "DBLDOWN :BOOLEAN; " "  PROCEDURE NEWSCREEN; !BEGIN "WRITE(CHR(1),CHR(12)); !END; {NEWSCREEN} !  PROCEDURE CLEARTOP; !BEGIN "GOTOXY(0,0); "WRITE(CHR(17)); {CLEAR TO END OF LINE} !END; {CLEARTOP} !  PROCEDURE CLEREOL(X,Y:INTEGER); !BEGIN  GOTOXY(X,Y); "WRITE(CHR(17)); {CLEAR TO END OF LINE} !END; {CLEREOL}   PROCEDURE CLERBOT; !BEGIN  GOTOXY(0,YPLYR); "WRITE(CHR(12)); {CLEAR TO END OF SCREEN} !END; {CLERBOT}   PROCEDURE SHUFMES; !BEGIN "CLEARTOP; "GOTOXY(5,0); "WRITE('SHUFFLING- HAVE A DRINK ON THE HOUSE.'); !END; {SHUFMES} "  FUNCTION RND:REAL; !BEGIN "RND:=SEED/32767; "SEED:=(12585*SEED+6975) MOD 32767; !END; {RND} !  PROCEDURE FRESHDECK; !BEGIN "FOR I:=1 TO 52 DO #BEGIN $DECK[I]:=I; "END; {FOR} !END; {FRESHDECK} !  PROCEDURE SHUFFLE; !VAR "TEMP,RI:INTEGER;  BEGIN "SHUFMES; "CARDSLEFT:=52; " FOR I:=1 TO 52 DO $BEGIN %TEMP:=DECK[I];  RI:=TRUNC(52*RND+1); %DECK[I]:=DECK[RI]; %DECK[RI]:=TEMP; $END; {FOR} #CLEARTOP; "END; {SHUFFLE} "  PROCEDURE NAMECARD; !BEGIN "NAMRANK:=' '; {MAKE IT ONE BYTE LONG} "NAMRANK[1]:=CHR(RANK+48); {SO THIS WILL WORK} "IF RANK=1 THEN NAMRANK:='ACE '  ELSE IF RANK>9 THEN $BEGIN %CASE RANK OF $10:NAMRANK:='10 '; $11:NAMRANK:='JACK '; $12:NAMRANK:='QUEEN'; $13:NAMRANK:='KING '; %END {RANKCASE} $END; $BEGIN %CASE SUIT OF $1:NAMSUIT:='CLUBS '; $2:NAMSUIT:='DIAMONDS'; $3:NAMSUIT:='HEARTS '; $4:NAMSUIT:='SPADES '; %END {SUITCASE} # END; #END; {NAMECARD} ! "PROCEDURE RANSUIT(CARD:INTEGER); #BEGIN %RANK:=CARD MOD 13; %IF RANK=0 THEN RANK:=13; %SUIT:=(CARD-1) DIV 13 + 1; ! END; {RANSUIT} "  PROCEDURE SETUP; !BEGIN "BUST:=FALSE; "BJACK:=FALSE; "PUSH:=FALSE; "WIN:=FALSE; "DBLDOWN:=FALSE; "XPLYR:=0; "YPLYR:=YHAND0; "XDELR:=26; "YDELR:=YHAND0; "FOR I:=1 TO 2 DO #BEGIN $HANDVAL[I]:=0; $NACES[I]:=0; # HANDSIZE[I]:=0; #END; {FOR} !END; {SETUP} ! !PROCEDURE SHOWHAND; "VAR #X,Y,CN :INTEGER; "BEGIN #CASE PERSON OF "PLAYER: #BEGIN $YPLYR:=YPLYR+1; $Y:=YPLYR; $X:=XPLYR; #END; "DEALER: #BEGIN $YDELR:=YDELR+1; $Y:=YDELR; $X:=XDELR; #END; "END; {CASE} ! NAMECARD; #GOTOXY(X,Y); #CN:=Y-YHAND0; #WRITE(CN:3,')',NAMRANK:6,' OF ',NAMSUIT); !END; {SHOWHAND} "  PROCEDURE SCORE; !VAR ANACE,NAC,CARDVAL:INTEGER;  BEGIN #CASE PERSON OF "PLAYER:I:=1; "DEALER:I:=2; " END; {CASE} !CARDVAL:=RANK; !IF RANK>10 THEN CARDVAL:=10; !IF RANK=1 THEN NACES[I]:=NACES[I]+1; !NAC:=NACES[I]; !ANACE:=0; !IF RANK=1 THEN ANACE:=1; !HANDVAL[I]:=HANDVAL[I]+CARDVAL+10*ANACE; #WHILE (HANDVAL[I]>21) AND (NAC>0) DO $BEGIN %NACES[I]:=NACES[I]-1; %HANDVAL[I]:=HANDVAL[I]-10; $END; {WHILE} !IF HANDVAL[I]>21 THEN BUST:=TRUE  END; {SCORE}   PROCEDURE PSCORE; !BEGIN "GOTOXY(XPLYR+6,YPLYR+1); "WRITE('TOTAL = ',HANDVAL[1]:3); !END; {PSCORE} !  PROCEDURE HSCORE; !BEGIN  GOTOXY(XDELR+6,YDELR+1); "WRITE('TOTAL = ',HANDVAL[2]:3); !END; {HSCORE}   PROCEDURE WINNINGS; !BEGIN "IF NOT PUSH THEN #BEGIN $IF DBLDOWN THEN BET:=BET+BET; $IF WIN THEN DOLLARS:=DOLLARS+BET $ELSE DOLLARS:=DOLLARS-BET #END; {NOT PUSH} "CLEREOL(XWIN,YWIN); "WRITE('In U.S. of A. Dollars you have $',DOLLARS); !END; {WINNINGS} !  PROCEDURE DOWHAT; !BEGIN "CLEREOL(XOVER,YOVER); "REPEAT #GOTOXY(XOVER,YOVER); #WRITE('YOUR MONEY ? '); #READ(REPLY); "UNTIL REPLY IN CHOICE; ! IF (REPLY='D') AND (HANDSIZE[1]>2) THEN " BEGIN ! CLEREOL(XINST,YINST); $WRITE('NO-NO, NOT AFTER 3 OR MORE!!'); $DOWHAT; #END; !END; {DOWHAT} !  PROCEDURE NOSHOW; !VAR CN:INTEGER; !BEGIN "YDELR:=YDELR+1; "GOTOXY(XDELR,YDELR); "CN:=YDELR-YHAND0; "WRITE(CN:3,') ?????????'); ! XHOLE:=XDELR; "YHOLE:=YDELR; ! HOLSUIT:=NAMSUIT; "HOLRANK:=NAMRANK; !END; {NOSHOW} !  PROCEDURE INSTRUCTIONS; !BEGIN "GOTOXY(XINST,YINST); "WRITE('H)it, G)ood, D)oubledown, S)plitpair'); !END; {INSTRUCTIONS} !  PROCEDURE PLAYERIN; !VAR B:CHAR;   ,' Global list of creditors');  WRITELN('P)':6,' Pay a creditor');  WRITELN('C)':6,' Correct a record');  WRITELN('A)':6,' Add a creditor');  WRITELN('L)':6,' list Late payments');  WRITELN('E)':6,' Expanded creditor info');  WRITELN('F)':6,' Figure minimum payment');  WRITELN('R)':6,' Remove a creditor');  WRITELN('T)':6,' Total all debts');  WRITELN('Q)':6,' Quit');  IF DATEISCURRENT THEN SHOWDATE "ELSE  WRITELN(' ':8,'**NOTE: FIRST COMMAND SHOULD BE -D- FOR DATE');  END; {SHOWMENU}   PROCEDURE CHOOSE; !BEGIN "WRITE(' ':5,'Choose an item from the Menu->');  REPEAT $READ(REPLY); #UNTIL REPLY IN CHOICE !END; {CHOOSE}   PROCEDURE GETDATE(VAR ADAY:DATE); !VAR M,D,Y:INTEGER; !BEGIN "DATERROR:=FALSE; "WRITE(' Enter date as MM DD YY -> '); "READLN(M,D,Y); "IF (M<1) OR (M>12) THEN DATERROR:=TRUE; "IF (D<1) OR (D>31) THEN DATERROR:=TRUE; "IF (Y<20) OR (Y>99) THEN DATERROR:=TRUE; "IF NOT DATERROR THEN #BEGIN $WITH ADAY DO %BEGIN &MM:=M; &DD:=D; &YY:=Y; &WRITELN(' ':20,MM:2,'/',DD:2,'/',YY); %END; #END {NOT ERROR} "ELSE #BEGIN " WRITELN(' ??? DATE DD/MM/YY = ',D,M,Y); $WRITELN(' PLEASE TRY AGAIN'); #END; "END; {GETDATE} " !PROCEDURE ADD; "VAR C :CHAR; &X :REAL; "BEGIN #CLRSCRN; #LAST:=LAST+1; #INDEX:=LAST; # WITH STORES[INDEX] DO %BEGIN #WRITELN; #WRITELN(' ':10,'ADDING A NEW RECORD - -'); #WRITELN; #WRITE(' ENTER STORE/CREDITOR NAME-> '); #READLN(NAME); #WRITELN(' ENTER DATE OF LAST PAYMENT'); #DATERROR:=TRUE; ER; !BEGIN ! PERSON:=PLAYER; "REPEAT #DOWHAT; $IF (REPLY='H') OR (REPLY='D') THEN %BEGIN &DEAL; &SHOWHAND; &SCORE; %END #UNTIL BUST OR (REPLY<>'H') OR (REPLY='D'); "IF BUST THEN #BEGIN $CLEREOL(XOVER,YOVER); $WRITE('YOU BUSTED WITH ',HANDVAL[1]:3); #END; {IF BUST} "IF REPLY='D' THEN DBLDOWN:=TRUE; !END; {DEALPLAYER} "  PROCEDURE DEALHOUSE; !BEGIN "PERSON:=DEALER; "SHOHOLE;  WHILE (HANDVAL[2]<17) OR ((HANDVAL[2]=17) AND (NACES[2]>0)) DO " BEGIN # DEAL; $SHOWHAND; $SCORE; #END; {WHILE} ! HSCORE; !END; {DEALHOUSE} !  PROCEDURE EVALUATE; !VAR HV:INTEGER; !BEGIN "IF BUST THEN BEGIN #WIN:=TRUE; #CLEREOL(XOVER,YOVER); #WRITE('THE HOUSE BUSTED WITH ',HANDVAL[2]:3); "END "ELSE IF HANDVAL[1]=HANDVAL[2] THEN PUSH:=TRUE "ELSE IF HANDVAL[1]>HANDVAL[2] THEN WIN:=TRUE; ! IF PUSH THEN BEGIN #CLEREOL(XOVER,YOVER); ! WRITE(' - PUSH -'); "END; ! HV:=HANDVAL[2]; "IF (NOT PUSH) AND (NOT BUST) THEN ! BEGIN $CLEREOL(XOVER,YOVER); $IF HV=21 THEN $ WRITE('DEALER HAS 21!!') %ELSE WRITE('PAY ',HV+1); #END; {NOT PUSH} !END; {EVALUATE} ! " !BEGIN {MAIN PROGRAM} "CHOICE:=['H','G','D','S']; "NEWSCREEN; "WRITE(' PLEASE ENTER A RANDOM NUMBER - '); "READLN(SEED); "FRESHDECK; "SHUFFLE; "SETUP; "INSTRUCTIONS; "PLAYERIN; "DOLLARS:=0; "REPEAT #IF BET>0 THEN BEGIN $DEAL2; $TEST21; " IF NOT BJACK THEN %BEGIN &DEALPLAYER; &PSCORE; &IF NOT BUST THEN 'BEGIN (DEALHOUSE; (EVALUATE; " END; {IF NOT BUST} &END; {NOT BJACK} $END; {BET>0} #INSTRUCTIONS; #WINNINGS; #PLAYERIN; " SETUP; #CLERBOT; "UNTIL BET<0 !END. {MAIN PROGRAM}  1 2 G M E R C L 8H(?^PROGRAM DEBTS;  {KEEPS TRACK OF ALL REVOLVING DEBTS ON DISK FILE}  {DISK FILE NAME IS STORE.DATA}   CONST !CLERSCRN=26; !CLEREOL=28; !CLEREOS=25; !FIRSTLINE=3; !FIRSTYR=70; !LASTYR=99; !  TYPE !MNTH=1..12; !DAY=1..31; !CHOICESET=SET OF CHAR; !DATE= "RECORD #YY:INTEGER; #MM:INTEGER; #DD:INTEGER; "END;  STORECARD= "RECORD #NAME:STRING; #LASTPAID:DATE; #BALANCE:REAL; #LASTPAYMENT:REAL; #MINPAYMENT:REAL; #CARRYCHARGE:REAL; #MONTHLYCOST:REAL; #TOTALCARRY:REAL; "END; !  VAR !LAST,INDEX :INTEGER; !EXISTS,DONE :BOOLEAN;  TODAY :DATE; !THISPAYMENT :REAL; !STORE :STORECARD; !STORES :ARRAY[1..30] OF STORECARD; !STORAL :FILE OF STORECARD; !DATEISCURRENT :BOOLEAN; !CHOICE :CHOICESET; !REPLY :CHAR; !DATERROR :BOOLEAN; !   PROCEDURE CLRSCRN; !BEGIN "WRITE(CHR(CLERSCRN)); !END; !  PROCEDURE CLRFROM(LINE:INTEGER); !BEGIN "GOTOXY(0,LINE); "WRITE(CHR(CLEREOS)); !END;   PROCEDURE CLREOL(LINE:INTEGER); !BEGIN "GOTOXY(0,LINE); "WRITE(CHR(CLEREOL)); !END; !  PROCEDURE CLRTO(LINE:INTEGER); !VAR I:INTEGER; !BEGIN "FOR I:=0 TO LINE-1 DO #BEGIN $GOTOXY(0,I); $CLREOL(I); #END; {DO} !END; !  PROCEDURE SHOWDATE; !BEGIN "WRITE(' ':14); "WRITELN('TODAY IS: ',TODAY.MM,'/',TODAY.DD,'/',TODAY.YY); !END; !  PROCEDURE SHOWMENU; !BEGIN  CLRFROM(FIRSTLINE);  WRITELN('D)':6,' todays Date');  WRITELN('G)':6  #WRITE('THAT CHOICE IS NOT IN THE LIST'); "END; {ELSE}  END; {EXPOSE} !  PROCEDURE EXPAND; !VAR C:CHAR; " I:INTEGER; "BEGIN #CLRTO(FIRSTLINE); #GOTOXY(5,0); #WRITE('Do you want to step through all ? '); #READ(C); #IF C='Y' THEN $BEGIN %FOR I:=1 TO LAST DO &BEGIN 'SHOWALL(I); 'WRITE(' - - Hit a key to cont. '); 'READ(C); $ CLRSCRN; &END; {FOR} $END {'Y'} "ELSE #EXPOSE  END; {EXPAND}   PROCEDURE FIGUREMIN; !BEGIN END; !  PROCEDURE TOTALALL; !VAR "I  :INTEGER; "TOTALMONTH,TOTALBALANCE :REAL; "C :CHAR; !BEGIN "CLRSCRN; "TOTALMONTH:=0; "TOTALBALANCE:=0; "FOR I:=1 TO LAST DO #WITH STORES[I] DO $BEGIN %TOTALBALANCE:=TOTALBALANCE+BALANCE; %TOTALMONTH:=TOTALMONTH+MONTHLYCOST; $END; {FOR-WITH} "WRITELN; "WRITELN; "WRITELN(' Your Total balance is an incredible $ ', ,TOTALBALANCE:8:2); "WRITELN; "WRITELN(' And the total carrying charge per monthe is $ ', 0TOTALMONTH:7:2); "WRITELN; "WRITELN(' When you''ve seen enough'); $WRITE(' press a key.... '); "READ(C); ! CLRTO(FIRSTLINE); !END; {TOTALALL} "  PROCEDURE REMOVE1; !VAR I:INTEGER; %C:CHAR; !BEGIN "CLRSCRN; "GLOBALS; "CLRTO(FIRSTLINE); "GOTOXY(5,0); "WRITE('Remove which one (number) ? '); "READLN(I); "IF (I>0) AND (I<=LAST) THEN #BEGIN #WITH STORES[I] DO WRITE(' Remove ',NAME,' ? '); #READ(C); #IF C='Y' THEN ! BEGIN %LAST:=LAST-1; %FOR INDEX:=I TO LAST DO &STORES[INDEX]:=STORES[INDEX+1]; %END; {C#WHILE DATERROR DO GETDATE(LASTPAID); #WRITE(' WHAT IS THE CURRENT BALANCE? '); #READLN(BALANCE); #WRITE(' IF YOU KNOW MIN. PAYMENT, ENTER IT, ELSE ENTER 0 '); #READLN(X); #IF X=0 THEN X:=BALANCE/10.0; #MINPAYMENT:=X; #WRITE(' HOW MUCH WAS THE LAST PAYMENT? '); #READLN(LASTPAYMENT); #WRITE(' WHAT IS THE CARRYING CHARGE IN PERCENT? '); #READLN(CARRYCHARGE); #MONTHLYCOST:=BALANCE*CARRYCHARGE/100.0; #TOTALCARRY:=0; ! END; {WITH} " CLRTO(FIRSTLINE); "END; {ADD} !  PROCEDURE INFORM; !BEGIN  WRITELN(' THIS PROGRAM KEEPS PERMANENT RECORDS OF YOUR');  WRITELN('DEBTS TO STORES, ETC, THAT REQUIRE MONTHLY PAYMENTS');  WRITELN('THE DATA IS KEPT ON A FILE NAMED - STORE.DATA ');  WRITELN; !END; {INFORM} !  PROCEDURE OPENFILE; !VAR C:CHAR;  BEGIN !REWRITE(STORAL,'STORE.DATA'); !WRITELN; !WRITELN('** NEW FILE - STORE.DATA - WAS CREATED'); !INDEX:=0; !LAST:=0;  END; !  PROCEDURE REOPEN; !BEGIN "RESET(STORAL,'STORE.DATA'); "INDEX:=1; "STORES[INDEX]:=STORAL^; !WHILE NOT EOF(STORAL) DO "BEGIN #INDEX:=INDEX+1; #GET(STORAL); #STORES[INDEX]:=STORAL^; "END; {WHILE} ! INDEX:=INDEX-1; "LAST:=INDEX; !END; {REOPEN} !  PROCEDURE CLOSEFILE; !BEGIN "CLOSE(STORAL,LOCK); {CLOSE EXISTING FILE} "REWRITE(STORAL,'STORE.DATA'); {OPEN A NEW ONE} "FOR INDEX:=1 TO LAST DO #BEGIN $STORAL^:=STORES[INDEX]; $PUT(STORAL); #END; {OF INDEXING} "CLOSE(STORAL,LOCK); {MAKE IT PERMANENT ON DIR.} "DONE:=TRUE; !END; {CLOSEFILE} !  PROCEDURE INIT; !VAR C,C2:CHAR; !BEGIN "CLRSCRN; "INFORM; "DATEISCURRENT:=FALSE; "DONE:=FALSE; "CHOICE:=['D','G','P','C','A','L','E','F','R','T','Q']; "WRITELN; "WRITELN('WARNING - IF A DATA FILE DOES NOT EXIST'); "WRITELN(' (it wont on the very first run)'); "WRITELN('YOU MUST CREATE ONE BY USING THE'); "WRITELN(' A (ADD) COMMAND');  WRITE('DOES A DATA FILE EXIST (Y/N)? '); "READ(C); "IF C<>'Y' THEN #BEGIN $WRITELN; $WRITELN(' ANY EXISTING FILE WILL BE CLOBBERED!!'); " WRITE(' DO YOU WANT TO START A NEW ONE ? '); $READ(C2); $IF C2<>'Y' THEN C:='Y'; #END; "EXISTS:=FALSE; "IF C='Y' THEN EXISTS:=TRUE; "IF EXISTS THEN REOPEN #ELSE OPENFILE;  CLRSCRN;  END; {INIT}   PROCEDURE QUIT; !VAR C1,C2:CHAR; !BEGIN "CLRTO(FIRSTLINE); "GOTOXY(5,0); "WRITE(' DO YOU WANT TO QUIT (Y/N)? '); "READ(C1); "IF C1='Y' THEN #BEGIN $DONE:=TRUE; $WRITELN; $WRITE(' DO YOU WANT THIS TO BE THE NEW FILE (Y/N)? '); $READ(C2); $IF C2='Y' THEN CLOSEFILE; #END; {IF C1='Y'} !END; {QUIT} !  PROCEDURE GLOBALS; !VAR C:CHAR;  LIN:INTEGER; !BEGIN "CLRSCRN; "GOTOXY(0,FIRSTLINE); "FOR INDEX:=1 TO LAST DO #BEGIN # WITH STORES[INDEX] DO %BEGIN #LIN:=FIRSTLINE+INDEX-1; #WRITE(INDEX:3,'. '); #WRITE(NAME); #GOTOXY(18,LIN); #WRITE(BALANCE:8:2); #WITH LASTPAID DO WRITE(MM:6,'/',DD:2,'/',YY:2); #WRITE(LASTPAYMENT:8:2); #WRITELN; $END; {WITH} "END; {DO} !WRITELN('-----------------------------------------------'); !IF REPLY='G' THEN ! BEGIN #CLREOL(0); #GOTOXY(9,0); #WRITE(' Hit a key to continue'); #READ(C);  CLRTO(FIRSTLINE); "END; {REPLY='G'}  END; {GLOBALS}   PROCEDURE GETTODAY; !BEGIN "CLRTO(FIRSTLINE); "GOTOXY(0,0); "DATERROR:=TRUE; "WHILE DATERROR DO GETDATE(TODAY); "DATEISCURRENT:=TRUE;  END;  #  PROCEDURE SHOWALL(I:INTEGER); !VAR C:CHAR; #BEGIN $WITH STORES[I] DO %BEGIN &CLRSCRN; &GOTOXY(10,0);  WRITELN(I:2,') ',NAME);  WRITELN;  WRITE('Date of last payment :............. ');  WITH LASTPAID DO WRITELN(MM:2,'/',DD:2,'/',YY:2);  WRITELN;  WRITELN('Total balance due = $........... ',BALANCE:8:2);  WRITELN('Amount of last payment = $...... ',LASTPAYMENT:8:2);  WRITELN('Monthly carrying charge: %...... ',CARRYCHARGE:8:2);  WRITELN('Monthly finance charge = $...... ',MONTHLYCOST:8:2);  WRITELN('Total charges to date = $...... ',TOTALCARRY:8:2);  WRITELN('Minimum payment = $............. ',MINPAYMENT:8:2);  WRITELN; #END; {WITH} !END; {SHOWALL}   PROCEDURE PAY; !VAR I:INTEGER; %ANSWER:CHAR; !BEGIN "CLRSCRN; "GLOBALS; "GOTOXY(5,0); "WRITE('Pay who ? '); "READLN(I); "IF (I<=LAST) AND (I>0) THEN #BEGIN $SHOWALL(I); $WRITELN; $WRITE(' ':10,'Pay how much ? '); $READLN(THISPAYMENT); $WITH STORES[I] DO %BEGIN &BALANCE:=BALANCE-THISPAYMENT; &LASTPAYMENT:=THISPAYMENT; &LASTPAID:=TODAY; %END; {WITH} $SHOWALL(I); $WRITELN; $WRITE(' ':10,'ALL O.K. ? '); $READ(ANSWER); # CLRTO(FIRSTLINE); $IF ANSWER='N' THEN %BEGIN &GOTOXY(10,0); &WRITE(' USE ''C'' TO CORRECT IT'); $ END; {IF} $END {IF} "ELSE #BEGIN $GOTOXY(6,0); $WRITE('THAT NUMBER IS NOT IN THE LIST !'); #END; {IF} "END; {PAY}   {START A GROUP OF DUMMY PROCS HERE} !  PROCEDURE LATE; !BEGIN END; !  PROCEDURE EXPOSE; !VAR I:INTEGER; ! C:CHAR; !BEGIN "CLRSCRN; "GLOBALS; "GOTOXY(5,0); "WRITE('Expand which one (number) ? '); "READLN(I); "IF (I>0) AND (I<=LAST) THEN #BEGIN $SHOWALL(I); $WRITE(' - - Hit a key to cont. '); $READ(C); ! CLRTO(FIRSTLINE); #END !ELSE "BEGIN #GOTOXY(6,1);    XX  X // X XXXXXXXXXXXXXXXXXX/  X XXX// X X  X X X X X  X X X X X  X X X X X XX  X  X X X X XXX XX  X XXX X X X X X X  X X X XX X XXXX  X X XXXXXXXX\ XX XX X  XX XX X X X XX  XX XXXX XXXXXX/ X XXXX  XXX XX*** X X  XXXXXXXXXXXXX * * X X   *---* X X X  *-* * XXX X X  *- * XXX X  *- *X XXX  *- *X X XXX   *- *X X XX  *- *XX X X  * *X* X X X  * *X * X X X  * * X** X  XXXX X  * * X** XX X X  * ** X** X XX X  * ** X* XXX X X  * ** XX XXXX XXX ='Y'} ! END {IN LIST} #ELSE {NOT IN LIST} $BEGIN %CLREOL(1); ! WRITE(' THAT NUMBER IS NOT IN THE LIST!!'); $END; {ELSE) "END; {IF} !END; {REMOVE1} !  {END OF DUMMY PROCS}   PROCEDURE CORRECT; !VAR WHAT:CHAR; %WHATSIT:SET OF CHAR; %I:INTEGER; !BEGIN "WHATSIT:=['N','B','D','L','M','P','C','T','Q']; "CLRSCRN; "GLOBALS; "GOTOXY(5,0); "WRITE('Correct which record (number) ? ');  READLN(I);  IF (I>0) AND (I<=LAST) THEN " BEGIN $REPEAT %SHOWALL(I); %WRITELN('CORRECT one of the following:'); %WRITELN('N)ame,B)alance,D)ate,L)astpmnt,M)inpmnt'); %WRITELN('P)ercent,C)ost/mnth,T)otal charge,Q)uit'); %REPEAT &READ(KEYBOARD,WHAT) %UNTIL WHAT IN WHATSIT;  WITH STORES[I] DO &CASE WHAT OF $'N':BEGIN )WRITE('New Name? ');  READLN(NAME); )END; $'B':BEGIN )WRITE('New Balance= '); )READLN(BALANCE); )END; $'D':BEGIN )DATERROR:=TRUE; )WHILE DATERROR DO GETDATE(LASTPAID); )END; $'L':BEGIN )WRITE('amount of Last payment'); )READLN(LASTPAYMENT); )END; $'M':BEGIN )WRITE('Minumum payment ? '); )READLN(MINPAYMENT); )END; $'P':BEGIN )WRITE('Percent monthly carry charge ? '); )READLN(CARRYCHARGE); )END; $'C':BEGIN )WRITE('Cost per month ? '); )READLN(MONTHLYCOST); )END; $'T':BEGIN )WRITE('Total carry charge to date ? '); )READLN(TOTALCARRY); )END; $'Q':; ) END; {CASE} &UNTIL WHAT='Q'; % CLRTO(FIRSTLINE); %END {IF} #ELSE $BEGIN %GOTOXY(6,1); %WRITE('THAT NUMBER IS NOT IN THE RECORDS'); $END; {ELSE} "END; {CORRECT} )  PROCEDURE SERVE;  BEGIN #CASE REPLY OF !'D':GETTODAY; !'G':GLOBALS; !'P':PAY; !'C':CORRECT; !'A':ADD; !'L':LATE; !'E':EXPAND; !'F':FIGUREMIN; !'R':REMOVE1; !'T':TOTALALL; !'Q':QUIT; #END; {CASE} !END; {SERVE}   BEGIN {MAIN PROG} !INIT; "REPEAT #SHOWMENU; #CHOOSE; #SERVE; "UNTIL DONE  END.   SEARS (R)Aۣá "ۣáȡ ON@Hffg SEARS (E)]Z@BDEBTORSYSTEO5@HHffgX MASTER CHARGEDEBTOR, #SYSTEM.WRK.CODECode write eOh HffgBROADWAYcontinue), (terminate)++á+ á PT O6 ffgfffPENNEY'S؂ڿ؂٢٢ٟáٚUO;4ffgXMAY CO. ٚ۟áڟˡܡڢٚڢٚT xݟˡ2ݢܱOH ffgfff(TEXACO. ٚ۟áڟˡܡڢٚڢٚT xݟˡ2ݢܱB H ffg}8Q PEOPLES BANK3KL$7?  @  ?B Lx\3sGULFLES BANK3KL$7?  @  ?Cppffg~ =qO^ 1  -  - 6XXXX  X XX  X *** X XXXXX  X ***** X XXX XX  XXXX ******* XXX XXXX XX  XX X ****** XXXXXXXXX  XX XXX  XX X **** X X** X  X XX XX X X***X  X //XXXX X XXXX  X // X    )SOME REQUESTS FOR PASCAL SOFTWARE FOR THE USERS' GROUP LIBRARY  %As a programmer, what I like most is a challange that requires careful  thought to carry off, yet is of manageable size and will make a definite  contribution to the efforts of others. So I thought I'd offer you some  programming challenges:  %A. A directory program that would be called up from the Command level  (not in the filer), and display the contents of a disk in two or three  alphabetized columns in one screenful. The size of each file would be  included, and perhaps the date. Following the named files, one would list  the unutilized areas of a disk individually, by block range and size.  For example, an unused area might be indicated in the following manner:  "<400-450 empty> 51", where the "51" would line up with the blocks per file  column. A summary line at the bottom would list the total number of files and  the vacant space on the disk. To save time, you would invoke the directory of  a given disk simply by typing the unit number desired. For example, typing  "X(ecute) 4 " would produce the directory of the main disk  drive.  %B. We need a library of procedures to BLOCKREAD and BLOCKWRITE untyped  files, then CREAD (or whatever name you want) a character, LNREAD a line, and  CWRITE and LNWRITE respectively. Not only would this markedly expedite  textfile handling in the present P-code Pascals that support untyped files,  but these procedures are the ONLY way * * * XXXX X X  * * * X X X  =======******* * * X X XXXXXXXX\  * * * /XXXXX XXXXXXXX\ )  =====********** * X ) \ )  ====* * X \ \ )XXXXX  =========********** XXXXXXXXXXXXXXXXXXXXXX ( ( :Happy New Year, Red Baron! : : : JANUARY FEBRUARY MARCH 1 2 3 4 5 1 2 1 6 7 8 9 10 11 12 3 4 5 6 7 8 9  2 3 4 5 6 7 8 13 14 15 16 17 18 19 10 11 12 13 14 15 16 9 10 11 12 13 14 15 20 21 22 23 24 25 26 17 18 19 20 21 22 23 16 17 18 19 20 21 22  27 28 29 30 31 24 25 26 27 28 29 23 24 25 26 27 28 29 30 31 APRIL  MAY JUNE 1 2 3 4 5 1 2 3 1 2 3 4 5 6 7 6 7 8 9 10 11 12 4 5 6 7 8 9 10 8 9 10 11 12 13 14 13 14 15 16 17 18 19 11 12 13 14 15 16 17 15 16 17 18 19 20 21 20 21 22 23 24 25 26 18 19 20 21 22 23 24 22 23 24 25 26 27 28 27 28 29 30 25 26 27 28 29 30 31 29 30 JULY AUGUST SEPTEMBER  1 2 3 4 5 1 2 1 2 3 4 5 6 6 7 8 9 10 11 12 3 4 5 6 7 8 9 7 8 9 10 11 12 13 13 14 15 16 17 18 19 10 11 12 13 14 15 16 14 15 16 17 18 19 20 20 21 22 23 24 25 26 17 18 19 20 21 22 23 21 22 23 24 25 26 27 27 28 29 30 31 24 25 26 27 28 29 30  28 29 30 31 OCTOBER NOVEMBER DECEMBER 1 2 3 4 1  1 2 3 4 5 6 5 6 7 8 9 10 11 2 3 4 5 6 7 8 7 8 9 10 11 12 13 12 13 14 15 16 17 18 9 10 11 12 13 14 15 14 15 16 17 18 19 20  19 20 21 22 23 24 25 16 17 18 19 20 21 22 21 22 23 24 25 26 27 26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31 O^$  a Mobius Strip  20 02 03 19 01 04 01 04 05 02 03 06 03 06 07  04 05 08 05 08 09 06 07 10 07 10 11 08 09 12  09 12 13 10 11 14 11 14 15 12 13 16 12 16 17  14 15 18 15 18 19 16 17 20 02 17 20 01 18 19  to access files with the present native-  code compilers that run on micros.  %C. We need a good double-precision integer package written in Standard  Pascal to augment the present inadequate limitations of MAXINT.  %D. We need a package of input/output procedures for money (usually  represented as integer cents), so the user can type a decimal point and not  confuse the computer. A nice touch is to have the cursor stay put at the  dollar units position of the number to be entered, and have the number of  dollars grow to the left as it is typed in. Then, when the decimal point is  typed, the cursor steps to the right one character at a time as the user fills  in the cents value.  %E. Someone interested in mathematics should tackle a complex-number  package.  %F. A simple "data base system" consisting of: 1) a means to define the  names of a number of fields, 2) a way of entering/correcting data within each  field, 3) successive or random access to records, 4) a disk sort by a single  field (if you wanted multiple fields in order you'd do multiple sorts), and 5)  a key extraction program, where one would make a subfile consisting of all  the records in the main file that had one field equal to a certain value or  falling within a certain range. As an alternative to sorting the records  themselves, one could use an ISAM approach.  %Because Pascal saves textfiles as lines with dynamic length terminated by  an end-of-line character, the easiest and most space-saving way to represent  the data would be as ASCII strings. The program could be very general if the  zeroth record in a data file defined the data:   first line: Number of elements per record (in ASCII) (call it "n").  second line: Name of first element, and perhaps an ASCII code of data type.  . . . . . .  nth line: Name and type code of n-1th element.  n+1th line: Name and type code of nth element.  %Then, each successive record might begin with an ASCII record number and  the actual data of each record element, all of dynamic length. So you'd never  have to specify field width; you would simply be limited by the maximum  length of the character array or string when the data was in memory. O^rr a Dodecahedron  02 05 08 01 03 10 02 04 12 03 05 14 01 04 06  05 07 15 06 08 17 01 07 09 08 10 18 02 09 11  10 12 19 03 11 13 12 14 20 04 13 15 06 14 16  15 17 20 07 16 18 09 17 19 11 18 20 13 16 19  O^  a One Way Lattice  02 16 17 03 17 18 04 18 19 05 19 20 01 20 16  07 01 02 08 02 03 09 03 04 10 04 05 06 05 01  12 06 07 13 07 08 14 08 09 15 09 10 11 10 06  17 11 12 18 12 13 19 13 14 20 14 15 16 15 11 O^WO^CC a String of Beads  02 03 20 01 03 04 01 02 04 02 03 05 04 06 07  05 07 08 05 06 08 06 07 09 08 10 11 09 11 12  09 10 12 10 11 13 12 14 15 13 15 16 13 14 16  14 15 17 16 18 19 17 19 20 17 18 20 01 18 19 O^CCj a Dendrite with Degeneracies  01 01 05 02 02 05 03 03 06 04 04 06 01 02 07  03 04 07 05 06 10 08 09 09 08 08 10 07 09 11  10 13 14 12 13 13 11 12 12 11 15 16 14 17 18  14 19 20 15 17 17 15 18 18 16 19 19 16 20 20 O^CC ition of a line in the file, 'instruct' will pause in #* its listing of the file until the player hits the space bar. #*} $ $var &line : string; &ifile : text; &ch : char; $ $begin { instruct } &gotoxy(0,0); &write(clearline); &write('Do you want instructions on how to play? ');  ch := randomize; &writeln; &instruct := false; &if (ch <> 'y') and (ch <> 'Y') then exit(instruct); &{$I- } { turn off i/o checking } &reset(ifile,filename); &{$I+ } { turn on i/o checking } &if ioresult <> 0 then begin (writeln; (writeln('Sorry, instructions not availiable yet.'); (exit(instruct) end; &instruct := true; &gotoxy(0,1); &write(clearscreen); &while not eof(ifile) do begin; (readln(ifile,line); (if (line = '$pause') or (line = '$PAUSE') then begin *gotoxy(0,0); *write(clearline); *write('Hit to continue.'); *repeat read(keyboard,ch) until ch = ' '; *gotoxy(0,23); *writeln end (else *writeln(line) end; &end { instruct }; " "procedure getacave; $var &i : room; &j : tunnel; &k : integer; &cavename : string; &cavein : text; &ch : char; $begin &cavename := 'wump.cave'; &k := length(cavename) + 1; &cavename := concat(cavename, '$', '.text'); &writeln; &repeat (write('cave #(0-5) '); (read(ch); (writeln; (until ch in ['0'..'5']; &cavename[k] := ch; &reset(cavein,cavename); &writeln('reading ',cavename,' '); &readln(cavein, cavename); &write('.');  program wumpus;   { (This program was written by Paul J. Gilliam from the basic (programs "wumpus 1" and "wumpus 2" in "More BASIC Computer (Games", edited by David H. Ahl. The original games were (written by Gregory Yob. ( (This game will teach you how to play it. ( (Happy wumpus hunting! ( ((c) 1980 Palouse Software ( (NOTICE: (This program was the product of: , 5Palouse Software 5P.O. Box 2202 5Pullman, WA 99163 5 (Permission is hereby given to copy, modify, distribute, and in (any other way use this program, provided that this notice is not (removed from it. )  } "type $room = 1 .. 20; $tunnel = 1 .. 3; " "var $cave : array[room, tunnel] of room; $initlocate : array[1..6] of room; $seed : integer; $needhelp : boolean; $i, j, arrowcount : integer; "  {* #* The following strings can be used for control of the system console. #* The procedure "terminit" must be invoked before any of these are #* used. #*} "cursorhome, cursorup, cursordown, cursorleft, cursorright, "clearscreen, clearline, beep : string[2]; " "procedure terminit; "{* #* This routine initializes the terminal control strings #*} $ $var &esc : string[1]; $ $begin &{* initialize for TVI-920c *} &esc := ' '; esc[1] := chr(27); &cursorhome := ' '; cursorhome[1] := chr(26); &cursorup := ' '; cursorup[1] := chr(23);; &cursordown := ' '; cursordown[1] := chr(10); &cursorleft := ' '; cursorleft[1] := chr(8); &cursorright := ' '; cursorright[1] := chr(20); &clearscreen := ' '; clearscreen[1] := chr(12); &clearline := ' '; clearline[1] := chr(21); &beep := ' '; beep[1] := chr(7) &end { terminit }; "   FUNCTION RANDOM (VAR SEED : INTEGER) : REAL;  {* !* This is Algorithm A-1 from Pascal News #12 !*}  "CONST $PSHIFT = 1024; { 2 ^ 10 } $PMOD = 32; { 2 ^ 5 } $QSHIFT = 16; { 2 ^ 4 } " "VAR $A, B : &RECORD CASE BOOLEAN OF (TRUE : (I : INTEGER); (FALSE : (S : PACKED SET OF 0..15); &END; " "BEGIN " ${ EXCLUSIVE OR NUMBER AND NUMBER SHIFTED 4 PLACES } $A.I := ABS(SEED); B.I := A.I DIV QSHIFT; { RIGHT SHIFT 4 } $A.S := (A.S - B.S) + (B.S - A.S); { XOR } $ ${ EXCLUSIVE OR NUMBER AND NUMBER SHIFTED 10 PLACES LEFT } $B.I := A.I MOD PMOD * PSHIFT + A.I DIV PMOD; { CIRCULAR LEFT SHIFT 10 } $A.S := (A.S - B.S) + (B.S - A.S); $ ${ CONVERT TO REAL RESULT } $SEED := A.I; RANDOM := A.I / (1.0 + MAXINT) "END { RANDOM };   function randomize : char; "{* #* This routine will step thru random numbers until a key is pressed #* on the system console. #*} #  { The next version should work on your system, but I don't know. }  #  (* Paul Gilliam feels that this routine will work on most systems, but in #fact only a few UCSD implementations support asynchronous i/o. Apple #users and others who have implemented KEYPRESS (a machine-language #function true if a console key has been pressed) can use version B; on #systems like mine, we'll have to make do with version C, which is the only #one not commented out. #By the way, if you use version A or B, you can initialize seed with a #constant. Jim Gagne *)  (* VERSION A: ORIGINAL:*)  (*var $junk : real; $ch : char; $ "begin { randomize } $unitread(1{console}, ch, 1,,1{asynch}); $while unitbusy(1) do junk := random(seed); $randomize := ch $end { randomize }; !*) ! !(*VERSION B: USING KEYPRESS *) !(* VAR (junk: real; (ch: char; ( $BEGIN {randomize} &WHILE NOT Keypress DO junk := random (seed); &Read (ch); &randomize := ch; $END; "*) " "(*VERSION C: SYNCHRONOUS *) " VAR (junk : real; (ch: char; $BEGIN &junk := random (seed); &Read (ch); &randomize := ch; $END; !  " "function randroom : room; $begin &randroom := trunc(random(seed) * 20) + 1 &end { randroom }; & "function randtunnel : tunnel; $begin &randtunnel := trunc(random(seed) * 3) + 1 &end { randtunnel }; & "function wumpmove : integer; $var &i : integer; $begin &i := trunc(random(seed) * 4) + 1; &if i > 3 then wumpmove := -1 else wumpmove := i; &end { wumpmove }; & "function instruct(filename : string) : boolean; "{* #* This function uses the input from a file to teach the player #* how to play the game. When the string "$pause" starts in the #* first pos ,writeln('... OOPS! Bumped a Wumpus'); ,movewumpus end; *if game = inprogress then begin * if (location = locate[3]) or (location = locate[4]) then begin .writeln('YYYIIEEEE . . . Fell in a pit!'); .game := youlost end ,else if (location = locate[5]) or (location = locate[6]) then begin .writeln('ZAP -- Super bat snatch! Elsewhereville for you!'); .movefinished := false; .location := randroom end ,end *until movefinished; (end { do move }; $ $begin { huntthewumpus } &escape := chr(27); &arrowcount := 5; &for i := 1 to 6 do locate[i] := initlocate[i]; &game := inprogress; &writeln; &writeln('Hunt the Wumpus'); &writeln; &while game = inprogress do begin (warnings; (if wanttoshoot then doshot else domove; (end; &if game = youwon then (writeln('Hee Hee Hee - The Wumpus''ll getcha next time.') (else (writeln('Ha Ha Ha - You lose!'); &end { huntthewumpus }; & "function newsetup : boolean; $var &ch : char; $begin &writeln; &repeat (write('Same set-up (y-n) '); (read(ch); (writeln; (until ch in ['y', 'Y', 'n', 'N']; &newsetup := ch in ['n', 'N']; &end { newsetup }; " "function newcave : boolean; $var &ch : char; $begin &writeln; $ repeat (write('Same cave (y-n) '); (read(ch); (writeln (until ch in ['y', 'Y', 'n', 'N']; &newcave := ch in ['n', 'N']; &end { newcave }; & "function alldone : boolean; $var &ch : char; $begin &writeln; &repeat (write('Play again (y-n) '); (read&for i := 1 to 20 do begin (write('.'); (for j := 1 to 3 do read(cavein,cave[i,j]) end; &writeln; &writeln('you are in ',cavename); &writeln; &end { getacave }; " "procedure initsetup; $var &locatesunique : boolean; &i, j : integer; $begin &repeat (for i := 1 to 6 do initlocate[i] := randroom; (locatesunique := true; (i := 1; (while locatesunique and (i <= 6) do begin *j := 1; *while locatesunique and (j <= 6) do begin ,if (initlocate[i] = initlocate[j]) and (j <> i) then begin .locatesunique := false end ,else begin .j := j + 1 end ,end; *i := i + 1 end; (until locatesunique; &end { initsetup }; & "procedure HuntTheWumpus; $type &long = integer[35]; $var &i : integer; &game : (inprogress, youlost, youwon); &locate : array[1..6] of room; &escape : char; $ $procedure warnings; &var (location, i, j: integer; &begin (writeln; (location := locate[1]; (for i := 2 to 6 do begin *for j := 1 to 3 do begin ,if cave[location,j] = locate[i] then begin , case i of 02 : writeln('I smell a Wumpus!'); 03, 4: writeln('I feel a draft!'); 05, 6: writeln('Bats nearby!'); 0end .end ,end *end; (writeln('You are in Room ',location:2); (write('Tunnels lead to'); (for i := 1 to 3 do write(cave[location,i]:3); (writeln; (end { warnings }; $ $function wanttoshoot : boolean; &var (ch : char; &begin (repeat *write('Shoot or move (s-m) '); *read(keyboard,ch); *writeln; *if ch = escape then begin +game := youlost; +exit(HuntTheWumpus) end; ) if ch = 'l' then begin ,write('you = ',locate[1]); ,write(' wumpus = ',locate[2]); ,write(' pits = ',locate[3],',',locate[4]); ,write(' bats = ',locate[5],',',locate[6]); ,writeln end; *until ch in ['m', 'M', 's', 'S']; (wanttoshoot := ch in ['S', 's']; (end { wanttoshoot }; $ $procedure movewumpus; &var (i : integer; &begin (i := wumpmove; (if i > 0 then locate[2] := cave[locate[2],i]; (if locate[1] = locate[2] then begin *writeln('Tsk Tsk Tsk - Wumpus got you!'); *game := youlost end; (end { movewumpus }; $ $function lint(s : string; var l : long) : integer; &var (i, j : integer; (negitive : boolean; (ch : char; &begin (j := 0; (l := 0; (lint := -1; (negitive := false; (for i := 1 to length(s) do begin *ch := s[i]; *if ch in ['0'..'9'] then begin ,j := j + 1; ,if j > 36 then begin .lint := -2; .exit(lint) end; ,l := l * 10 + (ord(ch) - ord('0')) end *else if ch = '-' then begin ,if negitive then exit(lint) end *else exit(lint); *end; (if l > maxint *then lint := j *else lint := 0; (if negitive then l := -l; (end; $ $procedure doshot; &var (path : array[1..5] of integer; (rooms, i, j, arrow : integer; (roomok, targethit : boolean; (l : long; (ans : string; &begin ({ program the arrow } (repeat *write('No. of rooms (1-5) '); *readln(ans); *i := lint(ans, l); *rooms := trunc(l); *until (i = 0) and (rooms >= 1) and (rooms <= 5); (for i := 1 to rooms do begin *repeat ,roomok := true; ,write('Room # '); ,readln(ans); ,j := lint(ans, l); ,roomok := (j = 0) and (l > 0) and (l < 21); ,path[i] := trunc(l); ,if i > 2 then begin .if path[i] = path[i-2] then begin 0writeln('Arrows aren''t that crooked - try another room'); 0roomok := false end .end; ,if not roomok then write(beep); ,until roomok; *end; ({ shoot the arrow } (arrowcount := arrowcount - 1; (I := 1; (arrow := locate[1]; (repeat *roomok := false; *for j := 1 to 3 do begin ,if cave[arrow,j] = path[i] then roomok := true end; *if  roomok then begin ,arrow := path[i] end *else begin ,arrow := randroom end; *if arrow = locate[1] then begin ,writeln('OUCH! Arrow got YOU!'); ,game := youlost end *else if arrow = locate[2] then begin ,writeln('Aha! You got the Wumpus!'); ,game := youwon end; *i := i + 1; *until (i > rooms) or (game <> inprogress); (if (game = inprogress) and (arrowcount = 0) then begin *writeln('Out of arrows!!'); *game := youlost end; (if game = inprogress then writeln('missed'); (movewumpus; (end { doshot }; $ $procedure domove; &var (room, i, location : integer; (roomok, movefinished : boolean; (l : long; (ans : string; &begin & location := locate[1]; (repeat *write('Where to? '); *readln(ans); *roomok := false; *i := lint(ans, l); *room := trunc(l); *if i = 0 then begin ,for i := 1 to 3 do begin .if room = cave[location,i] then roomok := true end; ,if room = location then roomok := true end; *if not roomok then begin ,writeln('Not possible') end *until roomok; (location := room; (repeat *locate[1] := location; *movefinished := true; *if location = locate[2] then begin  ts nearby'  Pit - 'I feel a draft'  "Caves:  &All caves have have 20 rooms and 3 tunnels leading from one room  to other rooms. The caves are:  $pause  0 - Dodecahedron %The rooms of this cave are on a 12-sided object, each forming a pentagon.  The rooms are at the corners of the pentagons. Each room has tunnels that  lead to 3 other rooms.   1 - Mobius Strip  This cave is two rooms wide and 10 rooms around (like a belt). You will  notice that there is a half twist somewhere.   2 - String of Beads %Five beads in a circle. Each bead is a diamond with a virtical cross-  bar. The right and left corners lead to neighboring beads. (This one is  difficult to play)   3 - Toroidal Hex Network  Imagine a hex tile floor. Take a rectangle with 20 points (inter-  sections) inside (4 X 4). Join right and left sides to make a cylinder. Then  join top and bottom to form a torus (doughnut). Have fun imagining this one!   $pause  Caves 0-3 are regular in the sense that each room goes to three other rooms  and each tunnel allows two-way traffic. Caves 4 and 5 do not have these  properties.   4 - Dendrite with Degeneracies %Pull a plant from the ground. The roots and branches form a Dendrite.  There are no looping paths. Degeneracy means that some rooms connect to  themselves and some rooms have more than one tunnel to the same other room.   5 - One Way Latice (keyboard,ch); (writeln; (until ch in ['y', 'Y', 'n', 'N']; &alldone := ch in ['n', 'N']; &end { alldone }; & "begin $Write ('Type a four-digit number --> '); $Readln (seed); $terminit; $needhelp := instruct('teach.wumpus'); $repeat &getacave; &repeat (initsetup; (repeat *huntthewumpus; *until newsetup (until newcave &until alldone $end { wumpus }. O^CC a Toroidal Hex Net  19 02 03 20 01 04 01 08 05 02 19 06 03 06 07  04 05 08 05 12 09 06 03 10 07 10 11 08 09 12  09 16 13 10 07 14 11 14 15 12 13 16 13 20 17  14 11 18 15 18 19 16 17 20 17 04 01 18 15 02 J ^CC Welcome to 'Hunt the Wumpus'  %The Wumpus lives in a cave of 20 rooms. Each room has 3 tunnels leading  to other rooms. There are several caves that you can play in. With only a  small change in the program, you can even invent you own cave!   %Hazards: %  Bottomless Pits - Two rooms have bottomless pits in them. If you go there, %you fall into the pit and lose! %  Super Bats - Two rooms have super bats. If you go there, a bat grabs you and %takes to some other room at random. (which mignt be troublesome) % Wumpus:  %The Wumpus is not bothered by the hazards (he has sucker feet and is too  big for a super bat to lift). Usually he is asleep. Two things wake him up:  your entering his room or your shooting an arrow.  %If the Wumpus wakes he moves (p=.75) one room or stays still (p=.25).  After that, if he is where you are, he eats you up and you lose!  $pause  %You:  %Each turn you can move or shoot a crooked arrow. Moving: you can go one  room (thru one tunnel). Arrows: you have 5 arrow. You lose when you run  out. Each arrow can go from 1 to 5 rooms. You aim by telling the computer  the room numbers you want the arrow to go to. If the arrow can't go that way  (ie. no tunnel) it moves at random to the next room. If the arrow hits the  Wumpus, you win. If the arrow hits you, you lose.  %Warnings:  %When you are one room away from the Wumpus or a hazard, the cumputer  says:  Wumpus - 'I smell a Wumpus'  Bat - 'Ba  PROGRAM CASTLES;  {A WARGAME}   CONST CLEARSCREEN = 89;  CSPREFIX = 27;  TYPE GAME = RECORD 0PLACE : ARRAY[1..7,1..7] OF CHAR; 0POP : ARRAY[1..7,1..7] OF INTEGER; 0OWN : ARRAY[1..7,1..7] OF INTEGER; 0TROOPS : ARRAY[1..7,1..7] OF INTEGER; 0NAME : ARRAY[1..4] OF STRING[12]; 0MONEY : ARRAY[1..4] OF REAL; 0ARMY : ARRAY[1..4] OF INTEGER; 0SEQ : ARRAY[1..4] OF INTEGER; 0TAX : ARRAY[1..4] OF REAL; 0TAXBASE : ARRAY[1..4] OF INTEGER; 0CAS : ARRAY[1..4] OF INTEGER; 0PAY : ARRAY[1..4] OF REAL; 0NUMP : INTEGER; 0TURN : INTEGER; 0ROUND : INTEGER; 0PTURN : INTEGER; 0ROUNDSINTURN : INTEGER; /END; {RECORD - GAME} 0  VAR SEED : REAL; (DATA : GAME; (GAMEDATA : FILE OF GAME; (I,J,K,POSITION : INTEGER; (RESTART : BOOLEAN; (VALID : SET OF 11..77; (ANS,S,PD : STRING; (AN : CHAR; (ATLEASTONEPLAYERIN,ALLBUTONEPLAYEROUT : BOOLEAN; ( ( 0  FUNCTION RANDOM : REAL;  BEGIN (SEED := SEED * 27.182813 + 31.415917; (SEED := SEED - TRUNC(SEED); (RANDOM := SEED;  END; {RANDOM}   FUNCTION RND(LOW, HIGH : INTEGER):INTEGER;  VAR RANGE : INTEGER;  BEGIN (RANGE := HIGH - LOW + 1; (RND := TRUNC(RANDOM * RANGE + LOW);  END; {RND}   PROCEDURE SEQIT;  VAR I, J, SWAP : INTEGER;  BEGIN WITH DATA DO BEGIN  FOR I := 1 TO NUMP-1 DO (BEGIN /J := RND(I,NUMP); /SWAP := SEQ[I]; /SEQ[I] := SEQ[J]; /SEQ[J] := SWAP; (END;  END;%Here all tunnels go one way only. To return to the room you just left,  you must go all the way around the cave (only 5 moves).   GOOD LUCK - HAPPY WUMPUS HUNTING!  $pause O^EE The game is divided into camnpaigns which are further divided into rounds.   A round is made up of one move for each person.   The person who starts the round is picked at random at the beginning  of the round.   The map legend is:  "* - sparsly populated rural region "L - lake "F - forest (bad things can happen here) "S - swamp (ditto) "T - Town (more populated than * ) "C - Castle "X - Capital " !  The object of the game is to wipe your opponent off the map.   This is done by entering into warfare. The victor will be the  one who is best prepared (ie. Most armies, In the capital, etc...)   The more people in your kingdom the more taxes you can collect.  The more taxes you collect the more armies you can buy at the  end of the campaign. Armies cost $2000.00 apiece.   The syntax of a square descriptor is: ! !  Hence T12B4 is a town of 12 people held captive by warlord B with 4 armies. !  You may enter moves thusly: ! !  (the squares are designated row-column) so:   The move 12 34 5 means: move 5 armies from row 1 column 2 to row 3 column 4.   Good Luck, and may the best WARLORD win.    GS GE qO^2F R J := 1 TO 7 DO 'IF PLACE[I,J] = '*' THEN POP[I,J] := RND(1,3); 'TURN := 1; 'RESTART := FALSE;  END;  END; {WITH DATA}  END; {NEWGAME}    PROCEDURE BOARD;   VAR ROW, COL, I, J : INTEGER; PLAYER : ARRAY[1..4] OF 'A'..'D';   BEGIN WITH DATA DO BEGIN (CLEARTHESCREEN; (FOR J := 1 TO 7 DO (BEGIN 0GOTOXY(J*7,0); 0WRITE(J); (END; (FOR I := 1 TO 7 DO (BEGIN 0GOTOXY(0,I*2); 0WRITE(I); (END; (FOR I := 1 TO 7 DO FOR J := 1 TO 7 DO (BEGIN 0GOTOXY(J*7-2,I*2); 0WRITE(PLACE[I,J]); 0IF OWN[I,J] <> 0 3THEN WRITE(POP[I,J],PD[OWN[I,J]],TROOPS[I,J]) 3ELSE WRITE(' '); (END;  END;{WITH DATA} END; {BOARD}   PROCEDURE PLAY;  VAR STILLPLAYING,MOVEOK : BOOLEAN; $FROM,TX,NUMBER,PL,FI,FJ,TI,TJ,R,PT,DL,AL : INTEGER; $DF : REAL;   PROCEDURE INTEST; (VAR F,T,N :STRING; 4 (BEGIN {INTEST} 8REPEAT =GOTOXY(55,14); =READLN(ANS); =IF EOF THEN RESET(INPUT); 8UNTIL ANS <> ''; 8POSITION := 1; 8F := ''; T := ''; N := ''; 8SPLIT(F); SPLIT(T); SPLIT(N); 8CONVERT(F,FROM); 8CONVERT(T,TX); 8CONVERT(N,NUMBER); (END;{INTEST}  (PROCEDURE MERROR(ERROR : INTEGER); (VAR E : STRING[40]; ( (BEGIN +MOVEOK := FALSE; +E := 'Unidentified error. '; +CASE ERROR OF .1: E := 'INVALID FROM POSITION '; .2: E := 'INVALID TO POSITION '; .3: E := 'You have no army there. ';  END; {SEQIT}   PROCEDURE SPLIT(VAR ST : STRING);  BEGIN {SPLIT} %IF POSITION < LENGTH(ANS) THEN IF NOT(ANS[POSITION] IN ['0'..'9']) THEN %REPEAT (POSITION := POSITION + 1; %UNTIL (POSITION = LENGTH(ANS)) OR (ANS[POSITION] IN ['0'..'9']); % %IF POSITION < LENGTH(ANS) THEN IF ANS[POSITION] IN ['0'..'9'] THEN %REPEAT (ST := CONCAT(ST,COPY(ANS,POSITION,1)); (POSITION := POSITION+1; %UNTIL (NOT(ANS[POSITION] IN ['0'..'9'])) OR (POSITION = LENGTH(ANS)); % %IF POSITION <= LENGTH(ANS) THEN %BEGIN (IF ANS[POSITION] IN ['0'..'9'] THEN ST := CONCAT(ST,COPY(ANS,POSITION,1)); (POSITION := POSITION + 1; %END;  END; {SPLIT}   PROCEDURE CONVERT(VAR STR : STRING; VAR INT : INTEGER);  VAR I,L,M : INTEGER;  BEGIN {CONVERT} #L := 2; {MAXIMUM NUMBER OF DIGITS TO CONVERT - FROM LEFT} #L := LENGTH(STR) - L + 1; #IF L < 1 THEN L := 1; #M := 1; #INT := 0; #FOR I := LENGTH(STR) DOWNTO L DO #BEGIN +INT := INT + (ORD(STR[I])-48) * M; +M := M * 10; #END;  END;{CONVERT}   PROCEDURE CLEARTHESCREEN;  BEGIN (GOTOXY(0,0); (WRITELN(CHR(CSPREFIX),CHR(CLEARSCREEN));  END; {CLEARTHESCREEN}   PROCEDURE OUTMSG; !BEGIN WITH DATA DO !BEGIN "CLEARTHESCREEN; "WRITELN('THE GAME IS OVER ...........');  FOR I := 1 TO NUMP DO #BEGIN $IF ARMY[I] > 0 THEN BEGIN %WRITELN; %WRITELN; %WRITELN('WARLORD ',NAME[I],','); %WRITELN; %WRITELN('THE WAR IS OVER, BUT THE GAME HAS JUST BEGUN........'); %FOR J := 1 TO 10000 DO BEGIN END; %WRITELN; %WRITELN; %WRITELN('YOU HAVE CONQUERED THE WHOLE OF THE LAND ... '); %WRITELN; %FOR J := 1 TO 10000 DO BEGIN END; %WRITE('WARLORD'); %IF NUMP > 2 THEN WRITE('S'); %FOR J := 1 TO NUMP DO &BEGIN 'IF J<>I THEN ' BEGIN )WRITE(' '); )IF (NUMP>2) AND ((J=NUMP) OR ((J=NUMP-1) AND (I=NUMP))) THEN *WRITE('AND '); ' WRITE(NAME[J]); ( IF NUMP>3 THEN WRITE(','); (END; 'END; 'IF NUMP > 2 THEN WRITE(' HAVE') ELSE WRITE(' HAS'); 'WRITELN(' BEEN'); 'WRITELN('SUBJIGATED TO YOUR WILL AND COMMAND .............'); 'FOR J := 1 TO 10000 DO BEGIN END; 'WRITELN; 'WRITELN; 'WRITELN('IT IS UP TO YOU NOW TO THINK OF A JUST AND LASTING'); 'WRITE('REWARD FOR THE PERSON'); 'IF NUMP>2 THEN WRITE('S'); 'WRITE(' WHO '); 'IF NUMP>2 THEN WRITE('HAVE ') ELSE WRITE('HAS '); 'WRITELN('CAUSED YOU SO MMUCH GRIEF ......'); 'FOR J := 1 TO 10000 DO BEGIN END; 'WRITELN; 'WRITELN; 'WRITELN; 'WRITELN('I HOPE YOU HAVE FUN.................................'); 'WRITELN; 'EXIT(CASTLES); !END; !END; !END; !END; " "  PROCEDURE WAIT;  BEGIN (GOTOXY(39,15); (WRITE('PRESS RETURN TO CONTINUE'); (GOTOXY(55,13); (READ(ANS); (RESET(INPUT);  END;{WAIT} (  PROCEDURE NEWGAME;  VAR A,I,J,K,R : INTEGER; 'X : REAL; 'ANS : STRING[20]; ( (PROCEDURE CASTLE(IL, IH, JL, JH, P : INTEGER); (BEGIN WITH DATA DO BEGIN 0I := RND(IL,IH); J := RND(JL,JH); 0P := SEQ[P]; 0CAS[P] := I*10+J; PLACE[I,J] := 'C'; 0TROOPS[I,J] := ARMY[P]; OWN[I,J] := P; 0POP[I,J] := TRUNC(RANDOM * 3.6 + 6); ' END; {WITH DATA} (END; {CASTLE PROCEDURE}   PROCEDURE RAND; (BEGIN I := RND(1,7); J := RND(1,7); (END; {RAND} (  BEGIN {NEWGAME} WITH DATA DO BEGIN #CLEARTHESCREEN; #GOTOXY(20,5); #WRITE('Do you want to restart an old game? '); #READ(AN); #RESET(INPUT); #IF (AN = 'Y') OR (AN = 'y') THEN #BEGIN &RESET(GAMEDATA,'CASTLES.DATA'); &GET(GAMEDATA); &DATA := GAMEDATA^; &CLOSE(GAMEDATA,LOCK); &RESTART := TRUE; #END #ELSE #BEGIN (REPEAT GOTOXY(20,7); /WRITE('How many players? '); /READ(AN); /IF EOF THEN RESET(INPUT); /A := ORD(AN) - 48; /IF NOT (A IN [2..4]) THEN /BEGIN 2GOTOXY(0,15); 2WRITE('2, 3, or 4 players only please.'); 2WAIT; 2CLEARTHESCREEN; /END; ' UNTIL A IN [2..4]; (NUMP := A; (GOTOXY(20,9); (WRITE('Enter any character. '); (READ(AN); (RESET(INPUT); (FOR A := 0 TO ORD(AN) DO X := RANDOM; (FOR I := 1 TO NUMP DO (BEGIN ,REPEAT 0GOTOXY(20,9+I*2); 0WRITE('What is player ',PD[I],'''s name? '); 0RESET(INPUT); 0READLN(ANS); 0IF EOF THEN RESET(INPUT); ,UNTIL ANS <> ''; 0NAME[I] := ANS; 0FOR A := 0 TO LENGTH(ANS) DO X := RANDOM; 0ARMY[I] := RND(7,11); 0MONEY[I] := 0; (END; (FOR I := 1 TO 7 DO FOR J:= 1 TO 7 DO (BEGIN 0POP[I,J] := 0; TROOPS[I,J] := 0; 0PLACE[I,J] := '*'; OWN[I,J] := 0; (END; (SEQIT; (CASTLE(1,2,3,5,1); CASTLE(6,7,3,5,2); (IF NUMP > 2 THEN CASTLE(3,5,1,2,3); (IF NUMP > 3 THEN CASTLE(3,5,6,7,4); (POP[4,4] := 9; PLACE[4,4] := 'X'; (K := 1; (REPEAT RAND; 0IF PLACE[I,J] <> '*' THEN K :=1 0ELSE BEGIN K := K+1; 8PLACE[I,J] := 'T'; 8POP[I,J] := TRUNC(RANDOM *3.5 + 4); / END; {ELSE} (UNTIL K > NUMP; (FOR K := 1 TO 9 DO (BEGIN 0IF K < 5 THEN 0BEGIN 8REPEAT RAND UNTIL PLACE[I,J] = '*'; 8PLACE[I,J] := 'L'; 8REPEAT RAND UNTIL PLACE[I,J] = '*'; 8PLACE[I,J] := 'S'; 0END; {WHILE K < 5} 0REPEAT RAND UNTIL PLACE[I,J] = '*'; 0PLACE[I,J] := 'F'; 'END; 'FOR I := 1 TO 7 DO FO ,TAXBASE[PL] := TAXBASE[PL] + POP[I,J]; ,IF PLACE[I,J] = 'T' THEN TAXBASE[PL] := TAXBASE[PL] + 1; ,ARMY[PL] := ARMY[PL] + TROOPS[I,J]; )END; &END; &FOR I := 1 TO NUMP DO &BEGIN )TAX[I] := TAXBASE[I] * (TAXRATE + RANDOM * TAXRATE/4); )PAY[I] := ARMY[I] * (PAYRATE + RANDOM * PAYRATE/4); )IF CAS[I] <> 0 THEN )BEGIN ,MONEY[I] := MONEY[I] - PAY[I]; ,IF MONEY[I] < 0 THEN ,BEGIN /TAX[I] := TAX[I] + MONEY[I]; /MONEY[I] := 0; ,END; ,CLEARTHESCREEN; ,WRITELN('WARLORD ',PD[I],' ',NAME[I]); ,WRITELN('TREASURY BALANCE: ',MONEY[I] : 6 : 2); ,WRITELN('ARMIES: ',ARMY[I]); ,WRITELN('TAXES COLLECTED: ',TAX[I]:6:2); ,WRITELN('POPULATION: ',TAXBASE[I]); ,IF ARMY[I] > 0 THEN -BEGIN .IF ATLEASTONEPLAYERIN THEN ALLBUTONEPLAYEROUT := FALSE; .ATLEASTONEPLAYERIN := TRUE; , END; ,IF MONEY[I] >= 2000 THEN FIELDTROOPS; ,MONEY[I] := MONEY[I] + TAX[I]; ,GOTOXY(0,9); ,WRITE('TREASURY NOW EQUALS ',MONEY[I] : 6 : 2); ,IF MONEY[I] >= 2000 THEN CASTLETROOPS ELSE WAIT; )END; &END; #END;{WITH DATA} END;{ECONOMIC} 0 #PROCEDURE SAVEGAME; #BEGIN &CLEARTHESCREEN; &GOTOXY(20,8); &WRITE('Do you want to stop now? '); &READ(AN); &RESET(INPUT); &IF (AN = 'Y') OR (AN = 'y') THEN STILLPLAYING :=FALSE; &GOTOXY(20,10); &WRITE('Do you want to save this game? '); &READ(AN); &RESET(INPUT); &IF (AN = 'Y') OR (AN = 'y') THEN &BEGIN )REWRITE(GAMEDATA,'CASTLES.DATA'); )GAMEDATA^ := DATA; )PUT(GAMEDATA); )CLOSE(GAMEDATA,LOCK); )WRITElN('Game s.4: E := 'One move at a time please. '; .5: E := 'You can''t march into a lake! '; .6: E := 'You don''t have that many troops there!'; .7: E := 'You don''t have enough money.? '; .8: E := 'Invalid position.  '; .9: E := 'You don''t own that place. '; -10: E := 'You can''t place troops in the capital.'; -11: E := 'For no move enter a ''0'' from position. '; -12: E := 'NOW you MUST take at least one. ' +END; /GOTOXY(0,15); /WRITE(E); /WAIT; (END; {MERROR}   PROCEDURE COMBAT; 0PROCEDURE RESULTS; 0BEGIN WITH DATA DO BEGIN 4CLEARTHESCREEN; 4WRITE('COMBAT RESULTS BETWEEN WARLORDS '); 4WRITELN(NAME[PL],' AND ',NAME[OWN[TI,TJ]]); 4WRITELN(); 4WRITE('ATTACKING WARLORD ',NAME[PL]); 4WRITELN(' LOST ',AL,' ARMIES'); 4WRITELN(); 4WRITE('DEFENDING WARLORD '); 4WRITE(NAME[OWN[TI,TJ]],' LOST '); 4WRITELN(DL,' ARMIES '); 0END;{WITH DATA} END;{RESULTS} (BEGIN {COMBAT} WITH DATA DO BEGIN ,CASE PLACE[TI,TJ] OF 0'*': DF := 1; 0'C': DF := 4; 0'X': DF := 3; 0'F': DF := 1.75; 0'S': DF := 2; 0'T': DF := 1.5 ,END; ,DL := ,TRUNC((NUMBER * (RANDOM * 0.5 + ,0.5))/DF); ,AL := ,TRUNC(TROOPS[TI,TJ] * (RANDOM * 0.5 + ,0.5) * DF); ,IF AL > NUMBER THEN AL := NUMBER; ,IF DL > TROOPS[TI,TJ] THEN DL := ,TROOPS[TI,TJ]; ,RESULTS; ,TROOPS[TI,TJ] := TROOPS[TI,TJ] - DL; ,ARMY[OWN[TI,TJ]] := ARMY[OWN[TI,TJ]] - DL; ,NUMBER := NUMBER - AL; ,ARMY[PL] := ARMY[PL] - AL; ,WRITE('ATTACK WAS '); ,IF TROOPS[TI,TJ] > 0 THEN ,BEGIN {UNSUCCESSFUL} 4WRITELN('UNSUCCESSFUL'); 4TROOPS[FI,FJ] := TROOPS[FI,FJ] + 4NUMBER; 4IF TROOPS[FI,FJ] > 0 THEN 4OWN[FI,FJ] := PL; ,END {UNSUCCESSFUL} ,ELSE ,BEGIN {SUCCESSFUL} .WRITELN('SUCCESSFUL'); .IF PLACE[TI,TJ] = 'C' THEN .BEGIN {TAKE CAS} 0CAS[OWN[TI,TJ]] := 0; 0MONEY[PL] := 0MONEY[PL] + MONEY[OWN[TI,TJ]]; 0IF CAS[PL] = 0 THEN 0CAS[PL] := TI * 10 + TJ; .END; {TAKE CAS} .TROOPS[TI,TJ] := NUMBER; .OWN[TI,TJ] := PL; ,END; {SUCCESSFUL}  WAIT; (END;{WITH DATA} END;{COMBAT} ( (PROCEDURE MOVE; (BEGIN WITH DATA DO BEGIN ,IF (PLACE[TI,TJ] = 'C') AND (OWN[TI,TJ] = 0) THEN ,CAS[PL] := TX; ,IF ((PLACE[TI,TJ] = 'F') OR (PLACE[TI,TJ] = 'S')) AND ,(RANDOM <= 0.7) THEN ,BEGIN 0AL := TRUNC(RANDOM * NUMBER +1); 0NUMBER := NUMBER -AL; 0ARMY[PL] := ARMY[PL] - AL; 0IF PLACE[TI,TJ] = 'F' 0THEN WRITE(AL,' TROOPS LOST IN FOREST ')  0ELSE WRITE(AL,' TROOPS DROWNED IN SWAMP '); 0WAIT; ,END; ,TROOPS[TI,TJ] := TROOPS[TI,TJ] + NUMBER; ,IF NUMBER > 0 THEN OWN[TI,TJ] := PL; (END;{WITH DATA} END;{MOVE} ( #PROCEDURE ECONOMIC; #CONST TAXRATE = 675.0; +PAYRATE = 325.0; #VAR N : STRING; +A, LINE : INTEGER; + &PROCEDURE INEW; &BEGIN )WRITELN(); )WRITE('How many? '); )READ(ANS); )RESET(INPUT); )POSITION := 1; )N := ''; )SPLIT(N); )CONVERT(N,A); )MOVEOK := TRUE; &END; & &PROCEDURE FIELDTROOPS; )BEGIN WITH DATA DO BEGIN {FT1} ,REPEAT /GOTOXY(0,7); /WRITELN(); /GOTOXY(0,7); /WRITE('Do you wish to rase field troops? '); /READ(AN); /RESET(INPUT); ,UNTIL (AN = 'Y') OR (AN = 'N') /OR (AN = 'y') OR (AN = 'n'); ,WRITELN(); ,IF (AN = 'Y') OR (AN = 'y') THEN ,BEGIN {FT2} /REPEAT 2INEW; 2MOVEOK := TRUE; 2IF (A * 2000.0) > MONEY[I] THEN MERROR(7); 2IF A = 0 THEN MERROR(12); /UNTIL MOVEOK = TRUE; /MONEY[I] := MONEY[I] - A * 2000.0; /ARMY[I] := ARMY[I] + A; /PL := I; /REPEAT 2MOVEOK := TRUE; 2BOARD; 2GOTOXY(0,15); 2WRITE('Where do you want them? '); 2INTEST; 2IF NOT(FROM IN VALID) THEN MERROR(8) ELSE 2BEGIN 5J := FROM DIV 10; K := FROM MOD 10; 5IF OWN[J,K] <> I THEN MERROR(9); 5IF PLACE[J,K] = 'X' THEN MERROR(10); 5IF MOVEOK THEN 5TROOPS[J,K] := TROOPS[J,K] + A; 2END; /UNTIL MOVEOK = TRUE; /BOARD; /WAIT; /CLEARTHESCREEN; ,END; {FT2} )END; {WITH DATA} END; {FT1} ) )PROCEDURE CASTLETROOPS; )BEGIN WITH DATA DO BEGIN {CASTLESTROOPS} ,REPEAT /GOTOXY(0,11); /WRITELN(); /GOTOXY(0,11); /WRITE('Do you wish to raise castle troops? '); /READ(AN); /RESET(INPUT); ,UNTIL (AN = 'Y') OR (AN = 'y') /OR (AN = 'N') OR (AN = 'n'); ,IF (AN = 'Y') OR (AN = 'y') THEN ,BEGIN /REPEAT 2INEW; 2MOVEOK := TRUE; 2IF (A * 2000.0) > MONEY[I] THEN MERROR(7); 2IF A = 0 THEN MERROR(12); /UNTIL MOVEOK = TRUE; /J := CAS[I] DIV 10; K := CAS[I] MOD 10; /TROOPS[J,K] := TROOPS[J,K] + A; /MONEY[I] := MONEY[I] - A * 2000.0; /ARMY[I] := ARMY[I] + A; /WRITELN('TROOPS IN CASTLE NOW = ',TROOPS[J,K]); ,END; ,WAIT; )END; {WITH DATA} END; {CASTLETROOPS} + #BEGIN WITH DATA DO BEGIN {ECONOMICS} &ATLEASTONEPLAYERIN := FALSE; &ALLBUTONEPLAYEROUT := TRUE ; &FOR I := 1 TO NUMP DO &BEGIN )TAX[I] := 0; )TAXBASE[I] := 0; )ARMY[I] := 0; &END; &FOR I:= 1 TO 7 DO FOR J := 1 TO 7 DO &BEGIN )PL := OWN[I,J]; )IF PL <> 0 THEN )BEGIN   YOU ARE IN A SPLENDID CHAMBER THIRTY FEET HIGH. T 13 HE WALLS ARE FROZEN RIVERS OF ORANGE STONE. AN AW 13 KWARD CANYON AND A GOOD PASSAGE EXIT FROM EAST AND 13 WEST SIDES OF THE CHAMBER. 14 AT YOUR FEET IS A SMALL PIT BREATHING TRACES OF WH 14 ITE MIST. AN EAST PASSAGE ENDS HERE EXCEPT FOR A 14 SMALL CRACK LEADING ON. 15 YOU ARE AT ONE END OF A VAST HALL STRETCHING FORWA 15 RD OUT OF SIGHT TO THE WEST. THERE ARE OPENINGS T 15 O EITHER SIDE. NEARBY, A WIDE STONE STAIRCASE LEA  15 DS DOWNWARD. THE HALL IS FILLED WITH WISPS OF WHI 15 TE MIST SWAYING TO AND FRO 15 ALMOST AS IF ALIVE. A COLD WIND BLOWS UP THE STA 15 IRCASE. THERE IS A PASSAGE AT THE TOP OF A DOME B 15 EHIND YOU. 16 THE CRACK IS FAR TOO SMALL FOR YOU TO FOLLOW. 17 YOU ARE ON THE EAST BANK OF A FISSURE SLICING CLEA 17 R ACROSS THE HALL. THE MIST IS QUITE THICK HERE, 17 AND THE FISSURE IS TOO WIDE TO JUMP. 18 THIS IS A LOW ROOM WITH A CRUDE NOTE ON THE WALL. 18 THE NOTE SAYS,'YOU WON'T GET IT UP THE STEPS'. 19 YOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PAS 19 SAGES OFF IN ALL DIRECTIONS. 20 YOU ARE AT THE BOTTOM OF THE PIT WITH A BROKEN NEC 20 K. 21 YOU DIDN'T MAKE IT. 22 THE DOME IS UNCLIMBABLE. 23 YOU ARE AT THE WEST END OF THE TWOPIT ROOM. THERE 23 IS A LARGE HOLE IN THE WALL ABOVE THE PIT AT THIS 23 END OF THE ROOM. 24 YOU ARE AT THE BOTTOM OF THE EASTERN PIT IN THE TW 24 OPIT ROOM. THERE IS A SMALL POOL OF OIL IN ONE CO 24 RNER OF THE PIT. aved.'); &END; #END;{SAVEGAME}    BEGIN {PLAY} WITH DATA DO BEGIN   STILLPLAYING := TRUE;  WHILE STILLPLAYING DO  BEGIN {TURN} #IF RESTART = FALSE THEN #BEGIN {CAMPAIGN} &ROUNDSINTURN := RND(1,4); &IF (TURN < 6) AND (ROUNDSINTURN > 2) THEN .ROUNDSINTURN := ROUNDSINTURN - 1; &FOR R := 1 TO ROUNDSINTURN DO &BEGIN {ROUND} )ROUND := R; )SEQIT; )FOR PT := 1 TO NUMP DO )BEGIN {PTURN} ,PTURN := PT; ,PL := SEQ[PTURN]; ,IF ARMY[PL] > 0 THEN ,BEGIN {PLAYER} /REPEAT {UNTIL MOVOK} 2BOARD; 2GOTOXY(54,4); 2WRITE('CAMPAGIN ',TURN); 2GOTOXY(55,5); 2WRITE('ROUND ',ROUND); 2GOTOXY(55,6); 2WRITE('WARLORD ',PD[PL]); 2GOTOXY(55,7); 2WRITE(NAME[PL]); 2GOTOXY(0,15); 2WRITE(' MOVE? (FROM TO NUMBER)'); 2INTEST; 2MOVEOK := TRUE; 2IF NOT(FROM = 0) THEN 2BEGIN {CHECK MOVE1} 5IF NOT (FROM IN VALID) THEN MERROR(1); 5IF NOT (TX IN VALID) THEN MERROR(2); 5IF MOVEOK THEN 5BEGIN {CHECK MOVE2} 8FI := FROM DIV 10; FJ := FROM MOD 10; 8TI := TX DIV 10 ; TJ:= TX MOD 10; 8IF OWN[FI,FJ] <> PL THEN MERROR(3); 8IF (ABS(TI-FI) > 1) 8OR (ABS(TJ-FJ) > 1) THEN MERROR(4); 8IF PLACE[TI,TJ] = 'L' THEN MERROR(5); 8IF (NUMBER > TROOPS[FI,FJ]) AND ;(OWN[FI,FJ] = PL) THEN MERROR(6); 8IF NUMBER = 0 THEN MERROR(11); 5END;{CHECK MOVE2} 2END;{CHECK MOVE1} /UNTIL MOVEOK; /IF NOT(FROM = 0) THEN /BEGIN {DO MOVE} 2TROOPS[FI,FJ] := TROOPS[FI,FJ] - NUMBER; 2IF TROOPS[FI,FJ] = 0 THEN OWN[FI,FJ] := 0; 2IF (OWN[TI,TJ] <> PL) AND (OWN[TI,TJ] <> 0) 2THEN COMBAT 2ELSE MOVE; /END; {DO MOVE} ,END; {PLAYER} )END; {PTURN} &END; {ROUND} #END; {CAMPAIGN} #BOARD; #GOTOXY(0,15); #WRITE('END OF CAMPAIGN '); #WAIT; #RESTART := FALSE; #SAVEGAME; #IF STILLPLAYING THEN #BEGIN &ECONOMIC; &IF ALLBUTONEPLAYEROUT THEN OUTMSG; &TURN := TURN + 1; #END;  END; {TURN}  END; {DATA} END; {PLAY}  (  BEGIN {DUMMY MAIN PROGRAM}  WITH DATA DO BEGIN  SEED := 1.23456789;  VALID := [11..17,21..27,31..37,41..47,51..57,61..67,71..77];  RESTART := FALSE;  PD := 'ABCD';  FOR I := 1 TO 4 DO SEQ[I] := I;  NEWGAME;  PLAY;  END;{WITH DATA}  END.  ?^ 1 YOU ARE STANDING AT THE END OF A ROAD BEFORE A SMA 1 LL BRICK BUILDING. AROUND YOU IS A FOREST. A SMA 1 LL STREAM FLOWS OUT OF THE BUILDING AND DOWN A GUL 1 LY. 2 YOU HAVE WALKED UP A HILL, STILL IN THE FOREST. T 2 HE ROAD SLOPES BACK DOWN THE OTHER SIDE OF THE HIL 2 L. THERE IS A BUILDING IN THE DISTANCE. 3 YOU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARG 3 E SPRING. 4 YOU ARE IN A VALLEY IN THE FOREST BESIDE A STREAM 4 TUMBLING ALONG A ROCKY BED. 5 YOU ARE IN OPEN FOREST, WITH A DEEP VALLEY TO ONE 5 SIDE. 6 YOU ARE IN OPEN FOREST NEAR BOTH A VALLEY AND A RO 6 AD. 7 AT YOUR FEET ALL THE WATER OF THE STREAM SPLASHES 7 INTO A 2 INCH SLIT IN THE ROCK. DOWNSTREAM THE ST 7 REAMBED IS BARE ROCK.  8 YOU ARE IN A 20 FOOT DEPRESSION FLOORED WITH BARE 8 DIRT. SET INTO THE DIRT IS A STRONG STEEL GRATE M 8 OUNTED IN CONCRETE. A DRY STREAMBED LEADS INTO TH 8 E DEPRESSION. 9 YOU ARE IN A SMALL CHAMBER BENEATH A 3X3 STEEL GRA  9 TE TO THE SURFACE. A LOW CRAWL OVER COBBLES LEADS 9 INWARD TO THE WEST. 10 YOU ARE CRAWLING OVER COBBLES IN A LOW PASSAGE. T 10 HERE IS A DIM LIGHT AT THE END OF THE PASSAGE. 11 YOU ARE IN A DEBRIS ROOM FILLED WITH STUFF WASHED 11 IN FROM THE SURFACE. A LOW WIDE PASSAGE WITH COBB 11 LES BECOMES PLUGGED WITH MUD AND DEBRIS HERE, BUT 11 AN AWKWARD CANYON LEADS UPWARD AND WEST. A NOTE O 11 N THE WALL SAYS 'MAGIC WORD XYZZY'. 12 YOU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON. 13  69 YOU ARE IN A SECRET N/S CANYON ABOVE A LARGE ROOM. 70 YOU ARE IN A SECRET N/S CANYON ABOVE A SIZABLE PAS 70 SAGE. 71 YOU ARE IN A SECRET CANYON AT A JUNCTION OF THREE 71 CANYONS, BEARING NORTH, SOUTH, AND SE. THE NORTH 71 ONE IS AS TALL AS THE OTHER TWO COMBINED. 72 YOU ARE IN A LARGE LOW ROOM. CRAWLS LEAD NORTH SE 72 , AND SW. 73 DEAD END CRAWL. 74 YOU ARE IN A SECRET CANYON WHICH HERE RUNS E/W. I 74 T CROSSES OVER A VERY TIGHT CANYON 15 FEET BELOW. 74 IF YOU GO DOWN YOU MAY NOT BE ABLE TO GET BACK UP 74 . 75 YOU ARE AT A WIDE PLACE IN A VERY TIGHT N/S CANYON 75 . 76 THE CANYON HERE BECOMES TOO TIGHT TO GO FURTHER SO 76 UTH. 77 YOU ARE IN A TALL E/W CANYON. A LOW TIGHT CRAWL G 77 OES 3 FEET NORTH AND SEEMS TO OPEN UP. 78 THE CANYON RUNS INTO A MASS OF BOULDERS -- DEAD EN 78 D. 79 THE STREAM FLOWS OUT THROUGH A PAIR OF 1 FOOT DIAM 79 ETER SEWER PIPES. IT WOULD BE ADVISABLE TO USE TH 79 E EXIT. 80 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A  80 LIKE. 81 DEAD END. 82 DEAD END. 83 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A 83 LIKE. 84 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A 84 LIKE. 85 DEAD END. 86 DEAD END. 87 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A 87 LIKE. 88 YOU ARE IN A LONG, NARROW CORRIDOR STRETCHING OUT 88 OF SIGHT TO THE WEST. AT THE EASTERN END IS A WHO 88 LE THROUGH WHICH YOU CAN SEE A PROFUSION OF LEAVES 88 . 89 THERE IS NOTHING HERE TO CLIMB. USE 'UP' OR 'OUT' 89 TO  25 YOU ARE AT THE BOTTOM OF THE WESTERN PIT IN THE TW 25 OPIT ROOM. THERE IS A LARGE HOLE IN THE WALL ABOU 25 T 25 FEET ABOVE YOU. 26 YOU CLAMBER UP THE PLANT AND SCURRY THROUGH THE HO 26 LE AT THE TOP. 27 YOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HAL 27 L OF MISTS. 28 YOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOO 28 R. THE HOLE GOES DOWN TO AN E/W PASSAGE. 29 YOU ARE IN THE SOUTH SIDE CHAMBER. 30 YOU ARE IN THE WEST SIDE CHAMBER OF THE HALL OF TH 30 E MOUNTAIN KING. A PASSAGE CONTINUES WEST AND UP 30 HERE. 31 32 YOU CAN'T GET BY THE SNAKE. 33 YOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOU 33 TH, A PASSAGE TO THE WEST, AND A WALL OF BROKEN RO 33 CK TO THE EAST. THERE IS A LARGE 'Y2' ON A ROCK I 33 N THE ROOM'S CENTER. 34 YOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERWHERE 34 . 35 YOU'RE AT A LOW WINDOW OVERLOOKING A HUGE PIT, WHI 35 CH EXTENDS UP OUT OF SIGHT. A FLOOR IS INDISTINCT 35 LY VISIBLE OVER 50 FEET BELOW. TRACES OF WHITE MI  35 ST COVER THE FLOOR OF THE PIT, BECOMING THICKER TO 35 THE RIGHT. 35 MARKS IN THE DUST AROUND THE WINDOW WOULD SEEM T 35 O INDICATE 35 THAT SOMEONE HAS BEEN HERE RECENTLY. DIRECTLY AC 35 ROSS THE PIT FROM YOU AND 25 FEET AWAY THERE IS A  35 SIMILAR WINDOW LOOKING INTO A LIGHTED ROOM. A SHA 35 DOWY FIGURE CAN BE SEEN THERE PEERING BACK AT YOU. 36 YOU ARE IN A DIRTY BROKEN PASSAGE. TO THE EAST IS 36 A CRAWL. TO THE WEST IS A LARGE PASSAGE. ABOVE 36 YOU IS A HOLE TO ANOTHER PASSAGE. 37 YOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PI 37 T, A CRAWL LEADS WEST. 38 YOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE 38 STREAM, WHICH ENTERS AND EXITS THROUGH TINY SLITS 38 . 39 YOU ARE IN A LARGE ROOM FULL OF DUSTY ROCKS. THER 39 E IS A BIG HOLE IN THE FLOOR. THERE ARE CRACKS EV 39 ERYWHERE, AND A PASSAGE LEADING EAST. 40 YOU HAVE CRAWLED THROUGH A VERY LOW WIDE PASSAGE P 40 ARALLEL TO AND NORTH OF THE HALL OF MISTS.  41 YOU ARE AT THE WEST END OF THE HALL OF MISTS. A L 41 OW WIDE CRAWL CONTINUES WEST AND ANOTHER GOES NORT 41 H. TO THE SOUTH IS A LITTLE PASSAGE 6 FEET OFF TH 41 E FLOOR. 42 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A 42 LIKE. 43 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A 43 LIKE. 44 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A 44 LIKE. 45 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A 45 LIKE. 46 DEAD END. 47 DEAD END. 48 DEAD END. 49 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A 49 LIKE. 50 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A 50 LIKE. 51 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A 51 LIKE. 52 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A 52 LIKE. 53 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A 53 LIKE. 54 DEAD END. 55 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL A 55 LIKE. 56 DEAD END. 57 YOU ARE ON THE BRINK OF A THIRTY FOOT PIT WITH A M  57 ASSIVE ORANGE COLUMN DOWN ONE WALL. YOU COULD CLI 57 MB DOWN HERE BUT YOU COULD NOT GET BACK UP. THE M 57 AZE CONTINUES AT THIS LEVEL. 58 DEAD END. 59 YOU HAVE CRAWLED THROUGH A VERY LOW WIDE PASSAGE P 59 ARALLEL TO AND NORTH OF THE HALL OF MISTS. 60 YOU ARE AT THE EAST END OF A VERY LONG HALL APPARE 60 NTLY WITHOUT SIDE CHAMBERS. TO THE EAST A LOW WID 60 E CRAWL SLANTS UP. TO THE NORTH A ROUND TWO FOOT 60 HOLE SLANTS DOWN. 61 YOU ARE AT THE WEST END OF A VERY LONG FEATURELESS  61 HALL. THE HALL JOINS UP WITH A NARROW NORTH/SOUT 61 H PASSAGE. 62 YOU ARE AT A CROSSROADS OF A HIGH N/S PASSAGE AND 62 A LOW E/W ONE. 63 DEAD END. 64 YOU ARE AT A COMPLEX JUNCTION. A LOW HANDS AND KN 64 EES PASSAGE FROM THE NORTH JOINS A HIGHER CRAWL FR 64 OM THE EAST TO MAKE A WALKING PASSAGE GOING WEST. 64 THERE IS ALSO A LARGE ROOM ABOVE. THE AIR IS DAM 64 P HERE. 65 YOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH  65 HOLES EVERYWHERE. TO EXPLORE AT RANDOM SELECT NO 65 RTH, SOUTH, UP, OR DOWN. 66 YOU ARE IN A ROOM WHOSE WALLS RESEMBLE SWISS CHESE 66 . OBVIOUS PASSAGES GO WEST, EAST, NE, AND NW. PA 66 RT OF THE ROOM IS OCCUPIED BY A LARGE BEDROCK BLOC 66 K. 67 YOU ARE AT THE EAST END OF THE TWOPIT ROOM. THE F 67 LOOR HERE IS LITTERED WITH THIN ROCK SLABS, WHICH 67 MAKE IT EASY TO DESCEND THE PITS. THERE IS A PATH 67 HERE BYPASSING THE PITS TO CONNECT PASSAGES FROM 67 EAST AND WEST. 67  THERE ARE HOLES ALL OVER, BUT THE ONLY BIG ONE I 67 S ON THE WALL DIRECTLY OVER THE WEST PIT WHERE YOU 67 CAN'T GET TO IT. 68 YOU ARE IN A LARGE LOW CIRCULAR CHAMBER WHOSE FLOO 68 R IS AN IMMENSE SLAB FALLEN FROM THE CEILING (SLAB 68 ROOM). EAST AND WEST THERE ONCE WERE LARGE PASSA 68 GES, BUT THEY ARE NOW FILLED WITH BOULDERS. LOW S 68 MALL PASSAGES GO NORTH AND SOUTH, 68 AND THE SOUTH ONE QUICKLY BENDS WEST AROUND THE B 68 OULDERS.  115 SCATTERED ABOUT YOU CAN BE SEEN A NUMBER OF BOTT 115 LES (ALL OF THEM EMPTY), 115 A NURSERY OF YOUNG BEANSTALKS MURMURING QUIETLY, 115 A BED OF OYSTERS, A BUNDLE OF BLACK RODS WITH RUST 115 Y STARS ON THEIR ENDS, AND A COLLECTION OF BRASS L 115 ANTERNS. OFF TO ONE SIDE A GREAT MANY DWARVES ARE 115 SLEEPING ON THE FLOOR, SNORING LOUDLY. A SIGN NE 115 ARBY READS 'DO NOT DISTURB DWARVES.' AN IMMENSE M 115 IRROR IS HANGING AGAINST ONE WALL, AND STRETCHES T 115 O THE OTHER END OF THE ROOM,  115 WHERE VARIOUS OTHER SUNDRY OBJECTS CAN BE GLIMPSE 115 D DIMLY IN THE DISTANCE. 116 YOU ARE AT THE SOUTHWEST END OF THE REPOSITORY. T 116 O ONE SIDE IS A PIT FULL OF FIERCE GREEN SNAKES. 116 ON THE OTHER SIDE IS A ROW OF SMALL WICKER CAGES, 116 EACH OF WHICH CONTAINS A LITTLE SULKING BIRD. 116 IN ONE CORNER IS A BUNDLE OF BLACK RODS WITH RUS 116 TY MARKS ON THEIR ENDS. 116 A LARGE NUMBER OF VELVET PILLOWS ARE SCATTERED A 116 BOUT ON THE FLOOR. A VAST MIRROR STRETCHES OFF TO 116 THE NORTHEAST. AT YOUR FEET IS A LARGE STEEL GRA 116 TE, NEXT TO WHICH IS A SIGN WHICH READS, 'TREASURE 116 VAULT. KEYS IN MAIN OFFICE.' 117 YOU ARE ON ONE SIDE OF A LARGE, DEEP CHASM. A HEA 117 VY WHITE MIST RISING UP FROM BELOW OBSCURES ALL VI 117 EW OF THE FAR SIDE. A SW PATH LEADS AWAY FROM THE 117 CHASM INTO A WINDING CORRIDOR. 118 YOU ARE IN A LONG WINDING CORRIDOR SLOPING OUT OF 118 SIGHT IN BOTH DIRECTIONS. 119 YOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORT 119 H AND EAST. LEAVE THE PIT. 90 YOU HAVE CLIMBED UP THE PLANT AND OUT OF THE PIT. 91 YOU ARE AT THE TOP OF A STEEP INCLINE ABOVE A LARG 91 E ROOM. YOU COULD CLIMB DOWN HERE, BUT YOU WOULD 91 NOT BE ABLE TO CLIMB UP. THERE IS A PASSAGE LEADI 91 NG BACK TO THE NORTH. 92 YOU ARE IN THE GIANT ROOM. THE CEILING HERE IS TO 92 O HIGH UP FOR YOUR LAMP TO SHOW IT. CAVERNOUS PAS 92 SAGES LEAD EAST, NORTH, AND SOUTH. ON THE WEST WA 92 LL IS SCRAWLED THE INSCRIPTION, 'FEE FIE FOE FOO' 92 (SIC).  93 THE PASSAGE HERE IS BLOCKED BY A RECENT CAVE-IN. 94 YOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSA 94 GE. 95 YOU ARE IN A MAGNIFICIENT CAVERN WITH A RUSHING ST 95 REAM, WHICH CASCADES OVER A SPARKLING WATERFALL IN 95 TO A ROARING WHIRLPOOL WHICH DISAPEARS THROUGH A H 95 OLE IN THE FLOOR. PASSAGES EXIT TO THE SOUTH AND 95 WEST. 96 YOU ARE IN THE SOFT ROOM. THE WALLS ARE COVERED W 96 ITH HEAVY CURTAINS, THE FLOOR WITH A THICK PILE CA 96 RPET. MOSS COVERS THE CEILING. 97 THIS THE ORIENTAL ROOM. ANCIENT ORIENTAL CAVE DRA 97 WINGS COVER THE WALLS. A GENTLY SLOPING PASSAGE L 97 EADS UPWARD TO THE NORTH, ANOTHER PASSAGE LEADS SE 97 , AND A HANDS AND KNEES CRAWL LEADS WEST. 98 YOU ARE FOLLOWING A WIDE PATH AROUND THE OUTER EDG 98 E OF A LARGE CAVERN. FAR BELOW, THROUGH A HEAVY W 98 HITE MIST, STRANGE SPLASHING NOISES CAN BE HEARD. 98 THE MIST RISES UP THROUGH A FISSURE IN THE CEILIN 98 G. 98 THE PATH EXITS TO THE SOUTH AND WEST.  99 YOU ARE IN AN ALCOVE. A SMALL NW PATH SEEMS TO WI 99 DEN AFTER A SHORT DISTANCE. AN EXTREMLY TIGHT TUN 99 NEL LEADS EAST. IT LOOKS LIKE A VERY TIGHT SQUEEZ 99 E. AN EERIE LIGHT CAN BE SEEN AT THE OTHER END. 100 YOU'RE IN A SMALL CHAMBER LIT BY AN EERIE GREEN LI 100 GHT. AN EXTREMELY NARROW TUNNEL EXITS TO THE WEST 100 . A DARK CORRIDOR LEADS NE. 101 YOU'RE IN THE DARK-ROOM. A CORRIDOR LEADING SOUTH 101 IS THE ONLY EXIT. 102 YOU ARE IN AN ARCHED HALL. A CORAL PASSAGE ONCE C 102 ONTUINED UP AND EAST FROM HERE, BUT IS NOW BLOCKED 102 BY DEBRIS. THE AIR SMELLS OF SEA WATER. 103 YOU'RE IN A LARGE ROOM CARVED OUT OF SEDIMENTARY R 103 OCK. THE FLOOR AND WALLS ARE LITTERED WITH BITS O 103 F SHELLS IMBEDDED IN THE STONE. A SHALLOW PASSAGE 103 PROCEEDS DOWNWARD, AND A SOMEWHAT STEEPER ONE LEA 103 DS UP. 103 A LOW HANDS AND KNEES PASSAGE ENTERS FROM THE SO 103 UTH. 104 YOU ARE IN A LONG SLOPING CORRIDOR WITH RAGGED SHA 104 RP WALLS.  105 YOU ARE IN A CUL-DE-SAC ABOUT EIGHT FEET ACROSS. 106 YOU ARE IN AN ANTEROOM LEADING TO A LARGE PASSAGE 106 TO THE EAST. SMALL PASSAGES GO WEST AND UP. THE 106 REMNANTS OF RECENT DIGGING ARE EVIDENT. A SIGN IN 106 MIDAIR HERE SAYS 'CAVE UNDER CONSTRUCTION BEYOND 106 THIS POINT. 106 PROCEED AT OWN RISK. (WITT CONSTRUCTION COMPANY) 106 ' 107 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL D 107 IFFERENT. 108 YOU ARE AT WITT'S END. PASSAGES LEAD OFF IN *ALL* 108 DIRECTIONS. 109 YOU ARE IN A NORTH/SOUTH CANYON ABOUT 25 FEET ACRO 109 SS. THE FLOOR IS COVERED BY WHITE MIST SEEPING IN 109 FROM THE NORTH. THE WALLS EXTEND UPWARD FOR WELL 109 OVER 100 FEET. SUSPENDED FROM SOME UNSEEN POINT 109 FAR ABOVE YOU, 109 AN ENORMOUS TWO-SIDED MIRROR 109 IS HANGING PARALLEL TO AND MIDWAY BETWEEN THE CAN 109 YON WALLS. (THE MIRROR IS OBVIOUSLY PROVIDED FOR 109 THE USE OF THE DWARVES, WHO AS YOU KNOW, ARE EXTRE 109 MELY VAIN.) A SMALL WINDOW CAN BE SEEN IN EITHER  109 WALL, SOME FIFTY FEET UP. 110 YOU'R AT A LOW WINDOW OVERLOOKING A HUGE PIT, WHIC 110 H EXTENDS UP OUT OF SIGHT. A FLOOR IS INDISTINCTL 110 Y VISIBLE OVER 50 FEET BELOW. TRACES OF WHITE MIS 110 T COVER THE FLOOR OF THE PIT, BECOMING THICKER TO 110 THE LEFT. 110 MARKS IN THE DUST AROUND THE WINDOW WOULD SEEM 110 TO INDICATE THAT SOMEONE HAS BEEN HERE RECENTLY. 110 DIRECTLY ACROSS THE PIT FROM YOU AND 25 FEET AWAY 110 THERE IS A SIMILAR WINDOW LOOKING INTO A LIGHTED 110 ROOM. A SHADOWY FIGURE CAN BE SEEN PEERING BACK A 110 T YOU. 111 A LARGE STALACTITE EXTENDS FROM THE ROOF AND ALMOS 111 T REACHES THE FLOOR BELOW. YOU COULD CLIMB DOWN I 111 T, AND JUMP FROM IT TO THE FLOOR,BUT HAVING DONE S 111 O YOU WOULD BE UNABLE TO REACH IT TO CLIMB BACK UP 111 . 112 YOU ARE IN A LITTLE MAZE OF TWISTING PASSAGES, ALL 112 DIFFERENT. 113 YOU ARE AT THE EDGE OF A LARGE UNDERGROUND RESERVO 113 IR. AN OPAQUE CLOUD OF WHITE MIST FILLS THE ROOM  113 AND RISES RAPIDLY UPWARD. THE LAKE IS FED BY A ST 113 REAM, WHICH TUMBLES OUT OF A HOLE IN THE WALL ABOU 113 T 10 FEET OVERHEAD AND SPLASHES 113 NOISILY INTO THE WATER SOMEWHERE WITHIN THE MIST. 113 THE ONLY PASSAGE GOES BACK TOWARD THE SOUTH. 114 DEAD END. 115 YOU ARE AT THE NORTHEAST END OF AN IMMENSE ROOM, E 115 VEN LARGER THAN THE GIANT ROOM. IT APPEARS TO BE 115 A REPOSITORY FOR THE ADVENTURE PROGRAM. MASSIVE T 115 ORCHES FAR OVERHEAD BATHE THE ROOM WITH SMOKY YELL 115 OW LIGHT.   1 YOU'RE AT END OF ROAD AGAIN. 2 YOU'RE AT HILL IN ROAD. 3 YOU'RE INSIDE BUILDING. 4 YOU'RE IN VALLEY. 5 YOU'RE IN FOREST. 6 YOU'RE IN FOREST. 7 YOU'RE AT SLIT IN STREAMBED. 8 YOU'RE OUTSIDE GRATE. 9 YOU'RE BELOW THE GRATE. 10 YOU'RE IN COBBLE CRAWL. 11 YOU'RE IN DEBRIS ROOM. 13 YOU'RE IN BIRD CHAMBER. 14 YOU'RE AT TOP OF SMALL PIT. 15 YOU'RE IN HALL OF MISTS. 17 YOU'RE ON EAST BANK OF FISSURE. 18 YOU'RE IN NUGGET OF GOLD ROOM. 19 YOU'RE IN HALL OF MT KING. 23 YOU'RE AT WEST END OF TWOPIT ROOM. 24 YOU'RE IN EAST PIT. 25 YOU'RE IN WEST PIT. 33 YOU'RE AT 'Y2'. 35 YOU'RE AT WINDOW ON PIT. 36 YOU'RE IN DIRTY PASSAGE. 39 YOU'RE IN DUSTY ROCK ROOM. 41 YOU'RE AT WEST END OF HALL OF MISTS. 57 YOU'RE AT BRINK OF PIT. 60 YOU'RE AT EAST END OF LONG HALL. 61 YOU'RE AT WEST END OF LONG HALL. 64 YOU'RE AT COMPLEX JUNCTION. 66 YOU'RE IN SWISS CHEESE ROOM. 67 YOU'RE AT EAST END OF TWOPIT ROOM. 68 YOU'RE IN SLAB ROOM.  71 YOU'RE AT JUNCTION OF THREE SECRET CANYONS. 74 YOU'RE IN SECRET E/W CANYON ABOVE TIGHT CANYON. 88 YOU'RE IN NARROW CORRIDOR. 91 YOU'RE AT STEEP INCLINE ABOVE LARGE ROOM. 92 YOU'RE IN GIANT ROOM. 95 YOU'RE IN CAVERN WITH WATERFALL. 96 YOU'RE IN SOFT ROOM. 97 YOU'RE IN ORIENTAL ROOM. 98 YOU'RE IN MISTY CAVERN. 99 YOU'RE IN ALCOVE. 100 YOU'RE IN PLOVER ROOM. 101 YOU'RE IN DARK ROOM. 102 YOU'RE IN ARCHED HALL. 103 YOU'RE IN SHELL ROOM. 106 YOU'RE IN ANTEROOM. 108 YOU'RE AT WITT'S EN 120 YOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORT 120 H AND EAST. 121 YOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORT 121 H AND EAST. 122 YOU ARE ON THE FAR SIDE OF THE CHASM. A NE PATH L 122 EADS AWAY FROM THE CHASM ON THIS SIDE. 123 YOU'RE IN A LONG EAST/WEST CORRIDOR. A FAINT RUMB 123 LING NOISE CAN BE HEARD IN THE DISTANCE. 124 THE PATH FORKS HERE. THE LEFT FORK LEADS NORTHEAS 124 T. A DULL RUMBLING SEEMS TO GET LOUDER IN THAT DI 124 RECTION. THE RIGHT FORK LEADS SOUTHEAST DOWN A GE 124 NTLE SLOPE. THE MAIN CORRIDOR ENTERS FROM THE WES 124 T. 125 THE WALLS ARE QUITE WARM HERE. FROM THE NORTH CAN 125 BE HEARD A STEADY ROAR, SO LOUD THAT THE ENTIRE C 125 AVE SEEMS TO BE TREMBLING. ANOTHER PASSAGE LEADS 125 SOUTH, AND A LOW CRAWL GOES EAST. 126 YOU ARE ON THE EDGE OF A BREATH TAKING VIEW. FAR 126 BELOW YOU IS AN ACTIVE VOLCANO, FROM WHICH GREAT G 126 OUTS OF MOULTEN LAVA COME SURGING OUT, CASCADING B 126 ACK DOWN INTO THE DEPTHS.  126 THE GLOWING ROCK FILLS THE FARTHEST REACHES OF T 126 HE CAVERN WITH A BLOOD-RED GLARE, GIVING EVERYTHIN 126 G AN EERIE, MACABRE APPEARANCE. 126 THE AIR IS FILLED WITH FLICKERING SPARKS OF ASH 126 AND A HEAVY SMELL OF BRIMSTONE. THE WALLS ARE HOT 126 TO THE TOUCH, AND THE THUNDERING OF THE VOLCANO D 126 ROWNS OUT ALL OTHER SOUNDS. 126 EMBEDDED IN THE JAGGED ROOF FAR OVERHEAD ARE MYR 126 IAD TWISTED FORMATIONS COMPOSED OF PURE WHITE ALAB 126 ASTER, WHICH SCATTER THE MURKY LIGHT INTO SINISTER 126 APPARITIONS UPON THE WALLS. 126 TO ONE SIDE IS A DEEP GORGE, FILLED WITH A BIZAR 126 RE CHAOS OF TORTURED ROCK WHICH SEEMS TO HAVE BEEN 126 CRAFTED BY THE DEVIL HIMSELF. 126 AN IMMENSE RIVER OF FIRE CRASHES OUT FROM THE DE 126 PTHS OF THE VOLCANO, BURNS ITS WAY THROUGH THE GOR 126 GE, AND PLUMMETS INTO A BOTTOMLESS PIT FAR OFF TO 126 YOUR LEFT. TO THE RIGHT, 126 AN IMMENSE GEYSER OF BLISTERING STEAM ERUPTS CONT 126 INUOUSLY FROM A BARREN ISLAND IN THE CENTER OF A S  126 ULPHOROUS LAKE, WHICH BUBBLES OMINOUSLY. THE FAR 126 RIGHT WALL IS AFLAME WITH AN INCANDESCENCE OF ITS 126 OWN, 126 WHICH LENDS AN ADDITIONAL INFERNAL SPLENDOR TO TH 126 E ALREADY HELLISH SCENE. A DARK FOREBODING PASSAG 126 E EXITS TO THE SOUTH. 127 YOU ARE IN A SMALL CHAMBER FILLED WITH LARGE BOULD 127 ERS. THE WALLS ARE VERY WARM, CAUSING THE AIR IN 127 THE ROOM TO BE ALMOST STIFLING FROM THE HEAT. THE 127 ONLY EXIT IS A CRAWL HEADING WEST, THROUGH WHICH 127 IS COMING LOW RUMBLING. 128 YOU ARE WALKING ALONG A GENTLY SLOPING NORTH/SOUTH 128 PASSAGE LINED WITH ODDLY SHAPED LIMESTONE FORMATI 128 ONS. 129 YOU ARE STANDING AT THE ENTRANCE TO A LARGE, BARRE 129 N ROOM. A SIGN POSTED ABOVE THE ENTRANCE READS 'C 129 AUTION. BEAR IN ROOM.' 130 YOU ARE IN A BARREN ROOM. THE CENTER OF THE ROOM 130 IS COMPLETELY EMPTY EXCEPT FOR SOME DUST. MARKS I 130 N THE DUST LEAD AWAY TOWARD THE FAR END OF THE ROO 130 M. THE ONLY EXIT IS THE WAY YOU CAME IN.  131 YOU ARE IN A MAZE OF TWISTING LITTLE PASSAGES, ALL 131 DIFFERENT. 132 YOU ARE IN A LITTLE MAZE OF TWISTY PASSAGES, ALL D 132 IFFERENT. 133 YOU ARE IN A TWISTING MAZE OF LITTLE PASSAGES, ALL 133 DIFFERENT. 134 YOU ARE IN A TWISTING LITTLE MAZE OF PASSAGES, ALL 134 DIFFERENT. 135 YOU ARE IN A TWISTY LITTLE MAZE OF PASSAGES, ALL D 135 IFFERENT. 136 YOU ARE IN A TWISTY MAZE OF LITTLE PASSAGES, ALL D 136 IFFERENT. 137 YOU ARE IN A LITTLE TWISTY MAZE OF PASSAGES, ALL D 137 IFFERENT. 138 YOU ARE IN A MAZE OF LITTLE TWISTING PASSAGES, ALL 138 DIFFERENT. 139 YOU ARE IN A MAZE OF LITTLE TWISTY PASSAGES, ALL D 139 IFFERENT. 140 DEAD END.  ?^yy 3 43 55 35 0 20 39 36 0 37 43 17 36 0 28 29 52 36 0 39 44 36 0 65 70 37 0 36 44 17 37 0 38 30 31 56 38 0 37 56 29 11 38 0 595 60 14 30 4 5 39 0 36 43 23 39 0 64 30 52 58 39 0 65 70 40 0 41 1 41 0 42 46 29 23 56 41 0 27 43 41 0 59 45 41 0 60 44 17 42 0 41 29 42 0 42 45 42 0 43 43 42 0 45 46 42 0 80 44 43 0 42 44 43 0 44 46 43 0 45 43  44 0 43 43 44 0 48 30 44 0 50 46 44 0 82 45 45 0 42 44 45 0 43 45 45 0 46 43 45 0 47 46 45 0 87 29 30 46 0 45 44 11 47 0 45 43 11 48 0 44 29 11 49 0 50 43 49 0 51 44 50 0 44 43 50 0 49 44 50 0 51 30 50 0 52 46 51 0 49 44 51 0 50 29 51 0 52 43 51 0 53 46 52 0 50 44 52 0 51 43 52 0 52 46 52 0 53 29 52 0 55 45 52 0 86 30 53 0 51 44 53 0 52 45 53 0 54 46 54 0 53 44 11 55 0 52 44 55 0 55 45 55 0 56 30 55 0 57 43 56 0 55 29 11 57 0 13 30 56 57 0 55 44 57 0 58 46 57 0 83 45 57 0 84 43 58 0 57 43 11 59  0 27 1 60 0 41 43 29 17 60 0 61 44 60 0 62 45 30 52 61 0 60 43 61 0 62 45 61 100 107 46 62 0 60 44 62 0 63 45 62 0 30 43 62 0 61 46 63 0 62 46 11 64 0 39 29 56 59 D. 109 YOU'RE IN MIRROR CANYON. 110 YOU'RE AT WINDOW ON PIT. 111 YOU'RE AT TOP OF STALACTITE. 113 YOU'RE AT RESERVOIR. 115 YOU'RE AT NE END. 116 YOU'RE AT SW END. 117 YOU'RE ON SW SIDE OF CHASM. 118 YOU'RE IN SLOPING CORRIDOR. 122 YOU'RE ON NE SIDE OF CHASM. 123 YOU'RE IN CORRIDOR. 124 YOU'RE AT FORK IN PATH. 125 YOU'RE AT JUNCTION WITH WARM WALLS. 126 YOU'RE AT BREATH TAKING VIEW. 127 YOU'RE IN CHAMBER OF BOULDERS. 128 YOU'RE IN LIMESTONE PASSAGE. 129 YOU'RE IN FRONT OF BARREN ROOM.  130 YOU'RE IN BARREN ROOM. ! ?^yy 1 0 2 2 44 29 1 0 3 3 12 19 43 1 0 4 5 13 14 46 30 1 0 5 6 45 43 1 0 8 63 2 0 1 2 12 7 43 45 30 2 0 5 6 45 46 3 0 1 3 11 32 44 3 0 11 62 3 0 33 65 3 0 79 5 14 4 0 1 4 12 45 4 0 5 6 43 44 29 4 0 7 5 46 30 4 0 8 63 5 0 4 9 43 30 5 50 5 6 7 45 5 0 6 6 5 0 5 44 46 6 0 1 2 45 6 0 4 9 43 44 30 6 0 5 6 46 7 0 1 12 7 0 4 4 45 7 0 5 6 43 44 7 0 8 5 15 16 46 7 0 595 60 14 30 8 0 5 6 43 44 46 8 0 1 12 8 0 7 4 13 45 8 303 9 3 19 30 8 0 593 3 9 303  8 11 29 9 0 593 11 9 0 10 17 18 19 44 9 0 14 31 9 0 11 51 10 0 9 11 20 21 43 10 0 11 19 22 44 51 10 0 14 31 11 303 8 63 11 0 9 64 11 0 10 17 18 23 24 43  11 0 12 25 19 29 44 11 0 3 62 11 0 14 31 12 303 8 63 12 0 9 64 12 0 11 30 43 51 12 0 13 19 29 44 12 0 14 31 13 303 8 63 13 0 9 64 13 0 11 51 13 0 12 25 43 13 0 14 23 31  44 14 303 8 63 14 0 9 64 14 0 11 51 14 0 13 23 43 14 150 20 30 31 34 14 0 15 30 14 0 16 33 44 15 0 18 36 46 15 0 17 7 38 44 15 0 19 10 30 45 15 150 22 29 31 34 35 23 43 15 0  14 29 15 0 34 55 16 0 14 1 17 0 15 38 43 17 312 596 39 17 412 21 7 17 412 597 41 42 44 69 17 0 27 41 18 0 15 38 11 45 19 0 15 10 29 43 19 311 28 45 36 19 311 29 46 37 19 311 30 44 7  19 0 32 45 19 35 74 49 19 211 32 49 19 0 74 66 20 0 0 1 21 0 0 1 22 0 15 1 23 0 67 43 42 23 0 68 44 61 23 0 25 30 31 23 0 648 52 24 0 67 29 11 25 0 23 29 11  25 724 31 56 25 0 26 56 26 0 88 1 27 312 596 39 27 412 21 7 27 412 597 41 42 43 69 27 0 17 41 27 0 40 45 27 0 41 44 28 0 19 38 11 46 28 0 33 45 55 28 0 36 30 52 29 0 19 38 11 45  30 0 19 38 11 43 30 0 62 44 29 31 524 89 1 31 0 90 1 32 0 19 1 33 0 3 65 33 0 28 46 33 0 34 43 53 54 33 0 35 44 33 159 302 71 33 0 100 71 34 0 33 30 55 34 0 15 29 35 0 3 138 0 137 48 138 0 139 49 138 0 112 50 139 0 107 49 139 0 131 50 139 0 132 43 139 0 133 44 139 0 134 45 139 0 135 30 139 0 136 48 139 0 137 29 139 0 138 46 139 0 112 47 140 0 112 45 11 ?^yy 64 0 65 44 70 64 0 103 45 74 64 0 106 43 65 0 64 43 65 0 66 44 65 80 556 46 65 0 68 61 65 80 556 29 65 50 70 29 65 0 39 29 65 60 556 45 65 75 72 45 65 0 71 45 65 80 556 30 65 0 106 30 66 0 65 47 66 0 67 44 66 80 556 46 66 0 77 25 66 0 96 43 66 50 556 50 66 0 97 72 67 0 66 43 67 0 23 44 42 67 0 24 30 31 68 0 23 46 68 0 69 29 56 68 0 65 45 69 0 68 30  61 69 331 120 46 69 0 119 46 69 0 109 45 69 0 113 75 70 0 71 45 70 0 65 30 23 70 0 111 46 71 0 65 48 71 0 70 46 71 0 110 45 72 0 65 70 72 0 118 49 72 0 73 45 72 0 97 48 73 0 72 46 17 11 74 0 19 43 74 331 120 44 74 0 121 44 74 0 75 30 75 0 76 46 75 0 77 45 76 0 75 45 77 0 75 43 77 0 78 44 77 0 66 45 17 78 0 77 46 79 0 3 1 80 0 42 45  80 0 80 44 46 80 0 81 43 81 0 80 44 11 82 0 44 46 11 83 0 57 46 83 0 84 43 83 0 85 44 84 0 57 45 84 0 83 44 84 0 114 50 85 0 83 43 11 86 0 52 29 11 87 0 45 29 30 88 0 25 30 56 43 88 0 20 39 88 0 92 44 27 89 0 25 1 90 0 23 1 91 0 95 45 73 23 91 0 72 30 56 92 0 88 46 92 0 93 43 92 0 94 45 93 0 92 46 27 11 94 0 92 46 27 23 94 309 95 45 3 73 94 0 611 45 95 0 94 46 11 95 0 92 27 95 0 91 44 96 0 66 44 11 97 0 66 48 97 0 72 44 17 97 0 98 29 45 73 98 0 97 46 72 98 0 99 44 99 0 98 50 73 99 0 301 43 23 99 0 100 43 100 0 301 44 23 11 100 0 99 44 100 159 302 71 100 0 33 71 100 0 101 47 22 101 0 100 46 71 11 102 0 103 30 74 11 103 0 102 29 38 103 0 104 30 103 114 618 46 103 115 619 46 103 0 64 46 104 0 103 29 74 104 0 105 30 105 0 104 29 11 105 0 103 74 106 0 64 29 106 0 65 44 106 0 108 43 107 0 131 46 107 0 132 49 107 0 133 47 107 0 134 48 107 0 135 29 107 0 136 50 107 0 137 43 107 0 138 44 107 0 139 45 107 0 61 30 108 95 556 43 45 46 47 48 49 50 29 30 108 0 106 43 108 0 626 44 109 0 69 46 109 0 113 45 75 110 0 71 44 110 0 20 39 111 0 70 45 111 40 50 30 39 56 111 50 53 30 111 0 45 30 112 0 131 49 112 0 132 45 112 0 133 43 112 0 134 50 112 0 135 48 112 0 136 47 112 0 137 44 112 0 138 30 112 0 139 29 112 0 140 46 113 0 109 46 11 109 114 0 84 48 115 0 116 49 116 0 115 47 116 0 593 30 117 0 118 49 117 233 660 41 42 69 47 117 332 661 41 117 0 303 41 117 332 21 39 117 0 596 39 118 0 72 30 118 0 117 29 119 0 69 45 11 119 0 653 43 7 120 0 69 45 120 0 74 43 121 0 74 43 11 121 0 653 45 7 122 0 123 47 122 233 660 41 42 69 49 122 0 303 41 122 0 596 39 122 0 124 77 122 0 126 28 122 0 129 40 123 0 122 44 123 0 124 43 77 123 0 126 28 123 0 129 40 124 0 123 44 124 0 125 47 36 124 0 128 48 37 30 124 0 126 28 124 0 129 40 125 0 124 46 77 125 0 126 45 28 125 0 127 43 17 126 0 125 46 23 11 126 0 124 77 126 0 610 30 39 127 0 125 44 11 17 127 0 124 77 127 0 126 28 128 0 124 45 29 77 128 0 129 46 30 40 128 0 126 28 129 0 128 44 29 129 0 124 77 129 0 130 43 19 40 3 129 0 126 28 130 0 129 44 11 130 0 124 77 130 0 126 28 131 0 107 44 131 0 132 48 131 0 133 50 131 0 134 49 131 0 135 47 131 0 136 29 131 0 137 30 131 0 138 45 131 0 139 46 131 0 112 43 132 0 107 50 132 0 131 29 132 0 133 45 132 0 134 46 132 0 135 44 132 0 136 49 132 0 137 47 132 0 138 43 132 0 139 30 132 0 112 48 133 0 107 29 133 0 131 30 133 0 132 44 133 0 134 47 133 0 135 49 133 0 136 43 133 0 137 45 133 0 138 50 133 0 139 48 133 0 112 46 134 0 107 47 134 0 131 45 134 0 132 50 134 0 133 48 134 0 135 43 134 0 136 30 134 0 137 46 134 0 138 29 134 0 139 44 134 0 112 49 135 0 107 45 135 0 131 48 135 0 132 30 135 0 133 46 135 0 134 43 135 0 136 44 135 0 137 49 135 0 138 47 135 0 139 50 135 0 112 29 136 0 107 43 136 0 131 44 136 0 132 29 136 0 133 49 136 0 134 30 136 0 135 46 136 0 137 50 136 0 138 48 136 0 139 47 136 0 112 45 137 0 107 48 137 0 131 47 137 0 132 46 137 0 133 30 137 0 134 29 137 0 135 50 137 0 136 45 137 0 138 49 137 0 139 43 137 0 112 44 138 0 107 30 138 0 131 43 138 0 132 47 138 0 133 29 138 0 134 44 138 0 135 45 138 0 136 46   1 SET OF KEYS 0 THERE ARE SOME KEYS ON THE GROUND HERE. 2 BRASS LANTERN 0 THERE IS A SHINY BRASS LAMP NEARBY. 100 THERE IS A LAMP SHINING NEARBY. 3 *GRATE 0 THE GRATE IS LOCKED. 100 THE GRATE IS OPEN. 4 WICKER CAGE 0 THERE IS A SMALL WICKER CAGE DISCARDED NEARBY. 5 BLACK ROD 0 A THREE FOOT BLACK ROD WITH A RUSTY STAR ON AN END 0 LIES NEARBY. 6 BLACK ROD 0 A THREE FOOT BLACK ROD WITH A RUSTY MARK ON AN END 0 LIES NEARBY. 7 *STEPS 0 ROUGH STONE STEPS LEAD DOWN THE PIT. 100 ROUGH STONE STEPS LEAD UP THE DOME. 8 LITTLE BIRD IN CAGE 0 A CHEERFUL LITTLE BIRD IS SITTING HERE SINGING. 100 THERE IS A LITTLE BIRD IN THE CAGE. 9 *RUSTY DOOR 0 THE WAY NORTH IS BARRED BY A MASSIVE, RUSTY, IRON 0 DOOR.  100 THE WAY NORTH LEADS THROUGH A MASSIVE, RUSTY, IRON 100 DOOR. 10 VELVET PILLOW 0 A VELVET PILLOW LIES ON THE FLOOR. 11 *SNAKE 0 A HUGE GREEN FIERCE SNAKE BARS THE WAY. 100 12 *FISSURE 0  1016 'SPEL 3051 ? 29 ABOVE 3050 ABRA 3050 ABRAC 42 ACROS 29 ASCEN 2012 ATTAC 26 AWKWA 1028 AXE 8 BACK 40 BARRE 1052 BARS 1039 BATTE 1024 BEANS 1035 BEAR 16 BED 70 BEDQU 1008 BIRD 2023 BLAST 2023 BLOWU 1020 BOTTL 1055 BOX 2028 BREAK 2026 BRIEF 54 BROKE 12 BUILD 1004 CAGE 2010 CALM 25 CANYO 1040 CARPE 2001 CARRY 2001 CATCH 67 CAVE 73 CAVER 1064 CHAIN 2003 CHANT 1032 CHASM 1055 CHEST 1014 CLAM 56 CLIMB 2006 CLOSE 18 COBBL 1054 COINS  7 CONTI 2011 CONTI 33 CRACK 17 CRAWL 69 CROSS 30 D 22 DARK 51 DEBRI 63 DEPRE 30 DESCE 57 DESCR 2023 DETON 2014 DEVOU 1051 DIAMO 3066 DIG 2002 DISCA 2029 DISTU 35 DOME 1009 DOOR 30 DOWN 5 DOWNS 30 DOWNW 1031 DRAGO 1029 DRAWI 2015 DRINK 2002 DROP 2002 DUMP 1017 DWARF 1017 DWARV 43 E 43 EAST 2014 EAT 1056 EGG 1056 EGGS 1059 EMERA 3 ENTER 64 ENTRA 57 EXAMI 3066 EXCAV 11 EXIT 2011 EXPLO 2008 EXTIN 2025 FEE 3001 FEE 2021 FEED  2025 FIE 3002 FIE 2012 FIGHT 1027 FIGUR 2022 FILL 2019 FIND 1012 FISSU 58 FLOOR 2025 FOE 3003 FOE 2011 FOLLO 2025 FOO 3004 FOO 1019 FOOD 6 FORES 77 FORK 7 FORWA 2002 FREE 3079 FUCK 2025 FUM 3005 FUM 2001 GET 1037 GEYSE 27 GIANT 2011 GO 1050 GOLD 2011 GOTO 1003 GRATE 13 GULLY 1021 H2O 38 HALL 1002 HEADL 3051 HELP 2 HILL 2012 HIT 3050 HOCUS 52 HOLE 12 HOUSE 2023 IGNIT 19 IN 3142 INFO 3142 INFOR 19 INSID 2020 INVEN 19 INWAR 1016 ISSUE 1020 JAR 1053 JEWEL 39 JUMP 2001 KEEP 1001 KEY 1001 KEYS 2012 KILL 1018 KNIFE 1018 KNIVE 1002 LAMP 1002 LANTE 11 LEAVE 36 LEFT 2007 LIGHT 2006 LOCK 57 LOOK 3068 LOST 24 LOW 1038 MACHI 1016 MAGAZ 76 MAIN 1036 MESSA 1058 MING 1023 MIRRO 3069 MIST 1040 MOSS 2003 MUMBL 45 N 47 NE 1056 NEST 45 NORTH 2005 NOTHI 21 NOWHE 1050 NUGGE 21 NULL 50 NW 2008 OFF 76 OFFIC 1022 OIL 2007 ON 7 ONWAR 2004 OPEN 3050 OPENS 72 ORIEN 11 OUT 32 OUTDO  11 OUTSI 41 OVER 1015 OYSTE 23 PASSA 1061 PEARL 1062 PERSI 1010 PILLO 1030 PIRAT 31 PIT 2010 PLACA 1024 PLANT 1025 PLANT 1060 PLATI 71 PLOVE 65 PLUGH 3050 POCUS 1058 POTTE 2013 POUR 2011 PROCE 2027 PURUS 1060 PYRAM 2018 QUIT 1019 RATIO 2027 READ 2002 RELEA 75 RESER 8 RETRE 8 RETUR 37 RIGHT 2 ROAD 15 ROCK 1005 ROD 1006 ROD 59 ROOM 2016 RUB 1062 RUG 2011 RUN 46 S 2030 SAVE !2003 SAY 2024 SCORE 48 SE 66 SECRE 3050 SESAM 1027 SHADO  2009 SHAKE 1058 SHARD 2028 SHATT 3050 SHAZA 74 SHELL 1052 SILVE 2003 SING 61 SLAB 61 SLABR 2012 SLAY 60 SLIT 2028 SMASH 1011 SNAKE 46 SOUTH 1016 SPELU 1063 SPICE 10 STAIR 1026 STALA 2001 STEAL 34 STEPS 1007 STEPS 3139 STOP 14 STREA 2012 STRIK 20 SURFA !2030 SUSPE #49 SW 3147 SWIM 2009 SWING 1013 TABLE 2001 TAKE 2010 TAME 2017 THROW 2017 TOSS 2001 TOTE 57 TOUCH 2011 TRAVE 1055 TREAS 3064 TREE 3064 TREES 1057 TRIDE 1033 TROLL 1034 TROLL  23 TUNNE 2011 TURN 29 U 2004 UNLOC 29 UP 4 UPSTR 29 UPWAR 2003 UTTER 9 VALLE 1058 VASE 1010 VELVE 1038 VENDI 28 VIEW 1037 VOLCA 44 W 2029 WAKE 2011 WALK 53 WALL 1021 WATER 2009 WAVE 44 WEST 2019 WHERE 62 XYZZY 55 Y2 ?^yy ?^ 1 SOMEWHERE NEARBY IS COLOSSAL CAVE, WHERE OTHERS HA 1 VE FOUND FORTUNES IN TREASURE AND GOLD, THOUGH IT 1 IS RUMORED THAT SOME WHO ENTER ARE NEVER SEEN AGAI 1 N. MAGIC IS SAID TO WORK IN THE CAVE. 1 I WILL BE YOUR EYES AND HANDS. DIRECT ME WITH C 1 OMMANDS OF ONE OR TWO WORDS. 1 I SHOULD WARN YOU THAT I LOOK AT ONLY THE FIRST 1 FIVE LETTERS OF EACH WORD, SO THAT YOU'LL HAVE TO 1 ENTER 'NORTHEAST' AS 'NE' TO DISTINGUISH IT FROM ' 1 NORTH'. (SHOULD YOU GET STUCK, TYPE  100 A CRYSTAL BRIDGE NOW SPANS THE FISSURE. 200 THE CRYSTAL BRIDGE HAS VANISHED. 13 *STONE TABLET 0 A MASSIVE STONE TABLET IMBEDDED IN THE WALL READS 0 'CONGRATULATIONS ON BRINGING LIGHT INTO THE DARK-R 0 OOM. 14 GIANT CLAM >GRUNT.< 0 THERE IS AN ENORMOUS CLAM HERE WITH ITS SHELL TIGH 0 TLY CLOSED. 15 GIANT OYSTER >GROAN<. 0 THERE IS AN ENORMOUS OYSTER HERE WITH ITS SHELL TI 0 GHTLY CLOSED. 100 INTERESTING. THERE SEEMS TO BE SOMETHING WRITTEN 100 ON THE UNDERSIDE OF THE OYSTER. 16 'SPELUNKER TODAY' 0 THERE ARE A FEW RECENT ISSUES OF 'SPELUNKER TODAY' 0 MAGAZINE HERE. 19 TASTY FOOD 0 THERE IS FOOD HERE. 20 SMALL BOTTLE 0 THERE IS A BOTTLE OF WATER HERE. 100 THERE IN AN EMPTY BOTTLE HERE. 200 THERE IS A BOTTLE OF OIL HERE. 21 WATER IN THE BOTTLE 22 OIL IN THE BOTTLE 23 MIRROR 0 24 PLANT 0 THERE IS A TINY LITTLE PLANT IN THE PIT, MURMURMIN 0 G WATER, WATER,... 100 THE PLANT SPURTS INTO FURIOUS GROWTH FOR A FEW SEC 100 ONDS.  200 THERE IS A TWELVE FOOT TALL BEANSTALK STRETCHING U 200 P OUT OF THE PIT, BELLOWING WATER!! WATER!! 300 THE PLANT GROWS EXPLOSIVELY, ALMOST FILLING THE BO 300 TTOM OF THE PIT. 400 THERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE W 400 AY UP TO THE HOLE. 500 YOU'VE OVER WATERED THE PLANT. IT'S SHIRVELING UP 500 . IT'S, IT'S... 25 *PHONY PLANT 0 100 THE TOP OF A TWELVE FOOT TALL BEANSTALK IS POKING 100 OUT OF THE WEST PIT. 200 THERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST 200 PIT UP TO THE HOLE. 26 *STALACTITE 0 27 *SHADOWY FIGURE 0 THE SHADOWY FIGURE SEEMS TO BE TRYING TO ATTRACT Y 0 OUR ATTENTION. 28 DWARF'S AXE 0 THERE IS A LITTLE AXE HERE. 100 THERE IS A LITTLE AXE LYING BESIDE THE BEAR. 29 *CAVE DRAWINGS  0 30 *PIRATE 0 31 *DRAGON 0 A HUGE GREEN DRAGON BARS THE WAY. 100 CONGRATULATIONS. YOU HAVE JUST VANQUISHED A DRAGO 100 N WITH YOUR BARE HANDS. (UNBELIEVABLE, ISN'T IT?) 200 THE BODY OF A HUGE GREEN DEAD DRAGON IS LYING OFF  200 TO ONE SIDE. 32 *CHASM 0 A RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, 0 VANISHING INTO THE MIST ON THE OTHER SIDE. A SIGN 0 POSTED ON THE BRIDGE READS, 'STOP. PAY TROLL.' 100 THE WRECKAGE OF A BRIDGE (AND A DEAD BEAR) CAN BE 100 SEEN AT THE BOTTOM OF THE CHASM. 33 *TROLL 0 A BURLY TROLL STANDS BY THE BRIDGE AND INSISTS THA 0 T YOU THROW HIM A TREASURE BEFORE YOU MAY CROSS. 100 THE TROLL STEPS OUT FROM BENEATH THE BRIDGE AND BL 100 OCKS YOUR WAY. 200 34 *PHONY TROLL  0 THE TROLL IS NOWHERE TO BE SEEN. 35 0 THERE IS A FEROCIOUS CAVE BEAR EYING YOU FROM THE 0 FAR END OF THE ROOM. 100 THERE IS A GENTLE CAVE BEAR SITTING PLACIDLY IN ON 100 E CORNER. 200 THERE IS A CONTENTED LOOKING BEAR WANDERING ABOUT 200 NEARBY. 300 36 *2ND MAZE MSG 0 THERE IS A MESSAGE SCRAWLED IN THE DUST IN A FLOWE 0 RY SCRIPT, READING 'THIS IS NOT THE MAZE WHERE THE 0 PIRATE LEAVES HIS TREASURE CHEST'. 37 *VOLCANO 0 38 *VENDING MACHINE  0 THERE IS A MASSIVE VENDING MACHINE HERE. THE INST 0 RUCTIONS ON IT READ 'DROP COINS HERE TO RECEIVE FR 0 ESH BATTERIES'. 39 BATTERIES 0 THERE ARE FRESH BATTERIES HERE. 100 SOME WORN OUT BATTERIES HAVE BEEN DISCARDED NEARBY 100 . 40 *CARPET/MOSS 0 50 LARGE GOLD NUGGET 0 THERE IS A LARGE SPARKLING NUGGET OF GOLD HERE! 51 SEVERAL DIAMONDS 0 THERE ARE DIAMONDS HERE! 52 BARS OF SILVER 0 THERE ARE BARS OF SILVER HERE! 53 PRECIOUS JEWELRY 0 THERE IS PRECIOUS JEWELRY HERE! 54 RARE COINS 0 THERE ARE MANY COINS HERE! 55 TREASURE CHEST 0 THE PIRATE'S TREASURE CHEST IS HERE! 56 GOLDEN EGGS 0 THERE IS A LARGE NEST HERE, FULL OF GOLDEN EGGS! 100 THE NEST OF GOLDEN EGGS HAS VANISHED. 200 DONE. 57 JEWELED TRIDENT 0 THERE IS A JEWEL ENCRUSTED TRIDENT HERE! 58 MING VASE 0 THERE IS A DELICATE, PRECIOUS MING VASE HERE! 100 THE VASE IS NOW RESTING, DELICATLY, ON A VELVET PI 100 LLOW. 200 THE FLOOR IS LITTERED WITH WORTHLESS SHARDS OF POT 200 TERY.  300 THE MING VASE DROPS WITH A DELICATE CRASH. 59 EGG SIZED EMERALD 0 THERE IS A EMERALD HERE THE SIZE OF A PLOVER'S EGG 0 ! 60 PLATINUM PYRAMID 0 THERE IS A PLATINUM PYRAMID HERE, 8 INCHES ON A SI 0 DE! 61 GLISTENING PEARL 0 OFF TO ONE SIDE LIES A GLISTENING PEARL! 62 PERSIAN RUG 0 THERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR! 100 THE DRAGON IS SPRAWLED OUT ON A PERSIAN RUG. 63 RARE SPICES 0 THERE ARE RARE SPICES HERE! 64 GOLDEN CHAIN 0 THERE IS A GOLDEN CHAIN LYING IN A HEAP ON THE FLO 0 OR. 100 THE BEAR IS LOCKED TO THE WALL WITH A GOLDEN CHAIN 100 . 200 THERE IS A GOLDEN CHAIN LOCKED TO THE WALL. !   63 HERE FOR THE KEYS. 64 THE TREES OF THE FOREST ARE LARGE HARDWOOD OAK AND 64 MAPLE, WITH AN OCCASIONAL GROVE OF PINE OR SPRUCE 64 . THERE IS QUITE A BIT OF UNDER GROWTH, LARGLY BI 64 RCH AND ASH SAPLINGS PLUS NON DESCRIPT BUSHES OF V 64 ARIOUS SORTS. 64 THIS TIME OF YEAR VISIBILITY IS QUITE RESTRICTED 64 BY ALL THE LEAVES, BUT TRAVEL IS QUITE EASY IF YO 64 U DETOUR AROUND THE SPRUCE AND BERRY BUSHES. 65 WELCOME TO ADVENTURE... WOULD YOU LIKE INSTRUCTION 65 S?  66 DIGGING WITHOUT A SHOVEL IS QUITE IMPRACTICAL. EV 66 EN WITH A SHOVEL PROGRESS IS UNLIKELY. 67 BLASTING REQUIRES DYNAMITE. 68 I'M AS CONFUSED AS YOU ARE. 69 MIST IS A WHITE VAPOR, USUALLY WATER, SEEN FROM TI 69 ME TO TIME IN CAVERNS. IT CAN BE FOUND ANYWHERE, 69 BUT IS FREQUENTLY A SIGN OF A DEEP PIT LEADING DOW 69 N TO WATER. 70 YOUR FEET ARE NOW WET. 71 I THINK I JUST LOST MY APPETITE. 72 THANK YOU, IT WAS DELICIOUS. 73 YOU HAVE TAKEN A DRINK FROM THE STREAM. THE WATER 73  TASTES STRONGLY OF MINERALS, BUT IS NOT UNPLEASAN 73 T. IT IS EXTREMELY COLD. 74 THE BOTTLE OF WATER IS NOW EMPTY. 75 IT'S AN ELECTRIC LAMP AND RUBBING IT IS NOT PARTIC 75 ULARLY REWARDING. ANYWAY, NOTHING HAPPENS. 76 PECULIAR. NOTHING UNEXPECTED HAPPENS. 77 YOUR BOTTLE IS EMPTY AND THE GROUND AT YOUR FEET I 77 S WET. 78 YOU CAN'T POUR THAT. 79 FUCK YOURSELF! KEEP THAT UP AND YOU'RE ON YOUR OW 79 N. 80 WHICH WAY? 81 OH DEAR, YOU SEEM TO HAVE GOTTEN YOURSELF KILLED. 'HELP' FOR SO 1 ME GENERAL HINTS. 2 A LITTLE DWARF WITH A BIG KNIFE BLOCKS YOUR WAY. 3 A LITTLE DWARF JUST WALKED AROUND A CORNER, SAW YO 3 U, THREW A LITTLE AXE AT YOU WHICH MISSED, CURSED, 3 AND RAN AWAY. 4 THERE IS A THREATENING LITTLE DWARF IN THE ROOM WI 4 TH YOU. 5 ONE SHARP NASTY KNIFE IS THROWN AT YOU. 6 NONE OF THEM HIT YOU. 7 ONE OF THEM GETS YOU. 8 A HOLLOW VOICE SAYS 'PLUGH'. 9 THERE IS NO WAY TO GO IN THAT DIRECTION.  10 I AM UNSURE HOW YOU ARE FACING. USE COMPASS POINT 10 S OR NEARBY OBJECTS. 11 I DON'T KNOW IN FROM OUT HERE. USE COMPASS POINTS 11 OR NAME SOMETHING IN THE GENERAL DIRECTION YOU WA 11 NT TO GO. 12 I DON'T KNOW HOW TO APPLY THAT WORD HERE.  13 I DON'T UNDERSTAND THAT. 14 I'M GAME. WOULD YOU CARE TO EXPLAIN HOW? 15 SORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL. 15 I WILL REPEAT THE LONG DESCRIPTION OF YOUR LOCATIO 15 N. 16 IT IS NOW PITCH DARK. IF YOU PROCEED YOU WILL LIK 16 ELY FALL INTO A PIT. 17 IF YOU PREFER, SIMPLY TYPE W RATHER THAN WEST. 18 ARE YOU TRYING TO CATCH THE BIRD? 19 THE BIRD IS FRIGHTENED NOW AND YOU CANNOT CATCH IT 19 NO MATTER WHAT YOU TRY. PERHAPS YOU MIGHT TRY LA 19 TER. 20 ARE YOU TRYING TO SOMEHOW DEAL WITH THE SNAKE? 21 YOU CAN'T KILL THE SNAKE, OR DRIVE IT AWAY, OR AVO 21 ID IT, OR ANYTHING LIKE THAT. THERE IS A WAY TO G 21 ET BY, BUT YOU DON'T HAVE THE NECESSARY RESOURCES 21 RIGHT NOW. 22 DO YOU REALLY WANT TO QUIT NOW?  23 YOU FELL INTO A PIT AND BROKE EVERY BONE IN YOUR B 23 ODY. 24 YOU ARE ALREADY CARRYING IT. 25 YOU CAN'T BE SERIOUS. 26 THE BIRD WAS UNAFRAID WHEN YOU ENTERED, BUT AS YOU 26 APPROACH IT BECOMES DISTURBED AND YOU CAN'T CATCH 26 IT. 27 YOU CAN CATCH THE BIRD, BUT YOU CANNOT CARRY IT. 28 THERE IS NOTHING HERE WITH A LOCK. 29 YOU AREN'T CARRYING IT. 30 THE LITTLE BIRD ATTACKS THE GREEN SNAKE, AND IN AN 30 ASTOUNDING FLURRY DRIVES THE SNAKE AWAY. 31 YOU HAVE NO KEYS. 32 IT HAS NO LOCK. 33 I DON'T KNOW HOW TO LOCK OR UNLOCK SUCH A THING. 34 IT WAS ALREADY LOCKED. 35 THE GRATE IS NOW LOCKED. 36 THE GRATE IS NOW UNLOCKED. 37 IT WAS ALREADY UNLOCKED. 38 YOU HAVE NO SOURCE OF LIGHT. 39 YOUR LAMP IS NOW ON. 40 YOUR LAMP IS NOW OFF. 41 THERE IS NO WAY TO GET PAST THE BEAR TO UNLOCK THE 41 CHAIN, WHICH IS PROBABLY JUST AS WELL. 42 NOTHING HAPPENS. 43 WHERE? 44 THERE IS NOTHING HERE TO ATTACK. 45 THE LITTLE BIRD IS NOW DEAD. ITS BODY DISAPPEARS.  46 ATTACKING THE SNAKE BOTH DOESN'T WORK AND IS VERY 46 DANGEROUS. 47 YOU KILLED A LITTLE DWARF. 48 YOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF TH 48 E WAY. 49 WITH WHAT? YOUR BARE HANDS? 50 GOOD TRY, BUT THAT IS AN OLD WORN OUT MAGIC WORD. 51 I KNOW OF PLACES, ACTIONS, AND THINGS. MOST OF MY 51 VOCABULARY DESCRIBES PLACES AND IS USED TO MOVE Y 51 OU THERE. TO MOVE, TRY WORDS LIKE FOREST, BUILDIN 51 G, DOWNSTREAM, ENTER, EAST, WEST, NORTH, SOUTH, UP 51 , OR DOWN. 51 I KNOW ABOUT A FEW SPECIAL OBJECTS, LIKE A BLACK 51 ROD HIDDEN IN THE CAVE. 51 THESE OBJECTS CAN BE MANIPULATED USING SOME OF T 51 HE ACTION WORDS THAT I KNOW. USUALLY YOU WILL NEE 51 D TO GIVE BOTH THE OBJECT AND ACTION WORD (IN EITH 51 ER ORDER), BUT SOMETIMES I CAN INFER THE OBJECT FR 51 OM 51 THE VERB ALONE. SOME OBJECTS ALSO IMPLY VERBS; I 51 N PARTICULAR, 'INVENTORY' IMPLIES 'TAKE INVENTORY' 51 , WHICH CAUSES ME TO GIVE YOU A LIST OF WHAT YOU A  51 RE CARRYING. THE OBJECTS HAVE SIDE EFFECTS; FOR I 51 NSTANCE, THE ROD SCARES THE BIRD. 51 USUALLY PEOPLE HAVING TROUBLE MOVING JUST NEED T 51 O TRY A FEW MORE WORDS. USUALLY PEOPLE TRYING UNS 51 UCCESFULLY TO MANIPULATE AN OBJECT ARE ATTEMPTING 51 SOMETHING BEYOND THEIR (OR MY) CAPABILITIES AND SH 51 OULD TRY A COMPLETELY 51 DIFFERENT TACK. TO SPEED THE GAME YOU CAN SOMETI 51 MES MOVE LONG DISTANCES WITH A SINGLE WORD. FOR E 51 XAMPLE, 'BUILDING' USUALLY GETS YOU TO THE BUILDIN 51 G FROM ANYWHERE ABOVE GROUND EXCEPT WHEN LOST IN T 51 HE FOREST. 51 ALSO, NOTE THAT CAVE PASSAGES TURN A LOT, AND TH 51 AT LEAVING A ROOM TO THE NORTH DOES NOT GUARANTEE 51 ENTERING THE NEXT ROOM FROM THE SOUTH. GOOD LUCK. 52 IT MISSES. 53 IT GETS YOU. 54 OK 55 YOU CAN'T UNLOCK THE KEYS. 56 YOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND W 56 OUND UP BACK IN THE MAIN PASSAGE. 57 I DON'T KNOW WHERE THE CAVE IS, BUT HEREABOUTS NO  57 STREAM CAN RUN ON THE SURFACE FOR LONG. I WOULD T 57 RY THE STREAM. 58 I NEED MORE DETAILED INSTRUCTIONS TO DO THAT. 59 I CAN ONLY TELL YOU WHAT YOU SEE AS YOU MOVE ABOUT 59 AND MANIPULATE THINGS. I CANNOT TELL YOU WHERE R 59 EMOTE THINGS ARE. 60 I DON'T KNOW THAT WORD. 61 WHAT? 62 ARE YOU TRYING TO GET INTO THE CAVE? 63 THE GRATE IS VERY SOLID AND HAS A HARDENED STEEL L 63 OCK. YOU CANNOT ENTER WITHOUT A KEY, AND THERE AR 63 E NO KEYS NEARBY. I WOULD RECOMMEND LOOKING ELSEW   136 THE RESULTING RUCKUS HAS AWAKENED THE DWARVES. TH 136 ERE ARE NOW SEVERAL THREATENING LITTLE DWARVES IN 136 THE ROOM WITH YOU. MOST OF THEM THROW KNIVES AT Y 136 OU. ALL OF THEM GET YOU. 137 OH, LEAVE THE POOR UNHAPPY BIRD ALONE. 138 I DARESAY WHATEVER YOU WANT IS AROUND HERE SOMEWHE 138 RE. 139 I DON'T KNOW THE WORD 'STOP'. USE QUIT' IF YOU WA 139 NT TO GIVE UP. 140 YOU CAN'T GET THERE FROM HERE. 141 YOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR. 143 DO YOU INDEED WISH TO QUIT NOW? 144 THERE IS NOTHING HERE WITH WHICH TO FILL THE VASE. 145 THE SUDDEN CHANGE IN TEMPERATURE HAS DELICATELY SH 145 ATTERED THE VASE. 146 IT IS BEYOND YOUR POWER TO DO THAT. 147 I DON'T KNOW HOW. 148 IT IS TOO FAR UP FOR YOU TO REACH. 149 YOU KILLED A LITTLE DWARF. THE BODY VANISHES IN A 149 CLOUD OF GREASY BLACK SMOKE. 150 THE SHELL IS VERY STRONG AND IS IMPERVIOUS TO ATTA 150 CK. 151 WHAT'S THE MATTER, CAN'T YOU READ? NOW YOU'D BEST 151 START OVER.  152 THE AXE BOUNCES HARMLESSLY OFF THE DRAGON'S THICK 152 SCALES. 153 THE DRAGON LOOKS RATHER NASTY. YOU'D BEST NOT TRY 153 TO GET BY. 154 THE LITTLE BIRD ATTACKS THE GREEN DRAGON AND IN AN 154 ASTOUNDING FLURRY GETS BURNT TO A CINDER. THE AS 154 HES BLOW AWAY. 155 ON WHAT? 156 OKAY, FROM NOW ON I'LL ONLY DESCRIBE A PLACE IN FU 156 LL THE FIRST TIME YOU COME TO IT. TO GET THE FULL 156 DESCRIPTION, SAY 'LOOK'. 157 TROLLS ARE CLOSE RELATIVES WITH THE ROCK AND HAVE 157 SKIN AS TOUGH AS THA 81 I MIGHT BE ABLE TO HELP YOU OUT, BUT I'VE NEVER R 81 EALLY DONE THIS KIND OF THING BEFORE. DO YOU WANT 81 ME TO TRY TO REINCARNATE YOU? 82 ALL RIGHT. BUT DON'T BLAME ME IF SOMETHING GOES W 82 R..... YOU ARE ENGULFED IN A CLOU 82 D OF ORANGE SMOKE. COUGHING AND GASPING, YOU EMER 82 GE FROM THE CLOUD AND FIND.... 83 YOU CLUMSY OAF! YOU'VE DONE IT AGAIN. I DON'T KN 83 OW HOW LONG I CAN KEEP THIS UP. DO YOU WANT ME TO 83 TRY REINCARNATING YOU AGAIN? 84 OKAY, NOW WHERE DID I PUT MY ORANGE SMOKE?.... 84 >POOF< EVERYTHING DISAPPEARS IN A DE 84 NSE CLOUD OF ORANGE SMOKE. 85 NOW YOU'VE REALLY DONE IT. I'M OUT OF ORANGE SMOK 85 E. YOU DON'T EXPECT ME TO DO A DECENT REINCARNATI 85 ON WITHOUT ORANGE SMOKE, DO YOU? 86 OKAY, IF YOU'RE SO SMART DO IT YOURSELF. I'M LEAV 86 ING. 91 SORRY, BUT I NO LONGER SEEM TO REMEMBER HOW IT WAS 91 YOU GOT HERE. 92 YOU CAN'T CARRY ANYTHING MORE. YOU'LL HAVE TO DRO 92 P SOMETHING FIRST.  93 YOU CAN'T GO THROUGH A LOCKED STEEL GRATE. 94 I BELIEVE WHAT YOU WANT IS RIGHT HERE WITH YOU. 95 YOU DON'T FIT THROUGH A TWO-INCH SLIT. 96 I RESPECTFULLY SUGGEST YOU GO ACROSS THE BRIDGE IN 96 STEAD OF JUMPING. 97 THERE IS NO WAY ACROSS THE FISSURE. 98 YOU'RE NOT CARRYING ANYTHING. 99 YOU ARE CURRENTLY HOLDING THE FOLLOWING: 100 IT'S NOT HUNGRY (IT'S MERELY PININ' FOR THE FJORDS 100 ). BESIDES, YOU HAVE NO BIRD SEED. 101 THE SNAKE HAS NOW DEVOURED YOUR BIRD. 102 THERE'S NOTHING HERE IT WANTS TO EAT (EXCEPT PERHA 102 PS YOU). 103 FOOL, DWARVES EAT ONLY COAL. NOW YOU'VE MADE HIM 103 *REALLY* MAD. 104 YOU HAVE NOTHING IN WHICH TO CARRY IT. 105 YOUR BOTTLE IS ALREADY FULL. 106 THERE IS NOTHING HERE WITH WHICH TO FILL THE BOTTL 106 E. 107 YOUR BOTTLE IS NOW FULL OF WATER. 108 YOUR BOTTLE IS NOW FULL OF OIL. 109 YOU CAN'T FILL THAT. 110 DON'T BE RIDICULOUS. 111 THE DOOR IS EXTREMELY RUSTY AND REFUSES TO OPEN. 112 THE PLANT INDIGNANTLY SHAKES THE OIL OFF ITS LEAVE  112 S AND ASKS, 'WATER'? 113 THE HINGES ARE QUITE THROUGHLY RUSTED NOW AND WON' 113 T BUDGE. 114 THE OIL HAS FREED UP THE HINGES SO THAT THE DOOR W 114 ILL NOW MOVE, THOUGH IT REQUIRES SOME EFFORT. 115 THE PLANT HAS EXCEPTIONLY DEEP ROOTS AND CANNOT BE 115 PULLED FREE. 116 THE DWARVE'S KNIVES VANISH AS THEY STRIKE THE WALL 116 S OF THE CAVE. 117 SOMETHING YOU'RE CARRYING WON'T FIT THROUGH THE TU 117 NNEL WITH YOU. YOU'D BEST TAKE INVENTORY AND DROP 117 SOMETHING. 118 YOU CAN'T FIT THIS FIVE-FOOT CLAM THROUGH THAT LIT 118 TLE PASSAGE. 119 YOU CAN'T FIT THIS FIVE-FOOT OYSTER THROUGH THAT L 119 ITTLE PASSAGE. 120 I ADVISE YOU TO PUT DOWN THE CLAM BEFORE OPENING I 120 T. (STRAIN). 121 I ADVISE YOU TO PUT DOWN THE OYSTER BEFORE OPENING 121  IT. (WRENCH). 122 YOU DON'T HAVE ANYTHING STRONG ENOUGH TO OPEN THE 122 CLAM. 123 YOU DON'T HAVE ANYTHING STRONG ENOUGH TO OPEN THE 123 OYSTER. 124 A GLISTENING PEARL FALLS OUT OF THE CLAM AND ROLLS  124 AWAY. GOODNESS, THIS MUST REALLY BE AN OYSTER. 124 (I NEVER WAS ANY GOOD AT IDENTIFYING BIVALVES.) W 124 HATEVER IT IS, IT HAS NOW SNAPPED SHUT AGAIN. 125 THE OYSTER CREAKS OPEN, REVEALING NOTHING BUT OYST 125 ER INSIDE. IT PROMPTLY SNAPS SHUT AGAIN. 126 YOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND F 126 OUND YOUR WAY BLOCKED BY A RECENT CAVE-IN. YOU AR 126 E NOW IN THE MAIN PASSAGE. 127 THERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS 127 BEHIND YOU. 128 OUT FROM THE SHADOWS BEHIND YOU POUNCES A BEARDED 128 PIRATE. 'HAR, HAR' HE CHORTLES, 'I'LL JUST TAKE A 128 LL THIS BOOTY AND HIDE IT AWAY WITH ME CHEST DEEP 128 IN THE MAZE.' HE SNATCHES YOUR TREASURE AND 128 VANISHES INTO THE GLOOM. 129 A SEPUCHRAL VOICE REVERBRATING THROUGH THE CAVE, S 129 AYS, 'CAVE CLOSING SOON. ALL ADVENTURERS EXIT THR 129 OUGH MAIN OFFICE.' 130 A MYSTERIOUS RECORDED VOICE GROANS INTO LIFE AND A 130 NNOUNCES 'THIS EXIT IS CLOSED. PLEASE LEAVE VIA M 130 AIN OFFICE'.  131 IT LOOKS AS THOUGH YOU'RE DEAD. WELL, SEEING AS H 131 OW IT'S SO CLOSE TO CLOSING TIME ANYWAY, I THINK I 131 'LL JUST CALL IT A DAY. 132 THE SEPULCHRAL VOICE INTONES, 'THE CAVE IS NOW CLO 132 SED.' AS THE ECHOES FADE, THERE IS A BLINDING FLA 132 SH OF LIGHT (AND A SMALL PUFF OF ORANGE SMOKE). A 132 S YOUR EYES REFOCUS, YOU LOOK AROUND AND FIND.... 133 THERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE 133 APPEARS IN THE FAR WALL, BURYING THE DWARVES IN TH 133 E RUBBLE. YOU MARCH THROUGH THE HOLE AND FIND YOU 133 RSELF IN THE MAIN OFFICE, 133 WHERE A CHEERING BAND OF FRIENDLY ELVES CARRY THE 133 CONQUERING ADVENTURER OFF INTO THE SUNSET. 134 THERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE 134 APPEARS IN THE FAR WALL, BURYING THE SNAKES IN THE 134 RUBBLE. A RIVER OF MOLTEN LAVA POURS IN THROUGH 134 THE HOLE, DESTROYING EVERYTHING IN ITS PATH, INCLU 134 DING YOU. 135 THERE IS A LOUD EXPLOSION, AND YOU ARE SUDDENLY SP 135 LASHED ACROSS THE WALLS OF THE ROOM.    1 3 0 2 3 0 3 8 9 4 10 0 5 11 0 6 0 0 7 14 15 8 13 0 9 94 -1 10 96 0 11 19 -1 12 17 27 13 101 -1 14 103 0 15 0 0 16 106 0 17 0 -1 18 0 0 19 3 0 20 3 0 21 0 0 22  0 0 23 109 -1 24 25 -1 25 23 67 26 111 -1 27 35 110 28 0 0 29 97 -1 30 0 0 31 119 121 32 117 122 33 117 122 34 0 0 35 130 -1 36 0 -1 37 126 -1 38 140 -1 39 0 0 40 96 -1 41 0 0 42 0 0 43 0  0 44 0 0 45 0 0 46 0 0 47 0 0 48 0 0 49 0 0 50 18 0 51 27 0 52 28 0 53 29 0 54 30 0 55 0 0 56 92 0 57 95 0 58 97 0 59 100 0 60 101 0 61 0 0 62 119 121 63 127 0 64 130 -1  65 0 0 66 0 0 67 0 0 68 0 0 69 0 0 70 0 0 71 0 0 72 0 0 73 0 0 74 0 0 75 0 0 T OF A RHINOCEROS. THE TROLL 157 FENDS OFF YOUR BLOWS EFFORTLESSLY. 158 THE TROLL DEFTLY CATCHES THE AXE, EXAMINES IT CARE 158 FULLY, AND TOSSES IT BACK, DECLARING, 'GOOD WORKMA 158 NSHIP, BUT IT'S NOT VALUABLE ENOUGH.' 159 THE TROLL CATCHES YOUR TREASURE AND SCURRIES AWAY 159 OUT OF SIGHT. 160 THE TROLL REFUSES TO LET YOU CROSS. 161 THERE IS NO LONGER ANY WAY ACROSS THE CHASM. 162 JUST AS YOU REACH THE OTHER SIDE, THE BRIDGE BUCKL 162 ES BENEATH THE WEIGHT OF THE BEAR, WHICH WAS STILL  162 FOLLOWING YOU AROUND. YOU SCRABBLE DESPERATELY F 162 OR SUPPORT, BUT AS THE BRIDGE COLLAPSES YOU STUMBL 162 E BACK AND FALL INTO THE CHASM. 163 THE BEAR LUMBERS TOWARD THE TROLL, WHO LETS OUT A 163 STARTLED SHRIEK AND SCURRIES AWAY. THE BEAR SOON 163 GIVES UP THE PURSUIT AND WANDERS BACK. 164 THE AXE MISSES AND LANDS NEAR THE BEAR WHERE YOU C 164 AN'T GET AT IT. 165 WITH WHAT? YOUR BARE HANDS? AGAINST *HIS* BEAR H 165 ANDS?? 166 THE BEAR IS CONFUSED; HE ONLY WANTS TO BE YOUR FRI 166 END. 167 FOR CRYING OUT LOUD, THE POOR THING IS ALREADY DEA 167 D. 168 THE BEAR EAGERLY WOLFS DOWN YOUR FOOD, AFTER WHICH 168 HE SEEMS TO CALM DOWN CONSIDERABLY AND EVEN BECOM 168 ES RATHER FRIENDLY. 169 THE BEAR IS STILL CHAINED TO THE WALL. 170 THE CHAIN IS STILL LOCKED. 171 THE CHAIN IS NOW UNLOCKED. 172 THE CHAIN IS NOW LOCKED. 173 THERE IS NOTHING HERE TO WHICH THE CHAIN CAN BE LO 173 CKED. 174 THERE IS NOTHING HERE TO EAT. 175 DO YOU WANT THE HINT?  176 DO YOU NEED HELP GETTING OUT OF THE MAZE? 177 YOU CAN MAKE THE PASSAGES LOOK LESS ALIKE BY DROPP 177 ING THINGS. 178 ARE YOU TRYING TO EXPLORE BEYOND THE PLOVER ROOM? 179 THERE IS A WAY TO EXPLORE THAT REGION WITHOUT HAVI 179 NG TO WORRY ABOUT FALLING INTO A PIT. NONE OF THE 179 OBJECTS AVAILABLE IS IMMEDIATELY USEFULL IN DISCO 179 VERING THE SECRET. 180 DO YOU NEED HELP GETTING OUT OF HERE? 181 DON'T GO WEST. 182 GLUTTONY IS NOT ONE OF THE TROLL'S VICES. AVARICE 182 , HOWEVER, IS. 183 YOUR LAMP IS GETTING DIM. YOU'D BEST START WRAPPI 183 NG THIS UP, UNLESS YOU CAN FIND SOME FRESH BATTERI 183 ES. I SEEM TO RECALL THERE'S A VENDING MACHINE IN 183 THE MAZE. BRING SOME COINS WITH YOU. 184 YOUR LAMP HAS RUN OUT OF POWER. 185 THERE'S NOT MUCH POINT IN WANDERING AROUND OUT HER 185 E, AND YOU CAN'T EXPLORE THE CAVE WITHOUT A LAMP. 185 SO LET'S JUST CALL IT A DAY. 186 THERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS 186 BEHIND YOU. AS YOU TURN TOWARD THEM, THE BEAM OF  186 YOUR LAMP FALLS ACROSS A BEARDED PIRATE. HE IS CA 186 RRYING A LARGE CHEST. 'SHIVER ME TIMBERS.' HE CR 186 IES, 'I'VE BEEN SPOTTED. 186 I'D BEST HIE MESELF OFF TO THE MAZE TO HIDE ME C 186 HEST.' WITH THAT, HE VANISHES INTO THE GLOOM. 187 YOUR LAMP IS GETTING DIM. YOU'D BEST GO BACK FOR 187 THOSE BATTERIES. 188 YOUR LAMP IS GETTING DIM. I'M TAKING THE LIBERTY 188 OF REPLACING THE BATTERIES. 189 YOUR LAMP IS GETTING DIM, AND YOU'RE OUT OF SPARE 189 BATTERIES. YOU'D BEST START WRAPPING THIS UP. 190 I'M AFRAID THE MAGAZINE IS WRITTEN IN DWARVISH. 191 'THIS IS NOT THE MAZE WHERE THE PIRATE LEAVES HIS 191 CHEST.' 192 HMMM, THIS LOOKS LIKE A CLUE, WHICH MEANS IT'LL CO 192 ST YOU TEN POINTS TO READ IT. SHOULD I GO AHEAD A 192 ND READ IT ANYWAY? 193 IT SAYS, 'THERE IS SOMETHING STRANGE ABOUT THIS PL 193 ACE, SUCH THAT ONE OF THE WORDS I'VE ALWAYS KNOWN 193 NOW HAS A NEW EFFECT.' 194 IT SAYS THE SAME THING IT DID BEFORE. 195 I'M AFRAID I DON'T UNDERSTAND.  196 CONGRATULATIONS ON BRINGING LIGHT INTO THE DARK-RO 196 OM. 197 YOU STRIKE THE MIRROR A RESOUNDING BLOW, WHEREUPON 197 IT SHATTERS INTO A MYRIAD TINY FRAGMENTS. 198 YOU HAVE TAKEN THE VASE AND HURLED IT DELICATELY T 198 O THE GROUND. 199 YOU PROD THE NEAREST DWARF, WHO WAKES UP GRUMPILY, 199 TAKES ONE LOOK AT YOU, CURSES, AND GRABS FOR HIS 199 AXE. 200 IS THIS ACCEPTABLE? !201 ARE YOU RESUMING AN EARLIER ADVENTURE?  ! ?^y 85 YOU ARE OBVIOUSLY A RANK AMATEUR. BETTER LUCK ! 85 NEXT TIME. !115 YOUR SCORE QUALIFIES YOU AS A NOVICE ADVENTURER. !155 YOU HAVE ACHIEVED THE RATING: "EXPERIENCED ADVENTURER". !190 YOU MAY NOW CONSIDER YOURSELF A "SEASONED ADVENTURER". !240 YOU HAVE REACHED "JUNIOR MASTER" STATUS. !280 YOUR SCORE PUTS YOU IN MASTER ADVENTURER CLASS C. !315 YOUR SCORE PUTS YOU IN MASTER ADVENTURER CLASS B. !345 YOUR SCORE PUTS YOU IN MASTER ADVENTURER CLASS A.  350 ALL OF ADVENTUREDOM GIVES TRIBUTE TO YOU,  76 0 0 77 0 0 78 0 0 79 0 0 80 0 0 81 0 0 82 0 0 83 0 0 84 0 0 85 0 0 86 0 0 87 0 0 88 0 0 89 0 0 90 0 0 91 0 0 92 0 0 93 0 0 94 0 0 95 0 0 96 0 0 97  0 0 98 0 0 99 0 0 100 0 0  1 24 2 29 3 0 4 33 5 0 6 33 7 38 8 38 9 42 10 14 11 43 12 110 13 29 14 110 15 73 16 75 17 29 18 13 19 59 20 59 21 174 22 109 23 67 24 13 25 147 26 155 27 195 28 146 29 110 30 13 31 13 32 0  33 0 34 0 35 0  0 1 2 3 4 5 6 7 8 9 10 0 100 115 116 126 1 16 20 21 22 24 26 31 32 40 59 1 79 89 90 2 1 3 4 7 24 38 95 113 3 46 47 48 54 56 58 82 85  86 122 3 123 124 125 126 127 128 129 130 4 8 5 13 6 19 7 42 43 44 45 46 47 48 49 50 51 7 52 53 54 55 56 80 81 82 86 87 8 99 100 101 9 108 "  INTEGER; /CTEXT : ARRAY[1..12] OF INTEGER; /CVAL : ARRAY[1..12] OF INTEGER; /HINTS : ARRAY[1..20,1..4] OF INTEGER)  END;  VARYS = RECORD $CASE BOOLEAN OF &FALSE : (DBLK : CH512); &TRUE : (COND : ARRAY[1..150] OF INTEGER; /ABB : ARRAY[1..150] OF INTEGER; /ATLOC : ARRAY[1..150] OF INTEGER; /PLACE : ARRAY[1..100] OF INTEGER; /FIXED : ARRAY[1..100] OF INTEGER; /LINK : ARRAY[1..200] OF INTEGER; /PROP : ARRAY[1..100] OF INTEGER; /HINTLC : ARRAY[1..20] OF INTEGER; /HINTED : ARRAY[1..20] OF BOOLEAN; /DSEEN : ARRAY[1..6] OF BOOLEAN; /DLOC : ARRAY[1..6] OF INTEGER; /ODLOC : ARRAY[1..6] OF INTEGER; /TK : ARRAY[1..20] OF INTEGER) "END; "VBLS = RECORD $CASE BOOLEAN OF &FALSE : (DBLK : CH512); &TRUE : (HLDING,LOC,OLDLOC : INTEGER; /OLDLC2,CLOCK1,CLOCK2 : INTEGER; /CHLOC,CHLOC2,TALLY,TALLY2 : INTEGER; /DFLAG,DTOTAL,FOOBAR,TURNS : INTEGER; /VERB,OBJ,LIMIT,IWEST,KNFLOC : INTEGER; /ABBNUM,DKILL,NUMDIE,DETAIL : INTEGER; /PANIC,CLOSING,CLOSED,WZDARK : BOOLEAN; /VERSION : INTEGER; /PASSWORD : STRING[20]) "END;  VAR "NEWLOC,RESTART,I,J,K,KK,K2 : INTEGER; "MAXSCORE,TVCOND,ATTACK,STICK : INTEGER; "FOO,SCORE,HINT,SPK : INTEGER; "BONUS,SEED : INTEGER; "RESUME,OK,SKIPIT,STEAL : BOOLEAN; "GAVEUP,YEA,SKIPDWARF,ALLDONE,HE_DIED,PIT : BOOLEAN; "NEWLOCSET,LMWARN,SKIPDESCRIBE : BOOLEAN; "HNTSIZ,CLSSES : INTEGER; "ARY : ^ARYS; "VARY : ^VARYS; "VBL : ^VBLS; "LINE,TERMWIDTH,TERMHIGHT : INTEGER; "KKWORD,WD1,WD2 : STRING[5]; "WD1X,WD2X : STRING; ADVENTURER !350 GRANDMASTER.   4 4 2 62 63 5 5 2 18 19 6 8 2 20 21 7 75 4 176 177 8 25 5 178 179 9 20 3 180 181 VERB1 VERB2  ?^{$S+}  PROGRAM ADVENTURE;  CONST "VERSION = 5; "KEYS = 1;  LAMP = 2; "GRATE = 3; "CAGE = 4; "ROD = 5; "ROD2 = 6; "STEPS = 7; "BIRD = 8; "DOOR = 9; "PILLOW = 10; "SNAKE = 11; "FISSURE = 12; "TABLET = 13; "CLAM = 14; "OYSTER = 15; "MAGAZINE = 16; "DWARF = 17; "KNIFE = 18; "FOOD = 19; "BOTTLE = 20; "WATER = 21; "OIL = 22; "PLANT = 24; "PLANT2 = 25; "AXE = 28; "MIRROR = 23; "DRAGON = 31; "CHASM = 32; "TROLL = 33; "TROLL2 = 34; "BEAR = 35; "MESSAGE = 36; "VEND_MACHINE = 38; "BATTERY = 39; "NUGGET = 50; "COINS = 54; "CHEST = 55; "EGGS = 56; "TRIDENT = 57; "VASE =58; "EMERALD = 59; "PYRAMID = 60; "PEARL = 61; "RUG = 62; "CHAIN = 64; "SPICES = 63; "CAVE = 67; "BACK = 8; "LOOK = 57; "NULL = 21; "ENTRANCE = 64; "DEPRESSION = 63; "SAY = 3; "LOCK = 6; "THROW = 17; "FIND = 19; "INVENTORY = 20;  MAXTRS = 64; "MAXDIE = 3; "MAXHLD = 6; "DALTLC = 18;  TYPE  CH512 = PACKED ARRAY[1..512] OF CHAR; "CHAR6 = PACKED ARRAY[1..6] OF CHAR;  ARYS = RECORD $CASE BOOLEAN OF &FALSE : (DBLK : CH512); &TRUE : (TRAVEL : ARRAY[1..750] OF INTEGER; /TRAVEL2 : ARRAY[1..750] OF INTEGER; /TRAVEL3 : ARRAY[1..750] OF INTEGER; /ATAB : ARRAY[1..300] OF STRING[5]; /KTAB : ARRAY[1..300] OF INTEGER; /LTEXT : ARRAY[1..150] OF INTEGER; /STEXT : ARRAY[1..150] OF INTEGER; /KEY : ARRAY[1..150] OF INTEGER; /PLAC : ARRAY[1..100] OF INTEGER; /FIXD : ARRAY[1..100] OF INTEGER; /PTEXT : ARRAY[1..100] OF INTEGER; /ACTSPK : ARRAY[1..35] OF INTEGER; /RTEXT : ARRAY[1..205] OF#  BEGIN { ANALAVERB }  VBL^.VERB:=K; "SPK:=ARY^.ACTSPK[VBL^.VERB]; "IF (WD2<>'') AND (VBL^.VERB<>SAY) THEN "BEGIN " RESTART:=1; $EXIT(ANALAVERB); "END;  IF VBL^.VERB=SAY THEN $IF WD2='' THEN &ANALANITVERB $ELSE &ANALATVERB "ELSE $IF VBL^.OBJ=0 THEN &ANALANITVERB $ELSE &ANALATVERB;  END; { ANALAVERB }  PROCEDURE CLOSE1;  BEGIN {CLOSE1} "VARY^.PROP[GRATE]:=0; "VARY^.PROP[FISSURE]:=0; "FOR I:=1 TO 6 DO $VARY^.DSEEN[I]:=FALSE; "MOVE(TROLL,0); "MOVE(TROLL+100,0); "MOVE(TROLL2,ARY^.PLAC[TROLL]); "MOVE(TROLL2+100,VARY^.FIXED[TROLL]); "JUGGLE(CHASM); "IF VARY^.PROP[BEAR]<>3 THEN $DESTROY(BEAR); "VARY^.PROP[CHAIN]:=0; "VARY^.FIXED[CHAIN]:=0; "VARY^.PROP[AXE]:=0; "VARY^.FIXED[AXE]:=0; "SPEAK(ARY^.RTEXT[129]); "VBL^.CLOCK1:=-1; "VBL^.CLOSING:=TRUE;  END; {CLOSE2}  PROCEDURE CLOSE2;  BEGIN {CLOSE2} "VARY^.PROP[BOTTLE]:=PUT(BOTTLE,115,1); "VARY^.PROP[PLANT]:=PUT(PLANT,115,0); "VARY^.PROP[OYSTER]:=PUT(OYSTER,115,0); "VARY^.PROP[LAMP]:=PUT(LAMP,115,0); "VARY^.PROP[ROD]:=PUT(ROD,115,0); "VARY^.PROP[DWARF]:=PUT(DWARF,115,0); "VBL^.LOC:=115; "VBL^.OLDLOC:=115; "NEWLOC:=115; "FOO:=PUT(GRATE,116,0); "VARY^.PROP[SNAKE]:=PUT(SNAKE,116,1); "VARY^.PROP[BIRD]:=PUT(BIRD,116,1); "VARY^.PROP[CAGE]:=PUT(CAGE,116,0); "VARY^.PROP[ROD2]:=PUT(ROD2,116,0); "VARY^.PROP[PILLOW]:=PUT(PILLOW,116,0); "VARY^.PROP[MIRROR]:=PUT(MIRROR,115,0); "VARY^.FIXED[MIRROR]:=116; "FOR I:=1 TO 100 DO $IF TOTING(I) THEN &DESTROY(I); "SPEAK(ARY^.RTEXT[132]); "VBL^.CLOSED:=TRUE;"ACHAR : STRING[1]; "TESTPW : STRING[20]; "NAMEOFUSER : STRING[40];  INFILE : FILE; "MSGFILE : FILE OF CHAR6;  PROCEDURE READINIT(VAR BFR:CH512;NUM:INTEGER);  BEGIN { READINIT } "NUM:=(NUM+511) DIV 512; "IF NUM<>BLOCKREAD(INFILE,BFR,NUM) THEN "BEGIN $WRITE('ERROR READING ARRAY FILE'); $EXIT(ADVENTURE); "END;  END; { READINIT }  PROCEDURE INITIALIZE;  VAR "I,J,K,X : INTEGER;  ININFO : TEXT;  PROCEDURE INITP2;  VAR "I,J : INTEGER;  BEGIN { INITP2} "TIME(I,J); "IF J=0 THEN $J:=I; "WHILE J=0 DO "BEGIN $WRITELN('NO CLOCK.'); $WRITELN('PLEASE ENTER A NUMBER FROM 1 TO 32767 '); $READ(J); $WRITELN; "END; "IF (J MOD 2)=0 THEN $J:=J+1; "SEED:=J; "LINE:=1; "VARY^.DLOC[1]:=19;  VARY^.DLOC[2]:=27; "VARY^.DLOC[3]:=33; "VARY^.DLOC[4]:=44; "VARY^.DLOC[5]:=64; "VARY^.DLOC[6]:=114; "VBL^.CHLOC:=114; "VBL^.CHLOC2:=140;  VBL^.ABBNUM:=5; "BONUS:=0; "VBL^.OLDLOC:=0; "VBL^.OLDLC2:=0; "RESTART:=0; "KK:=0; "VBL^.TALLY:=0; "VBL^.TALLY2:=0; "TVCOND:=0; "VBL^.DKILL:=0; "VBL^.DFLAG:=0; "VBL^.DTOTAL:=0; "ATTACK:=0; "STICK:=0; "VBL^.KNFLOC:=0; "MAXSCORE:=0; "VBL^.FOOBAR:=0; "VBL^.TURNS:=0; "VBL^.VERB:=0; "VBL^.OBJ:=0; "VBL^.IWEST:=0; "FOO:=0; "VBL^.NUMDIE:=0; "SCORE:=0; "VBL^.DETAIL:=0; "VBL^.HLDING:=0; "SPK:=0; "OK:=FALSE; "SKIPIT:=FALSE; "STEAL:=FALSE; "VBL^.PANIC:=FALSE; "VBL^.CLOSING:=FALSE; "VBL^.CLOSED:=FALSE; "VBL^.WZDARK:=FALSE; "GAVEUP:=FALSE; "SKIPDWARF:=FALSE; "ALLDONE:=FALSE; "LMWARN:=FALSE; "SKIPDESCRIBE:=FALSE; "ALLDONE:=FALSE; "HE_DIED:=FALSE; "SKIPDWARF:=FALSE; "PIT:=FALSE; "NEWLOCSET:=FALSE; "KKWORD:=''; "WD1:=''; "WD2:=''; "WD1X:=''; "WD2X:=''; "ACHAR:=' ';  END; { INITP2}  BEGIN {INITIALIZE}  { READ IN ARRAYS } "{$I-} "RESET(ININFO,'ADV.MISCINFO'); "{$I+} "IF IORESULT=0 THEN "BEGIN $READ(ININFO,TERMHIGHT,TERMWIDTH); $CLOSE(ININFO); "END "ELSE "BEGIN $TERMHIGHT:=24;{DEFAULT FOR APPLE} $TERMWIDTH:=40; "END; "RESET(INFILE,'ADVDATA'); "RESET(MSGFILE,'ADVMSGS'); "NEW(ARY); "READINIT(ARY^.DBLK,SIZEOF(ARYS)); "NEW(VARY); "READINIT(VARY^.DBLK,SIZEOF(VARYS)); "CLOSE(INFILE); "NEW(VBL); "INITP2; "CLSSES:=0; "FOR I:=1 TO 12 DO $IF ARY^.CTEXT[I]<>0 THEN &CLSSES:=I; "FOR I:=4 TO 20 DO $IF ARY^.HINTS[I,1]<>0 THEN &HNTSIZ:=I; "FOR X:=50 TO 64 DO $IF ARY^.PTEXT[X]<>0 THEN &VBL^.TALLY:=VBL^.TALLY - VARY^.PROP[X];  FOR I:=1 TO 300 DO $IF ARY^.ATAB[I]='' THEN $BEGIN &ARY^.ATAB[I]:=' '; &ARY^.ATAB[I,1]:=CHR(255); &ARY^.ATAB[I,2]:=CHR(I DIV 256); &ARY^.ATAB[I,3]:=CHR(I MOD 256); $END;  END; {INITIALIZE}  {$I ADVSUBS.TEXT}  PROCEDURE GETNEWCOMMAND;  VAR "W1FLAG,DONE : BOOLEAN; "INLINE : STRING;  BEGIN { GETNEWCOMMAND }  IF VBL^.CLOSED THEN "BEGIN " IF (VARY^.PROP[OYSTER]<0) AND TOTING(OYSTER) THEN &PSPEAK(OYSTER,1); $FOR I:=1 TO 100 DO &IF TOTING(I) AND (VARY^.PROP[I]<0) THEN (VARY^.PROP[I]:=-1-VARY^.PROP[I]; "END; "LINE:=1; "WD1:=''; "WD2:=''; "WD1X:=''; "WD2X:=''; "VBL^.WZDARK:=DARK; "IF (VBL^.KNFLOC>0) AND (VBL^.KNFLOC<>VBL^.LOC) THEN $VBL^.KNFLOC:=0; "I:=RAN(1); "REPEAT $READLN(INLINE); $INLINE:=CONCAT(INLINE,' :'); $WHILE INLINE[1]=' ' DO &DELETE(INLINE,1,1); "UNTIL INLINE<>':'; "W1FLAG:=FALSE; "DONE:=FALSE; "REPEAT $ACHAR:=COPY(INLINE,1,1); $DELETE(INLINE,1,1); $IF ACHAR=' ' THEN $BEGIN &DONE:=W1FLAG; &W1FLAG:=TRUE $END $ELSE &IF W1FLAG THEN (IF LENGTH(WD2)=5 THEN *WD2X:=CONCAT(WD2X,ACHAR) (ELSE *WD2:=CONCAT(WD2,ACHAR) &ELSE (IF LENGTH(WD1)=5 THEN *WD1X:=CONCAT(WD1X,ACHAR) (ELSE *WD1:=CONCAT(WD1,ACHAR) "UNTIL DONE;  END; { GETNEWCOMMAND }  PROCEDURE DOWHATHESAYS;  {$I ADVVERB.TEXT}  PROCEDURE ANALANOBJ;  PROCEDURE ASKWHATTODO;  BEGIN {ASKWHATTODO}  IF WD2<>'' THEN "BEGIN $RESTART:=1; $EXIT(ANALANOBJ); "END;  IF VBL^.VERB<>0 THEN "BEGIN $ANALATVERB; $EXIT(ANALANOBJ); "END;  WRITELN('WHAT DO YOU WANT TO DO WITH THE ',WD1,WD1X); "RESTART:=1; "EXIT(DOWHATHESAYS);  END; {ASKWHATTODO}  BEGIN { ANALANOBJ }  VBL^.OBJ:=K; "IF (VARY^.FIXED[K]=VBL^.LOC) OR HERE(K) THEN  ASKWHATTODO;  IF K=GRATE THEN "BEGIN " IF (VBL^.LOC=1) OR (VBL^.LOC=4) OR (VBL^.LOC=7) THEN &K:=DEPRESSION; $IF (VBL^.LOC>9) AND (VBL^.LOC<15) THEN &K:=ENTRANCE; $IF K<>GRATE THEN $BEGIN $ SET_NEW_LOC; &EXIT(ANALANOBJ); $END; "END; "IF K=DWARF THEN  FOR I:=1 TO 5 DO &IF (VARY^.DLOC[I]=VBL^.LOC) AND (VBL^.DFLAG>=2) THEN (ASKWHATTODO;  IF ((LIQ=K) AND HERE(BOTTLE)) OR (K=LIQLOC(VBL^.LOC)) THEN $ASKWHATTODO; "IF (VBL^.OBJ=PLANT) AND AT(PLANT2) AND (VARY^.PROP[PLANT2]=0) THEN "BEGIN $VBL^.OBJ:=PLANT2; $ASKWHATTODO; "END; "IF (VBL^.OBJ=KNIFE) AND (VBL^.KNFLOC=VBL^.LOC) THEN "BEGIN $VBL^.KNFLOC:=-1; $SPEAK(ARY^.RTEXT[116]); "END "ELSE $IF (VBL^.OBJ=ROD) AND HERE(ROD2) THEN $BEGIN &VBL^.OBJ:=ROD2; &ASKWHATTODO; $END $ELSE &IF ((VBL^.VERB=FIND) OR *(VBL^.VERB=INVENTORY)) AND (WD2='') THEN (ASKWHATTODO &ELSE (WRITELN('I SEE NO ',WD1,WD1X,' HERE.'); "SKIPDWARF:=TRUE; "SKIPDESCRIBE:=TRUE; "EXIT(DOWHATHESAYS);  END; { ANALANOBJ }  PROCEDURE ANALAVERB; $ ^.LIMIT:=330; "END; "NEWLOC:=VBL^.LOC; "REPEAT $REPEAT &IF SKIPDWARF THEN (SKIPDWARF:=FALSE &ELSE &BEGIN (TESTCLOSE; (VBL^.LOC:=NEWLOC; (IF VBL^.LOC<>0 THEN ( IF NOT FORCED(VBL^.LOC) AND ,NOT BITSET(NEWLOC,3) THEN ,IF VBL^.DFLAG=0 THEN .IF VBL^.LOC>=15 THEN 0VBL^.DFLAG:=1 .ELSE ,ELSE .DWARFSTUFF; &END; &NEWLOCSET:=FALSE; &IF NOT HE_DIED THEN &BEGIN (IF SKIPDESCRIBE THEN *SKIPDESCRIBE:=FALSE (ELSE (BEGIN *WRITELN; *DESCRIBE_CURRENT_LOCATION; (END; (IF NOT HE_DIED AND NOT NEWLOCSET THEN (BEGIN *VBL^.VERB:=0; *VBL^.OBJ:=0; *RESTART:=0; *REPEAT ,IF RESTART<>2 THEN ,BEGIN .CHECKHINTS; .GETNEWCOMMAND; ,END; ,RESTART:=0; ,DOWHATHESAYS; ( UNTIL RESTART=0; {LONG RESTART} (END; &END; $UNTIL HE_DIED OR ALLDONE; { MAIN LOOP } " REINCARNATION; "UNTIL HE_DIED OR ALLDONE; { NO MORE RE-INCARNATIONS}  ENDGAME;  END.   "EXIT(DOWHATHESAYS);  END; {CLOSE2}  BEGIN { DOWHATHESAYS }  IF VBL^.FOOBAR>0 THEN $VBL^.FOOBAR:=-VBL^.FOOBAR "ELSE $VBL^.FOOBAR:=0; "VBL^.TURNS:=VBL^.TURNS+1; "K:=SAY; "IF (VBL^.VERB=SAY) AND (WD2<>'') THEN $VBL^.VERB:=0; "IF VBL^.VERB<>SAY THEN "BEGIN " IF (VBL^.TALLY=0) AND (VBL^.LOC>=15) AND (VBL^.LOC<>33) THEN &VBL^.CLOCK1:=VBL^.CLOCK1-1; $IF VBL^.CLOCK1=0 THEN &CLOSE1 $ELSE &IF VBL^.CLOCK1<0 THEN (VBL^.CLOCK2:=VBL^.CLOCK2-1; $IF VBL^.CLOCK2=0 THEN $ CLOSE2 $ELSE " BEGIN &IF VARY^.PROP[LAMP]=1 THEN (VBL^.LIMIT:=VBL^.LIMIT-1; &IF (VBL^.LIMIT<=30) AND HERE(BATTERY) AND )(VARY^.PROP[BATTERY]=0) AND HERE(LAMP) THEN &BEGIN & SPEAK(ARY^.RTEXT[188]); (VARY^.PROP[BATTERY]:=1; (IF TOTING(BATTERY) THEN *DROP(BATTERY,VBL^.LOC); (VBL^.LIMIT:=VBL^.LIMIT+2500; (LMWARN:=FALSE; &END &ELSE (IF VBL^.LIMIT=0 THEN (BEGIN $ VBL^.LIMIT:=-1; *VARY^.PROP[LAMP]:=0; *IF HERE(LAMP) THEN ,SPEAK(ARY^.RTEXT[184]); (END (ELSE *IF (VBL^.LIMIT<0) AND (VBL^.LOC<=8) THEN *BEGIN * SPEAK(ARY^.RTEXT[185]); ,ALLDONE:=TRUE; ,GAVEUP:=TRUE; ,EXIT(DOWHATHESAYS); *END *ELSE ,IF VBL^.LIMIT<=30 THEN ,BEGIN , IF NOT LMWARN AND HERE(LAMP) THEN .BEGIN . LMWARN:=TRUE; 0SPK:=187; 0IF VARY^.PLACE[BATTERY]=0 THEN 2SPK:=183; 0IF VARY^.PROP[BATTERY]=1 THEN 2SPK:=189; 0SPEAK(ARY^.RTEXT[SPK]); .END; ,END; &K:=43; {WHERE?} &IF LIQLOC(VBL^.LOC)=WATER THEN (K:=70; &IF (WD1='ENTER') AND ((WD2='STREA') OR (WD2='WATER')) THEN &BEGIN & SPEAK(ARY^.RTEXT[K]); & SKIPDWARF:=TRUE; (SKIPDESCRIBE:=TRUE; &END &ELSE &REPEAT & RESTART:=0; (IF (WD1='ENTER') AND (WD2<>'') THEN (BEGIN ( WD1:=WD2; *WD1X:=WD2X; *WD2:=''; (END (ELSE (BEGIN ( IF ((WD1='WATER') OR (WD1='OIL')) AND -((WD2='PLANT') OR (WD2='DOOR')) THEN ,IF AT(VOCAB(WD2,1)) THEN .WD2:='POUR'; (END; & IF WD1='WEST' THEN (BEGIN ( VBL^.IWEST:=VBL^.IWEST+1; *IF VBL^.IWEST=10 THEN ,SPEAK(ARY^.RTEXT[17]); (END; (I:=VOCAB(WD1,-1); (IF I=-1 THEN (BEGIN *SPK:=60; *IF PERCENT(20) THEN ,SPK:=61; *IF PERCENT(20) THEN ,SPK:=13; *SPEAK(ARY^.RTEXT[SPK]); ( RESTART:=1; *EXIT(DOWHATHESAYS); (END (ELSE (BEGIN *K:=I MOD 1000; *CASE (I DIV 1000) OF ,0 : SET_NEW_LOC; ,1 : ANALANOBJ; ,2 : ANALAVERB; ,3 : BEGIN 2SKIPDWARF:=TRUE; 2SKIPDESCRIBE:=TRUE; 2IF K<>0 THEN 4SPEAK(ARY^.RTEXT[K]); 0END; *END; *IF RESTART<>0 THEN *BEGIN ,WD1:=WD2; ,WD1X:=WD2X; ,WD2:=''; *END; (END; &UNTIL RESTART=0; { SHORT RESTART } $END; "END;  END; { DOWHATHESAYS }  PROCEDURE REINCARNATION;  BEGIN { REINCARNATION } "IF HE_DIED THEN "BEGIN $IF PIT THEN $BEGIN &SPEAK(ARY^.RTEXT[23]); &VBL^.OLDLC2:=VBL^.LOC; $END; $IF VBL^.CLOSING THEN $BEGIN &SPEAK(ARY^.RTEXT[131]); &VBL^.NUMDIE:=VBL^.NUMDIE+1; $END $ELSE $BEGIN &YEA:=YES(81+(VBL^.NUMDIE*2),82+(VBL^.NUMDIE*2),54); &VBL^.NUMDIE:=VBL^.NUMDIE+1; &IF (VBL^.NUMDIE<>MAXDIE) AND YEA THEN &BEGIN (HE_DIED:=FALSE; { SAVED! } (SKIPDWARF:=TRUE; (VARY^.PLACE[WATER]:=0; (VARY^.PLACE[OIL]:=0; (IF TOTING(LAMP) THEN *VARY^.PROP[LAMP]:=0; (FOR J:=100 DOWNTO 1 DO *IF TOTING(J) THEN *BEGIN ,K:=VBL^.OLDLC2; ,IF J=LAMP THEN .K:=1; ,DROP(J,K); *END; (VBL^.LOC:=3; (VBL^.OLDLOC:=VBL^.LOC; &END; $END; "END;  END; { REINCARNATION }  PROCEDURE ENDGAME;  BEGIN { ENDGAME }  SCORE:=GETSCORE(FALSE);  WRITELN; "WRITE('YOU SCORED ',SCORE,' OUT OF A POSSIBLE ',MAXSCORE); "IF TERMWIDTH<64 THEN $WRITELN; "IF VBL^.TURNS=1 THEN $KKWORD:='.' "ELSE $KKWORD:='S.'; "WRITELN(' USING ',VBL^.TURNS,' TURN',KKWORD); "FOR I:=1 TO CLSSES DO $IF ARY^.CVAL[I]>=SCORE THEN $BEGIN &SPEAK(ARY^.CTEXT[I]); &IF I=CLSSES THEN &BEGIN (WRITE('TO ACHIEVE THE NEXT HIGHER RATING WOULD '); (IF TERMWIDTH<64 THEN *WRITELN; (WRITELN('BE A NEAT TRICK!'); (WRITELN; (WRITELN('CONGRATULATIONS'); &END &ELSE &BEGIN (K:=ARY^.CVAL[I]+1-SCORE; (KKWORD:='S.'; (IF K=1 THEN *KKWORD:='.'; (WRITE('TO ACHIEVE THE NEXT HIGHER RATING, YOU NEED '); (IF TERMWIDTH<64 THEN *WRITELN; (WRITELN(K,' MORE POINT',KKWORD); &END; &I:=CLSSES; { EXIT THIS MESS } $END;  END; { ENDGAME }  BEGIN { ADVENTURE } "INITIALIZE; "VARY^.HINTED[3]:=YES(65,1,0); "IF VARY^.HINTED[3] THEN $RESUME:=FALSE "ELSE $RESUME:=YES(201,0,0); "IF RESUME THEN "BEGIN $NAMEANDPW; ${$I-} $RESET(INFILE,NAMEOFUSER); $IF IORESULT<>0 THEN ${$I+} $BEGIN &WRITELN('SORRY, YOU DO NOT HAVE A SAVED GAME'); &RESUME:=FALSE; $END $ELSE $BEGIN &READINIT(VARY^.DBLK,SIZEOF(VARYS)); &READINIT(VBL^.DBLK,SIZEOF(VBLS)); &CLOSE(INFILE); $ IF TESTPW<>VBL^.PASSWORD THEN &BEGIN (WRITE('INCORRECT PASSWORD'); (EXIT(ADVENTURE); &END; &IF VERSION<>VBL^.VERSION THEN &BEGIN (IF VERSION>VBL^.VERSION THEN *WRITE('OLD SAVE FILE - NEW ') (ELSE *WRITE('NEW SAVE FILE - OLD '); (WRITE('ADVENTURE. SORRY.'); $ EXIT(ADVENTURE); &END; $END; $VBL^.LIMIT:=MAX(VBL^.LIMIT,150); { GIVE HIM SOME TIME} "END; "IF NOT RESUME THEN "BEGIN $VBL^.LOC:=1; $VBL^.CLOCK1:=30; $VBL^.CLOCK2:=50; $IF VARY^.HINTED[3] THEN &VBL^.LIMIT:=1000 $ELSE &VBL%  SEG:=1;  TXTREAD;  END; { SEGMENT1 }  PROCEDURE SEGMENT2;  BEGIN { SEGMENT2 }  BLIPER(''); "RESET(INFILE,'ADVS2.TEXT');  SEG:=2;  TXTREAD;  END; { SEGMENT2 }  PROCEDURE SEGMENT3;  VAR "TVINDEX,INDEX,TRVL,TVCOND,VOIB : INTEGER;  BEGIN { SEGMENT3 }  TVINDEX:=1; "BLIPER(''); "RESET(INFILE,'ADVS3.TEXT'); "WHILE NOT EOF(INFILE) DO "BEGIN " READ(INFILE,INDEX); $BLIP; $IF NOT EOLN(INFILE) THEN $BEGIN $ READ(INFILE,TVCOND,TRVL); &IF ARY^.KEY[INDEX]=0 THEN (ARY^.KEY[INDEX]:=TVINDEX &ELSE (ARY^.TRAVEL[TVINDEX-1]:=-ARY^.TRAVEL[TVINDEX-1]; &WHILE NOT EOLN(INFILE) DO &BEGIN (READ(INFILE,VOIB,ACHAR); (ARY^.TRAVEL[TVINDEX]:=VOIB; (ARY^.TRAVEL2[TVINDEX]:=TRVL; (ARY^.TRAVEL3[TVINDEX]:=TVCOND; & TVINDEX:=TVINDEX+1; &END; &ARY^.TRAVEL[TVINDEX-1]:=-ARY^.TRAVEL[TVINDEX-1]; &READLN(INFILE); " END; "END; "CLOSE(INFILE);  END; { SEGMENT3 }  PROCEDURE SEGMENT4;  VAR "WORDNUM,NUMBER : INTEGER;  BEGIN { SEGMENT4 }  WORDNUM:=1; "BLIPER(''); "RESET(INFILE,'ADVS4.TEXT');  WHILE NOT EOF(INFILE) DO "BEGIN " READ(INFILE,NUMBER); $BLIP; $IF NOT EOLN(INFILE) THEN $BEGIN $ READ(INFILE,ACHAR); &READLN(INFILE,ARY^.ATAB[WORDNUM]); &ARY^.KTAB[WORDNUM]:=NUMBER; &WORDNUM:=WORDNUM+1; $END; "END;  CLOSE(INFILE);  END; { SEGMENT4 }  PROCEDURE SEGMENT5;  BEGIN { SEGMENT5 }  BLIPER(''); "RESET(INFILE,'ADVS5.TEXT');  SEG:=5;  TXTREAD;  END; { SEGMENT5 }  PROCEDURE SEGMENT6;  BEGIN { SEGMENTVERB1 VERB2 ww?^ PROGRAM BUILDINIT;  TYPE  CHAR6 = PACKED ARRAY[1..6] OF CHAR;  ARYS = RECORD $CASE BOOLEAN OF &FALSE : ( DBLK : PACKED ARRAY[1..512] OF CHAR); &TRUE : (TRAVEL : ARRAY[1..750] OF INTEGER; /TRAVEL2 : ARRAY[1..750] OF INTEGER; /TRAVEL3 : ARRAY[1..750] OF INTEGER; /ATAB : ARRAY[1..300] OF STRING[5]; /KTAB : ARRAY[1..300] OF INTEGER; /LTEXT : ARRAY[1..150] OF INTEGER; /STEXT : ARRAY[1..150] OF INTEGER; /KEY : ARRAY[1..150] OF INTEGER; /PLAC : ARRAY[1..100] OF INTEGER; /FIXD : ARRAY[1..100] OF INTEGER; /PTEXT : ARRAY[1..100] OF INTEGER; /ACTSPK : ARRAY[1..35] OF INTEGER; /RTEXT : ARRAY[1..205] OF INTEGER; /CTEXT : ARRAY[1..12] OF INTEGER; /CVAL : ARRAY[1..12] OF INTEGER; /HINTS : ARRAY[1..20,1..4] OF INTEGER)  END; "VARYS = RECORD $CASE BOOLEAN OF &FALSE : ( DBLK : PACKED ARRAY[1..512] OF CHAR); &TRUE : (COND : ARRAY[1..150] OF INTEGER; /ABB : ARRAY[1..150] OF INTEGER; /ATLOC : ARRAY[1..150] OF INTEGER; /PLACE : ARRAY[1..100] OF INTEGER; /FIXED : ARRAY[1..100] OF INTEGER; /LINK : ARRAY[1..200] OF INTEGER; /PROP : ARRAY[1..100] OF INTEGER; /HINTLC : ARRAY[1..20] OF INTEGER; /HINTED : ARRAY[1..20] OF BOOLEAN; /DSEEN : ARRAY[1..6] OF BOOLEAN; /DLOC : ARRAY[1..6] OF INTEGER; /ODLOC : ARRAY[1..6] OF INTEGER; /TK : ARRAY[1..20] OF INTEGER)  END;  VAR "MSGNDX,SEG,CLASSES,RECNUM,I,J,K,COUNT : INTEGER;  ACHAR : CHAR; "ARY : ^ARYS;  VARY : ^VARYS; "MSGFILE : FILE OF CHAR6; "SAVEMSG : STRING[10]; "INFILE : TEXT; "OUTFILE : FILE;  PROCEDURE DROP(OBJECT,WHERE:INTEGER);  BEGIN  WITH VARY^ DO "BEGIN " IF OBJECT>100 THEN &FIXED[OBJECT-100]:=WHERE $ELSE $ PLACE[OBJECT]:=WHERE; " IF WHERE>0 THEN $BEGIN $ LINK[OBJECT]:=ATLOC[WHERE]; &ATLOC[WHERE]:=OBJECT; $END; "END;  END;  PROCEDURE BLIP;  BEGIN {BLIP} "IF COUNT=50 THEN "BEGIN $COUNT:=0; $WRITELN; $WRITE(' .'); "END "ELSE $WRITE('.'); "COUNT:=COUNT+1;  END; {BLIP}  PROCEDURE BLIPER(MSG:STRING);  BEGIN "COUNT:=0; "WRITELN; "WRITE(MSG);  END;  PROCEDURE PUTMSG(MSG:STRING;SAME:BOOLEAN);  VAR "I : INTEGER;  BEGIN { PUTMSG } "IF LENGTH(MSG)=0 THEN $MSG:=' '; "IF SAME THEN "BEGIN $IF LENGTH(SAVEMSG)<>0 THEN &RECNUM:=RECNUM-1; " MSG:=CONCAT(SAVEMSG,MSG); $SAVEMSG:=''; "END "ELSE "BEGIN $IF SAVEMSG<>'' THEN $BEGIN &WHILE LENGTH(SAVEMSG)<5 DO (SAVEMSG:=CONCAT(SAVEMSG,' '); &PUTMSG(' ',TRUE); $END; $MSGFILE^[1]:=CHR(ORD(MSGFILE^[1])+128); "END; "WHILE LENGTH(MSG)>=6 DO "BEGIN $PUT(MSGFILE); { PUT LAST MESSAGE } $FOR I:=1 TO 6 DO &MSGFILE^[I]:=MSG[I]; $DELETE(MSG,1,6); $RECNUM:=RECNUM+1; "END; "SAVEMSG:=MSG; "IF LENGTH(SAVEMSG)<>0 THEN $RECNUM:=RECNUM+1;  END; { PUTMSG }  PROCEDURE TXTREAD;  VAR "LAST,I : INTEGER;  MSGTXT : STRING[128];  PROCEDURE PART1;  BEGIN {PART1} "IF ARY^.LTEXT[MSGNDX]=0 THEN $ARY^.LTEXT[MSGNDX]:=RECNUM;  END; {PART1}  PROCEDURE PART2;  BEGIN {PART2}  IF ARY^.STEXT[MSGNDX]=0 THEN $ARY^.STEXT[MSGNDX]:=RECNUM;  END; {PART2}  PROCEDURE PART5;  BEGIN {PART5} "IF (MSGNDX>0) AND (MSGNDX<=100) THEN $IF ARY^.PTEXT[MSGNDX]=0 THEN &ARY^.PTEXT[MSGNDX]:=RECNUM;  END; {PART5}  PROCEDURE PART6;  BEGIN {PART6}  IF ARY^.RTEXT[MSGNDX]=0 THEN $ARY^.RTEXT[MSGNDX]:=RECNUM;  END; {PART6}  PROCEDURE PART10;  BEGIN {PART10}  CLASSES:=CLASSES+1; "IF ARY^.CTEXT[CLASSES]=0 THEN $ARY^.CTEXT[CLASSES]:=RECNUM; "ARY^.CVAL[CLASSES]:=MSGNDX;  END; {PART10}  BEGIN {TXTREAD} "LAST:=32761; "REPEAT $READ(INFILE,MSGNDX); $BLIP; $IF NOT EOF(INFILE) THEN $BEGIN &IF NOT EOLN(INFILE) THEN (READ(INFILE,ACHAR); { ONE BLANK DELIMETER } &CASE SEG OF (1 : PART1; (2 : PART2; (5 : PART5; (6 : PART6; '10 : PART10; &END; &READLN(INFILE,MSGTXT); &PUTMSG(MSGTXT,MSGNDX=LAST); &LAST:=MSGNDX; " END; "UNTIL EOF(INFILE); "IF LENGTH(SAVEMSG)>0 THEN "BEGIN $WHILE LENGTH(SAVEMSG)<5 DO &SAVEMSG:=CONCAT(SAVEMSG,' '); $PUTMSG(' ',TRUE);  END; "CLOSE(INFILE);  END;  PROCEDURE SEGMENT1;  BEGIN { SEGMENT1 }  BLIPER(''); "RESET(INFILE,'ADVS1.TEXT'); & { SUBROUTINES FOR ADVENTURE }  PROCEDURE NAMEANDPW;  VAR "ACHR : CHAR; "ACHAR : STRING[1];  BEGIN { NAMENADPW } "WRITELN('ENTER YOUR NAME PLEASE.'); "READLN(NAMEOFUSER); "WRITELN('ENTER YOUR PASSWORD '); "READ(KEYBOARD,ACHR); "ACHAR:=' '; "TESTPW:=''; "WHILE NOT EOLN(KEYBOARD) DO "BEGIN $ACHAR[1]:=ACHR; $IF 8=ORD(ACHR) THEN &IF LENGTH(TESTPW)>0 THEN &BEGIN (DELETE(TESTPW,LENGTH(TESTPW),1); (WRITE(CHR(8),' ',CHR(8)); &END &ELSE $ELSE $BEGIN &WRITE('X'); &TESTPW:=CONCAT(TESTPW,ACHAR); $END; $READ(KEYBOARD,ACHR); "END; "NAMEOFUSER:=CONCAT(NAMEOFUSER,'.AVSV'); END; { NAMEANDPW }  FUNCTION GETSCORE(SCORECMD:BOOLEAN) : INTEGER;  VAR "I,K,SCORE : INTEGER;  BEGIN {GETSCORE}  MAXSCORE:=0; "SCORE:=0; "FOR I:=50 TO MAXTRS DO $IF ARY^.PTEXT[I]<>0 THEN $BEGIN &IF I=CHEST THEN (K:=14 &ELSE (IF I>CHEST THEN *K:=16 $ ELSE *K:=12; $ IF (VARY^.PROP[I]>=0) THEN (SCORE:=SCORE+2; &IF (VARY^.PLACE[I]=3) AND (VARY^.PROP[I]=0) THEN (SCORE:=SCORE+K-2; &MAXSCORE:=MAXSCORE+K; 6 }  BLIPER(''); "RESET(INFILE,'ADVS6.TEXT');  SEG:=6;  TXTREAD;  END; { SEGMENT6 }  PROCEDURE SEGMENT7;  VAR "ILOC1,ILOC2,OBJECT : INTEGER;  BEGIN { SEGMENT7 } "BLIPER(''); "RESET(INFILE,'ADVS7.TEXT');  WHILE NOT EOF(INFILE) DO "BEGIN " READ(INFILE,OBJECT); $BLIP; $IF NOT EOLN(INFILE) THEN $BEGIN $ READLN(INFILE,ILOC1,ILOC2); &ARY^.PLAC[OBJECT]:=ILOC1; &ARY^.FIXD[OBJECT]:=ILOC2; $END; "END; "CLOSE(INFILE);  END; { SEGMENT7 }  PROCEDURE SEGMENT8;  VAR "VOIB,MSGNUM : INTEGER;  BEGIN { SEGMENT8 } "BLIPER(''); "RESET(INFILE,'ADVS8.TEXT');  WHILE NOT EOF(INFILE) DO "BEGIN " READ(INFILE,VOIB); $BLIP; $IF NOT EOLN(INFILE) THEN $BEGIN $ READLN(INFILE,MSGNUM); &ARY^.ACTSPK[VOIB]:=MSGNUM; $END; "END; "CLOSE(INFILE);  END; { SEGMENT8 }  PROCEDURE SEGMENT9;  VAR "I,TEMP,COND,LOC : INTEGER;  BEGIN { SEGMENT9 } "BLIPER(''); "RESET(INFILE,'ADVS9.TEXT');  WHILE NOT EOF(INFILE) DO "BEGIN " READ(INFILE,COND); $BLIP; $TEMP:=1; $FOR I:=1 TO COND DO &TEMP:=TEMP*2; $IF NOT EOLN(INFILE) THEN &WHILE NOT EOLN(INFILE) DO &BEGIN (READ(INFILE,LOC,ACHAR); (VARY^.COND[LOC]:=VARY^.COND[LOC]+TEMP; &END; " READLN(INFILE); "END; "CLOSE(INFILE);  END; { SEGMENT9 }  PROCEDURE SEGMENTA;  BEGIN { SEGMENTA }  BLIPER(''); "RESET(INFILE,'ADVS10.TEXT');  SEG:=10;  TXTREAD;  END; { SEGMENTA }  PROCEDURE SEGMENTB;  VAR "HINT,TURNS,POINTS,QUES,ANS : INTEGER;  BEGIN { SEGMENTB } "BLIPER(''); "RESET(INFILE,'ADVS11.TEXT');  WHILE NOT EOF(INFILE) DO "BEGIN " READ(INFILE,HINT); $BLIP; $IF NOT EOLN(INFILE) THEN $BEGIN $ READLN(INFILE,TURNS,POINTS,QUES,ANS); &ARY^.HINTS[HINT,1]:=TURNS; &ARY^.HINTS[HINT,2]:=POINTS; &ARY^.HINTS[HINT,3]:=QUES; &ARY^.HINTS[HINT,4]:=ANS; $END; "END; "CLOSE(INFILE);  END; { SEGMENTB }  PROCEDURE LINKUP;  VAR "K,I : INTEGER;  BEGIN {LINKUP}  BLIP; "WITH ARY^,VARY^ DO $FOR I:=1 TO 150 DO $BEGIN $ IF (LTEXT[I]=0) OR (KEY[I]=0) THEN &ELSE &BEGIN & K:=KEY[I]; (IF TRAVEL[K]=1 THEN *COND[I]:=2; &END; $END;  BLIP; "WITH ARY^ DO $FOR I:=100 DOWNTO 1 DO $BEGIN $ IF FIXD[I]>0 THEN &BEGIN & DROP(I+100,FIXD[I]); (DROP(I,PLAC[I]); &END; $END;  BLIP; "WITH ARY^ DO $FOR I:=100 DOWNTO 1 DO $BEGIN $ VARY^.FIXED[I]:=FIXD[I]; &IF (PLAC[I]<>0) AND (FIXD[I]<=0) THEN (DROP(I,PLAC[I]); $END;  BLIP; "WITH ARY^,VARY^ DO $FOR I:=50 TO 64 DO $BEGIN $ IF PTEXT[I]<>0 THEN (PROP[I]:=-1; $END;  END; {LINKUP}  BEGIN  NEW(ARY); "FILLCHAR(ARY^.DBLK,SIZEOF(ARYS),CHR(0)); { ZERO ARRAYS } "NEW(VARY); "FILLCHAR(VARY^.DBLK,SIZEOF(VARYS),CHR(0)); { ZERO ARRAYS } "CLASSES:=0; "RECNUM:=1; "COUNT:=0; "REWRITE(MSGFILE,'ADVMSGS'); "MSGFILE^:='MSGFIL'; {WILL BE PUT } "SAVEMSG:=''; "SEGMENT1; {LONG DESCRIPTIONS} "SEGMENT2; {SHORT DESCRIPTIONS} "SEGMENT3; {TRAVEL OPTIONS} "SEGMENT4; {WORD TABLE} "SEGMENT5; {OBJECT PROPERTIES} "SEGMENT6; {MISC MESSAGES} "SEGMENT7; {OBJECT LOCATIONS} "SEGMENT8; {VERB DEFAULT ACTIONS} "SEGMENT9; {LIQUID ASSETS} "SEGMENTA; {PLAYER CLASS MESSAGES} "SEGMENTB; {HINTS} "LINKUP; {BUILD MISC ARRAYS} "PUTMSG('EXTMSG',FALSE); "PUT(MSGFILE); {PURGE LAST BUFFER} "CLOSE(MSGFILE,LOCK); "WRITELN; "WRITELN('WRITING ADVDATA'); "REWRITE(OUTFILE,'ADVDATA'); "I:=(SIZEOF(ARYS) + 511) DIV 512;  IF I<>BLOCKWRITE(OUTFILE,ARY^.DBLK,I) THEN "BEGIN $WRITELN('ERROR WRITING FILE'); " EXIT(BUILDINIT); "END; "I:=(SIZEOF(VARYS) + 511) DIV 512;  IF I<>BLOCKWRITE(OUTFILE,VARY^.DBLK,I) THEN "BEGIN $WRITELN('ERROR WRITING FILE'); " EXIT(BUILDINIT); "END; "CLOSE(OUTFILE,LOCK); "WRITELN('FILE CREATED');  END.  ?^Hj'  MTEMP:=' '; "MTEXT:=''; "IF MSG>0 THEN "BEGIN $SEEK(MSGFILE,MSG); $REPEAT &GET(MSGFILE); &FOR I:=1 TO 6 DO (MTEMP[I]:=MSGFILE^[I]; &IF ORD(MTEMP[1])>128 THEN (MTEMP[1]:=CHR(ORD(MTEMP[1])-128); &IF ORD(MTEMP[2])>128 THEN (MTEMP[2]:=CHR(ORD(MTEMP[2])-128); $ MTEXT:=CONCAT(MTEXT,MTEMP); &IF LENGTH(MTEXT)>TERMWIDTH THEN &BEGIN (I:=TERMWIDTH; (WHILE MTEXT[I]<>' ' DO *I:=I-1; (MTEMP2:=COPY(MTEXT,1,I-1); (DELETE(MTEXT,1,I); (WRITELN(MTEMP2); & HOLDUP; &END; $UNTIL ORD(MSGFILE^[1])>128; $IF MTEXT<>' ' THEN {DONT PRINT DUMMY MSG} $BEGIN &WRITELN(MTEXT); " HOLDUP; $END; "END;  END; {SPEAK}  PROCEDURE PSPEAK(MSG,SKIP:INTEGER);  VAR "I,M : INTEGER;  BEGIN {PSPEAK}  M:=ARY^.PTEXT[MSG]; "SEEK(MSGFILE,M); "FOR I:=0 TO SKIP DO "BEGIN $REPEAT &GET(MSGFILE); &M:=M+1; $UNTIL ORD(MSGFILE^[1])>128; "END;  GET(MSGFILE); { INSURE GET BETWEEN SEEKS} "SPEAK(M);  END; {PSPEAK}  FUNCTION YES(MSG,SPKYES,SPKNO:INTEGER):BOOLEAN;  VAR  INLINE : STRING;  BEGIN {YES}  YEA:=FALSE; "SKIPIT:=FALSE; "IF MSG<>0 THEN $SPEAK(ARY^.RTEXT[MSG]); "LINE:=1; "REPEAT $IF SKIPIT THEN &WRITELN('PLEASE ANSWER THE QUESTION WITH YES OR NO'); $SKIPIT:=TRUE; $READLN(INLINE); "UNTIL (INLINE='YES') OR (INLINE='Y') OR ((INLINE='NO') OR (INLINE='N') OR ((INLINE='yes') OR (INLINE='y') OR ((INLINE='no') OR (INLINE='n');  YEA:=(INLINE='YES') OR (INLINE='Y') OR '(INLINE='yes') OR (INLINE='y');  IF (INLINE='yes') OR (INLINE='y') OR %(INLINE='no') OR (INLINE='$END;  SCORE:=SCORE+(MAXDIE-VBL^.NUMDIE)*10; "MAXSCORE:=MAXSCORE+MAXDIE*10; "IF VBL^.DFLAG<>0 THEN $SCORE:=SCORE+25; "MAXSCORE:=MAXSCORE+25; "IF NOT (GAVEUP OR SCORECMD) THEN $SCORE:=SCORE+4; "MAXSCORE:=MAXSCORE+4; "IF VBL^.CLOSING THEN $SCORE:=SCORE+25; "MAXSCORE:=MAXSCORE+25; "CASE BONUS OF $0 : SCORE:=SCORE+10; $135 : SCORE:=SCORE+25; $134 : SCORE:=SCORE+30; $133 : SCORE:=SCORE+45; "END; "MAXSCORE:=MAXSCORE+45; "IF VARY^.PLACE[MAGAZINE]=108 THEN $SCORE:=SCORE+1; "MAXSCORE:=MAXSCORE+1; "SCORE:=SCORE+2; "MAXSCORE:=MAXSCORE+2; "FOR I:=1 TO HNTSIZ DO $IF VARY^.HINTED[I] THEN &SCORE:=SCORE-ARY^.HINTS[I,2]; "GETSCORE:=SCORE;  END; {GETSCORE}  FUNCTION TOTING(OBJECT:INTEGER):BOOLEAN;  BEGIN {TOTING}  TOTING:=(VARY^.PLACE[OBJECT]=-1);  END; {TOTING}  FUNCTION AT(OBJECT:INTEGER):BOOLEAN;  BEGIN {AT}  AT:=(VARY^.PLACE[OBJECT]=VBL^.LOC) OR &(VARY^.FIXED[OBJECT]=VBL^.LOC);  END; {AT}  FUNCTION MIN(I,J:INTEGER):INTEGER;  BEGIN {MIN} "IF JI THEN $MAX:=J "ELSE $MAX:=I;  END; {MAX}  FUNCTION RAN(NUM:INTEGER):INTEGER;  VAR "TEMP : INTEGER; "TEMP2 : REAL;  BEGIN {RAN} "TEMP:=SEED*899; "IF TEMP<0 THEN $TEMP:=TEMP+32767+1; "TEMP2:=(TEMP-1)/32767.0; "RAN:=TRUNC(TEMP2*NUM); "SEED:=TEMP;  END; {RAN}  FUNCTION PERCENT(I:INTEGER):BOOLEAN;  BEGIN {PERCENT}  PERCENT:=(RAN(100)=WORD THEN &J:=K-1; "UNTIL I>J; "IF K>1 THEN $IF ARY^.ATAB[K-1]=WORD THEN &K:=K-1; {FIND FIRST WORD} "VOCAB:=-1; "IF ARY^.ATAB[K]=WORD THEN $VOCAB:=ARY^.KTAB[K];  IF WHAT>=0 THEN "BEGIN $WHILE (ARY^.ATAB[K]=WORD) AND *(WHAT<>(ARY^.KTAB[K] DIV 1000)) DO &K:=K+1; $IF ARY^.ATAB[K]=WORD THEN &VOCAB:=ARY^.KTAB[K] MOD 1000;  END;  END; {VOCAB}  PROCEDURE CARRY(OBJECT,WHERE:INTEGER);  VAR "TEMP : INTEGER;  PROCEDURE LINKUP;  BEGIN {LINKUP} "TEMP:=VARY^.ATLOC[WHERE]; "WHILE (VARY^.LINK[TEMP]<>OBJECT) DO $TEMP:=VARY^.LINK[TEMP]; "VARY^.LINK[TEMP]:=VARY^.LINK[OBJECT];  END; {LINKUP}  BEGIN {CARRY}  IF OBJECT<=100 THEN $IF VARY^.PLACE[OBJECT]<>-1 THEN $BEGIN $ VARY^.PLACE[OBJECT]:=-1; &VBL^.HLDING:=VBL^.HLDING+1; &IF VARY^.ATLOC[WHERE]=OBJECT THEN (VARY^.ATLOC[WHERE]:=VARY^.LINK[OBJECT] &ELSE $ LINKUP $END $ELSE "ELSE $IF VARY^.ATLOC[WHERE]=OBJECT THEN &VARY^.ATLOC[WHERE]:=VARY^.LINK[OBJECT] $ELSE  LINKUP  END; {CARRY}  PROCEDURE DROP(OBJECT,WHERE:INTEGER);  BEGIN {DROP}  IF OBJECT>100 THEN $VARY^.FIXED[OBJECT-100]:=WHERE "ELSE "BEGIN " IF VARY^.PLACE[OBJECT]=-1 THEN &VBL^.HLDING:=VBL^.HLDING-1; $VARY^.PLACE[OBJECT]:=WHERE; "END;  IF WHERE>0 THEN "BEGIN " VARY^.LINK[OBJECT]:=VARY^.ATLOC[WHERE]; $VARY^.ATLOC[WHERE]:=OBJECT; "END;  END; {DROP}  PROCEDURE MOVE(OBJECT,WHERE:INTEGER);  VAR "FROM : INTEGER;  BEGIN {MOVE}  IF OBJECT>100 THEN $FROM:=VARY^.FIXED[OBJECT-100] "ELSE $FROM:=VARY^.PLACE[OBJECT];  IF (FROM>0) AND (FROM <= 300) THEN $CARRY(OBJECT,FROM); "DROP(OBJECT,WHERE);  END; {MOVE}  PROCEDURE JUGGLE(OBJECT:INTEGER);  BEGIN {JUGGLE}  MOVE(OBJECT,VARY^.PLACE[OBJECT]); "MOVE(OBJECT+100,VARY^.FIXED[OBJECT]);  END; {JUGGLE}  PROCEDURE DESTROY(OBJECT:INTEGER);  BEGIN {DESTROY}  MOVE(OBJECT,0);  END; {DESTROY}  FUNCTION PUT(OBJECT,WHERE,PVAL : INTEGER):INTEGER;  BEGIN {PUT}  MOVE(OBJECT,WHERE); "PUT:=(-1)-PVAL;  END; {PUT}  PROCEDURE SPEAK(MSG:INTEGER);  VAR "I : INTEGER;  MTEMP : STRING[6]; "MTEMP2 : STRING; "MTEXT : STRING[255];  PROCEDURE HOLDUP;  BEGIN { HOLDUP } "LINE:=LINE+1; "IF LINE>=(TERMHIGHT-1) THEN "BEGIN $LINE:=1; $WRITE(CHR(7),' PRESS TO CONTINUE'); $READLN; "END;  END; { HOLDUP }  BEGIN {SPEAK} ( K(ARY^.RTEXT[141]); "SPEAK(KK); "K:=1; "IF FORCED(VBL^.LOC) THEN $BEGIN &SET_NEW_LOC; " NEWLOCSET:=TRUE; &EXIT(DESCRIBE_CURRENT_LOCATEION); $END; "IF (VBL^.LOC=33) AND PERCENT(25) AND NOT VBL^.CLOSING THEN $SPEAK(ARY^.RTEXT[8]); "IF NOT DARK THEN "BEGIN $VARY^.ABB[VBL^.LOC]:=VARY^.ABB[VBL^.LOC]+1; $I:=VARY^.ATLOC[VBL^.LOC]; $WHILE I<>0 DO $BEGIN &VBL^.OBJ:=I; &IF VBL^.OBJ>100 THEN (VBL^.OBJ:=VBL^.OBJ-100; &IF (VBL^.OBJ=STEPS) AND TOTING(NUGGET) THEN &ELSE &BEGIN (IF VARY^.PROP[VBL^.OBJ]<0 THEN (BEGIN *IF NOT VBL^.CLOSED THEN *BEGIN ,VARY^.PROP[VBL^.OBJ]:=0; ,IF (VBL^.OBJ=RUG) OR (VBL^.OBJ=CHAIN) THEN .VARY^.PROP[VBL^.OBJ]:=1; ,VBL^.TALLY:=VBL^.TALLY-1; ,IF (VBL^.TALLY=VBL^.TALLY2) AND (VBL^.TALLY<>0) THEN .VBL^.LIMIT:=MIN(35,VBL^.LIMIT); *END; (END; (IF NOT VBL^.CLOSED THEN (BEGIN *KK:=VARY^.PROP[VBL^.OBJ]; *IF (VBL^.OBJ=STEPS) AND (VBL^.LOC=VARY^.FIXED[STEPS]) THEN ,KK:=1; *PSPEAK(VBL^.OBJ,KK); (END; &END; &I:=VARY^.LINK[I]; $END; { WHILE I<>0 DO} "END;  END; { DESCRIBE_CURRENT_LOCATION }  PROCEDURE CHECKHINTS;  PROCEDURE GIVEHINT;  BEGIN {GIVEHINT}  VARY^.HINTLC[HINT]:=0; "IF YES(ARY^.HINTS[HINT,3],0,54) THEN "BEGIN " WRITE('I AM PREPARED TO GIVE YOU A HINT, BUT '); $WRITELN(' IT WILL COST YOU ',ARY^.HINTS[HINT,2],' POINTS'); " VARY^.HINTED[HINT]:=YES(175,ARY^.HINTS[HINT,4],54); " IF VARY^.HINTED[HINT] AND (VBL^.LIMIT>30) THEN &VBL^.LIMIT:=VBL^.LIMIT+30*ARY^.HINTS[HINT,2]; "END;  END; {GIVEHINT}  PROCEDURE CAVEHINT; n')THEN $WRITELN(CHR(7),'YOU WONT GET VERY FAR IN LOWER CASE !'); "IF YEA THEN $SPKNO:=SPKYES; "IF SPKNO<>0 THEN $SPEAK(ARY^.RTEXT[SPKNO]); "YES:=YEA;  END; {YES}  PROCEDURE ERRORHALT(I:INTEGER);  BEGIN {ERRORHALT} "WRITELN; "WRITELN('FATAL ERROR # ',I,' ---- BYE!'); "HALT;  END; {ERRORHALT}  PROCEDURE SET_NEW_LOC; FORWARD;  PROCEDURE TESTCLOSE;  VAR "I : INTEGER;  BEGIN { TESTCLOSE } "IF (NEWLOC IN [1..8]) AND VBL^.CLOSING THEN $BEGIN &SPEAK(ARY^.RTEXT[130]); &NEWLOC:=VBL^.LOC; &IF NOT VBL^.PANIC THEN VBL^.CLOCK2:=15; &VBL^.PANIC:=TRUE; $END; "IF (NEWLOC<>VBL^.LOC) AND NOT FORCED(VBL^.LOC) &AND NOT BITSET(VBL^.LOC,3) THEN $FOR I:=1 TO 5 DO &IF (VARY^.ODLOC[I]=NEWLOC) AND VARY^.DSEEN[I] THEN &BEGIN (NEWLOC:=VBL^.LOC; (SPEAK(ARY^.RTEXT[2]); (I:=5; &END;  END; { TESTCLOSE }  PROCEDURE DWARFSTUFF;  VAR "LASTLOC : INTEGER;  TBITSET,TFORCED : BOOLEAN;  PROCEDURE PIRATESTUFF;  BEGIN { PIRATESTUFF}  K:=0; "STEAL:=FALSE; "FOR J:=50 TO MAXTRS DO "BEGIN $IF (J=PYRAMID) AND ((VBL^.LOC=ARY^.PLAC[PYRAMID]) OR '(VBL^.LOC=ARY^.PLAC[EMERALD])) THEN { NOTHING } $ELSE $BEGIN &STEAL:=STEAL OR TOTING(J); &IF VARY^.PLACE[J]=VBL^.LOC THEN (K:=1; $END; "END; "IF STEAL THEN "BEGIN $SPEAK(ARY^.RTEXT[128]); $IF VARY^.PLACE[MESSAGE]=0 THEN &MOVE(CHEST,VBL^.CHLOC); $MOVE(MESSAGE,VBL^.CHLOC2); $FOR J:=50 TO MAXTRS DO $BEGIN &IF (J=PYRAMID) AND ((VBL^.LOC=ARY^.PLAC[PYRAMID]) OR '(VBL^.LOC=ARY^.PLAC[EMERALD])) THEN { NOTHING } &ELSE &BEGIN (IF (VARY^.PLACE[J]=VBL^.LOC) AND (VARY^.FIXED[J]=0) THEN *CARRY(J,VBL^.LOC); (IF TOTING(J) THEN *DROP(J,VBL^.CHLOC); &END; $END; $VARY^.DLOC[6]:=VBL^.CHLOC; $VARY^.ODLOC[6]:=VBL^.CHLOC; $VARY^.DSEEN[6]:=FALSE; "END "ELSE "BEGIN " IF (VBL^.TALLY=(VBL^.TALLY2+1)) AND '(K=0) AND (VARY^.PLACE[CHEST]=0) AND 'HERE(LAMP) AND (VARY^.PROP[LAMP]=1) THEN $BEGIN $ SPEAK(ARY^.RTEXT[186]); &MOVE(CHEST,VBL^.CHLOC); &MOVE(MESSAGE,VBL^.CHLOC2); &VARY^.DLOC[6]:=VBL^.CHLOC; &VARY^.ODLOC[6]:=VBL^.CHLOC; &VARY^.DSEEN[6]:=FALSE; $END $ELSE $ IF (VARY^.ODLOC[6]<>VARY^.DLOC[6]) AND PERCENT(20) THEN (SPEAK(ARY^.RTEXT[127]); "END;  END; { PIRATESTUFF}  BEGIN { DWARFSTUFF } "IF VBL^.DFLAG=1 THEN $IF (VBL^.LOC>=15) AND PERCENT(95) THEN $BEGIN &VBL^.DFLAG:=2; &FOR I:=1 TO 2 DO (IF PERCENT(50) THEN *VARY^.DLOC[1+RAN(5)]:=0; &FOR I:=1 TO 5 DO &BEGIN (IF VARY^.DLOC[I]=VBL^.LOC THEN *VARY^.DLOC[I]:=DALTLC; (VARY^.ODLOC[I]:=VARY^.DLOC[I]; &END; &SPEAK(ARY^.RTEXT[3]); &DROP(AXE,VBL^.LOC); $END $ELSE "ELSE "BEGIN $VBL^.DTOTAL:=0; $ATTACK:=0; $STICK:=0; $FOR I:=1 TO 6 DO &IF VARY^.DLOC[I]<>0 THEN &BEGIN (J:=1; (KK:=ARY^.KEY[VARY^.DLOC[I]]; (IF KK<>0 THEN (REPEAT *NEWLOC:=ARY^.TRAVEL2[KK]; *IF (J>1) AND (J<=21) THEN ,LASTLOC:=VARY^.TK[J-1]; *IF NEWLOC<=150 THEN *BEGIN ,TBITSET:=BITSET(NEWLOC,3); ,TFORCED:=FORCED(NEWLOC); *END *ELSE *BEGIN ,TBITSET:=FALSE; ,TFORCED:=FALSE; *END; *IF (NEWLOC>300) OR (NEWLOC<15) OR -(NEWLOC=VARY^.ODLOC[I]) OR -((J>1) AND (NEWLOC=LASTLOC)) OR (J>=20) OR -(NEWLOC=VARY^.DLOC[I]) OR TFORCED OR -((I=6) AND TBITSET) OR -(ARY^.TRAVEL3[KK]=100) THEN *ELSE *BEGIN ,VARY^.TK[J]:=NEWLOC; ,J:=J+1; *END; *KK:=KK+1; (UNTIL ARY^.TRAVEL[KK-1]<0; (VARY^.TK[J]:=VARY^.ODLOC[I]; (IF J>=2 THEN J:=J-1; (J:=1+RAN(J); (VARY^.ODLOC[I]:=VARY^.DLOC[I]; (VARY^.DLOC[I]:=VARY^.TK[J]; (VARY^.DSEEN[I]:=(VARY^.DSEEN[I] AND (VBL^.LOC>=15)) OR -(VARY^.DLOC[I]=VBL^.LOC) OR -(VARY^.ODLOC[I]=VBL^.LOC); (IF VARY^.DSEEN[I] THEN (BEGIN *VARY^.DLOC[I]:=VBL^.LOC; *IF I=6 THEN ,IF (VBL^.LOC<>VBL^.CHLOC) AND (VARY^.PROP[CHEST]<0) THEN * PIRATESTUFF * ELSE *ELSE *BEGIN ,VBL^.DTOTAL:=VBL^.DTOTAL+1; ,IF VARY^.ODLOC[I]=VARY^.DLOC[I] THEN ,BEGIN .ATTACK:=ATTACK+1; .IF VBL^.KNFLOC>=0 THEN VBL^.KNFLOC:=VBL^.LOC; .IF RAN(1000)<(95*(VBL^.DFLAG-2)) THEN 0STICK:=STICK+1; ,END; *END; (END; &END;  END; "IF VBL^.DTOTAL<>0 THEN "BEGIN " IF VBL^.DTOTAL=1 THEN &SPEAK(ARY^.RTEXT[4]) $ELSE $BEGIN &WRITE('THERE ARE ',VBL^.DTOTAL,' THREATENING '); &WRITELN('LITTLE DWARVES IN THE ROOM WITH YOU'); $END; " IF ATTACK<>0 THEN $BEGIN $ IF VBL^.DFLAG=2 THEN (VBL^.DFLAG:=3; &IF ATTACK=1 THEN &BEGIN (SPEAK(ARY^.RTEXT[5]); (K:=52; &END &ELSE &BEGIN (K:=6; (WRITE(ATTACK,' OF THEM THROW KNIVES AT YOU.'); $ END; $ IF STICK>1 THEN (WRITELN(STICK,' OF THEM GET YOU!') &ELSE (SPEAK(ARY^.RTEXT[K+STICK]); &IF STICK<>0 THEN &BEGIN & VBL^.OLDLC2:=VBL^.LOC; (HE_DIED:=TRUE; &END; $END; "END;  END; { DWARFSTUFF }  PROCEDURE DESCRIBE_CURRENT_LOCATION;  BEGIN { DESCRIBE_CURRENT_LOCATION} "IF VBL^.LOC=0 THEN "BEGIN " HE_DIED:=TRUE; $EXIT(DESCRIBE_CURRENT_LOCATION); "END; "KK:=ARY^.STEXT[VBL^.LOC]; "IF ((VARY^.ABB[VBL^.LOC] MOD VBL^.ABBNUM)=0) OR (KK=0) THEN $KK:=ARY^.LTEXT[VBL^.LOC]; "IF (NOT FORCED(VBL^.LOC)) AND DARK THEN "BEGIN $IF VBL^.WZDARK AND PERCENT(35) THEN $BEGIN $ HE_DIED:=TRUE; &PIT:=TRUE; &EXIT(DESCRIBE_CURRENT_LOCATION); $END; $KK:=ARY^.RTEXT[16]; "END; "IF TOTING(BEAR) THEN $SPEA) ,SPEAK(ARY^.RTEXT[NEWLOC-500]); ,NEWLOC:=VBL^.LOC; ,EXIT(SET_NEW_LOC); *END; (END; (REPEAT *IF ARY^.TRAVEL[KK]<0 THEN ,ERRORHALT(25); *KK:=KK+1; (UNTIL (TVCOND<>ARY^.TRAVEL3[KK]) AND .(NEWLOC<>ARY^.TRAVEL2[KK]); &UNTIL FALSE; { EXIT IS BY EXIT PROC} $END; {NOT SPECIAL}  END; { SET_NEW_LOC } ?^h BEGIN {CAVEHINT}  IF (VARY^.PROP[GRATE]=0) AND NOT HERE(KEYS) THEN $GIVEHINT "ELSE $VARY^.HINTLC[HINT]:=0;  END; {CAVEHINT}  PROCEDURE BIRDHINT;  BEGIN {BIRDHINT}  IF HERE(BIRD) AND TOTING(ROD) AND (VBL^.OBJ=BIRD) THEN $GIVEHINT;  END; {BIRDHINT}  PROCEDURE SNAKEHINT;  BEGIN {SNAKEHINT}  IF HERE(SNAKE) AND NOT HERE(BIRD) THEN $GIVEHINT "ELSE $VARY^.HINTLC[HINT]:=0;  END; {SNAKEHINT}  PROCEDURE MAZEHINT;  BEGIN {MAZEHINT}  IF (VARY^.ATLOC[VBL^.LOC]=0) AND (VARY^.ATLOC[VBL^.OLDLOC]=0) AND %(VARY^.ATLOC[VBL^.OLDLC2]=0) AND (VBL^.HLDING>1) THEN $GIVEHINT "ELSE $VARY^.HINTLC[HINT]:=0;  END; {MAZEHINT}  PROCEDURE DARKHINT;  BEGIN {DARKHINT}  IF (VARY^.PROP[EMERALD]<>-1) AND (VARY^.PROP[PYRAMID]=-1) THEN $GIVEHINT "ELSE $VARY^.HINTLC[HINT]:=0;  END; {DARKHINT}  PROCEDURE WITTHINT;  BEGIN {WITTHINT}  GIVEHINT;  END; {WITTHINT}  BEGIN { CHECKHINTS} "FOR HINT:=4 TO HNTSIZ DO "BEGIN $IF NOT VARY^.HINTED[HINT] THEN $BEGIN &IF BITSET(VBL^.LOC,HINT) THEN (VARY^.HINTLC[HINT]:=VARY^.HINTLC[HINT]+1 &ELSE (VARY^.HINTLC[HINT]:=0; &IF VARY^.HINTLC[HINT]>= ARY^.HINTS[HINT,1] THEN $ CASE HINT OF *4 : CAVEHINT; *5 : BIRDHINT; *6 : SNAKEHINT; *7 : MAZEHINT; *8 : DARKHINT; *9 : WITTHINT; (END; {CASE OF HINT} $END; "END;  END; { CHECKHINTS}  PROCEDURE SET_NEW_LOC;  VAR "T1,T2,T3 : BOOLEAN;  PROCEDURE PLOVERALCOVE;  BEGIN { PLOVERALCOVE }  NEWLOC:=199 - VBL^.LOC; "IF (VBL^.HLDING=0) OR ((VBL^.HLDING=1) AND TOTING(EMERALD)) THEN "ELSE "BEGIN " NEWLOC:=VBL^.LOC; $SPEAK(ARY^.RTEXT[117]); "END;  EXIT(SET_NEW_LOC);  END; { PLOVERALCOVE }  PROCEDURE TROLLBRIDGE;  BEGIN { TROLLBRIDGE }  IF VARY^.PROP[TROLL]=1 THEN "BEGIN " PSPEAK(TROLL,1); $VARY^.PROP[TROLL]:=0; $MOVE(TROLL2,0); $MOVE(TROLL2+100,0); $MOVE(TROLL,ARY^.PLAC[TROLL]); $MOVE(TROLL+100,ARY^.FIXD[TROLL]); $JUGGLE(CHASM); $NEWLOC:=VBL^.LOC; "END "ELSE "BEGIN " NEWLOC:=ARY^.PLAC[TROLL]+ARY^.FIXD[TROLL]-VBL^.LOC; $IF VARY^.PROP[TROLL]=0 THEN &VARY^.PROP[TROLL]:=1; $IF TOTING(BEAR) THEN $BEGIN $ SPEAK(ARY^.RTEXT[162]); &VARY^.PROP[CHASM]:=1; &VARY^.PROP[TROLL]:=2; &DROP(BEAR,NEWLOC); &VARY^.FIXED[BEAR]:=-1; &VARY^.PROP[BEAR]:=3; &IF VARY^.PROP[SPICES]<0 THEN (VBL^.TALLY2:=VBL^.TALLY2+1; &VBL^.OLDLC2:=NEWLOC; &HE_DIED:=TRUE; $END; "END;  EXIT(SET_NEW_LOC);  END; { TROLLBRIDGE }  BEGIN { SET_NEW_LOC }  KK:=ARY^.KEY[VBL^.LOC]; "IF KK=0 THEN $ERRORHALT(26); "NEWLOC:=VBL^.LOC; "IF K=NULL THEN " EXIT(SET_NEW_LOC); "SKIPIT:=FALSE; "IF K=BACK THEN "BEGIN {BACK} " SKIPIT:=TRUE; $IF FORCED(K) THEN &K:=VBL^.OLDLC2 $ELSE &K:=VBL^.OLDLOC; $VBL^.OLDLC2:=VBL^.OLDLOC; $VBL^.OLDLOC:=VBL^.LOC; $K2:=0; $IF K=VBL^.LOC THEN $BEGIN &SPEAK(ARY^.RTEXT[91]); &EXIT(SET_NEW_LOC); " END; $OK:=FALSE; $KK:=KK-1; $REPEAT &KK:=KK+1; &IF K=ARY^.TRAVEL2[KK] THEN &BEGIN (K:=ABS(ARY^.TRAVEL[KK]); (KK:=ARY^.KEY[VBL^.LOC]; & OK:=TRUE; &END &ELSE &BEGIN & IF ARY^.TRAVEL2[KK]<=300 THEN (BEGIN ( J:=ARY^.KEY[ARY^.TRAVEL2[KK]]; *IF FORCED(ARY^.TRAVEL2[KK]) AND (ARY^.TRAVEL2[J]=K) THEN ,K2:=KK; (END; & IF ARY^.TRAVEL[KK]<0 THEN (BEGIN ( KK:=K2; *IF KK=0 THEN *BEGIN * SPEAK(ARY^.RTEXT[140]); ,EXIT(SET_NEW_LOC); *END; *K:=ABS(ARY^.TRAVEL[KK]); *KK:=ARY^.KEY[VBL^.LOC]; *OK:=TRUE; (END; &END; " UNTIL OK OR (ARY^.TRAVEL2[KK]=K); "END; {BACK} "IF K=LOOK THEN "BEGIN {LOOK} $IF VBL^.DETAIL<3 THEN &SPEAK(ARY^.RTEXT[15]); $VBL^.DETAIL:=VBL^.DETAIL+1; $VBL^.WZDARK:=FALSE; $VARY^.ABB[VBL^.LOC]:=0; "END {LOOK} "ELSE {LOOK} $IF K=CAVE THEN $BEGIN {CAVE} &IF VBL^.LOC<8 THEN (SPEAK(ARY^.RTEXT[57]) &ELSE (SPEAK(ARY^.RTEXT[58]); $END {CAVE} $ELSE {CAVE} $BEGIN {NOT SPECIAL} &IF NOT SKIPIT THEN &BEGIN (VBL^.OLDLC2:=VBL^.OLDLOC; (VBL^.OLDLOC:=VBL^.LOC; &END; &{ TRAVEL = VERB } &{ TRAVEL2 = WHERE TO GO } &{ TRAVEL3 = CONDITION (IF ANY) } &KK:=KK-1; &REPEAT (KK:=KK+1; (OK:=(ABS(ARY^.TRAVEL[KK])=1) OR (ABS(ARY^.TRAVEL[KK])=K); &UNTIL OK OR (ARY^.TRAVEL[KK]<0); &IF NOT OK THEN &BEGIN & SPK:=12; (CASE K OF *43,44,45,46,47,48,49,50,29,30 : SPK:=9; *7,36,37 : SPK:=10; *11,19 : SPK:=11; *62,65 : SPK:=42; *17 : SPK:=80; (END; & IF (VBL^.VERB=FIND) OR (VBL^.VERB=INVENTORY) THEN *SPK:=59; & SPEAK(ARY^.RTEXT[SPK]); (EXIT(SET_NEW_LOC); &END; &REPEAT (NEWLOC:=ARY^.TRAVEL2[KK]; (TVCOND:=ARY^.TRAVEL3[KK]; (K:=TVCOND MOD 100; (IF K=0 THEN (BEGIN *T1:=FALSE; *T2:=FALSE; ( T3:=FALSE; (END (ELSE (BEGIN *T1:=TOTING(K); *T2:=AT(K); ( T3:=VARY^.PROP[K]<>(TVCOND DIV 100 -3) (END; (IF ((TVCOND<=100) AND ,((TVCOND=0) OR PERCENT(TVCOND))) OR +((TVCOND>100) AND (TVCOND<=300) AND ,(T1 OR ((TVCOND>200) AND T2))) OR +((TVCOND>300) AND T3) THEN (BEGIN *IF NEWLOC<=300 THEN ,EXIT(SET_NEW_LOC); *IF NEWLOC<=500 THEN *BEGIN -NEWLOC:=NEWLOC-300; -IF NEWLOC=1 THEN /PLOVERALCOVE -ELSE /IF NEWLOC=2 THEN 1DROP(EMERALD,VBL^.LOC) /ELSE 1IF NEWLOC=3 THEN 3TROLLBRIDGE 1ELSE 3ERRORHALT(20); *END *ELSE *BEGIN * ARY^.PROP[DOOR]=1) THEN $SPK:=54; "IF VBL^.OBJ=CAGE THEN $SPK:=32; "IF VBL^.OBJ=KEYS THEN $SPK:=55; "IF (VBL^.OBJ=GRATE) OR (VBL^.OBJ=CHAIN) THEN $SPK:=31; "IF (SPK=31) AND HERE(KEYS) THEN "BEGIN {KEYS HERE} " IF VBL^.OBJ=CHAIN THEN $BEGIN $ IF VBL^.VERB=LOCK THEN &BEGIN & IF VARY^.PROP[CHAIN]<>0 THEN *SPK:=34 (ELSE *IF VBL^.LOC<>ARY^.PLAC[CHAIN] THEN ,SPK:=173 *ELSE *BEGIN * SPK:=172; ,VARY^.PROP[CHAIN]:=2; ,IF TOTING(CHAIN) THEN .DROP(CHAIN,VBL^.LOC); ,VARY^.FIXED[CHAIN]:=-1; *END; &END &ELSE &BEGIN & IF VARY^.PROP[BEAR]=0 THEN *SPK:=41 & ELSE *IF VARY^.PROP[CHAIN]=0 THEN ,SPK:=37 *ELSE *BEGIN ,SPK:=171; ,VARY^.PROP[CHAIN]:=0; ,VARY^.FIXED[CHAIN]:=0; ,IF VARY^.PROP[BEAR]<>3 THEN .VARY^.PROP[BEAR]:=2; ,VARY^.FIXED[BEAR]:=2-VARY^.PROP[BEAR]; & END; &END $END $ELSE &IF VBL^.CLOSING THEN &BEGIN & SPK:=130; (IF NOT VBL^.PANIC THEN *VBL^.CLOCK2:=15; (VBL^.PANIC:=TRUE; &END &ELSE &BEGIN & SPK:=34+VARY^.PROP[GRATE]; (IF VBL^.VERB=LOCK THEN *VARY^.PROP[GRATE]:=0 (ELSE (BEGIN *SPK:=SPK+2; *VARY^.PROP[GRATE]:=1; & END; &END; "END;  LEAVE;  END; {L_U_IT}  PROCEDURE SAY_OK;  BEGIN {SAY_OK}  SPK:=54; "LEAVE;  END; {SAY_OK}  PROCEDURE LAMP_ON;  BEGIN {LAMP_ON}  IF HERE(LAMP) THEN $IF VBL^.LIMIT<0 THEN &SPK:=184 $ELSE $BEGIN $ VARY^.PROP[LAMP]:=1; &SPK:=0; &SPEAK(ARY^.RTEXT[39]); &SKIPDWARF:=TRUE; &IF VBL^.WZDARK THEN (EXIT(DOWHATHESAYS); $END; "LEAVE;  END; {LAMP_ON}  PROCEDURE LAMP_OFF; PROCEDURE LEAVE;  BEGIN {LEAVE}  SKIPDWARF:=TRUE; "SKIPDESCRIBE:=TRUE; "IF SPK<>0 THEN $SPEAK(ARY^.RTEXT[SPK]);  EXIT(DOWHATHESAYS);  END; {LEAVE}  PROCEDURE MISCXIT;  BEGIN {MISCXIT} "IF (VBL^.OBJ=COINS) AND HERE(VEND_MACHINE) THEN "BEGIN $DESTROY(COINS); $DROP(BATTERY,VBL^.LOC); $PSPEAK(BATTERY,0); $SPK:=0; $LEAVE; "END "ELSE $IF (VBL^.OBJ=BIRD) AND AT(DRAGON) AND '(VARY^.PROP[DRAGON]=0) THEN $BEGIN &SPK:=154; &DESTROY(BIRD); &VARY^.PROP[BIRD]:=0; &IF VARY^.PLACE[SNAKE]=ARY^.PLAC[SNAKE] THEN (VBL^.TALLY2:=VBL^.TALLY2+1; &LEAVE; $END $ELSE &IF (VBL^.OBJ=BEAR) AND AT(TROLL) THEN &BEGIN (SPK:=163; (MOVE(TROLL,0); (MOVE(TROLL+100,0); (MOVE(TROLL2,ARY^.PLAC[TROLL]); (MOVE(TROLL2+100,ARY^.FIXD[TROLL]); (JUGGLE(CHASM); (VARY^.PROP[TROLL]:=2; &END &ELSE (IF (VBL^.OBJ=VASE) AND (VBL^.LOC<>ARY^.PLAC[PILLOW]) THEN (BEGIN *SPK:=0; *IF AT(PILLOW) THEN ,VARY^.PROP[VASE]:=0 *ELSE *BEGIN ,VARY^.PROP[VASE]:=2; ,VARY^.FIXED[VASE]:=-1; *END; *PSPEAK(VASE,VARY^.PROP[VASE]+1); (END (ELSE *SPK:=54;  END; {MISCXIT}  PROCEDURE ASKWHATTODOITTO;  BEGIN {ASKWHATTODOITTO}  WRITELN(WD1,WD1X,' WHAT?'); "VBL^.OBJ:=0; "RESTART:=1; "EXIT(DOWHATHESAYS);  END; {ASKWHATTODOITTO}  PROCEDURE FILL_IT;  BEGIN {FILL_IT}  IF VBL^.OBJ=VASE THEN "BEGIN " SPK:=29; $IF LIQLOC(VBL^.LOC)=0 THEN &SPK:=144; $IF (LIQLOC(VBL^.LOC)=0) OR TOTING(VASE) THEN &LEAVE; $SPEAK(ARY^.RTEXT[145]); $VARY^.PROP[VASE]:=2; $VARY^.FIXED[VASE]:=-1; " MISCXIT; " LEAVE; "END; "IF (VBL^.OBJ<>0) AND (VBL^.OBJ<>BOTTLE) THEN $LEAVE; "IF (VBL^.OBJ=0) AND NOT HERE(BOTTLE) THEN $ASKWHATTODOITTO; "SPK:=107; "IF LIQLOC(VBL^.LOC)=0 THEN $SPK:=106; "IF LIQ<>0 THEN $SPK:=105; "IF SPK<>107 THEN $LEAVE; "VARY^.PROP[BOTTLE]:=((VARY^.COND[VBL^.LOC] MOD 4) DIV 2) * 2;  K:=LIQ; "IF TOTING(BOTTLE) THEN $VARY^.PLACE[K]:=-1; "IF K=OIL THEN $SPK:=108; "LEAVE;  END; {FILL_IT}  PROCEDURE CARRY_IT;  BEGIN {CARRY_IT}  IF TOTING(VBL^.OBJ) THEN  LEAVE; "SPK:=25; "IF (VBL^.OBJ=PLANT) AND (VARY^.PROP[PLANT]<=0) THEN $SPK:=115; "IF (VBL^.OBJ=BEAR) AND (VARY^.PROP[BEAR]=1) THEN $SPK:=169; "IF (VBL^.OBJ=CHAIN) AND (VARY^.PROP[BEAR]<>0) THEN $SPK:=170; "IF VARY^.FIXED[VBL^.OBJ]<>0 THEN $LEAVE; "IF (VBL^.OBJ=WATER) OR (VBL^.OBJ=OIL) THEN "BEGIN " IF HERE(BOTTLE) AND (LIQ=VBL^.OBJ) THEN &VBL^.OBJ:=BOTTLE $ELSE $BEGIN $ VBL^.OBJ:=BOTTLE; &IF VARY^.PROP[BOTTLE]<>1 THEN (SPK:=105 &ELSE (IF TOTING(BOTTLE) THEN *FILL_IT (ELSE *SPK:=104; $ LEAVE; $END; "END; "IF VBL^.HLDING>MAXHLD THEN "BEGIN $SPK:=92; $LEAVE; "END; "IF (VBL^.OBJ=BIRD) AND (VARY^.PROP[BIRD]=0) THEN "BEGIN $IF TOTING(ROD) THEN $BEGIN &SPK:=26; &LEAVE; $END; $IF NOT TOTING(CAGE) THEN $BEGIN &SPK:=27; &LEAVE; $END; $VARY^.PROP[BIRD]:=1; "END; "IF ((VBL^.OBJ=BIRD) OR (VBL^.OBJ=CAGE)) AND % (VARY^.PROP[BIRD]<>0) THEN $CARRY(BIRD+CAGE-VBL^.OBJ,VBL^.LOC); "CARRY(VBL^.OBJ,VBL^.LOC); "K:=LIQ; "IF (VBL^.OBJ=BOTTLE) AND (K<>0) THEN $VARY^.PLACE[K]:=-1; "SPK:=54; "LEAVE;  END; {CARRY_IT}  PROCEDURE DISTURBDWARVES;  BEGIN {DISTURBDWARVES}  SPEAK(ARY^.RTEXT[136]); "ALLDONE:=TRUE; "EXIT(DOWHATHESAYS);  END; {DISTURBDWARVES}  PROCEDURE DROP_IT;  BEGIN {DROP IT}  IF TOTING(ROD2) AND (VBL^.OBJ=ROD) AND NOT TOTING(ROD) THEN $VBL^.OBJ:=ROD2; "IF NOT TOTING(VBL^.OBJ) THEN $LEAVE; "IF (VBL^.OBJ=BIRD) AND HERE(SNAKE) THEN "BEGIN " SPK:=30; $IF VBL^.CLOSED THEN $ DISTURBDWARVES; $DESTROY(SNAKE); $VARY^.PROP[SNAKE]:=1; "END "ELSE  MISCXIT; "K:=LIQ; "IF K=VBL^.OBJ THEN $VBL^.OBJ:=BOTTLE; "IF (VBL^.OBJ=BOTTLE) AND (K<>0) THEN $VARY^.PLACE[K]:=0; "IF (VBL^.OBJ=CAGE) AND (VARY^.PROP[BIRD]<>0) THEN $DROP(BIRD,VBL^.LOC); "IF VBL^.OBJ=BIRD THEN $VARY^.PROP[BIRD]:=0; "DROP(VBL^.OBJ,VBL^.LOC); "LEAVE;  END; {DROP IT}  PROCEDURE SAY_IT;  VAR "I : INTEGER;  BEGIN {SAY_IT}  IF WD2='' THEN "BEGIN $WD2:=WD1; $WD2X:=WD1X; "END; "I:=VOCAB(WD2,-1); "IF (I=62) OR (I=65) OR (I=71) OR (I=2025) THEN " RESTART:=1 "ELSE $WRITELN('OKAY, "',WD2,WD2X,'"');  END; {SAY_IT}  PROCEDURE L_U_IT;  BEGIN {L_U_IT}  IF (VBL^.OBJ=CLAM) OR (VBL^.OBJ=OYSTER) THEN "BEGIN " IF VBL^.OBJ=OYSTER THEN &K:=1 $ELSE &K:=0; " SPK:=124+K; $IF TOTING(VBL^.OBJ) THEN &SPK:=120+K; $IF NOT TOTING(TRIDENT) THEN &SPK:=122+K; $IF VBL^.VERB=LOCK THEN &SPK:=61; " IF SPK=124 THEN $BEGIN $ DESTROY(CLAM); &DROP(OYSTER,VBL^.LOC); &DROP(PEARL,105); $END; " LEAVE; "END; "IF VBL^.OBJ=DOOR THEN $SPK:=111; "IF (VBL^.OBJ=DOOR) AND (V+ "K:=NULL; "SET_NEW_LOC;  EXIT(DOWHATHESAYS);  END; {TOSS_IT_AWAY}  BEGIN {TOSS_IT}  IF TOTING(ROD2) AND (VBL^.OBJ=ROD) AND NOT TOTING(ROD) THEN $VBL^.OBJ:=ROD2; "IF NOT TOTING(VBL^.OBJ) THEN $LEAVE; "IF (VBL^.OBJ>=50) AND (VBL^.OBJ<=MAXTRS) AND AT(TROLL) THEN "BEGIN " SPK:=159; $DROP(VBL^.OBJ,0); $MOVE(TROLL,0); $MOVE(TROLL+100,0); $DROP(TROLL2,ARY^.PLAC[TROLL]); $DROP(TROLL2+100,ARY^.FIXD[TROLL]); $JUGGLE(CHASM); $LEAVE; "END; "IF (VBL^.OBJ=FOOD) AND HERE(BEAR) THEN "BEGIN " VBL^.OBJ:=BEAR; $FEED_IT; "END; "IF VBL^.OBJ<>AXE THEN $DROP_IT; "FOR I:=1 TO 5 DO "BEGIN " IF VARY^.DLOC[I]=VBL^.LOC THEN $BEGIN $ SPK:=48; &IF RAN(3)<>0 THEN &BEGIN & VARY^.DSEEN[I]:=FALSE; (VARY^.DLOC[I]:=0; (SPK:=47; (VBL^.DKILL:=VBL^.DKILL+1; (IF VBL^.DKILL=1 THEN *SPK:=149; &END; $ TOSS_IT_AWAY; $END; "END; "SPK:=152; "IF AT(DRAGON) AND (VARY^.PROP[DRAGON]=0) THEN " TOSS_IT_AWAY; "SPK:=158; "IF AT(TROLL) THEN " TOSS_IT_AWAY; "IF HERE(BEAR) AND (VARY^.PROP[BEAR]=0) THEN "BEGIN " SPK:=164; $DROP(AXE,VBL^.LOC); $VARY^.FIXED[AXE]:=-1; $VARY^.PROP[AXE]:=1; " JUGGLE(BEAR); $LEAVE; "END; "VBL^.OBJ:=0; "KILL_IT;  END; {TOSS_IT}  PROCEDURE FIND_IT;  VAR "I : INTEGER;  BEGIN {FIND_IT}  IF AT(VBL^.OBJ) OR ((LIQ=VBL^.OBJ) AND AT(BOTTLE)) OR %(K=LIQLOC(VBL^.LOC)) THEN $SPK:=94; "IF VBL^.OBJ=DWARF THEN $FOR I:=1 TO 6 DO &IF (VARY^.DLOC[I]=VBL^.LOC) AND (VBL^.DFLAG>=2) THEN (SPK:=94;  IF VBL^.CLOSED THEN $SPK: BEGIN {LAMP_OFF}  IF HERE(LAMP) THEN "BEGIN " VARY^.PROP[LAMP]:=0; $SPEAK(ARY^.RTEXT[40]); $IF DARK THEN &SPK:=16 $ELSE &SPK:=0; "END; "LEAVE;  END; {LAMP_OFF}  PROCEDURE WAVE_IT;  BEGIN {WAVE_IT}  IF (NOT TOTING(VBL^.OBJ)) AND %((VBL^.OBJ<>ROD) OR NOT TOTING(ROD2)) THEN $SPK:=29; "IF (VBL^.OBJ=ROD) AND AT(FISSURE) AND TOTING(VBL^.OBJ) AND %NOT VBL^.CLOSING THEN "BEGIN " SPK:=0; $VARY^.PROP[FISSURE]:=1-VARY^.PROP[FISSURE]; $PSPEAK(FISSURE,2-VARY^.PROP[FISSURE]); "END;  LEAVE;  END; {WAVE_IT}  PROCEDURE KILL_IT;  VAR "I,J : INTEGER;  BEGIN {KILL_IT}  I:=0; "FOR J:=1 TO 5 DO $IF (VARY^.DLOC[J]=VBL^.LOC) AND (VBL^.DFLAG>=2) THEN $BEGIN &I:=J; &J:=5; $END;  IF VBL^.OBJ=0 THEN "BEGIN " IF I<>0 THEN &VBL^.OBJ:=DWARF; $IF HERE(SNAKE) THEN &VBL^.OBJ:=VBL^.OBJ*100 + SNAKE; $IF AT(DRAGON) AND (VARY^.PROP[DRAGON]=0) THEN &VBL^.OBJ:=VBL^.OBJ*100 + DRAGON; $IF AT(TROLL) THEN &VBL^.OBJ:=VBL^.OBJ*100 + TROLL; $IF HERE(BEAR) AND (VARY^.PROP[BEAR]=0) THEN &VBL^.OBJ:=VBL^.OBJ*100 + BEAR; $IF VBL^.OBJ>100 THEN &ASKWHATTODOITTO; $IF VBL^.OBJ=0 THEN $BEGIN $ IF HERE(BIRD) AND (VBL^.VERB<>THROW) THEN (VBL^.OBJ:=BIRD; &IF HERE(CLAM) OR HERE(OYSTER) THEN (VBL^.OBJ:=VBL^.OBJ*100 + CLAM; &IF VBL^.OBJ>100 THEN (ASKWHATTODOITTO; $END; "END; "IF VBL^.OBJ=BIRD THEN "BEGIN " SPK:=137; $IF VBL^.CLOSED THEN &LEAVE; $DESTROY(BIRD); $VARY^.PROP[BIRD]:=0; $IF VARY^.PLACE[SNAKE]=ARY^.PLAC[SNAKE] THEN &VBL^.TALLY2:=VBL^.TALLY2+1; $SPK:=45; "END; "IF VBL^.OBJ=0 THEN $SPK:=44; "IF (VBL^.OBJ=CLAM) OR (VBL^.OBJ=OYSTER) THEN $SPK:=150; "IF VBL^.OBJ=SNAKE THEN $SPK:=46; "IF VBL^.OBJ=DWARF THEN $SPK:=49; "IF (VBL^.OBJ=DWARF) AND VBL^.CLOSED THEN $DISTURBDWARVES; "IF VBL^.OBJ=DRAGON THEN $SPK:=167; "IF VBL^.OBJ=TROLL THEN $SPK:=157; "IF VBL^.OBJ=BEAR THEN $SPK:=165+(VARY^.PROP[BEAR]+1) DIV 2; "IF (VBL^.OBJ<>DRAGON) OR (VARY^.PROP[DRAGON]<>0) THEN $LEAVE; "VBL^.VERB:=0; "VBL^.OBJ:=0; "IF NOT YES(49,0,0) THEN "BEGIN $RESTART:=2; $SPK:=0; $LEAVE; "END; "PSPEAK(DRAGON,1); "VARY^.PROP[DRAGON]:=2; "VARY^.PROP[RUG]:=0; "K:=(ARY^.PLAC[DRAGON]+VARY^.FIXED[DRAGON]) DIV 2; "MOVE(DRAGON+100,-1); "MOVE(RUG+100,0); "MOVE(DRAGON,K); "MOVE(RUG,K); "FOR I:=1 TO 100 DO $IF (VARY^.PLACE[I]=ARY^.PLAC[DRAGON]) OR '(VARY^.PLACE[I]=ARY^.FIXD[DRAGON]) THEN &MOVE(I,K); "VBL^.LOC:=K; "K:=NULL; "SET_NEW_LOC;  EXIT(DOWHATHESAYS);  END; {KILL_IT}  PROCEDURE POUR_IT;  BEGIN {POUR_IT}  IF (VBL^.OBJ=BOTTLE) OR (VBL^.OBJ=0) THEN $VBL^.OBJ:=LIQ; "IF VBL^.OBJ=0 THEN $ASKWHATTODOITTO; "IF NOT TOTING(VBL^.OBJ) THEN $LEAVE; "SPK:=78; "IF (VBL^.OBJ<>WATER) AND (VBL^.OBJ<>OIL) THEN $LEAVE; "VARY^.PROP[BOTTLE]:=1; "VARY^.PLACE[VBL^.OBJ]:=0; "SPK:=77; "IF NOT (AT(PLANT) OR AT(DOOR)) THEN $LEAVE; "IF AT(DOOR) THEN "BEGIN " IF VBL^.OBJ=OIL THEN $BEGIN &SPK:=114; &VARY^.PROP[DOOR]:=1; $END $ELSE $BEGIN &SPK:=113; &VARY^.PROP[DOOR]:=0; $END; " LEAVE; "END; "SPK:=112; "IF VBL^.OBJ<>WATER THEN $LEAVE; "PSPEAK(PLANT,VARY^.PROP[PLANT]+1); "VARY^.PROP[PLANT]:=(VARY^.PROP[PLANT]+2) MOD 6; "VARY^.PROP[PLANT2]:=VARY^.PROP[PLANT] DIV 2; "K:=NULL; "SET_NEW_LOC;  EXIT(DOWHATHESAYS);  END; {POUR_IT}  PROCEDURE EAT_IT;  BEGIN {EAT_IT}  IF VBL^.OBJ=FOOD THEN "BEGIN $DESTROY(FOOD); $SPK:=72; $LEAVE; "END; "IF (VBL^.OBJ=BIRD) OR (VBL^.OBJ=SNAKE) OR (VBL^.OBJ=CLAM) OR %(VBL^.OBJ=OYSTER) OR (VBL^.OBJ=DWARF) OR (VBL^.OBJ=DRAGON) OR %(VBL^.OBJ=TROLL) OR (VBL^.OBJ=BEAR) THEN $SPK:=71; "LEAVE;  END; {EAT_IT}  PROCEDURE DRINK_IT;  VAR "I : INTEGER;  BEGIN {DRINK_IT}  IF (VBL^.OBJ=0) AND (LIQLOC(VBL^.LOC)<>WATER) AND %((LIQ<>WATER) OR NOT HERE(BOTTLE)) THEN $ASKWHATTODOITTO; "IF (VBL^.OBJ<>0) AND (VBL^.OBJ<>WATER) THEN $SPK:=110; "IF (SPK=110) OR (LIQ<>WATER) OR NOT HERE(BOTTLE) THEN $LEAVE; "VARY^.PROP[BOTTLE]:=1; "VARY^.PLACE[WATER]:=0; "SPK:=74; "LEAVE;  END; {DRINK_IT}  PROCEDURE RUB_IT;  BEGIN {RUB_IT}  IF VBL^.OBJ<>LAMP THEN $SPK:=76; "LEAVE;  END; {RUB_IT}  PROCEDURE FEED_IT;  BEGIN {FEED_IT}  IF VBL^.OBJ=BIRD THEN "BEGIN $SPK:=100; $LEAVE; "END; "IF (VBL^.OBJ=SNAKE) OR (VBL^.OBJ=DRAGON) OR (VBL^.OBJ=TROLL) THEN "BEGIN " IF (VBL^.OBJ=DRAGON) AND (VARY^.PROP[DRAGON]<>0) THEN &SPK:=110; $IF VBL^.OBJ=TROLL THEN &SPK:=182; $IF (VBL^.OBJ<>SNAKE) OR VBL^.CLOSED OR NOT HERE(BIRD) THEN &LEAVE; $SPK:=101; $DESTROY(BIRD); $VARY^.PROP[BIRD]:=0; $VBL^.TALLY2:=VBL^.TALLY2+1; $LEAVE; "END; "IF VBL^.OBJ=DWARF THEN "BEGIN " IF NOT HERE(FOOD) THEN &LEAVE; $SPK:=103; $VBL^.DFLAG:=VBL^.DFLAG+1; $LEAVE; "END; "IF VBL^.OBJ=BEAR THEN "BEGIN " IF VARY^.PROP[BEAR]=0 THEN &SPK:=102; $IF VARY^.PROP[BEAR]=3 THEN &SPK:=110; $IF NOT HERE(FOOD) THEN &LEAVE; $DESTROY(FOOD); $VARY^.PROP[BEAR]:=1; $VARY^.FIXED[AXE]:=0; $VARY^.PROP[AXE]:=0; $SPK:=168; $LEAVE; "END; "SPK:=14; "LEAVE;  END; {FEED_IT}  PROCEDURE TOSS_IT;  VAR "I : INTEGER;  PROCEDURE TOSS_IT_AWAY;  BEGIN {TOSS_IT_AWAY} "SPEAK(ARY^.RTEXT[SPK]); "DROP(AXE,VBL^.LOC); , LAMP_OFF; { OFF } $9: ASKWHATTODOITTO; { WAVE } #10: ASKWHATTODOITTO; { CALM } #11: LEAVE; { WALK } #12: KILL_IT; { KILL } #13: POUR_IT; { POUR } #14: EAT_SOMETHING; { EAT } #15: DRINK_IT; { DRINK }  16: ASKWHATTODOITTO; { RUB } #17: ASKWHATTODOITTO; { TOSS } #18: QUIT; { QUIT } #19: ASKWHATTODOITTO; { FIND } #20: REPORT; { INVENTORY } #21: ASKWHATTODOITTO; { FEED } #22: FILL_IT; { FILL } #23: BLAST_IT; { BLAST } #24: REPORT_SCORE; { SCORE } #25: WORD_FOO; { FOO } #26: SET_BRIEF; { BRIEF } #27: READ_SOMETHING; { READ } #28: ASKWHATTODOITTO; { BREAK } #29: ASKWHATTODOITTO; { WAKE } " 30: SUSPEND; { SUSPEND } "END; {CASE}  IF VBL^.VERB>29 THEN $ERRORHALT(23);  END; {ANALANITVERB}  PROCEDURE ANALATVERB;  BEGIN {ANALATVERB} "CASE VBL^.VERB OF $1: CARRY_IT; { TAKE } $2: DROP_IT; { DROP } $3: SAY_IT; { SAY }  4: L_U_IT; { OPEN } $5: SAY_OK; { NOTHING } $6: L_U_IT; { LOCK } $7: LAMP_ON; { ON } $8: LAMP_OFF; { OFF } $9: WAVE_IT; { WAVE } #10: LEAVE; { CALM } #11: LEAVE; { WALK } #12: KILL_IT;  { KILL } #13: POUR_IT; { POUR } #14: EAT_IT; { EAT } #15: DRINK_IT; { DRINK }  16: RUB_IT; { RUB } #17: TOSS_IT; { TOSS } #18: LEAVE; { QUIT } #19: FIND_IT; { FIND } =138; "IF TOTING(VBL^.OBJ) THEN $SPK:=24; "LEAVE;  END; {FIND_IT}  PROCEDURE BLAST_IT;  BEGIN {BLAST_IT}  IF (VARY^.PROP[ROD2]<0) OR NOT VBL^.CLOSED THEN $LEAVE; "BONUS:=133; "IF VBL^.LOC=115 THEN $BONUS:=134; "IF HERE(ROD2) THEN $BONUS:=135; "SPEAK(ARY^.RTEXT[BONUS]); "ALLDONE:=TRUE; "EXIT(DOWHATHESAYS);  END; {BLAST_IT}  PROCEDURE READ_IT;  BEGIN {READ_IT}  IF DARK THEN "BEGIN $WRITELN('I SEE NO ',WD1,WD1X,' HERE.'); $SPK:=0; $LEAVE; "END; "IF VBL^.OBJ=MAGAZINE THEN $SPK:=190; "IF VBL^.OBJ=TABLET THEN $SPK:=196; "IF VBL^.OBJ=MESSAGE THEN $SPK:=191; "IF (VBL^.OBJ=OYSTER) AND VARY^.HINTED[2] AND TOTING(OYSTER) THEN $SPK:=194; "IF (VBL^.OBJ<>OYSTER) OR VARY^.HINTED[2] OR %NOT TOTING(OYSTER) OR NOT VBL^.CLOSED THEN $LEAVE; "VARY^.HINTED[2]:=YES(192,193,54); "SPK:=0; "LEAVE;  END; {READ_IT}  PROCEDURE BREAK_IT;  BEGIN {BREAK_IT}  IF VBL^.OBJ=MIRROR THEN $SPK:=148; "IF (VBL^.OBJ=VASE) AND (VARY^.PROP[VASE]=0) THEN "BEGIN $SPK:=198; $IF TOTING(VASE) THEN &DROP(VASE,VBL^.LOC); $VARY^.PROP[VASE]:=2; $VARY^.FIXED[VASE]:=-1; $LEAVE; "END "ELSE "BEGIN $IF (VBL^.OBJ<>MIRROR) OR NOT VBL^.CLOSED THEN &LEAVE; $SPEAK(ARY^.RTEXT[197]); $DISTURBDWARVES; "END;  END; {BREAK_IT}  PROCEDURE WAKE_IT;  BEGIN {WAKE_IT}  IF (VBL^.OBJ<>DWARF) OR NOT VBL^.CLOSED THEN $LEAVE; "SPEAK(ARY^.RTEXT[199]); "DISTURBDWARVES;  END; {WAKE_IT}  PROCEDURE CARRY_SOMETHING;  VAR "I : INTEGER;  BEGIN {CARRY_SOMETHING}  IF (VARY^.ATLOC[VBL^.LOC]=0) THEN $ASKWHATTODOITTO;  IF VARY^.LINK[VARY^.ATLOC[VBL^.LOC]]<>0 THEN $ASKWHATTODOITTO;  FOR I:=1 TO 5 DO $IF (VARY^.DLOC[I]=VBL^.LOC) AND (VBL^.DFLAG>=2) THEN &ASKWHATTODOITTO;  VBL^.OBJ:=VARY^.ATLOC[VBL^.LOC]; "CARRY_IT;  END; {CARRY_SOMETHING}  PROCEDURE L_U_SOMETHING;  BEGIN {L_U_SOMETHING}  SPK:=28; "IF HERE(CLAM) THEN $VBL^.OBJ:=CLAM; "IF HERE(OYSTER) THEN $VBL^.OBJ:=OYSTER; "IF AT(DOOR) THEN $VBL^.OBJ:=DOOR; "IF AT(GRATE) THEN $VBL^.OBJ:=GRATE; "IF (VBL^.OBJ<>0) AND HERE(CHAIN) THEN $ASKWHATTODOITTO; "IF HERE(CHAIN) THEN $VBL^.OBJ:=CHAIN; "IF VBL^.OBJ=0 THEN $LEAVE; "L_U_IT;  END; {L_U_SOMETHING}  PROCEDURE EAT_SOMETHING;  BEGIN {EAT_SOMETHING}  IF NOT HERE(FOOD) THEN $ASKWHATTODOITTO; "VBL^.OBJ:=FOOD; "EAT_IT;  END; {EAT_SOMETHING}  PROCEDURE QUIT2;  BEGIN {QUIT2} "ALLDONE:=GAVEUP; "IF GAVEUP THEN $EXIT(DOWHATHESAYS); "SPK:=0; "LEAVE;  END; {QUIT2}  PROCEDURE QUIT;  BEGIN {QUIT}  GAVEUP:=YES(22,54,54);  QUIT2;  END; {QUIT}  PROCEDURE REPORT;  VAR "I : INTEGER;  BEGIN {REPORT - INVENTORY}  SPK:=98; "FOR I:=1 TO 100 DO $IF (I<>BEAR) AND TOTING(I) THEN $BEGIN &IF SPK=98 THEN (SPEAK(ARY^.RTEXT[99]); &PSPEAK(I,-1); &SPK:=0; $END; "IF TOTING(BEAR) THEN $SPK:=141; "LEAVE;  END; {REPORT}  PROCEDURE REPORT_SCORE;  BEGIN {REPORT_SCORE}  SCORE:=GETSCORE(TRUE); "WRITELN('IF YOU WERE TO QUIT NOW, YOU WOULD SCORE');  WRITELN(SCORE,' OUT OF A POSSIBLE ',MAXSCORE); "GAVEUP:=YES(143,54,54);  QUIT2;  END; {REPORT_SCORE}  PROCEDURE WORD_FOO;  BEGIN {WORD_FOO}  K:=VOCAB(WD1,3);  SPK:=42; "IF VBL^.FOOBAR=1-K THEN "BEGIN " VBL^.FOOBAR:=K; $IF K<>4 THEN $BEGIN &SPK:=54; &LEAVE; $END; $IF (VARY^.PLACE[EGGS]=ARY^.PLAC[EGGS]) OR '(TOTING(EGGS) AND (VBL^.LOC=ARY^.PLAC[EGGS])) THEN &LEAVE; $IF (VARY^.PLACE[EGGS]=0) AND (VARY^.PLACE[TROLL]=0) AND '(VARY^.PROP[TROLL]=0) THEN &VARY^.PROP[TROLL]:=1; $K:=2; $IF HERE(EGGS) THEN &K:=1; $IF VBL^.LOC=ARY^.PLAC[EGGS] THEN &K:=0; $MOVE(EGGS,ARY^.PLAC[EGGS]); $PSPEAK(EGGS,K); $SPK:=0; $LEAVE; "END; "IF VBL^.FOOBAR<>0 THEN $SPK:=151; "LEAVE;  END; {WORD_FOO}  PROCEDURE SET_BRIEF;  BEGIN {SET_BRIEF}  SPK:=156; "VBL^.ABBNUM:=10000; "VBL^.DETAIL:=3; "LEAVE;  END; {SET_BRIEF}  PROCEDURE READ_SOMETHING;  BEGIN {READ_SOMETHING}  IF HERE(MAGAZINE) THEN $VBL^.OBJ:=MAGAZINE; "IF HERE(TABLET) THEN $VBL^.OBJ:=VBL^.OBJ*100 + TABLET; "IF HERE(MESSAGE) THEN $VBL^.OBJ:=VBL^.OBJ*100 + MESSAGE; "IF VBL^.CLOSED AND TOTING(OYSTER) THEN $VBL^.OBJ:=OYSTER; "IF (VBL^.OBJ>100) OR (VBL^.OBJ=0) OR DARK THEN $ASKWHATTODOITTO; "READ_IT;  END; {READ_SOMETHING}  PROCEDURE SUSPEND;  PROCEDURE SUSPEXIT;  BEGIN { SUSPEXIT } "WRITELN('ERROR SUSPENDING GAME'); "CLOSE(INFILE); "EXIT(SUSPEND);  END; { SUSPEXIT }  BEGIN { SUSPEND }  NAMEANDPW; "VBL^.PASSWORD:=TESTPW; "VBL^.VERSION:=VERSION; "REWRITE(INFILE,NAMEOFUSER); "I:=(SIZEOF(VARYS)+511) DIV 512;  IF I<>BLOCKWRITE(INFILE,VARY^.DBLK,I) THEN " SUSPEXIT; "I:=(SIZEOF(VBLS)+511) DIV 512;  IF I<>BLOCKWRITE(INFILE,VBL^.DBLK,I) THEN $SUSPEXIT;  CLOSE(INFILE,LOCK);  WRITELN; "WRITE('ADVENTURE GAME SAVED AS ',NAMEOFUSER); "EXIT(ADVENTURE);  END; { SUSPEND }  PROCEDURE ANALANITVERB;  BEGIN {ANALANITVERB}  CASE VBL^.VERB OF $1: CARRY_SOMETHING; { TAKE } $2: ASKWHATTODOITTO; { DROP } $3: ASKWHATTODOITTO; { SAY }  4: L_U_SOMETHING; { OPEN } $5: SAY_OK; { NOTHING } $6: L_U_SOMETHING; { LOCK } $7: LAMP_ON; { ON } $8: -  There are two output files produced by ADVINIT: (ADVMSGS[79] (ADVDATA[23] $Insure that there are at least 102 free contiguous blocks $on the prefix disk. ADVINIT creates the msg file completely $before opening the data file. That way ADVINIT will work ok $if exactly 102 free blocks are available.   4). Build an ADV.MISCINFO file. This is nothing more than a $text file with two numbers in it.The format is HEIGHT WIDTH.  (eg. 24 80) If you are an APPLE user using the 24x40 $screen, this is not necessary (see Notes, below).   5). The only files needed to run adventure are: )ADVDATA )ADVMSGS )ADV.CODE # Move these files to an appropriate disk if necessary.   6). Be prepared to spend hours exploring the cave. Try not to $look at the source or the messages until all of adventuredom $pays tribute to you, Oh Grand Master Adventurer! $  Notes: $ $There is a save game feature. Try SAVE. You might like it. $The program asks for your name, but any identifier can be $used as long as it is valid for a filename. Each save $file requires 6 blocks. $ $The system clock is used to initialize the random number $generator. If the value returned by the TIME function $is zero, then the user is prompted for a number to start $the random number generator. $ $The system MISCINFO is not used because the APPLE sets the $screen width to 80 on the 40 char screen. Flipping side to $side may be OK during editing, but not during ADVenture. $Also, The program defaults are such#20: FIND_IT; { INVENTORY } #21: FEED_IT; { FEED } #22: FILL_IT; { FILL } #23: BLAST_IT; { BLAST } #24: LEAVE; { SCORE } #25: LEAVE; { FOO } #26: LEAVE; { BRIEF } #27: READ_IT; { READ } #28: BREAK_IT; { BREAK } #29: WAKE_IT; { WAKE } " 30: SUSPEND; { SUSPEND } "END; {CASE}  IF VBL^.VERB>29 THEN $ERRORHALT(24);  END; {ANALATVERB}  ?^j16 64  FIRST NUMBER IS HEIGHT  SECOND IS WIDTH  ?^!6ADVENTURE.  The history of this version of adventure has been lost, and I am  unable to credit the originator. This program was converted  to UCSD Pascal from a PL/1 version found on our local computer  system. This version was obviously converted from a Fortran  version (it said so in the comments) but any history was not  indicated. If you need assistance with this program, you can  write me. My address is:  *Michael R. Turner *1622 Colonial Way *Frederick Md. 21701 *(301)-663-9181    GETTING STARTED.   The steps required to run adventure are:   1). Compile ADVINIT.TEXT. File needed is: $ ADVINIT.TEXT   2). Compile ADV.TEXT. Files needed are: $ ADV.TEXT (ADVSUBS.TEXT (ADVVERB.TEXT   3). Run ADVINIT to build the required files for Adventure.  Files needed are: (ADVS1.TEXT (ADVS2.TEXT (ADVS3.TEXT (ADVS4.TEXT (ADVS5.TEXT (ADVS6.TEXT (ADVS7.TEXT (ADVS8.TEXT (ADVS9.TEXT (ADVS10.TEXT $ ADVS11.TEXT (ADVINIT.CODE . elects the appropriate message. A message applies +to a players whose scores are higher than the previous +N but not higher than this N. +  ADVS11.TEXT.........Hints.  +Each line contains a hint number corresponding to +the COND(LOC) bits (see ADVS9), the number of turns +he must be at the right LOC(s) before triggering +the hint, the points deducted for the hint, the +message number of the question (from ADVS6) and +the message number of the hint (also from ADVS6). +Hint numbers 1-3 are no usable as the COND(LOC) +bits 1-3 are otherwise assigned. +  that APPLE users do $not need an ADV.MISCINFO. $  ADV.TEXT has {$S+} to allow it to compile on most machines.    ==============================================================  PROGRAM-SECTION.   ADV.TEXT............The adventure program.  ADVSUBS.TEXT........Include file of adventure program.  ADVVERB.TEXT........ ""  ADVINIT.TEXT.......Initialization program. This program reads *ADVS1 through ADVS11 and produces ADVDATA and *ADVMSGS. These files must be on the default disk *in order to run the adventure program.   ==============================================================  DATA-FILES-SECTION.   ADV.MISCINFO........Sample miscinfo for adventure.   ASVS1.TEXT..........Long form descriptions.  *Each line contains a location number, a space, and *a line of text. The set of adjacent lines whose numbers *are X form the long description of location X. *  ADVS2.TEXT..........Short form descriptions.  *Same format as ADVS1.TEXT. Not all places have *short descriptions. *  ADVS3.TEXT..........Travel Table.  *Each line contains a location number (X), a condition *value (M), a second location number (N), and a list *of motion numbers from ADVS4.TEXT. *Each motion represents a verb which will take you to N *if you are at X. M and N are interpreted as follows: * * If N<=300 location to go to. .If 300500 Message N-500 is to be issued. . *Meanwhile, M specifies the condition of motion. * .If M=0 Unconditional. .If 0 0. .If 400 1. .If 500 2. * Etc. * *If the condition is not met, then the next *DIFFERENT* *'destination' value is used (Unless it fails to meet **ITS* conditions, in which case the next is found, etc). *Typically, the next destination will be for one of the *same verbs, so that its only use is as the alternate *destination for those verbs. For instance: * /15 110  22 29 31 34 35 23 43 /15 0 14 45 / *says that from location 15, any of the verbs (29,31,...,43) *will take you to 22 if you are carrying object 10. *Otherwise, they or verb 45 will take you to location 14. * /11 303 8 49 /11 0 9 50 / *says that from 11, 49 takes him to 8 unless the PROP(3)=0. *In that case, 49 takes you to 9. Verb 50 always takes *you to 9. *  ADVS4.TEXT..........Vocabulary  *Each line contains a number and a five letter word. *Let M=N DIV 1000. * *If M=0. The word is a motion verb used in ADVS3.TEXT. *If M=1. The word is an object. *If M=2. The word is an action word (eg ATTACK). *If M=3. Special case word. N MOD 1000 is an index 3into ADVS6.TEXT messages. 3  ADVS5.TEXT..........Object descriptions.  *Each line contains a number and a message. If 1<=N<=100, *it is the 'INVENTORY' message for object N. Otherwise *N should be 000,100,200 etc and the message is the *description of the preceding object when its property *value is N DIV 100. The N DIV 100 is used to destinguish *from multiple messages from multi-line messages. *Properties that produce no message must be given *a null message.   ADVS6.TEXT..........Miscellaneous messages.  *Same format as ADVS1,ADVS2 and ADVS5, except that *the numbers are not related to anything. (Except *for special verbs in ADVS4).   ADVS7.TEXT..........Object locations.  +Each line contains an object number and its initial +location (zero if none) and a second location (also +zero if none). If the object is immovable, the +second location is set to -1. If the object has two +locations (eg GRATE), the second location field is set +to the second location and is assumed to be immovable. +  ADVS8.TEXT..........Action defaults.  +Each line contains an 'ACTION-VERB' number and the +index (into ADVS6) of the default message for the +verb. +  ADVS9.TEXT..........Liquid Assetts, etc. + +Each line contains a number (N) and up to 20 location +numbers. Bit N (where 0 is the units bit) is set +in COND(LOC) for each loc given. The bits currently +assigned are: + /0 Light /1 If bit 2 is on; 1=oil,0=water. /2 Liquid asset, set bit 1. /3 Pirate doesn't go here unless following 3player. +The other bits are used to indicate areas of interest +to the hint routines: /4 Trying to get into the cave. /5 Trying to catch the bird. /6 Trying to deal with the snake. /7 Lost in maze. /8 Pondering the dark room. /9 At witts end. +COND(LOC) is set to 2, overriding all other bits, +if LOC has forced motion. +  ADVS10.TEXT.........Player class messages.  +Each line contains a number N and a message describing +the classification of the player. The scoring section +s/ ORESFORKFORWAFREEFUCKFUMFUMGETGEYSEGIANTGOGOLDGOTOGRATEGULLYH2OHALLHEADLHELPHILLHITHOCUSHOLEHOUSEIGNITININFOINFORINSIDINVENINWARISSUEJARJEWELJUMPKEEPKEYKEYSKILLKNIFEKNIVELAMPLANTELEAVELEFTLIGHTLOCKLOOKLOSTLOWMACHIMAGAZMAINMESSAMINGMIRROMISTMOSSMUMBLNNENESTNORTHNOTHINOWHENUGGENULLNWOFFOFFICOILONONWAROPENOPENSORIENOUTOUTDOOUTSIOVEROYSTEPASSAPEARLPERSIPILLOPIRATPITPLACAPLANTPLANTPLATIPLOVEPLUGHPOCUSPOTTEPOURPROCEPURUSPYRAMQUITRATIOREADRELEARESERRETRERETURRIGHTROADROCKRODRODROOMRUBRUGRUNSSAVESAYSCORESESECRESESAMSHADOSHAKESHARDSHATTSHAZASHELLSILVESINGSLABSLABRSLAYSLITSMASHSNAKESOUTHSPELUSPICESTAIRSTALASTEALSTEPSSTEPSSTOPSTREASTRIKSURFASUSPESWSWIMSWINGTABLETAKETAMETHROWTOSSTOTETOUCHTRAVETREASTREETREESTRIDETROLLTROLLTUNNETURNUUNLOCUPUPSTRUPWARUTTERVALLEVASEVELVEVENDIVIEWVOLCAWWAKEWALKWALLWATERWAVEWESTWHEREXYZZYY2  *( F6 CI(8!E3?9 #++  #@9   :  M    &  4 F F ' $9 L " -/ -2L , + .-+ +-- ,>A -+,. +-,- +, -+,.<+,.  -  , +,3?@+,>?@+3,?@3+?@3+"!$.&, -"#+&+')*,E& +-$.%,-11+*,= 8')*+E)-& .-7& & +,A.+56,G7+7+4,,8 <+4:.8+-,-+.,.+.,-+.,+++,,+,+.-,-,,-8,.-++,-+-,-+.8;,F-J+,.=---/,.+2+,*.8=..--0.F1-.+,,.+,--,.,..+-,+8+',-I.+..-I. ,0,-.H2I+, ,GG/.GJ&..J ,.1/02+,-+-./012+.-,-'81-+20/,. /1)*E/))'- +-+ -/)*E1)'M,+M,/$0%.M-+. M, M-M.(,M+(, M,021/-.2-.,1/+,/1+-20/-20+.,-0.+,1/2+,1.20/0/.2-1++/,-.0112+,-0.- !OOSSS QQ      "TUUUU J JCCDDCCXTUUUU()!!$$>>YZ"""#.d!!!!%%'A$$&&&%%%SSSSS$$@@@A)****;<<)*+-P*,-+02R*+./WW----,,23,134124523457V34655478977 7:ST99)))=>>><>k<?=>>'''AAggj@B,D,F',HG,jAC,M`,aBEEADDxwmqGAAoAFnAvIaHHHxyKLMKKNBBM*PPQPP,,9TU9SrSS44--\\___HHX]^\\\\\\___c^^\[BBBHHbbbaacbb--d---c.!eedddgggffhjk@ggihhg@Al=,,,,,,,,,jrEqqGF2225-mmmTtsQv/THuEEEJJJ{/T|~z||~{}}~||~~}}}|bb}}}|~|||~|~|~kpkpkpkpkpkpkpkpkppp222/////////8777777#8 dPP2<KPP2KK555rs_________(((2LL'SPEL?ABOVEABRAABRACACROSASCENATTACAWKWAAXEBACKBARREBARSBATTEBEANSBEARBEDBEDQUBIRDBLASTBLOWUBOTTLBOXBREAKBRIEFBROKEBUILDCAGECALMCANYOCARPECARRYCATCHCAVECAVERCHAINCHANTCHASMCHESTCLAMCLIMBCLOSECOBBLCOINSCONTICONTICRACKCRAWLCROSSDDARKDEBRIDEPREDESCEDESCRDETONDEVOUDIAMODIGDISCADISTUDOMEDOORDOWNDOWNSDOWNWDRAGODRAWIDRINKDROPDUMPDWARFDWARVEEASTEATEGGEGGSEMERAENTERENTRAEXAMIEXCAVEXITEXPLOEXTINFEEFEEFEEDFIEFIEFIGHTFIGURFILLFINDFISSUFLOORFOEFOEFOLLOFOOFOOFOODF0  ( ADVENTUR r (ERROR READING ARRAY FILER##$#   NO CLOCK.&PLEASE ENTER A NUMBER FROM 1 TO 32767  \ ! @*  /       &"ą"ą"!ą",ą"@ą"rą# rą#ą##ą##ą# #ą# ą# # # ą# ą#ą#ą###ą# #ą#ą#ą#-C*D'EYFP0GPH ADV.MISCINFOADVDATAADVMSGS L21/"$  %   $(%6 ˂: ! !#" " #  2#2!X# x##2#2$!p#x# #Հ2@2 22! dx##"R dx ,2#2Ձ!#,>a!#,?!#H )%&$GA "$K%;&.0B " J==<.' "C 1K 9 !   " ,5,>73=JT]rMUl}8A%/135?IS]gisu3k*468BLNPZt3\}!+668 % 2 = H S b q   " , 6 @ K U W \ ` d g j m r v z ~       $ ( , 0 4 8 < A E H K P U Z ^ b h m r w } "-6>KW`iv  $*,.026:@CEIKQST[^bdlx "(25679BDHJNX]ekqv}  ^`egjmo#awuu~`\_adew Cnyzzy   1 @ ] k q ;c &8Bgs !!&&*+nnIK ;;mC n *4;?CHO[nuy ,/2:>BGKPTXgjkqzz|~$-<AFaekp "8ALX_gnz$7BMXcmw)Kx )2=GReg| (<CHMQ[`dkv"-:JR\p"UUs;Y^^>?K @ @ gk 2 3456}8 9 ;  %?#&  ^`egjmo#awuu~`\_adew Cnyzzy(<:>!@p GAMES0B2u  STOCK.BACK H+  &STOCK.DATA.TEXTh&*STOCK.DOC.TEXT *@ CHASE.TEXT H+ r@L OTHELLO.TEXT+ zL\ OTHELL1.TEXT+ z\l OTHELL2.TEXT+ zl|OTHELLINIT.TEXT|BLACKJACK.TEXT  DEBTS.TEXT H+  STORE.DATA H+  SNOOPY.TEXTH+ ܟ REQUESTS.TEXT+ $WUMP.CAVE0.TEXTrWUMP.CAVE1.TEXTWUMP.CAVE2.TEXTCWUMP.CAVE4.TEXTCWUMP.CAVE5.TEXTC WUM1 !琋x>% #   + 2  8Ց# # 8!琋x48  D 7#7  S  !琋27x7 ##y#y %!#yx"瀖#yx#1!z#yx#y*## %!琋x#!琋x1#y !%#y! #!琋x;"瀖#y"瀖#yxą",#yx4#4ą#d ##dą#2"R#dxe#^"R#dą#>#@"R#dą##ą##~#### ą#:"R#dx##y"&dx#1"炊4x&I AM PREPARED TO GIVE YOU A HINT, BUT  IT WILL COST YOU  POINTSA"烶<!p<x6յ  !p<x    "<!p<x6ą"<x#"##!p<xĖu"Rdx '"烶<Ė #'  '"烶<Ė",#yx",#xx",#}x#z'"烶<ĖY"R;dx᱅"R<dxᰡ'"烶<Ėc'   < Ֆ"<x}#y< "烶<"烶<xĊ"烶<ą"烶<x!p<x<֎(,Ɣȅ!#,Ɣ#ȅ!#,Ɣ##w2ENTER YOUR NAME PLEASE.ENTER YOUR PASSWORD  .AVSV+  (  7   BC ՁƔ  <0    )X  t(D-( # 2@"#~!"dxc"7"7 "R"dx ""dx"R"dx !:! "} # : #  : & : # : ւъ    -:- "dxl : :  "#1""x !p"x" >"#dxᰤm"#dx#y"&#dx#y#$#$#$#$F?  ̃LÎ&¾ d # "#dx#y#2 "#yx"Rdx H "#xz "&x%!" !  $$  "Rdx"Rdx  "%x"%x!  /1P,"!! , ! , "!Ի ! , 2! ,!N ,x20c! ,0!N ,x ! ,!N ,x21y ",x"炊x"炊xӅ"炊"炊xĖ# %dh"%dxR"%dą##zą",$x% ",$"炊%xĊ5",$x% ",$"炊%xĊ $d"&$dd#Ċ."$dx ##zą"$d##."炊$",#xą",#$Ė %d"&%ddx"%dx ,% %$ #"#dx#d"&#dx( #8 %$## PRESS TO CONTINUE &&&$$&     /Ѐ*ˇ  ˔   Ɣ  ƔƔƔȄƔƔƔȄ///%L%/ Ɣ  / P/   /є/  [!&dx   %!"%˔ !ֆ˔ )PLEASE ANSWER THE QUESTION WITH YES OR NOYESYNONyesynonYESYyesyyesynon%YOU WONT GET VERY FAR IN LOWER CASE !,/!琋/x&  P  ĔƔǔɔʔ͔̔ϔ{ДҔӔՔ֔ؔٔ۔!   .--!琋-x0/FATAL ERROR # ---- BYE!|  #    '6څ#*!琋x#y##ą#6#y#y#yL !A" x6" x#y!琋x H2@3 Z3<#y!<<dx#y!<;dx!3"3dx#y3!琋x"€$dx7# $#2@3 s3<#y!<<dx#y!<;dx:"3dx#y"&3dx3#y33# 3"# ą"# ą"ċ##~2"€7dx "RdxW!琋x7# $#"# ą"# ą"Ċ6"x"x !琋x THERE ARE THREATENING #LITTLE DWARVES IN THE ROOM WITH YOU OF THEM THROW KNIVES AT YOU. OF THEM GET YOU!# ծ#y_ ՝# 4#"2 " 44#F"4x#y"4ą"4"4x4!琋x#y{# 4#c"4xH!玦"4xx1!1x33"3x6666,66"4x36 36"4x!4"!1xd"3631!1x/"3"4x333 "4"4xą"4"3xą"4"4x#y"4x#y"4x#yą"4xՑ"4#y4$#y# "R7dx$W# # ą"4x"4x-8 ###y _# 74# # 2 2>2d!"L"!dx!<dx"!dx!珠dx!2!#2!13###ą#4#2N ##2"Rdą"…#dĀM  2 5#r "R dĊq "R dĒ2p #2"Rdx"Rd"Rdxą"Rd"Rdx!13# H 2## #####!##G 2s4##y 4##n ;n 2"Rdą"dĀJ 24#L 25#d 2# ##!e#"Rdxn #! # # 2e "Rdą##~Ē2# 2g # # Ē2##u"R#dxf "R#dxn  2"R#dą"&dą"RdĀ 2 25!琋;x#y!17###2#2#@!J #!!d"! A G : ' 0 "  g.##W#|2 #x2 9z2 #= ;|#y=i2# o # "R dx6 # #7 ##@ ; Ն#@#n"R@dx" Q#y!<@dx 5 "R@d@@#y"&@dċ"R#dx) "R@dx% m "R@dą"&@dą"R#dx"R#dą"&#d"R#dxb# ##ą#ĊC""Rdx #"RdĊ; "RdĒ2u.6 2. D# 5"Rd !琋'x#12/ /"Rdą!琋(x  2}/## # ##7 "R d"R dx "R dx2u2 "(" x#y#   Ӆ#!# ##d "Rdx##d!##d!# "R#dx##d#ą#d4#9 ##  ##dą#d4#O #2"Rdą" dx!< dx ##~Ā- #, ## # . #1 ##7# #! ##"R#dx #"Rdx2#ą#1  2"Rdą"R>dą!<dx"&dxd>d3 UK %@  `   i  v!d4 x=-q2 -st %@  2   -  4#SORRY, YOU DO NOT HAVE A SAVED GAMEINCORRECT PASSWORDOLD SAVE FILE - NEW NEW SAVE FILE - OLD ADVENTURE. SORRY.@Oф˄ρ"Ać"x շ"o  y"# # #8#   ## ć5#ć#ć#2ć"x #Ċ#Jć#y:"#&ć#y+#y&# #y# Ċ#?  %"#ć#%&01%n_d`%$"!l!m }J<G<=g=6 ^M##2^K=# v  ] zVrjOC9!\HJC&` 2a8"Rdx#2#ys !琋x1 I SEE NO  HERE.H9A2 * Y 7  2# # ĥ #$ #"x¥ #"x#2"6 29# #:"R:dx:ƥ ::#y"R:dą"&:dĒ2&##2!琋x7:##2!琋x7:",#yx4"炊",#yxx4 !%" x#y# 4 օ#",#yxĒ6:  # # # #ą#@ 4@ #@ą#2:; 4#ĒA+;1 2?;66O;b d !2 #  ;b!琋cx  # 2(IF YOU WERE TO QUIT NOW, YOU WOULD SCORE OUT OF A POSSIBLE 0<  =   :   66O?=** # 2# 226 2"€8dx!<8dx8#y!<8dx2"€8dx"€!dx"R!dx"R!d8 #y!<8dx8!<8dx82 2#  2[= #'ą#Ē2= # ##d $ ##d$ą##ą#d#4IERROR SUSPENDING GAME>   VADVENTURE GAME SAVED AS >##Ć 4"4 W4#4 W      %*/49>CHMRW\afkpuz?#֟dL44M;}MxCHMRW\afkpuz@#֟ߋ689:;}:xi2d2_?Z@UAPBKCFEA2<G7G2D-5(H#222IJ KV# WHAT DO YOU WANT TO DO WITH THE C#2ą!h##x 'i# \#'jXY#XY:D"Rdą"R d4 "44!!d"!49 then & players[play].dividend:=players[play].dividend ( +players[play].value[stoq].amount*stocks[stoq].dividend &end;  players[play].cash:=players[play].cash+players[play].dividend;  end;  end;   procedure bust(stoq:integer);  var i:integer;  begin "stocks[stoq].value.value:=0; "stocks[stoq].value.amount:=0; "for i:=1 to nplayer do $begin &players[i].value[stoq].amount:=0; &players[i].value[stoq].value:=0 $end;  end;   begin {update} if irandom(1,2)=1 then i:=bull else i:=bear; *j:=dieroll+dieroll;  for k:=2 to 10 do *begin * if stocks[k].value.value=0 then .begin 0stocks[k].value.amount:=500; 0stocks[k].value.value:=100 .end; ,stocks[k].val$EQUAL $CURSOR xO.LL{$S+}  program stockmarket; type  share=record  amount:0..500; *value:integer[7]; (end; stock=record  name:string[20]; 0value:share; 0dividend:integer; .end; player=record 0name:string[10];   value:array[1..10] of share; 0dividend,turn:integer; / cash:integer[10]; /end; table=(bear,bull); var (market:array[table] of array[2..10] of array[2..12] of integer; stocks:array[1..10] of stock;  players:array[1..9] of player;  num:string[3]; (ch:char;  currentp,currents,year:integer; (nplayer:1..9;  procedure clear;  begin "gotoxy(0,16);  writeln(' ');  writeln('  ');  writeln(' ');  gotoxy(0,16)  end;   function number:integer;  var n,i:integer;  begin  n:=0;  for i:=1 to length(num) do  if ord(num[i])>47 then  if ord(num[i])<58 then % n:=n*10+(ord(num[i])-48) $else &begin (clear; (writeln(' Type digits please.'); (n:=0 &end;  number:=n;  end;   function upper(cha:char):char;  begin  if ord(cha)>96 then if ord(cha)<123 then upper:=chr(ord(cha)-32) $else upper:=cha else upper:=cha;  end;   procedure gameconst;  var i,j:integer; (k:table; (f:interactive; begin reset(f,'STOCK.DATA.TEXT'); writeln('Stocks:':20,'Dividends per year');  for i:=1 to 10 do *begin  readln(f,stocks[i].name); ,readln(f,stocks[i].dividend); writeln(stocks[i].name:20,stocks[i].dividend:4);  end;  for k:=bear to bull do  for j:=2 to 10 do *begin ( for i:=2 to 12 do read(f,market[k,j,i]); * readln(f); *end; close(f); "end;  procedure initialize;  var i,j:integer;  begin  for i:= 1 to 10 do *begin ( if i=1 then .begin  stocks[i].value.amount:=50;  stocks[i].value.value:=1000 .end ,else .begin 0stocks[i].value.amount:=500; 0stocks[i].value.value:=100; .end; if i<10 then *begin  for j:=1 to 10 do .begin . players[i].value[j].amount:=0; . players[i].value[j].value:=0; . players[i].dividend:=0; 0players[i].turn:=i; 0players[i].cash:=5000; .end; end; 'end; "end;   procedure playersname;  var i,j:integer;  begin write('How many players (1..9)?');  read(ch); (nplayer:=ord(ch)-48;  writeln; (for i:=1 to nplayer do *begin ( write('Enter name of player ',i:1,' '); ( readln(players[i].name); * if length(players[i].name)=0 then i:=i-1; *end; end;  function random:real;  {Random produces non random numbers from  the time function loword} var hiword,loword:integer; (seed:real;  begin *time(hiword,loword);  seed:=loword;  seed:=abs(seed/99.0);  seed:=seed-trunc(seed); *random:=seed;  end {random};  function irandom(low,high:integer):integer;  {irandom produces integer numbers  ranging from low to high} begin irandom:=trunc(random*(high-low+0.9)+low) end;   function dieroll:integer;  begin dieroll:=irandom(1,6) end;  procedure game;  var i,j,k:integer;  !procedure disstock(i:integer); (begin ( gotoxy(0,i+3); ( writeln(stocks[i].name:20 ( ,stocks[i].value.value:4,stocks[i].value.amount:4); (end;   procedure shostock;  var i:integer; (begin ( writeln(chr(12),' Year 198',year:1); *writeln('Stock'); gotoxy(18,2);  writeln('Value Avail');  for i:=1 to 10 do disstock(i); end; !procedure update; !var j,k:integer;  i:table;   procedure split(k:integer);  var i,j:integer;  begin {split} *stocks[k].value.value:=stocks[k].value.value div 2; *for i:=1 to nplayer do ,for j:=1 to nplayer do 5  STOCKMAR@ @ @ %   *  K   Type digits please.; "T; Ɣ/>; Ɣ:! ; Ɣ0   !#`#{# ##STOCK.DATA.TEXTStocks:Dividends per year630     1!1u!   !    !  !    !1"1Y 2 2D 3!3'"c   !   !҄ " 3R !"!2!  2Ć!    0!  Ć!  d  ! Ռ  #Հg! 4  Ćg! 4    g! 4/Ćg! 4.!Ćg! 40   z!How many players (1..9)?Enter name of player "* = =0 ˥A A!"_7 !    g! 4   g! 4!!B^  ̎f?ff|#$̃$ ##  #     #      ue.value:=stocks[k].value.value+market[i,k,j];  if stocks[k].value.value>150 then split(k); * if stocks[k].value.value<1 then bust(k); *end;  paydiv; *shostock; (end; {update}  !procedure plystock(play,stoq:integer);   begin  gotoxy(30,stoq+3);  writeln(players[play].value[stoq].amount:4, * players[play].value[stoq].value:6); end;  !procedure shoplay(play:integer); !var i:integer; (begin  gotoxy(28,1);  writeln(players[play].name:10); gotoxy(30,2);  writeln('Shares Value'); *for i:=1 to 10 do plystock(play,i); *gotoxy(24,14); *writeln('Dividends ',players[play].dividend:6); *gotoxy(29,15); writeln('Cash ',players[play].cash:6); ( clear (end; !procedure seturn; !var i,r,x:integer;  begin  for i:=1 to nplayer do ,begin r:=irandom(1,nplayer); .x:=players[i].turn;  players[i].turn:=players[r].turn; .players[r].turn:=x;  end; end;   procedure transak(play,tran,stoq:integer);  var n:integer;  begin "gotoxy(0,16); "write(chr(22)); "If tran<0 then write('Sell ') else write('Buy '); "write('how many shares of ',stocks[stoq].name); "readln(num); "n:=number; "if tran<0 then $begin $ if players[play].value[stoq].amount0 then getstk(play,i) "until ch='F';  end;   begin {game} (for year:=0 to 9 do *begin  update; ,seturn; ,for i:=1 to nplayer do .for j:=1 to nplayer do 0if i=players[j].turn then playturn(j); *end; end; {game}   procedure finish;  var cash:integer[10]; (play,stoq:integer;  begin "writeln(chr(12)); "for play:=1 to nplayer do $begin $ cash:=players[play].cash; $ for stoq:=1 to 10 do & begin & cash:=cash+players[play].value[stoq].value $ end; &writeln(players[play].name:10,' $',cash:10)  end;  end;   begin{stockmarket}  gameconst; (playersname; (initialize;  game; finish;  end. {stockmarket}  STOCKMARASTOCKMAR GOTOXYU LONGINT 6  Z  "ENTER A NUMBER FOLLOWED BY RETURN EA! HOW GOOD A PLAYER ARE YOU ? BEGINNER - B INTERMEDIATE - I EXPERT - E OLD PRO - P! TYPE IN YOUR SKILL $!  WHAT WAS THAT AGAIN PLEASE ? BP    3 o   o o!oΟoo#   4  A  N  [   h   y3     ւ$ ˥r ˥r ˥r  ˥r'!"M #;!!' !' ˀIȊ!' ˀ !'EDE'DˀOȅuFF!$S'#'"˧ ކ#'"ˀRȆ[!#ĆG!"!# !$Vq''#'"˧ #'"ˀ*!#GAME DIFF ROBOTS WINS MOVE1 2 3 Q = QUIT4 X 6 5 = NO MOVE7 8 9 MOVE =>  O   , s  q  F  v      ";'!#!' ˧ !܉    )  5 BAD MOVE, PLEASE TRY AGAIN  0:<FXbOUCH, YOU GOT ELECTROCUTED!&THWACK! YOU RAN INTO A ROBOT (TURKEY!)%ZZAP! Year 198Stock Value Avail   >          !  S%  %     A!"zA #d!g  4.Jg  4% x%  m%  %  g  4% xĆg  4% g  4% xċg  40g  40g  4% x%  %      g  4% g  4% x%  Ć%   !s  !" g! 4/  #ձg! 4  g! 4  x         1   @g! 4/g! 4/g! 4  x   Ig! 40g! 40g! 4/   ! $    $  A !Fg  4$ Ćg  4$         #      0   Ć   d       "c   ! x                 " c #g$ 4# x  g$ 4#      Shares Value Dividends Cash M g$ 4       ! $   g$ 4/    g$ 40     A"#IA g" 4.g" 4.g! 4.Ćg! 4. "Sell Buy how many shares of You do not have  shares to sell.Cash There are not  shares on the open market You do not have the cash to buy.Cash  %V Y \ $  ;  %Մg& 4$ x A f    o  %g& 40g& 40 $      $  $  Ćg& 4$ g& 4$ x Ćg& 4$ g& 4$ x$     x g& 40    $ &$$  A {      ~g& 40$      )   %g& 40g& 40 $      g& 4$ g& 4$ x Ć$  $  Ćg& 4$ g& 4$ x$      g& 40    $ &$Sell Buy which stock (type first letter) $   = ==  !$=  Ɣ%$  ז B(uy, S(ell, F(inishedp%  g% 4   = ===S=B!%!=FԂ >>#JA"$/A!%"g! 4.!!"̅>> $   A%&՞g% 40  $'3g% 4$   $ȉg% 4  h     %\ k ),N: Cm CHASE CHASE SGOTOXYU PASCALIO RCHASE AgvASVoo ƒ oooo&¾"'" l%$#       /WELCOME TO THE WONDERFUL EXCITING GAME OF CHASE'WOULD YOU LIKE INSTRUCTIONS ? (Y OR N)  HERE ARE SOME INSTRUCTIONS#YOU,"O",ARE IN A HIGH VOLTAGE MAZE.2THE ROBOT COMPUTERS,"R",ARE TRYING TO DESTROY YOU.'TO WIN, YOU MUST DESTROY THE COMPUTERS.2THIS IS DONE BY RUNNING THEM INTO FENCE POSTS,"*",#OR BY RUNNING THEM INTO EACH OTHER.1THE DIAGRAM BELOW THE MAZE SHOWS HOW YOU CAN MOVE"THE ROBOTS WILL TRY TO FOLLOW YOU.+THERE ARE 3 ROBOTS TO START FOR A BEGINNER.+THE NUMBER WILL INCREASE AS YOU WIN GAMES ! GOOD LUCK!!!!![<  s7  Y                   .  D  7 'WARNING - IF A DATA FILE DOES NOT EXIST! (it wont on the very first run) YOU MUST CREATE ONE BY USING THE A (ADD) COMMANDDOES A DATA FILE EXIST (Y/N)? & ANY EXISTING FILE WILL BE CLOBBERED!!# DO YOU WANT TO START A NEW ONE ?  67     %  6  ?  !YA O  c  YY!Y3   DO YOU WANT TO QUIT (Y/N)? , DO YOU WANT THIS TO BE THE NEW FILE (Y/N)?   !Y,   Y. /----------------------------------------------- Hit a key to continue 10"խB0800  A # !#,  #)$y  / $z  / $x  #.   0MC  GG# [   HH 6) $Date of last payment :............. !Total balance due = $........... !Amount of last payment = $...... !Monthly carrying charge: %...... !Monthly finance charge = $...... !Total charges to date = $...... !Minimum payment = $............. B$8 $   !    !)"y  / "z  / "x     !,   " !.   3 !2  YOU RAN INTO AN ELECTIFIED POST     !w!€!  !wԨ" ( !QAC!0E'Dˀ ȅED  քЊrEEDD`DDVEEDDDEE:8EE.EEDDDDEEDDE'D˧ !EDOE'DˀOȋE'D˧I CA  ME'D˧R    CACRASH!! YOU GOT ONE!! GOOD WORK!YOU HAVE DESTROYED THEM ALL!!ZAP! A COMPUTER GOT YOU! u"$Փ["xCv["x'G"xˀ Ȇ["xG"x E["x["["xąE["x["["xąDG"xG"G"xąDG"xG"G"xĆ["xG"x!' ˧ /["x'G"xˀR! R!' ˧*!' ˧Rե'   FF5F  ["ąFL'  '  CA["x'G"x˧E'D˧%  CA"g&WOULD YOU LIKE TO PLAY AGAIN (Y OR N) wsvBArqquBCA8 "F     A  t tNBAssCՂvvvrqvrqvrqv rqvrqvrqvr qqu3Fah8- DEBTS HDEBTS  GOTOXYU PASCALIO  DEBTS ! 8# N# p$ !    TODAY IS:   9 5  / 6  / 4   D) todays DateG) Global list of creditorsP) Pay a creditorC) Correct a recordA) Add a creditorL) list Late paymentsE) Expanded creditor infoF) Figure minimum paymentR) Remove a creditorT) Total all debtsQ) Quit,**NOTE: FIRST COMMAND SHOULD BE -D- FOR DATEo q  x z                             6"    Choose an item from the Menu->    G G7" Enter date as MM DD YY ->  ??? DATE DD/MM/YY =  PLEASE TRY AGAINH        "" H!!H  cHHc&#"#!# ĉ  #y  / #z  / #x   M !  "      #  ADDING A NEW RECORD - - ENTER STORE/CREDITOR NAME->  ENTER DATE OF LAST PAYMENT WHAT IS THE CURRENT BALANCE? 2 IF YOU KNOW MIN. PAYMENT, ENTER IT, ELSE ENTER 0 A HOW MUCH WAS THE LAST PAYMENT? ) WHAT IS THE CARRYING CHARGE IN PERCENT? B11B08       #P    HH#)  #,       #,Î#0 #.   ' #2   #4#,#2ƒ<Î#6̎. THIS PROGRAM KEEPS PERMANENT RECORDS OF YOUR3DEBTS TO STORES, ETC, THAT REQUIRE MONTHLY PAYMENTS.THE DATA IS KEPT ON A FILE NAMED - STORE.DATA        STORE.DATA&** NEW FILE - STORE.DATA - WAS CREATED+ ҂`  f   STORE.DATA ҂ B088Ҕ 0Ҕ B08800 STORE.DATA  ҂ 10 ҆B088Ҕ 0܆ 8  'KK! KK      S      'KK! KK      LL PRESS RETURN TO CONTINUEd' 7 P  f@ff'&%$#x# ĆCĆ#xĆe#Ć4Ė0$Do you want to restart an old game? CASTLES.DATAHow many players? 2, 3, or 4 players only please.Enter any character. What is player 's name? `@  Δ  Y΀y0,  Ł  M3 Δ   ΀0$= $ԥ$  M Δ  Τ$$ # #X S#Ɣ `      eԎ# $$놀# Ć#̎#0#l"Y4#"Ć#"Ć#"*Će#""#    4 ĆX #"x*:!#"TĆ4#"f! ԟ !՛!^   D !4   U !6   f !0     Pay who ? Pay how much ? ALL O.K. ?  USE 'C' TO CORRECT IT THAT NUMBER IS NOT IN THE LIST !E    1 ձ    K    B 8",",".")    S  !N Y e Expand which one (number) ?  - - Hit a key to cont. THAT CHOICE IS NOT IN THE LIST    1    "Do you want to step through all ?  - - Hit a key to cont. S[  Y11!"$!m  !׊Z' Your Total balance is an incredible $ / And the total carrying charge per monthe is $  When you've seen enough press a key.... ̎̎1 &/B 8','4 ̉                Remove which one (number) ? Remove  ? # THAT NUMBER IS NOT IN THE LIST!!l    1sB 8{ "   !Y/1 10"B08B0880܊ p Correct which record (number) ? CORRECT one of the following:'N)ame,B)alance,D)ate,L)astpmnt,M)inpmnt'P)ercent,C)ost/mnth,T)otal charge,Q)uit New Name? New Balance= amount of Last paymentMinumum payment ? Percent monthly carry charge ? Cost per month ? Total carry charge to date ? BT)Oc!THAT NUMBER IS NOT IN THE RECORDST    1Ֆ     .   B8 ֋B P  H ,   HH) O .   [ 0   qe 2   Lu 4   '~ 6    Qo AT *"&G֌,($   ҆82 | & wxhv{8?/@) CASTLES CASTLES 1GOTOXYU PASCALIO 0CASTLES AgvASE ƒ `$% % "#C" "x"!xĆ! "I7IƔ]$IIIIƔaڠ܅IaIƔeO##PIPIIIƔi元IԱIDIƔm*##PIPII9'!!&'!"#&&x'"Ɣ0 "ޖe Y  THE GAME IS OVER ...........WARLORD 4THE WAR IS OVER, BUT THE GAME HAS JUST BEGUN........-YOU HAVE CONQUERED THE WHOLE OF THE LAND ... WARLORDAND  HAVE HAS BEEN1SUBJIGATED TO YOUR WILL AND COMMAND .............2IT IS UP TO YOU NOW TO THINK OF A JUST AND LASTINGREWARD FOR THE PERSON WHO HAVE HAS CAUSED YOU SO MMUCH GRIEF ......4I HOPE YOU HAVE FUN.................................4   LL 녃Lx  C DžL ,   H  'KK! KK  c   'KK! KKz  S  KK!yKLf  K K L ~ DžK  , KK      9 DžL   ㅃL    녃Lx    L    Lx   녃Lx ІLㅃLㅃLL  ㅃL  ㅃL LL=-Do you want to stop now? Do you want to save this game? CASTLES.DATA Game saved." Δ  ΀Y΀y  Δ  ΀Y΀y? Ł     CAMPAGIN ROUND WARLORD  MOVE? (FROM TO NUMBER)'END OF CAMPAIGN  %!ՠMe %7%  $$x *x 6R    7W    7[ S*Ɣ 7* ` -շ-N,N ՗- - , , e)(x*')&('&xL+)(xe)(x*+  դ-Չ)()(x+Ć)(xe)(Će'&x*e'&x$% m M!  \?R??ABCD'&< NMS߀PѥL#"x*#"LĐ #"x*#"SĐ #"x*#"F!^#J"7#"x*4#""# M    (     !(!!  ! !(  )ն !! x e! xb4! x  Se! xƔ ! x  y D!0 {7P    ISP*PPS*S*  {'Unidentified error. 'INVALID FROM POSITION 'INVALID TO POSITION 'You have no army there. 'One move at a time please. &You can't march into a lake! &You don't have that many troops there!&You don't have enough money.? 'Invalid position.  &You don't own that place. &You can't place troops in the capital.'For no move enter a '0' from position. 'NOW you MUST take at least one.  (4@LXdp|V(ֈZj(~(x(l(`(T΀(H(<(0 ($(2( F(  COMBAT RESULTS BETWEEN WARLORDS  AND ATTACKING WARLORD  LOST  ARMIESDEFENDING WARLORD  LOST  ARMIES ; lj   džex    lj         džex      ??*X (1???? ATTACK WAS UNSUCCESSFUL SUCCESSFUL x։:̎1̎(̎̎  ƒˆþxƒˆ¾  xxxĆexexxĉ    xĉ xՄ      x Ć  xe   ċ  xCՎexĆ  ex x  Ć Će đ 3?33 TROOPS LOST IN FOREST  TROOPS DROWNED IN SWAMP xCex  ĆxFxSΡՎ     xĆxF      x ĉ e Ė How many? 5 k P  IqP+"Do you wish to rase field troops? DDWhere do you want them? ;  Δ  ΀Y΀N΀y΀nԮ ΀Y΀yN+̃†LΟ+ džㅃLㅃL+̃녃L녃Lx+ąL   N K JeKJxL KJxX 4KJKJx+ĉ? $Do you wish to raise castle troops? DDTROOPS IN CASTLE NOW =    Δ  ΀Y΀y΀N΀nԮ΀Y΀y+̃†ㅃLΟ+ džLx KLx JKJKJx+ĆㅃLㅃL+̃녃L녃Lx+ĉ KJx   (D(DCCWARLORD TREASURY BALANCE: ARMIES: TAXES COLLECTED: POPULATION: TREASURY NOW EQUALS !- ,LL,9L̎LĆ녃LąLL,LL,-KK-eLKx  գ  x4LKxĆLKxT  xĆ  xLKxąKK'LL  ,LL,պLLx̃ŽL녃Lx̃ŽLx<ㅃLㅃLLㅃLϟ?LLㅃLㅃL̎ SLƔ   : IN OPEN FOREST NEAR BOTH A VALLEY AND A OAD. AT YOUR FEET ALL THE WATER OF THE STREAM SPLASHES INTO A 2 INCH SLIT IN THE ROCK. DOWNSTREAM THE STREAMBED IS BARE ROCK YOU ARE IN A 20 FOOT DEPRESSION FLOORED WITH BARE DIRT. SET INTO THE DIRT IS A STRONG STEEL GRATE MOUNTED IN CONCRETE. A DRY STREAMBED LEADS INTO THE DEPRESSION YOU ARE IN A SMALL CHAMBER BENEATH A 3X3 STEEL GRATE TO THE SURFACE. A LOW CRAWL OVER COBBLES LEADS INWARD TO THEWEST.YOU ARE CRAWLING OVER COBBLES IN A LOW PASSAGE. THERE IS A DIM LIGHT AT THE END OF THE PASAGE.YOU ARE IN A DEBRIS ROOM FILLED WITH STUFF WASHED IN FROM THE SURFACE. A LOW WIDE PASSAGE WITH COBBLES BECOMES PLUGGED WITH MUD AND DEBRIS HERE, BUT AN AWKWARD CANYON LEADS UPWARD AND WEST. A NOTE ON THE WALL SAYS 'MAGIC WORD XYZZY' YOU ARE IN AN AWKWARD SLOPING EAST/WEST CAYON. YOU ARE IN A SPLENDID CHAMBER THIRTY FEET HIGH. THE WALLS ARE FROZEN RIVERS OF ORANGE STONE. AN AWKWARD CANYON AND A GOOD PASSAGE EXIT FROM EAST AND WEST SIDES OF THE CHAMBR. AT YOUR FEET IS A SMALL PIT BREATHING TRACES OF WHITE MIST. AN EAST PASSAGE ENDS HERE EXCEPT FOR A SMALL CRACK LEADING N. YOU ARE AT ONE END OF A VAST HALL STRETCHING FORWARD OUT OF SIGHT TO THE WEST. THERE ARE OPENINGS TO EITHER SIDE. NEARBY, A WIDE STONE STAIRCASE LEADS DOWNWARD. THE HALL IS FILLED WITH WISPS OF WHITE MIST SWAYING TO AND FRO ALMOST AS IF ALIVE. A COLD WIND BLOWS UP THE STAIRCASE. THERE IS A PASSAGE AT THE TOP OF A DOME BEHIN YOU.THE CRACK IS FAR TOO SMALL FOR YOU TO FOLLW. YOLѲLLąLLܑ  s   i}ir2%BUILDINIBUILDINInmBUILDINIt:$d &$dd#Ċ $d##+ 炊$ ,#x ,#$Ė .02 ; . 0,-P  -   [.\/P rP.7;400; 0Z0P;s N;t/; ;00; 0uZ0 ւv;;Ȅ9  + +;  Ɣ 4; ;4]9z7x9z74ĖC97x974Ėv77d!97dx97d4Ė9琋7x9琋74Ė59X5 x9X5 49d5 7Ė    qA  A OA A  6ցl   A A 7!7A ԑ;1;!;DD; DxZD ՂyA q ADVS1.TEXTڑA  ADVS2.TEXTA  ADVS3.TEXTRA A A  A A  A  9玦#x9玦#$Ċ9$9$xA JA  A  9$ 9$"9$!$9$9$xĆA A  ADVS4.TEXTA A ZA  A AA  A9!, A 9N!, !A  ADVS5.TEXT*A  ADVS6.TEXT`A  ADVS7.TEXT1A7 A VA  A =A  A  A 9< d"9珠 d!ĊA  <SEGMENT8 > ADVS8.TEXT}A A ADVS9.TEXT9A A vA  !#$ "#A :A 0A  A  : : x"ĊƆA A  ADVS10.TEXTpA$  ADVS11.TEXT^ 9A? A ըA  A ՍA  A  A  A  A 9p$#9p$"9p$!9p$ ċMA  9: $X"z x"玦 x,"玦 x"!x #  9d #?"珠 dx% d"珠 dx "< dx 9d #W:& d"珠 dx"< dx"珠 dx "< dx 9:2@ $)" dx#R d ҖADVMSGSMSGFILEXTMSGWRITING ADVDATAADVDATAERROR WRITING FILEERROR WRITING FILE FILE CREATED nAm 8  9#  :  d ;h;k  l    p  nx #3n93 |  3n:3   n   nA F+>#Q=${x_C SGFILYOU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING. AROUND YOU IS A FOREST. A SMALL STREAM FLOWS OUT OF THE BUILDING AND DOWN A GULY. YOU HAVE WALKED UP A HILL, STILL IN THE FOREST. THE ROAD SLOPES BACK DOWN THE OTHER SIDE OF THE HILL. THERE IS A BUILDING IN THE DISTANC. YOU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPING. YOU ARE IN A VALLEY IN THE FOREST BESIDE A STREAM TUMBLING ALONG A ROCKYBED. YOU ARE IN OPEN FOREST, WITH A DEEP VALLEY TO ONE SIDE YOU ARE ; VE A SIZABLE PASSAGE YOU ARE IN A SECRET CANYON AT A JUNCTION OF THREE CANYONS, BEARING NORTH, SOUTH, AND SE. THE NORTH ONE IS AS TALL AS THE OTHER TWO COMBIND. YOU ARE IN A LARGE LOW ROOM. CRAWLS LEAD NORTH SE, AN SW. DEAD END CRAL. YOU ARE IN A SECRET CANYON WHICH HERE RUNS E/W. IT CROSSES OVER A VERY TIGHT CANYON 15 FEET BELOW. IF YOU GO DOWN YOU MAY NOT BE ABLE TO GET BACK UP YOU ARE AT A WIDE PLACE IN A VERY TIGHT N/S CANYN. THE CANYON HERE BECOMES TOO TIGHT TO GO FURTHER OUTH.YOU ARE IN A TALL E/W CANYON. A LOW TIGHT CRAWL GOES 3 FEET NORTH AND SEEMS TO OPENUP. THE CANYON RUNS INTO A MASS OF BOULDERS -- DEAD ND. THE STREAM FLOWS OUT THROUGH A PAIR OF 1 FOOT DIAMETER SEWER PIPES. IT WOULD BE ADVISABLE TO USE THE XIT. YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE DEAD ED. DEAD ED. YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE DEAD ED. DEAD ED. YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A LONG, NARROW CORRIDOR STRETCHING OUT OF SIGHT TO THE WEST. AT THE EASTERN END IS A WHOLE THROUGH WHICH YOU CAN SEE A PROFUSION OF LEAVES THERE IS NOTHING HERE TO CLIMB. USE 'UP' OR 'OUT' TO LEAVE THE PI. YOU HAVE CLIMBED UP THE PLANT AND OUT OF THE PIT YOU ARE AT THE TOP OF A STEEP INCLINE ABOVE A LARGE ROOM. YOU COULD CLIMB DOWN HERE, BUT YOU WOULD NOT BE ABLE TO CLIMB UP. THERE IS A PASSAGE LEADING BACK TO THE NORH. YOU ARE IN THE GIANT ROOM. U ARE ON THE EAST BANK OF A FISSURE SLICING CLEAR ACROSS THE HALL. THE MIST IS QUITE THICK HERE, AND THE FISSURE IS TOO WIDE TO JMP. THIS IS A LOW ROOM WITH A CRUDE NOTE ON THE WALL. THE NOTE SAYS,'YOU WON'T GET IT UP THE STEPS' YOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PASSAGES OFF IN ALL DIRECIONS.YOU ARE AT THE BOTTOM OF THE PIT WITH A BROKEN NCK. YOU DIDN'T MAKE IT THE DOME IS UNCLIMABLE.YOU ARE AT THE WEST END OF THE TWOPIT ROOM. THERE IS A LARGE HOLE IN THE WALL ABOVE THE PIT AT THIS END OF THE ROM. YOU ARE AT THE BOTTOM OF THE EASTERN PIT IN THE TWOPIT ROOM. THERE IS A SMALL POOL OF OIL IN ONE CORNER OF THE PI. YOU ARE AT THE BOTTOM OF THE WESTERN PIT IN THE TWOPIT ROOM. THERE IS A LARGE HOLE IN THE WALL ABOUT 25 FEET ABOV YOU.YOU CLAMBER UP THE PLANT AND SCURRY THROUGH THE HOLE AT THE OP. YOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HALL OF MISTS YOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR. THE HOLE GOES DOWN TO AN E/W PASSAGE YOU ARE IN THE SOUTH SIDE CHAMER. YOU ARE IN THE WEST SIDE CHAMBER OF THE HALL OF THE MOUNTAIN KING. A PASSAGE CONTINUES WEST AND UP HEE. YOU CAN'T GET BY THE SNAE. YOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE WEST, AND A WALL OF BROKEN ROCK TO THE EAST. THERE IS A LARGE 'Y2' ON A ROCK IN THE ROOM'S CENTE. YOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERWHEE. YOU'RE AT A LOW WINDOW OVERLOOKING A HUGE PIT, WHICH EXTENDS UP OUT OF SIGHT. A FLOOR IS INDISTINCTLY VISIBLE OVER 50 FEET BELOW. TRACES OF WHITE MIST COVER THE FLOOR OF THE PIT, BECOMING THICKER TO THE RIGHT. MARKS IN THE DUST AROUND THE WINDOW WOULD SEEM TO INDICATE THAT SOMEONE HAS BEEN HERE RECENTLY. DIRECTLY ACROSS THE PIT FROM YOU AND 25 FEET AWAY THERE IS A SIMILAR WINDOW LOOKING INTO A LIGHTED ROOM. A SHADOWY FIGURE CAN BE SEEN THERE PEERING BACK AT YU. YOU ARE IN A DIRTY BROKEN PASSAGE. TO THE EAST IS A CRAWL. TO THE WEST IS A LARGE PASSAGE. ABOVE YOU IS A HOLE TO ANOTHER PASSAGE YOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT, A CRAWL LEADS WEST YOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH ENTERS AND EXITS THROUGH TINY SITS. YOU ARE IN A LARGE ROOM FULL OF DUSTY ROCKS. THERE IS A BIG HOLE IN THE FLOOR. THERE ARE CRACKS EVERYWHERE, AND A PASSAGE LEADING AST. YOU HAVE CRAWLED THROUGH A VERY LOW WIDE PASSAGE PARALLEL TO AND NORTH OF THE HALL OF MIST. YOU ARE AT THE WEST END OF THE HALL OF MISTS. A LOW WIDE CRAWL CONTINUES WEST AND ANOTHER GOES NORTH. TO THE SOUTH IS A LITTLE PASSAGE 6 FEET OFF THE FLOO. YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE DEAD ED. DEAD ED. DEAD ED. YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE DEAD ED. YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE DEAD ED. YOU ARE ON THE BRINK OF A THIRTY FOOT PIT WITH A MASSIVE ORANGE COLUMN DOWN ONE WALL. YOU COULD CLIMB DOWN HERE BUT YOU COULD NOT GET BACK UP. THE MAZE CONTINUES AT THIS LEEL. DEAD ED. YOU HAVE CRAWLED THROUGH A VERY LOW WIDE PASSAGE PARALLEL TO AND NORTH OF THE HALL OF MIST. YOU ARE AT THE EAST END OF A VERY LONG HALL APPARENTLY WITHOUT SIDE CHAMBERS. TO THE EAST A LOW WIDE CRAWL SLANTS UP. TO THE NORTH A ROUND TWO FOOT HOLE SLANTS OWN. YOU ARE AT THE WEST END OF A VERY LONG FEATURELESS HALL. THE HALL JOINS UP WITH A NARROW NORTH/SOUTH PASSAG. YOU ARE AT A CROSSROADS OF A HIGH N/S PASSAGE AND A LOW E/W NE. DEAD ED. YOU ARE AT A COMPLEX JUNCTION. A LOW HANDS AND KNEES PASSAGE FROM THE NORTH JOINS A HIGHER CRAWL FROM THE EAST TO MAKE A WALKING PASSAGE GOING WEST. THERE IS ALSO A LARGE ROOM ABOVE. THE AIR IS DAMP HEE. YOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE. TO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DWN. YOU ARE IN A ROOM WHOSE WALLS RESEMBLE SWISS CHESE. OBVIOUS PASSAGES GO WEST, EAST, NE, AND NW. PART OF THE ROOM IS OCCUPIED BY A LARGE BEDROCK BLOC. YOU ARE AT THE EAST END OF THE TWOPIT ROOM. THE FLOOR HERE IS LITTERED WITH THIN ROCK SLABS, WHICH MAKE IT EASY TO DESCEND THE PITS. THERE IS A PATH HERE BYPASSING THE PITS TO CONNECT PASSAGES FROM EAST AND WEST. THERE ARE HOLES ALL OVER, BUT THE ONLY BIG ONE IS ON THE WALL DIRECTLY OVER THE WEST PIT WHERE YOU CAN'T GET TO IT YOU ARE IN A LARGE LOW CIRCULAR CHAMBER WHOSE FLOOR IS AN IMMENSE SLAB FALLEN FROM THE CEILING (SLAB ROOM). EAST AND WEST THERE ONCE WERE LARGE PASSAGES, BUT THEY ARE NOW FILLED WITH BOULDERS. LOW SMALL PASSAGES GO NORTH AND SOUTH, AND THE SOUTH ONE QUICKLY BENDS WEST AROUND THE BOULDES. YOU ARE IN A SECRET N/S CANYON ABOVE A LARGE ROO. YOU ARE IN A SECRET N/S CANYON ABO< EASURE VAULT. KEYS IN MAIN OFFCE.' YOU ARE ON ONE SIDE OF A LARGE, DEEP CHASM. A HEAVY WHITE MIST RISING UP FROM BELOW OBSCURES ALL VIEW OF THE FAR SIDE. A SW PATH LEADS AWAY FROM THE CHASM INTO A WINDING CORRIDOR YOU ARE IN A LONG WINDING CORRIDOR SLOPING OUT OF SIGHT IN BOTH DIRECTIOS. YOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST YOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST YOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST YOU ARE ON THE FAR SIDE OF THE CHASM. A NE PATH LEADS AWAY FROM THE CHASM ON THIS SDE. YOU'RE IN A LONG EAST/WEST CORRIDOR. A FAINT RUMBLING NOISE CAN BE HEARD IN THE DISANCE.THE PATH FORKS HERE. THE LEFT FORK LEADS NORTHEAST. A DULL RUMBLING SEEMS TO GET LOUDER IN THAT DIRECTION. THE RIGHT FORK LEADS SOUTHEAST DOWN A GENTLE SLOPE. THE MAIN CORRIDOR ENTERS FROM THE WST. THE WALLS ARE QUITE WARM HERE. FROM THE NORTH CAN BE HEARD A STEADY ROAR, SO LOUD THAT THE ENTIRE CAVE SEEMS TO BE TREMBLING. ANOTHER PASSAGE LEADS SOUTH, AND A LOW CRAWL GOES EAT. YOU ARE ON THE EDGE OF A BREATH TAKING VIEW. FAR BELOW YOU IS AN ACTIVE VOLCANO, FROM WHICH GREAT GOUTS OF MOULTEN LAVA COME SURGING OUT, CASCADING BACK DOWN INTO THE DEPTHS. THE GLOWING ROCK FILLS THE FARTHEST REACHES OF THE CAVERN WITH A BLOOD-RED GLARE, GIVING EVERYTHING AN EERIE, MACABRE APPEARANCE. THE AIR IS FILLED WITH FLICKERING SPARKS OF ASH AND A HEAVY SMELL OF BRIMSTONE. THE WALLS ARE HOT TO THE TOUCH, AND THE THUNDERING OF THE VOLCANO DROWNS OUT ALTHE CEILING HERE IS TOO HIGH UP FOR YOUR LAMP TO SHOW IT. CAVERNOUS PASSAGES LEAD EAST, NORTH, AND SOUTH. ON THE WEST WALL IS SCRAWLED THE INSCRIPTION, 'FEE FIE FOE FOO' (SIC. THE PASSAGE HERE IS BLOCKED BY A RECENT CAE-IN.YOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASAGE. YOU ARE IN A MAGNIFICIENT CAVERN WITH A RUSHING STREAM, WHICH CASCADES OVER A SPARKLING WATERFALL INTO A ROARING WHIRLPOOL WHICH DISAPEARS THROUGH A HOLE IN THE FLOOR. PASSAGES EXIT TO THE SOUTH AND WEST YOU ARE IN THE SOFT ROOM. THE WALLS ARE COVERED WITH HEAVY CURTAINS, THE FLOOR WITH A THICK PILE CARPET. MOSS COVERS THE CEIING. THIS THE ORIENTAL ROOM. ANCIENT ORIENTAL CAVE DRAWINGS COVER THE WALLS. A GENTLY SLOPING PASSAGE LEADS UPWARD TO THE NORTH, ANOTHER PASSAGE LEADS SE, AND A HANDS AND KNEES CRAWL LEADS EST. YOU ARE FOLLOWING A WIDE PATH AROUND THE OUTER EDGE OF A LARGE CAVERN. FAR BELOW, THROUGH A HEAVY WHITE MIST, STRANGE SPLASHING NOISES CAN BE HEARD. THE MIST RISES UP THROUGH A FISSURE IN THE CEILING. THE PATH EXITS TO THE SOUTH AND WEST YOU ARE IN AN ALCOVE. A SMALL NW PATH SEEMS TO WIDEN AFTER A SHORT DISTANCE. AN EXTREMLY TIGHT TUNNEL LEADS EAST. IT LOOKS LIKE A VERY TIGHT SQUEEZE. AN EERIE LIGHT CAN BE SEEN AT THE OTHE END.YOU'RE IN A SMALL CHAMBER LIT BY AN EERIE GREEN LIGHT. AN EXTREMELY NARROW TUNNEL EXITS TO THE WEST. A DARK CORRIDOR LEADS N. YOU'RE IN THE DARK-ROOM. A CORRIDOR LEADING SOUTH IS THE ONLY EXI. YOU ARE IN AN ARCHED HALL. A CORAL PASSAGE ONCE CONTUINED UP AND EAST FROM HERE, BUT IS NOW BLOCKED BY DEBRIS. THE AIR SMELLS OF SEA WATR. YOU'RE IN A LARGE ROOM CARVED OUT OF SEDIMENTARY ROCK. THE FLOOR AND WALLS ARE LITTERED WITH BITS OF SHELLS IMBEDDED IN THE STONE. A SHALLOW PASSAGE PROCEEDS DOWNWARD, AND A SOMEWHAT STEEPER ONE LEADS UP. A LOW HANDS AND KNEES PASSAGE ENTERS FROM THE SOUT. YOU ARE IN A LONG SLOPING CORRIDOR WITH RAGGED SHARP WLLS. YOU ARE IN A CUL-DE-SAC ABOUT EIGHT FEET AROSS.YOU ARE IN AN ANTEROOM LEADING TO A LARGE PASSAGE TO THE EAST. SMALL PASSAGES GO WEST AND UP. THE REMNANTS OF RECENT DIGGING ARE EVIDENT. A SIGN IN MIDAIR HERE SAYS 'CAVE UNDER CONSTRUCTION BEYOND THIS POINT. PROCEED AT OWN RISK. (WITT CONSTRUCTION COMPAY)' YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL DIFFEENT. YOU ARE AT WITT'S END. PASSAGES LEAD OFF IN *ALL* DIRECTION. YOU ARE IN A NORTH/SOUTH CANYON ABOUT 25 FEET ACROSS. THE FLOOR IS COVERED BY WHITE MIST SEEPING IN FROM THE NORTH. THE WALLS EXTEND UPWARD FOR WELL OVER 100 FEET. SUSPENDED FROM SOME UNSEEN POINT FAR ABOVE YOU, AN ENORMOUS TWO-SIDED MIRROR IS HANGING PARALLEL TO AND MIDWAY BETWEEN THE CANYON WALLS. (THE MIRROR IS OBVIOUSLY PROVIDED FOR THE USE OF THE DWARVES, WHO AS YOU KNOW, ARE EXTREMELY VAIN.) A SMALL WINDOW CAN BE SEEN IN EITHER WALL, SOME FIFTY FET UP.YOU'R AT A LOW WINDOW OVERLOOKING A HUGE PIT, WHICH EXTENDS UP OUT OF SIGHT. A FLOOR IS INDISTINCTLY VISIBLE OVER 50 FEET BELOW. TRACES OF WHITE MIST COVER THE FLOOR OF THE PIT, BECOMING THICKER TO THE LEFT. MARKS IN THE DUST AROUND THE WINDOW WOULD SEEM TO INDICATE THAT SOMEONE HAS BEEN HERE RECENTLY. DIRECTLY ACROSS THE PIT FROM YOU AND 25 FEET AWAY THERE IS A SIMILAR WINDOW LOOKING INTO A LIGHTED ROOM. A SHADOWY FIGURE CAN BE SEEN PEERING BACK AT YOU A LARGE STALACTITE EXTENDS FROM THE ROOF AND ALMOST REACHES THE FLOOR BELOW. YOU COULD CLIMB DOWN IT, AND JUMP FROM IT TO THE FLOOR,BUT HAVING DONE SO YOU WOULD BE UNABLE TO REACH IT TO CLIMB BACK P. YOU ARE IN A LITTLE MAZE OF TWISTING PASSAGES, ALL DIFFERENT YOU ARE AT THE EDGE OF A LARGE UNDERGROUND RESERVOIR. AN OPAQUE CLOUD OF WHITE MIST FILLS THE ROOM AND RISES RAPIDLY UPWARD. THE LAKE IS FED BY A STREAM, WHICH TUMBLES OUT OF A HOLE IN THE WALL ABOUT 10 FEET OVERHEAD AND SPLASHES NOISILY INTO THE WATER SOMEWHERE WITHIN THE MIST. THE ONLY PASSAGE GOES BACK TOWARD THE SOUH. DEAD ED. YOU ARE AT THE NORTHEAST END OF AN IMMENSE ROOM, EVEN LARGER THAN THE GIANT ROOM. IT APPEARS TO BE A REPOSITORY FOR THE ADVENTURE PROGRAM. MASSIVE TORCHES FAR OVERHEAD BATHE THE ROOM WITH SMOKY YELLOW LIGHT. SCATTERED ABOUT YOU CAN BE SEEN A NUMBER OF BOTTLES (ALL OF THEM EMPTY), A NURSERY OF YOUNG BEANSTALKS MURMURING QUIETLY, A BED OF OYSTERS, A BUNDLE OF BLACK RODS WITH RUSTY STARS ON THEIR ENDS, AND A COLLECTION OF BRASS LANTERNS. OFF TO ONE SIDE A GREAT MANY DWARVES ARE SLEEPING ON THE FLOOR, SNORING LOUDLY. A SIGN NEARBY READS 'DO NOT DISTURB DWARVES.' AN IMMENSE MIRROR IS HANGING AGAINST ONE WALL, AND STRETCHES TO THE OTHER END OF THE ROOM, WHERE VARIOUS OTHER SUNDRY OBJECTS CAN BE GLIMPSED DIMLY IN THE DISTANE. YOU ARE AT THE SOUTHWEST END OF THE REPOSITORY. TO ONE SIDE IS A PIT FULL OF FIERCE GREEN SNAKES. ON THE OTHER SIDE IS A ROW OF SMALL WICKER CAGES, EACH OF WHICH CONTAINS A LITTLE SULKING BIRD. IN ONE CORNER IS A BUNDLE OF BLACK RODS WITH RUSTY MARKS ON THEIR ENDS. A LARGE NUMBER OF VELVET PILLOWS ARE SCATTERED ABOUT ON THE FLOOR. A VAST MIRROR STRETCHES OFF TO THE NORTHEAST. AT YOUR FEET IS A LARGE STEEL GRATE, NEXT TO WHICH IS A SIGN WHICH READS, 'TR= ING WRITTEN ON THE UNDERSIDE OF THE OYSTR. 'SPELUNKER TDAY' THERE ARE A FEW RECENT ISSUES OF 'SPELUNKER TODAY' MAGAZINE ERE. TASTY OOD THERE IS FOOD HERE SMALL OTTLETHERE IS A BOTTLE OF WATER HER. THERE IN AN EMPTY BOTTLEHERE.THERE IS A BOTTLE OF OILHERE.WATER IN THE BOTTL OIL IN THE BTTLE IRROR LANT THERE IS A TINY LITTLE PLANT IN THE PIT, MURMURMING WATER, WATER,.. THE PLANT SPURTS INTO FURIOUS GROWTH FOR A FEW SECONDS THERE IS A TWELVE FOOT TALL BEANSTALK STRETCHING UP OUT OF THE PIT, BELLOWING WATER!! WATE!! THE PLANT GROWS EXPLOSIVELY, ALMOST FILLING THE BOTTOM OF TH PIT.THERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOL. YOU'VE OVER WATERED THE PLANT. IT'S SHIRVELING UP. IT'S, I'S...*PHONYPLANT THE TOP OF A TWELVE FOOT TALL BEANSTALK IS POKING OUT OF THE WEST IT. THERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOE. *STALATITE *SHADOWY FIGRE THE SHADOWY FIGURE SEEMS TO BE TRYING TO ATTRACT YOUR ATTENTON. DWARF' AXE THERE IS A LITTLE AXE HEE. THERE IS A LITTLE AXE LYING BESIDE THE BEA. *CAVE DRAWINS *PIRAT *DRAGO A HUGE GREEN DRAGON BARS THE WY. CONGRATULATIONS. YOU HAVE JUST VANQUISHED A DRAGON WITH YOUR BARE HANDS. (UNBELIEVABLE, ISN'T T?) THE BODY OF A HUGE GREEN DEAD DRAGON IS LYING OFF TO ONE SID. CHASMA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE MIST ON THE OTHER SIDE. A SIGN POSTED ON THE BRIDGE READS, 'STOP. PAY TROL.' THL OTHER SOUNDS. EMBEDDED IN THE JAGGED ROOF FAR OVERHEAD ARE MYRIAD TWISTED FORMATIONS COMPOSED OF PURE WHITE ALABASTER, WHICH SCATTER THE MURKY LIGHT INTO SINISTER APPARITIONS UPON THE WALLS. TO ONE SIDE IS A DEEP GORGE, FILLED WITH A BIZARRE CHAOS OF TORTURED ROCK WHICH SEEMS TO HAVE BEEN CRAFTED BY THE DEVIL HIMSELF. AN IMMENSE RIVER OF FIRE CRASHES OUT FROM THE DEPTHS OF THE VOLCANO, BURNS ITS WAY THROUGH THE GORGE, AND PLUMMETS INTO A BOTTOMLESS PIT FAR OFF TO YOUR LEFT. TO THE RIGHT, AN IMMENSE GEYSER OF BLISTERING STEAM ERUPTS CONTINUOUSLY FROM A BARREN ISLAND IN THE CENTER OF A SULPHOROUS LAKE, WHICH BUBBLES OMINOUSLY. THE FAR RIGHT WALL IS AFLAME WITH AN INCANDESCENCE OF ITS OWN, WHICH LENDS AN ADDITIONAL INFERNAL SPLENDOR TO THE ALREADY HELLISH SCENE. A DARK FOREBODING PASSAGE EXITS TO THE SOUTH YOU ARE IN A SMALL CHAMBER FILLED WITH LARGE BOULDERS. THE WALLS ARE VERY WARM, CAUSING THE AIR IN THE ROOM TO BE ALMOST STIFLING FROM THE HEAT. THE ONLY EXIT IS A CRAWL HEADING WEST, THROUGH WHICH IS COMING LOW RUMBLING YOU ARE WALKING ALONG A GENTLY SLOPING NORTH/SOUTH PASSAGE LINED WITH ODDLY SHAPED LIMESTONE FORMATION. YOU ARE STANDING AT THE ENTRANCE TO A LARGE, BARREN ROOM. A SIGN POSTED ABOVE THE ENTRANCE READS 'CAUTION. BEAR IN ROO.' YOU ARE IN A BARREN ROOM. THE CENTER OF THE ROOM IS COMPLETELY EMPTY EXCEPT FOR SOME DUST. MARKS IN THE DUST LEAD AWAY TOWARD THE FAR END OF THE ROOM. THE ONLY EXIT IS THE WAY YOU CAM IN. YOU ARE IN A MAZE OF TWISTING LITTLE PASSAGES, ALL DIFFERENT YOU ARE IN A LITTLE MAZE OF TWISTY PASSAGES, ALL DIFFEENT. YOU ARE IN A TWISTING MAZE OF LITTLE PASSAGES, ALL DIFFERENT YOU ARE IN A TWISTING LITTLE MAZE OF PASSAGES, ALL DIFFERENT YOU ARE IN A TWISTY LITTLE MAZE OF PASSAGES, ALL DIFFEENT. YOU ARE IN A TWISTY MAZE OF LITTLE PASSAGES, ALL DIFFEENT. YOU ARE IN A LITTLE TWISTY MAZE OF PASSAGES, ALL DIFFEENT. YOU ARE IN A MAZE OF LITTLE TWISTING PASSAGES, ALL DIFFERENT YOU ARE IN A MAZE OF LITTLE TWISTY PASSAGES, ALL DIFFEENT. DEAD ED. YOU'RE AT END OF ROAD AGIN. YOU'RE AT HILL IN OAD. YOU'RE INSIDE BUILING. YOU'RE IN VALEY. YOU'RE IN FOEST. YOU'RE IN FOEST. YOU'RE AT SLIT IN STREAMED. YOU'RE OUTSIDE GRAE. YOU'RE BELOW THE GATE. YOU'RE IN COBBLE CAWL. YOU'RE IN DEBRIS ROM. YOU'RE IN BIRD CHABER. YOU'RE AT TOP OF SMALL PT. YOU'RE IN HALL OF ISTS.YOU'RE ON EAST BANK OF FISSURE YOU'RE IN NUGGET OF GOLDROOM.YOU'RE IN HALL OF MT KIN. YOU'RE AT WEST END OF TWOPIT ROM. YOU'RE IN EAST PIT YOU'RE IN WEST PIT YOU'RE AT 'Y'. YOU'RE AT WINDOW O PIT.YOU'RE IN DIRTY PASAGE.YOU'RE IN DUSTY ROCK ROO. YOU'RE AT WEST END OF HALL OF ISTS.YOU'RE AT BRINK OFPIT. YOU'RE AT EAST END OF LONG HAL. YOU'RE AT WEST END OF LONG HAL. YOU'RE AT COMPLEX JUNCTIN. YOU'RE IN SWISS CHEESE ROM. YOU'RE AT EAST END OF TWOPIT ROM. YOU'RE IN SLAB ROO. YOU'RE AT JUNCTION OF THREE SECRET CANYONS YOU'RE IN SECRET E/W CANYON ABOVE TIGHT CAYON. YOU'RE IN NARROW CORRIDO. YOU'RE AT STEEP INCLINE ABOVE LARGE OOM. YOU'RE IN GIANT ROM. YOU'RE IN CAVERN WITH WATERFAL. YOU'RE IN SOFT ROO. YOU'RE IN ORIENTALROOM.YOU'RE IN MISTY CAERN. YOU'RE IN ALOVE. YOU'RE IN PLOVER ROM. YOU'RE IN DARK ROO. YOU'RE IN ARCHED HLL. YOU'RE IN SHELL ROM. YOU'RE IN ANTEROOM YOU'RE AT WITT'S ED. YOU'RE IN MIRROR CNYON.YOU'RE AT WINDOW O PIT.YOU'RE AT TOP OF STALACTTE. YOU'RE AT RESERVOI. YOU'RE AT NEEND. YOU'RE AT SWEND. YOU'RE ON SW SIDE OF CHAM. YOU'RE IN SLOPING CORRIDR. YOU'RE ON NE SIDE OF CHAM. YOU'RE IN CORRIDOR YOU'RE AT FORK IN ATH. YOU'RE AT JUNCTION WITH WARM WLLS. YOU'RE AT BREATH TAKING IEW. YOU'RE IN CHAMBER OF BOUDERS.YOU'RE IN LIMESTONE PASSGE. YOU'RE IN FRONT OF BARREN ROOM YOU'RE IN BARREN ROM. SET OFKEYS THERE ARE SOME KEYS ON THE GROUND HEE. BRASS LANTER THERE IS A SHINY BRASS LAMP NERBY. THERE IS A LAMP SHINING NEARBY GRATETHE GRATE IS LOCKE. THE GRATE ISOPEN.WICKERCAGE THERE IS A SMALL WICKER CAGE DISCARDED NEABY. BLACK OD A THREE FOOT BLACK ROD WITH A RUSTY STAR ON AN END LIES NEARY. BLACK OD A THREE FOOT BLACK ROD WITH A RUSTY MARK ON AN END LIES NEARY. STEPSROUGH STONE STEPS LEAD DOWN TH PIT.ROUGH STONE STEPS LEAD UP THE OME. LITTLE BIRD IN CAG  A CHEERFUL LITTLE BIRD IS SITTING HERE SINING. THERE IS A LITTLE BIRD IN THE AGE. *RUSTYDOOR THE WAY NORTH IS BARRED BY A MASSIVE, RUSTY, IRON DOOR THE WAY NORTH LEADS THROUGH A MASSIVE, RUSTY, IRON DOO. VELVET PILLO A VELVET PILLOW LIES ON THE FLOR. SNAKEA HUGE GREEN FIERCE SNAKE BARS THE WY. *FISSUE A CRYSTAL BRIDGE NOW SPANS THE FISSUE. THE CRYSTAL BRIDGE HAS VANISHE. *STONE TABLE A MASSIVE STONE TABLET IMBEDDED IN THE WALL READS 'CONGRATULATIONS ON BRINGING LIGHT INTO THE DARK-ROO. GIANT CLAM >GRUNT. THERE IS AN ENORMOUS CLAM HERE WITH ITS SHELL TIGHTLY CLOSED GIANT OYSTER >GROA<. THERE IS AN ENORMOUS OYSTER HERE WITH ITS SHELL TIGHTLY CLOSD. INTERESTING. THERE SEEMS TO BE SOMETH> ARY DESCRIBES PLACES AND IS USED TO MOVE YOU THERE. TO MOVE, TRY WORDS LIKE FOREST, BUILDING, DOWNSTREAM, ENTER, EAST, WEST, NORTH, SOUTH, UP, OR DOWN. I KNOW ABOUT A FEW SPECIAL OBJECTS, LIKE A BLACK ROD HIDDEN IN THE CAVE. THESE OBJECTS CAN BE MANIPULATED USING SOME OF THE ACTION WORDS THAT I KNOW. USUALLY YOU WILL NEED TO GIVE BOTH THE OBJECT AND ACTION WORD (IN EITHER ORDER), BUT SOMETIMES I CAN INFER THE OBJECT FROM THE VERB ALONE. SOME OBJECTS ALSO IMPLY VERBS; IN PARTICULAR, 'INVENTORY' IMPLIES 'TAKE INVENTORY', WHICH CAUSES ME TO GIVE YOU A LIST OF WHAT YOU ARE CARRYING. THE OBJECTS HAVE SIDE EFFECTS; FOR INSTANCE, THE ROD SCARES THE BIRD. USUALLY PEOPLE HAVING TROUBLE MOVING JUST NEED TO TRY A FEW MORE WORDS. USUALLY PEOPLE TRYING UNSUCCESFULLY TO MANIPULATE AN OBJECT ARE ATTEMPTING SOMETHING BEYOND THEIR (OR MY) CAPABILITIES AND SHOULD TRY A COMPLETELY DIFFERENT TACK. TO SPEED THE GAME YOU CAN SOMETIMES MOVE LONG DISTANCES WITH A SINGLE WORD. FOR EXAMPLE, 'BUILDING' USUALLY GETS YOU TO THE BUILDING FROM ANYWHERE ABOVE GROUND EXCEPT WHEN LOST IN THE FOREST. ALSO, NOTE THAT CAVE PASSAGES TURN A LOT, AND THAT LEAVING A ROOM TO THE NORTH DOES NOT GUARANTEE ENTERING THE NEXT ROOM FROM THE SOUTH. GOOD LCK. IT MISES. IT GET YOU.K YOU CAN'T UNLOCK THE KEY. YOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE MAIN PASAGE. I DON'T KNOW WHERE THE CAVE IS, BUT HEREABOUTS NO STREAM CAN RUN ON THE SURFACE FOR LONG. I WOULD TRY THE SREAM.I NEED MORE DETAILED INSTRUCTIONS E WRECKAGE OF A BRIDGE (AND A DEAD BEAR) CAN BE SEEN AT THE BOTTOM OF THE CHSM. TROLLA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS THAT YOU THROW HIM A TREASURE BEFORE YOU MAY CROS. THE TROLL STEPS OUT FROM BENEATH THE BRIDGE AND BLOCKS YOUR AY.  *PHONYTROLLTHE TROLL IS NOWHERE TO BE SEE. THERE IS A FEROCIOUS CAVE BEAR EYING YOU FROM THE FAR END OF THE ROM. THERE IS A GENTLE CAVE BEAR SITTING PLACIDLY IN ONE CONER. THERE IS A CONTENTED LOOKING BEAR WANDERING ABOUT NEARY.  *2ND MAZE MS THERE IS A MESSAGE SCRAWLED IN THE DUST IN A FLOWERY SCRIPT, READING 'THIS IS NOT THE MAZE WHERE THE PIRATE LEAVES HIS TREASURE CHES'. *VOLCAO *VENDING MACINE THERE IS A MASSIVE VENDING MACHINE HERE. THE INSTRUCTIONS ON IT READ 'DROP COINS HERE TO RECEIVE FRESH BATTERIES' BATTERES THERE ARE FRESH BATTERIES HERE SOME WORN OUT BATTERIES HAVE BEEN DISCARDED NEARY. *CARPE/MOSS LARGE GOLD NGGET THERE IS A LARGE SPARKLING NUGGET OF GOLD ERE! SEVERAL DIAMNDS THERE ARE DIAMONDSHERE!BARS OF SILVR THERE ARE BARS OF SILVERHERE!PRECIOUS JEWLRY THERE IS PRECIOUS JEWELRY HERE RARE CINS THERE ARE MANY COINS HER! TREASURE CHET THE PIRATE'S TREASURE CHEST ISHERE!GOLDENEGGS THERE IS A LARGE NEST HERE, FULL OF GOLDENEGGS!THE NEST OF GOLDEN EGGS HAS VANISHED ONE. JEWELED TRIDNT THERE IS A JEWEL ENCRUSTED TRIDENT HRE! MING VSE THERE IS A DELICATE, PRECIOUS MING VASE HEE! THE VASE IS NOW RESTING, DELICATLY, ON A VELVET PILLOW  THE FLOOR IS LITTERED WITH WORTHLESS SHARDS OF POTTERY THE MING VASE DROPS WITH A DELICATE RASH.EGG SIZED EMRALD THERE IS A EMERALD HERE THE SIZE OF A PLOVER'S EG! PLATINUM PYRMID THERE IS A PLATINUM PYRAMID HERE, 8 INCHES ON A IDE! GLISTENING PARL OFF TO ONE SIDE LIES A GLISTENING PERL! PERSIA RUG THERE IS A PERSIAN RUG SPREAD OUT ON THE FOOR! THE DRAGON IS SPRAWLED OUT ON A PERSIAN RU. RARE SICES THERE ARE RARE SPICES HEE! GOLDENCHAINTHERE IS A GOLDEN CHAIN LYING IN A HEAP ON THE FOOR. THE BEAR IS LOCKED TO THE WALL WITH A GOLDEN CHAN. THERE IS A GOLDEN CHAIN LOCKED TO THE WALL SOMEWHERE NEARBY IS COLOSSAL CAVE, WHERE OTHERS HAVE FOUND FORTUNES IN TREASURE AND GOLD, THOUGH IT IS RUMORED THAT SOME WHO ENTER ARE NEVER SEEN AGAIN. MAGIC IS SAID TO WORK IN THE CAVE. I WILL BE YOUR EYES AND HANDS. DIRECT ME WITH COMMANDS OF ONE OR TWO WORDS. I SHOULD WARN YOU THAT I LOOK AT ONLY THE FIRST FIVE LETTERS OF EACH WORD, SO THAT YOU'LL HAVE TO ENTER 'NORTHEAST' AS 'NE' TO DISTINGUISH IT FROM 'NORTH'. (SHOULD YOU GET STUCK, TYPE 'HELP' FOR SOME GENERAL HINS. A LITTLE DWARF WITH A BIG KNIFE BLOCKS YOU WAY.A LITTLE DWARF JUST WALKED AROUND A CORNER, SAW YOU, THREW A LITTLE AXE AT YOU WHICH MISSED, CURSED, AND RANAWAY.THERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YU. ONE SHARP NASTY KNIFE IS THROWN AT YU. NONE OF THEM HIT YU. ONE OF THEM GETS YU. A HOLLOW VOICE SAYS 'PLUH'. THERE IS NO WAY TO GO IN THAT DIRECTON. I AM UNSURE HOW YOU ARE FACING. USE COMPASS POINTS OR NEARBY OBJETS. I DON'T KNOW IN FROM OUT HERE. USE COMPASS POINTS OR NAME SOMETHING IN THE GENERAL DIRECTION YOU WANT TO GO I DON'T KNOW HOW TO APPLY THAT WORD ERE. I DON'T UNDERSTANDTHAT.I'M GAME. WOULD YOU CARE TO EXPLAINHOW? SORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL. I WILL REPEAT THE LONG DESCRIPTION OF YOUR LOCTION.IT IS NOW PITCH DARK. IF YOU PROCEED YOU WILL LIKELY FALL INTO A IT. IF YOU PREFER, SIMPLY TYPE W RATHER THAN WST. ARE YOU TRYING TO CATCH THE BID?  THE BIRD IS FRIGHTENED NOW AND YOU CANNOT CATCH IT NO MATTER WHAT YOU TRY. PERHAPS YOU MIGHT TRY LATE. ARE YOU TRYING TO SOMEHOW DEAL WITH THE SNKE? YOU CAN'T KILL THE SNAKE, OR DRIVE IT AWAY, OR AVOID IT, OR ANYTHING LIKE THAT. THERE IS A WAY TO GET BY, BUT YOU DON'T HAVE THE NECESSARY RESOURCES RIGHT OW. DO YOU REALLY WANT TO QUIT NOW YOU FELL INTO A PIT AND BROKE EVERY BONE IN YOURBODY.YOU ARE ALREADY CARRYINGIT. YOU CAN'T BE SERIOS. THE BIRD WAS UNAFRAID WHEN YOU ENTERED, BUT AS YOU APPROACH IT BECOMES DISTURBED AND YOU CAN'T CATCH I. YOU CAN CATCH THE BIRD, BUT YOU CANNOT CARY IT.THERE IS NOTHING HERE WITH A LCK. YOU AREN'T CARRYIN IT. THE LITTLE BIRD ATTACKS THE GREEN SNAKE, AND IN AN ASTOUNDING FLURRY DRIVES THE SNAKE AWAY YOU HAVE NO EYS. IT HAS NO LOK. I DON'T KNOW HOW TO LOCK OR UNLOCK SUCH A HING.IT WAS ALREADY LOCED. THE GRATE IS NOW LCKED.THE GRATE IS NOW UNLOCKE. IT WAS ALREADY UNLCKED.YOU HAVE NO SOURCE OF LIHT. YOUR LAMP IS NOW O. YOUR LAMP IS NOW OF. THERE IS NO WAY TO GET PAST THE BEAR TO UNLOCK THE CHAIN, WHICH IS PROBABLY JUST AS ELL. NOTHING HAPPNS. HERE?THERE IS NOTHING HERE TO ATTAC. THE LITTLE BIRD IS NOW DEAD. ITS BODY DISAPPEAR. ATTACKING THE SNAKE BOTH DOESN'T WORK AND IS VERY DANGROUS.YOU KILLED A LITTLE DWAR. YOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WA. WITH WHAT? YOUR BARE HADS? GOOD TRY, BUT THAT IS AN OLD WORN OUT MAGIC WORD I KNOW OF PLACES, ACTIONS, AND THINGS. MOST OF MY VOCABUL? E.' A MYSTERIOUS RECORDED VOICE GROANS INTO LIFE AND ANNOUNCES 'THIS EXIT IS CLOSED. PLEASE LEAVE VIA MAIN OFFIE'. IT LOOKS AS THOUGH YOU'RE DEAD. WELL, SEEING AS HOW IT'S SO CLOSE TO CLOSING TIME ANYWAY, I THINK I'LL JUST CALL IT A DY. THE SEPULCHRAL VOICE INTONES, 'THE CAVE IS NOW CLOSED.' AS THE ECHOES FADE, THERE IS A BLINDING FLASH OF LIGHT (AND A SMALL PUFF OF ORANGE SMOKE). AS YOUR EYES REFOCUS, YOU LOOK AROUND AND FIND... THERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE APPEARS IN THE FAR WALL, BURYING THE DWARVES IN THE RUBBLE. YOU MARCH THROUGH THE HOLE AND FIND YOURSELF IN THE MAIN OFFICE, WHERE A CHEERING BAND OF FRIENDLY ELVES CARRY THE CONQUERING ADVENTURER OFF INTO THE SUNET. THERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE APPEARS IN THE FAR WALL, BURYING THE SNAKES IN THE RUBBLE. A RIVER OF MOLTEN LAVA POURS IN THROUGH THE HOLE, DESTROYING EVERYTHING IN ITS PATH, INCLUDINGYOU. THERE IS A LOUD EXPLOSION, AND YOU ARE SUDDENLY SPLASHED ACROSS THE WALLS OF THE ROO. THE RESULTING RUCKUS HAS AWAKENED THE DWARVES. THERE ARE NOW SEVERAL THREATENING LITTLE DWARVES IN THE ROOM WITH YOU. MOST OF THEM THROW KNIVES AT YOU. ALL OF THEM GET YOU OH, LEAVE THE POOR UNHAPPY BIRD ALON. I DARESAY WHATEVER YOU WANT IS AROUND HERE SOMEWERE. I DON'T KNOW THE WORD 'STOP'. USE QUIT' IF YOU WANT TO GIVEUP. YOU CAN'T GET THERE FROMHERE.YOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEA. DO YOU INDEED WISH TO QUIT NOW THERE IS NOTHING HERE WITH WHICH TO FILL THE VAS. TO DO THT. I CAN ONLY TELL YOU WHAT YOU SEE AS YOU MOVE ABOUT AND MANIPULATE THINGS. I CANNOT TELL YOU WHERE REMOTE THINGS AE. I DON'T KNOW THAT ORD. HAT? ARE YOU TRYING TO GET INTO THECAVE?THE GRATE IS VERY SOLID AND HAS A HARDENED STEEL LOCK. YOU CANNOT ENTER WITHOUT A KEY, AND THERE ARE NO KEYS NEARBY. I WOULD RECOMMEND LOOKING ELSEWHERE FOR THEKEYS.THE TREES OF THE FOREST ARE LARGE HARDWOOD OAK AND MAPLE, WITH AN OCCASIONAL GROVE OF PINE OR SPRUCE. THERE IS QUITE A BIT OF UNDER GROWTH, LARGLY BIRCH AND ASH SAPLINGS PLUS NON DESCRIPT BUSHES OF VARIOUS SORTS. THIS TIME OF YEAR VISIBILITY IS QUITE RESTRICTED BY ALL THE LEAVES, BUT TRAVEL IS QUITE EASY IF YOU DETOUR AROUND THE SPRUCE AND BERRY BUSHS. WELCOME TO ADVENTURE... WOULD YOU LIKE INSTRUCTINS? DIGGING WITHOUT A SHOVEL IS QUITE IMPRACTICAL. EVEN WITH A SHOVEL PROGRESS IS UNLIKLY. BLASTING REQUIRES DYNAMIE. I'M AS CONFUSED AS YOU AE. MIST IS A WHITE VAPOR, USUALLY WATER, SEEN FROM TIME TO TIME IN CAVERNS. IT CAN BE FOUND ANYWHERE, BUT IS FREQUENTLY A SIGN OF A DEEP PIT LEADING DOWN TO WTER. YOUR FEET ARE NOW ET. I THINK I JUST LOST MY APPETIT. THANK YOU, IT WAS DELICIUS. YOU HAVE TAKEN A DRINK FROM THE STREAM. THE WATER TASTES STRONGLY OF MINERALS, BUT IS NOT UNPLEASANT. IT IS EXTREMELY OLD. THE BOTTLE OF WATER IS NOW EMPY. IT'S AN ELECTRIC LAMP AND RUBBING IT IS NOT PARTICULARLY REWARDING. ANYWAY, NOTHING HAPPES. PECULIAR. NOTHING UNEXPECTED HAPPEN. YOUR BOTTLE IS EMPTY AND THE GROUND AT YOUR FEET IS WE. YOU CAN'T POUR THA. FUCK YOURSELF! KEEP THAT UP AND YOU'RE ON YOUR WN. WHICH AY? OH DEAR, YOU SEEM TO HAVE GOTTEN YOURSELF KILLED. I MIGHT BE ABLE TO HELP YOU OUT, BUT I'VE NEVER REALLY DONE THIS KIND OF THING BEFORE. DO YOU WANT ME TO TRY TO REINCARNAT YOU?ALL RIGHT. BUT DON'T BLAME ME IF SOMETHING GOES WR..... YOU ARE ENGULFED IN A CLOUD OF ORANGE SMOKE. COUGHING AND GASPING, YOU EMERGE FROM THE CLOUD AND FID....YOU CLUMSY OAF! YOU'VE DONE IT AGAIN. I DON'T KNOW HOW LONG I CAN KEEP THIS UP. DO YOU WANT ME TO TRY REINCARNATING YOU AGAN? OKAY, NOW WHERE DID I PUT MY ORANGE SMOKE?.... >POOF< EVERYTHING DISAPPEARS IN A DENSE CLOUD OF ORANGE MOKE.NOW YOU'VE REALLY DONE IT. I'M OUT OF ORANGE SMOKE. YOU DON'T EXPECT ME TO DO A DECENT REINCARNATION WITHOUT ORANGE SMOKE, D YOU?OKAY, IF YOU'RE SO SMART DO IT YOURSELF. I'M LEVING.SORRY, BUT I NO LONGER SEEM TO REMEMBER HOW IT WAS YOU GOT HRE. YOU CAN'T CARRY ANYTHING MORE. YOU'LL HAVE TO DROP SOMETHING FIRS. YOU CAN'T GO THROUGH A LOCKED STEEL RATE.I BELIEVE WHAT YOU WANT IS RIGHT HERE WITHYOU. YOU DON'T FIT THROUGH A TWO-INCH SLI. I RESPECTFULLY SUGGEST YOU GO ACROSS THE BRIDGE INSTEAD OF JUMPING THERE IS NO WAY ACROSS THE FISURE. YOU'RE NOT CARRYING ANYTING. YOU ARE CURRENTLY HOLDING THE FOLLOWNG: IT'S NOT HUNGRY (IT'S MERELY PININ' FOR THE FJORDS). BESIDES, YOU HAVE NO BIRD SEED THE SNAKE HAS NOW DEVOURED YOUR BIRD THERE'S NOTHING HERE IT WANTS TO EAT (EXCEPT PERHAPS YU). FOOL, DWARVES EAT ONLY COAL. NOW YOU'VE MADE HIM *REALLY* MD. YOU HAVE NOTHING IN WHICH TO CARRY I. YOUR BOTTLE IS ALREADY FLL. THERE IS NOTHING HERE WITH WHICH TO FILL THE BOTLE. YOUR BOTTLE IS NOW FULL OF WATR. YOUR BOTTLE IS NOW FULL OF OIL YOU CAN'T FILL THA. DON'T BE RIDICULOU. THE DOOR IS EXTREMELY RUSTY AND REFUSES TOOPEN.THE PLANT INDIGNANTLY SHAKES THE OIL OFF ITS LEAVES AND ASKS, 'WATR'? THE HINGES ARE QUITE THROUGHLY RUSTED NOW AND WON'T BUGE. THE OIL HAS FREED UP THE HINGES SO THAT THE DOOR WILL NOW MOVE, THOUGH IT REQUIRES SOME EFORT. THE PLANT HAS EXCEPTIONLY DEEP ROOTS AND CANNOT BE PULLED FRE. THE DWARVE'S KNIVES VANISH AS THEY STRIKE THE WALLS OF THE CVE. SOMETHING YOU'RE CARRYING WON'T FIT THROUGH THE TUNNEL WITH YOU. YOU'D BEST TAKE INVENTORY AND DROP SOMETHIG. YOU CAN'T FIT THIS FIVE-FOOT CLAM THROUGH THAT LITTLE PASSAG. YOU CAN'T FIT THIS FIVE-FOOT OYSTER THROUGH THAT LITTLE PASSGE. I ADVISE YOU TO PUT DOWN THE CLAM BEFORE OPENING IT. (STRAIN. I ADVISE YOU TO PUT DOWN THE OYSTER BEFORE OPENING IT. (WRENH). YOU DON'T HAVE ANYTHING STRONG ENOUGH TO OPEN THE CLAM YOU DON'T HAVE ANYTHING STRONG ENOUGH TO OPEN THE OYSTR. A GLISTENING PEARL FALLS OUT OF THE CLAM AND ROLLS AWAY. GOODNESS, THIS MUST REALLY BE AN OYSTER. (I NEVER WAS ANY GOOD AT IDENTIFYING BIVALVES.) WHATEVER IT IS, IT HAS NOW SNAPPED SHUT AGAN. THE OYSTER CREAKS OPEN, REVEALING NOTHING BUT OYSTER INSIDE. IT PROMPTLY SNAPS SHUT AGAIN YOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND FOUND YOUR WAY BLOCKED BY A RECENT CAVE-IN. YOU ARE NOW IN THE MAIN PASAGE.THERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS BEHIND YOU OUT FROM THE SHADOWS BEHIND YOU POUNCES A BEARDED PIRATE. 'HAR, HAR' HE CHORTLES, 'I'LL JUST TAKE ALL THIS BOOTY AND HIDE IT AWAY WITH ME CHEST DEEP IN THE MAZE.' HE SNATCHES YOUR TREASURE AND VANISHES INTO THE GLOO. A SEPUCHRAL VOICE REVERBRATING THROUGH THE CAVE, SAYS, 'CAVE CLOSING SOON. ALL ADVENTURERS EXIT THROUGH MAIN OFFI@ ADVENTURADVENTUR(PASCALIO (ADVENTURERROR READING ARRAY FILEc##$#    NO CLOCK.&PLEASE ENTER A NUMBER FROM 1 TO 32767  n ! @3  8       &"ą"ą"!ą",ą"@ą"rą# rą#ą##ą##ą# #ą# ą# # # ą# ą#ą#ą###ą# #ą#ą#ą#-L*M'NYOP0PPQ ADV.MISCINFOADVDATAADVMSGS ^218"$  %   $(%? ˂C ! !#" " #  2#2!X# x##2#2$!p#x# #Հ2@2 22! dx##"R dx ,2#2Ձ!#,Ga!#,THE SUDDEN CHANGE IN TEMPERATURE HAS DELICATELY SHATTERED THE VASE IT IS BEYOND YOUR POWER TO DO HAT. I DON'T KNOWHOW. IT IS TOO FAR UP FOR YOU TO RECH. YOU KILLED A LITTLE DWARF. THE BODY VANISHES IN A CLOUD OF GREASY BLACK SMOKE THE SHELL IS VERY STRONG AND IS IMPERVIOUS TO ATACK. WHAT'S THE MATTER, CAN'T YOU READ? NOW YOU'D BEST START OVE. THE AXE BOUNCES HARMLESSLY OFF THE DRAGON'S THICK SCALS. THE DRAGON LOOKS RATHER NASTY. YOU'D BEST NOT TRY TO GET BY THE LITTLE BIRD ATTACKS THE GREEN DRAGON AND IN AN ASTOUNDING FLURRY GETS BURNT TO A CINDER. THE ASHES BLOWAWAY.ON WHA? OKAY, FROM NOW ON I'LL ONLY DESCRIBE A PLACE IN FULL THE FIRST TIME YOU COME TO IT. TO GET THE FULL DESCRIPTION, SAY 'LOK'. TROLLS ARE CLOSE RELATIVES WITH THE ROCK AND HAVE SKIN AS TOUGH AS THAT OF A RHINOCEROS. THE TROLL FENDS OFF YOUR BLOWS EFFORTLESSL. THE TROLL DEFTLY CATCHES THE AXE, EXAMINES IT CAREFULLY, AND TOSSES IT BACK, DECLARING, 'GOOD WORKMANSHIP, BUT IT'S NOT VALUABLE ENOGH.' THE TROLL CATCHES YOUR TREASURE AND SCURRIES AWAY OUT OF SIGT. THE TROLL REFUSES TO LET YOU COSS. THERE IS NO LONGER ANY WAY ACROSS THE CHAS. JUST AS YOU REACH THE OTHER SIDE, THE BRIDGE BUCKLES BENEATH THE WEIGHT OF THE BEAR, WHICH WAS STILL FOLLOWING YOU AROUND. YOU SCRABBLE DESPERATELY FOR SUPPORT, BUT AS THE BRIDGE COLLAPSES YOU STUMBLE BACK AND FALL INTO THE CHAM. THE BEAR LUMBERS TOWARD THE TROLL, WHO LETS OUT A STARTLED SHRIEK AND SCURRIES AWAY. THE BEAR SOON GIVES UP THE PURSUIT AND WANDERSBACK.THE AXE MISSES AND LANDS NEAR THE BEAR WHERE YOU CAN'T GET A IT. WITH WHAT? YOUR BARE HANDS? AGAINST *HIS* BEAR HANDS? THE BEAR IS CONFUSED; HE ONLY WANTS TO BE YOUR FIEND.FOR CRYING OUT LOUD, THE POOR THING IS ALREADY DAD. THE BEAR EAGERLY WOLFS DOWN YOUR FOOD, AFTER WHICH HE SEEMS TO CALM DOWN CONSIDERABLY AND EVEN BECOMES RATHER FRIEDLY. THE BEAR IS STILL CHAINED TO THE WAL. THE CHAIN IS STILL LOCKE. THE CHAIN IS NOW UNLOCKE. THE CHAIN IS NOW LCKED.THERE IS NOTHING HERE TO WHICH THE CHAIN CAN BE LOCKED THERE IS NOTHING HERE TOEAT. DO YOU WANT THE HIT? DO YOU NEED HELP GETTING OUT OF THE AZE? YOU CAN MAKE THE PASSAGES LOOK LESS ALIKE BY DROPPING THINGS ARE YOU TRYING TO EXPLORE BEYOND THE PLOVER ROOM THERE IS A WAY TO EXPLORE THAT REGION WITHOUT HAVING TO WORRY ABOUT FALLING INTO A PIT. NONE OF THE OBJECTS AVAILABLE IS IMMEDIATELY USEFULL IN DISCOVERING THE SCRET.DO YOU NEED HELP GETTING OUT OF HERE DON'T GO WES. GLUTTONY IS NOT ONE OF THE TROLL'S VICES. AVARICE, HOWEVER,IS. YOUR LAMP IS GETTING DIM. YOU'D BEST START WRAPPING THIS UP, UNLESS YOU CAN FIND SOME FRESH BATTERIES. I SEEM TO RECALL THERE'S A VENDING MACHINE IN THE MAZE. BRING SOME COINS WITH YO. YOUR LAMP HAS RUN OUT OF POWER  THERE'S NOT MUCH POINT IN WANDERING AROUND OUT HERE, AND YOU CAN'T EXPLORE THE CAVE WITHOUT A LAMP. SO LET'S JUST CALL IT A DY. THERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS BEHIND YOU. AS YOU TURN TOWARD THEM, THE BEAM OF YOUR LAMP FALLS ACROSS A BEARDED PIRATE. HE IS CARRYING A LARGE CHEST. 'SHIVER ME TIMBERS.' HE CRIES, 'I'VE BEEN SPOTTED. I'D BEST HIE MESELF OFF TO THE MAZE TO HIDE ME CHEST.' WITH THAT, HE VANISHES INTO THE GLOO. YOUR LAMP IS GETTING DIM. YOU'D BEST GO BACK FOR THOSE BATTRIES.YOUR LAMP IS GETTING DIM. I'M TAKING THE LIBERTY OF REPLACING THE BATTEIES. YOUR LAMP IS GETTING DIM, AND YOU'RE OUT OF SPARE BATTERIES. YOU'D BEST START WRAPPING THS UP.I'M AFRAID THE MAGAZINE IS WRITTEN IN DWARISH. 'THIS IS NOT THE MAZE WHERE THE PIRATE LEAVES HIS CHES.' HMMM, THIS LOOKS LIKE A CLUE, WHICH MEANS IT'LL COST YOU TEN POINTS TO READ IT. SHOULD I GO AHEAD AND READ IT ANYAY? IT SAYS, 'THERE IS SOMETHING STRANGE ABOUT THIS PLACE, SUCH THAT ONE OF THE WORDS I'VE ALWAYS KNOWN NOW HAS A NEW EFFECT' IT SAYS THE SAME THING IT DID BEFORE I'M AFRAID I DON'T UNDERTAND.CONGRATULATIONS ON BRINGING LIGHT INTO THE DARK-OOM. YOU STRIKE THE MIRROR A RESOUNDING BLOW, WHEREUPON IT SHATTERS INTO A MYRIAD TINY FRAGMENT. YOU HAVE TAKEN THE VASE AND HURLED IT DELICATELY TO THE GROUD. YOU PROD THE NEAREST DWARF, WHO WAKES UP GRUMPILY, TAKES ONE LOOK AT YOU, CURSES, AND GRABS FOR HIS AX. IS THIS ACCEPTABLE ARE YOU RESUMING AN EARLIER ADVENTUR? YOU ARE OBVIOUSLY A RANK AMATEUR. BETTER LUCK NEXT TIE. YOUR SCORE QUALIFIES YOU AS A NOVICE ADVENURER.YOU HAVE ACHIEVED THE RATING: "EXPERIENCED ADVENTURER" YOU MAY NOW CONSIDER YOURSELF A "SEASONED ADVENTRER".YOU HAVE REACHED "JUNIOR MASTER" STAUS. YOUR SCORE PUTS YOU IN MASTER ADVENTURER CLASS C YOUR SCORE PUTS YOU IN MASTER ADVENTURER CLASS B YOUR SCORE PUTS YOU IN MASTER ADVENTURER CLASS A ALL OF ADVENTUREDOM GIVES TRIBUTE TO YOU, ADVENTURER GRANDMATER. EXTMSGA # # !琋x>. #   4 ;  8Ց# # 8!琋x48  M 7#7  \  !琋27x7 ##y(#y %!#yx"瀖#yx#1!z#yx#y+## %!琋x#!琋x1#y !%#y! #!琋x;"瀖#y"#yxą",#yx4#4ą#d ##dą#2"R#dxe#^"R#dą#>#@"R#dą##ą##~#### ą#:"R#dx##y"&dx#1"炊4x&I AM PREPARED TO GIVE YOU A HINT, BUT  IT WILL COST YOU  POINTSU"烶<!p<x6յ  !p<x    "<!p<x6ą"<x#"##!p<xĖ"Rdx '"烶<Ė #'  '"烶<Ė*",#yx",#xx",#}x#z'"烶<Ėm"R;dx᱅"R<dxᰡ'"烶<Ėw'  1  < Ֆ"<x}#y< "烶<"烶<xĊ"烶<ą"烶<x!p<H!#,Ɣȅ!#,Ɣ#ȅ!#,Ɣ##w2ENTER YOUR NAME PLEASE.ENTER YOUR PASSWORD  .AVSV4  (  @   KL ՁƔ  <0    )X  t(M-( 5 2@"#~!"dxc"7"7 "R"dx ""dx"R"dx !:! "} # : #  : & : # : ւڊ    -:- "dxl : :  "#1""x !p"x" P"#dxᰤ"#dx#y"&#dx#y#$#$#$#$F?  ̃UÎ&¾ d # "#dx#y#D "#yx"Rdx 堡Z "#x "&x%!" !  $$  "Rdx"Rdx  "%x"%x! " /1P,"!! , ! , "!Ի ! , 2! ,!N ,x20c! ,0!N ,x ! ,!N ,x21 ",x"炊x"炊xӅ"炊"炊xĖ5 %dh"%dxR"%dą##zą",$x% ",$"炊%xĊ5",$x% ",$"炊%xĊ $d"&$dd#Ċ."$dx ##zą"$d##."炊$",#xą",#$Ė %d"&%ddx"%dx ,% %$/ #"#dx#d"&#dx: #J %$## PRESS TO CONTINUE &&&$$&     /ـ*ˇ  ˔   Ɣ  ƔƔƔȄƔƔƔȄ///%L%/ Ɣ  / P/   /ڔ/  m!&dx  %!"%˔ !ֆ˔ )PLEASE ANSWER THE QUESTION WITH YES OR NOYESYNONyesynonYESYyesyyesynon%YOU WONT GET VERY FAR IN LOWER CASE !1,/!琋/x&  P  ͔ϔДҔӔՔ֔ؔ{ٔ۔ܔޔߔ!   .--!琋-x0/FATAL ERROR # ---- BYE!  #    '/6څ#*!琋x#y##ą#6#y#y#yL !A" x6" x#y!琋x Z2@3 Z3<#y!<<dx#y!<;dx!3"3dx#y3!琋x"€$dx7# $#2@3 s3<#y!<<dx#y!<;dx:"3dx#y"&3dx3#y33# 3"# ą"# ą"ċ##~2"€7dx "RdxW!琋x7# $#"# ą"# ą"Ċ6"x"x !琋x THERE ARE THREATENING #LITTLE DWARVES IN THE ROOM WITH YOU OF THEM THROW KNIVES AT YOU. OF THEM GET YOU!# ծ#y_ ՝# 4#"2 " 44#F"4x#y"4ą"4"4x4!琋x#y{# 4#c"4xH!玦"4xx1!1x33"3x6666,66"4x36 36"4x!4"!1xd"3631!1x/"3"4x333 "4"4xą"4"3xą"4"4x#y"4x#y"4x#yą"4xՑ"4#y4$#y# "R7dx$W# # ą"4x"4x-8 ###y _# 74B &dxd>d2>2d!"L"!dx!<dx"!dx!珠dx!2!#2!13###ą#4#2N ##2"Rdą"…#dĀM  2 5#r "R dĊq "R dĒ2p #2"Rdx"Rd"Rdxą"Rd"Rdx!14# H 2## #####!##G 24##y 堡4##n ;n 2"Rdą"dĀJ 24#L 25#d 2# ##!e#"Rdxn #! # # 2e "Rdą##~Ē2# 2g # # Ē2##u"R#dxf "R#dxn  2"R#dą"&dą"RdĀ 2 2 6!琋;x#y!17###2#2#@!J #!!d"!$!玦#yx1 #y2!2d2#}#x##xą##y2#y!琋[x!112!1x)!1x!玦#yx!1x,K!玦!1xx!1x!3x21!1xH01!琋x!!1x!玦#yx!1x229@#!琋x##ą#ą"瀖#yċ2C1#y!琋9x!琋:x##xą##y11!1x!1x2!1xÅP 2֏   * P ##; !琋;x!!1x!1x 9d2 $22"R2dx9d9d99 9d9,"9Ȳ!9, d6,!6,6,6.6 ;#y 6/ "!琋6x#y!!1x 19!1x6!1xԿ :: 2&U#k"Rdxd,4,A4"R4dx!"R4d"R4dx4&* '!Y"P0#P#ą###y# P  ,,P,$S,PƔ &ԩ,,' !!G'!0,,0P,Q,P',,',,E*!Y,,YP,Q,P*,,*,, ?U\&;!琋;x1'#6& 6'#y' 2A#"RdxH "Rdą" dx!< dx ##~Ē2##!S !!d"! A G : ' 0 "  .##W#|2 #x2 9z2 #= ;|#y=i2# o # "R dx6 # #7 ##@ ; Ն#@#n"R@dx" Q#y!<@dx 5 "R@d@@#y"&@dċ"R#dx) "R@dx% m "R@dą"&@dą"R#dx"R#dą"&#d"R#dxĊb# ##ą#ĊC""Rdx #"RdĊ; "RdĒ2.6 2. E# 6"Rd !琋'x#12&/ /"Rdą!琋(x  2/##堡 # ##7 "R d"R dx "R dx22 "(" x#y#   Ӆ#!# ##d "Rdx##d!##d!# "R#dx##d#ą#d4#9 ##  ##dą#d4#O #2"Rdą" dx!< dx ##~Ā- #, ## # . #1 ##7# #! ##"R#dx #"Rdx2#ą#1  2"Rdą"R>dą!<dx"C 4 !d4 x=!X4 x4U` %@  u   ~  v!d4 x=-2 - %@  2   -  4#SORRY, YOU DO NOT HAVE A SAVED GAMEINCORRECT PASSWORDOLD SAVE FILE - NEW NEW SAVE FILE - OLD ADVENTURE. SORRY.hOˆρ"Aą"x չ"  {"# # #9#   ## ą5#ą#ą#2ą"x #Ċ#Ją#y:"#6ą#y+#y6# #y# Ċ#?  %"#ą#5&015n_d`%$3"!!}  ")YKVKLvLEm[0#)<hUG-   f #_{sXLB*eQSL&`^ Յ# # 28"Rdx#2#ys !琋x1 I SEE NO  HERE.f9AA * Y F  2# # ĥ #$ #"x¥ #"x堅#2"6 29# #:"R:dx:ƥ ::#y"R:dą"&:dĒ2&##2!琋x7 :##2!琋x7:",#yx4"炊",#yxx4 !%" x#y# 4 օ#",#yxĒ6;  # # # #ą#@ 4@ #@ą#2:-; 4#ĒAJ;1 2];66O;b d !2 #  ;b!琋cx  # 2(IF YOU WERE TO QUIT NOW, YOU WOULD SCORE OUT OF A POSSIBLE N<  =   :   66O]=** # 2# 226 2"€8dx!<8dx8#y!<8dx2"€8dx"€!dx"R!dx"R!d8 #y!<8dx8!<8dx82 2#  2y= #'ą#Ē2= # ##d $ ##d$ą##ą#d#4IERROR SUSPENDING GAME&>   VADVENTURE GAME SAVED AS >##Ć 4"4 W4#4 W      %*/49>CHMRW\afkpuz?#֟tL44M;}MxCHMRW\afkpuz@#֟689:;}:xi2d2_?Z@UAPBKCFEA2<G7G2D-5(H#222IJ KV# WHAT DO YOU WANT TO DO WITH THE _A'j Z# YZk * Y  1 I SEE NO  HERE.B#2ą"&2dx#y2 [29#y#y#y?#y #y@2 !Z2/4 $"4x#y# [42 2#y[#"Rdx#Đ[###y#ą!琋txo# #Đ[X##'[; * Y   1eC#2ą!h##x '|# \#'}XY#XYbD"Rdą"R d4 "44!!d"!6 76րΊ0`€P$`ŀP`ȀP `ˀP5ր07ԀP$7ـP7ހP 7P# 66 6# 5  7ĆĆą– OF ց( "!!   ) `  7 ց͊ 66  6xĆx6x "Ćx!>xĆx ĊxTOTAL = M x  TOTAL = m x  In U.S. of A. Dollars you have $*    YOUR MONEY ? NO-NO, NOT AFTER 3 OR MORE!!  օDx   ) ?????????~    ۆ7P`P$H)it, G)ood, D)oubledown, S)plitpair @ (HOUSE LIMIT IS $200.. BET LIMIT ? (Y/N) #HOUSE LIMIT IS $200.. BET PLEASE ? h_  Nȥ/t    ɳі OF    )    .!4x  xĊxĖs !4"   ǖ!* * DOUBLE BLACKJACK !!! - PUSH -'* * * BLACKJACK !! - PAY 1.5 TIMES BET * * DEALER HAS A BLACKJACK !!} xx|xx; Dx#L ` YOU BUSTED WITH HD HDօ' x  DB xxx ȑTHE HOUSE BUSTED WITH - PUSH -DEALER HAS 21!!PAY T -" x  Axx xx. x兀2 3 ;    ! PLEASE ENTER A RANDOM NUMBER -       Ζ?pTsSPAn[N.# A LITTLE PASSAGE 6 FEET OFF THE FLOO. YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE DEAD ED. DEAD ED. DEAD ED. YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE DEAD ED. YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE DEAD ED. YOU ARE ON THE BRINK OF A THIRTY FOOT PIT WITH A MASSIVE ORANGE COLUMN DOWN ONE WALL. YOU COULD CLIMB DOWN HERE BUT YOU COULD NOT GET BACK UP. THE MAZE CONTINUES AT THIS LEEL. DEAD ED. YOU HAVE CRAWLED THROUGH A VERY LOW WIDE PASSAGE PARALLEL TO AND NORTH OF THE HALL OF MIST. YOU ARE AT THE EAST END OF A VERY E E AT THE EDGE OF A LARGE UNDERGROUND RESERVOIR. AN OPAQUE CLOUD OF WHITE MIST FILLS THE ROOM AND RISES RAPIDLY UPWARD. THE LAKE IS FED BY A STREAM, WHICH TUMBLES OUT OF A HOLE IN THE WALL ABOUT 10 FEET OVERHEAD AND SPLASHES NOISILY INTO THE WATER SOMEWHERE WITHIN THE MIST. THE ONLY PASSAGE GOES BACK TOWARD THE SOUH. DEAD ED. YOU ARE AT THE NORTHEAST END OF AN IMMENSE ROOM, EVEN LARGER THAN THE GIANT ROOM. IT APPEARS TO BE A REPOSITORY FOR THE ADVENTURE PROGRAM. MASSIVE TORCHES FAR OVERHEAD BATHE THE ROOM WITH SMOKY YELLOW LIGHT. SCATTERED ABOUT YOU CAN BE SEEN A NUMBER OF BOTTLES (ALL OF THEM EMPTY), A NURSERY OF YOUNG BEANSTALKS MURMURING QUIETLY, A BED OF OYSTERS, A BUNDLE OF BLACK RODS WITH RUSTY STARS ON THEIR ENDS, AND A COLLECTION OF BRASS LANTERNS. OFF TO ONE SIDE A GREAT MANY DWARVES ARE SLEEPING ON THE FLOOR, SNORING LOUDLY. A SIGN NEARBY READS 'DO NOT DISTURB DWARVES.' AN IMMENSE MIRROR IS HANGING AGAINST ONE WALL, AND STRETCHES TO THE OTHER END OF THE ROOM, WHERE VARIOUS OTHER SUNDRY OBJECTS CAN BE GLIMPSED DIMLY IN THE DISTANE. YOU ARE AT THE SOUTHWEST END OF THE REPOSITORY. TO ONE SIDE IS A PIT FULL OF FIERCE GREEN SNAKES. ON THE OTHER SIDE IS A ROW OF SMALL WICKER CAGES, EACH OF WHICH CONTAINS A LITTLE SULKING BIRD. IN ONE CORNER IS A BUNDLE OF BLACK RODS WITH RUSTY MARKS ON THEIR ENDS. A LARGE NUMBER OF VELVET PILLOWS ARE SCATTERED ABOUT ON THE FLOOR. A VAST MIRROR STRETCHES OFF TO THE NORTHEAST. AT YOUR FEET IS A LARGE STEEL GRATE, NEXT TO WHICH IS A SIGN WHICH READS, 'TRVE A SIZABLE PASSAGE YOU ARE IN A SECRET CANYON AT A JUNCTION OF THREE CANYONS, BEARING NORTH, SOUTH, AND SE. THE NORTH ONE IS AS TALL AS THE OTHER TWO COMBIND. YOU ARE IN A LARGE LOW ROOM. CRAWLS LEAD NORTH SE, AN SW. DEAD END CRAL. YOU ARE IN A SECRET CANYON WHICH HERE RUNS E/W. IT CROSSES OVER A VERY TIGHT CANYON 15 FEET BELOW. IF YOU GO DOWN YOU MAY NOT BE ABLE TO GET BACK UP YOU ARE AT A WIDE PLACE IN A VERY TIGHT N/S CANYN. THE CANYON HERE BECOMES TOO TIGHT TO GO FURTHER OUTH.YOU ARE IN A TALL E/W CANYON. A LOW TIGHT CRAWL GOES 3 FEET NORTH AND SEEMS TO OPENUP. THE CANYON RUNS INTO A MASS OF BOULDERS -- DEAD ND. THE STREAM FLOWS OUT THROUGH A PAIR OF 1 FOOT DIAMETER SEWER PIPES. IT WOULD BE ADVISABLE TO USE THE XIT. YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE DEAD ED. DEAD ED. YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE DEAD ED. DEAD ED. YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE YOU ARE IN A LONG, NARROW CORRIDOR STRETCHING OUT OF SIGHT TO THE WEST. AT THE EASTERN END IS A WHOLE THROUGH WHICH YOU CAN SEE A PROFUSION OF LEAVES THERE IS NOTHING HERE TO CLIMB. USE 'UP' OR 'OUT' TO LEAVE THE PI. YOU HAVE CLIMBED UP THE PLANT AND OUT OF THE PIT YOU ARE AT THE TOP OF A STEEP INCLINE ABOVE A LARGE ROOM. YOU COULD CLIMB DOWN HERE, BUT YOU WOULD NOT BE ABLE TO CLIMB UP. THERE IS A PASSAGE LEADING BACK TO THE NORH. YOU ARE IN THE GIANT ROOM. THE CEILING HERE IS TOO HIGH UP FOR YOUR LAMP TO SHOW IT. CAVERNOUS PASSAGES LEAD EAST, NORTH, AND SOUTH. ON THE WEST WALL IS SCRAWLED THE INSCRIPTION, 'FEE FIE FOE FOO' (SIC. THE PASSAGE HERE IS BLOCKED BY A RECENT CAE-IN.YOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASAGE. YOU ARE IN A MAGNIFICIENT CAVERN WITH A RUSHING STREAM, WHICH CASCADES OVER A SPARKLING WATERFALL INTO A ROARING WHIRLPOOL WHICH DISAPEARS THROUGH A HOLE IN THE FLOOR. PASSAGES EXIT TO THE SOUTH AND WEST YOU ARE IN THE SOFT ROOM. THE WALLS ARE COVERED WITH HEAVY CURTAINS, THE FLOOR WITH A THICK PILE CARPET. MOSS COVERS THE CEIING. THIS THE ORIENTAL ROOM. ANCIENT ORIENTAL CAVE DRAWINGS COVER THE WALLS. A GENTLY SLOPING PASSAGE LEADS UPWARD TO THE NORTH, ANOTHER PASSAGE LEADS SE, AND A HANDS AND KNEES CRAWL LEADS EST. YOU ARE FOLLOWING A WIDE PATH AROUND THE OUTER EDGE OF A LARGE CAVERN. FAR BELOW, THROUGH A HEAVY WHITE MIST, STRANGE SPLASHING NOISES CAN BE HEARD. THE MIST RISES UP THROUGH A FISSURE IN THE CEILING. THE PATH EXITS TO THE SOUTH AND WEST YOU ARE IN AN ALCOVE. A SMALL NW PATH SEEMS TO WIDEN AFTER A SHORT DISTANCE. AN EXTREMLY TIGHT TUNNEL LEADS EAST. IT LOOKS LIKE A VERY TIGHT SQUEEZE. AN EERIE LIGHT CAN BE SEEN AT THE OTHE END.YOU'RE IN A SMALL CHAMBER LIT BY AN EERIE GREEN LIGHT. AN EXTREMELY NARROW TUNNEL EXITS TO THE WEST. A DARK CORRIDOR LEADS N. YOU'RE IN THE DARK-ROOM. A CORRIDOR LEADING SOUTH IS THE ONLY EXI. YOU ARE IN AN ARCHED HALL. A CORAL PASSAGE ONCE CONTUINED UP AND EAST FROM HERE, BUT IS NOW BLOCKED BY DEBRIS. THE AIR SMELLS OF SEA WATR. YOU'RE IN A LARGE ROOM CARVED OUT OF SEDIMENTARY ROCK. THE FLOOR AND WALLS ARE LITTERED WITH BITS OF SHELLS IMBEDDED IN THE STONE. A SHALLOW PASSAGE PROCEEDS DOWNWARD, AND A SOMEWHAT STEEPER ONE LEADS UP. A LOW HANDS AND KNEES PASSAGE ENTERS FROM THE SOUT. YOU ARE IN A LONG SLOPING CORRIDOR WITH RAGGED SHARP WLLS. YOU ARE IN A CUL-DE-SAC ABOUT EIGHT FEET AROSS.YOU ARE IN AN ANTEROOM LEADING TO A LARGE PASSAGE TO THE EAST. SMALL PASSAGES GO WEST AND UP. THE REMNANTS OF RECENT DIGGING ARE EVIDENT. A SIGN IN MIDAIR HERE SAYS 'CAVE UNDER CONSTRUCTION BEYOND THIS POINT. PROCEED AT OWN RISK. (WITT CONSTRUCTION COMPAY)' YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL DIFFEENT. YOU ARE AT WITT'S END. PASSAGES LEAD OFF IN *ALL* DIRECTION. YOU ARE IN A NORTH/SOUTH CANYON ABOUT 25 FEET ACROSS. THE FLOOR IS COVERED BY WHITE MIST SEEPING IN FROM THE NORTH. THE WALLS EXTEND UPWARD FOR WELL OVER 100 FEET. SUSPENDED FROM SOME UNSEEN POINT FAR ABOVE YOU, AN ENORMOUS TWO-SIDED MIRROR IS HANGING PARALLEL TO AND MIDWAY BETWEEN THE CANYON WALLS. (THE MIRROR IS OBVIOUSLY PROVIDED FOR THE USE OF THE DWARVES, WHO AS YOU KNOW, ARE EXTREMELY VAIN.) A SMALL WINDOW CAN BE SEEN IN EITHER WALL, SOME FIFTY FET UP.YOU'R AT A LOW WINDOW OVERLOOKING A HUGE PIT, WHICH EXTENDS UP OUT OF SIGHT. A FLOOR IS INDISTINCTLY VISIBLE OVER 50 FEET BELOW. TRACES OF WHITE MIST COVER THE FLOOR OF THE PIT, BECOMING THICKER TO THE LEFT. MARKS IN THE DUST AROUND THE WINDOW WOULD SEEM TO INDICATE THAT SOMEONE HAS BEEN HERE RECENTLY. DIRECTLY ACROSS THE PIT FROM YOU AND 25 FEET AWAY THERE IS A SIMILAR WINDOW LOOKING INTO A LIGHTED ROOM. A SHADOWY FIGURE CAN BE SEEN PEERING BACK AT YOU A LARGE STALACTITE EXTENDS FROM THE ROOF AND ALMOST REACHES THE FLOOR BELOW. YOU COULD CLIMB DOWN IT, AND JUMP FROM IT TO THE FLOOR,BUT HAVING DONE SO YOU WOULD BE UNABLE TO REACH IT TO CLIMB BACK P. YOU ARE IN A LITTLE MAZE OF TWISTING PASSAGES, ALL DIFFERENT YOU ARF U'RE ON NE SIDE OF CHAM. YOU'RE IN CORRIDOR YOU'RE AT FORK IN ATH. YOU'RE AT JUNCTION WITH WARM WLLS. YOU'RE AT BREATH TAKING IEW. YOU'RE IN CHAMBER OF BOUDERS.YOU'RE IN LIMESTONE PASSGE. YOU'RE IN FRONT OF BARREN ROOM YOU'RE IN BARREN ROM. SET OFKEYS THERE ARE SOME KEYS ON THE GROUND HEE. BRASS LANTER THERE IS A SHINY BRASS LAMP NERBY. THERE IS A LAMP SHINING NEARBY GRATETHE GRATE IS LOCKE. THE GRATE ISOPEN.WICKERCAGE THERE IS A SMALL WICKER CAGE DISCARDED NEABY. BLACK OD A THREE FOOT BLACK ROD WITH A RUSTY STAR ON AN END LIES NEARY. BLACK OD A THREE FOOT BLACK ROD WITH A RUSTY MARK ON AN END LIES NEARY. STEPSROUGH STONE STEPS LEAD DOWN TH PIT.ROUGH STONE STEPS LEAD UP THE OME. LITTLE BIRD IN CAG  A CHEERFUL LITTLE BIRD IS SITTING HERE SINING. THERE IS A LITTLE BIRD IN THE AGE. *RUSTYDOOR THE WAY NORTH IS BARRED BY A MASSIVE, RUSTY, IRON DOOR THE WAY NORTH LEADS THROUGH A MASSIVE, RUSTY, IRON DOO. VELVET PILLO A VELVET PILLOW LIES ON THE FLOR. SNAKEA HUGE GREEN FIERCE SNAKE BARS THE WY. *FISSUE A CRYSTAL BRIDGE NOW SPANS THE FISSUE. THE CRYSTAL BRIDGE HAS VANISHE. *STONE TABLE A MASSIVE STONE TABLET IMBEDDED IN THE WALL READS 'CONGRATULATIONS ON BRINGING LIGHT INTO THE DARK-ROO. GIANT CLAM >GRUNT. THERE IS AN ENORMOUS CLAM HERE WITH ITS SHELL TIGHTLY CLOSED GIANT OYSTER >GROA<. THERE IS AN ENORMOUS OYSTER HERE WITH ITS SHELL TIGHTLY CLOSD. INTERESTING. THERE SEEMS TO BE SOMETHEASURE VAULT. KEYS IN MAIN OFFCE.' YOU ARE ON ONE SIDE OF A LARGE, DEEP CHASM. A HEAVY WHITE MIST RISING UP FROM BELOW OBSCURES ALL VIEW OF THE FAR SIDE. A SW PATH LEADS AWAY FROM THE CHASM INTO A WINDING CORRIDOR YOU ARE IN A LONG WINDING CORRIDOR SLOPING OUT OF SIGHT IN BOTH DIRECTIOS. YOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST YOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST YOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST YOU ARE ON THE FAR SIDE OF THE CHASM. A NE PATH LEADS AWAY FROM THE CHASM ON THIS SDE. YOU'RE IN A LONG EAST/WEST CORRIDOR. A FAINT RUMBLING NOISE CAN BE HEARD IN THE DISANCE.THE PATH FORKS HERE. THE LEFT FORK LEADS NORTHEAST. A DULL RUMBLING SEEMS TO GET LOUDER IN THAT DIRECTION. THE RIGHT FORK LEADS SOUTHEAST DOWN A GENTLE SLOPE. THE MAIN CORRIDOR ENTERS FROM THE WST. THE WALLS ARE QUITE WARM HERE. FROM THE NORTH CAN BE HEARD A STEADY ROAR, SO LOUD THAT THE ENTIRE CAVE SEEMS TO BE TREMBLING. ANOTHER PASSAGE LEADS SOUTH, AND A LOW CRAWL GOES EAT. YOU ARE ON THE EDGE OF A BREATH TAKING VIEW. FAR BELOW YOU IS AN ACTIVE VOLCANO, FROM WHICH GREAT GOUTS OF MOULTEN LAVA COME SURGING OUT, CASCADING BACK DOWN INTO THE DEPTHS. THE GLOWING ROCK FILLS THE FARTHEST REACHES OF THE CAVERN WITH A BLOOD-RED GLARE, GIVING EVERYTHING AN EERIE, MACABRE APPEARANCE. THE AIR IS FILLED WITH FLICKERING SPARKS OF ASH AND A HEAVY SMELL OF BRIMSTONE. THE WALLS ARE HOT TO THE TOUCH, AND THE THUNDERING OF THE VOLCANO DROWNS OUT ALL OTHER SOUNDS. EMBEDDED IN THE JAGGED ROOF FAR OVERHEAD ARE MYRIAD TWISTED FORMATIONS COMPOSED OF PURE WHITE ALABASTER, WHICH SCATTER THE MURKY LIGHT INTO SINISTER APPARITIONS UPON THE WALLS. TO ONE SIDE IS A DEEP GORGE, FILLED WITH A BIZARRE CHAOS OF TORTURED ROCK WHICH SEEMS TO HAVE BEEN CRAFTED BY THE DEVIL HIMSELF. AN IMMENSE RIVER OF FIRE CRASHES OUT FROM THE DEPTHS OF THE VOLCANO, BURNS ITS WAY THROUGH THE GORGE, AND PLUMMETS INTO A BOTTOMLESS PIT FAR OFF TO YOUR LEFT. TO THE RIGHT, AN IMMENSE GEYSER OF BLISTERING STEAM ERUPTS CONTINUOUSLY FROM A BARREN ISLAND IN THE CENTER OF A SULPHOROUS LAKE, WHICH BUBBLES OMINOUSLY. THE FAR RIGHT WALL IS AFLAME WITH AN INCANDESCENCE OF ITS OWN, WHICH LENDS AN ADDITIONAL INFERNAL SPLENDOR TO THE ALREADY HELLISH SCENE. A DARK FOREBODING PASSAGE EXITS TO THE SOUTH YOU ARE IN A SMALL CHAMBER FILLED WITH LARGE BOULDERS. THE WALLS ARE VERY WARM, CAUSING THE AIR IN THE ROOM TO BE ALMOST STIFLING FROM THE HEAT. THE ONLY EXIT IS A CRAWL HEADING WEST, THROUGH WHICH IS COMING LOW RUMBLING YOU ARE WALKING ALONG A GENTLY SLOPING NORTH/SOUTH PASSAGE LINED WITH ODDLY SHAPED LIMESTONE FORMATION. YOU ARE STANDING AT THE ENTRANCE TO A LARGE, BARREN ROOM. A SIGN POSTED ABOVE THE ENTRANCE READS 'CAUTION. BEAR IN ROO.' YOU ARE IN A BARREN ROOM. THE CENTER OF THE ROOM IS COMPLETELY EMPTY EXCEPT FOR SOME DUST. MARKS IN THE DUST LEAD AWAY TOWARD THE FAR END OF THE ROOM. THE ONLY EXIT IS THE WAY YOU CAM IN. YOU ARE IN A MAZE OF TWISTING LITTLE PASSAGES, ALL DIFFERENT YOU ARE IN A LITTLE MAZE OF TWISTY PASSAGES, ALL DIFFEENT. YOU ARE IN A TWISTING MAZE OF LITTLE PASSAGES, ALL DIFFERENT YOU ARE IN A TWISTING LITTLE MAZE OF PASSAGES, ALL DIFFERENT YOU ARE IN A TWISTY LITTLE MAZE OF PASSAGES, ALL DIFFEENT. YOU ARE IN A TWISTY MAZE OF LITTLE PASSAGES, ALL DIFFEENT. YOU ARE IN A LITTLE TWISTY MAZE OF PASSAGES, ALL DIFFEENT. YOU ARE IN A MAZE OF LITTLE TWISTING PASSAGES, ALL DIFFERENT YOU ARE IN A MAZE OF LITTLE TWISTY PASSAGES, ALL DIFFEENT. DEAD ED. YOU'RE AT END OF ROAD AGIN. YOU'RE AT HILL IN OAD. YOU'RE INSIDE BUILING. YOU'RE IN VALEY. YOU'RE IN FOEST. YOU'RE IN FOEST. YOU'RE AT SLIT IN STREAMED. YOU'RE OUTSIDE GRAE. YOU'RE BELOW THE GATE. YOU'RE IN COBBLE CAWL. YOU'RE IN DEBRIS ROM. YOU'RE IN BIRD CHABER. YOU'RE AT TOP OF SMALL PT. YOU'RE IN HALL OF ISTS.YOU'RE ON EAST BANK OF FISSURE YOU'RE IN NUGGET OF GOLDROOM.YOU'RE IN HALL OF MT KIN. YOU'RE AT WEST END OF TWOPIT ROM. YOU'RE IN EAST PIT YOU'RE IN WEST PIT YOU'RE AT 'Y'. YOU'RE AT WINDOW O PIT.YOU'RE IN DIRTY PASAGE.YOU'RE IN DUSTY ROCK ROO. YOU'RE AT WEST END OF HALL OF ISTS.YOU'RE AT BRINK OFPIT. YOU'RE AT EAST END OF LONG HAL. YOU'RE AT WEST END OF LONG HAL. YOU'RE AT COMPLEX JUNCTIN. YOU'RE IN SWISS CHEESE ROM. YOU'RE AT EAST END OF TWOPIT ROM. YOU'RE IN SLAB ROO. YOU'RE AT JUNCTION OF THREE SECRET CANYONS YOU'RE IN SECRET E/W CANYON ABOVE TIGHT CAYON. YOU'RE IN NARROW CORRIDO. YOU'RE AT STEEP INCLINE ABOVE LARGE OOM. YOU'RE IN GIANT ROM. YOU'RE IN CAVERN WITH WATERFAL. YOU'RE IN SOFT ROO. YOU'RE IN ORIENTALROOM.YOU'RE IN MISTY CAERN. YOU'RE IN ALOVE. YOU'RE IN PLOVER ROM. YOU'RE IN DARK ROO. YOU'RE IN ARCHED HLL. YOU'RE IN SHELL ROM. YOU'RE IN ANTEROOM YOU'RE AT WITT'S ED. YOU'RE IN MIRROR CNYON.YOU'RE AT WINDOW O PIT.YOU'RE AT TOP OF STALACTTE. YOU'RE AT RESERVOI. YOU'RE AT NEEND. YOU'RE AT SWEND. YOU'RE ON SW SIDE OF CHAM. YOU'RE IN SLOPING CORRIDR. YOG  THE BIRD IS FRIGHTENED NOW AND YOU CANNOT CATCH IT NO MATTER WHAT YOU TRY. PERHAPS YOU MIGHT TRY LATE. ARE YOU TRYING TO SOMEHOW DEAL WITH THE SNKE? YOU CAN'T KILL THE SNAKE, OR DRIVE IT AWAY, OR AVOID IT, OR ANYTHING LIKE THAT. THERE IS A WAY TO GET BY, BUT YOU DON'T HAVE THE NECESSARY RESOURCES RIGHT OW. DO YOU REALLY WANT TO QUIT NOW YOU FELL INTO A PIT AND BROKE EVERY BONE IN YOURBODY.YOU ARE ALREADY CARRYINGIT. YOU CAN'T BE SERIOS. THE BIRD WAS UNAFRAID WHEN YOU ENTERED, BUT AS YOU APPROACH IT BECOMES DISTURBED AND YOU CAN'T CATCH I. YOU CAN CATCH THE BIRD, BUT YOU CANNOT CARY IT.THERE IS NOTHING HERE WITH A LCK. YOU AREN'T CARRYIN IT. THE LITTLE BIRD ATTACKS THE GREEN SNAKE, AND IN AN ASTOUNDING FLURRY DRIVES THE SNAKE AWAY YOU HAVE NO EYS. IT HAS NO LOK. I DON'T KNOW HOW TO LOCK OR UNLOCK SUCH A HING.IT WAS ALREADY LOCED. THE GRATE IS NOW LCKED.THE GRATE IS NOW UNLOCKE. IT WAS ALREADY UNLCKED.YOU HAVE NO SOURCE OF LIHT. YOUR LAMP IS NOW O. YOUR LAMP IS NOW OF. THERE IS NO WAY TO GET PAST THE BEAR TO UNLOCK THE CHAIN, WHICH IS PROBABLY JUST AS ELL. NOTHING HAPPNS. HERE?THERE IS NOTHING HERE TO ATTAC. THE LITTLE BIRD IS NOW DEAD. ITS BODY DISAPPEAR. ATTACKING THE SNAKE BOTH DOESN'T WORK AND IS VERY DANGROUS.YOU KILLED A LITTLE DWAR. YOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WA. WITH WHAT? YOUR BARE HADS? GOOD TRY, BUT THAT IS AN OLD WORN OUT MAGIC WORD I KNOW OF PLACES, ACTIONS, AND THINGS. MOST OF MY VOCABULING WRITTEN ON THE UNDERSIDE OF THE OYSTR. 'SPELUNKER TDAY' THERE ARE A FEW RECENT ISSUES OF 'SPELUNKER TODAY' MAGAZINE ERE. TASTY OOD THERE IS FOOD HERE SMALL OTTLETHERE IS A BOTTLE OF WATER HER. THERE IN AN EMPTY BOTTLEHERE.THERE IS A BOTTLE OF OILHERE.WATER IN THE BOTTL OIL IN THE BTTLE IRROR LANT THERE IS A TINY LITTLE PLANT IN THE PIT, MURMURMING WATER, WATER,.. THE PLANT SPURTS INTO FURIOUS GROWTH FOR A FEW SECONDS THERE IS A TWELVE FOOT TALL BEANSTALK STRETCHING UP OUT OF THE PIT, BELLOWING WATER!! WATE!! THE PLANT GROWS EXPLOSIVELY, ALMOST FILLING THE BOTTOM OF TH PIT.THERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOL. YOU'VE OVER WATERED THE PLANT. IT'S SHIRVELING UP. IT'S, I'S...*PHONYPLANT THE TOP OF A TWELVE FOOT TALL BEANSTALK IS POKING OUT OF THE WEST IT. THERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOE. *STALATITE *SHADOWY FIGRE THE SHADOWY FIGURE SEEMS TO BE TRYING TO ATTRACT YOUR ATTENTON. DWARF' AXE THERE IS A LITTLE AXE HEE. THERE IS A LITTLE AXE LYING BESIDE THE BEA. *CAVE DRAWINS *PIRAT *DRAGO A HUGE GREEN DRAGON BARS THE WY. CONGRATULATIONS. YOU HAVE JUST VANQUISHED A DRAGON WITH YOUR BARE HANDS. (UNBELIEVABLE, ISN'T T?) THE BODY OF A HUGE GREEN DEAD DRAGON IS LYING OFF TO ONE SID. CHASMA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE MIST ON THE OTHER SIDE. A SIGN POSTED ON THE BRIDGE READS, 'STOP. PAY TROL.' THE WRECKAGE OF A BRIDGE (AND A DEAD BEAR) CAN BE SEEN AT THE BOTTOM OF THE CHSM. TROLLA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS THAT YOU THROW HIM A TREASURE BEFORE YOU MAY CROS. THE TROLL STEPS OUT FROM BENEATH THE BRIDGE AND BLOCKS YOUR AY.  *PHONYTROLLTHE TROLL IS NOWHERE TO BE SEE. THERE IS A FEROCIOUS CAVE BEAR EYING YOU FROM THE FAR END OF THE ROM. THERE IS A GENTLE CAVE BEAR SITTING PLACIDLY IN ONE CONER. THERE IS A CONTENTED LOOKING BEAR WANDERING ABOUT NEARY.  *2ND MAZE MS THERE IS A MESSAGE SCRAWLED IN THE DUST IN A FLOWERY SCRIPT, READING 'THIS IS NOT THE MAZE WHERE THE PIRATE LEAVES HIS TREASURE CHES'. *VOLCAO *VENDING MACINE THERE IS A MASSIVE VENDING MACHINE HERE. THE INSTRUCTIONS ON IT READ 'DROP COINS HERE TO RECEIVE FRESH BATTERIES' BATTERES THERE ARE FRESH BATTERIES HERE SOME WORN OUT BATTERIES HAVE BEEN DISCARDED NEARY. *CARPE/MOSS LARGE GOLD NGGET THERE IS A LARGE SPARKLING NUGGET OF GOLD ERE! SEVERAL DIAMNDS THERE ARE DIAMONDSHERE!BARS OF SILVR THERE ARE BARS OF SILVERHERE!PRECIOUS JEWLRY THERE IS PRECIOUS JEWELRY HERE RARE CINS THERE ARE MANY COINS HER! TREASURE CHET THE PIRATE'S TREASURE CHEST ISHERE!GOLDENEGGS THERE IS A LARGE NEST HERE, FULL OF GOLDENEGGS!THE NEST OF GOLDEN EGGS HAS VANISHED ONE. JEWELED TRIDNT THERE IS A JEWEL ENCRUSTED TRIDENT HRE! MING VSE THERE IS A DELICATE, PRECIOUS MING VASE HEE! THE VASE IS NOW RESTING, DELICATLY, ON A VELVET PILLOW  THE FLOOR IS LITTERED WITH WORTHLESS SHARDS OF POTTERY THE MING VASE DROPS WITH A DELICATE RASH.EGG SIZED EMRALD THERE IS A EMERALD HERE THE SIZE OF A PLOVER'S EG! PLATINUM PYRMID THERE IS A PLATINUM PYRAMID HERE, 8 INCHES ON A IDE! GLISTENING PARL OFF TO ONE SIDE LIES A GLISTENING PERL! PERSIA RUG THERE IS A PERSIAN RUG SPREAD OUT ON THE FOOR! THE DRAGON IS SPRAWLED OUT ON A PERSIAN RU. RARE SICES THERE ARE RARE SPICES HEE! GOLDENCHAINTHERE IS A GOLDEN CHAIN LYING IN A HEAP ON THE FOOR. THE BEAR IS LOCKED TO THE WALL WITH A GOLDEN CHAN. THERE IS A GOLDEN CHAIN LOCKED TO THE WALL SOMEWHERE NEARBY IS COLOSSAL CAVE, WHERE OTHERS HAVE FOUND FORTUNES IN TREASURE AND GOLD, THOUGH IT IS RUMORED THAT SOME WHO ENTER ARE NEVER SEEN AGAIN. MAGIC IS SAID TO WORK IN THE CAVE. I WILL BE YOUR EYES AND HANDS. DIRECT ME WITH COMMANDS OF ONE OR TWO WORDS. I SHOULD WARN YOU THAT I LOOK AT ONLY THE FIRST FIVE LETTERS OF EACH WORD, SO THAT YOU'LL HAVE TO ENTER 'NORTHEAST' AS 'NE' TO DISTINGUISH IT FROM 'NORTH'. (SHOULD YOU GET STUCK, TYPE 'HELP' FOR SOME GENERAL HINS. A LITTLE DWARF WITH A BIG KNIFE BLOCKS YOU WAY.A LITTLE DWARF JUST WALKED AROUND A CORNER, SAW YOU, THREW A LITTLE AXE AT YOU WHICH MISSED, CURSED, AND RANAWAY.THERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YU. ONE SHARP NASTY KNIFE IS THROWN AT YU. NONE OF THEM HIT YU. ONE OF THEM GETS YU. A HOLLOW VOICE SAYS 'PLUH'. THERE IS NO WAY TO GO IN THAT DIRECTON. I AM UNSURE HOW YOU ARE FACING. USE COMPASS POINTS OR NEARBY OBJETS. I DON'T KNOW IN FROM OUT HERE. USE COMPASS POINTS OR NAME SOMETHING IN THE GENERAL DIRECTION YOU WANT TO GO I DON'T KNOW HOW TO APPLY THAT WORD ERE. I DON'T UNDERSTANDTHAT.I'M GAME. WOULD YOU CARE TO EXPLAINHOW? SORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL. I WILL REPEAT THE LONG DESCRIPTION OF YOUR LOCTION.IT IS NOW PITCH DARK. IF YOU PROCEED YOU WILL LIKELY FALL INTO A IT. IF YOU PREFER, SIMPLY TYPE W RATHER THAN WST. ARE YOU TRYING TO CATCH THE BID? H FREED UP THE HINGES SO THAT THE DOOR WILL NOW MOVE, THOUGH IT REQUIRES SOME EFORT. THE PLANT HAS EXCEPTIONLY DEEP ROOTS AND CANNOT BE PULLED FRE. THE DWARVE'S KNIVES VANISH AS THEY STRIKE THE WALLS OF THE CVE. SOMETHING YOU'RE CARRYING WON'T FIT THROUGH THE TUNNEL WITH YOU. YOU'D BEST TAKE INVENTORY AND DROP SOMETHIG. YOU CAN'T FIT THIS FIVE-FOOT CLAM THROUGH THAT LITTLE PASSAG. YOU CAN'T FIT THIS FIVE-FOOT OYSTER THROUGH THAT LITTLE PASSGE. I ADVISE YOU TO PUT DOWN THE CLAM BEFORE OPENING IT. (STRAIN. I ADVISE YOU TO PUT DOWN THE OYSTER BEFORE OPENING IT. (WRENH). YOU DON'T HAVE ANYTHING STRONG ENOUGH TO OPEN THE CLAM YOU DON'T HAVE ANYTHING STRONG ENOUGH TO OPEN THE OYSTR. A GLISTENING PEARL FALLS OUT OF THE CLAM AND ROLLS AWAY. GOODNESS, THIS MUST REALLY BE AN OYSTER. (I NEVER WAS ANY GOOD AT IDENTIFYING BIVALVES.) WHATEVER IT IS, IT HAS NOW SNAPPED SHUT AGAN. THE OYSTER CREAKS OPEN, REVEALING NOTHING BUT OYSTER INSIDE. IT PROMPTLY SNAPS SHUT AGAIN YOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND FOUND YOUR WAY BLOCKED BY A RECENT CAVE-IN. YOU ARE NOW IN THE MAIN PASAGE.THERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS BEHIND YOU OUT FROM THE SHADOWS BEHIND YOU POUNCES A BEARDED PIRATE. 'HAR, HAR' HE CHORTLES, 'I'LL JUST TAKE ALL THIS BOOTY AND HIDE IT AWAY WITH ME CHEST DEEP IN THE MAZE.' HE SNATCHES YOUR TREASURE AND VANISHES INTO THE GLOO. A SEPUCHRAL VOICE REVERBRATING THROUGH THE CAVE, SAYS, 'CAVE CLOSING SOON. ALL ADVENTURERS EXIT THROUGH MAIN OFFIARY DESCRIBES PLACES AND IS USED TO MOVE YOU THERE. TO MOVE, TRY WORDS LIKE FOREST, BUILDING, DOWNSTREAM, ENTER, EAST, WEST, NORTH, SOUTH, UP, OR DOWN. I KNOW ABOUT A FEW SPECIAL OBJECTS, LIKE A BLACK ROD HIDDEN IN THE CAVE. THESE OBJECTS CAN BE MANIPULATED USING SOME OF THE ACTION WORDS THAT I KNOW. USUALLY YOU WILL NEED TO GIVE BOTH THE OBJECT AND ACTION WORD (IN EITHER ORDER), BUT SOMETIMES I CAN INFER THE OBJECT FROM THE VERB ALONE. SOME OBJECTS ALSO IMPLY VERBS; IN PARTICULAR, 'INVENTORY' IMPLIES 'TAKE INVENTORY', WHICH CAUSES ME TO GIVE YOU A LIST OF WHAT YOU ARE CARRYING. THE OBJECTS HAVE SIDE EFFECTS; FOR INSTANCE, THE ROD SCARES THE BIRD. USUALLY PEOPLE HAVING TROUBLE MOVING JUST NEED TO TRY A FEW MORE WORDS. USUALLY PEOPLE TRYING UNSUCCESFULLY TO MANIPULATE AN OBJECT ARE ATTEMPTING SOMETHING BEYOND THEIR (OR MY) CAPABILITIES AND SHOULD TRY A COMPLETELY DIFFERENT TACK. TO SPEED THE GAME YOU CAN SOMETIMES MOVE LONG DISTANCES WITH A SINGLE WORD. FOR EXAMPLE, 'BUILDING' USUALLY GETS YOU TO THE BUILDING FROM ANYWHERE ABOVE GROUND EXCEPT WHEN LOST IN THE FOREST. ALSO, NOTE THAT CAVE PASSAGES TURN A LOT, AND THAT LEAVING A ROOM TO THE NORTH DOES NOT GUARANTEE ENTERING THE NEXT ROOM FROM THE SOUTH. GOOD LCK. IT MISES. IT GET YOU.K YOU CAN'T UNLOCK THE KEY. YOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE MAIN PASAGE. I DON'T KNOW WHERE THE CAVE IS, BUT HEREABOUTS NO STREAM CAN RUN ON THE SURFACE FOR LONG. I WOULD TRY THE SREAM.I NEED MORE DETAILED INSTRUCTIONS TO DO THT. I CAN ONLY TELL YOU WHAT YOU SEE AS YOU MOVE ABOUT AND MANIPULATE THINGS. I CANNOT TELL YOU WHERE REMOTE THINGS AE. I DON'T KNOW THAT ORD. HAT? ARE YOU TRYING TO GET INTO THECAVE?THE GRATE IS VERY SOLID AND HAS A HARDENED STEEL LOCK. YOU CANNOT ENTER WITHOUT A KEY, AND THERE ARE NO KEYS NEARBY. I WOULD RECOMMEND LOOKING ELSEWHERE FOR THEKEYS.THE TREES OF THE FOREST ARE LARGE HARDWOOD OAK AND MAPLE, WITH AN OCCASIONAL GROVE OF PINE OR SPRUCE. THERE IS QUITE A BIT OF UNDER GROWTH, LARGLY BIRCH AND ASH SAPLINGS PLUS NON DESCRIPT BUSHES OF VARIOUS SORTS. THIS TIME OF YEAR VISIBILITY IS QUITE RESTRICTED BY ALL THE LEAVES, BUT TRAVEL IS QUITE EASY IF YOU DETOUR AROUND THE SPRUCE AND BERRY BUSHS. WELCOME TO ADVENTURE... WOULD YOU LIKE INSTRUCTINS? DIGGING WITHOUT A SHOVEL IS QUITE IMPRACTICAL. EVEN WITH A SHOVEL PROGRESS IS UNLIKLY. BLASTING REQUIRES DYNAMIE. I'M AS CONFUSED AS YOU AE. MIST IS A WHITE VAPOR, USUALLY WATER, SEEN FROM TIME TO TIME IN CAVERNS. IT CAN BE FOUND ANYWHERE, BUT IS FREQUENTLY A SIGN OF A DEEP PIT LEADING DOWN TO WTER. YOUR FEET ARE NOW ET. I THINK I JUST LOST MY APPETIT. THANK YOU, IT WAS DELICIUS. YOU HAVE TAKEN A DRINK FROM THE STREAM. THE WATER TASTES STRONGLY OF MINERALS, BUT IS NOT UNPLEASANT. IT IS EXTREMELY OLD. THE BOTTLE OF WATER IS NOW EMPY. IT'S AN ELECTRIC LAMP AND RUBBING IT IS NOT PARTICULARLY REWARDING. ANYWAY, NOTHING HAPPES. PECULIAR. NOTHING UNEXPECTED HAPPEN. YOUR BOTTLE IS EMPTY AND THE GROUND AT YOUR FEET IS WE. YOU CAN'T POUR THA. FUCK YOURSELF! KEEP THAT UP AND YOU'RE ON YOUR WN. WHICH AY? OH DEAR, YOU SEEM TO HAVE GOTTEN YOURSELF KILLED. I MIGHT BE ABLE TO HELP YOU OUT, BUT I'VE NEVER REALLY DONE THIS KIND OF THING BEFORE. DO YOU WANT ME TO TRY TO REINCARNAT YOU?ALL RIGHT. BUT DON'T BLAME ME IF SOMETHING GOES WR..... YOU ARE ENGULFED IN A CLOUD OF ORANGE SMOKE. COUGHING AND GASPING, YOU EMERGE FROM THE CLOUD AND FID....YOU CLUMSY OAF! YOU'VE DONE IT AGAIN. I DON'T KNOW HOW LONG I CAN KEEP THIS UP. DO YOU WANT ME TO TRY REINCARNATING YOU AGAN? OKAY, NOW WHERE DID I PUT MY ORANGE SMOKE?.... >POOF< EVERYTHING DISAPPEARS IN A DENSE CLOUD OF ORANGE MOKE.NOW YOU'VE REALLY DONE IT. I'M OUT OF ORANGE SMOKE. YOU DON'T EXPECT ME TO DO A DECENT REINCARNATION WITHOUT ORANGE SMOKE, D YOU?OKAY, IF YOU'RE SO SMART DO IT YOURSELF. I'M LEVING.SORRY, BUT I NO LONGER SEEM TO REMEMBER HOW IT WAS YOU GOT HRE. YOU CAN'T CARRY ANYTHING MORE. YOU'LL HAVE TO DROP SOMETHING FIRS. YOU CAN'T GO THROUGH A LOCKED STEEL RATE.I BELIEVE WHAT YOU WANT IS RIGHT HERE WITHYOU. YOU DON'T FIT THROUGH A TWO-INCH SLI. I RESPECTFULLY SUGGEST YOU GO ACROSS THE BRIDGE INSTEAD OF JUMPING THERE IS NO WAY ACROSS THE FISURE. YOU'RE NOT CARRYING ANYTING. YOU ARE CURRENTLY HOLDING THE FOLLOWNG: IT'S NOT HUNGRY (IT'S MERELY PININ' FOR THE FJORDS). BESIDES, YOU HAVE NO BIRD SEED THE SNAKE HAS NOW DEVOURED YOUR BIRD THERE'S NOTHING HERE IT WANTS TO EAT (EXCEPT PERHAPS YU). FOOL, DWARVES EAT ONLY COAL. NOW YOU'VE MADE HIM *REALLY* MD. YOU HAVE NOTHING IN WHICH TO CARRY I. YOUR BOTTLE IS ALREADY FLL. THERE IS NOTHING HERE WITH WHICH TO FILL THE BOTLE. YOUR BOTTLE IS NOW FULL OF WATR. YOUR BOTTLE IS NOW FULL OF OIL YOU CAN'T FILL THA. DON'T BE RIDICULOU. THE DOOR IS EXTREMELY RUSTY AND REFUSES TOOPEN.THE PLANT INDIGNANTLY SHAKES THE OIL OFF ITS LEAVES AND ASKS, 'WATR'? THE HINGES ARE QUITE THROUGHLY RUSTED NOW AND WON'T BUGE. THE OIL HAS I E WHERE THE PIRATE LEAVES HIS CHES.' HMMM, THIS LOOKS LIKE A CLUE, WHICH MEANS IT'LL COST YOU TEN POINTS TO READ IT. SHOULD I GO AHEAD AND READ IT ANYAY? IT SAYS, 'THERE IS SOMETHING STRANGE ABOUT THIS PLACE, SUCH THAT ONE OF THE WORDS I'VE ALWAYS KNOWN NOW HAS A NEW EFFECT' IT SAYS THE SAME THING IT DID BEFORE I'M AFRAID I DON'T UNDERTAND.CONGRATULATIONS ON BRINGING LIGHT INTO THE DARK-OOM. YOU STRIKE THE MIRROR A RESOUNDING BLOW, WHEREUPON IT SHATTERS INTO A MYRIAD TINY FRAGMENT. YOU HAVE TAKEN THE VASE AND HURLED IT DELICATELY TO THE GROUD. YOU PROD THE NEAREST DWARF, WHO WAKES UP GRUMPILY, TAKES ONE LOOK AT YOU, CURSES, AND GRABS FOR HIS AX. IS THIS ACCEPTABLE ARE YOU RESUMING AN EARLIER ADVENTUR? YOU ARE OBVIOUSLY A RANK AMATEUR. BETTER LUCK NEXT TIE. YOUR SCORE QUALIFIES YOU AS A NOVICE ADVENURER.YOU HAVE ACHIEVED THE RATING: "EXPERIENCED ADVENTURER" YOU MAY NOW CONSIDER YOURSELF A "SEASONED ADVENTRER".YOU HAVE REACHED "JUNIOR MASTER" STAUS. YOUR SCORE PUTS YOU IN MASTER ADVENTURER CLASS C YOUR SCORE PUTS YOU IN MASTER ADVENTURER CLASS B YOUR SCORE PUTS YOU IN MASTER ADVENTURER CLASS A ALL OF ADVENTUREDOM GIVES TRIBUTE TO YOU, ADVENTURER GRANDMATER. EXTMSGE.' A MYSTERIOUS RECORDED VOICE GROANS INTO LIFE AND ANNOUNCES 'THIS EXIT IS CLOSED. PLEASE LEAVE VIA MAIN OFFIE'. IT LOOKS AS THOUGH YOU'RE DEAD. WELL, SEEING AS HOW IT'S SO CLOSE TO CLOSING TIME ANYWAY, I THINK I'LL JUST CALL IT A DY. THE SEPULCHRAL VOICE INTONES, 'THE CAVE IS NOW CLOSED.' AS THE ECHOES FADE, THERE IS A BLINDING FLASH OF LIGHT (AND A SMALL PUFF OF ORANGE SMOKE). AS YOUR EYES REFOCUS, YOU LOOK AROUND AND FIND... THERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE APPEARS IN THE FAR WALL, BURYING THE DWARVES IN THE RUBBLE. YOU MARCH THROUGH THE HOLE AND FIND YOURSELF IN THE MAIN OFFICE, WHERE A CHEERING BAND OF FRIENDLY ELVES CARRY THE CONQUERING ADVENTURER OFF INTO THE SUNET. THERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE APPEARS IN THE FAR WALL, BURYING THE SNAKES IN THE RUBBLE. A RIVER OF MOLTEN LAVA POURS IN THROUGH THE HOLE, DESTROYING EVERYTHING IN ITS PATH, INCLUDINGYOU. THERE IS A LOUD EXPLOSION, AND YOU ARE SUDDENLY SPLASHED ACROSS THE WALLS OF THE ROO. THE RESULTING RUCKUS HAS AWAKENED THE DWARVES. THERE ARE NOW SEVERAL THREATENING LITTLE DWARVES IN THE ROOM WITH YOU. MOST OF THEM THROW KNIVES AT YOU. ALL OF THEM GET YOU OH, LEAVE THE POOR UNHAPPY BIRD ALON. I DARESAY WHATEVER YOU WANT IS AROUND HERE SOMEWERE. I DON'T KNOW THE WORD 'STOP'. USE QUIT' IF YOU WANT TO GIVEUP. YOU CAN'T GET THERE FROMHERE.YOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEA. DO YOU INDEED WISH TO QUIT NOW THERE IS NOTHING HERE WITH WHICH TO FILL THE VAS. THE SUDDEN CHANGE IN TEMPERATURE HAS DELICATELY SHATTERED THE VASE IT IS BEYOND YOUR POWER TO DO HAT. I DON'T KNOWHOW. IT IS TOO FAR UP FOR YOU TO RECH. YOU KILLED A LITTLE DWARF. THE BODY VANISHES IN A CLOUD OF GREASY BLACK SMOKE THE SHELL IS VERY STRONG AND IS IMPERVIOUS TO ATACK. WHAT'S THE MATTER, CAN'T YOU READ? NOW YOU'D BEST START OVE. THE AXE BOUNCES HARMLESSLY OFF THE DRAGON'S THICK SCALS. THE DRAGON LOOKS RATHER NASTY. YOU'D BEST NOT TRY TO GET BY THE LITTLE BIRD ATTACKS THE GREEN DRAGON AND IN AN ASTOUNDING FLURRY GETS BURNT TO A CINDER. THE ASHES BLOWAWAY.ON WHA? OKAY, FROM NOW ON I'LL ONLY DESCRIBE A PLACE IN FULL THE FIRST TIME YOU COME TO IT. TO GET THE FULL DESCRIPTION, SAY 'LOK'. TROLLS ARE CLOSE RELATIVES WITH THE ROCK AND HAVE SKIN AS TOUGH AS THAT OF A RHINOCEROS. THE TROLL FENDS OFF YOUR BLOWS EFFORTLESSL. THE TROLL DEFTLY CATCHES THE AXE, EXAMINES IT CAREFULLY, AND TOSSES IT BACK, DECLARING, 'GOOD WORKMANSHIP, BUT IT'S NOT VALUABLE ENOGH.' THE TROLL CATCHES YOUR TREASURE AND SCURRIES AWAY OUT OF SIGT. THE TROLL REFUSES TO LET YOU COSS. THERE IS NO LONGER ANY WAY ACROSS THE CHAS. JUST AS YOU REACH THE OTHER SIDE, THE BRIDGE BUCKLES BENEATH THE WEIGHT OF THE BEAR, WHICH WAS STILL FOLLOWING YOU AROUND. YOU SCRABBLE DESPERATELY FOR SUPPORT, BUT AS THE BRIDGE COLLAPSES YOU STUMBLE BACK AND FALL INTO THE CHAM. THE BEAR LUMBERS TOWARD THE TROLL, WHO LETS OUT A STARTLED SHRIEK AND SCURRIES AWAY. THE BEAR SOON GIVES UP THE PURSUIT AND WANDERSBACK.THE AXE MISSES AND LANDS NEAR THE BEAR WHERE YOU CAN'T GET A IT. WITH WHAT? YOUR BARE HANDS? AGAINST *HIS* BEAR HANDS? THE BEAR IS CONFUSED; HE ONLY WANTS TO BE YOUR FIEND.FOR CRYING OUT LOUD, THE POOR THING IS ALREADY DAD. THE BEAR EAGERLY WOLFS DOWN YOUR FOOD, AFTER WHICH HE SEEMS TO CALM DOWN CONSIDERABLY AND EVEN BECOMES RATHER FRIEDLY. THE BEAR IS STILL CHAINED TO THE WAL. THE CHAIN IS STILL LOCKE. THE CHAIN IS NOW UNLOCKE. THE CHAIN IS NOW LCKED.THERE IS NOTHING HERE TO WHICH THE CHAIN CAN BE LOCKED THERE IS NOTHING HERE TOEAT. DO YOU WANT THE HIT? DO YOU NEED HELP GETTING OUT OF THE AZE? YOU CAN MAKE THE PASSAGES LOOK LESS ALIKE BY DROPPING THINGS ARE YOU TRYING TO EXPLORE BEYOND THE PLOVER ROOM THERE IS A WAY TO EXPLORE THAT REGION WITHOUT HAVING TO WORRY ABOUT FALLING INTO A PIT. NONE OF THE OBJECTS AVAILABLE IS IMMEDIATELY USEFULL IN DISCOVERING THE SCRET.DO YOU NEED HELP GETTING OUT OF HERE DON'T GO WES. GLUTTONY IS NOT ONE OF THE TROLL'S VICES. AVARICE, HOWEVER,IS. YOUR LAMP IS GETTING DIM. YOU'D BEST START WRAPPING THIS UP, UNLESS YOU CAN FIND SOME FRESH BATTERIES. I SEEM TO RECALL THERE'S A VENDING MACHINE IN THE MAZE. BRING SOME COINS WITH YO. YOUR LAMP HAS RUN OUT OF POWER  THERE'S NOT MUCH POINT IN WANDERING AROUND OUT HERE, AND YOU CAN'T EXPLORE THE CAVE WITHOUT A LAMP. SO LET'S JUST CALL IT A DY. THERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS BEHIND YOU. AS YOU TURN TOWARD THEM, THE BEAM OF YOUR LAMP FALLS ACROSS A BEARDED PIRATE. HE IS CARRYING A LARGE CHEST. 'SHIVER ME TIMBERS.' HE CRIES, 'I'VE BEEN SPOTTED. I'D BEST HIE MESELF OFF TO THE MAZE TO HIDE ME CHEST.' WITH THAT, HE VANISHES INTO THE GLOO. YOUR LAMP IS GETTING DIM. YOU'D BEST GO BACK FOR THOSE BATTRIES.YOUR LAMP IS GETTING DIM. I'M TAKING THE LIBERTY OF REPLACING THE BATTEIES. YOUR LAMP IS GETTING DIM, AND YOU'RE OUT OF SPARE BATTERIES. YOU'D BEST START WRAPPING THS UP.I'M AFRAID THE MAGAZINE IS WRITTEN IN DWARISH. 'THIS IS NOT THE MAZJ @@@@@@@@@@@@@@@@@@@@@@@@@@K layers (1..9)?');  read(ch); (nplayer:=ord(ch)-48;  writeln; (for i:=1 to nplayer do *begin ( write('Enter name of player ',i:1,' '); ( readln(players[i].name); * if length(players[i].name)=0 then i:=i-1; *end; end;  function random:real;  {Random produces non random numbers from  the time function loword} var hiword,loword:integer; (seed:real;  begin *time(hiword,loword);  seed:=loword;  seed:=abs(seed/99.0);  seed:=seed-trunc(seed); *random:=seed;  end {random};  function irandom(low,high:integer):integer;  {irandom produces integer numbers  ranging from low to high} begin irandom:=trunc(random*(high-low+0.9)+low) end;   function dieroll:integer;  begin dieroll:=irandom(1,6) end;  procedure game;  var i,j,k:integer;  !procedure disstock(i:integer); (begin ( gotoxy(0,i+3); ( writeln(stocks[i].name:20 ( ,stocks[i].value.value:4,stocks[i].value.amount:4); (end;   procedure shostock;  var i:integer; (begin ( writeln(chr(12),' Year 198',year:1); *writeln('Stock'); gotoxy(18,2);  writeln('Value Avail');  for i:=1 to 10 do disstock(i); end; !procedure update; !var j,k:integer;  i:table;   procedure split(k:integer);  var i,j:integer;  begin {split} *stocks[k].value.value:=stocks[k].value.value div 2; *for i:=1 to nplayer do ,for j:=1 to nplayer do @@@@@@@@@@{$S+}  program stockmarket; type  share=record  amount:0..500; *value:integer[7]; (end; stock=record  name:string[20]; 0value:share; 0dividend:integer; .end; player=record 0name:string[10];   value:array[1..10] of share; 0dividend,turn:integer; / cash:integer[10]; /end; table=(bear,bull); var (market:array[table] of array[2..10] of array[2..12] of integer; stocks:array[1..10] of stock;  players:array[1..9] of player;  num:string[3]; (ch:char;  currentp,currents,year:integer; (nplayer:1..9;  procedure clear;  begin "gotoxy(0,16);  writeln(' ');  writeln('  ');  writeln(' ');  gotoxy(0,16)  end;   function number:integer;  var n,i:integer;  begin  n:=0;  for i:=1 to length(num) do  if ord(num[i])>47 then  if ord(num[i])<58 then % n:=n*10+(ord(num[i])-48) $else &begin (clear; (writeln(' Type digits please.'); (n:=0 &end;  number:=n;  end;   function upper(cha:char):char;  begin  if ord(cha)>96 then if ord(cha)<123 then upper:=chr(ord(cha)-32) $else upper:=cha else upper:=cha;  end;   procedure gameconst;  var i,j:integer; (k:table; (f:interactive; begin reset(f,'STOCK:STOCK.DATA.TEXT'); writeln('Stocks:':20,'Dividends per year');  for i:=1 to 10 do *begin  readln(f,stocks[i].name); ,readln(f,stocks[i].dividend); writeln(stocks[i].name:20,stocks[i].dividend:4);  end;  for k:=bear to bull do   for j:=2 to 10 do *begin ( for i:=2 to 12 do read(f,market[k,j,i]); * readln(f); *end; close(f); "end;  procedure initialize;  var i,j:integer;  begin  for i:= 1 to 10 do *begin ( if i=1 then .begin  stocks[i].value.amount:=50;  stocks[i].value.value:=1000 .end ,else .begin 0stocks[i].value.amount:=500; 0stocks[i].value.value:=100; .end; if i<10 then *begin  for j:=1 to 10 do .begin . players[i].value[j].amount:=0; . players[i].value[j].value:=0; . players[i].dividend:=0; 0players[i].turn:=i; 0players[i].cash:=5000; .end; end; 'end; "end;   procedure playersname;  var i,j:integer;  begin write('How many pL  var cash:integer[10]; (play,stoq:integer;  begin "writeln(chr(12)); "for play:=1 to nplayer do $begin $ cash:=players[play].cash; $ for stoq:=1 to 10 do & begin & cash:=cash+players[play].value[stoq].value $ end; &writeln(players[play].name:10,' $',cash:10)  end;  end;   begin{stockmarket}  gameconst; (playersname; (initialize;  game; finish;  end. {stockmarket}  One,Two; ${$N One,Two} % %PROCEDURE Load_Two; %BEGIN {$R Two} 'One_Change; 'WRITELN(one_msg); 'WRITELN(two_msg); %END; { of Load_Two } % #BEGIN { of Load_Error } %WRITELN; %WRITELN; %WRITELN(one_msg); %WRITELN(two_msg); %WRITELN('Load Two'); %Load_Two; #END { of Load_Error }. .if i=players[j].turn then 0begin 2if players[j].value[k].amount<= stocks[k].value.amount then 4begin 6stocks[k].value.amount:=stocks[k].value.amount- 8players[j].value[k].amount; 6players[j].value[k].amount:=players[j].value[k].amount 8* 2 4end /else 1begin 3players[j].cash:=players[j].cash+ 5((players[j].value[k].amount-stocks[k].value.amount) 5*stocks[k].value.value); 3players[j].value[k].amount:=players[j].value[k].amount 5+stocks[k].value.amount; 3stocks[k].value.amount:=0 1end /end;  end; {split}   procedure paydiv;  var play,stoq:integer;  begin  for play:=1 to 9 do  begin " players[play].dividend:=0; $for stoq:=1 to 10 do &begin & players[play].value[stoq].value:=players[play].value[stoq].amount **stocks[stoq].value.value; (if stocks[stoq].value.value>49 then & players[play].dividend:=players[play].dividend ( +players[play].value[stoq].amount*stocks[stoq].dividend &end;  players[play].cash:=players[play].cash+players[play].dividend;  end;  end;   procedure bust(stoq:integer);  var i:integer;  begin "stocks[stoq].value.value:=0; "stocks[stoq].value.amount:=0; "for i:=1 to nplayer do $begin &players[i].value[stoq].amount:=0; &players[i].value[stoq].value:=0 $end;  end;   begin {update} if irandom(1,2)=1 then i:=bull else i:=bear; *j:=dieroll+dieroll;  for k:=2 to 10 do *begin * if stocks[k].value.value=0 then .begin 0stocks[k].value.amount:=500; 0stocks[k].value.value:=100 .end; ,stocks[k].value.value:=stocks[k].value.value+market[i,k,j];  if stocks[k].value.value>150 then split(k); * if stocks[k].value.value<1 then bust(k); *end;  paydiv; *shostock; (end; {update}  !procedure plystock(play,stoq:integer);   begin  gotoxy(30,stoq+3);  writeln(players[play].value[stoq].amount:4, * players[play].value[stoq].value:6); end;  !procedure shoplay(play:integer); !var i:integer; (begin  gotoxy(28,1);  writeln(players[play].name:10); gotoxy(30,2);  writeln('Shares Value'); *for i:=1 to 10 do plystock(play,i); *gotoxy(24,14); *writeln('Dividends ',players[play].dividend:6); *gotoxy(29,15); writeln('Cash ',players[play].cash:6); ( clear (end; !procedure seturn; !var i,r,x:integer;  begin  for i:=1 to nplayer do ,begin r:=irandom(1,nplayer); .x:=players[i].turn;  players[i].turn:=players[r].turn; .players[r].turn:=x;  end; end;   procedure transak(play,tran,stoq:integer);  var n:integer;  begin "gotoxy(0,16); "write(chr(22)); "If tran<0 then write('Sell ') else write('Buy '); "write('how many shares of ',stocks[stoq].name); "readln(num); "n:=number; "if tran<0 then $begin $ if players[play].value[stoq].amount0 then getstk(play,i) "until ch='F';  end;   begin {game} (for year:=0 to 9 do *begin  update; ,seturn; ,for i:=1 to nplayer do .for j:=1 to nplayer do 0if i=players[j].turn then playturn(j); *end; end; {game}   procedure finish;