|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California,
3: * All rights reserved. Redistribution permitted subject to
4: * the terms of the Berkeley Software License Agreement.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)com7.c 1.3 4/24/85";
9: #endif
10:
11: #include "externs.h"
12:
13: fight(enemy,strength)
14: int enemy,strength;
15: {
16: int lifeline = 0;
17: int hurt;
18: char auxbuf[LINELENGTH];
19: char *next;
20: int i;
21: int exhaustion;
22:
23: fighton:
24: time++;
25: snooze -= 5;
26: if (snooze > time)
27: exhaustion = CYCLE/(snooze - time);
28: else {
29: puts("You collapse exhausted, and he pulverizes your skull.");
30: die();
31: }
32: if (snooze - time < 20)
33: puts("You look tired! I hope you're able to fight.");
34: next = getcom(auxbuf, LINELENGTH, "<fight!>-: ", 0);
35: for (i=0; next && i < 10; i++)
36: next = getword(next, words[i], -1);
37: parse();
38: switch(wordvalue[wordnumber]){
39:
40: case KILL:
41: case SMITE:
42: if (testbit(inven,TWO_HANDED))
43: hurt = rnd(70) - 2 * card(injuries,NUMOFINJURIES) - ucard(wear) - exhaustion;
44: else if (testbit(inven,SWORD) || testbit(inven, BROAD))
45: hurt = rnd(50)%(WEIGHT-carrying)-card(injuries,NUMOFINJURIES)-encumber - exhaustion;
46: else if (testbit(inven,KNIFE) || testbit(inven,MALLET) || testbit(inven,CHAIN) || testbit(inven,MACE) || testbit(inven,HALBERD))
47: hurt = rnd(15) - card(injuries,NUMOFINJURIES) - exhaustion;
48: else
49: hurt = rnd(7) - encumber;
50: if (hurt < 5)
51: switch(rnd(3)){
52:
53: case 0:
54: puts("You swung wide and missed.");
55: break;
56: case 1:
57: puts("He checked your blow. CLASH! CLANG!");
58: break;
59: case 2:
60: puts("His filthy tunic hangs by one less thread.");
61: break;
62: }
63: else if (hurt < 10){
64: switch(rnd(3)){
65: case 0:
66: puts("He's bleeding.");
67: break;
68: case 1:
69: puts("A trickle of blood runs down his face.");
70: break;
71: case 2:
72: puts("A huge purple bruise is forming on the side of his face.");
73: break;
74: }
75: lifeline++;
76: }
77: else if (hurt < 20){
78: switch(rnd(3)){
79: case 0:
80: puts("He staggers back quavering.");
81: break;
82: case 1:
83: puts("He jumps back with his hand over the wound.");
84: break;
85: case 2:
86: puts("His shirt falls open with a swath across the chest.");
87: break;
88: }
89: lifeline += 5;
90: }
91: else if (hurt < 30){
92: switch(rnd(3)){
93: case 0:
94: printf("A bloody gash opens up on his %s side.\n",(rnd(2) ? "left" : "right"));
95: break;
96: case 1:
97: puts("The steel bites home and scrapes along his ribs.");
98: break;
99: case 2:
100: puts("You pierce him, and his breath hisses through clenched teeth.");
101: break;
102: }
103: lifeline += 10;
104: }
105: else if (hurt < 40){
106: switch(rnd(3)){
107: case 0:
108: puts("You smite him to the ground.");
109: if (strength - lifeline > 20)
110: puts("But in a flurry of steel he regains his feet!");
111: break;
112: case 1:
113: puts("The force of your blow sends him to his knees.");
114: puts("His arm swings lifeless at his side.");
115: break;
116: case 2:
117: puts("Clutching his blood drenched shirt, he collapses stunned.");
118: break;
119: }
120: lifeline += 20;
121: }
122: else {
123: switch(rnd(3)){
124: case 0:
125: puts("His ribs crack under your powerful swing, flooding his lungs with blood.");
126: break;
127: case 1:
128: puts("You shatter his upheld arm in a spray of blood. The blade continues deep");
129: puts("into his back, severing the spinal cord.");
130: lifeline += 25;
131: break;
132: case 2:
133: puts("With a mighty lunge the steel slides in, and gasping, he falls to the ground.");
134: lifeline += 25;
135: break;
136: }
137: lifeline += 30;
138: }
139: break;
140:
141: case BACK:
142: if (enemy == DARK && lifeline > strength * 0.33){
143: puts("He throws you back against the rock and pummels your face.");
144: if (testbit(inven,AMULET) || testbit(wear,AMULET)){
145: printf("Lifting the amulet from you, ");
146: if (testbit(inven,MEDALION) || testbit(wear,MEDALION)){
147: puts("his power grows and the walls of\nthe earth tremble.");
148: puts("When he touches the medallion, your chest explodes and the foundations of the\nearth collapse.");
149: puts("The planet is consumed by darkness.");
150: die();
151: }
152: if (testbit(inven,AMULET)){
153: clearbit(inven,AMULET);
154: carrying -= objwt[AMULET];
155: encumber -= objcumber[AMULET];
156: }
157: else
158: clearbit(wear,AMULET);
159: puts("he flees down the dark caverns.");
160: clearbit(location[position].objects,DARK);
161: injuries[SKULL] = 1;
162: followfight = time;
163: return (0);
164: }
165: else{
166: puts("I'm afraid you have been killed.");
167: die();
168: }
169: }
170: else{
171: puts("You escape stunned and disoriented from the fight.");
172: puts("A victorious bellow echoes from the battlescene.");
173: if (back && position != back)
174: move(back,BACK);
175: else if (ahead &&position != ahead)
176: move(ahead,AHEAD);
177: else if (left && position != left)
178: move(left,LEFT);
179: else if (right && position != right)
180: move(right,RIGHT);
181: else
182: move(location[position].down,AHEAD);
183: return(0);
184: }
185:
186: case SHOOT:
187: if (testbit(inven,LASER)){
188: if (strength - lifeline <= 50){
189: printf("The %s took a direct hit!\n",objsht[enemy]);
190: lifeline += 50;
191: }
192: else {
193: puts("With his bare hand he deflects the laser blast and whips the pistol from you!");
194: clearbit(inven,LASER);
195: setbit(location[position].objects,LASER);
196: carrying -= objwt[LASER];
197: encumber -= objcumber[LASER];
198: }
199: }
200: else
201: puts("Unfortunately, you don't have a blaster handy.");
202: break;
203:
204: case DROP:
205: case DRAW:
206: cypher();
207: time--;
208: break;
209:
210: default:
211: puts("You don't have a chance, he is too quick.");
212: break;
213:
214: }
215: if (lifeline >= strength){
216: printf("You have killed the %s.\n", objsht[enemy]);
217: if (enemy == ELF || enemy == DARK)
218: puts("A watery black smoke consumes his body and then vanishes with a peal of thunder!");
219: clearbit(location[position].objects,enemy);
220: power += 2;
221: notes[JINXED]++;
222: return(0);
223: }
224: puts("He attacks...");
225: /* some embellisments */
226: hurt = rnd(NUMOFINJURIES) - (testbit(inven,SHIELD) != 0) - (testbit(wear,MAIL) != 0) - (testbit(wear,HELM) != 0);
227: hurt += (testbit(wear,AMULET) != 0) + (testbit(wear,MEDALION) != 0) + (testbit(wear,TALISMAN) != 0);
228: hurt = hurt < 0 ? 0 : hurt;
229: hurt = hurt >= NUMOFINJURIES ? NUMOFINJURIES -1 : hurt;
230: if (!injuries[hurt]){
231: injuries[hurt] = 1;
232: printf("I'm afraid you have suffered %s.\n", ouch[hurt]);
233: }
234: else
235: puts("You emerge unscathed.");
236: if (injuries[SKULL] && injuries[INCISE] && injuries[NECK]){
237: puts("I'm afraid you have suffered fatal injuries.");
238: die();
239: }
240: goto fighton;
241: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.