1: C GETOBJ-- FIND OBJ DESCRIBED BY ADJ, NAME PAIR 2: C 3: C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142 4: C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED 5: C WRITTEN BY R. M. SUPNIK 6: C 7: C DECLARATIONS 8: C 9: C THIS ROUTINE DETAILS ON BIT 3 OF PRSFLG 10: C 11: INTEGER FUNCTION GETOBJ(OIDX,AIDX,SPCOBJ) 12: IMPLICIT INTEGER(A-Z) 13: LOGICAL THISIT,GHERE,LIT,CHOMP 14: #include "parser.h" 15: #include "gamestate.h" 16: C 17: C MISCELLANEOUS VARIABLES 18: C 19: COMMON /STAR/ MBASE,STRBIT 20: #include "debug.h" 21: #include "objects.h" 22: #include "oflags.h" 23: #include "advers.h" 24: #include "vocab.h" 25: C GETOBJ, PAGE 2 26: C 27: #ifdef debug 28: DFLAG=and(PRSFLG, 8).NE.0 29: #endif debug 30: CHOMP=.FALSE. 31: AV=AVEHIC(WINNER) 32: OBJ=0 33: C !ASSUME DARK. 34: IF(.NOT.LIT(HERE)) GO TO 200 35: C !LIT? 36: C 37: OBJ=SCHLST(OIDX,AIDX,HERE,0,0,SPCOBJ) 38: C !SEARCH ROOM. 39: #ifdef debug 40: IF(DFLAG) PRINT 10,OBJ 41: #ifdef NOCC 42: 10 FORMAT('SCHLST- ROOM SCH ',I6) 43: #else NOCC 44: 10 FORMAT(' SCHLST- ROOM SCH ',I6) 45: #endif NOCC 46: #endif debug 47: IF(OBJ) 1000,200,100 48: C !TEST RESULT. 49: 100 IF((AV.EQ.0).OR.(AV.EQ.OBJ).OR. 50: & (and(OFLAG2(OBJ),FINDBT).NE.0)) GO TO 200 51: IF(OCAN(OBJ).EQ.AV) GO TO 200 52: C !TEST IF REACHABLE. 53: CHOMP=.TRUE. 54: C !PROBABLY NOT. 55: C 56: 200 IF(AV.EQ.0) GO TO 400 57: C !IN VEHICLE? 58: NOBJ=SCHLST(OIDX,AIDX,0,AV,0,SPCOBJ) 59: C !SEARCH VEHICLE. 60: #ifdef debug 61: IF(DFLAG) PRINT 20,NOBJ 62: #ifdef NOCC 63: 20 FORMAT('SCHLST- VEH SCH ',I6) 64: #else NOCC 65: 20 FORMAT(' SCHLST- VEH SCH ',I6) 66: #endif NOCC 67: #endif debug 68: IF(NOBJ) 1100,400,300 69: C !TEST RESULT. 70: 300 CHOMP=.FALSE. 71: C !REACHABLE. 72: IF(OBJ.EQ.NOBJ) GO TO 400 73: C !SAME AS BEFORE? 74: IF(OBJ.NE.0) NOBJ=-NOBJ 75: C !AMB RESULT? 76: OBJ=NOBJ 77: C 78: 400 NOBJ=SCHLST(OIDX,AIDX,0,0,WINNER,SPCOBJ) 79: C !SEARCH ADVENTURER. 80: #ifdef debug 81: IF(DFLAG) PRINT 30,NOBJ 82: #ifdef NOCC 83: 30 FORMAT('SCHLST- ADV SCH ',I6) 84: #else NOCC 85: 30 FORMAT(' SCHLST- ADV SCH ',I6) 86: #endif NOCC 87: #endif debug 88: IF(NOBJ) 1100,600,500 89: C !TEST RESULT 90: 500 IF(OBJ.NE.0) NOBJ=-NOBJ 91: C !AMB RESULT? 92: 1100 OBJ=NOBJ 93: C !RETURN NEW OBJECT. 94: 600 IF(CHOMP) OBJ=-10000 95: C !UNREACHABLE. 96: 1000 GETOBJ=OBJ 97: C 98: IF(GETOBJ.NE.0) GO TO 1500 99: C !GOT SOMETHING? 100: DO 1200 I=STRBIT+1,OLNT 101: C !NO, SEARCH GLOBALS. 102: IF(.NOT.THISIT(OIDX,AIDX,I,SPCOBJ)) GO TO 1200 103: IF(.NOT.GHERE(I,HERE)) GO TO 1200 104: C !CAN IT BE HERE? 105: IF(GETOBJ.NE.0) GETOBJ=-I 106: C !AMB MATCH? 107: IF(GETOBJ.EQ.0) GETOBJ=I 108: 1200 CONTINUE 109: C 110: 1500 CONTINUE 111: C !END OF SEARCH. 112: #ifdef debug 113: IF(DFLAG) PRINT 40,GETOBJ 114: #ifdef NOCC 115: 40 FORMAT('SCHLST- RESULT ',I6) 116: #else NOCC 117: 40 FORMAT(' SCHLST- RESULT ',I6) 118: #endif NOCC 119: #endif debug 120: RETURN 121: END 122: C SCHLST-- SEARCH FOR OBJECT 123: C 124: C DECLARATIONS 125: C 126: INTEGER FUNCTION SCHLST(OIDX,AIDX,RM,CN,AD,SPCOBJ) 127: IMPLICIT INTEGER(A-Z) 128: LOGICAL THISIT,QHERE,NOTRAN,NOVIS 129: C 130: COMMON /STAR/ MBASE,STRBIT 131: #include "objects.h" 132: #include "oflags.h" 133: C 134: C FUNCTIONS AND DATA 135: C 136: NOTRAN(O)=(and(OFLAG1(O),TRANBT).EQ.0).AND. 137: & (and(OFLAG2(O),OPENBT).EQ.0) 138: NOVIS(O)=(and(OFLAG1(O),VISIBT).EQ.0) 139: C 140: SCHLST=0 141: C !NO RESULT. 142: DO 1000 I=1,OLNT 143: C !SEARCH OBJECTS. 144: IF(NOVIS(I).OR. 145: & (((RM.EQ.0).OR.(.NOT.QHERE(I,RM))).AND. 146: & ((CN.EQ.0).OR.(OCAN(I).NE.CN)).AND. 147: & ((AD.EQ.0).OR.(OADV(I).NE.AD)))) GO TO 1000 148: IF(.NOT.THISIT(OIDX,AIDX,I,SPCOBJ)) GO TO 200 149: IF(SCHLST.NE.0) GO TO 2000 150: C !GOT ONE ALREADY? 151: SCHLST=I 152: C !NO. 153: C 154: C IF OPEN OR TRANSPARENT, SEARCH THE OBJECT ITSELF. 155: C 156: 200 IF(NOTRAN(I)) GO TO 1000 157: C 158: C SEARCH IS CONDUCTED IN REVERSE. ALL OBJECTS ARE CHECKED TO 159: C SEE IF THEY ARE AT SOME LEVEL OF CONTAINMENT INSIDE OBJECT 'I'. 160: C IF THEY ARE AT LEVEL 1, OR IF ALL LINKS IN THE CONTAINMENT 161: C CHAIN ARE OPEN, VISIBLE, AND HAVE SEARCHME SET, THEY CAN QUALIFY 162: C AS A POTENTIAL MATCH. 163: C 164: DO 500 J=1,OLNT 165: C !SEARCH OBJECTS. 166: IF(NOVIS(J).OR. (.NOT.THISIT(OIDX,AIDX,J,SPCOBJ))) 167: & GO TO 500 168: X=OCAN(J) 169: C !GET CONTAINER. 170: 300 IF(X.EQ.I) GO TO 400 171: C !INSIDE TARGET? 172: IF(X.EQ.0) GO TO 500 173: C !INSIDE ANYTHING? 174: IF(NOVIS(X).OR.NOTRAN(X).OR. 175: & (and(OFLAG2(X),SCHBT).EQ.0)) GO TO 500 176: X=OCAN(X) 177: C !GO ANOTHER LEVEL. 178: GO TO 300 179: C 180: 400 IF(SCHLST.NE.0) GO TO 2000 181: C !ALREADY GOT ONE? 182: SCHLST=J 183: C !NO. 184: 500 CONTINUE 185: C 186: 1000 CONTINUE 187: RETURN 188: C 189: 2000 SCHLST=-SCHLST 190: C !AMB RETURN. 191: RETURN 192: C 193: END 194: C 195: C THISIT-- VALIDATE OBJECT VS DESCRIPTION 196: C 197: C DECLARATIONS 198: C 199: LOGICAL FUNCTION THISIT(OIDX,AIDX,OBJ,SPCOBJ) 200: IMPLICIT INTEGER(A-Z) 201: LOGICAL NOTEST 202: #include "vocab.h" 203: C 204: C FUNCTIONS AND DATA 205: C 206: NOTEST(O)=(O.LE.0).OR.(O.GE.R50MIN) 207: C 208: C THE FOLLOWING DATA STATEMENT USED RADIX-50 NOTATION (R50MIN/1RA/) 209: C IN RADIX-50 NOTATION, AN "A" IN THE FIRST POSITION IS 210: C ENCODED AS 1*40*40 = 1600. 211: C 212: DATA R50MIN/1600/ 213: C 214: THISIT=.FALSE. 215: C !ASSUME NO MATCH. 216: IF((SPCOBJ.NE.0).AND.(OBJ.EQ.SPCOBJ)) GO TO 500 217: C 218: C CHECK FOR OBJECT NAMES 219: C 220: I=OIDX+1 221: 100 I=I+1 222: IF(NOTEST(OVOC(I))) RETURN 223: C !IF DONE, LOSE. 224: IF(OVOC(I).NE.OBJ) GO TO 100 225: C !IF FAIL, CONT. 226: C 227: IF(AIDX.EQ.0) GO TO 500 228: C !ANY ADJ? 229: I=AIDX+1 230: 200 I=I+1 231: IF(NOTEST(AVOC(I))) RETURN 232: C !IF DONE, LOSE. 233: IF(AVOC(I).NE.OBJ) GO TO 200 234: C !IF FAIL, CONT. 235: C 236: 500 THISIT=.TRUE. 237: RETURN 238: END