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