|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)driver1.c 1.3 83/05/20";
3: #endif
4:
5: #include "externs.h"
6: #include <sys/types.h>
7:
8: #define couldwin(from, to) (specs[scene[game].ship[from].shipnum].crew2 > specs[scene[game].ship[to].shipnum].crew2 * 1.5)
9:
10: unfoul()
11: {
12: char name;
13: register int n, k, ship;
14: int ident, captured;
15: struct File *ptr;
16:
17: for (n=0; n < scene[game].vessels; n++){
18: ptr = scene[game].ship[n].file;
19: if (!ptr -> captain[0]){
20: for(k=0; k < 10; k++){
21: if (ptr -> fouls[k].turnfoul){
22: if ((ident = ptr -> captured) < 0)
23: ident = n;
24: ship = ptr -> fouls[k].toship;
25: if ((captured = scene[game].ship[ship].file -> captured) < 0)
26: captured = ship;
27: if (scene[game].ship[ident].nationality == scene[game].ship[ship].nationality || toughmelee(n, ship, 0, 0))
28: if (die() <= 2){
29: cleanfoul(n, ship, k);
30: }
31: }
32: }
33: }
34: }
35: }
36:
37:
38:
39: boardcomp()
40: {
41: register int n, k, l, men = 0, captured;
42: int crew[3];
43: struct shipspecs *ptr;
44: struct File *ptr1;
45:
46: for (n = 0; n < scene[game].vessels; n++){
47: ptr = &specs[scene[game].ship[n].shipnum];
48: ptr1 = scene[game].ship[n].file;
49: if (!ptr1 -> captain[0] && (fouled(n) || grappled(n)) && pos[n].dir && !ptr1 -> struck && ptr1 -> captured < 0){
50: crew[0] = ptr -> crew1 != 0;
51: crew[1] = ptr -> crew2 != 0;
52: crew[2] = ptr -> crew3 != 0;
53: for (l=0; l < scene[game].vessels; l++)
54: if (foul(n+100,l) || grapple(n+100,l)){
55: if (!meleeing(n,l)){
56: if ((captured = scene[game].ship[l].file -> captured) < 0)
57: captured = l;
58: if (pos[l].dir && scene[game].ship[n].nationality != scene[game].ship[captured].nationality){
59: switch(specs[scene[game].ship[n].shipnum].class - specs[scene[game].ship[l].shipnum].class){
60: case -3:
61: case -4:
62: case -5:
63: if (crew[0]){
64: send(n, l, crew[0]*100, 200); /* OBP */
65: crew[0] = 0;
66: }
67: else if (crew[1]){
68: send(n, l, crew[1]*10, 200); /* OBP */
69: crew[1] = 0;
70: }
71: break;
72: case -2:
73: if (crew[0] || crew[1]){
74: send(n, l, crew[0]*100+crew[1]*10, 200); /* OBP */
75: crew[0] = crew[1] = 0;
76: }
77: break;
78: case -1:
79: case 0:
80: case 1:
81: if (crew[0]){
82: send(n, l, crew[0]*100+crew[1]*10, 200); /* OBP */
83: crew[0] = crew[1] = 0;
84: }
85: break;
86: case 2:
87: case 3:
88: case 4:
89: case 5:
90: send(n, l, crew[0]*100+crew[1]*10+crew[2], 200); /* OBP */
91: crew[0] = crew[1] = crew[2] = 0;
92: break;
93: }
94: }
95: }
96: }
97: }
98: }
99: }
100:
101:
102: fightitout(from, to, key)
103: int from, to, key;
104: {
105: int crewfrom[3], crewto[3], menfrom, mento, fromcap, tocap;
106: int pcto, pcfrom, fromstrength, strengthto, frominjured, toinjured;
107: int index, totalfrom = 0, totalto = 0, topoints, frompoints, struck;
108: int junk, count;
109: struct File *ptr;
110: struct shipspecs *ptr1;
111: char message[60];
112:
113: ptr = scene[game].ship[from].file;
114: ptr1 = &specs[scene[game].ship[from].shipnum];
115: menfrom = mensent(from, to, crewfrom, &fromcap, &pcfrom, &frompoints, key);
116: mento = mensent(to, from, crewto, &tocap, &pcto, &topoints, 0);
117: if (fromcap < 0)
118: fromcap = from;
119: if (tocap < 0)
120: tocap = to;
121: fromstrength = menfrom * specs[scene[game].ship[fromcap].shipnum].qual;
122: strengthto = mento * specs[scene[game].ship[tocap].shipnum].qual;
123: if (key && !menfrom){
124: if (fromcap == from)
125: menfrom = ptr1 -> crew1 + ptr1 -> crew2 + ptr1 -> crew3;
126: else
127: menfrom = ptr -> pcrew;
128: fromstrength = -1;
129: strengthto *= 2;
130: }
131: for (count = 0; (!(fromstrength >= strengthto * 3 || strengthto >= fromstrength * 3) || fromstrength == -1) && count < 4;count++){
132: index = fromstrength/10;
133: if (index > 8)
134: index = 8;
135: toinjured = MT[index][2 - die() / 3];
136: totalto += toinjured;
137: index = strengthto/10;
138: if (index > 8)
139: index = 8;
140: frominjured = MT[index][2 - die() / 3];
141: totalfrom += frominjured;
142: menfrom -= frominjured;
143: mento -= toinjured;
144: fromstrength = menfrom * specs[scene[game].ship[fromcap].shipnum].qual;
145: strengthto = mento * specs[scene[game].ship[tocap].shipnum].qual;
146: }
147: if (fromstrength >= strengthto * 3 || count == 4){
148: unboard(to, from, 0);
149: subtract(from, totalfrom, crewfrom, fromcap, pcfrom);
150: subtract(to, totalto, crewto, tocap, pcto);
151: makesignal("boarders from %s repelled", to, from);
152: sprintf(message, "killed in melee: %d. %s: %d", totalto, scene[game].ship[from].shipname, totalfrom);
153: Write(FILES + to, 1, 164, message);
154: if (key)
155: return(1);
156: }
157: else if (strengthto >= fromstrength * 3){
158: unboard(from, to, 0);
159: subtract(from, totalfrom, crewfrom, fromcap, pcfrom);
160: subtract(to, totalto, crewto, tocap, pcto);
161: if (key){
162: if (fromcap != from)
163: /* Write(FILES + fromcap, 0, 20, scene[game].ship[fromcap].file -> points - (2 - ptr -> struck)*ptr1 -> points); */ /* original line... */
164:
165: Write(FILES + fromcap, 0, 20,
166: (scene[game].ship[fromcap].file -> points) -
167: (2 - (ptr -> struck))*(ptr1 -> pts)
168: /* (2 - (ptr -> struck))*(ptr1 -> points) */
169: );
170:
171: /* ptr1 points to the shipspec for the ship that was just unboarded.
172: I guess that what is going on here is that the pointer is multiplied
173: or something. */
174:
175: Write(FILES + from, 0, 68, to);
176: topoints = 2*ptr1 -> pts + scene[game].ship[to].file -> points;
177: if (ptr -> struck)
178: topoints -= ptr1 -> pts;
179: Write(FILES + to, 0, 20, topoints);
180: mento = crewto[0] ? crewto[0] : crewto[1];
181: if (mento){
182: subtract(to, mento, crewto, tocap, pcto);
183: subtract(from, -mento, crewfrom, to, 0);
184: }
185: sprintf(message, "captured by the %s!",scene[game].ship[to].shipname);
186: Write(FILES + from, 1, 164, message);
187: sprintf(message, "killed in melee: %d. %s: %d", totalto, scene[game].ship[from].shipname, totalfrom);
188: Write(FILES + to, 1, 164, message);
189: mento = 0;
190: return(0);
191: }
192: }
193: return(0);
194: } /* end of fightitout */
195:
196:
197: resolve()
198: {
199: register int n, l, k, thwart;
200:
201: for (n=0; n < scene[game].vessels; n++){
202: thwart = 2;
203: if (pos[n].dir){
204: for (l=n+1; l < scene[game].vessels; l++){
205: if (pos[l].dir && meleeing(n,l) && meleeing(l,n)){ /* offense */
206: fightitout(n,l,0);
207: }
208: }
209: for (l=0; l < scene[game].vessels; l++){ /* defense */
210: if (pos[l].dir && meleeing(l,n)){
211: thwart = fightitout(n,l,1);
212: }
213: if (!thwart)
214: break;
215: }
216: if (!thwart){
217: for (k=0; k < scene[game].vessels; k++){
218: if (pos[k].dir && meleeing(k,n)){
219: unboard(k,n,0);
220: }
221: unboard(n,k,0);
222: }
223: unboard(n,n,1);
224: }
225: if (thwart == 2)
226: unboard(n,n,1);
227: }
228: }
229: }
230:
231:
232: compcombat()
233: {
234: int crew[3], men = 0, target, temp;
235: int n, r, guns[2], load[2], car[2], roll[2];
236: int ready[2], index, rakehim, sternrake;
237: int shootat[2], hit[2], closest[2], ship;
238: struct shipspecs *ptr;
239: struct File *ptr1;
240:
241: for (ship = 0; ship < scene[game].vessels; ship++){
242: ptr = &specs[scene[game].ship[ship].shipnum];
243: ptr1 = scene[game].ship[ship].file;
244: if (!ptr1 -> captain[0] && pos[ship].dir){
245: crew[0] = ptr -> crew1;
246: crew[1] = ptr -> crew2;
247: crew[2] = ptr -> crew3;
248: ready[0] = ptr1 -> readyL;
249: ready[1] = ptr1 -> readyR;
250: guns[0] = ptr -> gunL;
251: guns[1] = ptr -> gunR;
252: car[0] = ptr -> carL;
253: car[1] = ptr -> carR;
254: for (n = 0; n < 3; n++){
255: if (ptr1 -> OBP[n].turnsent)
256: men += ptr1 -> OBP[n].mensent;
257: }
258: for (n = 0; n < 3; n++){
259: if (ptr1 -> DBP[n].turnsent)
260: men += ptr1 -> DBP[n].mensent;
261: }
262: if (men){
263: crew[0] = men/100 ? 0 : crew[0] != 0;
264: crew[1] = (men%100)/10 ? 0 : crew[1] != 0;
265: crew[2] = men%10 ? 0 : crew[2] != 0;
266: }
267: for (r = 0; r < 2; r++){
268: if ((guns[r] || car[r]) && crew[2] && ready[r] <= 0 && !ptr1 -> struck && ((closest[r] = closestenemy(ship, (r ? 'r' : 'l'), 0)) != 30000) && range(closest[r], ship) <= range(ship, closestenemy(ship, (r ? 'r' : 'l'), 1))){
269: if ((target = range(ship, closest[r])) <= 10 && !scene[game].ship[closest[r]].file -> struck && (guns[r] || (car[r] && target < 3))){
270: load[r] = ROUND;
271: if (target == 1 && loadwith[ship] == GRAPE)
272: load[r] = GRAPE;
273: if (target <= 3 && scene[game].ship[closest[r]].file -> FS)
274: load[r] = CHAIN;
275: if (target == 1 && load[r] != GRAPE)
276: load[r] = DOUBLE;
277: if (load[r] > CHAIN && target < 6){
278: shootat[r] = HULL;
279: }
280: else {
281: shootat[r] = RIGGING;
282: }
283: rakehim = gunsbear(ship, closest[r]) && !gunsbear(closest[r], ship);
284: temp = portside(closest[r], ship, 1) - pos[closest[r]].dir + 1;
285: if (temp < 1)
286: temp += 8;
287: if (temp > 8)
288: temp -= 8;
289: sternrake = temp > 4 && temp < 6;
290: index = guns[r];
291: if (target < 3){
292: index += car[r];
293: }
294: index = (index - 1)/3;
295: index = index > 8 ? 8 : index;
296: if (!rakehim){
297: hit[r] = HDT[index][target-1];
298: }
299: else {
300: hit[r] = HDTrake[index][target-1];
301: }
302: if (rakehim && sternrake){
303: hit[r]++;
304: }
305: hit[r] += QUAL[index][ptr1 -> captured < 0 ? ptr -> qual-1 : specs[scene[game].ship[ptr1 -> captured].shipnum].qual -1];
306: for (n=0; n < 3 && ptr1 -> captured < 0; n++)
307: if (!crew[n]){
308: if (index <= 5)
309: hit[r]--;
310: else
311: hit[r] -= 2;
312: }
313: if (ready[r] <= -30000){
314: if (index <= 3)
315: hit[r]++;
316: else
317: hit[r] += 2;
318: }
319: if (ptr1 -> captured > -1){
320: if (index <= 1)
321: hit[r]--;
322: else
323: hit[r] -= 2;
324: }
325: hit[r] += AMMO[index][load[r] - 1];
326: if (((temp = ptr -> class) >= 5 || temp == 1) && windspeed == 5)
327: hit[r]--;
328: if (windspeed == 6 && temp == 4)
329: hit[r] -= 2;
330: if (windspeed == 6 && temp <= 3)
331: hit[r]--;
332: if (hit[r] >= 0){
333: if (load[r] != GRAPE)
334: hit[r] = hit[r] > 10 ? 10 : hit[r];
335: roll[r] = die();
336: table(shootat[r], load[r], hit[r], closest[r], ship, roll[r]);
337: }
338: load[r] = 0;
339: if (!r)
340: ptr1 -> readyL = 0;
341: else
342: ptr1 -> readyR = 0;
343: }
344: }
345: else
346: load[r] = 0;
347: }
348: }
349: }
350: }
351:
352: next()
353: {
354: char string[25];
355: int vec[3];
356:
357: turn++;
358: if (turn % 55 == 0)
359: if (scene[game].time)
360: scene[game].time = 0;
361: else
362: scene[game].people = 0; /* die if no one */
363: if (scene[game].people <= 0 || windspeed == 7){
364: fclose(syncfile);
365: sprintf(string, "/tmp/.%d", game);
366: if (unlink(string) == -1)
367: perror(string);
368: exit(0);
369: }
370: Write(SCENARIO, 0, 6, turn);
371: if (turn % 7 == 0){
372: if (die() >= scene[game].windchange || !windspeed){
373: switch(die()){
374: case 1:
375: winddir = 1;
376: break;
377: case 2:
378: break;
379: case 3:
380: winddir++;
381: break;
382: case 4:
383: winddir--;
384: break;
385: case 5:
386: winddir += 2;
387: break;
388: case 6:
389: winddir -= 2;
390: break;
391: }
392: if (winddir > 8)
393: winddir -= 8;
394: if (winddir < 1)
395: winddir += 8;
396: Write(SCENARIO, 0, 0, winddir);
397: if (windspeed)
398: switch(die()){
399: case 1:
400: case 2:
401: windspeed--;
402: break;
403: case 5:
404: case 6:
405: windspeed++;
406: break;
407: }
408: else
409: windspeed++;
410: Write(SCENARIO, 0, 2, windspeed);
411: }
412: /* if (!MIGHTYCAPTAIN){
413: gldav(vec);
414: if ((vec[2] >> 8) > 9)
415: {
416: makesignal("*Load getting high, brace yourselves.", 0, 0);
417: }
418: if ((vec[2] >> 8) > 12)
419: {
420: makesignal("*Load average is blowing a gale!", 0, 0);
421: Write(SCENARIO, 0, 2, 7);
422: }
423: } */
424: }
425: }
426:
427: main(argc, argv)
428: int argc;
429: char **argv;
430: {
431: register int n, k;
432: char file[25];
433: int uid;
434:
435: signal(SIGHUP, SIG_IGN);
436: signal(SIGINT, SIG_IGN);
437: srand(getpid());
438: /* ;;; add code here to check the game number. */
439: sprintf(file, "/tmp/.%s",argv[1]);
440: for (n = 0; access(file, 0) < 0 && n < 20; n++)
441: sleep(5);
442: syncfile = fopen(file, "r+");
443: if (syncfile == NULL) {
444: perror(file);
445: exit(1);
446: }
447: sscanf(argv[1], "%d", &game);
448: for (n=0; n < scene[game].vessels; n++){
449: nation[scene[game].ship[n].nationality + 1] = n + 1;
450: if ((scene[game].ship[n].file = (struct File *) calloc(1, sizeof(struct File))) == NULL){
451: printf("OUT OF MEMORY\n");
452: exit(0);
453: }
454: scene[game].ship[n].file -> captured = -1;
455: }
456: for (n = 0; n < scene[game].vessels; n++){ /* initial loads */
457: scene[game].ship[n].file -> loadL = ROUND;
458: scene[game].ship[n].file -> loadR = ROUND;
459: scene[game].ship[n].file -> readyR = -30000;
460: scene[game].ship[n].file -> readyL = -30000;
461: }
462: if (!nation[2])
463: nation[2] = nation[1];
464: if (!nation[3])
465: nation[3] = nation[2];
466: sync();
467: for(;;) {
468: windspeed = scene[game].windspeed;
469: winddir = scene[game].winddir;
470: turn = scene[game].turn;
471: next();
472: unfoul();
473: checkup();
474: prizecheck();
475: moveall();
476: readpos();
477: thinkofgrapples();
478: boardcomp();
479: compcombat();
480: readpos();
481: resolve();
482: reload();
483: checksails();
484: sync();
485: sleep(7);
486: sync();
487: }
488: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.