|
|
1.1 root 1: C TAKE-- BASIC TAKE SEQUENCE
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 TAKE AN OBJECT (FOR VERBS TAKE, PUT, DROP, READ, ETC.)
8: C
9: LOGICAL FUNCTION TAKE(FLG)
10: C
11: C DECLARATIONS
12: C
13: IMPLICIT INTEGER (A-Z)
14: LOGICAL FLG,OBJACT,OAPPLI,QOPEN,QHERE
15: #include "parser.h"
16: #include "gamestate.h"
17: #include "state.h"
18: COMMON /STAR/ MBASE,STRBIT
19: #include "objects.h"
20: #include "oflags.h"
21: C
22: #include "advers.h"
23: C
24: C FUNCTIONS AND DATA
25: C
26: QOPEN(O)=(and(OFLAG2(O),OPENBT).NE.0)
27: C TAKE, PAGE 2
28: C
29: TAKE=.FALSE.
30: C !ASSUME LOSES.
31: OA=OACTIO(PRSO)
32: C !GET OBJECT ACTION.
33: IF(PRSO.LE.STRBIT) GO TO 100
34: C !STAR?
35: TAKE=OBJACT(X)
36: C !YES, LET IT HANDLE.
37: RETURN
38: C
39: 100 X=OCAN(PRSO)
40: C !INSIDE?
41: IF(PRSO.NE.AVEHIC(WINNER)) GO TO 400
42: C !HIS VEHICLE?
43: CALL RSPEAK(672)
44: C !DUMMY.
45: RETURN
46: C
47: 400 IF(and(OFLAG1(PRSO),TAKEBT).NE.0) GO TO 500
48: IF(.NOT.OAPPLI(OA,0)) CALL RSPEAK(552+RND(5))
49: RETURN
50: C
51: C OBJECT IS TAKEABLE AND IN POSITION TO BE TAKEN.
52: C
53: 500 IF((X.NE.0).OR. QHERE(PRSO,HERE)) GO TO 600
54: IF(OADV(PRSO).EQ.WINNER) CALL RSPEAK(557)
55: C !ALREADY GOT IT?
56: RETURN
57: C
58: 600 IF(((X.NE.0).AND.(OADV(X).EQ.WINNER)).OR.
59: & ((WEIGHT(0,PRSO,WINNER)+OSIZE(PRSO)).LE.MXLOAD))
60: & GO TO 700
61: CALL RSPEAK(558)
62: C !TOO MUCH WEIGHT.
63: RETURN
64: C
65: 700 TAKE=.TRUE.
66: C !AT LAST.
67: IF(OAPPLI(OA,0)) RETURN
68: C !DID IT HANDLE?
69: CALL NEWSTA(PRSO,0,0,0,WINNER)
70: C !TAKE OBJECT FOR WINNER.
71: OFLAG2(PRSO)=or(OFLAG2(PRSO),TCHBT)
72: CALL SCRUPD(OFVAL(PRSO))
73: C !UPDATE SCORE.
74: OFVAL(PRSO)=0
75: C !CANT BE SCORED AGAIN.
76: IF(FLG) CALL RSPEAK(559)
77: C !TELL TAKEN.
78: RETURN
79: C
80: END
81: C DROP- DROP VERB PROCESSOR
82: C
83: C DECLARATIONS
84: C
85: LOGICAL FUNCTION DROP(Z)
86: IMPLICIT INTEGER (A-Z)
87: LOGICAL F,PUT,OBJACT
88: #include "parser.h"
89: #include "gamestate.h"
90: C
91: C ROOMS
92: #include "rindex.h"
93: #include "objects.h"
94: #include "oflags.h"
95: C
96: #include "advers.h"
97: #include "verbs.h"
98: C DROP, PAGE 2
99: C
100: DROP=.TRUE.
101: C !ASSUME WINS.
102: X=OCAN(PRSO)
103: C !GET CONTAINER.
104: IF(X.EQ.0) GO TO 200
105: C !IS IT INSIDE?
106: IF(OADV(X).NE.WINNER) GO TO 1000
107: C !IS HE CARRYING CON?
108: IF(and(OFLAG2(X),OPENBT).NE.0) GO TO 300
109: CALL RSPSUB(525,ODESC2(X))
110: C !CANT REACH.
111: RETURN
112: C
113: 200 IF(OADV(PRSO).NE.WINNER) GO TO 1000
114: C !IS HE CARRYING OBJ?
115: 300 IF(AVEHIC(WINNER).EQ.0) GO TO 400
116: C !IS HE IN VEHICLE?
117: PRSI=AVEHIC(WINNER)
118: C !YES,
119: F=PUT(.TRUE.)
120: C !DROP INTO VEHICLE.
121: PRSI=0
122: C !DISARM PARSER.
123: RETURN
124: C !DONE.
125: C
126: 400 CALL NEWSTA(PRSO,0,HERE,0,0)
127: C !DROP INTO ROOM.
128: IF(HERE.EQ.MTREE) CALL NEWSTA(PRSO,0,FORE3,0,0)
129: CALL SCRUPD(OFVAL(PRSO))
130: C !SCORE OBJECT.
131: OFVAL(PRSO)=0
132: C !CANT BE SCORED AGAIN.
133: OFLAG2(PRSO)=or(OFLAG2(PRSO),TCHBT)
134: C
135: IF(OBJACT(X)) RETURN
136: C !DID IT HANDLE?
137: I=0
138: C !ASSUME NOTHING TO SAY.
139: IF(PRSA.EQ.DROPW) I=528
140: IF(PRSA.EQ.THROWW) I=529
141: IF((I.NE.0).AND.(HERE.EQ.MTREE)) I=659
142: CALL RSPSUB(I,ODESC2(PRSO))
143: RETURN
144: C
145: 1000 CALL RSPEAK(527)
146: C !DONT HAVE IT.
147: RETURN
148: C
149: END
150: C PUT- PUT VERB PROCESSOR
151: C
152: C DECLARATIONS
153: C
154: LOGICAL FUNCTION PUT(FLG)
155: IMPLICIT INTEGER (A-Z)
156: LOGICAL TAKE,QOPEN,QHERE,OBJACT,FLG
157: #include "parser.h"
158: #include "gamestate.h"
159: C
160: C MISCELLANEOUS VARIABLES
161: C
162: COMMON /STAR/ MBASE,STRBIT
163: #include "objects.h"
164: #include "oflags.h"
165: #include "advers.h"
166: #include "verbs.h"
167: C
168: C FUNCTIONS AND DATA
169: C
170: QOPEN(R)=((and(OFLAG2(R),OPENBT)).NE.0)
171: C PUT, PAGE 2
172: C
173: PUT=.FALSE.
174: IF((PRSO.LE.STRBIT).AND.(PRSI.LE.STRBIT)) GO TO 200
175: IF(.NOT.OBJACT(X)) CALL RSPEAK(560)
176: C !STAR
177: PUT=.TRUE.
178: RETURN
179: C
180: 200 IF((QOPEN(PRSI))
181: & .OR.(and(OFLAG1(PRSI),(DOORBT+CONTBT)).NE.0)
182: & .OR.(and(OFLAG2(PRSI),VEHBT).NE.0)) GO TO 300
183: CALL RSPEAK(561)
184: C !CANT PUT IN THAT.
185: RETURN
186: C
187: 300 IF(QOPEN(PRSI)) GO TO 400
188: C !IS IT OPEN?
189: CALL RSPEAK(562)
190: C !NO, JOKE
191: RETURN
192: C
193: 400 IF(PRSO.NE.PRSI) GO TO 500
194: C !INTO ITSELF?
195: CALL RSPEAK(563)
196: C !YES, JOKE.
197: RETURN
198: C
199: 500 IF(OCAN(PRSO).NE.PRSI) GO TO 600
200: C !ALREADY INSIDE.
201: CALL RSPSB2(564,ODESC2(PRSO),ODESC2(PRSI))
202: PUT=.TRUE.
203: RETURN
204: C
205: 600 IF((WEIGHT(0,PRSO,0)+WEIGHT(0,PRSI,0)+OSIZE(PRSO))
206: & .LE.OCAPAC(PRSI)) GO TO 700
207: CALL RSPEAK(565)
208: C !THEN CANT DO IT.
209: RETURN
210: C
211: C NOW SEE IF OBJECT (OR ITS CONTAINER) IS IN ROOM
212: C
213: 700 J=PRSO
214: C !START SEARCH.
215: 725 IF(QHERE(J,HERE)) GO TO 750
216: C !IS IT HERE?
217: J=OCAN(J)
218: IF(J.NE.0) GO TO 725
219: C !MORE TO DO?
220: GO TO 800
221: C !NO, SCH FAILS.
222: C
223: 750 SVO=PRSO
224: C !SAVE PARSER.
225: SVI=PRSI
226: PRSA=TAKEW
227: PRSI=0
228: IF(.NOT.TAKE(.FALSE.)) RETURN
229: C !TAKE OBJECT.
230: PRSA=PUTW
231: PRSO=SVO
232: PRSI=SVI
233: GO TO 1000
234: C
235: C NOW SEE IF OBJECT IS ON PERSON.
236: C
237: 800 IF(OCAN(PRSO).EQ.0) GO TO 1000
238: C !INSIDE?
239: IF(QOPEN(OCAN(PRSO))) GO TO 900
240: C !OPEN?
241: CALL RSPSUB(566,ODESC2(PRSO))
242: C !LOSE.
243: RETURN
244: C
245: 900 CALL SCRUPD(OFVAL(PRSO))
246: C !SCORE OBJECT.
247: OFVAL(PRSO)=0
248: OFLAG2(PRSO)=or(OFLAG2(PRSO),TCHBT)
249: CALL NEWSTA(PRSO,0,0,0,WINNER)
250: C !TEMPORARILY ON WINNER.
251: C
252: 1000 IF(OBJACT(X)) RETURN
253: C !NO, GIVE OBJECT A SHOT.
254: CALL NEWSTA(PRSO,2,0,PRSI,0)
255: C !CONTAINED INSIDE.
256: PUT=.TRUE.
257: RETURN
258: C
259: END
260: C VALUAC- HANDLES VALUABLES/EVERYTHING
261: C
262: C DECLARATIONS
263: C
264: SUBROUTINE VALUAC(V)
265: IMPLICIT INTEGER (A-Z)
266: LOGICAL LIT,F,F1,TAKE,PUT,DROP,NOTVAL,QHERE
267: #include "parser.h"
268: #include "gamestate.h"
269: #include "objects.h"
270: #include "oflags.h"
271: #include "verbs.h"
272: C
273: C FUNCTIONS AND DATA
274: C
275: NOTVAL(R)=(SAVEP.EQ.V).AND.(OTVAL(R).LE.0)
276: C VALUAC, PAGE 2
277: C
278: F=.TRUE.
279: C !ASSUME NO ACTIONS.
280: I=579
281: C !ASSUME NOT LIT.
282: IF(.NOT.LIT(HERE)) GO TO 4000
283: C !IF NOT LIT, PUNT.
284: I=677
285: C !ASSUME WRONG VERB.
286: SAVEP=PRSO
287: C !SAVE PRSO.
288: SAVEH=HERE
289: C !SAVE HERE.
290: C
291: 100 IF(PRSA.NE.TAKEW) GO TO 1000
292: C !TAKE EVERY/VALUA?
293: DO 500 PRSO=1,OLNT
294: C !LOOP THRU OBJECTS.
295: IF(.NOT.QHERE(PRSO,HERE).OR.
296: & (and(OFLAG1(PRSO),VISIBT).EQ.0).OR.
297: & (and(OFLAG2(PRSO),ACTRBT).NE.0).OR.
298: & NOTVAL(PRSO)) GO TO 500
299: IF((and(OFLAG1(PRSO),TAKEBT).EQ.0).AND.
300: & (and(OFLAG2(PRSO),TRYBT).EQ.0)) GO TO 500
301: F=.FALSE.
302: CALL RSPSUB(580,ODESC2(PRSO))
303: F1=TAKE(.TRUE.)
304: IF(SAVEH.NE.HERE) RETURN
305: 500 CONTINUE
306: GO TO 3000
307: C
308: 1000 IF(PRSA.NE.DROPW) GO TO 2000
309: C !DROP EVERY/VALUA?
310: DO 1500 PRSO=1,OLNT
311: IF((OADV(PRSO).NE.WINNER).OR.NOTVAL(PRSO))
312: & GO TO 1500
313: F=.FALSE.
314: CALL RSPSUB(580,ODESC2(PRSO))
315: F1=DROP(.TRUE.)
316: IF(SAVEH.NE.HERE) RETURN
317: 1500 CONTINUE
318: GO TO 3000
319: C
320: 2000 IF(PRSA.NE.PUTW) GO TO 3000
321: C !PUT EVERY/VALUA?
322: DO 2500 PRSO=1,OLNT
323: C !LOOP THRU OBJECTS.
324: IF((OADV(PRSO).NE.WINNER)
325: & .OR.(PRSO.EQ.PRSI).OR.NOTVAL(PRSO).OR.
326: & (and(OFLAG1(PRSO),VISIBT).EQ.0)) GO TO 2500
327: F=.FALSE.
328: CALL RSPSUB(580,ODESC2(PRSO))
329: F1=PUT(.TRUE.)
330: IF(SAVEH.NE.HERE) RETURN
331: 2500 CONTINUE
332: C
333: 3000 I=581
334: IF(SAVEP.EQ.V) I=582
335: C !CHOOSE MESSAGE.
336: 4000 IF(F) CALL RSPEAK(I)
337: C !IF NOTHING, REPORT.
338: RETURN
339: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.