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