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