1 /* @(#)com2.c 8.2 (Berkeley) 4/28/95 */
2 /* $NetBSD: command2.c,v 1.4 2019/02/03 03:19:25 mrg Exp $ */
3
4 /*
5 * Copyright (c) 1983, 1993
6 * The Regents of the University of California. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the University nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33 #include "extern.h"
34
35 int
wearit(void)36 wearit(void)
37 { /* synonyms = {sheathe, sheath} */
38 int firstnumber, value;
39
40 firstnumber = wordnumber;
41 wordnumber++;
42 while (wordnumber <= wordcount && (wordtype[wordnumber] == OBJECT ||
43 wordtype[wordnumber] == NOUNS) && wordvalue[wordnumber] != DOOR) {
44 value = wordvalue[wordnumber];
45 if (value >= 0 && objsht[value] == NULL)
46 break;
47 switch (value) {
48
49 case -1:
50 puts("Wear what?");
51 return (firstnumber);
52
53 default:
54 printf("You can't wear %s%s!\n",
55 A_OR_AN_OR_BLANK(value), objsht[value]);
56 return (firstnumber);
57
58 case KNIFE:
59 /* case SHIRT: */
60 case ROBE:
61 case LEVIS: /* wearable things */
62 case SWORD:
63 case MAIL:
64 case HELM:
65 case SHOES:
66 case PAJAMAS:
67 case COMPASS:
68 case LASER:
69 case AMULET:
70 case TALISMAN:
71 case MEDALION:
72 case ROPE:
73 case RING:
74 case BRACELET:
75 case GRENADE:
76
77 if (testbit(inven, value)) {
78 clearbit(inven, value);
79 setbit(wear, value);
80 carrying -= objwt[value];
81 encumber -= objcumber[value];
82 ourtime++;
83 printf("You are now wearing %s%s.\n",
84 A_OR_AN_OR_THE(value), objsht[value]);
85 } else
86 if (testbit(wear, value)) {
87 printf("You are already wearing the %s",
88 objsht[value]);
89 printf(".\n");
90 } else
91 printf("You aren't holding the %s.\n",
92 objsht[value]);
93 if (wordnumber < wordcount - 1 &&
94 wordvalue[++wordnumber] == AND)
95 wordnumber++;
96 else
97 return (firstnumber);
98 } /* end switch */
99 } /* end while */
100 puts("Don't be ridiculous.");
101 return (firstnumber);
102 }
103
104 int
put(void)105 put(void)
106 { /* synonyms = {buckle, strap, tie} */
107 if (wordvalue[wordnumber + 1] == ON) {
108 wordvalue[++wordnumber] = PUTON;
109 wordtype[wordnumber] = VERB;
110 return (cypher());
111 }
112 if (wordvalue[wordnumber + 1] == DOWN) {
113 wordvalue[++wordnumber] = DROP;
114 wordtype[wordnumber] = VERB;
115 return (cypher());
116 }
117 puts("I don't understand what you want to put.");
118 return (-1);
119
120 }
121
122 int
draw(void)123 draw(void)
124 { /* synonyms = {pull, carry} */
125 return (take(wear));
126 }
127
128 int
use(void)129 use(void)
130 {
131 wordnumber++;
132 if (wordvalue[wordnumber] == AMULET && testbit(inven, AMULET) &&
133 position != FINAL) {
134 puts("The amulet begins to glow.");
135 if (testbit(inven, MEDALION)) {
136 puts("The medallion comes to life too.");
137 if (position == 114) {
138 location[position].down = 160;
139 whichway(location[position]);
140 printf("The waves subside and it is possible ");
141 puts("to descend to the sea cave now.");
142 ourtime++;
143 return (-1);
144 }
145 }
146 printf("A light mist falls over your eyes and the sound of ");
147 puts("purling water trickles in");
148 printf("your ears. When the mist lifts you are standing ");
149 puts("beside a cool stream.");
150 if (position == 229)
151 position = 224;
152 else
153 position = 229;
154 ourtime++;
155 notes[CANTSEE] = 0;
156 return (0);
157 } else if (position == FINAL)
158 puts("The amulet won't work in here.");
159 else if (wordvalue[wordnumber] == COMPASS && testbit(inven, COMPASS))
160 printf("Your compass points %s.\n", truedirec(NORTH, '-'));
161 else if (wordvalue[wordnumber] == COMPASS)
162 puts("You aren't holding the compass.");
163 else if (wordvalue[wordnumber] == AMULET)
164 puts("You aren't holding the amulet.");
165 else
166 puts("There is no apparent use.");
167 return (-1);
168 }
169
170 void
murder(void)171 murder(void)
172 {
173 int n;
174
175 for (n = 0;
176 !((n == SWORD || n == KNIFE || n == TWO_HANDED || n == MACE ||
177 n == CLEAVER || n == BROAD || n == CHAIN || n == SHOVEL ||
178 n == HALBERD) && testbit(inven, n)) && n < NUMOFOBJECTS;
179 n++);
180 if (n == NUMOFOBJECTS) {
181 if (testbit(inven, LASER)) {
182 printf("Your laser should do the trick.\n");
183 wordnumber++;
184 switch(wordvalue[wordnumber]) {
185 case NORMGOD:
186 case TIMER:
187 case NATIVE:
188 case MAN:
189 wordvalue[--wordnumber] = SHOOT;
190 cypher();
191 break;
192 case -1:
193 puts("Kill what?");
194 break;
195 default:
196 if (wordtype[wordnumber] != OBJECT ||
197 wordvalue[wordnumber] == EVERYTHING)
198 puts("You can't kill that!");
199 else
200 printf("You can't kill %s%s!\n",
201 A_OR_AN_OR_BLANK(wordvalue[wordnumber]),
202 objsht[wordvalue[wordnumber]]);
203 break;
204 }
205 } else
206 puts("You don't have suitable weapons to kill.");
207 } else {
208 printf("Your %s should do the trick.\n", objsht[n]);
209 wordnumber++;
210 switch (wordvalue[wordnumber]) {
211
212 case NORMGOD:
213 if (testbit(location[position].objects, BATHGOD)) {
214 printf("The goddess's head slices off. Her ");
215 puts("corpse floats in the water.");
216 clearbit(location[position].objects, BATHGOD);
217 setbit(location[position].objects, DEADGOD);
218 power += 5;
219 notes[JINXED]++;
220 } else
221 if (testbit(location[position].objects,
222 NORMGOD)) {
223 printf("The goddess pleads but you ");
224 printf("strike her mercilessly. Her ");
225 printf("broken body lies in a\n");
226 puts("pool of blood.");
227 clearbit(location[position].objects,
228 NORMGOD);
229 setbit(location[position].objects,
230 DEADGOD);
231 power += 5;
232 notes[JINXED]++;
233 if (wintime)
234 live();
235 } else
236 puts("I don't see her anywhere.");
237 break;
238 case TIMER:
239 if (testbit(location[position].objects, TIMER)) {
240 puts("The old man offers no resistance.");
241 clearbit(location[position].objects, TIMER);
242 setbit(location[position].objects, DEADTIME);
243 power++;
244 notes[JINXED]++;
245 } else
246 puts("Who?");
247 break;
248 case NATIVE:
249 if (testbit(location[position].objects, NATIVE)) {
250 printf("The girl screams as you cut her ");
251 puts("body to shreds. She is dead.");
252 clearbit(location[position].objects, NATIVE);
253 setbit(location[position].objects, DEADNATIVE);
254 power += 5;
255 notes[JINXED]++;
256 } else
257 puts("What girl?");
258 break;
259 case MAN:
260 if (testbit(location[position].objects, MAN)) {
261 printf("You strike him to the ground, and ");
262 puts("he coughs up blood.");
263 puts("Your fantasy is over.");
264 die();
265 }
266 /* FALLTHROUGH */
267 case -1:
268 puts("Kill what?");
269 break;
270
271 default:
272 if (wordtype[wordnumber] != OBJECT ||
273 wordvalue[wordnumber] == EVERYTHING)
274 puts("You can't kill that!");
275 else
276 printf("You can't kill the %s!\n",
277 objsht[wordvalue[wordnumber]]);
278 }
279 }
280 }
281
282 void
ravage(void)283 ravage(void)
284 {
285 while (wordtype[++wordnumber] != NOUNS && wordnumber <= wordcount)
286 continue;
287 if (wordtype[wordnumber] == NOUNS &&
288 (testbit(location[position].objects, wordvalue[wordnumber])
289 || (wordvalue[wordnumber] == NORMGOD &&
290 testbit(location[position].objects, BATHGOD)))) {
291 ourtime++;
292 switch (wordvalue[wordnumber]) {
293 case NORMGOD:
294 printf("You attack the goddess, and she screams as ");
295 puts("you beat her. She falls down");
296 if (testbit(location[position].objects, BATHGOD)) {
297 printf("crying and tries to cover her ");
298 puts("nakedness.");
299 } else {
300 printf("crying and tries to hold her torn ");
301 puts("and bloodied dress around her.");
302 }
303 power += 5;
304 pleasure += 8;
305 ego -= 10;
306 wordnumber--;
307 godready = -30000;
308 murder();
309 win = -30000;
310 break;
311 case NATIVE:
312 printf("The girl tries to run, but you catch her and ");
313 puts("throw her down. Her face is");
314 printf("bleeding, and she screams as you tear off ");
315 puts("her clothes.");
316 power += 3;
317 pleasure += 5;
318 ego -= 10;
319 wordnumber--;
320 murder();
321 if (rnd(100) < 50) {
322 printf("Her screams have attracted ");
323 puts("attention. I think we are surrounded.");
324 setbit(location[ahead].objects, WOODSMAN);
325 setbit(location[ahead].objects, DEADWOOD);
326 setbit(location[ahead].objects, MALLET);
327 setbit(location[back].objects, WOODSMAN);
328 setbit(location[back].objects, DEADWOOD);
329 setbit(location[back].objects, MALLET);
330 setbit(location[left].objects, WOODSMAN);
331 setbit(location[left].objects, DEADWOOD);
332 setbit(location[left].objects, MALLET);
333 setbit(location[right].objects, WOODSMAN);
334 setbit(location[right].objects, DEADWOOD);
335 setbit(location[right].objects, MALLET);
336 }
337 break;
338 default:
339 puts("You are perverted.");
340 }
341 } else
342 puts("Who?");
343 }
344
345 int
follow(void)346 follow(void)
347 {
348 if (followfight == ourtime) {
349 printf("The Dark Lord leaps away and runs down secret ");
350 puts("tunnels and corridors.");
351 printf("You chase him through the darkness and splash in ");
352 puts("pools of water.");
353 printf("You have cornered him. His laser sword extends ");
354 puts("as he steps forward.");
355 position = FINAL;
356 fight(DARK, 75);
357 setbit(location[position].objects, TALISMAN);
358 setbit(location[position].objects, AMULET);
359 return (0);
360 } else
361 if (followgod == ourtime) {
362 printf("The goddess leads you down a steamy tunnel ");
363 puts("and into a high, wide chamber.");
364 puts("She sits down on a throne.");
365 position = 268;
366 setbit(location[position].objects, NORMGOD);
367 notes[CANTSEE] = 1;
368 return (0);
369 } else
370 puts("There is no one to follow.");
371 return (-1);
372 }
373