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