|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)player1.c 1.10 83/07/03";
3: #endif
4:
5: #include "player.h"
6: #include <sys/types.h>
7:
8: WINDOW *view,*slot;
9: char done_curses = 0;
10:
11: acceptcombat()
12: {
13: int crew[3], men = 0, rangeofshot, target, temp;
14: int n, r, guns[2], load[2], car[2], roll[2];
15: int ready[2], index, rakehim, sternrake;
16: int shootat[2], hit[2], closest[2], ship;
17: int hhits = 0, ghits = 0, rhits = 0, chits = 0;
18: int buf;
19: struct shipspecs *ptr;
20: struct File *ptr1;
21:
22: ptr = &specs[scene[game].ship[player].shipnum];
23: ptr1 = scene[game].ship[player].file;
24: crew[0] = ptr -> crew1;
25: crew[1] = ptr -> crew2;
26: crew[2] = ptr -> crew3;
27: ready[0] = ptr1 -> readyL;
28: ready[1] = ptr1 -> readyR;
29: load[0] = ptr1 -> loadL;
30: load[1] = ptr1 -> loadR;
31: guns[0] = ptr -> gunL;
32: guns[1] = ptr -> gunR;
33: car[0] = ptr -> carL;
34: car[1] = ptr -> carR;
35: for (n = 0; n < 3; n++) {
36: if (ptr1 -> OBP[n].turnsent)
37: men += ptr1 -> OBP[n].mensent;
38: }
39: for (n = 0; n < 3; n++) {
40: if (ptr1 -> DBP[n].turnsent)
41: men += ptr1 -> DBP[n].mensent;
42: }
43: if (men) {
44: crew[0] = men/100 ? 0 : crew[0] != 0;
45: crew[1] = (men%100)/10 ? 0 : crew[1] != 0;
46: crew[2] = men%10 ? 0 : crew[2] != 0;
47: }
48: for (r = 0; r < 2; r++) {
49: if ((guns[r] || car[r]) && crew[2] && load[r] && ready[r] <= 0 && !ptr1 -> struck && ((closest[r] = closestenemy(player, (r ? 'r' : 'l'), 1)) != 30000)) {
50: switch(load[r]) {
51: case GRAPE:
52: rangeofshot = 1;
53: break;
54: case CHAIN:
55: rangeofshot = 3;
56: break;
57: case DOUBLE:
58: rangeofshot = 1;
59: break;
60: case ROUND:
61: rangeofshot = 10;
62: break;
63: }
64: if ((target = range(player, closest[r])) <= rangeofshot && !scene[game].ship[closest[r]].file -> struck && (guns[r] || (car[r] && target < 3))) {
65: Signal("%s (%c%c) within range of %s broadside.", closest[r], (r?"right":"left"));
66: if (load[r] > CHAIN && target < 6) {
67: Signal("Aim for hull or rigging? ", -1, 0);
68: while ((buf = getch()) == EOF);
69: addch(buf);
70: if(buf == 'r')
71: shootat[r] = RIGGING;
72: else if (buf == 'h')
73: shootat[r] = HULL;
74: else {
75: shootat[r] = -1;
76: Signal("'Avast there! Hold your fire.'", -1, 0);
77: }
78: } else {
79: shootat[r] = RIGGING;
80: Signal("Fire? ", -1, 0);
81: while ((buf = getch()) == EOF);
82: addch(buf);
83: if (buf == 'n') {
84: shootat[r] = -1;
85: Signal("Belay that! Hold your fire.", -1, 0);
86: }
87: }
88: if (shootat[r] != -1) {
89: fired = 1;
90: rakehim = gunsbear(player, closest[r]) && !gunsbear(closest[r], player);
91: temp = portside(closest[r], player, 1) - pos[closest[r]].dir + 1;
92: if (temp < 1)
93: temp += 8;
94: if (temp > 8)
95: temp -= 8;
96: sternrake = temp > 4 && temp < 6;
97: if (rakehim && !sternrake)
98: Signal("Raking the %s!", closest[r], 0);
99: else if (rakehim && sternrake)
100: Signal("Stern Rake! %s splintering!", closest[r], 0);
101: index = guns[r];
102: if (target < 3)
103: index += car[r];
104: index = (index - 1)/3;
105: index = index > 8 ? 8 : index;
106: if (!rakehim)
107: hit[r] = HDT[index][target-1];
108: else
109: hit[r] = HDTrake[index][target-1];
110: if (rakehim && sternrake)
111: hit[r]++;
112: hit[r] += QUAL[index][ptr -> qual-1];
113: for (n=0; n < 3 && ptr1 -> captured < 0; n++)
114: if (!crew[n])
115: if (index <= 5)
116: hit[r]--;
117: else
118: hit[r] -= 2;
119: if (ready[r] <= -30000)
120: if (index <= 3)
121: hit[r]++;
122: else
123: hit[r] += 2;
124: if (ptr1 -> captured > -1)
125: if (index <= 1)
126: hit[r]--;
127: else
128: hit[r] -= 2;
129: hit[r] += AMMO[index][load[r] - 1];
130: if (((temp = ptr -> class) >= 5 || temp == 1) && windspeed == 5)
131: hit[r]--;
132: if (windspeed == 6 && temp == 4)
133: hit[r] -= 2;
134: if (windspeed == 6 && temp <= 3)
135: hit[r]--;
136: if (hit[r] >= 0) {
137: roll[r] = die();
138: if (load[r] == GRAPE)
139: chits = hit[r];
140: else {
141: struct Tables *t;
142: hit[r] = hit[r] > 10 ? 10 : hit[r];
143: t = &(shootat[r] ? RigTable : HullTable)[hit[r]][roll[r]-1];
144: chits = t->C;
145: rhits = t->R;
146: hhits = t->H;
147: ghits = t->G;
148: if (scene[game].ship[closest[r]].file -> FS)
149: rhits *= 2;
150: if (load[r] == CHAIN) {
151: ghits = 0;
152: hhits = 0;
153: }
154: }
155: table(shootat[r], load[r], hit[r], closest[r], player, roll[r]);
156: }
157: scroll = 18;
158: move(scroll++, 0);
159: clearline();
160: printw("Damage inflicted on the %s:", scene[game].ship[closest[r]].shipname);
161: move(scroll++, 0);
162: clearline();
163: printw("\t%d HULL, %d GUNS, %d CREW, %d RIGGING", hhits, ghits, chits, rhits);
164: load[r] = 0;
165: if (!r) {
166: ptr1 -> loadL = 0;
167: ptr1 -> readyL = 0;
168: } else {
169: ptr1 -> loadR = 0;
170: ptr1 -> readyR = 0;
171: }
172: }
173: } else {
174: load[r] = 0;
175: Signal("Unable to fire %s broadside", -1, (r?"right":"left"));
176: }
177: } else
178: Signal("Unable to fire %s broadside", -1, (r?"right":"left"));
179: }
180: }
181:
182: leave(conditions)
183: int conditions;
184: {
185: FILE *fp;
186: int people;
187: float net;
188: char * capn;
189: char message[60];
190: register int n;
191: struct logs log[10], temp;
192:
193: signal(SIGHUP, SIG_IGN);
194: signal(SIGINT, SIG_IGN);
195: signal(SIGQUIT, SIG_IGN);
196: signal(SIGALRM, SIG_IGN);
197: signal(SIGCHLD, SIG_IGN);
198:
199: if (conditions != -1) {
200: capn = scene[game].ship[player].file -> captain;
201: sprintf(message,"Captain %s relinquishing.",capn);
202: Write(FILES + player, 1, 164, message);
203:
204: if (fp = fopen(LOGFILE, "r+")) {
205: net = (float) (scene[game].ship[player].file -> points) / specs[scene[game].ship[player].shipnum].pts;
206: people = getw(fp);
207: n = fread(log, sizeof(struct logs), 10, fp);
208: for (; n < 10; n++)
209: log[n].fname[0] = log[n].uid = log[n].fshipnum = log[n].fgamenum = log[n].netpoints = 0;
210: rewind(fp);
211: if(people < 0)
212: putw(1, fp);
213: else
214: putw(people+1, fp);
215: for (n=0; n < 10; n++)
216: if (net > (float) log[n].netpoints / specs[scene[log[n].fgamenum].ship[log[n].fshipnum].shipnum].pts) {
217: fwrite(log, sizeof(struct logs), n, fp);
218: strcpy(temp.fname, capn);
219: temp.uid = getuid();
220: temp.fshipnum = player;
221: temp.fgamenum = game;
222: temp.netpoints = scene[game].ship[player].file -> points;
223: fwrite(&temp, sizeof(struct logs), 1, fp);
224: fwrite(log + n, sizeof(struct logs), 9 - n, fp);
225: break;
226: }
227: fclose(fp);
228: }
229: Write(FILES + player, 1, 0, " ");
230: Write(SCENARIO, 0, 8, scene[game].people - 1);
231: if (done_curses) {
232: screen();
233: Signal("It looks like you've had it!", -1, 0);
234: if (conditions == 1)
235: Signal("Your ship was captured.", -1, 0);
236: else if (conditions == 2)
237: Signal("No more enemies.", -1, 0);
238: else if (conditions == 3)
239: Signal("Hurricane! All ships destroyed.",
240: -1, 0);
241: else if (conditions == 4)
242: Signal("The driver died.", -1, 0);
243: move(0, LINES-1);
244: scroll = LINES;
245: clearline();
246: refresh();
247: } else {
248: if (conditions == 4)
249: printf("The driver died.\n");
250: }
251: fclose(syncfile);
252: }
253: if (done_curses) {
254: nocrmode();
255: echo();
256: endwin();
257: }
258: exit(0);
259: }
260:
261: choke()
262: {
263: leave(0);
264: }
265:
266: #include <sys/wait.h>
267:
268: child()
269: {
270: union wait status;
271: int pid;
272:
273: signal(SIGCHLD, SIG_IGN);
274: do {
275: pid = wait3(&status, WNOHANG|WUNTRACED, 0);
276: if (pid < 0 || pid > 0 && !WIFSTOPPED(status))
277: leave(4);
278: } while (pid != 0);
279: signal(SIGCHLD, child);
280: }
281:
282: grapungrap()
283: {
284: register int n, k, l, number, captured;
285: int buf;
286:
287: for (n=0; n < scene[game].vessels ; n++) {
288: if (n != player && (range(player, n) <= 1 || grapple(player, n))) {
289: if ((captured = scene[game].ship[n].file -> captured) < 0)
290: captured = n;
291: Signal("Attempt to grapple or ungrapple %s (%c%c): ", n, 0);
292: while ((buf = getch()) == EOF);
293: addch(buf);
294: if (buf == 'g') {
295: number = die() < 3;
296: if (!number && scene[game].ship[player].nationality == scene[game].ship[captured].nationality)
297: number = 1;
298: if (number) {
299: for (l=0; l < 10 && scene[game].ship[player].file -> grapples[l].turnfoul; l++);
300: if (!scene[game].ship[player].file -> grapples[l].turnfoul) {
301: Write(FILES + player, 0, 124 + l*4, turn);
302: Write(FILES + player, 0, 124 + l*4 + 2, n);
303: }
304: for (l=0; l < 10 && scene[game].ship[n].file -> grapples[l].turnfoul; l++);
305: if (!scene[game].ship[n].file -> grapples[l].turnfoul) {
306: Write(FILES + n, 0, 124 + l*4, turn);
307: Write(FILES + n, 0, 124 + l*4 + 2, player);
308: }
309: }
310: if (number) {
311: Signal("Attempt succeeds!", 0, 0);
312: makesignal("grappled with %s (%c%c)", n, player);
313: } else
314: Signal("Attempt fails.", 0, 0);
315: }
316: if (buf == 'u') {
317: for (k=0; k < 10; k++) {
318: if (scene[game].ship[player].file -> grapples[k].turnfoul && n == scene[game].ship[player].file -> grapples[k].toship) {
319: if (die() < 3 || scene[game].ship[player].nationality == scene[game].ship[captured].nationality) {
320: cleangrapple(player, n, k);
321: Signal("Attempt succeeds!", 0, 0);
322: makesignal("ungrappling with %s (%c%c)", n, player);
323: } else
324: Signal("Attempt fails.", 0, 0);
325: }
326: }
327: }
328: }
329: }
330: }
331:
332: unfoulplayer()
333: {
334: register int n, toship;
335: int buf;
336:
337: for (n=0; n < 10; n++) {
338: if (scene[game].ship[player].file -> fouls[n].turnfoul) {
339: Signal("Attempt to unfoul with the %s (%c%c)? ", (toship = scene[game].ship[player].file -> fouls[n].toship), 0);
340: while ((buf = getch()) == EOF);
341: addch(buf);
342: if (buf == 'y' && die() < 3) {
343: cleanfoul(player, toship, n);
344: Signal("Attempt succeeds!", 0, 0);
345: makesignal("unfouling %s (%c%c)", toship, player);
346: } else if (buf == 'y')
347: Signal("Attempt fails.", 0, 0);
348: }
349: }
350: }
351:
352: initialize(nodriver, randomize, debug)
353: char randomize, nodriver, debug;
354: {
355: char comm[80], file[25], capn;
356: char message[60];
357: int load = ROUND, ready = -30000;
358: int people = 0;
359: int pid;
360: register int n;
361: register int k;
362: char *nameptr;
363:
364: srand(pid = getpid());
365:
366: if (game < 0) {
367: puts("Choose a scenario:\n");
368: puts("\n\tNUMBER\tSHIPS\tIN PLAY\tTITLE");
369: for (n=0; n < NUMOFSCENES; n++) {
370: sprintf(file, "/tmp/.%d", n);
371: printf("\t%d):\t%d", n, scene[n].vessels);
372: if (access(file, 0) >= 0)
373: printf("\tYES");
374: else
375: printf("\tno");
376: printf("\t%s\n", scene[n].name);
377: }
378: reprint:
379: printf("\nScenario number? ");
380: fflush(stdout);
381: scanf("%d", &game);
382: while (getchar() != '\n');
383: }
384: if (game < 0 || game >= NUMOFSCENES) {
385: puts("Very funny.");
386: exit(1);
387: }
388: sprintf(file, "/tmp/.%d", game);
389: if (access(file, 0) < 0) {
390: int omask;
391: #ifdef SETUID
392: omask = umask(077);
393: #else
394: omask = umask(011);
395: #endif
396: syncfile = fopen(file, "w+");
397: umask(omask);
398: } else {
399: syncfile = fopen(file, "r+");
400: people = 1;
401: }
402: lastsync = 0;
403: for (n=0; n < scene[game].vessels; n++) {
404: nation[scene[game].ship[n].nationality + 1] = n + 1;
405: if ((scene[game].ship[n].file = (struct File *) calloc(1, sizeof(struct File))) == NULL) {
406: puts("OUT OF MEMORY");
407: exit(0);
408: }
409: scene[game].ship[n].file -> captured = -1;
410: }
411: if (!nation[2])
412: nation[2] = nation[1];
413: if (!nation[3])
414: nation[3] = nation[2];
415: if (people > 0) {
416: puts("Synchronizing with the other players...");
417: fflush(stdout);
418: sync();
419: capn = 1;
420: for (n=0; n < scene[game].vessels && capn; n++) {
421: capn = scene[game].ship[n].file -> captain[0];
422: if (scene[game].ship[n].file -> struck || scene[game].ship[n].file -> captured > -1)
423: capn = 1;
424: }
425: if (!capn)
426: player = n-1;
427: else {
428: puts("All ships taken in that scenario.");
429: for (n=0; n < scene[game].vessels; n++)
430: free(scene[game].ship[n].file);
431: people = 0;
432: for (n=0; n < 5; n++)
433: nation[n] = 0;
434: fclose(syncfile);
435: goto reprint;
436: }
437: } else
438: player = 0;
439: while (randomize) {
440: static char *color[] =
441: { "(American)", "(British)", "(Spanish)", "(French)" };
442: puts(scene[game].name);
443: putchar('\n');
444: for (n=0; n < scene[game].vessels; n++) {
445: printf(" %2d: %-10s %-15s (%-2d pts) ",
446: n,
447: color[scene[game].ship[n].nationality],
448: scene[game].ship[n].shipname,
449: specs[scene[game].ship[n].shipnum].pts);
450: if(scene[game].ship[n].file -> captain[0])
451: puts(scene[game].ship[n].file -> captain);
452: else if (scene[game].ship[n].file -> struck)
453: puts("(struck)");
454: else if(scene[game].ship[n].file -> captured > -1)
455: puts("(captured)");
456: else
457: puts("(available)");
458: }
459: putchar('\n');
460: printf("Which ship do you want (0-%d)? ",scene[game].vessels-1);
461: fflush(stdout);
462: if (scanf("%d",&player) != 1 || player < 0 || player >= scene[game].vessels) {
463: while (getchar() != '\n');
464: puts("Say what?");
465: } else {
466: while (getchar() != '\n');
467: sync();
468: if (scene[game].ship[player].file -> captain[0] || scene[game].ship[player].file -> struck || scene[game].ship[player].file -> captured > -1)
469: puts("Sorry, that ship is taken.");
470: else
471: break;
472: }
473: }
474:
475: signal(SIGHUP, choke);
476: signal(SIGINT, choke);
477: signal(SIGQUIT, choke);
478: signal(SIGCHLD, child);
479:
480: Write(FILES + player, 1, 0, "begin"); /* he now exists */
481: if (people)
482: Write(SCENARIO, 0, 8, scene[game].people + 1);
483: sync();
484: printf("Your ship is the %s, a %s (%s crew).\n", scene[game].ship[player].shipname, info(player, message), quality(player));
485: if ((nameptr = (char *) getenv("NAME")) && *nameptr)
486: strcpy(comm,nameptr);
487: else {
488: fputs("Your name, Captain? ", stdout);
489: fflush(stdout);
490: gets(comm);
491: if (!*comm) strcpy(comm, "no name");
492: }
493: comm[19] = '\0';
494: for (k=0; k < 2; k++) {
495: printf("\nInitial broadside %s (grape, chain, round, double): ", (k ? "right" : "left"));
496: fflush(stdout);
497: scanf("%s", file);
498: switch(*file) {
499: case 'g':
500: load = GRAPE;
501: break;
502: case 'c':
503: load = CHAIN;
504: break;
505: case 'r':
506: load = ROUND;
507: break;
508: case 'd':
509: load = DOUBLE;
510: break;
511: }
512: if (k) {
513: scene[game].ship[player].file -> loadR = load;
514: scene[game].ship[player].file -> readyR = ready;
515: } else {
516: scene[game].ship[player].file -> loadL = load;
517: scene[game].ship[player].file -> readyL = ready;
518: }
519: }
520: Write(FILES + player, 1, 0, comm);
521: if (!people && !nodriver) {
522: char num[10];
523: sprintf(num, "%d", game);
524: if (!fork()) {
525: if (debug)
526: execl(DEBUGDRIVER, DRIVERNAME, num, 0);
527: else
528: execl(DRIVER, DRIVERNAME, num, 0);
529: perror(DRIVER);
530: kill(pid, SIGKILL);
531: exit(1);
532: }
533: }
534:
535: initscr();
536: view = newwin(ROWSINVIEW, COLSINVIEW, 2, 1);
537: slot = newwin(ROWSINVIEW, 3, 2, 1+COLSINVIEW);
538: done_curses++;
539: noecho();
540: crmode();
541:
542: board();
543: sprintf(message, "Captain %s assuming command",comm);
544: Write(FILES + player, 1, 164, message);
545: windspeed = scene[game].windspeed;
546: winddir = scene[game].winddir;
547: turn = scene[game].turn;
548:
549: iplotships(); /* new turn */
550: }
551:
552: /*
553: * Returns the NUMBER of the closest ship
554: */
555: closestenemy(fromship, side, anyship)
556: int fromship;
557: char side, anyship;
558: {
559: register int n, olddist = 30000, ident, captured;
560: register int dist, eclosest = 30000;
561:
562: if ((ident = scene[game].ship[fromship].file -> captured) < 0)
563: ident = fromship;
564: for (n=0; n < scene[game].vessels; n++) {
565: if ((captured = scene[game].ship[n].file -> captured) < 0)
566: captured = n;
567: if (n != fromship && pos[n].dir && (scene[game].ship[ident].nationality != scene[game].ship[captured].nationality || anyship)) {
568: if (!side || gunsbear(fromship, n) == side) {
569: dist = range(fromship, n);
570: if (dist < olddist) {
571: eclosest = n;
572: olddist = dist;
573: }
574: }
575: }
576: }
577: if (!side && olddist == 30000)
578: leave(2);
579: return(eclosest);
580: }
581:
582: main(argc, argv)
583: int argc;
584: char ** argv;
585: {
586: register int crew, aheadfirst, ma, n;
587: int ta;
588: char message[60], ch;
589: int uid;
590: char nodrive = 0, randomize = 0, debug = 0;
591: char *badstring();
592: extern char _sobuf[];
593:
594: setbuf(stdout, _sobuf);
595:
596: while (*++argv && **argv == '-')
597: switch (*++*argv) {
598: case 'd':
599: nodrive = 1;
600: break;
601: case 'D':
602: debug++;
603: break;
604: case 'x':
605: randomize = 1;
606: break;
607: default:
608: printf("Unknown flag '%s'\n",*argv);
609: break;
610: }
611: if (*argv)
612: game = atoi(*argv);
613: else
614: game = -1;
615: initialize(nodrive, randomize, debug);
616: Signal("Aye aye, Sir", 0, 0);
617: for(;;) {
618: move(scroll++,0);
619: clearline();
620: addch('~');
621: move(--scroll,0);
622: refresh();
623: ch = getch();
624: switch(ch) {
625: case 'm':
626: crew = specs[scene[game].ship[player].shipnum].crew3;
627: if (crew && !grappled(player) && !fouled(player) && windspeed) {
628: ta = maxturns(player);
629: aheadfirst = ta & 0100000;
630: ma = maxmove(player, pos[player].dir, 0);
631: ta &= 077777;
632: acceptmove(ma, ta, aheadfirst);
633: } else
634: Signal("Unable to move", 0, 0);
635: break;
636: case 's':
637: acceptsignal();
638: break;
639: case 'g':
640: grapungrap();
641: break;
642: case 'u':
643: unfoulplayer();
644: break;
645: case 'v':
646: version();
647: break;
648: case 'b':
649: boarding();
650: break;
651: case 'f':
652: acceptcombat();
653: break;
654: case 'l':
655: loadplayer();
656: break;
657: case 'c':
658: changesail();
659: break;
660: case 'r':
661: repair();
662: break;
663: case 'B':
664: Signal("'Hands to stations!'", 0, 0);
665: unboard(player, player, 1); /* cancel DBP's */
666: unboard(player, player, 0); /* cancel offense */
667: break;
668: case '\f':
669: signal(SIGALRM, SIG_IGN);
670: viewrow = pos[player].row - ROWSINVIEW / 2;
671: viewcol = pos[player].col - COLSINVIEW / 2;
672: board();
673: plotships(); /* don't create new turn */
674: break;
675: case 'L':
676: scene[game].ship[player].file -> loadL = 0;
677: scene[game].ship[player].file -> loadR = 0;
678: scene[game].ship[player].file -> readyL = 0;
679: scene[game].ship[player].file -> readyR = 0;
680: Signal("Broadsides unloaded", 0, 0);
681: break;
682: case 'q':
683: Signal("Type 'Q' to quit", 0, 0);
684: break;
685: case 'Q':
686: leave(0);
687: break;
688: case 'I':
689: for (n = 0; n < scene[game].vessels; n++)
690: eyeball(player, n);
691: break;
692: case 'i':
693: n = closestenemy(player, 0, 1);
694: eyeball(player, n);
695: break;
696: }
697: signalflags();
698: lost();
699: }
700: }
701:
702: char *saywhat(n)
703: int n;
704: {
705: if(scene[game].ship[n].file -> captain[0])
706: return(scene[game].ship[n].file -> captain);
707: else if (scene[game].ship[n].file -> struck)
708: return("(struck)");
709: else if(scene[game].ship[n].file -> captured > -1)
710: return("(captured)");
711: else
712: return("(computer)");
713: }
714:
715: eyeball(player, n)
716: int player, n;
717: {
718: char message[80];
719: register i;
720:
721: if (scene[game].ship[n].shipdir) {
722: sprintf(message, "%d, %s", range(player, n), saywhat(n));
723: Signal("Sail ho! (range %s)", -1, message);
724: switch(scene[game].ship[n].nationality) {
725: case 0:
726: strcpy(message, "American ");
727: break;
728: case 1:
729: strcpy(message, "British ");
730: break;
731: case 2:
732: strcpy(message, "Spanish ");
733: break;
734: case 3:
735: strcpy(message, "French ");
736: break;
737: default:
738: strcpy(message, "Gremlin ");
739: break;
740: }
741: switch(specs[scene[game].ship[n].shipnum].class) {
742: case 1:
743: case 2:
744: strcat(message, "Ship of the Line ");
745: break;
746: case 3:
747: case 4:
748: strcat(message, "Frigate ");
749: break;
750: case 5:
751: case 6:
752: strcat(message, "Sloop ");
753: break;
754: }
755: switch(portside(player, n, 1) - pos[player].dir) {
756: case -7:
757: case 1:
758: strcat(message, "off the starboard bow.");
759: break;
760: case -6:
761: case 2:
762: strcat(message, "off the starboard beam.");
763: break;
764: case -5:
765: case 3:
766: strcat(message, "off the starboard quarter.");
767: break;
768: case -4:
769: case 4:
770: strcat(message, "dead astern.");
771: break;
772: case -3:
773: case 5:
774: strcat(message, "off the port quarter.");
775: break;
776: case -2:
777: case 6:
778: strcat(message, "off the port beam.");
779: break;
780: case -1:
781: case 7:
782: strcat(message, "off the port bow.");
783: break;
784: case 0:
785: strcat(message, "dead ahead.");
786: break;
787: }
788: Signal(message, 0, 0);
789: }
790: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.