root/games/battlestar/command3.c
/*      $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);
}