118709Sedward /* 218709Sedward * Copyright (c) 1983 Regents of the University of California, 318709Sedward * All rights reserved. Redistribution permitted subject to 418709Sedward * the terms of the Berkeley Software License Agreement. 518709Sedward */ 618709Sedward 718254Sedward #ifndef lint 8*18774Sedward static char *sccsid = "@(#)pl_main.c 2.3 85/04/26"; 918254Sedward #endif 1018254Sedward 1118254Sedward #include "player.h" 1218254Sedward #include <sys/types.h> 1318254Sedward #include <sys/wait.h> 1418254Sedward 1518254Sedward int choke(), child(); 1618254Sedward 1718254Sedward /*ARGSUSED*/ 1818254Sedward pl_main() 1918254Sedward { 2018254Sedward 2118254Sedward if (!SCREENTEST()) { 2218254Sedward printf("Can't sail on this terminal.\n"); 2318254Sedward exit(1); 2418254Sedward } 2518254Sedward initialize(); 2618254Sedward Signal("Aye aye, Sir", (struct ship *)0); 2718254Sedward play(); 28*18774Sedward return 0; /* for lint, play() never returns */ 2918254Sedward } 3018254Sedward 3118254Sedward initialize() 3218254Sedward { 3318254Sedward register struct File *fp; 3418254Sedward register struct ship *sp; 3518254Sedward char captain[80]; 3618254Sedward char message[60]; 3718254Sedward int load; 3818254Sedward register int n; 3918254Sedward char *nameptr; 4018254Sedward int nat[NNATION]; 4118254Sedward 4218254Sedward if (game < 0) { 4318254Sedward (void) puts("Choose a scenario:\n"); 4418254Sedward (void) puts("\n\tNUMBER\tSHIPS\tIN PLAY\tTITLE"); 4518254Sedward for (n = 0; n < NSCENE; n++) { 4618254Sedward /* ( */ 4718254Sedward printf("\t%d):\t%d\t%s\t%s\n", n, scene[n].vessels, 4818254Sedward sync_exists(n) ? "YES" : "no", 4918254Sedward scene[n].name); 5018254Sedward } 5118254Sedward reprint: 5218254Sedward printf("\nScenario number? "); 5318254Sedward (void) fflush(stdout); 5418254Sedward (void) scanf("%d", &game); 5518254Sedward while (getchar() != '\n') 5618254Sedward ; 5718254Sedward } 5818254Sedward if (game < 0 || game >= NSCENE) { 5918254Sedward (void) puts("Very funny."); 6018254Sedward exit(1); 6118254Sedward } 6218254Sedward cc = &scene[game]; 6318254Sedward ls = SHIP(cc->vessels); 6418254Sedward 6518254Sedward for (n = 0; n < NNATION; n++) 6618254Sedward nat[n] = 0; 6718254Sedward foreachship(sp) { 6818254Sedward if (sp->file == NULL && 6918254Sedward (sp->file = (struct File *)calloc(1, sizeof (struct File))) == NULL) { 7018254Sedward (void) puts("OUT OF MEMORY"); 7118254Sedward exit(1); 7218254Sedward } 7318254Sedward sp->file->index = sp - SHIP(0); 7418254Sedward sp->file->stern = nat[sp->nationality]++; 7518254Sedward sp->file->dir = sp->shipdir; 7618254Sedward sp->file->row = sp->shiprow; 7718254Sedward sp->file->col = sp->shipcol; 7818254Sedward } 7918254Sedward windspeed = cc->windspeed; 8018254Sedward winddir = cc->winddir; 8118254Sedward 8218254Sedward (void) signal(SIGHUP, choke); 8318254Sedward (void) signal(SIGINT, choke); 8418254Sedward 8518254Sedward hasdriver = sync_exists(game); 8618254Sedward if (sync_open() < 0) { 8718254Sedward perror("sail: syncfile"); 8818254Sedward exit(1); 8918254Sedward } 9018254Sedward 9118254Sedward if (hasdriver) { 9218254Sedward (void) puts("Synchronizing with the other players..."); 9318254Sedward (void) fflush(stdout); 9418254Sedward if (Sync() < 0) 9518254Sedward leave(LEAVE_SYNC); 9618254Sedward } 9718254Sedward for (;;) { 9818254Sedward foreachship(sp) 9918254Sedward if (sp->file->captain[0] == 0 && !sp->file->struck 10018254Sedward && sp->file->captured == 0) 10118254Sedward break; 10218254Sedward if (sp >= ls) { 10318254Sedward (void) puts("All ships taken in that scenario."); 10418254Sedward foreachship(sp) 10518254Sedward free((char *)sp->file); 10618254Sedward sync_close(0); 10718254Sedward people = 0; 10818254Sedward goto reprint; 10918254Sedward } 11018254Sedward if (randomize) { 11118254Sedward player = sp - SHIP(0); 11218254Sedward } else { 11318254Sedward printf("%s\n\n", cc->name); 11418254Sedward foreachship(sp) 11518254Sedward printf(" %2d: %-10s %-15s (%-2d pts) %s\n", 11618254Sedward sp->file->index, 11718254Sedward countryname[sp->nationality], 11818254Sedward sp->shipname, 11918254Sedward sp->specs->pts, 12018254Sedward saywhat(sp, 1)); 12118254Sedward printf("\nWhich ship (0-%d)? ", cc->vessels-1); 12218254Sedward (void) fflush(stdout); 12318254Sedward if (scanf("%d", &player) != 1 || player < 0 12418254Sedward || player >= cc->vessels) { 12518254Sedward while (getchar() != '\n') 12618254Sedward ; 12718254Sedward (void) puts("Say what?"); 12818254Sedward player = -1; 12918254Sedward } else 13018254Sedward while (getchar() != '\n') 13118254Sedward ; 13218254Sedward } 13318254Sedward if (player < 0) 13418254Sedward continue; 13518254Sedward if (Sync() < 0) 13618254Sedward leave(LEAVE_SYNC); 13718254Sedward fp = SHIP(player)->file; 13818254Sedward if (fp->captain[0] || fp->struck || fp->captured != 0) 13918254Sedward (void) puts("That ship is taken."); 14018254Sedward else 14118254Sedward break; 14218254Sedward } 14318254Sedward 14418254Sedward ms = SHIP(player); 14518254Sedward mf = ms->file; 14618254Sedward mc = ms->specs; 14718254Sedward 14818254Sedward Write(W_BEGIN, ms, 0, 0, 0, 0, 0); 14918254Sedward if (Sync() < 0) 15018254Sedward leave(LEAVE_SYNC); 15118254Sedward 15218254Sedward (void) signal(SIGCHLD, child); 15318254Sedward if (!hasdriver) 15418254Sedward switch (fork()) { 15518254Sedward case 0: 15618254Sedward longjmp(restart, MODE_DRIVER); 15718254Sedward /*NOTREACHED*/ 15818254Sedward case -1: 15918254Sedward perror("fork"); 16018254Sedward leave(LEAVE_FORK); 16118254Sedward break; 16218254Sedward default: 16318254Sedward hasdriver++; 16418254Sedward } 16518254Sedward 16618254Sedward printf("Your ship is the %s, a %d gun %s (%s crew).\n", 16718254Sedward ms->shipname, mc->guns, classname[mc->class], 16818254Sedward qualname[mc->qual]); 16918254Sedward if ((nameptr = (char *) getenv("SAILNAME")) && *nameptr) 17018254Sedward (void) strncpy(captain, nameptr, sizeof captain); 17118254Sedward else { 17218254Sedward (void) printf("Your name, Captain? "); 17318254Sedward (void) fflush(stdout); 17418254Sedward (void) gets(captain); 17518254Sedward if (!*captain) 17618254Sedward (void) strcpy(captain, "no name"); 17718254Sedward } 17818254Sedward captain[sizeof captain - 1] = '\0'; 17918254Sedward Write(W_CAPTAIN, ms, 1, (int)captain, 0, 0, 0); 18018254Sedward for (n = 0; n < 2; n++) { 18118254Sedward char buf[10]; 18218254Sedward 18318254Sedward printf("\nInitial broadside %s (grape, chain, round, double): ", 18418254Sedward n ? "right" : "left"); 18518254Sedward (void) fflush(stdout); 18618254Sedward (void) scanf("%s", buf); 18718254Sedward switch (*buf) { 18818254Sedward case 'g': 18918254Sedward load = L_GRAPE; 19018254Sedward break; 19118254Sedward case 'c': 19218254Sedward load = L_CHAIN; 19318254Sedward break; 19418254Sedward case 'r': 19518254Sedward load = L_ROUND; 19618254Sedward break; 19718254Sedward case 'd': 19818254Sedward load = L_DOUBLE; 19918254Sedward break; 20018254Sedward default: 20118254Sedward load = L_ROUND; 20218254Sedward } 20318254Sedward if (n) { 20418254Sedward mf->loadR = load; 20518254Sedward mf->readyR = R_LOADED|R_INITIAL; 20618254Sedward } else { 20718254Sedward mf->loadL = load; 20818254Sedward mf->readyL = R_LOADED|R_INITIAL; 20918254Sedward } 21018254Sedward } 21118254Sedward 21218254Sedward initscreen(); 21318254Sedward draw_board(); 21418254Sedward (void) sprintf(message, "Captain %s assuming command", captain); 21518254Sedward Write(W_SIGNAL, ms, 1, (int)message, 0, 0, 0); 21618254Sedward newturn(); 21718254Sedward } 218