home *** CD-ROM | disk | FTP | other *** search
- C TAKE-- BASIC TAKE SEQUENCE
- 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 TAKE AN OBJECT (FOR VERBS TAKE, PUT, DROP, READ, ETC.)
- C
- LOGICAL FUNCTION TAKE(FLG)
- C
- C DECLARATIONS
- C
- IMPLICIT INTEGER (A-Z)
- LOGICAL FLG,OBJACT,OAPPLI,QOPEN,QHERE
- 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
- COMMON /STAR/ MBASE,STRBIT
- 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
- 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 FUNCTIONS AND DATA
- C
- QOPEN(O)=(OFLAG2(O).AND.OPENBT).NE.0
- C TAKE, PAGE 2
- C
- TAKE=.FALSE. !ASSUME LOSES.
- OA=OACTIO(PRSO) !GET OBJECT ACTION.
- IF(PRSO.LE.STRBIT) GO TO 100 !STAR?
- TAKE=OBJACT(X) !YES, LET IT HANDLE.
- RETURN
- C
- 100 X=OCAN(PRSO) !INSIDE?
- IF(PRSO.NE.AVEHIC(WINNER)) GO TO 400 !HIS VEHICLE?
- CALL RSPEAK(672) !DUMMY.
- RETURN
- C
- 400 IF((OFLAG1(PRSO).AND.TAKEBT).NE.0) GO TO 500 !TAKEABLE?
- IF(.NOT.OAPPLI(OA,0)) CALL RSPEAK(552+RND(5))
- RETURN
- C
- C OBJECT IS TAKEABLE AND IN POSITION TO BE TAKEN.
- C
- 500 IF((X.NE.0).OR. QHERE(PRSO,HERE)) GO TO 600
- IF(OADV(PRSO).EQ.WINNER) CALL RSPEAK(557) !ALREADY GOT IT?
- RETURN
- C
- 600 IF(((X.NE.0).AND.(OADV(X).EQ.WINNER)).OR.
- 1 ((WEIGHT(0,PRSO,WINNER)+OSIZE(PRSO)).LE.MXLOAD))
- 2 GO TO 700
- CALL RSPEAK(558) !TOO MUCH WEIGHT.
- RETURN
- C
- 700 TAKE=.TRUE. !AT LAST.
- IF(OAPPLI(OA,0)) RETURN !DID IT HANDLE?
- CALL NEWSTA(PRSO,0,0,0,WINNER) !TAKE OBJECT FOR WINNER.
- OFLAG2(PRSO)=OFLAG2(PRSO).OR.TCHBT !HAS BEEN TOUCHED.
- CALL SCRUPD(OFVAL(PRSO)) !UPDATE SCORE.
- OFVAL(PRSO)=0 !CANT BE SCORED AGAIN.
- IF(FLG) CALL RSPEAK(559) !TELL TAKEN.
- RETURN
- C
- END
- C DROP- DROP VERB PROCESSOR
- C
- C DECLARATIONS
- C
- LOGICAL FUNCTION DROP(Z)
- IMPLICIT INTEGER (A-Z)
- LOGICAL F,PUT,OBJACT
- 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
- C
- C ROOMS
- 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
- C
- C ADVENTURERS
- C
- COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
- 1 AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
- 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 DROP, PAGE 2
- C
- DROP=.TRUE. !ASSUME WINS.
- X=OCAN(PRSO) !GET CONTAINER.
- IF(X.EQ.0) GO TO 200 !IS IT INSIDE?
- IF(OADV(X).NE.WINNER) GO TO 1000 !IS HE CARRYING CON?
- IF((OFLAG2(X).AND.OPENBT).NE.0) GO TO 300 !IS IT OPEN?
- CALL RSPSUB(525,ODESC2(X)) !CANT REACH.
- RETURN
- C
- 200 IF(OADV(PRSO).NE.WINNER) GO TO 1000 !IS HE CARRYING OBJ?
- 300 IF(AVEHIC(WINNER).EQ.0) GO TO 400 !IS HE IN VEHICLE?
- PRSI=AVEHIC(WINNER) !YES,
- F=PUT(.TRUE.) !DROP INTO VEHICLE.
- PRSI=0 !DISARM PARSER.
- RETURN !DONE.
- C
- 400 CALL NEWSTA(PRSO,0,HERE,0,0) !DROP INTO ROOM.
- IF(HERE.EQ.MTREE) CALL NEWSTA(PRSO,0,FORE3,0,0)
- CALL SCRUPD(OFVAL(PRSO)) !SCORE OBJECT.
- OFVAL(PRSO)=0 !CANT BE SCORED AGAIN.
- OFLAG2(PRSO)=OFLAG2(PRSO).OR.TCHBT !HAS BEEN TOUCHED.
- C
- IF(OBJACT(X)) RETURN !DID IT HANDLE?
- I=0 !ASSUME NOTHING TO SAY.
- IF(PRSA.EQ.DROPW) I=528
- IF(PRSA.EQ.THROWW) I=529
- IF((I.NE.0).AND.(HERE.EQ.MTREE)) I=659
- CALL RSPSUB(I,ODESC2(PRSO))
- RETURN
- C
- 1000 CALL RSPEAK(527) !DONT HAVE IT.
- RETURN
- C
- END
- C PUT- PUT VERB PROCESSOR
- C
- C DECLARATIONS
- C
- LOGICAL FUNCTION PUT(FLG)
- IMPLICIT INTEGER (A-Z)
- LOGICAL QOPEN,QHERE,OBJACT,FLG
- 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
- C
- C MISCELLANEOUS VARIABLES
- C
- COMMON /STAR/ MBASE,STRBIT
- 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
- C ADVENTURERS
- C
- COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
- 1 AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
- 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 FUNCTIONS AND DATA
- C
- QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
- C PUT, PAGE 2
- C
- PUT=.FALSE.
- IF((PRSO.LE.STRBIT).AND.(PRSI.LE.STRBIT)) GO TO 200
- IF(.NOT.OBJACT(X)) CALL RSPEAK(560) !STAR
- PUT=.TRUE.
- RETURN
- C
- 200 IF(QOPEN(PRSI).OR.((OFLAG1(PRSI).AND.(DOORBT+CONTBT)).NE.0)
- 1 .OR.((OFLAG2(PRSI).AND.VEHBT).NE.0)) GO TO 300
- CALL RSPEAK(561) !CANT PUT IN THAT.
- RETURN
- C
- 300 IF(QOPEN(PRSI)) GO TO 400 !IS IT OPEN?
- CALL RSPEAK(562) !NO, JOKE
- RETURN
- C
- 400 IF(PRSO.NE.PRSI) GO TO 500 !INTO ITSELF?
- CALL RSPEAK(563) !YES, JOKE.
- RETURN
- C
- 500 IF(OCAN(PRSO).NE.PRSI) GO TO 600 !ALREADY INSIDE.
- CALL RSPSB2(564,ODESC2(PRSO),ODESC2(PRSI))
- PUT=.TRUE.
- RETURN
- C
- 600 IF((WEIGHT(0,PRSO,0)+WEIGHT(0,PRSI,0)+OSIZE(PRSO))
- 1 .LE.OCAPAC(PRSI)) GO TO 700 !NOT TOO FULL?
- CALL RSPEAK(565) !THEN CANT DO IT.
- RETURN
- C
- C NOW SEE IF OBJECT (OR ITS CONTAINER) IS IN ROOM
- C
- 700 J=PRSO !START SEARCH.
- 725 IF(QHERE(J,HERE)) GO TO 750 !IS IT HERE?
- J=OCAN(J)
- IF(J.NE.0) GO TO 725 !MORE TO DO?
- GO TO 800 !NO, SCH FAILS.
- C
- 750 SVO=PRSO !SAVE PARSER.
- SVI=PRSI
- PRSA=TAKEW
- PRSI=0
- IF(.NOT.TAKE(.FALSE.)) RETURN !TAKE OBJECT.
- PRSA=PUTW
- PRSO=SVO
- PRSI=SVI
- GO TO 1000
- C
- C NOW SEE IF OBJECT IS ON PERSON.
- C
- 800 IF(OCAN(PRSO).EQ.0) GO TO 1000 !INSIDE?
- IF(QOPEN(OCAN(PRSO))) GO TO 900 !OPEN?
- CALL RSPSUB(566,ODESC2(PRSO)) !LOSE.
- RETURN
- C
- 900 CALL SCRUPD(OFVAL(PRSO)) !SCORE OBJECT.
- OFVAL(PRSO)=0
- OFLAG2(PRSO)=OFLAG2(PRSO).OR.TCHBT !HAS BEEN TOUCHED.
- CALL NEWSTA(PRSO,0,0,0,WINNER) !TEMPORARILY ON WINNER.
- C
- 1000 IF(OBJACT(X)) RETURN !NO, GIVE OBJECT A SHOT.
- CALL NEWSTA(PRSO,2,0,PRSI,0) !CONTAINED INSIDE.
- PUT=.TRUE.
- RETURN
- C
- END
- C VALUAC- HANDLES VALUABLES/EVERYTHING
- C
- C DECLARATIONS
- C
- SUBROUTINE VALUAC(V)
- IMPLICIT INTEGER (A-Z)
- LOGICAL LIT,F,F1,TAKE,PUT,DROP,NOTVAL,QHERE
- 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
- 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
- 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 FUNCTIONS AND DATA
- C
- NOTVAL(R)=(SAVEP.EQ.V).AND.(OTVAL(R).LE.0)
- C VALUAC, PAGE 2
- C
- F=.TRUE. !ASSUME NO ACTIONS.
- I=579 !ASSUME NOT LIT.
- IF(.NOT.LIT(HERE)) GO TO 4000 !IF NOT LIT, PUNT.
- I=677 !ASSUME WRONG VERB.
- SAVEP=PRSO !SAVE PRSO.
- SAVEH=HERE !SAVE HERE.
- C
- 100 IF(PRSA.NE.TAKEW) GO TO 1000 !TAKE EVERY/VALUA?
- DO 500 PRSO=1,OLNT !LOOP THRU OBJECTS.
- IF(.NOT.QHERE(PRSO,HERE).OR.
- 1 ((OFLAG1(PRSO).AND.VISIBT).EQ.0).OR.
- 2 ((OFLAG2(PRSO).AND.ACTRBT).NE.0).OR.
- 3 NOTVAL(PRSO)) GO TO 500
- IF(((OFLAG1(PRSO).AND.TAKEBT).EQ.0).AND.
- 1 ((OFLAG2(PRSO).AND.TRYBT).EQ.0)) GO TO 500
- F=.FALSE.
- CALL RSPSUB(580,ODESC2(PRSO))
- F1=TAKE(.TRUE.)
- IF(SAVEH.NE.HERE) RETURN
- 500 CONTINUE
- GO TO 3000
- C
- 1000 IF(PRSA.NE.DROPW) GO TO 2000 !DROP EVERY/VALUA?
- DO 1500 PRSO=1,OLNT
- IF((OADV(PRSO).NE.WINNER).OR.NOTVAL(PRSO))
- 1 GO TO 1500
- F=.FALSE.
- CALL RSPSUB(580,ODESC2(PRSO))
- F1=DROP(.TRUE.)
- IF(SAVEH.NE.HERE) RETURN
- 1500 CONTINUE
- GO TO 3000
- C
- 2000 IF(PRSA.NE.PUTW) GO TO 3000 !PUT EVERY/VALUA?
- DO 2500 PRSO=1,OLNT !LOOP THRU OBJECTS.
- IF((OADV(PRSO).NE.WINNER)
- 1 .OR.(PRSO.EQ.PRSI).OR.NOTVAL(PRSO).OR.
- 2 ((OFLAG1(PRSO).AND.VISIBT).EQ.0)) GO TO 2500
- F=.FALSE.
- CALL RSPSUB(580,ODESC2(PRSO))
- F1=PUT(.TRUE.)
- IF(SAVEH.NE.HERE) RETURN
- 2500 CONTINUE
- C
- 3000 I=581
- IF(SAVEP.EQ.V) I=582 !CHOOSE MESSAGE.
- 4000 IF(F) CALL RSPEAK(I) !IF NOTHING, REPORT.
- RETURN
- END
-