|
|
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: signal(SIGTSTP, SIG_IGN);
199:
200: if (conditions != -1) {
201: capn = scene[game].ship[player].file->captain;
202: sprintf(message,"Captain %s relinquishing.",capn);
203: Write(FILES + player, 1, 164, message);
204:
205: if (fp = fopen(LOGFILE, "r+")) {
206: net = (float) (scene[game].ship[player].file->points) / specs[scene[game].ship[player].shipnum].pts;
207: (void) fread(&people, sizeof people, 1, fp);
208: n = fread(log, sizeof(struct logs), 10, fp);
209: for (; n < 10; n++) {
210: log[n].fname[0] = 0;
211: log[n].uid = 0;
212: log[n].fshipnum = 0;
213: log[n].fgamenum = 0;
214: log[n].netpoints = -1;
215: }
216: rewind(fp);
217: if(people < 0) {
218: people = 1;
219: (void) fwrite(&people, sizeof people, 1, fp);
220: }
221: else {
222: people++;
223: (void) fwrite(&people, sizeof people, 1, fp);
224: }
225: for (n=0; n < 10; n++)
226: if (net > (float) log[n].netpoints / specs[scene[log[n].fgamenum].ship[log[n].fshipnum].shipnum].pts) {
227: fwrite(log, sizeof(struct logs), n, fp);
228: strcpy(temp.fname, capn);
229: temp.uid = getuid();
230: temp.fshipnum = player;
231: temp.fgamenum = game;
232: temp.netpoints = scene[game].ship[player].file->points;
233: fwrite(&temp, sizeof(struct logs), 1, fp);
234: fwrite(log + n, sizeof(struct logs), 9 - n, fp);
235: break;
236: }
237: fclose(fp);
238: }
239: Write(FILES + player, 1, 0, " ");
240: Write(SCENARIO, 0, 8, scene[game].people - 1);
241: if (done_curses) {
242: screen();
243: Signal("It looks like you've had it!", -1, 0);
244: if (conditions == 1)
245: Signal("Your ship was captured.", -1, 0);
246: else if (conditions == 2)
247: Signal("No more enemies.", -1, 0);
248: else if (conditions == 3)
249: Signal("Hurricane! All ships destroyed.",
250: -1, 0);
251: else if (conditions == 4)
252: Signal("The driver died.", -1, 0);
253: move(0, LINES-1);
254: scroll = LINES;
255: clearline();
256: refresh();
257: } else {
258: if (conditions == 4)
259: printf("The driver died.\n");
260: }
261: fclose(syncfile);
262: }
263: if (done_curses) {
264: nocrmode();
265: echo();
266: endwin();
267: }
268: exit(0);
269: }
270:
271: choke()
272: {
273: leave(0);
274: }
275:
276: #include <wait.h>
277:
278: child()
279: {
280: union wait status;
281: int pid;
282:
283: signal(SIGCHLD, SIG_IGN);
284: do {
285: pid = vwait(&status, WNOHANG|WUNTRACED, 0);
286: if (pid < 0 || pid > 0 && !WIFSTOPPED(status))
287: leave(4);
288: } while (pid != 0);
289: signal(SIGCHLD, child);
290: }
291:
292: grapungrap()
293: {
294: register int n, k, l, number, captured;
295: int buf;
296:
297: for (n=0; n < scene[game].vessels ; n++) {
298: if (n != player && (range(player, n) <= 1 || grapple(player, n))) {
299: if ((captured = scene[game].ship[n].file->captured) < 0)
300: captured = n;
301: Signal("Attempt to grapple or ungrapple %s (%c%c): ", n, 0);
302: while ((buf = getch()) == EOF);
303: addch(buf);
304: if (buf == 'g') {
305: number = die() < 3;
306: if (!number && scene[game].ship[player].nationality == scene[game].ship[captured].nationality)
307: number = 1;
308: if (number) {
309: for (l=0; l < 10 && scene[game].ship[player].file->grapples[l].turnfoul; l++);
310: if (!scene[game].ship[player].file->grapples[l].turnfoul) {
311: Write(FILES + player, 0, 124 + l*4, turn);
312: Write(FILES + player, 0, 124 + l*4 + 2, n);
313: }
314: for (l=0; l < 10 && scene[game].ship[n].file->grapples[l].turnfoul; l++);
315: if (!scene[game].ship[n].file->grapples[l].turnfoul) {
316: Write(FILES + n, 0, 124 + l*4, turn);
317: Write(FILES + n, 0, 124 + l*4 + 2, player);
318: }
319: }
320: if (number) {
321: Signal("Attempt succeeds!", 0, 0);
322: makesignal("grappled with %s (%c%c)", n, player);
323: } else
324: Signal("Attempt fails.", 0, 0);
325: }
326: if (buf == 'u') {
327: for (k=0; k < 10; k++) {
328: if (scene[game].ship[player].file->grapples[k].turnfoul && n == scene[game].ship[player].file->grapples[k].toship) {
329: if (die() < 3 || scene[game].ship[player].nationality == scene[game].ship[captured].nationality) {
330: cleangrapple(player, n, k);
331: Signal("Attempt succeeds!", 0, 0);
332: makesignal("ungrappling with %s (%c%c)", n, player);
333: } else
334: Signal("Attempt fails.", 0, 0);
335: }
336: }
337: }
338: }
339: }
340: }
341:
342: unfoulplayer()
343: {
344: register int n, toship;
345: int buf;
346:
347: for (n=0; n < 10; n++) {
348: if (scene[game].ship[player].file->fouls[n].turnfoul) {
349: Signal("Attempt to unfoul with the %s (%c%c)? ", (toship = scene[game].ship[player].file->fouls[n].toship), 0);
350: while ((buf = getch()) == EOF);
351: addch(buf);
352: if (buf == 'y' && die() < 3) {
353: cleanfoul(player, toship, n);
354: Signal("Attempt succeeds!", 0, 0);
355: makesignal("unfouling %s (%c%c)", toship, player);
356: } else if (buf == 'y')
357: Signal("Attempt fails.", 0, 0);
358: }
359: }
360: }
361:
362: initialize(nodriver, randomize, debug)
363: char randomize, nodriver, debug;
364: {
365: char comm[80], file[25], capn;
366: char message[60];
367: int load = ROUND, ready = -30000;
368: int people = 0;
369: int pid;
370: register int n;
371: register int k;
372: char *nameptr;
373:
374: srand(pid = getpid());
375:
376: if (game < 0) {
377: puts("Choose a scenario:\n");
378: puts("\n\tNUMBER\tSHIPS\tIN PLAY\tTITLE");
379: for (n=0; n < NUMOFSCENES; n++) {
380: sprintf(file, "/tmp/.sail.%d", n);
381: printf("\t%d):\t%d", n, scene[n].vessels);
382: if (access(file, 0) >= 0)
383: printf("\tYES");
384: else
385: printf("\tno");
386: printf("\t%s\n", scene[n].name);
387: }
388: reprint:
389: printf("\nScenario number? ");
390: fflush(stdout);
391: scanf("%d", &game);
392: while (getchar() != '\n');
393: }
394: if (game < 0 || game >= NUMOFSCENES) {
395: puts("Very funny.");
396: exit(1);
397: }
398: sprintf(file, "/tmp/.sail.%d", game);
399: if (access(file, 0) < 0) {
400: int omask;
401: #ifdef SETUID
402: omask = umask(077);
403: #else
404: omask = umask(011);
405: #endif
406: syncfile = fopen(file, "w+");
407: umask(omask);
408: } else {
409: syncfile = fopen(file, "r+");
410: people = 1;
411: }
412: lastsync = 0;
413: for (n=0; n < scene[game].vessels; n++) {
414: nation[scene[game].ship[n].nationality + 1] = n + 1;
415: if ((scene[game].ship[n].file = (struct File *) calloc(1, sizeof(struct File))) == NULL) {
416: puts("OUT OF MEMORY");
417: exit(0);
418: }
419: scene[game].ship[n].file->captured = -1;
420: }
421: if (!nation[2])
422: nation[2] = nation[1];
423: if (!nation[3])
424: nation[3] = nation[2];
425: if (people > 0) {
426: puts("Synchronizing with the other players...");
427: fflush(stdout);
428: sync();
429: capn = 1;
430: for (n=0; n < scene[game].vessels && capn; n++) {
431: capn = scene[game].ship[n].file->captain[0];
432: if (scene[game].ship[n].file->struck || scene[game].ship[n].file->captured > -1)
433: capn = 1;
434: }
435: if (!capn)
436: player = n-1;
437: else {
438: puts("All ships taken in that scenario.");
439: for (n=0; n < scene[game].vessels; n++)
440: free(scene[game].ship[n].file);
441: people = 0;
442: for (n=0; n < 5; n++)
443: nation[n] = 0;
444: fclose(syncfile);
445: goto reprint;
446: }
447: } else
448: player = 0;
449: while (randomize) {
450: static char *color[] =
451: { "(American)", "(British)", "(Spanish)", "(French)" };
452: puts(scene[game].name);
453: putchar('\n');
454: for (n=0; n < scene[game].vessels; n++) {
455: printf(" %2d: %-10s %-15s (%-2d pts) ",
456: n,
457: color[scene[game].ship[n].nationality],
458: scene[game].ship[n].shipname,
459: specs[scene[game].ship[n].shipnum].pts);
460: if(scene[game].ship[n].file->captain[0])
461: puts(scene[game].ship[n].file->captain);
462: else if (scene[game].ship[n].file->struck)
463: puts("(struck)");
464: else if(scene[game].ship[n].file->captured > -1)
465: puts("(captured)");
466: else
467: puts("(available)");
468: }
469: putchar('\n');
470: printf("Which ship do you want (0-%d)? ",scene[game].vessels-1);
471: fflush(stdout);
472: if (scanf("%d",&player) != 1 || player < 0 || player >= scene[game].vessels) {
473: while (getchar() != '\n');
474: puts("Say what?");
475: } else {
476: while (getchar() != '\n');
477: sync();
478: if (scene[game].ship[player].file->captain[0] || scene[game].ship[player].file->struck || scene[game].ship[player].file->captured > -1)
479: puts("Sorry, that ship is taken.");
480: else
481: break;
482: }
483: }
484:
485: signal(SIGHUP, choke);
486: signal(SIGINT, choke);
487: signal(SIGQUIT, choke);
488: signal(SIGCHLD, child);
489: signal(SIGTSTP, SIG_IGN);
490:
491: Write(FILES + player, 1, 0, "begin"); /* he now exists */
492: if (people)
493: Write(SCENARIO, 0, 8, scene[game].people + 1);
494: sync();
495: printf("Your ship is the %s, a %s (%s crew).\n", scene[game].ship[player].shipname, info(player, message), quality(player));
496: if ((nameptr = (char *) getenv("NAME")) && *nameptr)
497: strcpy(comm,nameptr);
498: else {
499: fputs("Your name, Captain? ", stdout);
500: fflush(stdout);
501: gets(comm);
502: if (!*comm) strcpy(comm, "no name");
503: }
504: comm[19] = '\0';
505: for (k=0; k < 2; k++) {
506: printf("\nInitial broadside %s (grape, chain, round, double): ", (k ? "right" : "left"));
507: fflush(stdout);
508: scanf("%s", file);
509: switch(*file) {
510: case 'g':
511: load = GRAPE;
512: break;
513: case 'c':
514: load = CHAIN;
515: break;
516: case 'r':
517: load = ROUND;
518: break;
519: case 'd':
520: load = DOUBLE;
521: break;
522: }
523: if (k) {
524: scene[game].ship[player].file->loadR = load;
525: scene[game].ship[player].file->readyR = ready;
526: } else {
527: scene[game].ship[player].file->loadL = load;
528: scene[game].ship[player].file->readyL = ready;
529: }
530: }
531: Write(FILES + player, 1, 0, comm);
532: if (!people && !nodriver) {
533: char num[10];
534: sprintf(num, "%d", game);
535: if (!fork()) {
536: if (debug)
537: execl(DEBUGDRIVER, DRIVERNAME, num, 0);
538: else
539: execl(DRIVER, DRIVERNAME, num, 0);
540: perror(DRIVER);
541: kill(pid, SIGKILL);
542: exit(1);
543: }
544: }
545:
546: initscr();
547: view = newwin(ROWSINVIEW, COLSINVIEW, 2, 1);
548: slot = newwin(ROWSINVIEW, 3, 2, 1+COLSINVIEW);
549: done_curses++;
550: noecho();
551: crmode();
552:
553: board();
554: sprintf(message, "Captain %s assuming command",comm);
555: Write(FILES + player, 1, 164, message);
556: windspeed = scene[game].windspeed;
557: winddir = scene[game].winddir;
558: turn = scene[game].turn;
559:
560: iplotships(); /* new turn */
561: }
562:
563: /*
564: * Returns the NUMBER of the closest ship
565: */
566: closestenemy(fromship, side, anyship)
567: int fromship;
568: char side, anyship;
569: {
570: register int n, olddist = 30000, ident, captured;
571: register int dist, eclosest = 30000;
572:
573: if ((ident = scene[game].ship[fromship].file->captured) < 0)
574: ident = fromship;
575: for (n=0; n < scene[game].vessels; n++) {
576: if ((captured = scene[game].ship[n].file->captured) < 0)
577: captured = n;
578: if (n != fromship && pos[n].dir && (scene[game].ship[ident].nationality != scene[game].ship[captured].nationality || anyship)) {
579: if (!side || gunsbear(fromship, n) == side) {
580: dist = range(fromship, n);
581: if (dist < olddist) {
582: eclosest = n;
583: olddist = dist;
584: }
585: }
586: }
587: }
588: if (!side && olddist == 30000)
589: leave(2);
590: return(eclosest);
591: }
592:
593: main(argc, argv)
594: int argc;
595: char ** argv;
596: {
597: register int crew, aheadfirst, ma, n;
598: int ta;
599: char message[60], ch;
600: int uid;
601: char nodrive = 0, randomize = 0, debug = 0;
602: char *badstring();
603: extern char _sobuf[];
604:
605: setbuf(stdout, _sobuf);
606:
607: while (*++argv && **argv == '-')
608: switch (*++*argv) {
609: case 'd':
610: nodrive = 1;
611: break;
612: case 'D':
613: debug++;
614: break;
615: case 'x':
616: randomize = 1;
617: break;
618: default:
619: printf("Unknown flag '%s'\n",*argv);
620: break;
621: }
622: if (*argv)
623: game = atoi(*argv);
624: else
625: game = -1;
626: initialize(nodrive, randomize, debug);
627: Signal("Aye aye, Sir", 0, 0);
628: for(;;) {
629: move(scroll++,0);
630: clearline();
631: addch('~');
632: move(--scroll,0);
633: refresh();
634: ch = getch();
635: switch(ch) {
636: case 'm':
637: crew = specs[scene[game].ship[player].shipnum].crew3;
638: if (crew && !grappled(player) && !fouled(player) && windspeed) {
639: ta = maxturns(player);
640: aheadfirst = ta & 0100000;
641: ma = maxmove(player, pos[player].dir, 0);
642: ta &= 077777;
643: acceptmove(ma, ta, aheadfirst);
644: } else
645: Signal("Unable to move", 0, 0);
646: break;
647: case 's':
648: acceptsignal();
649: break;
650: case 'g':
651: grapungrap();
652: break;
653: case 'u':
654: unfoulplayer();
655: break;
656: case 'v':
657: version();
658: break;
659: case 'b':
660: boarding();
661: break;
662: case 'f':
663: acceptcombat();
664: break;
665: case 'l':
666: loadplayer();
667: break;
668: case 'c':
669: changesail();
670: break;
671: case 'r':
672: repair();
673: break;
674: case 'B':
675: Signal("'Hands to stations!'", 0, 0);
676: unboard(player, player, 1); /* cancel DBP's */
677: unboard(player, player, 0); /* cancel offense */
678: break;
679: case '\f':
680: signal(SIGALRM, SIG_IGN);
681: viewrow = pos[player].row - ROWSINVIEW / 2;
682: viewcol = pos[player].col - COLSINVIEW / 2;
683: board();
684: plotships(); /* don't create new turn */
685: break;
686: case 'L':
687: scene[game].ship[player].file->loadL = 0;
688: scene[game].ship[player].file->loadR = 0;
689: scene[game].ship[player].file->readyL = 0;
690: scene[game].ship[player].file->readyR = 0;
691: Signal("Broadsides unloaded", 0, 0);
692: break;
693: case 'q':
694: Signal("Type 'Q' to quit", 0, 0);
695: break;
696: case 'Q':
697: leave(0);
698: break;
699: case 'I':
700: for (n = 0; n < scene[game].vessels; n++)
701: eyeball(player, n);
702: break;
703: case 'i':
704: n = closestenemy(player, 0, 1);
705: eyeball(player, n);
706: break;
707: }
708: signalflags();
709: lost();
710: }
711: }
712:
713: char *saywhat(n)
714: int n;
715: {
716: if(scene[game].ship[n].file->captain[0])
717: return(scene[game].ship[n].file->captain);
718: else if (scene[game].ship[n].file->struck)
719: return("(struck)");
720: else if(scene[game].ship[n].file->captured > -1)
721: return("(captured)");
722: else
723: return("(computer)");
724: }
725:
726: eyeball(player, n)
727: int player, n;
728: {
729: char message[80];
730: register i;
731:
732: if (scene[game].ship[n].shipdir) {
733: sprintf(message, "%d, %s", range(player, n), saywhat(n));
734: Signal("Sail ho! (range %s)", -1, message);
735: switch(scene[game].ship[n].nationality) {
736: case 0:
737: strcpy(message, "American ");
738: break;
739: case 1:
740: strcpy(message, "British ");
741: break;
742: case 2:
743: strcpy(message, "Spanish ");
744: break;
745: case 3:
746: strcpy(message, "French ");
747: break;
748: default:
749: strcpy(message, "Gremlin ");
750: break;
751: }
752: switch(specs[scene[game].ship[n].shipnum].class) {
753: case 1:
754: case 2:
755: strcat(message, "Ship of the Line ");
756: break;
757: case 3:
758: case 4:
759: strcat(message, "Frigate ");
760: break;
761: case 5:
762: case 6:
763: strcat(message, "Sloop ");
764: break;
765: }
766: switch(portside(player, n, 1) - pos[player].dir) {
767: case -7:
768: case 1:
769: strcat(message, "off the starboard bow.");
770: break;
771: case -6:
772: case 2:
773: strcat(message, "off the starboard beam.");
774: break;
775: case -5:
776: case 3:
777: strcat(message, "off the starboard quarter.");
778: break;
779: case -4:
780: case 4:
781: strcat(message, "dead astern.");
782: break;
783: case -3:
784: case 5:
785: strcat(message, "off the port quarter.");
786: break;
787: case -2:
788: case 6:
789: strcat(message, "off the port beam.");
790: break;
791: case -1:
792: case 7:
793: strcat(message, "off the port bow.");
794: break;
795: case 0:
796: strcat(message, "dead ahead.");
797: break;
798: }
799: Signal(message, 0, 0);
800: }
801: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.