C GETOBJ-- FIND OBJ DESCRIBED BY ADJ, NAME PAIR 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 C THIS ROUTINE DETAILS ON BIT 3 OF PRSFLG C INTEGER FUNCTION GETOBJ(OIDX,AIDX,SPCOBJ) IMPLICIT INTEGER(A-Z) LOGICAL THISIT,GHERE,LIT,CHOMP,DFLAG C COMMON /OBJFLG/ VABIT,VRBIT,VTBIT,VCBIT,VEBIT,VFBIT,VPMASK C C GAME STATE C LOGICAL TELFLG COMMON /PLAY/ WINNER,HERE,TELFLG C C MISCELLANEOUS VARIABLES C COMMON /STAR/ MBASE,STRBIT COMMON /DEBUG/ DBGFLG,PRSFLG 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 VOCABULARIES C COMMON /OBJVOC/ OVOC(1050) C GETOBJ, PAGE 2 C D DFLAG=(PRSFLG.AND."10).NE.0 CHOMP=.FALSE. AV=AVEHIC(WINNER) OBJ=0 !ASSUME DARK. IF(.NOT.LIT(HERE)) GO TO 200 !LIT? C OBJ=SCHLST(OIDX,AIDX,HERE,0,0,SPCOBJ) !SEARCH ROOM. D IF(DFLAG) TYPE 10,OBJ D10 FORMAT(' SCHLST- ROOM SCH ',I6) IF(OBJ) 1000,200,100 !TEST RESULT. 100 IF((AV.EQ.0).OR.(AV.EQ.OBJ).OR. 1 ((OFLAG2(OBJ).AND.FINDBT).NE.0)) GO TO 200 IF(OCAN(OBJ).EQ.AV) GO TO 200 !TEST IF REACHABLE. CHOMP=.TRUE. !PROBABLY NOT. C 200 IF(AV.EQ.0) GO TO 400 !IN VEHICLE? NOBJ=SCHLST(OIDX,AIDX,0,AV,0,SPCOBJ) !SEARCH VEHICLE. D IF(DFLAG) TYPE 20,NOBJ D20 FORMAT(' SCHLST- VEH SCH ',I6) IF(NOBJ) 1100,400,300 !TEST RESULT. 300 CHOMP=.FALSE. !REACHABLE. IF(OBJ.EQ.NOBJ) GO TO 400 !SAME AS BEFORE? IF(OBJ.NE.0) NOBJ=-NOBJ !AMB RESULT? OBJ=NOBJ C 400 NOBJ=SCHLST(OIDX,AIDX,0,0,WINNER,SPCOBJ) !SEARCH ADVENTURER. D IF(DFLAG) TYPE 30,NOBJ D30 FORMAT(' SCHLST- ADV SCH ',I6) IF(NOBJ) 1100,600,500 !TEST RESULT 500 IF(OBJ.NE.0) NOBJ=-NOBJ !AMB RESULT? 1100 OBJ=NOBJ !RETURN NEW OBJECT. 600 IF(CHOMP) OBJ=-10000 !UNREACHABLE. 1000 GETOBJ=OBJ C IF(GETOBJ.NE.0) GO TO 1500 !GOT SOMETHING? DO 1200 I=STRBIT+1,OLNT !NO, SEARCH GLOBALS. IF(.NOT.THISIT(OIDX,AIDX,I,SPCOBJ)) GO TO 1200 IF(.NOT.GHERE(I,HERE)) GO TO 1200 !CAN IT BE HERE? IF(GETOBJ.NE.0) GETOBJ=-I !AMB MATCH? IF(GETOBJ.EQ.0) GETOBJ=I 1200 CONTINUE C 1500 CONTINUE !END OF SEARCH. D IF(DFLAG) TYPE 40,GETOBJ D40 FORMAT(' SCHLST- RESULT ',I6) RETURN END C SCHLST-- SEARCH FOR OBJECT C C DECLARATIONS C INTEGER FUNCTION SCHLST(OIDX,AIDX,RM,CN,AD,SPCOBJ) IMPLICIT INTEGER(A-Z) LOGICAL THISIT,QHERE,NOTRAN,NOVIS 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 FUNCTIONS AND DATA C NOTRAN(O)=((OFLAG1(O).AND.TRANBT).EQ.0).AND. 1 ((OFLAG2(O).AND.OPENBT).EQ.0) NOVIS(O)=((OFLAG1(O).AND.VISIBT).EQ.0) C SCHLST=0 !NO RESULT. DO 1000 I=1,OLNT !SEARCH OBJECTS. IF(NOVIS(I).OR. 1 (((RM.EQ.0).OR.(.NOT.QHERE(I,RM))).AND. 2 ((CN.EQ.0).OR.(OCAN(I).NE.CN)).AND. 3 ((AD.EQ.0).OR.(OADV(I).NE.AD)))) GO TO 1000 IF(.NOT.THISIT(OIDX,AIDX,I,SPCOBJ)) GO TO 200 IF(SCHLST.NE.0) GO TO 2000 !GOT ONE ALREADY? SCHLST=I !NO. C C IF OPEN OR TRANSPARENT, SEARCH THE OBJECT ITSELF. C 200 IF(NOTRAN(I)) GO TO 1000 C C SEARCH IS CONDUCTED IN REVERSE. ALL OBJECTS ARE CHECKED TO C SEE IF THEY ARE AT SOME LEVEL OF CONTAINMENT INSIDE OBJECT 'I'. C IF THEY ARE AT LEVEL 1, OR IF ALL LINKS IN THE CONTAINMENT C CHAIN ARE OPEN, VISIBLE, AND HAVE SEARCHME SET, THEY CAN QUALIFY C AS A POTENTIAL MATCH. C DO 500 J=1,OLNT !SEARCH OBJECTS. IF(NOVIS(J).OR. (.NOT.THISIT(OIDX,AIDX,J,SPCOBJ))) 1 GO TO 500 !VISIBLE & MATCH? X=OCAN(J) !GET CONTAINER. 300 IF(X.EQ.I) GO TO 400 !INSIDE TARGET? IF(X.EQ.0) GO TO 500 !INSIDE ANYTHING? IF(NOVIS(X).OR.NOTRAN(X).OR. 1 ((OFLAG2(X).AND.SCHBT).EQ.0)) GO TO 500 X=OCAN(X) !GO ANOTHER LEVEL. GO TO 300 C 400 IF(SCHLST.NE.0) GO TO 2000 !ALREADY GOT ONE? SCHLST=J !NO. 500 CONTINUE C 1000 CONTINUE RETURN C 2000 SCHLST=-SCHLST !AMB RETURN. RETURN C END C THISIT-- VALIDATE OBJECT VS DESCRIPTION C C DECLARATIONS C LOGICAL FUNCTION THISIT(OIDX,AIDX,OBJ,SPCOBJ) IMPLICIT INTEGER(A-Z) LOGICAL NOTEST C C VOCABULARIES C COMMON /OBJVOC/ OVOC(1050) COMMON /ADJVOC/ AVOC(450) C C FUNCTIONS AND DATA C NOTEST(O)=(O.LE.0).OR.(O.GE.R50MIN) DATA R50MIN/1RA/ C THISIT=.FALSE. !ASSUME NO MATCH. IF((SPCOBJ.NE.0).AND.(OBJ.EQ.SPCOBJ)) GO TO 500 C C CHECK FOR OBJECT NAMES C I=OIDX+1 100 I=I+1 IF(NOTEST(OVOC(I))) RETURN !IF DONE, LOSE. IF(OVOC(I).NE.OBJ) GO TO 100 !IF FAIL, CONT. C IF(AIDX.EQ.0) GO TO 500 !ANY ADJ? I=AIDX+1 200 I=I+1 IF(NOTEST(AVOC(I))) RETURN !IF DONE, LOSE. IF(AVOC(I).NE.OBJ) GO TO 200 !IF FAIL, CONT. C 500 THISIT=.TRUE. RETURN END