date and time created 83/03/17 21:10:03 by leres
authorCraig Leres <leres@ucbvax.Berkeley.EDU>
Fri, 18 Mar 1983 13:10:03 +0000 (05:10 -0800)
committerCraig Leres <leres@ucbvax.Berkeley.EDU>
Fri, 18 Mar 1983 13:10:03 +0000 (05:10 -0800)
SCCS-vsn: games/sail/pl_1.c 1.1

usr/src/games/sail/pl_1.c [new file with mode: 0644]

diff --git a/usr/src/games/sail/pl_1.c b/usr/src/games/sail/pl_1.c
new file mode 100644 (file)
index 0000000..24d36a9
--- /dev/null
@@ -0,0 +1,789 @@
+#ifndef lint
+static char *sccsid = "@(#)pl_1.c      1.1 83/03/17";
+#endif
+#include "player.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+
+WINDOW *view,*slot;
+/* int devestate; */
+
+acceptcombat()
+{
+    int crew[3], men = 0, rangeofshot, target, temp;
+    int n, r, guns[2], load[2], car[2], roll[2];
+    int ready[2], index, rakehim, sternrake;
+    int shootat[2], /*power,*/ hit[2], closest[2], ship;
+    int hhits = 0, ghits = 0, rhits = 0, chits = 0;
+    int buf;
+    struct shipspecs *ptr;
+    struct File *ptr1;
+
+    ptr = &specs[scene[game].ship[player].shipnum];
+    ptr1 = scene[game].ship[player].file;
+    crew[0] = ptr -> crew1;
+    crew[1] = ptr -> crew2;
+    crew[2] = ptr -> crew3;
+    ready[0] = ptr1 -> readyL;
+    ready[1] = ptr1 -> readyR;
+    load[0] = ptr1 -> loadL;
+    load[1] = ptr1 -> loadR;
+    guns[0] = ptr -> gunL;
+    guns[1] = ptr -> gunR;
+    car[0] = ptr -> carL;
+    car[1] = ptr -> carR;
+    for (n = 0; n < 3; n++){
+       if (ptr1 -> OBP[n].turnsent)
+           men += ptr1 -> OBP[n].mensent;
+    }
+    for (n = 0; n < 3; n++){
+       if (ptr1 -> DBP[n].turnsent)
+           men += ptr1 -> DBP[n].mensent;
+    }
+    if (men) {
+       crew[0] = men/100 ? 0 : crew[0] != 0;
+       crew[1] = (men%100)/10 ? 0 : crew[1] != 0;
+       crew[2] = men%10 ? 0 : crew[2] != 0;
+    }
+    for (r = 0; r < 2; r++) {
+       if ((guns[r] || car[r]) && crew[2] && load[r] &&
+         ready[r] <= 0 && !ptr1 -> struck &&
+         ((closest[r] = closestenemy(player, (r ? 'r' : 'l'), 1)) != 30000)) {
+               switch(load[r]) {
+                   case GRAPE:
+                       rangeofshot = 1;
+                       break;
+                   case CHAIN:
+                       rangeofshot = 3;
+                       break;
+                   case DOUBLE:
+                       rangeofshot = 1;
+                       break;
+                   case ROUND:
+                       rangeofshot = 10;
+                       break;
+               }
+/*             if (power)
+                   rangeofshot = 20; */
+               if ((target = range(player, closest[r])) <= rangeofshot &&
+                 !scene[game].ship[closest[r]].file -> struck &&
+                 (guns[r] || (car[r] && target < 3))) {
+                   Signal("%s (%c%c) within range of %s broadside.", closest[r], (r?"right":"left"));
+                   if (load[r] > CHAIN && target < 6) {
+                       Signal("Aim for hull or rigging? ", -1, 0);
+                       while ((buf = getch()) == EOF);
+                           addch(buf);
+                       if(buf == 'r')
+                           shootat[r] = RIGGING;
+                       else if (buf == 'h')
+                           shootat[r] = HULL;
+                       else {
+                           shootat[r] = -1;
+                           Signal("'Avast there! Hold your fire.'", -1, 0);
+                       }
+                   } else {
+                       shootat[r] = RIGGING;
+                       Signal("Fire? ", -1, 0);
+                       while((buf = getch()) == EOF);
+                           addch(buf);
+                       if (buf == 'n') {
+                           shootat[r] = -1;
+                           Signal("Belay that! Hold your fire.", -1, 0);
+                       }
+                   }
+                   if (shootat[r] != -1) {
+                       fired = 1;
+                       rakehim = gunsbear(player, closest[r]) && !gunsbear(closest[r], player);
+                       temp = portside(closest[r], player, 1) - pos[closest[r]].dir + 1;
+                       if (temp < 1)
+                           temp += 8;
+                       if (temp > 8)
+                           temp -= 8;
+                       sternrake = temp > 4 && temp < 6;
+/*                     if (power) {
+                           sternrake = 1;
+                           rakehim = 1;
+                           } */
+                       if (rakehim && !sternrake)
+                           Signal("Raking the %s!", closest[r], 0);
+                       else if (rakehim && sternrake)
+                           Signal("Stern Rake! %s splintering!", closest[r], 0);
+                       index = guns[r];
+                       if (target < 3)
+                           index += car[r];
+                       index = (index - 1)/3;
+                       index = index > 8 ? 8 : index;
+                       if (!rakehim)
+                           hit[r] = HDT[index][target-1];
+                       else
+                           hit[r] = HDTrake[index][target-1];
+                       if (rakehim && sternrake)
+                           hit[r]++;
+                       hit[r] += QUAL[index][ptr -> qual-1];
+                       for (n=0; n < 3 && ptr1 -> captured < 0; n++)
+                           if (!crew[n])
+                               if (index <= 5)
+                                   hit[r]--;
+                               else
+                                   hit[r] -= 2;
+                       if (ready[r] <= -30000)
+                           if (index <= 3)
+                               hit[r]++;
+                           else
+                               hit[r] += 2;
+                       if (ptr1 -> captured > -1)
+                           if (index <= 1)
+                               hit[r]--;
+                           else
+                               hit[r] -= 2;
+                       hit[r] += AMMO[index][load[r] - 1];
+                       if (((temp = ptr -> class) >= 5 || temp == 1) && windspeed == 5)
+                           hit[r]--;
+                       if (windspeed == 6 && temp == 4)
+                           hit[r] -= 2;
+                       if (windspeed == 6 && temp <= 3)
+                           hit[r]--;
+                       if (hit[r] >= 0) {
+                           roll[r] = die();
+                           if (load[r] == GRAPE)
+                               chits = hit[r];
+                           else {
+                               hit[r] = hit[r] > 10 ? 10 : hit[r];
+                               chits = shootat[r] ? RigTable[hit[r]][roll[r]-1].C : HullTable[hit[r]][roll[r]-1].C;
+                               rhits = shootat[r] ? RigTable[hit[r]][roll[r]-1].R : HullTable[hit[r]][roll[r]-1].R;
+/*                             if (devestate && power) {
+                               hhits = 10;
+                               devestate = 0;
+                               }
+                           else */
+                               hhits = shootat[r] ? RigTable[hit[r]][roll[r]-1].H : HullTable[hit[r]][roll[r]-1].H;
+                               ghits = shootat[r] ? RigTable[hit[r]][roll[r]-1].G : HullTable[hit[r]][roll[r]-1].G;
+                               if (scene[game].ship[closest[r]].file -> FS)
+                                   rhits *= 2;
+                               if (load[r] == CHAIN) {
+                                   ghits = 0;
+                                   hhits = 0;
+                               }
+                           }
+/*                         if (power)
+                               table(shootat[r], load[r], 10, closest[r], player, 6);
+                           else */
+                               table(shootat[r], load[r], hit[r], closest[r], player, roll[r]);
+                       }
+                       scroll = 18;
+                       move(scroll++, 0);
+                       clearline();
+                       printw("Damage inflicted on the %s:", scene[game].ship[closest[r]].shipname);
+                       move(scroll++, 0);
+                       clearline();
+                       printw("\t%d HULL, %d GUNS, %d CREW, %d RIGGING", hhits, ghits, chits, rhits);
+                       load[r] = 0;
+                       if (!r) {
+                           ptr1 -> loadL = 0;
+                           ptr1 -> readyL = 0;
+                       } else {
+                           ptr1 -> loadR = 0;
+                           ptr1 -> readyR = 0;
+                       }
+                   }
+               } else {
+                   load[r] = 0;
+                   Signal("Unable to fire %s broadside", -1, (r?"right":"left"));
+               }
+           } else
+               Signal("Unable to fire %s broadside", -1, (r?"right":"left"));
+       }
+}
+
+leave(conditions)
+int conditions;
+{
+    FILE *fp;
+    int people;
+    float net;
+    char * capn;
+    char message[60];
+    register int n;
+    struct logs log[10], temp;
+
+    signal(SIGHUP, SIG_IGN);
+    signal(SIGINT, SIG_IGN);
+    signal(SIGQUIT, SIG_IGN);
+    signal(SIGALRM, SIG_IGN);
+
+    if (conditions != -1) {
+       capn = scene[game].ship[player].file -> captain;
+       sprintf(message,"Captain %s relinquishing.",capn);
+       Write(FILES + player, 1, 164, message);
+       
+       if (fp = fopen(LOGFILE, "r+")) {
+           net = (float) (scene[game].ship[player].file -> points) / specs[scene[game].ship[player].shipnum].pts;
+           people = getw(fp);
+           n = fread(log, sizeof(struct logs), 10, fp);
+           for (; n < 10; n++)
+               log[n].fname[0] = log[n].uid = log[n].fshipnum = log[n].fgamenum = log[n].netpoints = 0;
+           rewind(fp);
+           if(people < 0)
+               putw(1, fp);
+           else
+               putw(people+1, fp);
+           for (n=0; n < 10; n++)
+               if (net > (float) log[n].netpoints / specs[scene[log[n].fgamenum].ship[log[n].fshipnum].shipnum].pts) {
+                   fwrite(log, sizeof(struct logs), n, fp);
+                   strcpy(temp.fname, capn);
+                   temp.uid = getuid();
+                   temp.fshipnum = player;
+                   temp.fgamenum = game;
+                   temp.netpoints = scene[game].ship[player].file -> points;
+                   fwrite(&temp, sizeof(struct logs), 1, fp);
+                   fwrite(log + n, sizeof(struct logs), 9 - n, fp);
+                   break;
+               }
+               fclose(fp);
+           }
+           Write(FILES + player, 1, 0, " ");
+           Write(SCENARIO, 0, 8, scene[game].people - 1);
+           screen();
+           fclose(syncfile);
+           Signal("It looks like you've had it!", -1, 0);
+           if (conditions == 1)
+               Signal("Your ship was captured.", -1, 0);
+           if (conditions == 2)
+               Signal("No more enemies.", -1, 0);
+           if (conditions == 3)
+               Signal("Hurricane!  All ships destroyed.", -1, 0);
+           move(0, LINES-1);
+           scroll = LINES;
+           clearline();
+           refresh();
+       }
+    nocrmode();
+    echo();
+    endwin();
+    exit(0);
+}
+
+choke()
+{
+    leave(0);
+}
+
+grapungrap()
+{
+    register int n, k, l, number, captured;
+    int buf;
+
+    for (n=0; n < scene[game].vessels ; n++) {
+       if (n != player && (range(player, n) <= 1 || grapple(player, n))) {
+           if ((captured = scene[game].ship[n].file -> captured) < 0)
+               captured = n;
+           Signal("Attempt to grapple or ungrapple %s (%c%c): ", n, 0);
+           while((buf = getch()) == EOF);
+               addch(buf);
+           if (buf == 'g') {
+               number = die() < 3;
+               if (!number && scene[game].ship[player].nationality == scene[game].ship[captured].nationality)
+                   number = 1;
+               if (number) {
+                   for (l=0; l < 10 && scene[game].ship[player].file -> grapples[l].turnfoul; l++);
+                       if (!scene[game].ship[player].file -> grapples[l].turnfoul) {
+                           Write(FILES + player, 0, 124 + l*4, turn);
+                           Write(FILES + player, 0, 124 + l*4 + 2, n);
+                       }
+                       for (l=0; l < 10 && scene[game].ship[n].file -> grapples[l].turnfoul; l++);
+                           if (!scene[game].ship[n].file -> grapples[l].turnfoul) {
+                               Write(FILES + n, 0, 124 + l*4, turn);
+                               Write(FILES + n, 0, 124 + l*4 + 2, player);
+                           }
+                   }
+                   if (number) {
+                       Signal("Attempt succeeds!", 0, 0);
+                       makesignal("grappled with %s (%c%c)", n, player);
+                   } else
+                       Signal("Attempt fails.", 0, 0);
+               }
+               if (buf == 'u'){ for (k=0; k < 10; k++) {
+                   if (scene[game].ship[player].file -> grapples[k].turnfoul && n == scene[game].ship[player].file -> grapples[k].toship) {
+                       if (die() < 3 || scene[game].ship[player].nationality == scene[game].ship[captured].nationality) {
+                           cleangrapple(player, n, k);
+                               Signal("Attempt succeeds!", 0, 0);
+                               makesignal("ungrappling with %s (%c%c)", n, player);
+                           } else
+                               Signal("Attempt fails.", 0, 0);
+                       }
+                   }
+               }
+           }
+       }
+}
+
+unfoulplayer()
+{
+    register int n, toship;
+    int buf;
+
+    for (n=0; n < 10; n++) {
+       if (scene[game].ship[player].file -> fouls[n].turnfoul) {
+           Signal("Attempt to unfoul with the %s (%c%c)? ", (toship = scene[game].ship[player].file -> fouls[n].toship), 0);
+           while((buf = getch()) == EOF);
+               addch(buf);
+           if (buf == 'y' && die() < 3) {
+               cleanfoul(player, toship, n);
+               Signal("Attempt succeeds!", 0, 0);
+               makesignal("unfouling %s (%c%c)", toship, player);
+           } else if (buf == 'y')
+               Signal("Attempt fails.", 0, 0);
+       }
+    }
+}
+
+initialize(nodriver, randomize)
+char randomize, nodriver;
+{
+    char comm[80], num[5], file[25], capn;
+    char message[60];
+    int load = ROUND, ready = -30000;
+    int people = 0;
+    int pid;
+    register int n;
+    register int k;
+    struct stat Stat;
+    char *nameptr;
+
+    srand(pid = getpid());
+    umask(0111);
+    initscr();
+    view = newwin(ROWSINVIEW, COLSINVIEW, 2, 1);
+    slot = newwin(ROWSINVIEW, 3, 2, 1+COLSINVIEW);
+
+    if (game < 0) {
+       puts("Choose a scenario:\n");
+       puts("\n\tNUMBER\tSHIPS\tIN PLAY\tTITLE");
+       for (n=0; n < NUMOFSCENES; n++) {
+           sprintf(file, "/tmp/.%d", n);
+           printf("\t%d):\t%d", n, scene[n].vessels);
+           if (stat(file, &Stat) >= 0)
+               printf("\tYES");
+           else
+               printf("\tno");
+           printf("\t%s\n", scene[n].name);
+       }
+reprint:
+       printf("\nScenario number? ");
+       scanf("%d", &game);
+       while (getchar() != '\n');
+    }
+    if (game < 0 || game >= NUMOFSCENES) {
+       puts("Very funny.");
+       endwin();
+       exit(1);
+    }
+    sprintf(file, "/tmp/.%d", game);
+    if (stat(file, &Stat) < 0 )
+       syncfile = fopen(file, "w+");
+    else {
+       syncfile = fopen(file, "r+");
+       people = 1;
+    }
+    lastsync = 0;
+    for (n=0; n < scene[game].vessels; n++) {
+       nation[scene[game].ship[n].nationality + 1] = n + 1;
+       if ((scene[game].ship[n].file =  (struct File *) calloc(1, sizeof(struct File))) == NULL) {
+           puts("OUT OF MEMORY");
+           endwin();
+           exit(0);
+       }
+       scene[game].ship[n].file -> captured = -1;
+    }
+    if (!nation[2])
+       nation[2] = nation[1];
+    if (!nation[3])
+       nation[3] = nation[2];
+    if (people > 0) {
+       puts("Synchronizing with the other players...");
+       fflush(stdout);
+       sync();
+       capn = 1;
+       for (n=0; n < scene[game].vessels && capn; n++) {
+           capn = scene[game].ship[n].file -> captain[0];
+           if (scene[game].ship[n].file -> struck || scene[game].ship[n].file -> captured > -1)
+               capn = 1;
+       }
+       if (!capn)
+           player = n-1;
+       else {
+           puts("All ships taken in that scenario.");
+           for (n=0; n < scene[game].vessels; n++)
+               free(scene[game].ship[n].file);
+           people = 0;
+           for (n=0; n < 5; n++)
+               nation[n] = 0;
+           goto reprint;
+       }
+    } else
+       player = 0;
+    while (randomize) {
+       static char *color[] =
+           { "(American)", "(British)", "(Spanish)", "(French)" };
+
+       puts(scene[game].name);
+       putchar('\n');
+       for (n=0; n < scene[game].vessels; n++) {
+           printf("  %2d:  %-10s %-15s  (%-2d pts)   ", n,
+             color[scene[game].ship[n].nationality],
+             scene[game].ship[n].shipname,
+             specs[scene[game].ship[n].shipnum].pts);
+           if(scene[game].ship[n].file -> captain[0])
+               puts(scene[game].ship[n].file -> captain);
+           else if (scene[game].ship[n].file -> struck)
+               puts("(struck)");
+           else if(scene[game].ship[n].file -> captured > -1)
+               puts("(captured)");
+           else
+               puts("(available)");
+       }
+       putchar('\n');
+       printf("Which ship do you want (0-%d)? ",scene[game].vessels-1);
+       if (scanf("%d",&player) != 1 || player < 0 || player >= scene[game].vessels) {
+           while (getchar() != '\n');
+               puts("Say what?");
+       } else {
+           while (getchar() != '\n');
+           sync();
+           if (scene[game].ship[player].file -> captain[0] || scene[game].ship[player].file -> struck || scene[game].ship[player].file -> captured > -1)
+               puts("Sorry, that ship is taken.");
+           else
+               break;
+       }
+    }
+    signal(2, choke);
+    signal(1, choke);
+    Write(FILES + player, 1, 0, "begin");  /* he now exits */
+    if(people)
+       Write(SCENARIO, 0, 8, scene[game].people + 1);
+    sync();
+    printf("Your ship is the %s, a %s (%s crew).\n", scene[game].ship[player].shipname, info(player, message), quality(player));
+    if ((nameptr = (char *) getenv("NAME")) && *nameptr)
+       strcpy(comm,nameptr);
+    else {
+       fputs("Your name, Captain? ", stdout);
+       gets(comm);
+       if (!*comm) strcpy(comm, "no name");
+    }
+    comm[19] = '\0';
+    for (k=0; k < 2; k++) {
+       printf("\nInitial broadside %s (grape, chain, round, double): ", (k ? "right" : "left"));
+       scanf("%s", file);
+       switch(*file) {
+           case 'g':
+               load = GRAPE;
+               break;
+           case 'c':
+               load = CHAIN;
+               break;
+           case 'r':
+               load = ROUND;
+               break;
+           case 'd':
+               load = DOUBLE;
+               break;
+       }
+       if (k) {
+           scene[game].ship[player].file -> loadR = load;
+           scene[game].ship[player].file -> readyR = ready;
+       } else {
+           scene[game].ship[player].file -> loadL = load;
+           scene[game].ship[player].file -> readyL = ready;
+       }
+    }
+    Write(FILES + player, 1, 0, comm);
+    if (!people && !nodriver) {
+       sprintf(num, "%d", game);
+       if (!fork()) {
+           execl(DRIVER, DRIVERNAME, num, 0);
+           perror(DRIVER);
+           kill(pid,9);
+           exit(1);
+       }
+    }
+    board();
+    sprintf(message, "Captain %s assuming command",comm);
+    Write(FILES + player, 1, 164, message);
+    windspeed = scene[game].windspeed;
+    winddir = scene[game].winddir;
+    turn = scene[game].turn;
+    iplotships();      /* new turn */
+}
+
+/* 
+ * Returns the NUMBER of the closest ship
+ */
+closestenemy(fromship, side, anyship) 
+int fromship; 
+char side, anyship;
+{
+    register int n, olddist = 30000, ident, captured;
+    register int dist, eclosest = 30000;
+
+    if ((ident = scene[game].ship[fromship].file -> captured) < 0)
+       ident = fromship;
+    for (n=0; n < scene[game].vessels; n++) {
+       if ((captured = scene[game].ship[n].file -> captured) < 0)
+           captured = n;
+       if (n != fromship && pos[n].dir && (scene[game].ship[ident].nationality != scene[game].ship[captured].nationality || anyship)) {
+           if (!side || gunsbear(fromship, n) == side) {
+               dist = range(fromship, n);
+               if (dist < olddist){
+                   eclosest = n;
+                   olddist = dist;
+               }
+           }
+       }
+    }
+    if (!side && olddist == 30000)
+       leave(2);
+    return(eclosest);
+}
+
+finalexit()
+{
+    endwin();
+    nocrmode();
+    echo();
+    exit(1);
+}
+
+main(argc, argv)
+int argc;
+char ** argv;
+{
+    register int crew, aheadfirst, ta, ma, n;
+    char message[60], ch;
+    int uid;
+    char nodrive = 0, randomize = 0, *badstring();
+
+    signal(SIGINT, finalexit);
+    signal(SIGQUIT, finalexit);
+    signal(SIGHUP, finalexit);
+    
+    if (timetoplay() != 0 && gooduid(uid) != 0)
+       {
+       printf("Sorry Captain, but since you are not an Admiral and this is\n");
+       printf("a weekday between %s, you are not permitted to\n",badstring());
+       printf("sail.  Come back again some time when the harbor is open.\n");
+       exit(1);
+       }
+
+    while (*++argv && **argv == '-')
+       switch (*++*argv)
+           {
+           case 'd':
+               nodrive = 1;
+               break;
+           case 'x':
+               randomize = 1;
+               break;
+           default:
+               printf("Unknown flag '%s'\n",*argv);
+               break;
+           }
+    if (*argv)
+       game = atoi(*argv);
+    else
+       game = -1;
+    initialize(nodrive, randomize);
+    noecho();
+    crmode();
+    Signal("Aye aye, Sir", 0, 0);
+    for(;;)
+       {
+       move(scroll++,0);
+       clearline();
+       addch('~');
+       move(--scroll,0);
+       refresh();
+       ch = getch();   
+       switch(ch)
+           {
+           case 'm':
+               crew = specs[scene[game].ship[player].shipnum].crew3;
+               /* for (n=0; n < 3; n++)
+                   {
+                   if (ptr -> OBP[n].turnsent && ptr -> OBP[n].mensent % 10)
+                   crew = 0;
+                   }
+               for (n=0; n < 3; n++)
+                   {
+                   if (ptr -> DBP[n].turnsent && ptr -> DBP[n].mensent % 10)
+                   crew = 0;
+                   } */
+               if (crew && !grappled(player) && !fouled(player) && windspeed)
+                   {
+                   ta = maxturns(player);
+                   aheadfirst = ta & 0100000;
+                   ma = maxmove(player, pos[player].dir, 0);
+                   ta &= 077777;
+                   acceptmove(ma, ta, aheadfirst);
+                   }
+               else
+                   Signal("Unable to move", 0, 0);
+               break;
+           case 's':
+               acceptsignal();
+               break;
+           case 'g':
+               grapungrap();
+               break;
+           case 'u':
+               unfoulplayer();
+               break;
+           case 'b':
+               boarding();
+               break;
+/*         case '[':
+               devestate = 1;
+               acceptcombat();
+               break; */
+           case 'f':
+               acceptcombat();
+               break;
+           case 'l':
+               loadplayer();
+               break;
+           case 'c':
+               changesail();
+               break;
+           case 'r':
+               repair();
+               break;
+           case 'B':
+               Signal("'Hands to stations!'", 0, 0);
+               unboard(player, player, 1);     /* cancel DBP's */
+               unboard(player, player, 0);     /* cancel offense */
+               break;
+           case '\f':
+               signal(SIGALRM, SIG_IGN);
+               viewrow = pos[player].row - ROWSINVIEW / 2;
+               viewcol = pos[player].col - COLSINVIEW / 2;
+               board();
+               plotships(); /* don't create new turn */
+               break;
+           case 'L':
+               scene[game].ship[player].file -> loadL = 0;
+               scene[game].ship[player].file -> loadR = 0;
+               scene[game].ship[player].file -> readyL = 0;
+               scene[game].ship[player].file -> readyR = 0;
+               Signal("Broadsides unloaded", 0, 0);
+               break;
+           case 'q':
+               Signal("Type 'Q' to quit", 0, 0);
+               break;
+           case 'Q':
+               leave(0);
+               break;
+           case 'I':
+               for (n = 0; n < scene[game].vessels; n++)
+                   eyeball(player, n);
+               break;
+           case 'i':
+               n = closestenemy(player, 0, 1);
+               eyeball(player, n);
+               break;
+           }
+       signalflags();
+       lost();
+       }
+    }
+
+char *saywhat(n)
+int n;
+{
+       if(scene[game].ship[n].file -> captain[0])
+               return(scene[game].ship[n].file -> captain);
+       else if (scene[game].ship[n].file -> struck)
+               return("(struck)");
+       else if(scene[game].ship[n].file -> captured > -1)
+               return("(captured)");
+       else
+               return("(computer)");
+}
+
+eyeball(player, n)
+int player, n;
+{
+    char message[80];
+    register i;
+
+    if (scene[game].ship[n].shipdir){
+       sprintf(message, "%d, %s", range(player, n), saywhat(n));
+       Signal("Sail ho! (range %s)", -1, message);
+       switch(scene[game].ship[n].nationality)
+           {
+           case 0:
+               strcpy(message, "American ");
+               break;
+           case 1:
+               strcpy(message, "British ");
+               break;
+           case 2:
+               strcpy(message, "Spanish ");
+               break;
+           case 3:
+               strcpy(message, "French ");
+               break;
+           default:
+               strcpy(message, "Gremlin ");
+               break;
+           }
+       switch(specs[scene[game].ship[n].shipnum].class)
+           {
+           case 1:
+           case 2:
+               strcat(message, "Ship of the Line ");
+               break;
+           case 3:
+           case 4:
+               strcat(message, "Frigate ");
+               break;
+           case 5:
+           case 6:
+               strcat(message, "Sloop ");
+               break;
+           }
+       switch(portside(player, n, 1) - pos[player].dir)
+           {
+           case -7:
+           case 1:
+               strcat(message, "off the starboard bow.");
+               break;
+           case -6:
+           case 2:
+               strcat(message, "off the starboard beam.");
+               break;
+           case -5:
+           case 3:
+               strcat(message, "off the starboard quarter.");
+               break;
+           case -4:
+           case 4:
+               strcat(message, "dead astern.");
+               break;
+           case -3:
+           case 5:
+               strcat(message, "off the port quarter.");
+               break;
+           case -2:
+           case 6:
+               strcat(message, "off the port beam.");
+               break;
+           case -1:
+           case 7:
+               strcat(message, "off the port bow.");
+               break;
+           case 0:
+               strcat(message, "dead ahead.");
+               break;
+           }
+       Signal(message, 0, 0);
+    }
+}