games: Massive style(9) cleanup commit. Reduces differences to NetBSD.
[dragonfly.git] / games / battlestar / com5.c
blob84c4ed992f380aaf90407ec6245b1258fff2beda
1 /*-
2 * Copyright (c) 1983, 1993
3 * The Regents of the University of California. All rights reserved.
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.
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.
29 * @(#)com5.c 8.1 (Berkeley) 5/31/93
30 * $FreeBSD: src/games/battlestar/com5.c,v 1.9.2.1 2001/03/05 11:45:35 kris Exp $
31 * $DragonFly: src/games/battlestar/com5.c,v 1.4 2008/04/20 13:44:24 swildner Exp $
34 #include "externs.h"
36 void
37 kiss(void)
39 while (wordtype[++wordnumber] != NOUNS && wordnumber <= wordcount)
40 ; /* nothing */
41 if (wordtype[wordnumber] == NOUNS && testbit(location[position].objects, wordvalue[wordnumber])) {
42 pleasure++;
43 printf("Kissed.\n");
44 switch (wordvalue[wordnumber]) {
45 case NORMGOD:
46 switch (godready++) {
47 case 0:
48 puts("She squirms and avoids your advances.");
49 break;
50 case 1:
51 puts("She is coming around; she didn't fight it as much.");
52 break;
53 case 2:
54 puts("She's beginning to like it.");
55 break;
56 default:
57 puts("She's gone limp.");
60 break;
61 case NATIVE:
62 puts("The lips are warm and her body robust. She pulls you down to the ground.");
63 break;
64 case TIMER:
65 puts("The old man blushes.");
66 break;
67 case MAN:
68 puts("The dwarf punches you in the kneecap.");
69 break;
70 default:
71 pleasure--;
73 } else
74 puts("I'd prefer not to.");
77 void
78 love(void)
80 int n;
82 while (wordtype[++wordnumber] != NOUNS && wordnumber <= wordcount)
83 ; /* nothing */
84 if (wordtype[wordnumber] == NOUNS &&
85 testbit(location[position].objects, wordvalue[wordnumber])) {
86 if (wordvalue[wordnumber] == NORMGOD && !loved) {
87 if (godready >= 2) {
88 puts("She cuddles up to you, and her mouth starts to work:\n'That was my sister's amulet. The lovely goddess, Purl, was she. The Empire\ncaptured her just after the Darkness came. My other sister, Vert, was killed\nby the Dark Lord himself. He took her amulet and warped its power.\nYour quest was foretold by my father before he died, but to get the Dark Lord's\namulet you must use cunning and skill. I will leave you my amulet.");
89 puts("which you may use as you wish. As for me, I am the last goddess of the\nwaters. My father was the Island King, and the rule is rightfully mine.'\n\nShe pulls the throne out into a large bed.");
90 power++;
91 pleasure += 15;
92 ego++;
93 if (card(injuries, NUMOFINJURIES)) {
94 puts("Her kisses revive you; your wounds are healed.\n");
95 for (n = 0; n < NUMOFINJURIES; n++)
96 injuries[n] = 0;
97 WEIGHT = MAXWEIGHT;
98 CUMBER = MAXCUMBER;
100 printf("Goddess:\n");
101 if (!loved)
102 setbit(location[position].objects, MEDALION);
103 loved = 1;
104 gtime += 10;
105 zzz();
106 } else {
107 puts("You wish!");
108 return;
111 if (wordvalue[wordnumber] == NATIVE) {
112 puts("The girl is easy prey. She peels off her sarong and indulges you.");
113 power++;
114 pleasure += 5;
115 printf("Girl:\n");
116 gtime += 10;
117 zzz();
119 printf("Loved.\n");
120 } else
121 puts("I't doesn't seem to work.");
125 zzz(void)
127 int oldtime;
128 int n;
130 oldtime = gtime;
131 if ((snooze - gtime) < (0.75 * CYCLE)) {
132 gtime += 0.75 * CYCLE - (snooze - gtime);
133 printf("<zzz>");
134 for (n = 0; n < gtime - oldtime; n++)
135 printf(".");
136 printf("\n");
137 snooze += 3 * (gtime - oldtime);
138 if (notes[LAUNCHED]) {
139 fuel -= (gtime - oldtime);
140 if (location[position].down) {
141 position = location[position].down;
142 crash();
143 } else
144 notes[LAUNCHED] = 0;
146 if (OUTSIDE && rnd(100) < 50) {
147 puts("You are awakened abruptly by the sound of someone nearby.");
148 switch (rnd(4)) {
149 case 0:
150 if (ucard(inven)) {
151 n = rnd(NUMOFOBJECTS);
152 while (!testbit(inven, n))
153 n = rnd(NUMOFOBJECTS);
154 clearbit(inven, n);
155 if (n != AMULET && n != MEDALION &&
156 n != TALISMAN)
157 setbit(location[position].objects, n);
158 carrying -= objwt[n];
159 encumber -= objcumber[n];
161 puts("A fiendish little Elf is stealing your treasures!");
162 fight(ELF, 10);
163 break;
164 case 1:
165 setbit(location[position].objects, DEADWOOD);
166 break;
167 case 2:
168 setbit(location[position].objects, HALBERD);
169 break;
170 default:
171 break;
174 } else
175 return (0);
176 return (1);
179 void
180 chime(void)
182 if ((gtime / CYCLE + 1) % 2 && OUTSIDE)
183 switch ((gtime % CYCLE) / (CYCLE / 7)) {
184 case 0:
185 puts("It is just after sunrise.");
186 break;
187 case 1:
188 puts("It is early morning.");
189 break;
190 case 2:
191 puts("It is late morning.");
192 break;
193 case 3:
194 puts("It is near noon.");
195 break;
196 case 4:
197 puts("It is early afternoon.");
198 break;
199 case 5:
200 puts("It is late afternoon.");
201 break;
202 case 6:
203 puts("It is near sunset.");
204 break;
206 else if (OUTSIDE)
207 switch ((gtime % CYCLE) / (CYCLE / 7)) {
208 case 0:
209 puts("It is just after sunset.");
210 break;
211 case 1:
212 puts("It is early evening.");
213 break;
214 case 2:
215 puts("The evening is getting old.");
216 break;
217 case 3:
218 puts("It is near midnight.");
219 break;
220 case 4:
221 puts("These are the wee hours of the morning.");
222 break;
223 case 5:
224 puts("The night is waning.");
225 break;
226 case 6:
227 puts("It is almost morning.");
228 break;
230 else
231 puts("I can't tell the time in here.");
235 give(void)
237 int obj, result, person, firstnumber;
238 int last1, last2;
240 obj = result = -1;
241 last1 = last2 = person = 0;
242 firstnumber = wordnumber;
243 while (wordtype[++wordnumber] != OBJECT &&
244 wordvalue[wordnumber] != AMULET &&
245 wordvalue[wordnumber] != MEDALION &&
246 wordvalue[wordnumber] != TALISMAN && wordnumber <= wordcount)
247 ; /* nothing */
248 if (wordnumber <= wordcount) {
249 obj = wordvalue[wordnumber];
250 if (obj == EVERYTHING)
251 wordtype[wordnumber] = -1;
252 last1 = wordnumber;
254 wordnumber = firstnumber;
255 while ((wordtype[++wordnumber] != NOUNS ||
256 wordvalue[wordnumber] == obj) && wordnumber <= wordcount)
257 ; /* nothing */
258 if (wordtype[wordnumber] == NOUNS) {
259 person = wordvalue[wordnumber];
260 last2 = wordnumber;
262 /* Setting wordnumber to last1 - 1 looks wrong if last1 is 0, e.g.,
263 * plain `give'. However, detecting this case is liable to detect
264 * `give foo' as well, which would give a confusing error. We
265 * need to make sure the -1 value can cause no problems if it arises.
266 * If in the below we get to the drop("Given") then drop will look
267 * at word 0 for an object to give, and fail, which is OK; then
268 * result will be -1 and we get to the end, where wordnumber gets
269 * set to something more sensible. If we get to "I don't think
270 * that is possible" then again wordnumber is set to something
271 * sensible. The wordnumber we leave with still isn't right if
272 * you include words the game doesn't know in your command, but
273 * that's no worse than what other commands than give do in
274 * the same place. */
275 wordnumber = last1 - 1;
276 if (person && testbit(location[position].objects, person)) {
277 if (person == NORMGOD && godready < 2 &&
278 !(obj == RING || obj == BRACELET))
279 puts("The goddess won't look at you.");
280 else
281 result = drop("Given");
282 } else {
283 puts("I don't think that is possible.");
284 wordnumber = max(last1, last2) + 1;
285 return (0);
287 if (result != -1 && (testbit(location[position].objects, obj) ||
288 obj == AMULET || obj == MEDALION || obj == TALISMAN)) {
289 clearbit(location[position].objects, obj);
290 gtime++;
291 ego++;
292 switch (person) {
293 case NATIVE:
294 puts("She accepts it shyly.");
295 ego += 2;
296 break;
297 case NORMGOD:
298 if (obj == RING || obj == BRACELET) {
299 puts("She takes the charm and puts it on. A little kiss on the cheek is");
300 puts("your reward.");
301 ego += 5;
302 godready += 3;
304 if (obj == AMULET || obj == MEDALION ||
305 obj == TALISMAN) {
306 bs_win++;
307 ego += 5;
308 power -= 5;
309 if (bs_win >= 3) {
310 puts("The powers of the earth are now legitimate. You have destroyed the Darkness");
311 puts("and restored the goddess to her thrown. The entire island celebrates with");
312 puts("dancing and spring feasts. As a measure of her gratitude, the goddess weds you");
313 puts("in the late summer and crowns you Prince Liverwort, Lord of Fungus.");
314 puts("\nBut, as the year wears on and autumn comes along, you become restless and");
315 puts("yearn for adventure. The goddess, too, realizes that the marriage can't last.");
316 puts("She becomes bored and takes several more natives as husbands. One evening,");
317 puts("after having been out drinking with the girls, she kicks the throne particularly");
318 puts("hard and wakes you up. (If you want to win this game, you're going to have to\nshoot her!)");
319 clearbit(location[position].objects, MEDALION);
320 wintime = gtime;
323 break;
324 case TIMER:
325 if (obj == COINS) {
326 puts("He fingers the coins for a moment and then looks up agape. `Kind you are and");
327 puts("I mean to repay you as best I can.' Grabbing a pencil and cocktail napkin...\n");
328 printf("+-----------------------------------------------------------------------------+\n");
329 printf("| xxxxxxxx\\ |\n");
330 printf("| xxxxx\\ CLIFFS |\n");
331 printf("| FOREST xxx\\ |\n");
332 printf("| \\\\ x\\ OCEAN |\n");
333 printf("| || x\\ |\n");
334 printf("| || ROAD x\\ |\n");
335 printf("| || x\\ |\n");
336 printf("| SECRET || ......... |\n");
337 printf("| - + - || ........ |\n");
338 printf("| ENTRANCE || ... BEACH |\n");
339 printf("| || ... E |\n");
340 printf("| || ... | |\n");
341 printf("| // ... N <-- + --- S |\n");
342 printf("| PALM GROVE // ... | |\n");
343 printf("| // ... W |\n");
344 printf("+-----------------------------------------------------------------------------+\n");
345 puts("\n`This map shows a secret entrance to the catacombs.");
346 puts("You will know when you arrive because I left an old pair of shoes there.'");
348 break;
351 wordnumber = max(last1, last2) + 1;
352 return (firstnumber);