|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)pl_main.c 5.1 (Berkeley) 5/29/85"; ! 9: #endif not lint ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.