]> git.cameronkatri.com Git - bsdgames-darwin.git/blob - battlestar/com7.c
WARNSify
[bsdgames-darwin.git] / battlestar / com7.c
1 /* $NetBSD: com7.c,v 1.5 1997/10/10 11:39:35 lukem Exp $ */
2
3 /*
4 * Copyright (c) 1983, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the University of
18 * California, Berkeley and its contributors.
19 * 4. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36 #include <sys/cdefs.h>
37 #ifndef lint
38 #if 0
39 static char sccsid[] = "@(#)com7.c 8.2 (Berkeley) 4/28/95";
40 #else
41 __RCSID("$NetBSD: com7.c,v 1.5 1997/10/10 11:39:35 lukem Exp $");
42 #endif
43 #endif /* not lint */
44
45 #include "extern.h"
46
47 int
48 fight(enemy, strength)
49 int enemy,strength;
50 {
51 int lifeline = 0;
52 int hurt;
53 char auxbuf[LINELENGTH];
54 char *next;
55 int i;
56 int exhaustion;
57
58 exhaustion = 0;
59 fighton:
60 ourtime++;
61 snooze -= 5;
62 if (snooze > ourtime)
63 exhaustion = CYCLE/(snooze - ourtime);
64 else {
65 puts("You collapse exhausted, and he pulverizes your skull.");
66 die();
67 }
68 if (snooze - ourtime < 20)
69 puts("You look tired! I hope you're able to fight.");
70 next = getcom(auxbuf, LINELENGTH, "<fight!>-: ", 0);
71 for (i=0; next && i < 10; i++)
72 next = getword(next, words[i], -1);
73 parse();
74 switch(wordvalue[wordnumber]){
75
76 case KILL:
77 case SMITE:
78 if (testbit(inven,TWO_HANDED))
79 hurt = rnd(70) - 2 * card(injuries,NUMOFINJURIES) - ucard(wear) - exhaustion;
80 else if (testbit(inven,SWORD) || testbit(inven, BROAD))
81 hurt = rnd(50)%(WEIGHT-carrying)-card(injuries,NUMOFINJURIES)-encumber - exhaustion;
82 else if (testbit(inven,KNIFE) || testbit(inven,MALLET) || testbit(inven,CHAIN) || testbit(inven,MACE) || testbit(inven,HALBERD))
83 hurt = rnd(15) - card(injuries,NUMOFINJURIES) - exhaustion;
84 else
85 hurt = rnd(7) - encumber;
86 if (hurt < 5)
87 switch(rnd(3)){
88
89 case 0:
90 puts("You swung wide and missed.");
91 break;
92 case 1:
93 puts("He checked your blow. CLASH! CLANG!");
94 break;
95 case 2:
96 puts("His filthy tunic hangs by one less thread.");
97 break;
98 }
99 else if (hurt < 10){
100 switch(rnd(3)){
101 case 0:
102 puts("He's bleeding.");
103 break;
104 case 1:
105 puts("A trickle of blood runs down his face.");
106 break;
107 case 2:
108 puts("A huge purple bruise is forming on the side of his face.");
109 break;
110 }
111 lifeline++;
112 }
113 else if (hurt < 20){
114 switch(rnd(3)){
115 case 0:
116 puts("He staggers back quavering.");
117 break;
118 case 1:
119 puts("He jumps back with his hand over the wound.");
120 break;
121 case 2:
122 puts("His shirt falls open with a swath across the chest.");
123 break;
124 }
125 lifeline += 5;
126 }
127 else if (hurt < 30){
128 switch(rnd(3)){
129 case 0:
130 printf("A bloody gash opens up on his %s side.\n",(rnd(2) ? "left" : "right"));
131 break;
132 case 1:
133 puts("The steel bites home and scrapes along his ribs.");
134 break;
135 case 2:
136 puts("You pierce him, and his breath hisses through clenched teeth.");
137 break;
138 }
139 lifeline += 10;
140 }
141 else if (hurt < 40){
142 switch(rnd(3)){
143 case 0:
144 puts("You smite him to the ground.");
145 if (strength - lifeline > 20)
146 puts("But in a flurry of steel he regains his feet!");
147 break;
148 case 1:
149 puts("The force of your blow sends him to his knees.");
150 puts("His arm swings lifeless at his side.");
151 break;
152 case 2:
153 puts("Clutching his blood drenched shirt, he collapses stunned.");
154 break;
155 }
156 lifeline += 20;
157 }
158 else {
159 switch(rnd(3)){
160 case 0:
161 puts("His ribs crack under your powerful swing, flooding his lungs with blood.");
162 break;
163 case 1:
164 puts("You shatter his upheld arm in a spray of blood. The blade continues deep");
165 puts("into his back, severing the spinal cord.");
166 lifeline += 25;
167 break;
168 case 2:
169 puts("With a mighty lunge the steel slides in, and gasping, he falls to the ground.");
170 lifeline += 25;
171 break;
172 }
173 lifeline += 30;
174 }
175 break;
176
177 case BACK:
178 if (enemy == DARK && lifeline > strength * 0.33){
179 puts("He throws you back against the rock and pummels your face.");
180 if (testbit(inven,AMULET) || testbit(wear,AMULET)){
181 printf("Lifting the amulet from you, ");
182 if (testbit(inven,MEDALION) || testbit(wear,MEDALION)){
183 puts("his power grows and the walls of\nthe earth tremble.");
184 puts("When he touches the medallion, your chest explodes and the foundations of the\nearth collapse.");
185 puts("The planet is consumed by darkness.");
186 die();
187 }
188 if (testbit(inven,AMULET)){
189 clearbit(inven,AMULET);
190 carrying -= objwt[AMULET];
191 encumber -= objcumber[AMULET];
192 }
193 else
194 clearbit(wear,AMULET);
195 puts("he flees down the dark caverns.");
196 clearbit(location[position].objects,DARK);
197 injuries[SKULL] = 1;
198 followfight = ourtime;
199 return (0);
200 }
201 else{
202 puts("I'm afraid you have been killed.");
203 die();
204 }
205 }
206 else{
207 puts("You escape stunned and disoriented from the fight.");
208 puts("A victorious bellow echoes from the battlescene.");
209 if (back && position != back)
210 move(back,BACK);
211 else if (ahead &&position != ahead)
212 move(ahead,AHEAD);
213 else if (left && position != left)
214 move(left,LEFT);
215 else if (right && position != right)
216 move(right,RIGHT);
217 else
218 move(location[position].down,AHEAD);
219 return(0);
220 }
221
222 case SHOOT:
223 if (testbit(inven,LASER)){
224 if (strength - lifeline <= 50){
225 printf("The %s took a direct hit!\n",objsht[enemy]);
226 lifeline += 50;
227 }
228 else {
229 puts("With his bare hand he deflects the laser blast and whips the pistol from you!");
230 clearbit(inven,LASER);
231 setbit(location[position].objects,LASER);
232 carrying -= objwt[LASER];
233 encumber -= objcumber[LASER];
234 }
235 }
236 else
237 puts("Unfortunately, you don't have a blaster handy.");
238 break;
239
240 case DROP:
241 case DRAW:
242 cypher();
243 ourtime--;
244 break;
245
246 default:
247 puts("You don't have a chance, he is too quick.");
248 break;
249
250 }
251 if (lifeline >= strength){
252 printf("You have killed the %s.\n", objsht[enemy]);
253 if (enemy == ELF || enemy == DARK)
254 puts("A watery black smoke consumes his body and then vanishes with a peal of thunder!");
255 clearbit(location[position].objects,enemy);
256 power += 2;
257 notes[JINXED]++;
258 return(0);
259 }
260 puts("He attacks...");
261 /* some embellisments */
262 hurt = rnd(NUMOFINJURIES) - (testbit(inven,SHIELD) != 0) - (testbit(wear,MAIL) != 0) - (testbit(wear,HELM) != 0);
263 hurt += (testbit(wear,AMULET) != 0) + (testbit(wear,MEDALION) != 0) + (testbit(wear,TALISMAN) != 0);
264 hurt = hurt < 0 ? 0 : hurt;
265 hurt = hurt >= NUMOFINJURIES ? NUMOFINJURIES -1 : hurt;
266 if (!injuries[hurt]){
267 injuries[hurt] = 1;
268 printf("I'm afraid you have suffered %s.\n", ouch[hurt]);
269 }
270 else
271 puts("You emerge unscathed.");
272 if (injuries[SKULL] && injuries[INCISE] && injuries[NECK]){
273 puts("I'm afraid you have suffered fatal injuries.");
274 die();
275 }
276 goto fighton;
277 }