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