pl_6.c revision 1.8 1 /* $NetBSD: pl_6.c,v 1.8 2001/01/04 03:51:24 jwise Exp $ */
2
3 /*
4 * Copyright (c) 1983, 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. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the University of
18 * California, Berkeley and its contributors.
19 * 4. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36 #include <sys/cdefs.h>
37 #ifndef lint
38 #if 0
39 static char sccsid[] = "@(#)pl_6.c 8.1 (Berkeley) 5/31/93";
40 #else
41 __RCSID("$NetBSD: pl_6.c,v 1.8 2001/01/04 03:51:24 jwise Exp $");
42 #endif
43 #endif /* not lint */
44
45 #include <signal.h>
46 #include "player.h"
47
48 void repair(void);
49 static int turned(void);
50 void loadplayer(void);
51
52 void
53 repair(void)
54 {
55 char c;
56 char *repairs;
57 struct shipspecs *ptr = mc;
58 int count;
59
60 #define FIX(x, m) (m - ptr->x > count \
61 ? (ptr->x += count, count = 0) : (count -= m - ptr->x, ptr->x = m))
62
63 if (repaired || loaded || fired || changed || turned()) {
64 Msg("No hands free to repair");
65 return;
66 }
67 c = sgetch("Repair (hull, guns, rigging)? ", (struct ship *)0, 1);
68 switch (c) {
69 case 'h':
70 repairs = &mf->RH;
71 break;
72 case 'g':
73 repairs = &mf->RG;
74 break;
75 case 'r':
76 repairs = &mf->RR;
77 break;
78 default:
79 Msg("Avast heaving!");
80 return;
81 }
82 if (++*repairs >= 3) {
83 count = 2;
84 switch (c) {
85 case 'h': {
86 int max = ptr->guns/4;
87 if (ptr->hull < max) {
88 FIX(hull, max);
89 Write(W_HULL, ms, ptr->hull, 0, 0, 0);
90 }
91 break;
92 }
93 case 'g':
94 if (ptr->gunL < ptr->gunR) {
95 int max = ptr->guns/5 - ptr->carL;
96 if (ptr->gunL < max) {
97 FIX(gunL, max);
98 Write(W_GUNL, ms, ptr->gunL,
99 ptr->carL, 0, 0);
100 }
101 } else {
102 int max = ptr->guns/5 - ptr->carR;
103 if (ptr->gunR < max) {
104 FIX(gunR, max);
105 Write(W_GUNR, ms, ptr->gunR,
106 ptr->carR, 0, 0);
107 }
108 }
109 break;
110 case 'r':
111 #define X 2
112 if (ptr->rig4 >= 0 && ptr->rig4 < X) {
113 FIX(rig4, X);
114 Write(W_RIG4, ms, ptr->rig4, 0, 0, 0);
115 }
116 if (count && ptr->rig3 < X) {
117 FIX(rig3, X);
118 Write(W_RIG3, ms, ptr->rig3, 0, 0, 0);
119 }
120 if (count && ptr->rig2 < X) {
121 FIX(rig2, X);
122 Write(W_RIG2, ms, ptr->rig2, 0, 0, 0);
123 }
124 if (count && ptr->rig1 < X) {
125 FIX(rig1, X);
126 Write(W_RIG1, ms, ptr->rig1, 0, 0, 0);
127 }
128 break;
129 }
130 if (count == 2) {
131 Msg("Repairs completed.");
132 *repairs = 2;
133 } else {
134 *repairs = 0;
135 blockalarm();
136 draw_stat();
137 unblockalarm();
138 }
139 }
140 blockalarm();
141 draw_slot();
142 unblockalarm();
143 repaired = 1;
144 }
145
146 static int
147 turned(void)
148 {
149 char *p;
150
151 for (p = movebuf; *p; p++)
152 if (*p == 'r' || *p == 'l')
153 return 1;
154 return 0;
155 }
156
157 void
158 loadplayer(void)
159 {
160 char c;
161 int loadL, loadR, ready, load;
162
163 if (!mc->crew3) {
164 Msg("Out of crew");
165 return;
166 }
167 loadL = mf->loadL;
168 loadR = mf->loadR;
169 if (!loadL && !loadR) {
170 c = sgetch("Load which broadside (left or right)? ",
171 (struct ship *)0, 1);
172 if (c == 'r')
173 loadL = 1;
174 else
175 loadR = 1;
176 }
177 if ((!loadL && loadR) || (loadL && !loadR)) {
178 c = sgetch("Reload with (round, double, chain, grape)? ",
179 (struct ship *)0, 1);
180 switch (c) {
181 case 'r':
182 load = L_ROUND;
183 ready = 0;
184 break;
185 case 'd':
186 load = L_DOUBLE;
187 ready = R_DOUBLE;
188 break;
189 case 'c':
190 load = L_CHAIN;
191 ready = 0;
192 break;
193 case 'g':
194 load = L_GRAPE;
195 ready = 0;
196 break;
197 default:
198 Msg("Broadside not loaded.");
199 return;
200 }
201 if (!loadR) {
202 mf->loadR = load;
203 mf->readyR = ready|R_LOADING;
204 } else {
205 mf->loadL = load;
206 mf->readyL = ready|R_LOADING;
207 }
208 loaded = 1;
209 }
210 }
211