xref: /netbsd/games/sail/pl_main.c (revision bf9ec67e)
1 /*	$NetBSD: pl_main.c,v 1.15 2001/02/05 01:10:11 christos Exp $	*/
2 
3 /*
4  * Copyright (c) 1983, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *	This product includes software developed by the University of
18  *	California, Berkeley and its contributors.
19  * 4. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35 
36 #include <sys/cdefs.h>
37 #ifndef lint
38 #if 0
39 static char sccsid[] = "@(#)pl_main.c	8.1 (Berkeley) 5/31/93";
40 #else
41 __RCSID("$NetBSD: pl_main.c,v 1.15 2001/02/05 01:10:11 christos Exp $");
42 #endif
43 #endif /* not lint */
44 
45 #include <setjmp.h>
46 #include <signal.h>
47 #include <stdio.h>
48 #include <stdlib.h>
49 #include <string.h>
50 #include <unistd.h>
51 #include "extern.h"
52 #include "player.h"
53 #include "restart.h"
54 
55 static void	initialize(void);
56 
57 /*ARGSUSED*/
58 int
59 pl_main(void)
60 {
61 
62 	initialize();
63 	Msg("Aye aye, Sir");
64 	play();
65 	return 0;			/* for lint,  play() never returns */
66 }
67 
68 static void
69 initialize(void)
70 {
71 	struct File *fp;
72 	struct ship *sp;
73 	char captain[80];
74 	char message[60];
75 	int load;
76 	int n;
77 	char *nameptr;
78 	int nat[NNATION];
79 
80 	if (game < 0) {
81 		puts("Choose a scenario:\n");
82 		puts("\n\tNUMBER\tSHIPS\tIN PLAY\tTITLE");
83 		for (n = 0; n < NSCENE; n++) {
84 			/* ( */
85 			printf("\t%d):\t%d\t%s\t%s\n", n, scene[n].vessels,
86 				sync_exists(n) ? "YES" : "no",
87 				scene[n].name);
88 		}
89 reprint:
90 		printf("\nScenario number? ");
91 		fflush(stdout);
92 		scanf("%d", &game);
93 		while (getchar() != '\n')
94 			;
95 	}
96 	if (game < 0 || game >= NSCENE) {
97 		puts("Very funny.");
98 		exit(1);
99 	}
100 	cc = &scene[game];
101 	ls = SHIP(cc->vessels);
102 
103 	for (n = 0; n < NNATION; n++)
104 		nat[n] = 0;
105 	foreachship(sp) {
106 		if (sp->file == NULL &&
107 		    (sp->file = (struct File *)calloc(1, sizeof (struct File))) == NULL) {
108 			puts("OUT OF MEMORY");
109 			exit(1);
110 		}
111 		sp->file->index = sp - SHIP(0);
112 		sp->file->stern = nat[sp->nationality]++;
113 		sp->file->dir = sp->shipdir;
114 		sp->file->row = sp->shiprow;
115 		sp->file->col = sp->shipcol;
116 	}
117 	windspeed = cc->windspeed;
118 	winddir = cc->winddir;
119 
120 	signal(SIGHUP, choke);
121 	signal(SIGINT, choke);
122 
123 	hasdriver = sync_exists(game);
124 	if (sync_open() < 0) {
125 		perror("sail: syncfile");
126 		exit(1);
127 	}
128 
129 	if (hasdriver) {
130 		puts("Synchronizing with the other players...");
131 		fflush(stdout);
132 		if (Sync() < 0)
133 			leave(LEAVE_SYNC);
134 	}
135 	for (;;) {
136 		foreachship(sp)
137 			if (sp->file->captain[0] == 0 && !sp->file->struck
138 			    && sp->file->captured == 0)
139 				break;
140 		if (sp >= ls) {
141 			puts("All ships taken in that scenario.");
142 			foreachship(sp)
143 				free((char *)sp->file);
144 			sync_close(0);
145 			people = 0;
146 			goto reprint;
147 		}
148 		if (randomize) {
149 			player = sp - SHIP(0);
150 		} else {
151 			printf("%s\n\n", cc->name);
152 			foreachship(sp)
153 				printf("  %2d:  %-10s %-15s  (%-2d pts)   %s\n",
154 					sp->file->index,
155 					countryname[sp->nationality],
156 					sp->shipname,
157 					sp->specs->pts,
158 					saywhat(sp, 1));
159 			printf("\nWhich ship (0-%d)? ", cc->vessels-1);
160 			fflush(stdout);
161 			if (scanf("%d", &player) != 1 || player < 0
162 			    || player >= cc->vessels) {
163 				while (getchar() != '\n')
164 					;
165 				puts("Say what?");
166 				player = -1;
167 			} else
168 				while (getchar() != '\n')
169 					;
170 		}
171 		if (player < 0)
172 			continue;
173 		if (Sync() < 0)
174 			leave(LEAVE_SYNC);
175 		fp = SHIP(player)->file;
176 		if (fp->captain[0] || fp->struck || fp->captured != 0)
177 			puts("That ship is taken.");
178 		else
179 			break;
180 	}
181 
182 	ms = SHIP(player);
183 	mf = ms->file;
184 	mc = ms->specs;
185 
186 	Write(W_BEGIN, ms, 0, 0, 0, 0);
187 	if (Sync() < 0)
188 		leave(LEAVE_SYNC);
189 
190 	signal(SIGCHLD, child);
191 	if (!hasdriver)
192 		switch (fork()) {
193 		case 0:
194 			longjmp(restart, MODE_DRIVER);
195 			/*NOTREACHED*/
196 		case -1:
197 			perror("fork");
198 			leave(LEAVE_FORK);
199 			break;
200 		default:
201 			hasdriver++;
202 		}
203 
204 	printf("Your ship is the %s, a %d gun %s (%s crew).\n",
205 		ms->shipname, mc->guns, classname[mc->class],
206 		qualname[mc->qual]);
207 	if ((nameptr = (char *) getenv("SAILNAME")) && *nameptr)
208 		strncpy(captain, nameptr, sizeof captain);
209 	else {
210 		printf("Your name, Captain? ");
211 		fflush(stdout);
212 		fgets(captain, sizeof captain, stdin);
213 		if (!*captain)
214 			strcpy(captain, "no name");
215 		else
216 		    captain[strlen(captain) - 1] = '\0';
217 	}
218 	captain[sizeof captain - 1] = '\0';
219 	Writestr(W_CAPTAIN, ms, captain);
220 	for (n = 0; n < 2; n++) {
221 		char buf[10];
222 
223 		printf("\nInitial broadside %s (grape, chain, round, double): ",
224 			n ? "right" : "left");
225 		fflush(stdout);
226 		scanf("%s", buf);
227 		switch (*buf) {
228 		case 'g':
229 			load = L_GRAPE;
230 			break;
231 		case 'c':
232 			load = L_CHAIN;
233 			break;
234 		case 'r':
235 			load = L_ROUND;
236 			break;
237 		case 'd':
238 			load = L_DOUBLE;
239 			break;
240 		default:
241 			load = L_ROUND;
242 		}
243 		if (n) {
244 			mf->loadR = load;
245 			mf->readyR = R_LOADED|R_INITIAL;
246 		} else {
247 			mf->loadL = load;
248 			mf->readyL = R_LOADED|R_INITIAL;
249 		}
250 	}
251 
252 	initscreen();
253 	draw_board();
254 	snprintf(message, sizeof message, "Captain %s assuming command",
255 			captain);
256 	Writestr(W_SIGNAL, ms, message);
257 	newturn(0);
258 }
259