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