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