1 /* FIGHTD- INTERMOVE FIGHT DEMON */
2
3 /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
4 /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
5 /* WRITTEN BY R. M. SUPNIK */
6
7 #include "funcs.h"
8 #include "vars.h"
9
10 static logical infest_ P((integer));
11
fightd_()12 void fightd_()
13 {
14 /* Initialized data */
15
16 const integer rout = 1;
17
18 /* System generated locals */
19 integer i__1, i__2;
20
21 /* Local variables */
22 logical f;
23 integer i, j, ra;
24 integer obj;
25 integer res;
26 integer out;
27
28 i__1 = vill_1.vlnt;
29 for (i = 1; i <= i__1; ++i) {
30 /* !LOOP THRU VILLAINS. */
31 vill_1.vopps[i - 1] = 0;
32 /* !CLEAR OPPONENT SLOT. */
33 obj = vill_1.villns[i - 1];
34 /* !GET OBJECT NO. */
35 ra = objcts_1.oactio[obj - 1];
36 /* !GET HIS ACTION. */
37 if (play_1.here != objcts_1.oroom[obj - 1]) {
38 goto L2200;
39 }
40 /* !ADVENTURER STILL HERE? */
41 if (obj == oindex_1.thief && findex_1.thfenf) {
42 goto L2400;
43 }
44 /* !THIEF ENGROSSED? */
45 if (objcts_1.ocapac[obj - 1] >= 0) {
46 goto L2050;
47 }
48 /* !YES, VILL AWAKE? */
49 if (vill_1.vprob[i - 1] == 0 || ! prob_(vill_1.vprob[i - 1],
50 vill_1.vprob[i - 1])) {
51 goto L2025;
52 }
53 objcts_1.ocapac[obj - 1] = (i__2 = objcts_1.ocapac[obj - 1], abs(i__2)
54 );
55 vill_1.vprob[i - 1] = 0;
56 if (ra == 0) {
57 goto L2400;
58 }
59 /* !ANYTHING TO DO? */
60 prsvec_1.prsa = vindex_1.inxw;
61 /* !YES, WAKE HIM UP. */
62 f = oappli_(ra, 0);
63 goto L2400;
64 /* !NOTHING ELSE HAPPENS. */
65
66 L2025:
67 vill_1.vprob[i - 1] += 10;
68 /* !INCREASE WAKEUP PROB. */
69 goto L2400;
70 /* !NOTHING ELSE. */
71
72 L2050:
73 if ((objcts_1.oflag2[obj - 1] & FITEBT) == 0) {
74 goto L2100;
75 }
76 vill_1.vopps[i - 1] = obj;
77 /* !FIGHTING, SET UP OPP. */
78 goto L2400;
79
80 L2100:
81 if (ra == 0) {
82 goto L2400;
83 }
84 /* !NOT FIGHTING, */
85 prsvec_1.prsa = vindex_1.frstqw;
86 /* !SET UP PROBABILITY */
87 if (! oappli_(ra, 0)) {
88 goto L2400;
89 }
90 /* !OF FIGHTING. */
91 objcts_1.oflag2[obj - 1] |= FITEBT;
92 vill_1.vopps[i - 1] = obj;
93 /* !SET UP OPP. */
94 goto L2400;
95
96 L2200:
97 if ((objcts_1.oflag2[obj - 1] & FITEBT) == 0 || ra == 0) {
98 goto L2300;
99 }
100 prsvec_1.prsa = vindex_1.fightw;
101 /* !HAVE A FIGHT. */
102 f = oappli_(ra, 0);
103 L2300:
104 if (obj == oindex_1.thief) {
105 findex_1.thfenf = FALSE_;
106 }
107 /* !TURN OFF ENGROSSED. */
108 advs_1.aflag[aindex_1.player - 1] &= ~ aflags_1.astag;
109 objcts_1.oflag2[obj - 1] &= ~ (STAGBT + FITEBT);
110 if (objcts_1.ocapac[obj - 1] >= 0 || ra == 0) {
111 goto L2400;
112 }
113 prsvec_1.prsa = vindex_1.inxw;
114 /* !WAKE HIM UP. */
115 f = oappli_(ra, 0);
116 objcts_1.ocapac[obj - 1] = (i__2 = objcts_1.ocapac[obj - 1], abs(i__2)
117 );
118 L2400:
119 ;
120 }
121 /* FIGHTD, PAGE 3 */
122
123 /* NOW DO ACTUAL COUNTERBLOWS. */
124
125 out = 0;
126 /* !ASSUME HERO OK. */
127 L2600:
128 i__1 = vill_1.vlnt;
129 for (i = 1; i <= i__1; ++i) {
130 /* !LOOP THRU OPPS. */
131 j = vill_1.vopps[i - 1];
132 if (j == 0) {
133 goto L2700;
134 }
135 /* !SLOT EMPTY? */
136 prsvec_1.prscon = 1;
137 /* !STOP CMD STREAM. */
138 ra = objcts_1.oactio[j - 1];
139 if (ra == 0) {
140 goto L2650;
141 }
142 /* !VILLAIN ACTION? */
143 prsvec_1.prsa = vindex_1.fightw;
144 /* !SEE IF */
145 if (oappli_(ra, 0)) {
146 goto L2700;
147 }
148 /* !SPECIAL ACTION. */
149 L2650:
150 res = blow_(aindex_1.player, j, vill_1.vmelee[i - 1], 0, out);
151
152 /* !STRIKE BLOW. */
153 if (res < 0) {
154 return;
155 }
156 /* !IF HERO DEAD, EXIT. */
157 if (res == rout) {
158 out = rnd_(3) + 2;
159 }
160 /* !IF HERO OUT, SET FLG. */
161 L2700:
162 ;
163 }
164 --out;
165 /* !DECREMENT OUT COUNT. */
166 if (out > 0) {
167 goto L2600;
168 }
169 /* !IF STILL OUT, GO AGAIN. */
170 return;
171
172 } /* fightd_ */
173
174 /* BLOW- STRIKE BLOW */
175
176 /* DECLARATIONS */
177
blow_(h,v,rmk,hflg,out)178 integer blow_(h, v, rmk, hflg, out)
179 integer h;
180 integer v;
181 integer rmk;
182 logical hflg;
183 integer out;
184 {
185 /* Initialized data */
186
187 const integer rmiss = 0;
188 const integer rout = 1;
189 const integer rkill = 2;
190 const integer rstag = 5;
191 const integer rlose = 6;
192 const integer rhes = 7;
193 const integer rsit = 8;
194 static const integer def1r[3] = { 1,2,3 };
195 static const integer def2r[4] = { 13,23,24,25 };
196 static const integer def3r[5] = { 35,36,46,47,57 };
197 static const integer rvectr[66] = { 0,0,0,0,5,5,1,1,2,2,2,2,0,0,0,0,0,5,
198 5,3,3,1,0,0,0,5,5,3,3,3,1,2,2,2,0,0,0,0,0,5,5,3,3,4,4,0,0,0,5,5,
199 3,3,3,4,4,4,0,5,5,3,3,3,3,4,4,4 };
200 static const integer rstate[45] = { 5000,3005,3008,4011,3015,3018,1021,
201 0,0,5022,3027,3030,4033,3037,3040,1043,0,0,4044,2048,4050,4054,
202 5058,4063,4067,3071,1074,4075,1079,4080,4084,4088,4092,4096,4100,
203 1104,4105,2109,4111,4115,4119,4123,4127,3131,3134 };
204
205 /* System generated locals */
206 integer ret_val, i__1, i__2;
207
208 /* Local variables */
209 logical f;
210 integer i, j, oa, ra, od, mi, dv, def;
211 integer tbl;
212 integer att, res;
213 integer dweap;
214 integer pblose;
215
216 ra = objcts_1.oactio[v - 1];
217 /* !GET VILLAIN ACTION, */
218 dv = objcts_1.odesc2[v - 1];
219 /* !DESCRIPTION. */
220 ret_val = rmiss;
221 /* !ASSUME NO RESULT. */
222 if (! (hflg)) {
223 goto L1000;
224 }
225 /* !HERO STRIKING BLOW? */
226
227 /* HERO IS ATTACKER, VILLAIN IS DEFENDER. */
228
229 pblose = 10;
230 /* !BAD LK PROB. */
231 objcts_1.oflag2[v - 1] |= FITEBT;
232 if ((advs_1.aflag[h - 1] & aflags_1.astag) == 0) {
233 goto L100;
234 }
235 rspeak_(591);
236 /* !YES, CANT FIGHT. */
237 advs_1.aflag[h - 1] &= ~ aflags_1.astag;
238 return ret_val;
239
240 L100:
241 att = fights_(h, 1);
242 /* !GET HIS STRENGTH. */
243 oa = att;
244 def = vilstr_(v);
245 /* !GET VILL STRENGTH. */
246 od = def;
247 dweap = 0;
248 /* !ASSUME NO WEAPON. */
249 i__1 = objcts_1.olnt;
250 for (i = 1; i <= i__1; ++i) {
251 /* !SEARCH VILLAIN. */
252 if (objcts_1.ocan[i - 1] == v && (objcts_1.oflag2[i - 1] &
253 WEAPBT) != 0) {
254 dweap = i;
255 }
256 /* L200: */
257 }
258 if (v == advs_1.aobj[aindex_1.player - 1]) {
259 goto L300;
260 }
261 /* !KILLING SELF? */
262 if (def != 0) {
263 goto L2000;
264 }
265 /* !DEFENDER ALIVE? */
266 rspsub_(592, dv);
267 /* !VILLAIN DEAD. */
268 return ret_val;
269
270 L300:
271 jigsup_(593);
272 /* !KILLING SELF. */
273 return ret_val;
274
275 /* VILLAIN IS ATTACKER, HERO IS DEFENDER. */
276
277 L1000:
278 pblose = 50;
279 /* !BAD LK PROB. */
280 advs_1.aflag[h - 1] &= ~ aflags_1.astag;
281 if ((objcts_1.oflag2[v - 1] & STAGBT) == 0) {
282 goto L1200;
283 }
284 objcts_1.oflag2[v - 1] &= ~ STAGBT;
285 rspsub_(594, dv);
286 /* !DESCRIBE. */
287 return ret_val;
288
289 L1200:
290 att = vilstr_(v);
291 /* !SET UP ATT, DEF. */
292 oa = att;
293 def = fights_(h, 1);
294 if (def <= 0) {
295 return ret_val;
296 }
297 /* !DONT ALLOW DEAD DEF. */
298 od = fights_(h, 0);
299 dweap = (i__1 = fwim_(0, WEAPBT, 0, 0, h, 1),
300 abs(i__1));
301 /* !FIND A WEAPON. */
302 /* BLOW, PAGE 4 */
303
304 /* PARTIES ARE NOW EQUIPPED. DEF CANNOT BE ZERO. */
305 /* ATT MUST BE > 0. */
306
307 L2000:
308 if (def > 0) {
309 goto L2100;
310 }
311 /* !DEF ALIVE? */
312 res = rkill;
313 if (hflg) {
314 rspsub_(595, dv);
315 }
316 /* !DEADER. */
317 goto L3000;
318
319 L2100:
320 if ((i__1 = def - 2) < 0) {
321 goto L2200;
322 } else if (i__1 == 0) {
323 goto L2300;
324 } else {
325 goto L2400;
326 }
327 /* !DEF <2,=2,>2 */
328 L2200:
329 att = min(att,3);
330 /* !SCALE ATT. */
331 tbl = def1r[att - 1];
332 /* !CHOOSE TABLE. */
333 goto L2500;
334
335 L2300:
336 att = min(att,4);
337 /* !SCALE ATT. */
338 tbl = def2r[att - 1];
339 /* !CHOOSE TABLE. */
340 goto L2500;
341
342 L2400:
343 att -= def;
344 /* !SCALE ATT. */
345 /* Computing MIN */
346 i__1 = 2, i__2 = max(-2,att);
347 att = min(i__1,i__2) + 3;
348 tbl = def3r[att - 1];
349
350 L2500:
351 res = rvectr[tbl + rnd_(10) - 1];
352 /* !GET RESULT. */
353 if (out == 0) {
354 goto L2600;
355 }
356 /* !WAS HE OUT? */
357 if (res == rstag) {
358 goto L2550;
359 }
360 /* !YES, STAG--> HES. */
361 res = rsit;
362 /* !OTHERWISE, SITTING. */
363 goto L2600;
364 L2550:
365 res = rhes;
366 L2600:
367 if (res == rstag && dweap != 0 && prob_(25, pblose)) {
368 res = rlose;
369 }
370
371 mi = rstate[(rmk - 1) * 9 + res];
372 /* !CHOOSE TABLE ENTRY. */
373 if (mi == 0) {
374 goto L3000;
375 }
376 i__1 = mi / 1000;
377 i = mi % 1000 + rnd_(i__1) + star_1.mbase + 1;
378 j = dv;
379 if (! (hflg) && dweap != 0) {
380 j = objcts_1.odesc2[dweap - 1];
381 }
382 rspsub_(i, j);
383 /* !PRESENT RESULT. */
384 /* BLOW, PAGE 5 */
385
386 /* NOW APPLY RESULT */
387
388 L3000:
389 switch (res + 1) {
390 case 1: goto L4000;
391 case 2: goto L3100;
392 case 3: goto L3200;
393 case 4: goto L3300;
394 case 5: goto L3400;
395 case 6: goto L3500;
396 case 7: goto L3600;
397 case 8: goto L4000;
398 case 9: goto L3200;
399 }
400
401 L3100:
402 if (hflg) {
403 def = -def;
404 }
405 /* !UNCONSCIOUS. */
406 goto L4000;
407
408 L3200:
409 def = 0;
410 /* !KILLED OR SITTING DUCK. */
411 goto L4000;
412
413 L3300:
414 /* Computing MAX */
415 i__1 = 0, i__2 = def - 1;
416 def = max(i__1,i__2);
417 /* !LIGHT WOUND. */
418 goto L4000;
419
420 L3400:
421 /* Computing MAX */
422 i__1 = 0, i__2 = def - 2;
423 def = max(i__1,i__2);
424 /* !SERIOUS WOUND. */
425 goto L4000;
426
427 L3500:
428 if (hflg) {
429 goto L3550;
430 }
431 /* !STAGGERED. */
432 advs_1.aflag[h - 1] |= aflags_1.astag;
433 goto L4000;
434
435 L3550:
436 objcts_1.oflag2[v - 1] |= STAGBT;
437 goto L4000;
438
439 L3600:
440 newsta_(dweap, 0, play_1.here, 0, 0);
441 /* !LOSE WEAPON. */
442 dweap = 0;
443 if (hflg) {
444 goto L4000;
445 }
446 /* !IF HERO, DONE. */
447 dweap = (i__1 = fwim_(0, WEAPBT, 0, 0, h, 1),
448 abs(i__1));
449 /* !GET NEW. */
450 if (dweap != 0) {
451 rspsub_(605, objcts_1.odesc2[dweap - 1]);
452 }
453 /* BLOW, PAGE 6 */
454
455 L4000:
456 ret_val = res;
457 /* !RETURN RESULT. */
458 if (! (hflg)) {
459 goto L4500;
460 }
461 /* !HERO? */
462 objcts_1.ocapac[v - 1] = def;
463 /* !STORE NEW CAPACITY. */
464 if (def != 0) {
465 goto L4100;
466 }
467 /* !DEAD? */
468 objcts_1.oflag2[v - 1] &= ~ FITEBT;
469 rspsub_(572, dv);
470 /* !HE DIES. */
471 newsta_(v, 0, 0, 0, 0);
472 /* !MAKE HIM DISAPPEAR. */
473 if (ra == 0) {
474 return ret_val;
475 }
476 /* !IF NX TO DO, EXIT. */
477 prsvec_1.prsa = vindex_1.deadxw;
478 /* !LET HIM KNOW. */
479 f = oappli_(ra, 0);
480 return ret_val;
481
482 L4100:
483 if (res != rout || ra == 0) {
484 return ret_val;
485 }
486 prsvec_1.prsa = vindex_1.outxw;
487 /* !LET HIM BE OUT. */
488 f = oappli_(ra, 0);
489 return ret_val;
490
491 L4500:
492 advs_1.astren[h - 1] = -10000;
493 /* !ASSUME DEAD. */
494 if (def != 0) {
495 advs_1.astren[h - 1] = def - od;
496 }
497 if (def >= od) {
498 goto L4600;
499 }
500 cevent_1.ctick[cindex_1.cevcur - 1] = 30;
501 cevent_1.cflag[cindex_1.cevcur - 1] = TRUE_;
502 L4600:
503 if (fights_(h, 1) > 0) {
504 return ret_val;
505 }
506 advs_1.astren[h - 1] = 1 - fights_(h, 0);
507 /* !HE'S DEAD. */
508 jigsup_(596);
509 ret_val = -1;
510 return ret_val;
511
512 } /* blow_ */
513
514 /* SWORDD- SWORD INTERMOVE DEMON */
515
516 /* DECLARATIONS */
517
swordd_()518 void swordd_()
519 {
520 /* System generated locals */
521 integer i__1, i__2;
522
523 /* Local variables */
524 integer i, ng;
525
526 if (objcts_1.oadv[oindex_1.sword - 1] != aindex_1.player) {
527 goto L500;
528 }
529 /* !HOLDING SWORD? */
530 ng = 2;
531 /* !ASSUME VILL CLOSE. */
532 if (infest_(play_1.here)) {
533 goto L300;
534 }
535 /* !VILL HERE? */
536 ng = 1;
537 i__1 = xsrch_1.xmax;
538 i__2 = xsrch_1.xmin;
539 for (i = xsrch_1.xmin; i__2 < 0 ? i >= i__1 : i <= i__1; i += i__2) {
540 /* !NO, SEARCH ROOMS. */
541 if (! findxt_(i, play_1.here)) {
542 goto L200;
543 }
544 /* !ROOM THAT WAY? */
545 switch (curxt_1.xtype) {
546 case 1: goto L50;
547 case 2: goto L200;
548 case 3: goto L50;
549 case 4: goto L50;
550 }
551 /* !SEE IF ROOM AT ALL. */
552 L50:
553 if (infest_(curxt_1.xroom1)) {
554 goto L300;
555 }
556 /* !CHECK ROOM. */
557 L200:
558 ;
559 }
560 ng = 0;
561 /* !NO GLOW. */
562
563 L300:
564 if (ng == hack_1.swdsta) {
565 return;
566 }
567 /* !ANY STATE CHANGE? */
568 i__2 = ng + 495;
569 rspeak_(i__2);
570 /* !YES, TELL NEW STATE. */
571 hack_1.swdsta = ng;
572 return;
573
574 L500:
575 hack_1.swdact = FALSE_;
576 /* !DROPPED SWORD, */
577 return;
578 /* !DISABLE DEMON. */
579 } /* swordd_ */
580
581 /* INFEST- SUBROUTINE TO TEST FOR INFESTED ROOM */
582
583 /* DECLARATIONS */
infest_(r)584 static logical infest_(r)
585 integer r;
586 {
587 /* System generated locals */
588 logical ret_val;
589
590 if (! findex_1.endgmf) {
591 ret_val = objcts_1.oroom[oindex_1.cyclo - 1] == r || objcts_1.oroom[
592 oindex_1.troll - 1] == r || objcts_1.oroom[oindex_1.thief -
593 1] == r && hack_1.thfact;
594 }
595 else {
596 ret_val = r == rindex_1.mrg || r == rindex_1.mrge || r ==
597 rindex_1.mrgw || r == rindex_1.inmir && findex_1.mloc ==
598 rindex_1.mrg;
599 }
600 return ret_val;
601 } /* infest_ */
602