1 /* @(#)com5.c 8.2 (Berkeley) 4/28/95 */
2 /* $NetBSD: command5.c,v 1.5 2014/03/22 23:31:28 dholland 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 void
kiss(void)36 kiss(void)
37 {
38 while (wordtype[++wordnumber] != NOUNS && wordnumber <= wordcount)
39 continue;
40 /* The goddess must be "taken" first if bathing. */
41 if (wordtype[wordnumber] == NOUNS && wordvalue[wordnumber] == NORMGOD
42 && testbit(location[position].objects, BATHGOD)) {
43 wordvalue[--wordnumber] = TAKE;
44 cypher();
45 return;
46 }
47 if (wordtype[wordnumber] == NOUNS) {
48 if (testbit(location[position].objects,
49 wordvalue[wordnumber])) {
50 pleasure++;
51 printf("Kissed.\n");
52 switch (wordvalue[wordnumber]) {
53 case NORMGOD:
54 switch (godready++) {
55 case 0:
56 printf("She squirms and avoids your ");
57 puts("advances.");
58 break;
59 case 1:
60 puts("She is coming around; she ");
61 puts("didn't fight it as much.");
62 break;
63 case 2:
64 puts("She's beginning to like it.");
65 break;
66 default:
67 puts("She's gone limp.");
68
69 }
70 break;
71 case NATIVE:
72 printf("Her lips are warm and her body ");
73 printf("robust. She pulls you down to ");
74 puts("the ground.");
75 break;
76 case TIMER:
77 puts("The old man blushes.");
78 break;
79 case MAN:
80 puts("The dwarf punches you in the kneecap.");
81 break;
82 default:
83 pleasure--;
84 }
85 } else
86 puts("I see nothing like that here.");
87 } else
88 puts("I'd prefer not to.");
89 }
90
91 void
love(void)92 love(void)
93 {
94 int n;
95
96 while (wordtype[++wordnumber] != NOUNS && wordnumber <= wordcount)
97 continue;
98 if (wordtype[wordnumber] == NOUNS) {
99 if ((testbit(location[position].objects, BATHGOD) ||
100 testbit(location[position].objects, NORMGOD)) &&
101 wordvalue[wordnumber] == NORMGOD) {
102 if (loved) {
103 printf("Loved.\n");
104 return;
105 }
106 if (godready >= 2) {
107 printf("She cuddles up to you, and her mouth ");
108 printf("starts to work:\n'That was my ");
109 printf("sister's amulet. The lovely ");
110 printf("goddess, Purl, was she. The Empire\n");
111 printf("captured her just after the Darkness ");
112 printf("came. My other sister, Vert, was ");
113 printf("killed\nby the Dark Lord himself. ");
114 printf("He took her amulet and warped its ");
115 printf("power.\nYour quest was foretold by ");
116 printf("my father before he died, but to get ");
117 printf("the Dark Lord's\namulet you must use ");
118 printf("cunning and skill. I will leave you ");
119 puts("my amulet,");
120 printf("which you may use as you wish. As ");
121 printf("for me, I am the last goddess of ");
122 printf("the\nwaters. My father was the ");
123 printf("Island King, and the rule is ");
124 printf("rightfully mine.'\n\nShe pulls the ");
125 puts("throne out into a large bed.");
126 power++;
127 pleasure += 15;
128 ego++;
129 if (card(injuries, NUMOFINJURIES)) {
130 printf("Her kisses revive you; your ");
131 printf("wounds are healed.\n");
132 for (n = 0; n < NUMOFINJURIES; n++)
133 injuries[n] = 0;
134 WEIGHT = MAXWEIGHT;
135 CUMBER = MAXCUMBER;
136 }
137 printf("Goddess:\n");
138 if (!loved)
139 setbit(location[position].objects,
140 MEDALION);
141 loved = 1;
142 ourtime += 10;
143 printf("Loved.\n");
144 zzz();
145 return;
146 } else {
147 puts("You wish!");
148 return;
149 }
150 }
151 if (testbit(location[position].objects,
152 wordvalue[wordnumber])) {
153 if (wordvalue[wordnumber] == NATIVE) {
154 printf("The girl is easy prey. She peels ");
155 puts("off her sarong and indulges you.");
156 power++;
157 pleasure += 5;
158 printf("Girl:\n");
159 ourtime += 10;
160 printf("Loved.\n");
161 zzz();
162 }
163 if (wordvalue[wordnumber] == MAN ||
164 wordvalue[wordnumber] == BODY ||
165 wordvalue[wordnumber] == ELF ||
166 wordvalue[wordnumber] == TIMER)
167 puts("Kinky!");
168 else
169 puts("It doesn't seem to work.");
170 } else
171 puts("Where's your lover?");
172 } else
173 puts("It doesn't seem to work.");
174 }
175
176 int
zzz(void)177 zzz(void)
178 {
179 int oldtime;
180 int n;
181 int zzztime;
182
183 zzztime = (3 * CYCLE) / 4;
184
185 oldtime = ourtime;
186 if ((snooze - ourtime) < zzztime) {
187 ourtime += zzztime - (snooze - ourtime);
188 printf("<zzz>");
189 for (n = 0; n < ourtime - oldtime; n++)
190 printf(".");
191 printf("\n");
192 snooze += 3 * (ourtime - oldtime);
193 if (notes[LAUNCHED]) {
194 fuel -= (ourtime - oldtime);
195 if (location[position].down) {
196 position = location[position].down;
197 crash();
198 } else
199 notes[LAUNCHED] = 0;
200 }
201 if (OUTSIDE && rnd(100) < 50) {
202 printf("You are awakened abruptly by the sound ");
203 puts("of someone nearby.");
204 switch (rnd(4)) {
205 case 0:
206 if (ucard(inven)) {
207 n = rnd(NUMOFOBJECTS);
208 while (!testbit(inven, n))
209 n = rnd(NUMOFOBJECTS);
210 clearbit(inven, n);
211 if (n != AMULET && n != MEDALION &&
212 n != TALISMAN)
213 setbit(
214 location[position].objects,
215 n);
216 carrying -= objwt[n];
217 encumber -= objcumber[n];
218 }
219 printf("A fiendish little Elf is stealing ");
220 puts("your treasures!");
221 fight(ELF, 10);
222 break;
223 case 1:
224 setbit(location[position].objects, DEADWOOD);
225 break;
226 case 2:
227 setbit(location[position].objects, HALBERD);
228 break;
229 default:
230 break;
231 }
232 }
233 } else
234 return (0);
235 return (1);
236 }
237
238 void
chime(void)239 chime(void)
240 {
241 if ((ourtime / CYCLE + 1) % 2 && OUTSIDE)
242 switch ((ourtime % CYCLE) / (CYCLE / 7)) {
243 case 0:
244 puts("It is just after sunrise.");
245 break;
246 case 1:
247 puts("It is early morning.");
248 break;
249 case 2:
250 puts("It is late morning.");
251 break;
252 case 3:
253 puts("It is near noon.");
254 break;
255 case 4:
256 puts("It is early afternoon.");
257 break;
258 case 5:
259 puts("It is late afternoon.");
260 break;
261 case 6:
262 puts("It is near sunset.");
263 break;
264 }
265 else if (OUTSIDE)
266 switch ((ourtime % CYCLE) / (CYCLE / 7)) {
267 case 0:
268 puts("It is just after sunset.");
269 break;
270 case 1:
271 puts("It is early evening.");
272 break;
273 case 2:
274 puts("The evening is getting old.");
275 break;
276 case 3:
277 puts("It is near midnight.");
278 break;
279 case 4:
280 puts("These are the wee hours of the morning.");
281 break;
282 case 5:
283 puts("The night is waning.");
284 break;
285 case 6:
286 puts("It is almost morning.");
287 break;
288 }
289 else
290 puts("I can't tell the time in here.");
291 }
292
293 int
give(void)294 give(void)
295 {
296 int obj = -1, result = -1, person = 0, firstnumber, last1, last2;
297
298 last1 = last2 = 0;
299 firstnumber = wordnumber;
300 while (wordtype[++wordnumber] != OBJECT &&
301 wordvalue[wordnumber] != AMULET &&
302 wordvalue[wordnumber] != MEDALION &&
303 wordvalue[wordnumber] != TALISMAN && wordnumber <= wordcount)
304 continue;
305 if (wordnumber <= wordcount) {
306 obj = wordvalue[wordnumber];
307 if (obj == EVERYTHING)
308 wordtype[wordnumber] = -1;
309 last1 = wordnumber;
310 }
311 wordnumber = firstnumber;
312 while ((wordtype[++wordnumber] != NOUNS ||
313 wordvalue[wordnumber] == obj) && wordnumber <= wordcount);
314 if (wordtype[wordnumber] == NOUNS) {
315 person = wordvalue[wordnumber];
316 last2 = wordnumber;
317 }
318 /* Setting wordnumber to last1 - 1 looks wrong if last1 is 0, e.g.,
319 * plain `give'. However, detecting this case is liable to detect
320 * `give foo' as well, which would give a confusing error. We
321 * need to make sure the -1 value can cause no problems if it arises.
322 * If in the below we get to the drop("Given") then drop will look
323 * at word 0 for an object to give, and fail, which is OK; then
324 * result will be -1 and we get to the end, where wordnumber gets
325 * set to something more sensible. If we get to "I don't think
326 * that is possible" then again wordnumber is set to something
327 * sensible. The wordnumber we leave with still isn't right if
328 * you include words the game doesn't know in your command, but
329 * that's no worse than what other commands than give do in
330 * the same place. */
331 wordnumber = last1 - 1;
332 if (person && testbit(location[position].objects, person)) {
333 if (person == NORMGOD && godready < 2 &&
334 !(obj == RING || obj == BRACELET))
335 puts("The goddess won't look at you.");
336 else
337 result = drop("Given");
338 } else {
339 puts("I don't think that is possible.");
340 wordnumber = max(last1, last2) + 1;
341 return (0);
342 }
343 if (result != -1 && (testbit(location[position].objects, obj) ||
344 obj == AMULET || obj == MEDALION || obj == TALISMAN)) {
345 clearbit(location[position].objects, obj);
346 ourtime++;
347 ego++;
348 switch (person) {
349 case NATIVE:
350 puts("She accepts it shyly.");
351 ego += 2;
352 break;
353 case NORMGOD:
354 if (obj == RING || obj == BRACELET) {
355 printf("She takes the charm and puts it on.");
356 puts(" A little kiss on the cheek is");
357 puts("your reward.");
358 ego += 5;
359 godready += 3;
360 }
361 if (obj == AMULET || obj == MEDALION ||
362 obj == TALISMAN) {
363 win++;
364 ego += 5;
365 power -= 5;
366 if (win >= 3) {
367 printf("The powers of the earth are ");
368 printf("now legitimate. You have ");
369 puts("destroyed the Darkness");
370 printf("and restored the goddess to ");
371 printf("her throne. The entire ");
372 puts("island celebrates with");
373 printf("dancing and spring feasts. ");
374 printf("As a measure of her ");
375 puts("gratitude, the goddess weds you");
376 printf("in the late summer and ");
377 printf("crowns you Prince Liverwort, ");
378 puts("Lord of Fungus.");
379 printf("\nBut, as the year wears on ");
380 printf("and autumn comes along, you ");
381 puts("become restless and");
382 printf("yearn for adventure. The ");
383 printf("goddess, too, realizes that ");
384 puts("the marriage can't last.");
385 printf("She becomes bored and takes ");
386 printf("several more natives as ");
387 puts("husbands. One evening,");
388 printf("after having been out ");
389 printf("drinking with the girls, she ");
390 puts("kicks the throne particularly");
391 printf("hard and wakes you up. (If ");
392 printf("you want to win this game, ");
393 printf("you're going to have to\n");
394 puts("shoot her!)");
395 clearbit(location[position].objects,
396 MEDALION);
397 wintime = ourtime;
398 }
399 }
400 break;
401 case TIMER:
402 if (obj == COINS) {
403 printf("He fingers the coins for a moment ");
404 printf("and then looks up agape. `Kind you ");
405 puts("are and");
406 printf("I mean to repay you as best I can.' ");
407 printf("Grabbing a pencil and cocktail ");
408 puts("napkin...\n");
409 printf("+-----------------------------------");
410 printf("------------------------------------");
411 printf("------+\n");
412 printf("| xxxxxxxx\\ |\n");
413 printf("| xxxxx\\ CLIFFS |\n");
414 printf("| FOREST xxx\\ |\n");
415 printf("| \\\\ x\\ OCEAN |\n");
416 printf("| || x\\ |\n");
417 printf("| || ROAD x\\ |\n");
418 printf("| || x\\ |\n");
419 printf("| SECRET || ......... |\n");
420 printf("| - + - || ........ |\n");
421 printf("| ENTRANCE || ... BEACH |\n");
422 printf("| || ... E |\n");
423 printf("| || ... | |\n");
424 printf("| // ... N <-- + --- S |\n");
425 printf("| PALM GROVE // ... | |\n");
426 printf("| // ... W |\n");
427 printf("+");
428 printf("---------------------------------");
429 printf("---------------------------------");
430 printf("-----------+\n");
431 printf("\n`This map shows a secret entrance ");
432 puts("to the catacombs.");
433 printf("You will know when you arrive ");
434 printf("because I left an old pair of shoes ");
435 puts("there.'");
436 }
437 break;
438 }
439 }
440 wordnumber = max(last1, last2) + 1;
441 return (firstnumber);
442 }
443