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