|
|
1.1 ! root 1: C SYNMCH-- SYNTAX MATCHER ! 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 4 OF PRSFLG ! 10: C ! 11: LOGICAL FUNCTION SYNMCH() ! 12: IMPLICIT INTEGER(A-Z) ! 13: LOGICAL SYNEQL,TAKEIT ! 14: #include "parser.h" ! 15: #include "vocab.h" ! 16: #include "debug.h" ! 17: C ! 18: C THE FOLLOWING DATA STATEMENT WAS ORIGINALLY: ! 19: C ! 20: C DATA R50MIN/1RA/ ! 21: C ! 22: DATA R50MIN/1600/ ! 23: C ! 24: SYNMCH=.FALSE. ! 25: #ifdef debug ! 26: DFLAG=and(PRSFLG, 16).NE.0 ! 27: if(dflag) write(0,*) "synflags=",sdir,sind,sstd,sflip,sdriv,svmask ! 28: #endif ! 29: J=ACT ! 30: C !SET UP PTR TO SYNTAX. ! 31: DRIVE=0 ! 32: C !NO DEFAULT. ! 33: DFORCE=0 ! 34: C !NO FORCED DEFAULT. ! 35: QPREP=and(OFLAG,OPREP) ! 36: 100 J=J+2 ! 37: C !FIND START OF SYNTAX. ! 38: IF((VVOC(J).LE.0).OR.(VVOC(J).GE.R50MIN)) GO TO 100 ! 39: LIMIT=J+VVOC(J)+1 ! 40: C !COMPUTE LIMIT. ! 41: J=J+1 ! 42: C !ADVANCE TO NEXT. ! 43: C ! 44: 200 CALL UNPACK(J,NEWJ) ! 45: C !UNPACK SYNTAX. ! 46: #ifdef debug ! 47: IF(DFLAG) PRINT 60,O1,P1,DOBJ,DFL1,DFL2 ! 48: #ifdef NOCC ! 49: 60 FORMAT('SYNMCH INPUTS TO SYNEQL- ',5I7) ! 50: #else NOCC ! 51: 60 FORMAT(' SYNMCH INPUTS TO SYNEQL- ',5I7) ! 52: #endif NOCC ! 53: #endif ! 54: SPREP=and(DOBJ,VPMASK) ! 55: IF(.NOT.SYNEQL(P1,O1,DOBJ,DFL1,DFL2)) GO TO 1000 ! 56: #ifdef debug ! 57: IF(DFLAG) PRINT 60,O2,P2,IOBJ,IFL1,IFL2 ! 58: #endif ! 59: SPREP=and(IOBJ,VPMASK) ! 60: IF(SYNEQL(P2,O2,IOBJ,IFL1,IFL2)) GO TO 6000 ! 61: C ! 62: C SYNTAX MATCH FAILS, TRY NEXT ONE. ! 63: C ! 64: IF(O2) 3000,500,3000 ! 65: C !IF O2=0, SET DFLT. ! 66: 1000 IF(O1) 3000,500,3000 ! 67: C !IF O1=0, SET DFLT. ! 68: 500 IF((QPREP.EQ.0).OR.(QPREP.EQ.SPREP)) DFORCE=J ! 69: C !IF PREP MCH. ! 70: IF((and(VFLAG,SDRIV)).NE.0) DRIVE=J ! 71: 3000 J=NEWJ ! 72: IF(J.LT.LIMIT) GO TO 200 ! 73: C !MORE TO DO? ! 74: C SYNMCH, PAGE 2 ! 75: C ! 76: C MATCH HAS FAILED. IF DEFAULT SYNTAX EXISTS, TRY TO SNARF ! 77: C ORPHANS OR GWIMS, OR MAKE NEW ORPHANS. ! 78: C ! 79: #ifdef debug ! 80: IF(DFLAG) PRINT 20,DRIVE,DFORCE ! 81: #ifdef NOCC ! 82: 20 FORMAT('SYNMCH, DRIVE=',2I6) ! 83: #else NOCC ! 84: 20 FORMAT(' SYNMCH, DRIVE=',2I6) ! 85: #endif NOCC ! 86: #endif ! 87: IF(DRIVE.EQ.0) DRIVE=DFORCE ! 88: C !NO DRIVER? USE FORCE. ! 89: IF(DRIVE.EQ.0) GO TO 10000 ! 90: C !ANY DRIVER? ! 91: CALL UNPACK(DRIVE,DFORCE) ! 92: C !UNPACK DFLT SYNTAX. ! 93: C ! 94: C TRY TO FILL DIRECT OBJECT SLOT IF THAT WAS THE PROBLEM. ! 95: C ! 96: IF((and(VFLAG,SDIR).EQ.0).OR.(O1.NE.0)) GO TO 4000 ! 97: C ! 98: C FIRST TRY TO SNARF ORPHAN OBJECT. ! 99: C ! 100: O1=and(OFLAG,OSLOT) ! 101: IF(O1.EQ.0) GO TO 3500 ! 102: C !ANY ORPHAN? ! 103: IF(SYNEQL(P1,O1,DOBJ,DFL1,DFL2)) GO TO 4000 ! 104: C ! 105: C ORPHAN FAILS, TRY GWIM. ! 106: C ! 107: 3500 O1=GWIM(DOBJ,DFW1,DFW2) ! 108: C !GET GWIM. ! 109: #ifdef debug ! 110: IF(DFLAG) PRINT 30,O1 ! 111: #ifdef NOCC ! 112: 30 FORMAT('SYNMCH- DO GWIM= ',I6) ! 113: #else NOCC ! 114: 30 FORMAT(' SYNMCH- DO GWIM= ',I6) ! 115: #endif NOCC ! 116: #endif debug ! 117: IF(O1.GT.0) GO TO 4000 ! 118: C !TEST RESULT. ! 119: CALL ORPHAN(-1,ACT,0,and(DOBJ,VPMASK),0) ! 120: CALL RSPEAK(623) ! 121: RETURN ! 122: C ! 123: C TRY TO FILL INDIRECT OBJECT SLOT IF THAT WAS THE PROBLEM. ! 124: C ! 125: 4000 IF((and(VFLAG,SIND).EQ.0).OR.(O2.NE.0)) GO TO 6000 ! 126: O2=GWIM(IOBJ,IFW1,IFW2) ! 127: C !GWIM. ! 128: #ifdef debug ! 129: IF(DFLAG) PRINT 40,O2 ! 130: #ifdef NOCC ! 131: 40 FORMAT('SYNMCH- IO GWIM= ',I6) ! 132: #else NOCC ! 133: 40 FORMAT(' SYNMCH- IO GWIM= ',I6) ! 134: #endif NOCC ! 135: #endif debug ! 136: IF(O2.GT.0) GO TO 6000 ! 137: IF(O1.EQ.0) O1=and(OFLAG,OSLOT) ! 138: CALL ORPHAN(-1,ACT,O1,and(DOBJ,VPMASK),0) ! 139: CALL RSPEAK(624) ! 140: RETURN ! 141: C ! 142: C TOTAL CHOMP ! 143: C ! 144: 10000 CALL RSPEAK(601) ! 145: C !CANT DO ANYTHING. ! 146: RETURN ! 147: C SYNMCH, PAGE 3 ! 148: C ! 149: C NOW TRY TO TAKE INDIVIDUAL OBJECTS AND ! 150: C IN GENERAL CLEAN UP THE PARSE VECTOR. ! 151: C ! 152: 6000 IF(and(VFLAG,SFLIP).EQ.0) GO TO 5000 ! 153: J=O1 ! 154: C !YES. ! 155: O1=O2 ! 156: O2=J ! 157: C ! 158: 5000 PRSA=and(VFLAG,SVMASK) ! 159: PRSO=O1 ! 160: C !GET DIR OBJ. ! 161: PRSI=O2 ! 162: C !GET IND OBJ. ! 163: IF(.NOT.TAKEIT(PRSO,DOBJ)) RETURN ! 164: C !TRY TAKE. ! 165: IF(.NOT.TAKEIT(PRSI,IOBJ)) RETURN ! 166: C !TRY TAKE. ! 167: SYNMCH=.TRUE. ! 168: #ifdef debug ! 169: IF(DFLAG) PRINT 50,SYNMCH,PRSA,PRSO,PRSI,ACT,O1,O2 ! 170: #ifdef NOCC ! 171: 50 FORMAT('SYNMCH- RESULTS ',L1,6I7) ! 172: #else NOCC ! 173: 50 FORMAT(' SYNMCH- RESULTS ',L1,6I7) ! 174: #endif NOCC ! 175: #endif ! 176: RETURN ! 177: C ! 178: END ! 179: C UNPACK- UNPACK SYNTAX SPECIFICATION, ADV POINTER ! 180: C ! 181: C DECLARATIONS ! 182: C ! 183: SUBROUTINE UNPACK(OLDJ,J) ! 184: IMPLICIT INTEGER(A-Z) ! 185: #include "vocab.h" ! 186: #include "parser.h" ! 187: C ! 188: DO 10 I=1,11 ! 189: C !CLEAR SYNTAX. ! 190: SYN(I)=0 ! 191: 10 CONTINUE ! 192: C ! 193: VFLAG=VVOC(OLDJ) ! 194: J=OLDJ+1 ! 195: IF(and(VFLAG,SDIR).EQ.0) RETURN ! 196: DFL1=-1 ! 197: C !ASSUME STD. ! 198: DFL2=-1 ! 199: IF(and(VFLAG,SSTD).EQ.0) GO TO 100 ! 200: DFW1=-1 ! 201: C !YES. ! 202: DFW2=-1 ! 203: DOBJ=VABIT+VRBIT+VFBIT ! 204: GO TO 200 ! 205: C ! 206: 100 DOBJ=VVOC(J) ! 207: C !NOT STD. ! 208: DFW1=VVOC(J+1) ! 209: DFW2=VVOC(J+2) ! 210: J=J+3 ! 211: IF(and(DOBJ,VEBIT).EQ.0) GO TO 200 ! 212: DFL1=DFW1 ! 213: C !YES. ! 214: DFL2=DFW2 ! 215: C ! 216: 200 IF(and(VFLAG,SIND).EQ.0) RETURN ! 217: IFL1=-1 ! 218: C !ASSUME STD. ! 219: IFL2=-1 ! 220: IOBJ=VVOC(J) ! 221: IFW1=VVOC(J+1) ! 222: IFW2=VVOC(J+2) ! 223: J=J+3 ! 224: IF(and(IOBJ,VEBIT).EQ.0) RETURN ! 225: IFL1=IFW1 ! 226: C !YES. ! 227: IFL2=IFW2 ! 228: RETURN ! 229: C ! 230: END ! 231: C SYNEQL- TEST FOR SYNTAX EQUALITY ! 232: C ! 233: C DECLARATIONS ! 234: C ! 235: LOGICAL FUNCTION SYNEQL(PREP,OBJ,SPREP,SFL1,SFL2) ! 236: IMPLICIT INTEGER(A-Z) ! 237: #include "objects.h" ! 238: #include "parser.h" ! 239: C ! 240: IF(OBJ.EQ.0) GO TO 100 ! 241: C !ANY OBJECT? ! 242: SYNEQL=(PREP.EQ.and(SPREP,VPMASK)).AND. ! 243: & (or(and(SFL1,OFLAG1(OBJ)), ! 244: & and(SFL2,OFLAG2(OBJ))).NE.0) ! 245: RETURN ! 246: C ! 247: 100 SYNEQL=(PREP.EQ.0).AND.(SFL1.EQ.0).AND.(SFL2.EQ.0) ! 248: RETURN ! 249: C ! 250: END ! 251: C TAKEIT- PARSER BASED TAKE OF OBJECT ! 252: C ! 253: C DECLARATIONS ! 254: C ! 255: LOGICAL FUNCTION TAKEIT(OBJ,SFLAG) ! 256: IMPLICIT INTEGER(A-Z) ! 257: #include "parser.h" ! 258: COMMON /STAR/ MBASE,STRBIT ! 259: #include "gamestate.h" ! 260: #include "state.h" ! 261: #include "objects.h" ! 262: #include "oflags.h" ! 263: #include "advers.h" ! 264: C TAKEIT, PAGE 2 ! 265: C ! 266: TAKEIT=.FALSE. ! 267: C !ASSUME LOSES. ! 268: IF((OBJ.EQ.0).OR.(OBJ.GT.STRBIT)) GO TO 4000 ! 269: C !NULL/STARS WIN. ! 270: ODO2=ODESC2(OBJ) ! 271: C !GET DESC. ! 272: X=OCAN(OBJ) ! 273: C !GET CONTAINER. ! 274: IF((X.EQ.0).OR.(and(SFLAG,VFBIT).EQ.0)) GO TO 500 ! 275: IF(and(OFLAG2(X),OPENBT).NE.0) GO TO 500 ! 276: CALL RSPSUB(566,ODO2) ! 277: C !CANT REACH. ! 278: RETURN ! 279: C ! 280: 500 IF(and(SFLAG,VRBIT).EQ.0) GO TO 1000 ! 281: IF(and(SFLAG,VTBIT).EQ.0) GO TO 2000 ! 282: C ! 283: C SHOULD BE IN ROOM (VRBIT NE 0) AND CAN BE TAKEN (VTBIT NE 0) ! 284: C ! 285: IF(SCHLST(0,0,HERE,0,0,OBJ).LE.0) GO TO 4000 ! 286: C !IF NOT, OK. ! 287: C ! 288: C ITS IN THE ROOM AND CAN BE TAKEN. ! 289: C ! 290: IF((and(OFLAG1(OBJ),TAKEBT).NE.0).AND. ! 291: & (and(OFLAG2(OBJ),TRYBT).EQ.0)) GO TO 3000 ! 292: C ! 293: C NOT TAKEABLE. IF WE CARE, FAIL. ! 294: C ! 295: IF(and(SFLAG,VCBIT).EQ.0) GO TO 4000 ! 296: CALL RSPSUB(445,ODO2) ! 297: RETURN ! 298: C ! 299: C 1000-- IT SHOULD NOT BE IN THE ROOM. ! 300: C 2000-- IT CANT BE TAKEN. ! 301: C ! 302: 2000 IF(and(SFLAG,VCBIT).EQ.0) GO TO 4000 ! 303: 1000 IF(SCHLST(0,0,HERE,0,0,OBJ).LE.0) GO TO 4000 ! 304: CALL RSPSUB(665,ODO2) ! 305: RETURN ! 306: C TAKEIT, PAGE 3 ! 307: C ! 308: C OBJECT IS IN THE ROOM, CAN BE TAKEN BY THE PARSER, ! 309: C AND IS TAKEABLE IN GENERAL. IT IS NOT A STAR. ! 310: C TAKING IT SHOULD NOT HAVE SIDE AFFECTS. ! 311: C IF IT IS INSIDE SOMETHING, THE CONTAINER IS OPEN. ! 312: C THE FOLLOWING CODE IS LIFTED FROM SUBROUTINE TAKE. ! 313: C ! 314: 3000 IF(OBJ.NE.AVEHIC(WINNER)) GO TO 3500 ! 315: C !TAKE VEHICLE? ! 316: CALL RSPEAK(672) ! 317: RETURN ! 318: C ! 319: 3500 IF(((X.NE.0).AND.(OADV(X).EQ.WINNER)).OR. ! 320: & ((WEIGHT(0,OBJ,WINNER)+OSIZE(OBJ)).LE.MXLOAD)) ! 321: & GO TO 3700 ! 322: CALL RSPEAK(558) ! 323: C !TOO BIG. ! 324: RETURN ! 325: C ! 326: 3700 CALL NEWSTA(OBJ,559,0,0,WINNER) ! 327: C !DO TAKE. ! 328: OFLAG2(OBJ)=or(OFLAG2(OBJ),TCHBT) ! 329: CALL SCRUPD(OFVAL(OBJ)) ! 330: OFVAL(OBJ)=0 ! 331: C ! 332: 4000 TAKEIT=.TRUE. ! 333: C !SUCCESS. ! 334: RETURN ! 335: C ! 336: END ! 337: C ! 338: C GWIM- GET WHAT I MEAN IN AMBIGOUS SITUATIONS ! 339: C ! 340: C DECLARATIONS ! 341: C ! 342: INTEGER FUNCTION GWIM(SFLAG,SFW1,SFW2) ! 343: IMPLICIT INTEGER(A-Z) ! 344: LOGICAL TAKEIT,NOCARE ! 345: #include "parser.h" ! 346: COMMON /STAR/ MBASE,STRBIT ! 347: #include "gamestate.h" ! 348: #include "objects.h" ! 349: #include "oflags.h" ! 350: #include "advers.h" ! 351: C GWIM, PAGE 2 ! 352: C ! 353: GWIM=-1 ! 354: C !ASSUME LOSE. ! 355: AV=AVEHIC(WINNER) ! 356: NOBJ=0 ! 357: NOCARE=and(SFLAG,VCBIT).EQ.0 ! 358: C ! 359: C FIRST SEARCH ADVENTURER ! 360: C ! 361: IF(and(SFLAG,VABIT).NE.0) ! 362: & NOBJ=FWIM(SFW1,SFW2,0,0,WINNER,NOCARE) ! 363: IF(and(SFLAG,VRBIT).NE.0) GO TO 100 ! 364: 50 GWIM=NOBJ ! 365: RETURN ! 366: C ! 367: C ALSO SEARCH ROOM ! 368: C ! 369: 100 ROBJ=FWIM(SFW1,SFW2,HERE,0,0,NOCARE) ! 370: IF(ROBJ) 500,50,200 ! 371: C !TEST RESULT. ! 372: C ! 373: C ROBJ > 0 ! 374: C ! 375: 200 IF((AV.EQ.0).OR.(ROBJ.EQ.AV).OR. ! 376: & (and(OFLAG2(ROBJ),FINDBT).NE.0)) GO TO 300 ! 377: IF(OCAN(ROBJ).NE.AV) GO TO 50 ! 378: C !UNREACHABLE? TRY NOBJ ! 379: 300 IF(NOBJ.NE.0) RETURN ! 380: C !IF AMBIGUOUS, RETURN. ! 381: IF(.NOT.TAKEIT(ROBJ,SFLAG)) RETURN ! 382: C !IF UNTAKEABLE, RETURN ! 383: GWIM=ROBJ ! 384: 500 RETURN ! 385: C ! 386: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.