xref: /original-bsd/contrib/dungeon/dso3.F (revision abd50c55)
1C FINDXT- FIND EXIT FROM ROOM
2C
3C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
4C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
5C WRITTEN BY R. M. SUPNIK
6C
7C DECLARATIONS
8C
9	LOGICAL FUNCTION FINDXT(DIR,RM)
10	IMPLICIT INTEGER (A-Z)
11#include "rooms.h"
12#include "exits.h"
13#include "curxt.h"
14#include "xpars.h"
15C
16	FINDXT=.TRUE.
17C						!ASSUME WINS.
18	XI=REXIT(RM)
19C						!FIND FIRST ENTRY.
20	IF(XI.EQ.0) GO TO 1000
21C						!NO EXITS?
22C
23100	I=TRAVEL(XI)
24C						!GET ENTRY.
25	XROOM1=and(I,XRMASK)
26c mask to 16-bits to get rid of sign extension problems with 32-bit ints
27	XXXFLG = and(not(XLFLAG), 65535)
28	XTYPE=and((and(I,XXXFLG)/XFSHFT),XFMASK)+1
29	GO TO (110,120,130,130),XTYPE
30C						!BRANCH ON ENTRY.
31	CALL BUG(10,XTYPE)
32C
33130	XOBJ=and(TRAVEL(XI+2),XRMASK)
34	XACTIO=TRAVEL(XI+2)/XASHFT
35120	XSTRNG=TRAVEL(XI+1)
36C						!DOOR/CEXIT/NEXIT - STRING.
37110	XI=XI+XELNT(XTYPE)
38C						!ADVANCE TO NEXT ENTRY.
39	IF(and(I,XDMASK).EQ.DIR) RETURN
40	IF(and(I,XLFLAG).EQ.0) GO TO 100
411000	FINDXT=.FALSE.
42C						!YES, LOSE.
43	RETURN
44	END
45C FWIM- FIND WHAT I MEAN
46C
47C DECLARATIONS
48C
49	INTEGER FUNCTION FWIM(F1,F2,RM,CON,ADV,NOCARE)
50	IMPLICIT INTEGER (A-Z)
51	LOGICAL NOCARE
52#include "objects.h"
53#include "oflags.h"
54C
55	FWIM=0
56C						!ASSUME NOTHING.
57	DO 1000 I=1,OLNT
58C						!LOOP
59	  IF(((RM.EQ.0).OR.(OROOM(I).NE.RM)) .AND.
60&		((ADV.EQ.0).OR.(OADV(I).NE.ADV)) .AND.
61&		((CON.EQ.0).OR.(OCAN(I).NE.CON)))
62&		GO TO 1000
63C
64C OBJECT IS ON LIST... IS IT A MATCH?
65C
66	  IF(and(OFLAG1(I),VISIBT).EQ.0) GO TO 1000
67	  IF(and(not(NOCARE),(and(OFLAG1(I),TAKEBT).EQ.0)) .OR.
68&		((and(OFLAG1(I),F1).EQ.0).AND.
69&		 (and(OFLAG2(I),F2).EQ.0))) GO TO 500
70	  IF(FWIM.EQ.0) GO TO 400
71C						!ALREADY GOT SOMETHING?
72	  FWIM=-FWIM
73C						!YES, AMBIGUOUS.
74	  RETURN
75C
76400	  FWIM=I
77C						!NOTE MATCH.
78C
79C DOES OBJECT CONTAIN A MATCH?
80C
81500	  IF(and(OFLAG2(I),OPENBT).EQ.0) GO TO 1000
82	  DO 700 J=1,OLNT
83C						!NO, SEARCH CONTENTS.
84	    IF((OCAN(J).NE.I).OR.(and(OFLAG1(J),VISIBT).EQ.0) .OR.
85&		((and(OFLAG1(J),F1).EQ.0).AND.
86&		 (and(OFLAG2(J),F2).EQ.0))) GO TO 700
87	    IF(FWIM.EQ.0) GO TO 600
88	    FWIM=-FWIM
89	    RETURN
90C
91600	    FWIM=J
92700	  CONTINUE
931000	CONTINUE
94	RETURN
95	END
96C YESNO- OBTAIN YES/NO ANSWER
97C
98C CALLED BY-
99C
100C	YES-IS-TRUE=YESNO(QUESTION,YES-STRING,NO-STRING)
101C
102	LOGICAL FUNCTION YESNO(Q,Y,N)
103	IMPLICIT INTEGER(A-Z)
104	COMMON /CHAN/ INPCH,OUTCH,DBCH
105	CHARACTER ANS
106C
107100	CALL RSPEAK(Q)
108C						!ASK
109#ifdef PDP
110	call rdchr(ANS)
111#else
112	READ(INPCH,110) ANS
113#endif PDP
114C						!GET ANSWER
115110	FORMAT(A1)
116	IF((ANS.EQ.'Y').OR.(ANS.EQ.'y')) GO TO 200
117	IF((ANS.EQ.'N').OR.(ANS.EQ.'n')) GO TO 300
118	CALL RSPEAK(6)
119C						!SCOLD.
120	GO TO 100
121C
122200	YESNO=.TRUE.
123C						!YES,
124	CALL RSPEAK(Y)
125C						!OUT WITH IT.
126	RETURN
127C
128300	YESNO=.FALSE.
129C						!NO,
130	CALL RSPEAK(N)
131C						!LIKEWISE.
132	RETURN
133C
134	END
135