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