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