xref: /dragonfly/games/battlestar/command3.c (revision d8d5b238)
1 /*-
2  * Copyright (c) 1983, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * @(#)com3.c	8.1 (Berkeley) 5/31/93
30  * $FreeBSD: src/games/battlestar/com3.c,v 1.8.2.1 2001/03/05 11:45:35 kris Exp $
31  */
32 
33 #include "externs.h"
34 
35 void
36 dig(void)
37 {
38 	if (testbit(inven, SHOVEL)) {
39 		puts("OK");
40 		gtime++;
41 		switch (position) {
42 		case 144:	/* copse near beach */
43 			if (!notes[DUG]) {
44 				setbit(location[position].objects, DEADWOOD);
45 				setbit(location[position].objects, COMPASS);
46 				setbit(location[position].objects, KNIFE);
47 				setbit(location[position].objects, MACE);
48 				notes[DUG] = 1;
49 			}
50 			break;
51 
52 		default:
53 			puts("Nothing happens.");
54 		}
55 	} else
56 		puts("You don't have a shovel.");
57 }
58 
59 int
60 jump(void)
61 {
62 	int n;
63 
64 	switch (position) {
65 	default:
66 		puts("Nothing happens.");
67 		return (-1);
68 
69 	case 242:
70 		position = 133;
71 		break;
72 	case 214:
73 	case 215:
74 	case 162:
75 	case 159:
76 		position = 145;
77 		break;
78 	case 232:
79 		position = 275;
80 		break;
81 	case 3:
82 		position = 1;
83 		break;
84 	case 172:
85 		position = 201;
86 	}
87 	puts("Ahhhhhhh...");
88 	injuries[12] = injuries[8] = injuries[7] = injuries[6] = 1;
89 	for (n = 0; n < NUMOFOBJECTS; n++)
90 		if (testbit(inven, n)) {
91 			clearbit(inven, n);
92 			setbit(location[position].objects, n);
93 		}
94 	carrying = 0;
95 	encumber = 0;
96 	return (0);
97 }
98 
99 void
100 bury(void)
101 {
102 	int value;
103 
104 	if (testbit(inven, SHOVEL)) {
105 		while (wordtype[++wordnumber] != OBJECT &&
106 		    wordtype[wordnumber] != NOUNS && wordnumber < wordcount)
107 			; /* nothing */
108 		value = wordvalue[wordnumber];
109 		if (wordtype[wordnumber] == NOUNS &&
110 		    (testbit(location[position].objects, value) ||
111 		    value == BODY))
112 			switch (value) {
113 			case BODY:
114 				wordtype[wordnumber] = OBJECT;
115 				if (testbit(inven, MAID) ||
116 				    testbit(location[position].objects, MAID))
117 					value = MAID;
118 				if (testbit(inven, DEADWOOD) ||
119 				    testbit(location[position].objects,
120 				    DEADWOOD))
121 					value = DEADWOOD;
122 				if (testbit(inven, DEADGOD) ||
123 				    testbit(location[position].objects,
124 				    DEADGOD))
125 					value = DEADGOD;
126 				if (testbit(inven, DEADTIME) ||
127 				    testbit(location[position].objects,
128 				    DEADTIME))
129 					value = DEADTIME;
130 				if (testbit(inven, DEADNATIVE) ||
131 				    testbit(location[position].objects,
132 				    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 				/* FALLTHROUGH */
140 			case TIMER:
141 				power += 7;
142 				ego -= 10;
143 				/* FALLTHROUGH */
144 			case AMULET:
145 			case MEDALION:
146 			case TALISMAN:
147 				wordtype[wordnumber] = OBJECT;
148 				break;
149 
150 			default:
151 				puts("Wha..?");
152 			}
153 		if (wordtype[wordnumber] == OBJECT && position > 88 &&
154 		    (testbit(inven, value) ||
155 		    testbit(location[position].objects, value))) {
156 			puts("Buried.");
157 			if (testbit(inven, value)) {
158 				clearbit(inven, value);
159 				carrying -= objwt[value];
160 				encumber -= objcumber[value];
161 			}
162 			clearbit(location[position].objects, value);
163 			switch (value) {
164 			case MAID:
165 			case DEADWOOD:
166 			case DEADNATIVE:
167 			case DEADTIME:
168 			case DEADGOD:
169 				ego += 2;
170 				printf("The %s should rest easier now.\n",
171 				    objsht[value]);
172 			}
173 		} else
174 			puts("It doesn't seem to work.");
175 	} else
176 		puts("You aren't holding a shovel.");
177 }
178 
179 void
180 drink(void)
181 {
182 	int n;
183 
184 	if (testbit(inven, POTION)) {
185 		puts("The cool liquid runs down your throat but turns to fire and you choke.");
186 		puts("The heat reaches your limbs and tingles your spirit.  You feel like falling");
187 		puts("asleep.");
188 		clearbit(inven, POTION);
189 		WEIGHT = MAXWEIGHT;
190 		CUMBER = MAXCUMBER;
191 		for (n = 0; n < NUMOFINJURIES; n++)
192 			injuries[n] = 0;
193 		gtime++;
194 		zzz();
195 	} else
196 		puts("I'm not thirsty.");
197 }
198 
199 int
200 shoot(void)
201 {
202 	int firstnumber, value;
203 	int n;
204 
205 	firstnumber = wordnumber;
206 	if (!testbit(inven, LASER))
207 		puts("You aren't holding a blaster.");
208 	else {
209 		while (wordtype[++wordnumber] == ADJS)
210 			; /* nothing */
211 		while (wordnumber <= wordcount &&
212 		    wordtype[wordnumber] == OBJECT) {
213 			value = wordvalue[wordnumber];
214 			printf("%s:\n", objsht[value]);
215 			for (n = 0; objsht[value][n]; n++)
216 				; /* nothing */
217 			if (testbit(location[position].objects, value)) {
218 				clearbit(location[position].objects, value);
219 				gtime++;
220 				printf("The %s explode%s\n", objsht[value],
221 				       (objsht[value][n - 1] ==
222 					's' ? (objsht[value][n - 2] ==
223 					       's' ? "s." : ".") : "s."));
224 				if (value == BOMB)
225 					die(0);
226 			} else
227 				printf("I dont see any %s around here.\n",
228 				    objsht[value]);
229 			if (wordnumber < wordcount - 1 &&
230 			    wordvalue[++wordnumber] == AND)
231 				wordnumber++;
232 			else
233 				return (firstnumber);
234 		}
235 		/* special cases with their own return()'s */
236 
237 		if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS) {
238 			gtime++;
239 			switch (wordvalue[wordnumber]) {
240 			case DOOR:
241 				switch (position) {
242 				case 189:
243 				case 231:
244 					puts("The door is unhinged.");
245 					location[189].north = 231;
246 					location[231].south = 189;
247 					whichway(location[position]);
248 					break;
249 				case 30:
250 					puts("The wooden door splinters.");
251 					location[30].west = 25;
252 					whichway(location[position]);
253 					break;
254 				case 31:
255 					puts("The laser blast has no effect on the door.");
256 					break;
257 				case 20:
258 					puts("The blast hits the door and it explodes into flame.  The magnesium burns");
259 					puts("so rapidly that we have no chance to escape.");
260 					die(0);
261 				default:
262 					puts("Nothing happens.");
263 				}
264 				break;
265 
266 			case NORMGOD:
267 				if (testbit(location[position].objects,
268 				    BATHGOD)) {
269 					puts("The goddess is hit in the chest and splashes back against the rocks.");
270 					puts("Dark blood oozes from the charred blast hole.  Her naked body floats in the");
271 					puts("pools and then off downstream.");
272 					clearbit(location[position].objects,
273 					    BATHGOD);
274 					setbit(location[180].objects, DEADGOD);
275 					power += 5;
276 					ego -= 10;
277 					notes[JINXED]++;
278 				} else
279 					if (testbit(location[position].objects,
280 					    NORMGOD)) {
281 						puts("The blast catches the goddess in the stomach, knocking her to the ground.");
282 						puts("She writhes in the dirt as the agony of death taunts her.");
283 						puts("She has stopped moving.");
284 						clearbit(location[position].objects, NORMGOD);
285 						setbit(location[position].objects, DEADGOD);
286 						power += 5;
287 						ego -= 10;
288 						notes[JINXED]++;
289 						if (wintime)
290 							live();
291 						break;
292 					} else
293 						puts("I don't see any goddess around here.");
294 				break;
295 
296 			case TIMER:
297 				if (testbit(location[position].objects,
298 				    TIMER)) {
299 					puts("The old man slumps over the bar.");
300 					power++;
301 					ego -= 2;
302 					notes[JINXED]++;
303 					clearbit(location[position].objects,
304 					    TIMER);
305 					setbit(location[position].objects,
306 					    DEADTIME);
307 				} else
308 					puts("What old timer?");
309 				break;
310 			case MAN:
311 				if (testbit(location[position].objects, MAN)) {
312 					puts("The man falls to the ground with blood pouring all over his white suit.");
313 					puts("Your fantasy is over.");
314 					die(0);
315 				} else
316 					puts("What man?");
317 				break;
318 			case NATIVE:
319 				if (testbit(location[position].objects,
320 				    NATIVE)) {
321 					puts("The girl is blown backwards several feet and lies in a pool of blood.");
322 					clearbit(location[position].objects,
323 					    NATIVE);
324 					setbit(location[position].objects,
325 					    DEADNATIVE);
326 					power += 5;
327 					ego -= 2;
328 					notes[JINXED]++;
329 				} else
330 					puts("There is no girl here.");
331 				break;
332 			case -1:
333 				puts("Shoot what?");
334 				break;
335 
336 			default:
337 				printf("You can't shoot the %s.\n",
338 				    objsht[wordvalue[wordnumber]]);
339 			}
340 		} else
341 			puts("You must be a looney.");
342 	}
343 	return (firstnumber);
344 }
345