Commit | Line | Data |
---|---|---|
cc9c0a85 | 1 | #ifndef lint |
401a08c7 | 2 | static char sccsid[] = "@(#)shield.c 4.2 (Berkeley) %G%"; |
cc9c0a85 KM |
3 | #endif not lint |
4 | ||
5 | # include "trek.h" | |
6 | # include "getpar.h" | |
7 | ||
8 | /* | |
9 | ** SHIELD AND CLOAKING DEVICE CONTROL | |
10 | ** | |
11 | ** 'f' is one for auto shield up (in case of Condition RED), | |
12 | ** zero for shield control, and negative one for cloaking | |
13 | ** device control. | |
14 | ** | |
15 | ** Called with an 'up' or 'down' on the same line, it puts | |
16 | ** the shields/cloak into the specified mode. Otherwise it | |
17 | ** reports to the user the current mode, and asks if she wishes | |
18 | ** to change. | |
19 | ** | |
20 | ** This is not a free move. Hits that occur as a result of | |
21 | ** this move appear as though the shields are half up/down, | |
22 | ** so you get partial hits. | |
23 | */ | |
24 | ||
401a08c7 | 25 | struct cvntab Udtab[] = |
cc9c0a85 | 26 | { |
401a08c7 | 27 | "u", "p", (int (*)())1, 0, |
cc9c0a85 KM |
28 | "d", "own", 0, 0, |
29 | 0 | |
30 | }; | |
31 | ||
32 | shield(f) | |
33 | int f; | |
34 | { | |
35 | register int i; | |
36 | char c; | |
37 | struct cvntab *r; | |
38 | char s[100]; | |
39 | char *device, *dev2, *dev3; | |
40 | int ind; | |
41 | char *stat; | |
42 | ||
43 | if (f > 0 && (Ship.shldup || damaged(SRSCAN))) | |
44 | return; | |
45 | if (f < 0) | |
46 | { | |
47 | /* cloaking device */ | |
48 | if (Ship.ship == QUEENE) | |
49 | return (printf("Ye Faire Queene does not have the cloaking device.\n")); | |
50 | device = "Cloaking device"; | |
51 | dev2 = "is"; | |
52 | ind = CLOAK; | |
53 | dev3 = "it"; | |
54 | stat = &Ship.cloaked; | |
55 | } | |
56 | else | |
57 | { | |
58 | /* shields */ | |
59 | device = "Shields"; | |
60 | dev2 = "are"; | |
61 | dev3 = "them"; | |
62 | ind = SHIELD; | |
63 | stat = &Ship.shldup; | |
64 | } | |
65 | if (damaged(ind)) | |
66 | { | |
67 | if (f <= 0) | |
68 | out(ind); | |
69 | return; | |
70 | } | |
71 | if (Ship.cond == DOCKED) | |
72 | { | |
73 | printf("%s %s down while docked\n", device, dev2); | |
74 | return; | |
75 | } | |
76 | if (f <= 0 && !testnl()) | |
77 | { | |
78 | r = getcodpar("Up or down", Udtab); | |
401a08c7 | 79 | i = (int) r->value; |
cc9c0a85 KM |
80 | } |
81 | else | |
82 | { | |
83 | if (*stat) | |
401a08c7 | 84 | sprintf(s, "%s %s up. Do you want %s down", device, dev2, dev3); |
cc9c0a85 | 85 | else |
401a08c7 | 86 | sprintf(s, "%s %s down. Do you want %s up", device, dev2, dev3); |
cc9c0a85 KM |
87 | if (!getynpar(s)) |
88 | return; | |
89 | i = !*stat; | |
90 | } | |
91 | if (*stat == i) | |
92 | { | |
93 | printf("%s already ", device); | |
94 | if (i) | |
95 | printf("up\n"); | |
96 | else | |
97 | printf("down\n"); | |
98 | return; | |
99 | } | |
100 | if (i) | |
101 | if (f >= 0) | |
401a08c7 | 102 | Ship.energy -= Param.shupengy; |
cc9c0a85 KM |
103 | else |
104 | Ship.cloakgood = 0; | |
105 | Move.free = 0; | |
106 | if (f >= 0) | |
107 | Move.shldchg = 1; | |
108 | *stat = i; | |
109 | return; | |
110 | } |