C FINDXT- FIND EXIT FROM ROOM
C
C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
C WRITTEN BY R. M. SUPNIK
C
C DECLARATIONS
C
       LOGICAL FUNCTION FINDXT(DIR,RM)
       IMPLICIT INTEGER (A-Z)
C
C ROOMS
C
       COMMON /ROOMS/ RLNT,RDESC2,RDESC1(200),REXIT(200),
       1       RACTIO(200),RVAL(200),RFLAG(200)
       INTEGER RRAND(200)
       EQUIVALENCE (RVAL,RRAND)
C
C EXITS
C
       COMMON /EXITS/ XLNT,TRAVEL(900)
C
       COMMON /CURXT/ XTYPE,XROOM1,XSTRNG,XACTIO,XOBJ
       EQUIVALENCE (XFLAG,XOBJ)
C
       COMMON /XPARS/ XRMASK,XDMASK,XFMASK,XFSHFT,XASHFT,
       1       XELNT(4),XNORM,XNO,XCOND,XDOOR,XLFLAG
C
       FINDXT=.TRUE.                           !ASSUME WINS.
       XI=REXIT(RM)                            !FIND FIRST ENTRY.
       IF(XI.EQ.0) GO TO 1000                  !NO EXITS?
C
100     I=TRAVEL(XI)                            !GET ENTRY.
       XROOM1=I.AND.XRMASK                     !ISOLATE ROOM.
       XTYPE=(((I.AND..NOT.XLFLAG)/XFSHFT).AND.XFMASK)+1
       GO TO (110,120,130,130),XTYPE           !BRANCH ON ENTRY.
       CALL BUG(10,XTYPE)
C
130     XOBJ=TRAVEL(XI+2).AND.XRMASK            !DOOR/CEXIT- GET OBJ/FLAG.
       XACTIO=TRAVEL(XI+2)/XASHFT
120     XSTRNG=TRAVEL(XI+1)                     !DOOR/CEXIT/NEXIT - STRING.
110     XI=XI+XELNT(XTYPE)                      !ADVANCE TO NEXT ENTRY.
       IF((I.AND.XDMASK).EQ.DIR) RETURN        !MATCH?
       IF((I.AND.XLFLAG).EQ.0) GO TO 100       !LAST ENTRY?
1000    FINDXT=.FALSE.                          !YES, LOSE.
       RETURN
       END
C FWIM- FIND WHAT I MEAN
C
C DECLARATIONS
C
       INTEGER FUNCTION FWIM(F1,F2,RM,CON,ADV,NOCARE)
       IMPLICIT INTEGER (A-Z)
       LOGICAL NOCARE
C
C OBJECTS
C
       COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220),
       1       OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220),
       2       OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220),
       3       OADV(220),OCAN(220),OREAD(220)
C
       COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
       1       NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
       2       TOOLBT,TURNBT,ONBT
       COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
       1       WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
       2       TCHBT,VEHBT,SCHBT
C
       FWIM=0                                  !ASSUME NOTHING.
       DO 1000 I=1,OLNT                        !LOOP
         IF(((RM.EQ.0).OR.(OROOM(I).NE.RM)) .AND.
       1       ((ADV.EQ.0).OR.(OADV(I).NE.ADV)) .AND.
       2       ((CON.EQ.0).OR.(OCAN(I).NE.CON)))
       3       GO TO 1000
C
C OBJECT IS ON LIST... IS IT A MATCH?
C
         IF((OFLAG1(I).AND.VISIBT).EQ.0) GO TO 1000
         IF((.NOT.NOCARE .AND.((OFLAG1(I).AND.TAKEBT).EQ.0)) .OR.
       1       (((OFLAG1(I).AND.F1).EQ.0).AND.
       2        ((OFLAG2(I).AND.F2).EQ.0))) GO TO 500
         IF(FWIM.EQ.0) GO TO 400                       !ALREADY GOT SOMETHING?
         FWIM=-FWIM                            !YES, AMBIGUOUS.
         RETURN
C
400       FWIM=I                                        !NOTE MATCH.
C
C DOES OBJECT CONTAIN A MATCH?
C
500       IF((OFLAG2(I).AND.OPENBT).EQ.0) GO TO 1000 !CLOSED?
         DO 700 J=1,OLNT                               !NO, SEARCH CONTENTS.
           IF((OCAN(J).NE.I).OR.((OFLAG1(J).AND.VISIBT).EQ.0) .OR.
       1       (((OFLAG1(J).AND.F1).EQ.0).AND.
       2        ((OFLAG2(J).AND.F2).EQ.0))) GO TO 700
           IF(FWIM.EQ.0) GO TO 600
           FWIM=-FWIM
           RETURN
C
600         FWIM=J
700       CONTINUE
1000    CONTINUE
       RETURN
       END
C YESNO- OBTAIN YES/NO ANSWER
C
C CALLED BY-
C
C       YES-IS-TRUE=YESNO(QUESTION,YES-STRING,NO-STRING)
C
       LOGICAL FUNCTION YESNO(Q,Y,N)
       IMPLICIT INTEGER(A-Z)
       COMMON /CHAN/ INPCH,OUTCH,DBCH
C
100     CALL RSPEAK(Q)                          !ASK
       READ(INPCH,110) ANS                     !GET ANSWER
110     FORMAT(A1)
       IF((ANS.EQ.'Y').OR.(ANS.EQ.'y')) GO TO 200
       IF((ANS.EQ.'N').OR.(ANS.EQ.'n')) GO TO 300
       CALL RSPEAK(6)                          !SCOLD.
       GO TO 100
C
200     YESNO=.TRUE.                            !YES,
       CALL RSPEAK(Y)                          !OUT WITH IT.
       RETURN
C
300     YESNO=.FALSE.                           !NO,
       CALL RSPEAK(N)                          !LIKEWISE.
       RETURN
C
       END