Annotation of 43BSD/games/sail/pl_main.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)pl_main.c  5.1 (Berkeley) 5/29/85";
                      9: #endif not lint
                     10: 
                     11: #include "player.h"
                     12: #include <sys/types.h>
                     13: #include <sys/wait.h>
                     14: 
                     15: int choke(), child();
                     16: 
                     17: /*ARGSUSED*/
                     18: pl_main()
                     19: {
                     20: 
                     21:        if (!SCREENTEST()) {
                     22:                printf("Can't sail on this terminal.\n");
                     23:                exit(1);
                     24:        }
                     25:        initialize();
                     26:        Signal("Aye aye, Sir", (struct ship *)0);
                     27:        play();
                     28:        return 0;                       /* for lint,  play() never returns */
                     29: }
                     30: 
                     31: initialize()
                     32: {
                     33:        register struct File *fp;
                     34:        register struct ship *sp;
                     35:        char captain[80];
                     36:        char message[60];
                     37:        int load;
                     38:        register int n;
                     39:        char *nameptr;
                     40:        int nat[NNATION];
                     41: 
                     42:        if (game < 0) {
                     43:                (void) puts("Choose a scenario:\n");
                     44:                (void) puts("\n\tNUMBER\tSHIPS\tIN PLAY\tTITLE");
                     45:                for (n = 0; n < NSCENE; n++) {
                     46:                        /* ( */
                     47:                        printf("\t%d):\t%d\t%s\t%s\n", n, scene[n].vessels,
                     48:                                sync_exists(n) ? "YES" : "no",
                     49:                                scene[n].name);
                     50:                }
                     51: reprint:
                     52:                printf("\nScenario number? ");
                     53:                (void) fflush(stdout);
                     54:                (void) scanf("%d", &game);
                     55:                while (getchar() != '\n')
                     56:                        ;
                     57:        }
                     58:        if (game < 0 || game >= NSCENE) {
                     59:                (void) puts("Very funny.");
                     60:                exit(1);
                     61:        }
                     62:        cc = &scene[game];
                     63:        ls = SHIP(cc->vessels);
                     64: 
                     65:        for (n = 0; n < NNATION; n++)
                     66:                nat[n] = 0;
                     67:        foreachship(sp) {
                     68:                if (sp->file == NULL &&
                     69:                    (sp->file = (struct File *)calloc(1, sizeof (struct File))) == NULL) {
                     70:                        (void) puts("OUT OF MEMORY");
                     71:                        exit(1);
                     72:                }
                     73:                sp->file->index = sp - SHIP(0);
                     74:                sp->file->stern = nat[sp->nationality]++;
                     75:                sp->file->dir = sp->shipdir;
                     76:                sp->file->row = sp->shiprow;
                     77:                sp->file->col = sp->shipcol;
                     78:        }
                     79:        windspeed = cc->windspeed;
                     80:        winddir = cc->winddir;
                     81: 
                     82:        (void) signal(SIGHUP, choke);
                     83:        (void) signal(SIGINT, choke);
                     84: 
                     85:        hasdriver = sync_exists(game);
                     86:        if (sync_open() < 0) {
                     87:                perror("sail: syncfile");
                     88:                exit(1);
                     89:        }
                     90: 
                     91:        if (hasdriver) {
                     92:                (void) puts("Synchronizing with the other players...");
                     93:                (void) fflush(stdout);
                     94:                if (Sync() < 0)
                     95:                        leave(LEAVE_SYNC);
                     96:        }
                     97:        for (;;) {
                     98:                foreachship(sp)
                     99:                        if (sp->file->captain[0] == 0 && !sp->file->struck
                    100:                            && sp->file->captured == 0)
                    101:                                break;
                    102:                if (sp >= ls) {
                    103:                        (void) puts("All ships taken in that scenario.");
                    104:                        foreachship(sp)
                    105:                                free((char *)sp->file);
                    106:                        sync_close(0);
                    107:                        people = 0;
                    108:                        goto reprint;
                    109:                }
                    110:                if (randomize) {
                    111:                        player = sp - SHIP(0);
                    112:                } else {
                    113:                        printf("%s\n\n", cc->name);
                    114:                        foreachship(sp)
                    115:                                printf("  %2d:  %-10s %-15s  (%-2d pts)   %s\n",
                    116:                                        sp->file->index,
                    117:                                        countryname[sp->nationality],
                    118:                                        sp->shipname,
                    119:                                        sp->specs->pts,
                    120:                                        saywhat(sp, 1));
                    121:                        printf("\nWhich ship (0-%d)? ", cc->vessels-1);
                    122:                        (void) fflush(stdout);
                    123:                        if (scanf("%d", &player) != 1 || player < 0
                    124:                            || player >= cc->vessels) {
                    125:                                while (getchar() != '\n')
                    126:                                        ;
                    127:                                (void) puts("Say what?");
                    128:                                player = -1;
                    129:                        } else
                    130:                                while (getchar() != '\n')
                    131:                                        ;
                    132:                }
                    133:                if (player < 0)
                    134:                        continue;
                    135:                if (Sync() < 0)
                    136:                        leave(LEAVE_SYNC);
                    137:                fp = SHIP(player)->file;
                    138:                if (fp->captain[0] || fp->struck || fp->captured != 0)
                    139:                        (void) puts("That ship is taken.");
                    140:                else
                    141:                        break;
                    142:        }
                    143: 
                    144:        ms = SHIP(player);
                    145:        mf = ms->file;
                    146:        mc = ms->specs;
                    147: 
                    148:        Write(W_BEGIN, ms, 0, 0, 0, 0, 0);
                    149:        if (Sync() < 0)
                    150:                leave(LEAVE_SYNC);
                    151: 
                    152:        (void) signal(SIGCHLD, child);
                    153:        if (!hasdriver)
                    154:                switch (fork()) {
                    155:                case 0:
                    156:                        longjmp(restart, MODE_DRIVER);
                    157:                        /*NOTREACHED*/
                    158:                case -1:
                    159:                        perror("fork");
                    160:                        leave(LEAVE_FORK);
                    161:                        break;
                    162:                default:
                    163:                        hasdriver++;
                    164:                }
                    165: 
                    166:        printf("Your ship is the %s, a %d gun %s (%s crew).\n",
                    167:                ms->shipname, mc->guns, classname[mc->class],
                    168:                qualname[mc->qual]);
                    169:        if ((nameptr = (char *) getenv("SAILNAME")) && *nameptr)
                    170:                (void) strncpy(captain, nameptr, sizeof captain);
                    171:        else {
                    172:                (void) printf("Your name, Captain? ");
                    173:                (void) fflush(stdout);
                    174:                (void) gets(captain);
                    175:                if (!*captain)
                    176:                        (void) strcpy(captain, "no name");
                    177:        }
                    178:        captain[sizeof captain - 1] = '\0';
                    179:        Write(W_CAPTAIN, ms, 1, (int)captain, 0, 0, 0);
                    180:        for (n = 0; n < 2; n++) {
                    181:                char buf[10];
                    182: 
                    183:                printf("\nInitial broadside %s (grape, chain, round, double): ",
                    184:                        n ? "right" : "left");
                    185:                (void) fflush(stdout);
                    186:                (void) scanf("%s", buf);
                    187:                switch (*buf) {
                    188:                case 'g':
                    189:                        load = L_GRAPE;
                    190:                        break;
                    191:                case 'c':
                    192:                        load = L_CHAIN;
                    193:                        break;
                    194:                case 'r':
                    195:                        load = L_ROUND;
                    196:                        break;
                    197:                case 'd':
                    198:                        load = L_DOUBLE;
                    199:                        break;
                    200:                default:
                    201:                        load = L_ROUND;
                    202:                }
                    203:                if (n) {
                    204:                        mf->loadR = load;
                    205:                        mf->readyR = R_LOADED|R_INITIAL;
                    206:                } else {
                    207:                        mf->loadL = load;
                    208:                        mf->readyL = R_LOADED|R_INITIAL;
                    209:                }
                    210:        }
                    211: 
                    212:        initscreen();
                    213:        draw_board();
                    214:        (void) sprintf(message, "Captain %s assuming command", captain);
                    215:        Write(W_SIGNAL, ms, 1, (int)message, 0, 0, 0);
                    216:        newturn();
                    217: }

unix.superglobalmegacorp.com

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