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