xref: /dflybsd-src/games/battlestar/command3.c (revision 4318c66eac379e15105fe145d406dfef81b795f6)
1*4318c66eSSascha Wildner /*	@(#)com3.c	8.2 (Berkeley) 4/28/95			*/
2*4318c66eSSascha Wildner /*	$NetBSD: command3.c,v 1.5 2019/02/03 03:19:25 mrg Exp $	*/
3*4318c66eSSascha Wildner 
4*4318c66eSSascha Wildner /*
5937f07e0SSascha Wildner  * Copyright (c) 1983, 1993
6937f07e0SSascha Wildner  *	The Regents of the University of California.  All rights reserved.
7937f07e0SSascha Wildner  *
8937f07e0SSascha Wildner  * Redistribution and use in source and binary forms, with or without
9937f07e0SSascha Wildner  * modification, are permitted provided that the following conditions
10937f07e0SSascha Wildner  * are met:
11937f07e0SSascha Wildner  * 1. Redistributions of source code must retain the above copyright
12937f07e0SSascha Wildner  *    notice, this list of conditions and the following disclaimer.
13937f07e0SSascha Wildner  * 2. Redistributions in binary form must reproduce the above copyright
14937f07e0SSascha Wildner  *    notice, this list of conditions and the following disclaimer in the
15937f07e0SSascha Wildner  *    documentation and/or other materials provided with the distribution.
16937f07e0SSascha Wildner  * 3. Neither the name of the University nor the names of its contributors
17937f07e0SSascha Wildner  *    may be used to endorse or promote products derived from this software
18937f07e0SSascha Wildner  *    without specific prior written permission.
19937f07e0SSascha Wildner  *
20937f07e0SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21937f07e0SSascha Wildner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22937f07e0SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23937f07e0SSascha Wildner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24937f07e0SSascha Wildner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25937f07e0SSascha Wildner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26937f07e0SSascha Wildner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27937f07e0SSascha Wildner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28937f07e0SSascha Wildner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29937f07e0SSascha Wildner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30937f07e0SSascha Wildner  * SUCH DAMAGE.
31937f07e0SSascha Wildner  */
32937f07e0SSascha Wildner 
33*4318c66eSSascha Wildner #include "extern.h"
34937f07e0SSascha Wildner 
35937f07e0SSascha Wildner void
dig(void)36937f07e0SSascha Wildner dig(void)
37937f07e0SSascha Wildner {
38937f07e0SSascha Wildner 	if (testbit(inven, SHOVEL)) {
39937f07e0SSascha Wildner 		puts("OK");
40*4318c66eSSascha Wildner 		ourtime++;
41937f07e0SSascha Wildner 		switch (position) {
42937f07e0SSascha Wildner 		case 144:	/* copse near beach */
43937f07e0SSascha Wildner 			if (!notes[DUG]) {
44937f07e0SSascha Wildner 				setbit(location[position].objects, DEADWOOD);
45937f07e0SSascha Wildner 				setbit(location[position].objects, COMPASS);
46937f07e0SSascha Wildner 				setbit(location[position].objects, KNIFE);
47937f07e0SSascha Wildner 				setbit(location[position].objects, MACE);
48937f07e0SSascha Wildner 				notes[DUG] = 1;
49937f07e0SSascha Wildner 			}
50937f07e0SSascha Wildner 			break;
51937f07e0SSascha Wildner 
52937f07e0SSascha Wildner 		default:
53937f07e0SSascha Wildner 			puts("Nothing happens.");
54937f07e0SSascha Wildner 		}
55937f07e0SSascha Wildner 	} else
56937f07e0SSascha Wildner 		puts("You don't have a shovel.");
57937f07e0SSascha Wildner }
58937f07e0SSascha Wildner 
59937f07e0SSascha Wildner int
jump(void)60937f07e0SSascha Wildner jump(void)
61937f07e0SSascha Wildner {
62937f07e0SSascha Wildner 	int     n;
63937f07e0SSascha Wildner 
64937f07e0SSascha Wildner 	switch (position) {
65937f07e0SSascha Wildner 	default:
66937f07e0SSascha Wildner 		puts("Nothing happens.");
67937f07e0SSascha Wildner 		return (-1);
68937f07e0SSascha Wildner 
69937f07e0SSascha Wildner 	case 242:
70937f07e0SSascha Wildner 		position = 133;
71937f07e0SSascha Wildner 		break;
72937f07e0SSascha Wildner 	case 214:
73937f07e0SSascha Wildner 	case 215:
74937f07e0SSascha Wildner 	case 162:
75937f07e0SSascha Wildner 	case 159:
76937f07e0SSascha Wildner 		position = 145;
77937f07e0SSascha Wildner 		break;
78937f07e0SSascha Wildner 	case 232:
79*4318c66eSSascha Wildner 		position = FINAL;
80937f07e0SSascha Wildner 		break;
81937f07e0SSascha Wildner 	case 3:
82937f07e0SSascha Wildner 		position = 1;
83937f07e0SSascha Wildner 		break;
84937f07e0SSascha Wildner 	case 172:
85937f07e0SSascha Wildner 		position = 201;
86937f07e0SSascha Wildner 	}
87937f07e0SSascha Wildner 	puts("Ahhhhhhh...");
88937f07e0SSascha Wildner 	injuries[12] = injuries[8] = injuries[7] = injuries[6] = 1;
89937f07e0SSascha Wildner 	for (n = 0; n < NUMOFOBJECTS; n++)
90937f07e0SSascha Wildner 		if (testbit(inven, n)) {
91937f07e0SSascha Wildner 			clearbit(inven, n);
92937f07e0SSascha Wildner 			setbit(location[position].objects, n);
93937f07e0SSascha Wildner 		}
94937f07e0SSascha Wildner 	carrying = 0;
95937f07e0SSascha Wildner 	encumber = 0;
96937f07e0SSascha Wildner 	return (0);
97937f07e0SSascha Wildner }
98937f07e0SSascha Wildner 
99937f07e0SSascha Wildner void
bury(void)100937f07e0SSascha Wildner bury(void)
101937f07e0SSascha Wildner {
102937f07e0SSascha Wildner 	int     value;
103937f07e0SSascha Wildner 
104937f07e0SSascha Wildner 	if (testbit(inven, SHOVEL)) {
105937f07e0SSascha Wildner 		while (wordtype[++wordnumber] != OBJECT &&
106937f07e0SSascha Wildner 		    wordtype[wordnumber] != NOUNS && wordnumber < wordcount)
107*4318c66eSSascha Wildner 			continue;
108937f07e0SSascha Wildner 		value = wordvalue[wordnumber];
109937f07e0SSascha Wildner 		if (wordtype[wordnumber] == NOUNS &&
110937f07e0SSascha Wildner 		    (testbit(location[position].objects, value) ||
111937f07e0SSascha Wildner 		    value == BODY))
112937f07e0SSascha Wildner 			switch (value) {
113937f07e0SSascha Wildner 			case BODY:
114937f07e0SSascha Wildner 				wordtype[wordnumber] = OBJECT;
115937f07e0SSascha Wildner 				if (testbit(inven, MAID) ||
116937f07e0SSascha Wildner 				    testbit(location[position].objects, MAID))
117937f07e0SSascha Wildner 					value = MAID;
118937f07e0SSascha Wildner 				if (testbit(inven, DEADWOOD) ||
119937f07e0SSascha Wildner 				    testbit(location[position].objects,
120937f07e0SSascha Wildner 					DEADWOOD))
121937f07e0SSascha Wildner 					value = DEADWOOD;
122937f07e0SSascha Wildner 				if (testbit(inven, DEADGOD) ||
123937f07e0SSascha Wildner 				    testbit(location[position].objects,
124937f07e0SSascha Wildner 					DEADGOD))
125937f07e0SSascha Wildner 					value = DEADGOD;
126937f07e0SSascha Wildner 				if (testbit(inven, DEADTIME) ||
127937f07e0SSascha Wildner 				    testbit(location[position].objects,
128937f07e0SSascha Wildner 					DEADTIME))
129937f07e0SSascha Wildner 					value = DEADTIME;
130937f07e0SSascha Wildner 				if (testbit(inven, DEADNATIVE) ||
131937f07e0SSascha Wildner 				    testbit(location[position].objects,
132937f07e0SSascha Wildner 					DEADNATIVE))
133937f07e0SSascha Wildner 					value = DEADNATIVE;
134937f07e0SSascha Wildner 				break;
135937f07e0SSascha Wildner 
136937f07e0SSascha Wildner 			case NATIVE:
137937f07e0SSascha Wildner 			case NORMGOD:
138*4318c66eSSascha Wildner 				printf("She screams as you wrestle her into ");
139*4318c66eSSascha Wildner 				puts("the hole.");
14013fca3dfSzrj 				/* FALLTHROUGH */
141937f07e0SSascha Wildner 			case TIMER:
142937f07e0SSascha Wildner 				power += 7;
143937f07e0SSascha Wildner 				ego -= 10;
14413fca3dfSzrj 				/* FALLTHROUGH */
145937f07e0SSascha Wildner 			case AMULET:
146937f07e0SSascha Wildner 			case MEDALION:
147937f07e0SSascha Wildner 			case TALISMAN:
148937f07e0SSascha Wildner 				wordtype[wordnumber] = OBJECT;
149937f07e0SSascha Wildner 				break;
150937f07e0SSascha Wildner 
151937f07e0SSascha Wildner 			default:
152937f07e0SSascha Wildner 				puts("Wha..?");
153937f07e0SSascha Wildner 			}
154937f07e0SSascha Wildner 		if (wordtype[wordnumber] == OBJECT && position > 88 &&
155937f07e0SSascha Wildner 		    (testbit(inven, value) ||
156937f07e0SSascha Wildner 		    testbit(location[position].objects, value))) {
157937f07e0SSascha Wildner 			puts("Buried.");
158937f07e0SSascha Wildner 			if (testbit(inven, value)) {
159937f07e0SSascha Wildner 				clearbit(inven, value);
160937f07e0SSascha Wildner 				carrying -= objwt[value];
161937f07e0SSascha Wildner 				encumber -= objcumber[value];
162937f07e0SSascha Wildner 			}
163937f07e0SSascha Wildner 			clearbit(location[position].objects, value);
164937f07e0SSascha Wildner 			switch (value) {
165937f07e0SSascha Wildner 			case MAID:
166937f07e0SSascha Wildner 			case DEADWOOD:
167937f07e0SSascha Wildner 			case DEADNATIVE:
168937f07e0SSascha Wildner 			case DEADTIME:
169937f07e0SSascha Wildner 			case DEADGOD:
170937f07e0SSascha Wildner 				ego += 2;
171937f07e0SSascha Wildner 				printf("The %s should rest easier now.\n",
172937f07e0SSascha Wildner 				    objsht[value]);
173937f07e0SSascha Wildner 			}
174937f07e0SSascha Wildner 		} else
175937f07e0SSascha Wildner 			puts("It doesn't seem to work.");
176937f07e0SSascha Wildner 	} else
177937f07e0SSascha Wildner 		puts("You aren't holding a shovel.");
178937f07e0SSascha Wildner }
179937f07e0SSascha Wildner 
180937f07e0SSascha Wildner void
drink(void)181937f07e0SSascha Wildner drink(void)
182937f07e0SSascha Wildner {
183937f07e0SSascha Wildner 	int     n;
184937f07e0SSascha Wildner 
185937f07e0SSascha Wildner 	if (testbit(inven, POTION)) {
186*4318c66eSSascha Wildner 		printf("The cool liquid runs down your throat but turns to ");
187*4318c66eSSascha Wildner 		puts("fire and you choke.");
188*4318c66eSSascha Wildner 		printf("The heat reaches your limbs and tingles your spirit.");
189*4318c66eSSascha Wildner 		puts("  You feel like falling");
190937f07e0SSascha Wildner 		puts("asleep.");
191937f07e0SSascha Wildner 		clearbit(inven, POTION);
192937f07e0SSascha Wildner 		WEIGHT = MAXWEIGHT;
193937f07e0SSascha Wildner 		CUMBER = MAXCUMBER;
194937f07e0SSascha Wildner 		for (n = 0; n < NUMOFINJURIES; n++)
195937f07e0SSascha Wildner 			injuries[n] = 0;
196*4318c66eSSascha Wildner 		ourtime++;
197937f07e0SSascha Wildner 		zzz();
198937f07e0SSascha Wildner 	} else
199937f07e0SSascha Wildner 		puts("I'm not thirsty.");
200937f07e0SSascha Wildner }
201937f07e0SSascha Wildner 
202937f07e0SSascha Wildner int
shoot(void)203937f07e0SSascha Wildner shoot(void)
204937f07e0SSascha Wildner {
205937f07e0SSascha Wildner 	int     firstnumber, value;
206937f07e0SSascha Wildner 
207937f07e0SSascha Wildner 	firstnumber = wordnumber;
208937f07e0SSascha Wildner 	if (!testbit(inven, LASER))
209937f07e0SSascha Wildner 		puts("You aren't holding a blaster.");
210937f07e0SSascha Wildner 	else {
211*4318c66eSSascha Wildner 		wordnumber++;
212937f07e0SSascha Wildner 		while (wordnumber <= wordcount &&
213937f07e0SSascha Wildner 		    wordtype[wordnumber] == OBJECT) {
214937f07e0SSascha Wildner 			value = wordvalue[wordnumber];
215937f07e0SSascha Wildner 			printf("%s:\n", objsht[value]);
216937f07e0SSascha Wildner 			if (testbit(location[position].objects, value)) {
217937f07e0SSascha Wildner 				clearbit(location[position].objects, value);
218*4318c66eSSascha Wildner 				ourtime++;
219937f07e0SSascha Wildner 				printf("The %s explode%s\n", objsht[value],
220*4318c66eSSascha Wildner 				    (is_plural_object(value) ? "." : "s."));
221937f07e0SSascha Wildner 				if (value == BOMB)
222*4318c66eSSascha Wildner 					die();
223937f07e0SSascha Wildner 			} else
224*4318c66eSSascha Wildner 				printf("I don't see any %s around here.\n",
225937f07e0SSascha Wildner 				    objsht[value]);
226937f07e0SSascha Wildner 			if (wordnumber < wordcount - 1 &&
227937f07e0SSascha Wildner 			    wordvalue[++wordnumber] == AND)
228937f07e0SSascha Wildner 				wordnumber++;
229937f07e0SSascha Wildner 			else
230937f07e0SSascha Wildner 				return (firstnumber);
231937f07e0SSascha Wildner 		}
232937f07e0SSascha Wildner 		/* special cases with their own return()'s */
233937f07e0SSascha Wildner 
234937f07e0SSascha Wildner 		if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS) {
235*4318c66eSSascha Wildner 			ourtime++;
236937f07e0SSascha Wildner 			switch (wordvalue[wordnumber]) {
237*4318c66eSSascha Wildner 
238937f07e0SSascha Wildner 			case DOOR:
239937f07e0SSascha Wildner 				switch (position) {
240937f07e0SSascha Wildner 				case 189:
241937f07e0SSascha Wildner 				case 231:
242937f07e0SSascha Wildner 					puts("The door is unhinged.");
243937f07e0SSascha Wildner 					location[189].north = 231;
244937f07e0SSascha Wildner 					location[231].south = 189;
245937f07e0SSascha Wildner 					whichway(location[position]);
246937f07e0SSascha Wildner 					break;
247937f07e0SSascha Wildner 				case 30:
248937f07e0SSascha Wildner 					puts("The wooden door splinters.");
249937f07e0SSascha Wildner 					location[30].west = 25;
250937f07e0SSascha Wildner 					whichway(location[position]);
251937f07e0SSascha Wildner 					break;
252937f07e0SSascha Wildner 				case 31:
253*4318c66eSSascha Wildner 					printf("The laser blast has no ");
254*4318c66eSSascha Wildner 					puts("effect on the door.");
255937f07e0SSascha Wildner 					break;
256937f07e0SSascha Wildner 				case 20:
257*4318c66eSSascha Wildner 					printf("The blast hits the door and ");
258*4318c66eSSascha Wildner 					printf("it explodes into flame.  The ");
259*4318c66eSSascha Wildner 					puts("magnesium burns");
260*4318c66eSSascha Wildner 					printf("so rapidly that we have no ");
261*4318c66eSSascha Wildner 					puts("chance to escape.");
262*4318c66eSSascha Wildner 					die();
263937f07e0SSascha Wildner 				default:
264937f07e0SSascha Wildner 					puts("Nothing happens.");
265937f07e0SSascha Wildner 				}
266937f07e0SSascha Wildner 				break;
267937f07e0SSascha Wildner 
268937f07e0SSascha Wildner 			case NORMGOD:
269937f07e0SSascha Wildner 				if (testbit(location[position].objects,
270937f07e0SSascha Wildner 				    BATHGOD)) {
271*4318c66eSSascha Wildner 					printf("The goddess is hit in the ");
272*4318c66eSSascha Wildner 					printf("chest and splashes back ");
273*4318c66eSSascha Wildner 					puts("against the rocks.");
274*4318c66eSSascha Wildner 					printf("Dark blood oozes from the ");
275*4318c66eSSascha Wildner 					printf("charred blast hole.  Her ");
276*4318c66eSSascha Wildner 					puts("naked body floats in the");
277937f07e0SSascha Wildner 					puts("pools and then off downstream.");
278937f07e0SSascha Wildner 					clearbit(location[position].objects,
279937f07e0SSascha Wildner 					    BATHGOD);
280937f07e0SSascha Wildner 					setbit(location[180].objects, DEADGOD);
281937f07e0SSascha Wildner 					power += 5;
282937f07e0SSascha Wildner 					ego -= 10;
283937f07e0SSascha Wildner 					notes[JINXED]++;
284937f07e0SSascha Wildner 				} else
285937f07e0SSascha Wildner 					if (testbit(location[position].objects,
286937f07e0SSascha Wildner 					    NORMGOD)) {
287*4318c66eSSascha Wildner 						printf("The blast catches ");
288*4318c66eSSascha Wildner 						printf("the goddess in the ");
289*4318c66eSSascha Wildner 						printf("stomach, knocking ");
290*4318c66eSSascha Wildner 						puts("her to the ground.");
291*4318c66eSSascha Wildner 						printf("She writhes in the ");
292*4318c66eSSascha Wildner 						printf("dirt as the agony of ");
293*4318c66eSSascha Wildner 						puts("death taunts her.");
294937f07e0SSascha Wildner 						puts("She has stopped moving.");
295937f07e0SSascha Wildner 						clearbit(location[position].objects, NORMGOD);
296937f07e0SSascha Wildner 						setbit(location[position].objects, DEADGOD);
297937f07e0SSascha Wildner 						power += 5;
298937f07e0SSascha Wildner 						ego -= 10;
299937f07e0SSascha Wildner 						notes[JINXED]++;
300937f07e0SSascha Wildner 						if (wintime)
301937f07e0SSascha Wildner 							live();
302937f07e0SSascha Wildner 						break;
303*4318c66eSSascha Wildner 					} else {
304*4318c66eSSascha Wildner 						printf("I don't see any ");
305*4318c66eSSascha Wildner 						puts("goddess around here.");
306*4318c66eSSascha Wildner 					}
307937f07e0SSascha Wildner 				break;
308937f07e0SSascha Wildner 
309937f07e0SSascha Wildner 			case TIMER:
310937f07e0SSascha Wildner 				if (testbit(location[position].objects,
311937f07e0SSascha Wildner 				    TIMER)) {
312*4318c66eSSascha Wildner 					printf("The old man slumps over ");
313*4318c66eSSascha Wildner 					puts("the bar.");
314937f07e0SSascha Wildner 					power++;
315937f07e0SSascha Wildner 					ego -= 2;
316937f07e0SSascha Wildner 					notes[JINXED]++;
317937f07e0SSascha Wildner 					clearbit(location[position].objects,
318937f07e0SSascha Wildner 					    TIMER);
319937f07e0SSascha Wildner 					setbit(location[position].objects,
320937f07e0SSascha Wildner 					    DEADTIME);
321937f07e0SSascha Wildner 				} else
322*4318c66eSSascha Wildner 					puts("What old-timer?");
323937f07e0SSascha Wildner 				break;
324937f07e0SSascha Wildner 			case MAN:
325937f07e0SSascha Wildner 				if (testbit(location[position].objects, MAN)) {
326*4318c66eSSascha Wildner 					printf("The man falls to the ground ");
327*4318c66eSSascha Wildner 					printf("with blood pouring all over ");
328*4318c66eSSascha Wildner 					puts("his white suit.");
329937f07e0SSascha Wildner 					puts("Your fantasy is over.");
330*4318c66eSSascha Wildner 					die();
331937f07e0SSascha Wildner 				} else
332937f07e0SSascha Wildner 					puts("What man?");
333937f07e0SSascha Wildner 				break;
334937f07e0SSascha Wildner 			case NATIVE:
335937f07e0SSascha Wildner 				if (testbit(location[position].objects,
336937f07e0SSascha Wildner 				    NATIVE)) {
337*4318c66eSSascha Wildner 					printf("The girl is blown backwards ");
338*4318c66eSSascha Wildner 					printf("several feet and lies in a ");
339*4318c66eSSascha Wildner 					puts("pool of blood.");
340937f07e0SSascha Wildner 					clearbit(location[position].objects,
341937f07e0SSascha Wildner 					    NATIVE);
342937f07e0SSascha Wildner 					setbit(location[position].objects,
343937f07e0SSascha Wildner 					    DEADNATIVE);
344937f07e0SSascha Wildner 					power += 5;
345937f07e0SSascha Wildner 					ego -= 2;
346937f07e0SSascha Wildner 					notes[JINXED]++;
347937f07e0SSascha Wildner 				} else
348937f07e0SSascha Wildner 					puts("There is no girl here.");
349937f07e0SSascha Wildner 				break;
350937f07e0SSascha Wildner 			case -1:
351937f07e0SSascha Wildner 				puts("Shoot what?");
352937f07e0SSascha Wildner 				break;
353937f07e0SSascha Wildner 
354937f07e0SSascha Wildner 			default:
355937f07e0SSascha Wildner 				printf("You can't shoot the %s.\n",
356937f07e0SSascha Wildner 				    objsht[wordvalue[wordnumber]]);
357937f07e0SSascha Wildner 			}
358937f07e0SSascha Wildner 		} else
359937f07e0SSascha Wildner 			puts("You must be a looney.");
360937f07e0SSascha Wildner 	}
361937f07e0SSascha Wildner 	return (firstnumber);
362937f07e0SSascha Wildner }
363