Annotation of 42BSD/games/sail/player1.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.