C THIS IS THE FIRST LINE OF ADVENTURE, MAIN MODULE. SUBROUTINE AMAIN C CURRENT LIMITS: C 20000 WORDS OF MESSAGE TEXT (LINES, LINSIZ). C 1600 TRAVEL OPTIONS (TRAVEL, TRVSIZ). C 600 VOCABULARY WORDS (KTAB, ATAB, TABSIZ). C 250 LOCATIONS (LTEXT, STEXT, KEY, LOCCON, ABB, ATLOC, C LOCSIZ, MAXLOC). C 150 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, POINTS, C HOLDER, HLINK, OBJCND, OBJCON, PROP, WEIGHT, MAXOBJ). C 60 "ACTION" VERBS (ACTSPK, VRBSIZ, VKEY). C 300 VERB/PREP/OBJ COMBINATIONS (PTAB, PTBSIZ). C 50 ADJECTIVES (ADJKEY, ADJSIZ) C 150 MODIFIED NOUNS (ADJTAB, MAXOBJ) C 400 RANDOM MESSAGES (RTEXT, RTXSIZ). C 12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX). C 20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ, HNTMIN). C 35 MAGIC MESSAGES (MTEXT, MAGSIZ). 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 OF ANY CLASS.) THESE UPPER C LIMITS ARE: C 1000 NON-SYNONYMOUS VOCABULARY WORDS OF EACH CLASS. CURRENTLY DEFINED C CLASSES ARE: C 1. MOTION/DIRECTION WORDS (EAST, WEST, UP, JUMP, ETC.) C 2. NOUNS/OBJECTS (LAMP, KEYS, TROLL, ETC.) C 3. ACTION VERBS, TRANSITIVE & INTRANSITIVE (TAKE, DROP, KILL, IN C 4. MISCELLANEOUS WORDS; MOSTLY THINGS OR ACTIONS WHICH GENERATE C FIXED REPLIES (FEE-FIE-FOE-FOO, TREE, CAVE, CURSES) C 5. PREPOSITIONS, DUPLICATES MANY WORDS IN SECTION 1. C 6. ADJECTIVES C 7. CONJUNCTIONS C 450 LOCATIONS C 100 OBJECTS WHICH CAN BE USED IN TRAVEL TABLE (PLUS 900 MORE, WHICH CAN' 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 TAB, AND A LINE OF TEXT. THE SET OF (NECESSARILY ADJACENT) LINES C WHOSE NUMBERS ARE X FORM THE LONG DESCRIPTION OF LOCATION X. C C SECTION 2: SHORT FORM DESCRIPTIONS. SAME FORMAT AS LONG FORM. NOT ALL C PLACES HAVE SHORT DESCRIPTIONS. C C SECTION 3: VOCABULARY. EACH LINE CONTAINS A NUMBER (N), A TAB, AND A C FIVE-LETTER WORD. CALL M=N/1000. IF M=0, THEN THE WORD IS A MOTION C VERB FOR USE IN TRAVELLING (SEE SECTION 4). ELSE, IF M=1, THE WORD IS C AN OBJECT. ELSE, IF M=2, THE WORD IS AN ACTION VERB (SUCH AS "CARRY" C OR "ATTACK"). ELSE, IF M=3, THE WORD IS A SPECIAL CASE VERB (SUCH AS C "DIG") AND N MOD 1000 IS AN INDEX INTO SECTION 6. OBJECTS FROM 50 TO C (CURRENTLY, ANYWAY) 79 ARE CONSIDERED TREASURES (FOR PIRATE, CLOSEOUT). C C SECTION 4: TRAVEL TABLE. EACH LINE CONTAINS A LOCATION NUMBER (X), A SECOND C LOCATION NUMBER (Y), AND A LIST OF MOTION VERBS (SEE SECTION 3). 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<=MAXLOC IT IS THE LOCATION TO GO TO. C IF MAXLOC500 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$<". NOTE THAT C OBJECTS WITH N>100 CANNOT BE USED FOR CONDITIONAL MOTIONS IN C TRAVEL TABLE. C 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 3). C C SECTION 7: CONTAINS LOTS OF OBJECT INFO: C (1) OBJECT LOCATIONS & WEIGHTS. EACH LINE CONTAINS AN OBJECT NUMBER C AND ITS 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. IF THE OBJECT IS MOVABLE, IT C HAS A THIRD NUMBER WHICH IS ITS RELATIVE WEIGHT. C (2) DEFAULT OBJECT NAMES. TEN CHARACTER MAXIMUM, TO PERMIT PRINTING C OBJECT NAMES WHEN HERO SAYS 'TAKE ALL' OR SUCH. C (3) POINTS. OBJECT NUMBER, A SCORE C VALUE, A PROP VALUE, AND A LOCATION NUMBER. THE SCORE IS C FOR LEAVING IT AT THE NAMED LOCATION WITH THE RIGHT PROP VALUE. C SCORES ARE ASSIGNED ON A DIFFICULTY SCALE OF 1-5 (1 IS C FOR EASY TREASURES; 5 IS FOR REAL HARD ONES), AND ARE MULTIPLIED C BY SOME APPROPRIATE FACTOR AT SCORING TIME. C 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 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 LOCCON(LOC C FOR EACH LOC GIVEN. THE COND BITS CURRENTLY ASSIGNED ARE: C 0 LIGHT C 1 IF BIT 3 IS ON: ON FOR OIL, OFF FOR WATER C 2 IF BIT 3 IS ON: ON FOR WINE, OFF FOR WATER & OIL C 3 LIQUID ASSET, SEE BITS 1 & 2 C 4 PIRATE DOESN'T GO HERE UNLESS FOLLOWING PLAYER C 5 ALL LOCATIONS IN EITHER 'PORTAL'; I.E., NOT OUTSIDE C CAVE, BUT NOT FAR IN C 6 ALL LOCATIONS OUTSIDE THE CAVE C OTHER BITS ARE USED TO INDICATE AREAS OF INTEREST TO "HINT" ROUTINES: C 7 LOST IN MAZE C 8 PONDERING DARK ROOM C 9 AT WITT'S END C 10 TRYING TO EXTRACT SWORD C 11 TRYING TO GO UP SLIDE C 12 TRYING TO GET INTO CAVE VIA SEA ENTRANCE C 13 TRYING TO FIND CAVE (ANY ENTRANCE) C 14 TRYING TO CATCH BIRD C 15 TRYING TO GET OVER THE RAINBOW C 16 STYMIED BY DOG C 17 TRYING TO DEAL WITH SNAKE C LOCCON(LOC) IS SET TO 2, OVERRIDING ALL OTHER BITS, IF LOC HAS FORCED C MOTION. C 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 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-6 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). HNTMIN IS SET TO THE NUMBER OF THE FIRST USABLE HINT. C 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 C SECTION 14: PREPOSITION TABLE. EACH LINE CONTAINS A VERB, A PREPOSITION C AND VALID OBJECTS FOR THAT VERB/PREP COMBINATION. THEY ARE CONVERTED C INTO TWO TABLES SIMILAR IN FORMAT TO THE TRAVEL TABLE. THE FIRST C TABLE, VKEY, HAS ONE ENTRY PER VERB. A ZERO ENTRY INDICATES NO C PREPOSITION IS VALID WITH THAT VERB. A NON-ZERO ENTRY POINTS TO THE C BEGINNING OF THE PREP/OBJ LIST FOR THAT VERB. THE POSITION OF THE C ENTRY IN VKEY CORRESPONDS TO THE VERB NUMBER. THE PREP/OBJ LIST, C PTAB, FOR A GIVEN VERB CONSISTS OF A SERIES OF ONE-WORD ENTRIES C DELIMITED BY A NEGATIVE ENTRY. EACH WORD CONTAINS THE PREPOSITION C NUMBER TIMES 1000 PLUS THE NUMBER OF A VALID OBJECT. A SCHEMATIC C FOLLOWS. ENTRIES IN VKEY ARE REPRESENTED BY V1, V2, ... VN. C ENTRIES IN PTAB ARE REPRESENTED BY P1, P2, ..., PN (PREPOSITIONS), C AND OB1, OB2,..., OBN (OBJECTS). C C I VKEY(I) PTAB(J) J C - ------- ------- - C 1. V1==========>> P1,OB1 1. C P1,OB2 2. C P1,OB3 3. C P1,OB4 4. C P1,OB5 5. C P2,OB1 6. C P2,OB2 7. C P3,OB1 8. C P3,OB2 9. C P3,OB3 10. C -P3,OB4 11. C 2. V2==========>> P1,OB1 12. C P1,OB2 13. C P2,OB1 14. C -P3,OB1 15. C 3. 0 (THE VERB CORRESPONDING TO THIS POSITION TAKES NO PREPOSITION C 4. V3==========>> P1,OB1 16. C -P2,OB1 17. C C SECTION 15: OBJECT ATTRIBUTES. EACH LINE CONTAINS A BIT NUMBER AND C UP TO 20 OBJECT NUMBERS. BIT N (WHERE ZERO IS THE UNITS BIT) IS SET C IN OBJCON(OBJ) FOR EACH OBJECT GIVEN. THE BITS CURRENTLY ASSIGNED C ARE: C 1 THE OBJ CAN BE OPENED/CLOSED. (DOORS, GRATE, CLAM, ETC.) C 2 THE OBJ IS CURRENTLY OPEN. C 3 IT HAS A LOCK. (GRATE, CHAIN, ELFIN DOOR, ETC.) C 4 IT IS CURRENTLY LOCKED. C 5 FLAMMABLE. (IT WILL BURN IF IGNITED.) C 6 IT IS CURRENTLY BURNING. C 7 EDIBLE. FOOD, MUSHROOMS, ETC. C 8 PRINTED MATERIAL, ANYTHING READABLE C 9 A LIVING BEASTIE, E.G., DWARF, DOG, WUMPUS, ETC. C 10 DEAD (KILLED) BEASTIE: WUMPUS, DRAGON, SLEEPING DOG C 11 CAN BE WORN: CROWN, SHOES, CLOAK, JEWELS C 12 IS CURRENTLY BEING WORN C 13 REQUIRES PLURAL RESPONSES (SHOES, COINS, ETC.) C 14 TREASURE. C 15 CONTAINER. C 16 OBJECT IS "SMALL". (CAN FIT INTO SACK OR CHEST) C 17 CONTAINER IS OPAQUE -- CONTENTS ARE NOT VISIBLE UNLESS C CONTAINER IS OPEN. C C SECTION 16: ADJECTIVE/NOUN LIST. EACH VALID ADJECTIVE IS FOLLOWED BY C ALL NOUNS WHICH IT MAY MODIFY. C C SECTION 0: END OF DATABASE. IMPLICIT INTEGER(A-Z) INCLUDE 'config.f' LOGICAL DSEEN,BLKLIN,HINTED,YES,START,TERSE,ISWIZ,LOGOUT LOGICAL WZDARK,KILLED,RDFLAG,LIVING ! Whether there is a prompt or not: LOGICAL PROMPT INTEGER*4 BITS,TRAVEL,POINTS,OBJCND,LOCCON,STEXT,RTEXT,MTEXT C INTEGER*4 LINUSE,KK,LINSIZ,K1,PTAB,WKDAY,WKEND,HOLID,LTEXT INTEGER*4 LINUSE,LINSIZ,K1,PTAB,WKDAY,WKEND,HOLID,LTEXT CHARACTER*4 KK2 INTEGER*4 KK C INTEGER*4 PTEXT,OBJCON,J12,JL1,JL2,JKK,JK1,LINES,JNEW,RETN,CTEXT INTEGER*4 PTEXT,OBJCON,J12,JL1,JL2,JK1,JNEW,RETN,CTEXT C CHARACTER*4 JKK CHARACTER*4 LINES INTEGER*4 JKK, ILINES COMMON /COMTXT/ ILINES(25000) !THIS IS BECOUSE LINES IS NOW CHARACTER STUFF C I WILL HAVE TO CHECK OTHER STUFF THAT USE IT (/TXTCOM/) SUCH AS MSPEAK C DOUBLE PRECISION DTK(9),ATAB,NTXT,DJJ,DK,DKK,DL,DLL CHARACTER*8 DTK(9), ATAB, NTXT, DJJ, DK, DKK, DL, DLL C DOUBLE PRECISION VTXT,OTXT,IOTXT,MAGIC,TXT CHARACTER*8 VTXT, OTXT, IOTXT, MAGIC, TXT COMMON/IZWIZ/ISWIZ INTEGER*4 MESSGS COMMON/LNKCOM/ACTIVE(32),USER(15,32),MESSGS(32),MONITO(32), 1 TEXT(70,32) LOGICAL ACTIVE COMMON /MYRCOM/ PROMPT COMMON /ADJCOM/ ADJKEY(50),ADJTAB(150),ADJSIZ COMMON /ALLCOM/ NTXT(150,2) COMMON /BITCOM/ OPENBT,LOCKBT,BURNBT,WEARBT COMMON /BLKCOM/ BLKLIN COMMON /CONCOM/ LOCCON(250),OBJCON(150) COMMON /DIECOM/ NUMDIE,MAXDIE,TURNS COMMON /DWFCOM/ DWARF,KNIFE,KNFLOC,DFLAG,DSEEN(6),DLOC(6), 1 ODLOC(6),DWFMAX COMMON /HLDCOM/ HOLDER(150),HLINK(150) COMMON /HNTCOM/ HINTLC(20),HINTED(20),HINTS(20,4),HNTSIZ,HNTMIN, $ HTNMAX COMMON /LIQCOM/ BOTTLE,CASK,WATER,OIL,WINE,LIQTYP(5) COMMON /LOCCOM/ LOC,OLDLOC,OLDLC2,NEWLOC,MAXLOC COMMON /MNECOM/ BACK,CAVE,DPRSSN,ENTRNC,XIT,GO,LOOK,NULL, 1 AXE,BEAR,BOAT,BOOK,BOOK2,BOOTH,CARVNG,CHASM,CHASM2,DOOR,GNOME, 2 GRATE,LAMP,PDOOR,PLANT,PLANT2,ROCKS,ROD,ROD2,SAFE, 3 TDOOR,TDOOR2,TROLL,TROLL2,EMRALD,SPICES, 4 FIND,YELL,INVENT,LEAVE,POUR,SAY,TAKE,THROW, 5 KILLED,IWEST,PHUCE(2,4),TK(20) C COMMON /COMMNE/ BACK,CAVE,DPRSSN,ENTRNC,XIT,GO,LOOK,NULL, C 1 AXE,BEAR,BOAT,BOOK,BOOK2,BOOTH,CARVNG,CHASM,CHASM2,DOOR,GNOME, C 2 GRATE,LAMP,PDOOR,PLANT,PLANT2,ROCKS,ROD,ROD2,SAFE, C 3 TDOOR,TDOOR2,TROLL,TROLL2,EMRALD,SPICES, C 4 FIND,YELL,INVENT,LEAVE,POUR,SAY,TAKE,THROW, C 5 KILLED,IWEST,PHUCE(2,4),TK(20) COMMON /LTXCOM/ LTEXT(250),STEXT(250),KEY(250),ABB(250),LOCSIZ COMMON /OBJCOM/ PLAC(150),FIXD(150),WEIGHT(150),PROP(150), 1 POINTS(150) COMMON /PLACOM/ ATLOC(250),LINK(300),PLACE(150), 1 FIXED(150),MAXOBJ COMMON /PRPCOM/ VKEY(60),PTAB(300),VKYSIZ,PTBSIZ COMMON /TRVCOM/ TRAVEL(1600) COMMON /TXTCOM/ LINES(25000),RTEXT(400),PTEXT(150),MTEXT(45) COMMON /UTXCOM/ TXT(35,2),WDX COMMON /VOCCOM/ KTAB(600),ATAB(600),TABSIZ COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME, 1 SHORT,MAGIC,MAGNM,LATNCY,SAVED,SAVET,SETUP COMMON /WRDCOM/ VERBS(45),VTXT(45,2),VRBX,OBJS(45),OTXT(45,2), 1 OBJX,IOBJS(15),IOTXT(15,2),IOBX,PREP,WORDS(45) DIMENSION OBJCND(150),ACTSPK(60),CTEXT(12),CVAL(12) DIMENSION HNAME(10) LOGICAL AJAR,AT,ATHAND,BITSET,BLIND,CLOSED,CLOSNG, 1 DARK,DEAD,DEMO,EDIBLE,ENCLSD,FORCED, 2 GAVEUP,HERE,HINGED,HOLDNG,INSIDE,LMWARN,LOCKS,OUTSID,OPAQUE, 3 PANIC,PCT,PLURAL,PORTAL,PRINTD,SCORNG,SMALL, 4 TOTING,TREASR,LOCKED,VESSEL,WEARNG,WORN,YEA, 5 YESM DATA LINSIZ/25000/,TRVSIZ/1600/,TABSIZ/600/,LOCSIZ/250/, 1 VRBSIZ/60/,RTXSIZ/400/,CLSMAX/12/,HNTSIZ/20/,MAGSIZ/45/, 2 MAXOBJ/150/,MAXLOC/300/,HNTMIN/7/,PTBSIZ/300/,ADJSIZ/50/, 3 VKYSIZ/60/,SETUP/0/,BLKLIN/.TRUE./,DWFMAX/6/,ISWIZ/.FALSE./ ! DATA PROMPT/.FALSE./ DATA OBJCND/150*0/,LINUSE/0/ C PHUCE CONSISTS OF FOUR PAIRS OF ORIGIN/DESTINATION LOCATIONS FROM/TO C WHICH ONE IS TRANSPORTED ON UTTERING THE ELFIN CURSE AT THE TINY C DOOR. HE CAN GO FROM BIG TO SMALL OR SMALL TO BIG, ON EITHER SIDE OF C THE DOOR. DATA PHUCE/158,160,160,158,167,166,166,167/ DATA POUR /13/ !PUTTING THIS HERE, FROM GETWDS.F--MV C DATA PHROG/'PH','RO','GS'/ C BITS(N) IS A ONE-BIT IN POSITION N, WHERE THE RIGHTMOST BIT IS BIT ZERO. C DATA BITS/ C 1 1,2,4,8,16,32,64,128,256,512,1024,2048, C 2 :10000,:20000,:40000, C 3 :100000,:200000,:400000, C 4 :1000000,:2000000,:4000000, C 5 :10000000,:20000000,:40000000, C 6 :100000000,:200000000,:400000000, C 7 :1000000000,:2000000000,:4000000000, C 8 :10000000000,:20000000000,:40000000000, C 9 :100000000000,:200000000000,:400000000000/ DATA DEADBT,OPENBT,LOCKBT,BURNBT,WEARBT /10,2,4,6,12/ C STATEMENT FUNCTIONS C C C AJAR(OBJ = TRUE IF THE OBJECT IS OPEN C AT(OBJ) = TRUE IF ON EITHER SIDE OF TWO-PLACED OBJECT C ATHAND(OBJ) = TRUE IF OBJECT IS HERE AND NOT IN CLOSED CONTAINER. C BITSET(COND,L,N) = TRUE IF COND(L) HAS BIT N SET (BIT 0 IS UNITS BIT) C BLIND(DUMMY) = TRUE IF HERO CAN'T SEE (TOO DARK OR GLAREY) C DARK(DUMMY) = TRUE IF LOCATION "LOC" IS DARK C DEAD(OBJ) = TRUE IF CRITTER IS KILLED (OR IN ENCHANTED SLEEP) C FORCED(LOC) = TRUE IF LOC MOVES WITHOUT ASKING FOR INPUT (COND=2) C HERE(OBJ) = TRUE IF THE OBJ IS AT "LOC" (OR IS BEING CARRIED) C HINGED(OBJ) = TRUE IF OBJECT CAN BE OPENED/SHUT. C INSIDE(LOC) = TRUE IF LOCATION IS WELL WITHIN THE CAVE C LIQ(DUMMY) = OBJECT NUMBER OF LIQUID IN BOTTLE C LIQLOC(LOC) = OBJECT NUMBER OF LIQUID (IF ANY) AT LOC C LIVING(OBJ) = TRUE IF OBJ IS SOME SORT OF CRITTER C LOCKED(OBJ) = TRUE IF OBJECT IS LOCKED. (NEED NOT HAVE A LOCK, C E.G., RUSTY DOOR) C LOCKS(OBJ) = TRUE IF OBJECT HAS A LOCK. C OPAQUE(OBJ) = TRUE IF CONTAINER IS NOT TRANSPARENT (SACK, CHEST) C TRANSPARENT OBJS: BOTTLE(GLASS), CAGE(WICKER) C OUTSID(LOC) = TRUE IF LOCATION IS OUTSIDE THE CAVE C PCT(N) = TRUE N% OF THE TIME (N INTEGER FROM 0 TO 100) C PLURAL(OBJ) = TRUE IF IT IS A PLURAL OBJ (SHOES, KEYS, ETC.) C PORTAL(LOC) = TRUE IS LOCATION IS IN CAVE "ENTRANCE" C PRINTD(OBJ) = TRUE IF OBJECT CAN BE READ. C SMALL(OBJ) = TRUE IF OBJ FITS INTO SACK C TOTING(OBJ) = TRUE IF THE OBJ IS BEING CARRIED C TREASR(OBJ) = TRUE IF OBJECT IS A TREASURE C VESSEL(OBJ) = TRUE IF OBJECT IS A CONTAINER C WEARNG(OBJ) = TRUE IF OBJECT IS BEING WORN C WORN(OBJ) = TRUE IF THE OBJECT CAN BE WORN C C CLOSED SAYS WHETHER WE'RE ALL THE WAY CLOSED C CLOSNG SAYS WHETHER ITS CLOSING TIME YET C DEMO IS TRUE IF THIS IS A PRIME-TIME DEMONSTRATION GAME C GAVEUP SAYS WHETHER HE EXITED VIA "QUIT" C LMWARN SAYS WHETHER HE'S BEEN WARNED ABOUT LAMP GOING DIM C PANIC SAYS WHETHER HE'S FOUND OUT HE'S TRAPPED IN THE CAVE C SCORNG INDICATES TO THE RATING ROUTINE WHETHER WE'RE DOING A "SCORE" COMMAND C WZDARK SAYS WHETHER THE LOC HE'S LEAVING WAS DARK C YEA IS RANDOM YES/NO REPLY IF(SETUP.NE.0)GOTO 1200 PRINT 1000 1000 FORMAT(' INITIALISING...') DO 10 I=1,32 10 ACTIVE(I)=.FALSE. C CLEAR OUT THE VARIOUS TEXT-POINTER ARRAYS. ALL TEXT IS STORED IN ARRAY C LINES; EACH LINE IS PRECEDED BY A WORD POINTING TO THE NEXT POINTER (I.E. C THE WORD FOLLOWING THE END OF THE LINE). THE POINTER IS NEGATIVE IF THIS IS C FIRST LINE OF A MESSAGE. THE TEXT-POINTER ARRAYS CONTAIN INDICES OF C POINTER-WORDS IN LINES. STEXT(N) IS SHORT DESCRIPTION OF LOCATION N. C LTEXT(N) IS LONG DESCRIPTION. PTEXT(N) POINTS TO MESSAGE FOR PROP( PROPN)=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. DO 1001 I=1,MAXLOC IF(I.LE.MAXOBJ)PTEXT(I)=0 IF(I.LE.RTXSIZ)RTEXT(I)=0 IF(I.LE.CLSMAX)CTEXT(I)=0 IF(I.LE.MAGSIZ)MTEXT(I)=0 IF(I.GT.LOCSIZ)GOTO 1001 STEXT(I)=0 LTEXT(I)=0 LOCCON(I)=0 1001 CONTINUE C CALL SRCH$$(1,'ADVE.BASE',9,1,TYPE,CODE) C I'M NOT SURE WHAT THE ABOVE LINE IS SUPPOSED TO DO? OPEN FILE? ! I added some file checks (myrkraverk): IF(ACCESS(ADVTXT,'r').EQ.0)THEN OPEN( UNIT=1, FILE=ADVTXT ) ELSE IF (ACCESS('adventure.text','r').EQ.0.) THEN OPEN( UNIT=1, FILE='adventure.text' ) ELSE PRINT *, 'I don''t know where ''adventure.text'' is' STOP END IF SETUP=1 LINUSE=1 TRVS=1 PTBS=1 ATBS=1 CLSSES=1 C START NEW DATA SECTION. SECT IS THE SECTION NUMBER. C1002 READ(5,1003)SECT 1002 READ(1,1003)SECT 1003 FORMAT(I8) PRINT 1015,SECT 1015 FORMAT (' READING TABLE ',I2,'...') OLDLOC=-1 GOTO(1190,1004,1004,1040,1030,1004,1004,1050,1060,1070,1004, 1 1080,1004,0999,1100,1120,1140),(SECT+1) C (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) C (11) (12) (13) (14) (15) (16) 999 CALL BUG(9) C SECTIONS 1, 2, 5, 6, 10, 12. READ MESSAGES AND SET UP POINTERS. 1004 JL1=LINUSE+1 JL2=LINUSE+18 C READ(5,1005)LOC,(LINES(J12),J12=JL1,JL2),KK2 READ(1,1005)LOC,(LINES(J12),J12=JL1,JL2),KK2 C CHANGED KK TO KK2 ABOVE! MIGHT COUSE UNWANTED SIDE-FX M.V. 1005 FORMAT(I8,19A4) IF(KK2.EQ.' ')GOTO 1017 !KK->KK2 BECOUSE OF ABOVE PRINT 1016,LOC 1016 FORMAT (1X,'LINE FOR LOCN ',I4,' TOO LONG.') CALL BUG(0) 1017 IF(LOC.EQ.-1)GOTO 1002 DO 1006 K=1,18 JKK=LINUSE+19-K IF(LINES(JKK).NE.' ')GOTO 1007 1006 CONTINUE IF(LOC.EQ.0)GOTO 1004 C ABOVE KLUGE IS TO AVOID F40 BUG IF CRLF BROKEN ACROSS RECORD BOUNDARY CALL BUG(1) 1007 JL1=LINUSE+1 DO 1008 JK1=JL1,JKK C1008 LINES(JK1)=XOR(LINES(JK1),'CLYD') 1008 LINES(JK1)=LINES(JK1)!???? C LINES(LINUSE)=JKK+1 ILINES(LINUSE)=JKK+1!DANGEROUS STUFF BUT WHAT CAN I DO? M.V. IF(LOC.EQ.OLDLOC)GOTO 1020 IF(LOC.GT.OLDLOC.OR.SECT.EQ.5)GOTO 1019 PRINT 1018,LOC,SECT 1018 FORMAT (/' LINE ',I3,' OUT OF ORDER IN SECTION ',I2) CALL BUG(10) C1019 LINES(LINUSE)=-LINES(LINUSE) 1019 ILINES(LINUSE)=-ILINES(LINUSE)!THIS MOST DEFFINETLY HAS SERIOUS IF(SECT.EQ.12)GOTO 1013 !SIDE-FX. HAVE TO DEBUG CAREFULLY!!! IF(SECT.EQ.10)GOTO 1012 !--I THINK IT IS MOST UNIVERSALLY IF(SECT.EQ.6)GOTO 1011 !FIXED NOW, MYRKRAVERK IF(SECT.EQ.5)GOTO 1010 IF(SECT.EQ.1)GOTO 1009 STEXT(LOC)=LINUSE GOTO 1020 1009 LTEXT(LOC)=LINUSE GOTO 1020 1010 IF(LOC.GT.0.AND.LOC.LE.MAXOBJ)PTEXT(LOC)=LINUSE GOTO 1020 1011 IF(LOC.GT.RTXSIZ)CALL BUG(6) RTEXT(LOC)=LINUSE GOTO 1020 1012 CTEXT(CLSSES)=LINUSE CVAL(CLSSES)=LOC CLSSES=CLSSES+1 GOTO 1020 1013 IF(LOC.GT.MAGSIZ)CALL BUG(6) MTEXT(LOC)=LINUSE 1020 LINUSE=JKK+1 C LINES(LINUSE)=-1 ILINES(LINUSE)=-1 C THIS MOST DEFFINETLY CRIPPLES /TXTCOM/ ALOT AND RENDERS ALL STUFF THAT C USES IT INCORRECT!!!!!!!!!!!!! C MOST LIKELY UNIVERSALLY FIXED NOW, MYRKRAVERK OLDLOC=LOC IF(LINUSE+18.GT.LINSIZ)CALL BUG(2) GOTO 1004 C THE STUFF FOR SECTION 4 IS ENCODED HERE. EACH "FROM-LOCATION" GETS A C CONTIGUOUS SECTION OF THE "TRAVEL" ARRAY. EACH ENTRY IN TRAVEL IS C NEWLOC*1000 + KEYWORD (FROM SECTION 3, 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. C1030 READ(5,1031)LOC,JNEW,(DTK(I),I=1,8) 1030 READ(1,1031)LOC,JNEW,(DTK(I),I=1,8) 1031 FORMAT(2I8,8(A6,2X)) IF(LOC.EQ.0)GOTO 1030 C ABOVE KLUGE IS TO AVOID AFOREMENTIONED F40 BUG IF(LOC.EQ.-1)GOTO 1002 IF(LOC.GE.OLDLOC)GOTO 1032 PRINT 1018,LOC,SECT CALL BUG(10) 1032 IF(KEY(LOC).NE.0)GOTO 1033 KEY(LOC)=TRVS GOTO 1035 1033 TRAVEL(TRVS-1)=-TRAVEL(TRVS-1) 1035 DO 1037 L=1,8 IF(DTK(L).EQ.' ')GOTO 1039 K=VOCABX(DTK(L),-1) TRAVEL(TRVS)=JNEW*1000+K TRVS=TRVS+1 IF(TRVS.EQ.TRVSIZ)CALL BUG(3) 1037 CONTINUE 1039 TRAVEL(TRVS-1)=-TRAVEL(TRVS-1) GOTO 1030 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 3 IS LEFT IN KTAB C AS AN END-MARKER. THE WORDS ARE GIVEN A MINIMAL HASH TO MAKE READING THE C CORE-IMAGE HARDER. NOTE THAT '/7-08' HAD BETTER NOT BE IN THE LIST, SINCE C IT COULD HASH TO -1. 1040 DO 1042 TABNDX=1,TABSIZ C1043 READ(5,1041)KTAB(TABNDX),ATAB(TABNDX) 1043 READ(1,1041)KTAB(TABNDX),ATAB(TABNDX) 1041 FORMAT(I8,A6) IF(KTAB(TABNDX).EQ.0)GOTO 1043 C ABOVE KLUGE IS TO AVOID AFOREMENTIONED F40 BUG IF(KTAB(TABNDX).EQ.-1)GOTO 1002 1042 CONTINUE CALL BUG(4) 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 WEIGHT CONTAINS THE HEAVINESS OF EACH OBJ, ON A SCALE OF 1-10. C1050 READ(5,1052) OBJ,J,K,KK,DL,DLL,(TK(I),I=1,3) 1050 READ(1,1052) OBJ,J,K,KK,DL,DLL,(TK(I),I=1,3) 1052 FORMAT(4I8,2(A6,2X),3I8) IF(OBJ.EQ.-1)GOTO 1002 IF(OBJ.LE.0.OR.OBJ.GT.MAXOBJ)CALL BUG(17) PLAC(OBJ)=J FIXD(OBJ)=K WEIGHT(OBJ)=KK C READ DEFAULT OBJECT NAMES. FOR USE IN 'TAKE ALL' COMMANDS. NTXT(OBJ,1)=DL NTXT(OBJ,2)=DLL C READ POINT VALUES FOR TREASURES. K=1 IF(TK(3).LT.0)K=-1 POINTS(OBJ)= (TK(1)*1000000*K) + (TK(2)*1000*K) + TK(3) GOTO 1050 C READ DEFAULT MESSAGE NUMBERS FOR ACTION VERBS, STORE IN ACTSPK. C1060 READ(5,1061)VERB,J 1060 READ(1,1061)VERB,J 1061 FORMAT(10I8) IF(VERB.EQ.-1)GOTO 1002 ACTSPK(VERB)=J GOTO 1060 C READ INFO ABOUT AVAILABLE LIQUIDS AND OTHER CONDITIONS, STORE IN COND. C1070 READ(5,1061)K,(TK(I),I=1,9) 1070 READ(1,1061)K,(TK(I),I=1,9) IF(K.EQ.-1)GOTO 1002 DO 1071 I=1,20 LOC=TK(I) IF(LOC.EQ.0)GOTO 1070 IF(BITSET(LOCCON(LOC),K))CALL BUG(8) 1071 LOCCON(LOC)=LOCCON(LOC)+BITS(K) GOTO 1070 C READ DATA FOR HINTS. 1080 HNTMAX=0 C1081 READ(5,1061)K,(TK(I),I=1,9) 1081 READ(1,1061)K,(TK(I),I=1,9) IF(K.EQ.-1)GOTO 1002 IF(K.EQ.0)GOTO 1081 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 SECTION 14 IS THE PREPOSITION TABLE. C1100 READ(5,1101)DK,DKK,(DTK(I),I=1,8) 1100 READ(1,1101)DK,DKK,(DTK(I),I=1,8) 1101 FORMAT(10(A6,2X)) C IF(DK.EQ.0)GOTO 1100 IF(ICHAR(DK).EQ.0)GOTO 1100 C ABOVE KLUGE IS TO AVOID AFOREMENTIONED F40 BUG IF(DK.EQ.'-1 ')GOTO 1002 VERB=VAL(VOCABX(DK,-4)) DJJ=DK IF(VERB.EQ.-1)GOTO 1106 PREP=VAL(VOCABX(DKK,-6)) DJJ=DKK IF(PREP.EQ.-1)GOTO 1106 IF(VKEY(VERB).NE.0)GOTO 1104 VKEY(VERB)=PTBS GOTO 1105 1104 PTAB(PTBS-1)=-PTAB(PTBS-1) 1105 DO 1110 L=1,8 IF(DTK(L).EQ.' ')GOTO 1111 K=VAL(VOCABX(DTK(L),-3)) IF(K.NE.-1)GOTO 1108 K=999 IF(L.EQ.1.AND.DTK(1).EQ.'ANY ')GOTO 1108 DJJ=DTK(L) GO TO 1106 1108 PTAB(PTBS)=PREP*1000+K PTBS=PTBS+1 IF(PTBS.EQ.PTBSIZ)CALL BUG(15) 1110 CONTINUE 1111 PTAB(PTBS-1)=-PTAB(PTBS-1) GOTO 1100 C only come here via "GO TO 1106", never should drop in. 1106 PRINT 1107,DJJ 1107 FORMAT(/' UNRECOGNIZED WORD "',A6,'" IN PREP/OBJ TABLE.') CALL BUG(14) C READ CONDITION BITS FOR OBJECTS. KK IS THE BIT; TK(I), THE OBJ LIST. C1120 READ(5,1061)IKK,(TK(I),I=1,9) 1120 READ(1,1061)IKK,(TK(I),I=1,9) IF(IKK.EQ.-1)GOTO 1002 DO 1125 I=1,9 OBJ=TK(I) IF(OBJ.EQ.0)GOTO 1120 IF(OBJ.LE.0.OR.OBJ.GT.MAXOBJ)CALL BUG(17) IF(.NOT.BITSET(OBJCND(OBJ),IKK))GOTO 1125 WRITE(1,101)OBJ,IKK 101 FORMAT('BIT SET TWICE OBJ=',I5,' BIT= ',I5) CALL BUG(16) 1125 OBJCND(OBJ)=OBJCND(OBJ)+BITS(IKK) GOTO 1120 C SECTION 17 IS THE ADJECTIVE TABLE. C1140 READ(5,1141)DK,(DTK(I),I=1,9) 1140 READ(1,1141)DK,(DTK(I),I=1,9) 1141 FORMAT(10(A6,2X)) C IF(DK.EQ.0)GOTO 1140 C ABOVE KLUGE IS TO AVOID AFOREMENTIONED F40 BUG C COMPILER DOESN'T AGREE WITH 'ABOVE KLUDGE' SO REMOVED IT. I DON'T THINK C ANY F40 BUGS ARE GOING TO COUSE TROUBLE. MYRKRAVERK IF(DK.EQ.'-1 ')GOTO 1002 ADJ=VOCABX(DK,-7) DJJ=DK IF(ADJ.EQ.-1.OR.CLASS(ADJ).NE.6)GOTO 1148 ADJ=VAL(ADJ) IF(ADJKEY(ADJ).NE.0)GOTO 1142 ADJKEY(ADJ)=ATBS GOTO 1143 1142 ADJTAB(ATBS-1)=-ADJTAB(ATBS-1) 1143 DO 1145 L=1,9 IF(DTK(L).EQ.' ')GOTO 1146 DJJ=DTK(L) K=VOCABX(DTK(L),-3) IF(K.EQ.-1.OR.CLASS(K).NE.2)GOTO 1148 ADJTAB(ATBS)=VAL(K) ATBS=ATBS+1 IF(ATBS.EQ.MAXOBJ)CALL BUG(18) 1145 CONTINUE 1146 ADJTAB(ATBS-1)=-ADJTAB(ATBS-1) GOTO 1140 1148 PRINT 1149,DJJ 1149 FORMAT(/' UNRECOGNIZED WORD "',A6,'" IN ADJECTIVE TABLE.') CALL BUG(13) C EVERYTHING IS READ! NOW FINISH CONSTRUCTING INTERNAL DATA FORMAT. C DEFINE SOME HANDY MNEMONICS. THESE CORRESPOND TO OBJECT NUMBERS. C (INCLUDES TREASURES.) C1190 CALL CLOS$A(1) 1190 CLOSE(1) ANVIL=VOCABX('ANVIL ',2) AXE=VOCABX('AXE ',2) BATTER=VOCABX('BATTER ',2) BEAR=VOCABX('BEAR ',2) BEES=VOCABX('BEES ',2) BILLBD=VOCABX('BILLBO ',2) BIRD=VOCABX('BIRD ',2) BOAT=VOCABX('BOAT ',2) BOOK=VOCABX('BOOK ',2) BOOK2=BOOK+1 BOOTH=VOCABX('BOOTH ',2) BOTTLE=VOCABX('BOTTLE ',2) BRUSH=VOCABX('BRUSH ',2) CAGE=VOCABX('CAGE ',2) CAKES=VOCABX('CAKES ',2) CARVNG=VOCABX('CARVIN ',2) CASK=VOCABX('CASK ',2) CHAIN=VOCABX('CHAIN ',2) CHASM=VOCABX('CHASM ',2) CHASM2=CHASM+1 CHEST=VOCABX('CHEST ',2) CLAM=VOCABX('CLAM ',2) CLOAK=VOCABX('CLOAK ',2) COINS=VOCABX('COINS ',2) CROWN=VOCABX('CROWN ',2) DOG=VOCABX('DOG ',2) DOOR=VOCABX('DOOR ',2) DRAGON=VOCABX('DRAGON ',2) DWARF=VOCABX('DWARF ',2) EGGS=VOCABX('EGGS ',2) EMRALD=VOCABX('EMERAL ',2) FISSUR=VOCABX('FISSUR ',2) FLOWER=VOCABX('FLOWER ',2) FLY=VOCABX('FLY ',2) FOOD=VOCABX('FOOD ',2) GNOME=VOCABX('GNOME ',2) GRAIL=VOCABX('GRAIL ',2) GRATE=VOCABX('GRATE ',2) HIVE=VOCABX('HIVE ',2) HONEY=VOCABX('HONEY ',2) HORN=VOCABX('HORN ',2) JEWELS=VOCABX('JEWELS ',2) KEYS=VOCABX('KEYS ',2) KNIFE=VOCABX('KNIFE ',2) LAMP=VOCABX('LAMP ',2) LYRE=VOCABX('LYRE ',2) MAGZIN=VOCABX('MAGAZI ',2) MESSAG=VOCABX('MESSAG ',2) MIRROR=VOCABX('MIRROR ',2) MUSHRM=VOCABX('MUSHRO ',2) NUGGET=VOCABX('NUGGET ',2) OIL=VOCABX('OIL ',2) C OIL2=OIL+1 OYSTER=VOCABX('OYSTER ',2) PLAQUE=VOCABX('PLAQUE ',2) PEARL=VOCABX('PEARL ',2) PHONE=VOCABX('PHONE ',2) PILLOW=VOCABX('PILLOW ',2) PLANT=VOCABX('PLANT ',2) PLANT2=PLANT+1 POLE=VOCABX('POLE ',2) POSTER=VOCABX('POSTER ',2) PYRAM=VOCABX('PYRAMI ',2) RADIUM=VOCABX('RADIUM ',2) RING=VOCABX('RING ',2) ROCKS=VOCABX('ROCKS ',2) ROD=VOCABX('ROD ',2) ROD2=ROD+1 RUG=VOCABX('RUG ',2) SAFE=VOCABX('SAFE ',2) SHIELD=VOCABX('TUBE ',2) SHOES=VOCABX('SHOES ',2) SKEY=VOCABX('KEY ',2) SLUGS=VOCABX('SLUGS ',2) SNAKE=VOCABX('SNAKE ',2) SPICES=VOCABX('SPICES ',2) SPIDER=VOCABX('SPIDER ',2) STEPS=VOCABX('STEPS ',2) STICKS=VOCABX('STICKS ',2) SWORD=VOCABX('SWORD ',2) TABLET=VOCABX('TABLET ',2) TDOOR=DOOR+1 TDOOR2=TDOOR+1 PDOOR=TDOOR2+1 TRIDNT=VOCABX('TRIDEN ',2) TROLL=VOCABX('TROLL ',2) TROLL2=TROLL+1 VASE=VOCABX('VASE ',2) VEND=VOCABX('MACHIN ',2) WALL=VOCABX('WALL ',2) WALL2=WALL+1 WATER=VOCABX('WATER ',2) C WATER2=WATER+1 WINE=VOCABX('WINE ',2) C WINE2=WINE+1 WUMPUS=VOCABX('WUMPUS ',2) C THESE ARE MOTION-VERB NUMBERS. BACK=VOCABX('BACK ',1) CAVE=VOCABX('CAVE ',1) DPRSSN=VOCABX('DEPRES ',1) ENTRNC=VOCABX('ENTRAN ',1) XIT=VOCABX('EXIT ',1) NULL=VOCABX('NULL ',1) C AND SOME ACTION VERBS. FIND=VOCABX('FIND ',3) GO=VOCABX('GO ',3) HIT=VOCABX('HIT ',3) LOOK=VOCABX('LOOK ',3) YELL=VOCABX('CALL ',3) INVENT=VOCABX('INVENT ',3) LEAVE=VOCABX('LEAVE ',3) LOCK=VOCABX('LOCK ',3) SAY=VOCABX('SAY ',3) SHUT=VOCABX('CLOSE ',3) TAKE=VOCABX('TAKE ',3) THROW=VOCABX('THROW ',3) UNLOCK=VOCABX('UNLOCK ',3) WEAR=VOCABX('WEAR ',3) YANK=VOCABX('YANK ',3) C AND A FEW PREPOSITIONS. PREFIX 'PREP' TO DISTINGUISH THEM FROM FUNCTIONS & R PREPAT=VOCABX('AT ',5) PREPDN=VOCABX('DOWN ',5) PREPFR=VOCABX('FROM ',5) PREPIN=VOCABX('IN ',5) PREPOF=VOCABX('OFF ',5) PREPON=VOCABX('ON ',5) C A POPULAR LOCATION IS: Y2=33 C IF SETUP=2 WE DON'T NEED TO DO THIS. IT'S ONLY NECESSARY IF WE HAVEN'T DONE C IT AT ALL OR IF THE PROGRAM HAS BEEN RUN SINCE THEN. 1200 IF(SETUP.EQ.2)GOTO 1 IF(SETUP.EQ.-1)GOTO 13050 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(OBJ) AS THE NEXT OBJECT AT THE SAME LOCATION C AS OBJ. (OBJ>MAXOBJ INDICATES THAT FIXED(OBJ-MAXOBJ)=LOC; LINK(OBJ) IS STILL C THE CORRECT LINK TO USE.) ABB IS ZEROED; IT CONTROLS WHETHER THE ABBREVIATED C DESCRIPTION IS PRINTED. COUNTS MOD 5 UNLESS "LOOK" IS USED. DO 1201 I=1,MAXOBJ PLACE(I)=0 PROP(I)=0 HOLDER(I)=0 HLINK(I)=0 LINK(I)=0 1201 LINK(I+MAXOBJ)=0 DO 1202 I=1,LOCSIZ ABB(I)=0 IF(LTEXT(I).EQ.0.OR.KEY(I).EQ.0)GOTO 1202 K=KEY(I) IF(MOD(IABS(TRAVEL(K)),0001000).EQ.1)LOCCON(I)=2 1202 ATLOC(I)=0 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. DO 1206 I=1,MAXOBJ K=MAXOBJ+1-I IF(FIXD(K).LE.0)GOTO 1206 CALL DROP(K+MAXOBJ,FIXD(K)) CALL DROP(K,PLAC(K)) 1206 CONTINUE DO 1207 I=1,MAXOBJ K=MAXOBJ+1-I FIXED(K)=FIXD(K) 1207 IF(PLAC(K).NE.0.AND.FIXD(K).LE.0)CALL DROP(K,PLAC(K)) C MAKE SURE ALL THE RIGHT THINGS GET CLOSED AND LOCKED, ETC., BEFORE C WE GET STARTED. DO 1220 I=1,MAXOBJ 1220 OBJCON(I)=OBJCND(I) C TREASURES, AS NOTED EARLIER, ARE OBJECTS WITH BITSET(14) IN OBJCON. 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). TALLY=0 TALLY2=0 DO 1240 I=1,MAXOBJ IF(.NOT.TREASR(I))GOTO 1240 IF(PTEXT(I).NE.0)PROP(I)=-1 1240 TALLY=TALLY-PROP(I) 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. DO 1300 I=1,HNTMAX HINTED(I)=.FALSE. 1300 HINTLC(I)=0 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. CHLOC=114 CHLOC2=140 DO 1700 I=1,DWFMAX 1700 DSEEN(I)=.FALSE. DFLAG=0 DLOC(1)=PLAC(SNAKE) DLOC(2)=PLAC(BOOTH) DLOC(3)=Y2 DLOC(4)=44 DLOC(5)=PLAC(CLAM) C DLOC(6)=PLAC(VEND) DLOC(DWFMAX)=CHLOC DALTLC=PLAC(NUGGET) C OTHER RANDOM FLAGS AND COUNTERS, AS FOLLOWS: C ABBNUM HOW OFTEN WE SHOULD PRINT NON-ABBREVIATED DESCRIPTIONS C BCROSS NUMBER OF TIMES COLLAPSING BRIDGE HAS BEEN TRAVERSED. C BONUS USED TO DETERMINE AMOUNT OF BONUS IF HE REACHES CLOSING C CHASE TELLS HOW CLOSE THE WUMPUS IS TO GOBBLING HIM UP C CLOCK1 NUMBER OF TURNS FROM FINDING LAST TREASURE TILL CLOSING C CLOCK2 NUMBER OF TURNS FROM FIRST WARNING TILL BLINDING FLASH C CLOCK3 NUMBER OF TURNS IN REPOSITORY TILL PHONE RINGS. C AFTER TICKING TO 0, TICKS 7 TIMES TO WAKE DWARVES. C COMBO CURRENT PROGRESS IN GIVING SAFE'S COMBINATION C DETAIL HOW OFTEN WE'VE SAID "NOT ALLOWED TO GIVE MORE DETAIL" C DKILL NUMBER OF DWARVES KILLED (UNUSED IN SCORING, NEEDED FOR MSG) C FOOBAR CURRENT PROGRESS IN SAYING "FEE FIE FOE FOO". C HEALTH PERCENTAGE OF MAXIMUM (100) FITNESS C IWEST HOW MANY TIMES HE'S SAID "WEST" INSTEAD OF "W" C KNFLOC 0 IF NO KNIFE HERE, LOC IF KNIFE HERE, -1 AFTER CAVEAT C LIMIT LIFETIME OF LAMP (NOT SET HERE) C MAXDIE NUMBER OF REINCARNATION MESSAGES AVAILABLE (UP TO 5) C NUMDIE NUMBER OF TIMES KILLED SO FAR C TERSE IF TRUE, NEVER PRINT LONG LOCATION DESCRIPTIONS C TURNS TALLIES HOW MANY COMMANDS HE'S GIVEN (IGNORES YES/NO) C WASTE TELLS HOW LONG HE HAS USED LAMP IN LIGHTED AREA. C LOGICALS WERE EXPLAINED EARLIER ABBNUM=5 BCROSS=0 BONUS=0 CLOCK1=30 CLOCK2=50 CLOCK3=20+RAN(20) CHASE=0 CLOSED=.FALSE. CLOSNG=.FALSE. COMBO=0 DETAIL=0 DKILL=0 FOOBAR=0 GAVEUP=.FALSE. HEALTH=100 IWEST=0 KNFLOC=0 LMWARN=.FALSE. DO 1800 I=0,4 1800 IF(RTEXT(2*I+81).NE.0)MAXDIE=I+1 NUMDIE=0 PANIC=.FALSE. SAVED=0 SCORNG=.FALSE. TERSE=.FALSE. TURNS=0 WASTE=0 C SETUP THE LIQUIDS ACCORDING TO CONTAINER PROP VALUES LIQTYP(1)=WATER LIQTYP(2)=0 LIQTYP(3)=OIL LIQTYP(4)=0 LIQTYP(5)=WINE PROP(POLE)=1 PROP(SKEY)=1 PLACE(WATER)=-1 CALL INSERT(WATER,BOTTLE) PLACE(BOOK)=-1 CALL INSERT(BOOK,SAFE) C AND CLEAR OUT ANY LEFTOVER WORD VECTORS... CALL CLRLIN DO 1810 WDX=1,35 1810 WORDS(WDX)=0 WDX=0 C IF SETUP=1, REPORT ON AMOUNT OF ARRAYS ACTUALLY USED, TO PERMIT REDUCTIONS. IF(SETUP.NE.1)GOTO 1 SETUP=2 JJ=0 DO 1989 K=1,VKYSIZ 1989 IF(VKEY(K).NE.0)JJ=JJ+1 DO 1998 K=1,LOCSIZ KK=LOCSIZ+1-K IF(LTEXT(KK).NE.0)GOTO 1997 1998 CONTINUE 1997 LL=0 OBJ=0 DO 1996 K=1,MAXOBJ IF(TREASR(K))LL=LL+1 1996 IF(PTEXT(K).NE.0)OBJ=OBJ+1 DO 1995 K=1,TABNDX 1995 IF(KTAB(K)/1000.EQ.2)VERB=KTAB(K)-2000 DO 1994 K=1,RTXSIZ J=RTXSIZ+1-K IF(RTEXT(J).NE.0)GOTO 1993 1994 CONTINUE 1993 DO 1992 K=1,MAGSIZ I=MAGSIZ+1-K IF(MTEXT(I).NE.0)GOTO 1991 1992 CONTINUE 1991 CALL RATING(SCORE,MXSCOR,0,0,0,0,0) K=MAXOBJ PRINT 1999,LINUSE,LINSIZ,TRVS,TRVSIZ,TABNDX,TABSIZ,KK, 1 LOCSIZ,OBJ,K,LL,VERB,VRBSIZ,J,RTXSIZ,CLSSES,CLSMAX, 2 HNTMAX,HNTSIZ,I,MAGSIZ,PTBS,PTBSIZ,JJ,VERB, 3 MXSCOR 1999 FORMAT (' TABLE SPACE USED:'/ 1 ' ',I6,' OF ',I6,' WORDS OF MESSAGES'/ 2 ' ',I6,' OF ',I6,' TRAVEL OPTIONS'/ 3 ' ',I6,' OF ',I6,' VOCABULARY WORDS'/ 4 ' ',I6,' OF ',I6,' LOCATIONS'/ 5 ' ',I6,' OF ',I6,' OBJECTS OF WHICH ',I2,' ARE TREASURES.'/ 6 ' ',I6,' OF ',I6,' ACTION VERBS'/ 7 ' ',I6,' OF ',I6,' RTEXT MESSAGES'/ 8 ' ',I6,' OF ',I6,' CLASS MESSAGES'/ 9 ' ',I6,' OF ',I6,' HINTS'/ 1 ' ',I6,' OF ',I6,' MAGIC MESSAGES'/ 2 ' ',I6,' OF ',I6,' VERB/PREP/OBJ OPTIONS'/ 3 ' ',I6,' OF ',I6,' VERBS TAKE PREPOSITIONS'/ 4 /' MAXIMUM SCORE FOR THIS VERSION IS ',I4,' POINTS.'/ 5 ) C FINALLY, SINCE WE'RE CLEARLY SETTING THINGS UP FOR THE FIRST TIME... IF(YESM(33,0,0))CALL XMAP CALL POOF ! PAUSE 5 C START-UP, DWARF STUFF 1 DEMO=START(0) CALL MOTD(.FALSE.) I=RAN(1) CALL RSPEAK(325) HINTED(3)=YES(65,1,0) NEWLOC=1 SETUP=3 LIMIT=280 IF(HINTED(3))LIMIT=550 C CAN'T LEAVE CAVE ONCE IT'S CLOSING (EXCEPT BY MAIN OFFICE). 2 IF(.NOT.OUTSID(NEWLOC).OR.NEWLOC.EQ.0.OR..NOT.CLOSNG)GOTO 71 CALL RSPEAK(130) NEWLOC=LOC IF(.NOT.PANIC)CLOCK2=15 PANIC=.TRUE. 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). 71 IF(NEWLOC.EQ.LOC)GOTO 74 ILOC=LOC 171 IF(FORCED(ILOC))GOTO 74 172 IF(AND(LOCCON(ILOC),000016).NE.0)GOTO 74 L1=DWFMAX-1 DO 73 I=1,L1 IF(ODLOC(I).NE.NEWLOC.OR..NOT.DSEEN(I))GOTO 73 NEWLOC=LOC CALL RSPEAK(2) GOTO 74 73 CONTINUE 74 LOC=NEWLOC 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 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. IF(LOC.EQ.0.OR.FORCED(LOC).OR.AND(LOCCON(NEWLOC),000016).NE.0) 1 GOTO 2000 IF(DFLAG.NE.0)GOTO 6000 IF(INSIDE(LOC))DFLAG=1 GOTO 2000 C WHEN WE ENCOUNTER THE FIRST DWARF, WE KILL 0, 1, OR 2 OF THE DWFMAX DWARVES. C IF ANY OF THE SURVIVORS IS AT LOC, REPLACE HIM WITH THE ALTERNATE. 6000 IF(DFLAG.NE.1)GOTO 6010 IF(.NOT.INSIDE(LOC).OR.PCT(95))GOTO 2000 DFLAG=2 DO 6001 I=1,2 J=1+RAN(DWFMAX-1) C IF SAVED NOT = -1, HE BYPASSED THE "START" CALL. 6001 IF(PCT(50).AND.SAVED.EQ.-1)DLOC(J)=0 L1=DWFMAX-1 DO 6002 I=1,L1 IF(DLOC(I).EQ.LOC)DLOC(I)=DALTLC 6002 ODLOC(I)=DLOC(I) CALL RSPEAK(3) CALL DROP(AXE,LOC) GOTO 2000 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 WHICH ARE OUTSIDE OR IN C EITHER OF THE TWO PORTAL AREAS. IF WANDERING AT RANDOM, THEY C 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. 6010 DTOTAL=0 ATTACK=0 STICK=0 DO 6030 I=1,DWFMAX IF(DLOC(I).EQ.0)GOTO 6030 J=1 KK=KEY(DLOC(I)) IF(KK.EQ.0)GOTO 6016 6012 NEWLOC=MOD(IABS(TRAVEL(KK))/1000,1000) IF(NEWLOC.GT.MAXLOC.OR.NEWLOC.EQ.ODLOC(I) 1 .OR..NOT.INSIDE(NEWLOC) 2 .OR.(J.GT.1.AND.NEWLOC.EQ.TK(J-1)).OR.J.GE.20 3 .OR.NEWLOC.EQ.DLOC(I).OR.FORCED(NEWLOC) 4 .OR.(I.EQ.DWFMAX.AND.AND(LOCCON(NEWLOC),000016).NE.0) 5 .OR.IABS(TRAVEL(KK))/1000.EQ.100)GOTO 6014 TK(J)=NEWLOC J=J+1 6014 KK=KK+1 IF(TRAVEL(KK-1).GE.0)GOTO 6012 6016 TK(J)=ODLOC(I) IF(J.GE.2)J=J-1 J=1+RAN(J) ODLOC(I)=DLOC(I) DLOC(I)=TK(J) DSEEN(I)=(DSEEN(I).AND.INSIDE(LOC)) 1 .OR.(DLOC(I).EQ.LOC.OR.ODLOC(I).EQ.LOC) IF(.NOT.DSEEN(I))GOTO 6030 DLOC(I)=LOC IF(I.NE.DWFMAX)GOTO 6027 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. IF(LOC.EQ.CHLOC.OR.PROP(CHEST).GE.0)GOTO 6030 K=0 DO 6020 J=1,MAXOBJ C PIRATE WON'T TAKE PYRAMID FROM PLOVER ROOM OR DARK ROOM (TOO EASY!). IF(.NOT.TREASR(J).OR.(J.EQ.CASK.AND.LIQ(CASK).NE.WINE))GOTO 6020 IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM) 1 .OR.LOC.EQ.PLAC(EMRALD)))GOTO 6020 IF(TOTING(J).AND.ATHAND(J))GOTO 6022 6020 IF(HERE(J).AND.TREASR(J))K=1 IF(TALLY.EQ.TALLY2+1.AND.K.EQ.0.AND.PLACE(CHEST).EQ.0 1 .AND.ATHAND(LAMP).AND.PROP(LAMP).EQ.1)GOTO 6025 IF(ODLOC(DWFMAX).NE.DLOC(DWFMAX).AND.PCT(30))CALL RSPEAK(127) GOTO 6030 6022 CALL RSPEAK(128) C DON'T STEAL CHEST BACK FROM TROLL! IF(PLACE(MESSAG).EQ.0)CALL MOVE(CHEST,CHLOC) CALL MOVE(MESSAG,CHLOC2) DO 6023 J=1,MAXOBJ IF(.NOT.TREASR(J).OR.(J.EQ.PYRAM.AND. 1 (LOC.EQ.PLAC(PYRAM).OR.LOC.EQ.PLAC(EMRALD))).OR. 2 (J.EQ.CASK.AND.LIQ(CASK).NE.WINE).OR. 3 (ENCLSD(J).AND..NOT.ATHAND(J)))GOTO 6023 IF(AT(J).AND.FIXED(J).EQ.0)CALL CARRY(J,LOC) IF(ENCLSD(J))CALL REMOVE(J) IF(.NOT.HOLDNG(J))GOTO 6023 CALL INSERT(J,CHEST) IF(.NOT.WEARNG(J))GOTO 6023 PROP(J)=0 CALL BITOFF(J,WEARBT) 6023 CONTINUE 6024 DLOC(DWFMAX)=CHLOC ODLOC(DWFMAX)=CHLOC DSEEN(DWFMAX)=.FALSE. GOTO 6030 6025 CALL RSPEAK(186) CALL MOVE(CHEST,CHLOC) CALL MOVE(MESSAG,CHLOC2) GOTO 6024 C THIS THREATENING LITTLE DWARF IS IN THE ROOM WITH HIM! 6027 DTOTAL=DTOTAL+1 IF(ODLOC(I).NE.DLOC(I))GOTO 6030 ATTACK=ATTACK+1 IF(KNFLOC.GE.0)KNFLOC=LOC IF(RAN(1000).LT.95*(DFLAG-2))STICK=STICK+1 6030 CONTINUE C NOW WE KNOW WHAT'S HAPPENING. LET'S TELL THE POOR SUCKER ABOUT IT. IF(DTOTAL.EQ.0)GOTO 2000 IF(DTOTAL.EQ.1)GOTO 75 PRINT 67,DTOTAL 67 FORMAT(/' There are ',I1,' threatening little dwarves in the' 1 ,' room with you!') GOTO 77 75 CALL RSPEAK(4) 77 IF(ATTACK.EQ.0)GOTO 2000 IF(DFLAG.EQ.2)DFLAG=3 C IF SAVED NOT = -1, HE BYPASSED THE "START" CALL. DWARVES GET *VERY* MAD! IF(SAVED.NE.-1)DFLAG=20 IF(ATTACK.EQ.1)GOTO 79 PRINT 78,ATTACK 78 FORMAT(/' ',I1,' of them throw knives at you!') K=6 82 IF(STICK.GT.1)GOTO 83 CALL RSPEAK(K+STICK) IF(STICK.EQ.0)GOTO 2000 GOTO 84 83 PRINT 68,STICK 68 FORMAT(/' ',I1,' of them get you!') 84 OLDLC2=LOC GOTO 94100 79 CALL RSPEAK(5) K=52 GOTO 82 C DESCRIBE THE CURRENT LOCATION AND (MAYBE) GET NEXT COMMAND. C PRINT TEXT FOR CURRENT LOC. 2000 IF(LOC.EQ.0)GOTO 94100 JKK=STEXT(LOC) IF(VERB.EQ.LOOK.OR.JKK.EQ.0.OR. 1 (.NOT.TERSE.AND.MOD(ABB(LOC),ABBNUM).EQ.0) )JKK=LTEXT(LOC) IF((FORCED(LOC).OR..NOT.DARK(0)).AND.LOC.NE.200)GOTO 2001 IF(LOC.NE.200.AND. (DARK(0).OR.PROP(LAMP).EQ.0 1 .OR..NOT.ATHAND(LAMP)) )GOTO 2003 IF(PROP(LAMP).EQ.0.OR..NOT.ATHAND(LAMP))GOTO 2020 IF(PCT(35))GOTO 94000 JKK=RTEXT(294) GOTO 2020 2003 IF(WZDARK.AND.PCT(35))GOTO 94000 JKK=RTEXT(16) 2001 IF(HOLDNG(BEAR).AND..NOT.DARK(0))CALL RSPEAK(141) 2020 CALL SPEAK(JKK) K=1 ABB(LOC)=ABB(LOC)+1 IF(.NOT.FORCED(LOC))GOTO 2022 CALL TRAVL(K) IF(KILLED)GOTO 94100 GOTO 2 2022 ABB(LOC)=ABB(LOC)-1 IF(LOC.EQ.Y2.AND.PCT(25).AND..NOT.CLOSNG)CALL RSPEAK(8) IF(LOC.EQ.147.AND.ABB(LOC).EQ.1)CALL RSPEAK(216) C SEE IF HE IS WASTING HIS BATTERIES OUT IN THE OPEN. K=0 IF(.NOT.OUTSID(LOC).OR.PROP(LAMP).EQ.0)GOTO 2030 K=WASTE+1 IF(K.LE.12)GOTO 2030 CALL RSPEAK(324) K=0 2030 WASTE=K C IF WUMPUS IS CHASING STOOGE, SEE IF WUMPUS GETS HIM. IF(CHASE.EQ.0)GOTO 2040 CHASE=CHASE+1 KK=CHASE/2 PROP(WUMPUS)=KK CALL MOVE(WUMPUS,LOC) IF(KK.LT.5)GOTO 2040 IF(DARK(0))CALL RSPEAK(270) CALL PSPEAK(WUMPUS,5) GOTO 94100 C CHECK FOR RADIATION POISONING. 2040 K=1 IF(OUTSID(LOC))K=3 HEALTH=MIN0(HEALTH+1,100) IF(.NOT.HERE(RADIUM).OR. 1 (PLACE(RADIUM).EQ.-SHIELD.AND..NOT.AJAR(SHIELD)) )GOTO 2045 HEALTH=HEALTH-K-7 IF(HEALTH.GE.60)GOTO 2045 CALL RSPEAK(391+(60-HEALTH)/10) IF(HEALTH.LE.0)GOTO 94100 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). C LIKEWISE, FOR SWORD (MUST PROVE ELFIN ROYALTY). 2045 IF(OLDLOC.NE.188.OR.LOC.EQ.189.OR.LOC.EQ.188 1 .OR.PROP(BOOTH).NE.1)GOTO 2021 CALL MOVE(GNOME,0) PROP(BOOTH)=0 2021 IF(BLIND(0))GOTO 2100 ABB(LOC)=ABB(LOC)+1 I=ATLOC(LOC) 2004 IF(I.EQ.0)GOTO 2100 OBJ=I IF(OBJ.GT.MAXOBJ)OBJ=OBJ-MAXOBJ IF(OBJ.EQ.STEPS.AND.TOTING(NUGGET))GOTO 2008 IF(PROP(OBJ).GE.0)GOTO 2006 IF(CLOSED)GOTO 2008 PROP(OBJ)=0 IF(OBJ.EQ.RUG.OR.OBJ.EQ.CHAIN.OR.OBJ.EQ.SWORD 1 .OR.OBJ.EQ.CASK)PROP(OBJ)=1 IF(OBJ.EQ.CLOAK.OR.OBJ.EQ.RING)PROP(OBJ)=2 TALLY=TALLY-1 C IF REMAINING TREASURES TOO ELUSIVE, ZAP HIS LAMP. IF(TALLY.EQ.TALLY2.AND.TALLY.NE.0)LIMIT=MIN0(35,LIMIT) 2006 KK=PROP(OBJ) IF(OBJ.EQ.STEPS.AND.LOC.EQ.FIXED(STEPS))KK=1 C CALL PSPEAK(OBJ,INTS(KK)) CALL PSPEAK(OBJ,(KK))!REMOVED INTS, M.V. CALL LOOKIN(OBJ) 2008 I=LINK(I) GOTO 2004 C "I DON'T UNDERSTAND THAT!" 2060 SPK=CONFUZ(0) GOTO 2011 C "YOU CAN'T DO THAT!" (AN IMPOSSIBLE ACT, E.G., "OPEN SWORD", "FEED BOAT", ET 2070 SPK=NOWAY(0) GOTO 2011 2009 SPK=54 2011 IF(OBJ.EQ.0.OR.(OBJS(2).EQ.0.AND.IOBJS(2).EQ.0))GOTO 2015 CALL PSPEAK(OBJ,-1) C CALL TNOUA(' ',5) C HOPE REMOVING THIS IS OK, M.V. BLKLIN=.FALSE. 2015 CALL RSPEAK(SPK) BLKLIN=.TRUE. 2100 RDFLAG=.FALSE. IF(OBJX.EQ.0)GOTO 2110 OBJX=OBJX+1 IF(OBJS(OBJX).EQ.0)OBJX=0 2110 IF(OBJX.GT.0.AND.OBJS(OBJX).NE.0)GOTO 2120 IF(IOBX.EQ.0)GOTO 2120 IOBX=IOBX+1 IF(IOBJS(IOBX).EQ.0)IOBX=0 IF(IOBX.NE.0.AND.OBJS(1).NE.0)OBJX=1 2120 IF(OBJX.GT.0.OR.IOBX.GT.0)GOTO 2600 IF(OBJS(1).NE.0)OBJX=1 IF(IOBJS(1).NE.0)IOBX=1 VRBX=VRBX+1 IF(VERBS(VRBX).NE.0)GOTO 2600 CALL CLRLIN RDFLAG=.TRUE. 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" < HNTMIN (SPECIAL STUFF, SEE DATABASE C NOTES). 2600 DO 2602 HINT=HNTMIN,HNTMAX IF(HINTED(HINT))GOTO 2602 IF(AND(LOCCON(LOC),BITS(HINT)).EQ.0)HINTLC(HINT)=-1 HINTLC(HINT)=HINTLC(HINT)+1 IF(HINTLC(HINT).GE.HINTS(HINT,1))GOTO 40000 2602 CONTINUE C gotta add 2603 as we want to "GO TO" here, but compiler C doesn't like it when we try to goto 2602 as it is part of a loop. 2603 CONTINUE 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). IF(.NOT.CLOSED)GOTO 2605 IF(PROP(OYSTER).LT.0.AND.TOTING(OYSTER)) 1 CALL PSPEAK(OYSTER,1) DO 2604 I=1,MAXOBJ 2604 IF(TOTING(I).AND.PROP(I).LT.0)PROP(I)=-1-PROP(I) 2605 WZDARK=DARK(0) IF(KNFLOC.GT.0.AND.KNFLOC.NE.LOC)KNFLOC=0 I=RAN(1) IF(.NOT.RDFLAG)GOTO 2608 C GET A NEW INPUT CLAUSE, OR FINISH GETTING CURRENT ONE. CALL GETWDS VRBX=1 OBJX=0 IF(OBJS(1).NE.0)OBJX=1 IOBX=0 IF(IOBJS(1).NE.0)IOBX=1 RDFLAG=.TRUE. 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. 2608 FOOBAR=MIN0(0,-FOOBAR) COMBO=MIN0(0,-COMBO) TURNS=TURNS+1 IF(DEMO.AND.TURNS.GE.SHORT)GOTO 92800 IF(LOGOUT(0))GOTO 92800 C IF(TURNS.EQ.3)CALL DATIME(XXD,XXT) C IF(TURNS.NE.45)GOTO 2609 C SEE IF TIMER UUO HAS BEEN ZAPPED; IF SO, HE'S CHEATING. C FLUSHING THIS FOR NOW. EATS CPU IN PA1050. [D. LONG] C CALL DATIME(YYD,YYT) C IF(XXD.EQ.YYD.AND.XXT.EQ.YYT)SAVED=0 2609 IF(TURNS.EQ.310.AND.ABBNUM.NE.10000.AND..NOT.TERSE) 1 CALL RSPEAK(273) C BUMP ALL THE RIGHT CLOCKS FOR RECONNING BATTERY LIFE AND CLOSING. IF(CLOSED)CLOCK3=CLOCK3-1 IF(CLOCK3.EQ.-7)GOTO 93300 IF(CLOCK3.NE.0)GOTO 2621 PROP(PHONE)=0 PROP(BOOTH)=0 CALL RSPEAK(284) 2621 IF(TALLY.EQ.0.AND.INSIDE(LOC).AND.LOC.NE.Y2)CLOCK1=CLOCK1-1 IF(CLOCK1.EQ.0)GOTO 90000 IF(CLOCK1.LT.0)CLOCK2=CLOCK2-1 IF(CLOCK2.EQ.0)GOTO 91000 C IF(PROP(LAMP).EQ.1)LIMIT=LIMIT-1 IF(LIMIT.EQ.0)GOTO 92400 IF(LIMIT.LT.0.AND.OUTSID(LOC))GOTO 92600 IF(LIMIT.LE.40)GOTO 92000 19999 VERB=VAL(VERBS(VRBX)) OBJ=0 IF(OBJX.NE.0)OBJ=OBJS(OBJX) IOBJ=0 IF(IOBX.NE.0)IOBJ=IOBJS(IOBX) IF(KNFLOC.NE.LOC.OR.(OBJ.NE.KNIFE.AND.IOBJ.NE.KNIFE))GOTO 19998 KNFLOC=-1 SPK=116 GOTO 2011 19998 GOTO (2750,2700,4000,2710), CLASS(VERBS(VRBX)) 2700 CALL BUG(22) 2710 SPK=VERB GOTO 2011 C IT IS A MOTION VERB. ANALYZE IT & LOOP TO 2, IF NOT DEAD. 2750 CALL TRAVL(VERB) IF(KILLED)GOTO 94100 GOTO 2 C ACTION VERB 'LEAVE' (DROP) HAS NO OBJECT. 3100 CALL BUG(29) C VERB 'SAY' OR 'YELL' SLIPPED THROUGH WITH AN OBJECT. 3200 CALL BUG(34) C ANALYSE A VERB. 4000 SPK=ACTSPK(VERB) IF(OBJ.NE.0.OR.IOBJ.NE.0)GOTO 4090 C ANALYSE AN INTRANSITIVE VERB (IE, NO OBJECT GIVEN YET). GOTO( 9 10100,10000,10000,10400, 2009,10400,20700,20800,10000,10000, 9 2011,21200,11300,11400,11500,10000,10000,11800,10000,12000, 9 10000,12200,12300,12400,12500,12600,10000,10000,10000,13000, 9 13100,10100,10000,10000,13500,23600, 3100,13800,10000,10000, 9 10000,10000,10000,10100,10100,10100,10100,14800,10400,10400, 9 25100,25200,25300,25400,25500,25600,25700,25800,25900),VERB C 01-10 TAKE DROP SAY OPEN NOTH CLOSE ON OFF WAVE CALM C 11-20 WALK KILL POUR EAT DRINK RUB THROW QUIT FIND INVEN C 21-30 FEED FILL BLAST SCORE FOO BRIEF READ BREAK WAKE SUSPD C 31-40 HOUR YANK WEAR HIT ANSWR BLOW LEAVE YELL DIAL PLAY C 41-50 PICK PUT TURN GET INSRT REMOV BURN GRIPE LOCK UNLOK C 51-60 HEALTH LOOK COMBO SWEEP TERSE WIZ MAP GATE PIRLOC CALL BUG(23) C ANALYSE A TRANSITIVE VERB. 4090 GOTO( 9 20100,20200, 3200,20400, 2009,20600,20700,20800,20900, 2011, 9 2011,21200,21300,21400,21500,21600,21700, 2011,21900,21900, 9 22100,22200,12300, 2011, 2011,22600,22700,22800,22900, 2011, 9 2011,23200,23300,23400,23500,23600,20200, 3200,23900,24000, 9 24100,24200,24300,24400,24500,24600,24700, 2060,24900,25000, 9 2060,25200, 2070,25400, 2060, 2060, 2060, 2060, 2060),VERB C 01-10 TAKE DROP SAY OPEN NOTH CLOSE ON OFF WAVE CALM C 11-20 WALK KILL POUR EAT DRINK RUB THROW QUIT FIND INVEN C 21-30 FEED FILL BLAST SCORE FOO BRIEF READ BREAK WAKE SUSPD C 31-40 HOUR YANK WEAR HIT ANSWR BLOW LEAVE YELL DIAL PLAY C 41-50 PICK PUT TURN GET INSRT REMOV BURN GRIPE LOCK UNLOK C 51-60 HEALTH LOOK COMBO SWEEP TERSE WIZ MAP GATE PIRLOC CALL BUG(24) C ROUTINES FOR PERFORMING THE VARIOUS ACTION VERBS C STATEMENT NUMBERS IN THIS SECTION ARE 10000 FOR INTRANSITIVE VERBS, 20000 FOR C TRANSITIVE, PLUS 100 TIMES THE VERB NUMBER. MANY INTRANSITIVE VERBS USE THE C TRANSITIVE CODE, AND SOME VERBS USE CODE FOR OTHER VERBS, AS NOTED BELOW. C RANDOM INTRANSITIVE VERBS COME HERE. CLEAR OBJ JUST IN CASE (SEE "ATTACK"). 10000 CALL A5TOA1(VTXT(VRBX,1),VTXT(VRBX,2),'WHAT?',TK,K) PRINT 10002,(TK(I),I=1,K) 10002 FORMAT(/' ',20A1) OBJS(1)=0 OBJX=0 GOTO 2600 10010 CALL A5TOA1(VTXT(VRBX,1),VTXT(VRBX,2),'it?',TK,K) PRINT 10012,(TK(I),I=1,K) 10012 FORMAT(/' Where do you want to ',20A1) GOTO 2600 C CONSTRUCT MSG: "I DON'T KNOW HOW TO [VERB] THE [OBJ]", AND VARIANTS. C CARRY, NO OBJECT GIVEN YET. OK IF ONLY ONE OBJECT PRESENT. 10100 IF(ATLOC(LOC).EQ.0.OR.LINK(ATLOC(LOC)).NE.0.OR.BLIND(0)) 1 GOTO 10000 L1=DWFMAX-1 DO 10110 I=1,L1 IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 10000 10110 CONTINUE OBJ=ATLOC(LOC) IF(VERB.EQ.YANK)GOTO 23200 IF(VERB.EQ.WEAR)GOTO 23300 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 "YANK" AND "WEAR" ALSO WEAVE INTO THIS CODE, SINCE THEY ARE MOSTLY C JUST RESTRICTED CARRY'S. 20100 IF(OBJ.EQ.BOAT)SPK=281 IF(PLURAL(OBJ))SPK=297 IF(PREP.NE.PREPOF)GOTO 20104 IF(OBJ.NE.0.AND.IOBJ.NE.0)GOTO 2060 IF(OBJ.EQ.0)OBJ=IOBJ IOBJ=0 GOTO 20200 20104 IF(HOLDNG(OBJ))GOTO 2011 ASSIGN 20106 TO RETN GOTO 20190 20106 IF(PREP.EQ.PREPIN)GOTO 24500 IF(PREP.EQ.PREPFR.OR.ENCLSD(OBJ))GOTO 24600 C THE NEXT LINES ARE FOR 'TAKING' LIQUIDS (WATER, OIL & WINE). C IF WE ARE HOLDING A CONTAINER (BOTTLE OR CASK), WE CAN TAKE THE C THE LIQUID BY FILLING THE CONTAINER. IF THERE IS A CONTAINER NEARBY C HOLDING THE REQUESTED LIQUID, WE WILL PICK UP THE CONTAINER. IF(IOBJ.EQ.0)GOTO 20110 SPK=313 IF(OBJ.NE.CASK.AND.OBJ.NE.BOTTLE)GOTO 2011 K=0 IF(OBJ.EQ.CASK)K=1 IOBJ=IOBJ+K IF(LIQ(OBJ).EQ.IOBJ)GOTO 20116 SPK=302+K IF(PROP(OBJ).NE.1)GOTO 2011 GOTO 20118 20110 IF(OBJ.NE.WATER.AND.OBJ.NE.OIL.AND.OBJ.NE.WINE)GOTO 20120 IOBJ=OBJ K=0 OBJ=BOTTLE IF(.NOT.HERE(BOTTLE))GOTO 20114 IF(PROP(BOTTLE).NE.1)GOTO 20112 IF(.NOT.HERE(CASK).OR.(HERE(CASK).AND.PROP(CASK).EQ.1)) 1 GOTO 20118 OBJ=0 CALL RSPEAK(304) GOTO 2600 20112 IF(LIQ(BOTTLE).EQ.IOBJ)GOTO 20116 20114 SPK=312 IF(.NOT.HERE(CASK))GOTO 2011 OBJ=CASK K=1 IF(PROP(CASK).EQ.1)GOTO 20118 IF(LIQ(CASK).EQ.IOBJ)GOTO 20116 SPK=315 IF(.NOT.ATHAND(BOTTLE))SPK=303 GOTO 2011 20116 IF(.NOT.HOLDNG(OBJ))GOTO 20120 SPK=302+K GOTO 2011 20118 IF(HOLDNG(OBJ))GOTO 22200 GOTO 20120 C *** END OF LIQUID STUFF C 'WEAR' AND 'YANK' WEAVE IN HERE. 20120 SPK=343 IF(OBJ.EQ.BEAR .OR. BURDEN(0)+BURDEN(OBJ).LE.15 )GOTO 20125 SPK=92 IF(.NOT.WEARNG(OBJ))GOTO 2011 PROP(OBJ)=0 CALL BITOFF(OBJ,WEARBT) GOTO 2011 C CLOAK. BIG TROUBLE AHEAD. CAN ONLY GET HERE VIA 'YANK'. 20125 IF(OBJ.NE.CLOAK.OR.PROP(CLOAK).NE.2)GOTO 20130 PROP(ROCKS)=1 PROP(CLOAK)=0 FIXED(CLOAK)=0 CALL CARRY(CLOAK,LOC) CALL RSPEAK(241) IF(AT(WUMPUS).AND.PROP(WUMPUS).EQ.0)GOTO 22900 GOTO 2100 C POSTER: HIDES WALL SAFE. 20130 IF(OBJ.NE.POSTER.OR.PLACE(SAFE).NE.0)GOTO 20160 PROP(POSTER)=1 SPK=362 C MOVE SAFE AND WALL CONTAINING SAFE INTO VIEW. CALL DROP(SAFE,LOC) CALL DROP(WALL2,LOC) GOTO 20180 C BOAT: NEED THE POLE TO PUSH IT 20160 IF(OBJ.NE.BOAT)GOTO 20165 SPK=218 IF(.NOT.TOTING(POLE).AND.PLACE(POLE).NE.-BOAT)GOTO 2011 PROP(BOAT)=1 SPK=221 GOTO 20180 C BIRD: GOT TO HAVE CAGE, BUT ROD CAN'T BE AROUND TO TAKE BIRD 20165 IF(OBJ.NE.BIRD.OR.PROP(BIRD).NE.0)GOTO 20170 SPK=26 IF(ATHAND(ROD))GOTO 2011 SPK=27 IF(.NOT.HOLDNG(CAGE))GOTO 2011 CALL INSERT(BIRD,CAGE) CALL BITOFF(CAGE,OPENBT) GOTO 2009 C SWORD: IF IN ANVIL, NEEDS CROWN & MUST YANK. 20170 IF(OBJ.NE.SWORD.OR.PROP(SWORD).EQ.0)GOTO 20180 IF(IOBJ.NE.0.AND.IOBJ.NE.ANVIL)GOTO 2070 IF(VERB.EQ.YANK)GOTO 20175 C HE WANTS THE SWORD, BUT HASN'T ESTABLISHED HIS ROYAL BLOOD, OR HE C HASN'T PULLED HARD ENOUGH. OR NEITHER. IF(.NOT.YES(215,0,0))GOTO 2009 20175 IF(WEARNG(CROWN))GOTO 20180 CALL PSPEAK(SWORD,2) IF(CLOSED)GOTO 93000 FIXED(SWORD)=-1 PROP(SWORD)=3 GOTO 2100 20180 CALL CARRY(OBJ,LOC) IF(OBJ.EQ.POLE.OR.OBJ.EQ.SKEY.OR.OBJ.EQ.SWORD 1 .OR.((OBJ.EQ.CLOAK.OR.OBJ.EQ.RING) 2 .AND..NOT.WEARNG(OBJ)) )PROP(OBJ)=0 IF(VERB.NE.YANK.OR.OBJ.EQ.SWORD)GOTO 2011 SPK=204 GOTO 2011 C THIS IS A QUASI-SUBROUTINE, CALLED FROM 'TAKE' AND FROM 'INSERT', WHEN C THE ITEM IS NOT CURRENTLY BEING TOTED. 'RETN' IS A VARIABLE DEFINED C TO BE THE RETURN ADDRESS. 20190 SPK=NOWAY(0) IF(OBJ.EQ.PLANT.AND.PROP(PLANT).LE.0)SPK=115 IF(OBJ.EQ.BEAR.AND.PROP(BEAR).EQ.1)SPK=169 IF(OBJ.EQ.CHAIN.AND.PROP(BEAR).NE.0)SPK=170 IF(OBJ.EQ.SWORD.AND.PROP(SWORD).EQ.5)SPK=208 IF(OBJ.EQ.CLOAK.AND.PROP(CLOAK).EQ.2)SPK=242 IF(OBJ.EQ.AXE.AND.PROP(AXE).EQ.2)SPK=246 IF(OBJ.EQ.PHONE)SPK=251 IF(OBJ.EQ.BEES.OR.OBJ.EQ.HIVE)SPK=295 IF(OBJ.EQ.STICKS)SPK=296 IF(FIXED(OBJ).NE.0)GOTO 2011 GOTO RETN C DROP/DISCARD OBJECT. "THROW" ALSO COMES HERE FOR MOST OBJECTS. C SPECIAL CASES FOR BIRD (MIGHT ATTACK SNAKE OR DRAGON) AND CAGE (MIGHT C CONTAIN BIRD) AND VASE. C DROP COINS IN VENDING MACHINE FOR EXTRA BATTERIES. 20200 IF(HOLDNG(ROD2).AND.OBJ.EQ.ROD.AND..NOT.HOLDNG(ROD))OBJ=ROD2 IF(PLURAL(OBJ))SPK=105 K=LIQ(BOTTLE) IF(K.EQ.OBJ)OBJ=BOTTLE IF(OBJ.NE.BOTTLE)K=LIQ(CASK) IF(OBJ.NE.BOTTLE.AND.K.EQ.OBJ)OBJ=CASK IF(.NOT.TOTING(OBJ))GOTO 2011 IF(PREP.EQ.PREPIN)GOTO 24500 IF(OBJ.NE.BIRD.OR..NOT.HERE(SNAKE))GOTO 20220 CALL RSPEAK(30) IF(CLOSED)GOTO 93000 CALL REMOVE(BIRD) CALL DSTROY(SNAKE) C SET SNAKE PROP FOR USE BY TRAVEL OPTIONS PROP(SNAKE)=1 CALL DROP(BIRD,LOC) GOTO 2100 20220 SPK=344 IF(VERB.EQ.LEAVE)SPK=353 IF(VERB.EQ.THROW)SPK=352 IF(VERB.EQ.TAKE)SPK=54 IF(OBJ.NE.POLE.OR..NOT.HOLDNG(BOAT))GOTO 20240 SPK=280 GOTO 2011 20240 IF(OBJ.NE.BIRD.OR..NOT.AT(DRAGON).OR.PROP(DRAGON).NE.0) 1 GOTO 20260 CALL RSPEAK(154) CALL REMOVE(BIRD) CALL DSTROY(BIRD) IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1 GOTO 2100 20260 IF(OBJ.NE.BEAR.OR..NOT.AT(TROLL))GOTO 20270 SPK=163 CALL DSTROY(TROLL) CALL DSTROY(TROLL+MAXOBJ) CALL MOVE(TROLL2,PLAC(TROLL)) CALL MOVE(TROLL2+MAXOBJ,FIXD(TROLL)) CALL JUGGLE(CHASM) PROP(TROLL)=2 GOTO 20290 20270 IF(OBJ.NE.VASE.OR.LOC.EQ.PLAC(PILLOW))GOTO 20275 PROP(VASE)=2 IF(AT(PILLOW))PROP(VASE)=0 CALL PSPEAK(VASE,PROP(VASE)+1) IF(PROP(VASE).NE.0)FIXED(VASE)=-1 GOTO 20290 20275 IF(OBJ.NE.FLY.OR..NOT.AT(SPIDER)) GOTO 20280 PROP(FLY)=1 PROP(SPIDER)=1 SPK=379 CALL DSTROY(FLY) GOTO 2011 20280 IF(WORN(OBJ).OR.OBJ.EQ.POLE.OR.OBJ.EQ.BOAT)PROP(OBJ)=0 IF(WORN(OBJ))CALL BITOFF(OBJ,WEARBT) IF(OBJ.EQ.POLE)PROP(BOAT)=0 20290 IF(ENCLSD(OBJ))CALL REMOVE(OBJ) CALL DROP(OBJ,LOC) GOTO 2011 C OPEN/CLOSE/LOCK/UNLOCK: NO OBJECT GIVEN. C ASSUME VARIOUS THINGS IF PRESENT. 10400 SPK=28 K=0 DO 10410 I=1,MAXOBJ IF(.NOT.(HERE(I).AND.HINGED(I)))GOTO 10410 OBJ=I K=K+1 10410 CONTINUE IF(K.GT.1)GOTO 10000 IF(OBJ.NE.0)GOTO 10420 IF(VERB.EQ.LOCK.OR.VERB.EQ.UNLOCK)GOTO 2011 GOTO 10000 10420 IF(VERB.EQ.LOCK)GOTO 24900 IF(VERB.EQ.UNLOCK)GOTO 25000 IF(VERB.EQ.SHUT)GOTO 20600 C OPEN. SPECIAL STUFF FOR OPENING CLAM/OYSTER. C THE FOLLOWING CAN BE OPENED WITHOUT A KEY: C CLAM/OYSTER, DOOR, PDOOR, BOTTLE, CASK, CAGE 20400 IF(.NOT.HINGED(OBJ))GOTO 2070 SPK=253 IF(OBJ.EQ.PDOOR.AND.PROP(PDOOR).EQ.1)GOTO 2011 SPK=336 IF(AJAR(OBJ))GOTO 2011 IF(LOCKS(OBJ).OR.IOBJ.EQ.KEYS.OR.IOBJ.EQ.SKEY)GOTO 25000 SPK=337 IF(OBJ.EQ.DOOR)SPK=111 IF(LOCKED(OBJ))GOTO 2011 IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)GOTO 20410 CALL BITON(OBJ,OPENBT) GOTO 2009 C CLAM/OYSTER. 20410 K=0 IF(OBJ.EQ.OYSTER)K=1 SPK=124+K IF(HOLDNG(OBJ))SPK=120+K IF(.NOT.ATHAND(TRIDNT))SPK=122+K IF(IOBJ.NE.0.AND.IOBJ.NE.TRIDNT)SPK=376+K IF(SPK.NE.124)GOTO 2011 CALL DSTROY(CLAM) CALL DROP(OYSTER,LOC) CALL DROP(PEARL,105) GOTO 2011 C CLOSE. SHUT. C THE FOLLOWING CAN BE CLOSED WITHOUT KEYS: C DOOR, PDOOR, BOTTLE, CASK, CAGE 20600 IF(.NOT.HINGED(OBJ))GOTO 2070 SPK=338 IF(.NOT.AJAR(OBJ))GOTO 2011 IF(LOCKS(OBJ))GOTO 24900 CALL BITOFF(OBJ,OPENBT) GOTO 2009 C LIGHT LAMP 20700 IF(.NOT.ATHAND(LAMP))GOTO 2011 SPK=184 IF(LIMIT.LT.0)GOTO 2011 SPK=321 IF(PROP(LAMP).EQ.1)GOTO 2011 PROP(LAMP)=1 K=39 IF(LOC.EQ.200)K=108 CALL RSPEAK(K) IF(WZDARK)GOTO 2000 GOTO 2100 C LAMP OFF 20800 IF(.NOT.ATHAND(LAMP))GOTO 2011 SPK=322 IF(PROP(LAMP).EQ.0)GOTO 2011 PROP(LAMP)=0 CALL RSPEAK(40) IF(DARK(0))CALL RSPEAK(16) GOTO 2100 C WAVE. NO EFFECT UNLESS WAVING ROD AT FISSURE. 20900 IF((.NOT.HOLDNG(OBJ)).AND.(OBJ.NE.ROD.OR..NOT.HOLDNG(ROD2))) 1 SPK=29 IF(OBJ.NE.ROD.OR..NOT.AT(FISSUR).OR..NOT.HOLDNG(OBJ) 1 .OR.CLOSNG)GOTO 2011 IF(IOBJ.NE.0.AND.IOBJ.NE.FISSUR)GOTO 2011 PROP(FISSUR)=1-PROP(FISSUR) CALL PSPEAK(FISSUR,2-PROP(FISSUR)) IF(CHASE.EQ.0.OR.PROP(FISSUR).NE.0)GOTO 2100 C DEMISE OF THE WUMPUS. CHAMP MUST HAVE JUST CROSSED BRIDGE. IF((LOC.EQ.17.AND.OLDLOC.NE.27) 1 .OR.(LOC.EQ.27.AND.OLDLOC.NE.17))GOTO 2100 CALL RSPEAK(244) CHASE=0 CALL DROP(RING,209) CALL MOVE(WUMPUS,209) PROP(WUMPUS)=6 CALL BITON(WUMPUS,DEADBT) IF(PLACE(AXE).NE.PLAC(WUMPUS))GOTO 2100 FIXED(AXE)=0 PROP(AXE)=0 GOTO 2100 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 KILL OBJ WITH IOBJ. 21200 L1=DWFMAX-1 DO 21210 DWARFN=1,L1 IF(DLOC(DWARFN).EQ.LOC.AND.DFLAG.GE.2)GOTO 21220 21210 CONTINUE DWARFN=0 21220 IF(OBJ.NE.0)GOTO 21240 IF(DWARFN.NE.0)OBJ=DWARF IF(HERE(SNAKE))OBJ=OBJ*MAXOBJ+SNAKE IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)OBJ=OBJ*MAXOBJ+DRAGON IF(AT(TROLL))OBJ=OBJ*MAXOBJ+TROLL IF(HERE(GNOME))OBJ=OBJ*MAXOBJ+GNOME IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)OBJ=OBJ*MAXOBJ+BEAR IF(HERE(WUMPUS).AND.PROP(WUMPUS).EQ.0)OBJ=OBJ*MAXOBJ+WUMPUS IF(OBJ.GT.MAXOBJ)GOTO 10000 IF(OBJ.NE.0)GOTO 21240 C CAN'T ATTACK BIRD BY THROWING AXE. IF(HERE(BIRD).AND.VERB.NE.THROW)OBJ=BIRD C CLAM AND OYSTER BOTH TREATED AS CLAM FOR INTRANSITIVE CASE; NO HARM DONE. IF(HERE(CLAM).OR.HERE(OYSTER))OBJ=MAXOBJ*OBJ+CLAM IF(OBJ.GT.MAXOBJ)GOTO 10000 21240 IF(OBJ.NE.BIRD)GOTO 21245 SPK=137 IF(CLOSED)GOTO 2011 CALL DSTROY(BIRD) PROP(BIRD)=0 IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1 SPK=45 21245 IF(OBJ.NE.FLY)GOTO 21250 PROP(FLY)=2 SPK=398 CALL DSTROY(FLY) GOTO 2011 21250 IF(OBJ.EQ.DWARF)GOTO 21270 IF(OBJ.EQ.0)SPK=44 IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)SPK=150 IF(AT(DOG).AND.PROP(DOG).EQ.1)SPK=291 IF(OBJ.EQ.SNAKE)SPK=46 IF(OBJ.EQ.DRAGON.OR.(OBJ.EQ.WUMPUS.AND.PROP(WUMPUS).EQ.6))SPK=167 IF(OBJ.EQ.TROLL)SPK=157 IF(OBJ.EQ.BEAR)SPK=165+(PROP(BEAR)+1)/2 IF(OBJ.EQ.GNOME)SPK=320 IF(IOBJ.NE.AXE.OR.VERB.EQ.THROW.OR. 1 (OBJ.NE.DOG.AND.OBJ.NE.WUMPUS.AND.OBJ.NE.DRAGON 2 .AND.OBJ.NE.TROLL))GOTO 21253 IOBJ=OBJ OBJ=IOBJS(IOBX) SPK=110 GOTO 21700 21253 IF(IOBJ.NE.0.AND.IOBJ.NE.AXE)GOTO 2070 IF(OBJ.NE.DRAGON.OR.PROP(DRAGON).NE.0)GOTO 2011 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 THERE IS SOME AMOUNT OF PAIN HERE, TO FORCE GETWDS TO DO THE RIGHT THING. CALL RSPEAK(49) CALL GETLIN WDX=0 CALL CLRLIN IF(TXT(1,1).EQ.'Y'.OR.TXT(1,1).EQ.'YES')GOTO 21255 WORDS(1)=-2 RDFLAG=.TRUE. GOTO 2600 21255 CALL PSPEAK(DRAGON,1) CALL BITON(DRAGON,DEADBT) PROP(DRAGON)=2 PROP(RUG)=0 K=(PLAC(DRAGON)+FIXD(DRAGON))/2 CALL MOVE(DRAGON+MAXOBJ,-1) CALL MOVE(RUG+MAXOBJ,0) CALL MOVE(DRAGON,K) CALL MOVE(RUG,K) DO 21260 OBJ=1,MAXOBJ IF(PLACE(OBJ).EQ.PLAC(DRAGON).OR.PLACE(OBJ).EQ.FIXD(DRAGON)) 1 CALL MOVE(OBJ,K) 21260 CONTINUE WORDS(1)=0 LOC=K NEWLOC=K GOTO 2 C HE IS ATTACKING A DWARF. IF USING SOMETHING OTHER THAN AXE OR SWORD, C GOODBYE CHARLIE. IF USING NOTHING, DON'T LET HIM. IF USING AXE OR C SWORD, THE FOLLOWING ODDS PREVAIL (IF I CALCULATED THIS MESS RIGHT!) C (THE END OF LINE FIGURE IS THE CULULATIVE PROBABILITY OF THE EVENT): C .25 - HERO KILLS DWARF (.25) C .75 - HERO MISSES C .25 - HERO GETS KNIFE IN (HIS) RIBS. DIES. (.1875) C .75 - HERO CAN'T MAKE A CLEAN THRUST C .36 - STANDOFF (.2) C .64 - DWARF SLASHES C .61 - DWARF MISSES! (.22) C .39 - DWARF KILLS HERO (.14) C ADVENTURER HAS 1/3 CHANCE OF GETTING NAILED, 1/4 CHANCE OF NAILING C DWARF. ALL BY WAY OF ENCOURAGING HIM TO THROW THE AXE. 21270 IF(OBJ.EQ.DWARF.AND.CLOSED)GOTO 93000 SPK=49 IF(IOBJ.EQ.0)GOTO 2011 SPK=355 IF(IOBJ.NE.AXE.AND.IOBJ.NE.SWORD)GOTO 21275 IF(PCT(25))GOTO 21753 IF(PCT(25))GOTO 21275 CALL RSPEAK(354) IF(PCT(36))GOTO 2100 CALL RSPEAK(356) SPK=52 IF(PCT(61))GOTO 2011 SPK=53 C HERO IS GONZO. 21275 CALL RSPEAK(SPK) OLDLC2=LOC GOTO 94100 C POUR. IF NO OBJECT, ASSUME LIQ IN CONTAINER, IF HOLDING ONLY ONE. C SPECIAL TESTS FOR POURING WATER OR OIL ON PLANT OR RUSTY DOOR. 11300 IF(.NOT.HOLDNG(BOTTLE).AND..NOT.HOLDNG(CASK))GOTO 10000 K=LIQ(BOTTLE) KK=LIQ(CASK) IF(HOLDNG(BOTTLE).AND.K.NE.0.AND.HOLDNG(CASK) 1 .AND.KK.NE.0)GOTO 10000 IF(KK.NE.0.AND.HOLDNG(CASK))OBJ=CASK IF(K.NE.0.AND.HOLDNG(BOTTLE))OBJ=BOTTLE IF(OBJ.EQ.0)GOTO 10000 C POUR OBJ FROM IOBJ. 21300 SPK=78 IF(OBJ.NE.BOTTLE.AND.OBJ.NE.CASK)GOTO 21310 IOBJ=OBJ OBJ=LIQ(IOBJ) SPK=316 IF(OBJ.EQ.0)GOTO 2011 GOTO 21320 21310 IF(OBJ.LT.WATER.OR.OBJ.GT.WINE+1)GOTO 2011 SPK=29 IF(.NOT.HOLDNG(BOTTLE).AND..NOT.HOLDNG(CASK))GOTO 2011 IF(HOLDNG(BOTTLE).AND.LIQ(BOTTLE).EQ.OBJ)IOBJ=BOTTLE IF(HOLDNG(CASK).AND.LIQ(CASK).EQ.OBJ)IOBJ=CASK IF(IOBJ.EQ.0)GOTO 2011 21320 SPK=335 IF(.NOT.AJAR(IOBJ))GOTO 2011 IF(IOBJ.EQ.CASK)OBJ=OBJ+1 PROP(IOBJ)=1 CALL REMOVE(OBJ) PLACE(OBJ)=0 SPK=77 IF(IOBJ.NE.CASK)GOTO 21330 OBJ=OBJ-1 SPK=104 21330 IF(.NOT.(AT(PLANT).OR.AT(DOOR).OR.AT(SWORD)).OR. 1 AT(SWORD).AND.PROP(SWORD).EQ.0)GOTO 2011 IF(AT(DOOR))GOTO 21340 IF(AT(SWORD))GOTO 21350 SPK=112 IF(OBJ.NE.WATER)GOTO 2011 CALL PSPEAK(PLANT,PROP(PLANT)+1) PROP(PLANT)=MOD(PROP(PLANT)+2,6) PROP(PLANT2)=PROP(PLANT)/2 NEWLOC=LOC GOTO 2 21340 PROP(DOOR)=0 IF(OBJ.NE.OIL)GOTO 21341 PROP(DOOR)=1 CALL BITOFF(DOOR,LOCKBT) CALL BITON(DOOR,OPENBT) 21341 SPK=113+PROP(DOOR) GOTO 2011 C IF SWORD IS ALREADY OILY, DON'T LET HIM CLEAN IT. NO SOAP. 21350 IF(PROP(SWORD).EQ.5)GOTO 21360 PROP(SWORD)=4 IF(OBJ.NE.OIL)GOTO 21360 PROP(SWORD)=5 FIXED(SWORD)=-1 21360 SPK=206+PROP(SWORD)-4 GOTO 2011 C EAT. INTRANSITIVE: ASSUME EDIBLE IF PRESENT, ELSE ASK WHAT. TRANSITIVE: C FOOD/MUSHROOMS/CAKES OK, SOME THINGS LOSE APPETITE, REST ARE RIDICULOUS. C IF HE HAS MORE THAN ONE EDIBLE, OR NONE, 'EAT' IS AMBIGUOUS WITHOUT C AN EXPLICIT OBJECT. 11400 K=0 DO 11410 I=1,MAXOBJ IF(.NOT.(HERE(I).AND.EDIBLE(I))) GOTO 11410 K=K+1 KK=I 11410 CONTINUE IF(K.NE.1)GOTO 10000 OBJ=KK IF(OBJ.NE.FOOD.AND.OBJ.NE.HONEY)GOTO 21400 11420 IF(OBJ.EQ.HONEY)TALLY2=TALLY2+1 CALL DSTROY(OBJ) SPK=72 GOTO 2011 C IF HE ATE THE RIGHT THING AND IS IN THE RIGHT PLACE, MOVE HIM TO C THE OTHER PLACE WITH ALL HIS JUNK. OTHERWISE, NARKY MESSAGE. 21400 IF(OBJ.EQ.FOOD.OR.OBJ.EQ.HONEY)GOTO 11420 IF(OBJ.EQ.BIRD.OR.OBJ.EQ.SNAKE.OR.OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER 1 .OR.OBJ.EQ.FLOWER.OR.OBJ.EQ.FLY)SPK=301 IF(OBJ.EQ.DWARF.OR.OBJ.EQ.DRAGON.OR.OBJ.EQ.TROLL 1 .OR.OBJ.EQ.DOG.OR.OBJ.EQ.WUMPUS.OR.OBJ.EQ.BEAR 2 .OR.OBJ.EQ.GNOME)SPK=250 IF(OBJ.NE.MUSHRM.AND.OBJ.NE.CAKES)GOTO 2011 K=OBJ-MUSHRM LL=229+K K=159-K KK=SKEY IF(OBJ.EQ.MUSHRM)KK=TDOOR IF(OBJ.EQ.MUSHRM.AND.LOC.NE.158)TALLY2=TALLY2+1 CALL DSTROY(OBJ) SPK=228 C IF(.NOT. (HERE(INTS(KK)).OR.FIXED(KK).EQ.LOC) )GOTO 2011 IF(.NOT. (HERE((KK)).OR.FIXED(KK).EQ.LOC) )GOTO 2011!REMOVED INTS, M.V. CALL RSPEAK(LL) C IF HE HASN'T TAKEN TINY KEY OFF SHELF, DON'T LET HIM GET IT FOR FREE! DO 21440 OBJ=1,MAXOBJ IF(OBJ.EQ.SKEY.AND.PROP(SKEY).EQ.1)GOTO 21440 IF(PLACE(OBJ).EQ.PLAC(KK).AND.FIXED(OBJ).EQ.0)CALL MOVE(OBJ,K) 21440 CONTINUE IF(LOC.EQ.PLAC(SKEY).AND.PLACE(SKEY).EQ.PLAC(SKEY)) 1 TALLY2=TALLY2+1 LOC=K NEWLOC=K GOTO 2 C DRINK. IF NO OBJECT, ASSUME WATER OR WINE AND LOOK FOR THEM HERE. C IF POTABLE IS IN BOTTLE OR CASK, DRINK THAT. IF NOT, SEE IF THERE C IS SOMETHING DRINKABLE NEARBY (STREAM, LAKE, WINE FOUNTAIN, ETC.), C AND DRINK THAT. IF HE HAS STUFF IN BOTH CONTAINERS, ASK WHICH. C DRINK OBJ FROM IOBJ 11500 LL=LIQLOC(LOC) IF(.NOT.ATHAND(BOTTLE).AND..NOT.ATHAND(CASK) 1 .AND.LL.NE.WINE.AND.LL.NE.WATER)GOTO 10000 K=LIQ(BOTTLE) KK=LIQ(CASK) IF(.NOT.ATHAND(BOTTLE).OR.K.EQ.0)GOTO 11520 IF(ATHAND(CASK).AND.KK.NE.0.AND.KK.NE.K)GOTO 10000 OBJ=K IOBJ=BOTTLE GOTO 21560 11520 IF(.NOT.ATHAND(CASK).OR.KK.EQ.0)GOTO 11540 OBJ=KK IOBJ=CASK GOTO 21560 11540 IF(LL.EQ.0)GOTO 10000 OBJ=LL IOBJ=-1 GOTO 21560 21500 IF(OBJ.EQ.0.AND.(IOBJ.EQ.BOTTLE.OR.IOBJ.EQ.CASK))OBJ=LIQ(IOBJ) SPK=110 IF(OBJ.EQ.OIL)SPK=301 IF(OBJ.NE.WATER.AND.OBJ.NE.WINE)GOTO 2011 IF(IOBJ.NE.0)GOTO 21560 IF(OBJ.EQ.LIQLOC(LOC))IOBJ=-1 IF(ATHAND(CASK).AND.OBJ.EQ.LIQ(CASK))IOBJ=CASK IF(ATHAND(BOTTLE).AND.OBJ.EQ.LIQ(BOTTLE))IOBJ=BOTTLE 21560 SPK=73 IF(IOBJ.EQ.-1)GOTO 21570 IF(IOBJ.EQ.CASK)OBJ=OBJ+1 CALL REMOVE(OBJ) PLACE(OBJ)=0 PROP(IOBJ)=1 SPK=74 IF(IOBJ.EQ.CASK)SPK=299 21570 IF(OBJ.EQ.WATER.OR.OBJ.EQ.WATER+1)GOTO 2011 C UH-OH. HE'S A WINO. LET HIM REAP THE REWARDS OF INCONTINENCE. C HE'LL WANDER AROUND FOR AWHILE, THEN WAKE UP SOMEWHERE OR OTHER, C HAVING DROPPED MOST OF HIS STUFF. CALL RSPEAK(300) IF(PROP(LAMP).EQ.1)LIMIT=LIMIT-RAN(LIMIT)/2 IF(LIMIT.LT.10)LIMIT=25 K=0 IF(PCT(15))K=49 IF(K.EQ.0.AND.PCT(15))K=53 IF(K.EQ.0.AND.PCT(25))K=132 IF(K.EQ.0)K=175 IF(OUTSID(LOC))K=5 IF(K.EQ.LOC)GOTO 2100 IF(HOLDNG(AXE))CALL MOVE(AXE,K) IF(HOLDNG(LAMP))CALL MOVE(LAMP,K) DO 21580 J=1,MAXOBJ IF(WEARNG(J))CALL BITOFF(J,WEARBT) 21580 IF(HOLDNG(J))CALL DROP(J,LOC) LOC=K NEWLOC=K GOTO 2 C RUB. YIELDS VARIOUS SNIDE REMARKS. 21600 IF(OBJ.NE.LAMP)SPK=76 GOTO 2011 C THROW OBJ AT IOBJ. C SAME AS DISCARD UNLESS AXE. THEN SAME AS ATTACK EXCEPT IGNORE BIRD, C AND IF DWARF IS PRESENT THEN ONE MIGHT BE KILLED. C AXE ALSO SPECIAL FOR DRAGON, BEAR, DOG, WUMPUS AND TROLL. C TREASURES SPECIAL FOR TROLL. C IF THROWING FOOD AT SOMEONE WHO MIGHT BE HUNGRY, GO FEED HIM. 21700 IF(PREP.EQ.PREPDN)GOTO 24200 IF(HOLDNG(ROD2).AND.OBJ.EQ.ROD.AND..NOT.HOLDNG(ROD))OBJ=ROD2 IF(.NOT.HOLDNG(OBJ))GOTO 2011 IF(OBJ.EQ.BOAT.OR.OBJ.EQ.BEAR)GOTO 2070 DWARFN=0 IF(IOBJ.NE.0)GOTO 21750 C NO INDIRECT OBJ WAS SPECIFIED. IF A DWARF IS PRESENT, ASSUME IT C IS THE IOBJ. IF NOT, LOOK FOR ANY OTHER LIVING THING. IF NO LIVING C THINGS PRESENT, TREAT 'THROW' AS 'DROP'. L1=DWFMAX-1 DO 21710 DWARFN=1,L1 IF(DLOC(DWARFN).EQ.LOC.AND.DFLAG.GE.2)GOTO 21718 21710 CONTINUE DWARFN=0 C NO DWARVES PRESENT; FIGURE OUT PLAUSIBLE OBJECT. K=0 DO 21715 I=1,MAXOBJ IF(.NOT. (AT(I).AND.LIVING(I)) )GOTO 21715 IOBJ=I K=K+1 21715 CONTINUE IF(K.EQ.0)GOTO 20200 C IT IS A BEASTIE OF SOME SORT. IS THERE MORE THAN ONE? C DON'T KILL THE BIRD BY DEFAULT. 21717 IF(K.EQ.1)GOTO 21718 CALL RSPEAK(43) GOTO 2600 21718 IF(IOBJ.EQ.BIRD)GOTO 20200 IF(TREASR(OBJ).AND.AT(TROLL))IOBJ=TROLL 21750 IF(TREASR(OBJ).AND.IOBJ.EQ.TROLL)GOTO 21790 IF(OBJ.EQ.SWORD.OR.OBJ.EQ.BOTTLE)GOTO 22800 IF(DWARFN.NE.0)IOBJ=DWARF IF(EDIBLE(OBJ).AND.LIVING(IOBJ))GOTO 22100 IF(OBJ.NE.AXE)GOTO 20200 SPK=152 IF(IOBJ.EQ.DRAGON.AND.PROP(DRAGON).EQ.0)GOTO 21755 SPK=158 IF(IOBJ.EQ.TROLL)GOTO 21755 IF(IOBJ.NE.DWARF)GOTO 21760 SPK=48 C IF SAVED NOT = -1, HE BYPASSED THE "START" CALL. IF(RAN(3).EQ.0.OR.SAVED.NE.-1)GOTO 21755 IF(DWARFN.NE.0)GOTO 21753 L1=DWFMAX-1 DO 21752 DWARFN=1,L1 IF(DLOC(DWARFN).EQ.LOC.AND.DFLAG.GE.2)GOTO 21753 21752 CONTINUE C 'ATTACK' WITH AXE OR SWORD LINKS IN HERE. 21753 DSEEN(DWARFN)=.FALSE. DLOC(DWARFN)=0 SPK=47 DKILL=DKILL+1 IF(DKILL.EQ.1)SPK=149 21755 CALL RSPEAK(SPK) CALL DROP(AXE,LOC) NEWLOC=LOC GOTO 2 C THIS'LL TEACH HIM TO THROW THE AXE AT THE BEAR! 21760 IF(IOBJ.NE.BEAR.OR.PROP(BEAR).NE.0)GOTO 21765 SPK=164 CALL DROP(AXE,LOC) FIXED(AXE)=-1 PROP(AXE)=1 CALL JUGGLE(BEAR) GOTO 2011 C OR THE WUMPUS! 21765 IF(IOBJ.NE.WUMPUS.OR.PROP(WUMPUS).EQ.6)GOTO 21770 IF(PROP(WUMPUS).EQ.6)GOTO 20200 SPK=245 PROP(AXE)=2 IF(PROP(WUMPUS).EQ.0)GOTO 21780 SPK=243 CALL DSTROY(AXE) GOTO 2011 C OR THE NICE DOGGIE! 21770 IF(IOBJ.NE.DOG.OR.PROP(DOG).EQ.1)GOTO 21790 SPK=248 PROP(AXE)=3 21780 CALL DROP(AXE,LOC) FIXED(AXE)=-1 CALL JUGGLE(IOBJ) GOTO 2011 C SNARF A TREASURE FOR THE TROLL. 21790 IF(IOBJ.NE.TROLL)GOTO 21795 PREP=0 IF(OBJ.EQ.CASK.AND.LIQ(CASK).NE.WINE)GOTO 20200 SPK=159 CALL DROP(OBJ,0) IF(OBJ.EQ.CASK)PLACE(WINE+1)=0 CALL MOVE(TROLL,0) CALL MOVE(TROLL+MAXOBJ,0) CALL DROP(TROLL2,PLAC(TROLL)) CALL DROP(TROLL2+MAXOBJ,FIXD(TROLL)) CALL JUGGLE(CHASM) GOTO 2011 C THROWING AXE AT NONE OF THE ABOVE. ASSUME 'ATTACK'. 21795 OBJ=IOBJ IOBJ=OBJS(OBJX) GOTO 21200 C QUIT. INTRANSITIVE ONLY. VERIFY INTENT AND EXIT IF THAT'S WHAT HE WANTS. 11800 GAVEUP=YES(22,54,54) 11850 IF(GAVEUP)GOTO 95000 GOTO 2100 C FIND. MIGHT BE CARRYING IT, OR IT MIGHT BE HERE. ELSE GIVE CAVEAT. 21900 IF(AT(OBJ).OR.(LIQ(BOTTLE).EQ.OBJ.AND.AT(BOTTLE)) 1 .OR.K.EQ.LIQLOC(LOC))SPK=94 L1=DWFMAX-1 DO 21920 I=1,L1 21920 IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2.AND.OBJ.EQ.DWARF)SPK=94 IF(CLOSED)SPK=138 IF(ATHAND(OBJ))SPK=24 GOTO 2011 C INVENTORY. IF OBJECT, TREAT SAME AS FIND. ELSE REPORT ON CURRENT BURDEN. C THERE ARE SOME FUNNY CASES, LIKE THE WEARABLE THINGS. ALSO, BOAT C AND BEAR, WHICH AREN'T REALLY CARRIED. LIST OUTER-LEVEL CONTAINERS C AND CONTENTS, IF CONTAINER IS OPEN OR TRANSPARENT. 12000 SPK=98 DO 12050 I=1,MAXOBJ IF(I.EQ.BEAR.OR.I.EQ.BOAT.OR..NOT.HOLDNG(I))GOTO 12050 IF(WEARNG(I))GOTO 12050 IF(SPK.EQ.98)CALL RSPEAK(99) BLKLIN=.FALSE. CALL PSPEAK(I,-1) SPK=0 IF(I.NE.BOAT)CALL LOOKIN(I) 12050 CONTINUE C TELL HIM WHAT HE IS WEARING. K=0 DO 12060 I=1,MAXOBJ IF(.NOT.WEARNG(I))GOTO 12060 IF(K.EQ.0)PRINT 12052 12052 FORMAT(1H ,'You are wearing:') C CALL TNOUA(' ',5) C HOPE REMOVING THIS IS OK, M.V. CALL PSPEAK(I,-1) K=-1 12060 CONTINUE IF(.NOT.HOLDNG(BOAT))GOTO 12090 CALL RSPEAK(221) CALL LOOKIN(BOAT) 12090 IF(HOLDNG(BEAR))SPK=141 GOTO 2011 C FEED. IF BIRD, NO SEED. SNAKE, DRAGON, TROLL: QUIP. IF DWARF, MAKE HIM C MAD. BEAR, SPECIAL. C CASE 1: FEED CRITTER. *OR* C CASE 2: FEED CRITTER EDIBLE. C [** THIS CASE TRANSFORMED BY PARSER INTO CASE 3 **] C CASE 3: FEED EDIBLE TO CRITTER. 22100 IF(IOBJ.NE.0.AND.LIVING(IOBJ))GOTO 22120 SPK=100 IF(OBJ.EQ.BIRD)GOTO 2011 IF(.NOT.LIVING(OBJ))GOTO 2070 C SEE IF THERE IS ANYTHING EDIBLE AROUND HERE. KK=0 K=0 DO 22110 I=1,MAXOBJ IF(.NOT.HERE(I).OR..NOT.EDIBLE(I))GOTO 22110 K=K+1 KK=I 22110 CONTINUE IOBJ=OBJ OBJ=KK IF(K.EQ.1.OR.DEAD(IOBJ))GOTO 22120 CALL A5TOA1(OTXT(OBJX,1),OTXT(OBJX,2),'?',TK,K) PRINT 22112,(TK(I),I=1,K) 22112 FORMAT (/' What do you want to feed the ',20A1) OBJS(1)=0 OBJX=0 GOTO 2600 C FEED OBJ TO IOBJ. 22120 IF(IOBJ.NE.SNAKE.AND.IOBJ.NE.DRAGON.AND.IOBJ.NE.TROLL)GOTO 22130 SPK=102 IF(IOBJ.EQ.DRAGON.AND.PROP(DRAGON).NE.0)SPK=NOWAY(0) IF(IOBJ.EQ.TROLL)SPK=182 IF(IOBJ.NE.SNAKE.OR.CLOSED.OR.OBJ.NE.BIRD)GOTO 2011 SPK=101 CALL DSTROY(BIRD) PROP(BIRD)=0 TALLY2=TALLY2+1 GOTO 2011 C FEED DWARF? 22130 IF(IOBJ.NE.DWARF)GOTO 22140 SPK=103 DFLAG=DFLAG+1 GOTO 2011 C FEED BEAR? 22140 SPK=102 IF(IOBJ.NE.BEAR)GOTO 22150 IF(PROP(BEAR).EQ.3)SPK=NOWAY(0) IF(PROP(BEAR).EQ.1.OR.PROP(BEAR).EQ.2)SPK=264 IF(OBJ.EQ.FOOD)SPK=278 IF(OBJ.NE.HONEY)GOTO 2011 PROP(BEAR)=1 FIXED(AXE)=0 PROP(AXE)=0 SPK=168 CALL DSTROY(HONEY) GOTO 2011 C FEED DOG? 22150 IF(IOBJ.NE.DOG)GOTO 22160 IF(PROP(DOG).EQ.1)SPK=291 IF(OBJ.NE.FOOD.OR.PROP(DOG).EQ.1)GOTO 2011 SPK=249 CALL DSTROY(FOOD) GOTO 2011 C FEED WUMPUS? 22160 IF(IOBJ.NE.WUMPUS)GOTO 22170 IF(PROP(WUMPUS).EQ.6)SPK=326 IF(PROP(WUMPUS).EQ.0)SPK=327 IF(OBJ.EQ.FOOD)SPK=240 GOTO 2011 C FEED BEES? 22170 IF(IOBJ.NE.BEES.OR.OBJ.NE.FLOWER)GOTO 2070 IF(ENCLSD(FLOWER))CALL REMOVE(FLOWER) CALL DROP(FLOWER,LOC) FIXED(FLOWER)=-1 PROP(FLOWER)=1 CALL DROP(HONEY,LOC) CALL JUGGLE(HONEY) SPK=267 PROP(HIVE)=1 GOTO 2011 C FILL. BOTTLE/CASK MUST BE EMPTY, AND SOME LIQUID AVAILABLE. C (VASE IS NASTY & GRAIL IS CRACKED.) 12200 IF( (.NOT.HERE(BOTTLE).AND..NOT.HERE(CASK)) .OR. 1 (HERE(BOTTLE).AND.HERE(CASK)) )GOTO 10000 IF(PROP(CASK).EQ.1.AND.HERE(CASK))OBJ=CASK IF(PROP(BOTTLE).EQ.1.AND.HERE(BOTTLE))OBJ=BOTTLE IF(OBJ.EQ.0)GOTO 10000 C FILL OBJ WITH IOBJ 22200 SPK=313 IF(.NOT.VESSEL(OBJ))GOTO 2011 IF(IOBJ.EQ.0)IOBJ=LIQLOC(LOC) IF(OBJ.NE.BOTTLE.AND.OBJ.NE.CASK)GOTO 22220 K=0 IF(OBJ.EQ.CASK)K=1 SPK=0 IF(IOBJ.EQ.0)SPK=304+K IF(LIQ(OBJ).NE.0)SPK=302+K IF(SPK.NE.0)GOTO 2011 SPK=306+K IF(IOBJ.EQ.OIL)SPK=308+K IF(IOBJ.EQ.WINE)SPK=310+K PROP(OBJ)=MOD(LOCCON(LOC),8)/2*2 PLACE(IOBJ+K)=-1 CALL INSERT(IOBJ+K,OBJ) GOTO 2011 C VASE. (NASTY). 22220 IF(OBJ.NE.VASE)GOTO 22230 SPK=144 IF(IOBJ.EQ.0.OR..NOT.HOLDNG(VASE))GOTO 2011 CALL RSPEAK(145) PROP(VASE)=2 FIXED(VASE)=-1 GOTO 20290 C GRAIL OR OTHER. 22230 SPK=339 IF(OBJ.EQ.GRAIL)SPK=298 GOTO 2011 C BLAST. NO EFFECT UNLESS YOU'VE GOT DYNAMITE, WHICH IS A NEAT TRICK! 12300 IF(PROP(ROD2).GT.0.AND.CLOSED)GOTO 12310 IF(.NOT.ISWIZ)GOTO 2011 DO 12305 I=1,5 IF(LOC.NE.DLOC(I))GOTO 12305 DLOC(I)=0 DSEEN(I)=.FALSE. 12305 CONTINUE GOTO 2011 12310 BONUS=133 IF(LOC.EQ.115)BONUS=134 IF(HERE(ROD2))BONUS=135 CALL RSPEAK(BONUS) GOTO 95000 C SCORE. 12400 SCORNG=.TRUE. CALL RATING(SCORE,MXSCOR,BONUS,GAVEUP,SCORNG,CLOSNG,CLOSED) SCORNG=.FALSE. PRINT 12412,SCORE,MXSCOR,TURNS 12412 FORMAT(/' If you were to quit now, you would score',I4 1 ,' out of',I4,' using',I4,' turns.') C GAVEUP=YES(143,54,54) C GOTO 11850 GOTO 2100 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). 12500 K=VOCABX(VTXT(VRBX,1),4) SPK=42 IF(FOOBAR.EQ.1-K)GOTO 12520 IF(FOOBAR.NE.0)SPK=151 GOTO 2011 12520 FOOBAR=K IF(K.NE.4)GOTO 2009 FOOBAR=0 IF(PLACE(EGGS).EQ.PLAC(EGGS) 1 .OR.(TOTING(EGGS).AND.LOC.EQ.PLAC(EGGS)))GOTO 2011 C BRING BACK TROLL IF WE STEAL THE EGGS BACK FROM HIM BEFORE CROSSING. IF(PLACE(EGGS).EQ.0.AND.PLACE(TROLL).EQ.0.AND.PROP(TROLL).EQ.0) 1 PROP(TROLL)=1 K=2 IF(HERE(EGGS))K=1 IF(LOC.EQ.PLAC(EGGS))K=0 CALL MOVE(EGGS,PLAC(EGGS)) CALL PSPEAK(EGGS,K) GOTO 2100 C BRIEF/UNBRIEF. INTRANSITIVE ONLY. C SUPPRESS LONG DESCRIPTIONS AFTER FIRST TIME. 12600 DETAIL=3 TERSE=.FALSE. IF(ABBNUM.EQ.10000)GOTO 12610 SPK=156 ABBNUM=10000 GOTO 2011 12610 ABBNUM=5 SPK=374 GOTO 2011 22600 IF(OBJ.NE.0.AND.LIVING(OBJ).AND.IOBJ.NE.0)GOTO 2011 GOTO 2060 C READ. MAGAZINES IN DWARVISH, MESSAGE WE'VE SEEN, AND . . . OYSTER? 22700 IF(BLIND(0))GOTO 2011 IF(OBJ.NE.0.AND.IOBJ.NE.0)GOTO 2060 SPK=CONFUZ(0) IF(OBJ.EQ.0)OBJ=IOBJ IF(OBJ.EQ.BOOK.OR.OBJ.EQ.BOOK2)SPK=142 IF(OBJ.EQ.BILLBD)SPK=361 IF(OBJ.EQ.CARVNG)SPK=372 IF(OBJ.EQ.MAGZIN)SPK=190 IF(OBJ.EQ.MESSAG)SPK=191 IF(OBJ.EQ.OYSTER.AND.HINTED(2).AND.HOLDNG(OYSTER))SPK=194 IF(OBJ.EQ.POSTER)SPK=370 IF(OBJ.EQ.TABLET)SPK=196 IF(OBJ.NE.OYSTER.OR.HINTED(2).OR..NOT.HOLDNG(OYSTER) 1 .OR..NOT.CLOSED)GOTO 2011 HINTED(2)=YES(192,193,54) GOTO 2100 C BREAK. WORKS FOR MIRROR IN REPOSITORY AND, OF COURSE, THE C VASE AND BOTTLE. ALSO, THE SWORD IS MORE BRITTLE THAN IT APPEARS. 22800 IF(OBJ.EQ.MIRROR)SPK=148 IF(OBJ.EQ.VASE.AND.PROP(VASE).EQ.0)GOTO 22820 IF(OBJ.EQ.BOTTLE.AND.PROP(BOTTLE).NE.3)GOTO 22840 IF(OBJ.EQ.SWORD)GOTO 22860 IF(OBJ.NE.MIRROR.OR..NOT.CLOSED)GOTO 2011 CALL RSPEAK(197) GOTO 93000 22820 SPK=198 PROP(VASE)=2 22830 IF(ENCLSD(OBJ))CALL REMOVE(OBJ) IF(HOLDNG(OBJ))CALL DROP(OBJ,LOC) FIXED(OBJ)=-1 GOTO 2011 22840 SPK=231 K=LIQ(BOTTLE) PROP(BOTTLE)=3 IF(K.EQ.0)GOTO 22830 CALL REMOVE(K) PLACE(K)=0 GOTO 22830 C HE'D BETTER NOT SLING THE SWORD AROUND! 22860 SPK=29 IF(.NOT.HOLDNG(SWORD))GOTO 2011 SPK=279 PROP(SWORD)=4 GOTO 22830 C ERWACHE. ONLY USE IS TO DISTURB THE DWARVES OR THE WUMPUS. C OTHER WUMPUS-WAKERS LINK HERE. 22900 IF(.NOT.AT(WUMPUS))GOTO 22940 CHASE=1 PROP(WUMPUS)=1 SPK=276 GOTO 2011 22940 IF(AT(DOG).AND.PROP(DOG).EQ.1)SPK=291 IF(OBJ.NE.DWARF.OR..NOT.CLOSED)GOTO 2011 CALL RSPEAK(199) GOTO 93000 C SUSPEND. OFFER TO EXIT LEAVING THINGS RESTARTABLE, BUT REQUIRING A DELAY C BEFORE RESTARTING (SO CAN'T SAVE THE WORLD BEFORE TRYING SOMETHING RISKY). C UPON RESTARTING, SETUP=-1 CAUSES RETURN TO 13050 TO PICK UP AGAIN. 13000 SPK=201 IF(DEMO)GOTO 2011 PRINT 13010,LATNCY 13010 FORMAT(/' I can suspend your adventure for you so that you can', 1 ' resume later, but'/' you will have to wait at least', 2 I3,' minutes before continuing.') IF(.NOT.YES(200,54,54))GOTO 2100 CALL DATIME(SAVED,SAVET) SETUP=-1 CALL CIAO 13050 YEA=START(0) SETUP=3 VERBS(1)=NULL VRBX=1 VERBS(2)=0 OBJS(1)=0 OBJX=0 GOTO 2750 C HOURS. REPORT CURRENT NON-PRIME-TIME HOURS. 13100 CALL MSPEAK(6) CALL HOURS GOTO 2100 C YANK. A VARIANT OF 'CARRY'. IN GENERAL, NOT A GOOD IDEA. C AT MOST, IT GETS THE CLOAK OR A COUPLE SNIDE COMMENTS. 23200 IF(TOTING(OBJ))GOTO 20200 IF(OBJ.EQ.PLANT.OR.OBJ.EQ.SWORD.OR.OBJ.EQ.CHAIN)GOTO 20100 SPK=205 IF(OBJ.EQ.BEAR.AND.PROP(CHAIN).EQ.1)GOTO 2011 IF(OBJ.EQ.CLOAK.AND.PROP(CLOAK).EQ.2)GOTO 20120 GOTO 20100 C WEAR: ONLY GOOD FOR JEWELS, RUBY SLIPPERS, CLOAK & CROWN. C BUT HE MIGHT TRY THE SWORD. ANYTHING ELSE IS RIDICULOUS. C ANOTHER VARIANT OF 'CARRY'. 23300 SPK=209 IF(OBJ.EQ.SWORD.AND.PROP(SWORD).NE.3)GOTO 2011 IF(WORN(OBJ))GOTO 23320 23310 CALL A5TOA1(OTXT(OBJX,1),OTXT(OBJX,2),'?',TK,K) PRINT 23312,(TK(I),I=1,K) 23312 FORMAT(/' Just exactly how does one wear a ',20A1) GOTO 2100 23320 SPK=242 IF(OBJ.EQ.CLOAK.AND.PROP(CLOAK).EQ.2)GOTO 2011 SPK=210 IF(OBJ.EQ.SHOES)SPK=227 IF(WEARNG(OBJ))GOTO 2011 PROP(OBJ)=1 CALL BITON(OBJ,WEARBT) IF(ENCLSD(OBJ))CALL REMOVE(OBJ) IF(HOLDNG(OBJ))GOTO 2009 GOTO 20120 C HIT. IF NOT PUNCHING OUT TELEPHONE, ASSUME ATTACK. 23400 IF(AT(WUMPUS).AND.PROP(WUMPUS).EQ.0)GOTO 22900 IF(OBJ.NE.PHONE)GOTO 21200 IF(CLOSED)GOTO 93100 SPK=256 IF(PROP(PHONE).EQ.2)GOTO 2011 CALL DROP(SLUGS,LOC) SPK=257 PROP(PHONE)=2 PROP(BOOTH)=2 GOTO 2011 C ANSWER (TELEPHONE). SMARTASS FOR ANYTHING ELSE. 13500 IF(LOC.NE.189.OR.PROP(PHONE).NE.0)GOTO 10000 OBJ=PHONE 23500 IF(OBJ.NE.PHONE)GOTO 23520 SPK=269 IF(PROP(PHONE).NE.0)GOTO 2011 IF(CLOSED)GOTO 93200 SPK=261 PROP(PHONE)=1 PROP(BOOTH)=2 GOTO 2011 23520 IF(OBJ.EQ.DWARF.OR.OBJ.EQ.WUMPUS.OR.OBJ.EQ.SNAKE.OR.OBJ.EQ.BEAR 1 .OR.OBJ.EQ.DRAGON)SPK=259 IF(OBJ.EQ.TROLL)SPK=258 IF(OBJ.EQ.BIRD)SPK=260 GOTO 2011 C BLOW. JOSHUA FIT DE BATTLE OF JERICHO, AND DE WALLS.... 23600 IF(OBJ.NE.0.AND.IOBJ.NE.0)GOTO 2060 IF(OBJ.EQ.0)OBJ=IOBJ IOBJ=0 IF(OBJ.EQ.0)SPK=268 IF(OBJ.NE.HORN)GOTO 2011 SPK=266 IF(OUTSID(LOC))SPK=277 IF(.NOT.AT(WUMPUS))GOTO 23610 IF(PROP(WUMPUS).NE.0)GOTO 2011 CALL RSPEAK(SPK) GOTO 22900 23610 IF(PROP(WALL).EQ.1.OR.(LOC.NE.102.AND.LOC.NE.194))GOTO 2011 K=196 IF(LOC.EQ.194)K=195 CALL RSPEAK(265) PROP(WALL)=1 DO 23620 OBJ=1,MAXOBJ IF(PLACE(OBJ).EQ.LOC.OR.FIXED(OBJ).EQ.LOC)CALL MOVE(OBJ,K) 23620 CONTINUE NEWLOC=K GOTO 2 C CALL. IF NO PHONE IS HANDY, YELL. 13800 IF(.NOT.HERE(PHONE))GOTO 10000 GOTO 23910 C DIAL. NO EFFECT UNLESS AT PHONE. 23900 IF(OBJ.NE.PHONE)GOTO 2011 23910 IF(CLOSED)GOTO 93200 SPK=271 GOTO 2011 C PLAY. ONLY FOR HORN OR LYRE. 24000 IF(OBJ.NE.0.AND.IOBJ.NE.0)GOTO 2060 IF(OBJ.EQ.0)OBJ=IOBJ IOBJ=0 IF(OBJ.EQ.HORN)GOTO 23600 IF(OBJ.NE.LYRE)GOTO 2011 SPK=287 IF(.NOT.HERE(DOG).OR.DEAD(DOG))GOTO 2011 PROP(DOG)=1 CALL BITON(DOG,DEADBT) FIXED(AXE)=0 PROP(AXE)=0 SPK=288 GOTO 2011 C PICK/PICK UP. CAN PICK FLOWERS & MUSHROOMS, BUT MUST 'PICK UP' EVERYTHING EL 24100 IF(OBJ.EQ.0)OBJ=IOBJ IOBJ=0 IF(OBJ.EQ.FLOWER.OR.OBJ.EQ.MUSHRM)GOTO 20100 IF(PREP.NE.0)GOTO 20100 GOTO 2060 C PUT DOWN: EQUIVALENT TO DROP. C PUT IN: IF LIQUID, MEANS 'FILL'. C PUT ON: WEAR OR DROP. 24200 IF(PREP.NE.0)GOTO 24210 CALL A5TOA1(OTXT(OBJX,1),OTXT(OBJX,2),'?',TK,K) PRINT 24204,(TK(I),I=1,K) 24204 FORMAT(/' Where do you want to put the ',20A1) GOTO 2600 24210 IF(PREP.EQ.PREPIN)GOTO 24500 C PUT ON: "WEAR" OR "PUT OBJ ON IOBJ". 24240 IF(PREP.NE.PREPON)GOTO 24250 IF(OBJ.NE.0)GOTO 24242 OBJ=IOBJ OTXT(OBJX,1)=IOTXT(IOBX,1) OTXT(OBJX,2)=IOTXT(IOBX,2) IOBJ=0 24242 IF(WORN(OBJ))GOTO 23300 IF(IOBJ.EQ.0)GOTO 23310 GOTO 20200 C PUT DOWN: "DROP" 24250 IF(OBJ.EQ.0.OR.IOBJ.EQ.0)GOTO 24252 GOTO 2070 24252 IF(OBJ.EQ.0)OBJ=IOBJ IOBJ=0 GOTO 20200 C TURN ON/OFF. 24300 IF(PREP.EQ.0)GOTO 2060 IF(OBJ.EQ.0.AND.IOBJ.EQ.LAMP)OBJ=LAMP IF(OBJ.NE.LAMP)GOTO 2070 IF(PREP.EQ.PREPON)GOTO 20700 GOTO 20800 C GET (NO PREP): "TAKE" C GET IN: "ENTER" C GET OUT: "LEAVE" C****** NEEDS WORK 24400 IF(PREP.EQ.0.OR.PREP.EQ.PREPFR)GOTO 20100 IF(OBJ.NE.0)GOTO 2060 OBJ=IOBJ IOBJ=0 PREP=0 GOTO 20100 C INSERT/PUT IN. 24500 IF(IOBJ.EQ.0)GOTO 10010 SPK=NOWAY(0) IF(OBJ.EQ.SWORD.AND.IOBJ.EQ.ANVIL.AND.PROP(SWORD).EQ.0)SPK=350 IF(.NOT.VESSEL(IOBJ))GOTO 2011 ASSIGN 24510 TO RETN GOTO 20190 24510 IF(IOBJ.NE.BOTTLE.AND.IOBJ.NE.CASK.AND.IOBJ.NE.VASE 1 .AND.IOBJ.NE.GRAIL.AND.(OBJ.LT.WATER.OR.OBJ.GT.WINE+1)) 2 GOTO 24515 OBJ=IOBJ IOBJ=OBJS(OBJX) GOTO 22200 24515 SPK=252 IF(OBJ.EQ.IOBJ)GOTO 2011 SPK=358 IF(.NOT.AJAR(IOBJ))GOTO 2011 IF(IOBJ.NE.BOAT.AND.IOBJ.NE.CHEST)GOTO 24520 IF(IOBJ.EQ.CHEST.AND.OBJ.EQ.BOAT)GOTO 2070 GOTO 24590 C BIRD GOES INTO CAGE AND ONLY CAGE. CAGE HOLDS NOTHING ELSE. C BAR VASE & PILLOW FROM SAFE, TO FORCE PUTTING DOWN ON FLOOR. 24520 SPK=351 IF(OBJ.EQ.BIRD.AND.IOBJ.NE.CAGE)GOTO 2011 SPK=329 IF(IOBJ.EQ.CAGE.AND.OBJ.NE.BIRD)GOTO 2011 IF(OBJ.EQ.BIRD)GOTO 20120 IF(IOBJ.EQ.SAFE.AND.(OBJ.EQ.VASE.OR.OBJ.EQ.PILLOW))GOTO 2011 IF(IOBJ.EQ.SHIELD.AND.OBJ.NE.RADIUM)GOTO 2011 IF(IOBJ.NE.PHONE)GOTO 24530 IF(OBJ.NE.COINS.AND.OBJ.NE.SLUGS)GOTO 2070 CALL DSTROY(OBJ) SPK=330 GOTO 2011 24530 IF(IOBJ.NE.VEND)GOTO 24540 IF(OBJ.NE.COINS.AND.OBJ.NE.SLUGS)GOTO 2070 CALL DSTROY(OBJ) CALL MOVE(BATTER,LOC) IF(PROP(BATTER).NE.1)GOTO 24535 CALL RSPEAK(317) PROP(VEND)=1 24535 PROP(BATTER)=0 CALL PSPEAK(BATTER,0) GOTO 2100 C PUT BATTERIES IN LAMP. C THERE IS A GLITCH HERE, IN THAT IF HE TRIES TO GET A THIRD SET OF C BATTERIES BEFORE THE SECOND SET HAS BEEN INSERTED, THE SECOND SET C DISAPPEARS! ***FIX THIS SOMETIME*** 24540 IF(IOBJ.NE.LAMP)GOTO 24550 IF(OBJ.NE.BATTER.OR.PROP(BATTER).NE.0)GOTO 2070 PROP(BATTER)=1 IF(ENCLSD(BATTER))CALL REMOVE(BATTER) IF(HOLDNG(BATTER))CALL DROP(BATTER,LOC) LIMIT=400 PROP(LAMP)=1 LMWARN=.FALSE. SPK=188 GOTO 2011 24550 IF(.NOT.SMALL(OBJ))GOTO 2011 24590 IF(WEARNG(OBJ))CALL BITOFF(OBJ,WEARBT) IF(ENCLSD(OBJ))CALL REMOVE(OBJ) CALL INSERT(OBJ,IOBJ) GOTO 2009 C REMOVE/TAKE FROM. 24600 IF(OBJ.NE.RING.OR.PROP(RING).NE.2)GOTO 24610 PREP=0 IOBJ=0 GOTO 20100 24610 SPK=343 IF(IOBJ.NE.0)GOTO 24620 IF(.NOT.ENCLSD(OBJ))SPK=340 IOBJ=-PLACE(OBJ) 24620 IF(PLACE(OBJ).NE.-IOBJ)SPK=341 IF(.NOT.AJAR(IOBJ))SPK=335 IF(OBJ.EQ.WATER.OR.OBJ.EQ.OIL.OR.OBJ.EQ.WINE)SPK=342 IF(.NOT.TOTING(OBJ).AND.BURDEN(0)+BURDEN(OBJ).GT.15)SPK=92 IF(SPK.NE.343)GOTO 2011 CALL REMOVE(OBJ) IF(OBJ.EQ.BIRD)GOTO 20200 GOTO 2009 C BURN 24700 GOTO 2011 C GRIPE/COMPLAIN/SUGGEST. 14800 SCORNG=.TRUE. CALL RATING(SCORE,MXSCOR,BONUS,GAVEUP,SCORNG,CLOSNG,CLOSED) SCORNG=.FALSE. CALL GRIPE(LOC,SCORE,CLOSNG,CLOSED) GOTO 2011 C LOCK. CHAIN, GRATE, CHEST, ELFIN DOOR C HERE ARE THE CURRENT LOCK/UNLOCK MESSAGES & NUMBERS: C 31 YOU HAVE NO KEYS. C 32 IT HAS NO LOCK. C 34 IT'S ALREADY LOCKED. C 35 THE GRATE IS NOW LOCKED. C 36 THE GRATE IS NOW UNLOCKED. C 37 IT WAS ALREADY UNLOCKED. C 55 YOU CAN'T UNLOCK THE KEYS. C 171 The chain is now unlocked. C 172 The chain is now locked. C 173 There is nothing here to which the chain can be locked. C 224 YOUR KEYS ARE ALL TOO LARGE. C 234 The wrought-iron door is now locked. C 235 The tiny door is now locked. C 236 The wrought-iron door is now unlocked. C 237 The tiny door is now unlocked. C 375 YOU DON'T HAVE THE RIGHT KEY. C 333 THE CHEST IS NOW LOCKED. C 334 THE CHEST IS NOW UNLOCKED. C 367 THE SAFE'S DOOR SWINGS SHUT. 24900 IF(HINGED(OBJ))GOTO 24905 CALL A5TOA1(OTXT(OBJX,1),OTXT(OBJX,2),'.',TK,K) PRINT 24903,(TK(I),I=1,K) 24903 FORMAT(/' I don''t know how to lock or unlock the ',20A1) GOTO 2100 24905 SPK=375 IF(.NOT.LOCKS(OBJ))SPK=32 IF(LOCKED(OBJ))SPK=34 IF(.NOT.(ATHAND(KEYS).OR.ATHAND(SKEY).OR.OBJ.EQ.SAFE))SPK=31 IF(SPK.NE.375)GOTO 2011 C CHAIN. IF(OBJ.NE.CHAIN)GOTO 24910 IF(.NOT.ATHAND(KEYS))GOTO 2011 SPK=173 IF(LOC.NE.PLAC(CHAIN))GOTO 2011 SPK=172 PROP(CHAIN)=2 IF(ENCLSD(CHAIN))CALL REMOVE(CHAIN) IF(HOLDNG(CHAIN))CALL DROP(CHAIN,LOC) FIXED(CHAIN)=-1 GOTO 24990 C CHEST. 24910 IF(OBJ.NE.CHEST)GOTO 24920 IF(.NOT.ATHAND(KEYS))GOTO 2011 SPK=334 GOTO 24990 C ELFIN DOOR. 24920 IF(OBJ.NE.TDOOR.AND.OBJ.NE.TDOOR2)GOTO 24930 SPK=224 IF(.NOT.TOTING(SKEY))GOTO 2011 PROP(TDOOR)=0 PROP(TDOOR2)=0 SPK=234+2*PROP(TDOOR)+(TDOOR2-OBJ) K=TDOOR+(TDOOR2-OBJ) CALL BITON(K,LOCKBT) CALL BITOFF(K,OPENBT) GOTO 24990 C GRATE. 24930 IF(OBJ.NE.GRATE)GOTO 24940 IF(.NOT.ATHAND(KEYS))GOTO 2011 PROP(GRATE)=0 SPK=35 GOTO 24990 C SAFE. 24940 PROP(SAFE)=0 SPK=367 C GOTO 24990 24990 CALL BITON(OBJ,LOCKBT) CALL BITOFF(OBJ,OPENBT) GOTO 2011 C UNLOCK. CHAIN, GRATE, CHEST, ELFIN DOOR. 25000 SPK=55 IF(OBJ.EQ.KEYS.OR.OBJ.EQ.SKEY)GOTO 2011 IF(.NOT.HINGED(OBJ))GOTO 24900 SPK=375 IF(.NOT.LOCKED(OBJ))SPK=37 IF(.NOT.LOCKS(OBJ))SPK=32 IF(OBJ.EQ.SAFE)SPK=342 IF(OBJ.EQ.SAFE.AND.(IOBJ.EQ.KEYS.OR.IOBJ.EQ.SKEY))SPK=368 IF(.NOT.(ATHAND(KEYS).OR.ATHAND(SKEY).OR.OBJ.EQ.SAFE))SPK=31 IF(SPK.NE.375)GOTO 2011 C CHAIN. IF(OBJ.NE.CHAIN)GOTO 25020 IF(.NOT.ATHAND(KEYS))GOTO 2011 SPK=171 IF(PROP(BEAR).EQ.0)SPK=41 IF(SPK.NE.171)GOTO 2011 PROP(CHAIN)=0 FIXED(CHAIN)=0 IF(PROP(BEAR).NE.3)PROP(BEAR)=2 FIXED(BEAR)=2-PROP(BEAR) GOTO 25090 C CHEST. 25020 IF(OBJ.NE.CHEST)GOTO 25030 IF(.NOT.ATHAND(KEYS))GOTO 2011 SPK=333 GOTO 25090 C ELFIN DOOR. C STUFF TO LOCK/UNLOCK TINY DOOR W/SPECIAL KEY. C THE DAMN THING IS REALLY AT FOUR PLACES, AND WE WANT THE RIGHT C MESSAGES IF HE ONLY HAS 'BIG' KEYS (OR NO KEYS). ALSO, HE C CAN UNLOCK IT EITHER WHILE HE IS BIG OR SMALL. 25030 IF(OBJ.NE.TDOOR.AND.OBJ.NE.TDOOR2)GOTO 25040 SPK=224 IF(.NOT.ATHAND(SKEY))GOTO 2011 IF(CLOSNG)GOTO 25060 PROP(TDOOR)=1 PROP(TDOOR2)=1 SPK=234+2*PROP(TDOOR)+(TDOOR2-OBJ) K=TDOOR+(TDOOR2-OBJ) CALL BITOFF(K,LOCKBT) CALL BITON(K,OPENBT) GOTO 25090 C GRATE. 25040 IF(.NOT.ATHAND(KEYS))GOTO 2011 IF(CLOSNG)GOTO 25060 PROP(GRATE)=1 SPK=36 25090 CALL BITOFF(OBJ,LOCKBT) CALL BITON(OBJ,OPENBT) GOTO 2011 C CLOSING. NO EXIT THIS WAY. 25060 SPK=130 IF(.NOT.PANIC)CLOCK2=15 PANIC=.TRUE. GOTO 2011 C HEALTH. GIVE HIM A DIAGNOSIS. 25100 IF(HEALTH.LT.100)PRINT 25102,HEALTH 25102 FORMAT(/' You''re health rating is ',I2, 1 ' out of a possible 100.') IF(PCT(50))SPK=349 IF(HEALTH.GE.95)GOTO 2011 SPK=381 + (100-HEALTH)/20 GOTO 2011 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. 25200 IF(OBJ.NE.0)GOTO 2060 IF(IOBJ.NE.0)GOTO 25210 25201 IF(DETAIL.LT.3)CALL RSPEAK(15) DETAIL=DETAIL+1 WZDARK=.FALSE. ABB(LOC)=0 NEWLOC=LOC GOTO 2 C LOOK INTO SOMETHING (A CONTAINER). 25210 IF(.NOT.VESSEL(IOBJ))GOTO 25220 IF(.NOT.AJAR(IOBJ).AND.OPAQUE(IOBJ))GOTO 2011 SPK=359 IF(HOLDER(IOBJ).EQ.0)GOTO 2011 PRINT 25212 25212 FORMAT(1H ) CALL LOOKIN(IOBJ) GOTO 2100 C LOOK AT SOMETHING. IF WRITTEN, READ IT. 25220 IF(.NOT.PRINTD(IOBJ))GOTO 25201 OBJ=IOBJ IOBJ=0 GOTO 22700 C COMBO: TRYING TO OPEN SAFE. SEE COMMENTS FOR FEE FIE FOE FOO. 25300 IF(.NOT.AT(SAFE))GOTO 2060 K=VOCABX(VTXT(VRBX,1),4)-10 SPK=42 IF(COMBO.EQ.1-K)GOTO 25320 IF(COMBO.NE.0)SPK=366 GOTO 2011 25320 COMBO=K SPK=371 IF(K.NE.3)GOTO 2011 COMBO=0 CALL BITOFF(SAFE,LOCKBT) CALL BITON(SAFE,OPENBT) PROP(SAFE)=1 SPK=365 IF(PROP(BOOK).GE.0)GOTO 2011 TALLY=TALLY-1 C IF REMAINING TREASURES TOO ELUSIVE, ZAP HIS LAMP. C THIS COPIES SOME CODE LOCATED AROUND LABEL 2000. MUST BE DONE C HERE SINCE BOOK IS CONTAINED IN SAFE & TALLY STUFF ONLY WORKS FOR THINGS C DEPOSITED AT A LOC. IF(TALLY.EQ.TALLY2.AND.TALLY.NE.0)LIMIT=MIN0(35,LIMIT) GOTO 2011 C DUST/SWEEP. 25400 IF(.NOT.ATHAND(BRUSH))SPK=342 IF(.NOT.AT(CARVNG).OR..NOT.ATHAND(BRUSH).OR.PROP(CARVNG).EQ.1) 1 GOTO 2011 PROP(CARVNG)=1 CALL RSPEAK(363) SPK=372 GOTO 2011 C TERSE/UNTERSE. SUPRESS ALL LONG-FORM DESCRIPTIONS. 25500 TERSE=.NOT.TERSE DETAIL=3 GOTO 2009 C WIZ STUFF 25600 IF(ISWIZ)CALL MONITR GOTO 2009 25700 IF(ISWIZ) CALL XMAP GOTO 2009 25800 IF(.NOT.ISWIZ) GOTO 2009 WRITE(1,25801) 25801 FORMAT (1X,'LOCATION ?') READ (1,25802) GATLOC 25802 FORMAT (I4) IF ((GATLOC.GT.0).AND.(GATLOC.LE.MAXLOC)) + LOC=GATLOC GOTO 2009 25900 IF(ISWIZ) WRITE(1,25901) DLOC(DWFMAX) 25901 FORMAT(1X,'THE PIRATE IS AT LOCATION ',I4) GOTO 2009 C HINTS 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. 40000 GOTO (40700,40800,40900,41000,41100,41200,41300,41400,41500, 1 41600,41700),(HINT+1-HNTMIN) C MAZE DARK WITT SWORD SLIDE CAVE1 BIRD CAVE2 RNBOW C SNAKE STYX PRINT 40002,HINT 40002 FORMAT (' TRYING TO PRINT HINT # ',I1,/) CALL BUG(27) 40010 HINTLC(HINT)=0 IF(.NOT.YES(HINTS(HINT,3),0,54))GOTO 2603 PRINT 40012,HINTS(HINT,2) 40012 FORMAT(/' I am prepared to give you a hint, but it will cost 1 you', I2,' points.') HINTED(HINT)=YES(175,HINTS(HINT,4),54) IF(HINTED(HINT).AND.LIMIT.GT.30)LIMIT=LIMIT+30*HINTS(HINT,2) 40020 HINTLC(HINT)=0 40030 GOTO 2603 C NOW FOR THE QUICK TESTS. SEE DATABASE DESCRIPTION FOR ONE-LINE NOTES. 40700 IF(ATLOC(LOC).EQ.0.AND.ATLOC(OLDLOC).EQ.0.AND. 1 ATLOC(OLDLC2).EQ.0.AND.BURDEN(0).GT.1)GOTO 40010 GOTO 40020 40800 IF(PROP(EMRALD).NE.-1.AND.PROP(PYRAM).EQ.-1)GOTO 40010 GOTO 40020 40900 GOTO 40010 41000 IF( (PROP(SWORD).EQ.1.OR.PROP(SWORD).EQ.5) 1 .AND..NOT.TOTING(CROWN))GOTO 40010 GOTO 40020 41100 GOTO 40010 41200 IF(PROP(GRATE).EQ.0.AND..NOT.ATHAND(KEYS))GOTO 40010 GOTO 40020 41300 IF(HERE(BIRD).AND.ATHAND(ROD).AND.OBJ.EQ.BIRD)GOTO 40010 GOTO 40030 41400 IF(ABB(159).EQ.0)GOTO 40010 GOTO 40020 41500 IF(.NOT.TOTING(SHOES).OR.ABB(205).EQ.0)GOTO 40010 GOTO 40020 41600 IF(.NOT.ATHAND(LYRE).AND.PROP(DOG).NE.1)GOTO 40010 GOTO 40020 41700 IF(HERE(SNAKE).AND..NOT.HERE(BIRD))GOTO 40010 GOTO 40020 C CAVE CLOSING AND SCORING 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 90000 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 90000 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 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=BITSET(LOCCON,6)), OR CREATE THE BRIDGE. NOR 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. 90000 PROP(GRATE)=0 PROP(FISSUR)=0 PROP(TDOOR)=0 PROP(TDOOR2)=0 DO 90010 I=1,6 DSEEN(I)=.FALSE. 90010 DLOC(I)=0 CALL MOVE(TROLL,0) CALL MOVE(TROLL+MAXOBJ,0) CALL MOVE(TROLL2,PLAC(TROLL)) CALL MOVE(TROLL2+MAXOBJ,FIXD(TROLL)) CALL JUGGLE(CHASM) IF(PROP(BEAR).NE.3)CALL DSTROY(BEAR) PROP(CHAIN)=0 FIXED(CHAIN)=0 PROP(AXE)=0 FIXED(AXE)=0 CALL RSPEAK(129) CLOCK1=-1 CLOSNG=.TRUE. GOTO 19999 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, PHONE BOOTH AND C AT 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 THE PHONE MAKES IT IMPOSSIBLE FOR THE WALDO TO FART AROUND IN THE C REPOSITORY TOO LONG. WHEN CLOCK3 TICKS TO ZERO, THE PHONE STARTS C RINGING. WHEN IT HITS -7, THE DWARVES WAKE UP. IF HE FIDDLES WITH C THE PHONE, HE GETS ZONKED IN OTHER WAYS. 91000 PROP(BOTTLE)=PUT(BOTTLE,115,1) PROP(PLANT)=PUT(PLANT,115,0) PROP(OYSTER)=PUT(OYSTER,115,0) PROP(LAMP)=PUT(LAMP,115,0) PROP(ROD)=PUT(ROD,115,0) PROP(DWARF)=PUT(DWARF,115,0) LOC=115 OLDLOC=115 NEWLOC=115 C LEAVE THE GRATE WITH NORMAL (NON-NEGATIVE PROPERTY). FOO=PUT(GRATE,116,0) PROP(SNAKE)=PUT(SNAKE,116,1) PROP(BIRD)=PUT(BIRD,116,1) PROP(CAGE)=PUT(CAGE,116,0) PROP(ROD2)=PUT(ROD2,116,0) PROP(PILLOW)=PUT(PILLOW,116,0) PROP(BOOTH)=PUT(BOOTH,116,-4) FIXED(BOOTH)=115 PROP(PHONE)=PUT(PHONE,212,-4) PROP(MIRROR)=PUT(MIRROR,115,0) PROP(BOOK2)=PUT(BOOK2,115,0) FIXED(MIRROR)=116 DO 91010 I=1,MAXOBJ IF(TOTING(I).AND.ENCLSD(I))CALL REMOVE(I) 91010 IF(TOTING(I))CALL DSTROY(I) CALL RSPEAK(132) CLOSED=.TRUE. GOTO 2 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. C 92000 IS FOR CASES OF LAMP DYING. 92400 IS WHEN IT GOES OUT, C AND 92600 IS IF HE'S WANDERED OUTSIDE AND THE LAMP IS USED UP, IN WHICH C CASE WE FORCE HIM TO GIVE UP. 92000 IF(LMWARN.OR..NOT.HERE(LAMP))GOTO 19999 LMWARN=.TRUE. SPK=187 IF(PROP(BATTER).EQ.1)SPK=323 IF(PLACE(BATTER).EQ.0)SPK=183 IF(PROP(VEND).EQ.1)SPK=189 CALL RSPEAK(SPK) GOTO 19999 92400 LIMIT=-1 PROP(LAMP)=0 IF(HERE(LAMP))CALL RSPEAK(184) GOTO 19999 92600 CALL RSPEAK(185) GAVEUP=.TRUE. GOTO 95000 C AND, OF COURSE, DEMO GAMES ARE ENDED BY THE WIZARD. 92800 CALL MSPEAK(1) GAVEUP=.TRUE. GOTO 95000 C OH DEAR, HE'S DISTURBED THE DWARVES. 93000 CALL RSPEAK(136) GOTO 95000 C HIT THE PHONE. JINGLE, JANGLE, CRASH! 93100 CALL RSPEAK(282) GOTO 93000 C WHOOPS. DOWN THE CHUTE. 93200 CALL RSPEAK(283) GOTO 95000 C DWARVES CAN'T SLEEP THRU ALL THIS RINGING! 93300 CALL RSPEAK(254) GOTO 95000 C "YOU'RE DEAD, FRED." "YOU DIED, CLYDE?" 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 THE EASIEST WAY TO GET KILLED IS TO FALL INTO A PIT IN PITCH DARKNESS. 94000 CALL RSPEAK(23) OLDLC2=LOC C OKAY, HE'S DEAD. LET'S GET ON WITH IT. 94100 IF(CLOSNG)GOTO 94500 YEA=YES(81+NUMDIE*2,82+NUMDIE*2,54) NUMDIE=NUMDIE+1 IF(NUMDIE.EQ.MAXDIE.OR..NOT.YEA)GOTO 95000 IF(CHASE.EQ.0)GOTO 94160 C CHAMP WAS BEING CHASED BY WUMPUS, & DIED ANOTHER WAY. C PUT WUMPUS BACK TO SLEEP, IN CASE OUR HERO STILL HASN'T GOT THE CLOAK. CHASE=0 PROP(WUMPUS)=0 CALL MOVE(WUMPUS,174) 94160 IF(TOTING(LAMP))PROP(LAMP)=0 DO 94200 J=1,MAXOBJ IF(.NOT.HOLDNG(J))GOTO 94200 LOC=OLDLC2 IF(J.EQ.LAMP)LOC=1 CALL DROP(J,LOC) IF(.NOT.WEARNG(J))GOTO 94200 PROP(J)=0 CALL BITOFF(J,WEARBT) 94200 CONTINUE LOC=3 OLDLOC=LOC WDX=0 WORDS(1)=0 CALL CLRLIN HEALTH=100 GOTO 2000 C HE DIED DURING CLOSING TIME. NO RESURRECTION. TALLY UP A DEATH AND EXIT. 94500 CALL RSPEAK(131) NUMDIE=NUMDIE+1 GOTO 95000 C IT'S OVER. TALLY SCORE. 95000 CALL RATING(SCORE,MXSCOR,BONUS,GAVEUP,SCORNG,CLOSNG,CLOSED) C THAT SHOULD BE GOOD ENOUGH. LET'S TELL HIM ALL ABOUT IT. CALL MLOG(SCORE,TURNS,NUMDIE) PRINT 95100,SCORE,MXSCOR,TURNS 95100 FORMAT(///' You scored',I4,' out of a possible',I4, 1 ', using',I5,' turns.') DO 95200 I=1,CLSSES IF(CVAL(I).GE.SCORE)GOTO 95210 95200 CONTINUE PRINT 95202 95202 FORMAT(/' You just went off my scale!!'/) GOTO 98000 95210 CALL SPEAK(CTEXT(I)) IF(I.EQ.CLSSES-1)GOTO 95220 K=CVAL(I)+1-SCORE KK2='s.' IF(K.EQ.1)KK2='. ' PRINT 95212,K,KK2 95212 FORMAT(/' To achieve the next higher rating, you need',I3, 1 ' more point',A2/) GOTO 98000 95220 PRINT 95222 95222 FORMAT(/' To achieve the next higher rating ', 1 'would be a neat trick!'//' CONGRATULATIONS!!'/) C98000 STOP 98000 IF(.NOT.PROMPT)WRITE(*,98001) 98001 FORMAT('END:') STOP !98000 STOP END