|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: static char sccsid[] = "@(#)pl_3.c 5.4 (Berkeley) 6/1/90";
22: #endif /* not lint */
23:
24: #include "player.h"
25:
26: acceptcombat()
27: {
28: int men = 0;
29: int target, temp;
30: int n, r;
31: int index, rakehim, sternrake;
32: int hhits = 0, ghits = 0, rhits = 0, chits = 0;
33: int crew[3];
34: int load;
35: int guns, car, ready, shootat, hit;
36: int roll;
37: struct ship *closest;
38:
39: crew[0] = mc->crew1;
40: crew[1] = mc->crew2;
41: crew[2] = mc->crew3;
42: for (n = 0; n < 3; n++) {
43: if (mf->OBP[n].turnsent)
44: men += mf->OBP[n].mensent;
45: }
46: for (n = 0; n < 3; n++) {
47: if (mf->DBP[n].turnsent)
48: men += mf->DBP[n].mensent;
49: }
50: if (men) {
51: crew[0] = men/100 ? 0 : crew[0] != 0;
52: crew[1] = (men%100)/10 ? 0 : crew[1] != 0;
53: crew[2] = men%10 ? 0 : crew[2] != 0;
54: }
55: for (r = 0; r < 2; r++) {
56: if (r) {
57: ready = mf->readyR;
58: load = mf->loadR;
59: guns = mc->gunR;
60: car = mc->carR;
61: } else {
62: ready = mf->readyL;
63: load = mf->loadL;
64: guns = mc->gunL;
65: car = mc->carL;
66: }
67: if (!guns && !car || load == L_EMPTY || (ready & R_LOADED) == 0)
68: goto cant;
69: if (mf->struck || !crew[2])
70: goto cant;
71: closest = closestenemy(ms, (r ? 'r' : 'l'), 1);
72: if (closest == 0)
73: goto cant;
74: if (closest->file->struck)
75: goto cant;
76: target = range(ms, closest);
77: if (target > rangeofshot[load] || !guns && target >= 3)
78: goto cant;
79: Signal("%s (%c%c) within range of %s broadside.",
80: closest, r ? "right" : "left");
81: if (load > L_CHAIN && target < 6) {
82: switch (sgetch("Aim for hull or rigging? ",
83: (struct ship *)0, 1)) {
84: case 'r':
85: shootat = RIGGING;
86: break;
87: case 'h':
88: shootat = HULL;
89: break;
90: default:
91: shootat = -1;
92: Signal("'Avast there! Hold your fire.'",
93: (struct ship *)0);
94: }
95: } else {
96: if (sgetch("Fire? ", (struct ship *)0, 1) == 'n') {
97: shootat = -1;
98: Signal("Belay that! Hold your fire.",
99: (struct ship *)0);
100: } else
101: shootat = RIGGING;
102: }
103: if (shootat == -1)
104: continue;
105: fired = 1;
106: rakehim = gunsbear(ms, closest) && !gunsbear(closest, ms);
107: temp = portside(closest, ms, 1) - closest->file->dir + 1;
108: if (temp < 1)
109: temp += 8;
110: else if (temp > 8)
111: temp -= 8;
112: sternrake = temp > 4 && temp < 6;
113: if (rakehim)
114: if (!sternrake)
115: Signal("Raking the %s!", closest);
116: else
117: Signal("Stern Rake! %s splintering!", closest);
118: index = guns;
119: if (target < 3)
120: index += car;
121: index = (index - 1)/3;
122: index = index > 8 ? 8 : index;
123: if (!rakehim)
124: hit = HDT[index][target-1];
125: else
126: hit = HDTrake[index][target-1];
127: if (rakehim && sternrake)
128: hit++;
129: hit += QUAL[index][mc->qual-1];
130: for (n = 0; n < 3 && mf->captured == 0; n++)
131: if (!crew[n])
132: if (index <= 5)
133: hit--;
134: else
135: hit -= 2;
136: if (ready & R_INITIAL)
137: if (index <= 3)
138: hit++;
139: else
140: hit += 2;
141: if (mf->captured != 0)
142: if (index <= 1)
143: hit--;
144: else
145: hit -= 2;
146: hit += AMMO[index][load - 1];
147: if (((temp = mc->class) >= 5 || temp == 1) && windspeed == 5)
148: hit--;
149: if (windspeed == 6 && temp == 4)
150: hit -= 2;
151: if (windspeed == 6 && temp <= 3)
152: hit--;
153: if (hit >= 0) {
154: roll = die();
155: if (load == L_GRAPE)
156: chits = hit;
157: else {
158: struct Tables *t;
159: if (hit > 10)
160: hit = 10;
161: t = &(shootat == RIGGING ? RigTable : HullTable)
162: [hit][roll-1];
163: chits = t->C;
164: rhits = t->R;
165: hhits = t->H;
166: ghits = t->G;
167: if (closest->file->FS)
168: rhits *= 2;
169: if (load == L_CHAIN) {
170: ghits = 0;
171: hhits = 0;
172: }
173: }
174: table(shootat, load, hit, closest, ms, roll);
175: }
176: Signal("Damage inflicted on the %s:",
177: (struct ship *)0, closest->shipname);
178: Signal("\t%d HULL, %d GUNS, %d CREW, %d RIGGING",
179: (struct ship *)0, hhits, ghits, chits, rhits);
180: if (!r) {
181: mf->loadL = L_EMPTY;
182: mf->readyL = R_EMPTY;
183: } else {
184: mf->loadR = L_EMPTY;
185: mf->readyR = R_EMPTY;
186: }
187: continue;
188: cant:
189: Signal("Unable to fire %s broadside",
190: (struct ship *)0, r ? "right" : "left");
191: }
192: blockalarm();
193: draw_stat();
194: unblockalarm();
195: }
196:
197: grapungrap()
198: {
199: register struct ship *sp;
200: register int i;
201:
202: foreachship(sp) {
203: if (sp == ms || sp->file->dir == 0)
204: continue;
205: if (range(ms, sp) > 1 && !grappled2(ms, sp))
206: continue;
207: switch (sgetch("Attempt to grapple or ungrapple %s (%c%c): ",
208: sp, 1)) {
209: case 'g':
210: if (die() < 3
211: || ms->nationality == capship(sp)->nationality) {
212: Write(W_GRAP, ms, 0, sp->file->index, 0, 0, 0);
213: Write(W_GRAP, sp, 0, player, 0, 0, 0);
214: Signal("Attempt succeeds!", (struct ship *)0);
215: makesignal(ms, "grappled with %s (%c%c)", sp);
216: } else
217: Signal("Attempt fails.", (struct ship *)0);
218: break;
219: case 'u':
220: for (i = grappled2(ms, sp); --i >= 0;) {
221: if (ms->nationality
222: == capship(sp)->nationality
223: || die() < 3) {
224: cleangrapple(ms, sp, 0);
225: Signal("Attempt succeeds!",
226: (struct ship *)0);
227: makesignal(ms,
228: "ungrappling with %s (%c%c)",
229: sp);
230: } else
231: Signal("Attempt fails.",
232: (struct ship *)0);
233: }
234: break;
235: }
236: }
237: }
238:
239: unfoulplayer()
240: {
241: register struct ship *to;
242: register i;
243:
244: foreachship(to) {
245: if (fouled2(ms, to) == 0)
246: continue;
247: if (sgetch("Attempt to unfoul with the %s (%c%c)? ", to, 1) != 'y')
248: continue;
249: for (i = fouled2(ms, to); --i >= 0;) {
250: if (die() <= 2) {
251: cleanfoul(ms, to, 0);
252: Signal("Attempt succeeds!", (struct ship *)0);
253: makesignal(ms, "Unfouling %s (%c%c)", to);
254: } else
255: Signal("Attempt fails.", (struct ship *)0);
256: }
257: }
258: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.