xref: /csrg-svn/contrib/dungeon/dgame.F (revision 35973)
1*35973SbosticC GAME- MAIN COMMAND LOOP FOR DUNGEON
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	SUBROUTINE GAME
10*35973Sbostic	IMPLICIT INTEGER (A-Z)
11*35973Sbostic	LOGICAL RMDESC,VAPPLI,RAPPLI,AAPPLI
12*35973Sbostic	LOGICAL F,PARSE,FINDXT,XVEHIC,LIT
13*35973Sbostic	CHARACTER SECHO(4)
14*35973Sbostic	CHARACTER GDTSTR(3)
15*35973Sbostic#include "parser.h"
16*35973Sbostic#include "gamestate.h"
17*35973Sbostic#include "state.h"
18*35973Sbostic#include "io.h"
19*35973Sbostic#include "rooms.h"
20*35973Sbostic#include "rindex.h"
21*35973Sbostic#include "objects.h"
22*35973Sbostic#include "oflags.h"
23*35973Sbostic#include "oindex.h"
24*35973Sbostic#include "advers.h"
25*35973Sbostic#include "verbs.h"
26*35973Sbostic#include "flags.h"
27*35973SbosticC
28*35973SbosticC FUNCTIONS AND DATA
29*35973SbosticC
30*35973Sbostic	DATA SECHO/'E','C','H','O'/
31*35973Sbostic	DATA GDTSTR/'G','D','T'/
32*35973SbosticC GAME, PAGE 2
33*35973SbosticC
34*35973SbosticC START UP, DESCRIBE CURRENT LOCATION.
35*35973SbosticC
36*35973Sbostic	CALL RSPEAK(1)
37*35973SbosticC						!WELCOME ABOARD.
38*35973Sbostic	F=RMDESC(3)
39*35973SbosticC						!START GAME.
40*35973SbosticC
41*35973SbosticC NOW LOOP, READING AND EXECUTING COMMANDS.
42*35973SbosticC
43*35973Sbostic100	WINNER=PLAYER
44*35973SbosticC						!PLAYER MOVING.
45*35973Sbostic	TELFLG=.FALSE.
46*35973SbosticC						!ASSUME NOTHING TOLD.
47*35973Sbostic	IF(PRSCON.LE.1) CALL RDLINE(INBUF,INLNT,1)
48*35973SbosticC
49*35973Sbostic	DO 150 I=1,3
50*35973SbosticC						!CALL ON GDT?
51*35973Sbostic	  IF(INBUF(I+PRSCON-1).NE.GDTSTR(I)) GO TO 200
52*35973Sbostic150	CONTINUE
53*35973Sbostic	CALL GDT
54*35973SbosticC						!YES, INVOKE.
55*35973Sbostic	GO TO 100
56*35973SbosticC						!ONWARD.
57*35973SbosticC
58*35973Sbostic200	MOVES=MOVES+1
59*35973Sbostic	PRSWON=PARSE(INBUF,INLNT,.TRUE.)
60*35973Sbostic	IF(.NOT.PRSWON) GO TO 400
61*35973SbosticC						!PARSE LOSES?
62*35973Sbostic	IF(XVEHIC(1)) GO TO 400
63*35973SbosticC						!VEHICLE HANDLE?
64*35973SbosticC
65*35973Sbostic	IF(PRSA.EQ.TELLW) GO TO 2000
66*35973SbosticC						!TELL?
67*35973Sbostic300	IF((PRSO.EQ.VALUA).OR.(PRSO.EQ.EVERY)) GO TO 900
68*35973Sbostic	IF(.NOT.VAPPLI(PRSA)) GO TO 400
69*35973SbosticC						!VERB OK?
70*35973Sbostic350	IF(.NOT.ECHOF.AND.(HERE.EQ.ECHOR)) GO TO 1000
71*35973Sbostic	F=RAPPLI(RACTIO(HERE))
72*35973SbosticC
73*35973Sbostic400	CALL XENDMV(TELFLG)
74*35973SbosticC						!DO END OF MOVE.
75*35973Sbostic	IF(.NOT.LIT(HERE)) PRSCON=1
76*35973Sbostic	GO TO 100
77*35973SbosticC
78*35973Sbostic900	CALL VALUAC(VALUA)
79*35973Sbostic	GO TO 350
80*35973SbosticC GAME, PAGE 3
81*35973SbosticC
82*35973SbosticC SPECIAL CASE-- ECHO ROOM.
83*35973SbosticC IF INPUT IS NOT 'ECHO' OR A DIRECTION, JUST ECHO.
84*35973SbosticC
85*35973Sbostic1000	CALL RDLINE(INBUF,INLNT,0)
86*35973Sbostic	MOVES=MOVES+1
87*35973SbosticC						!CHARGE FOR MOVES.
88*35973Sbostic	DO 1100 I=1,4
89*35973SbosticC						!INPUT = ECHO?
90*35973Sbostic	  IF(INBUF(I).NE.SECHO(I)) GO TO 1300
91*35973Sbostic1100	CONTINUE
92*35973SbosticC
93*35973SbosticC   Note: the following DO loop was changed from DO 1200 I=5,78
94*35973SbosticC     The change was necessary because the RDLINE function was changed,
95*35973SbosticC      and no longer provides a 78 character buffer padded with blanks.
96*35973SbosticC
97*35973Sbostic	DO 1200 I=5,INLNT
98*35973Sbostic	  IF(INBUF(I).NE.' ') GO TO 1300
99*35973Sbostic1200	CONTINUE
100*35973SbosticC
101*35973Sbostic	CALL RSPEAK(571)
102*35973SbosticC						!KILL THE ECHO.
103*35973Sbostic	ECHOF=.TRUE.
104*35973Sbostic	OFLAG2(BAR)=and(OFLAG2(BAR), not(SCRDBT))
105*35973Sbostic	PRSWON=.TRUE.
106*35973SbosticC						!FAKE OUT PARSER.
107*35973Sbostic	PRSCON=1
108*35973SbosticC						!FORCE NEW INPUT.
109*35973Sbostic	GO TO 400
110*35973SbosticC
111*35973Sbostic1300	PRSWON=PARSE(INBUF,INLNT,.FALSE.)
112*35973Sbostic	IF(.NOT.PRSWON .OR. (PRSA.NE.WALKW))
113*35973Sbostic&		GO TO 1400
114*35973Sbostic	IF(FINDXT(PRSO,HERE)) GO TO 300
115*35973SbosticC						!VALID EXIT?
116*35973SbosticC
117*35973Sbostic#ifdef PDP
118*35973Sbostic1400	call outstr(INBUF, INLNT)
119*35973Sbostic#else
120*35973Sbostic1400	WRITE(OUTCH,1410) (INBUF(J),J=1,INLNT)
121*35973Sbostic#ifdef NOCC
122*35973Sbostic1410	FORMAT(78A1)
123*35973Sbostic#else NOCC
124*35973Sbostic1410	FORMAT(1X,78A1)
125*35973Sbostic#endif NOCC
126*35973Sbostic#endif PDP
127*35973Sbostic	TELFLG=.TRUE.
128*35973SbosticC						!INDICATE OUTPUT.
129*35973Sbostic	GO TO 1000
130*35973SbosticC						!MORE ECHO ROOM.
131*35973SbosticC GAME, PAGE 4
132*35973SbosticC
133*35973SbosticC SPECIAL CASE-- TELL <ACTOR>, NEW COMMAND
134*35973SbosticC NOTE THAT WE CANNOT BE IN THE ECHO ROOM.
135*35973SbosticC
136*35973Sbostic2000	IF(and(OFLAG2(PRSO),ACTRBT).NE.0) GO TO 2100
137*35973Sbostic	CALL RSPEAK(602)
138*35973SbosticC						!CANT DO IT.
139*35973Sbostic	GO TO 350
140*35973SbosticC						!VAPPLI SUCCEEDS.
141*35973SbosticC
142*35973Sbostic2100	WINNER=OACTOR(PRSO)
143*35973SbosticC						!NEW PLAYER.
144*35973Sbostic	HERE=AROOM(WINNER)
145*35973SbosticC						!NEW LOCATION.
146*35973Sbostic	IF(PRSCON.LE.1) GO TO 2700
147*35973SbosticC						!ANY INPUT?
148*35973Sbostic	IF(PARSE(INBUF,INLNT,.TRUE.)) GO TO 2150
149*35973Sbostic2700	I=341
150*35973SbosticC						!FAILS.
151*35973Sbostic	IF(TELFLG) I=604
152*35973SbosticC						!GIVE RESPONSE.
153*35973Sbostic	CALL RSPEAK(I)
154*35973Sbostic2600	WINNER=PLAYER
155*35973SbosticC						!RESTORE STATE.
156*35973Sbostic	HERE=AROOM(WINNER)
157*35973Sbostic	GO TO 350
158*35973SbosticC
159*35973Sbostic2150	IF(AAPPLI(AACTIO(WINNER))) GO TO 2400
160*35973SbosticC						!ACTOR HANDLE?
161*35973Sbostic	IF(XVEHIC(1)) GO TO 2400
162*35973SbosticC						!VEHICLE HANDLE?
163*35973Sbostic	IF((PRSO.EQ.VALUA).OR.(PRSO.EQ.EVERY)) GO TO 2900
164*35973Sbostic	IF(.NOT.VAPPLI(PRSA)) GO TO 2400
165*35973SbosticC						!VERB HANDLE?
166*35973Sbostic2350	F=RAPPLI(RACTIO(HERE))
167*35973SbosticC
168*35973Sbostic2400	CALL XENDMV(TELFLG)
169*35973SbosticC						!DO END OF MOVE.
170*35973Sbostic	GO TO 2600
171*35973SbosticC						!DONE.
172*35973SbosticC
173*35973Sbostic2900	CALL VALUAC(VALUA)
174*35973SbosticC						!ALL OR VALUABLES.
175*35973Sbostic	GO TO 350
176*35973SbosticC
177*35973Sbostic	END
178*35973SbosticC XENDMV-	EXECUTE END OF MOVE FUNCTIONS.
179*35973SbosticC
180*35973SbosticC DECLARATIONS
181*35973SbosticC
182*35973Sbostic	SUBROUTINE XENDMV(FLAG)
183*35973Sbostic	IMPLICIT INTEGER(A-Z)
184*35973Sbostic	LOGICAL F,CLOCKD,FLAG,XVEHIC
185*35973Sbostic#include "parser.h"
186*35973Sbostic#include "villians.h"
187*35973SbosticC
188*35973Sbostic	IF(.NOT.FLAG) CALL RSPEAK(341)
189*35973SbosticC						!DEFAULT REMARK.
190*35973Sbostic	IF(THFACT) CALL THIEFD
191*35973SbosticC						!THIEF DEMON.
192*35973Sbostic	IF(PRSWON) CALL FIGHTD
193*35973SbosticC						!FIGHT DEMON.
194*35973Sbostic	IF(SWDACT) CALL SWORDD
195*35973SbosticC						!SWORD DEMON.
196*35973Sbostic	IF(PRSWON) F=CLOCKD(X)
197*35973SbosticC						!CLOCK DEMON.
198*35973Sbostic	IF(PRSWON) F=XVEHIC(2)
199*35973SbosticC						!VEHICLE READOUT.
200*35973Sbostic	RETURN
201*35973Sbostic	END
202*35973SbosticC XVEHIC- EXECUTE VEHICLE FUNCTION
203*35973SbosticC
204*35973SbosticC DECLARATIONS
205*35973SbosticC
206*35973Sbostic	LOGICAL FUNCTION XVEHIC(N)
207*35973Sbostic	IMPLICIT INTEGER(A-Z)
208*35973Sbostic	LOGICAL OAPPLI
209*35973Sbostic#include "gamestate.h"
210*35973Sbostic#include "objects.h"
211*35973Sbostic#include "advers.h"
212*35973SbosticC
213*35973Sbostic	XVEHIC=.FALSE.
214*35973SbosticC						!ASSUME LOSES.
215*35973Sbostic	AV=AVEHIC(WINNER)
216*35973SbosticC						!GET VEHICLE.
217*35973Sbostic	IF(AV.NE.0) XVEHIC=OAPPLI(OACTIO(AV),N)
218*35973Sbostic	RETURN
219*35973Sbostic	END
220