/*	$NetBSD: command3.c,v 1.6 2021/05/02 12:50:43 rillig Exp $	*/

/*
 * Copyright (c) 1983, 1993
 *	The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)com3.c	8.2 (Berkeley) 4/28/95";
#else
__RCSID("$NetBSD: command3.c,v 1.6 2021/05/02 12:50:43 rillig Exp $");
#endif
#endif				/* not lint */

#include "extern.h"

void
dig(void)
{
	if (testbit(inven, SHOVEL)) {
		puts("OK");
		ourtime++;
		switch (position) {
		case 144:	/* copse near beach */
			if (!notes[DUG]) {
				setbit(location[position].objects, DEADWOOD);
				setbit(location[position].objects, COMPASS);
				setbit(location[position].objects, KNIFE);
				setbit(location[position].objects, MACE);
				notes[DUG] = 1;
			}
			break;

		default:
			puts("Nothing happens.");
		}
	} else
		puts("You don't have a shovel.");
}

int
jump(void)
{
	int     n;

	switch (position) {
	default:
		puts("Nothing happens.");
		return (-1);

	case 242:
		position = 133;
		break;
	case 214:
	case 215:
	case 162:
	case 159:
		position = 145;
		break;
	case 232:
		position = FINAL;
		break;
	case 3:
		position = 1;
		break;
	case 172:
		position = 201;
	}
	puts("Ahhhhhhh...");
	injuries[12] = injuries[8] = injuries[7] = injuries[6] = 1;
	for (n = 0; n < NUMOFOBJECTS; n++)
		if (testbit(inven, n)) {
			clearbit(inven, n);
			setbit(location[position].objects, n);
		}
	carrying = 0;
	encumber = 0;
	return (0);
}

void
bury(void)
{
	int     value;

	if (testbit(inven, SHOVEL)) {
		while (wordtype[++wordnumber] != OBJECT &&
		    wordtype[wordnumber] != NOUNS && wordnumber < wordcount)
			continue;
		value = wordvalue[wordnumber];
		if (wordtype[wordnumber] == NOUNS &&
		    (testbit(location[position].objects, value) ||
		    value == BODY))
			switch (value) {
			case BODY:
				wordtype[wordnumber] = OBJECT;
				if (testbit(inven, MAID) ||
				    testbit(location[position].objects, MAID))
					value = MAID;
				if (testbit(inven, DEADWOOD) ||
				    testbit(location[position].objects,
					DEADWOOD))
					value = DEADWOOD;
				if (testbit(inven, DEADGOD) ||
				    testbit(location[position].objects,
					DEADGOD))
					value = DEADGOD;
				if (testbit(inven, DEADTIME) ||
				    testbit(location[position].objects,
					DEADTIME))
					value = DEADTIME;
				if (testbit(inven, DEADNATIVE) ||
				    testbit(location[position].objects,
					DEADNATIVE))
					value = DEADNATIVE;
				break;

			case NATIVE:
			case NORMGOD:
				printf("She screams as you wrestle her into ");
				puts("the hole.");
				/* FALLTHROUGH */
			case TIMER:
				power += 7;
				ego -= 10;
				/* FALLTHROUGH */
			case AMULET:
			case MEDALION:
			case TALISMAN:
				wordtype[wordnumber] = OBJECT;
				break;

			default:
				puts("Wha..?");
			}
		if (wordtype[wordnumber] == OBJECT && position > 88 &&
		    (testbit(inven, value) ||
		    testbit(location[position].objects, value))) {
			puts("Buried.");
			if (testbit(inven, value)) {
				clearbit(inven, value);
				carrying -= objwt[value];
				encumber -= objcumber[value];
			}
			clearbit(location[position].objects, value);
			switch (value) {
			case MAID:
			case DEADWOOD:
			case DEADNATIVE:
			case DEADTIME:
			case DEADGOD:
				ego += 2;
				printf("The %s should rest easier now.\n",
				    objsht[value]);
			}
		} else
			puts("It doesn't seem to work.");
	} else
		puts("You aren't holding a shovel.");
}

void
drink(void)
{
	int     n;

	if (testbit(inven, POTION)) {
		printf("The cool liquid runs down your throat but turns to ");
		puts("fire and you choke.");
		printf("The heat reaches your limbs and tingles your spirit.");
		puts("  You feel like falling");
		puts("asleep.");
		clearbit(inven, POTION);
		WEIGHT = MAXWEIGHT;
		CUMBER = MAXCUMBER;
		for (n = 0; n < NUMOFINJURIES; n++)
			injuries[n] = 0;
		ourtime++;
		zzz();
	} else
		puts("I'm not thirsty.");
}

int
shoot(void)
{
	int     firstnumber, value;

	firstnumber = wordnumber;
	if (!testbit(inven, LASER))
		puts("You aren't holding a blaster.");
	else {
		wordnumber++;
		while (wordnumber <= wordcount &&
		    wordtype[wordnumber] == OBJECT) {
			value = wordvalue[wordnumber];
			printf("%s:\n", objsht[value]);
			if (testbit(location[position].objects, value)) {
				clearbit(location[position].objects, value);
				ourtime++;
				printf("The %s explode%s\n", objsht[value],
				    (is_plural_object(value) ? "." : "s."));
				if (value == BOMB)
					die();
			} else
				printf("I don't see any %s around here.\n",
				    objsht[value]);
			if (wordnumber < wordcount - 1 &&
			    wordvalue[++wordnumber] == AND)
				wordnumber++;
			else
				return (firstnumber);
		}
		/* special cases with their own return()'s */

		if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS) {
			ourtime++;
			switch (wordvalue[wordnumber]) {

			case DOOR:
				switch (position) {
				case 189:
				case 231:
					puts("The door is unhinged.");
					location[189].north = 231;
					location[231].south = 189;
					whichway(location[position]);
					break;
				case 30:
					puts("The wooden door splinters.");
					location[30].west = 25;
					whichway(location[position]);
					break;
				case 31:
					printf("The laser blast has no ");
					puts("effect on the door.");
					break;
				case 20:
					printf("The blast hits the door and ");
					printf("it explodes into flame.  The ");
					puts("magnesium burns");
					printf("so rapidly that we have no ");
					puts("chance to escape.");
					die();
				default:
					puts("Nothing happens.");
				}
				break;

			case NORMGOD:
				if (testbit(location[position].objects,
				    BATHGOD)) {
					printf("The goddess is hit in the ");
					printf("chest and splashes back ");
					puts("against the rocks.");
					printf("Dark blood oozes from the ");
					printf("charred blast hole.  Her ");
					puts("naked body floats in the");
					puts("pools and then off downstream.");
					clearbit(location[position].objects,
					    BATHGOD);
					setbit(location[180].objects, DEADGOD);
					power += 5;
					ego -= 10;
					notes[JINXED]++;
				} else
					if (testbit(location[position].objects,
					    NORMGOD)) {
						printf("The blast catches ");
						printf("the goddess in the ");
						printf("stomach, knocking ");
						puts("her to the ground.");
						printf("She writhes in the ");
						printf("dirt as the agony of ");
						puts("death taunts her.");
						puts("She has stopped moving.");
						clearbit(location[position].objects, NORMGOD);
						setbit(location[position].objects, DEADGOD);
						power += 5;
						ego -= 10;
						notes[JINXED]++;
						if (wintime)
							live();
						break;
					} else {
						printf("I don't see any ");
						puts("goddess around here.");
					}
				break;

			case TIMER:
				if (testbit(location[position].objects,
				    TIMER)) {
					printf("The old man slumps over ");
					puts("the bar.");
					power++;
					ego -= 2;
					notes[JINXED]++;
					clearbit(location[position].objects,
					    TIMER);
					setbit(location[position].objects,
					    DEADTIME);
				} else
					puts("What old-timer?");
				break;
			case MAN:
				if (testbit(location[position].objects, MAN)) {
					printf("The man falls to the ground ");
					printf("with blood pouring all over ");
					puts("his white suit.");
					puts("Your fantasy is over.");
					die();
				} else
					puts("What man?");
				break;
			case NATIVE:
				if (testbit(location[position].objects,
				    NATIVE)) {
					printf("The girl is blown backwards ");
					printf("several feet and lies in a ");
					puts("pool of blood.");
					clearbit(location[position].objects,
					    NATIVE);
					setbit(location[position].objects,
					    DEADNATIVE);
					power += 5;
					ego -= 2;
					notes[JINXED]++;
				} else
					puts("There is no girl here.");
				break;
			case -1:
				puts("Shoot what?");
				break;

			default:
				printf("You can't shoot the %s.\n",
				    objsht[wordvalue[wordnumber]]);
			}
		} else
			puts("You must be a looney.");
	}
	return (firstnumber);
}
