Fix mbuf handling for unsupported operations
[unix-history] / usr / src / games / sail / pl_6.c
CommitLineData
7b487c4c 1#ifndef lint
586c712a 2static char *sccsid = "@(#)pl_6.c 2.3 84/02/23";
7b487c4c
EW
3#endif
4
5#include "player.h"
6
7repair()
8{
9 char c;
586c712a
EW
10 register char *repairs;
11 register struct shipspecs *ptr = mc;
12 register int count;
13
14#define FIX(x, m) (m - ptr->x > count \
15 ? (ptr->x += count, count = 0) : (count -= m - ptr->x, ptr->x = m))
7b487c4c
EW
16
17 if (repaired || loaded || fired || changed || turned()) {
18 Signal("No hands free to repair", (struct ship *)0);
19 return;
20 }
7b487c4c
EW
21 c = sgetch("Repair (hull, guns, rigging)? ", (struct ship *)0, 1);
22 switch (c) {
23 case 'h':
24 repairs = &mf->RH;
25 break;
26 case 'g':
27 repairs = &mf->RG;
28 break;
29 case 'r':
30 repairs = &mf->RR;
31 break;
32 default:
33 Signal("Avast heaving!", (struct ship *)0);
34 return;
35 }
7b487c4c 36 if (++*repairs >= 3) {
586c712a 37 count = 2;
7b487c4c 38 switch (c) {
586c712a
EW
39 case 'h': {
40 int max = ptr->guns/4;
41 if (ptr->hull < max) {
42 FIX(hull, max);
43 Write(W_HULL, ms, 0, ptr->hull, 0, 0, 0);
44 }
7b487c4c 45 break;
586c712a 46 }
7b487c4c
EW
47 case 'g':
48 if (ptr->gunL < ptr->gunR) {
586c712a
EW
49 int max = ptr->guns/5 - ptr->carL;
50 if (ptr->gunL < max) {
51 FIX(gunL, max);
52 Write(W_GUNL, ms, 0, ptr->gunL,
53 ptr->carL, 0, 0);
54 }
55 } else {
56 int max = ptr->guns/5 - ptr->carR;
57 if (ptr->gunR < max) {
58 FIX(gunR, max);
59 Write(W_GUNR, ms, 0, ptr->gunR,
60 ptr->carR, 0, 0);
61 }
62 }
7b487c4c
EW
63 break;
64 case 'r':
586c712a
EW
65#define X 2
66 if (ptr->rig4 >= 0 && ptr->rig4 < X) {
67 FIX(rig4, X);
68 Write(W_RIG4, ms, 0, ptr->rig4, 0, 0, 0);
69 }
70 if (count && ptr->rig3 < X) {
71 FIX(rig3, X);
72 Write(W_RIG3, ms, 0, ptr->rig3, 0, 0, 0);
73 }
74 if (count && ptr->rig2 < X) {
75 FIX(rig2, X);
76 Write(W_RIG2, ms, 0, ptr->rig2, 0, 0, 0);
77 }
78 if (count && ptr->rig1 < X) {
79 FIX(rig1, X);
80 Write(W_RIG1, ms, 0, ptr->rig1, 0, 0, 0);
81 }
7b487c4c
EW
82 break;
83 }
586c712a 84 if (count == 2) {
7b487c4c 85 Signal("Repairs completed.", (struct ship *)0);
fcc6b1db
EW
86 *repairs = 2;
87 } else {
88 *repairs = 0;
490c485f 89 blockalarm();
fcc6b1db 90 draw_stat();
490c485f 91 unblockalarm();
fcc6b1db 92 }
7b487c4c 93 }
490c485f 94 blockalarm();
fcc6b1db 95 draw_slot();
490c485f 96 unblockalarm();
586c712a 97 repaired = 1;
7b487c4c
EW
98}
99
100turned()
101{
102 register char *p;
103
104 for (p = movebuf; *p; p++)
105 if (*p == 'r' || *p == 'l')
106 return 1;
107 return 0;
108}
109
110loadplayer()
111{
112 char c;
113 register loadL, loadR, ready, load;
114
115 if (!mc->crew3) {
116 Signal("Out of crew", (struct ship *)0);
117 return;
118 }
119 loadL = mf->loadL;
120 loadR = mf->loadR;
121 if (!loadL && !loadR) {
122 c = sgetch("Load which broadside (left or right)? ",
123 (struct ship *)0, 1);
124 if (c == 'r')
125 loadL = 1;
126 else
127 loadR = 1;
128 }
129 if (!loadL && loadR || loadL && !loadR) {
130 c = sgetch("Reload with (round, double, chain, grape)? ",
131 (struct ship *)0, 1);
132 switch (c) {
133 case 'r':
134 load = L_ROUND;
135 ready = 0;
136 break;
137 case 'd':
138 load = L_DOUBLE;
139 ready = R_DOUBLE;
140 break;
141 case 'c':
142 load = L_CHAIN;
143 ready = 0;
144 break;
145 case 'g':
146 load = L_GRAPE;
147 ready = 0;
148 break;
149 default:
150 Signal("Broadside not loaded.",
151 (struct ship *)0);
152 return;
153 }
154 if (!loadR) {
155 mf->loadR = load;
156 mf->readyR = ready|R_LOADING;
157 } else {
158 mf->loadL = load;
159 mf->readyL = ready|R_LOADING;
160 }
161 loaded = 1;
162 }
163}