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