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