1/*	$NetBSD: shield.c,v 1.12 2009/05/25 00:43:34 dholland Exp $	*/
2
3/*
4 * Copyright (c) 1980, 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
35static char sccsid[] = "@(#)shield.c	8.1 (Berkeley) 5/31/93";
36#else
37__RCSID("$NetBSD: shield.c,v 1.12 2009/05/25 00:43:34 dholland Exp $");
38#endif
39#endif /* not lint */
40
41#include <stdio.h>
42#include "trek.h"
43#include "getpar.h"
44
45/*
46**  SHIELD AND CLOAKING DEVICE CONTROL
47**
48**	'f' is one for auto shield up (in case of Condition RED),
49**	zero for shield control, and negative one for cloaking
50**	device control.
51**
52**	Called with an 'up' or 'down' on the same line, it puts
53**	the shields/cloak into the specified mode.  Otherwise it
54**	reports to the user the current mode, and asks if she wishes
55**	to change.
56**
57**	This is not a free move.  Hits that occur as a result of
58**	this move appear as though the shields are half up/down,
59**	so you get partial hits.
60*/
61
62static const struct cvntab Udtab[] = {
63	{ "u",		"p",		(cmdfun)1,	0 },
64	{ "d",		"own",		(cmdfun)0,	0 },
65	{ NULL,		NULL,		NULL,		0 }
66};
67
68void
69shield(int f)
70{
71	int		i;
72	const struct cvntab	*r;
73	char		s[100];
74	const char	*device, *dev2, *dev3;
75	int		ind;
76	char		*stat;
77
78	if (f > 0 && (Ship.shldup || damaged(SRSCAN)))
79		return;
80	if (f < 0) {
81		/* cloaking device */
82		if (Ship.ship == QUEENE) {
83			printf("Ye Faire Queene does not have the "
84			       "cloaking device.\n");
85			return;
86		}
87		device = "Cloaking device";
88		dev2 = "is";
89		ind = CLOAK;
90		dev3 = "it";
91		stat = &Ship.cloaked;
92	} else {
93		/* shields */
94		device = "Shields";
95		dev2 = "are";
96		dev3 = "them";
97		ind = SHIELD;
98		stat = &Ship.shldup;
99	}
100	if (damaged(ind)) {
101		if (f <= 0)
102			out(ind);
103		return;
104	}
105	if (Ship.cond == DOCKED) {
106		printf("%s %s down while docked\n", device, dev2);
107		return;
108	}
109	if (f <= 0 && !testnl()) {
110		r = getcodpar("Up or down", Udtab);
111		i = (long) r->value;
112	} else {
113		if (*stat)
114			(void)snprintf(s, sizeof(s),
115				"%s %s up.  Do you want %s down",
116				device, dev2, dev3);
117		else
118			(void)snprintf(s, sizeof(s),
119				"%s %s down.  Do you want %s up",
120				device, dev2, dev3);
121		if (!getynpar(s))
122			return;
123		i = !*stat;
124	}
125	if (*stat == i) {
126		printf("%s already ", device);
127		if (i)
128			printf("up\n");
129		else
130			printf("down\n");
131		return;
132	}
133	if (i) {
134		if (f >= 0)
135			Ship.energy -= Param.shupengy;
136		else
137			Ship.cloakgood = 0;
138	}
139	Move.free = 0;
140	if (f >= 0)
141		Move.shldchg = 1;
142	*stat = i;
143	return;
144}
145