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