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