|
|
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.