xref: /dragonfly/games/trek/shield.c (revision 029e6489)
1 /*	@(#)shield.c	8.1 (Berkeley) 5/31/93				*/
2 /*	$NetBSD: shield.c,v 1.13 2009/08/12 08:54:54 dholland Exp $	*/
3 
4 /*
5  * Copyright (c) 1980, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32 
33 #include <stdio.h>
34 #include "trek.h"
35 #include "getpar.h"
36 
37 /*
38 **  SHIELD AND CLOAKING DEVICE CONTROL
39 **
40 **	'f' is one for auto shield up (in case of Condition RED),
41 **	zero for shield control, and negative one for cloaking
42 **	device control.
43 **
44 **	Called with an 'up' or 'down' on the same line, it puts
45 **	the shields/cloak into the specified mode.  Otherwise it
46 **	reports to the user the current mode, and asks if she wishes
47 **	to change.
48 **
49 **	This is not a free move.  Hits that occur as a result of
50 **	this move appear as though the shields are half up/down,
51 **	so you get partial hits.
52 */
53 
54 static const struct cvntab Udtab[] = {
55 	{ "u",		"p",		(cmdfun)1,	0 },
56 	{ "d",		"own",		(cmdfun)0,	0 },
57 	{ NULL,		NULL,		NULL,		0 }
58 };
59 
60 void
61 shield(int f)
62 {
63 	int		i;
64 	const struct cvntab	*r;
65 	char		s[100];
66 	const char	*device, *dev2, *dev3;
67 	int		ind;
68 	char		*stat;
69 
70 	if (f > 0 && (Ship.shldup || damaged(SRSCAN)))
71 		return;
72 	if (f < 0) {
73 		/* cloaking device */
74 		if (Ship.ship == QUEENE) {
75 			printf("Ye Faire Queene does not have the "
76 			       "cloaking device.\n");
77 			return;
78 		}
79 		device = "Cloaking device";
80 		dev2 = "is";
81 		ind = CLOAK;
82 		dev3 = "it";
83 		stat = &Ship.cloaked;
84 	} else {
85 		/* shields */
86 		device = "Shields";
87 		dev2 = "are";
88 		dev3 = "them";
89 		ind = SHIELD;
90 		stat = &Ship.shldup;
91 	}
92 	if (damaged(ind)) {
93 		if (f <= 0)
94 			out(ind);
95 		return;
96 	}
97 	if (Ship.cond == DOCKED) {
98 		printf("%s %s down while docked\n", device, dev2);
99 		return;
100 	}
101 	if (f <= 0 && !testnl()) {
102 		r = getcodpar("Up or down", Udtab);
103 		i = (long) r->value;
104 	} else {
105 		if (*stat)
106 			(void)snprintf(s, sizeof(s),
107 				"%s %s up.  Do you want %s down",
108 				device, dev2, dev3);
109 		else
110 			(void)snprintf(s, sizeof(s),
111 				"%s %s down.  Do you want %s up",
112 				device, dev2, dev3);
113 		if (!getynpar(s))
114 			return;
115 		i = !*stat;
116 	}
117 	if (*stat == i) {
118 		printf("%s already ", device);
119 		if (i)
120 			printf("up\n");
121 		else
122 			printf("down\n");
123 		return;
124 	}
125 	if (i) {
126 		if (f >= 0)
127 			Ship.energy -= Param.shupengy;
128 		else
129 			Ship.cloakgood = 0;
130 	}
131 	Move.free = 0;
132 	if (f >= 0)
133 		Move.shldchg = 1;
134 	*stat = i;
135 	return;
136 }
137