xref: /netbsd/games/battlestar/command3.c (revision bf9ec67e)
1 /*	$NetBSD: command3.c,v 1.1 2001/10/19 03:06:11 tv 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[] = "@(#)com3.c	8.2 (Berkeley) 4/28/95";
40 #else
41 __RCSID("$NetBSD: command3.c,v 1.1 2001/10/19 03:06:11 tv Exp $");
42 #endif
43 #endif				/* not lint */
44 
45 #include "extern.h"
46 
47 void
48 dig()
49 {
50 	if (testbit(inven, SHOVEL)) {
51 		puts("OK");
52 		ourtime++;
53 		switch (position) {
54 		case 144:	/* copse near beach */
55 			if (!notes[DUG]) {
56 				setbit(location[position].objects, DEADWOOD);
57 				setbit(location[position].objects, COMPASS);
58 				setbit(location[position].objects, KNIFE);
59 				setbit(location[position].objects, MACE);
60 				notes[DUG] = 1;
61 			}
62 			break;
63 
64 		default:
65 			puts("Nothing happens.");
66 		}
67 	} else
68 		puts("You don't have a shovel.");
69 }
70 
71 int
72 jump()
73 {
74 	int     n;
75 
76 	switch (position) {
77 	default:
78 		puts("Nothing happens.");
79 		return (-1);
80 
81 	case 242:
82 		position = 133;
83 		break;
84 	case 214:
85 	case 215:
86 	case 162:
87 	case 159:
88 		position = 145;
89 		break;
90 	case 232:
91 		position = FINAL;
92 		break;
93 	case 3:
94 		position = 1;
95 		break;
96 	case 172:
97 		position = 201;
98 	}
99 	puts("Ahhhhhhh...");
100 	injuries[12] = injuries[8] = injuries[7] = injuries[6] = 1;
101 	for (n = 0; n < NUMOFOBJECTS; n++)
102 		if (testbit(inven, n)) {
103 			clearbit(inven, n);
104 			setbit(location[position].objects, n);
105 		}
106 	carrying = 0;
107 	encumber = 0;
108 	return (0);
109 }
110 
111 void
112 bury()
113 {
114 	int     value;
115 
116 	if (testbit(inven, SHOVEL)) {
117 		while (wordtype[++wordnumber] != OBJECT && wordtype[wordnumber] != NOUNS && wordnumber < wordcount)
118 			continue;
119 		value = wordvalue[wordnumber];
120 		if (wordtype[wordnumber] == NOUNS && (testbit(location[position].objects, value) || value == BODY))
121 			switch (value) {
122 			case BODY:
123 				wordtype[wordnumber] = OBJECT;
124 				if (testbit(inven, MAID) || testbit(location[position].objects, MAID))
125 					value = MAID;
126 				if (testbit(inven, DEADWOOD) || testbit(location[position].objects, DEADWOOD))
127 					value = DEADWOOD;
128 				if (testbit(inven, DEADGOD) || testbit(location[position].objects, DEADGOD))
129 					value = DEADGOD;
130 				if (testbit(inven, DEADTIME) || testbit(location[position].objects, DEADTIME))
131 					value = DEADTIME;
132 				if (testbit(inven, DEADNATIVE) || testbit(location[position].objects, DEADNATIVE))
133 					value = DEADNATIVE;
134 				break;
135 
136 			case NATIVE:
137 			case NORMGOD:
138 				puts("She screams as you wrestle her into the hole.");
139 			case TIMER:
140 				power += 7;
141 				ego -= 10;
142 			case AMULET:
143 			case MEDALION:
144 			case TALISMAN:
145 				wordtype[wordnumber] = OBJECT;
146 				break;
147 
148 			default:
149 				puts("Wha..?");
150 			}
151 		if (wordtype[wordnumber] == OBJECT && position > 88 && (testbit(inven, value) || testbit(location[position].objects, value))) {
152 			puts("Buried.");
153 			if (testbit(inven, value)) {
154 				clearbit(inven, value);
155 				carrying -= objwt[value];
156 				encumber -= objcumber[value];
157 			}
158 			clearbit(location[position].objects, value);
159 			switch (value) {
160 			case MAID:
161 			case DEADWOOD:
162 			case DEADNATIVE:
163 			case DEADTIME:
164 			case DEADGOD:
165 				ego += 2;
166 				printf("The %s should rest easier now.\n", objsht[value]);
167 			}
168 		} else
169 			puts("It doesn't seem to work.");
170 	} else
171 		puts("You aren't holding a shovel.");
172 }
173 
174 void
175 drink()
176 {
177 	int     n;
178 
179 	if (testbit(inven, POTION)) {
180 		puts("The cool liquid runs down your throat but turns to fire and you choke.");
181 		puts("The heat reaches your limbs and tingles your spirit.  You feel like falling");
182 		puts("asleep.");
183 		clearbit(inven, POTION);
184 		WEIGHT = MAXWEIGHT;
185 		CUMBER = MAXCUMBER;
186 		for (n = 0; n < NUMOFINJURIES; n++)
187 			injuries[n] = 0;
188 		ourtime++;
189 		zzz();
190 	} else
191 		puts("I'm not thirsty.");
192 }
193 
194 int
195 shoot()
196 {
197 	int     firstnumber, value;
198 
199 	firstnumber = wordnumber;
200 	if (!testbit(inven, LASER))
201 		puts("You aren't holding a blaster.");
202 	else {
203 		wordnumber++;
204 		while (wordnumber <= wordcount && wordtype[wordnumber] == OBJECT) {
205 			value = wordvalue[wordnumber];
206 			printf("%s:\n", objsht[value]);
207 			if (testbit(location[position].objects, value)) {
208 				clearbit(location[position].objects, value);
209 				ourtime++;
210 				printf("The %s explode%s\n", objsht[value],
211 				    (is_plural_object(value) ? "." : "s."));
212 				if (value == BOMB)
213 					die();
214 			} else
215 				printf("I don't see any %s around here.\n", objsht[value]);
216 			if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
217 				wordnumber++;
218 			else
219 				return (firstnumber);
220 		}
221 		/* special cases with their own return()'s */
222 
223 		if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS) {
224 			ourtime++;
225 			switch (wordvalue[wordnumber]) {
226 
227 			case DOOR:
228 				switch (position) {
229 				case 189:
230 				case 231:
231 					puts("The door is unhinged.");
232 					location[189].north = 231;
233 					location[231].south = 189;
234 					whichway(location[position]);
235 					break;
236 				case 30:
237 					puts("The wooden door splinters.");
238 					location[30].west = 25;
239 					whichway(location[position]);
240 					break;
241 				case 31:
242 					puts("The laser blast has no effect on the door.");
243 					break;
244 				case 20:
245 					puts("The blast hits the door and it explodes into flame.  The magnesium burns");
246 					puts("so rapidly that we have no chance to escape.");
247 					die();
248 				default:
249 					puts("Nothing happens.");
250 				}
251 				break;
252 
253 			case NORMGOD:
254 				if (testbit(location[position].objects, BATHGOD)) {
255 					puts("The goddess is hit in the chest and splashes back against the rocks.");
256 					puts("Dark blood oozes from the charred blast hole.  Her naked body floats in the");
257 					puts("pools and then off downstream.");
258 					clearbit(location[position].objects, BATHGOD);
259 					setbit(location[180].objects, DEADGOD);
260 					power += 5;
261 					ego -= 10;
262 					notes[JINXED]++;
263 				} else
264 					if (testbit(location[position].objects, NORMGOD)) {
265 						puts("The blast catches the goddess in the stomach, knocking her to the ground.");
266 						puts("She writhes in the dirt as the agony of death taunts her.");
267 						puts("She has stopped moving.");
268 						clearbit(location[position].objects, NORMGOD);
269 						setbit(location[position].objects, DEADGOD);
270 						power += 5;
271 						ego -= 10;
272 						notes[JINXED]++;
273 						if (wintime)
274 							live();
275 						break;
276 					} else
277 						puts("I don't see any goddess around here.");
278 				break;
279 
280 			case TIMER:
281 				if (testbit(location[position].objects, TIMER)) {
282 					puts("The old man slumps over the bar.");
283 					power++;
284 					ego -= 2;
285 					notes[JINXED]++;
286 					clearbit(location[position].objects, TIMER);
287 					setbit(location[position].objects, DEADTIME);
288 				} else
289 					puts("What old-timer?");
290 				break;
291 			case MAN:
292 				if (testbit(location[position].objects, MAN)) {
293 					puts("The man falls to the ground with blood pouring all over his white suit.");
294 					puts("Your fantasy is over.");
295 					die();
296 				} else
297 					puts("What man?");
298 				break;
299 			case NATIVE:
300 				if (testbit(location[position].objects, NATIVE)) {
301 					puts("The girl is blown backwards several feet and lies in a pool of blood.");
302 					clearbit(location[position].objects, NATIVE);
303 					setbit(location[position].objects, DEADNATIVE);
304 					power += 5;
305 					ego -= 2;
306 					notes[JINXED]++;
307 				} else
308 					puts("There is no girl here.");
309 				break;
310 			case -1:
311 				puts("Shoot what?");
312 				break;
313 
314 			default:
315 				printf("You can't shoot the %s.\n", objsht[wordvalue[wordnumber]]);
316 			}
317 		} else
318 			puts("You must be a looney.");
319 	}
320 	return (firstnumber);
321 }
322