|
|
1.1 ! root 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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.