C GAME- MAIN COMMAND LOOP FOR DUNGEON C C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142 C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED C WRITTEN BY R. M. SUPNIK C C DECLARATIONS C SUBROUTINE GAME IMPLICIT INTEGER (A-Z) LOGICAL RMDESC,VAPPLI,RAPPLI,AAPPLI LOGICAL F,PARSE,FINDXT,XVEHIC,LIT LOGICAL*1 SECHO(4),GDTSTR(3) C C PARSER OUTPUT C LOGICAL PRSWON COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON C C GAME STATE C LOGICAL TELFLG COMMON /PLAY/ WINNER,HERE,TELFLG COMMON /STATE/ MOVES,DEATHS,RWSCOR,MXSCOR,MXLOAD, 1 LTSHFT,BLOC,MUNGRM,HS,EGSCOR,EGMXSC C C MISCELLANEOUS VARIABLES C LOGICAL*1 INLINE COMMON /INPUT/ INLNT,INLINE(78) COMMON /CHAN/ INPCH,OUTCH,DBCH C C ROOMS C COMMON /ROOMS/ RLNT,RDESC2,RDESC1(200),REXIT(200), 1 RACTIO(200),RVAL(200),RFLAG(200) INTEGER RRAND(200) EQUIVALENCE (RVAL,RRAND) C COMMON /RINDEX/ WHOUS,LROOM,CELLA COMMON /RINDEX/ MTROL,MAZE1 COMMON /RINDEX/ MGRAT,MAZ15 COMMON /RINDEX/ FORE1,FORE3,CLEAR,RESER COMMON /RINDEX/ STREA,EGYPT,ECHOR COMMON /RINDEX/ TSHAF COMMON /RINDEX/ BSHAF,MMACH,DOME,MTORC COMMON /RINDEX/ CAROU COMMON /RINDEX/ RIDDL,LLD2,TEMP1,TEMP2,MAINT COMMON /RINDEX/ BLROO,TREAS,RIVR1,RIVR2,RIVR3,MCYCL COMMON /RINDEX/ RIVR4,RIVR5,FCHMP,FALLS,MBARR COMMON /RINDEX/ MRAIN,POG,VLBOT,VAIR1,VAIR2,VAIR3,VAIR4 COMMON /RINDEX/ LEDG2,LEDG3,LEDG4,MSAFE,CAGER COMMON /RINDEX/ CAGED,TWELL,BWELL,ALICE,ALISM,ALITR COMMON /RINDEX/ MTREE,BKENT,BKVW,BKTWI,BKVAU,BKBOX COMMON /RINDEX/ CRYPT,TSTRS,MRANT,MREYE COMMON /RINDEX/ MRA,MRB,MRC,MRG,MRD,FDOOR COMMON /RINDEX/ MRAE,MRCE,MRCW,MRGE,MRGW,MRDW,INMIR COMMON /RINDEX/ SCORR,NCORR,PARAP,CELL,PCELL,NCELL COMMON /RINDEX/ CPANT,CPOUT,CPUZZ C C OBJECTS C COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220), 1 OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220), 2 OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220), 3 OADV(220),OCAN(220),OREAD(220) C COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT, 1 NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT, 2 TOOLBT,TURNBT,ONBT COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT, 1 WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT, 2 TCHBT,VEHBT,SCHBT C COMMON /OINDEX/ GARLI,FOOD,GUNK,COAL,MACHI,DIAMO,TCASE,BOTTL COMMON /OINDEX/ WATER,ROPE,KNIFE,SWORD,LAMP,BLAMP,RUG COMMON /OINDEX/ LEAVE,TROLL,AXE COMMON /OINDEX/ RKNIF,KEYS,ICE,BAR COMMON /OINDEX/ COFFI,TORCH,TBASK,FBASK,IRBOX COMMON /OINDEX/ GHOST,TRUNK,BELL,BOOK,CANDL COMMON /OINDEX/ MATCH,TUBE,PUTTY,WRENC,SCREW,CYCLO,CHALI COMMON /OINDEX/ THIEF,STILL,WINDO,GRATE,DOOR COMMON /OINDEX/ HPOLE,LEAK,RBUTT,RAILI COMMON /OINDEX/ POT,STATU,IBOAT,DBOAT,PUMP,RBOAT COMMON /OINDEX/ STICK,BUOY,SHOVE,BALLO,RECEP,GUANO COMMON /OINDEX/ BROPE,HOOK1,HOOK2,SAFE,SSLOT,BRICK,FUSE COMMON /OINDEX/ GNOME,BLABE,DBALL,TOMB COMMON /OINDEX/ LCASE,CAGE,RCAGE,SPHER,SQBUT COMMON /OINDEX/ FLASK,POOL,SAFFR,BUCKE,ECAKE,ORICE,RDICE,BLICE COMMON /OINDEX/ ROBOT,FTREE,BILLS,PORTR,SCOL,ZGNOM COMMON /OINDEX/ EGG,BEGG,BAUBL,CANAR,BCANA COMMON /OINDEX/ YLWAL,RDWAL,PINDR,RBEAM COMMON /OINDEX/ ODOOR,QDOOR,CDOOR,NUM1,NUM8 COMMON /OINDEX/ WARNI,CSLIT,GCARD,STLDR COMMON /OINDEX/ HANDS,WALL,LUNGS,SAILO,AVIAT,TEETH COMMON /OINDEX/ ITOBJ,EVERY,VALUA,OPLAY,WNORT,GWATE,MASTER C C ADVENTURERS C COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4), 1 AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4) C COMMON /AINDEX/ PLAYER,AROBOT,AMASTR C C VERBS C COMMON /VINDEX/ CINTW,DEADXW,FRSTQW,INXW,OUTXW COMMON /VINDEX/ WALKIW,FIGHTW,FOOW COMMON /VINDEX/ MELTW,READW,INFLAW,DEFLAW,ALARMW,EXORCW COMMON /VINDEX/ PLUGW,KICKW,WAVEW,RAISEW,LOWERW,RUBW COMMON /VINDEX/ PUSHW,UNTIEW,TIEW,TIEUPW,TURNW,BREATW COMMON /VINDEX/ KNOCKW,LOOKW,EXAMIW,SHAKEW,MOVEW,TRNONW,TRNOFW COMMON /VINDEX/ OPENW,CLOSEW,FINDW,WAITW,SPINW,BOARDW,UNBOAW,TAKEW COMMON /VINDEX/ INVENW,FILLW,EATW,DRINKW,BURNW COMMON /VINDEX/ MUNGW,KILLW,ATTACW,SWINGW COMMON /VINDEX/ WALKW,TELLW,PUTW,DROPW,GIVEW,POURW,THROWW COMMON /VINDEX/ DIGW,LEAPW,STAYW,FOLLOW COMMON /VINDEX/ HELLOW,LOOKIW,LOOKUW,PUMPW,WINDW COMMON /VINDEX/ CLMBW,CLMBUW,CLMBDW,TRNTOW C C FLAGS C LOGICAL*1 TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF LOGICAL*1 DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF LOGICAL*1 MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF LOGICAL*1 EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF LOGICAL*1 GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF LOGICAL*1 GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF LOGICAL*1 MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF LOGICAL*1 FOLLWF,SPELLF,CPOUTF,CPUSHF COMMON /FINDEX/ TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF, 1 DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF, 2 MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF, 3 EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF, 4 GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF, 5 GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF, 6 MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF, 7 FOLLWF,SPELLF,CPOUTF,CPUSHF COMMON /FINDEX/ BTIEF,BINFF COMMON /FINDEX/ RVMNT,RVCLR,RVCYC,RVSND,RVGUA COMMON /FINDEX/ ORRUG,ORCAND,ORMTCH,ORLAMP COMMON /FINDEX/ MDIR,MLOC,POLEUF COMMON /FINDEX/ QUESNO,NQATT,CORRCT COMMON /FINDEX/ LCELL,PNUMB,ACELL,DCELL,CPHERE C C FUNCTIONS AND DATA C DATA SECHO/'E','C','H','O'/ DATA GDTSTR/'G','D','T'/ C GAME, PAGE 2 C C START UP, DESCRIBE CURRENT LOCATION. C CALL RSPEAK(1) !WELCOME ABOARD. F=RMDESC(3) !START GAME. C C NOW LOOP, READING AND EXECUTING COMMANDS. C 100 WINNER=PLAYER !PLAYER MOVING. TELFLG=.FALSE. !ASSUME NOTHING TOLD. IF(PRSCON.LE.1) CALL RDLINE(INLINE,INLNT,1) !READ COMMAND. C DO 150 I=1,3 !CALL ON GDT? IF(INLINE(I+PRSCON-1).NE.GDTSTR(I)) GO TO 200 150 CONTINUE CALL GDT !YES, INVOKE. GO TO 100 !ONWARD. C 200 MOVES=MOVES+1 PRSWON=PARSE(INLINE,INLNT,.TRUE.) !PARSE INPUT, NORMAL MODE. IF(.NOT.PRSWON) GO TO 400 !PARSE LOSES? IF(XVEHIC(1)) GO TO 400 !VEHICLE HANDLE? C IF(PRSA.EQ.TELLW) GO TO 2000 !TELL? 300 IF((PRSO.EQ.VALUA).OR.(PRSO.EQ.EVERY)) GO TO 900 IF(.NOT.VAPPLI(PRSA)) GO TO 400 !VERB OK? 350 IF(.NOT.ECHOF.AND.(HERE.EQ.ECHOR)) GO TO 1000 F=RAPPLI(RACTIO(HERE)) C 400 CALL XENDMV(TELFLG) !DO END OF MOVE. IF(.NOT.LIT(HERE)) PRSCON=1 GO TO 100 C 900 CALL VALUAC(VALUA) GO TO 350 C GAME, PAGE 3 C C SPECIAL CASE-- ECHO ROOM. C IF INPUT IS NOT 'ECHO' OR A DIRECTION, JUST ECHO. C 1000 CALL RDLINE(INLINE,INLNT,0) !READ LINE. MOVES=MOVES+1 !CHARGE FOR MOVES. DO 1100 I=1,4 !INPUT = ECHO? IF(INLINE(I).NE.SECHO(I)) GO TO 1300 1100 CONTINUE C DO 1200 I=5,78 !REST BLANK? IF(INLINE(I).NE.' ') GO TO 1300 1200 CONTINUE C CALL RSPEAK(571) !KILL THE ECHO. ECHOF=.TRUE. OFLAG2(BAR)=OFLAG2(BAR).AND. .NOT.SCRDBT !LET THIEF STEAL BAR. PRSWON=.TRUE. !FAKE OUT PARSER. PRSCON=1 !FORCE NEW INPUT. GO TO 400 C 1300 PRSWON=PARSE(INLINE,INLNT,.FALSE.) !PARSE INPUT, ECHO MODE. IF(.NOT.PRSWON .OR. (PRSA.NE.WALKW)) 1 GO TO 1400 !WALK? IF(FINDXT(PRSO,HERE)) GO TO 300 !VALID EXIT? C 1400 WRITE(OUTCH,1410) (INLINE(J),J=1,INLNT) !ECHO INPUT. 1410 FORMAT(1X,78A1) TELFLG=.TRUE. !INDICATE OUTPUT. GO TO 1000 !MORE ECHO ROOM. C GAME, PAGE 4 C C SPECIAL CASE-- TELL , NEW COMMAND C NOTE THAT WE CANNOT BE IN THE ECHO ROOM. C 2000 IF((OFLAG2(PRSO).AND.ACTRBT).NE.0) GO TO 2100 !ACTOR? CALL RSPEAK(602) !CANT DO IT. GO TO 350 !VAPPLI SUCCEEDS. C 2100 WINNER=OACTOR(PRSO) !NEW PLAYER. HERE=AROOM(WINNER) !NEW LOCATION. IF(PRSCON.LE.1) GO TO 2700 !ANY INPUT? IF(PARSE(INLINE,INLNT,.TRUE.)) GO TO 2150 !PARSE COMMAND. 2700 I=341 !FAILS. IF(TELFLG) I=604 !GIVE RESPONSE. CALL RSPEAK(I) 2600 WINNER=PLAYER !RESTORE STATE. HERE=AROOM(WINNER) GO TO 350 C 2150 IF(AAPPLI(AACTIO(WINNER))) GO TO 2400 !ACTOR HANDLE? IF(XVEHIC(1)) GO TO 2400 !VEHICLE HANDLE? IF((PRSO.EQ.VALUA).OR.(PRSO.EQ.EVERY)) GO TO 2900 IF(.NOT.VAPPLI(PRSA)) GO TO 2400 !VERB HANDLE? 2350 F=RAPPLI(RACTIO(HERE)) C 2400 CALL XENDMV(TELFLG) !DO END OF MOVE. GO TO 2600 !DONE. C 2900 CALL VALUAC(VALUA) !ALL OR VALUABLES. GO TO 350 C END C XENDMV- EXECUTE END OF MOVE FUNCTIONS. C C DECLARATIONS C SUBROUTINE XENDMV(FLAG) IMPLICIT INTEGER(A-Z) LOGICAL F,CLOCKD,FLAG,XVEHIC C C PARSER OUTPUT C LOGICAL PRSWON COMMON /PRSVEC/ PRSA,PRSO,PRSI,PRSWON,PRSCON C C VILLAINS AND DEMONS C LOGICAL THFFLG,SWDACT,THFACT COMMON /HACK/ THFPOS,THFFLG,THFACT,SWDACT,SWDSTA C IF(.NOT.FLAG) CALL RSPEAK(341) !DEFAULT REMARK. IF(THFACT) CALL THIEFD !THIEF DEMON. IF(PRSWON) CALL FIGHTD !FIGHT DEMON. IF(SWDACT) CALL SWORDD !SWORD DEMON. IF(PRSWON) F=CLOCKD(X) !CLOCK DEMON. IF(PRSWON) F=XVEHIC(2) !VEHICLE READOUT. RETURN END C XVEHIC- EXECUTE VEHICLE FUNCTION C C DECLARATIONS C LOGICAL FUNCTION XVEHIC(N) IMPLICIT INTEGER(A-Z) LOGICAL OAPPLI C C GAME STATE C LOGICAL TELFLG COMMON /PLAY/ WINNER,HERE,TELFLG C C OBJECTS C COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220), 1 OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220), 2 OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220), 3 OADV(220),OCAN(220),OREAD(220) C C ADVENTURERS C COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4), 1 AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4) C XVEHIC=.FALSE. !ASSUME LOSES. AV=AVEHIC(WINNER) !GET VEHICLE. IF(AV.NE.0) XVEHIC=OAPPLI(OACTIO(AV),N) RETURN END