Annotation of 43BSDReno/games/dungeon/np2.F, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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