From 84b5715c66b026062d9c455da3509b814bc32b1b Mon Sep 17 00:00:00 2001 From: Philipp Hachtmann Date: Sun, 27 Sep 2015 15:30:53 +0200 Subject: [PATCH] adventure: Initial commit This adds the pdp8 backport of adventure including my OS/8 batch files. Signed-off-by: Philipp Hachtmann --- sw/adventure/A5TOA1.RA | 161 + sw/adventure/ADVENT.DC | 86 + sw/adventure/ADVENT.FT | 106 + sw/adventure/ADVENT.LD | Bin 0 -> 74240 bytes sw/adventure/ADVENT.TX | 1777 +++++++++++ sw/adventure/AMAIN.RA | 6482 ++++++++++++++++++++++++++++++++++++++++ sw/adventure/BITSET.RA | 218 ++ sw/adventure/BUG.FT | 28 + sw/adventure/CARRY.RA | 99 + sw/adventure/COMPIL.BI | 28 + sw/adventure/DROP.RA | 89 + sw/adventure/DSTROY.RA | 22 + sw/adventure/DUMPDB.FT | 121 + sw/adventure/GETIN.FT | 95 + sw/adventure/GETWRD.RA | 190 ++ sw/adventure/INITAD.FT | 749 +++++ sw/adventure/IO.FT | 27 + sw/adventure/JUGGLE.RA | 49 + sw/adventure/LOAD.BI | 12 + sw/adventure/MOVE.RA | 88 + sw/adventure/PCT.RA | 40 + sw/adventure/PSPEAK.RA | 109 + sw/adventure/PUT.RA | 53 + sw/adventure/RND.FT | 19 + sw/adventure/RSPEAK.RA | 57 + sw/adventure/RSTRGM.FT | 134 + sw/adventure/SAVEGM.FT | 135 + sw/adventure/SEED.RA | 146 + sw/adventure/SPEAK.RA | 566 ++++ sw/adventure/USR.RA | 717 +++++ sw/adventure/VOCAB.RA | 152 + sw/adventure/YES.FT | 22 + 32 files changed, 12577 insertions(+) create mode 100644 sw/adventure/A5TOA1.RA create mode 100644 sw/adventure/ADVENT.DC create mode 100644 sw/adventure/ADVENT.FT create mode 100644 sw/adventure/ADVENT.LD create mode 100644 sw/adventure/ADVENT.TX create mode 100644 sw/adventure/AMAIN.RA create mode 100644 sw/adventure/BITSET.RA create mode 100644 sw/adventure/BUG.FT create mode 100644 sw/adventure/CARRY.RA create mode 100644 sw/adventure/COMPIL.BI create mode 100644 sw/adventure/DROP.RA create mode 100644 sw/adventure/DSTROY.RA create mode 100644 sw/adventure/DUMPDB.FT create mode 100644 sw/adventure/GETIN.FT create mode 100644 sw/adventure/GETWRD.RA create mode 100644 sw/adventure/INITAD.FT create mode 100644 sw/adventure/IO.FT create mode 100644 sw/adventure/JUGGLE.RA create mode 100644 sw/adventure/LOAD.BI create mode 100644 sw/adventure/MOVE.RA create mode 100644 sw/adventure/PCT.RA create mode 100644 sw/adventure/PSPEAK.RA create mode 100644 sw/adventure/PUT.RA create mode 100644 sw/adventure/RND.FT create mode 100644 sw/adventure/RSPEAK.RA create mode 100644 sw/adventure/RSTRGM.FT create mode 100644 sw/adventure/SAVEGM.FT create mode 100644 sw/adventure/SEED.RA create mode 100644 sw/adventure/SPEAK.RA create mode 100644 sw/adventure/USR.RA create mode 100644 sw/adventure/VOCAB.RA create mode 100644 sw/adventure/YES.FT diff --git a/sw/adventure/A5TOA1.RA b/sw/adventure/A5TOA1.RA new file mode 100644 index 0000000..547a542 --- /dev/null +++ b/sw/adventure/A5TOA1.RA @@ -0,0 +1,161 @@ +/ SUBROUTINE A5TOA1(A,B,D) +/(pdp11:)SUBROUTINE A5TOA1(A,B,C,D) +/ +/ THIS ROUTINE TAKES THE UP TO 6 CHARACTER "WORD" IN A:B:C +/ AND TYPES IT OUT, FOLLOWED BY THE PUNCTUATION MARK IN D. +/ IT ALSO APPENDS A CRLF TO GET TO A NEW LINE. +/ For OS/8: the word is in A,B with nothing in C. +/ +/ IMPLICIT INTEGER (A-Z) +/ COMMON /ALPHAS/ BLANK + + EXTERN SIXOUT + EXTERN CGET + EXTERN CPUT + SECT A5TOA1 + JA #ST +#XR, ORG .+10 + TEXT +A5TOA1+ +#RET, SETX #XR + SETB #BASE + JA .+3 +#BASE, ORG .+6 +A, ORG .+3 +B, ORG .+3 +D, ORG .+3 +BLANK, TEXT + + +ZERO, F 0 +THREE, F 3 + ORG #BASE+30 + FNOP + JA #RET + FNOP +#GOBAK, 0;0 + +#RTN, BASE #BASE + JA #GOBAK + +FIVE, F 5 +SEVEN, F 7 + +#ST, STARTD + 0210 + FSTA #GOBAK,0 + 0200 + SETX #XR + SETB #BASE + LDX 0,1 + FSTA #BASE + FLDA% #BASE,1+ + FSTA A + FLDA% #BASE,1+ + FSTA B + FLDA% #BASE,1+ + FSTA D + STARTF + FLDA% A + FSTA A + FLDA% B + FSTA B + FLDA% D + FSTA D +/ IF (A .NE. BLANK) TYPE 1,A + FLDA A + FSUB BLANK + JEQ #G0001 + JSR TRIM + JA .+4 + JA A + JSR SIXOUT + JA .+10 + JA A + JA ZERO + JA SEVEN +/ IF (B .NE. BLANK) TYPE 1,B +#G0001, FLDA B + FSUB BLANK + JEQ #G0002 + JSR TRIM + JA .+4 + JA B + JSR SIXOUT + JA .+10 + JA B + JA ZERO + JA SEVEN +/ IF (C .NE. BLANK) TYPE 1,C +/ TYPE 2,D +#G0002, JSR TRIM + JA .+4 + JA D + JSR SIXOUT + JA #RTN + JA D + JA ZERO + JA FIVE +/ RETURN +/ END + +/1 FORMAT('+',A2,$) +/2 FORMAT('+',A2) + + SECT TRIM + JA #TST +#TXR, ORG .+10 + TEXT +TRIM + +#TRET, SETX #TXR + SETB #TBASE + JA .+3 +#TBASE, ORG .+6 +PSTR, ORG .+3 +I, ORG .+3 +CH, ORG .+3 +K1, F 1 +K6, F 6 +K32, F 32 + ORG #TBASE+30 + FNOP + JA #TRET + FNOP +#TGOBK, 0;0 + +#TRTN, BASE #TBASE + JA #TGOBK +#TST, STARTD + 0210 + FSTA #TGOBK,0 + 0200 + SETX #TXR + SETB #TBASE + LDX 0,1 + FSTA #TBASE + FLDA% #TBASE,1+ + FSTA PSTR + STARTF + + FLDA K6 + FSTA I +#T10, FLDA PSTR + STARTD + FSTA #TG001 + FSTA #TG002 + STARTF + JSR CGET + JA .+0010 +#TG001, JA . + JA I + JA CH + FLDA CH + FSUB K32 + JNE #TRTN + JSR CPUT + JA .+0010 +#TG002, JA . + JA I + JA ZERO + FLDA I + FSUB K1 + FSTA I + JGT #T10 + + JA #TRTN diff --git a/sw/adventure/ADVENT.DC b/sw/adventure/ADVENT.DC new file mode 100644 index 0000000..b22f793 --- /dev/null +++ b/sw/adventure/ADVENT.DC @@ -0,0 +1,86 @@ + This version of adventure is based on the RT-11 version +by Bob Supnik. It is essentially a recoding of the FORTRAN-IV +sources into RALF code. The RALF code has been optimized +to fit into 32K. Also, many modifications were made to +the code to increase execution speed. + + Because it is based on the RT-11 version of ADVENTURE, +the following features of the FORTRAN-10 version are not +supported: + +1) MAGIC mode was removed +2) The SUSPEND and HOURS commands were deleted + + + The program requires a secondary storage device with +at least 250 blocks of free space for working storage. +Included with the sources are batch stream files for +compiling and loading the program. + +COMPILATION: + +.SUBMIT COMPILE + +LOADING: + +.SUBMIT LOAD (this creates a load map - LOAD.LS) + +EXECUTION: + +.R FRTS +*ADVENT.ld (the ".LD" is optional) +*$ (altmode or escape) + + execution proceeds. + + When the program is first started, it prompts for the +locations of database files: +Location of text database (ATEXT.DA) > +Location of text index (AINDX.DA) > +Location of saved games (ASAVE.DA) > +Location of text input (ADVENT.TX) > + + The value in parenthesis is the default values for those files. +You can place files on other than the current SYS device by giving +the device name and filename, such as RKB0:ADVENT.TX, etc. See +the section below on the ADVENT.IN file for more information on how +to place the database files. + + When first started, the program will take approximately +two to three minutes to set up its data base (ATEXT and AINDX). +Initialization and execution can be optimized by placing +the data file (DATA) on a different device from the text +file (ADVENT.TX). Also, it is more efficient to have the +load module (ADVENT.LD) on a different device than the +data file (DATA). For a two-drive DECtape system, for +example, put ADVENT.LD and ADVENT.TX on SYS:, and have the +database files written on DTA1:. +i.e. +.R FRTS +*ADVENT +Location of text database (ATEXT.DA) > DTA1:ATEXT.DA +Location of text index (AINDX.DA) > DTA1:AINDX.DA +Location of saved games (ASAVE.DA) > ASAVE.DA +Location of text input (ADVENT.TX) > ADVENT.TX + + + The ADVENT.TX file is only used to set up the text database. +Once the ATEXT.DA and AINDX.DA files have been built, you can +delete this file as it is not needed for normal program operation. +The file locataion values given during this startup dialog are +stored in a file called ADVENT.IN, which is a simple text file +with KEYWORD=VALUE lines for the four filenames. You can edit +this later to move the files to other devices, or delete the +ADVENT.IN file to completely restart the dialog. + + To run the program, only the files ADVENT.LD and +ADVENT.TX need to be copied from the distribution tape. +These are the load module and the text file. The rest +of the files are sources. + + + The SAVE command in Adventure writes the ASAVE.DA file. If the +file already exists, it is overwritten by subsequent SAVE operations. +A saved game is restored using the RESTORE command. + +Good luck and happy adventuring! diff --git a/sw/adventure/ADVENT.FT b/sw/adventure/ADVENT.FT new file mode 100644 index 0000000..cecb72b --- /dev/null +++ b/sw/adventure/ADVENT.FT @@ -0,0 +1,106 @@ +C ADVENTURES +C +C MODIFIED BY KENT BLACKETT +C ENGINEERING SYSTEMS GROUP +C DIGITAL EQUIPMENT CORP. +C 15-JUL-77 +C MODIFIED BY BOB SUPNIK +C DISK ENGINEERING +C 21-OCT-77 +C MODIFIED BY BOB SUPNIK +C DISK ENGINEERING +C 25-AUG-78 +C MODIFIED BY BOB SUPNIK +C SMALL SYSTEMS +C 12-NOV-78 +C ORIGINAL VERSION WAS FOR DECSYSTEM-10 +C NEXT VERSION WAS FOR FORTRAN IV-PLUS UNDER +C THE IAS OPERATING SYSTEM ON THE PDP-11/70 +C THIS VERSION IS FOR FORTRAN IV (V01C OR LATER) +C UNDER RT-11 ON *ANY* PDP-11 +C +C +C CURRENT LIMITS: +C 750 TRAVEL OPTIONS (TRAVEL, TRVSIZ). +C 300 VOCABULARY WORDS (KTAB, ATAB, TABSIZ). +C 150 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ). +C 100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP). +C 35 "ACTION" VERBS (ACTSPK, VRBSIZ). +C 205 RANDOM MESSAGES (RTEXT, RTXSIZ). +C 12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX). +C 20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ). +C THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF +C THE DATABASE. (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE, +C SO THERE CAN'T BE MORE THAN 1000 WORDS.) THESE UPPER LIMITS ARE: +C 1000 NON-SYNONYMOUS VOCABULARY WORDS +C 300 LOCATIONS +C 100 OBJECTS +C +C IMPLICIT INTEGER (A-Z) + LOGICAL LMWARN,CLOSNG,PANIC,HINTED, + 1 CLOSED,GAVEUP,SCORNG,DSEEN,BITSET +C + COMMON /VERSN/ VMAJ, VMIN, VEDIT + COMMON /TXTCOM/ RTEXT,LINES,ASCVAR,TXTLOC,DATA + COMMON /VOCCOM/ KTAB,ATAB,TABSIZ + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + COMMON /PTXCOM/ PTEXT + COMMON /ABBCOM/ ABB + COMMON /MISCOM/ LINUSE,TRVS,CLSSES,OLDLOC,LOC,CVAL,TK,NEWLOC, + 1 KEY,PLAC,FIXD,ACTSPK,COND,HINTS,HNTMAX,PROP,TALLY,TALLY2, + 2 HINTLC,CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC,KEYS,LAMP,GRATE + COMMON /MISCOM/ + 3 CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE,FISSUR,TABLET, + 4 CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE,WATER,OIL,PLANT, + 5 PLANT2,AXE,MIRROR,DRAGON,CHASM,TROLL,TROLL2,BEAR,MESSAG,VEND, + 6 BATTER,NUGGET,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD,PYRAM + COMMON /MISCOM/ + 7 PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY,LOCK, + 8 THROW,FIND,INVENT,TURNS,LMWARN,KNFLOC,DETAIL,ABBNUM, + 9 NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2, + 1 CLOSNG,PANIC,CLOSED,GAVEUP,SCORNG,ODLOC,STREAM,SPICES + COMMON /MISC2/ I,RTXSIZ,CLSMAX,LOCSIZ,CTEXT,STEXT,LTEXT, + 1 SECT,TRAVEL,TRVCON,TRVLOC,TRVSIZ,TABNDX,OBJ,J,K,VERB,HNTSIZ, + 2 MAXTRS,HINTED,HNTLOC,KK +C + INTEGER LINES(12),DATA(52),RECORD +C The TRAVEL, TRVCON, and TRVLOC arrays are +C Packed with words 0,1,2 holding the data. Saves lots +C of wasted space at the expense of some complexity. + INTEGER TRAVEL(250), TRVCON(250), TRVLOC(250), TRVSIZ + INTEGER KTAB(300),ATAB(300),TABSIZ + INTEGER LTEXT(150),STEXT(150),KEY(150),COND(150),ABB(150), + 1 ATLOC(150) + INTEGER PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200), + 1 PTEXT(100),PROP(100),HOLDNG + INTEGER ACTSPK(35) + INTEGER RTEXT(205) + INTEGER CTEXT(12),CVAL(12) + INTEGER HINTLC(20),HINTS(20,4) + DIMENSION HINTED(20) + INTEGER TK(20),DLOC(6),ODLOC(6) + DIMENSION DSEEN(6) + INTEGER ASCVAR, TXTLOC, TRVS, CLSSES, OLDLOC + INTEGER HNTSIZ, HNTMAX, TALLY, TALLY2, CHLOC, CHLOC2, DFLAG + INTEGER DALTLC,GRATE,CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE + INTEGER FISSUR,TABLET,CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE + INTEGER WATER,OIL,PLANT,PLANT2,AXE,MIRROR,DRAGON,CHASM + INTEGER BEAR,MESSAG,VEND,BATTER,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD + INTEGER PYRAM,PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY + INTEGER LOCK,THROW,FIND,INVENT,TURNS,KNFLOC,DETAIL,ABBNUM + INTEGER NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2 + INTEGER TROLL,TROLL2,STREAM,SPICES + INTEGER RTXSIZ,CLSMAX,LOCSIZ,SECT,TABNDX,OBJ + INTEGER VERB,HNTLOC,KK +C +C + INTEGER VMAJ, VMIN, VEDIT + DATA VMAJ/2/,VMIN/0/,VEDIT/'A'/ + + CALL SETIDL + CALL INIT +CDEBUG WRITE(4,1) +CDEBUG1 FORMAT(' INIT DONE') + CALL AMAIN + CALL EXIT + END diff --git a/sw/adventure/ADVENT.LD b/sw/adventure/ADVENT.LD new file mode 100644 index 0000000000000000000000000000000000000000..2f033163a61a1124f896863b7bca634e3b906e19 GIT binary patch literal 74240 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�viLpNEgS&feu@*frdUz{!X zoPq4mU7tPi|B)ZXAP_2pZtT?X|EqEZ;o;U)5f$#wijy%s-T5kano6gXbS^4A+jKrH zY=_T_9X2mqI_lfH&J^9odCYH^>D2lul-oJ1AxwqqgjxD8S$BBcu1h40OhGOhgwOZLow#sEGTlsOeNU&Sx92jY?UcW3|C57>_MX!A+|bff)cNVOa-@Iy>jPSUSN#9pzRvF;W$)qReY6S)S<>lEa5@=Wz1SE2 zzf$(=YRY=B#-Tdjqo|ZQs%gqt4Mvt{OULq5{lDCdCdR?=cr?Fb!RQ~yx^6Gb*A~0u z|1V`NxFtKx3@Nsnv+;3GabNiVt_0wj8tOQA`2XVbv|?HUS9?CMwtPCODWB;nx3;j4 z&-oLmO&!6|%nKRr$Q0du#f~6TXwK?h%(!?E=a+@WeH?g!j5dn0?HwF}&A2!V_Px%#1BYY{NdNz+#F2Tn$#gUw_=NC%@LOuS!OJ6muv|FbEL8)9+ zP32~v%FQ;Fj_STr*qU$%uuaMy+UX45y6bR5L}KBf4l z@OpMhsj0{R?-|9>In;ulrB*W#$=l4DUwYzuiK)l`cd6ME|6i$TEV(jkufzXuG%YL} zs-Cr!RL@)t-BYGkquUA-i*4a2OnYfuIKJ4(f(pmM7 zg8#1+-{Di-X#UBk@}F!f9o1SYB^R=0aY?B>zoE@@x0rZ;!0)26umbAw|D_8_{o7CB z?k#-$vh-2$|Ha+UJ$L^%`2Tc|{BxyV9oxIUgt2HRZJ;TcYM%q5ICCK<$6JGq(FL3q zkIi2sr=#WRJo6~-BeL@8v^yzvP29Sp$0)nHk(5<8TxwmeO|p_FU9q)&4(0u=vKzDA zRF+J-g`D|TxzXHIzTDhQ>E4XFKfj**`ta*po)$d7`sg9qThX9&zcX>`=WzSo>Awe= zC-8Sy)!)pj{i?ECeO>^q&+t2*-(mc&D}T?{&D-E;1*rcTMJ}syv;rT?_)RM`|Ou55~x8V6~O9_#ys zar6#j!?E-SX&=5J4>q%5ELR!FEu!mc;4zCOiFD{QIFUD3T2W?2|DBc?O zF`ubiZUV~hO61c3ZdPT;U4{M_n8`XFcs=&F^6SOVc)M?5{tY=|c>j*_SNO4*n}{(D j?e4fw!M4or59M2seIKiAF&BsH;`Zn>OrieY!~g#;qs2sR literal 0 HcmV?d00001 diff --git a/sw/adventure/ADVENT.TX b/sw/adventure/ADVENT.TX new file mode 100644 index 0000000..cff3432 --- /dev/null +++ b/sw/adventure/ADVENT.TX @@ -0,0 +1,1777 @@ +1 +1,Y]OU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING. +1,A]ROUND YOU IS A FOREST. [A] SMALL STREAM FLOWS OUT OF THE BUILDING AND +1,]DOWN A GULLY. +2,Y]OU HAVE WALKED UP A HILL, STILL IN THE FOREST. [T]HE ROAD SLOPES BACK +2,]DOWN THE OTHER SIDE OF THE HILL. [T]HERE IS A BUILDING IN THE DISTANCE. +3,Y]OU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPRING. +4,Y]OU ARE IN A VALLEY IN THE FOREST BESIDE A STREAM TUMBLING ALONG A +4,]ROCKY BED. +5,Y]OU ARE IN OPEN FOREST, WITH A DEEP VALLEY TO ONE SIDE. +6,Y]OU ARE IN OPEN FOREST NEAR BOTH A VALLEY AND A ROAD. +7,A]T YOUR FEET ALL THE WATER OF THE STREAM SPLASHES INTO A 2-INCH SLIT +7,]IN THE ROCK. [D]OWNSTREAM THE STREAMBED IS BARE ROCK. +8,Y]OU ARE IN A 20-FOOT DEPRESSION FLOORED WITH BARE DIRT. [S]ET INTO THE +8,]DIRT IS A STRONG STEEL GRATE MOUNTED IN CONCRETE. [A] DRY STREAMBED +8,]LEADS INTO THE DEPRESSION. +9,Y]OU ARE IN A SMALL CHAMBER BENEATH A 3X3 STEEL GRATE TO THE SURFACE. +9,A] LOW CRAWL OVER COBBLES LEADS INWARD TO THE WEST. +10,Y]OU ARE CRAWLING OVER COBBLES IN A LOW PASSAGE. [T]HERE IS A DIM LIGHT +10,]AT THE EAST END OF THE PASSAGE. +11,Y]OU ARE IN A DEBRIS ROOM FILLED WITH STUFF WASHED IN FROM THE SURFACE. +11,A] LOW WIDE PASSAGE WITH COBBLES BECOMES PLUGGED WITH MUD AND DEBRIS +11,]HERE, BUT AN AWKWARD CANYON LEADS UPWARD AND WEST. [A] NOTE ON THE WALL +11,]SAYS "[MAGIC WORD XYZZY". +12,Y]OU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON. +13,Y]OU ARE IN A SPLENDID CHAMBER THIRTY FEET HIGH. [T]HE WALLS ARE FROZEN +13,]RIVERS OF ORANGE STONE. [A]N AWKWARD CANYON AND A GOOD PASSAGE EXIT +13,]FROM EAST AND WEST SIDES OF THE CHAMBER. +14,A]T YOUR FEET IS A SMALL PIT BREATHING TRACES OF WHITE MIST. [A]N EAST +14,]PASSAGE ENDS HERE EXCEPT FOR A SMALL CRACK LEADING ON. +15,Y]OU ARE AT ONE END OF A VAST HALL STRETCHING FORWARD OUT OF SIGHT TO +15,]THE WEST. [T]HERE ARE OPENINGS TO EITHER SIDE. [N]EARBY, A WIDE STONE +15,]STAIRCASE LEADS DOWNWARD. [T]HE HALL IS FILLED WITH WISPS OF WHITE MIST +15,]SWAYING TO AND FRO ALMOST AS IF ALIVE. [A] COLD WIND BLOWS UP THE +15,]STAIRCASE. [T]HERE IS A PASSAGE AT THE TOP OF A DOME BEHIND YOU. +16,T]HE CRACK IS FAR TOO SMALL FOR YOU TO FOLLOW. +17,Y]OU ARE ON THE EAST BANK OF A FISSURE SLICING CLEAR ACROSS THE HALL. +17,T]HE MIST IS QUITE THICK HERE, AND THE FISSURE IS TOO WIDE TO JUMP. +18,T]HIS IS A LOW ROOM WITH A CRUDE NOTE ON THE WALL. [T]HE NOTE SAYS, +18,"Y]OU WON'T GET IT UP THE STEPS". +19,Y]OU ARE IN THE [H]ALL OF THE [M]OUNTAIN [K]ING, WITH PASSAGES OFF IN +19,]ALL DIRECTIONS. +20,Y]OU ARE AT THE BOTTOM OF THE PIT WITH A BROKEN NECK. +21,Y]OU DIDN'T MAKE IT. +22,T]HE DOME IS UNCLIMBABLE. +23,Y]OU ARE AT THE WEST END OF THE [T]WOPIT [R]OOM. [T]HERE IS A LARGE +23,]HOLE IN THE WALL ABOVE THE PIT AT THIS END OF THE ROOM. +24,Y]OU ARE AT THE BOTTOM OF THE EASTERN PIT IN THE [T]WOPIT [R]OOM. +24,T]HERE IS A SMALL POOL OF OIL IN ONE CORNER OF THE PIT. +25,Y]OU ARE AT THE BOTTOM OF THE WESTERN PIT IN THE [T]WOPIT [R]OOM. +25,T]HERE IS A LARGE HOLE IN THE WALL ABOUT 25 FEET ABOVE YOU. +26,Y]OU CLAMBER UP THE PLANT AND SCURRY THROUGH THE HOLE AT THE TOP. +27,Y]OU ARE ON THE WEST SIDE OF THE FISSURE IN THE [H]ALL OF [M]ISTS. +28,Y]OU ARE IN A LOW NORTH/SOUTH PASSAGE AT A HOLE IN THE FLOOR. [T]HE +28,]HOLE GOES DOWN TO AN EAST/WEST PASSAGE. +29,Y]OU ARE IN THE SOUTH SIDE CHAMBER. +30,Y]OU ARE IN THE WEST SIDE CHAMBER OF THE HALL OF THE [M]OUNTAIN [K]ING. +30,A] PASSAGE CONTINUES WEST AND UP HERE. +31,>$< +32,Y]OU CAN'T GET BY THE SNAKE. +33,Y]OU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE +33,]WEST, AND A WALL OF BROKEN ROCK TO THE EAST. [T]HERE IS A LARGE "[Y2]" +33,]ON A ROCK IN THE ROOM'S CENTER. +34,Y]OU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE. +35,Y]OU'RE AT A LOW WINDOW OVERLOOKING A HUGE PIT, WHICH EXTENDS UP OUT OF +35,]SIGHT. [A] FLOOR IS INDISTINCTLY VISIBLE OVER 50 FEET BELOW. [T]RACES +35,]OF WHITE MIST COVER THE FLOOR OF THE PIT,BECOMING THICKER TO THE RIGHT. +35,M]ARKS IN THE DUST AROUND THE WINDOW WOULD SEEM TO INDICATE THAT +35,]SOMEONE HAS BEEN HERE RECENTLY. [D]IRECTLY ACROSS THE PIT FROM YOU AND +35,]25 FEET AWAY THERE IS A SIMILAR WINDOW LOOKING INTO A LIGHTED ROOM. +35,A ]SHADOWY FIGURE CAN BE SEEN THERE PEERING BACK AT YOU. +36,Y]OU ARE IN A DIRTY BROKEN PASSAGE. [T]O THE EAST IS A CRAWL. [T]O THE +36,]WEST IS A LARGE PASSAGE. [A]BOVE YOU IS A HOLE TO ANOTHER PASSAGE. +37,Y]OU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT. [A] CRAWL LEADS +37,]WEST. +38,Y]OU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH +38,]ENTERS AND EXITS THROUGH TINY SLITS. +39,Y]OU ARE IN A LARGE ROOM FULL OF DUSTY ROCKS. [T]HERE IS A BIG HOLE IN +39,]THE FLOOR. [T]HERE ARE CRACKS EVERYWHERE, AND A PASSAGE LEADING EAST. +40,Y]OU HAVE CRAWLED THROUGH A VERY LOW WIDE PASSAGE PARALLEL TO AND NORTH +40,]OF THE [H]ALL OF [M]ISTS. +41,Y]OU ARE AT THE WEST END OF THE [H]ALL OF [M]ISTS. [A] LOW WIDE CRAWL +41,]CONTINUES WEST AND ANOTHER GOES NORTH. [T]O THE SOUTH IS A LITTLE +41,]PASSAGE 6 FEET OFF THE FLOOR. +42,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +43,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +44,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +45,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +46,D]EAD END! +47,D]EAD END! +48,D]EAD END! +49,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +50,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +51,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +52,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +53,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +54,D]EAD END! +55,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +56,D]EAD END! +57,Y]OU ARE ON THE BRINK OF A THIRTY FOOT PIT WITH A MASSIVE ORANGE COLUMN +57,]DOWN ONE WALL. [Y]OU COULD CLIMB DOWN HERE BUT YOU COULD NOT GET BACK +57,]UP. [T]HE MAZE CONTINUES AT THIS LEVEL. +58,D]EAD END! +59,Y]OU HAVE CRAWLED THROUGH A VERY LOW WIDE PASSAGE PARALLEL TO AND NORTH +59,]OF THE [H]ALL OF [M]ISTS. +60,Y]OU ARE AT THE EAST END OF A VERY LONG HALL APPARENTLY WITHOUT SIDE +60,]CHAMBERS. [T]O THE EAST A LOW WIDE CRAWL SLANTS UP. [T]O THE NORTH A +60,]ROUND TWO FOOT HOLE SLANTS DOWN. +61,Y]OU ARE AT THE WEST END OF A VERY LONG FEATURELESS HALL. [T]HE HALL +61,]JOINS UP WITH A NARROW NORTH/SOUTH PASSAGE. +62,Y]OU ARE AT A CROSSOVER OF A HIGH NORTH/SOUTH PASSAGE AND A LOW +62,]EAST/WEST ONE. +63,D]EAD END! +64,Y]OU ARE AT A COMPLEX JUNCTION. [A] LOW HANDS AND KNEES PASSAGE FROM +64,]THE NORTH JOINS A HIGHER CRAWL FROM THE EAST TO MAKE A WALKING +64,]PASSAGE GOING WEST. [T]HERE IS ALSO A LARGE ROOM ABOVE. [T]HE AIR +64,]IS DAMP HERE. +65,Y]OU ARE IN [B]EDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE. +65,T]O EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN. +66,Y]OU ARE IN A ROOM WHOSE WALLS RESEMBLE [S]WISS CHEESE. [O]BVIOUS +66,]PASSAGES GO WEST, EAST, NORTHEAST, AND NORTHWEST. [P]ART OF THE ROOM +66,]IS OCCUPIED BY A LARGE BEDROCK BLOCK. +67,Y]OU ARE AT THE EAST END OF THE [T]WOPIT [R]OOM. [T]HE FLOOR HERE IS +67,]LITTERED WITH THIN ROCK SLABS, WHICH MAKE IT EASY TO DESCEND THE PITS. +67,]THERE IS A PATH HERE BYPASSING THE PITS TO CONNECT PASSAGES FROM EAST +67,]AND WEST. [T]HERE ARE HOLES ALL OVER, BUT THE ONLY BIG ONE IS ON THE +67,]WALL DIRECTLY OVER THE WEST PIT WHERE YOU CAN'T GET TO IT. +68,Y]OU ARE IN A LARGE LOW CIRCULAR CHAMBER WHOSE FLOOR IS AN IMMENSE SLAB +68,]FALLEN FROM THE CEILING ([S]LAB [R]OOM). [E]AST AND WEST THERE ONCE +68,]WERE LARGE PASSAGES, BUT THEY ARE NOW FILLED WITH BOULDERS. [L]OW SMALL +68,]PASSAGES GO NORTH AND SOUTH, AND THE SOUTH ONE QUICKLY BENDS WEST +68,]AROUND THE BOULDERS. +69,Y]OU ARE IN A SECRET NORTH/SOUTH CANYON ABOVE A LARGE ROOM. +70,Y]OU ARE IN A SECRET NORTH/SOUTH CANYON ABOVE A SIZABLE PASSAGE. +71,Y]OU ARE IN A SECRET CANYON AT A JUNCTION OF THREE CANYONS, BEARING +71,]NORTH, SOUTH, AND SOUTHEAST. [T]HE NORTH ONE IS AS TALL AS THE OTHER +71,]TWO COMBINED. +72,Y]OU ARE IN A LARGE LOW ROOM. [C]RAWLS LEAD NORTH, SOUTHEAST, AND +72,]AND SOUTHWEST. +73,D]EAD END CRAWL. +74,Y]OU ARE IN A SECRET CANYON WHICH HERE RUNS EAST/WEST. [I]T CROSSES +74,]OVER A VERY TIGHT CANYON 15 FEET BELOW. [I]F YOU GO DOWN YOU MAY NOT +74,]BE ABLE TO GET BACK UP. +75,Y]OU ARE AT A WIDE PLACE IN A VERY TIGHT NORTH/SOUTH CANYON. +76,T]HE CANYON HERE BECOMES TOO TIGHT TO GO FURTHER SOUTH. +77,Y]OU ARE IN A TALL EAST/WEST CANYON. [A] LOW TIGHT CRAWL GOES 3 FEET +77,]NORTH AND SEEMS TO OPEN UP. +78,T]HE CANYON RUNS INTO A MASS OF BOULDERS -- DEAD END. +79,T]HE STREAM FLOWS OUT THROUGH A PAIR OF 1 FOOT DIAMETER SEWER PIPES. +79,I]T WOULD BE ADVISABLE TO USE THE EXIT. +80,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +81,D]EAD END! +82,D]EAD END! +83,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +84,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +85,D]EAD END! +86,D]EAD END! +87,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +88,Y]OU ARE IN A LONG, NARROW CORRIDOR STRETCHING OUT OF SIGHT TO THE +88,]WEST. AT THE EASTERN END IS A HOLE THROUGH WHICH YOU CAN SEE A +88,]PROFUSION OF LEAVES. +89,T]HERE IS NOTHING HERE TO CLIMB. [U]SE "UP" OR "OUT" TO LEAVE THE PIT. +90,Y]OU HAVE CLIMBED UP THE PLANT AND OUT OF THE PIT. +91,Y]OU ARE AT THE TOP OF A STEEP INCLINE ABOVE A LARGE ROOM. [Y]OU COULD +91,]CLIMB DOWN HERE, BUT YOU WOULD NOT BE ABLE TO CLIMB UP. [T]HERE IS A +91,]PASSAGE LEADING BACK TO THE NORTH. +92,Y]OU ARE IN THE GIANT ROOM. [T]HE CEILING HERE IS TOO HIGH UP FOR YOUR +92,]LAMP TO SHOW IT. [C]AVERNOUS PASSAGES LEAD EAST, NORTH, AND SOUTH. +92,]ON THE WALL IS SCRAWLED THE INSCRIPTION, "[FEE FIE FOE FOO]" (SIC). +93,T]HE PASSAGE HERE IS BLOCKED BY A RECENT CAVE-IN. +94,Y]OU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSAGE. +95,Y]OU ARE IN A MAGNIFICENT CAVERN WITH A RUSHING STREAM, WHICH CASCADES +95,]OVER A SPARKLING WATERFALL INTO A ROARING WHIRLPOOL WHICH DISAPPEARS +95,]THROUGH A HOLE IN THE FLOOR. [P]ASSAGES EXIT TO THE SOUTH AND WEST. +96,Y]OU ARE IN THE [S]OFT [R]OOM. [T]HE WALLS ARE COVERED WITH HEAVY +96,]CURTAINS,THE FLOOR WITH A THICK PILE CARPET.[M]OSS COVERS THE CEILING. +97,T]HIS IS THE [O]RIENTAL ROOM. [A]NCIENT ORIENTAL CAVE DRAWINGS COVER THE +97,]WALLS. [A] GENTLY SLOPING PASSAGE LEADS UPWARD TO THE NORTH, ANOTHER +97,]PASSAGE LEADS SOUTHEAST, AND A HANDS AND KNEES CRAWL LEADS WEST. +98,Y]OU ARE FOLLOWING A WIDE PATH AROUND THE OUTER EDGE OF A LARGE CAVERN. +98,F]AR BELOW, THROUGH A HEAVY WHITE MIST, STRANGE SPLASHING NOISES CAN BE +98,]HEARD. [T]HE MIST RISES UP THROUGH A FISSURE IN THE CEILING. [T]HE +98,]PATH EXITS TO THE SOUTH AND WEST. +99,Y]OU ARE IN AN ALCOVE. [A] SMALL NORTHWEST PATH SEEMS TO WIDEN AFTER +99,]SHORT DISTANCE. [A]N EXTREMELY TIGHT TUNNEL LEADS EAST. [I]T LOOKS LIKE +99,]A VERY TIGHT SQUEEZE. [A]N EERIE LIGHT CAN BE SEEN AT THE OTHER END. +100,Y]OU'RE IN A SMALL CHAMBER LIT BY AN EERIE GREEN LIGHT. [A]N EXTREMELY +100,]NARROW TUNNEL EXITS TO THE WEST. [A] DARK CORRIDOR LEADS NORTHEAST. +101,Y]OU'RE IN THE [D]ARK [R]OOM. [A] CORRIDOR LEADING SOUTH IS THE ONLY +101,]EXIT. +102,Y]OU ARE IN AN ARCHED HALL.[A] CORAL PASSAGE ONCE CONTINUED UP AND EAST +102,]FROM HERE, BUT IS NOW BLOCKED BY DEBRIS.[T]HE AIR SMELLS OF SEA WATER. +103,Y]OU'RE IN A LARGE ROOM CARVED OUT OF SEDIMENTARY ROCK. [T]HE FLOOR AND +103,]WALLS ARE LITTERED WITH BITS OF SHELLS IMBEDDED IN THE STONE. [A] +103,]SHALLOW PASSAGE PROCEEDS DOWNWARD, AND A SOMEWHAT STEEPER ONE LEADS +103,]UP. [A] LOW HANDS AND KNEES PASSAGE ENTERS FROM THE SOUTH. +104,Y]OU ARE IN A LONG SLOPING CORRIDOR WITH RAGGED SHARP WALLS. +105,Y]OU ARE IN A CUL-DE-SAC ABOUT EIGHT FEET ACROSS. +106,Y]OU ARE IN AN ANTEROOM LEADING TO A LARGE PASSAGE TO THE EAST. [S]MALL +106,]PASSAGES GO WEST AND UP. [T]HE REMNANTS OF RECENT DIGGING ARE EVIDENT. +106,A] SIGN IN MIDAIR HERE SAYS "[C]AVE UNDER CONSTRUCTION BEYOND THIS +106,]POINT. [P]ROCEED AT OWN RISK. ([W]ITT [C]ONSTRUCTION [C]OMPANY)" +107,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL DIFFERENT. +108,Y]OU ARE AT [W]ITT'S [E]ND. [P]ASSAGES LEAD OFF IN [ALL] DIRECTIONS. +109,Y]OU ARE IN A NORTH/SOUTH CANYON ABOUT 25 FEET ACROSS. [T]HE FLOOR IS +109,]COVERED BY WHITE MIST SEEPING IN FROM THE NORTH. [T]HE WALLS EXTEND +109,]UPWARD FOR WELL OVER 100 FEET. [S]USPENDED FROM SOME UNSEEN POINT FAR +109,]ABOVE YOU, AN ENORMOUS TWO-SIDED MIRROR IS HANGING PARALLEL TO AND +109,]MIDWAY BETWEEN THE CANYON WALLS. ([T]HE MIRROR IS OBVIOUSLY PROVIDED +109,]FOR THE USE OF THE DWARVES, WHO AS YOU KNOW, ARE EXTREMELY VAIN.) [A] +109,]SMALL WINDOW CAN BE SEEN IN EITHER WALL, SOME FIFTY FEET UP. +110,Y]OU'RE AT A LOW WINDOW OVERLOOKING A HUGE PIT, WHICH EXTENDS UP OUT OF +110,]SIGHT. [A] FLOOR IS INDISTINCTLY VISIBLE OVER 50 FEET BELOW. [T]RACES +110,]OF WHITE MIST COVER THE FLOOR OF THE PIT,BECOMING THICKER TO THE LEFT. +110,M]ARKS IN THE DUST AROUND THE WINDOW WOULD SEEM TO INDICATE THAT +110,]SOMEONE HAS BEEN HERE RECENTLY. [D]IRECTLY ACROSS THE PIT FROM YOU AND +110,25 ]FEET AWAY THERE IS A SIMILAR WINDOW LOOKING INTO A LIGHTED ROOM. +110,A] SHADOWY FIGURE CAN BE SEEN THERE PEERING BACK AT YOU. +111,A] LARGE STALACTITE EXTENDS FROM THE ROOF AND ALMOST REACHES THE FLOOR +111,]BELOW. [Y]OU COULD CLIMB DOWN IT, AND JUMP FROM IT TO THE FLOOR, BUT +111,]HAVING DONE SO YOU WOULD BE UNABLE TO REACH IT TO CLIMB BACK UP. +112,Y]OU ARE IN A LITTLE MAZE OF TWISTING PASSAGES, ALL DIFFERENT. +113,Y]OU ARE AT THE EDGE OF A LARGE UNDERGROUND RESERVOIR. [A]N OPAQUE +113,]CLOUD OF WHITE MIST FILLS THE ROOM AND RISES RAPIDLY UPWARD. [T]HE +113,]LAKE IS FED BY A STREAM, WHICH TUMBLES OUT OF A HOLE IN THE WALL ABOUT +113,10 ]FEET OVERHEAD AND SPLASHES NOISILY INTO THE WATER SOMEWHERE WITHIN +113,]THE MIST. [T]HE ONLY PASSAGE GOES BACK TOWARD THE SOUTH. +114,D]EAD END! +115,Y]OU ARE AT THE NORTHEAST END OF AN IMMENSE ROOM, EVEN LARGER THAN THE +115,]GIANT ROOM. [I]T APPEARS TO BE A REPOSITORY FOR THE "[ADVENTURE]" +115,]PROGRAM. [M]ASSIVE TORCHES FAR OVERHEAD BATHE THE ROOM WITH SMOKY +115,]YELLOW LIGHT. [S]CATTERED ABOUT YOU CAN BE SEEN A PILE OF BOTTLES (ALL +115,]OF THEM EMPTY), A NURSERY OF YOUNG BEANSTALKS MURMURING QUIETLY, A BED +115,]OF OYSTERS, A BUNDLE OF BLACK RODS WITH RUSTY STARS ON THEIR ENDS, AND +115,]A COLLECTION OF BRASS LANTERNS. [O]FF TO ONE SIDE A GREAT MANY DWARVES +115,]ARE SLEEPING ON THE FLOOR, SNORING LOUDLY. A SIGN NEARBY READS: "[D]O +115,]NOT DISTURB THE DWARVES!" [A]N IMMENSE MIRROR IS HANGING AGAINST ONE +115,]WALL, AND STRETCHES TO THE OTHER END OF THE ROOM, WHERE VARIOUS OTHER +115,]SUNDRY OBJECTS CAN BE GLIMPSED DIMLY IN THE DISTANCE. +116,Y]OU ARE AT THE SOUTHWEST END OF THE REPOSITORY. [T]O ONE SIDE IS A PIT +116,]FULL OF FIERCE GREEN SNAKES. [O]N THE OTHER SIDE IS A ROW OF SMALL +116,]WICKER CAGES, EACH OF WHICH CONTAINS A LITTLE SULKING BIRD. [I]N ONE +116,]CORNER IS A BUNDLE OF BLACK RODS WITH RUSTY MARKS ON THEIR ENDS. [A] +116,]LARGE NUMBER OF VELVET PILLOWS ARE SCATTERED ABOUT ON THE FLOOR. [A] +116,]VAST MIRROR STRETCHES OFF TO THE NORTHEAST. [A]T YOUR FEET IS A LARGE +116,]STEEL GRATE, NEXT TO WHICH IS A SIGN WHICH READS, "[T]REASURE VAULT. +116,]KEYS IN [M]AIN [O]FFICE." +117,Y]OU ARE ON ONE SIDE OF A LARGE, DEEP CHASM. [A] HEAVY WHITE MIST +117,]RISING UP FROM BELOW OBSCURES ALL VIEW OF THE FAR SIDE. [A] SW PATH +117,]LEADS AWAY FROM THE CHASM INTO A WINDING CORRIDOR. +118,Y]OU ARE IN A LONG WINDING CORRIDOR SLOPING OUT OF SIGHT IN BOTH +118,]DIRECTIONS. +119,Y]OU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST. +120,Y]OU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST. +121,Y]OU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST. +122,Y]OU ARE ON THE FAR SIDE OF THE CHASM. [A] NORTHEAST PATH LEADS AWAY +122,]FROM THE CHASM ON THIS SIDE. +123,Y]OU'RE IN A LONG EAST/WEST CORRIDOR. [A] FAINT RUMBLING NOISE CAN BE +123,]HEARD IN THE DISTANCE. +124,T]HE PATH FORKS HERE. [T]HE LEFT FORK LEADS NORTHEAST.[A] DULL RUMBLING +124,]SEEMS TO GET LOUDER IN THAT DIRECTION.[T]HE RIGHT FORK LEADS SOUTHEAST +124,]DOWN A GENTLE SLOPE. [T]HE MAIN CORRIDOR ENTERS FROM THE WEST. +125,T]HE WALLS ARE QUITE WARM HERE. [F]ROM THE NORTH CAN BE HEARD A STEADY +125,]ROAR, SO LOUD THAT THE ENTIRE CAVE SEEMS TO BE TREMBLING. [A]NOTHER +125,]PASSAGE LEADS SOUTH, AND A LOW CRAWL GOES EAST. +126,Y]OU ARE ON THE EDGE OF A BREATH-TAKING VIEW. [F]AR BELOW YOU IS AN +126,]ACTIVE VOLCANO, FROM WHICH GREAT GOUTS OF MOLTEN LAVA COME SURGING +126,]OUT, CASCADING BACK DOWN INTO THE DEPTHS. [T]HE GLOWING ROCK FILLS THE +126,]FARTHEST REACHES OF THE CAVERN WITH A BLOOD-RED GLARE, GIVING EVERY- +126,]THING AN EERIE, MACABRE APPEARANCE. [T]HE AIR IS FILLED WITH FLICKERING +126,]SPARKS OF ASH AND A HEAVY SMELL OF BRIMSTONE. [T]HE WALLS ARE HOT TO +126,]THE TOUCH, AND THE THUNDERING OF THE VOLCANO DROWNS OUT ALL OTHER +126,]SOUNDS. [E]MBEDDED IN THE JAGGED ROOF FAR OVERHEAD ARE MYRIAD TWISTED +126,]FORMATIONS COMPOSED OF PURE WHITE ALABASTER, WHICH SCATTER THE MURKY +126,]LIGHT INTO SINISTER APPARITIONS UPON THE WALLS.[T]O ONE SIDE IS A DEEP +126,]GORGE, FILLED WITH A BIZARRE CHAOS OF TORTURED ROCK WHICH SEEMS TO +126,]HAVE BEEN CRAFTED BY THE DEVIL HIMSELF. [A]N IMMENSE RIVER OF FIRE +126,]CRASHES OUT FROM THE DEPTHS OF THE VOLCANO, BURNS ITS WAY THROUGH THE +126,]GORGE, AND PLUMMETS INTO A BOTTOMLESS PIT FAR OFF TO YOUR LEFT. [T]O +126,]THE RIGHT, AN IMMENSE GEYSER OF BLISTERING STEAM ERUPTS CONTINUOUSLY +126,]FROM A BARREN ISLAND IN THE CENTER OF A SULFUROUS LAKE, WHICH BUBBLES +126,]OMINOUSLY. [T]HE FAR RIGHT WALL IS AFLAME WITH AN INCANDESCENCE OF ITS +126,]OWN, WHICH LENDS AN ADDITIONAL INFERNAL SPLENDOR TO THE ALREADY +126,]HELLISH SCENE. [A] DARK, FOREBODING PASSAGE EXITS TO THE SOUTH. +127,Y]OU ARE IN A SMALL CHAMBER FILLED WITH LARGE BOULDERS. [T]HE WALLS ARE +127,]VERY WARM, CAUSING THE AIR IN THE ROOM TO BE ALMOST STIFLING FROM THE +127,]HEAT. [T]HE ONLY EXIT IS A CRAWL HEADING WEST, THROUGH WHICH IS COMING +127,]A LOW RUMBLING. +128,Y]OU ARE WALKING ALONG A GENTLY SLOPING NORTH/SOUTH PASSAGE LINED WITH +128,]ODDLY SHAPED LIMESTONE FORMATIONS. +129,Y]OU ARE STANDING AT THE ENTRANCE TO A LARGE, BARREN ROOM. [A] SIGN +129,]POSTED ABOVE THE ENTRANCE READS: "[C]AUTION! [B]EAR IN ROOM!" +130,Y]OU ARE INSIDE A BARREN ROOM. [T]HE CENTER OF THE ROOM IS COMPLETELY +130,]EMPTY EXCEPT FOR SOME DUST. [M]ARKS IN THE DUST LEAD AWAY TOWARD THE +130,]FAR END OF THE ROOM. [T]HE ONLY EXIT IS THE WAY YOU CAME IN. +131,Y]OU ARE IN A MAZE OF TWISTING LITTLE PASSAGES, ALL DIFFERENT. +132,Y]OU ARE IN A LITTLE MAZE OF TWISTY PASSAGES, ALL DIFFERENT. +133,Y]OU ARE IN A TWISTING MAZE OF LITTLE PASSAGES, ALL DIFFERENT. +134,Y]OU ARE IN A TWISTING LITTLE MAZE OF PASSAGES, ALL DIFFERENT. +135,Y]OU ARE IN A TWISTY LITTLE MAZE OF PASSAGES, ALL DIFFERENT. +136,Y]OU ARE IN A TWISTY MAZE OF LITTLE PASSAGES, ALL DIFFERENT. +137,Y]OU ARE IN A LITTLE TWISTY MAZE OF PASSAGES, ALL DIFFERENT. +138,Y]OU ARE IN A MAZE OF LITTLE TWISTING PASSAGES, ALL DIFFERENT. +139,Y]OU ARE IN A MAZE OF LITTLE TWISTY PASSAGES, ALL DIFFERENT. +140,D]EAD END! +-1,END +2 +1,Y]OU'RE AT END OF ROAD AGAIN. +2,Y]OU'RE AT HILL IN ROAD. +3,Y]OU'RE INSIDE BUILDING. +4,Y]OU'RE IN VALLEY. +5,Y]OU'RE IN FOREST. +6,Y]OU'RE IN FOREST. +7,Y]OU'RE AT SLIT IN STREAMBED. +8,Y]OU'RE OUTSIDE GRATE. +9,Y]OU'RE BELOW THE GRATE. +10,Y]OU'RE IN [C]OBBLE [C]RAWL. +11,Y]OU'RE IN [D]EBRIS [R]OOM. +13,Y]OU'RE IN [B]IRD [C]HAMBER. +14,Y]OU'RE AT TOP OF [S]MALL [P]IT. +15,Y]OU'RE IN [H]ALL OF [M]ISTS. +17,Y]OU'RE ON EAST BANK OF [F]ISSURE. +18,Y]OU'RE IN [N]UGGET OF [G]OLD [R]OOM. +19,Y]OU'RE IN [H]ALL OF [M]T [K]ING. +23,Y]OU'RE AT WEST END OF [T]WOPIT [R]OOM. +24,Y]OU'RE IN [E]AST [P]IT. +25,Y]OU'RE IN [W]EST [P]IT. +33,Y]OU'RE AT "[Y2]". +35,Y]OU'RE AT WINDOW ON [P]IT. +36,Y]OU'RE IN [D]IRTY [P]ASSAGE. +39,Y]OU'RE IN [D]USTY [R]OCK [R]OOM. +41,Y]OU'RE AT WEST END OF [H]ALL OF [M]ISTS. +57,Y]OU'RE AT BRINK OF [P]IT. +60,Y]OU'RE AT EAST END OF [L]ONG [H]ALL. +61,Y]OU'RE AT WEST END OF [L]ONG [H]ALL. +64,Y]OU'RE AT [C]OMPLEX [J]UNCTION. +66,Y]OU'RE IN [S]WISS [C]HEESE ROOM. +67,Y]OU'RE AT EAST END OF [T]WOPIT [R]OOM. +68,Y]OU'RE IN [S]LAB [R]OOM. +71,Y]OU'RE AT [JUNCTION OF [THREE [SECRET [CANYONS. +74,Y]OU'RE IN [S]ECRET EAST/WEST [C]ANYON ABOVE TIGHT CANYON. +88,Y]OU'RE IN [N]ARROW [C]ORRIDOR. +91,Y]OU'RE AT STEEP INCLINE ABOVE [L]ARGE [R]OOM. +92,Y]OU'RE IN [G]IANT [R]OOM. +95,Y]OU'RE IN [C]AVERN WITH [W]ATERFALL. +96,Y]OU'RE IN [S]OFT [R]OOM. +97,Y]OU'RE IN [O]RIENTAL [R]OOM. +98,Y]OU'RE IN [M]ISTY [C]AVERN. +99,Y]OU'RE IN [A]LCOVE. +100,Y]OU'RE IN [P]LOVER [R]OOM. +101,Y]OU'RE IN [D]ARK [R]OOM. +102,Y]OU'RE IN [A]RCHED [H]ALL. +103,Y]OU'RE IN [S]HELL [R]OOM. +106,Y]OU'RE IN [A]NTEROOM. +108,Y]OU'RE AT [W]ITT'S [E]ND. +109,Y]OU'RE IN [M]IRROR [C]ANYON. +110,Y]OU'RE AT WINDOW ON [P]IT. +111,Y]OU'RE AT TOP OF [S]TALACTITE. +113,Y]OU'RE AT [R]ESERVOIR. +115,Y]OU'RE AT NORTHEAST END. +116,Y]OU'RE AT SOUTHWEST END. +117,Y]OU'RE ON SOUTHWEST SIDE OF [C]HASM. +118,Y]OU'RE IN [S]LOPING [C]ORRIDOR. +122,Y]OU'RE ON NORTHEAST SIDE OF [C]HASM. +123,Y]OU'RE IN [C]ORRIDOR. +124,Y]OU'RE AT [F]ORK IN [P]ATH. +125,Y]OU'RE AT [J]UNCTION WITH [W]ARM [W]ALLS. +126,Y]OU'RE AT [B]REATH-TAKING [V]IEW. +127,Y]OU'RE IN [C]HAMBER OF [B]OULDERS. +128,Y]OU'RE IN [L]IMESTONE [P]ASSAGE. +129,Y]OU'RE IN FRONT OF [B]ARREN [R]OOM. +130,Y]OU'RE IN [B]ARREN [R]OOM. +-1 +3 +1,0,2,2,44,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,0,3,3,12,19,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,0,4,5,13,14,46,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,0,5,6,45,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,0,8,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +2,0,1,2,12,7,43,45,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +2,0,5,6,45,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +3,0,1,3,11,32,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +3,0,11,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +3,0,33,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +3,0,79,5,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +4,0,1,4,12,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +4,0,5,6,43,44,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +4,0,7,5,46,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +4,0,8,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +5,0,4,9,43,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +5,50,005,6,7,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +5,0,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +5,0,5,44,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,0,1,2,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,0,4,9,43,44,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,0,5,6,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,0,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,0,4,4,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,0,5,6,43,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,0,8,5,15,16,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,0,595,60,14,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +8,0,5,6,43,44,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +8,0,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +8,0,7,4,13,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +8,303,009,3,19,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +8,0,593,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,303,008,11,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,0,593,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,0,10,17,18,19,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,0,14,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,0,11,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +10,0,9,11,20,21,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +10,0,11,19,22,44,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +10,0,14,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,303,008,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,0,9,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,0,10,17,18,23,24,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,0,12,25,19,29,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,0,3,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,0,14,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +12,303,008,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +12,0,9,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +12,0,11,30,43,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +12,0,13,19,29,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +12,0,14,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +13,303,008,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +13,0,9,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +13,0,11,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +13,0,12,25,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +13,0,14,23,31,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,303,008,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,0,9,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,0,11,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,0,13,23,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,150,020,30,31,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,0,15,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,0,16,33,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +15,0,18,36,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +15,0,17,7,38,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +15,0,19,10,30,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +15,150,022,29,31,34,35,23,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +15,0,14,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +15,0,34,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +16,0,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,0,15,38,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,312,596,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,412,021,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,412,597,41,42,44,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,0,27,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +18,0,15,38,11,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +19,0,15,10,29,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +19,311,028,45,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +19,311,029,46,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +19,311,030,44,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +19,0,32,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +19,35,074,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +19,211,032,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +19,0,74,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +20,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +22,0,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +23,0,67,43,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +23,0,68,44,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +23,0,25,30,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +23,0,648,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +24,0,67,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +25,0,23,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +25,724,031,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +25,0,26,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +26,0,88,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +27,312,596,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +27,412,021,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +27,412,597,41,42,43,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +27,0,17,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +27,0,40,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +27,0,41,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +28,0,19,38,11,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +28,0,33,45,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +28,0,36,30,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,0,19,38,11,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +30,0,19,38,11,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +30,0,62,44,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +31,524,089,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +31,0,90,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +32,0,19,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +33,0,3,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +33,0,28,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +33,0,34,43,53,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +33,0,35,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +33,159,302,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +33,0,100,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +34,0,33,30,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +34,0,15,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +35,0,33,43,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +35,0,20,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +36,0,37,43,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +36,0,28,29,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +36,0,39,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +36,0,65,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +37,0,36,44,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +37,0,38,30,31,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +38,0,37,56,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +38,0,595,60,14,30,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +39,0,36,43,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +39,0,64,30,52,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +39,0,65,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +40,0,41,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +41,0,42,46,29,23,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +41,0,27,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +41,0,59,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +41,0,60,44,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +42,0,41,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +42,0,42,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +42,0,43,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +42,0,45,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +42,0,80,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +43,0,42,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +43,0,44,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +43,0,45,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +44,0,43,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +44,0,48,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +44,0,50,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +44,0,82,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +45,0,42,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +45,0,43,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +45,0,46,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +45,0,47,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +45,0,87,29,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +46,0,45,44,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +47,0,45,43,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +48,0,44,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +49,0,50,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +49,0,51,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +50,0,44,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +50,0,49,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +50,0,51,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +50,0,52,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +51,0,49,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +51,0,50,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +51,0,52,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +51,0,53,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +52,0,50,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +52,0,51,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +52,0,52,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +52,0,53,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +52,0,55,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +52,0,86,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +53,0,51,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +53,0,52,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +53,0,54,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +54,0,53,44,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +55,0,52,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +55,0,55,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +55,0,56,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +55,0,57,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +56,0,55,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +57,0,13,30,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +57,0,55,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +57,0,58,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +57,0,83,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +57,0,84,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +58,0,57,43,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +59,0,27,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +60,0,41,43,29,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +60,0,61,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +60,0,62,45,30,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +61,0,60,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +61,0,62,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +61,100,107,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +62,0,60,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +62,0,63,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +62,0,30,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +62,0,61,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +63,0,62,46,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +64,0,39,29,56,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +64,0,65,44,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +64,0,103,45,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +64,0,106,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +65,0,64,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +65,0,66,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +65,80,556,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +65,0,68,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +65,80,556,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +65,50,070,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +65,0,39,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +65,60,556,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +65,75,072,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +65,0,71,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +65,80,556,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +65,0,106,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +66,0,65,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +66,0,67,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +66,80,556,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +66,0,77,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +66,0,96,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +66,50,556,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +66,0,97,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +67,0,66,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +67,0,23,44,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +67,0,24,30,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +68,0,23,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +68,0,69,29,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +68,0,65,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +69,0,68,30,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +69,331,120,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +69,0,119,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +69,0,109,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +69,0,113,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +70,0,71,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +70,0,65,30,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +70,0,111,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +71,0,65,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +71,0,70,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +71,0,110,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +72,0,65,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +72,0,118,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +72,0,73,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +72,0,97,48,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +73,0,72,46,17,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +74,0,19,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +74,331,120,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +74,0,121,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +74,0,75,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +75,0,76,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +75,0,77,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +76,0,75,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +77,0,75,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +77,0,78,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +77,0,66,45,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +78,0,77,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +79,0,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +80,0,42,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +80,0,80,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +80,0,80,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +80,0,81,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +81,0,80,44,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +82,0,44,46,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +83,0,57,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +83,0,84,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +83,0,85,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +84,0,57,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +84,0,83,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +84,0,114,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +85,0,83,43,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +86,0,52,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +87,0,45,29,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +88,0,25,30,56,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +88,0,20,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +88,0,92,44,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +89,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +90,0,23,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +91,0,95,45,73,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +91,0,72,30,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +92,0,88,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +92,0,93,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +92,0,94,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +93,0,92,46,27,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +94,0,92,46,27,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +94,309,095,45,3,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +94,0,611,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +95,0,94,46,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +95,0,92,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +95,0,91,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +96,0,66,44,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +97,0,66,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +97,0,72,44,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +97,0,98,29,45,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +98,0,97,46,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +98,0,99,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +99,0,98,50,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +99,0,301,43,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +99,0,100,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +100,0,301,44,23,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +100,0,99,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +100,159,302,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +100,0,33,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +100,0,101,47,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +101,0,100,46,71,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +102,0,103,30,74,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +103,0,102,29,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +103,0,104,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +103,114,618,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +103,115,619,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +103,0,64,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +104,0,103,29,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +104,0,105,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +105,0,104,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +105,0,103,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +106,0,64,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +106,0,65,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +106,0,108,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +107,0,131,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +107,0,132,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +107,0,133,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +107,0,134,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +107,0,135,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +107,0,136,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +107,0,137,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +107,0,138,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +107,0,139,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +107,0,61,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +108,95,556,45,46,47,48,49,50,29,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +108,10,106,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +108,0,626,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +109,0,69,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +109,0,113,45,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +110,0,71,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +110,0,20,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +111,0,70,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +111,40,050,30,39,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +111,50,053,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +111,0,45,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +112,0,131,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +112,0,132,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +112,0,133,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +112,0,134,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +112,0,135,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +112,0,136,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +112,0,137,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +112,0,138,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +112,0,139,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +112,0,140,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +113,0,109,46,11,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +114,0,84,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +115,0,116,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +116,0,115,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +116,0,593,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +117,0,118,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +117,233,660,41,42,69,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +117,332,661,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +117,0,303,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +117,332,021,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +117,0,596,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +118,0,72,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +118,0,117,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +119,0,69,45,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +119,0,653,43,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +120,0,69,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +120,0,74,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +121,0,74,43,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +121,0,653,45,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +122,0,123,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +122,233,660,41,42,69,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +122,0,303,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +122,0,596,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +122,0,124,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +122,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +122,0,129,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +123,0,122,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +123,0,124,43,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +123,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +123,0,129,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +124,0,123,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +124,0,125,47,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +124,0,128,48,37,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +124,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +124,0,129,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +125,0,124,46,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +125,0,126,45,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +125,0,127,43,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +126,0,125,46,23,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +126,0,124,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +126,0,610,30,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +127,0,125,44,11,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +127,0,124,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +127,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +128,0,124,45,29,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +128,0,129,46,30,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +128,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +129,0,128,44,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +129,0,124,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +129,0,130,43,19,40,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +129,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +130,0,129,44,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +130,0,124,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +130,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +131,0,107,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +131,0,132,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +131,0,133,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +131,0,134,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +131,0,135,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +131,0,136,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +131,0,137,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +131,0,138,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +131,0,139,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +131,0,112,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +132,0,107,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +132,0,131,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +132,0,133,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +132,0,134,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +132,0,135,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +132,0,136,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +132,0,137,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +132,0,138,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +132,0,139,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +132,0,112,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +133,0,107,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +133,0,131,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +133,0,132,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +133,0,134,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +133,0,135,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +133,0,136,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +133,0,137,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +133,0,138,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +133,0,139,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +133,0,112,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +134,0,107,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +134,0,131,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +134,0,132,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +134,0,133,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +134,0,135,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +134,0,136,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +134,0,137,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +134,0,138,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +134,0,139,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +134,0,112,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +135,0,107,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +135,0,131,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +135,0,132,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +135,0,133,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +135,0,134,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +135,0,136,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +135,0,137,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +135,0,138,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +135,0,139,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +135,0,112,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +136,0,107,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +136,0,131,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +136,0,132,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +136,0,133,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +136,0,134,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +136,0,135,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +136,0,137,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +136,0,138,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +136,0,139,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +136,0,112,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +137,0,107,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +137,0,131,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +137,0,132,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +137,0,133,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +137,0,134,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +137,0,135,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +137,0,136,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +137,0,138,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +137,0,139,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +137,0,112,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +138,0,107,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +138,0,131,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +138,0,132,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +138,0,133,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +138,0,134,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +138,0,135,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +138,0,136,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +138,0,137,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +138,0,139,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +138,0,112,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +139,0,107,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +139,0,131,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +139,0,132,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +139,0,133,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +139,0,134,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +139,0,135,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +139,0,136,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +139,0,137,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +139,0,138,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +139,0,112,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +140,0,112,45,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +-1 +4 +2,ROAD +2,HILL +3,ENTER +4,UPSTR +5,DNSTR +6,FORES +7,FORWA +7,CONTI +7,ONWAR +8,BACK +8,RETUR +8,RETRE +9,VALLE +10,STAIR +11,OUT +11,OUTSI +11,EXIT +11,LEAVE +12,BUILD +12,HOUSE +13,GULLY +14,STREA +15,ROCK +16,BED +17,CRAWL +18,COBBL +19,INWAR +19,INSID +19,IN +20,SURFA +21,NULL +21,NOWHE +22,DARK +23,PASSA +23,TUNNE +24,LOW +25,CANYO +26,AWKWA +27,GIANT +28,VIEW +29,UPWAR +29,UP +29,U +29,ABOVE +29,ASCEN +30,D +30,DOWN +30,DESCE +31,PIT +32,OUTDO +33,CRACK +34,STEPS +35,DOME +36,LEFT +37,RIGHT +38,HALL +39,JUMP +40,BARRE +41,OVER +42,ACROS +43,EAST +43,E +44,WEST +44,W +45,NORTH +45,N +46,SOUTH +46,S +47,NE +48,SE +49,SW +50,NW +51,DEBRI +52,HOLE +53,WALL +54,BROKE +55,Y2 +56,CLIMB +57,LOOK +57,EXAMI +57,TOUCH +57,DESCR +58,FLOOR +59,ROOM +60,SLIT +61,SLAB +62,XYZZY +63,DEPRE +64,ENTRA +65,PLUGH +66,SECRE +67,CAVE +69,CROSS +70,BEDQU +71,PLOVE +72,ORIEN +73,CAVER +74,SHELL +75,RESER +76,MAIN +76,OFFIC +77,FORK +1001,KEYS +1001,KEY +1002,LAMP +1002,HEADL +1002,LANTE +1003,GRATE +1004,CAGE +1005,ROD +1006,ROD (MUST BE NEXT OBJECT AFTER "REAL" ROD) +1007,STEPS +1008,BIRD +1009,DOOR +1010,PILLO +1010,VELVE +1011,SNAKE +1012,FISSU +1013,TABLE +1014,CLAM +1015,OYSTE +1016,MAGAZ +1016,ISSUE +1016,SPELU +1016,"SPEL +1017,DWARF +1018,KNIFE +1018,KNIVE +1019,FOOD +1019,RATIO +1020,BOTTL +1020,JAR +1021,WATER +1021,H2O +1022,OIL +1023,MIRRO +1024,PLANT +1024,BEANS +1025,PLANT,(MUST BE NEXT OBJECT AFTER "REAL" PLANT) +1026,STALA +1027,SHADO +1027,FIGUR +1028,AXE +1029,DRAWI +1030,PIRAT +1031,DRAGO +1032,CHASM +1033,TROLL +1034,TROLL,(MUST BE NEXT OBJECT AFTER "REAL" TROLL) +1035,BEAR +1036,MESSA +1037,VOLCA +1037,GEYSE,(SAME AS VOLCANO) +1038,MACHI +1038,VENDI +1039,BATTE +1040,CARPE +1040,MOSS +1050,GOLD +1050,NUGGE +1051,DIAMO +1052,SILVE +1052,BARS +1053,JEWEL +1054,COINS +1055,CHEST +1055,BOX +1055,TREAS +1056,EGGS +1056,EGG +1056,NEST +1057,TRIDE +1058,VASE +1058,MING +1058,SHARD +1058,POTTE +1059,EMERA +1060,PLATI +1060,PYRAM +1061,PEARL +1062,RUG +1062,PERSI +1063,SPICE +1064,CHAIN +2001,CARRY +2001,TAKE +2001,KEEP +2001,CATCH +2001,STEAL +2001,CAPTU +2001,GET +2001,TOTE +2002,DROP +2002,RELEA +2002,FREE +2002,DISCA +2002,DUMP +2003,SAY +2003,CHANT +2003,SING +2003,UTTER +2003,MUMBL +2004,UNLOC +2004,OPEN +2005,NOTHI +2006,LOCK +2006,CLOSE +2007,LIGHT +2007,ON +2008,EXTIN +2008,OFF +2009,WAVE +2009,SHAKE +2009,SWING +2010,CALM +2010,PLACA +2010,TAME +2011,WALK +2011,RUN +2011,TRAVE +2011,GO +2011,PROCE +2011,CONTI +2011,EXPLO +2011,GOTO +2011,FOLLO +2011,TURN +2012,ATTAC +2012,KILL +2012,FIGHT +2012,HIT +2012,STRIK +2013,POUR +2014,EAT +2014,DEVOU +2015,DRINK +2016,RUB +2017,THROW +2017,TOSS +2018,QUIT +2019,FIND +2019,WHERE +2020,INVEN +2021,FEED +2022,FILL +2023,BLAST +2023,DETON +2023,IGNIT +2023,BLOWU +2024,SCORE +2025,FEE +2025,FIE +2025,FOE +2025,FOO +2025,FUM +2026,BRIEF +2027,READ +2027,PERUS +2028,BREAK +2028,SHATT +2028,SMASH +2029,WAKE +2029,DISTU +2030,SUSPE +2030,PAUSE +2030,SAVE +2031,HOURS +2032,RESTO +2032,RESUM +3001,FEE +3002,FIE +3003,FOE +3004,FOO +3005,FUM +3050,SESAM +3050,OPENS +3050,ABRA +3050,ABRAC +3050,SHAZA +3050,HOCUS +3050,POCUS +3051,HELP +3051,? +3064,TREE +3064,TREES +3066,DIG +3066,EXCAV +3068,LOST +3069,MIST +3079,SHIT,VARIOUS BAD WORDS. +3079,DAMN +3079,FUCK +3139,STOP +3142,INFO +3147,SWIM +-1 +5 +1,S]ET OF [K]EYS +000,T]HERE ARE SOME KEYS ON THE GROUND HERE. +2,B]RASS [L]ANTERN +000,T]HERE IS A SHINY BRASS LAMP NEARBY. +100,T]HERE IS A LAMP SHINING NEARBY. +3,*GRATE +000,T]HE GRATE IS LOCKED. +100,T]HE GRATE IS OPEN. +4,W]ICKER [C]AGE +000,T]HERE IS A SMALL WICKER CAGE DISCARDED NEARBY. +5,B]LACK [R]OD +000,A] THREE FOOT BLACK ROD WITH A RUSTY STAR ON AN END LIES NEARBY. +6,B]LACK [R]OD +000,A] THREE FOOT BLACK ROD WITH A RUSTY MARK ON AN END LIES NEARBY. +7,*STEPS +000,R]OUGH STONE STEPS LEAD DOWN THE PIT. +100,R]OUGH STONE STEPS LEAD UP THE DOME. +8,L]ITTLE BIRD IN CAGE +000,A] CHEERFUL LITTLE BIRD IS SITTING HERE SINGING. +100,T]HERE IS A LITTLE BIRD IN THE CAGE. +9,*RUSTY DOOR +000,T]HE WAY NORTH IS BARRED BY A MASSIVE, RUSTY, IRON DOOR. +100,T]HE WAY NORTH LEADS THROUGH A MASSIVE, RUSTY, IRON DOOR. +10,V]ELVET [P]ILLOW +000,A] SMALL VELVET PILLOW LIES ON THE FLOOR. +11,*SNAKE +000,A] HUGE GREEN FIERCE SNAKE BARS THE WAY! +100,>$< (CHASED AWAY) +12,*FISSURE +000,>$< +100,A] CRYSTAL BRIDGE NOW SPANS THE FISSURE. +200,T]HE CRYSTAL BRIDGE HAS VANISHED! +13,*STONE TABLET +000,A] MASSIVE STONE TABLET IMBEDDED IN THE WALL READS: +000,"C]ONGRATULATIONS ON BRINGING LIGHT INTO THE [D]ARK [R]OOM!" +14,G]IANT CLAM >[GRUNT!< +000,T]HERE IS AN ENORMOUS CLAM HERE WITH ITS SHELL TIGHTLY CLOSED. +15,G]IANT OYSTER >[GROAN!< +000,T]HERE IS AN ENORMOUS OYSTER HERE WITH ITS SHELL TIGHTLY CLOSED. +100,I]NTERESTING. [T]HERE SEEMS TO BE SOMETHING WRITTEN ON THE UNDERSIDE OF +100,]THE OYSTER. +16,"S]PELUNKER [T]ODAY" +000,T]HERE ARE A FEW RECENT ISSUES OF "[S]PELUNKER [T]ODAY" MAGAZINE HERE. +19,T]ASTY FOOD +000,T]HERE IS FOOD HERE. +20,S]MALL BOTTLE +000,T]HERE IS A BOTTLE OF WATER HERE. +100,T]HERE IS AN EMPTY BOTTLE HERE. +200,T]HERE IS A BOTTLE OF OIL HERE. +21,W]ATER IN THE BOTTLE +22,O]IL IN THE BOTTLE +23,*MIRROR +000,>$< +24,*PLANT +000,T]HERE IS A TINY LITTLE PLANT IN THE PIT, MURMURING "[W]ATER, WATER,..." +100,T]HE PLANT SPURTS INTO FURIOUS GROWTH FOR A FEW SECONDS. +200,T]HERE IS A 12-FOOT-TALL BEANSTALK STRETCHING UP OUT OF THE PIT, +200,]BELLOWING "[W]ATER!! [W]ATER!!" +300,T]HE PLANT GROWS EXPLOSIVELY, ALMOST FILLING THE BOTTOM OF THE PIT. +400,T]HERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE. +500,Y]OU'VE OVER-WATERED THE PLANT! [I]T'S SHRIVELING UP! [I]T'S, IT'S... +25,*PHONY PLANT (SEEN IN TWOPIT ROOM ONLY WHEN TALL ENOUGH) +000,>$< +100,T]HE TOP OF A 12-FOOT-TALL BEANSTALK IS POKING OUT OF THE WEST PIT. +200,T]HERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE. +26,*STALACTITE +000,>$< +27,*SHADOWY FIGURE +000,T]HE SHADOWY FIGURE SEEMS TO BE TRYING TO ATTRACT YOUR ATTENTION. +28,D]WARF'S AXE +000,T]HERE IS A LITTLE AXE HERE. +100,T]HERE IS A LITTLE AXE LYING BESIDE THE BEAR. +29,*CAVE DRAWINGS +000,>$< +30,*PIRATE +000,>$< +31,*DRAGON +000,A] HUGE GREEN FIERCE DRAGON BARS THE WAY! +100,C]ONGRATULATIONS! [Y]OU HAVE JUST VANQUISHED A DRAGON WITH YOUR BARE +100,]HANDS! ([U]NBELIEVABLE, ISN'T IT?) +200,T]HE BODY OF A HUGE GREEN DEAD DRAGON IS LYING OFF TO ONE SIDE. +32,*CHASM +000,A] RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE +000,]MIST. [A] SIGN POSTED ON THE BRIDGE READS, "[S]TOP! [P]AY TROLL!" +100,T]HE WRECKAGE OF A BRIDGE (AND A DEAD BEAR) CAN BE SEEN AT THE BOTTOM +100,]OF THE CHASM. +33,*TROLL +000,A] BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A +000,]TREASURE BEFORE YOU MAY CROSS. +100,T]HE TROLL STEPS OUT FROM BENEATH THE BRIDGE AND BLOCKS YOUR WAY. +200,>$< (CHASED AWAY) +34,*PHONY TROLL +000,T]HE TROLL IS NOWHERE TO BE SEEN. +35,>$< (BEAR USES RTEXT 141) +000,T]HERE IS A FEROCIOUS CAVE BEAR EYING YOU FROM THE FAR END OF THE ROOM! +100,T]HERE IS A GENTLE CAVE BEAR SITTING PLACIDLY IN ONE CORNER. +200,T]HERE IS A CONTENTED-LOOKING BEAR WANDERING ABOUT NEARBY. +300,>$< (DEAD) +36,*MESSAGE IN SECOND MAZE +000,T]HERE IS A MESSAGE SCRAWLED IN THE DUST IN A FLOWERY SCRIPT, READING: +000,"[T]HIS IS NOT THE MAZE WHERE THE PIRATE LEAVES HIS TREASURE CHEST." +37,*VOLCANO AND/OR GEYSER +000,>$< +38,*VENDING MACHINE +000,T]HERE IS A MASSIVE VENDING MACHINE HERE. [T]HE INSTRUCTIONS ON IT READ: +000,"[D]ROP COINS HERE TO RECEIVE FRESH BATTERIES." +39,B]ATTERIES +000,T]HERE ARE FRESH BATTERIES HERE. +100,]SOME WORN-OUT BATTERIES HAVE BEEN DISCARDED NEARBY. +40,*CARPET AND/OR MOSS +000,>$< +50,L]ARGE GOLD NUGGET +000,T]HERE IS A LARGE SPARKLING NUGGET OF GOLD HERE! +51,S]EVERAL DIAMONDS +000,T]HERE ARE DIAMONDS HERE! +52,B]ARS OF SILVER +000,T]HERE ARE BARS OF SILVER HERE! +53,P]RECIOUS JEWELRY +000,T]HERE IS PRECIOUS JEWELRY HERE! +54,R]ARE COINS +000,T]HERE ARE MANY COINS HERE! +55,T]REASURE CHEST +000,T]HE PIRATE'S TREASURE CHEST IS HERE! +56,G]OLDEN EGGS +000,T]HERE IS A LARGE NEST HERE, FULL OF GOLDEN EGGS! +100,T]HE NEST OF GOLDEN EGGS HAS VANISHED! +200,D]ONE! +57,J]EWELED TRIDENT +000,T]HERE IS A JEWEL-ENCRUSTED TRIDENT HERE! +58,M]ING VASE +000,T]HERE IS A DELICATE, PRECIOUS, [M]ING VASE HERE! +100,T]HE VASE IS NOW RESTING, DELICATELY, ON A VELVET PILLOW. +200,T]HE FLOOR IS LITTERED WITH WORTHLESS SHARDS OF POTTERY. +300,T]HE MING VASE DROPS WITH A DELICATE CRASH. +59,E]GG-SIZED EMERALD +000,T]HERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG! +60,P]LATINUM PYRAMID +000,T]HERE IS A PLATINUM PYRAMID HERE, 8 INCHES ON A SIDE! +61,G]LISTENING PEARL +000,O]FF TO ONE SIDE LIES A GLISTENING PEARL! +62,P]ERSIAN RUG +000,T]HERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR! +100,T]HE DRAGON IS SPRAWLED OUT ON A PERSIAN RUG!! +63,R]ARE SPICES +000,T]HERE ARE RARE SPICES HERE! +64,G]OLDEN CHAIN +000,T]HERE IS A GOLDEN CHAIN LYING IN A HEAP ON THE FLOOR! +100,T]HE BEAR IS LOCKED TO THE WALL WITH A GOLDEN CHAIN! +200,T]HERE IS A GOLDEN CHAIN LOCKED TO THE WALL! +-1 +6 +1,S]OMEWHERE NEARBY IS [C]OLOSSAL [C]AVE, WHERE OTHERS HAVE FOUND FORTUNES +1,]IN TREASURE AND GOLD,THOUGH IT IS RUMORED THAT SOME WHO ENTER ARE NEVER +1,]SEEN AGAIN. [M]AGIC IS SAID TO WORK IN THE CAVE. [I] WILL BE YOUR EYES +1,]AND HANDS. [D]IRECT ME WITH COMMANDS OF 1 OR 2 WORDS. [I] SHOULD WARN +1,]YOU THAT [I] LOOK AT ONLY THE FIRST FOUR LETTERS OF EACH WORD,SO YOU'LL +1,]HAVE TO ENTER "NORTHEAST" AS "NE" TO DISTINGUISH IT FROM "NORTH". +1,(S]HOULD YOU GET STUCK, TYPE "HELP" FOR SOME GENERAL HINTS. [F]OR +1,]INFORMATION ON HOW TO END YOUR ADVENTURE, ETC., TYPE "[INFO".) +1, - - - +1,T]HIS PROGRAM WAS ORIGINALLY DEVELOPED BY [W]ILLIE [C]ROWTHER. [M]OST OF +1,]THE FEATURES OF THE CURRENT PROGRAM WERE ADDED BY [D]ON [W]OODS. +1,T]HIS VERSION, FOR THE [PDP]-8, WAS DONE BY [D]ICK [M]URPHY. IT IS +1,]BASED ON A VERSION FOR [RT]-11 DONE BY [B]OB [S]UPNIK. +2,A] LITTLE DWARF WITH A BIG KNIFE BLOCKS YOUR WAY. +3,A] LITTLE DWARF JUST WALKED AROUND A CORNER, SAW YOU, THREW A LITTLE +3,]AXE AT YOU WHICH MISSED, CURSED, AND RAN AWAY. +4,T]HERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU! +5,O]NE SHARP NASTY KNIFE IS THROWN AT YOU! +6,N]ONE OF THEM HIT YOU! +7,O]NE OF THEM GETS YOU! +8,A] HOLLOW VOICE SAYS "[PLUGH". +9,T]HERE IS NO WAY TO GO THAT DIRECTION. +10,I] AM UNSURE HOW YOU ARE FACING. [U]SE COMPASS POINTS OR NEARBY OBJECTS. +11,I] DON'T KNOW "[IN]" FROM "[OUT]" HERE. [U]SE COMPASS POINTS OR NAME +11,]SOMETHING IN THE GENERAL DIRECTION YOU WANT TO GO. +12,I] DON'T KNOW HOW TO APPLY THAT WORD HERE. +13,I] DON'T UNDERSTAND THAT! +14,I]'M GAME. [W]OULD YOU CARE TO EXPLAIN HOW? +15,S]ORRY, BUT [I] AM NOT ALLOWED TO GIVE MORE DETAIL. [I] WILL REPEAT THE +15,]LONG DESCRIPTION OF YOUR LOCATION. +16,I]T IS NOW PITCH DARK. [I]F YOU PROCEED YOU WILL LIKELY FALL INTO A PIT. +17,I]F YOU PREFER, SIMPLY TYPE "[W]" RATHER THAN "[WEST". +18,A]RE YOU TRYING TO CATCH THE BIRD? +19,T]HE BIRD IS FRIGHTENED RIGHT NOW AND YOU CANNOT CATCH IT NO MATTER +19,]WHAT YOU TRY. [P]ERHAPS YOU MIGHT TRY LATER. +20,A]RE YOU TRYING TO SOMEHOW DEAL WITH THE SNAKE? +21,Y]OU CAN'T KILL THE SNAKE, OR DRIVE IT AWAY, OR AVOID IT, OR ANYTHING +21,L]IKE THAT. [T]HERE IS A WAY TO GET BY, BUT YOU DON'T HAVE THE NECESSARY +21,]RESOURCES RIGHT NOW. +22,D]O YOU REALLY WANT TO QUIT NOW? +23,Y]OU FELL INTO A PIT AND BROKE EVERY BONE IN YOUR BODY! +24,Y]OU ARE ALREADY CARRYING IT! +25,Y]OU CAN'T BE SERIOUS! +26,T]HE BIRD WAS UNAFRAID WHEN YOU ENTERED, BUT AS YOU APPROACH IT BECOMES +26,]DISTURBED AND YOU CANNOT CATCH IT. +27,]YOU CAN CATCH THE BIRD, BUT YOU CANNOT CARRY IT. +28,T]HERE IS NOTHING HERE WITH A LOCK! +29,Y]OU AREN'T CARRYING IT! +30,T]HE LITTLE BIRD ATTACKS THE GREEN SNAKE, AND IN AN ASTOUNDING FLURRY +30,]DRIVES THE SNAKE AWAY. +31,Y]OU HAVE NO KEYS! +32,I]T HAS NO LOCK. +33,I] DON'T KNOW HOW TO LOCK OR UNLOCK SUCH A THING. +34,I]T WAS ALREADY LOCKED. +35,T]HE GRATE IS NOW LOCKED. +36,T]HE GRATE IS NOW UNLOCKED. +37,I]T WAS ALREADY UNLOCKED. +38,Y]OU HAVE NO SOURCE OF LIGHT. +39,Y]OUR LAMP IS NOW ON. +40,Y]OUR LAMP IS NOW OFF. +41,T]HERE IS NO WAY TO GET PAST THE BEAR TO UNLOCK THE CHAIN, WHICH IS +41,]PROBABLY JUST AS WELL. +42,N]OTHING HAPPENS. +43,W]HERE? +44,T]HERE IS NOTHING HERE TO ATTACK. +45,T]HE LITTLE BIRD IS NOW DEAD. [I]TS BODY DISAPPEARS. +46,A]TTACKING THE SNAKE BOTH DOESN'T WORK AND IS VERY DANGEROUS. +47,Y]OU KILLED A LITTLE DWARF. +48,Y]OU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY. +49,W]ITH WHAT? [Y]OUR BARE HANDS? +50,G]OOD TRY, BUT THAT IS AN OLD WORN-OUT MAGIC WORD. +51,I] KNOW OF PLACES, ACTIONS, AND THINGS. [M]OST OF MY VOCABULARY +51,]DESCRIBES PLACES AND IS USED TO MOVE YOU THERE. [T]O MOVE, TRY WORDS +51,]LIKE ["FOREST", "DNSTREAM", "ENTER", "EAST", "WEST", "NORTH", "SOUTH", +51,"UP", ]OR ["DOWN". I] KNOW ABOUT A FEW SPECIAL OBJECTS, LIKE A BLACK ROD +51,]HIDDEN IN THE CAVE. [T]HESE OBJECTS CAN BE MANIPULATED USING SOME OF +51,]THE ACTION WORDS THAT [I] KNOW.[U]SUALLY YOU WILL NEED TO GIVE BOTH THE +51,]OBJECT AND ACTION WORDS (IN EITHER ORDER), BUT SOMETIMES [I] CAN INFER +51,]THE OBJECT FROM THE VERB ALONE. [S]OME OBJECTS ALSO IMPLY VERBS; IN +51,]PARTICULAR,"[INVENTORY]" IMPLIES "[TAKE INVENTORY]", WHICH CAUSES ME TO +51,]GIVE YOU A LIST OF WHAT YOU'RE CARRYING. [T]HE OBJECTS HAVE SIDE +51,]EFFECTS; FOR INSTANCE, THE ROD SCARES THE BIRD. [U]SUALLY PEOPLE HAVING +51,]TROUBLE MOVING JUST NEED TO TRY A FEW MORE WORDS. [U]SUALLY PEOPLE +51,]TRYING UNSUCCESSFULLY TO MANIPULATE AN OBJECT ARE ATTEMPTING SOMETHING +51,]BEYOND THEIR (OR MY!) CAPABILITIES AND SHOULD TRY A COMPLETELY +51,]DIFFERENT TACK. [T]O SPEED THE GAME YOU CAN SOMETIMES MOVE LONG +51,]DISTANCES WITH A SINGLE WORD. [F]OR EXAMPLE, "[BUILDING]" USUALLY GETS +51,]YOU TO THE BUILDING FROM ANYWHERE ABOVE GROUND EXCEPT WHEN LOST IN THE +51,]FOREST. [A]LSO, NOTE THAT CAVE PASSAGES TURN A LOT, AND THAT LEAVING A +51,]ROOM TO THE NORTH DOES NOT GUARANTEE ENTERING THE NEXT FROM THE SOUTH. +51,G]OOD LUCK! +52,I]T MISSES! +53,I]T GETS YOU! +54,OK! +55,Y]OU CAN'T UNLOCK THE KEYS. +56,Y]OU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE +56,]MAIN PASSAGE. +57,I] DON'T KNOW WHERE THE CAVE IS, BUT HEREABOUTS NO STREAM CAN RUN ON +57,T]HE SURFACE FOR LONG. [I] WOULD TRY THE STREAM. +58,I] NEED MORE DETAILED INSTRUCTIONS TO DO THAT. +59,I] CAN ONLY TELL YOU WHAT YOU SEE AS YOU MOVE ABOUT AND MANIPULATE +59,]THINGS. [I] CANNOT TELL YOU WHERE REMOTE THINGS ARE. +60,I] DON'T KNOW THAT WORD. +61,W]HAT? +62,A]RE YOU TRYING TO GET INTO THE CAVE? +63,T]HE GRATE IS VERY SOLID AND HAS A HARDENED STEEL LOCK. [Y]OU CANNOT +63,]ENTER WITHOUT A KEY, AND THERE ARE NO KEYS NEARBY. [I] WOULD RECOMMEND +63,]LOOKING ELSEWHERE FOR THE KEYS. +64,T]HE TREES OF THE FOREST ARE LARGE HARDWOOD OAK AND MAPLE, WITH AN +64,]OCCASIONAL GROVE OF PINE OR SPRUCE. [T]HERE IS QUITE A BIT OF UNDER- +64,]GROWTH, LARGELY BIRCH AND ASH SAPLINGS PLUS NONDESCRIPT BUSHES OF +64,]VARIOUS SORTS. [T]HIS TIME OF YEAR VISIBILITY IS QUITE RESTRICTED BY +64,]ALL THE LEAVES, BUT TRAVEL IS QUITE EASY IF YOU DETOUR AROUND THE +64,]SPRUCE AND BERRY BUSHES. +65,W]ELCOME TO [A]DVENTURE!! [W]OULD YOU LIKE INSTRUCTIONS? +66,D]IGGING WITHOUT A SHOVEL IS QUITE IMPRACTICAL. [E]VEN WITH A SHOVEL +66,]PROGRESS IS UNLIKELY. +67,B]LASTING REQUIRES DYNAMITE. +68,I]'M AS CONFUSED AS YOU ARE. +69,M]IST IS A WHITE VAPOR, USUALLY WATER, SEEN FROM TIME TO TIME IN +69,]CAVERNS. [I]T CAN BE FOUND ANYWHERE BUT IS FREQUENTLY A SIGN OF A DEEP +69,]PIT LEADING DOWN TO WATER. +70,Y]OUR FEET ARE NOW WET. +71,I] THINK [I] JUST LOST MY APPETITE. +72,T]HANK YOU, IT WAS DELICIOUS! +73,Y]OU HAVE TAKEN A DRINK FROM THE STREAM. [T]HE WATER TASTES STRONGLY OF +73,]MINERALS, BUT IS NOT UNPLEASANT. [I]T IS EXTREMELY COLD. +74,T]HE BOTTLE OF WATER IS NOW EMPTY. +75,R]UBBING THE ELECTRIC LAMP IS NOT PARTICULARLY REWARDING. [A]NYWAY, +75,]NOTHING EXCITING HAPPENS. +76,P]ECULIAR. [N]OTHING UNEXPECTED HAPPENS. +77,Y]OUR BOTTLE IS EMPTY AND THE GROUND IS WET. +78,Y]OU CAN'T POUR THAT. +79,W]ATCH IT! +80,W]HICH WAY? +81,O]H DEAR, YOU SEEM TO HAVE GOTTEN YOURSELF KILLED. [I] MIGHT BE ABLE TO +81,]HELP YOU OUT,BUT [I]'VE NEVER REALLY DONE THIS BEFORE. [D]O YOU WANT ME +81,]TO TRY TO REINCARNATE YOU? +82,A]LL RIGHT. [B]UT DON'T BLAME ME IF SOMETHING GOES WR...... +82, --- POOF!! --- +82,Y]OU ARE ENGULFED IN A CLOUD OF ORANGE SMOKE. [C]OUGHING AND GASPING, +82,]YOU EMERGE FROM THE SMOKE AND FIND.... +83,Y]OU CLUMSY OAF, YOU'VE DONE IT AGAIN! [I] DON'T KNOW HOW LONG [I] CAN +83,]KEEP THIS UP. [D]O YOU WANT ME TO TRY REINCARNATING YOU AGAIN? +84,O]KAY, NOW WHERE DID [I] PUT MY ORANGE SMOKE?.... >P]OOF!< +84,E]VERYTHING DISAPPEARS IN A DENSE CLOUD OF ORANGE SMOKE. +85,N]OW YOU'VE REALLY DONE IT! [I]'M OUT OF ORANGE SMOKE! [Y]OU DON'T +85,]EXPECT ME TO DO A DECENT REINCARNATION WITHOUT ANY ORANGE SMOKE,DO YOU? +86,O]KAY, IF YOU'RE SO SMART, DO IT YOURSELF! [I]'M LEAVING! +90,>>> MESSAGES 81 THRU 90 ARE RESERVED FOR "OBITUARIES". <<< +91,S]ORRY, BUT [I] NO LONGER SEEM TO REMEMBER HOW IT WAS YOU GOT HERE. +92,Y]OU CAN'T CARRY ANYTHING MORE. [Y]OU'LL HAVE TO DROP SOMETHING FIRST. +93,Y]OU CAN'T GO THROUGH A LOCKED STEEL GRATE! +94,I] BELIEVE WHAT YOU WANT IS RIGHT HERE WITH YOU. +95,Y]OU DON'T FIT THROUGH A TWO-INCH SLIT! +96,I] RESPECTFULLY SUGGEST YOU GO ACROSS THE BRIDGE INSTEAD OF JUMPING. +97,T]HERE IS NO WAY ACROSS THE FISSURE. +98,Y]OU'RE NOT CARRYING ANYTHING. +99,Y]OU ARE CURRENTLY HOLDING THE FOLLOWING: +100,I]T'S NOT HUNGRY (IT'S MERELY PININ' FOR THE FJORDS). [B]ESIDES, YOU +100,]HAVE NO BIRD SEED. +101,T]HE SNAKE HAS NOW DEVOURED YOUR BIRD. +102,T]HERE'S NOTHING HERE IT WANTS TO EAT (EXCEPT PERHAPS YOU). +103,Y]OU FOOL, DWARVES EAT ONLY COAL! [N]OW YOU'VE MADE HIM [REALLY] MAD!! +104,Y]OU HAVE NOTHING IN WHICH TO CARRY IT. +105,Y]OUR BOTTLE IS ALREADY FULL. +106,T]HERE IS NOTHING HERE WITH WHICH TO FILL THE BOTTLE. +107,Y]OUR BOTTLE IS NOW FULL OF WATER. +108,Y]OUR BOTTLE IS NOW FULL OF OIL. +109,Y]OU CAN'T FILL THAT. +110,D]ON'T BE RIDICULOUS! +111,T]HE DOOR IS EXTREMELY RUSTY AND REFUSES TO OPEN. +112,T]HE PLANT INDIGNANTLY SHAKES THE OIL OFF ITS LEAVES AND ASKS,"[W]ATER?" +113,T]HE HINGES ARE QUITE THOROUGHLY RUSTED NOW AND WON'T BUDGE. +114,T]HE OIL HAS FREED UP THE HINGES SO THAT THE DOOR WILL NOW MOVE, +114,]ALTHOUGH IT REQUIRES SOME EFFORT. +115,T]HE PLANT HAS EXCEPTIONALLY DEEP ROOTS AND CANNOT BE PULLED FREE. +116,T]HE DWARVES' KNIVES VANISH AS THEY STRIKE THE WALLS OF THE CAVE. +117,S]OMETHING YOU'RE CARRYING WON'T FIT THROUGH THE TUNNEL WITH YOU. +117,Y]OU'D BEST TAKE INVENTORY AND DROP SOMETHING. +118,Y]OU CAN'T FIT THIS FIVE-FOOT CLAM THROUGH THAT LITTLE PASSAGE! +119,Y]OU CAN'T FIT THIS FIVE-FOOT OYSTER THROUGH THAT LITTLE PASSAGE! +120,I] ADVISE YOU TO PUT DOWN THE CLAM BEFORE OPENING IT. >[S]TRAIN!< +121,I] ADVISE YOU TO PUT DOWN THE OYSTER BEFORE OPENING IT. >[W]RENCH!< +122,Y]OU DON'T HAVE ANYTHING STRONG ENOUGH TO OPEN THE CLAM. +123,Y]OU DON'T HAVE ANYTHING STRONG ENOUGH TO OPEN THE OYSTER. +124,A] GLISTENING PEARL FALLS OUT OF THE CLAM AND ROLLS AWAY. [G]OODNESS, +124,]THIS MUST REALLY BE AN OYSTER. ([I] NEVER WAS VERY GOOD AT IDENTIFYING +124,]BIVALVES.) [W]HATEVER IT IS, IT HAS NOW SNAPPED SHUT AGAIN. +125,T]HE OYSTER CREAKS OPEN, REVEALING NOTHING BUT OYSTER INSIDE. [I]T +125,]PROMPTLY SNAPS SHUT AGAIN. +126,Y]OU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND FOUND YOUR WAY +126,]BLOCKED BY A RECENT CAVE-IN. [Y]OU ARE NOW BACK IN THE MAIN PASSAGE. +127,T]HERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS BEHIND YOU. +128,O]UT FROM THE SHADOWS BEHIND YOU POUNCES A BEARDED PIRATE! "H]AR, HAR," +128,H]E CHORTLES, "[I]'LL JUST TAKE ALL THIS BOOTY AND HIDE IT AWAY WITH ME +128,]CHEST DEEP IN THE MAZE!" [H]E SNATCHES YOUR TREASURE AND VANISHES INTO +128,]THE GLOOM. +129,A] SEPULCHRAL VOICE REVERBERATING THROUGH THE CAVE SAYS, "[C]AVE CLOSING +129,]SOON. [A]LL ADVENTURERS EXIT IMMEDIATELY THROUGH [M]AIN [O]FFICE." +130,A] MYSTERIOUS RECORDED VOICE GROANS INTO LIFE AND ANNOUNCES: +130, "T]HIS EXIT IS CLOSED. [P]LEASE LEAVE VIA [M]AIN [O]FFICE." +131,I]T LOOKS AS THOUGH YOU'RE DEAD. [W]ELL, SEEING AS HOW IT'S SO CLOSE TO +131,]CLOSING TIME ANYWAY, [I] THINK WE'LL JUST CALL IT A DAY. +132,T]HE SEPULCHRAL VOICE ENTONES, "T]HE CAVE IS NOW CLOSED." [A]S THE +132,]ECHOES FADE, THERE IS A BLINDING FLASH OF LIGHT (AND A SMALL PUFF OF +132,]ORANGE SMOKE). . . .[A]S YOUR EYES REFOCUS, YOU LOOK AROUND AND FIND... +133,T]HERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE APPEARS IN THE FAR +133,]WALL, BURYING THE DWARVES IN THE RUBBLE. [Y]OU MARCH THROUGH THE HOLE +133,]AND FIND YOURSELF IN THE [M]AIN [O]FFICE, WHERE A CHEERING BAND OF +133,]FRIENDLY ELVES CARRY THE CONQUERING ADVENTURER OFF INTO THE SUNSET. +134,T]HERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE APPEARS IN THE FAR +134,]WALL, BURYING THE SNAKES IN THE RUBBLE. [A] RIVER OF MOLTEN LAVA POURS +134,]IN THROUGH THE HOLE, DESTROYING EVERYTHING IN ITS PATH, INCLUDING YOU! +135,T]HERE IS A LOUD EXPLOSION, AND YOU ARE SUDDENLY SPLASHED ACROSS THE +135,]WALLS OF THE ROOM. +136,T]HE RESULTING RUCKUS HAS AWAKENED THE DWARVES. T]HERE ARE NOW SEVERAL +136,]THREATENING LITTLE DWARVES IN THE ROOM WITH YOU! [M]OST OF THEM THROW +136,]KNIVES AT YOU! [A]LL OF THEM GET YOU! +137,O]H, LEAVE THE POOR UNHAPPY BIRD ALONE. +138,I] DARESAY WHATEVER YOU WANT IS AROUND HERE SOMEWHERE. +139,I] DON'T KNOW THE WORD "[STOP]". [U]SE "[QUIT]" IF YOU WANT TO GIVE UP. +140,Y]OU CAN'T GET THERE FROM HERE. +141,Y]OU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR. +142,I]F YOU WANT TO END YOUR ADVENTURE EARLY, SAY "[QUIT]". [T]O SUSPEND +142,]YOUR ADVENTURE SUCH THAT YOU CAN CONTINUE LATER, SAY "[SUSPEND]" (OR +142,"PAUSE" ]OR "[SAVE]"). [T]O SEE WHAT HOURS THE CAVE IS NORMALLY OPEN, +142,]SAY "[HOURS]". [T]O SEE HOW WELL YOU'RE DOING, SAY "[SCORE]". [T]O GET +142,]FULL CREDIT FOR A TREASURE, YOU MUST HAVE LEFT IT SAFELY IN THE +142,]BUILDING, THOUGH YOU GET PARTIAL CREDIT JUST FOR LOCATING IT. [Y]OU +142,]LOSE POINTS FOR GETTING KILLED, OR FOR QUITTING, THOUGH THE FORMER +142,]COSTS YOU MORE. [T]HERE ARE ALSO POINTS BASED ON HOW MUCH (IF ANY) OF +142,]THE CAVE YOU'VE MANAGED TO EXPLORE; IN PARTICULAR, THERE IS A LARGE +142,]BONUS JUST FOR GETTING IN (TO DISTINGUISH THE BEGINNERS FROM THE REST +142,]OF THE PACK), AND THERE ARE OTHER WAYS TO DETERMINE WHETHER YOU'VE BEEN +142,]THROUGH SOME OF THE MORE HARROWING SECTIONS. [I]F YOU THINK YOU'VE +142,]FOUND ALL THE TREASURES, JUST KEEP EXPLORING FOR A WHILE. [I]F NOTHING +142,]INTERESTING HAPPENS, YOU HAVEN'T FOUND THEM ALL YET. [I]F SOMETHING +142,]INTERESTING *DOES* HAPPEN,IT MEANS YOU'RE GETTING A BONUS AND HAVE AN +142,]OPPORTUNITY TO GARNER MANY MORE POINTS IN THE MASTER'S SECTION. +142,I] MAY OCCASIONALLY OFFER HINTS IF YOU SEEM TO BE HAVING TROUBLE. [I]F +142,I] DO, [I]'LL WARN YOU IN ADVANCE HOW MUCH IT WILL AFFECT YOUR SCORE TO +142,]ACCEPT THE HINTS. [F]INALLY, TO SAVE PAPER, YOU MAY SPECIFY ["BRIEF"], +142,]WHICH TELLS ME NEVER TO REPEAT THE FULL DESCRIPTION OF A PLACE UNLESS +142,]YOU EXPLICITLY ASK ME TO. +143,D]O YOU INDEED WISH TO QUIT NOW? +144,T]HERE IS NOTHING HERE WITH WHICH TO FILL THE VASE. +145,T]HE SUDDEN CHANGE IN TEMPERATURE HAS DELICATELY SHATTERED THE VASE. +146,I]T IS BEYOND YOUR POWER TO DO THAT. +147,I] DON'T KNOW HOW. +148,I]T IS TOO FAR UP FOR YOU TO REACH. +149,Y]OU KILLED A LITTLE DWARF. [T]HE BODY VANISHES IN A CLOUD OF GREASY +149,]BLACK SMOKE. +150,T]HE SHELL IS VERY STRONG AND IS IMPERVIOUS TO ATTACK. +151,W]HAT'S THE MATTER, CAN'T YOU READ? [N]OW YOU'D BEST START OVER. +152,T]HE AXE BOUNCES HARMLESSLY OFF THE DRAGON'S THICK SCALES. +153,T]HE DRAGON LOOKS RATHER NASTY. [Y]OU'D BEST NOT TRY TO GET BY. +154,T]HE LITTLE BIRD ATTACKS THE GREEN DRAGON, AND IN AN ASTOUNDING FLURRY +154,]GETS BURNT TO A CINDER. [T]HE ASHES BLOW AWAY. +155,O]N WHAT? +156,O]KAY, FROM NOW ON [I]'LL ONLY DESCRIBE A PLACE IN FULL THE FIRST TIME +156,]YOU COME TO IT. [T]O GET THE FULL DESCRIPTION, SAY "[LOOK". +157,T]ROLLS ARE CLOSE RELATIVES WITH THE ROCKS AND HAVE SKIN AS TOUGH AS +157,]THAT OF A RHINOCEROS. [T]HE TROLL FENDS OFF YOUR BLOWS EFFORTLESSLY. +158,T]HE TROLL DEFTLY CATCHES THE AXE, EXAMINES IT CAREFULLY, AND TOSSES IT +158,]BACK, DECLARING, "[G]OOD WORKMANSHIP, BUT IT'S NOT VALUABLE ENOUGH." +159,T]HE TROLL CATCHES YOUR TREASURE AND SCURRIES AWAY OUT OF SIGHT. +160,T]HE TROLL REFUSES TO LET YOU CROSS. +161,T]HERE IS NO LONGER ANY WAY ACROSS THE CHASM. +162,J]UST AS YOU REACH THE OTHER SIDE, THE BRIDGE BUCKLES BENEATH THE +162,]WEIGHT OF THE BEAR, WHICH WAS STILL FOLLOWING YOU AROUND. [Y]OU +162,]SCRABBLE DESPERATELY FOR SUPPORT, BUT AS THE BRIDGE COLLAPSES YOU +162,]STUMBLE BACK AND FALL INTO THE CHASM. +163,T]HE BEAR LUMBERS TOWARD THE TROLL, WHO LETS OUT A STARTLED SHRIEK AND +163,]SCURRIES AWAY. [T]HE BEAR SOON GIVES UP THE PURSUIT AND WANDERS BACK. +164,T]HE AXE MISSES AND LANDS NEAR THE BEAR WHERE YOU CAN'T GET AT IT. +165,W]ITH WHAT? [Y]OUR BARE HANDS? [A]GAINST *HIS* BEAR HANDS?? +166,T]HE BEAR IS CONFUSED; HE ONLY WANTS TO BE YOUR FRIEND. +167,F]OR CRYING OUT LOUD, THE POOR THING IS ALREADY DEAD! +168,T]HE BEAR EAGERLY WOLFS DOWN YOUR FOOD, AFTER WHICH HE SEEMS TO CALM +168,]DOWN CONSIDERABLY AND EVEN BECOMES RATHER FRIENDLY. +169,T]HE BEAR IS STILL CHAINED TO THE WALL. +170,T]HE CHAIN IS STILL LOCKED. +171,T]HE CHAIN IS NOW UNLOCKED. +172,T]HE CHAIN IS NOW LOCKED. +173,T]HERE IS NOTHING HERE TO WHICH THE CHAIN CAN BE LOCKED. +174,T]HERE IS NOTHING HERE TO EAT. +175,D]O YOU WANT THE HINT? +176,D]O YOU NEED HELP GETTING OUT OF THE MAZE? +177,Y]OU CAN MAKE THE PASSAGES LOOK LESS ALIKE BY DROPPING THINGS. +178,A]RE YOU TRYING TO EXPLORE BEYOND THE [P]LOVER [R]OOM? +179,T]HERE IS A WAY TO EXPLORE THAT REGION WITHOUT HAVING TO WORRY ABOUT +179,]FALLING INTO A PIT. [N]ONE OF THE OBJECTS AVAILABLE IS IMMEDIATELY +179,]USEFUL IN DISCOVERING THE SECRET. +180,D]O YOU NEED HELP GETTING OUT OF HERE? +181,D]ON'T GO WEST. +182,G]LUTTONY IS NOT ONE OF THE TROLL'S VICES. [A]VARICE, HOWEVER, IS. +183,Y]OUR LAMP IS GETTING DIM. YOU'D BEST START WRAPPING THIS UP, UNLESS +183,Y]OU CAN FIND SOME FRESH BATTERIES. [I] SEEM TO RECALL THERE'S A VENDING +183,]MACHINE IN THE MAZE. [B]RING SOME COINS WITH YOU. +184,Y]OUR LAMP HAS RUN OUT OF POWER. +185,T]HERE'S NOT MUCH POINT IN WANDERING AROUND OUT HERE, AND YOU CAN'T +185,]EXPLORE THE CAVE WITHOUT A LAMP. [S]O LET'S JUST CALL IT A DAY. +186,T]HERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS BEHIND YOU. [A]S YOU +186,]TURN TOWARD THEM, THE BEAM OF YOUR LAMP FALLS ACROSS A BEARDED PIRATE. +186,H]E IS CARRYING A LARGE CHEST. "[S]HIVER ME TIMBERS!" HE CRIES, "[I]'VE +186,]BEEN SPOTTED! [I]'D BEST HIE MESELF OFF TO THE MAZE TO HIDE ME CHEST!" +186,W]ITH THAT, HE VANISHES INTO THE GLOOM. +187,Y]OUR LAMP IS GETTING DIM. [Y]OU'D BEST GO BACK FOR THOSE BATTERIES. +188,Y]OUR LAMP IS GETTING DIM. [I]'M TAKING THE LIBERTY OF REPLACING THE +188,]BATTERIES. +189,Y]OUR LAMP IS GETTING DIM, AND YOU'RE OUT OF SPARE BATTERIES. [Y]OU'D +189,]BEST START WRAPPING THIS UP. +190,I]'M AFRAID THE MAGAZINE IS WRITTEN IN [D]WARVISH. +191,"T]HIS IS NOT THE MAZE WHERE THE PIRATE LEAVES HIS TREASURE CHEST." +192,H]MMM, THIS LOOKS LIKE A CLUE, WHICH MEANS IT'LL COST YOU 10 POINTS TO +192,]READ IT. [S]HOULD [I] GO AHEAD AND READ IT ANYWAY? +193,I]T SAYS, "[T]HERE IS SOMETHING STRANGE ABOUT THIS PLACE, SUCH THAT ONE +193,]OF THE WORDS [I]'VE ALWAYS KNOWN NOW HAS A NEW EFFECT." +194,I]T SAYS THE SAME THING IT DID BEFORE. +195,I]'M AFRAID [I] DON'T UNDERSTAND. +196,"C]ONGRATULATIONS ON BRINGING LIGHT INTO THE [D]ARK [R]OOM!" +197,Y]OU STRIKE THE MIRROR A RESOUNDING BLOW, WHEREUPON IT SHATTERS INTO A +197,]MYRIAD TINY FRAGMENTS. +198,Y]OU HAVE TAKEN THE VASE AND HURLED IT DELICATELY TO THE GROUND. +199,Y]OU PROD THE NEAREST DWARF, WHO WAKES UP GRUMPILY, TAKES ONE LOOK AT +199,Y]OU, CURSES, AND GRABS FOR HIS AXE. +200,I]S THIS ACCEPTABLE? +201,C]OLOSSAL [C]AVE IS [ALWAYS] OPEN, PROVIDED THIS IS YOUR [PDP-8. +202,T]AKEN. +-1 +7 +1,3 +2,3 +3,8,9 +4,10 +5,11 +6,0 +7,14,15 +8,13 +9,94,-1 +10,96 +11,19,-1 +12,17,27 +13,101,-1 +14,103 +15,0 +16,106 +17,0,-1 +18,0 +19,3 +20,3 +21,0 +22,0 +23,109,-1 +24,25,-1 +25,23,67 +26,111,-1 +27,35,110 +28,0 +29,97,-1 +30,0,-1 +31,119,121 +32,117,122 +33,117,122 +34,0,0 +35,130,-1 +36,0,-1 +37,126,-1 +38,140,-1 +39,0 +40,96,-1 +50,18 +51,27 +52,28 +53,29 +54,30 +55,0 +56,92 +57,95 +58,97 +59,100 +60,101 +61,0 +62,119,121 +63,127 +64,130,-1 +-1 +8 +1,24 +2,29 +3,0 +4,33 +5,0 +6,33 +7,38 +8,38 +9,42 +10,14 +11,43 +12,110 +13,29 +14,110 +15,73 +16,75 +17,29 +18,13 +19,59 +20,59 +21,174 +22,109 +23,67 +24,13 +25,147 +26,155 +27,195 +28,146 +29,110 +30,13 +31,13 +-1 +9 +0,1,2,3,4,5,6,7,8,9,10 +0,100,115,116,126 +2,1,3,4,7,38,95,113,24 +1,24 +3,46,47,48,54,56,58,82,85,86 +3,122,123,124,125,126,127,128,129,130 +4,8 +5,13 +6,19 +7,42,43,44,45,46,47,48,49,50,51 +7,52,53,54,55,56,80,81,82,86,87 +8,99,100,101 +9,108 +-1 +10 +35,Y]OU ARE OBVIOUSLY A [R]ANK [A]MATEUR. [B]ETTER LUCK NEXT TIME. +100,Y]OUR SCORE QUALIFIES YOU AS A [N]OVICE [C]LASS [A]DVENTURER. +130,Y]OU HAVE ACHIEVED THE RATING: "[E]XPERIENCED [A]DVENTURER". +200,Y]OU MAY NOW CONSIDER YOURSELF A "[S]EASONED [A]DVENTURER". +250,Y]OU HAVE REACHED "[J]UNIOR [M]ASTER" STATUS. +300,Y]OUR SCORE PUTS YOU IN [M]ASTER [A]DVENTURER CLASS [C. +330,Y]OUR SCORE PUTS YOU IN [M]ASTER [A]DVENTURER CLASS [B. +349,Y]OUR SCORE PUTS YOU IN [M]ASTER [A]DVENTURER CLASS [A. +999,A]LL OF [A]DVENTUREDOM GIVES TRIBUTE TO YOU, [A]DVENTURER [G]RANDMASTER! +-1 +11 +2,9999,10,0,0 +3,9999,5,0,0 +4,4,2,62,63 +5,5,2,18,19 +6,8,2,20,21 +7,75,4,176,177 +8,25,5,178,179 +9,20,3,180,181 +-1 +12 +-1 +0 diff --git a/sw/adventure/AMAIN.RA b/sw/adventure/AMAIN.RA new file mode 100644 index 0000000..3b0d477 --- /dev/null +++ b/sw/adventure/AMAIN.RA @@ -0,0 +1,6482 @@ + EXTERN SAVEGM + EXTERN RSTRGM + EXTERN A5TOA1 + SECT AMAIN + EXTERN BITSET + EXTERN BUG + EXTERN CARRY + EXTERN DROP + EXTERN DSTROY + EXTERN GETIN + EXTERN IABS + EXTERN JUGGLE + EXTERN MAX0 + EXTERN MIN0 + EXTERN MOD + EXTERN MOVE + EXTERN SPEAK + EXTERN PSPEAK + EXTERN PUT + EXTERN RND + EXTERN RSPEAK + EXTERN SPEAK + EXTERN VOCAB + EXTERN YES + EXTERN #FIX + EXTERN #WRITO + EXTERN #RENDO + EXTERN #RSVO + EXTERN #UE + EXTERN #EQ + EXTERN #NE + EXTERN PCT + EXTERN GETWRD + EXTERN PUTWRD + EXTERN SIXOUT + JA #ST +#XR, ORG .+10 + TEXT +AMAIN + +#RET, SETX #XR + SETB #BASE + JA .+3 +#BASE, ORG .+6 +ZERO, F 0 +ONE, F 1 +TWO, F 2 +THREE, F 3 +MINUS1, F -1 +IND, 0;0;0 + ORG #BASE+30 + FNOP + JA #RET + FNOP +#GOBAK, 0;0 +HINT, ORG .+3 +KENT, ORG .+3 +KQ, ORG .+3 +K2, ORG .+3 +LL, ORG .+3 +N, ORG .+3 +PBOTL, ORG .+3 +SPK, ORG .+3 +WD1, ORG .+3 +WD1X, ORG .+3 +WD2, ORG .+3 +WD2X, ORG .+3 +YEA, ORG .+3 +#TMP, ORG .+30 + +#LIT, F 4 / Literals. Too many cause ST overflow + F 5 /3 + F 6 /6 + F 8 /11 + F 9 /14 + F 10 /17 + F 12 /22 + F 15 /25 + F 16 /30 + F 17 /33 + F 20 /36 + F 22 /41 + F 23 /44 + F 24 /47 + F 25 /52 + F 26 /55 + F 27 /60 + F 30 /63 + F 35 /66 + F 37 /71 + F 39 /74 + F 40 /77 + F 45 /102 + F 49 /105 + F 50 /110 + F 54 /113 + F 57 /116 + F 58 /121 + F 62 /124 + F 65 /127 + F 81 /132 + F 29 /135 + F 91 /140 + F 92 /143 + F 95 /146 + F 99 /151 + F 100 /154 + F 105 /157 + F 110 /162 + F 115 /165 + F 116 /170 + F 117 /173 + F 127 /176 + F 128 /201 + F 129 /204 + F 130 /207 + F 131 /212 + F 132 /215 + F 136 /220 + F 140 /223 + F 141 /226 + F 143 /231 + F 145 /234 + F 162 /237 + F 163 /242 + F 165 /245 + F 175 /250 + F 184 /253 + F 185 /256 + F 186 /261 + F 188 /264 + F 192 /267 + F 193 /272 + F 197 /275 + F 199 /300 + F 201 /303 + F 300 /306 + F 500 /311 + F 1000 /314 + F 2500 /317 + F 10000 /322 + F 80 /325 + F 60 /330 + F 154 /333 +TENTE, TEXT +ENTE + +TPOUR, TEXT +POUR + +TWEST, TEXT +WEST + +TQUES, TEXT +?@ + +TQDOT, TEXT +".@ + +TYES, TEXT +YES + +TYE, TEXT +YE + +TY, TEXT +Y + + #LBL=. + COMMON ABBCOM +ABB, ORG .+702 + COMMON MISCOM +LINUSE, ORG .+3 +TRVS, ORG .+3 +CLSSES, ORG .+3 +OLDLOC, ORG .+3 +LOC, ORG .+3 +CVAL, ORG .+44 +TK, ORG .+74 +NEWLOC, ORG .+3 +KEY, ORG .+702 +PLAC, ORG .+454 +FIXD, ORG .+454 +ACTSPK, ORG .+151 +COND, ORG .+702 +HINTS, ORG .+360 +HNTMAX, ORG .+3 +PROP, ORG .+454 +TALLY, ORG .+3 +TALLY2, ORG .+3 +HINTLC, ORG .+74 +CHLOC, ORG .+3 +CHLOC2, ORG .+3 +DSEEN, ORG .+22 +DFLAG, ORG .+3 +DLOC, ORG .+22 +DALTLC, ORG .+3 +KEYS, ORG .+3 +LAMP, ORG .+3 +GRATE, ORG .+3 +CAGE, ORG .+3 +ROD, ORG .+3 +ROD2, ORG .+3 +STEPS, ORG .+3 +BIRD, ORG .+3 +DOOR, ORG .+3 +PILLOW, ORG .+3 +SNAKE, ORG .+3 +FISSUR, ORG .+3 +TABLET, ORG .+3 +CLAM, ORG .+3 +OYSTER, ORG .+3 +MAGZIN, ORG .+3 +DWARF, ORG .+3 +KNIFE, ORG .+3 +FOOD, ORG .+3 +BOTTLE, ORG .+3 +WATER, ORG .+3 +OIL, ORG .+3 +PLANT, ORG .+3 +PLANT2, ORG .+3 +AXE, ORG .+3 +MIRROR, ORG .+3 +DRAGON, ORG .+3 +CHASM, ORG .+3 +TROLL, ORG .+3 +TROLL2, ORG .+3 +BEAR, ORG .+3 +MESSAG, ORG .+3 +VEND, ORG .+3 +BATTER, ORG .+3 +NUGGET, ORG .+3 +COINS, ORG .+3 +CHEST, ORG .+3 +EGGS, ORG .+3 +TRIDNT, ORG .+3 +VASE, ORG .+3 +EMRALD, ORG .+3 +PYRAM, ORG .+3 +PEARL, ORG .+3 +RUG, ORG .+3 +CHAIN, ORG .+3 +BACK, ORG .+3 +LOOK, ORG .+3 +CAVE, ORG .+3 +NULL, ORG .+3 +ENTRNC, ORG .+3 +DPRSSN, ORG .+3 +SAY, ORG .+3 +LOCK, ORG .+3 +THROW, ORG .+3 +FIND, ORG .+3 +INVENT, ORG .+3 +TURNS, ORG .+3 +LMWARN, ORG .+3 +KNFLOC, ORG .+3 +DETAIL, ORG .+3 +ABBNUM, ORG .+3 +NUMDIE, ORG .+3 +MAXDIE, ORG .+3 +DKILL, ORG .+3 +FOOBAR, ORG .+3 +BONUS, ORG .+3 +CLOCK1, ORG .+3 +CLOCK2, ORG .+3 +CLOSNG, ORG .+3 +PANIC, ORG .+3 +CLOSED, ORG .+3 +GAVEUP, ORG .+3 +SCORNG, ORG .+3 +ODLOC, ORG .+22 +STREAM, ORG .+3 +SPICES, ORG .+3 + + COMMON MISC2 +I, ORG .+3 + ORG .+3 /RTXSIZ + ORG .+3 /CLSMAX + ORG .+3 /LOCSIZ +CTEXT, ORG .+44 +STEXT, ORG .+702 +LTEXT, ORG .+702 + ORG .+3 /SECT +TRAVEL, ORG .+1356 +TRVCON, ORG .+1356 +TRVLOC, ORG .+1356 +TRVSIZ, ORG .+3 + ORG .+3 /TABNDX +OBJ, ORG .+3 +J, ORG .+3 +K, ORG .+3 +VERB, ORG .+3 +HNTSIZ, ORG .+3 +MAXTRS, ORG .+3 +HINTED, ORG .+74 + ORG .+3 /HNTLOC +KK, ORG .+3 + COMMON PLACOM +ATLOC, ORG .+702 +LINK, ORG .+1130 +PLACE, ORG .+454 +FIXED, ORG .+454 +HOLDNG, ORG .+3 + COMMON PTXCOM +PTEXT, ORG .+454 + COMMON TXTCOM +RTEXT, ORG .+1147 + ORG .+44 /LINES + ORG .+3 /ASCVAR + ORG .+3 /TXTLOC + ORG .+234 /DATA + COMMON MISC3 +ATTACK, ORG .+3 +DTOTAL, ORG .+3 +OLDLC2, ORG .+3 +LIMIT, ORG .+3 +MXSCOR, ORG .+3 +SCORE, ORG .+3 +STICK, ORG .+3 +WZDARK, ORG .+3 + ORG #LBL +#25000, +#RTN, BASE #BASE + JA #GOBAK +#ST, STARTD + 0210 + FSTA #GOBAK,0 + 0200 + SETX #XR + SETB #BASE + STARTF + JA #STRT /#G0001 +/ +/ Statement functions - called with JSA to save space +/ +/ TOTING(OBJ)=PLACE(OBJ).EQ.-1 +TOTING, 0;0 + ATX 3 + FLDA PLACE-3,3 + FADD ONE + JSA #EQ + JA TOTING + +/ AT(OBJ)=PLACE(OBJ).EQ.LOC.OR.FIXED(OBJ).EQ.LOC +AT, 0;0 + ATX 3 + FLDA PLACE-3,3 + FSUB LOC + JEQ ISAT + FLDA FIXED-3,3 + FSUB LOC +ISAT, JSA #EQ + JA AT + +/ FORCED(LOC)=COND(LOC).EQ.2 +FORCED, 0;0 + ATX 3 + FLDA COND-3,3 + FSUB TWO + JSA #EQ + JA FORCED + +/ HERE(OBJ) = PLACE(OBJ).EQ.LOC .OR. TOTING(OBJ) +HERE, 0;0 + JSA TOTING + JNE ISHERE + FLDA LOC + FSUB PLACE-3,3 + JEQ ISHERE + FCLA + JA HERE +ISHERE, FLDA ONE + JA HERE + +/ DARK(DUMMY)=MOD(COND(LOC),2).EQ.0.AND.(PROP(LAMP).EQ.0.OR. +/ 1 .NOT.HERE(LAMP)) + +DARK, 0;0 +/ .OR. .NOT. HERE(LAMP) + FLDA LAMP + JSA HERE + JEQ NOTHR +/ .OR. PROP(LAMP) EQ 0 + FLDA PROP-3,3 + JNE NOTDRK +/ MOD(COND(LOC),2) .EQ. 0 +NOTHR, FLDA LOC / Either prop or not here + ATX 4 + FLDA COND-3,4 / COND(LOC) + FDIV TWO / Divided by two + JSA #FIX + FMUL TWO + FSTA #TMP+14 + FLDA COND-3,4 / Get back COND(LOC) + FSUB #TMP+14 / Now have mod + JNE NOTDRK / If not zero, not dark + FLDA ONE + JA DARK +NOTDRK, FCLA + JA DARK + +/ LIQ2(PBOTL)=(1-PBOTL)*WATER+(PBOTL/2)*(WATER+OIL) +LIQ2, 0;0 + FLDA ONE + FSUB PBOTL / 1 - PBOTL + FMUL WATER / (1-PBOTL)*WATER + FSTA #TMP+14 / Store first term + FLDA PBOTL + FDIV TWO / PBOTL/2 + JSA #FIX + FSTA #TMP+6 + FLDA WATER + FADD OIL / WATER+OIL + FMUL #TMP+6 / (PBOTL/2)*(WATER+OIL) + FADD #TMP+14 + JA LIQ2 / Done + +/ LIQ(DUMMY)=LIQ2(MAX0(PROP(BOTTLE),-1-PROP(BOTTLE))) +LIQ, 0;0 +/PROP(BOTTLE) + FLDA BOTTLE + ATX 5 + FLDA PROP-3,5 / PROP(BOTTLE) + FSTA PBOTL + FLDA MINUS1 + FSUB PBOTL /-1-PROP(BOTTLE) + FSTA #TMP+11 + FLDA PBOTL / Find larger + FSUB #TMP+11 + JGT .+4 / already larger, now PBOTL + FLDA #TMP+11 + FSTA PBOTL / This is PBOTL + JSA LIQ2 / Call LIQ2 with this + JA LIQ / And return + +/ LIQLOC(LOC)=LIQ2((MOD(COND(LOC)/2*2,8)-5)*MOD(COND(LOC)/4,2)+1) +LIQLOC, 0;0 + FLDA LOC / Always called with LOC as arg + ATX 2 + FLDA COND-3,2 / COND(LOC) + FSTA #TMP+11 / Save that + FDIV TWO + JSA #FIX / COND(LOC)/2 + FMUL TWO / COND(LOC)/2*2 + FSTA #TMP+17 + FDIV #LIT+11 / Modulo 8 + JSA #FIX + FMUL #LIT+11 + FSTA #TMP+22 + FLDA #TMP+17 + FSUB #TMP+22 / MOD(...) + FSUB #LIT+3 / -5. + FSTA #TMP+25 / First Term + FLDA #TMP+11 / COND(LOC) + FDIV #LIT / COND(LOC)/4 + JSA #FIX + FSTA #TMP+17 + FDIV TWO / Mod 2 + JSA #FIX + FMUL TWO + FSTA #TMP+22 + FLDA #TMP+17 + FSUB #TMP+22 + FMUL #TMP+25 / Multiply + FADD ONE / +1 + FSTA PBOTL / Finally got the term + JSA LIQ2 / Send to LIQ2 + JA LIQLOC +/ +/ Read the property field - object passed in FAC +/ +RDPROP, 0;0 + ATX 7 + FLDA PROP-3,7 + JA RDPROP +/ +/ Print a string +/ +SPRINT, 0;0 + LDX 0,1 + STARTD + FLDA SPRINT + FSTA IND /Indirect pointer + FLDA% IND,1 + FSTA PTR + FLDA% IND,1+ + FSTA CNT + FLDA D4 /Add four to skip arguments + FADDM SPRINT + STARTD + JSR SIXOUT + JA SPRINT +PTR, 0;0 + JA ZERO +CNT, 0;0 +D4, 0;4 + / +/ Main routine entry point +/ +#STRT, +/1 I=RND(1) +#1, JSR RND + JA .+4 + JA ONE + FSTA I +/ HINTED(3)=YES(65,1,0) + JSR YES + JA .+10 + JA #LIT+127 + JA ONE + JA ZERO + FSTA HINTED+6 /HINTED(3) +/ NEWLOC=1 + FLDA ONE + FSTA NEWLOC +/ LOC = NEWLOC + FSTA LOC +/ LIMIT=330 + DECIMAL + LDX 330,0 + OCTAL + XTA 0 + FSTA LIMIT +/ IF(HINTED(3))LIMIT=1000 + FLDA HINTED+6 /HINTED(3) + JEQ #2 + FLDA #LIT+314 + FSTA LIMIT +/2 IF(NEWLOC.GE.9.OR.NEWLOC.EQ.0.OR..NOT.CLOSNG)GOTO 71 +#2, FLDA NEWLOC + FSUB #LIT+14 + JGE #71 + FLDA NEWLOC + JEQ #71 + FLDA CLOSNG + JEQ #71 +/ CALL RSPEAK(130) + JSR RSPEAK + JA .+4 + JA #LIT+207 +/ NEWLOC=LOC + FLDA LOC + FSTA NEWLOC +/ IF(.NOT.PANIC)CLOCK2=15 + FLDA PANIC + JNE .+5 + FLDA #LIT+25 + FSTA CLOCK2 +/ PANIC=.TRUE. + FLDA ONE + FSTA PANIC +/C +/C SEE IF A DWARF HAS SEEN HIM AND HAS COME FROM WHERE HE WANTS TO GO. IF SO, +/C THE DWARF'S BLOCKING HIS WAY. IF COMING FROM PLACE FORBIDDEN TO PIRATE +/C (DWARVES ROOTED IN PLACE) LET HIM GET OUT (AND ATTACKED). +/C +/71 IF(NEWLOC.EQ.LOC.OR.FORCED(LOC).OR.BITSET(LOC,3))GOTO 74 +#71, FLDA NEWLOC + FSUB LOC + JEQ #74 + FLDA LOC + JSA FORCED + JNE #74 + JSR BITSET + JA .+6 + JA LOC + JA THREE + JNE #74 +/ DO 73 I=1,5 + FLDA ONE + FSTA I + +/ IF(ODLOC(I).NE.NEWLOC.OR..NOT.DSEEN(I))GOTO 73 +#G0047, FLDA I + ATX 7 + FLDA ODLOC-3,7 + FSUB NEWLOC + JNE #73 + FLDA DSEEN-3,7 + JEQ #73 +/ NEWLOC=LOC + FLDA LOC + FSTA NEWLOC +/ CALL RSPEAK(2) + JSR RSPEAK + JA .+4 + JA TWO +/ GOTO 74 + JA #74 +/73 CONTINUE +#73, FLDA I + FADD ONE + FSTA I + FSUB #LIT+3 + JLE #G0047 + +#74, FLDA NEWLOC + FSTA LOC +/C +/C DWARF STUFF. SEE EARLIER COMMENTS FOR DESCRIPTION OF VARIABLES. REMEMBER +/C SIXTH DWARF IS PIRATE AND IS THUS VERY DIFFERENT EXCEPT FOR MOTION RULES. +/C +/C FIRST OFF, DON'T LET THE DWARVES FOLLOW HIM INTO A PIT OR A WALL. ACTIVATE +/C THE WHOLE MESS THE FIRST TIME HE GETS AS FAR AS THE HALL OF MISTS (LOC 15). +/C IF NEWLOC IS FORBIDDEN TO PIRATE (IN PARTICULAR, IF IT'S BEYOND THE TROLL +/C BRIDGE), BYPASS DWARF STUFF. THAT WAY PIRATE CAN'T STEAL RETURN TOLL, AND +/C DWARVES CAN'T MEET THE BEAR. ALSO MEANS DWARVES WON'T FOLLOW HIM INTO DEAD +/C END IN MAZE, BUT C'EST LA VIE. THEY'LL WAIT FOR HIM OUTSIDE THE DEAD END. +/C +/ IF(LOC.EQ.0.OR.FORCED(LOC).OR.BITSET(NEWLOC,3))GOTO 2000 +/ FLDA LOC + JEQ #2000 +/ FLDA LOC + JSA FORCED + JNE #2000 + JSR BITSET + JA .+6 + JA NEWLOC + JA THREE + JNE #2000 +/ IF(DFLAG.NE.0)GOTO 6000 + FLDA DFLAG + JNE #6000 +/ IF(LOC.GE.15)DFLAG=1 + FLDA LOC + FSUB #LIT+25 + JLT #2000 + FLDA ONE + FSTA DFLAG +/ GOTO 2000 + JA #2000 + +/C +/C WHEN WE ENCOUNTER THE FIRST DWARF, WE KILL 0, 1, OR 2 OF THE 5 DWARVES. IF +/C ANY OF THE SURVIVORS IS AT LOC, REPLACE HIM WITH THE ALTERNATE. +/C +/6000 IF(DFLAG.NE.1)GOTO 6010 +#6000, FLDA DFLAG + FSUB ONE + JNE #6010 +/ IF(LOC.LT.15.OR.PCT(95))GOTO 2000 + FLDA LOC + FSUB #LIT+25 + JLT #2000 + JSR PCT + JA .+4 + JA #LIT+146 + JNE #2000 +/ DFLAG=2 + FLDA TWO + FSTA DFLAG +/ DO 6001 I=1,2 + FLDA ONE + FSTA I + +/ J=1+RND(5) +#G0051, JSR RND + JA .+4 + JA #LIT+3 + FADD ONE + FSTA J + +/6001 IF(PCT(50))DLOC(J)=0 +#6001, JSR PCT + JA .+4 + JA #LIT+110 + JEQ .+10 + FLDA J + ATX 7 + FCLA + FSTA DLOC-3,7 + FLDA I + FADD ONE + FSTA I + FSUB TWO + JLE #G0051 +/ DO 6002 I=1,5 + FLDA ONE + FSTA I + +/ IF(DLOC(I).EQ.LOC)DLOC(I)=DALTLC +#G0053, FLDA I + ATX 7 + FLDA DLOC-3,7 + FSUB LOC + JNE #6002 + FLDA DALTLC + FSTA DLOC-3,7 +/6002 ODLOC(I)=DLOC(I) +#6002, FLDA I + ATX 7 + FLDA DLOC-3,7 + FSTA ODLOC-3,7 + FLDA I + FADD ONE + FSTA I + FSUB #LIT+3 + JLE #G0053 +/ CALL RSPEAK(3) + JSR RSPEAK + JA .+4 + JA THREE +/ CALL DROP(AXE,LOC) + JSR DROP +/ GOTO 2000 + JA #2000 + JA AXE + JA LOC + +/C +/C THINGS ARE IN FULL SWING. MOVE EACH DWARF AT RANDOM, EXCEPT IF HE'S SEEN US +/C HE STICKS WITH US. DWARVES NEVER GO TO LOCS <15. IF WANDERING AT RANDOM, +/C THEY DON'T BACK UP UNLESS THERE'S NO ALTERNATIVE. IF THEY DON'T HAVE TO +/C MOVE, THEY ATTACK. AND, OF COURSE, DEAD DWARVES DON'T DO MUCH OF ANYTHING. +/C +/6010 DTOTAL=0 +#6010, FCLA + FSTA DTOTAL +/ ATTACK=0 + FSTA ATTACK +/ STICK=0 + FSTA STICK +/ DO 6030 I=1,6 + FLDA ONE + FSTA I +/ IF (DLOC(I).EQ.0)GOTO 6030 +#G0055, FLDA I + ATX 7 + FLDA DLOC-3,7 + JEQ #6030 +/ J=1 + FLDA ONE + FSTA J +/ KK=DLOC(I) + FLDA DLOC-3,7 + FSTA KK +/ KK=KEY(KK) + ATX 7 + FLDA KEY-3,7 + FSTA KK +/ IF(KK.EQ.0)GOTO 6016 + JEQ #6016 + +/6012 NEWLOC=TRVLOC(KK) +#6012, JSR GETWRD + JA .+10 + JA TRVLOC + JA KK + JA ZERO + FSTA NEWLOC +/ IF(NEWLOC.GT.300.OR.NEWLOC.LT.15.OR.NEWLOC.EQ.ODLOC(I) +/ 1 .OR.(J.GT.1.AND.NEWLOC.EQ.TK(J-1)).OR.J.GE.20 +/ 2 .OR.NEWLOC.EQ.DLOC(I).OR.FORCED(NEWLOC) +/ 3 .OR.(I.EQ.6.AND.BITSET(NEWLOC,3)) +/ 4 .OR.TRVCON(KK).EQ.100)GOTO 6014 + FSUB #LIT+306 + JGT #6014 + FLDA NEWLOC + FSUB #LIT+25 + JLT #6014 + FLDA I + ATX 7 + FLDA NEWLOC + FSUB ODLOC-3,7 + JEQ #6014 + FLDA J + FSUB ONE + JLE .+11 + ATX 6 + FLDA NEWLOC + FSUB TK-3,6 + JEQ #6014 + FLDA J + FSUB #LIT+36 + JGE #6014 + FLDA I + ATX 7 + FLDA NEWLOC + FSUB DLOC-3,7 + JEQ #6014 + FLDA NEWLOC + JSA FORCED + JNE #6014 + FLDA I + FSUB #LIT+6 + JNE .+14 + JSR BITSET + JA .+6 + JA NEWLOC + JA THREE + JNE #6014 + JSR GETWRD + JA .+10 + JA TRVCON + JA KK + JA ZERO + FSUB #LIT+154 + JEQ #6014 +/ TK(J)=NEWLOC + FLDA J + ATX 7 + FLDA NEWLOC + FSTA TK-3,7 +/ J=J+1 + FLDA ONE + FADDM J + +/6014 KK=KK+1 +#6014, FLDA KK + FADD ONE + FSTA KK +/ IF(TRAVEL(KK-1).GE.0)GOTO 6012 + FSUB ONE + FSTA #TMP + JSR GETWRD + JA .+10 + JA TRAVEL + JA #TMP + JA ZERO + JGE #6012 +/6016 TK(J)=ODLOC(I) +#6016, FLDA J + ATX 6 + FLDA I + ATX 7 + FLDA ODLOC-3,7 + FSTA TK-3,6 +/ IF(J.GE.2)J=J-1 + FLDA J + FSUB TWO + JLT .+5 + FLDA MINUS1 + FADDM J +/ J=1+RND(J) + JSR RND + JA .+4 + JA J + FADD ONE + FSTA J +/ ODLOC(I)=DLOC(I) + FLDA DLOC-3,7 + FSTA ODLOC-3,7 +/ DLOC(I)=TK(J) + FLDA J + ATX 6 + FLDA TK-3,6 + FSTA DLOC-3,7 +/ DSEEN(I)=(DSEEN(I).AND.LOC.GE.15) +/ 1 .OR.(DLOC(I).EQ.LOC.OR.ODLOC(I).EQ.LOC) + FLDA LOC + FSUB #LIT+25 + JLT .+6 + FLDA DSEEN-3,7 + JNE .+21 + FLDA DLOC-3,7 + FSUB LOC + JEQ .+13 + FLDA ODLOC-3,7 + FSUB LOC + JEQ .+5 + FCLA + JA .+3 + FLDA ONE + FSTA DSEEN-3,7 +/ IF(.NOT.DSEEN(I))GOTO 6030 + JEQ #6030 +/ DLOC(I)=LOC + FLDA LOC + FSTA DLOC-3,7 +/ IF(I.NE.6)GOTO 6027 + FLDA I + FSUB #LIT+6 + JNE #6027 +/C +/C THE PIRATE'S SPOTTED HIM. HE LEAVES HIM ALONE ONCE WE'VE FOUND CHEST. +/C K COUNTS IF A TREASURE IS HERE. IF NOT, AND TALLY=TALLY2 PLUS ONE FOR +/C AN UNSEEN CHEST, LET THE PIRATE BE SPOTTED. +/C +/ IF(LOC.EQ.CHLOC.OR.PROP(CHEST).GE.0)GOTO 6030 + + FLDA LOC + FSUB CHLOC + JEQ #6030 + FLDA CHEST + JSA RDPROP + JGE #6030 +/ K=0 + FCLA + FSTA K +/ DO 6020 J=50,MAXTRS + FLDA #LIT+110 + FSTA J +/C +/C PIRATE WON'T TAKE PYRAMID FROM PLOVER ROOM OR DARK ROOM (TOO EASY!). +/C +/ IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM) +/ 1 .OR.LOC.EQ.PLAC(EMRALD)))GOTO 6020 +#G0057, FLDA J + FSUB PYRAM + JNE .+24 + FLDA PYRAM + ATX 7 + FLDA LOC + FSUB PLAC-3,7 + JEQ #6020 + FLDA EMRALD + ATX 6 + FLDA LOC + FSUB PLAC-3,6 + JEQ #6020 +/ IF(TOTING(J))GOTO 6022 + FLDA J + JSA TOTING + JNE #6022 + +/6020 IF(HERE(J))K=1 +#6020, FLDA J + JSA HERE + JEQ .+5 + FLDA ONE + FSTA K + FLDA J + FADD ONE + FSTA J + FSUB MAXTRS + JLE #G0057 +/ IF(TALLY.EQ.TALLY2+1.AND.K.EQ.0.AND.PLACE(CHEST).EQ.0 +/ 1 .AND.HERE(LAMP).AND.PROP(LAMP).EQ.1)GOTO 6025 + FLDA TALLY2 + FADD ONE + FSUB TALLY + JNE #M4 + FLDA K + JNE #M4 + FLDA CHEST + ATX 7 + FLDA PLACE-3,7 + JNE #M4 + FLDA LAMP + JSA HERE + JEQ #M4 + FLDA PROP-3,3 + FSUB ONE + JEQ #6025 +/ IF(ODLOC(6).NE.DLOC(6).AND.PCT(20))CALL RSPEAK(127) +#M4, FLDA ODLOC+17 /ODLOC(6) + FSUB DLOC+17 /DLOC(6) + JEQ #6030 + JSR PCT + JA .+4 + JA #LIT+36 + JEQ #6030 + JSR RSPEAK +/ GOTO 6030 + JA #6030 + JA #LIT+176 +/C +/6022 CALL RSPEAK(128) +#6022, JSR RSPEAK + JA .+4 + JA #LIT+201 +/C +/C DON'T STEAL CHEST BACK FROM TROLL! +/C +/ IF(PLACE(MESSAG).EQ.0)CALL MOVE(CHEST,CHLOC) + FLDA MESSAG + ATX 7 + FLDA PLACE-3,7 + JNE .+12 + JSR MOVE + JA .+6 + JA CHEST + JA CHLOC +/ CALL MOVE(MESSAG,CHLOC2) + JSR MOVE + JA .+6 + JA MESSAG + JA CHLOC2 +/ DO 6023 J=50,MAXTRS + FLDA #LIT+110 + FSTA J + +/ IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM) +/ 1 .OR.LOC.EQ.PLAC(EMRALD)))GOTO 6023 +#G0063, FLDA J + FSUB PYRAM + JNE .+24 + FLDA PYRAM + ATX 7 + FLDA LOC + FSUB PLAC-3,7 + JEQ #6023 + FLDA EMRALD + ATX 6 + FLDA LOC + FSUB PLAC-3,6 + JEQ #6023 +/ IF(AT(J).AND.FIXED(J).EQ.0)CALL CARRY(J,LOC) + FLDA J + JSA AT + JEQ .+16 +/ FLDA J +/ ATX 3 + FLDA FIXED-3,3 + JNE .+12 + JSR CARRY + JA .+6 + JA J + JA LOC +/ IF(TOTING(J))CALL DROP(J,CHLOC) + FLDA J + JSA TOTING + JEQ #6023 + JSR DROP + JA .+6 + JA J + JA CHLOC +/6023 CONTINUE +#6023, FLDA J + FADD ONE + FSTA J + FSUB MAXTRS + JLE #G0063 + +/6024 DLOC(6)=CHLOC +#6024, FLDA #LIT+6 + ATX 7 + FLDA CHLOC + FSTA DLOC-3,7 +/ ODLOC(6)=CHLOC + FSTA ODLOC-3,7 +/ DSEEN(6)=.FALSE. + FCLA + FSTA DSEEN-3,7 +/ GOTO 6030 + JA #6030 + +/C +/6025 CALL RSPEAK(186) + +#6025, JSR RSPEAK + JA .+4 + JA #LIT+261 +/ CALL MOVE(CHEST,CHLOC) + JSR MOVE + JA .+6 + JA CHEST + JA CHLOC +/ CALL MOVE(MESSAG,CHLOC2) + JSR MOVE +/ GOTO 6024 + JA #6024 + JA MESSAG + JA CHLOC2 + +/C +/C THIS THREATENING LITTLE DWARF IS IN THE ROOM WITH HIM! +/C +/6027 DTOTAL=DTOTAL+1 +#6027, FLDA ONE + FADDM DTOTAL +/ IF(ODLOC(I).NE.DLOC(I))GOTO 6030 + FLDA I + ATX 7 + FLDA ODLOC-3,7 + FSUB DLOC-3,7 + JNE #6030 +/ ATTACK=ATTACK+1 + FLDA ONE + FADDM ATTACK +/ IF(KNFLOC.GE.0)KNFLOC=LOC + FLDA KNFLOC + JLT .+6 + FLDA LOC + FSTA KNFLOC +/ IF(RND(1000).LT.95*(DFLAG-2))STICK=STICK+1 + JSR RND + JA .+4 + JA #LIT+314 + FSTA #TMP + FLDA DFLAG + FSUB TWO + FMUL #LIT+146 + FSUB #TMP + JLT #6030 + FLDA ONE + FADDM STICK +/6030 CONTINUE +#6030, FLDA I + FADD ONE + FSTA I + FSUB #LIT+6 + JLE #G0055 +/C +/C NOW WE KNOW WHAT'S HAPPENING. LET'S TELL THE POOR SUCKER ABOUT IT. +/C +/ IF(DTOTAL.EQ.0)GOTO 2000 + FLDA DTOTAL + JEQ #2000 +/ IF(DTOTAL.EQ.1)GOTO 75 + FSUB ONE + JEQ #75 +/ TYPE 67,DTOTAL +/67 FORMAT(' There are ',I1,' threatening little dwarves in the' +/ 1 ,' room with you.') + + JSR SPRINT + JA #67A + JA TWO + + TRAP3 #WRITO + JA #LIT + JA #67 + FLDA DTOTAL + TRAP3 #RSVO + TRAP3 #RENDO + + JSA SPRINT + JA #67B + JA ONE +/ GOTO 77 + JA #77 + +/75 CALL RSPEAK(4) +#75, JSR RSPEAK + JA .+4 + JA #LIT + +/77 IF(ATTACK.EQ.0)GOTO 2000 +#77, FLDA ATTACK + JEQ #2000 +/ IF(DFLAG.EQ.2)DFLAG=3 + FLDA DFLAG + FSUB TWO + JNE .+5 + FLDA THREE + FSTA DFLAG +/ IF(ATTACK.EQ.1)GOTO 79 + FLDA ATTACK + FSUB ONE + JEQ #79 +/ TYPE 78,ATTACK +/78 FORMAT(' ',I1,' of them throw knives at you!') + TRAP3 #WRITO + JA #LIT + JA #78 + FLDA ATTACK + TRAP3 #RSVO + TRAP3 #RENDO + JSA SPRINT + JA #78B + JA ONE +/ K=6 + FLDA #LIT+6 + FSTA K + +/82 IF(STICK.GT.1)GOTO 83 +#82, FLDA STICK + FSUB ONE + JGT #83 +/ CALL RSPEAK(K+STICK) + FLDA K + FADD STICK + FSTA #TMP + JSR RSPEAK + JA .+4 + JA #TMP +/ IF(STICK.EQ.0)GOTO 2000 + FLDA STICK + JEQ #2000 +/ GOTO 84 + JA #84 + +/83 TYPE 68,STICK +#83, TRAP3 #WRITO + JA #LIT + JA #68 + FLDA STICK + TRAP3 #RSVO + TRAP3 #RENDO + +/68 FORMAT(' ',I1,' of them get you!') + JSA SPRINT + JA #68B + JA ONE +/84 OLDLC2=LOC +#84, FLDA LOC + FSTA OLDLC2 +/ GOTO 99 + JA #99 + +/C +/79 CALL RSPEAK(5) +#79, JSR RSPEAK + JA .+4 + JA #LIT+3 +/ K=52 + DECIMAL + LDX 52,0 + OCTAL + XTA 0 + FSTA K +/ GOTO 82 + JA #82 + +/C DESCRIBE THE CURRENT LOCATION AND (MAYBE) GET NEXT COMMAND. +/C +/C PRINT TEXT FOR CURRENT LOC. +/C +/2000 IF(LOC.EQ.0)GOTO 99 +#2000, FLDA LOC + JEQ #99 +/ KK=STEXT(LOC) + FLDA LOC + ATX 7 + FLDA STEXT-3,7 + FSTA KK +/ KENT=0 + FCLA + FSTA KENT +/ IF (ABBNUM.NE.0) KENT=MOD(ABB(LOC),ABBNUM) + FLDA ABBNUM + JEQ NOMOD +/ FLDA LOC +/ ATX 7 + FLDA ABB-3,7 + FSTA #TMP + JSR MOD + JA .+6 + JA #TMP + JA ABBNUM + FSTA KENT +/ IF (KENT.EQ.0.OR.KK.EQ.0) KK=LTEXT(LOC) +NOMOD, FLDA KENT + JEQ .+6 + FLDA KK + JNE .+11 + FLDA LOC + ATX 7 + FLDA LTEXT-3,7 + FSTA KK +/ IF(FORCED(LOC).OR..NOT.DARK(0))GOTO 2001 + FLDA LOC + JSA FORCED + JNE #2001 + JSA DARK + JEQ #2001 +/ IF(WZDARK.AND.PCT(35))GOTO 90 + FLDA WZDARK + JEQ .+12 + JSR PCT + JA .+4 + JA #LIT+66 + JNE #90 +/ KK=RTEXT(16) + FLDA RTEXT+55 + FSTA KK + +/2001 IF(TOTING(BEAR))CALL RSPEAK(141) +#2001, FLDA BEAR + JSA TOTING + JEQ .+10 + JSR RSPEAK + JA .+4 + JA #LIT+226 +/ CALL SPEAK(KK) + JSR SPEAK + JA .+4 + JA KK +/ K=1 + FLDA ONE + FSTA K +/ IF(FORCED(LOC))GOTO 8 + FLDA LOC + JSA FORCED + JNE #8 +/ IF(LOC.EQ.33.AND.PCT(25).AND..NOT.CLOSNG)CALL RSPEAK(8) + DECIMAL + LDX 33,0 + OCTAL + XTA 0 + FSUB LOC + JNE .+24 + JSR PCT + JA .+4 + JA #LIT+52 + JEQ .+14 + FLDA CLOSNG + JNE .+10 + JSR RSPEAK + JA .+4 + JA #LIT+11 +/C +/C PRINT OUT DESCRIPTIONS OF OBJECTS AT THIS LOCATION. IF NOT CLOSING AND +/C PROPERTY VALUE IS NEGATIVE, TALLY OFF ANOTHER TREASURE. RUG IS SPECIAL +/C CASE; ONCE SEEN, ITS PROP IS 1 (DRAGON ON IT) TILL DRAGON IS KILLED. +/C SIMILARLY FOR CHAIN; PROP IS INITIALLY 1 (LOCKED TO BEAR). THESE HACKS +/C ARE BECAUSE PROP=0 IS NEEDED TO GET FULL SCORE. +/C +/ IF(DARK(0))GOTO 2012 + JSA DARK + JNE #2012 +/ ABB(LOC)=ABB(LOC)+1 + FLDA LOC + ATX 4 + FLDA ONE + FADDM ABB-3,7 +/ I=ATLOC(LOC) + FLDA ATLOC-3,7 + FSTA I + +/2004 IF(I.EQ.0)GOTO 2012 +#2004, FLDA I + JEQ #2012 +/ OBJ=I + FSTA OBJ +/ IF(OBJ.GT.100)OBJ=OBJ-100 + FSUB #LIT+154 + JLE .+4 +/ FLDA OBJ +/ FSUB #LIT+154 + FSTA OBJ +/ IF(OBJ.EQ.STEPS.AND.TOTING(NUGGET))GOTO 2008 + FLDA OBJ + FSUB STEPS + JNE .+10 + FLDA NUGGET + JSA TOTING + JNE #2008 +/ IF(PROP(OBJ).GE.0)GOTO 2006 + FLDA OBJ + JSA RDPROP + JGE #2006 +/ IF(CLOSED)GOTO 2008 + FLDA CLOSED + JNE #2008 +/ PROP(OBJ)=0 + FCLA + FSTA PROP-3,7 +/ IF(OBJ.EQ.RUG.OR.OBJ.EQ.CHAIN)PROP(OBJ)=1 + FLDA OBJ + FSUB RUG + JEQ .+10 + FLDA OBJ + FSUB CHAIN + JNE .+5 + FLDA ONE + FSTA PROP-3,7 +/ TALLY=TALLY-1 + FLDA TALLY + FADD MINUS1 + FSTA TALLY +/C IF REMAINING TREASURES TOO ELUSIVE, ZAP HIS LAMP. +/ IF(TALLY.EQ.TALLY2.AND.TALLY.NE.0)LIMIT=MIN0(35,LIMIT) + JEQ #2006 + FSUB TALLY2 + JNE #2006 + JSR MIN0 + JA .+6 + JA #LIT+66 + JA LIMIT + FSTA LIMIT +/2006 KK=PROP(OBJ) +#2006, FLDA OBJ + JSA RDPROP + FSTA KK +/ IF(OBJ.EQ.STEPS.AND.LOC.EQ.FIXED(STEPS))KK=1 + FLDA OBJ + FSUB STEPS + JNE .+16 + FLDA STEPS + ATX 7 + FLDA LOC + FSUB FIXED-3,7 + JNE .+5 + FLDA ONE + FSTA KK +/ CALL PSPEAK(OBJ,KK) + JSR PSPEAK + JA .+6 + JA OBJ + JA KK + +/2008 I=LINK(I) +#2008, FLDA I + ATX 7 + FLDA LINK-3,7 + FSTA I +/ GOTO 2004 + JA #2004 + +/2009 K=54 +#2009, FLDA #LIT+113 + FSTA K +/2010 SPK=K +#2010, FLDA K + FSTA SPK + +/2011 CALL RSPEAK(SPK) +#2011, JSR RSPEAK + JA .+4 + JA SPK + +/2012 VERB=0 +#2012, FCLA + FSTA VERB +/ OBJ=0 + FSTA OBJ + +/C +/C CHECK IF THIS LOC IS ELIGIBLE FOR ANY HINTS. IF BEEN HERE LONG ENOUGH, +/C BRANCH TO HELP SECTION (ON LATER PAGE). HINTS ALL COME BACK HERE EVENTUALLY +/C TO FINISH THE LOOP. IGNORE "HINTS" < 4 (SPECIAL STUFF, SEE DATABASE NOTES). +/C +/2600 DO 2602 HINT=4,HNTMAX +#2600, FLDA #LIT + FSTA HINT + +/ IF(HINTED(HINT))GOTO 2602 +#G0102, FLDA HINT + ATX 7 + FLDA HINTED-3,7 + JNE #2602 +/ IF(.NOT.BITSET(LOC,HINT))HINTLC(HINT)=-1 + JSR BITSET + JA .+6 + JA LOC + JA HINT + JNE .+5 + FLDA MINUS1 + FSTA HINTLC-3,7 +/ HINTLC(HINT)=HINTLC(HINT)+1 + FLDA ONE + FADDM HINTLC-3,7 +/ IF(HINTLC(HINT).GE.HINTS(HINT,1))GOTO 40000 + FLDA #LIT+36 / 20 + FADD HINT / HINT,1 + ATX 6 + FLDA HINTLC-3,7 + FSUB HINTS-77,6 + JGE #40000 + +/2602 CONTINUE +#2602, FLDA HINT + FADD ONE + FSTA HINT + FSUB HNTMAX + JLE #G0102 +/C +/C KICK THE RANDOM NUMBER GENERATOR JUST TO ADD VARIETY TO THE CHASE. ALSO, +/C IF CLOSING TIME, CHECK FOR ANY OBJECTS BEING TOTED WITH PROP < 0 AND SET +/C THE PROP TO -1-PROP. THIS WAY OBJECTS WON'T BE DESCRIBED UNTIL THEY'VE +/C BEEN PICKED UP AND PUT DOWN SEPARATE FROM THEIR RESPECTIVE PILES. DON'T +/C TICK CLOCK1 UNLESS WELL INTO CAVE (AND NOT AT Y2). +/C +/ IF(.NOT.CLOSED)GOTO 2605 + FLDA CLOSED + JEQ #2605 +/ IF(PROP(OYSTER).LT.0.AND.TOTING(OYSTER)) +/ 1 CALL PSPEAK(OYSTER,1) + + FLDA OYSTER + JSA TOTING + JEQ .+16 + FLDA PROP-3,3 + JGE .+12 + JSR PSPEAK + JA .+6 + JA OYSTER + JA ONE +/ DO 2604 I=1,100 + FLDA ONE + FSTA I + +/2604 IF(TOTING(I).AND.PROP(I).LT.0)PROP(I)=-1-PROP(I) +#2604, FLDA I + JSA TOTING + JEQ .+13 + FLDA PROP-3,3 + JGE .+7 + FLDA MINUS1 + FSUB PROP-3,3 + FSTA PROP-3,3 + FLDA I + FADD ONE + FSTA I + FSUB #LIT+154 + JLE #2604 + +/2605 WZDARK=DARK(0) +#2605, JSA DARK + FSTA WZDARK +/ IF(KNFLOC.GT.0.AND.KNFLOC.NE.LOC)KNFLOC=0 + FLDA KNFLOC + JLE .+11 + FSUB LOC + JEQ .+5 + FCLA + FSTA KNFLOC +/ I=RND(1) + JSR RND + JA .+4 + JA ONE +/ CALL GETIN(WD1,WD1X,WD2,WD2X) + JSR GETIN + JA .+12 + JA WD1 + JA WD1X + JA WD2 + JA WD2X + +/C +/C EVERY INPUT, CHECK "FOOBAR" FLAG. IF ZERO, NOTHING'S GOING ON. IF POS, +/C MAKE NEG. IF NEG, HE SKIPPED A WORD, SO MAKE IT ZERO. +/C +/2608 FOOBAR=MIN0(0,-FOOBAR) +#2608, FLDA FOOBAR + FNEG + FSTA #TMP + JSR MIN0 + JA .+6 + JA ZERO + JA #TMP + FSTA FOOBAR +/ TURNS=TURNS+1 + FLDA ONE + FADDM TURNS +/C IF(VERB.EQ.SAY.AND.WD2.NE.0)VERB=0 +/C IF(VERB.EQ.SAY)GOTO 4090 +/ IF(TALLY.EQ.0.AND.LOC.GE.15.AND.LOC.NE.33)CLOCK1=CLOCK1-1 + FLDA TALLY + JNE .+23 + FLDA LOC + FSUB #LIT+25 + JLT .+16 + DECIMAL + LDX 33,0 + OCTAL + XTA 0 + FSUB LOC + JEQ .+7 + FLDA CLOCK1 + FSUB ONE + FSTA CLOCK1 +/ IF(CLOCK1.EQ.0)GOTO 10000 + FLDA CLOCK1 + JEQ #10000 +/ IF(CLOCK1.LT.0)CLOCK2=CLOCK2-1 + JGE .+7 + FLDA CLOCK2 + FSUB ONE + FSTA CLOCK2 +/ IF(CLOCK2.EQ.0)GOTO 11000 + FLDA CLOCK2 + JEQ #11000 +/ IF(PROP(LAMP).EQ.1)LIMIT=LIMIT-1 + FLDA LAMP + JSA RDPROP + FSUB ONE + JNE .+5 + FLDA MINUS1 + FADDM LIMIT +/ IF(LIMIT.LE.30.AND.HERE(BATTER).AND.PROP(BATTER).EQ.0 +/ 1 .AND.HERE(LAMP))GOTO 12000 + FLDA LIMIT + FSUB #LIT+63 + JGT .+22 + FLDA BATTER + JSA HERE + JEQ .+14 + FLDA PROP-3,3 + JNE .+10 + FLDA LAMP + JSA HERE + JNE #12000 +/ IF(LIMIT.EQ.0)GOTO 12400 + FLDA LIMIT + JEQ #12400 +/ IF(LIMIT.LT.0.AND.LOC.LE.8)GOTO 12600 +/ FLDA LIMIT + JGE .+7 + FLDA LOC + FSUB #LIT+11 + JLE #12600 +/ IF(LIMIT.LE.30)GOTO 12200 + FLDA LIMIT + FSUB #LIT+63 + JLE #12200 + +/19999 K=43 + DECIMAL +#19999, LDX 43,0 + OCTAL + XTA 0 + FSTA K +/ IF(LIQLOC(LOC).EQ.WATER)K=70 + JSA LIQLOC + FSUB WATER + JNE .+7 + DECIMAL + LDX 70,0 + OCTAL + XTA 0 + FSTA K +/C +/C DO PRELIMINARY ANALYSIS OF SENTENCE TO FIND CERTAIN SPECIAL +/C CASES, VIZ, +/C +/C ENTER +/C ENTER +/C +/C +/ CALL VOCAB(WD1,WD1A,-1,I) + JSR VOCAB + JA .+6 + JA WD1 + JA MINUS1 + FSTA I +/ CALL VOCAB(WD2,WD2A,-1,J) + JSR VOCAB + JA .+6 + JA WD2 + JA MINUS1 + FSTA J +/ IF(WD1.NE.'ENTE') GO TO 2609 + FLDA WD1 + FSUB TENTE + JNE #2609 +/ IF(J .EQ. (WATER+1000) +/ 1 .OR. J .EQ. STREAM) GO TO 2010 + FLDA WATER + FADD #LIT+314 + FSUB J + JEQ #2010 + FLDA J + FSUB STREAM + JEQ #2010 +/ IF(WD2 .NE. 0) GO TO 2800 + FLDA WD2 + JNE #2800 + +/2609 IF((I .NE. (WATER+1000) .AND. I .NE. (OIL+1000)) +/ 1 .OR. (J .NE. (PLANT+1000) .AND. J .NE. (DOOR+1000))) +/ 2 GO TO 2610 +#2609, FLDA WATER + FADD #LIT+314 + FSUB I + JEQ .+11 + FLDA OIL + FADD #LIT+314 + FSUB I + JNE #2610 + FLDA PLANT + FADD #LIT+314 + FSUB J + JEQ .+11 + FLDA DOOR + FADD #LIT+314 + FSUB J + JNE #2610 +/ WD2="POUR" + FLDA TPOUR + FSTA WD2 + +/2610 IF(WD1 .EQ. 'WEST' .AND. PCT(10)) +/ 1 CALL RSPEAK(17) + +#2610, FLDA WD1 + FSUB TWEST + JNE #2630 + JSR PCT + JA .+4 + JA #LIT+17 + JEQ #2630 + JSR RSPEAK + JA .+4 + JA #LIT+33 +/2630 CALL VOCAB(WD1,-1,I) +#2630, JSR VOCAB + JA .+6 + JA WD1 + JA MINUS1 + FSTA I +/ IF(I.EQ.-1)GOTO 3000 + FADD ONE + JEQ #3000 +/ K=MOD(I,1000) + JSR MOD + JA .+6 + JA I + JA #LIT+314 + FSTA K +/ KQ=I/1000+1 + FLDA I + FDIV #LIT+314 + JSA #FIX + FADD ONE + FSTA KQ +/ GOTO (8,5000,4000,2010)KQ + FLDA KQ + ATX 1 + STARTD + FLDA .+2,1 + STARTF + JAC + JA #8 + JA #5000 + JA #4000 + JA #2010 +/ CALL BUG(22) + JSR BUG + JA .+4 + JA #LIT+41 + +/C +/C GET SECOND WORD FOR ANALYSIS. +/C +/2800 WD1=WD2 +/ WD1A=WD2A + +#2800, FLDA WD2 + FSTA WD1 +/ WD1X=WD2X + FLDA WD2X + FSTA WD1X +/ WD2=0 + FCLA + FSTA WD2 +/ GOTO 2610 + JA #2610 + +/C +/C GEE, I DON'T UNDERSTAND. +/C +/3000 SPK=60 +#3000, FLDA #LIT+330 + FSTA SPK +/ IF(PCT(20))SPK=61 + JSR PCT + JA .+4 + JA #LIT+36 + JEQ .+6 + DECIMAL + LDX 61,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(PCT(20))SPK=13 + JSR PCT + JA .+4 + JA #LIT+36 + JEQ .+6 + DECIMAL + LDX 13,0 + OCTAL + XTA 0 + FSTA SPK +/ CALL RSPEAK(SPK) + JSR RSPEAK + JA .+4 + JA SPK +/ GOTO 2600 + JA #2600 + +/C +/C ANALYSE A VERB. REMEMBER WHAT IT WAS, GO BACK FOR OBJECT IF SECOND WORD +/C UNLESS VERB IS "SAY", WHICH SNARFS ARBITRARY SECOND WORD. +/C +/4000 VERB=K +#4000, FLDA K + FSTA VERB +/ SPK=ACTSPK(VERB) + ATX 7 + FLDA ACTSPK-3,7 + FSTA SPK +/ IF(WD2.NE.0.AND.VERB.NE.SAY)GOTO 2800 + FLDA WD2 + JEQ .+10 + FLDA VERB + FSUB SAY + JNE #2800 +/ IF(VERB.EQ.SAY)OBJ=WD2 + FLDA VERB + FSUB SAY + JNE .+5 + FLDA WD2 + FSTA OBJ +/ IF(OBJ.NE.0)GOTO 4090 + FLDA OBJ + FSUB ZERO + JNE #4090 + +/C +/C ANALYSE AN INTRANSITIVE VERB (IE, NO OBJECT GIVEN YET). +/C +/4080 GOTO(8010,8000,8000,8040,2009,8040,9070,9080,8000,8000, +/ 1 2011,9120,9130,8140,9150,8000,8000,8180,8000,8200, +/ 2 8000,9220,9230,8240,8250,8260,8270,8000,8000,8300, +/ 3 8310,8320)VERB +/C TAKE DROP SAY OPEN NOTH LOCK ON OFF WAVE CALM +/C WALK KILL POUR EAT DRNK RUB TOSS QUIT FIND INVN +/C FEED FILL BLST SCOR FOO BRF READ BREK WAKE SUSP +/C HOUR RESU +#4080, FLDA VERB + ATX 1 + STARTD + FLDA .+2,1 + STARTF + JAC + JA #8010 + JA #8000 + JA #8000 + JA #8040 + JA #2009 + JA #8040 + JA #9070 + JA #9080 + JA #8000 + JA #8000 + JA #2011 + JA #9120 + JA #9130 + JA #8140 + JA #9150 + JA #8000 + JA #8000 + JA #8180 + JA #8000 + JA #8200 + JA #8000 + JA #9220 + JA #9230 + JA #8240 + JA #8250 + JA #8260 + JA #8270 + JA #8000 + JA #8000 + JA #8300 + JA #8310 + JA #8320 +/ CALL BUG(23) + JSR BUG + JA .+4 + JA #LIT+44 + +/C +/C ANALYSE A TRANSITIVE VERB. +/C +/4090 GOTO(9010,9020,9030,9040,2009,9040,9070,9080,9090,2011, +/ 1 2011,9120,9130,9140,9150,9160,9170,2011,9190,9190, +/ 2 9210,9220,9230,2011,2011,2011,9270,9280,9290,2011, +/ 3 2011,2011)VERB +/C TAKE DROP SAY OPEN NOTH LOCK ON OFF WAVE CALM +/C WALK KILL POUR EAT DRNK RUB TOSS QUIT FIND INVN +/C FEED FILL BLST SCOR FOO BRF READ BREK WAKE SUSP +/C HOUR RESU +#4090, FLDA VERB + ATX 1 + STARTD + FLDA .+2,1 + STARTF + JAC + JA #9010 + JA #9020 + JA #9030 + JA #9040 + JA #2009 + JA #9040 + JA #9070 + JA #9080 + JA #9090 + JA #2011 + JA #2011 + JA #9120 + JA #9130 + JA #9140 + JA #9150 + JA #9160 + JA #9170 + JA #2011 + JA #9190 + JA #9190 + JA #9210 + JA #9220 + JA #9230 + JA #2011 + JA #2011 + JA #2011 + JA #9270 + JA #9280 + JA #9290 + JA #2011 + JA #2011 + JA #2011 + JA #2011 +/ CALL BUG(24) + JSR BUG + JA .+4 + JA #LIT+47 + +/C +/C ANALYSE AN OBJECT WORD. SEE IF THE THING IS HERE, WHETHER WE'VE GOT A VERB +/C YET, AND SO ON. OBJECT MUST BE HERE UNLESS VERB IS "FIND" OR "INVENT(ORY)" +/C (AND NO NEW VERB YET TO BE ANALYSED). WATER AND OIL ARE ALSO FUNNY, SINCE +/C THEY ARE NEVER ACTUALLY DROPPED AT ANY LOCATION, BUT MIGHT BE HERE INSIDE +/C THE BOTTLE OR AS A FEATURE OF THE LOCATION. +/C +/5000 OBJ=K +#5000, FLDA K + FSTA OBJ +/ IF(FIXED(K).NE.LOC.AND..NOT.HERE(K))GOTO 5100 + FLDA K + ATX 7 + FLDA FIXED-3,7 + FSUB LOC + JEQ #5010 + FLDA K + JSA HERE + JEQ #5100 + +/5010 IF(WD2.NE.0)GOTO 2800 +#5010, FLDA WD2 + JNE #2800 +/ IF(VERB.NE.0)GOTO 4090 + FLDA VERB + JNE #4090 +/ TYPE 5015 +/5015 FORMAT(' What do you want to do with the ',$) + JSA SPRINT + JA #5015 + JA TWO + +/ CALL A5TOA1(WD1,WD1A,WD1X,'?') + JSR A5TOA1 + JA .+10 + JA WD1 + JA WD1X + JA TQUES + TRAP3 #WRITO + JA #LIT + JA #LINEF+2 + TRAP3 #RENDO +/ GOTO 2600 +#LINEF, JA #2600 + TEXT +(' ')+ + +/C +/5100 IF(K.NE.GRATE)GOTO 5110 +#5100, FLDA K + FSUB GRATE + JNE #5110 +/ IF(LOC.EQ.1.OR.LOC.EQ.4.OR.LOC.EQ.7)K=DPRSSN + FLDA LOC + FSUB ONE + JEQ .+10 + FSUB THREE + JEQ .+5 + FSUB THREE + JNE .+6 + FLDA DPRSSN + FSTA K +/ IF(LOC.GT.9.AND.LOC.LT.15)K=ENTRNC + FLDA LOC + FSUB #LIT+14 + JLE .+13 + FLDA LOC + FSUB #LIT+25 + JGE .+6 + FLDA ENTRNC + FSTA K +/ IF(K.NE.GRATE)GOTO 8 + FLDA K + FSUB GRATE + JNE #8 + +/5110 IF(K.NE.DWARF)GOTO 5120 +#5110, FLDA K + FSUB DWARF + JNE #5120 +/ DO 5112 I=1,5 + FLDA ONE + FSTA I + +/ IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 5010 +#G0122, FLDA I + ATX 7 + FLDA DLOC-3,7 + FSUB LOC + JNE #5112 + FLDA DFLAG + FSUB TWO + JGE #5010 +/5112 CONTINUE +#5112, FLDA I + FADD ONE + FSTA I + FSUB #LIT+3 + JLE #G0122 + +/5120 IF((LIQ(0).EQ.K.AND.HERE(BOTTLE)).OR.K.EQ.LIQLOC(LOC))GOTO 5010 +#5120, JSA LIQ + FSUB K + JNE .+10 + FLDA BOTTLE + JSA HERE + JNE #5010 + JSA LIQLOC + FSUB K + JEQ #5010 +/ IF(OBJ.NE.PLANT.OR..NOT.AT(PLANT2).OR.PROP(PLANT2).EQ.0)GOTO 5130 + FLDA OBJ + FSUB PLANT + JNE #5130 + FLDA PLANT2 + JSA AT + JEQ #5130 +/ FLDA PLANT2 +/ ATX 3 + FLDA PROP-3,3 + JEQ #5130 +/ OBJ=PLANT2 + FLDA PLANT2 + FSTA OBJ +/ GOTO 5010 + JA #5010 + +/5130 IF(OBJ.NE.KNIFE.OR.KNFLOC.NE.LOC)GOTO 5140 +#5130, FLDA OBJ + FSUB KNIFE + JNE #5140 + FLDA KNFLOC + FSUB LOC + JNE #5140 +/ KNFLOC=-1 + FLDA MINUS1 + FSTA KNFLOC +/ SPK=116 + FLDA #LIT+170 + FSTA SPK +/ GOTO 2011 + JA #2011 + +/5140 IF(OBJ.NE.ROD.OR..NOT.HERE(ROD2))GOTO 5190 +#5140, FLDA OBJ + FSUB ROD + JNE #5190 + FLDA ROD2 + JSA HERE + JEQ #5190 +/ OBJ=ROD2 + FLDA ROD2 + FSTA OBJ +/ GOTO 5010 + JA #5010 + +/5190 IF((VERB.EQ.FIND.OR.VERB.EQ.INVENT).AND.WD2.EQ.0)GOTO 5010 +#5190, FLDA VERB + FSUB INVENT + JEQ .+10 + FLDA VERB + FSUB FIND + JNE .+5 + FLDA WD2 + JEQ #5010 +/ TYPE 5199 + JSA SPRINT + JA #5199 + JA TWO + +/5199 FORMAT(' I don''t see any ',$) + +/ CALL A5TOA1(WD1,WD1A,WD1X,'.') +/ GOTO 2012 + JSR A5TOA1 + JA #2012 + JA WD1 + JA WD1X + JA TQDOT + +/C FIGURE OUT THE NEW LOCATION +/C +/C GIVEN THE CURRENT LOCATION IN "LOC", AND A MOTION VERB NUMBER IN "K", PUT +/C THE NEW LOCATION IN "NEWLOC". THE CURRENT LOC IS SAVED IN "OLDLOC" IN CASE +/C HE WANTS TO RETREAT. THE CURRENT OLDLOC IS SAVED IN OLDLC2, IN CASE HE +/C DIES. (IF HE DOES, NEWLOC WILL BE LIMBO, AND OLDLOC WILL BE WHAT KILLED +/C HIM, SO WE NEED OLDLC2, WHICH IS THE LAST PLACE HE WAS SAFE.) +/C +/8 KK=KEY(LOC) +#8, FLDA LOC + ATX 7 + FLDA KEY-3,7 + FSTA KK +/ NEWLOC=LOC + FLDA LOC + FSTA NEWLOC +/ IF(KK.EQ.0)CALL BUG(26) + FLDA KK + JNE .+10 + JSR BUG + JA .+4 + JA #LIT+55 +/ IF(K.EQ.NULL)GOTO 2 + FLDA K + FSUB NULL + JEQ #2 +/ IF(K.EQ.BACK)GOTO 20 + FLDA K + FSUB BACK + JEQ #20 +/ IF(K.EQ.LOOK)GOTO 30 + FLDA K + FSUB LOOK + JEQ #30 +/ IF(K.EQ.CAVE)GOTO 40 + FLDA K + FSUB CAVE + JEQ #40 +/ OLDLC2=OLDLOC + FLDA OLDLOC + FSTA OLDLC2 +/ OLDLOC=LOC + FLDA LOC + FSTA OLDLOC +/C +/9 LL=IABS(TRAVEL(KK)) +#9, JSR GETWRD + JA .+10 + JA TRAVEL + JA KK + JA ZERO + FSTA #TMP + JSR IABS + JA .+4 + JA #TMP + FSTA LL +/ IF(LL.EQ.1 .OR. LL.EQ.K)GOTO 10 + FSUB ONE + JEQ #10 + FLDA LL + FSUB K + JEQ #10 +/ IF(TRAVEL(KK).LT.0)GOTO 50 + JSR GETWRD + JA .+10 + JA TRAVEL + JA KK + JA ZERO + JLT #50 +/ KK=KK+1 + FLDA ONE + FADDM KK +/ GOTO 9 + JA #9 + +/C +/10 NEWLOC=TRVCON(KK) +#10, JSR GETWRD + JA .+10 + JA TRVCON + JA KK + JA ZERO + FSTA NEWLOC +/ K=MOD(NEWLOC,100) + JSR MOD + JA .+6 + JA NEWLOC + JA #LIT+154 + FSTA K +/ IF(NEWLOC.LE.300)GOTO 13 + FLDA NEWLOC + FSUB #LIT+306 + JLE #13 +/ IF(PROP(K).NE.NEWLOC/100-3)GOTO 16 + FLDA K + ATX 7 + FLDA NEWLOC + FDIV #LIT+154 + JSA #FIX + FSUB THREE + FSUB PROP-3,7 + JNE #16 +/C +/C TRY NEXT ENTRY IN TRAVEL TABLE +/C +/12 IF(TRAVEL(KK).LT.0)CALL BUG(25) +#12, JSR GETWRD + JA .+10 + JA TRAVEL + JA KK + JA ZERO + JGE .+10 + JSR BUG + JA .+4 + JA #LIT+52 +/ KK=KK+1 + FLDA KK + FSTA #TMP + FADD ONE + FSTA KK + +/C MAKE SURE HE DOESN'T GO THROUGH SAME TEST AGAIN +/C +/ IF(TRVCON(KK-1).EQ.TRVCON(KK) .AND. TRVLOC(KK-1).EQ.TRVLOC(KK)) +/ 1 GOTO 12 + JSR GETWRD + JA .+10 + JA TRVCON + JA #TMP + JA ZERO + FSTA #TMP+3 + JSR GETWRD + JA .+10 + JA TRVCON + JA KK + JA ZERO + FSUB #TMP+3 + JNE #10 + + JSR GETWRD + JA .+10 + JA TRVLOC + JA #TMP + JA ZERO + FSTA #TMP+3 + + JSR GETWRD + JA .+10 + JA TRVLOC + JA #TMP + FSUB #TMP+3 + JEQ #12 +/ GO TO 10 + JA #10 +/C +/13 IF(NEWLOC.LE.100)GOTO 14 +#13, FLDA NEWLOC + FSUB #LIT+154 + JLE #14 +/ IF(TOTING(K).OR.(NEWLOC.GT.200.AND.AT(K)))GOTO 16 + FLDA K + JSA TOTING + JNE #16 + DECIMAL + LDX 200,0 + OCTAL + XTA 0 + FSUB NEWLOC + JGT #12 + FLDA K + JSA AT + JNE #16 +/ GOTO 12 + JA #12 + +/C +/14 IF(NEWLOC.NE.0.AND..NOT.PCT(NEWLOC))GOTO 12 +#14, FLDA NEWLOC + JEQ #16 + JSR PCT + JA .+4 + JA NEWLOC + JEQ #12 + +/16 NEWLOC=TRVLOC(KK) +#16, JSR GETWRD + JA .+10 + JA TRVLOC + JA KK + JA ZERO + FSTA NEWLOC +/ IF(NEWLOC.LE.300)GOTO 2 + FSUB #LIT+306 + JLE #2 +/ IF(NEWLOC.LE.500)GOTO 30000 + FLDA NEWLOC + FSUB #LIT+311 + JLE #30000 +/ CALL RSPEAK(NEWLOC-500) +/ FLDA NEWLOC +/ FSUB #LIT+311 + FSTA #TMP + JSR RSPEAK + JA .+4 + JA #TMP +/ NEWLOC=LOC + FLDA LOC + FSTA NEWLOC +/ GOTO 2 + JA #2 + +/C +/C SPECIAL MOTIONS COME HERE. LABELLING CONVENTION: STATEMENT NUMBERS NNNXX +/C (XX=00-99) ARE USED FOR SPECIAL CASE NUMBER NNN (NNN=301-500). +/C +/30000 NEWLOC=NEWLOC-300 +#30000, FLDA NEWLOC + FSUB #LIT+306 + FSTA NEWLOC +/ GOTO (30100,30200,30300)NEWLOC +/ FLDA NEWLOC + ATX 1 + STARTD + FLDA .+2,1 + STARTF + JAC + JA #30100 + JA #30200 + JA #30300 +/ CALL BUG(20) + JSR BUG + JA .+4 + JA #LIT+36 + +/C +/C TRAVEL 301. PLOVER-ALCOVE PASSAGE. CAN CARRY ONLY EMERALD. NOTE: TRAVEL +/C TABLE MUST INCLUDE "USELESS" ENTRIES GOING THROUGH PASSAGE, WHICH CAN NEVER +/C BE USED FOR ACTUAL MOTION, BUT CAN BE SPOTTED BY "GO BACK". +/C +/30100 NEWLOC=99+100-LOC +#30100, FLDA #LIT+300 /199 + FSUB LOC + FSTA NEWLOC +/ IF(HOLDNG.EQ.0.OR.(HOLDNG.EQ.1.AND.TOTING(EMRALD)))GOTO 2 + FLDA HOLDNG + JEQ #2 + FSUB ONE + JNE #M27 + FLDA EMRALD + JSA TOTING + JNE #2 +/ NEWLOC=LOC +#M27, FLDA LOC + FSTA NEWLOC +/ CALL RSPEAK(117) +/ GOTO 2 + JSR RSPEAK + JA #2 + JA #LIT+173 + +/C +/C TRAVEL 302. PLOVER TRANSPORT. DROP THE EMERALD (ONLY USE SPECIAL TRAVEL IF +/C TOTING IT), SO HE'S FORCED TO USE THE PLOVER-PASSAGE TO GET IT OUT. HAVING +/C DROPPED IT, GO BACK AND PRETEND HE WASN'T CARRYING IT AFTER ALL. +/C +/30200 CALL DROP(EMRALD,LOC) +/GOTO 12 +#30200, JSR DROP + JA #12 + JA EMRALD + JA LOC + +/C +/C TRAVEL 303. TROLL BRIDGE. MUST BE DONE ONLY AS SPECIAL MOTION SO THAT +/C DWARVES WON'T WANDER ACROSS AND ENCOUNTER THE BEAR. (THEY WON'T FOLLOW THE +/C PLAYER THERE BECAUSE THAT REGION IS FORBIDDEN TO THE PIRATE.) IF +/C PROP(TROLL)=1, HE'S CROSSED SINCE PAYING, SO STEP OUT AND BLOCK HIM. +/C (STANDARD TRAVEL ENTRIES CHECK FOR PROP(TROLL)=0.) SPECIAL STUFF FOR BEAR. +/C +/30300 IF(PROP(TROLL).NE.1)GOTO 30310 +#30300, FLDA TROLL + JSA RDPROP + FSUB ONE + JNE #30310 +/ CALL PSPEAK(TROLL,1) + JSR PSPEAK + JA .+6 + JA TROLL + JA ONE +/ PROP(TROLL)=0 + FCLA + FSTA PROP-3,7 +/ CALL MOVE(TROLL2,0) + JSR MOVE + JA .+6 + JA TROLL2 + JA ZERO +/ CALL MOVE(TROLL2+100,0) + FLDA TROLL2 + FADD #LIT+154 + FSTA #TMP + JSR MOVE + JA .+6 + JA #TMP + JA ZERO +/ CALL MOVE(TROLL,PLAC(TROLL)) + FLDA TROLL + ATX 7 + FLDA PLAC-3,7 + FSTA #TMP + JSR MOVE + JA .+6 + JA TROLL + JA #TMP +/ CALL MOVE(TROLL+100,FIXD(TROLL)) + FLDA TROLL + ATX 7 + FADD #LIT+154 + FSTA #TMP + FLDA FIXD-3,7 + FSTA #TMP+3 + JSR MOVE + JA .+6 + JA #TMP + JA #TMP+3 +/ CALL JUGGLE(CHASM) + FLDA CHASM + JSA JUGGLE +/ NEWLOC=LOC + FLDA LOC + FSTA NEWLOC +/ GOTO 2 + JA #2 + +/C +/30310 NEWLOC=PLAC(TROLL)+FIXD(TROLL)-LOC +#30310, FLDA TROLL + ATX 7 + FLDA PLAC-3,7 + FADD FIXD-3,7 + FSUB LOC + FSTA NEWLOC +/ IF(PROP(TROLL).EQ.0)PROP(TROLL)=1 + FLDA PROP-3,7 + JNE .+5 + FLDA ONE + FSTA PROP-3,7 +/ IF(.NOT.TOTING(BEAR))GOTO 2 + FLDA BEAR + JSA TOTING + JEQ #2 +/ CALL RSPEAK(162) + JSR RSPEAK + JA .+4 + JA #LIT+237 +/ PROP(CHASM)=1 + FLDA CHASM + ATX 7 + FLDA ONE + FSTA PROP-3,7 +/ PROP(TROLL)=2 + FLDA TROLL + ATX 7 + FLDA TWO + FSTA PROP-3,7 +/ CALL DROP(BEAR,NEWLOC) + JSR DROP + JA .+6 + JA BEAR + JA NEWLOC +/ FIXED(BEAR)=-1 + FLDA BEAR + ATX 7 + FLDA MINUS1 + FSTA FIXED-3,7 +/ PROP(BEAR)=3 + FLDA THREE + FSTA PROP-3,7 +/ IF(PROP(SPICES).LT.0)TALLY2=TALLY2+1 + FLDA SPICES + JSA RDPROP + JGE .+7 + FLDA TALLY2 + FADD ONE + FSTA TALLY2 +/ OLDLC2=NEWLOC + FLDA NEWLOC + FSTA OLDLC2 +/ GOTO 99 + JA #99 + +/C +/C END OF SPECIALS. +/C +/C HANDLE "GO BACK". LOOK FOR VERB WHICH GOES FROM LOC TO OLDLOC, OR TO OLDLC2 +/C IF OLDLOC HAS FORCED-MOTION. K2 SAVES ENTRY -> FORCED LOC -> PREVIOUS LOC. +/C +/20 K=OLDLOC +#20, FLDA OLDLOC + FSTA K +/ IF(FORCED(K))K=OLDLC2 +/ FLDA K + JSA FORCED + JEQ .+6 + FLDA OLDLC2 + FSTA K +/ OLDLC2=OLDLOC + FLDA OLDLOC + FSTA OLDLC2 +/ OLDLOC=LOC + FLDA LOC + FSTA OLDLOC +/ K2=0 + FCLA + FSTA K2 +/ IF(K.NE.LOC)GOTO 21 + FLDA K + FSUB LOC + JNE #21 +/ CALL RSPEAK(91) +/ GOTO 2 + JSR RSPEAK + JA #2 + JA #LIT+140 + +/C +/21 LL=TRVLOC(KK) +#21, JSR GETWRD + JA .+10 + JA TRVLOC + JA KK + JA ZERO + FSTA LL +/ IF(LL.EQ.K)GOTO 25 + FSUB K + JEQ #25 +/ IF(LL.GT.300)GOTO 22 + FLDA LL + FSUB #LIT+306 + JGT #22 +/ J=KEY(LL) + FLDA LL + ATX 7 + FLDA KEY-3,7 + FSTA J +/ IF(FORCED(LL).AND.TRVLOC(KK).EQ.K)K2=KK + FLDA LL + JSA FORCED + JEQ #22 + JSR GETWRD + JA .+10 + JA TRVLOC + JA KK + JA ZERO + FSUB K + JNE #22 + FLDA KK + FSTA K2 +/22 IF(TRAVEL(KK).LT.0)GOTO 23 +#22, JSR GETWRD + JA .+10 + JA TRAVEL + JA KK + JA ZERO + JLT #23 +/ KK=KK+1 + FLDA ONE + FADDM KK +/ GOTO 21 + JA #21 + +/C +/23 KK=K2 +#23, FLDA K2 + FSTA KK +/ IF(KK.NE.0)GOTO 25 + JNE #25 +/ CALL RSPEAK(140) +/ GOTO 2 + JSR RSPEAK + JA #2 + JA #LIT+223 + +/C +/25 K=IABS(TRAVEL(KK)) +#25, JSR GETWRD + JA .+10 + JA TRAVEL + JA KK + JA ZERO + FSTA #TMP + JSR IABS + JA .+4 + JA #TMP + FSTA K +/ KK=KEY(LOC) + FLDA LOC + ATX 7 + FLDA KEY-3,7 + FSTA KK +/ GOTO 9 + JA #9 + +/C +/C LOOK. CAN'T GIVE MORE DETAIL. PRETEND IT WASN'T DARK (THOUGH IT MAY "NOW" +/C BE DARK) SO HE WON'T FALL INTO A PIT WHILE STARING INTO THE GLOOM. +/C +/30 IF(DETAIL.LT.3)CALL RSPEAK(15) +#30, FLDA DETAIL + FSUB THREE + JGE .+10 + JSR RSPEAK + JA .+4 + JA #LIT+25 +/ DETAIL=DETAIL+1 + FLDA ONE + FADDM DETAIL +/ WZDARK=.FALSE. + FCLA + FSTA WZDARK +/ ABB(LOC)=0 + FLDA LOC + ATX 7 + FCLA + FSTA ABB-3,7 +/ GOTO 2 + JA #2 + +/C +/C CAVE. DIFFERENT MESSAGES DEPENDING ON WHETHER ABOVE GROUND. +/C +/40 IF(LOC.LT.8)CALL RSPEAK(57) +#40, FLDA LOC + FSUB #LIT+11 + JGE .+10 + JSR RSPEAK + JA #2 + JA #LIT+116 +/ IF(LOC.GE.8)CALL RSPEAK(58) +/ GOTO 2 + JSR RSPEAK + JA #2 + JA #LIT+121 + +/C +/C NON-APPLICABLE MOTION. VARIOUS MESSAGES DEPENDING ON WORD GIVEN. +/C +/50 SPK=12 +#50, FLDA #LIT+22 + FSTA SPK +/ IF(K.GE.43.AND.K.LE.50)SPK=9 + DECIMAL + LDX 43,0 + OCTAL + XTA 0 + FSUB K + JGT .+7 + FLDA K + FSUB #LIT+110 + JLE #M31 +/ IF(K.EQ.29.OR.K.EQ.30)SPK=9 + FLDA #LIT+135 + FSUB K + JEQ #M31 + FADD ONE + JNE .+6 +#M31, FLDA #LIT+14 + FSTA SPK + JA #M32 +/ IF(K.EQ.7.OR.K.EQ.36.OR.K.EQ.37)SPK=10 + LDX 7,0 + XTA 0 + FSUB K + JEQ #M34 + DECIMAL + LDX 36,0 + OCTAL + XTA 0 + FSUB K + JEQ #M34 + FADD ONE + JNE #M35 +#M34, FLDA #LIT+17 + FSTA SPK + JA #M32 +/ IF(K.EQ.11.OR.K.EQ.19)SPK=11 +#M35, DECIMAL + LDX 11,0 + OCTAL + XTA 0 + FSUB K + JEQ #M36 + DECIMAL + LDX 19,0 + OCTAL + XTA 0 + FSUB K + JNE #M32 +#M36, DECIMAL + LDX 11,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(VERB.EQ.FIND.OR.VERB.EQ.INVENT)SPK=59 +#M32, FLDA VERB + FSUB INVENT + JEQ #M37 + FLDA VERB + FSUB FIND + JNE #M38 +#M37, DECIMAL + LDX 59,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(K.EQ.62.OR.K.EQ.65)SPK=42 +#M38, FLDA K + FSUB #LIT+124 + JEQ #M39 + FSUB THREE + JNE #M40 +#M39, DECIMAL + LDX 42,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(K.EQ.17)SPK=80 +#M40, FLDA K + FSUB #LIT+33 + JNE #M33 + FLDA #LIT+325 + FSTA SPK +/ CALL RSPEAK(SPK) +/ GOTO 2 +#M33, JSR RSPEAK + JA #2 + JA SPK + +/C "YOU'RE DEAD, JIM." +/C +/C IF THE CURRENT LOC IS ZERO, IT MEANS THE CLOWN GOT HIMSELF KILLED. WE'LL +/C ALLOW THIS MAXDIE TIMES. MAXDIE IS AUTOMATICALLY SET BASED ON THE NUMBER OF +/C SNIDE MESSAGES AVAILABLE. EACH DEATH RESULTS IN A MESSAGE (81, 83, ETC.) +/C WHICH OFFERS REINCARNATION; IF ACCEPTED, THIS RESULTS IN MESSAGE 82, 84, +/C ETC. THE LAST TIME, IF HE WANTS ANOTHER CHANCE, HE GETS A SNIDE REMARK AS +/C WE EXIT. WHEN REINCARNATED, ALL OBJECTS BEING CARRIED GET DROPPED AT OLDLC2 +/C (PRESUMABLY THE LAST PLACE PRIOR TO BEING KILLED) WITHOUT CHANGE OF PROPS. +/C THE LOOP RUNS BACKWARDS TO ASSURE THAT THE BIRD IS DROPPED BEFORE THE CAGE. +/C (THIS KLUGE COULD BE CHANGED ONCE WE'RE SURE ALL REFERENCES TO BIRD AND CAGE +/C ARE DONE BY KEYWORDS.) THE LAMP IS A SPECIAL CASE (IT WOULDN'T DO TO LEAVE +/C IT IN THE CAVE). IT IS TURNED OFF AND LEFT OUTSIDE THE BUILDING (ONLY IF HE +/C WAS CARRYING IT, OF COURSE). HE HIMSELF IS LEFT INSIDE THE BUILDING (AND +/C HEAVEN HELP HIM IF HE TRIES TO XYZZY BACK INTO THE CAVE WITHOUT THE LAMP!). +/C OLDLOC IS ZAPPED SO HE CAN'T JUST "RETREAT". +/C +/C THE EASIEST WAY TO GET KILLED IS TO FALL INTO A PIT IN PITCH DARKNESS. +/C +/90 CALL RSPEAK(23) +#90, JSR RSPEAK + JA .+4 + JA #LIT+44 +/ OLDLC2=LOC + FLDA LOC + FSTA OLDLC2 +/C +/C OKAY, HE'S DEAD. LET'S GET ON WITH IT. +/C +/99 IF(CLOSNG)GOTO 95 +#99, FLDA CLOSNG + JNE #95 +/ YEA=YES(81+NUMDIE*2,82+NUMDIE*2,54) + FLDA NUMDIE + FADD NUMDIE + FADD #LIT+132 + FSTA #TMP + FADD ONE + FSTA #TMP+3 + JSR YES + JA .+10 + JA #TMP + JA #TMP+3 + JA #LIT+113 + FSTA YEA +/ NUMDIE=NUMDIE+1 + FLDA NUMDIE + FADD ONE + FSTA NUMDIE +/ IF(NUMDIE.EQ.MAXDIE.OR..NOT.YEA)GOTO 20000 + FSUB MAXDIE + JEQ #20000 + FLDA YEA + JEQ #20000 +/ PLACE(WATER)=0 + FLDA WATER + ATX 7 + FCLA + FSTA PLACE-3,7 +/ PLACE(OIL)=0 + FLDA OIL + ATX 7 + FCLA + FSTA PLACE-3,7 +/ IF(TOTING(LAMP))PROP(LAMP)=0 + FLDA LAMP + JSA TOTING + JEQ .+5 + FCLA + FSTA PROP-3,3 +/ DO 98 J=1,100 + FLDA ONE + FSTA J + +/ I=101-J +#G0150, DECIMAL + LDX 101,0 + OCTAL + XTA 0 + FSUB J + FSTA I +/ IF(.NOT.TOTING(I))GOTO 98 + JSA TOTING + JEQ #98 +/ K=OLDLC2 + FLDA OLDLC2 + FSTA K +/ IF(I.EQ.LAMP)K=1 + FLDA I + FSUB LAMP + JNE .+5 + FLDA ONE + FSTA K +/ CALL DROP(I,K) + JSR DROP + JA .+6 + JA I + JA K + +/98 CONTINUE +#98, FLDA J + FADD ONE + FSTA J + FSUB #LIT+154 + JLE #G0150 +/ LOC=3 + FLDA THREE +/ OLDLOC=LOC + FSTA LOC + FSTA OLDLOC +/ GOTO 2000 + JA #2000 + +/C +/C HE DIED DURING CLOSING TIME. NO RESURRECTION. TALLY UP A DEATH AND EXIT. +/C +/95 CALL RSPEAK(131) +#95, JSR RSPEAK + JA .+4 + JA #LIT+212 +/ NUMDIE=NUMDIE+1 + FLDA ONE + FADDM NUMDIE +/ GOTO 20000 + JA #20000 + +/C ROUTINES FOR PERFORMING THE VARIOUS ACTION VERBS +/C +/C STATEMENT NUMBERS IN THIS SECTION ARE 8000 FOR INTRANSITIVE VERBS, 9000 FOR +/C TRANSITIVE, PLUS TEN TIMES THE VERB NUMBER. MANY INTRANSITIVE VERBS USE THE +/C TRANSITIVE CODE, AND SOME VERBS USE CODE FOR OTHER VERBS, AS NOTED BELOW. +/C +/C RANDOM INTRANSITIVE VERBS COME HERE. CLEAR OBJ JUST IN CASE (SEE "ATTACK"). +/C +/8000 TYPE 8002 +#8000, JSA SPRINT + JA #8002 + JA TWO + +/8002 FORMAT(' I don''t understand "',$) +/ CALL A5TOA1(WD1,WD1A,WD1X,'".') + JSR A5TOA1 + JA .+10 + JA WD1 + JA WD1X + JA TQDOT +/ OBJ=0 + FCLA + FSTA OBJ + TRAP3 #WRITO + JA #LIT + JA #LINEF+2 + TRAP3 #RENDO +/ GOTO 2600 + JA #2600 + +/C +/C CARRY, NO OBJECT GIVEN YET. OK IF ONLY ONE OBJECT PRESENT. +/C +/8010 IF(ATLOC(LOC).EQ.0.OR.LINK(ATLOC(LOC)).NE.0)GOTO 8000 +#8010, FLDA LOC + ATX 7 + FLDA ATLOC-3,7 + JEQ #8000 + ATX 6 + FLDA LINK-3,6 + JNE #8000 +/ DO 8012 I=1,5 + FLDA ONE + FSTA I + +/ IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 8000 +#G0152, FLDA I + ATX 7 + FLDA DLOC-3,7 + FSUB LOC + JNE #8012 + FLDA DFLAG + FSUB TWO + JGE #8000 + +/8012 CONTINUE +#8012, FLDA I + FADD ONE + FSTA I + FSUB #LIT+3 + JLE #G0152 +/ OBJ=ATLOC(LOC) + FLDA LOC + ATX 7 + FLDA ATLOC-3,7 + FSTA OBJ + +/C +/C CARRY AN OBJECT. SPECIAL CASES FOR BIRD AND CAGE (IF BIRD IN CAGE, CAN'T +/C TAKE ONE WITHOUT THE OTHER. LIQUIDS ALSO SPECIAL, SINCE THEY DEPEND ON +/C STATUS OF BOTTLE. ALSO VARIOUS SIDE EFFECTS, ETC. +/C +/9010 IF(TOTING(OBJ))GOTO 2011 +#9010, FLDA OBJ + JSA TOTING + JNE #2011 +/ SPK=25 + FLDA #LIT+52 + FSTA SPK +/ IF(OBJ.EQ.PLANT.AND.PROP(PLANT).LE.0)SPK=115 + FLDA OBJ + FSUB PLANT + JNE .+12 + FLDA PLANT + JSA RDPROP + JGT .+4 + FLDA #LIT+165 + FSTA SPK +/ IF(OBJ.EQ.BEAR.AND.PROP(BEAR).EQ.1)SPK=169 + FLDA OBJ + FSUB BEAR + JNE .+15 + FLDA BEAR + JSA RDPROP + FSUB ONE + JNE .+6 + DECIMAL + LDX 169,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.CHAIN.AND.PROP(BEAR).NE.0)SPK=170 + FLDA OBJ + FSUB CHAIN + JNE .+14 + FLDA BEAR + JSA RDPROP + JEQ .+6 + DECIMAL + LDX 170,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(FIXED(OBJ).NE.0)GOTO 2011 + FLDA OBJ + ATX 7 + FLDA FIXED-3,7 + JNE #2011 +/ IF(OBJ.NE.WATER.AND.OBJ.NE.OIL)GOTO 9017 + FLDA OBJ + FSUB WATER + JEQ .+10 + FLDA OBJ + FSUB OIL + JNE #9017 +/ IF(HERE(BOTTLE).AND.LIQ(0).EQ.OBJ)GOTO 9018 + FLDA BOTTLE + JSA HERE + JEQ .+10 + JSA LIQ + FSUB OBJ + JEQ #9018 +/ OBJ=BOTTLE + FLDA BOTTLE + FSTA OBJ +/ IF(TOTING(BOTTLE).AND.PROP(BOTTLE).EQ.1)GOTO 9220 + FLDA BOTTLE + JSA TOTING + JEQ .+7 + FLDA PROP-3,3 + FSUB ONE + JEQ #9220 + +/ IF(PROP(BOTTLE).NE.1)SPK=105 + FLDA PROP-3,3 + FSUB ONE + JEQ .+4 + FLDA #LIT+157 + FSTA SPK +/ IF(.NOT.TOTING(BOTTLE))SPK=104 + FLDA BOTTLE + JSA TOTING + JNE #2011 + DECIMAL + LDX 104,0 + OCTAL + XTA 0 + FSTA SPK +/ GOTO 2011 + JA #2011 + +/9018 OBJ=BOTTLE +#9018, FLDA BOTTLE + FSTA OBJ + +/9017 IF(HOLDNG.LT.7)GOTO 9016 +#9017, LDX 7,0 + XTA 0 + FSUB HOLDNG + JGE #9016 +/ CALL RSPEAK(92) + JSR RSPEAK + JA #2012 + JA #LIT+143 +/ GOTO 2012 + +/9016 IF(OBJ.NE.BIRD)GOTO 9014 +#9016, FLDA OBJ + FSUB BIRD + JNE #9014 +/ IF(PROP(BIRD).NE.0)GOTO 9014 + FLDA BIRD + JSA RDPROP + JNE #9014 +/ IF(.NOT.TOTING(ROD))GOTO 9013 + FLDA ROD + JSA TOTING + JEQ #9013 +/ CALL RSPEAK(26) + JSR RSPEAK + JA #2012 + JA #LIT+55 +/ GOTO 2012 + +/9013 IF(TOTING(CAGE))GOTO 9015 +#9013, FLDA CAGE + JSA TOTING + JNE #9015 +/ CALL RSPEAK(27) + JSR RSPEAK + JA #2012 + JA #LIT+60 +/ GOTO 2012 + +/9015 PROP(BIRD)=1 +#9015, FLDA BIRD + ATX 7 + FLDA ONE + FSTA PROP-3,7 + +/9014 IF((OBJ.EQ.BIRD.OR.OBJ.EQ.CAGE).AND.PROP(BIRD).NE.0) +/ 1 CALL CARRY(BIRD+CAGE-OBJ,LOC) +#9014, FLDA OBJ + FSUB BIRD + JEQ .+10 + FLDA OBJ + FSUB CAGE + JNE .+27 + FLDA BIRD + JSA RDPROP + JEQ .+21 + FLDA BIRD + FADD CAGE + FSUB OBJ + FSTA #TMP + JSR CARRY + JA .+6 + JA #TMP + JA LOC +/ CALL CARRY(OBJ,LOC) + JSR CARRY + JA .+6 + JA OBJ + JA LOC +/ K=LIQ(0) + JSA LIQ + FSTA K +/ IF(OBJ.EQ.BOTTLE.AND.K.NE.0)PLACE(K)=-1 + FLDA OBJ + FSUB BOTTLE + JNE #2009A + FLDA K + JEQ #2009A + ATX 7 + FLDA MINUS1 + FSTA PLACE-3,7 +/ GOTO 2009 +#2009A, DECIMAL + LDX 202,0 + OCTAL + XTA 0 + FSTA K /RHM - "Taken" message + JA #2010 + +/C +/C DISCARD OBJECT. "THROW" ALSO COMES HERE FOR MOST OBJECTS. SPECIAL CASES FOR +/C BIRD (MIGHT ATTACK SNAKE OR DRAGON) AND CAGE (MIGHT CONTAIN BIRD) AND VASE. +/C DROP COINS AT VENDING MACHINE FOR EXTRA BATTERIES. +/C +/9020 IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD))OBJ=ROD2 +#9020, FLDA ROD2 + JSA TOTING + JEQ .+22 + FLDA OBJ + FSUB ROD + JNE .+14 + FLDA ROD + JSA TOTING + JNE .+6 + FLDA ROD2 + FSTA OBJ +/ IF(.NOT.TOTING(OBJ))GOTO 2011 + FLDA OBJ + JSA TOTING + JEQ #2011 +/ IF(OBJ.NE.BIRD.OR..NOT.HERE(SNAKE))GOTO 9024 + FLDA OBJ + FSUB BIRD + JNE #9024 + FLDA SNAKE + JSA HERE + JEQ #9024 +/ CALL RSPEAK(30) + JSR RSPEAK + JA .+4 + JA #LIT+63 +/ IF(CLOSED)GOTO 19000 + FLDA CLOSED + JNE #19000 +/ CALL DSTROY(SNAKE) + FLDA SNAKE + JSA DSTROY +/C +/C SET PROP FOR USE BY TRAVEL OPTIONS +/C +/ PROP(SNAKE)=1 + FLDA SNAKE + ATX 7 + FLDA ONE + FSTA PROP-3,7 + +/9021 K=LIQ(0) +#9021, JSA LIQ + FSTA K +/ IF(K.EQ.OBJ)OBJ=BOTTLE + FSUB OBJ + JNE .+6 + FLDA BOTTLE + FSTA OBJ +/ IF(OBJ.EQ.BOTTLE.AND.K.NE.0)PLACE(K)=0 + FLDA OBJ + FSUB BOTTLE + JNE .+12 + FLDA K + JEQ .+6 + ATX 7 + FCLA + FSTA PLACE-3,7 +/ IF(OBJ.EQ.CAGE.AND.PROP(BIRD).NE.0)CALL DROP(BIRD,LOC) + FLDA OBJ + FSUB CAGE + JNE .+20 + FLDA BIRD + JSA RDPROP + JEQ .+12 + JSR DROP + JA .+6 + JA BIRD + JA LOC +/ IF(OBJ.EQ.BIRD)PROP(BIRD)=0 + FLDA OBJ + FSUB BIRD + JNE .+10 + FLDA BIRD + ATX 7 + FCLA + FSTA PROP-3,7 +/ CALL DROP(OBJ,LOC) + JSR DROP +/ GO TO 2012 + JA #2012 +/ + JA OBJ + JA LOC + +/C +/9024 IF(OBJ.NE.COINS.OR..NOT.HERE(VEND))GOTO 9025 +#9024, FLDA OBJ + FSUB COINS + JNE #9025 + FLDA VEND + JSA HERE + JEQ #9025 +/ CALL DSTROY(COINS) + FLDA COINS + JSA DSTROY +/ CALL DROP(BATTER,LOC) + JSR DROP + JA .+6 + JA BATTER + JA LOC +/ CALL PSPEAK(BATTER,0) + JSR PSPEAK + JA .+6 + JA BATTER + JA ZERO +/ GOTO 2012 + JA #2012 + + /C +/9025 IF(OBJ.NE.BIRD.OR..NOT.AT(DRAGON).OR.PROP(DRAGON).NE.0)GOTO 9026 +#9025, FLDA OBJ + FSUB BIRD + JNE #9026 + FLDA DRAGON + JSA AT + JEQ #9026 +/ FLDA DRAGON +/ ATX 3 + FLDA PROP-3,3 + JNE #9026 +/ CALL RSPEAK(154) + JSR RSPEAK + JA .+4 + JA #LIT+333 +/ CALL DSTROY(BIRD) + FLDA BIRD + JSA DSTROY +/ PROP(BIRD)=0 + FLDA BIRD + ATX 7 + FCLA + FSTA PROP-3,7 +/ IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1 + FLDA SNAKE + ATX 7 + FLDA PLACE-3,7 + FSUB PLAC-3,7 + JNE #2012 + FLDA TALLY2 + FADD ONE + FSTA TALLY2 +/ GOTO 2012 + JA #2012 + +/C +/9026 IF(OBJ.NE.BEAR.OR..NOT.AT(TROLL))GOTO 9027 +#9026, FLDA OBJ + FSUB BEAR + JNE #9027 + FLDA TROLL + JSA AT + JEQ #9027 +/ CALL RSPEAK(163) + JSR RSPEAK + JA .+4 + JA #LIT+242 +/ CALL MOVE(TROLL,0) + JSR MOVE + JA .+6 + JA TROLL + JA ZERO +/ CALL MOVE(TROLL+100,0) + FLDA TROLL + FADD #LIT+154 + FSTA #TMP + JSR MOVE + JA .+6 + JA #TMP + JA ZERO +/ CALL MOVE(TROLL2,PLAC(TROLL)) + FLDA TROLL + ATX 7 + FLDA PLAC-3,7 + FSTA #TMP + JSR MOVE + JA .+6 + JA TROLL2 + JA #TMP +/ CALL MOVE(TROLL2+100,FIXD(TROLL)) + FLDA TROLL2 + FADD #LIT+154 + FSTA #TMP +/ FLDA TROLL +/ ATX 7 + FLDA FIXD-3,7 + FSTA #TMP+3 + JSR MOVE + JA .+6 + JA #TMP + JA #TMP+3 +/ CALL JUGGLE(CHASM) + FLDA CHASM + JSA JUGGLE +/ PROP(TROLL)=2 +/ FLDA TROLL +/ ATX 7 + FLDA TWO + FSTA PROP-3,7 +/ GOTO 9021 + JA #9021 + +/C +/9027 IF(OBJ.EQ.VASE.AND.LOC.NE.PLAC(PILLOW))GOTO 9028 +#9027, FLDA OBJ + FSUB VASE + JNE .+13 + FLDA PILLOW + ATX 7 + FLDA LOC + FSUB PLAC-3,7 + JNE #9028 +/ CALL RSPEAK(54) + JSR RSPEAK + JA #9021 + JA #LIT+113 +/ GOTO 9021 + +/C +/9028 PROP(VASE)=2 +#9028, FLDA VASE + ATX 7 + FLDA TWO + FSTA PROP-3,7 +/ IF(AT(PILLOW))PROP(VASE)=0 + FLDA PILLOW + JSA AT + JEQ .+10 + FLDA VASE + ATX 7 + FCLA + FSTA PROP-3,7 +/ CALL PSPEAK(VASE,PROP(VASE)+1) + FLDA VASE + JSA RDPROP + FADD ONE + FSTA #TMP + JSR PSPEAK + JA .+6 + JA VASE + JA #TMP +/ IF(PROP(VASE).NE.0)FIXED(VASE)=-1 + FLDA VASE + ATX 7 + FLDA PROP-3,7 + JEQ #9021 + FLDA MINUS1 + FSTA FIXED-3,7 +/ GOTO 9021 + JA #9021 + +/C +/C SAY. ECHO WD2 (OR WD1 IF NO WD2 (SAY WHAT?, ETC.).) MAGIC WORDS OVERRIDE. +/C +/9030 IF(WD2.EQ.0)GOTO 9031 +#9030, FLDA WD2 + JEQ #9031 +/ WD1=WD2 WD1A=WD2A + FLDA WD2 + FSTA WD1 +/ WD1X=WD2X + FLDA WD2X + FSTA WD1X + +/9031 CALL VOCAB(WD1,WD1A,-1,I) +#9031, JSR VOCAB + JA .+6 + JA WD1 + JA MINUS1 + FSTA I +/ IF(I.EQ.62.OR.I.EQ.65.OR.I.EQ.71.OR.I.EQ.2025)GOTO 9035 + FSUB #LIT+124 + JEQ #9035 + FSUB THREE + JEQ #9035 + FSUB #LIT+3 + JEQ #9035 + DECIMAL + LDX 2025,0 + OCTAL + XTA 0 + FSUB I + JEQ #9035 +/ TYPE 9032 + JSA SPRINT + JA #9032 + JA TWO +/9032 FORMAT(' Okay, "',$) +/ CALL A5TOA1(WD1,WD1A,WD1X,'".') + JSR A5TOA1 + JA #2012 + JA WD1 + JA WD1X + JA TQDOT +/ GOTO 2012 + +/C +/9035 WD2=0 +#9035, FCLA + FSTA WD2 +/ OBJ=0 + FSTA OBJ +/ GOTO 2630 + JA #2630 + +/C +/C LOCK, UNLOCK, NO OBJECT GIVEN. ASSUME VARIOUS THINGS IF PRESENT. +/C +/8040 SPK=28 +#8040, DECIMAL + LDX 28,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(HERE(CLAM))OBJ=CLAM + FLDA CLAM + JSA HERE + JEQ .+6 + FLDA CLAM + FSTA OBJ +/ IF(HERE(OYSTER))OBJ=OYSTER + FLDA OYSTER + JSA HERE + JEQ .+6 + FLDA OYSTER + FSTA OBJ +/ IF(AT(DOOR))OBJ=DOOR + FLDA DOOR + JSA AT + JEQ .+6 + FLDA DOOR + FSTA OBJ +/ IF(AT(GRATE))OBJ=GRATE + FLDA GRATE + JSA AT + JEQ .+6 + FLDA GRATE + FSTA OBJ +/ IF(OBJ.NE.0.AND.HERE(CHAIN))GOTO 8000 + FLDA OBJ + JEQ .+10 + FLDA CHAIN + JSA HERE + JNE #8000 +/ IF(HERE(CHAIN))OBJ=CHAIN + FLDA CHAIN + JSA HERE + JEQ .+6 + FLDA CHAIN + FSTA OBJ +/ IF(OBJ.EQ.0)GOTO 2011 + FLDA OBJ + JEQ #2011 + +/C +/C LOCK, UNLOCK OBJECT. SPECIAL STUFF FOR OPENING CLAM/OYSTER AND FOR CHAIN. +/C +/9040 IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)GOTO 9046 +#9040, FLDA OBJ + FSUB CLAM + JEQ #9046 + FLDA OBJ + FSUB OYSTER + JEQ #9046 +/ IF(OBJ.EQ.DOOR)SPK=111 + FLDA OBJ + FSUB DOOR + JNE #9040A + DECIMAL + LDX 111,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.DOOR.AND.PROP(DOOR).EQ.1)SPK=54 +#9040A, FLDA OBJ + FSUB DOOR + JNE .+13 + FLDA DOOR + JSA RDPROP + FSUB ONE + JEQ .+4 + FLDA #LIT+113 + FSTA SPK +/ IF(OBJ.EQ.CAGE)SPK=32 + FLDA OBJ + FSUB CAGE + JNE .+6 + DECIMAL + LDX 32,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.KEYS)SPK=55 + FLDA OBJ + FSUB KEYS + JNE .+6 + DECIMAL + LDX 55,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.GRATE.OR.OBJ.EQ.CHAIN)SPK=31 + FLDA OBJ + FSUB GRATE + JEQ .+10 + FLDA OBJ + FSUB CHAIN + JNE .+6 + DECIMAL + LDX 31,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(SPK.NE.31.OR..NOT.HERE(KEYS))GOTO 2011 + DECIMAL + LDX 31,0 + OCTAL + XTA 0 + FSUB SPK + JNE #2011 + FLDA KEYS + JSA HERE + JEQ #2011 +/ IF(OBJ.EQ.CHAIN)GOTO 9048 + FLDA OBJ + FSUB CHAIN + JEQ #9048 +/ IF(.NOT.CLOSNG)GOTO 9043 + FLDA CLOSNG + JEQ #9043 +/ K=130 + FLDA #LIT+207 + FSTA K +/ IF(.NOT.PANIC)CLOCK2=15 + FLDA PANIC + JNE .+5 + FLDA #LIT+25 + FSTA CLOCK2 +/ PANIC=.TRUE. + FLDA ONE + FSTA PANIC +/ GOTO 2010 + JA #2010 + +/C +/9043 K=34+PROP(GRATE) +#9043, FLDA GRATE + ATX 7 + DECIMAL + LDX 34,0 + OCTAL + XTA 0 + FADD PROP-3,7 + FSTA K +/ IF(VERB.EQ.LOCK)PROP(GRATE)=0 + FLDA ONE + FSTA PROP-3,7 + FLDA VERB + FSUB LOCK + JNE .+4 +/ FCLA / already zero + FSTA PROP-3,7 +/ K=K+2*PROP(GRATE) + FLDA TWO + FMUL PROP-3,7 + FADD K + FSTA K +/ GOTO 2010 + JA #2010 + +/C +/C CLAM/OYSTER. +/C +/9046 K=0 +#9046, FCLA + FSTA K +/ IF(OBJ.EQ.OYSTER)K=1 + FLDA OBJ + FSUB OYSTER + JNE .+5 + FLDA ONE + FSTA K +/ SPK=124+K + DECIMAL + LDX 124,0 + OCTAL + XTA 0 + FADD K + FSTA SPK +/ IF(TOTING(OBJ))SPK=120+K + FLDA OBJ + JSA TOTING + JEQ #9046A + DECIMAL + LDX 120,0 + OCTAL + XTA 0 + FADD K + FSTA SPK +/ IF(.NOT.TOTING(TRIDNT))SPK=122+K +#9046A, FLDA TRIDNT + JSA TOTING + JNE .+10 + DECIMAL + LDX 122,0 + OCTAL + XTA 0 + FADD K + FSTA SPK +/ IF(VERB.EQ.LOCK)SPK=61 + FLDA VERB + FSUB LOCK + JNE .+6 + DECIMAL + LDX 61,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(SPK.NE.124)GOTO 2011 + DECIMAL + LDX 124,0 + OCTAL + XTA 0 + FSUB SPK + JNE #2011 +/ CALL DSTROY(CLAM) + FLDA CLAM + JSA DSTROY +/ CALL DROP(OYSTER,LOC) + JSR DROP + JA .+6 + JA OYSTER + JA LOC +/ CALL DROP(PEARL,105) + JSR DROP + JA #2011 + JA PEARL + JA #LIT+157 +/ GOTO 2011 + +/C +/C CHAIN. +/C +/9048 IF(VERB.EQ.LOCK)GOTO 9049 +#9048, FLDA VERB + FSUB LOCK + JEQ #9049 +/ SPK=171 + DECIMAL + LDX 171,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(PROP(BEAR).EQ.0)SPK=41 + FLDA BEAR + JSA RDPROP + JNE .+6 + DECIMAL + LDX 41,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(PROP(CHAIN).EQ.0)SPK=37 + FLDA CHAIN + JSA RDPROP + JNE .+4 + FLDA #LIT+71 + FSTA SPK +/ IF(SPK.NE.171)GOTO 2011 + DECIMAL + LDX 171,0 + OCTAL + XTA 0 + FSUB SPK + JNE #2011 +/ PROP(CHAIN)=0 + FCLA + FSTA PROP-3,7 +/ FIXED(CHAIN)=0 + FSTA FIXED-3,7 +/ IF(PROP(BEAR).NE.3)PROP(BEAR)=2 + FLDA BEAR + JSA RDPROP + FSUB THREE + JEQ .+5 + FLDA TWO + FSTA PROP-3,7 +/ FIXED(BEAR)=2-PROP(BEAR) + FLDA TWO + FSUB PROP-3,7 + FSTA FIXED-3,7 +/ GOTO 2011 + JA #2011 + +/C +/9049 SPK=172 +#9049, DECIMAL + LDX 172,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(PROP(CHAIN).NE.0)SPK=34 + FLDA CHAIN + JSA RDPROP + JEQ .+6 + DECIMAL + LDX 34,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(LOC.NE.PLAC(CHAIN))SPK=173 + FLDA LOC + FSUB PLAC-3,7 + JEQ .+6 + DECIMAL + LDX 173,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(SPK.NE.172)GOTO 2011 + DECIMAL + LDX 172,0 + OCTAL + XTA 0 + FSUB SPK + JNE #2011 +/ PROP(CHAIN)=2 + FLDA TWO + FSTA PROP-3,7 +/ IF(TOTING(CHAIN))CALL DROP(CHAIN,LOC) + FLDA CHAIN + JSA TOTING + JEQ .+12 + JSR DROP + JA .+6 + JA CHAIN + JA LOC +/ FIXED(CHAIN)=-1 + FLDA MINUS1 + FSTA FIXED-3,7 +/ GOTO 2011 + JA #2011 + +/C +/C LIGHT LAMP +/C +/9070 IF(.NOT.HERE(LAMP))GOTO 2011 +#9070, FLDA LAMP + JSA HERE + JEQ #2011 +/ SPK=184 + FLDA #LIT+253 + FSTA SPK +/ IF(LIMIT.LT.0)GOTO 2011 + FLDA LIMIT + JLT #2011 +/ PROP(LAMP)=1 + FLDA LAMP + ATX 7 + FLDA ONE + FSTA PROP-3,7 +/ CALL RSPEAK(39) + JSR RSPEAK + JA .+4 + JA #LIT+74 +/ IF(WZDARK)GOTO 2000 + FLDA WZDARK + JNE #2000 +/ GOTO 2012 + JA #2012 + +/C +/C LAMP OFF +/C +/9080 IF(.NOT.HERE(LAMP))GOTO 2011 +#9080, FLDA LAMP + ATX 7 + JSA HERE + JEQ #2011 +/ PROP(LAMP)=0 + FCLA + FSTA PROP-3,7 +/ CALL RSPEAK(40) + JSR RSPEAK + JA .+4 + JA #LIT+77 +/ IF(DARK(0))CALL RSPEAK(16) + JSA DARK + JEQ #2012 + JSR RSPEAK + JA #2012 + JA #LIT+30 +/ GOTO 2012 + +/C +/C WAVE. NO EFFECT UNLESS WAVING ROD AT FISSURE. +/C +/9090 IF((.NOT.TOTING(OBJ)).AND.(OBJ.NE.ROD.OR..NOT.TOTING(ROD2))) +/ 1 SPK=29 +#9090, FLDA OBJ + JSA TOTING + JNE .+20 + FLDA OBJ + FSUB ROD + JNE .+12 + FLDA ROD2 + JSA TOTING + JNE .+4 + FLDA #LIT+135 + FSTA SPK +/ IF(OBJ.NE.ROD.OR..NOT.AT(FISSUR).OR..NOT.TOTING(OBJ) +/ 1 .OR.CLOSNG)GOTO 2011 + FLDA OBJ + FSUB ROD + JNE #2011 + FLDA FISSUR + JSA AT + JEQ #2011 + FLDA OBJ + JSA TOTING + JEQ #2011 + FLDA CLOSNG + JNE #2011 +/ PROP(FISSUR)=1-PROP(FISSUR) + FLDA FISSUR + ATX 7 + FLDA ONE + FSUB PROP-3,7 + FSTA PROP-3,7 +/ CALL PSPEAK(FISSUR,2-PROP(FISSUR)) + FLDA FISSUR + ATX 7 + FLDA TWO + FSUB PROP-3,7 + FSTA #TMP + JSR PSPEAK + JA #2012 + JA FISSUR + JA #TMP +/ GOTO 2012 + +/C +/C ATTACK. ASSUME TARGET IF UNAMBIGUOUS. "THROW" ALSO LINKS HERE. ATTACKABLE +/C OBJECTS FALL INTO TWO CATEGORIES: ENEMIES (SNAKE, DWARF, ETC.) AND OTHERS +/C (BIRD, CLAM). AMBIGUOUS IF TWO ENEMIES, OR IF NO ENEMIES BUT TWO OTHERS. +/C +/9120 DO 9121 I=1,5 +#9120, FLDA ONE + FSTA I + +#H0102, FLDA I + ATX 7 +/ IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 9122 + FLDA DLOC-3,7 + FSUB LOC + JNE #9121 + FLDA DFLAG + FSUB TWO + JGE #9122 + +/9121 CONTINUE +#9121, FLDA I + FADD ONE + FSTA I + FSUB #LIT+3 + JLE #H0102 +/ I=0 + FCLA + FSTA I + +/9122 IF(OBJ.NE.0)GOTO 9124 +#9122, FLDA OBJ + JNE #9124 +/ IF(I.NE.0)OBJ=DWARF + FLDA I + JEQ .+6 + FLDA DWARF + FSTA OBJ +/ IF(HERE(SNAKE))OBJ=OBJ*100+SNAKE + FLDA SNAKE + JSA HERE + JEQ .+11 + FLDA OBJ + FMUL #LIT+154 + FADD SNAKE + FSTA OBJ +/ IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)OBJ=OBJ*100+DRAGON + FLDA DRAGON + JSA AT + JEQ .+15 +/ FLDA DRAGON +/ ATX 3 + FLDA PROP-3,3 + JNE .+11 + FLDA OBJ + FMUL #LIT+154 + FADD DRAGON + FSTA OBJ +/ IF(AT(TROLL))OBJ=OBJ*100+TROLL + FLDA TROLL + JSA AT + JEQ .+11 + FLDA OBJ + FMUL #LIT+154 + FADD TROLL + FSTA OBJ +/ IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)OBJ=OBJ*100+BEAR + FLDA BEAR + JSA HERE + JEQ .+15 + FLDA PROP-3,3 + JNE .+11 + FLDA OBJ + FMUL #LIT+154 + FADD BEAR + FSTA OBJ +/ IF(OBJ.GT.100)GOTO 8000 + FLDA OBJ + FSUB #LIT+154 + JGT #8000 +/ IF(OBJ.NE.0)GOTO 9124 + FLDA OBJ + JNE #9124 +/C +/C CAN'T ATTACK BIRD BY THROWING AXE. +/C +/ IF(HERE(BIRD).AND.VERB.NE.THROW)OBJ=BIRD + FLDA BEAR + JSA HERE + JEQ .+14 + FLDA VERB + FSUB THROW + JNE .+6 + FLDA BIRD + FSTA OBJ +/C +/C CLAM AND OYSTER BOTH TREATED AS CLAM FOR INTRANSITIVE CASE; NO HARM DONE. +/C +/ IF(HERE(CLAM).OR.HERE(OYSTER))OBJ=100*OBJ+CLAM + FLDA CLAM + JSA HERE + JNE .+10 + FLDA OYSTER + JSA HERE + JEQ .+11 + FLDA #LIT+154 + FMUL OBJ + FADD CLAM + FSTA OBJ +/ IF(OBJ.GT.100)GOTO 8000 + FLDA OBJ + FSUB #LIT+154 + JGT #8000 + +/9124 IF(OBJ.NE.BIRD)GOTO 9125 +#9124, FLDA OBJ + FSUB BIRD + JNE #9125 +/ SPK=137 + DECIMAL + LDX 137,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(CLOSED)GOTO 2011 + FLDA CLOSED + JNE #2011 +/ CALL DSTROY(BIRD) + FLDA BIRD + JSA DSTROY +/ PROP(BIRD)=0 + FLDA BIRD + ATX 7 + FCLA + FSTA PROP-3,7 +/ IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1 + FLDA SNAKE + ATX 7 + FLDA PLACE-3,7 + FSUB PLAC-3,7 + JNE .+7 + FLDA TALLY2 + FADD ONE + FSTA TALLY2 +/ SPK=45 + FLDA #LIT+102 + FSTA SPK + +/9125 IF(OBJ.EQ.0)SPK=44 +#9125, FLDA OBJ + JNE .+6 + DECIMAL + LDX 44,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)SPK=150 + FLDA OBJ + FSUB CLAM + JEQ .+10 + FLDA OBJ + FSUB OYSTER + JNE .+6 + DECIMAL + LDX 150,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.SNAKE)SPK=46 + FLDA OBJ + FSUB SNAKE + JNE .+6 + DECIMAL + LDX 46,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.DWARF)SPK=49 + FLDA OBJ + FSUB DWARF + JNE .+4 + FLDA #LIT+105 + FSTA SPK +/ IF(OBJ.EQ.DWARF.AND.CLOSED)GOTO 19000 + FLDA OBJ + FSUB DWARF + JNE .+6 + FLDA CLOSED + JNE #19000 +/ IF(OBJ.EQ.DRAGON)SPK=167 + FLDA OBJ + FSUB DRAGON + JNE .+6 + DECIMAL + LDX 167,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.TROLL)SPK=157 + FLDA OBJ + FSUB TROLL + JNE .+6 + DECIMAL + LDX 157,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.BEAR)SPK=165+(PROP(BEAR)+1)/2 + FLDA OBJ + FSUB BEAR + JNE .+14 + FLDA BEAR + JSA RDPROP + FADD ONE + FDIV TWO + JSA #FIX + FADD #LIT+245 + FSTA SPK +/ IF(OBJ.NE.DRAGON.OR.PROP(DRAGON).NE.0)GOTO 2011 + FLDA OBJ + FSUB DRAGON + JNE #2011 + FLDA DRAGON + JSA RDPROP + JNE #2011 +/C +/C FUN STUFF FOR DRAGON. IF HE INSISTS ON ATTACKING IT, WIN! SET PROP TO DEAD, +/C MOVE DRAGON TO CENTRAL LOC (STILL FIXED), MOVE RUG THERE (NOT FIXED), AND +/C MOVE HIM THERE, TOO. THEN DO A NULL MOTION TO GET NEW DESCRIPTION. +/C +/ CALL RSPEAK(49) + JSR RSPEAK + JA .+4 + JA #LIT+105 +/ VERB=0 + FCLA + FSTA VERB +/ OBJ=0 + FSTA OBJ +/ CALL GETIN(WD1,WD1A,WD1X,WD2,WD2A,WD2X) + JSR GETIN + JA .+12 + JA WD1 + JA WD1X + JA WD2 + JA WD2X +/ IF(WD1.NE.'YE'.AND.WD1.NE.'Y')GOTO 2608 + FLDA WD1 + FSUB TYES + JEQ OKKILL + FLDA WD1 + FSUB TYE + JEQ OKKILL + FLDA WD1 + FSUB TY + JNE #2608 +/ CALL PSPEAK(DRAGON,1) +OKKILL, JSR PSPEAK + JA .+6 + JA DRAGON + JA ONE +/ PROP(DRAGON)=2 + FLDA DRAGON + ATX 7 + FLDA TWO + FSTA PROP-3,7 +/ PROP(RUG)=0 + FLDA RUG + ATX 7 + FCLA + FSTA PROP-3,7 +/ K=(PLAC(DRAGON)+FIXD(DRAGON))/2 + FLDA DRAGON + ATX 7 + FLDA PLAC-3,7 + FADD FIXD-3,7 + FDIV TWO + JSA #FIX + FSTA K +/ CALL MOVE(DRAGON+100,-1) + FLDA DRAGON + FADD #LIT+154 + FSTA #TMP + JSR MOVE + JA .+6 + JA #TMP + JA MINUS1 +/ CALL MOVE(RUG+100,0) + FLDA RUG + FADD #LIT+154 + FSTA #TMP + JSR MOVE + JA .+6 + JA #TMP + JA ZERO +/ CALL MOVE(DRAGON,K) + JSR MOVE + JA .+6 + JA DRAGON + JA K +/ CALL MOVE(RUG,K) + JSR MOVE + JA .+6 + JA RUG + JA K +/ DO 9126 OBJ=1,100 + FLDA ONE + FSTA OBJ + +/ IF(PLACE(OBJ).EQ.PLAC(DRAGON).OR.PLACE(OBJ).EQ.FIXD(DRAGON)) +/ 1 CALL MOVE(OBJ,K) +#H0122, FLDA OBJ + ATX 7 + FLDA DRAGON + ATX 6 + FLDA PLACE-3,7 + FSUB PLAC-3,6 + JEQ .+10 + FLDA PLACE-3,7 + FSUB FIXD-3,6 + JNE #9126 + JSR MOVE + JA .+6 + JA OBJ + JA K +/9126 CONTINUE +#9126, FLDA OBJ + FADD ONE + FSTA OBJ + FSUB #LIT+154 + JLE #H0122 +/ LOC=K + FLDA K + FSTA LOC +/ K=NULL + FLDA NULL + FSTA K +/ GOTO 8 + JA #8 + +/C +/C POUR. IF NO OBJECT, OR OBJECT IS BOTTLE, ASSUME CONTENTS OF BOTTLE. +/C SPECIAL TESTS FOR POURING WATER OR OIL ON PLANT OR RUSTY DOOR. +/C +/9130 IF(OBJ.EQ.BOTTLE.OR.OBJ.EQ.0)OBJ=LIQ(0) +#9130, FLDA OBJ + FSUB BOTTLE + JEQ .+6 + FLDA OBJ + JNE .+6 + JSA LIQ + FSTA OBJ +/ IF(OBJ.EQ.0)GOTO 8000 + FLDA OBJ + JEQ #8000 +/ IF(.NOT.TOTING(OBJ))GOTO 2011 + FLDA OBJ + JSA TOTING + JEQ #2011 +/ SPK=78 + DECIMAL + LDX 78,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.NE.OIL.AND.OBJ.NE.WATER)GOTO 2011 + FLDA OBJ + FSUB OIL + JEQ .+10 + FLDA OBJ + FSUB WATER + JNE #2011 +/ PROP(BOTTLE)=1 + FLDA BOTTLE + ATX 7 + FLDA ONE + FSTA PROP-3,7 +/ PLACE(OBJ)=0 + FLDA OBJ + ATX 7 + FCLA + FSTA PLACE-3,7 +/ SPK=77 + DECIMAL + LDX 77,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(.NOT.(AT(PLANT).OR.AT(DOOR)))GOTO 2011 + FLDA PLANT + JSA AT + JNE .+10 + FLDA DOOR + JSA AT + JEQ #2011 +/C +/ IF(AT(DOOR))GOTO 9132 + FLDA DOOR + JSA AT + JNE #9132 +/ SPK=112 + DECIMAL + LDX 112,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.NE.WATER)GOTO 2011 + FLDA OBJ + FSUB WATER + JNE #2011 +/ CALL PSPEAK(PLANT,PROP(PLANT)+1) + FLDA PLANT + JSA RDPROP + FADD ONE + FSTA #TMP + JSR PSPEAK + JA .+6 + JA PLANT + JA #TMP +/ PROP(PLANT)=MOD(PROP(PLANT)+2,6) + FLDA PLANT + JSA RDPROP + FADD TWO + FSTA #TMP + JSR MOD + JA .+6 + JA #TMP + JA #LIT+6 + FSTA PROP-3,7 +/ PROP(PLANT2)=PROP(PLANT)/2 + FLDA PLANT2 + ATX 7 + FLDA PLANT + JSA RDPROP + FDIV TWO + JSA #FIX + FSTA PROP-3,6 +/ K=NULL + FLDA NULL + FSTA K +/ GOTO 8 + JA #8 + +/C +/9132 PROP(DOOR)=0 +#9132, FLDA DOOR + ATX 7 + FCLA + FSTA PROP-3,7 +/ IF(OBJ.EQ.OIL)PROP(DOOR)=1 + FLDA OBJ + FSUB OIL + JNE .+10 + FLDA DOOR + ATX 7 + FLDA ONE + FSTA PROP-3,7 +/ SPK=113+PROP(DOOR) + FLDA DOOR + ATX 7 + DECIMAL + LDX 113,0 + OCTAL + XTA 0 + FADD PROP-3,7 + FSTA SPK +/ GOTO 2011 + JA #2011 + +/C +/C EAT. INTRANSITIVE: ASSUME FOOD IF PRESENT, ELSE ASK WHAT. TRANSITIVE: FOOD +/C OK, SOME THINGS LOSE APPETITE, REST ARE RIDICULOUS. +/C +/8140 IF(.NOT.HERE(FOOD))GOTO 8000 +#8140, FLDA FOOD + JSA HERE + JEQ #8000 + +/8142 CALL DSTROY(FOOD) +#8142, FLDA FOOD + JSA DSTROY +/ SPK=72 + DECIMAL + LDX 72,0 + OCTAL + XTA 0 + FSTA SPK +/ GOTO 2011 + JA #2011 +/C +/9140 IF(OBJ.EQ.FOOD)GOTO 8142 +#9140, FLDA OBJ + FSUB FOOD + JEQ #8142 +/ IF(OBJ.EQ.BIRD.OR.OBJ.EQ.SNAKE.OR.OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER +/ 1 .OR.OBJ.EQ.DWARF.OR.OBJ.EQ.DRAGON.OR.OBJ.EQ.TROLL +/ 2 .OR.OBJ.EQ.BEAR)SPK=71 + FLDA OBJ + FSUB BIRD + JEQ #M78 + FLDA OBJ + FSUB SNAKE + JEQ #M78 + FLDA OBJ + FSUB CLAM + JEQ #M78 + FLDA OBJ + FSUB OYSTER + JEQ #M78 + FLDA OBJ + FSUB DWARF + JEQ #M78 + FLDA OBJ + FSUB DRAGON + JEQ #M78 + FLDA OBJ + FSUB TROLL + JEQ #M78 + FLDA OBJ + FSUB BEAR + JNE #2011 +#M78, DECIMAL + LDX 71,0 + OCTAL + XTA 0 + FSTA SPK +/ GOTO 2011 + JA #2011 + +/C +/C DRINK. IF NO OBJECT, ASSUME WATER AND LOOK FOR IT HERE. IF WATER IS IN +/C THE BOTTLE, DRINK THAT, ELSE MUST BE AT A WATER LOC, SO DRINK STREAM. +/C +/9150 IF(OBJ.EQ.0.AND.LIQLOC(LOC).NE.WATER.AND.(LIQ(0).NE.WATER +/ 1 .OR..NOT.HERE(BOTTLE)))GOTO 8000 +#9150, FLDA OBJ + JNE #M79 + JSA LIQLOC + FSUB WATER + JEQ #M79 + JSA LIQ + FSUB WATER + JNE #8000 + FLDA BOTTLE + JSA HERE + JEQ #8000 +/ IF(OBJ.NE.0.AND.OBJ.NE.WATER)SPK=110 +#M79, FLDA OBJ + JEQ .+10 +/ FLDA OBJ + FSUB WATER + JEQ .+4 + FLDA #LIT+162 + FSTA SPK +/ IF(SPK.EQ.110.OR.LIQ(0).NE.WATER.OR..NOT.HERE(BOTTLE))GOTO 2011 + FLDA SPK + FSUB #LIT+162 + JEQ #2011 + JSA LIQ + FSUB WATER + JNE #2011 + FLDA BOTTLE + JSA HERE + JEQ #2011 +/ PROP(BOTTLE)=1 + FLDA ONE + FSTA PROP-3,3 +/ PLACE(WATER)=0 + FLDA WATER + ATX 7 + FCLA + FSTA PLACE-3,7 +/ SPK=74 + DECIMAL + LDX 74,0 + OCTAL + XTA 0 + FSTA SPK +/ GOTO 2011 + JA #2011 + +/C +/C RUB. YIELDS VARIOUS SNIDE REMARKS. +/C +/9160 IF(OBJ.NE.LAMP)SPK=76 +#9160, FLDA OBJ + FSUB LAMP + JEQ #2011 + DECIMAL + LDX 76,0 + OCTAL + XTA 0 + FSTA SPK +/ GOTO 2011 + JA #2011 + +/C +/C THROW. SAME AS DISCARD UNLESS AXE. THEN SAME AS ATTACK EXCEPT IGNORE BIRD, +/C AND IF DWARF IS PRESENT THEN ONE MIGHT BE KILLED. (ONLY WAY TO DO SO!) +/C AXE ALSO SPECIAL FOR DRAGON, BEAR, AND TROLL. TREASURES SPECIAL FOR TROLL. +/C +/9170 IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD))OBJ=ROD2 +#9170, FLDA ROD2 + JSA TOTING + JEQ #M81 + FLDA OBJ + FSUB ROD + JNE #M81 + FLDA ROD + JSA TOTING + JNE #M81 + FLDA ROD2 + FSTA OBJ +/ IF(.NOT.TOTING(OBJ))GOTO 2011 +#M81, FLDA OBJ + JSA TOTING + JEQ #2011 +/ IF(OBJ.GE.50.AND.OBJ.LE.MAXTRS.AND.AT(TROLL))GOTO 9178 + FLDA OBJ + FSUB #LIT+110 + JLT #M82 + FLDA OBJ + FSUB MAXTRS + JGT #M82 + FLDA TROLL + JSA AT + JNE #9178 +/ IF(OBJ.EQ.FOOD.AND.HERE(BEAR))GOTO 9177 +#M82, FLDA OBJ + FSUB FOOD + JNE #M83 + FLDA BEAR + JSA HERE + JNE #9177 +/ IF(OBJ.NE.AXE)GOTO 9020 +#M83, FLDA OBJ + FSUB AXE + JNE #9020 +/ DO 9171 I=1,5 + FLDA ONE + FSTA I + +/C +/C NEEDN'T CHECK DFLAG IF AXE IS HERE. +/C +/ IF(DLOC(I).EQ.LOC)GOTO 9172 +#H0132, FLDA I + ATX 7 + FLDA DLOC-3,7 + FSUB LOC + JEQ #9172 + +/9171 CONTINUE +#9171, FLDA I + FADD ONE + FSTA I + FSUB #LIT+3 + JLE #H0132 +/ SPK=152 + DECIMAL + LDX 152,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)GOTO 9175 + FLDA DRAGON + JSA AT + JEQ #M84 +/ FLDA DRAGON +/ ATX 3 + FLDA PROP-3,3 + JEQ #9175 +/ SPK=158 +#M84, DECIMAL + LDX 158,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(AT(TROLL))GOTO 9175 + FLDA TROLL + JSA AT + JNE #9175 +/ IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)GOTO 9176 + FLDA BEAR + JSA HERE + JEQ #M85 + FLDA PROP-3,3 + JEQ #9176 +/ OBJ=0 +#M85, FCLA + FSTA OBJ +/ GOTO 9120 + JA #9120 + +/C +/9172 SPK=48 +#9172, DECIMAL + LDX 48,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(RND(3).EQ.0)GOTO 9175 + JSR RND + JA .+4 + JA THREE + JEQ #9175 +/ DSEEN(I)=.FALSE. + FLDA I + ATX 7 + FCLA + FSTA DSEEN-3,7 +/ DLOC(I)=0 + FSTA DLOC-3,7 +/ SPK=47 + DECIMAL + LDX 47,0 + OCTAL + XTA 0 + FSTA SPK +/ DKILL=DKILL+1 + FLDA ONE + FADDM DKILL +/ IF(DKILL.EQ.1)SPK=149 + FSUB ONE + JNE #9175 + DECIMAL + LDX 149,0 + OCTAL + XTA 0 + FSTA SPK +/9175 CALL RSPEAK(SPK) +#9175, JSR RSPEAK + JA .+4 + JA SPK +/ CALL DROP(AXE,LOC) + JSR DROP + JA .+6 + JA AXE + JA LOC +/ K=NULL + FLDA NULL + FSTA K +/ GOTO 8 + JA #8 + +/C +/C THIS'LL TEACH HIM TO THROW THE AXE AT THE BEAR! +/C +/9176 SPK=164 +#9176, DECIMAL + LDX 164,0 + OCTAL + XTA 0 + FSTA SPK +/ CALL DROP(AXE,LOC) + JSR DROP + JA .+6 + JA AXE + JA LOC +/ FIXED(AXE)=-1 + FLDA AXE + ATX 7 + FLDA MINUS1 + FSTA FIXED-3,7 +/ PROP(AXE)=1 + FLDA ONE + FSTA PROP-3,7 +/ CALL JUGGLE(BEAR) + FLDA BEAR + JSA JUGGLE +/ GOTO 2011 + JA #2011 + +/C +/C BUT THROWING FOOD IS ANOTHER STORY. +/C +/9177 OBJ=BEAR +#9177, FLDA BEAR + FSTA OBJ +/ GOTO 9210 + JA #9210 + +/C +/C SNARF A TREASURE FOR THE TROLL. +/C +/9178 SPK=159 +#9178, DECIMAL + LDX 159,0 + OCTAL + XTA 0 + FSTA SPK +/ CALL DROP(OBJ,0) + JSR DROP + JA .+6 + JA OBJ + JA ZERO +/ CALL MOVE(TROLL,0) + JSR MOVE + JA .+6 + JA TROLL + JA ZERO +/ CALL MOVE(TROLL+100,0) + FLDA TROLL + FADD #LIT+154 + FSTA #TMP + JSR MOVE + JA .+6 + JA #TMP + JA ZERO +/ CALL DROP(TROLL2,PLAC(TROLL)) + FLDA TROLL + ATX 7 + FLDA PLAC-3,7 + FSTA #TMP + JSR DROP + JA .+6 + JA TROLL2 + JA #TMP +/ CALL DROP(TROLL2+100,FIXD(TROLL)) + FLDA TROLL2 + FADD #LIT+154 + FSTA #TMP +/ FLDA TROLL +/ ATX 7 + FLDA FIXD-3,7 + FSTA #TMP+3 + JSR DROP + JA .+6 + JA #TMP + JA #TMP+3 +/ CALL JUGGLE(CHASM) + FLDA CHASM + JSA JUGGLE +/ GOTO 2011 + JA #2011 + +/C +/C QUIT. INTRANSITIVE ONLY. VERIFY INTENT AND EXIT IF THAT'S WHAT HE WANTS. +/C +/8180 GAVEUP=YES(22,54,54) +#8180, JSR YES + JA .+10 + JA #LIT+41 + JA #LIT+113 + JA #LIT+113 + FSTA GAVEUP + +/8185 IF(GAVEUP)GOTO 20000 +#8185, FLDA GAVEUP + JNE #20000 +/ GOTO 2012 + JA #2012 +/C +/C FIND. MIGHT BE CARRYING IT, OR IT MIGHT BE HERE. ELSE GIVE CAVEAT. +/C +/9190 IF(AT(OBJ).OR.(LIQ(0).EQ.OBJ.AND.AT(BOTTLE)) +/ 1 .OR.K.EQ.LIQLOC(LOC))SPK=94 +#9190, FLDA OBJ + JSA AT + JNE #M86 + JSA LIQ + FSUB OBJ + JNE #M87 + FLDA BOTTLE + JSA AT + JNE #M86 +#M87, JSA LIQLOC + FSUB K + JNE .+6 +#M86, DECIMAL + LDX 94,0 + OCTAL + XTA 0 + FSTA SPK +/ DO 9192 I=1,5 + FLDA ONE + FSTA I +/9192 IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2.AND.OBJ.EQ.DWARF)SPK=94 +#9192, FLDA I + ATX 7 + FLDA DLOC-3,7 + FSUB LOC + JNE #M88 + FLDA DFLAG + FSUB TWO + JLT #M88 + FLDA OBJ + FSUB DWARF + JNE #M88 + DECIMAL + LDX 94,0 + OCTAL + XTA 0 + FSTA SPK +#M88, FLDA I + FADD ONE + FSTA I + FSUB #LIT+3 + JLE #9192 +/ IF(CLOSED)SPK=138 + FLDA CLOSED + JEQ .+6 + DECIMAL + LDX 138,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(TOTING(OBJ))SPK=24 + FLDA OBJ + JSA TOTING + JEQ #2011 + FLDA #LIT+47 + FSTA SPK +/ GOTO 2011 + JA #2011 + +/C +/C INVENTORY. IF OBJECT, TREAT SAME AS FIND. ELSE REPORT ON CURRENT BURDEN. +/C +/8200 SPK=98 +#8200, DECIMAL + LDX 98,0 + OCTAL + XTA 0 + FSTA SPK +/ DO 8201 I=1,100 + FLDA ONE + FSTA I + +/ IF(I.EQ.BEAR.OR..NOT.TOTING(I))GOTO 8201 +#H0143, FLDA I + FSUB BEAR + JEQ #8201 + FLDA I + JSA TOTING + JEQ #8201 +/ IF(SPK.EQ.98)CALL RSPEAK(99) + DECIMAL + LDX 98,0 + OCTAL + XTA 0 + FSUB SPK + JNE .+10 + JSR RSPEAK + JA .+4 + JA #LIT+151 +/ CALL PSPEAK(I,-1) + JSR PSPEAK + JA .+6 + JA I + JA MINUS1 +/ SPK=0 + FCLA + FSTA SPK + +/8201 CONTINUE +#8201, FLDA I + FADD ONE + FSTA I + FSUB #LIT+154 + JLE #H0143 +/ IF(TOTING(BEAR))SPK=141 + FLDA BEAR + JSA TOTING + JEQ #2011 + FLDA #LIT+226 + FSTA SPK +/ GOTO 2011 + JA #2011 + +/C +/C FEED. IF BIRD, NO SEED. SNAKE, DRAGON, TROLL: QUIP. IF DWARF, MAKE HIM +/C MAD. BEAR, SPECIAL. +/C +/9210 IF(OBJ.NE.BIRD)GOTO 9212 +#9210, FLDA OBJ + FSUB BIRD + JNE #9212 +/ SPK=100 + FLDA #LIT+154 + FSTA SPK +/ GOTO 2011 + JA #2011 + +/C +/9212 IF(OBJ.NE.SNAKE.AND.OBJ.NE.DRAGON.AND.OBJ.NE.TROLL)GOTO 9213 +#9212, FLDA OBJ + FSUB SNAKE + JEQ #M89 + FLDA OBJ + FSUB DRAGON + JEQ #M89 + FLDA OBJ + FSUB TROLL + JNE #9213 +/ SPK=102 +#M89, DECIMAL + LDX 102,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.DRAGON.AND.PROP(DRAGON).NE.0)SPK=110 + FLDA OBJ + FSUB DRAGON + JNE #M90 + FLDA DRAGON + JSA RDPROP + JEQ .+4 + FLDA #LIT+162 + FSTA SPK +/ IF(OBJ.EQ.TROLL)SPK=182 +#M90, FLDA OBJ + FSUB TROLL + JNE .+6 + DECIMAL + LDX 182,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.NE.SNAKE.OR.CLOSED.OR..NOT.HERE(BIRD))GOTO 2011 + FLDA OBJ + FSUB SNAKE + JNE #2011 + FLDA CLOSED + JNE #2011 + FLDA BIRD + JSA HERE + JEQ #2011 +/ SPK=101 + DECIMAL + LDX 101,0 + OCTAL + XTA 0 + FSTA SPK +/ CALL DSTROY(BIRD) + FLDA BIRD + JSA DSTROY +/ PROP(BIRD)=0 + FLDA BIRD + ATX 7 + FCLA + FSTA PROP-3,7 +/ TALLY2=TALLY2+1 + FLDA TALLY2 + FADD ONE + FSTA TALLY2 +/ GOTO 2011 + JA #2011 + +/C +/9213 IF(OBJ.NE.DWARF)GOTO 9214 +#9213, FLDA OBJ + FSUB DWARF + JNE #9214 +/ IF(.NOT.HERE(FOOD))GOTO 2011 + FLDA FOOD + JSA HERE + JEQ #2011 +/ SPK=103 + DECIMAL + LDX 103,0 + OCTAL + XTA 0 + FSTA SPK +/ DFLAG=DFLAG+1 + FLDA ONE + FADDM DFLAG +/ GOTO 2011 + JA #2011 + +/C +/9214 IF(OBJ.NE.BEAR)GOTO 9215 +#9214, FLDA OBJ + FSUB BEAR + JNE #9215 +/ IF(PROP(BEAR).EQ.0)SPK=102 + FLDA BEAR + JSA RDPROP + JNE .+6 + DECIMAL + LDX 102,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(PROP(BEAR).EQ.3)SPK=110 + FLDA PROP-3,7 + FSUB THREE + JNE .+4 + FLDA #LIT+162 + FSTA SPK +/ IF(.NOT.HERE(FOOD))GOTO 2011 + FLDA FOOD + JSA HERE + JEQ #2011 +/ CALL DSTROY(FOOD) + FLDA FOOD + JSA DSTROY +/ PROP(BEAR)=1 + FLDA ONE + FSTA PROP-3,7 +/ FIXED(AXE)=0 + FLDA AXE + ATX 7 + FCLA + FSTA FIXED-3,7 +/ PROP(AXE)=0 + FSTA PROP-3,7 +/ SPK=168 + DECIMAL + LDX 168,0 + OCTAL + XTA 0 + FSTA SPK +/ GOTO 2011 + JA #2011 + +/C +/9215 SPK=14 +#9215, DECIMAL + LDX 14,0 + OCTAL + XTA 0 + FSTA SPK +/ GOTO 2011 + JA #2011 + +/C +/C FILL. BOTTLE MUST BE EMPTY, AND SOME LIQUID AVAILABLE. (VASE IS NASTY.) +/C +/9220 IF(OBJ.EQ.VASE)GOTO 9222 +#9220, FLDA OBJ + FSUB VASE + JEQ #9222 +/ IF(OBJ.NE.0.AND.OBJ.NE.BOTTLE)GOTO 2011 + FLDA OBJ + JEQ #M91 + FLDA OBJ + FSUB BOTTLE + JNE #2011 +/ IF(OBJ.EQ.0.AND..NOT.HERE(BOTTLE))GOTO 8000 +#M91, FLDA OBJ + JNE #M92 + FLDA BOTTLE + JSA HERE + JEQ #8000 +/ SPK=107 +#M92, DECIMAL + LDX 107,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(LIQLOC(LOC).EQ.0)SPK=106 + JSA LIQLOC + JNE #M92A + DECIMAL + LDX 106,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(LIQ(0).NE.0)SPK=105 +#M92A, JSA LIQ + JEQ .+4 + FLDA #LIT+157 + FSTA SPK +/ IF(SPK.NE.107)GOTO 2011 + DECIMAL + LDX 107,0 + OCTAL + XTA 0 + FSUB SPK + JNE #2011 +/ PROP(BOTTLE)=MOD(COND(LOC),4)/2*2 + FLDA BOTTLE + ATX 7 + FLDA LOC + ATX 6 + FLDA COND-3,6 + FSTA #TMP + JSR MOD + JA .+6 + JA #TMP + JA #LIT + FDIV TWO + JSA #FIX + FMUL TWO + FSTA PROP-3,7 +/ K=LIQ(0) + JSA LIQ + FSTA K +/ IF(TOTING(BOTTLE))PLACE(K)=-1 + FLDA BOTTLE + JSA TOTING + JEQ .+10 + FLDA K + ATX 7 + FLDA MINUS1 + FSTA PLACE-3,7 +/ IF(K.EQ.OIL)SPK=108 + FLDA K + FSUB OIL + JNE #2011 + DECIMAL + LDX 108,0 + OCTAL + XTA 0 + FSTA SPK +/ GOTO 2011 + JA #2011 + +/C +/9222 SPK=29 +#9222, FLDA #LIT+135 + FSTA SPK +/ IF(LIQLOC(LOC).EQ.0)SPK=144 + JSA LIQLOC + JNE .+6 + DECIMAL + LDX 144,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(LIQLOC(LOC).EQ.0.OR..NOT.TOTING(VASE))GOTO 2011 + JSA LIQLOC + JEQ #2011 + FLDA VASE + JSA TOTING + JEQ #2011 +/ CALL RSPEAK(145) + JSR RSPEAK + JA .+4 + JA #LIT+234 +/ PROP(VASE)=2 + FLDA VASE + ATX 7 + FLDA TWO + FSTA PROP-3,7 +/ FIXED(VASE)=-1 + FLDA MINUS1 + FSTA FIXED-3,7 +/ GOTO 9024 + JA #9024 + +/C +/C BLAST. NO EFFECT UNLESS YOU'VE GOT DYNAMITE, WHICH IS A NEAT TRICK! +/C +/9230 IF(PROP(ROD2).LT.0.OR..NOT.CLOSED)GOTO 2011 +#9230, FLDA ROD2 + JSA RDPROP + JLT #2011 + FLDA CLOSED + JEQ #2011 +/ BONUS=133 + DECIMAL + LDX 133,0 + OCTAL + XTA 0 + FSTA BONUS +/ IF(LOC.EQ.115)BONUS=134 + FLDA LOC + FSUB #LIT+165 + JNE .+7 + DECIMAL + LDX 134,0 + OCTAL + XTA 0 + FSTA BONUS +/ IF(HERE(ROD2))BONUS=135 + FLDA ROD2 + JSA HERE + JEQ .+7 + DECIMAL + LDX 135,0 + OCTAL + XTA 0 + FSTA BONUS +/ CALL RSPEAK(BONUS) + JSR RSPEAK + JA .+4 + JA BONUS +/ GOTO 20000 + JA #20000 + +/C +/C SCORE. GO TO SCORING SECTION, WHICH WILL RETURN TO 8241 IF SCORNG IS TRUE. +/C +/8240 SCORNG=.TRUE. +#8240, FLDA ONE + FSTA SCORNG +/ GOTO 20000 + JA #20000 + +/C +/8241 SCORNG=.FALSE. +#8241, FCLA + FSTA SCORNG +/ TYPE 8243,SCORE,MXSCOR + JSA SPRINT + JA #8243 + JA TWO + + TRAP3 #WRITO + JA #LIT + JA #8243A + FLDA SCORE + TRAP3 #RSVO + TRAP3 #RENDO + + JSA SPRINT + JA #8243B + JA THREE + + TRAP3 #WRITO + JA #LIT + JA #8243A + FLDA MXSCOR + TRAP3 #RSVO + TRAP3 #RENDO + + JSA SPRINT + JA #8243C + JA ONE + +/8243 FORMAT(' If you were to quit now, you would score',I4 +/ 1 ,' out of a possible',I4,'.') +/ GAVEUP=YES(143,54,54) + JSR YES + JA .+10 + JA #LIT+231 + JA #LIT+113 + JA #LIT+113 + FSTA GAVEUP +/ GOTO 8185 + JA #8185 + +/C +/C FEE FIE FOE FOO (AND FUM). ADVANCE TO NEXT STATE IF GIVEN IN PROPER ORDER. +/C LOOK UP WD1 IN SECTION 3 OF VOCAB TO DETERMINE WHICH WORD WE'VE GOT. LAST +/C WORD ZIPS THE EGGS BACK TO THE GIANT ROOM (UNLESS ALREADY THERE). +/C +/8250 CALL VOCAB(WD1,WD1A,3,K) +#8250, JSR VOCAB + JA .+6 + JA WD1 + JA THREE + FSTA K +/ SPK=42 + DECIMAL + LDX 42,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(FOOBAR.EQ.1-K)GOTO 8252 + FLDA ONE + FSUB K + FSUB FOOBAR + JEQ #8252 +/ IF(FOOBAR.NE.0)SPK=151 + FLDA FOOBAR + JEQ #2011 + DECIMAL + LDX 151,0 + OCTAL + XTA 0 + FSTA SPK +/ GOTO 2011 + JA #2011 + +/C +/8252 FOOBAR=K +#8252, FLDA K + FSTA FOOBAR +/ IF(K.NE.4)GOTO 2009 + FSUB #LIT + JNE #2009 +/ FOOBAR=0 + FCLA + FSTA FOOBAR +/ IF(PLACE(EGGS).EQ.PLAC(EGGS) +/ 1 .OR.(TOTING(EGGS).AND.LOC.EQ.PLAC(EGGS)))GOTO 2011 + FLDA EGGS + ATX 7 + FLDA PLACE-3,7 + FSUB PLAC-3,7 + JEQ #2011 + FLDA EGGS + JSA TOTING + JEQ #M93 + FLDA LOC + FSUB PLAC-3,7 + JEQ #2011 +/C +/C BRING BACK TROLL IF WE STEAL THE EGGS BACK FROM HIM BEFORE CROSSING. +/C +/ IF(PLACE(EGGS).EQ.0.AND.PLACE(TROLL).EQ.0.AND.PROP(TROLL).EQ.0) +/ 1 PROP(TROLL)=1 +#M93, FLDA PLACE-3,7 + JNE #M94 + FLDA TROLL + ATX 6 + FLDA PLACE-3,6 + JNE #M94 + FLDA PROP-3,6 + JNE #M94 + FLDA ONE + FSTA PROP-3,6 +/ K=2 +#M94, FLDA TWO + FSTA K +/ IF(HERE(EGGS))K=1 + FLDA EGGS + JSA HERE + JEQ .+5 + FLDA ONE + FSTA K +/ IF(LOC.EQ.PLAC(EGGS))K=0 + FLDA LOC + FSUB PLAC-3,7 + JNE .+5 + FCLA + FSTA K +/ CALL MOVE(EGGS,PLAC(EGGS)) + FLDA PLAC-3,7 + FSTA #TMP + JSR MOVE + JA .+6 + JA EGGS + JA #TMP +/ CALL PSPEAK(EGGS,K) + JSR PSPEAK + JA .+6 + JA EGGS + JA K +/ GOTO 2012 + JA #2012 + +/C +/C BRIEF. INTRANSITIVE ONLY. SUPPRESS LONG DESCRIPTIONS AFTER FIRST TIME. +/C +/8260 SPK=156 +#8260, DECIMAL + LDX 156,0 + OCTAL + XTA 0 + FSTA SPK +/ ABBNUM=10000 + FLDA #LIT+322 + FSTA ABBNUM +/ DETAIL=3 + FLDA THREE + FSTA DETAIL +/ GOTO 2011 + JA #2011 + +/C +/C READ. MAGAZINES IN DWARVISH, MESSAGE WE'VE SEEN, AND . . . OYSTER? +/C +/8270 IF(HERE(MAGZIN))OBJ=MAGZIN +#8270, FLDA MAGZIN + JSA HERE + JEQ .+6 + FLDA MAGZIN + FSTA OBJ +/ IF(HERE(TABLET))OBJ=OBJ*100+TABLET + FLDA TABLET + JSA HERE + JEQ .+11 + FLDA OBJ + FMUL #LIT+154 + FADD TABLET + FSTA OBJ +/ IF(HERE(MESSAG))OBJ=OBJ*100+MESSAG + FLDA MESSAGE + JSA HERE + JEQ .+11 + FLDA OBJ + FMUL #LIT+154 + FADD MESSAG + FSTA OBJ +/ IF(CLOSED.AND.TOTING(OYSTER))OBJ=OYSTER + FLDA OYSTER + JSA TOTING + FMUL CLOSED + JEQ .+6 + FLDA OYSTER + FSTA OBJ +/ IF(OBJ.GT.100.OR.OBJ.EQ.0.OR.DARK(0))GOTO 8000 + FLDA OBJ + FSUB #LIT+154 + JGT #8000 + FLDA OBJ + JEQ #8000 + JSA DARK + JNE #8000 + +/C +/9270 IF(DARK(0))GOTO 5190 +#9270, JSA DARK + JNE #5190 +/ IF(OBJ.EQ.MAGZIN)SPK=190 + FLDA OBJ + FSUB MAGZIN + JNE .+6 + DECIMAL + LDX 190,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.TABLET)SPK=196 + FLDA OBJ + FSUB TABLET + JNE .+6 + DECIMAL + LDX 196,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.MESSAG)SPK=191 + FLDA OBJ + FSUB MESSAG + JNE .+6 + DECIMAL + LDX 191,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.OYSTER.AND.HINTED(2).AND.TOTING(OYSTER))SPK=194 + FLDA OBJ + FSUB OYSTER + JNE #M95 + FLDA HINTED+3 / HINTED(2) + JEQ #M95 + FLDA OYSTER + JSA TOTING + JEQ .+6 + DECIMAL + LDX 194,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.NE.OYSTER.OR.HINTED(2).OR..NOT.TOTING(OYSTER) +/ 1 .OR..NOT.CLOSED)GOTO 2011 +#M95, FLDA OBJ + FSUB OYSTER + JNE #2011 + FLDA HINTED+3 + JNE #2011 + FLDA OYSTER + JSA TOTING + JEQ #2011 + FLDA CLOSED + JEQ #2011 +/ HINTED(2)=YES(192,193,54) + JSR YES + JA #2012 + JA #LIT+267 + JA #LIT+272 + JA #LIT+113 + FSTA HINTED+3 /HINTED(2) +/ GOTO 2012 +/ JA #2012 + +/C +/C BREAK. ONLY WORKS FOR MIRROR IN REPOSITORY AND, OF COURSE, THE VASE. +/C +/9280 IF(OBJ.EQ.MIRROR)SPK=148 +#9280, FLDA OBJ + FSUB MIRROR + JNE .+6 + DECIMAL + LDX 148,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(OBJ.EQ.VASE.AND.PROP(VASE).EQ.0)GOTO 9282 + FLDA OBJ + FSUB VASE + JNE #M96 + FLDA VASE + JSA RDPROP + JEQ #9282 +/ IF(OBJ.NE.MIRROR.OR..NOT.CLOSED)GOTO 2011 +#M96, FLDA OBJ + FSUB MIRROR + JNE #2011 + FLDA CLOSED + JEQ #2011 +/ CALL RSPEAK(197) + JSR RSPEAK +/ GOTO 19000 + JA #19000 + JA #LIT+275 + +/C +/9282 SPK=198 +#9282, DECIMAL + LDX 198,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(TOTING(VASE))CALL DROP(VASE,LOC) + FLDA VASE + JSA TOTING + JEQ .+12 + JSR DROP + JA .+6 + JA VASE + JA LOC +/ PROP(VASE)=2 + FLDA TWO + FSTA PROP-3,3 +/ FIXED(VASE)=-1 + FLDA MINUS1 + FSTA FIXED-3,3 +/ GOTO 2011 + JA #2011 + +/C +/C WAKE. ONLY USE IS TO DISTURB THE DWARVES. +/C +/9290 IF(OBJ.NE.DWARF.OR..NOT.CLOSED)GOTO 2011 +#9290, FLDA OBJ + FSUB DWARF + JNE #2011 + FLDA CLOSED + JEQ #2011 +/ CALL RSPEAK(199) + JSR RSPEAK +/ GOTO 19000 + JA #19000 + JA #LIT+300 + +/C +/C SUSPEND. SAVE THE WORLD. +/C +/8300 CALL SAVEGM(.TRUE.,I) +/ GOTO 2012 +#8300, JSR SAVEGM + JA #2012 + JA ONE + JA I + +/C +/C HOURS. JUST A JOKE. +/C +/8310 CALL RSPEAK(201) +#8310, JSR RSPEAK +/ GOTO 2012 + JA #2012 + JA #LIT+303 + +/C +/C RESUME. RESTORE THE WORLD. +/C +/8320 CALL RSTRGM(.TRUE.,I) +/ GO TO 2012 + +#8320, JSR RSTRGM + JA #2012 + JA ONE + JA I + + +/C HINTS +/C +/C COME HERE IF HE'S BEEN LONG ENOUGH AT REQUIRED LOC(S) FOR SOME UNUSED HINT. +/C HINT NUMBER IS IN VARIABLE "HINT". BRANCH TO QUICK TEST FOR ADDITIONAL +/C CONDITIONS, THEN COME BACK TO DO NEAT STUFF. GOTO 40010 IF CONDITIONS ARE +/C MET AND WE WANT TO OFFER THE HINT. GOTO 40020 TO CLEAR HINTLC BACK TO ZERO, +/C 40030 TO TAKE NO ACTION YET. +/C +/40000 GOTO (40400,40500,40600,40700,40800,40900)(HINT-3) +/C CAVE BIRD SNAKE MAZE DARK WITT +#40000, FLDA HINT + FSUB THREE + ATX 1 + STARTD + FLDA .+2,1 + STARTF + JAC + JA #40400 + JA #40500 + JA #40600 + JA #40700 + JA #40800 + JA #40010 +/ CALL BUG(27) + JSR BUG + JA .+4 + JA #LIT+60 +/C +/40010 HINTLC(HINT)=0 +#40010, FLDA HINT + ATX 7 + FCLA + FSTA HINTLC-3,7 +/ IF(.NOT.YES(HINTS(HINT,3),0,54))GOTO 2602 + FLDA #LIT+330 / 60 (index 3) + FADD HINT / hint,3 + ATX 7 + FLDA HINTS-77,7 + FSTA #TMP + JSR YES + JA .+10 + JA #TMP + JA ZERO + JA #LIT+113 + JEQ #2602 +/ TYPE 40012,HINTS(HINT,2) + JSA SPRINT + JA #40012 + JA TWO + + TRAP3 #WRITO + JA #LIT + JA #4001A + FLDA #LIT+77 / 40 + FADD HINT / HINT, 2 + ATX 7 + FLDA HINTS-77,7 + TRAP3 #RSVO + TRAP3 #RENDO + + JSA SPRINT + JA #4001B + JA ONE +/40012 FORMAT(' I am prepared to give you a hint, but it will cost you', +/ 1 I2,' points.') + +/ HINTED(HINT)=YES(175,HINTS(HINT,4),54) + FLDA HINT + ATX 6 + FADD #LIT+325 / 80: HINT,4 + ATX 7 + FLDA HINTS-77,7 + FSTA #TMP + JSR YES + JA .+10 + JA #LIT+250 + JA #TMP + JA #LIT+113 + FSTA HINTED-3,6 +/ IF(HINTED(HINT).AND.LIMIT.GT.30)LIMIT=LIMIT+30*HINTS(HINT,2) + JEQ #40020 + FLDA LIMIT + FSUB #LIT+63 + JLE #40020 + FLDA #LIT+77 /80 + FADD HINT /HINT,2 + ATX 6 + FLDA #LIT+63 + FMUL HINTS-77,6 + FADD LIMIT + FSTA LIMIT +/40020 HINTLC(HINT)=0 +#40020, FLDA HINT + ATX 7 + FCLA + FSTA HINTLC-3,7 +/40030 GOTO 2602 +#40030, JA #2602 + +/C +/C NOW FOR THE QUICK TESTS. SEE DATABASE DESCRIPTION FOR ONE-LINE NOTES. +/C +/40400 IF(PROP(GRATE).EQ.0.AND..NOT.HERE(KEYS))GOTO 40010 +#40400, FLDA GRATE + JSA RDPROP + JNE #40020 + FLDA KEYS + JSA HERE + JEQ #40010 +/ GOTO 40020 + JA #40020 + +/40500 IF(HERE(BIRD).AND.TOTING(ROD).AND.OBJ.EQ.BIRD)GOTO 40010 +#40500, FLDA BIRD + JSA HERE + JEQ #2602 + FLDA ROD + JSA TOTING + JEQ #2602 + FLDA OBJ + JEQ #40010 + FSUB BIRD + JEQ #40010 +/ GOTO 40030 + JA #2602 + +/C +/40600 IF(HERE(SNAKE).AND..NOT.HERE(BIRD))GOTO 40010 +#40600, FLDA SNAKE + JSA HERE + JEQ #40020 + FLDA BIRD + JSA HERE + JEQ #40010 +/ GOTO 40020 + JA #40020 + +/C +/40700 IF(ATLOC(LOC).EQ.0.AND.ATLOC(OLDLOC).EQ.0 +/ 1 .AND.ATLOC(OLDLC2).EQ.0.AND.HOLDNG.GT.1)GOTO 40010 +#40700, FLDA LOC + ATX 7 + FLDA ATLOC-3,7 + JNE #40020 + FLDA OLDLOC + ATX 6 + FLDA ATLOC-3,6 + JNE #40020 + FLDA OLDLC2 + ATX 5 + FLDA ATLOC-3,5 + JNE #40020 + FLDA HOLDNG + FSUB ONE + JGT #40010 +/ GOTO 40020 + JA #40020 + +/C +/40800 IF(PROP(EMRALD).NE.-1.AND.PROP(PYRAM).EQ.-1)GOTO 40010 +/ GOTO 40020 +#40800, FLDA EMRALD + ATX 7 + FLDA MINUS1 + FSUB PROP-3,7 + JEQ #40020 + FLDA PYRAM + ATX 6 + FLDA MINUS1 + FSUB PROP-3,6 + JEQ #40010 +/ GOTO 40020 + JA #40020 +/C +/40900 JA #40010 +/#40900 JA 40010 + +/C CAVE CLOSING AND SCORING +/C +/C +/C THESE SECTIONS HANDLE THE CLOSING OF THE CAVE. THE CAVE CLOSES "CLOCK1" +/C TURNS AFTER THE LAST TREASURE HAS BEEN LOCATED (INCLUDING THE PIRATE'S +/C CHEST, WHICH MAY OF COURSE NEVER SHOW UP). NOTE THAT THE TREASURES NEED NOT +/C HAVE BEEN TAKEN YET, JUST LOCATED. HENCE CLOCK1 MUST BE LARGE ENOUGH TO GET +/C OUT OF THE CAVE (IT ONLY TICKS WHILE INSIDE THE CAVE). WHEN IT HITS ZERO, +/C WE BRANCH TO 10000 TO START CLOSING THE CAVE, AND THEN SIT BACK AND WAIT FOR +/C HIM TO TRY TO GET OUT. IF HE DOESN'T WITHIN CLOCK2 TURNS, WE CLOSE THE +/C CAVE; IF HE DOES TRY, WE ASSUME HE PANICS, AND GIVE HIM A FEW ADDITIONAL +/C TURNS TO GET FRANTIC BEFORE WE CLOSE. WHEN CLOCK2 HITS ZERO, WE BRANCH TO +/C 11000 TO TRANSPORT HIM INTO THE FINAL PUZZLE. NOTE THAT THE PUZZLE DEPENDS +/C UPON ALL SORTS OF RANDOM THINGS. FOR INSTANCE, THERE MUST BE NO WATER OR +/C OIL, SINCE THERE ARE BEANSTALKS WHICH WE DON'T WANT TO BE ABLE TO WATER, +/C SINCE THE CODE CAN'T HANDLE IT. ALSO, WE CAN HAVE NO KEYS, SINCE THERE IS A +/C GRATE (HAVING MOVED THE FIXED OBJECT!) THERE SEPARATING HIM FROM ALL THE +/C TREASURES. MOST OF THESE PROBLEMS ARISE FROM THE USE OF NEGATIVE PROP +/C NUMBERS TO SUPPRESS THE OBJECT DESCRIPTIONS UNTIL HE'S ACTUALLY MOVED THE +/C OBJECTS. +/C +/C WHEN THE FIRST WARNING COMES, WE LOCK THE GRATE, DESTROY THE BRIDGE, KILL +/C ALL THE DWARVES (AND THE PIRATE), REMOVE THE TROLL AND BEAR (UNLESS DEAD), +/C AND SET "CLOSNG" TO TRUE. LEAVE THE DRAGON; TOO MUCH TROUBLE TO MOVE IT. +/C FROM NOW UNTIL CLOCK2 RUNS OUT, HE CANNOT UNLOCK THE GRATE, MOVE TO ANY +/C LOCATION OUTSIDE THE CAVE (LOC<9), OR CREATE THE BRIDGE. NOR CAN HE BE +/C RESURRECTED IF HE DIES. NOTE THAT THE SNAKE IS ALREADY GONE, SINCE HE GOT +/C TO THE TREASURE ACCESSIBLE ONLY VIA THE HALL OF THE MT. KING. ALSO, HE'S +/C BEEN IN GIANT ROOM (TO GET EGGS), SO WE CAN REFER TO IT. ALSO ALSO, HE'S +/C GOTTEN THE PEARL, SO WE KNOW THE BIVALVE IS AN OYSTER. *AND*, THE DWARVES +/C MUST HAVE BEEN ACTIVATED, SINCE WE'VE FOUND CHEST. +/C +/10000 PROP(GRATE)=0 +#10000, FLDA GRATE + ATX 7 + FCLA + FSTA PROP-3,7 +/ PROP(FISSUR)=0 + FLDA FISSUR + ATX 7 + FCLA + FSTA PROP-3,7 +/ DO 10010 I=1,6 + FLDA ONE + FSTA I + +/ DSEEN(I)=.FALSE. +#H0204, FLDA I + ATX 7 + FCLA + FSTA DSEEN-3,7 +/10010 DLOC(I)=0 +/#10010, FLDA I +/ ATX 7 +/ FCLA + FSTA DLOC-3,7 + FLDA I + FADD ONE + FSTA I + FSUB #LIT+6 + JLE #H0204 +/ CALL MOVE(TROLL,0) + JSR MOVE + JA .+6 + JA TROLL + JA ZERO +/ CALL MOVE(TROLL+100,0) + FLDA TROLL + ATX 7 + FADD #LIT+154 + FSTA #TMP + JSR MOVE + JA .+6 + JA #TMP + JA ZERO +/ CALL MOVE(TROLL2,PLAC(TROLL)) +/ FLDA TROLL +/ ATX 7 + FLDA PLAC-3,7 + FSTA #TMP + JSR MOVE + JA .+6 + JA TROLL2 + JA #TMP +/ CALL MOVE(TROLL2+100,FIXD(TROLL)) + FLDA TROLL2 + FADD #LIT+154 + FSTA #TMP +/ FLDA TROLL +/ ATX 7 + FLDA FIXD-3,7 + FSTA #TMP+3 + JSR MOVE + JA .+6 + JA #TMP + JA #TMP+3 +/ CALL JUGGLE(CHASM) + FLDA CHASM + JSA JUGGLE +/ IF(PROP(BEAR).NE.3)CALL DSTROY(BEAR) + FLDA BEAR + JSA RDPROP + FSUB THREE + JEQ .+6 + FLDA BEAR + JSA DSTROY +/ PROP(CHAIN)=0 + FLDA CHAIN + ATX 7 + FCLA + FSTA PROP-3,7 +/ FIXED(CHAIN)=0 +/ PROP(AXE)=0 + FLDA AXE + ATX 7 + FCLA + FSTA PROP-3,7 +/ FIXED(AXE)=0 + FSTA FIXED-3,7 +/ CALL RSPEAK(129) + JSR RSPEAK + JA .+4 + JA #LIT+204 +/ CLOCK1=-1 + FLDA MINUS1 + FSTA CLOCK1 +/ CLOSNG=.TRUE. + FLDA ONE + FSTA CLOSNG +/ GOTO 19999 + JA #19999 + +/C +/C ONCE HE'S PANICKED, AND CLOCK2 HAS RUN OUT, WE COME HERE TO SET UP THE +/C STORAGE ROOM. THE ROOM HAS TWO LOCS, HARDWIRED AS 115 (NE) AND 116 (SW). +/C AT THE NE END, WE PLACE EMPTY BOTTLES, A NURSERY OF PLANTS, A BED OF +/C OYSTERS, A PILE OF LAMPS, RODS WITH STARS, SLEEPING DWARVES, AND HIM. AND +/C THE SW END WE PLACE GRATE OVER TREASURES, SNAKE PIT, COVEY OF CAGED BIRDS, +/C MORE RODS, AND PILLOWS. A MIRROR STRETCHES ACROSS ONE WALL. MANY OF THE +/C OBJECTS COME FROM KNOWN LOCATIONS AND/OR STATES (E.G. THE SNAKE IS KNOWN TO +/C HAVE BEEN DESTROYED AND NEEDN'T BE CARRIED AWAY FROM ITS OLD "PLACE"), +/C MAKING THE VARIOUS OBJECTS BE HANDLED DIFFERENTLY. WE ALSO DROP ALL OTHER +/C OBJECTS HE MIGHT BE CARRYING (LEST HE HAVE SOME WHICH COULD CAUSE TROUBLE, +/C SUCH AS THE KEYS). WE DESCRIBE THE FLASH OF LIGHT AND TRUNDLE BACK. +/C +/11000 PROP(BOTTLE)=PUT(BOTTLE,115,1) +#11000, FLDA BOTTLE + ATX 7 + JSR PUT + JA .+10 + JA BOTTLE + JA #LIT+165 + JA ONE + FSTA PROP-3,7 +/ PROP(PLANT)=PUT(PLANT,115,0) + FLDA PLANT + ATX 7 + JSR PUT + JA .+10 + JA PLANT + JA #LIT+165 + JA ZERO + FSTA PROP-3,7 +/ PROP(OYSTER)=PUT(OYSTER,115,0) + FLDA OYSTER + ATX 7 + JSR PUT + JA .+10 + JA OYSTER + JA #LIT+165 + JA ZERO + FSTA PROP-3,7 +/ PROP(LAMP)=PUT(LAMP,115,0) + FLDA LAMP + ATX 7 + JSR PUT + JA .+10 + JA LAMP + JA #LIT+165 + JA ZERO + FSTA PROP-3,7 +/ PROP(ROD)=PUT(ROD,115,0) + FLDA ROD + ATX 7 + JSR PUT + JA .+10 + JA ROD + JA #LIT+165 + JA ZERO + FSTA PROP-3,7 +/ PROP(DWARF)=PUT(DWARF,115,0) + FLDA DWARF + ATX 7 + JSR PUT + JA .+10 + JA DWARF + JA #LIT+165 + JA ZERO + FSTA PROP-3,7 +/ LOC=115 +/ OLDLOC=115 +/ NEWLOC=115 + FLDA #LIT+165 + FSTA LOC + FSTA OLDLOC + FSTA NEWLOC +/C +/C LEAVE THE GRATE WITH NORMAL (NON-NEGATIVE PROPERTY). +/C +/ I=PUT(GRATE,116,0) + JSR PUT + JA .+10 + JA GRATE + JA #LIT+170 + JA ZERO + FSTA I +/ PROP(SNAKE)=PUT(SNAKE,116,1) + FLDA SNAKE + ATX 7 + JSR PUT + JA .+10 + JA SNAKE + JA #LIT+170 + JA ONE + FSTA PROP-3,7 +/ PROP(BIRD)=PUT(BIRD,116,1) + FLDA BIRD + ATX 7 + JSR PUT + JA .+10 + JA BIRD + JA #LIT+170 + JA ONE + FSTA PROP-3,7 +/ PROP(CAGE)=PUT(CAGE,116,0) + FLDA CAGE + ATX 7 + JSR PUT + JA .+10 + JA CAGE + JA #LIT+170 + JA ZERO + FSTA PROP-3,7 +/ PROP(ROD2)=PUT(ROD2,116,0) + FLDA ROD2 + ATX 7 + JSR PUT + JA .+10 + JA ROD2 + JA #LIT+170 + JA ZERO + FSTA PROP-3,7 +/ PROP(PILLOW)=PUT(PILLOW,116,0) + FLDA PILLOW + ATX 7 + JSR PUT + JA .+10 + JA PILLOW + JA #LIT+170 + JA ZERO + FSTA PROP-3,7 +/C +/ PROP(MIRROR)=PUT(MIRROR,115,0) + FLDA MIRROR + ATX 7 + JSR PUT + JA .+10 + JA MIRROR + JA #LIT+165 + JA ZERO + FSTA PROP-3,7 +/ FIXED(MIRROR)=116 + FLDA #LIT+170 + FSTA FIXED-3,7 +/C +/ DO 11010 I=1,100 + FLDA ONE + FSTA I + +/11010 IF(TOTING(I))CALL DSTROY(I) +#11010, FLDA I + JSA TOTING + JEQ .+6 + FLDA I + JSA DSTROY + FLDA I + FADD ONE + FSTA I + FSUB #LIT+154 + JLE #11010 +/C +/ CALL RSPEAK(132) + JSR RSPEAK + JA .+4 + JA #LIT+215 +/ CLOSED=.TRUE. + FLDA ONE + FSTA CLOSED +/ GOTO 2 + JA #2 + +/C +/C ANOTHER WAY WE CAN FORCE AN END TO THINGS IS BY HAVING THE LAMP GIVE OUT. +/C WHEN IT GETS CLOSE, WE COME HERE TO WARN HIM. WE GO TO 12000 IF THE LAMP +/C AND FRESH BATTERIES ARE HERE, IN WHICH CASE WE REPLACE THE BATTERIES AND +/C CONTINUE. 12200 IS FOR OTHER CASES OF LAMP DYING.12400 IS WHEN IT GOES +/C OUT, AND 12600 IS IF HE'S WANDERED OUTSIDE AND THE LAMP IS USED UP, IN WHICH +/C CASE WE FORCE HIM TO GIVE UP. +/C +/12000 CALL RSPEAK(188) +#12000, JSR RSPEAK + JA .+4 + JA #LIT+264 +/ PROP(BATTER)=1 + FLDA BATTER + ATX 7 + FLDA ONE + FSTA PROP-3,7 +/ IF(TOTING(BATTER))CALL DROP(BATTER,LOC) + FLDA BATTER + JSA TOTING + JEQ .+12 + JSR DROP + JA .+6 + JA BATTER + JA LOC +/ LIMIT=LIMIT+2500 + FLDA #LIT+317 + FADDM LIMIT +/ LMWARN=.FALSE. + FCLA + FSTA LMWARN +/ GOTO 19999 + JA #19999 + +/C +/12200 IF(LMWARN.OR..NOT.HERE(LAMP))GOTO 19999 +#12200, FLDA LAMP + JSA HERE + JEQ #19999 + FLDA LMWARN + JNE #19999 +/ LMWARN=.TRUE. + FLDA ONE + FSTA LMWARN +/ SPK=187 + DECIMAL + LDX 187,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(PLACE(BATTER).EQ.0)SPK=183 + FLDA BATTER + ATX 7 + FLDA PLACE-3,7 + JNE .+6 + DECIMAL + LDX 183,0 + OCTAL + XTA 0 + FSTA SPK +/ IF(PROP(BATTER).EQ.1)SPK=189 + FLDA PROP-3,7 + FSUB ONE + JNE .+6 + DECIMAL + LDX 189,0 + OCTAL + XTA 0 + FSTA SPK +/ CALL RSPEAK(SPK) +#H0214, JSR RSPEAK + JA #19999 + JA SPK +/ GOTO 19999 + +/C +/12400 LIMIT=-1 +#12400, FLDA MINUS1 + FSTA LIMIT +/ PROP(LAMP)=0 + FLDA LAMP + ATX 7 + FCLA + FSTA PROP-3,7 +/ IF(HERE(LAMP))CALL RSPEAK(184) + FLDA LAMP + JSA HERE +/ GOTO 19999 + JEQ #19999 + JSR RSPEAK + JA #19999 + JA #LIT+253 + +/C +/12600 CALL RSPEAK(185) +#12600, JSR RSPEAK + JA .+4 + JA #LIT+256 +/ GAVEUP=.TRUE. + FLDA ONE + FSTA GAVEUP +/ GOTO 20000 + JA #20000 + +/C +/C +/C OH DEAR, HE'S DISTURBED THE DWARVES. +/C +/19000 CALL RSPEAK(136) +#19000, JSR RSPEAK + JA .+4 + JA #LIT+220 + +/C +/C EXIT CODE. WILL EVENTUALLY INCLUDE SCORING. FOR NOW, HOWEVER, ... +/C +/C THE PRESENT SCORING ALGORITHM IS AS FOLLOWS: +/C OBJECTIVE: POINTS: PRESENT TOTAL POSSIBLE: +/C GETTING WELL INTO CAVE 25 25 +/C EACH TREASURE < CHEST 12 60 +/C TREASURE CHEST ITSELF 14 14 +/C EACH TREASURE > CHEST 16 144 +/C SURVIVING (MAX-NUM)*10 30 +/C NOT QUITTING 4 4 +/C REACHING "CLOSNG" 25 25 +/C "CLOSED": QUIT/KILLED 10 +/C KLUTZED 25 +/C WRONG WAY 30 +/C SUCCESS 45 45 +/C CAME TO WITT'S END 1 1 +/C ROUND OUT THE TOTAL 2 2 +/C TOTAL: 350 +/20000 SCORE=0 +#20000, FCLA + FSTA SCORE +/ MXSCOR=0 + FSTA MXSCOR +/C +/C FIRST TALLY UP THE TREASURES. MUST BE IN BUILDING AND NOT BROKEN. +/C GIVE THE POOR GUY 2 POINTS JUST FOR FINDING EACH TREASURE. +/C +/ DO 20010 I=50,MAXTRS + FLDA #LIT+110 + FSTA I + +/ IF(PTEXT(I).EQ.0)GOTO 20010 +#H0216, FLDA I + ATX 7 + FLDA PTEXT-3,7 + JEQ #20010 +/ K=12 + FLDA #LIT+22 + FSTA K +/ IF(I.EQ.CHEST)K=14 + FLDA I + FSUB CHEST + JNE .+7 + DECIMAL + LDX 14,0 + OCTAL + XTA 0 + FSTA K +/ IF(I.GT.CHEST)K=16 + FLDA I + FSUB CHEST + JLE .+5 + FLDA #LIT+30 + FSTA K +/ IF(PROP(I).GE.0)SCORE=SCORE+2 + FLDA PROP-3,7 + JLT .+5 + FLDA TWO + FADDM SCORE +/ IF(PLACE(I).EQ.3.AND.PROP(I).EQ.0)SCORE=SCORE+K-2 + FLDA PLACE-3,7 + FSUB THREE + JNE #M100 + FLDA PROP-3,7 + JNE #M100 + FLDA SCORE + FADD K + FSUB TWO + FSTA SCORE +/ MXSCOR=MXSCOR+K +#M100, FLDA K + FADDM MXSCOR + +/20010 CONTINUE +#20010, FLDA I + FADD ONE + FSTA I + FSUB MAXTRS + JLE #H0216 +/C +/C NOW LOOK AT HOW HE FINISHED AND HOW FAR HE GOT. MAXDIE AND NUMDIE TELL US +/C HOW WELL HE SURVIVED. GAVEUP SAYS WHETHER HE EXITED VIA QUIT. DFLAG WILL +/C TELL US IF HE EVER GOT SUITABLY DEEP INTO THE CAVE. CLOSNG STILL INDICATES +/C WHETHER HE REACHED THE ENDGAME. AND IF HE GOT AS FAR AS "CAVE CLOSED" +/C (INDICATED BY "CLOSED"), THEN BONUS IS ZERO FOR MUNDANE EXITS OR 133, 134, +/C 135 IF HE BLEW IT (SO TO SPEAK). +/C +/ SCORE=SCORE+(MAXDIE-NUMDIE)*10 + FLDA MAXDIE + FSUB NUMDIE + FMUL #LIT+17 + FADDM SCORE +/ MXSCOR=MXSCOR+MAXDIE*10 + FLDA MAXDIE + FMUL #LIT+17 + FADDM MXSCOR +/ IF(.NOT.(SCORNG.OR.GAVEUP))SCORE=SCORE+4 + FLDA SCORNG + FADD GAVEUP + JNE .+5 + FLDA #LIT + FADDM SCORE +/ MXSCOR=MXSCOR+4 + FLDA #LIT + FADDM MXSCOR + +/ IF(DFLAG.NE.0)SCORE=SCORE+25 + FLDA DFLAG + JEQ .+5 + FLDA #LIT+52 + FADDM SCORE +/ MXSCOR=MXSCOR+25 + FLDA #LIT+52 + FADDM MXSCOR +/ IF(CLOSNG)SCORE=SCORE+25 + FLDA CLOSNG + JEQ .+5 + FLDA #LIT+52 + FADDM SCORE +/ MXSCOR=MXSCOR+25 + FLDA #LIT+52 + FADDM MXSCOR +/ IF(.NOT.CLOSED)GOTO 20020 + FLDA CLOSED + JEQ #20020 +/ IF(BONUS.EQ.0)SCORE=SCORE+10 + FLDA BONUS + JNE .+5 + FLDA #LIT+17 + FADDM SCORE +/ IF(BONUS.EQ.135)SCORE=SCORE+25 + DECIMAL + LDX 135,0 + OCTAL + XTA 0 + FSUB BONUS + JNE .+5 + FLDA #LIT+52 + FADDM SCORE +/ IF(BONUS.EQ.134)SCORE=SCORE+30 + DECIMAL + LDX 134,0 + OCTAL + XTA 0 + FSUB BONUS + JNE .+5 + FLDA #LIT+63 + FADDM SCORE +/ IF(BONUS.EQ.133)SCORE=SCORE+45 + DECIMAL + LDX 133,0 + OCTAL + XTA 0 + FSUB BONUS + JNE #20020 + FLDA #LIT+102 + FADDM SCORE +/20020 MXSCOR=MXSCOR+45 +#20020, FLDA #LIT+102 + FADDM MXSCOR +/C +/C DID HE COME TO WITT'S END AS HE SHOULD? +/C +/ IF(PLACE(MAGZIN).EQ.108)SCORE=SCORE+1 + FLDA MAGZIN + ATX 7 + DECIMAL + LDX 108,0 + OCTAL + XTA 0 + FSUB PLACE-3,7 + JNE .+5 + FLDA ONE + FADDM SCORE +/ MXSCOR=MXSCOR+1 + FLDA ONE + FADDM MXSCOR +/C +/C ROUND IT OFF. +/C +/ SCORE=SCORE+2 + FLDA TWO + FADDM SCORE +/ MXSCOR=MXSCOR+2 + FADDM MXSCOR +/C +/C DEDUCT POINTS FOR HINTS. HINTS < 4 ARE SPECIAL; SEE DATABASE DESCRIPTION. +/C +/ DO 20030 I=1,HNTMAX + FLDA ONE + FSTA I + +/20030 IF(HINTED(I))SCORE=SCORE-HINTS(I,2) +#20030, FLDA I + ATX 7 + FLDA HINTED-3,7 + JEQ .+14 + FLDA #LIT+77 /20 + FADD I /I, 2 + ATX 6 + FLDA SCORE + FSUB HINTS-77,6 + FSTA SCORE + + FLDA I + FADD ONE + FSTA I + FSUB HNTMAX + JLE #20030 +/C +/C RETURN TO SCORE COMMAND IF THAT'S WHERE WE CAME FROM. +/C +/ IF(SCORNG)GOTO 8241 + FLDA SCORNG + JNE #8241 +/C +/C THAT SHOULD BE GOOD ENOUGH. LET'S TELL HIM ALL ABOUT IT. +/C +/ TYPE 20100,SCORE,MXSCOR,TURNS + JSA SPRINT + JA #20100 + JA TWO + + TRAP3 #WRITO + JA #LIT + JA #2010A + FLDA SCORE + TRAP3 #RSVO + TRAP3 #RENDO + + JSA SPRINT + JA #2010B + JA THREE + + TRAP3 #WRITO + JA #LIT + JA #2010A + FLDA MXSCOR + TRAP3 #RSVO + TRAP3 #RENDO + + JSA SPRINT + JA #2010C + JA THREE + + TRAP3 #WRITO + JA #LIT + JA #2010D + + FLDA TURNS + TRAP3 #RSVO + TRAP3 #RENDO + + JSA SPRINT + JA #2010E + JA ONE + +/20100 FORMAT(/' You scored',I4,' out of a possible',I4, +/ 1 ', using',I5,' turns.') +/C +/ DO 20200 I=1,CLSSES + FLDA ONE + FSTA I + +/ IF(CVAL(I).GE.SCORE)GOTO 20210 +#I0064, FLDA I + ATX 7 + FLDA CVAL-3,7 + FSUB SCORE + JGE #20210 + +/20200 CONTINUE +#20200, FLDA I + FADD ONE + FSTA I + FSUB CLSSES + JLE #I0064 +/ TYPE 20202 + JSA SPRINT + JA #20202 + JA ZERO + +/20202 FORMAT(' You just went off my scale!!'/) +/ GOTO 25000 + JA #25000 + +/C +/20210 CALL SPEAK(CTEXT(I)) +#20210, FLDA I + ATX 7 + FLDA CTEXT-3,7 /GET CLASS MESSAGE + FSTA #TMP+3 + JSR SPEAK + JA .+4 + JA #TMP+3 +/ IF(I.EQ.CLSSES-1)GOTO 20220 + FLDA CLSSES + FSUB ONE + FSUB I + JEQ #20220 +/ K=CVAL(I)+1-SCORE + FLDA I + ATX 7 + FLDA CVAL-3,7 + FADD ONE + FSUB SCORE + FSTA K +/ TYPE 20212,K + JSA SPRINT + JA #20212 + JA TWO + + JSA SPRINT + JA #2021A + JA THREE + + TRAP3 #WRITO + JA #LIT + JA #2021B + FLDA K + TRAP3 #RSVO + TRAP3 #RENDO + + JSA SPRINT + JA #2021C + JA THREE + +/20212 FORMAT(' To achieve the next higher rating, you need',I3, +/ 1 ' more point',$) +/ IF(K.EQ.1) TYPE 20213 + FLDA K + FSUB ONE + JNE .+12 + JSA SPRINT + JA #20213 + JA ONE + JA #25000 + +/ IF(K.NE.1) TYPE 20214 + JSA SPRINT + JA #20214 + JA ONE +/20213 FORMAT('+.'/) + +/20214 FORMAT('+s.'/) +/ GOTO 25000 + JA #25000 +/C +/20220 TYPE 20222 +#20220, JSA SPRINT + JA #20212 + JA TWO + + JSA SPRINT + JA #20222 + JA ONE + + JSA SPRINT + JA #20223 + JA ZERO +/20222 FORMAT(' To achieve the next higher rating ', +/ 1 'would be a neat trick!'/' Congratulations!!'/) +/ RETURN + JA #GOBAK +/ END +/ +/ Fortran Formats: +/ +#67A, TEXT %T]HERE ARE @% +#67, TEXT %('+',I1,$)% +#67B, TEXT % T]HREATENING LITTLE DWARVES IN THE ROOM WITH YOU.@% +#68, +#78, TEXT %(1X,I1,$)% +#78B, TEXT % ]OF THEM THROW KNIVES AT YOU!@% +#68B, TEXT % ]OF THEM GET YOU!@% +#5015, TEXT %W]HAT DO YOU WANT TO DO WITH THE @% +#5199, TEXT %I] DON'T SEE ANY "@% +#8002, TEXT %I ]DON'T UNDERSTAND "@% +#9032, TEXT %O]KAY, "@% +#8243, TEXT %I]F YOU WERE TO QUIT NOW, YOU WOULD SCORE @% +#2010A, +#2021B, +#8243A, TEXT %('+',I3,$)% +#2010B, +#8243B, TEXT % ]OUT OF A POSSIBLE @% +#20213, +#8243C, TEXT %.@% +#40012, TEXT %I] AM PREPARED TO GIVE YOU A HINT, BUT IT WILL COST YOU @% +#4001A, TEXT %('+',I2,$)% +#4001B, TEXT % ]POINTS.@% +#20100, TEXT %Y]OU SCORED @% +#2010C, TEXT % ]USING @% +#2010D, TEXT %('+',I5,$)% +#2010E, TEXT % ]TURNS.@% +#20202, TEXT %Y]OU JUST WENT OFF MY SCALE!!@% +#20212, TEXT %T]O ACHIEVE THE NEXT HIGHER RATING@% +#2021A, TEXT %, ]YOU NEED @% +#2021C, TEXT % ]MORE POINT@% +#20214, TEXT %]S.@% +#20222, TEXT %] WOULD BE A NEAT TRICK!@% +#20223, TEXT %C]ONGRATULATIONS!!@% + END diff --git a/sw/adventure/BITSET.RA b/sw/adventure/BITSET.RA new file mode 100644 index 0000000..ee1ee8a --- /dev/null +++ b/sw/adventure/BITSET.RA @@ -0,0 +1,218 @@ + SECT BTSET + ENTRY ISHFT + ENTRY BITSET + ENTRY #ANDER + EXTERN #RETRN + EXTERN #FIX + SECT8 BITTER + +#ANDER, TAD #XR /Simple masking + AND #XR+1 + DCA #XR + CIF CDF + JMP% #XR+2 / Return + +/FPP code here; using the rest of the SECT8 page. + +SECNAM, TEXT +BITSET+ /For traceback +#RET, SETX #XR /Return addr + SETB #BASE + JA .+3 +#BASE, ORG .+3 /Base 0 +N, ORG .+3 /Base 1 - value +L, ORG .+3 +#BSET, TEXT +BITSET+ /Base 2 - section name +#ISH, TEXT +ISHFT + /Base 3 + +/ Now at address 23, past autoindex registers. +#XR, FNOP /XR 0 + ADDR #RETRN /XR 1; XR2 return to FRTS address. + ORG #XR+10 / Space for our index regs + + ORG #BASE+30 + FNOP + JA #RET + FNOP +#GOBAK, 0;0 + #LBL=. + COMMON MISCOM +LINUSE, ORG .+0003 +TRVS, ORG .+0003 +CLSSES, ORG .+0003 +OLDLOC, ORG .+0003 +LOC, ORG .+0003 +CVAL, ORG .+0044 +TK, ORG .+0074 +NEWLOC, ORG .+0003 +KEY, ORG .+0702 +PLAC, ORG .+0454 +FIXD, ORG .+0454 +ACTSPK, ORG .+0151 +COND, ORG .+0702 +HINTS, ORG .+0360 +HNTMAX, ORG .+0003 +PROP, ORG .+0454 +TALLY, ORG .+0003 +TALLY2, ORG .+0003 +HINTLC, ORG .+0074 +CHLOC, ORG .+0003 +CHLOC2, ORG .+0003 +DSEEN, ORG .+0022 +DFLAG, ORG .+0003 +DLOC, ORG .+0022 +DALTLC, ORG .+0003 +KEYS, ORG .+0003 +LAMP, ORG .+0003 +GRATE, ORG .+0003 +CAGE, ORG .+0003 +ROD, ORG .+0003 +ROD2, ORG .+0003 +STEPS, ORG .+0003 +BIRD, ORG .+0003 +DOOR, ORG .+0003 +PILLOW, ORG .+0003 +SNAKE, ORG .+0003 +FISSUR, ORG .+0003 +TABLET, ORG .+0003 +CLAM, ORG .+0003 +OYSTER, ORG .+0003 +MAGZIN, ORG .+0003 +DWARF, ORG .+0003 +KNIFE, ORG .+0003 +FOOD, ORG .+0003 +BOTTLE, ORG .+0003 +WATER, ORG .+0003 +OIL, ORG .+0003 +PLANT, ORG .+0003 +PLANT2, ORG .+0003 +AXE, ORG .+0003 +MIRROR, ORG .+0003 +DRAGON, ORG .+0003 +CHASM, ORG .+0003 +TROLL, ORG .+0003 +TROLL2, ORG .+0003 +BEAR, ORG .+0003 +MESSAG, ORG .+0003 +VEND, ORG .+0003 +BATTER, ORG .+0003 +NUGGET, ORG .+0003 +COINS, ORG .+0003 +CHEST, ORG .+0003 +EGGS, ORG .+0003 +TRIDNT, ORG .+0003 +VASE, ORG .+0003 +EMRALD, ORG .+0003 +PYRAM, ORG .+0003 +PEARL, ORG .+0003 +RUG, ORG .+0003 +CHAIN, ORG .+0003 +BACK, ORG .+0003 +LOOK, ORG .+0003 +CAVE, ORG .+0003 +NULL, ORG .+0003 +ENTRNC, ORG .+0003 +DPRSSN, ORG .+0003 +SAY, ORG .+0003 +LOCK, ORG .+0003 +THROW, ORG .+0003 +FIND, ORG .+0003 +INVENT, ORG .+0003 +TURNS, ORG .+0003 +LMWARN, ORG .+0003 +KNFLOC, ORG .+0003 +DETAIL, ORG .+0003 +ABBNUM, ORG .+0003 +NUMDIE, ORG .+0003 +MAXDIE, ORG .+0003 +DKILL, ORG .+0003 +FOOBAR, ORG .+0003 +BONUS, ORG .+0003 +CLOCK1, ORG .+0003 +CLOCK2, ORG .+0003 +CLOSNG, ORG .+0003 +PANIC, ORG .+0003 +CLOSED, ORG .+0003 +GAVEUP, ORG .+0003 +SCORNG, ORG .+0003 +ODLOC, ORG .+0022 +STREAM, ORG .+0003 +SPICES, ORG .+0003 + ORG #LBL + +COUNT, ORG .+3 +ONE, F 1.0 + + +/BITSET(L,N) = (COND(L).AND.ISHFT(1,N)) .NE.0 + +BITSET, FLDA #BSET /Section name + JSA GETARG /Common setup + BASE #BASE + + FLDA% L /Get array index + ATX 1 + FLDA COND-0003,1 /COND(L) + FSTA ITEST / COND(L) + LDX 1,0 /Put 1 into shift value + FLDA% N /Get N value + JEQ #1 /No shift if zero + FNEG /Negate + ATX 1 /Into register + XTA 0 /Get the "1" back + ALN 0 + STARTD + ALN 1 /Do the shift + STARTF + ATX 0 /Put result in place +#1, XTA 0 /Get result + JSA #FIX + ATX 0 /One mask value + FLDA ITEST + JSA #FIX + ATX 1 /The other + TRAP3 #ANDER /AND it + XTA 0 /Restore value + JEQ #GOBAK /Return if zero + FLDA ONE /Else one + JA #GOBAK /Done. +ITEST, ORG .+3 /Test value + +/ +/ ISHFT entry point +/ + BASE 0 +ISHFT, FLDA #ISH /Section name + JSA GETARG /Common setup + + BASE #BASE + FLDA% N /Get shift count + JEQ #SKIP /No need to shift + FNEG /Negative shift count goes left + ATX 1 /Into XR 1 + FLDA% L /Get value to shift + ALN 0 /Align to right + STARTD + ALN 1 /Shift + STARTF /Done + JSA #FIX + JA #GOBAK /Done +#SKIP, FLDA% L /Get value back + JA #GOBAK /Done + +GETARG, 0;0 /Common setup routine + FSTA SECNAM /AC has section name + STARTD + 0210 /Get caller's return + FSTA #GOBAK,0 + 0200 /Get arg list + SETX #XR /Set up index registers + SETB #BASE /Set up base page + FSTA #BASE /Set up arg list + LDX 0,1 /Zero to XR #1 + FLDA% #BASE,1+ /Get first arg + FSTA L + FLDA% #BASE,1+ /Second arg + FSTA N + STARTF + JA GETARG /Return + END diff --git a/sw/adventure/BUG.FT b/sw/adventure/BUG.FT new file mode 100644 index 0000000..0749280 --- /dev/null +++ b/sw/adventure/BUG.FT @@ -0,0 +1,28 @@ + SUBROUTINE BUG(NUM) +C +C THE FOLLOWING CONDITIONS ARE CURRENTLY CONSIDERED FATAL BUGS. NUMBERS < 20 +C ARE DETECTED WHILE READING THE DATABASE; THE OTHERS OCCUR AT "RUN TIME". +C 0 MESSAGE LINE > 70 CHARACTERS +C 1 NULL LINE IN MESSAGE +C 2 TOO MANY WORDS OF MESSAGES +C 3 TOO MANY TRAVEL OPTIONS +C 4 TOO MANY VOCABULARY WORDS +C 5 REQUIRED VOCABULARY WORD NOT FOUND +C 6 TOO MANY RTEXT OR MTEXT MESSAGES +C 7 TOO MANY HINTS +C 8 LOCATION HAS COND BIT BEING SET TWICE +C 9 INVALID SECTION NUMBER IN DATABASE +C 20 SPECIAL TRAVEL (500>L>300) EXCEEDS GOTO LIST +C 21 RAN OFF END OF VOCABULARY TABLE +C 22 VOCABULARY TYPE (N/1000) NOT BETWEEN 0 AND 3 +C 23 INTRANSITIVE ACTION VERB EXCEEDS GOTO LIST +C 24 TRANSITIVE ACTION VERB EXCEEDS GOTO LIST +C 25 CONDITIONAL TRAVEL ENTRY WITH NO ALTERNATIVE +C 26 LOCATION HAS NO TRAVEL ENTRIES +C 27 HINT NUMBER EXCEEDS GOTO LIST +C 28 INVALID MONTH RETURNED BY DATE FUNCTION +C + WRITE(4,1)NUM +1 FORMAT (' FATAL ERROR ',I3,', CONSULT YOUR LOCAL WIZARD.'/) + STOP + END diff --git a/sw/adventure/CARRY.RA b/sw/adventure/CARRY.RA new file mode 100644 index 0000000..94f941d --- /dev/null +++ b/sw/adventure/CARRY.RA @@ -0,0 +1,99 @@ + SECT CARRY +/ SUBROUTINE CARRY(OBJECT,WHERE) +/ C +/ C START TOTING AN OBJECT, REMOVING IT FROM THE LIST OF THINGS AT ITS FORMER +/ C LOCATION. INCR HOLDNG UNLESS IT WAS ALREADY BEING TOTED. IF OBJECT>100 +/ C (MOVING "FIXED" SECOND LOC), DON'T CHANGE PLACE OR HOLDNG. +/ C +/ IMPLICIT INTEGER (A-Z) +/ COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG +/ DIMENSION ATLOC(150),LINK(200),PLACE(100),FIXED(100) +/ C + + JA #ST +#XR, ORG .+10 + TEXT +CARRY+ +#RET, SETX #XR + SETB #BASE + JA .+3 +#BASE, ORG .+6 +OBJECT, ORG .+3 +WHERE, ORG .+3 +HUND, F 100.0 +ONE, F 1.0 +M1, F -1.0 + ORG #BASE+30 + FNOP + JA #RET + FNOP +#GOBAK, 0;0 + #LBL=. + COMMON PLACOM +ATLOC, ORG .+0702 +LINK, ORG .+1130 +PLACE, ORG .+0454 +FIXED, ORG .+0454 +HOLDNG, ORG .+3 + ORG #LBL +#RTN, BASE #BASE + JA #GOBAK +#ST, STARTD + 0210 + FSTA #GOBAK,0 + 0200 + SETX #XR + SETB #BASE + LDX 0,1 + FSTA #BASE + FLDA% #BASE,1+ + FSTA OBJECT + FLDA% #BASE,1+ + FSTA WHERE + STARTF + FLDA% WHERE /Pre-load indexes + ATX 6 + FLDA% OBJECT + ATX 7 /Fall thru with OBJECT in AC +/ IF(OBJECT.GT.100)GOTO 5 + FSUB HUND + JGT #5 +/ IF(PLACE(OBJECT).EQ.-1)RETURN + FLDA ONE + FADD PLACE-3,7 + JEQ #RTN +/ PLACE(OBJECT)=-1 + FLDA M1 + FSTA PLACE-3,7 +/ HOLDNG=HOLDNG+1 + FLDA ONE + FADDM HOLDNG + +/ 5 IF(ATLOC(WHERE).NE.OBJECT)GOTO 6 +#5, FLDA ATLOC-3,6 + FSUB% OBJECT + JNE #6 +/ ATLOC(WHERE)=LINK(OBJECT) + FLDA LINK-3,7 + FSTA ATLOC-3,6 +/ RETURN + JA #RTN + +/ 6 TEMP=ATLOC(WHERE) +#6, FLDA ATLOC-3,6 +/ 7 IF(LINK(TEMP).EQ.OBJECT)GOTO 8 +#7, ATX 5 + FLDA LINK-3,5 + FSUB% OBJECT + JEQ #8 +/ TEMP=LINK(TEMP) + FLDA LINK-3,5 +/ GOTO 7 + JA #7 + +/ 8 LINK(TEMP)=LINK(OBJECT) +#8, FLDA LINK-3,7 + FSTA LINK-3,5 +/ RETURN +/ END + JA #RTN + END diff --git a/sw/adventure/COMPIL.BI b/sw/adventure/COMPIL.BI new file mode 100644 index 0000000..6ee8d57 --- /dev/null +++ b/sw/adventure/COMPIL.BI @@ -0,0 +1,28 @@ +$JOB COMPILE ADVENT STUFF +.COMPILE ADVENT/N/Q +.COMPILE A5TOA1.RA +.COMPILE AMAIN.RA +.COMPILE BITSET.RA +.COMPILE BUG/N/Q +.COMPILE CARRY.RA +.COMPILE DROP.RA +.COMPILE DSTROY.RA +.COMPILE GETIN/N/Q +.COMPILE GETWRD.RA +.COMPILE INITAD/N/Q +.COMPILE IO/N/Q +.COMPILE JUGGLE.RA +.COMPILE MOVE.RA +.COMPILE PCT.RA +.COMPILE PSPEAK.RA +.COMPILE PUT.RA +.COMPILE RND/N/Q +.COMPILE RSPEAK.RA +.COMPILE RSTRGM/N/Q +.COMPILE SAVEGM/N/Q +.COMPILE SEED.RA +.COMPILE SPEAK.RA +.COMPILE VOCAB.RA +.COMPILE USR.RA +.COMPILE YES/N/Q +$END diff --git a/sw/adventure/DROP.RA b/sw/adventure/DROP.RA new file mode 100644 index 0000000..5600d4d --- /dev/null +++ b/sw/adventure/DROP.RA @@ -0,0 +1,89 @@ + SECT DROP +/ SUBROUTINE DROP(OBJECT,WHERE) +/ C +/ C PLACE AN OBJECT AT A GIVEN LOC, PREFIXING IT ONTO THE ATLOC LIST. +/ C DECR HOLDNG IF THE OBJECT WAS BEING TOTED. +/ C +/ IMPLICIT INTEGER (A-Z) +/ COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG +/ DIMENSION ATLOC(150) +/ DIMENSION LINK(200) +/ DIMENSION PLACE(100) +/ DIMENSION FIXED(100) + + JA #ST +#XR, ORG .+10 + TEXT +DROP + +#RET, SETX #XR + SETB #BASE + JA .+3 +#BASE, ORG .+6 +OBJECT, ORG .+3 +WHERE, ORG .+3 +ONE, F 1.0 +HUND, F 100.0 +M1, F -1.0 + ORG #BASE+30 + FNOP + JA #RET + FNOP +#GOBAK, 0;0 + #LBL=. + COMMON PLACOM +ATLOC, ORG .+702 +LINK, ORG .+1130 +PLACE, ORG .+454 +FIXED, ORG .+454 +HOLDNG, ORG .+3 + ORG #LBL +#RTN, BASE #BASE + JA #GOBAK +#ST, STARTD + 0210 + FSTA #GOBAK,0 + 0200 + SETX #XR + SETB #BASE + LDX 0,1 + FSTA #BASE + FLDA% #BASE,1+ + FSTA OBJECT + FLDA% #BASE,1+ + FSTA WHERE + STARTF + FLDA% WHERE /Pre-load index regs + ATX 6 + FLDA% OBJECT + ATX 7 +/ IF(OBJECT.GT.100)GOTO 1 + FSUB HUND + ATX 5 /Save object-100 + JGT #1 +/ IF(PLACE(OBJECT).EQ.-1)HOLDNG=HOLDNG-1 + FLDA ONE + FADD PLACE-3,7 + JNE #G1 + FLDA M1 + FADDM HOLDNG +/ PLACE(OBJECT)=WHERE +#G1, FLDA% WHERE + FSTA PLACE-3,7 +/ GOTO 2 + JA #2 + +/ 1 FIXED(OBJECT-100)=WHERE +#1, FLDA% WHERE + FSTA FIXED-3,5 + +/ 2 IF(WHERE.LE.0)RETURN +#2, JLE #RTN +/ LINK(OBJECT)=ATLOC(WHERE) +#G2, FLDA ATLOC-3,6 + FSTA LINK-3,7 +/ ATLOC(WHERE)=OBJECT + XTA 7 + FSTA ATLOC-3,6 +/ RETURN +/ END + JA #RTN + END diff --git a/sw/adventure/DSTROY.RA b/sw/adventure/DSTROY.RA new file mode 100644 index 0000000..a6ace9d --- /dev/null +++ b/sw/adventure/DSTROY.RA @@ -0,0 +1,22 @@ + SECT DSTROY +/ SUBROUTINE DSTROY(OBJECT) +/ C +/ C PERMANENTLY ELIMINATE "OBJECT" BY MOVING TO A NON-EXISTENT LOCATION. +/ C +/ +/ IMPLICIT INTEGER (A-Z) + EXTERN MOVE + +/DSTROY, + 0;0 / Subroutine entry point + FSTA TEMP +/ CALL MOVE(OBJECT,0) +/ RETURN +/ END + JSR MOVE + JA DSTROY + JA TEMP + JA ZERO +TEMP, ORG .+3 +ZERO, F 0.0 + END diff --git a/sw/adventure/DUMPDB.FT b/sw/adventure/DUMPDB.FT new file mode 100644 index 0000000..d65aaf4 --- /dev/null +++ b/sw/adventure/DUMPDB.FT @@ -0,0 +1,121 @@ +C ADVENTURES + SUBROUTINE DUMPDB +C ADVENTURES +C +C MODIFIED BY KENT BLACKETT +C ENGINEERING SYSTEMS GROUP +C DIGITAL EQUIPMENT CORP. +C 15-JUL-77 +C MODIFIED BY BOB SUPNIK +C DISK ENGINEERING +C 21-OCT-77 +C MODIFIED BY BOB SUPNIK +C DISK ENGINEERING +C 25-AUG-78 +C MODIFIED BY BOB SUPNIK +C SMALL SYSTEMS +C 12-NOV-78 +C ORIGINAL VERSION WAS FOR DECSYSTEM-10 +C NEXT VERSION WAS FOR FORTRAN IV-PLUS UNDER +C THE IAS OPERATING SYSTEM ON THE PDP-11/70 +C THIS VERSION IS FOR FORTRAN IV (V01C OR LATER) +C UNDER RT-11 ON *ANY* PDP-11 +C +C +C CURRENT LIMITS: +C 750 TRAVEL OPTIONS (TRAVEL, TRVSIZ). +C 300 VOCABULARY WORDS (KTAB, ATAB, TABSIZ). +C 150 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ). +C 100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP). +C 35 "ACTION" VERBS (ACTSPK, VRBSIZ). +C 205 RANDOM MESSAGES (RTEXT, RTXSIZ). +C 12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX). +C 20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ). +C THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF +C THE DATABASE. (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE, +C SO THERE CAN'T BE MORE THAN 1000 WORDS.) THESE UPPER LIMITS ARE: +C 1000 NON-SYNONYMOUS VOCABULARY WORDS +C 300 LOCATIONS +C 100 OBJECTS +C +C IMPLICIT INTEGER (A-Z) + LOGICAL LMWARN,CLOSNG,PANIC,HINTED, + 1 CLOSED,GAVEUP,SCORNG,DSEEN,BITSET +C + COMMON /VERSN/ VMAJ, VMIN, VEDIT + COMMON /TXTCOM/ RTEXT,LINES,ASCVAR,TXTLOC,DATA + COMMON /VOCCOM/ KTAB,ATAB,TABSIZ + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + COMMON /PTXCOM/ PTEXT + COMMON /ABBCOM/ ABB + COMMON /MISCOM/ LINUSE,TRVS,CLSSES,OLDLOC,LOC,CVAL,TK,NEWLOC, + 1 KEY,PLAC,FIXD,ACTSPK,COND,HINTS,HNTMAX,PROP,TALLY,TALLY2, + 2 HINTLC,CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC,KEYS,LAMP,GRATE + COMMON /MISCOM/ + 3 CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE,FISSUR,TABLET, + 4 CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE,WATER,OIL,PLANT, + 5 PLANT2,AXE,MIRROR,DRAGON,CHASM,TROLL,TROLL2,BEAR,MESSAG,VEND, + 6 BATTER,NUGGET,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD,PYRAM + COMMON /MISCOM/ + 7 PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY,LOCK, + 8 THROW,FIND,INVENT,TURNS,LMWARN,KNFLOC,DETAIL,ABBNUM, + 9 NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2, + 1 CLOSNG,PANIC,CLOSED,GAVEUP,SCORNG,ODLOC,STREAM,SPICES + COMMON /MISC2/ I,RTXSIZ,CLSMAX,LOCSIZ,CTEXT,STEXT,LTEXT, + 1 SECT,TRAVEL,TRVCON,TRVLOC,TRVSIZ,TABNDX,OBJ,J,K,VERB,HNTSIZ, + 2 MAXTRS,HINTED,HNTLOC,KK +C + INTEGER LINES(12),DATA(52),RECORD +C The TRAVEL, TRVCON, and TRVLOC arrays are +C Packed with words 0,1,2 holding the data. Saves lots +C of wasted space at the expense of some complexity. + INTEGER TRAVEL(250), TRVCON(250), TRVLOC(250), TRVSIZ + INTEGER KTAB(300),ATAB(300),TABSIZ + INTEGER LTEXT(150),STEXT(150),KEY(150),COND(150),ABB(150), + 1 ATLOC(150) + INTEGER PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200), + 1 PTEXT(100),PROP(100),HOLDNG + INTEGER ACTSPK(35) + INTEGER RTEXT(205) + INTEGER CTEXT(12),CVAL(12) + INTEGER HINTLC(20),HINTS(20,4) + DIMENSION HINTED(20) + INTEGER TK(20),DLOC(6),ODLOC(6) + DIMENSION DSEEN(6) + INTEGER ASCVAR, TXTLOC, TRVS, CLSSES, OLDLOC + INTEGER HNTSIZ, HNTMAX, TALLY, TALLY2, CHLOC, CHLOC2, DFLAG + INTEGER DALTLC,GRATE,CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE + INTEGER FISSUR,TABLET,CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE + INTEGER WATER,OIL,PLANT,PLANT2,AXE,MIRROR,DRAGON,CHASM + INTEGER BEAR,MESSAG,VEND,BATTER,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD + INTEGER PYRAM,PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY + INTEGER LOCK,THROW,FIND,INVENT,TURNS,KNFLOC,DETAIL,ABBNUM + INTEGER NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2 + INTEGER TROLL,TROLL2,STREAM,SPICES + INTEGER RTXSIZ,CLSMAX,LOCSIZ,SECT,TABNDX,OBJ + INTEGER VERB,HNTLOC,KK +C +C +C +C + DO 10 I=1,TRVSIZ + WRITE(4,1)TRVSIZ +1 FORMAT(' TRAVEL ENTRIES: ', I10) + + I1= GETWRD(TRAVEL, I, 0) + I2= GETWRD(TRVCON, I, 0) + I3= GETWRD(TRVLOC, I, 0) + WRITE(4,11) I, I1, I2, I3 +11 FORMAT(' TRAVEL ',I4,' GIVES',1X,I4,1X,I4,1X,I4) +10 CONTINUE + DO 20 I = 1, TABSIZ + WRITE(4,21)I, KTAB(I), ATAB(I) +21 FORMAT(' K/a TAB ',I4,' GIVES ', I6, 1X, A6) +20 CONTINUE + DO 30 I = 1, 100 + I4 = I + 100 + WRITE(4,31)I,PLAC(I),PLACE(I),FIXD(I),FIXED(I),LINK(I),LINK(I4),PTEXT(I),PROP(I) +31 FORMAT(' LOCATION DATA',1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6) +30 CONTINUE + RETURN + END diff --git a/sw/adventure/GETIN.FT b/sw/adventure/GETIN.FT new file mode 100644 index 0000000..012a8f7 --- /dev/null +++ b/sw/adventure/GETIN.FT @@ -0,0 +1,95 @@ +C WAS SUBROUTINE GETIN(WORD1,WORD1A,WORD1X,WORD2,WORD2A,WORD2X) +C OS/8 version returns 4 chars in the first word of each command entity +C +C GET A COMMAND FROM THE ADVENTURER. SNARF OUT THE FIRST WORD, PAD IT WITH +C BLANKS, AND RETURN IT IN WORD1 AND WORD1A. (for OS/8, WORD1) +C CHARS 5 AND 6 ARE RETURNED IN WORD1X, IN +C CASE WE NEED TO PRINT OUT THE WHOLE WORD IN AN ERROR MESSAGE. ANY NUMBER OF +C BLANKS MAY FOLLOW THE WORD. IF A SECOND WORD APPEARS, IT IS RETURNED IN +C WORD2 AND WORD2A (CHARS 5 AND 68 IN WORD2X), ELSE WORD2 IS SET TO ZERO. +C (for OS/8, WORD2 and WORD2X). +C +C IMPLICIT INTEGER (A-Z) +C LOGICAL*1 FRST(20),BLANK,LCA,LCZ,UCA +C DATA BLANK/' '/,UCA/'A'/,LCA/'a'/,LCZ/'z'/ + + SUBROUTINE GETIN(WORD1,WORD1X,WORD2,WORD2X) + INTEGER INPUT(20),WORD1,WORD1X + INTEGER WORD2,WORD2X + +10 WRITE(4,1) +1 FORMAT(' > ',$) +C READ(4,2)INPUT +C2 FORMAT(20A1) + CALL RDLINE(INPUT, 20) + WORD1 = ' ' + WORD1X = ' ' + WORD2 = ' ' + WORD2X = ' ' + + DO 15 I=1,20 +C Using INT here to normalize the input values + J = INT(INPUT(I)) +15 INPUT(I) = J + IX1=0 + IX2=0 + I=0 +C +C Find first nonblank +C +20 I=I+1 + IF(I.GT.20)GOTO 10 + IF(INPUT(I).EQ.32)GOTO 20 +C +C Move four characters to WORD1 +C + DO 30 IX1 = 1, 4 + CALL CPUT(WORD1, IX1, INPUT(I)) + I=I+1 + IF(I.GT.20)GOTO 100 +C +C If blank, go to word 2 +C + IF(INPUT(I) .EQ. 32) GOTO 50 +30 CONTINUE +C +C Move two characters to WORD1X +C + DO 40 IX1 = 1, 20 + IF (IX1 .GT. 2) GOTO 35 + CALL CPUT(WORD1X, IX1, INPUT(I)) +35 I=I+1 + IF(I.GT.20)GOTO 100 + IF(INPUT(I).EQ.32)GOTO 50 +40 CONTINUE + +C +C Find next nonblank +C +50 I = I + 1 + IF(I.GT.20) GOTO 100 + IF (INPUT(I).EQ. 32)GOTO 50 + +C +C Move four to WORD2 +C + DO 60 IX1 = 1,4 + CALL CPUT(WORD2, IX1, INPUT(I)) + I = I + 1 + IF (I.GT.20) GOTO 100 + IF (INPUT(I).EQ. 32) GOTO 100 +60 CONTINUE +C +C Move to to WORD2X +C + DO 70 IX1 = 1,2 + CALL CPUT(WORD2X, IX1, INPUT(I)) + I = I + 1 + IF (I.GT.20) GOTO 100 + IF(INPUT(I).EQ.32) GOTO 100 +70 CONTINUE +100 IF (WORD2 .NE. ' ') RETURN + WORD2 = 0 + WORD2X = 0 + RETURN + END diff --git a/sw/adventure/GETWRD.RA b/sw/adventure/GETWRD.RA new file mode 100644 index 0000000..3556b06 --- /dev/null +++ b/sw/adventure/GETWRD.RA @@ -0,0 +1,190 @@ + SECT WORDS +/FILE GETWRD +/Version 02.06 + +/This module contains two entry points to allow FORTRAN +/programs access to the contents of any of the 3 12-bit words +/in any floating point variable. The idea is to facilitate +/operations on text strings which are stored as 8-bit ASCII, +/such as input by the routine RDLIN (see write up for RDLIN +/included with that routine.). + +/ ROUTINE GETWRD + +/This routine is a function subroutine (ie: the result is +/returned in the FAC). As such it's name may be used in arithmetic +/statments and the returned data will be used directly. The +/following example illustrates it's use: +/ . +/ . +/ RESULT=GETWRD(MESSAG,INDX,MASK) +/ . +/ . + +/Here, the desired word (exponent,hi or lo mantissa) will +/be returned and placed into the variable RESULT. The argument +/MESSAG may be a variable or an array. The actual address in the +/array will be computed by the routine, depending on the value +/of the variable INDX. INDX points to the specific 12-bit word in +/the array you want. The routine adds this number to the start +/address of the array, and operates on this word with an XTA +/instruction. + +/The following table illustrates this conversion: + +/Value of INDX Element word Array element + +/ 1 Exponent 1 +/ 2 Hi mant. 1 +/ 3 Lo mant. 1 +/ 4 Exponent 2 +/ 5 Hi mant. 2 +/ etc. etc. etc. + +/The argument MASK allows the masking of the data retrieved +/so parity bits etc. can be removed easily. The value should be +/the decimal equivalent of the octal number you want the data masked +/by. If MASK is 0, no masking takes place. + +/ ROUTINE PUTWRD + +/This routine provides the converse function of GETWRD. +/It is called from FORTRAN using a standard subroutine call: + +/ CALL PUTWRD(MESSAG,INDX,WORD) + +/The first 2 arguments are identical to those in the routine GETWRD, +/but the third argument reflects the difference in function of +/these two routines. WORD is the value in decimal that is to +/be placed into the 12-bit word referenced by the first two +/arguments. Masking is not provided for. + + EXTERN #RETRN + EXTERN #ARGER + ENTRY GETWRD + ENTRY PUTWRD + + +/Little routine to do masking of octal data. +/Although the references to XR 0 and 1 destroy the +/value of the Array element in XR 0-2, this is of no +/consequence because we've already finished using it. + +/The only caveat here is that #XR+2 is not an auto index register +/Calling in #PAGE0 won't help because we could ge loaded onto +/page 0 of some other field. + + SECT8 #MASK + TAD #XR /Index 0 contains fetched data + AND #XR+1 /Index 1 contains the mask. + DCA #XR /Apply mask to data + CIF CDF /Reset data field + JMP% #XR+2 /XR5 contains return address + +/FPP code starts here. It is intended that it be contiguous +/with the 8-mode code so the rest of the page is not wasted + +SECNAM, TEXT +GETWRD+ /Init for traceback +#BASE, ORG .+3 /Base 0 +INDX, ORG .+3 /Base 1: Stuff addresses in here +#PTWRD, TEXT +PUTWRD+ /Base 2: One of the section names +#GTWRD, TEXT +GETWRD+ /Base 3: The other section name + +/Relative address on page is 23. This puts XR+2 out of any possible +/danger with respect to auto-index registers. + +#XR, FNOP /Base 4: XR0-2 + ADDR #RETRN / #XR2=return to FRTS address + 1;2;3 /Base 5: XR3-5 +/TENK, F 4096.0 /Base 6 +K2048, F 2048.0 +XSETX, 27;47;7777 /Base 7: SETX-JA-1 + + ORG #BASE+30 + FNOP; JA #BASE /Pointer to section name+3 + FNOP;#GOBAK, 0;0 /Pointer to calling base page + +/Routine starts here. Details of index register usage are +/as follows: + +/ XR 0 Used to fetch/store/hold target word +/ XR 1 Used as arg. fetch index, and to hold mask word +/ XR 2 Contains the FRTS TRAP return address +/ XR 3 =1 to fetch ARRAY arg +/ XR 4 =2 to fetch INDEX arg +/ XR 5 =3 to fetch WORD/MASK arg + + BASE #BASE /Tell assembler wher the base page is + +/Enter here for PUTWRD + +PUTWRD, FLDA #PTWRD,0 /Get putwrd name + JSA GETARG /Get args set up + + FLDA% INDX /Load the new value for target word + JLT TSTNEG /Negative range check + FSUB K2048 /For positive, < 2048 + JGE PUTERR /Out of range + JA OK /Else ok +TSTNEG, FADD K2048 /Neg more than 2048? + JLE PUTERR /Yes, errror +OK, FLDA% INDX + FLDA% INDX /In range ATX 0 /Store it + JA #GOBAK /Return + +PUTERR, FLDA SECNAM + TRAP4 #ARGER + +/Enter here for GETWRD + +GETWRD, FLDA #GTWRD,0 /Load section name + JSA GETARG /Get things set up + + XTA 0 /Get the target word + SETX #XR /Reset index registers + ATX 0 /Store word in XR 0 + + FLDA% INDX /Get the mask value + JEQ NOMASK /If 0, skip masking + ATX 1 /Put the mask value into an index + TRAP3 #MASK /Go mask the number + +NOMASK, XTA 0 /Recover the masked number +/ JGE #GOBAK /If result is positive, return now +/ FADD TENK /Otherwise, un-2's complement first + JA #GOBAK /Return the answer in FAC + +/Both routines come here to get things set up. FAC contains +/section name. + + +GETARG, 0;0 + FSTA SECNAM /Name into traceback prologue + SETX #XR /Set address of index registers + + STARTD /Mode for addresses + 0210 /Load pointer to callers prologue + FSTA #GOBAK,0 /Store as return address + 0200 /Load address of argument list + SETB #BASE /Now tell FPP where the base page is + + FSTA #BASE /Store address of args + + FLDA% #BASE,4 /Load pointer to INDX + FSTA INDX /Store this + + STARTF /Mode for numbers + FLDA% INDX /Load the pointer + ALN 0 /Fix it + STARTD /Address mode + + FADD% #BASE,3 /Add address of ARRAY/VARIABLE + FADD XSETX /Create a SETX ARRAY+INDEX-1 + FSTA ZSETX,0 /Store to execute in line + + FLDA% #BASE,5 /Load pointer to MASK/Replacement word + FSTA INDX /Store this + STARTF /Set numeric mode + +ZSETX, SETX . /Set index on target word + JA GETARG /Return, everything set diff --git a/sw/adventure/INITAD.FT b/sw/adventure/INITAD.FT new file mode 100644 index 0000000..246fa37 --- /dev/null +++ b/sw/adventure/INITAD.FT @@ -0,0 +1,749 @@ +C ADVENTURES + SUBROUTINE INIT +C +C MODIFIED BY KENT BLACKETT +C ENGINEERING SYSTEMS GROUP +C DIGITAL EQUIPMENT CORP. +C 15-JUL-77 +C MODIFIED BY BOB SUPNIK +C DISK ENGINEERING +C 21-OCT-77 +C MODIFIED BY BOB SUPNIK +C DISK ENGINEERING +C 25-AUG-78 +C MODIFIED BY BOB SUPNIK +C SMALL SYSTEMS +C 12-NOV-78 +C ORIGINAL VERSION WAS FOR DECSYSTEM-10 +C NEXT VERSION WAS FOR FORTRAN IV-PLUS UNDER +C THE IAS OPERATING SYSTEM ON THE PDP-11/70 +C THIS VERSION IS FOR FORTRAN IV (V01C OR LATER) +C UNDER RT-11 ON *ANY* PDP-11 +C +C +C CURRENT LIMITS: +C 300 VOCABULARY WORDS (KTAB, ATAB, TABSIZ). +C 150 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ). +C 100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP). +C 35 "ACTION" VERBS (ACTSPK, VRBSIZ). +C 205 RANDOM MESSAGES (RTEXT, RTXSIZ). +C 12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX). +C 20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ). +C THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF +C THE DATABASE. (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE, +C SO THERE CAN'T BE MORE THAN 1000 WORDS.) THESE UPPER LIMITS ARE: +C 1000 NON-SYNONYMOUS VOCABULARY WORDS +C 300 LOCATIONS +C 100 OBJECTS +C +C IMPLICIT INTEGER (A-Z) + LOGICAL LMWARN,CLOSNG,PANIC,HINTED, + 1 CLOSED,GAVEUP,SCORNG,DSEEN,BITSET +C + LOGICAL WRITN + COMMON /VERSN/ VMAJ, VMIN, VEDIT + COMMON /FILES/ INDXNM, TEXTNM, SAVENM, INPTNM + COMMON /TXTCOM/ RTEXT,LINES,ASCVAR,TXTLOC,DATA + COMMON /VOCCOM/ KTAB,ATAB,TABSIZ + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + COMMON /PTXCOM/ PTEXT + COMMON /ABBCOM/ ABB + COMMON /MISCOM/ LINUSE,TRVS,CLSSES,OLDLOC,LOC,CVAL,TK,NEWLOC, + 1 KEY,PLAC,FIXD,ACTSPK,COND,HINTS,HNTMAX,PROP,TALLY,TALLY2, + 2 HINTLC,CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC,KEYS,LAMP,GRATE + COMMON /MISCOM/ + 3 CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE,FISSUR,TABLET, + 4 CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE,WATER,OIL,PLANT, + 5 PLANT2,AXE,MIRROR,DRAGON,CHASM,TROLL,TROLL2,BEAR,MESSAG,VEND, + 6 BATTER,NUGGET,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD,PYRAM + COMMON /MISCOM/ + 7 PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY,LOCK, + 8 THROW,FIND,INVENT,TURNS,LMWARN,KNFLOC,DETAIL,ABBNUM, + 9 NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2, + 1 CLOSNG,PANIC,CLOSED,GAVEUP,SCORNG,ODLOC,STREAM,SPICES + COMMON /MISC2/ I,RTXSIZ,CLSMAX,LOCSIZ,CTEXT,STEXT,LTEXT, + 1 SECT,TRAVEL,TRVCON,TRVLOC,TRVSIZ,TABNDX,OBJ,J,K,VERB,HNTSIZ, + 2 MAXTRS,HINTED,HNTLOC,KK +C + INTEGER LINES(12),DATA(78) +C The TRAVEL, TRVCON, and TRVLOC arrays are +C Packed with words 0,1,2 holding the data. Saves lots +C of wasted space at the expense of some complexity. + INTEGER TRAVEL(250), TRVCON(250), TRVLOC(250), TRVSIZ + INTEGER KTAB(300),ATAB(300),TABSIZ + INTEGER LTEXT(150),STEXT(150),KEY(150),COND(150),ABB(150), + 1 ATLOC(150) + INTEGER PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200), + 1 PTEXT(100),PROP(100),HOLDNG + INTEGER ACTSPK(35) + INTEGER RTEXT(205) + INTEGER CTEXT(12),CVAL(12) + INTEGER HINTLC(20),HINTS(20,4) + DIMENSION HINTED(20) + INTEGER TK(20),DLOC(6),ODLOC(6) + DIMENSION DSEEN(6) + INTEGER ASCVAR, TXTLOC, TRVS, CLSSES, OLDLOC + INTEGER HNTSIZ, HNTMAX, TALLY, TALLY2, CHLOC, CHLOC2, DFLAG + INTEGER DALTLC,GRATE,CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE + INTEGER FISSUR,TABLET,CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE + INTEGER WATER,OIL,PLANT,PLANT2,AXE,MIRROR,DRAGON,CHASM + INTEGER BEAR,MESSAG,VEND,BATTER,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD + INTEGER PYRAM,PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY + INTEGER LOCK,THROW,FIND,INVENT,TURNS,KNFLOC,DETAIL,ABBNUM + INTEGER NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2 + INTEGER TROLL,TROLL2,STREAM,SPICES + INTEGER RTXSIZ,CLSMAX,LOCSIZ,SECT,TABNDX,OBJ + INTEGER VERB,HNTLOC,KK + INTEGER INDXNM(3),TEXTNM(3),SAVENM(3),INPTNM(3),CODE,NAME(3) +C +C +C ISHFT(NUMBER,IPOSIT)=NUMBER*(2**IPOSIT) +C BITSET(L,N)=(COND(L).AND.ISHFT(1,N)).NE.0 + C DESCRIPTION OF THE DATABASE FORMAT +C +C +C THE DATA FILE CONTAINS SEVERAL SECTIONS. EACH BEGINS WITH A LINE CONTAINING +C A NUMBER IDENTIFYING THE SECTION, AND ENDS WITH A LINE CONTAINING "-1". +C +C SECTION 1: LONG FORM DESCRIPTIONS. EACH LINE CONTAINS A LOCATION NUMBER, +C A COMMA, AND A LINE OF TEXT. THE SET OF (NECESSARILY ADJACENT) LINES +C WHOSE NUMBERS ARE X FORM THE LONG DESCRIPTION OF LOCATION X. +C SECTION 2: SHORT FORM DESCRIPTIONS. SAME FORMAT AS LONG FORM. NOT ALL +C PLACES HAVE SHORT DESCRIPTIONS. +C SECTION 3: TRAVEL TABLE. EACH LINE CONTAINS A LOCATION NUMBER (X), A SECOND +C LOCATION NUMBER (Y), AND A LIST OF MOTION NUMBERS (SEE SECTION 4). +C EACH MOTION REPRESENTS A VERB WHICH WILL GO TO Y IF CURRENTLY AT X. +C Y, IN TURN, IS INTERPRETED AS FOLLOWS. LET M=Y/1000, N=Y MOD 1000. +C IF N<=300 IT IS THE LOCATION TO GO TO. +C IF 300500 MESSAGE N-500 FROM SECTION 6 IS PRINTED, +C AND HE STAYS WHEREVER HE IS. +C MEANWHILE, M SPECIFIES THE CONDITIONS ON THE MOTION. +C IF M=0 IT'S UNCONDITIONAL. +C IF 0$<". +C SECTION 6: ARBITRARY MESSAGES. SAME FORMAT AS SECTIONS 1, 2, AND 5, EXCEPT +C THE NUMBERS BEAR NO RELATION TO ANYTHING (EXCEPT FOR SPECIAL VERBS +C IN SECTION 4). +C SECTION 7: OBJECT LOCATIONS. EACH LINE CONTAINS AN OBJECT NUMBER AND ITS +C INITIAL LOCATION (ZERO (OR OMITTED) IF NONE). IF THE OBJECT IS +C IMMOVABLE, THE LOCATION IS FOLLOWED BY A "-1". IF IT HAS TWO LOCATIONS +C (E.G. THE GRATE) THE FIRST LOCATION IS FOLLOWED WITH THE SECOND, AND +C THE OBJECT IS ASSUMED TO BE IMMOVABLE. +C SECTION 8: ACTION DEFAULTS. EACH LINE CONTAINS AN "ACTION-VERB" NUMBER AND +C THE INDEX (IN SECTION 6) OF THE DEFAULT MESSAGE FOR THE VERB. +C SECTION 9: LIQUID ASSETS, ETC. EACH LINE CONTAINS A NUMBER (N) AND UP TO 20 +C LOCATION NUMBERS. BIT N (WHERE 0 IS THE UNITS BIT) IS SET IN COND(LOC) +C FOR EACH LOC GIVEN. THE COND BITS CURRENTLY ASSIGNED ARE: +C 0 LIGHT +C 1 IF BIT 2 IS ON: ON FOR OIL, OFF FOR WATER +C 2 LIQUID ASSET, SEE BIT 1 +C 3 PIRATE DOESN'T GO HERE UNLESS FOLLOWING PLAYER +C OTHER BITS ARE USED TO INDICATE AREAS OF INTEREST TO "HINT" ROUTINES: +C 4 TRYING TO GET INTO CAVE +C 5 TRYING TO CATCH BIRD +C 6 TRYING TO DEAL WITH SNAKE +C 7 LOST IN MAZE +C 8 PONDERING DARK ROOM +C 9 AT WITT'S END +C COND(LOC) IS SET TO 2, OVERRIDING ALL OTHER BITS, IF LOC HAS FORCED +C MOTION. +C SECTION 10: CLASS MESSAGES. EACH LINE CONTAINS A NUMBER (N), A TAB, AND A +C MESSAGE DESCRIBING A CLASSIFICATION OF PLAYER. THE SCORING SECTION +C SELECTS THE APPROPRIATE MESSAGE, WHERE EACH MESSAGE IS CONSIDERED TO +C APPLY TO PLAYERS WHOSE SCORES ARE HIGHER THAN THE PREVIOUS N BUT NOT +C HIGHER THAN THIS N. NOTE THAT THESE SCORES PROBABLY CHANGE WITH EVERY +C MODIFICATION (AND PARTICULARLY EXPANSION) OF THE PROGRAM. +C SECTION 11: HINTS. EACH LINE CONTAINS A HINT NUMBER (CORRESPONDING TO A +C COND BIT, SEE SECTION 9), THE NUMBER OF TURNS HE MUST BE AT THE RIGHT +C LOC(S) BEFORE TRIGGERING THE HINT, THE POINTS DEDUCTED FOR TAKING THE +C HINT, THE MESSAGE NUMBER (SECTION 6) OF THE QUESTION, AND THE MESSAGE +C NUMBER OF THE HINT. THESE VALUES ARE STASHED IN THE "HINTS" ARRAY. +C HNTMAX IS SET TO THE MAX HINT NUMBER (<= HNTSIZ). NUMBERS 1-3 ARE +C UNUSABLE SINCE COND BITS ARE OTHERWISE ASSIGNED, SO 2 IS USED TO +C REMEMBER IF HE'S READ THE CLUE IN THE REPOSITORY, AND 3 IS USED TO +C REMEMBER WHETHER HE ASKED FOR INSTRUCTIONS (GETS MORE TURNS, BUT LOSES +C POINTS). +C SECTION 12: MAGIC MESSAGES. IDENTICAL TO SECTION 6 EXCEPT PUT IN A SEPARATE +C SECTION FOR EASIER REFERENCE. MAGIC MESSAGES ARE USED BY THE STARTUP, +C MAINTENANCE MODE, AND RELATED ROUTINES. +C SECTION 0: END OF DATABASE. + C READ THE DATABASE IF WE HAVE NOT YET DONE SO +C + ISEED=0 +C +C FILSIZ Was 900 for RT-11 but we pack 6 records per. +C + FILSIZ=150 + TABSIZ=300 + LOCSIZ=150 + VRBSIZ=35 + RTXSIZ = 205 + HNTSIZ = 20 + MAGSIZ = 35 + TRVSIZ = 750 + CLSMAX = 12 +C VCNT = 0 +CDEBUG WRITE(4,1000) +CDEBUG1000 FORMAT(' INITIALIZING...') +C +C FIRST, TRY TO RESTORE PRE-EXISTING COPY OF DATA BASE +C + CALL USR(6,'ADVENT.IN',2,ERR) + IF (ERR .EQ. 0) GOTO 30 +20 CALL SIXOUT('L]OCATION OF TEXT DATABASE ([ATEXT.DA]) >',21,2) + WRITE(4,121) +121 FORMAT('+',$) + READ(4,21) TEXTNM +21 FORMAT(3A6) + IF (TEXTNM(1) .NE. ' ') GOTO 22 + TEXTNM(1) = 'ATEXT.' + TEXTNM(2) = 'DA' + TEXTNM(3) = ' ' +22 CALL SIXOUT('L]OCATION OF TEXT INDEX ([AINDX.DA]) >',21,2) + WRITE(4,121) + READ(4,21) INDXNM + IF (INDXNM(1) .NE. ' ') GOTO 23 + INDXNM(1) = 'AINDX.' + INDXNM(2) = 'DA' + INDXNM(3) = ' ' +23 CALL SIXOUT('L]OCATION OF SAVED GAMES ([ASAVE.DA]) >',21,2) + WRITE(4,121) + READ(4,21) SAVENM + IF (SAVENM(1) .NE. ' ') GOTO 24 + SAVENM(1) = 'ASAVE.' + SAVENM(2) = 'DA' + SAVENM(3) = ' ' +24 CALL SIXOUT('L]OCATION OF TEXT INPUT ([ADVENT.TX]) >',21,2) + WRITE(4,121) + READ(4,21)INPTNM + IF (INPTNM(1) .NE. ' ') GOTO 25 + INPTNM(1) = 'ADVENT' + INPTNM(2) = '.TX' + INPTNM(3) = ' ' +25 CONTINUE + + CALL USR(6, 'ADVENT.IN',3,ERR) + IF (ERR .NE. 0) WRITE(4,28) + +28 FORMAT(' CAN''T SAVE SETTINGS IN ADVENT.IN') + IF (ERR.NE.0) GOTO 40 + + WRITE(6, 29)INDXNM,TEXTNM,SAVENM,INPTNM +29 FORMAT(' ADVENTURE SETUP FILE',/, + 1 'INDX=',3A6,/,'TEXT=',3A6,/,'SAVE=',3A6,/,'INPT=',3A6) + CALL USR(6, 'ADVENT.IN',4,ERR) + GOTO 40 + +30 INDXNM(1) = 'AINDX.' + INDXNM(2) = 'DA' + INDXNM(3) = ' ' + TEXTNM(1) = 'ATEXT.' + TEXTNM(2) = 'DA' + TEXTNM(3) = ' ' + SAVENM(1) = 'ASAVE.' + SAVENM(2) = 'DA' + SAVENM(3) = ' ' + INPTNM(1) = 'ADVENT' + INPTNM(2) = '.TX' + INPTNM(3) = ' ' +31 CALL CHKEOF(EOF) + READ(6, 32) CODE, NAME + IF (EOF .NE. 0) GOTO 34 +32 FORMAT(A4,1X,3A6) + DO 33 I = 1, 3 + IF (CODE .EQ. 'INDX') INDXNM(I) = NAME(I) + IF (CODE .EQ. 'TEXT') TEXTNM(I) = NAME(I) + IF (CODE .EQ. 'SAVE') SAVENM(I) = NAME(I) + IF (CODE .EQ. 'INPT') INPTNM(I) = NAME(I) +33 CONTINUE + GO TO 31 + +34 CONTINUE +40 CALL RSTRGM(.FALSE.,I) + IF(I.NE.0) GO TO 10 + CALL USR(8, TEXTNM, 2, ERR) +C +C If that can't be opened for input, gotta rebuild +C + IF (ERR.NE.0) GOTO 10 +C +C Hack to set the DEFINE FILE stuff up +C + CALL SETIDL +C CALL USR(6, 'ADVENT.TX', 2, ERR) +C IF (ERR.EQ.0) GOTO 1235 +C CALL SIXOUT('C]AN''T OPEN [ADVENT.TX] FOR INPUT, QUITTING!',23,0) +C STOP + +1235 WRITN = .FALSE. + GO TO 5000 +C +C CLEAR OUT THE VARIOUS TEXT-POINTER ARRAYS. ALL TEXT IS STORED IN DISK +C FILE (RANDOM ACCESS ON UNIT 2). THE TEXT-POINTER ARRAYS CONTAIN RECORD +C NUMBERS IN THE FILE. STEXT(N) IS SHORT DESCRIPTION OF LOCATION N. +C LTEXT(N) IS LONG DESCRIPTION. PTEXT(N) POINTS TO MESSAGE FOR PROP(N)=0. +C SUCCESSIVE PROP MESSAGES ARE FOUND BY CHASING POINTERS. RTEXT CONTAINS +C SECTION 6'S STUFF. CTEXT(N) POINTS TO A PLAYER-CLASS MESSAGE. MTEXT IS FOR +C SECTION 12. WE ALSO CLEAR COND. SEE DESCRIPTION OF SECTION 9 FOR DETAILS. +C + WRITN = .TRUE. +10 DO 1001 I=1,TABSIZ + KTAB(I)=0 + ATAB(I)=0 +C +C A2TAB not used on the '8 +C A2TAB(I)=0 + IF(I.GT.100) GO TO 1990 + PTEXT(I)=0 + PROP(I)=0 + PLAC(I)=0 + PLACE(I)=0 + FIXD(I)=0 + FIXED(I)=0 + LINK(I)=0 + LINK(I+100)=0 +1990 IF(I.LE.RTXSIZ)RTEXT(I)=0 + IF(I.LE.CLSMAX)CTEXT(I)=0 +C IF(I.LE.MAGSIZ)MTEXT(I)=0 + IF(I.LE.VRBSIZ)ACTSPK(I)=0 + IF(I.GT.LOCSIZ)GOTO 1001 + KEY(I)=0 + ABB(I)=0 + ATLOC(I)=0 + STEXT(I)=0 + LTEXT(I)=0 + COND(I)=0 +1001 CONTINUE +C + CALL USR(6, INPTNM, 2, ERR) + IF(ERR.EQ.0)GOTO 1236 + CALL SIXOUT('C]AN''T OPEN ',6,2) + CALL SIXOUT(INPTNM, 9, 3) + CALL SIXOUT(' ]FOR INPUT!',6,1) + STOP +1236 CALL USR(8, TEXTNM, 3, ERR) + IF (ERR.EQ.0) GOTO 1237 + CALL SIXOUT('C]AN''T OPEN ',6,2) + CALL SIXOUT(TEXTNM, 9, 3) + CALL SIXOUT(' ]FOR OUTPUT',6,1) + STOP +1237 DEFINE FILE 8(FILSIZ,78,U,RECORD) + RECORD = 1 + ASCVAR = 1 + LINUSE=1 + TRVS=1 + CLSSES=1 +C +C START NEW DATA SECTION. ISECT IS THE SECTION NUMBER. +C +1002 READ(6,1003)ISECT +1003 FORMAT(I5) +CDEBUG WRITE(4,930)ISECT +CDEBUG930 FORMAT(' NOW LOADING SECTION',I3) + OLDLOC=-1 + GOTO(1100,1004,1004,1030,1040,1004,1004,1050,1060,1070,1004, + 1 1080,1004) (ISECT+1) +C (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) +C (11) (12) + CALL BUG(9) +C +C SECTIONS 1, 2, 5, 6, 10, 12. READ MESSAGES AND SET UP POINTERS. +C +1004 READ(6,1005) LOC,LINES +1005 FORMAT(I4,12A6) +C WRITE(8'ASCVAR) LOC,LINES + MULT = 13 * MOD(ASCVAR-1,6)+1 + DATA(MULT) = LOC + DO 1006 I = 1,12 +1006 DATA(I+MULT) = LINES(I) + ASCVAR = ASCVAR + 1 + IF (MOD(ASCVAR,6) .EQ. 0) WRITE(8'RECORD)DATA +1007 LINUSE = ASCVAR-1 + IF(LOC .EQ. -1) GO TO 1002 + IF(LOC .EQ. OLDLOC) GO TO 1020 + IF(ISECT.EQ.12)GOTO 1020 + IF(ISECT.EQ.10)GOTO 1012 + IF(ISECT.EQ.6)GOTO 1011 + IF(ISECT.EQ.5)GOTO 1010 + IF(ISECT.EQ.1)GOTO 1008 +C + IF(LOC.GT.LOCSIZ) CALL BUG(11) + STEXT(LOC)=LINUSE + GOTO 1020 +C +1008 IF(LOC.GT.LOCSIZ) CALL BUG(11) + LTEXT(LOC)=LINUSE + GOTO 1020 +C +1010 IF(LOC.GT.0.AND.LOC.LE.100)PTEXT(LOC)=LINUSE + GOTO 1020 +C +1011 IF(LOC .GT. RTXSIZ) CALL BUG(6) + RTEXT(LOC)=LINUSE + GOTO 1020 +C +1012 IF(CLSSES.GT.CLSMAX) CALL BUG(12) + CTEXT(CLSSES)=LINUSE + CVAL(CLSSES)=LOC + CLSSES=CLSSES+1 +C GOTO 1020 +C1013 +C IF(LOC.GT.MAGSIZ)CALL BUG(6) +C MTEXT(LOC)=LINUSE +C +1020 OLDLOC = LOC + IF(RECORD .GE. FILSIZ) CALL BUG(2) + GOTO 1004 +C +C THE STUFF FOR SECTION 3 IS ENCODED HERE. EACH "FROM-LOCATION" GETS A +C CONTIGUOUS SECTION OF THE "TRAVEL" ARRAY. EACH ENTRY IN TRAVEL IS +C KEYWORD (FROM SECTION 4, MOTION VERBS), AND IS NEGATED IF +C THIS IS THE LAST ENTRY FOR THIS LOCATION. KEY(N) IS THE INDEX IN TRAVEL +C OF THE FIRST OPTION AT LOCATION N. +C +C SPECIAL CONDITIONS ON TRAVEL ARE ENCODED IN THE CORRESPONDING +C ENTRIES OF TRVCON. THE NEW LOCATION IS IN TRVLOC. +C +C +1030 READ(6,1031)LOC,J,NEWLOC,TK +1031 FORMAT(99I6) + IF(LOC.EQ.-1)GOTO 1002 + IF(KEY(LOC).NE.0)GOTO 1033 + KEY(LOC)=TRVS + GOTO 1035 +C1033 TRAVEL(TRVS-1)=-TRAVEL(TRVS-1) +1033 ITEMP = GETWRD(TRAVEL, TRVS-1, 0) + ITEMP=-ITEMP + CALL PUTWRD(TRAVEL, TRVS-1, ITEMP) +1035 DO 1037 L=1,20 + IF(TK(L).EQ.0)GOTO 1039 +C TRAVEL(TRVS)=TK(L) + CALL PUTWRD(TRAVEL, TRVS, TK(L)) +C TRVLOC(TRVS)=NEWLOC + CALL PUTWRD(TRVLOC, TRVS, NEWLOC) +C TRVCON(TRVS)=J + CALL PUTWRD(TRVCON, TRVS, J) + TRVS=TRVS+1 + IF(TRVS.EQ.TRVSIZ)CALL BUG(3) +1037 CONTINUE +C1039 TRAVEL(TRVS-1)=-TRAVEL(TRVS-1) +1039 ITEMP = GETWRD(TRAVEL, TRVS-1, 0) + ITEMP=-ITEMP + CALL PUTWRD(TRAVEL, TRVS-1, ITEMP) + GOTO 1030 +C +C HERE WE READ IN THE VOCABULARY. KTAB(N) IS THE WORD NUMBER, ATAB(N) IS +C THE CORRESPONDING WORD. THE -1 AT THE END OF SECTION 4 IS LEFT IN KTAB +C AS AN END-MARKER. +C OS/8 note: only reading first four characters as that's what's matched +C for vocabulary. +C +1040 DO 1042 TABNDX=1,TABSIZ +1043 READ(6,1041)KTAB(TABNDX),ATAB(TABNDX) +1041 FORMAT(I6,A4) + IF(KTAB(TABNDX).EQ.-1)GOTO 1002 +1042 CONTINUE + CALL BUG(4) +C +C READ IN THE INITIAL LOCATIONS FOR EACH OBJECT. ALSO THE IMMOVABILITY INFO. +C PLAC CONTAINS INITIAL LOCATIONS OF OBJECTS. FIXD IS -1 FOR IMMOVABLE +C OBJECTS (INCLUDING THE SNAKE), OR = SECOND LOC FOR TWO-PLACED OBJECTS. +C +1050 READ(6,1031)IOBJ,J,K + IF(IOBJ.EQ.-1)GOTO 1002 + IF(IOBJ.GT.100) CALL BUG(13) + PLAC(IOBJ)=J + FIXD(IOBJ)=K + GOTO 1050 +C +C READ DEFAULT MESSAGE NUMBERS FOR ACTION VERBS, STORE IN ACTSPK. +C +1060 READ(6,1031)VERB,J + IF(VERB.EQ.-1)GOTO 1002 + IF(VERB.GT.VRBSIZ) CALL BUG(10) + ACTSPK(VERB)=J + VCNT=MAX0(VERB,VCNT) + GOTO 1060 +C +C READ INFO ABOUT AVAILABLE LIQUIDS AND OTHER CONDITIONS, STORE IN COND. +C +1070 READ(6,1031)K,TK + IF(K.EQ.-1)GOTO 1002 + DO 1071 I=1,20 + LOC=TK(I) + IF(LOC.EQ.0)GOTO 1070 + IF (BITSET(LOC,K)) CALL BUG(8) +1071 COND(LOC)=COND(LOC)+ISHFT(1,K) + GOTO 1070 +C +C READ DATA FOR HINTS. +C +1080 HNTMAX=0 +1081 READ(6,1031)K,TK + IF(K.EQ.-1)GOTO 1002 + IF(K.LT.0.OR.K.GT.HNTSIZ)CALL BUG(7) + DO 1083 I=1,4 +1083 HINTS(K,I)=TK(I) + HNTMAX=MAX0(HNTMAX,K) + GOTO 1081 + C FINISH CONSTRUCTING INTERNAL DATA FORMAT +C THEN SAVE THE RESULTS +C +1100 IF (MOD(ASCVAR,6) .NE. 0) WRITE(8'RECORD)DATA + CALL USR(8,TEXTNM,4,IERR) + CALL USR(8,TEXTNM,2,IERR) +C +C Restore the "DEFINE FILE" settings +C + CALL SETIDL +C1100 CALL CLOSE(1) + CALL SAVEGM(.FALSE.,I) + CONTINUE +C +C HAVING READ IN THE DATABASE, CERTAIN THINGS ARE NOW CONSTRUCTED. PROPS ARE +C SET TO ZERO. WE FINISH SETTING UP COND BY CHECKING FOR FORCED-MOTION TRAVEL +C ENTRIES. THE PLAC AND FIXD ARRAYS ARE USED TO SET UP ATLOC(N) AS THE FIRST +C OBJECT AT LOCATION N, AND LINK(IOBJ) AS THE NEXT OBJECT AT THE SAME LOCATION +C AS IOBJ. (IOBJ>100 INDICATES THAT FIXED(IOBJ-100)=LOC; LINK(IOBJ) IS STILL THE +C CORRECT LINK TO USE.) ABB IS ZEROED; IT CONTROLS WHETHER THE ABBREVIATED +C DESCRIPTION IS PRINTED. COUNTS MOD 5 UNLESS "LOOK" IS USED. +C +C +C IF THE FIRST MOTION VERB IS 1 (ILLEGAL), THEN THIS IS A FORCED +C MOTION ENTRY. +C +5000 DO 1102 I=1,LOCSIZ + IF(LTEXT(I).EQ.0.OR.KEY(I).EQ.0)GOTO 1102 + K=KEY(I) +C IF(IABS(TRAVEL(K)).EQ.1)COND(I)=2 + ITEMP = GETWRD(TRAVEL, K, 0) + IF (IABS(ITEMP).EQ.1)COND(I)=2 +1102 CONTINUE +C +C SET UP THE ATLOC AND LINK ARRAYS AS DESCRIBED ABOVE. WE'LL USE THE DROP +C SUBROUTINE, WHICH PREFACES NEW OBJECTS ON THE LISTS. SINCE WE WANT THINGS +C IN THE OTHER ORDER, WE'LL RUN THE LOOP BACKWARDS. IF THE OBJECT IS IN TWO +C LOCS, WE DROP IT TWICE. THIS ALSO SETS UP "PLACE" AND "FIXED" AS COPIES OF +C "PLAC" AND "FIXD". ALSO, SINCE TWO-PLACED OBJECTS ARE TYPICALLY BEST +C DESCRIBED LAST, WE'LL DROP THEM FIRST. +C + DO 1106 I=1,100 + K=101-I + IF(FIXD(K).LE.0)GOTO 1106 + CALL DROP(K+100,FIXD(K)) + CALL DROP(K,PLAC(K)) +1106 CONTINUE +C + DO 1107 I=1,100 + K=101-I + FIXED(K)=FIXD(K) +1107 IF(PLAC(K).NE.0.AND.FIXD(K).LE.0)CALL DROP(K,PLAC(K)) +C +C TREASURES, AS NOTED EARLIER, ARE OBJECTS 50 THROUGH MAXTRS (CURRENTLY 79). +C THEIR PROPS ARE INITIALLY -1, AND ARE SET TO 0 THE FIRST TIME THEY ARE +C DESCRIBED. TALLY KEEPS TRACK OF HOW MANY ARE NOT YET FOUND, SO WE KNOW +C WHEN TO CLOSE THE CAVE. TALLY2 COUNTS HOW MANY CAN NEVER BE FOUND (E.G. IF +C LOST BIRD OR BRIDGE). +C + MAXTRS=79 + TALLY=0 + TALLY2=0 + DO 1200 I=50,MAXTRS + IF(PTEXT(I).NE.0)PROP(I)=-1 +1200 TALLY=TALLY-PROP(I) +C +C CLEAR THE HINT STUFF. HINTLC(I) IS HOW LONG HE'S BEEN AT LOC WITH COND BIT +C I. HINTED(I) IS TRUE IFF HINT I HAS BEEN USED. +C + DO 1300 I=1,HNTMAX + HINTED(I)=.FALSE. +1300 HINTLC(I)=0 +C +CDEBUG WRITE(4,931)TABNDX,TABSIZ,VCNT,VRBSIZ,CLSSES,CLSMAX, +CDEBUG 1 HNTMAX,HNTSIZ,TRVS,TRVSIZ,LINUSE,FILSIZ +CDEBUG931 FORMAT(' USED VS MAX TABLE VALUES:'/ +CDEBUG 1 1X,I5,' OF ',I5,' VOCAB ENTRIES'/ +CDEBUG 2 1X,I5,' OF ',I5,' VERB ENTRIES'/ +CDEBUG 3 1X,I5,' OF ',I5,' CLASS ENTRIES'/ +CDEBUG 4 1X,I5,' OF ',I5,' HINT ENTRIES'/ +CDEBUG 5 1X,I5,' OF ',I5,' TRAVEL ENTRIES'/ +CDEBUG 6 1X,I5,' OF ',I5,' FILE RECORDS'/) +C +C DEFINE SOME HANDY MNEMONICS. THESE CORRESPOND TO OBJECT NUMBERS. +C + KEYS=VOCAB('KEYS',1) + LAMP=VOCAB('LAMP',1) + GRATE=VOCAB('GRAT',1) + CAGE=VOCAB('CAGE',1) + ROD=VOCAB('ROD ',1) + ROD2=ROD+1 + STEPS=VOCAB('STEP',1) + BIRD=VOCAB('BIRD',1) + DOOR=VOCAB('DOOR',1) + PILLOW=VOCAB('PILL',1) + SNAKE=VOCAB('SNAK',1) + FISSUR=VOCAB('FISS',1) + TABLET=VOCAB('TABL',1) + CLAM=VOCAB('CLAM',1) + OYSTER=VOCAB('OYST',1) + MAGZIN=VOCAB('MAGA',1) + DWARF=VOCAB('DWAR',1) + KNIFE=VOCAB('KNIF',1) + FOOD=VOCAB('FOOD',1) + BOTTLE=VOCAB('BOTT',1) + WATER=VOCAB('WATE',1) + OIL=VOCAB('OIL ',1) + PLANT=VOCAB('PLAN',1) + PLANT2=PLANT+1 + AXE=VOCAB('AXE ',1) + MIRROR=VOCAB('MIRR',1) + DRAGON=VOCAB('DRAG',1) + CHASM=VOCAB('CHAS',1) + TROLL=VOCAB('TROL',1) + TROLL2=TROLL+1 + BEAR=VOCAB('BEAR',1) + MESSAG=VOCAB('MESS',1) + VEND=VOCAB('VEND',1) + BATTER=VOCAB('BATT',1) +C +C OBJECTS FROM 50 THROUGH WHATEVER ARE TREASURES. HERE ARE A FEW. +C + NUGGET=VOCAB('GOLD',1) + COINS=VOCAB('COIN',1) + CHEST=VOCAB('CHES',1) + EGGS=VOCAB('EGGS',1) + TRIDNT=VOCAB('TRID',1) + VASE=VOCAB('VASE',1) + EMRALD=VOCAB('EMER',1) + PYRAM=VOCAB('PYRA',1) + PEARL=VOCAB('PEAR',1) + RUG=VOCAB('RUG ',1) + CHAIN=VOCAB('CHAI',1) +C +C THESE ARE MOTION-VERB NUMBERS. +C + BACK=VOCAB('BACK',0) + LOOK=VOCAB('LOOK',0) + CAVE=VOCAB('CAVE',0) + NULL=VOCAB('NULL',0) + ENTRNC=VOCAB('ENTR',0) + DPRSSN=VOCAB('DEPR',0) + STREAM=VOCAB('STRE',0) +C +C AND SOME ACTION VERBS. +C + SAY=VOCAB('SAY ',2) + LOCK=VOCAB('LOCK',2) + THROW=VOCAB('THRO',2) + FIND=VOCAB('FIND',2) + INVENT=VOCAB('INVE',2) +C +C INITIALISE THE DWARVES. DLOC IS LOC OF DWARVES, HARD-WIRED IN. ODLOC IS +C PRIOR LOC OF EACH DWARF, INITIALLY GARBAGE. DALTLC IS ALTERNATE INITIAL LOC +C FOR DWARF, IN CASE ONE OF THEM STARTS OUT ON TOP OF THE ADVENTURER. (NO 2 +C OF THE 5 INITIAL LOCS ARE ADJACENT.) DSEEN IS TRUE IF DWARF HAS SEEN HIM. +C DFLAG CONTROLS THE LEVEL OF ACTIVATION OF ALL THIS: +C 0 NO DWARF STUFF YET (WAIT UNTIL REACHES HALL OF MISTS) +C 1 REACHED HALL OF MISTS, BUT HASN'T MET FIRST DWARF +C 2 MET FIRST DWARF, OTHERS START MOVING, NO KNIVES THROWN YET +C 3 A KNIFE HAS BEEN THROWN (FIRST SET ALWAYS MISSES) +C 3+ DWARVES ARE MAD (INCREASES THEIR ACCURACY) +C SIXTH DWARF IS SPECIAL (THE PIRATE). HE ALWAYS STARTS AT HIS CHEST'S +C EVENTUAL LOCATION INSIDE THE MAZE. THIS LOC IS SAVED IN CHLOC FOR REF. +C THE DEAD END IN THE OTHER MAZE HAS ITS LOC STORED IN CHLOC2. +C + CHLOC=114 + CHLOC2=140 + DO 1700 I=1,6 +1700 DSEEN(I)=.FALSE. + DFLAG=0 + DLOC(1)=19 + DLOC(2)=27 + DLOC(3)=33 + DLOC(4)=44 + DLOC(5)=64 + DLOC(6)=CHLOC + DALTLC=18 +C +C OTHER RANDOM FLAGS AND COUNTERS, AS FOLLOWS: +C TURNS TALLIES HOW MANY COMMANDS HE'S GIVEN (IGNORES YES/NO) +C LIMIT LIFETIME OF LAMP (NOT SET HERE) +C KNFLOC 0 IF NO KNIFE HERE, LOC IF KNIFE HERE, -1 AFTER CAVEAT +C DETAIL HOW OFTEN WE'VE SAID "NOT ALLOWED TO GIVE MORE DETAIL" +C ABBNUM HOW OFTEN WE SHOULD PRINT NON-ABBREVIATED DESCRIPTIONS +C MAXDIE NUMBER OF REINCARNATION MESSAGES AVAILABLE (UP TO 5) +C NUMDIE NUMBER OF TIMES KILLED SO FAR +C HOLDNG NUMBER OF OBJECTS BEING CARRIED +C DKILL NUMBER OF DWARVES KILLED (UNUSED IN SCORING, NEEDED FOR MSG) +C FOOBAR CURRENT PROGRESS IN SAYING "FEE FIE FOE FOO". +C BONUS USED TO DETERMINE AMOUNT OF BONUS IF HE REACHES CLOSING +C CLOCK1 NUMBER OF TURNS FROM FINDING LAST TREASURE TILL CLOSING +C CLOCK2 NUMBER OF TURNS FROM FIRST WARNING TILL BLINDING FLASH +C LOGICALS WERE EXPLAINED EARLIER +C + TURNS=0 + LMWARN=.FALSE. + KNFLOC=0 + DETAIL=0 + ABBNUM=5 + DO 1800 I=0,4 +1800 IF(RTEXT(2*I+81).NE.0)MAXDIE=I+1 + NUMDIE=0 + HOLDNG=0 + DKILL=0 + FOOBAR=0 + BONUS=0 + CLOCK1=30 + CLOCK2=50 + CLOSNG=.FALSE. + PANIC=.FALSE. + CLOSED=.FALSE. + GAVEUP=.FALSE. + SCORNG=.FALSE. +C +C +C +C FINALLY, SINCE WE'RE CLEARLY SETTING THINGS UP FOR THE FIRST TIME... +C +C PAUSE 'INIT DONE' + RETURN + END diff --git a/sw/adventure/IO.FT b/sw/adventure/IO.FT new file mode 100644 index 0000000..5b69641 --- /dev/null +++ b/sw/adventure/IO.FT @@ -0,0 +1,27 @@ + SUBROUTINE IO(RECORD) +C +C +C This function reads the direct access file and unpacks it. +C we put 6 13-character records into a single direct access record +C because OS/8 FORTRAN puts every record into a single block. +C Packing this saves one-sixth the space. +C + COMMON /TXTCOM/ RTEXT,LINES,ASCVAR,TXTLOC,DATA + INTEGER RTEXT(205),LINES(12),DATA(78),RECORD + INTEGER OLDREC,TXTLOC +C COMMON /RECMEM/OLDREC + DATA OLDREC/-1/ + +C WRITE (1,111) RECORD + IREC = RECORD/6 + 1 +C WRITE (1,112) OLDREC, IREC + IF (IREC .NE. OLDREC)READ(8'IREC)DATA + OLDREC = IREC + N = 13 * (MOD(RECORD-1,6)) + 1 + TXTLOC = DATA(N) + DO 10 I = 1, 12 +10 LINES(I) = DATA(N+I) + RETURN +C111 FORMAT(' IO FOR ', I15) +C112 FORMAT(' IO, OLD=', I15, ' NEW=',I15) + END diff --git a/sw/adventure/JUGGLE.RA b/sw/adventure/JUGGLE.RA new file mode 100644 index 0000000..55b6be9 --- /dev/null +++ b/sw/adventure/JUGGLE.RA @@ -0,0 +1,49 @@ + SECT JUGGLE +/ SUBROUTINE JUGGLE(OBJECT) +/ C +/ C JUGGLE AN OBJECT BY PICKING IT UP AND PUTTING IT DOWN AGAIN, THE PURPOSE +/ C BEING TO GET THE OBJECT TO THE FRONT OF THE CHAIN OF THINGS AT ITS LOC. +/ C +/ IMPLICIT INTEGER (A-Z) +/ COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG +/ DIMENSION ATLOC(150),LINK(200),PLACE(100),FIXED(100) +/ + EXTERN MOVE + #LBL=. + COMMON PLACOM +ATLOC, ORG .+0702 +LINK, ORG .+1130 +PLACE, ORG .+454 +FIXED, ORG .+454 +HOLDNG, ORG .+3 + ORG #LBL + +/JUGGLE, + 0;0 /JSA entry point + FSTA OBJECT + ATX 6 +/ I=PLACE(OBJECT) + FLDA PLACE-3,6 + FSTA I +/ J=FIXED(OBJECT) + FLDA FIXED-3,6 + FSTA J +/ CALL MOVE(OBJECT,I) + JSR MOVE + JA .+6 + JA OBJECT + JA I +/ CALL MOVE(OBJECT+100,J) +/ RETURN +/ END + FLDA HUND + FADDM OBJECT + JSR MOVE + JA JUGGLE + JA OBJECT + JA J +OBJECT, ORG .+3 +I, ORG .+3 +J, ORG .+3 +HUND, F 100.0 + END diff --git a/sw/adventure/LOAD.BI b/sw/adventure/LOAD.BI new file mode 100644 index 0000000..918d698 --- /dev/null +++ b/sw/adventure/LOAD.BI @@ -0,0 +1,12 @@ +$JOB LOAD ADVENTURE +.R LOAD +*ADVENT,LOAD.LS CIF CDF + DCAZ% X4 /STORE AT #IDLE+2 +SFIELD, CIF CDF + JMP% SET8 + +/ +/ Blinky lights +/ +SKPINS, +DOIT, SKP / Entry point, one-time use constant + TAD ROTWRD /GET WORD TO DISPLAY +STALL, ISZ COUNT + JMP STALL + ISZ COUNT2 + JMP STALL +FLOP, RAL /Shift over + DCA ROTWRD /Save it + TAD RESET /Reset outer counter + DCA COUNT2 + SNL + JMP DONE + TAD ROTWRD +FLIP, RAR /Rotate back + DCA ROTWRD + TAD FLOP + DCA COUNT /Save old rotate + TAD FLIP /And flip 'em around + DCA FLOP + TAD COUNT + DCA FLIP + DCA COUNT +DONE, TAD SEEDPT + JMS MKCDF + DCA .+1 + 0 + TAD SEEDPT+1 + DCA EXP + CLL IAC + TAD EXP + DCA POINT + TAD% POINT + TAD K0100 + SPA + JMP OVRFLO + DCA% POINT + JMP DOIT+1 + +OVRFLO, CLA CLL + DCA% POINT + TAD% EXP + IAC + AND K0003 + DCA% EXP + JMP DOIT+1 +/ Change field number into CDF instruction +MKCDF, 0 + CLL RTL + RAL /INTO BITS 6-8 + TAD SCDF /CDF TO #IDLE + JMP% MKCDF + + END diff --git a/sw/adventure/SPEAK.RA b/sw/adventure/SPEAK.RA new file mode 100644 index 0000000..a89e095 --- /dev/null +++ b/sw/adventure/SPEAK.RA @@ -0,0 +1,566 @@ +/ SPEAK - Types out messages from the database +/ Also includes TTY output routines that unpack +/ packed sixbit into mixed case ASCII. +/ + FIELD1 ADVTTY + +TTY, 0 / TTY Output routine, dupe of FRTS + IOF / Protect from race conditions + SNA / Input or output? + JMP KBD / Input - read character + DCA HANGPT / Output - save char + RDF + TAD CDIF00 + DCA CDFX + CDF 0 + TAD% TOCHR / Output character status in FRTS + SMA SZA CLA / If gt 0, char backed up + JMP BUSY / Else must wait +LOOP, TAD% TOCHR / Get the status + CLL RAL /Busy flag in link + CLA CML RAR /Complement of busy in sign + TAD HANGPT + SPA /If tty not busy, + TLS /Send it + DCA% TOCHR /Store pos or neg, backed up or busy +TTYRET, ION /Interrupts back on +CDFX, HLT /Caller's field + JMP% TTY /Return + +CDIF00, CIF CDF + +BUSY, CDF 10 /Busy, must wait. Call Field 0 HANG routine + CIF 0 + JMS% HANGPT+1 + 0451 / TTUHNG + CDF 0 + JMP LOOP / Try output again + +KBD, RDF + TAD CDIF00 + DCA CDFX + CDF 0 + TAD% TICHR / Any input? + SNA CLA + JMP WAIT / No, wait +GETIN, TAD% TICHR / Get character + DCA HANGPT / Save + DCA% TICHR / Clear buffer + TAD HANGPT + JMP TTYRET / Return + +WAIT, CDF 10 + CIF 0 + JMS% HANGPT+1 /Hang + 465 /KBUHNG + CDF 0 + JMP GETIN /Get input +TOCHR, 4 +TICHR, 5 +HANGPT, ADDR #HANG +/ +/ Terminal line input routine. Used because the FRTS input is quite limited. +/ This one handles scope rubouts and allows lower case input. +/ Inputs: Array Returned characters, stored one sixbit per array word +/ (The FORTRAN input routine is set up this way to unpack) +/ Size Number of characters to allow +/ Prompt Prompt string + FIELD1 RDLIN +/ + ENTRY RDLINE +RDLINE, JA #RLST +#RLXR, ORG .+10 + TEXT +RDLINE+ +#RLRET, SETX #RLXR + SETB #RLBAS + JA .+3 +#RLBAS, ORG .+6 +BUFPT, ORG .+3 +BUFLEN, ORG .+3 + + ORG #RLBAS+30 + FNOP + JA #RLRET + FNOP +#RGOBK, 0;0 +#RLRTN, BASE #RLBAS + JA #RGOBK +#RLST, STARTD + 0210 + FSTA #RGOBK,0 + 0200 + SETX #RLXR + SETB #RLBAS + LDX 0,1 + FSTA #RLBAS + FLDA% #RLBAS,1+ + FSTA BUFPT + FLDA% #RLBAS,1+ + FSTA BUFLEN + STARTF +/ +/ Pass down size to '8' code +/ + SETX BUFSIZ + FLDA% BUFLEN + FNEG / Make it negative + ATX 0 / Pass buffer len + SETX #RLXR + TRAP4 GETLIN / Get input line + JA #RLRTN / And return +/ Input reader + + FIELD1 GETLN + +GETLIN, 0 + CLA + DCA OFFSET / Start at offset zero + TAD% SCOPT + AND K200 + DCA SCOPE + TAD% BUFFLD+1 / Get CDF for buffer + AND FLDMSK + CLL RTL + RAL + TAD CDFG + DCA BUFCDF +/ +/ Go get an input character +/ +GETNXT, JMS% PTTY+1 / Called with zero to get char + DCA INCH / Save input +/ +/ Specials? +/ + TAD INCH + TAD MDEL / Delete? + SNA CLA + JMP DELETE / Handle that + TAD INCH + TAD MCR / CR? + SNA CLA + JMP ENTER / End of line, let's go. + TAD INCH + TAD MSPC / Less than space? + SPA CLA + JMP BELL / Nope, ignore + TAD OFFSET + TAD BUFSIZ / Room left? + SMA CLA + JMP BELL / Bell if not + TAD INCH + JMS% PTTY+1 / Echo it + TAD INCH + TAD LWRA / Is it lowercase? + SPA CLA + JMP UPPER / No, store it + TAD INCH + TAD LWRZ + SMA CLA + JMP UPPER / More than lowercase z + TAD INCH + TAD AMINA / Adjust to uppercase + DCA INCH +UPPER, JMS STORE / Store this character + JMP GETNXT / Get more +/ Store a character in the output buffer +/ using the current offset +/ + +STORE, 0 + TAD OFFSET + TAD OFFSET + TAD OFFSET / Count FPP words + TAD% BUFPTR+1 / Pointer to exponent word + DCA BPT + TAD K27 / Exponent 27 for integer + JMS STO + JMS STO / Zero high word + TAD INCH / Char value + AND SIXMSK / Convert to sixbit + JMS STO / Store in buffer + CDF 10 / Back to my field + ISZ OFFSET / One more in the buffer +SPC, 240 / Really shouldn't overflow; harmless AND + JMP% STORE / Return +STO, 0 +BUFCDF, HLT / Gets CDF for buffer field + DCA% BPT + ISZ BPT / Next word + JMP% STO / Return if no skip + TAD BUFCDF + TAD BS / Next field + DCA BUFCDF + JMP% STO + +BELL, TAD BEL / Warn the user + JMS% PTTY+1 + JMP GETNXT + +DELETE, TAD OFFSET / How far into the buffer are we? + SNA CLA + JMP BELL / Ignore extra deletes + TAD SCOPE + SNA CLA + JMP DUMBDL / Simple fortran-format delete + TAD BS + JMS% PTTY+1 + TAD SPC + JMS% PTTY+1 + TAD BS + JMS% PTTY+1 + JMP FIXOFF / Fix the offset +DUMBDL, TAD K334 / Backslash + JMS% PTTY+1 +FIXOFF, CLA CMA + TAD OFFSET + DCA OFFSET + JMP GETNXT + +ENTER, TAD CR / Send a RETURN + JMS% PTTY+1 +CLRLP, TAD OFFSET / Is there space available? + TAD BUFSIZ + SMA CLA + JMP CLRDN + TAD SPC + DCA INCH + JMS STORE + JMP CLRLP +CLRDN, CIF CDF 0 + JMP% GETLIN + +BUFSIZ, 0 +SCOPT, 7726 / Scope flag in OS/8 +K200, 200 +MDEL, -377 / Delete +MCR, -215 +CR, 215 +MSPC, -240 +BEL, 207 +LWRA, -341 +LWRZ, -373 +AMINA, -40 / Add to "a" to make "A" +BPT, +BUFFLD, ADDR BUFPT+1 +SCOPE, +BUFPTR, ADDR BUFPT+2 +OFFSET, +PTTY, ADDR TTY +BS, 10 +K334, 334 +CDFG, CDF 0 +K27, 27 +SIXMSK, 77 +FLDMSK, 7 +INCH, 0 + +/ +/ Fortran-callable message printer +/ Put here to avoid wasting the rest of the page. +/ Arguments: +/ BUF Buffer pointer +/ COUNT Number of characters to write, zero to look for end +/ CRFLAG Carriage return flags. +/ Bit 11 (1) = no lead LF +/ Bit 10 (2) = no trail CR +/ Bit 9 (4) = start lowercase +/ + ENTRY SIXOUT +SIXOUT, JA #STRT +#SXR, ORG .+10 + TEXT +SIXOUT+ +#SRET, SETX #SXR + SETB #SBASE + JA .+3 +#SBASE, ORG .+6 +CNT, ORG .+3 +SFLAG, ORG .+3 + + ORG #SBASE+30 + FNOP + JA #SRET + FNOP +#SGOBK, 0;0 +#SRTN, BASE #SBASE + JA #SGOBK +#STRT, STARTD + 0210 + FSTA #SGOBK,0 + 0200 + SETX #SXR + SETB #SBASE + LDX 0,1 + FSTA #SBASE + FLDA% #SBASE,1+ + FSTA BUF / Buffer pointer + FLDA% #SBASE,1+ / Count + FSTA CNT + FLDA% #SBASE,1+ / Carriage control flag + FSTA SFLAG + STARTF + FLDA% CNT + SETX COUNT + ATX 0 + FLDA% SFLAG + ATX 1 + SETX #SXR + TRAP4 SIX8 /Call the 8-mode output routine + JA #SRTN + + FIELD1 SXOUT + ENTRY SIX8 / Mixed case output routine + +SIX8, 0 + TAD CRFLAG /Suppresss carriage control? + RAR /Low bit suppresses lead LF + SZL CLA + JMP .+4 /No leading LF + CDF 10 / My field + TAD LF /Linefeed + JMS% TTYPTR+1 /Output it + TAD CRFLAG + AND K4 /Start in lower case? + SZA CLA + TAD K40 /Yes + TAD HUN /Reset conversion factor + DCA SHIFT + TAD BUF /Buffer field + AND K7 /Just the field bits + CLL RAL + RTL /Into place + TAD CDF0 /Into CDF instruction + DCA CDF1 + TAD CDF1 + DCA CDF2 + TAD COUNT /Get buffer length + SNA + JMP NOTRIM /Zero means it has a terminating "@" +/ +/ Find the end of the string +/ + CLA CMA /End is start + len - 1 + TAD COUNT /String len in words + TAD BUF+1 /End of the string + DCA PTR /Pointer to end + TAD COUNT /Invert count + CMA IAC + DCA COUNT +CDF1, HLT +FNDEND, TAD% PTR + TAD K3740 / - ' ' (two spaces) + SZA CLA / Skip if blank + JMP NONBLK + ISZ COUNT /Count another + SKP + JMP NONBLK /If empty, done + CLA CMA / -1 + TAD PTR + DCA PTR /Back pointer up + JMP FNDEND /Keep looking + +NONBLK, TAD COUNT + SNA CLA /Skip if output left + JMP DONE /Nothing if count zero already +NOTRIM, TAD BUF+1 /Reset pointer to start + DCA PTR +CDF2, HLT + TAD% PTR /Get word + DCA STEMP /Save + TAD STEMP + RTR + RTR + RTR /First sixbit + JMS OUTONE /Convert and output it + TAD STEMP /Second sixbit + JMS OUTONE + ISZ PTR /Bump pointer + SKP /OK if no skip + JMP NEWFLD /Next field otherwise +INCCNT, ISZ COUNT + JMP CDF2 /Keep outputting +DONE, CLA + TAD CRFLAG /Suppress trailing CR? + RTR /2 bit suppresses trailing CR + SZL CLA /If zero, write it. + JMP OUT /Yes, leave now + CDF 10 /My field + TAD CRTN + JMS% TTYPTR+1 +OUT, CIF CDF 0 + JMP% SIX8 + +NEWFLD, TAD CDF1 + TAD K10 /Next field + DCA CDF1 + TAD CDF1 + DCA CDF2 + JMP INCCNT + +OUTONE, 0 + AND K77 /Mask + SNA + JMP DONE / End of string + TAD K7743 / minus '[' + SNA + JMP SETLWR /Set to lowercase shift + TAD K2 / ok, ']'? + SNA + JMP SETUPR /Set to uppercase + TAD K7773 /Restore + SPA + TAD SHIFT /For positive, shift it + TAD K40 /Else it's not alphabetic + CDF 10 /My field + JMS% TTYPTR+1 /Output it + JMP% OUTONE /Done + +SETLWR, TAD K40 /Reset shift +SETUPR, TAD HUN /For upper/lower + DCA SHIFT + JMP% OUTONE + +TTYPTR, ADDR TTY +SHIFT, 140 /Shift value +/ COUNT and CRFLAG must stay together +COUNT, 0 /Num words to output. +CRFLAG, 0 /1 - no leading LF, 2 no trailing CR +PTR, 0 +CRTN, 15 +LF, 12 +K3740, 3740 /minus blank +BUF, 0;0;0 /Buffer 15-bit address +STEMP, 0 +K77, 77 /sixbit mask +K7, 7 +K4, 4 +K40, 40 +CDF0, CDF +HUN, 100 +K7743, 7743 +K7773, 7773 +K10, 10 /Field increment +K2, 2 + + SECT SPEAK +/C +/ SUBROUTINE SPEAK(N) +/C +/C PRINT THE MESSAGE IN RECORD N OF THE RANDOM ACCESS MESSAGE FILE. +/C +/ IMPLICIT INTEGER (A-Z) +/ COMMON /TXTCOM/ RTEXT,LINES,ASCVAR +/ COMMON /ALPHAS/ BLANK,EOF +/ DIMENSION RTEXT(205),LINES(36) +/C + EXTERN IO + EXTERN #HANG + JA #ST +#XR, ORG .+10 + TEXT +SPEAK+ +#RET, SETX #XR + SETB #BASE + JA .+3 +#BASE, ORG .+6 +N, ORG .+3 +#DOTMP, ORG .+3 +BLANK, TEXT + + +EOF, TEXT +>$< + +ONE, F 1.0 +FOUR, F 4.0 + ORG #BASE+30 + FNOP + JA #RET + FNOP +#GOBAK, 0;0 +I, ORG .+0003 +L, ORG .+0003 +OLDLOC, ORG .+0003 + #LBL=. + COMMON TXTCOM +RTEXT, ORG .+1147 +LINES, ORG .+0044 +ASCVAR, ORG .+0003 +TXTLOC, ORG .+0003 +DATA, ORG .+0352 + ORG #LBL +#RTN, BASE #BASE + JA #GOBAK +#ST, STARTD + 0210 + FSTA #GOBAK,0 + 0200 + SETX #XR + SETB #BASE + LDX 0,1 + FSTA #BASE + FLDA% #BASE,1+ + FSTA N + STARTF +/ IF(N.EQ.0)RETURN + FLDA% N + JEQ #RTN +/ READ(2'N) LOC,LINES + FLDA N + STARTD + FSTA #G0002 + STARTF + JSR IO + JA .+0004 +#G0002, JA . +/ IF(LINES(1).EQ.EOF)RETURN + FLDA ONE + ATX 7 + FLDA LINES-0003,7 + FSUB EOF + JEQ #RTN +/1 OLDLOC = LOC +#1, FLDA TXTLOC + FSTA OLDLOC + FLDA ONE + FSTA I + +/ DO 3 I=36,1,-1 +/ Set COUNT to the number of words (36 or 44 octal) + SETX COUNT + LDX 44,0 /44 words + LDX 0,1 /With carriage control + SETX #XR +/ L=I +/3 CONTINUE +/5 TYPE 2,(LINES(I),I=1,L) +#5, FLDA LINEPT + FSTA BUF /Set buffer pointer + TRAP4 SIX8 + + FLDA% N + FADD ONE + FSTA% N + FLDA N +/ READ(2'ASCVAR) LOC,LINES + STARTD + FSTA #G0006 + STARTF + JSR IO + JA .+0004 +#G0006, JA . +/ IF(LOC .EQ. OLDLOC) GO TO 1 + FLDA TXTLOC + FSUB OLDLOC + JEQ #1 + EXTERN #WRITO + TRAP3 #WRITO + JA FOUR + JA #10+2 + EXTERN #RENDO + TRAP3 #RENDO + +/10 RETURN +#10, JA #RTN +/ (1X) + 5061 + 3051 +/2 FORMAT(' ',36A2) PDP/8: (' ',12A6) +LINEPT, ADDR LINES + 0 + END diff --git a/sw/adventure/USR.RA b/sw/adventure/USR.RA new file mode 100644 index 0000000..d31ea66 --- /dev/null +++ b/sw/adventure/USR.RA @@ -0,0 +1,717 @@ +/ SUBROUTINE USR (UNIT, NAME, FUNCT, ERROR) +/ VERSION 01.18 + +/ WRITTEN BY: +/ ROBERT PHELPS +/ BEHAVIOR LAB +/ DEPT. RAD. BIOL. & BIOPHYSICS +/ UNIVERSITY OF ROCHESTER +/ ROCHESTER, NY 14642 +/ +/ THIS ROUTINE ALLOWS RUN-TIME DECLARATION OF FILES +/ IN D.E.C. FORTRAN IV FOR THE PDP-8. +/ +/ DESCRIPTION OF PARAMETERS: +/ +/ UNIT - LOGICAL UNIT NUMBER +/ ONLY NUMBERS 5 THRU 9 ARE ALLOWED. +/ FEWER LOGICAL UNITS MAY BE ALLOWED DEPENDING +/ ON CORE AVAILABILITY -- SEE PROGRAMMING NOTE +/ BELOW. +/ NAME - DEV:FILE.EX +/ STORED IN FORMAT 3A6 OR EQUIVALENT. +/ DEVICE ASSUMED TO BE DSK: IF NOT +/ EXPLICITLY STATED. THIS PARAMETER MAY +/ ALSO BE A HOLLERITH LITERAL. +/ NULL CHARACTERS ('@') AND SPACES +/ ARE IGNORED IN THIS FIELD. +/ FUNCT - FUNCTION: 2 - OPEN FILE FOR INPUT +/ 3 - OPEN FILE FOR OUTPUT +/ 4 - CLOSE OUTPUT FILE +/ THE OUTPUT FILE NAME GIVEN FOR A +/ MUST AGREE WITH THE CORRESPONDING +/ FILE NAME FOR THAT UNIT. CLOSING A FILE +/ WITH 0 BLOCKS OR AN INPUT (FUNCT=2) FILE WILL +/ DELETE THAT FILENAME FROM THE DIRECTORY. +/ ERROR - RETURN ERROR CONDITION +/ 0 - NO ERRORS. +/ 1 - ILLEGAL DEVICE +/ 2 - ILLEGAL FILE NAME +/ 3 - ILLEGAL UNIT NUMBER (CORE EXCEEDED!?) +/ 4 - ILLEGAL FUNCTION CODE +/ +/ USER ERRORS MAY TERMINATE EXECUTION UNLESS THE /E +/ OPTION WAS SPECIFIED TO FRTS. THE FOLLOWING USER +/ ERRORS FROM ARE DEFINED: +/ 0002 - THE USER HAS DEFINED A NON-RESIDENT +/ DEVICE HANDLER EXTERNAL TO . +/ +/ PROGRAMMING NOTE: EACH UNIT IS ASSIGNED 1000(8) LOCATIONS +/IN THE HIGHEST FIELD FOR BUFFER AND HANDLER (400 FOR ITS BUFFER +/AND 400 FOR ITS HANDLER). THESE LOCATIONS ARE +/NOT DYNAMICALLY ALLOCATED BUT ARE USED FOR DEVICE BUFFER AND +/HANDLERS ONLY IF THEY ARE NOT USED BY THE +/PROGRAM. TO USE CORE MOST EFFICIENTLY FOR LARGE +/PROGRAMS, USE THE HIGHEST ORDER UNIT NUMBERS POSSIBLE. THAT IS, +/USING UNIT 5 ALLOWS 1000(8) FEWER WORDS FOR SOURCE CODE THAN IF +/UNIT 6 WERE THE LOWEST UNIT NUMBER USED. +/ +/ RESTRICTIONS: BECAUSE LOADS NON-RESIDENT HANDLERS FROM +/THE TOP OF CORE DOWN, AND ALSO USES THAT AREA, THE USER IS NOT +/ALLOWED TO MAKE LOAD TIME +/I/O UNIT DECLARATIONS TO DEVICES WITH NON-RESIDENT +/HANDLERS EXTERNAL TO . TO DO SO WLL CAUSE A FATAL +/USER ERROR 2. IT IS RECOMMENDED, AND GENERALLY +/MORE CONVIENENT TO USE INTERNAL HANDLERS AND +/DECLARE ALL OTHER FILES AT EXECUTION TIME +/WITH CALLS TO THIS SUBROUTINE. +/THE USE OF INTERNAL HANDLERS, +/SYS:, AND DEVICES CO-RESIDENT WITH SYS: ARE LEGAL, +/EVEN IF DEFINED EXTERNAL TO THIS SUBROUTINE. +/ +/NOTE: THIS PROGRAM REQUIRES ONE PATCH BE MADE TO +/ BEFORE IT WILL RUN. IT IS DESCRIBED +/ BELOW: +/ +/MAXCOR=121 /THESE ARE LOCATIONS IN THE RESIDENT PART OF +/HGHLOC=123 / AND REQUIRE THE FOLLOWING PATCH BE PLACED + /IN FRTS SO THEY WILL BE SET PROPERLY. THE PATCH + /DELETES CODE WHICH INITIALIZES SYSTEMS WITH AN + /ANALEX PRINTER, SO IF YOU HAVE AN ANALEX ... WATCH OUT. + +/Note that MAXCOR and HGHLOC are 2 word variables which have been +/created for this routine on page 0 of FRTS. If FRTS +/is changed to use more page 0 locations, the patch +/will have to be changed as well. + +/ FIELD 1; *2475 +/12475 7300 CLA CLL /Note, CDF CIF 0 is pending +/12476 1311 TAD 12511 /Load address of VAR +/12477 3010 DCA 10010 /Store in auto index +/ 1023 TAD 10023 /Load value of MAX field +/ 3410 DCA I 10010 /As high order part of MAXCOR +/ 3410 DCA I 10010 /Zero low order part +/ 1025 TAD 10025 /Load highest avail. field +/ 3410 DCA I 10010 /Store high order word +/ 1026 TAD 10026 /load high address +/ 3410 DCA I 10010 /Store low order word of HGHLOC +/ 7000 NOP /? +/ 5766 JMP I 12566 /Start up FPP + +/12511 120 /ADDRESS-1 of MAXCOR + + EXTERN CGET + EXTERN CPUT + DSRN=4244 /Address of DSRN table in FRTS + + SECT USR + JA #ST + +/NOTE: MUCH OF THIS CODE WAS LIFTED FROM A FORTRAN +/ GENERATED ASSEMBLY LISTING. ACCEPT THIS AS +/ AN APOLOGY FOR THE LACK OF COMMENTS IN SOME SECTIONS. +/ +#XR, ORG .+10 + TEXT +USR + + +#RET, SETX #XR + SETB #BASE + JA .+3 +#BASE, ORG .+6 /BASE 0 AND 1 +UNIT, ORG .+3 /BASE 2 +FUNCT, ORG .+3 /BASE 3 +ERROR, ORG .+3 /BASE 4 +#DSK, TEXT +DSK@@@+ /DEFAULT DEVICE NAME +I, F 0.0 /BASE 6 +N, F 0.0 /BASE 7 + ORG #BASE+30 + FNOP + JA #RET + FNOP +#GOBAK, 0;0 + +PERFLG, F 0.0 /PERIOD FLAG +X, +#TMP, ORG .+3 +ONE, F 1.0 +TWO, F 2.0 +THREE, F 3.0 +FOUR, F 4.0 +SEVEN, F 7.0 +MUNIT, 0027;0;0 /Low unit: Set according to CORE avail. +NINE, F 9.0 +TEN, F 10.0 +ATEEN, F 18.0 +COLON, F 58.0 +PERIOD, F 46.0 +SPACE, F 32.0 +MAXCOR, 0; 7; 0 /RHM: Don't require the FRTS patch. +HGHLOC, 0; 7; 2000 /RHM: Hope memory used doesn't get larger. +/ ADVENT in the current implementation uses up thru 71000 at worst. +/ This hopefully allows room for extra 2-page handlers and the TD8E ROM. +#RTN, BASE #BASE + JA #GOBAK +#ST, STARTD + 0210 + FSTA #GOBAK,0 + 0200 + SETX #XR + SETB #BASE + LDX 0,1 + FSTA #BASE + FLDA% #BASE,1+ + FSTA UNIT + FLDA% #BASE,1+ + FSTA NAME + FLDA% #BASE,1+ + FSTA FUNCT + FLDA% #BASE,1+ + FSTA ERROR + +/ INITIALIZE PROGRAM + +SKIP, /JA SKIP2 AFTER FIRST ENTRY + +/ FIND OUT HOW MANY UNITS TO ALLOW + +/Note that the original scheme was rather bizzare, and for +/humerous purposes, I have left it here, commented out. +/This worked OK with the old FPP interpreter, since it zeroed +/the exponent with a STARTF. The FPP does not, and the +/EXPONENT is left indeterminate. This meant that sometimes +/you could use past 72400, and sometimes you couldn't. +/(Note, that S.B.'s version of FRTS has been changed +/so that the FPP interpreter works the same as the FPP.) + +/ FLDA MAXCOR /Load highest field number +/ FSUB HGHLOC /Subtract high location +/ FADD D2400 /1 FIELD LESS 5400 LOCS FOR 5 DEVICES + / NOTE: PG. 7600 RESERVED FOR OS/8 + / PG. 7400 USED FOR OS/8 USR CALL +/ JGE SKCONT /ROOM FOR 5 DEVICES? +/ FADD D15000 /Note, FAC= how many locations short +/ FMUL D1000 /HOW MANY 1000 WORD BLOCKS ARE THERE? +/ STARTF +/ FNORM +/ FMUL E30 /ALTHOUGH WE WERE WORKING WITH AN +/ /INTEGER ABOVE, THE FPP THOUGHT IT +/ /HAD A BINARY POINT TO THE RT. OF THE +/ /SIGN BIT. THIS INSTRUCTION EFFECTIVELY +/ /CHANGES THE NUMBER TO A REAL FPP INTEGER. +/ FSTA MUNIT /MINIMUM UNIT # ALLOWED +/D15000, 1;5000 +/D1000, 4;0 /0.001 +/E30, 30;2000;0 /1.E30(2) + +/The routine should really be modified to check which handlers +/are already loaded. This wouldn't be all that difficult, +/since the field 1 tables of handler residency are saved on +/SYS block 37, and restored each time USR is called. As long +/as a reset isn't performed, it should be easy to determine +/if a handler is already loaded. Then HGHLOC could be changed +/dynamically, as handlers were loaded. The core usage would then +/also be independent of the unit number used. + + FLDA MAXCOR /Load Max field # + FADD D7400 /Offset to highest useable address + FSUB HGHLOC /Compute locations available + LDX 11,1 /Load shift argument + ALN 1 /Divide by 1000 + FSTA MUNIT+1,0 /Store number of units + STARTF + FLDA TEN /Load MAX units+1 + FSUB MUNIT /Subtract number of units + FSTA MUNIT /Store new minimum unit + FSUB THREE /Limit min. to three + JGE SKCONT /Ok if greater than 2 + FLDA THREE /Just in case we need to avoid + FSTA MUNIT /field boundary problems + +SKCONT, STARTD + SETX MAXCOR+1 + XTA 0 /GET HIGHEST FIELD + FDIV D10X /PUT IT INTO BITS 6-8 OF LO ORDER WORD + SETX LHIFLD + ATX 0 /LOAD HIGHEST FIELD INTO LHIFLD + FADD DCDF /MAKE IT CDF HIFLD + SETX FD1 + ATX 0 /SET LOCATIONS USING IT + SETX FD2 + ATX 0 + FADD ONED /MAKE IT CIF HIFLD + SETX FI1 + ATX 0 + SETX #XR + +/ CHECK TO MAKE SURE USER DID NOT DECLARE +/ DEVICE WITH HANDLER EXTERNAL TO THESE ROUTINES. + + FLDA SKIPJA /SET INSTRUCTION SO THIS CODE + FSTA SKIP,0 / EXECUTES ONLY ONCE. +/ + FLDA SXDSRN /INITIALIZE SETX INSTRUCTION + FSTA SKCON2 + LDX -11,6 /SET COUNTER (MAX # DSRN ENTRIES) +SKCON2, SETX DSRN /STUFFED AND MODIFIED + XTA 0 /GET NEXT HANDLER ENTRY POINT + SETX #XR + FSUB D5200 + JLT SKCON3 /INTERNAL HANDLER, IT'S OK + FSUB D2400 + JGT SKCON3 /RESIDENT HANDLER (E.G. SYS:), IT'S OK TOO + LDX 2,0 /***SOME OTHER HANDLER***USER ERROR 2 +EXTERN #UE + TRAP3 #UE /USER ILLEGALLY DECLARED A FILE! +/ +SKCON3, FLDA NINED /INCREMENT TO NEXT DSRN ENTRY + FADDM SKCON2 + JXN SKCON2,6+ +/ +SKIP2, STARTF /***END OF INITILIZATIN CODE*** + LDX 1,7 + FCLA /INITIALIZE SOME VARIABLES... + FSTA PERFLG /NO PERIODS YET + FSTA FILE-0003,7 + FSTA FILE-0003,7+ + FLDA #DSK /SETUP DEFAULT DEVICE + FSTA DEV + FLDA ONE /FIRST CHARACTER IS # 1 + FSTA N + FLDA% UNIT /CHECK FOR LEGAL UNIT # + FSUB MUNIT + JSA #LT / IF (UNIT.LT.MUNIT.OR.UNIT.GT.9) GO TO 900 + FSTA #TMP+00 + FLDA% UNIT + FSUB NINE + JSA #GT + FADD #TMP+00 + JNE #900 + FLDA% FUNCT /CHECK FOR LEGAL FUNCTION CODE + FSUB TWO + EXTERN #LT + JSA #LT / IF (FUNCT.LT.2.OR.FUNCT.GT.4) GO TO 901 + FSTA #TMP+00 + FLDA% FUNCT + FSUB FOUR + EXTERN #GT + JSA #GT + FADD #TMP+00 + JNE #901 +/ +/ PUT DEV:FILE.EXT INTO CORRECT FORMAT FOR USR CALL +/ + FLDA ONE + FSTA I / DO 100 I=1,18 + +#G0002, JSR CGET / CALL CGET (NAME, I, X) + JA .+10 +NAME, JA . + JA I + JA X + FLDA X / IF (X.NE.COLON) GO TO 40 + FSUB COLON + JNE #40 + FLDA I /COLON MUST BE COLUMN 6 OR BEFORE + FSUB SEVEN /7 + JGE #DONE + FLDA FILE /COLON DEFINES DEVICE NAME + FSTA DEV + FCLA + FSTA FILE + FLDA ONE + FSTA N + JA #100 + +#40, FLDA X / IF (X.NE.PERIOD) GO TO 60 + FSUB PERIOD + JNE #60 + FLDA PERFLG /ONLY ONE PERIOD ALLOWED + JNE #DONE + FLDA SEVEN /SET TO DECODE EXTENSION + FSTA PERFLG + FSTA N + JA #100 + +#60, FLDA X + JEQ #100 /SKIP OVER NULL'S + FSUB SPACE + JEQ #100 /SKIP OVER SPACES + JSR CPUT / CALL CPUT (FILE, N, X) + JA .+10 + JA FILE + JA N + JA X + FLDA N / N=N+1 + FADD ONE + FSTA N + +#100, FLDA I / 100 CONTINUE + FADD ONE + FSTA I + FSUB ATEEN + JLE #G0002 + +#DONE, FLDA% FUNCT + FSUB FOUR + JNE #101 /FUNCTION = CLOSE ? + EXTERN #ENDF + FLDA% UNIT /YES - END FILE + TRAP3 #ENDF + +#101, SETX FUNCTX /USR XR TO PASS PARAMETERS + FLDA% FUNCT + ATX 0 + FLDA% UNIT + ATX 1 + + TRAP4 #USRSE /TRAP TO THE USR CALLING ROUTINE + + XTA 2 /GET ERRNO AND RETURN IT + FSTA% ERROR + JA #RTN +#900, FLDA THREE /ILLEGAL UNIT NUMBER!!! + FSTA% ERROR + JA #RTN + +#901, FLDA FOUR /ILLEGAL FUNCTION CODE!!! + FSTA% ERROR + JA #RTN +/ +SKIPJA, JA SKIP2 +DCDF, 0;CDF +ONED, 0;1 +D10X, 400;0 /0.1 +D10, 0;10 +SXDSRN, SETX DSRN +NINED, 0;11 +D5200, 0;5200 +D2400, 0;2400 +D7400, 0;7400 + +SECT8 #USRSE; 0 +/ +/THIS ROUTINE SETS UP, ON PAGE 7400 OF THE HIGHEST FIELD, A +/ROUTINE WHICH CALLS THE OS/8 USR (USER SERVICE ROUTINE). +/IT IS NECESSARY TO DO THIS BECAUSE THE FORTRAN IV LOADER +/MAY LOAD ANY ROUTINE IN THE RESERVED AREA FOR +/THE OS/8 USR (10000 - 11777). +/ +/ THIS PROGRAM ALSO REQUIRES +/ THAT 'HKEY' BE THE LOCATION IN AS DEFINED +/ BELOW: + +HKEY=2761 +DSRN=4244 /Address of DSRN table in FRTS + +/ +/IN CASE CLOSE FUNCTION, GET # BLOCKS WRITTEN +/ + TAD UNITX + CLL RTL /MULTIPLY BY 9 + RAL + TAD UNITX + TAD K6 /OFFSET TO CURRENT BLOCK + TAD LDSRN /START OF DSRN TABLE - 11 + DCA TEMQ + CDF 0 + TAD% TEMQ + DCA SB +/ +/MOVE USR CALLING ROUTINE TO DEFINED LOCATION +/ I.E. PROTECT LOCS 10000-11777 +/ + TAD K7400 /Target address + DCA TEMQ /Store for indirect reference + TAD #LUSR+1 /Origin address + DCA TEMQ2 /Store for indirect reference + TAD M200 /Number of words to move + DCA TEMQ3 /Store in a counter + TAD #LUSR /Load field word + AND K7 /Strip it + CLL RTL /Into right bits + RAL + TAD #CDF + DCA .+1 /Store the CDF +FUSR, HLT /Set field where USR loads + TAD% TEMQ2 /Load routine location +FD1, CDF 00 /Set HIGH field + DCA% TEMQ /Store location in high field + ISZ TEMQ /Bump the pointers + ISZ TEMQ2 + ISZ TEMQ3 /And the counters + JMP FUSR /Loop on it + +/SET FIELDS AND CALL IT + + RIF /GET CURRENT FIELD + TAD #CDF + DCA .+1 + HLT /Set this field +FI1, CIF 00 /Set high field + TAD FUNCTX /Load function number + JMS% K7400 /Call routine +SB, 0 /START BLOCK OF FILE OR LENGTH IF CLOSE +NOBLKS, 0 /LENGTH OF FILE +ENTPT, 0 /HANDLER ENTRY POINT + DCA ERRUSR /SAVE ERROR RETURN VALUE + +/SETUP TO MOVE DSRN TABLE APPROPRIATELY + + TAD UNITX + CLL RTL /MULTIPLY BY 9 + RAL + TAD UNITX + TAD LDSRN + DCA TEMQ +#CDF, CDF 0 + DCA% TEMQ /DISABLE FILE IN CASE CLOSE FUNCTION + CLA CLL CMA RTL /-3 => AC + TAD FUNCTX + SMA SZA CLA /CLOSE? + JMP USRSL5 /YES + +/MOVE HANDLER TO APROPRIATE BUFFER + + CLA CMA CLL RAL /-2 => AC + TAD UNITX + CLL RTR + RTR /UNIT 9 => AC=7000; UNIT 8 => AC=6000 + TAD M400 + DCA LHNDR /LOCATION FOR THIS UNIT'S HANDLER + TAD K5200 + DCA TEMQ2 + TAD M400 + DCA TEMQ3 +USRL4, CDF 0 + TAD% TEMQ2 +FD2, CDF 00 + DCA% LHNDR + ISZ TEMQ2 + ISZ LHNDR + ISZ TEMQ3 + JMP USRL4 + +/BUILD UP NEW DSRN TABLE FOR THIS UNIT + + CDF 0 + TAD ENTPT + DCA% TEMQ /ENTRY POINT + ISZ TEMQ + CLL CML RTL /2 => AC (FORMS CONTROL BIT) + TAD LHNDR + TAD M400 + TAD LHIFLD + DCA% TEMQ /HANDLER CODE WORD + TAD K7774 /*K* KLUDGE TO LET FRTS KNOW WHICH + AND% TEMQ / HANDLER IS IN CORE + DCA% #HKEY + ISZ TEMQ + TAD LHNDR + TAD LHIFLD + DCA% TEMQ /BUFFER ADDRESS & FIELD + ISZ TEMQ + TAD LHNDR + DCA% TEMQ /CHARACTER POINTER + ISZ TEMQ + CMA CLL RTL /-3 => AC + DCA% TEMQ /CHARACTER COUNTER + ISZ TEMQ + TAD SB + DCA% TEMQ /START BLOCK + ISZ TEMQ + DCA% TEMQ /RELATIVE BLOCK + ISZ TEMQ + TAD NOBLKS + DCA% TEMQ /LENGTH OF FILE + ISZ TEMQ + DCA% TEMQ /STATUS WORD + +USRSL5, CDF CIF 0 + JMP% #USRSE + + +K6, 6 +K7400, 7400 +M200, -200 +M400, -400 +K7, 7 +K5200, 5200 + +LDSRN, DSRN-11 /START LOCATION OF DSRN TABLE + +LHIFLD, 0 +TEMQ, 0 +TEMQ2, 0 +TEMQ3, 0 +LHNDR, 0 +FUNCTX, 0 /STUFFED BY RALF CODE +UNITX, 0 /STUFFED BY RALF CODE +ERRUSR, 0 /READ BY RALF CODE + +#LUSR, ADDR #USR +#HKEY, HKEY /LOCATION OF HKEY IN FRTS + / MUST AGREE WITH VERSION!! +K7774, 7774 +/ + ORG .+177&7600 +/USR CALLING SUBROUTINE FOR FORTRAN +/ +/ THIS ROUTINE IS MOVED TO PAGE 7400 OF THE HIGHEST +/ FIELD BEFORE EXECUTING TO AVOID BEING OVERWRITTEN BY THE USR +/ ROUTINE. NO FILE SPECIFICATIONS OTHER THAN INTERNAL +/ HANDLERS AND SYSTEM DEVICES MAY BE MADE EXTERNAL TO THESE +/ ROUTINES BECAUSE THE USE OF THIS ROUTINE WILL OVERWRITE +/ THE HANDLERS WHICH ARE STORED IN HIGH CORE. +/ +/ +#USR, 0 +/ +/ ENTER WITH FUNCTION CODE IN THE AC +/ 2 - LOOKUP (OPEN FOR INPUT) +/ 3 - ENTER (OPEN FOR OUTPUT) +/ 4 - CLOSE (CLOSE OUTPUT FILE) +/ +/ DEVICE AND FILE NAMES ARE STUFFED BY THE CALLING +/ PROGRAM BEFORE THIS SUBROUTINE IS CALLED. +/ +/ CALLING SEQUENCE: +/ JMS #USR +/ START BLOCK OF FILE (RETURNED FOR CODE 2 & 3) +/ # BLOCKS SUPPLIED IF CODE 4 +/ NUMBER OF BLOCKS IN FILE (RETURNED FOR CODE 2 & 3) +/ ENTRY POINT OF HANDLER AS READ INTO PAGE 5200 +/ +/ +/ AC ON EXIT CONTAINS ERROR CONDITION: +/ 0 - NO ERROR +/ 1 - ILLEGAL DEVICE +/ 2 - ILLEGAL FILE NAME +/ + DCA FUNCTY /SAVE FUNCTION CODE + TAD% #USR /GET # BLOCKS IN CASE CLOSE FUNCTION + DCA #BLKS + + RDF /SET INSTRUCTION FIELD FOR RETURN + TAD #CIF + DCA EXIT4 + CMA /MAKE IT CDF + TAD EXIT4 + DCA EXIT + DCA ERRNO /INITIALIZE ERROR RETURN VARIABLE + CMA + TAD #CIF /-1 IN AC MAKES IT CDF + RIF + DCA .+1 + HLT /SET DATA FIELD TO CURRENT FIELD + +/ ********SWAP CORE FOR USR CALL + +/Note, that it would be much simpler to read in the field +/one tables, and call USR at 17700. Let USR do the swapping. +/We must only set the correct bits in the JSW. + + IOF +#CIF, CIF 0 + JMS% K7607 /CALL SYSTEM HANDLER + 5210 / WRITE 17400-17777,10000-11777 + 7400 + 27 + HLT /DEVICE ERROR + + CIF 0 + JMS% K7607 /READ IN USR + 610 + 0 + 13 /From block 13 + HLT + + CIF 0 + JMS% K7607 /READ IN FIELD ONE TABLES + 210 + 7400 + 37 /From block 37 (where FRTS put it) + HLT + +/ ********PERFORM USR FUNCTIONS + + CIF 10 + JMS% K200 /RESET tables, so it looks like no handlers + 13 + 0 + + TAD K5201 /SET PAGE FOR HANDLER (allow 2 page handler) + DCA ENTRY + CIF 10 + JMS% K200 /FETCH + 1 +DEV, 0 /(STUFFED BY RALF ROUTINE) +DEVNO, 0 +ENTRY, 5201 + JMP ERR /ILLEGAL DEVICE + + TAD #LFILE /SET POINTER TO FILE + TAD KOFSET + DCA LFILE + TAD DEVNO /GET DEVICE NUMBER + CIF 10 + JMS% K200 /PERFORM FUNCTION +FUNCTY, 0 +SB2, +LFILE, 0 +#BLKS, 0 + JMP ERR2 /FILE ERROR + +/ ********RESTORE CORE + +EXIT2, CIF 0 + JMS% K7607 /SAVE FIELD ONE TABLES + 4210 /? Is this really necessary? + 7400 /Since they've already been saved? + 37 /by FRTS + HLT + + CIF 0 /USROUT function would do this + JMS% K7607 /Read in the Stuff we saved + 1210 + 7400 + 27 + HLT + + ION /Is this necessary? +EXIT, HLT + TAD SB2 /RETURN SB & #BLKS + DCA% #USR + ISZ #USR + TAD SB2 + SZA CLA /NON-FILE STRUCTURED DEVICE? + JMP .+3 + CMA /YES - SET MAX NUMBER OF BLOCKS + JMP .+3 + TAD #BLKS + CIA + DCA% #USR + ISZ #USR + TAD ENTRY + DCA% #USR + ISZ #USR + TAD ERRNO +EXIT4, HLT + JMP% #USR + + +K7607, 7607 /SYSTEM HANDLER ENTRY POINT +K200, 200 /USR ENTRY POINT +K5201, 5201 /PAGE FOR HANDLER (& TWO PAGES AVAILABLE) + +ERR2, CLA IAC /ILLEGAL FILE NAME +ERR, IAC /ILLEGAL DEVICE NAME + DCA ERRNO + JMP EXIT2 +ERRNO, 0 + +#LFILE, AND FILE /LOCATION OF FILE ON PAGE 7400 + /'AND' NEEDED TO TRICK ABSOLUTE REFERENCE + /CHECK IN RALF. +KOFSET, 7200 /OFFSET TO REAL EXECUTION ADDRESS +FILE, 0;0;0;0;0;0;0;0;0 + diff --git a/sw/adventure/VOCAB.RA b/sw/adventure/VOCAB.RA new file mode 100644 index 0000000..555a462 --- /dev/null +++ b/sw/adventure/VOCAB.RA @@ -0,0 +1,152 @@ + SECT VOCAB + EXTERN SIXOUT +/ SUBROUTINE VOCAB(ID1,ID2,INIT,V) +/ OS/8: SUBROUTINE VOCAB(ID, INIT, V) +/C +/C LOOK UP ID1:ID2 IN THE VOCABULARY (ATAB AND A2TAB) +/C Note: A2TAB not used on the '8 +/C AND RETURN ITS "DEFINITION" (KTAB), OR +/C -1 IF NOT FOUND. IF INIT IS POSITIVE, THIS IS AN INIT CALL SETTING +/C UP A KEYWORD VARIABLE, AND NOT FINDING IT CONSTITUTES A BUG. IT ALSO MEANS +/C THAT ONLY KTAB VALUES WHICH TAKEN OVER 1000 EQUAL INIT MAY BE CONSIDERED. +/C (THUS "STEPS", WHICH IS A MOTION VERB AS WELL AS AN OBJECT, MAY BE LOCATED +/C AS AN OBJECT.) AND IT ALSO MEANS THE KTAB VALUE IS TAKEN MOD 1000. +/C +/ IMPLICIT INTEGER (A-Z) +/ COMMON /VOCCOM/ KTAB,ATAB,A2TAB,TABSIZ +/ DIMENSION KTAB(300),ATAB(300),A2TAB(300) + + EXTERN BUG + EXTERN MOD + JA #ST +#XR, ORG .+10 + TEXT +VOCAB+ +#RET, SETX #XR + SETB #BASE + JA .+3 +#BASE, ORG .+3 +ID, ORG .+3 +INIT, ORG .+3 +ONE, F 1.0 +FOUR, F 4.0 +THOUS, F 1000.0 +TWO, F 2.0 +SIX, F 6.0 + ORG #BASE+30 + FNOP + JA #RET + FNOP +#GOBAK, 0;0 +#VAL, ORG .+6 +ZERO, F 0.0 +I, ORG .+3 +KTABI, ORG .+3 +K21, F 21.0 +K5, F 5.0 + #LBL=. + COMMON VOCCOM +KTAB, ORG .+1604 +ATAB, ORG .+1604 +TABSIZ, ORG .+3 + ORG #LBL +#RTN, BASE #BASE + FLDA #VAL + JA #GOBAK +#ST, STARTD + 0210 + FSTA #GOBAK,0 + 0200 + SETX #XR + SETB #BASE + LDX 0,1 + FSTA #BASE + FLDA% #BASE,1+ + FSTA ID + FLDA% #BASE,1+ + FSTA INIT + STARTF + FLDA% INIT + FSTA INIT + FLDA% ID + FSTA ID +/ DO 1 I=1,TABSIZ + FLDA ONE + FSTA I + +/ IF(KTAB(I).EQ.-1)GOTO 2 +#G0001, FLDA I + ATX 7 + FLDA KTAB-3,7 + FSTA KTABI + FADD ONE + JEQ #2 +/ IF(INIT.GE.0.AND.KTAB(I)/1000.NE.INIT)GOTO 1 + FLDA INIT + JLT #M1 + FLDA KTABI + FDIV THOUS + EXTERN #FIX + JSA #FIX + FSUB INIT + JNE #1 +/ IF(ATAB(I).EQ.ID1 .AND. A2TAB(I).EQ.ID2)GOTO 3 +/ OS/8: IF(ATAB(I).EQ.ID)GOTO 3 +#M1, FLDA ATAB-0003,7 + FSUB ID + JEQ #3 +/1 CONTINUE +/ do loop end +#1, FLDA I + FADD ONE + FSTA I + FSUB TABSIZ + JLE #G0001 +/ CALL BUG(21) + JSR BUG + JA .+0004 + JA K21 + +/2 V=-1 +#2, FLDA ONE + FNEG + FSTA #VAL +/ IF(INIT.LT.0)RETURN + FLDA INIT + JLT #RTN + +/ TYPE 100,ID +#G0002, JSR SIXOUT + JA .+10 + JA #100 + JA ZERO + JA TWO + + JSR SIXOUT + JA .+10 + JA ID + JA TWO + JA ONE + +/ CALL BUG(5) + JSR BUG + JA .+0004 + JA K5 + +/3 V=KTAB(I) +#3, FLDA KTABI + FSTA #VAL +/ IF(INIT.GE.0)V=MOD(V,1000) + FLDA INIT + JLT #RTN + JSR MOD + JA .+0006 + JA #VAL + JA THOUS + FSTA #VAL +/ RETURN +/ END + JA #RTN +/100 FORMAT(' KEYWORD = ',2A2) +/ OS/8: ,A4 +#100, TEXT 'K]EYWORD = @' + END diff --git a/sw/adventure/YES.FT b/sw/adventure/YES.FT new file mode 100644 index 0000000..c53606d --- /dev/null +++ b/sw/adventure/YES.FT @@ -0,0 +1,22 @@ + LOGICAL FUNCTION YES(X,Y,Z) +C +C PRINT MESSAGE X, WAIT FOR YES/NO ANSWER. IF YES, PRINT Y AND LEAVE YEA +C TRUE; IF NO, PRINT Z AND LEAVE YEA FALSE. SPK IS EITHER RSPEAK OR MSPEAK. +C + INTEGER REPLY,X,Y,Z +C +1 IF(X.NE.0)CALL RSPEAK(X) + CALL GETIN(REPLY,JUNK1,JUNK2,JUNK3) + IF(REPLY.EQ.'YES'.OR.REPLY.EQ.'YE'.OR.REPLY.EQ.'Y')GOTO 10 + IF(REPLY.EQ.'NO' .OR. REPLY.EQ.'N')GOTO 20 +C WRITE(4,9) +C9 FORMAT(/' PLEASE ANSWER THE QUESTION.') + CALL SIXOUT('P]LEASE ANSWER THE QUESTION.',15,0) + GOTO 1 +10 YES=. TRUE. + IF(Y.NE.0)CALL RSPEAK(Y) + RETURN +20 YES=.FALSE. + IF(Z.NE.0)CALL RSPEAK(Z) + RETURN + END -- 2.32.0