original text from Mike Karels
[unix-history] / usr / src / games / sail / pl_3.c
CommitLineData
b1823ffa 1#ifndef lint
6ca45914 2static char *sccsid = "@(#)pl_3.c 2.3 83/12/17";
b1823ffa
EW
3#endif
4
5#include "player.h"
6
7acceptcombat()
8{
9 int men = 0;
10 int target, temp;
11 int n, r;
12 int index, rakehim, sternrake;
13 int hhits = 0, ghits = 0, rhits = 0, chits = 0;
14 int crew[3];
15 int load;
16 int guns, car, ready, shootat, hit;
17 int roll;
18 struct ship *closest;
19
20 crew[0] = mc->crew1;
21 crew[1] = mc->crew2;
22 crew[2] = mc->crew3;
23 for (n = 0; n < 3; n++) {
24 if (mf->OBP[n].turnsent)
25 men += mf->OBP[n].mensent;
26 }
27 for (n = 0; n < 3; n++) {
28 if (mf->DBP[n].turnsent)
29 men += mf->DBP[n].mensent;
30 }
31 if (men) {
32 crew[0] = men/100 ? 0 : crew[0] != 0;
33 crew[1] = (men%100)/10 ? 0 : crew[1] != 0;
34 crew[2] = men%10 ? 0 : crew[2] != 0;
35 }
36 for (r = 0; r < 2; r++) {
37 if (r) {
38 ready = mf->readyR;
39 load = mf->loadR;
40 guns = mc->gunR;
41 car = mc->carR;
42 } else {
43 ready = mf->readyL;
44 load = mf->loadL;
45 guns = mc->gunL;
46 car = mc->carL;
47 }
48 if (!guns && !car || load == L_EMPTY || (ready & R_LOADED) == 0)
49 goto cant;
50 if (mf->struck || !crew[2])
51 goto cant;
52 closest = closestenemy(ms, (r ? 'r' : 'l'), 1);
53 if (closest == 0)
54 goto cant;
55 if (closest->file->struck)
56 goto cant;
57 target = range(ms, closest);
58 if (target > rangeofshot[load] || !guns && target >= 3)
59 goto cant;
60 Signal("%s (%c%c) within range of %s broadside.",
61 closest, r ? "right" : "left");
62 if (load > L_CHAIN && target < 6) {
789d5e82
EW
63 switch (sgetch("Aim for hull or rigging? ",
64 (struct ship *)0, 1)) {
b1823ffa
EW
65 case 'r':
66 shootat = RIGGING;
67 break;
68 case 'h':
69 shootat = HULL;
70 break;
71 default:
72 shootat = -1;
73 Signal("'Avast there! Hold your fire.'",
74 (struct ship *)0);
75 }
76 } else {
789d5e82 77 if (sgetch("Fire? ", (struct ship *)0, 1) == 'n') {
b1823ffa
EW
78 shootat = -1;
79 Signal("Belay that! Hold your fire.",
80 (struct ship *)0);
81 } else
82 shootat = RIGGING;
83 }
84 if (shootat == -1)
85 continue;
86 fired = 1;
87 rakehim = gunsbear(ms, closest) && !gunsbear(closest, ms);
88 temp = portside(closest, ms, 1) - closest->file->dir + 1;
89 if (temp < 1)
90 temp += 8;
91 else if (temp > 8)
92 temp -= 8;
93 sternrake = temp > 4 && temp < 6;
94 if (rakehim)
95 if (!sternrake)
96 Signal("Raking the %s!", closest);
97 else
98 Signal("Stern Rake! %s splintering!", closest);
99 index = guns;
100 if (target < 3)
101 index += car;
102 index = (index - 1)/3;
103 index = index > 8 ? 8 : index;
104 if (!rakehim)
105 hit = HDT[index][target-1];
106 else
107 hit = HDTrake[index][target-1];
108 if (rakehim && sternrake)
109 hit++;
110 hit += QUAL[index][mc->qual-1];
111 for (n = 0; n < 3 && mf->captured == 0; n++)
112 if (!crew[n])
113 if (index <= 5)
114 hit--;
115 else
116 hit -= 2;
117 if (ready & R_INITIAL)
118 if (index <= 3)
119 hit++;
120 else
121 hit += 2;
122 if (mf->captured != 0)
123 if (index <= 1)
124 hit--;
125 else
126 hit -= 2;
127 hit += AMMO[index][load - 1];
128 if (((temp = mc->class) >= 5 || temp == 1) && windspeed == 5)
129 hit--;
130 if (windspeed == 6 && temp == 4)
131 hit -= 2;
132 if (windspeed == 6 && temp <= 3)
133 hit--;
134 if (hit >= 0) {
135 roll = die();
136 if (load == L_GRAPE)
137 chits = hit;
138 else {
139 struct Tables *t;
140 if (hit > 10)
141 hit = 10;
142 t = &(shootat == RIGGING ? RigTable : HullTable)
143 [hit][roll-1];
144 chits = t->C;
145 rhits = t->R;
146 hhits = t->H;
147 ghits = t->G;
148 if (closest->file->FS)
149 rhits *= 2;
150 if (load == L_CHAIN) {
151 ghits = 0;
152 hhits = 0;
153 }
154 }
155 table(shootat, load, hit, closest, ms, roll);
156 }
789d5e82
EW
157 Signal("Damage inflicted on the %s:",
158 (struct ship *)0, closest->shipname);
159 Signal("\t%d HULL, %d GUNS, %d CREW, %d RIGGING",
160 (struct ship *)0, hhits, ghits, chits, rhits);
b1823ffa
EW
161 if (!r) {
162 mf->loadL = L_EMPTY;
163 mf->readyL = R_EMPTY;
164 } else {
165 mf->loadR = L_EMPTY;
166 mf->readyR = R_EMPTY;
167 }
168 continue;
169 cant:
170 Signal("Unable to fire %s broadside",
171 (struct ship *)0, r ? "right" : "left");
172 }
490c485f 173 blockalarm();
fcc6b1db 174 draw_stat();
490c485f 175 unblockalarm();
b1823ffa
EW
176}
177
178grapungrap()
179{
180 register struct ship *sp;
6ca45914 181 register int i;
b1823ffa 182
b1823ffa 183 foreachship(sp) {
6ca45914 184 if (sp == ms || sp->file->dir == 0)
b1823ffa 185 continue;
6ca45914 186 if (range(ms, sp) > 1 && !grappled2(ms, sp))
b1823ffa 187 continue;
789d5e82
EW
188 switch (sgetch("Attempt to grapple or ungrapple %s (%c%c): ",
189 sp, 1)) {
b1823ffa
EW
190 case 'g':
191 if (die() < 3
192 || ms->nationality == capship(sp)->nationality) {
6ca45914
EW
193 Write(W_GRAP, ms, 0, sp->file->index, 0, 0, 0);
194 Write(W_GRAP, sp, 0, player, 0, 0, 0);
b1823ffa
EW
195 Signal("Attempt succeeds!", (struct ship *)0);
196 makesignal(ms, "grappled with %s (%c%c)", sp);
197 } else
198 Signal("Attempt fails.", (struct ship *)0);
199 break;
200 case 'u':
6ca45914
EW
201 for (i = grappled2(ms, sp); --i >= 0;) {
202 if (ms->nationality
203 == capship(sp)->nationality
204 || die() < 3) {
205 cleangrapple(ms, sp, 0);
b1823ffa
EW
206 Signal("Attempt succeeds!",
207 (struct ship *)0);
208 makesignal(ms,
209 "ungrappling with %s (%c%c)",
210 sp);
211 } else
212 Signal("Attempt fails.",
213 (struct ship *)0);
214 }
6ca45914 215 break;
b1823ffa
EW
216 }
217 }
218}
219
220unfoulplayer()
221{
b1823ffa 222 register struct ship *to;
6ca45914 223 register i;
b1823ffa 224
6ca45914
EW
225 foreachship(to) {
226 if (fouled2(ms, to) == 0)
227 continue;
228 if (sgetch("Attempt to unfoul with the %s (%c%c)? ", to, 1) != 'y')
b1823ffa 229 continue;
6ca45914
EW
230 for (i = fouled2(ms, to); --i >= 0;) {
231 if (die() <= 2) {
232 cleanfoul(ms, to, 0);
789d5e82 233 Signal("Attempt succeeds!", (struct ship *)0);
b1823ffa
EW
234 makesignal(ms, "Unfouling %s (%c%c)", to);
235 } else
236 Signal("Attempt fails.", (struct ship *)0);
237 }
238 }
239}