From bacchus.pa.dec.com!decwrl!ogicse!zephyr.ens.tek.com!tekred!saab!billr Thu Aug 23 12:27:36 PDT 1990 Article 1066 of comp.sources.games: Path: bacchus.pa.dec.com!decwrl!ogicse!zephyr.ens.tek.com!tekred!saab!billr From: billr@saab.CNA.TEK.COM (Bill Randle) Newsgroups: comp.sources.games Subject: v11i028: adven2 - generic adventure 551, Part02/07 Message-ID: <6187@tekred.CNA.TEK.COM> Date: 23 Aug 90 00:11:16 GMT Article-I.D.: tekred.6187 Sender: news@tekred.CNA.TEK.COM Lines: 1588 Approved: billr@saab.CNA.TEK.COM Submitted-by: Doug McDonald Posting-number: Volume 11, Issue 28 Archive-name: adven2/Part02 Supersedes: adven: Volume 9, Issue 89-96 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'aamain.f.xaa' <<'END_OF_FILE' XC THIS IS THE FIRST LINE OF ADVENTURE, MAIN MODULE. X XC CURRENT LIMITS: XC 20000 WORDS OF MESSAGE TEXT (LINES, LINSIZ). XC 1600 TRAVEL OPTIONS (TRAVEL, TRVSIZ). XC 600 VOCABULARY WORDS (KTAB, ATAB, TABSIZ). XC 250 LOCATIONS (LTEXT, STEXT, KEY, LOCCON, ABB, ATLOC, XC LOCSIZ, MAXLOC). XC 150 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, POINTS, XC HOLDER, HLINK, OBJCON, PROP, WEIGHT, MAXOBJ). XC 60 "ACTION" VERBS (ACTSPK, VRBSIZ, VKEY). XC 300 VERB/PREP/OBJ COMBINATIONS (PTAB, PTBSIZ). XC 50 ADJECTIVES (ADJKEY, ADJSIZ) XC 150 MODIFIED NOUNS (ADJTAB, MAXOBJ) XC 450 RANDOM MESSAGES (RTEXT, RTXSIZ). XC 12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX). XC 20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ, HNTMIN). X XC THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF XC THE DATABASE. (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE, XC SO THERE CAN'T BE MORE THAN 1000 WORDS OF ANY CLASS.) THESE UPPER XC LIMITS ARE: XC 1000 NON-SYNONYMOUS VOCABULARY WORDS OF EACH CLASS. CURRENTLY DEFINED XC CLASSES ARE: XC 1. MOTION/DIRECTION WORDS (EAST, WEST, UP, JUMP, ETC.) XC 2. NOUNS/OBJECTS (LAMP, KEYS, TROLL, ETC.) XC 3. ACTION VERBS, TRANSITIVE & INTRANSITIVE (TAKE, DROP, KILL, IN XC 4. MISCELLANEOUS WORDS; MOSTLY THINGS OR ACTIONS WHICH GENERATE XC FIXED REPLIES (FEE-FIE-FOE-FOO, TREE, CAVE, CURSES) XC 5. PREPOSITIONS, DUPLICATES MANY WORDS IN SECTION 1. XC 6. ADJECTIVES XC 7. CONJUNCTIONS XC 450 LOCATIONS XC 100 OBJECTS WHICH CAN BE USED IN TRAVEL TABLE (PLUS 900 MORE, WHICH CAN' X X XC DESCRIPTION OF THE DATABASE FORMAT XC XC XC THE DATA FILE CONTAINS SEVERAL SECTIONS. EACH BEGINS WITH A LINE CONTAINING XC A NUMBER IDENTIFYING THE SECTION, AND ENDS WITH A LINE CONTAINING "-1". XC XC SECTION 1: LONG FORM DESCRIPTIONS. EACH LINE CONTAINS A LOCATION NUMBER, XC A TAB, AND A LINE OF TEXT. THE SET OF (NECESSARILY ADJACENT) LINES XC WHOSE NUMBERS ARE X FORM THE LONG DESCRIPTION OF LOCATION X. XC XC SECTION 2: SHORT FORM DESCRIPTIONS. SAME FORMAT AS LONG FORM. NOT ALL XC PLACES HAVE SHORT DESCRIPTIONS. XC XC SECTION 3: VOCABULARY. EACH LINE CONTAINS A NUMBER (N), A TAB, AND A XC FIVE-LETTER WORD. CALL M=N/1000. IF M=0, THEN THE WORD IS A MOTION XC VERB FOR USE IN TRAVELLING (SEE SECTION 4). ELSE, IF M=1, THE WORD IS XC AN OBJECT. ELSE, IF M=2, THE WORD IS AN ACTION VERB (SUCH AS "CARRY" XC OR "ATTACK"). ELSE, IF M=3, THE WORD IS A SPECIAL CASE VERB (SUCH AS XC "DIG") AND N MOD 1000 IS AN INDEX INTO SECTION 6. OBJECTS FROM 50 TO XC (CURRENTLY, ANYWAY) 79 ARE CONSIDERED TREASURES (FOR PIRATE, CLOSEOUT). XC XC SECTION 4: TRAVEL TABLE. EACH LINE CONTAINS A LOCATION NUMBER (X), A SECOND XC LOCATION NUMBER (Y), AND A LIST OF MOTION VERBS (SEE SECTION 3). XC EACH MOTION REPRESENTS A VERB WHICH WILL GO TO Y IF CURRENTLY AT X. XC Y, IN TURN, IS INTERPRETED AS FOLLOWS. LET M=Y/1000, N=Y MOD 1000. XC IF N<=MAXLOC IT IS THE LOCATION TO GO TO. XC IF MAXLOC500 MESSAGE N-500 FROM SECTION 6 IS PRINTED, XC AND HE STAYS WHEREVER HE IS. XC MEANWHILE, M SPECIFIES THE CONDITIONS ON THE MOTION. XC IF M=0 IT'S UNCONDITIONAL. XC IF 0100 CANNOT BE USED FOR CONDITIONAL MOTIONS IN XC TRAVEL TABLE. XC XC SECTION 6: ARBITRARY MESSAGES. SAME FORMAT AS SECTIONS 1, 2, AND 5, EXCEPT XC THE NUMBERS BEAR NO RELATION TO ANYTHING (EXCEPT FOR SPECIAL VERBS XC IN SECTION 3). XC XC SECTION 7: CONTAINS LOTS OF OBJECT INFO: XC (1) OBJECT LOCATIONS & WEIGHTS. EACH LINE CONTAINS AN OBJECT NUMBER XC AND ITS INITIAL LOCATION (ZERO (OR OMITTED) IF NONE). IF THE OBJECT IS XC IMMOVABLE, THE LOCATION IS FOLLOWED BY A "-1". IF IT HAS TWO LOCATIONS XC (E.G. THE GRATE) THE FIRST LOCATION IS FOLLOWED WITH THE SECOND, AND XC THE OBJECT IS ASSUMED TO BE IMMOVABLE. IF THE OBJECT IS MOVABLE, IT XC HAS A THIRD NUMBER WHICH IS ITS RELATIVE WEIGHT. XC (2) DEFAULT OBJECT NAMES. TEN CHARACTER MAXIMUM, TO PERMIT PRINTING XC OBJECT NAMES WHEN HERO SAYS 'TAKE ALL' OR SUCH. XC (3) POINTS. OBJECT NUMBER, A SCORE XC VALUE, A PROP VALUE, AND A LOCATION NUMBER. THE SCORE IS XC FOR LEAVING IT AT THE NAMED LOCATION WITH THE RIGHT PROP VALUE. XC SCORES ARE ASSIGNED ON A DIFFICULTY SCALE OF 1-5 (1 IS XC FOR EASY TREASURES; 5 IS FOR REAL HARD ONES), AND ARE MULTIPLIED XC BY SOME APPROPRIATE FACTOR AT SCORING TIME. XC XC SECTION 8: ACTION DEFAULTS. EACH LINE CONTAINS AN "ACTION-VERB" NUMBER AND XC THE INDEX (IN SECTION 6) OF THE DEFAULT MESSAGE FOR THE VERB. XC XC SECTION 9: LIQUID ASSETS, ETC. EACH LINE CONTAINS A NUMBER (N) AND UP TO 20 XC LOCATION NUMBERS. XC FOR THE LOW BYTE BIT N (WHERE 0 IS THE UNITS BIT) IS SET IN LOCCON(LOC XC FOR EACH LOC GIVEN. THE COND BITS CURRENTLY ASSIGNED ARE: XC 0 LIGHT XC 1 IF BIT 3 IS ON: ON FOR OIL, OFF FOR WATER XC 2 IF BIT 3 IS ON: ON FOR WINE, OFF FOR WATER & OIL XC 3 LIQUID ASSET, SEE BITS 1 & 2 XC 4 PIRATE DOESN'T GO HERE UNLESS FOLLOWING PLAYER XC 5 ALL LOCATIONS IN EITHER 'PORTAL'; I.E., NOT OUTSIDE XC CAVE, BUT NOT FAR IN XC 6 ALL LOCATIONS OUTSIDE THE CAVE XC THE HIGH BYTE IS USED TO INDICATE AREAS OF INTEREST TO "HINT" ROUTINES: XC THE NUMBER 256*(BIT-7) INDICATES THE HINT XC 1 LOST IN MAZE XC 2 PONDERING DARK ROOM XC 3 AT WITT'S END XC 4 TRYING TO EXTRACT SWORD XC 5 TRYING TO GO UP SLIDE XC 6 TRYING TO GET INTO CAVE VIA SEA ENTRANCE XC 7 TRYING TO FIND CAVE (ANY ENTRANCE) XC 8 TRYING TO CATCH BIRD XC 9 TRYING TO GET OVER THE RAINBOW XC 10 STYMIED BY DOG XC 11 TRYING TO DEAL WITH SNAKE XC 12 TRYING TO GET TO THE CASTLE XC ONLY ONE HINT PER LOC IS ALLOWED XC LOCCON(LOC) IS SET TO 2, OVERRIDING ALL OTHER BITS, IF LOC HAS FORCED XC MOTION. XC XC SECTION 10: CLASS MESSAGES. EACH LINE CONTAINS A NUMBER (N), A TAB, AND A XC MESSAGE DESCRIBING A CLASSIFICATION OF PLAYER. THE SCORING SECTION XC SELECTS THE APPROPRIATE MESSAGE, WHERE EACH MESSAGE IS CONSIDERED TO XC APPLY TO PLAYERS WHOSE SCORES ARE HIGHER THAN THE PREVIOUS N BUT NOT XC HIGHER THAN THIS N. NOTE THAT THESE SCORES PROBABLY CHANGE WITH EVERY XC MODIFICATION (AND PARTICULARLY EXPANSION) OF THE PROGRAM. XC XC SECTION 11: HINTS. EACH LINE CONTAINS A HINT NUMBER (CORRESPONDING TO A XC COND BIT, SEE SECTION 9), THE NUMBER OF TURNS HE MUST BE AT THE RIGHT XC LOC(S) BEFORE TRIGGERING THE HINT, THE POINTS DEDUCTED FOR TAKING THE XC HINT, THE MESSAGE NUMBER (SECTION 6) OF THE QUESTION, AND THE MESSAGE XC NUMBER OF THE HINT. THESE VALUES ARE STASHED IN THE "HINTS" ARRAY. XC HNTMAX IS SET TO THE MAX HINT NUMBER (<= HNTSIZ). NUMBERS 1-6 ARE XC UNUSABLE SINCE COND BITS ARE OTHERWISE ASSIGNED, SO 2 IS USED TO XC REMEMBER IF HE'S READ THE CLUE IN THE REPOSITORY, AND 3 IS USED TO XC REMEMBER WHETHER HE ASKED FOR INSTRUCTIONS (GETS MORE TURNS, BUT LOSES XC POINTS). HNTMIN IS SET TO THE NUMBER OF THE FIRST USABLE HINT. XC XC SECTION 14: PREPOSITION TABLE. EACH LINE CONTAINS A VERB, A PREPOSITION XC AND VALID OBJECTS FOR THAT VERB/PREP COMBINATION. THEY ARE CONVERTED XC INTO TWO TABLES SIMILAR IN FORMAT TO THE TRAVEL TABLE. THE FIRST XC TABLE, VKEY, HAS ONE ENTRY PER VERB. A ZERO ENTRY INDICATES NO XC PREPOSITION IS VALID WITH THAT VERB. A NON-ZERO ENTRY POINTS TO THE XC BEGINNING OF THE PREP/OBJ LIST FOR THAT VERB. THE POSITION OF THE XC ENTRY IN VKEY CORRESPONDS TO THE VERB NUMBER. THE PREP/OBJ LIST, XC PTAB, FOR A GIVEN VERB CONSISTS OF A SERIES OF ONE-WORD ENTRIES XC DELIMITED BY A NEGATIVE ENTRY. EACH WORD CONTAINS THE PREPOSITION XC NUMBER TIMES 1000 PLUS THE NUMBER OF A VALID OBJECT. A SCHEMATIC XC FOLLOWS. ENTRIES IN VKEY ARE REPRESENTED BY V1, V2, ... VN. XC ENTRIES IN PTAB ARE REPRESENTED BY P1, P2, ..., PN (PREPOSITIONS), XC AND OB1, OB2,..., OBN (OBJECTS). XC XC I VKEY(I) PTAB(J) J XC - ------- ------- - XC 1. V1==========>> P1,OB1 1. XC P1,OB2 2. XC P1,OB3 3. XC P1,OB4 4. XC P1,OB5 5. XC P2,OB1 6. XC P2,OB2 7. XC P3,OB1 8. XC P3,OB2 9. XC P3,OB3 10. XC -P3,OB4 11. XC 2. V2==========>> P1,OB1 12. XC P1,OB2 13. XC P2,OB1 14. XC -P3,OB1 15. XC 3. 0 (THE VERB CORRESPONDING TO THIS POSITION TAKES NO PREPOSITION XC 4. V3==========>> P1,OB1 16. XC -P2,OB1 17. XC XC SECTION 15: OBJECT ATTRIBUTES. EACH LINE CONTAINS A BIT NUMBER AND XC UP TO 20 OBJECT NUMBERS. BIT N (WHERE ZERO IS THE UNITS BIT) IS SET XC IN OBJCON(OBJ) FOR EACH OBJECT GIVEN. THE BITS CURRENTLY ASSIGNED XC ARE: XC 1 THE OBJ CAN BE OPENED/CLOSED. (DOORS, GRATE, CLAM, ETC.) XC 2 THE OBJ IS CURRENTLY OPEN. XC 3 IT HAS A LOCK. (GRATE, CHAIN, ELFIN DOOR, ETC.) XC 4 IT IS CURRENTLY LOCKED. XC 5 FLAMMABLE. (IT WILL BURN IF IGNITED.) XC 6 IT IS CURRENTLY BURNING. XC 7 EDIBLE. FOOD, MUSHROOMS, ETC. XC 8 PRINTED MATERIAL, ANYTHING READABLE XC 9 A LIVING BEASTIE, E.G., DWARF, DOG, WUMPUS, ETC. XC 10 DEAD (KILLED) BEASTIE: WUMPUS, DRAGON, SLEEPING DOG XC 11 CAN BE WORN: CROWN, SHOES, CLOAK, JEWELS XC 12 IS CURRENTLY BEING WORN XC 13 REQUIRES PLURAL RESPONSES (SHOES, COINS, ETC.) XC 14 TREASURE. XC 15 CONTAINER. XC 16 OBJECT IS "SMALL". (CAN FIT INTO SACK OR CHEST) XC 17 CONTAINER IS OPAQUE -- CONTENTS ARE NOT VISIBLE UNLESS XC CONTAINER IS OPEN. XC XC SECTION 16: ADJECTIVE/NOUN LIST. EACH VALID ADJECTIVE IS FOLLOWED BY XC ALL NOUNS WHICH IT MAY MODIFY. XC XC SECTION 0: END OF DATABASE. X X IMPLICIT INTEGER(A-Z) X LOGICAL DSEEN,BLKLIN,HINTED,YES,START,TERSE,ISWIZ,LOGOUT X LOGICAL WZDARK,KILLED,RDFLAG,LIVING X CHARACTER*6 DTK(9),ATAB,DJJ,DK,DKK,DL,DLL X CHARACTER*6 VTXT,OTXT,IOTXT,TXT X CHARACTER ZAPP(20) X CHARACTER*2 KK2C X X COMMON/IZWIZ/ISWIZ X COMMON /ADJCOM/ ADJKEY(50),ADJTAB(150),ADJSIZ X COMMON /BITCOM/ OPENBT,LOCKBT,BURNBT,WEARBT X COMMON /BLKCOM/ BLKLIN X COMMON /CONCOM/ LOCCON(250),OBJCON(150) X COMMON /DIECOM/ NUMDIE,MAXDIE,TURNS,KILLED X COMMON /DWFCOM/ DWARF,KNIFE,KNFLOC,DFLAG,DSEEN(6),DLOC(6), X 1 ODLOC(6),DWFMAX X COMMON /HLDCOM/ HOLDER(150),HLINK(150) X COMMON /HNTCOM/ HINTLC(20),HINTED(20),HINTS(20,4),HNTSIZ,HNTMIN X COMMON /LIQCOM/ BOTTLE,CASK,WATER,OIL,WINE,LIQTYP(5) X COMMON /LOCCOM/ LOC,OLDLOC,OLDLC2,NEWLOC,MAXLOC X COMMON /MNECOM/ BACK,CAVE,DPRSSN,ENTRNC,EXIT,GO,LOOK,NULL, X 1 AXE,BEAR,BOAT,BOOK,BOOK2,BOOTH,CARVNG,CHASM,CHASM2,DOOR,GNOME, X 2 GRATE,LAMP,PDOOR,PLANT,PLANT2,ROCKS,ROD,ROD2,SAFE, X 3 TDOOR,TDOOR2,TROLL,TROLL2,EMRALD,SPICES, X 4 FIND,YELL,INVENT,LEAVE,POUR,SAY,TAKE,THROW, X 5 IWEST,PHUCE(2,4),TK(20) X X COMMON /LTXCOM/ LTEXT(250),STEXT(250),KEY(250),ABB(250),LOCSIZ X COMMON /OBJCOM/ PLAC(150),FIXD(150),WEIGHT(150),PROP(150), X 1 POINTS(150) X COMMON /PLACOM/ ATLOC(250),LINK(300),PLACE(150), X 1 FIXED(150),MAXOBJ X COMMON /PRPCOM/ VKEY(60),PTAB(300),VKYSIZ,PTBSIZ X COMMON /TRVCOM/ TRAVEL(1600) X COMMON /TXTCOM/ LINES(25000),RTEXT(450),PTEXT(150) X COMMON /UTXCOM/ WDX X COMMON /VOCCOM/ KTAB(600),TABSIZ X COMMON /WRDCOM/ VERBS(45),VRBX,OBJS(45), X 1 OBJX,IOBJS(15),IOBX,PREP,WORDS(45) X X COMMON /SAVCOM/ABBNUM,ADJ,ATBS,ATTACK,BCROSS,BONUS,CHASE, X 1 CLOCK1,CLOCK2,CLOCK3,CLOSED,CLOSNG,CLSMAX,COMBO,DEADBT, X 2 DETAIL,DKILL,DTOTAL,DWARFN,FLG239, X 3 FOO,FOOBAR,FOOD,GAVEUP,HEALTH,HINT,HIT,HNTMAX,I,IKK,ILOC, X 4 IOBJ,J,JJ,JK1,JKK,K,K1,KK,L,L1,LIMIT, X 5 LINSIZ,LL,LMWARN,LOCK,LOGOUT,MESSAG,OBJ,PANIC, X 6 PORTAL,PTBS,RDFLAG,RETN,RTXSIZ,SCORE,SCORNG,SECT, X 7 SKEY,SLOC,SPK,START,STICK,TABNDX,TALLY,TALLY2,TERSE, X 8 TRVS,TRVSIZ,VEND,VERB,VRBSIZ,WASTE,WKDAY,WKEND,WZDARK, X 9 YEA,ACTSPK,CTEXT,CVAL,HNAME X COMMON /SV2COM/ANVIL,BATTER,BEES,BILLBD,BIRD,BRUSH,CAGE, X 1 CAKES,CHAIN,CHEST,CHLOC,CHLOC2,CLAM,CLOAK,CLSSES,COINS,CROWN, X 2 DALTLC,DOG,DRAGON,EGGS,FISSUR,FLOWER,GATLOC,GRAIL,HIVE, X 3 HONEY,HORN,JEWELS,KEYS,LYRE, X 4 MAGZIN,MIRROR,MUSHRM,MXSCOR,NUGGET,OYSTER,PEARL,PHONE, X 5 PILLOW,POLE,POSTER,PREPAT,PREPDN,PREPFR,PREPIN,PREPOF, X 6 PREPON,PYRAM,RADIUM,RING,RUG,SAPPHI,SHIELD,SHOES, X 7 SHUT,SLUGS,SNAKE,SPHERE,STEPS,STICKS,SWORD,TABLET,TRIDNT, X 8 UNLOCK,VASE,WALL,WALL2,WEAR,WUMPUS,Y2,YANK X COMMON /SV3COM/DTK,ATAB(600),VTXT(45,2),OTXT(45,2),IOTXT(15,2) X 1 ,TXT(35,2) X COMMON /TNOUX/INDENT X DIMENSION ACTSPK(60),CTEXT(12),CVAL(12) X DIMENSION HNAME(10) X X LOGICAL AJAR,AT,ATHAND,BITSET,BLIND,CLOSED,CLOSNG, X 1 DARK,DEAD,EDIBLE,ENCLSD,FORCED, X 2 GAVEUP,HERE,HINGED,HOLDNG,INSIDE,LMWARN,LOCKS,OUTSID,OPAQUE, X 3 PANIC,PCT,PLURAL,PORTAL,PRINTD,SCORNG,SMALL, X 4 TOTING,TREASR,LOCKED,VESSEL,WEARNG,WORN,YEA, X 5 YESM X XC DATA LINSIZ/25000/,TRVSIZ/1600/,TABSIZ/600/,LOCSIZ/250/, XC 1 VRBSIZ/60/,RTXSIZ/450/,CLSMAX/12/,HNTSIZ/20/, XC 2 MAXOBJ/150/,MAXLOC/300/,HNTMIN/7/,PTBSIZ/300/,ADJSIZ/50/, XC 3 VKYSIZ/60/,BLKLIN/.TRUE./,DWFMAX/6/,ISWIZ/.FALSE./ X X DATA LINUSE/0/ XC PHUCE CONSISTS OF FOUR PAIRS OF ORIGIN/DESTINATION LOCATIONS FROM/TO XC WHICH ONE IS TRANSPORTED ON UTTERING THE ELFIN CURSE AT THE TINY XC DOOR. HE CAN GO FROM BIG TO SMALL OR SMALL TO BIG, ON EITHER SIDE OF XC THE DOOR. X X XC STATEMENT FUNCTIONS XC XC XC AJAR(OBJ = TRUE IF THE OBJECT IS OPEN XC AT(OBJ) = TRUE IF ON EITHER SIDE OF TWO-PLACED OBJECT XC ATHAND(OBJ) = TRUE IF OBJECT IS HERE AND NOT IN CLOSED CONTAINER. XC BITSET(COND,L,N) = TRUE IF COND(L) HAS BIT N SET (BIT 0 IS UNITS BIT) XC BLIND(DUMMY) = TRUE IF HERO CAN'T SEE (TOO DARK OR GLAREY) XC DARK(DUMMY) = TRUE IF LOCATION "LOC" IS DARK XC DEAD(OBJ) = TRUE IF CRITTER IS KILLED (OR IN ENCHANTED SLEEP) XC FORCED(LOC) = TRUE IF LOC MOVES WITHOUT ASKING FOR INPUT (COND=2) XC HERE(OBJ) = TRUE IF THE OBJ IS AT "LOC" (OR IS BEING CARRIED) XC HINGED(OBJ) = TRUE IF OBJECT CAN BE OPENED/SHUT. XC INSIDE(LOC) = TRUE IF LOCATION IS WELL WITHIN THE CAVE XC LIQ(DUMMY) = OBJECT NUMBER OF LIQUID IN BOTTLE XC LIQLOC(LOC) = OBJECT NUMBER OF LIQUID (IF ANY) AT LOC XC LIVING(OBJ) = TRUE IF OBJ IS SOME SORT OF CRITTER XC LOCKED(OBJ) = TRUE IF OBJECT IS LOCKED. (NEED NOT HAVE A LOCK, XC E.G., RUSTY DOOR) XC LOCKS(OBJ) = TRUE IF OBJECT HAS A LOCK. XC OPAQUE(OBJ) = TRUE IF CONTAINER IS NOT TRANSPARENT (SACK, CHEST) XC TRANSPARENT OBJS: BOTTLE(GLASS), CAGE(WICKER) XC OUTSID(LOC) = TRUE IF LOCATION IS OUTSIDE THE CAVE XC PCT(N) = TRUE N% OF THE TIME (N INTEGER FROM 0 TO 100) XC PLURAL(OBJ) = TRUE IF IT IS A PLURAL OBJ (SHOES, KEYS, ETC.) XC PORTAL(LOC) = TRUE IS LOCATION IS IN CAVE "ENTRANCE" XC PRINTD(OBJ) = TRUE IF OBJECT CAN BE READ. XC SMALL(OBJ) = TRUE IF OBJ FITS INTO SACK XC TOTING(OBJ) = TRUE IF THE OBJ IS BEING CARRIED XC TREASR(OBJ) = TRUE IF OBJECT IS A TREASURE XC VESSEL(OBJ) = TRUE IF OBJECT IS A CONTAINER XC WEARNG(OBJ) = TRUE IF OBJECT IS BEING WORN XC WORN(OBJ) = TRUE IF THE OBJECT CAN BE WORN XC XC CLOSED SAYS WHETHER WE'RE ALL THE WAY CLOSED XC CLOSNG SAYS WHETHER ITS CLOSING TIME YET XC DEMO IS TRUE IF THIS IS A PRIME-TIME DEMONSTRATION GAME XC GAVEUP SAYS WHETHER HE EXITED VIA "QUIT" XC LMWARN SAYS WHETHER HE'S BEEN WARNED ABOUT LAMP GOING DIM XC PANIC SAYS WHETHER HE'S FOUND OUT HE'S TRAPPED IN THE CAVE XC SCORNG INDICATES TO THE RATING ROUTINE WHETHER WE'RE DOING A "SCORE" COMMAND XC WZDARK SAYS WHETHER THE LOC HE'S LEAVING WAS DARK XC YEA IS RANDOM YES/NO REPLY X X X X XC CLEAR OUT THE VARIOUS TEXT-POINTER ARRAYS. ALL TEXT IS STORED IN ARRAY XC LINES; EACH LINE IS PRECEDED BY A WORD POINTING TO THE NEXT POINTER (I.E. XC THE WORD FOLLOWING THE END OF THE LINE). THE POINTER IS NEGATIVE IF THIS IS XC FIRST LINE OF A MESSAGE. THE TEXT-POINTER ARRAYS CONTAIN INDICES OF XC POINTER-WORDS IN LINES. STEXT(N) IS SHORT DESCRIPTION OF LOCATION N. XC LTEXT(N) IS LONG DESCRIPTION. PTEXT(N) POINTS TO MESSAGE FOR PROP( PROPN)=0 XC SUCCESSIVE PROP MESSAGES ARE FOUND BY CHASING POINTERS. RTEXT CONTAINS XC SECTION 6'S STUFF. CTEXT(N) POINTS TO A PLAYER-CLASS MESSAGE. MTEXT IS FOR XC SECTION 12. WE ALSO CLEAR COND. SEE DESCRIPTION OF SECTION 9 FOR DETAILS. X X XC ****** CALL THE ROUTINE TO RESTORE FORM DISK ALL THE COMMONS X XC DEADBT = 10 XC OPENBT = 2 XC LOCKBT = 4 XC BURNBT = 6 XC WEARBT = 12 XC DATA PHUCE/158,160,160,158,167,166,166,167/ X X OPEN (UNIT=16,FILE='ADVTXT',STATUS='OLD',FORM= X 1 'UNFORMATTED',ACCESS='SEQUENTIAL') X READ(16)ISWIZ,ADJKEY,ADJTAB,ADJSIZ,OPENBT,LOCKBT,BURNBT,WEARBT X READ(16)BLKLIN,LOCCON,OBJCON,NUMDIE,MAXDIE,TURNS X READ(16)DWARF,KNIFE,KNFLOC,DFLAG,DSEEN,DLOC,ODLOC,DWFMAX X READ(16)HOLDER,HLINK,HINTLC,HINTED,HINTS,HNTSIZ,HNTMIN X READ(16)BOTTLE,CASK,WATER,OIL,WINE,LIQTYP X READ(16)LOC,OLDLOC,OLDLC2,NEWLOC,MAXLOC X READ(16) LTEXT,STEXT,KEY,ABB,LOCSIZ X READ(16) BACK,CAVE,DPRSSN,ENTRNC,EXIT,GO,LOOK,NULL, X 1 AXE,BEAR,BOAT,BOOK,BOOK2,BOOTH,CARVNG,CHASM,CHASM2,DOOR,GNOME, X 2 GRATE,LAMP,PDOOR,PLANT,PLANT2,ROCKS,ROD,ROD2,SAFE, X 3 TDOOR,TDOOR2,TROLL,TROLL2,EMRALD,SPICES, X 4 FIND,YELL,INVENT,LEAVE,POUR,SAY,TAKE,THROW, X 5 IWEST,PHUCE,TK X X READ(16)PLAC,FIXD,WEIGHT,PROP,POINTS X READ(16) ATLOC,LINK,PLACE, X 1 FIXED,MAXOBJ X READ(16) VKEY,PTAB,VKYSIZ,PTBSIZ,TRAVEL X READ(16)LINES,RTEXT,PTEXT,WDX,KTAB,TABSIZ X READ(16) VERBS,VRBX,OBJS, X 1 OBJX,IOBJS,IOBX,PREP,WORDS X X READ(16)ABBNUM,ADJ,ATBS,ATTACK,BCROSS,BONUS,CHASE, X 1 CLOCK1,CLOCK2,CLOCK3,CLOSED,CLOSNG,CLSMAX,COMBO,DEADBT, X 2 DETAIL,DKILL,DTOTAL,DWARFN,FLG239, X 3 FOO,FOOBAR,FOOD,GAVEUP,HEALTH,HINT,HIT,HNTMAX,I,IKK,ILOC, X 4 IOBJ,J,JJ,JK1,JKK,K,K1,KK,L,L1,LIMIT, X 5 LINSIZ,LL,LMWARN,LOCK,LOGOUT,MESSAG,OBJ,PANIC, X 6 PORTAL,PTBS,RDFLAG,RETN,RTXSIZ,SCORE,SCORNG,SECT, X 7 SKEY,SLOC,SPK,START,STICK,TABNDX,TALLY,TALLY2,TERSE, X 8 TRVS,TRVSIZ,VEND,VERB,VRBSIZ,WASTE,WKDAY,WKEND,WZDARK, X 9 YEA,ACTSPK,CTEXT,CVAL,HNAME X READ(16)ANVIL,BATTER,BEES,BILLBD,BIRD,BRUSH,CAGE, X 1 CAKES,CHAIN,CHEST,CHLOC,CHLOC2,CLAM,CLOAK,CLSSES,COINS,CROWN, X 2 DALTLC,DOG,DRAGON,EGGS,FISSUR,FLOWER,GATLOC,GRAIL,HIVE, X 3 HONEY,HORN,JEWELS,KEYS,LYRE, X 4 MAGZIN,MIRROR,MUSHRM,MXSCOR,NUGGET,OYSTER,PEARL,PHONE, X 5 PILLOW,POLE,POSTER,PREPAT,PREPDN,PREPFR,PREPIN,PREPOF, X 6 PREPON,PYRAM,RADIUM,RING,RUG,SAPPHI,SHIELD,SHOES, X 7 SHUT,SLUGS,SNAKE,SPHERE,STEPS,STICKS,SWORD,TABLET,TRIDNT, X 8 UNLOCK,VASE,WALL,WALL2,WEAR,WUMPUS,Y2,YANK X READ(16)DTK,ATAB,VTXT,OTXT,IOTXT X 1 ,TXT X CLOSE(16) X LOC = 1 X INDENT = 0 XC FINALLY, SINCE WE'RE CLEARLY SETTING THINGS UP FOR THE FIRST TIME... X XC START-UP, DWARF STUFF X X1 CONTINUE X I=RANZ(1) X CALL RSPEAK(325) X HINTED(3)=YES(65,1,0) X NEWLOC=1 X LIMIT=650 X FLG239=0 X IF(HINTED(3))LIMIT=400 X XC CAN'T LEAVE CAVE ONCE IT'S CLOSING (EXCEPT BY MAIN OFFICE). X X2 IF(.NOT.OUTSID(NEWLOC).OR.NEWLOC.EQ.0.OR..NOT.CLOSNG)GOTO 71 X CALL RSPEAK(130) X NEWLOC=LOC X IF(.NOT.PANIC)CLOCK2=15 X PANIC=.TRUE. X XC SEE IF A DWARF HAS SEEN HIM AND HAS COME FROM WHERE HE WANTS TO GO. IF SO, XC THE DWARF'S BLOCKING HIS WAY. IF COMING FROM PLACE FORBIDDEN TO PIRATE XC (DWARVES ROOTED IN PLACE) LET HIM GET OUT (AND ATTACKED). X X71 IF(NEWLOC.EQ.LOC)GOTO 74 X ILOC=LOC X171 IF(FORCED(ILOC))GOTO 74 X172 IF(IAND(LOCCON(ILOC),16).NE.0)GOTO 74 X L1=DWFMAX-1 X DO 73 I=1,L1 X IF(ODLOC(I).NE.NEWLOC.OR..NOT.DSEEN(I))GOTO 73 X NEWLOC=LOC X CALL RSPEAK(2) X GOTO 74 X73 CONTINUE X74 LOC=NEWLOC X XC DWARF STUFF. SEE EARLIER COMMENTS FOR DESCRIPTION OF VARIABLES. REMEMBER XC SIXTH DWARF IS PIRATE AND IS THUS VERY DIFFERENT EXCEPT FOR MOTION RULES. X XC FIRST OFF, DON'T LET THE DWARVES FOLLOW HIM INTO A PIT OR A WALL. ACTIVATE XC THE WHOLE MESS THE FIRST TIME HE GETS AS FAR AS THE HALL OF MISTS (LOC 15). XC IF NEWLOC IS FORBIDDEN TO PIRATE (IN PARTICULAR, IF IT'S BEYOND THE TROLL XC BRIDGE), BYPASS DWARF STUFF. THAT WAY PIRATE CAN'T STEAL RETURN TOLL, AND XC DWARVES CAN'T MEET THE BEAR. ALSO MEANS DWARVES WON'T FOLLOW HIM INTO DEAD XC END IN MAZE, BUT C'EST LA VIE. THEY'LL WAIT FOR HIM OUTSIDE THE DEAD END. X X IF(LOC.EQ.0.OR.FORCED(LOC).OR.IAND(LOCCON(NEWLOC),16).NE.0) X 1 GOTO 2000 X IF(DFLAG.NE.0)GOTO 6000 X IF(INSIDE(LOC))DFLAG=1 X GOTO 2000 X XC WHEN WE ENCOUNTER THE FIRST DWARF, WE KILL 0, 1, OR 2 OF THE DWFMAX DWARVES. XC IF ANY OF THE SURVIVORS IS AT LOC, REPLACE HIM WITH THE ALTERNATE. X X6000 IF(DFLAG.NE.1)GOTO 6010 X IF(.NOT.INSIDE(LOC).OR.PCT(95))GOTO 2000 X DFLAG=2 X DO 6001 I=1,2 X J=1+RANZ(DWFMAX-1) X6001 IF(PCT(50))DLOC(J)=0 X L1=DWFMAX-1 X DO 6002 I=1,L1 X IF(DLOC(I).EQ.LOC)DLOC(I)=DALTLC X6002 ODLOC(I)=DLOC(I) X CALL RSPEAK(3) X CALL DROP(AXE,LOC) X GOTO 2000 X XC THINGS ARE IN FULL SWING. MOVE EACH DWARF AT RANDOM, EXCEPT IF HE'S SEEN US XC HE STICKS WITH US. DWARVES NEVER GO TO LOCS WHICH ARE OUTSIDE OR IN XC EITHER OF THE TWO PORTAL AREAS. IF WANDERING AT RANDOM, THEY XC DON'T BACK UP UNLESS THERE'S NO ALTERNATIVE. IF THEY DON'T HAVE TO XC MOVE, THEY ATTACK. AND, OF COURSE, DEAD DWARVES DON'T DO MUCH OF ANYTHING. X X6010 DTOTAL=0 X ATTACK=0 X STICK=0 X DO 6030 I=1,DWFMAX X IF(DLOC(I).EQ.0)GOTO 6030 X J=1 X KK=KEY(DLOC(I)) X IF(KK.EQ.0)GOTO 6016 X6012 NEWLOC=MOD(IABS(TRAVEL(KK))/1000,1000) X IF(NEWLOC.GT.MAXLOC.OR.NEWLOC.EQ.ODLOC(I) X 1 .OR..NOT.INSIDE(NEWLOC) X 2 .OR.(J.GT.1.AND.NEWLOC.EQ.TK(J-1)).OR.J.GE.20 X 3 .OR.NEWLOC.EQ.DLOC(I).OR.FORCED(NEWLOC) X 4 .OR.(I.EQ.DWFMAX.AND.IAND(LOCCON(NEWLOC),16).NE.0) X 5 .OR.IABS(TRAVEL(KK))/1000.EQ.100)GOTO 6014 X TK(J)=NEWLOC X J=J+1 X6014 KK=KK+1 X IF(TRAVEL(KK-1).GE.0)GOTO 6012 X6016 TK(J)=ODLOC(I) X IF(J.GE.2)J=J-1 X J=1+RANZ(J) X ODLOC(I)=DLOC(I) X DLOC(I)=TK(J) X DSEEN(I)=(DSEEN(I).AND.INSIDE(LOC)) X 1 .OR.(DLOC(I).EQ.LOC.OR.ODLOC(I).EQ.LOC) X IF(.NOT.DSEEN(I))GOTO 6030 X DLOC(I)=LOC X IF(I.NE.DWFMAX)GOTO 6027 X XC THE PIRATE'S SPOTTED HIM. HE LEAVES HIM ALONE ONCE WE'VE FOUND CHEST. XC K COUNTS IF A TREASURE IS HERE. IF NOT, AND TALLY=TALLY2 PLUS ONE FOR XC AN UNSEEN CHEST, LET THE PIRATE BE SPOTTED. X X IF(LOC.EQ.CHLOC.OR.PROP(CHEST).GE.0)GOTO 6030 X K=0 X DO 6020 J=1,MAXOBJ XC PIRATE WON'T TAKE PYRAMID FROM PLOVER ROOM OR DARK ROOM (TOO EASY!). X IF(.NOT.TREASR(J).OR.(J.EQ.CASK.AND.LIQ(CASK).NE.WINE))GOTO 6020 X IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM) X 1 .OR.LOC.EQ.PLAC(EMRALD)))GOTO 6020 X IF(TOTING(J).AND.ATHAND(J))GOTO 6022 X6020 IF(HERE(J).AND.TREASR(J))K=1 X IF(TALLY.EQ.TALLY2+1.AND.K.EQ.0.AND.PLACE(CHEST).EQ.0 X 1 .AND.ATHAND(LAMP).AND.PROP(LAMP).EQ.1)GOTO 6025 X IF(ODLOC(DWFMAX).NE.DLOC(DWFMAX).AND.PCT(30))CALL RSPEAK(127) X GOTO 6030 X X6022 CALL RSPEAK(128) XC DON'T STEAL CHEST BACK FROM TROLL! X IF(PLACE(MESSAG).EQ.0)CALL MOVE(CHEST,CHLOC) X CALL MOVE(MESSAG,CHLOC2) X DO 6023 J=1,MAXOBJ X IF(.NOT.TREASR(J).OR.(J.EQ.PYRAM.AND. X 1 (LOC.EQ.PLAC(PYRAM).OR.LOC.EQ.PLAC(EMRALD))).OR. X 2 (J.EQ.CASK.AND.LIQ(CASK).NE.WINE).OR. X 3 (ENCLSD(J).AND..NOT.ATHAND(J)))GOTO 6023 X IF(AT(J).AND.FIXED(J).EQ.0)CALL CARRY(J,LOC) X IF(ENCLSD(J))CALL REMOVE(J) X IF(.NOT.HOLDNG(J))GOTO 6023 X CALL INSERT(J,CHEST) X IF(.NOT.WEARNG(J))GOTO 6023 X PROP(J)=0 X CALL BITOFF(J,WEARBT) X6023 CONTINUE X6024 DLOC(DWFMAX)=CHLOC X ODLOC(DWFMAX)=CHLOC X DSEEN(DWFMAX)=.FALSE. X GOTO 6030 X X6025 CALL RSPEAK(186) X CALL MOVE(CHEST,CHLOC) X CALL MOVE(MESSAG,CHLOC2) X GOTO 6024 X XC THIS THREATENING LITTLE DWARF IS IN THE ROOM WITH HIM! X X6027 DTOTAL=DTOTAL+1 X IF(ODLOC(I).NE.DLOC(I))GOTO 6030 X ATTACK=ATTACK+1 X IF(KNFLOC.GE.0)KNFLOC=LOC X IF(RANZ(1000).LT.250*(DFLAG-2))STICK=STICK+1 X6030 CONTINUE X XC NOW WE KNOW WHAT'S HAPPENING. LET'S TELL THE POOR SUCKER ABOUT IT. X X IF(DTOTAL.EQ.0)GOTO 2000 X IF(DTOTAL.EQ.1)GOTO 75 X WRITE(*,67)DTOTAL X67 FORMAT(/' There are ',I1,' threatening little dwarves in the' X 1 ,' room with you!') X GOTO 77 X75 CALL RSPEAK(4) X77 IF(ATTACK.EQ.0)GOTO 2000 X IF(DFLAG.EQ.2)DFLAG=3 X IF(ATTACK.EQ.1)GOTO 79 X WRITE(*,78)ATTACK X78 FORMAT(/' ',I1,' of them throw knives at you!') X K=6 X82 IF(STICK.GT.1)GOTO 83 X CALL RSPEAK(K+STICK) X IF(STICK.EQ.0)GOTO 2000 X GOTO 84 X83 WRITE(*,68)STICK X68 FORMAT(/' ',I1,' of them get you!') X84 OLDLC2=LOC X GOTO 94100 X X79 CALL RSPEAK(5) X K=52 X GOTO 82 XC DESCRIBE THE CURRENT LOCATION AND (MAYBE) GET NEXT COMMAND. X XC PRINT TEXT FOR CURRENT LOC. X X2000 IF(LOC.EQ.0)GOTO 94100 X JKK=STEXT(LOC) X IF(VERB.EQ.LOOK.OR.JKK.EQ.0.OR. X 1 (.NOT.TERSE.AND.MOD(ABB(LOC),ABBNUM).EQ.0) )JKK=LTEXT(LOC) X IF((FORCED(LOC).OR..NOT.DARK(0)).AND.LOC.NE.200)GOTO 2001 X IF(LOC.NE.200.AND. (DARK(0).OR.PROP(LAMP).EQ.0 X 1 .OR..NOT.ATHAND(LAMP)) )GOTO 2003 X IF(PROP(LAMP).EQ.0.OR..NOT.ATHAND(LAMP))GOTO 2020 X IF(PCT(35))GOTO 94000 X JKK=RTEXT(294) X GOTO 2020 X X2003 IF(WZDARK.AND.PCT(35))GOTO 94000 X JKK=RTEXT(16) X2001 IF(HOLDNG(BEAR).AND..NOT.DARK(0))CALL RSPEAK(141) X2020 CALL SPEAK(JKK) X K=1 X ABB(LOC)=ABB(LOC)+1 X IF(.NOT.FORCED(LOC))GOTO 2022 X CALL TRAVL(K,BCROSS,TALLY2) X IF(KILLED)GOTO 94100 X GOTO 2 X X2022 ABB(LOC)=ABB(LOC)-1 X IF(LOC.EQ.Y2.AND.PCT(25).AND..NOT.CLOSNG)CALL RSPEAK(8) X IF(LOC.EQ.147.AND.ABB(LOC).EQ.1)CALL RSPEAK(216) X XC SEE IF HE IS WASTING HIS BATTERIES OUT IN THE OPEN. X K=0 X IF(.NOT.OUTSID(LOC).OR.PROP(LAMP).EQ.0)GOTO 2030 X K=WASTE+1 X IF(K.LE.12)GOTO 2030 X CALL RSPEAK(324) X K=0 X2030 WASTE=K X XC IF WUMPUS IS CHASING STOOGE, SEE IF WUMPUS GETS HIM. X IF(CHASE.EQ.0)GOTO 2040 X CHASE=CHASE+1 X KK=CHASE/2 X PROP(WUMPUS)=KK X CALL MOVE(WUMPUS,LOC) X IF(KK.LT.5)GOTO 2040 X IF(DARK(0))CALL RSPEAK(270) X CALL PSPEAK(WUMPUS,5) X GOTO 94100 X XC CHECK FOR RADIATION POISONING. X2040 K=1 X IF(OUTSID(LOC))K=3 X HEALTH=MIN0(HEALTH+K,100) X IF(.NOT.HERE(RADIUM).OR. X 1 (PLACE(RADIUM).EQ.-SHIELD.AND..NOT.AJAR(SHIELD)) )GOTO 2045 X HEALTH=HEALTH-7 X IF(HEALTH.GE.60)GOTO 2045 X CALL RSPEAK(391+(60-HEALTH)/10) X IF(HEALTH.LE.0)GOTO 94100 XC PRINT OUT DESCRIPTIONS OF OBJECTS AT THIS LOCATION. IF NOT CLOSING AND XC PROPERTY VALUE IS NEGATIVE, TALLY OFF ANOTHER TREASURE. RUG IS SPECIAL XC CASE; ONCE SEEN, ITS PROP IS 1 (DRAGON ON IT) TILL DRAGON IS KILLED. XC SIMILARLY FOR CHAIN; PROP IS INITIALLY 1 (LOCKED TO BEAR). XC LIKEWISE, FOR SWORD (MUST PROVE ELFIN ROYALTY). X X2045 IF(OLDLOC.NE.188.OR.LOC.EQ.189.OR.LOC.EQ.188 X 1 .OR.PROP(BOOTH).NE.1)GOTO 2021 X CALL MOVE(GNOME,0) X PROP(BOOTH)=0 X2021 IF(BLIND(0))GOTO 2100 X ABB(LOC)=ABB(LOC)+1 X I=ATLOC(LOC) X2004 IF(I.EQ.0)GOTO 2100 X OBJ=I X IF(OBJ.GT.MAXOBJ)OBJ=OBJ-MAXOBJ X IF(OBJ.EQ.STEPS.AND.TOTING(NUGGET))GOTO 2008 X IF(PROP(OBJ).GE.0)GOTO 2006 X IF(CLOSED)GOTO 2008 X PROP(OBJ)=0 X IF(OBJ.EQ.RUG.OR.OBJ.EQ.CHAIN.OR.OBJ.EQ.SWORD X 1 .OR.OBJ.EQ.CASK)PROP(OBJ)=1 X IF(OBJ.EQ.CLOAK.OR.OBJ.EQ.RING)PROP(OBJ)=2 X TALLY=TALLY-1 XC IF REMAINING TREASURES TOO ELUSIVE, ZAP HIS LAMP. X IF(TALLY.EQ.TALLY2.AND.TALLY.NE.0)LIMIT=MIN0(35,LIMIT) X2006 KK=PROP(OBJ) X IF(OBJ.EQ.STEPS.AND.LOC.EQ.FIXED(STEPS))KK=1 X CALL PSPEAK(OBJ,KK) X CALL LOOKIN(OBJ) X2008 I=LINK(I) X GOTO 2004 X XC "I DON'T UNDERSTAND THAT!" X2060 SPK=CONFUZ(0) X GOTO 2011 X XC "YOU CAN'T DO THAT!" (AN IMPOSSIBLE ACT, E.G., "OPEN SWORD", "FEED BOAT", ET X2070 SPK=NOWAY(0) X GOTO 2011 X X2009 SPK=54 X2011 IF(OBJ.EQ.0.OR.(OBJS(2).EQ.0.AND.IOBJS(2).EQ.0))GOTO 2015 X CALL PSPEAK(OBJ,-1) X CALL TNOUA X BLKLIN=.FALSE. X2015 CALL RSPEAK(SPK) X BLKLIN=.TRUE. X X2100 RDFLAG=.FALSE. X IF(OBJX.EQ.0)GOTO 2110 X OBJX=OBJX+1 X IF(OBJS(OBJX).EQ.0)OBJX=0 X2110 IF(OBJX.GT.0.AND.OBJS(OBJX).NE.0)GOTO 2120 X IF(IOBX.EQ.0)GOTO 2120 X IOBX=IOBX+1 X IF(IOBJS(IOBX).EQ.0)IOBX=0 X IF(IOBX.NE.0.AND.OBJS(1).NE.0)OBJX=1 X X2120 IF(OBJX.GT.0.OR.IOBX.GT.0)GOTO 2600 X IF(OBJS(1).NE.0)OBJX=1 X IF(IOBJS(1).NE.0)IOBX=1 X VRBX=VRBX+1 X IF(VERBS(VRBX).NE.0)GOTO 2600 X CALL CLRLIN X RDFLAG=.TRUE. X XC CHECK IF THIS LOC IS ELIGIBLE FOR ANY HINTS. IF BEEN HERE LONG ENOUGH, XC BRANCH TO HELP SECTION (ON LATER PAGE). HINTS ALL COME BACK HERE EVENTUALLY XC TO FINISH THE LOOP. IGNORE "HINTS" < HNTMIN (SPECIAL STUFF, SEE DATABASE XC NOTES). X X2600 DO 2601 HINT=HNTMIN,HNTMAX X IF(HINTED(HINT))GOTO 2601 X IF((LOCCON(LOC)/256).NE.HINT-6)HINTLC(HINT)=-1 X HINTLC(HINT)=HINTLC(HINT)+1 X IF(HINTLC(HINT).GE.HINTS(HINT,1))GOTO 40000 X2601 CONTINUE X2602 CONTINUE XC KICK THE RANDOM NUMBER GENERATOR JUST TO ADD VARIETY TO THE CHASE. ALSO, XC IF CLOSING TIME, CHECK FOR ANY OBJECTS BEING TOTED WITH PROP < 0 AND SET XC THE PROP TO -1-PROP. THIS WAY OBJECTS WON'T BE DESCRIBED UNTIL THEY'VE XC BEEN PICKED UP AND PUT DOWN SEPARATE FROM THEIR RESPECTIVE PILES. DON'T XC TICK CLOCK1 UNLESS WELL INTO CAVE (AND NOT AT Y2). X X IF(.NOT.CLOSED)GOTO 2605 X IF(PROP(OYSTER).LT.0.AND.TOTING(OYSTER)) X 1 CALL PSPEAK(OYSTER,1) X DO 2604 I=1,MAXOBJ X2604 IF(TOTING(I).AND.PROP(I).LT.0)PROP(I)=-1-PROP(I) X2605 WZDARK=DARK(0) X IF(KNFLOC.GT.0.AND.KNFLOC.NE.LOC)KNFLOC=0 X I=RANZ(1) X IF(.NOT.RDFLAG)GOTO 2608 X XC GET A NEW INPUT CLAUSE, OR FINISH GETTING CURRENT ONE. X X CALL GETWDS X VRBX=1 X OBJX=0 X IF(OBJS(1).NE.0)OBJX=1 X IOBX=0 X IF(IOBJS(1).NE.0)IOBX=1 X RDFLAG=.TRUE. X XC EVERY INPUT, CHECK "FOOBAR" FLAG. IF ZERO, NOTHING'S GOING ON. IF POS, XC MAKE NEG. IF NEG, HE SKIPPED A WORD, SO MAKE IT ZERO. X X2608 FOOBAR=MIN0(0,-FOOBAR) X COMBO=MIN0(0,-COMBO) X TURNS=TURNS+1 X2609 IF(TURNS.EQ.310.AND.ABBNUM.NE.10000.AND..NOT.TERSE) X 1 CALL RSPEAK(273) X XC BUMP ALL THE RIGHT CLOCKS FOR RECONNING BATTERY LIFE AND CLOSING. X X IF(CLOSED)CLOCK3=CLOCK3-1 X IF(CLOCK3.EQ.-7)GOTO 93300 X IF(CLOCK3.NE.0)GOTO 2621 X PROP(PHONE)=0 X PROP(BOOTH)=0 X CALL RSPEAK(284) X2621 IF(TALLY.EQ.0.AND.INSIDE(LOC).AND.LOC.NE.Y2)CLOCK1=CLOCK1-1 X IF(CLOCK1.EQ.0)GOTO 90000 X IF(CLOCK1.LT.0)CLOCK2=CLOCK2-1 X IF(CLOCK2.EQ.0)GOTO 91000 X IF(PROP(LAMP).EQ.1)LIMIT=LIMIT-1 X IF(LIMIT.EQ.0)GOTO 92400 X IF(LIMIT.LT.0.AND.OUTSID(LOC))GOTO 92600 X IF(LIMIT.LE.40)GOTO 92000 X X19999 VERB=VAL(VERBS(VRBX)) X OBJ=0 X IF(OBJX.NE.0)OBJ=OBJS(OBJX) X IOBJ=0 X IF(IOBX.NE.0)IOBJ=IOBJS(IOBX) X IF(KNFLOC.NE.LOC.OR.(OBJ.NE.KNIFE.AND.IOBJ.NE.KNIFE))GOTO 19998 X KNFLOC=-1 X SPK=116 X GOTO 2011 X X19998 GOTO (2750,2700,4000,2710), CLASS(VERBS(VRBX)) X2700 CALL BUG(22) X X2710 SPK=VERB X GOTO 2011 X XC IT IS A MOTION VERB. ANALYZE IT & LOOP TO 2, IF NOT DEAD. X2750 CALL TRAVL(VERB,BCROSS,TALLY2) X IF(KILLED)GOTO 94100 X GOTO 2 X XC ACTION VERB 'LEAVE' (DROP) HAS NO OBJECT. X3100 CALL BUG(29) X XC VERB 'SAY' OR 'YELL' SLIPPED THROUGH WITH AN OBJECT. X3200 CALL BUG(34) X XC ANALYSE A VERB. X4000 SPK=ACTSPK(VERB) X IF(OBJ.NE.0.OR.IOBJ.NE.0)GOTO 4090 X XC ANALYSE AN INTRANSITIVE VERB (IE, NO OBJECT GIVEN YET). X X GOTO( X 9 10100,10000,10000,10400, 2009,10400,20700,20800,10000,10000, X 9 2011,21200,11300,11400,11500,10000,10000,11800,10000,12000, X 9 10000,12200,12300,12400,12500,12600,10000,10000,10000,13000, X 9 13100,10100,10000,10000,13500,23600, 3100,13800,10000,10000, X 9 10000,10000,10000,10100,10100,10100,10100,14800,10400,10400, X 9 25100,25200,25300,25400,25500,25600,25700,25800,25900),VERB XC 01-10 TAKE DROP SAY OPEN NOTH CLOSE ON OFF WAVE CALM XC 11-20 WALK KILL POUR EAT DRINK RUB THROW QUIT FIND INVEN XC 21-30 FEED FILL BLAST SCORE FOO BRIEF READ BREAK WAKE SUSPD XC 31-40 RESUM YANK WEAR HIT ANSWR BLOW LEAVE YELL DIAL PLAY XC 41-50 PICK PUT TURN GET INSRT REMOV BURN GRIPE LOCK UNLOK XC 51-60 HEALTH LOOK COMBO SWEEP TERSE WIZ MAP GATE PIRLOC X CALL BUG(23) X XC ANALYSE A TRANSITIVE VERB. X X4090 GOTO( X 9 20100,20200, 3200,20400, 2009,20600,20700,20800,20900, 2011, X 9 2011,21200,21300,21400,21500,21600,21700, 2011,21900,21900, X 9 22100,22200,12300, 2011, 2011,22600,22700,22800,22900, 2011, X 9 2011,23200,23300,23400,23500,23600,20200, 3200,23900,24000, X 9 24100,24200,24300,24400,24500,24600,24700, 2060,24900,25000, X 9 2060,25200, 2070,25400, 2060, 2060, 2060, 2060, 2060),VERB XC 01-10 TAKE DROP SAY OPEN NOTH CLOSE ON OFF WAVE CALM XC 11-20 WALK KILL POUR EAT DRINK RUB THROW QUIT FIND INVEN XC 21-30 FEED FILL BLAST SCORE FOO BRIEF READ BREAK WAKE SUSPD XC 31-40 HOUR YANK WEAR HIT ANSWR BLOW LEAVE YELL DIAL PLAY XC 41-50 PICK PUT TURN GET INSRT REMOV BURN GRIPE LOCK UNLOK XC 51-60 HEALTH LOOK COMBO SWEEP TERSE WIZ MAP GATE PIRLOC X CALL BUG(24) XC ROUTINES FOR PERFORMING THE VARIOUS ACTION VERBS X XC STATEMENT NUMBERS IN THIS SECTION ARE 10000 FOR INTRANSITIVE VERBS, 20000 FOR XC TRANSITIVE, PLUS 100 TIMES THE VERB NUMBER. MANY INTRANSITIVE VERBS USE THE XC TRANSITIVE CODE, AND SOME VERBS USE CODE FOR OTHER VERBS, AS NOTED BELOW. X XC RANDOM INTRANSITIVE VERBS COME HERE. CLEAR OBJ JUST IN CASE (SEE "ATTACK"). X X10000 CALL A5TOA1(VTXT(VRBX,1),VTXT(VRBX,2),'_What?',ZAPP,K) X WRITE(*,10002)(ZAPP(I),I=1,K) X10002 FORMAT(/' ',20A1) X OBJS(1)=0 X OBJX=0 X GOTO 2600 X X X10010 CALL A5TOA1(VTXT(VRBX,1),VTXT(VRBX,2),'_it? ',ZAPP,K) X WRITE(*,10012)(ZAPP(I),I=1,K) X10012 FORMAT(/' Where do you want to ',20A1) X GOTO 2600 X X XC CONSTRUCT MSG: "I DON'T KNOW HOW TO [VERB] THE [OBJ]", AND VARIANTS. X XC CARRY, NO OBJECT GIVEN YET. OK IF ONLY ONE OBJECT PRESENT. X X10100 IF(ATLOC(LOC).EQ.0.OR.LINK(ATLOC(LOC)).NE.0.OR.BLIND(0)) X 1 GOTO 10000 X L1=DWFMAX-1 X DO 10110 I=1,L1 X IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 10000 X10110 CONTINUE X OBJ=ATLOC(LOC) X IF(VERB.EQ.YANK)GOTO 23200 X IF(VERB.EQ.WEAR)GOTO 23300 X XC CARRY AN OBJECT. SPECIAL CASES FOR BIRD AND CAGE (IF BIRD IN CAGE, CAN'T XC TAKE ONE WITHOUT THE OTHER. LIQUIDS ALSO SPECIAL, SINCE THEY DEPEND ON XC STATUS OF BOTTLE. ALSO VARIOUS SIDE EFFECTS, ETC. XC "YANK" AND "WEAR" ALSO WEAVE INTO THIS CODE, SINCE THEY ARE MOSTLY XC JUST RESTRICTED CARRY'S. X X20100 IF(OBJ.EQ.BOAT)SPK=281 X IF(PLURAL(OBJ))SPK=297 X IF(OBJ.EQ.BIRD.AND..NOT.CLOSED.AND.ATHAND(BIRD) X 1 .AND.PLACE(BIRD).NE.LOC)GOTO 20102 X IF(PREP.NE.PREPOF)GOTO 20104 X IF(OBJ.NE.0.AND.IOBJ.NE.0)GOTO 2060 X IF(OBJ.EQ.0)OBJ=IOBJ X IOBJ=0 X GOTO 20200 X20102 CALL RSPEAK(407) X GOTO 2 X X20104 IF(HOLDNG(OBJ))GOTO 2011 X ASSIGN 20106 TO RETN X GOTO 20190 X X20106 IF(PREP.EQ.PREPIN)GOTO 24500 X IF(PREP.EQ.PREPFR.OR.ENCLSD(OBJ))GOTO 24600 X XC THE NEXT LINES ARE FOR 'TAKING' LIQUIDS (WATER, OIL & WINE). XC IF WE ARE HOLDING A CONTAINER (BOTTLE OR CASK), WE CAN TAKE THE XC THE LIQUID BY FILLING THE CONTAINER. IF THERE IS A CONTAINER NEARBY XC HOLDING THE REQUESTED LIQUID, WE WILL PICK UP THE CONTAINER. X X IF(IOBJ.EQ.0)GOTO 20110 X SPK=313 X IF(OBJ.NE.CASK.AND.OBJ.NE.BOTTLE)GOTO 2011 X K=0 X IF(OBJ.EQ.CASK)K=1 X IOBJ=IOBJ+K X IF(LIQ(OBJ).EQ.IOBJ)GOTO 20116 X SPK=302+K X IF(PROP(OBJ).NE.1)GOTO 2011 X GOTO 20118 X X20110 IF(OBJ.NE.WATER.AND.OBJ.NE.OIL.AND.OBJ.NE.WINE)GOTO 20120 X IOBJ=OBJ X K=0 X OBJ=BOTTLE X IF(.NOT.HERE(BOTTLE))GOTO 20114 X IF(PROP(BOTTLE).NE.1)GOTO 20112 X IF(.NOT.HERE(CASK).OR.(HERE(CASK).AND.PROP(CASK).EQ.1)) X 1 GOTO 20118 X OBJ=0 X CALL RSPEAK(304) X GOTO 2600 X X20112 IF(LIQ(BOTTLE).EQ.IOBJ)GOTO 20116 X20114 SPK=312 X IF(.NOT.HERE(CASK))GOTO 2011 X OBJ=CASK X K=1 X IF(PROP(CASK).EQ.1)GOTO 20118 X IF(LIQ(CASK).EQ.IOBJ)GOTO 20116 X SPK=315 X IF(.NOT.ATHAND(BOTTLE))SPK=303 X GOTO 2011 X X20116 IF(.NOT.HOLDNG(OBJ))GOTO 20120 X SPK=302+K X GOTO 2011 X X20118 IF(HOLDNG(OBJ))GOTO 22200 X GOTO 20120 XC *** END OF LIQUID STUFF X XC 'WEAR' AND 'YANK' WEAVE IN HERE. X X20120 SPK=343 X IF(OBJ.EQ.BEAR .OR. BURDEN(0)+BURDEN(OBJ).LE.15 )GOTO 20125 X SPK=92 X IF(.NOT.WEARNG(OBJ))GOTO 2011 X PROP(OBJ)=0 X CALL BITOFF(OBJ,WEARBT) X GOTO 2011 X XC CLOAK. BIG TROUBLE AHEAD. CAN ONLY GET HERE VIA 'YANK'. X20125 IF(OBJ.NE.CLOAK.OR.PROP(CLOAK).NE.2)GOTO 20130 X PROP(ROCKS)=1 X PROP(CLOAK)=0 X FIXED(CLOAK)=0 X CALL CARRY(CLOAK,LOC) X CALL RSPEAK(241) X IF(AT(WUMPUS).AND.PROP(WUMPUS).EQ.0)GOTO 22900 X GOTO 2100 X XC POSTER: HIDES WALL SAFE. X20130 IF(OBJ.NE.POSTER.OR.PLACE(SAFE).NE.0)GOTO 20160 X PROP(POSTER)=1 X SPK=362 XC MOVE SAFE AND WALL CONTAINING SAFE INTO VIEW. X CALL DROP(SAFE,LOC) X CALL DROP(WALL2,LOC) X GOTO 20180 X XC BOAT: NEED THE POLE TO PUSH IT X20160 IF(OBJ.NE.BOAT)GOTO 20165 X SPK=218 X IF(.NOT.TOTING(POLE).AND.PLACE(POLE).NE.-BOAT)GOTO 2011 X PROP(BOAT)=1 X SPK=221 X GOTO 20180 X XC BIRD: GOT TO HAVE CAGE, BUT ROD CAN'T BE AROUND TO TAKE BIRD X20165 IF(OBJ.NE.BIRD.OR.PROP(BIRD).NE.0)GOTO 20170 X SPK=26 X IF(ATHAND(ROD))GOTO 2011 X SPK=27 X IF(.NOT.HOLDNG(CAGE))GOTO 2011 X CALL INSERT(BIRD,CAGE) X CALL BITOFF(CAGE,OPENBT) X GOTO 2009 X XC SWORD: IF IN ANVIL, NEEDS CROWN & MUST YANK. X20170 IF(OBJ.NE.SWORD.OR.PROP(SWORD).EQ.0)GOTO 20180 X IF(IOBJ.NE.0.AND.IOBJ.NE.ANVIL)GOTO 2070 X IF(VERB.EQ.YANK)GOTO 20175 X XC HE WANTS THE SWORD, BUT HASN'T ESTABLISHED HIS ROYAL BLOOD, OR HE XC HASN'T PULLED HARD ENOUGH. OR NEITHER. X X IF(.NOT.YES(215,0,0))GOTO 2009 X20175 IF(WEARNG(CROWN))GOTO 20180 X CALL PSPEAK(SWORD,2) X IF(CLOSED)GOTO 93000 X FIXED(SWORD)=-1 X PROP(SWORD)=3 X GOTO 2100 X X20180 CALL CARRY(OBJ,LOC) X IF(OBJ.EQ.POLE.OR.OBJ.EQ.SKEY.OR.OBJ.EQ.SWORD X 1 .OR.((OBJ.EQ.CLOAK.OR.OBJ.EQ.RING) X 2 .AND..NOT.WEARNG(OBJ)) )PROP(OBJ)=0 X IF(VERB.NE.YANK.OR.OBJ.EQ.SWORD)GOTO 2011 X SPK=204 X GOTO 2011 X X XC THIS IS A QUASI-SUBROUTINE, CALLED FROM 'TAKE' AND FROM 'INSERT', WHEN XC THE ITEM IS NOT CURRENTLY BEING TOTED. 'RETN' IS A VARIABLE DEFINED XC TO BE THE RETURN ADDRESS. X X20190 SPK=NOWAY(0) X IF(OBJ.EQ.PLANT.AND.PROP(PLANT).LE.0)SPK=115 X IF(OBJ.EQ.BEAR.AND.PROP(BEAR).EQ.1)SPK=169 X IF(OBJ.EQ.CHAIN.AND.PROP(BEAR).NE.0)SPK=170 X IF(OBJ.EQ.SWORD.AND.PROP(SWORD).EQ.5)SPK=208 X IF(OBJ.EQ.CLOAK.AND.PROP(CLOAK).EQ.2)SPK=242 X IF(OBJ.EQ.AXE.AND.PROP(AXE).EQ.2)SPK=246 X IF(OBJ.EQ.PHONE)SPK=251 X IF(OBJ.EQ.BEES.OR.OBJ.EQ.HIVE)SPK=295 X IF(OBJ.EQ.STICKS)SPK=296 X IF(FIXED(OBJ).NE.0)GOTO 2011 X GOTO RETN XC DROP/DISCARD OBJECT. "THROW" ALSO COMES HERE FOR MOST OBJECTS. XC SPECIAL CASES FOR BIRD (MIGHT ATTACK SNAKE OR DRAGON) AND CAGE (MIGHT XC CONTAIN BIRD) AND VASE. XC DROP COINS IN VENDING MACHINE FOR EXTRA BATTERIES. X X20200 IF(HOLDNG(ROD2).AND.OBJ.EQ.ROD.AND..NOT.HOLDNG(ROD))OBJ=ROD2 X IF(PLURAL(OBJ))SPK=105 X K=LIQ(BOTTLE) X IF(K.EQ.OBJ)OBJ=BOTTLE X IF(OBJ.NE.BOTTLE)K=LIQ(CASK) X IF(OBJ.NE.BOTTLE.AND.K.EQ.OBJ)OBJ=CASK X IF(.NOT.TOTING(OBJ))GOTO 2011 X IF(PREP.EQ.PREPIN)GOTO 24500 X IF(OBJ.NE.BIRD.OR..NOT.HERE(SNAKE))GOTO 20220 X CALL RSPEAK(30) X IF(CLOSED)GOTO 93000 X CALL REMOVE(BIRD) X CALL DSTROY(SNAKE) XC SET SNAKE PROP FOR USE BY TRAVEL OPTIONS X PROP(SNAKE)=1 X CALL DROP(BIRD,LOC) X GOTO 2100 X X20220 SPK=344 X IF(VERB.EQ.LEAVE)SPK=353 X IF(VERB.EQ.THROW)SPK=352 X IF(VERB.EQ.TAKE)SPK=54 X IF(OBJ.NE.POLE.OR..NOT.HOLDNG(BOAT))GOTO 20240 X SPK=280 X GOTO 2011 X X20240 IF(OBJ.NE.BIRD.OR..NOT.AT(DRAGON).OR.PROP(DRAGON).NE.0) X 1 GOTO 20260 X CALL RSPEAK(154) X CALL REMOVE(BIRD) X CALL DSTROY(BIRD) X IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1 X GOTO 2100 X X20260 IF(OBJ.NE.BEAR.OR..NOT.AT(TROLL))GOTO 20270 X SPK=163 X CALL DSTROY(TROLL) X CALL DSTROY(TROLL+MAXOBJ) X CALL MOVE(TROLL2,PLAC(TROLL)) X CALL MOVE(TROLL2+MAXOBJ,FIXD(TROLL)) X CALL JUGGLE(CHASM) X PROP(TROLL)=2 X GOTO 20290 X X20270 IF(OBJ.NE.VASE.OR.LOC.EQ.PLAC(PILLOW))GOTO 20280 X PROP(VASE)=2 X IF(AT(PILLOW))PROP(VASE)=0 X CALL PSPEAK(VASE,PROP(VASE)+1) X IF(PROP(VASE).NE.0)FIXED(VASE)=-1 X GOTO 20290 X X20280 IF(WORN(OBJ).OR.OBJ.EQ.POLE.OR.OBJ.EQ.BOAT)PROP(OBJ)=0 X IF(WORN(OBJ))CALL BITOFF(OBJ,WEARBT) X IF(OBJ.EQ.POLE)PROP(BOAT)=0 X20290 IF(ENCLSD(OBJ))CALL REMOVE(OBJ) X CALL DROP(OBJ,LOC) X GOTO 2011 XC OPEN/CLOSE/LOCK/UNLOCK: NO OBJECT GIVEN. XC ASSUME VARIOUS THINGS IF PRESENT. X X10400 SPK=28 X K=0 X DO 10410 I=1,MAXOBJ X IF(.NOT.(HERE(I).AND.HINGED(I)))GOTO 10410 X OBJ=I X K=K+1 X10410 CONTINUE X IF(K.GT.1)GOTO 10000 X IF(OBJ.NE.0)GOTO 10420 X IF(VERB.EQ.LOCK.OR.VERB.EQ.UNLOCK)GOTO 2011 X GOTO 10000 X X10420 IF(VERB.EQ.LOCK)GOTO 24900 X IF(VERB.EQ.UNLOCK)GOTO 25000 X IF(VERB.EQ.SHUT)GOTO 20600 X XC OPEN. SPECIAL STUFF FOR OPENING CLAM/OYSTER. XC THE FOLLOWING CAN BE OPENED WITHOUT A KEY: XC CLAM/OYSTER, DOOR, PDOOR, BOTTLE, CASK, CAGE X X20400 IF(.NOT.HINGED(OBJ))GOTO 2070 X SPK=253 X IF(OBJ.EQ.PDOOR.AND.PROP(PDOOR).EQ.1)GOTO 2011 X SPK=336 X IF(AJAR(OBJ))GOTO 2011 X IF(LOCKS(OBJ).OR.IOBJ.EQ.KEYS.OR.IOBJ.EQ.SKEY)GOTO 25000 X SPK=337 X IF(OBJ.EQ.DOOR)SPK=111 X IF(LOCKED(OBJ))GOTO 2011 X IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)GOTO 20410 X CALL BITON(OBJ,OPENBT) X GOTO 2009 X XC CLAM/OYSTER. X20410 K=0 X IF(OBJ.EQ.OYSTER)K=1 X SPK=124+K X IF(HOLDNG(OBJ))SPK=120+K X IF(.NOT.ATHAND(TRIDNT))SPK=122+K X IF(IOBJ.NE.0.AND.IOBJ.NE.TRIDNT)SPK=376+K X IF(SPK.NE.124)GOTO 2011 X CALL DSTROY(CLAM) X CALL DROP(OYSTER,LOC) X CALL DROP(PEARL,105) X GOTO 2011 X X XC CLOSE. SHUT. XC THE FOLLOWING CAN BE CLOSED WITHOUT KEYS: XC DOOR, PDOOR, BOTTLE, CASK, CAGE X X20600 IF(.NOT.HINGED(OBJ))GOTO 2070 X SPK=338 X IF(.NOT.AJAR(OBJ))GOTO 2011 X IF(LOCKS(OBJ))GOTO 24900 X CALL BITOFF(OBJ,OPENBT) X GOTO 2009 XC LIGHT LAMP X X20700 IF(.NOT.ATHAND(LAMP))GOTO 2011 X SPK=184 X IF(LIMIT.LT.0)GOTO 2011 X SPK=321 X IF(PROP(LAMP).EQ.1)GOTO 2011 X PROP(LAMP)=1 X K=39 X IF(LOC.EQ.200)K=108 X CALL RSPEAK(K) X IF(WZDARK)GOTO 2000 X GOTO 2100 X XC LAMP OFF X X20800 IF(.NOT.ATHAND(LAMP))GOTO 2011 X SPK=322 X IF(PROP(LAMP).EQ.0)GOTO 2011 X PROP(LAMP)=0 X CALL RSPEAK(40) X IF(DARK(0))CALL RSPEAK(16) X GOTO 2100 X XC WAVE. NO EFFECT UNLESS WAVING ROD AT FISSURE. X X20900 IF((.NOT.HOLDNG(OBJ)).AND.(OBJ.NE.ROD.OR..NOT.HOLDNG(ROD2))) X 1 SPK=29 X IF(OBJ.NE.ROD.OR..NOT.AT(FISSUR).OR..NOT.HOLDNG(OBJ) X 1 .OR.CLOSNG)GOTO 2011 X IF(IOBJ.NE.0.AND.IOBJ.NE.FISSUR)GOTO 2011 X PROP(FISSUR)=1-PROP(FISSUR) X CALL PSPEAK(FISSUR,2-PROP(FISSUR)) X IF(CHASE.EQ.0.OR.PROP(FISSUR).NE.0)GOTO 2100 X XC DEMISE OF THE WUMPUS. CHAMP MUST HAVE JUST CROSSED BRIDGE. X X IF((LOC.EQ.17.AND.OLDLOC.NE.27) X 1 .OR.(LOC.EQ.27.AND.OLDLOC.NE.17))GOTO 2100 X CALL RSPEAK(244) X CHASE=0 X CALL DROP(RING,209) X CALL MOVE(WUMPUS,209) X PROP(WUMPUS)=6 X CALL BITON(WUMPUS,DEADBT) X IF(PLACE(AXE).NE.PLAC(WUMPUS))GOTO 2100 X FIXED(AXE)=0 X PROP(AXE)=0 X GOTO 2100 X XC ATTACK. ASSUME TARGET IF UNAMBIGUOUS. "THROW" ALSO LINKS HERE. ATTACKABLE XC OBJECTS FALL INTO TWO CATEGORIES: ENEMIES (SNAKE, DWARF, ETC.) AND OTHERS XC (BIRD, CLAM). AMBIGUOUS IF TWO ENEMIES, OR IF NO ENEMIES BUT TWO OTHERS. X XC KILL OBJ WITH IOBJ. X X21200 L1=DWFMAX-1 X DO 21210 DWARFN=1,L1 X IF(DLOC(DWARFN).EQ.LOC.AND.DFLAG.GE.2)GOTO 21220 X21210 CONTINUE X DWARFN=0 X21220 IF(OBJ.NE.0)GOTO 21240 X IF(DWARFN.NE.0)OBJ=DWARF X IF(HERE(SNAKE))OBJ=OBJ*MAXOBJ+SNAKE X IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)OBJ=OBJ*MAXOBJ+DRAGON X IF(AT(TROLL))OBJ=OBJ*MAXOBJ+TROLL X IF(HERE(GNOME))OBJ=OBJ*MAXOBJ+GNOME X IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)OBJ=OBJ*MAXOBJ+BEAR X IF(HERE(WUMPUS).AND.PROP(WUMPUS).EQ.0)OBJ=OBJ*MAXOBJ+WUMPUS X IF(OBJ.GT.MAXOBJ)GOTO 10000 X IF(OBJ.NE.0)GOTO 21240 XC CAN'T ATTACK BIRD BY THROWING AXE. X IF(HERE(BIRD).AND.VERB.NE.THROW)OBJ=BIRD XC CLAM AND OYSTER BOTH TREATED AS CLAM FOR INTRANSITIVE CASE; NO HARM DONE. X IF(HERE(CLAM).OR.HERE(OYSTER))OBJ=MAXOBJ*OBJ+CLAM X IF(OBJ.GT.MAXOBJ)GOTO 10000 X21240 IF(OBJ.NE.BIRD)GOTO 21250 X SPK=137 X IF(CLOSED)GOTO 2011 X CALL DSTROY(BIRD) X PROP(BIRD)=0 X IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1 X SPK=45 X21250 IF(OBJ.EQ.DWARF)GOTO 21270 X IF(OBJ.EQ.0)SPK=44 X IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)SPK=150 X IF(AT(DOG).AND.PROP(DOG).EQ.1)SPK=291 X IF(OBJ.EQ.SNAKE)SPK=46 X IF(OBJ.EQ.DRAGON.OR.(OBJ.EQ.WUMPUS.AND.PROP(WUMPUS).EQ.6))SPK=167 X IF(OBJ.EQ.TROLL)SPK=157 X IF(OBJ.EQ.BEAR)SPK=165+(PROP(BEAR)+1)/2 X IF(OBJ.EQ.GNOME)SPK=320 X IF(IOBJ.NE.AXE.OR.VERB.EQ.THROW.OR. X 1 (OBJ.NE.DOG.AND.OBJ.NE.WUMPUS.AND.OBJ.NE.DRAGON X 2 .AND.OBJ.NE.TROLL))GOTO 21253 X IOBJ=OBJ X OBJ=IOBJS(IOBX) X SPK=110 X GOTO 21700 X X21253 IF(IOBJ.NE.0.AND.IOBJ.NE.AXE)GOTO 2070 X IF(.NOT.(OBJ.NE.DRAGON.OR.PROP(DRAGON).NE.0))GOTO 21294 X IF(OBJ.NE.TROLL.AND.SPK.EQ.158)SPK=110 X GOTO 2011 X XC FUN STUFF FOR DRAGON. IF HE INSISTS ON ATTACKING IT, WIN! SET PROP TO DEAD, XC MOVE DRAGON TO CENTRAL LOC (STILL FIXED), MOVE RUG THERE (NOT FIXED), AND XC MOVE HIM THERE, TOO. THEN DO A NULL MOTION TO GET NEW DESCRIPTION. XC THERE IS SOME AMOUNT OF PAIN HERE, TO FORCE GETWDS TO DO THE RIGHT THING. X X21294 CALL RSPEAK(49) X CALL GETLIN X WDX=0 X CALL CLRLIN X IF(TXT(1,1).EQ.'Y '.OR.TXT(1,1).EQ.'YES ')GOTO 21255 X WORDS(1)=-2 X RDFLAG=.TRUE. X GOTO 2600 X X21255 CALL PSPEAK(DRAGON,1) X CALL BITON(DRAGON,DEADBT) X PROP(DRAGON)=2 X PROP(RUG)=0 X K=(PLAC(DRAGON)+FIXD(DRAGON))/2 X CALL MOVE(DRAGON+MAXOBJ,-1) X CALL MOVE(RUG+MAXOBJ,0) X CALL MOVE(DRAGON,K) X CALL MOVE(RUG,K) X DO 21260 OBJ=1,MAXOBJ X IF(PLACE(OBJ).EQ.PLAC(DRAGON).OR.PLACE(OBJ).EQ.FIXD(DRAGON)) X 1 CALL MOVE(OBJ,K) X21260 CONTINUE X WORDS(1)=0 X LOC=K X NEWLOC=K X GOTO 2 X XC HE IS ATTACKING A DWARF. IF USING SOMETHING OTHER THAN AXE OR SWORD, XC GOODBYE CHARLIE. IF USING NOTHING, DON'T LET HIM. IF USING AXE OR XC SWORD, THE FOLLOWING ODDS PREVAIL (IF I CALCULATED THIS MESS RIGHT!) XC (THE END OF LINE FIGURE IS THE CULULATIVE PROBABILITY OF THE EVENT): XC .25 - HERO KILLS DWARF (.25) XC .75 - HERO MISSES XC .25 - HERO GETS KNIFE IN (HIS) RIBS. DIES. (.1875) XC .75 - HERO CAN'T MAKE A CLEAN THRUST XC .36 - STANDOFF (.2) XC .64 - DWARF SLASHES XC .61 - DWARF MISSES! (.22) XC .39 - DWARF KILLS HERO (.14) XC ADVENTURER HAS 1/3 CHANCE OF GETTING NAILED, 1/4 CHANCE OF NAILING XC DWARF. ALL BY WAY OF ENCOURAGING HIM TO THROW THE AXE. X X21270 IF(OBJ.EQ.DWARF.AND.CLOSED)GOTO 93000 X SPK=49 X IF(IOBJ.EQ.0)GOTO 2011 X SPK=355 X IF(IOBJ.NE.AXE.AND.IOBJ.NE.SWORD)GOTO 21275 X IF(PCT(25))GOTO 21753 X IF(PCT(25))GOTO 21275 X CALL RSPEAK(354) X IF(PCT(36))GOTO 2100 X CALL RSPEAK(356) X SPK=52 X IF(PCT(61))GOTO 2011 X SPK=53 X XC HERO IS GONZO. X21275 CALL RSPEAK(SPK) X OLDLC2=LOC X GOTO 94100 XC POUR. IF NO OBJECT, ASSUME LIQ IN CONTAINER, IF HOLDING ONLY ONE. XC SPECIAL TESTS FOR POURING WATER OR OIL ON PLANT OR RUSTY DOOR. X X11300 IF(.NOT.HOLDNG(BOTTLE).AND..NOT.HOLDNG(CASK))GOTO 10000 X K=LIQ(BOTTLE) X KK=LIQ(CASK) X IF(HOLDNG(BOTTLE).AND.K.NE.0.AND.HOLDNG(CASK) X 1 .AND.KK.NE.0)GOTO 10000 X IF(KK.NE.0.AND.HOLDNG(CASK))OBJ=CASK X IF(K.NE.0.AND.HOLDNG(BOTTLE))OBJ=BOTTLE X IF(OBJ.EQ.0)GOTO 10000 X XC POUR OBJ FROM IOBJ. X21300 SPK=78 X IF(OBJ.NE.BOTTLE.AND.OBJ.NE.CASK)GOTO 21310 X IOBJ=OBJ X OBJ=LIQ(IOBJ) X SPK=316 X IF(OBJ.EQ.0)GOTO 2011 X GOTO 21320 X X21310 IF(OBJ.LT.WATER.OR.OBJ.GT.WINE+1)GOTO 2011 X SPK=29 X IF(.NOT.HOLDNG(BOTTLE).AND..NOT.HOLDNG(CASK))GOTO 2011 X IF(HOLDNG(BOTTLE).AND.LIQ(BOTTLE).EQ.OBJ)IOBJ=BOTTLE X IF(HOLDNG(CASK).AND.LIQ(CASK).EQ.OBJ)IOBJ=CASK X IF(IOBJ.EQ.0)GOTO 2011 X21320 SPK=335 X IF(.NOT.AJAR(IOBJ))GOTO 2011 X IF(IOBJ.EQ.CASK)OBJ=OBJ+1 X PROP(IOBJ)=1 X CALL REMOVE(OBJ) X PLACE(OBJ)=0 X SPK=77 X IF(IOBJ.NE.CASK)GOTO 21330 X OBJ=OBJ-1 X SPK=104 X21330 IF(.NOT.(AT(PLANT).OR.AT(DOOR).OR.AT(SWORD)).OR. X 1 AT(SWORD).AND.PROP(SWORD).EQ.0)GOTO 2011 X X IF(AT(DOOR))GOTO 21340 X IF(AT(SWORD))GOTO 21350 X SPK=112 X IF(OBJ.NE.WATER)GOTO 2011 X CALL PSPEAK(PLANT,PROP(PLANT)+1) X PROP(PLANT)=MOD(PROP(PLANT)+2,6) X PROP(PLANT2)=PROP(PLANT)/2 X NEWLOC=LOC X GOTO 2 X X21340 PROP(DOOR)=0 X IF(OBJ.NE.OIL)GOTO 21341 X PROP(DOOR)=1 X CALL BITOFF(DOOR,LOCKBT) X CALL BITON(DOOR,OPENBT) X21341 SPK=113+PROP(DOOR) X GOTO 2011 X XC IF SWORD IS ALREADY OILY, DON'T LET HIM CLEAN IT. NO SOAP. X X21350 IF(PROP(SWORD).EQ.5)GOTO 21360 X PROP(SWORD)=4 X IF(OBJ.NE.OIL)GOTO 21360 X PROP(SWORD)=5 X FIXED(SWORD)=-1 X21360 SPK=206+PROP(SWORD)-4 X GOTO 2011 XC EAT. INTRANSITIVE: ASSUME EDIBLE IF PRESENT, ELSE ASK WHAT. TRANSITIVE: XC FOOD/MUSHROOMS/CAKES OK, SOME THINGS LOSE APPETITE, REST ARE RIDICULOUS. XC IF HE HAS MORE THAN ONE EDIBLE, OR NONE, 'EAT' IS AMBIGUOUS WITHOUT XC AN EXPLICIT OBJECT. X X11400 K=0 X DO 11410 I=1,MAXOBJ X IF(.NOT.(HERE(I).AND.EDIBLE(I))) GOTO 11410 X K=K+1 X KK=I X11410 CONTINUE X IF(K.NE.1)GOTO 10000 X OBJ=KK X IF(OBJ.NE.FOOD.AND.OBJ.NE.HONEY)GOTO 21400 X11420 IF(OBJ.EQ.HONEY)TALLY2=TALLY2+1 X CALL DSTROY(OBJ) X SPK=72 X GOTO 2011 X XC IF HE ATE THE RIGHT THING AND IS IN THE RIGHT PLACE, MOVE HIM TO XC THE OTHER PLACE WITH ALL HIS JUNK. OTHERWISE, NARKY MESSAGE. X21400 IF(OBJ.EQ.FOOD.OR.OBJ.EQ.HONEY)GOTO 11420 X IF(OBJ.EQ.BIRD.OR.OBJ.EQ.SNAKE.OR.OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER X 1 .OR.OBJ.EQ.FLOWER)SPK=301 X IF(OBJ.EQ.DWARF.OR.OBJ.EQ.DRAGON.OR.OBJ.EQ.TROLL X 1 .OR.OBJ.EQ.DOG.OR.OBJ.EQ.WUMPUS.OR.OBJ.EQ.BEAR X 2 .OR.OBJ.EQ.GNOME)SPK=250 X IF(OBJ.NE.MUSHRM.AND.OBJ.NE.CAKES)GOTO 2011 X X K=OBJ-MUSHRM X LL=229+K X K=159-K X KK=SKEY X IF(OBJ.EQ.MUSHRM)KK=TDOOR X IF(OBJ.EQ.MUSHRM.AND.LOC.NE.158)TALLY2=TALLY2+1 X CALL DSTROY(OBJ) X SPK=228 X IF(.NOT. (HERE(KK).OR.FIXED(KK).EQ.LOC) )GOTO 2011 X CALL RSPEAK(LL) XC IF HE HASN'T TAKEN TINY KEY OFF SHELF, DON'T LET HIM GET IT FOR FREE! X DO 21440 OBJ=1,MAXOBJ X IF(OBJ.EQ.SKEY.AND.PROP(SKEY).EQ.1)GOTO 21440 X IF(PLACE(OBJ).EQ.PLAC(KK).AND.FIXED(OBJ).EQ.0)CALL MOVE(OBJ,K) X21440 CONTINUE X IF(LOC.EQ.PLAC(SKEY).AND.PLACE(SKEY).EQ.PLAC(SKEY)) X 1 TALLY2=TALLY2+1 X LOC=K X NEWLOC=K X GOTO 2 XC DRINK. IF NO OBJECT, ASSUME WATER OR WINE AND LOOK FOR THEM HERE. XC IF POTABLE IS IN BOTTLE OR CASK, DRINK THAT. IF NOT, SEE IF THERE XC IS SOMETHING DRINKABLE NEARBY (STREAM, LAKE, WINE FOUNTAIN, ETC.), XC AND DRINK THAT. IF HE HAS STUFF IN BOTH CONTAINERS, ASK WHICH. X XC DRINK OBJ FROM IOBJ X11500 LL=LIQLOC(LOC) X IF(.NOT.ATHAND(BOTTLE).AND..NOT.ATHAND(CASK) X 1 .AND.LL.NE.WINE.AND.LL.NE.WATER)GOTO 10000 X K=LIQ(BOTTLE) X KK=LIQ(CASK) X IF(.NOT.ATHAND(BOTTLE).OR.K.EQ.0)GOTO 11520 X IF(ATHAND(CASK).AND.KK.NE.0.AND.KK.NE.K)GOTO 10000 X OBJ=K X IOBJ=BOTTLE X GOTO 21560 X X11520 IF(.NOT.ATHAND(CASK).OR.KK.EQ.0)GOTO 11540 END_OF_FILE if test 56404 -ne `wc -c <'aamain.f.xaa'`; then echo shar: \"'aamain.f.xaa'\" unpacked with wrong size! fi # end of 'aamain.f.xaa' fi if test -f 'combine.sh' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'combine.sh'\" else echo shar: Extracting \"'combine.sh'\" \(290 characters\) sed "s/^X//" >'combine.sh' <<'END_OF_FILE' X#! /bin/sh X# X# combine split source and data files into their original X# Xcat advdat.xaa advdat.xab advdat.xac > ADVDAT Xrm advdat.xaa advdat.xab advdat.xac Xcat aamain.f.xaa aamain.f.xab > aamain.f Xrm aamain.f.xaa aamain.f.xab Xcat asubs.f.xaa asubs.f.xab > asubs.f Xrm asubs.f.xaa asubs.f.xab END_OF_FILE if test 290 -ne `wc -c <'combine.sh'`; then echo shar: \"'combine.sh'\" unpacked with wrong size! fi chmod +x 'combine.sh' # end of 'combine.sh' fi if test -f 'makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'makefile'\" else echo shar: Extracting \"'makefile'\" \(181 characters\) sed "s/^X//" >'makefile' <<'END_OF_FILE' Xall: asetup adventure ADVTXT X Xasetup: asetup.o asubs.o X f77 -o asetup asetup.o asubs.o Xadventure: aamain.o asubs.o X f77 -o adventure aamain.o asubs.o XADVTXT: ADVDAT asetup X asetup X END_OF_FILE if test 181 -ne `wc -c <'makefile'`; then echo shar: \"'makefile'\" unpacked with wrong size! fi # end of 'makefile' fi echo shar: End of archive 2 \(of 7\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 4 5 6 7 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 7 archives. echo "now type 'sh combine.sh'" rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0