Commit | Line | Data |
---|---|---|
8b22683c KB |
1 | C AAPPLI- APPLICABLES FOR ADVENTURERS |
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 | LOGICAL FUNCTION AAPPLI(RI) | |
10 | IMPLICIT INTEGER (A-Z) | |
11 | LOGICAL F,MOVETO | |
12 | #include "parser.h" | |
13 | #include "gamestate.h" | |
14 | #include "rooms.h" | |
15 | #include "rflag.h" | |
16 | #include "rindex.h" | |
17 | #include "xsrch.h" | |
18 | #include "objects.h" | |
19 | #include "oflags.h" | |
20 | #include "oindex.h" | |
21 | #include "clock.h" | |
22 | #include "advers.h" | |
23 | #include "verbs.h" | |
24 | #include "flags.h" | |
25 | C AAPPLI, PAGE 2 | |
26 | C | |
27 | IF(RI.EQ.0) GO TO 10 | |
28 | C !IF ZERO, NO APP. | |
29 | AAPPLI=.TRUE. | |
30 | C !ASSUME WINS. | |
31 | GO TO (1000,2000),RI | |
32 | C !BRANCH ON ADV. | |
33 | CALL BUG(11,RI) | |
34 | C | |
35 | C COMMON FALSE RETURN. | |
36 | C | |
37 | 10 AAPPLI=.FALSE. | |
38 | RETURN | |
39 | C | |
40 | C A1-- ROBOT. PROCESS MOST COMMANDS GIVEN TO ROBOT. | |
41 | C | |
42 | 1000 IF((PRSA.NE.RAISEW).OR.(PRSO.NE.RCAGE)) GO TO 1200 | |
43 | CFLAG(CEVSPH)=.FALSE. | |
44 | C !ROBOT RAISED CAGE. | |
45 | WINNER=PLAYER | |
46 | C !RESET FOR PLAYER. | |
47 | F=MOVETO(CAGER,WINNER) | |
48 | C !MOVE TO NEW ROOM. | |
49 | CALL NEWSTA(CAGE,567,CAGER,0,0) | |
50 | C !INSTALL CAGE IN ROOM. | |
51 | CALL NEWSTA(ROBOT,0,CAGER,0,0) | |
52 | C !INSTALL ROBOT IN ROOM. | |
53 | AROOM(AROBOT)=CAGER | |
54 | C !ALSO MOVE ROBOT/ADV. | |
55 | CAGESF=.TRUE. | |
56 | C !CAGE SOLVED. | |
57 | OFLAG1(ROBOT)=and(OFLAG1(ROBOT),not(NDSCBT)) | |
58 | OFLAG1(SPHER)=or(OFLAG1(SPHER),TAKEBT) | |
59 | RETURN | |
60 | C | |
61 | 1200 IF((PRSA.NE.DRINKW).AND.(PRSA.NE.EATW)) GO TO 1300 | |
62 | CALL RSPEAK(568) | |
63 | C !EAT OR DRINK, JOKE. | |
64 | RETURN | |
65 | C | |
66 | 1300 IF(PRSA.NE.READW) GO TO 1400 | |
67 | C !READ, | |
68 | CALL RSPEAK(569) | |
69 | C !JOKE. | |
70 | RETURN | |
71 | C | |
72 | 1400 IF((PRSA.EQ.WALKW).OR.(PRSA.EQ.TAKEW).OR.(PRSA.EQ.DROPW) | |
73 | & .OR.(PRSA.EQ.PUTW).OR.(PRSA.EQ.PUSHW).OR.(PRSA.EQ.THROWW) | |
74 | & .OR.(PRSA.EQ.TURNW).OR.(PRSA.EQ.LEAPW)) GO TO 10 | |
75 | CALL RSPEAK(570) | |
76 | C !JOKE. | |
77 | RETURN | |
78 | C AAPPLI, PAGE 3 | |
79 | C | |
80 | C A2-- MASTER. PROCESS MOST COMMANDS GIVEN TO MASTER. | |
81 | C | |
82 | 2000 IF(and(OFLAG2(QDOOR),OPENBT).NE.0) GO TO 2100 | |
83 | CALL RSPEAK(783) | |
84 | C !NO MASTER YET. | |
85 | RETURN | |
86 | C | |
87 | 2100 IF(PRSA.NE.WALKW) GO TO 2200 | |
88 | C !WALK? | |
89 | I=784 | |
90 | C !ASSUME WONT. | |
91 | IF(((HERE.EQ.SCORR).AND. | |
92 | & ((PRSO.EQ.XNORTH).OR.(PRSO.EQ.XENTER))).OR. | |
93 | & ((HERE.EQ.NCORR).AND. | |
94 | & ((PRSO.EQ.XSOUTH).OR.(PRSO.EQ.XENTER)))) | |
95 | & I=785 | |
96 | CALL RSPEAK(I) | |
97 | RETURN | |
98 | C | |
99 | 2200 IF((PRSA.EQ.TAKEW).OR.(PRSA.EQ.DROPW).OR.(PRSA.EQ.PUTW).OR. | |
100 | & (PRSA.EQ.THROWW).OR.(PRSA.EQ.PUSHW).OR.(PRSA.EQ.TURNW).OR. | |
101 | & (PRSA.EQ.SPINW).OR.(PRSA.EQ.TRNTOW).OR.(PRSA.EQ.FOLLOW).OR. | |
102 | & (PRSA.EQ.STAYW).OR.(PRSA.EQ.OPENW).OR.(PRSA.EQ.CLOSEW).OR. | |
103 | & (PRSA.EQ.KILLW)) GO TO 10 | |
104 | CALL RSPEAK(786) | |
105 | C !MASTER CANT DO IT. | |
106 | RETURN | |
107 | C | |
108 | END | |
109 | C THIEFD- INTERMOVE THIEF DEMON | |
110 | C | |
111 | C DECLARATIONS | |
112 | C | |
113 | SUBROUTINE THIEFD | |
114 | IMPLICIT INTEGER (A-Z) | |
115 | LOGICAL ONCE,PROB,QHERE,QSTILL,LIT,WINNIN | |
116 | #include "gamestate.h" | |
117 | C | |
118 | #include "debug.h" | |
119 | #include "rooms.h" | |
120 | #include "rflag.h" | |
121 | #include "rindex.h" | |
122 | #include "objects.h" | |
123 | #include "oflags.h" | |
124 | #include "oindex.h" | |
125 | #include "villians.h" | |
126 | #include "flags.h" | |
127 | C | |
128 | C FUNCTIONS AND DATA | |
129 | C | |
130 | QSTILL(R)=(QHERE(STILL,R).OR.(OADV(STILL).EQ.-THIEF)) | |
131 | C THIEFD, PAGE 2 | |
132 | C | |
133 | #ifdef debug | |
134 | DFLAG=and(PRSFLG, 32768).NE.0 | |
135 | #endif debug | |
136 | C !SET UP DETAIL FLAG. | |
137 | ONCE=.FALSE. | |
138 | C !INIT FLAG. | |
139 | 1025 RHERE=OROOM(THIEF) | |
140 | C !VISIBLE POS. | |
141 | IF(RHERE.NE.0) THFPOS=RHERE | |
142 | C | |
143 | IF(THFPOS.EQ.HERE) GO TO 1100 | |
144 | C !THIEF IN WIN RM? | |
145 | IF(THFPOS.NE.TREAS) GO TO 1400 | |
146 | C !THIEF NOT IN TREAS? | |
147 | C | |
148 | C THIEF IS IN TREASURE ROOM, AND WINNER IS NOT. | |
149 | C | |
150 | #ifdef debug | |
151 | IF(DFLAG) PRINT 10 | |
152 | #ifdef NOCC | |
153 | 10 FORMAT('THIEFD-- IN TREASURE ROOM') | |
154 | #else NOCC | |
155 | 10 FORMAT(' THIEFD-- IN TREASURE ROOM') | |
156 | #endif | |
157 | #endif debug | |
158 | IF(RHERE.EQ.0) GO TO 1050 | |
159 | C !VISIBLE? | |
160 | CALL NEWSTA(THIEF,0,0,0,0) | |
161 | C !YES, VANISH. | |
162 | RHERE=0 | |
163 | IF(QSTILL(TREAS)) CALL NEWSTA(STILL,0,0,THIEF,0) | |
164 | 1050 I=ROBADV(-THIEF,THFPOS,0,0) | |
165 | C !DROP VALUABLES. | |
166 | IF(QHERE(EGG,THFPOS)) OFLAG2(EGG)=or(OFLAG2(EGG),OPENBT) | |
167 | GO TO 1700 | |
168 | C | |
169 | C THIEF AND WINNER IN SAME ROOM. | |
170 | C | |
171 | 1100 IF(THFPOS.EQ.TREAS) GO TO 1700 | |
172 | C !IF TREAS ROOM, NOTHING. | |
173 | IF(and(RFLAG(THFPOS),RLIGHT).NE.0) GO TO 1400 | |
174 | #ifdef debug | |
175 | IF(DFLAG) PRINT 20 | |
176 | #ifdef NOCC | |
177 | 20 FORMAT('THIEFD-- IN ADV ROOM') | |
178 | #else NOCC | |
179 | 20 FORMAT(' THIEFD-- IN ADV ROOM') | |
180 | #endif NOCC | |
181 | #endif debug | |
182 | IF(THFFLG) GO TO 1300 | |
183 | C !THIEF ANNOUNCED? | |
184 | IF((RHERE.NE.0).OR.PROB(70,70)) GO TO 1150 | |
185 | C !IF INVIS AND 30%. | |
186 | IF(OCAN(STILL).NE.THIEF) GO TO 1700 | |
187 | C !ABORT IF NO STILLETTO. | |
188 | CALL NEWSTA(THIEF,583,THFPOS,0,0) | |
189 | C !INSERT THIEF INTO ROOM. | |
190 | THFFLG=.TRUE. | |
191 | C !THIEF IS ANNOUNCED. | |
192 | RETURN | |
193 | C | |
194 | 1150 IF((RHERE.EQ.0).OR.(and(OFLAG2(THIEF),FITEBT).EQ.0)) | |
195 | & GO TO 1200 | |
196 | IF(WINNIN(THIEF,WINNER)) GO TO 1175 | |
197 | C !WINNING? | |
198 | CALL NEWSTA(THIEF,584,0,0,0) | |
199 | C !NO, VANISH THIEF. | |
200 | OFLAG2(THIEF)=and(OFLAG2(THIEF), not(FITEBT)) | |
201 | IF(QSTILL(THFPOS)) CALL NEWSTA(STILL,0,0,THIEF,0) | |
202 | RETURN | |
203 | C | |
204 | 1175 IF(PROB(90,90)) GO TO 1700 | |
205 | C !90% CHANCE TO STAY. | |
206 | C | |
207 | 1200 IF((RHERE.EQ.0).OR.PROB(70,70)) GO TO 1250 | |
208 | C !IF VISIBLE AND 30% | |
209 | CALL NEWSTA(THIEF,585,0,0,0) | |
210 | C !VANISH THIEF. | |
211 | IF(QSTILL(THFPOS)) CALL NEWSTA(STILL,0,0,THIEF,0) | |
212 | RETURN | |
213 | C | |
214 | 1300 IF(RHERE.EQ.0) GO TO 1700 | |
215 | C !ANNOUNCED. VISIBLE? | |
216 | 1250 IF(PROB(70,70)) RETURN | |
217 | C !70% CHANCE TO DO NOTHING. | |
218 | THFFLG=.TRUE. | |
219 | NR=ROBRM(THFPOS,100,0,0,-THIEF)+ROBADV(WINNER,0,0,-THIEF) | |
220 | I=586 | |
221 | C !ROBBED EM. | |
222 | IF(RHERE.NE.0) I=588 | |
223 | C !WAS HE VISIBLE? | |
224 | IF(NR.NE.0) I=I+1 | |
225 | C !DID HE GET ANYTHING? | |
226 | CALL NEWSTA(THIEF,I,0,0,0) | |
227 | C !VANISH THIEF. | |
228 | IF(QSTILL(THFPOS)) | |
229 | & CALL NEWSTA(STILL,0,0,THIEF,0) | |
230 | IF((NR.NE.0).AND..NOT.LIT(THFPOS)) CALL RSPEAK(406) | |
231 | RHERE=0 | |
232 | GO TO 1700 | |
233 | C !ONWARD. | |
234 | C | |
235 | C NOT IN ADVENTURERS ROOM. | |
236 | C | |
237 | 1400 CALL NEWSTA(THIEF,0,0,0,0) | |
238 | C !VANISH. | |
239 | RHERE=0 | |
240 | #ifdef debug | |
241 | IF(DFLAG) PRINT 30,THFPOS | |
242 | #ifdef NOCC | |
243 | 30 FORMAT('THIEFD-- IN ROOM ',I4) | |
244 | #else NOCC | |
245 | 30 FORMAT(' THIEFD-- IN ROOM ',I4) | |
246 | #endif NOCC | |
247 | #endif debug | |
248 | IF(QSTILL(THFPOS)) | |
249 | & CALL NEWSTA(STILL,0,0,THIEF,0) | |
250 | IF(and(RFLAG(THFPOS),RSEEN).EQ.0) GO TO 1700 | |
251 | I=ROBRM(THFPOS,75,0,0,-THIEF) | |
252 | C !ROB ROOM 75%. | |
253 | IF((THFPOS.LT.MAZE1).OR.(THFPOS.GT.MAZ15).OR. | |
254 | & (HERE.LT.MAZE1).OR.(HERE.GT.MAZ15)) GO TO 1500 | |
255 | DO 1450 I=1,OLNT | |
256 | C !BOTH IN MAZE. | |
257 | IF(.NOT.QHERE(I,THFPOS).OR.PROB(60,60).OR. | |
258 | & (and(OFLAG1(I),(VISIBT+TAKEBT)).NE.(VISIBT+TAKEBT))) | |
259 | & GO TO 1450 | |
260 | CALL RSPSUB(590,ODESC2(I)) | |
261 | C !TAKE OBJECT. | |
262 | IF(PROB(40,20)) GO TO 1700 | |
263 | CALL NEWSTA(I,0,0,0,-THIEF) | |
264 | C !MOST OF THE TIME. | |
265 | OFLAG2(I)=or(OFLAG2(I),TCHBT) | |
266 | GO TO 1700 | |
267 | 1450 CONTINUE | |
268 | GO TO 1700 | |
269 | C | |
270 | 1500 DO 1550 I=1,OLNT | |
271 | C !NOT IN MAZE. | |
272 | IF(.NOT.QHERE(I,THFPOS).OR.(OTVAL(I).NE.0).OR.PROB(80,60).OR. | |
273 | & (and(OFLAG1(I),(VISIBT+TAKEBT)).NE.(VISIBT+TAKEBT))) | |
274 | & GO TO 1550 | |
275 | CALL NEWSTA(I,0,0,0,-THIEF) | |
276 | OFLAG2(I)=or(OFLAG2(I),TCHBT) | |
277 | GO TO 1700 | |
278 | 1550 CONTINUE | |
279 | C | |
280 | C NOW MOVE TO NEW ROOM. | |
281 | C | |
282 | 1700 IF(OADV(ROPE).EQ.-THIEF) DOMEF=.FALSE. | |
283 | IF(ONCE) GO TO 1800 | |
284 | ONCE=.NOT.ONCE | |
285 | 1750 THFPOS=THFPOS-1 | |
286 | C !NEXT ROOM. | |
287 | IF(THFPOS.LE.0) THFPOS=RLNT | |
288 | IF(and(RFLAG(THFPOS),(RLAND+RSACRD+REND)).NE.RLAND) | |
289 | & GO TO 1750 | |
290 | THFFLG=.FALSE. | |
291 | C !NOT ANNOUNCED. | |
292 | GO TO 1025 | |
293 | C !ONCE MORE. | |
294 | C | |
295 | C ALL DONE. | |
296 | C | |
297 | 1800 IF(THFPOS.EQ.TREAS) RETURN | |
298 | C !IN TREASURE ROOM? | |
299 | J=591 | |
300 | C !NO, DROP STUFF. | |
301 | IF(THFPOS.NE.HERE) J=0 | |
302 | DO 1850 I=1,OLNT | |
303 | IF((OADV(I).NE.-THIEF).OR.PROB(70,70).OR. | |
304 | & (OTVAL(I).GT.0)) GO TO 1850 | |
305 | CALL NEWSTA(I,J,THFPOS,0,0) | |
306 | J=0 | |
307 | 1850 CONTINUE | |
308 | RETURN | |
309 | C | |
310 | END |