Annotation of 43BSDReno/games/dungeon/np3.F, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.