xref: /csrg-svn/games/sail/pl_main.c (revision 60848)
118709Sedward /*
2*60848Sbostic  * Copyright (c) 1983, 1993
3*60848Sbostic  *	The Regents of the University of California.  All rights reserved.
433695Sbostic  *
542605Sbostic  * %sccs.include.redist.c%
618709Sedward  */
718709Sedward 
818254Sedward #ifndef lint
9*60848Sbostic static char sccsid[] = "@(#)pl_main.c	8.1 (Berkeley) 05/31/93";
1033695Sbostic #endif /* not lint */
1118254Sedward 
1218254Sedward #include "player.h"
1318254Sedward #include <sys/types.h>
1418254Sedward #include <sys/wait.h>
1518254Sedward 
1646759Sbostic void choke(), child();
1718254Sedward 
1818254Sedward /*ARGSUSED*/
pl_main()1918254Sedward pl_main()
2018254Sedward {
2118254Sedward 
2218254Sedward 	if (!SCREENTEST()) {
2318254Sedward 		printf("Can't sail on this terminal.\n");
2418254Sedward 		exit(1);
2518254Sedward 	}
2618254Sedward 	initialize();
2718254Sedward 	Signal("Aye aye, Sir", (struct ship *)0);
2818254Sedward 	play();
2918774Sedward 	return 0;			/* for lint,  play() never returns */
3018254Sedward }
3118254Sedward 
initialize()3218254Sedward initialize()
3318254Sedward {
3418254Sedward 	register struct File *fp;
3518254Sedward 	register struct ship *sp;
3618254Sedward 	char captain[80];
3718254Sedward 	char message[60];
3818254Sedward 	int load;
3918254Sedward 	register int n;
4018254Sedward 	char *nameptr;
4118254Sedward 	int nat[NNATION];
4218254Sedward 
4318254Sedward 	if (game < 0) {
4418254Sedward 		(void) puts("Choose a scenario:\n");
4518254Sedward 		(void) puts("\n\tNUMBER\tSHIPS\tIN PLAY\tTITLE");
4618254Sedward 		for (n = 0; n < NSCENE; n++) {
4718254Sedward 			/* ( */
4818254Sedward 			printf("\t%d):\t%d\t%s\t%s\n", n, scene[n].vessels,
4918254Sedward 				sync_exists(n) ? "YES" : "no",
5018254Sedward 				scene[n].name);
5118254Sedward 		}
5218254Sedward reprint:
5318254Sedward 		printf("\nScenario number? ");
5418254Sedward 		(void) fflush(stdout);
5518254Sedward 		(void) scanf("%d", &game);
5618254Sedward 		while (getchar() != '\n')
5718254Sedward 			;
5818254Sedward 	}
5918254Sedward 	if (game < 0 || game >= NSCENE) {
6018254Sedward 		(void) puts("Very funny.");
6118254Sedward 		exit(1);
6218254Sedward 	}
6318254Sedward 	cc = &scene[game];
6418254Sedward 	ls = SHIP(cc->vessels);
6518254Sedward 
6618254Sedward 	for (n = 0; n < NNATION; n++)
6718254Sedward 		nat[n] = 0;
6818254Sedward 	foreachship(sp) {
6918254Sedward 		if (sp->file == NULL &&
7018254Sedward 		    (sp->file = (struct File *)calloc(1, sizeof (struct File))) == NULL) {
7118254Sedward 			(void) puts("OUT OF MEMORY");
7218254Sedward 			exit(1);
7318254Sedward 		}
7418254Sedward 		sp->file->index = sp - SHIP(0);
7518254Sedward 		sp->file->stern = nat[sp->nationality]++;
7618254Sedward 		sp->file->dir = sp->shipdir;
7718254Sedward 		sp->file->row = sp->shiprow;
7818254Sedward 		sp->file->col = sp->shipcol;
7918254Sedward 	}
8018254Sedward 	windspeed = cc->windspeed;
8118254Sedward 	winddir = cc->winddir;
8218254Sedward 
8318254Sedward 	(void) signal(SIGHUP, choke);
8418254Sedward 	(void) signal(SIGINT, choke);
8518254Sedward 
8618254Sedward 	hasdriver = sync_exists(game);
8718254Sedward 	if (sync_open() < 0) {
8818254Sedward 		perror("sail: syncfile");
8918254Sedward 		exit(1);
9018254Sedward 	}
9118254Sedward 
9218254Sedward 	if (hasdriver) {
9318254Sedward 		(void) puts("Synchronizing with the other players...");
9418254Sedward 		(void) fflush(stdout);
9518254Sedward 		if (Sync() < 0)
9618254Sedward 			leave(LEAVE_SYNC);
9718254Sedward 	}
9818254Sedward 	for (;;) {
9918254Sedward 		foreachship(sp)
10018254Sedward 			if (sp->file->captain[0] == 0 && !sp->file->struck
10118254Sedward 			    && sp->file->captured == 0)
10218254Sedward 				break;
10318254Sedward 		if (sp >= ls) {
10418254Sedward 			(void) puts("All ships taken in that scenario.");
10518254Sedward 			foreachship(sp)
10618254Sedward 				free((char *)sp->file);
10718254Sedward 			sync_close(0);
10818254Sedward 			people = 0;
10918254Sedward 			goto reprint;
11018254Sedward 		}
11118254Sedward 		if (randomize) {
11218254Sedward 			player = sp - SHIP(0);
11318254Sedward 		} else {
11418254Sedward 			printf("%s\n\n", cc->name);
11518254Sedward 			foreachship(sp)
11618254Sedward 				printf("  %2d:  %-10s %-15s  (%-2d pts)   %s\n",
11718254Sedward 					sp->file->index,
11818254Sedward 					countryname[sp->nationality],
11918254Sedward 					sp->shipname,
12018254Sedward 					sp->specs->pts,
12118254Sedward 					saywhat(sp, 1));
12218254Sedward 			printf("\nWhich ship (0-%d)? ", cc->vessels-1);
12318254Sedward 			(void) fflush(stdout);
12418254Sedward 			if (scanf("%d", &player) != 1 || player < 0
12518254Sedward 			    || player >= cc->vessels) {
12618254Sedward 				while (getchar() != '\n')
12718254Sedward 					;
12818254Sedward 				(void) puts("Say what?");
12918254Sedward 				player = -1;
13018254Sedward 			} else
13118254Sedward 				while (getchar() != '\n')
13218254Sedward 					;
13318254Sedward 		}
13418254Sedward 		if (player < 0)
13518254Sedward 			continue;
13618254Sedward 		if (Sync() < 0)
13718254Sedward 			leave(LEAVE_SYNC);
13818254Sedward 		fp = SHIP(player)->file;
13918254Sedward 		if (fp->captain[0] || fp->struck || fp->captured != 0)
14018254Sedward 			(void) puts("That ship is taken.");
14118254Sedward 		else
14218254Sedward 			break;
14318254Sedward 	}
14418254Sedward 
14518254Sedward 	ms = SHIP(player);
14618254Sedward 	mf = ms->file;
14718254Sedward 	mc = ms->specs;
14818254Sedward 
14918254Sedward 	Write(W_BEGIN, ms, 0, 0, 0, 0, 0);
15018254Sedward 	if (Sync() < 0)
15118254Sedward 		leave(LEAVE_SYNC);
15218254Sedward 
15318254Sedward 	(void) signal(SIGCHLD, child);
15418254Sedward 	if (!hasdriver)
15518254Sedward 		switch (fork()) {
15618254Sedward 		case 0:
15718254Sedward 			longjmp(restart, MODE_DRIVER);
15818254Sedward 			/*NOTREACHED*/
15918254Sedward 		case -1:
16018254Sedward 			perror("fork");
16118254Sedward 			leave(LEAVE_FORK);
16218254Sedward 			break;
16318254Sedward 		default:
16418254Sedward 			hasdriver++;
16518254Sedward 		}
16618254Sedward 
16718254Sedward 	printf("Your ship is the %s, a %d gun %s (%s crew).\n",
16818254Sedward 		ms->shipname, mc->guns, classname[mc->class],
16918254Sedward 		qualname[mc->qual]);
17018254Sedward 	if ((nameptr = (char *) getenv("SAILNAME")) && *nameptr)
17118254Sedward 		(void) strncpy(captain, nameptr, sizeof captain);
17218254Sedward 	else {
17318254Sedward 		(void) printf("Your name, Captain? ");
17418254Sedward 		(void) fflush(stdout);
17518254Sedward 		(void) gets(captain);
17618254Sedward 		if (!*captain)
17718254Sedward 			(void) strcpy(captain, "no name");
17818254Sedward 	}
17918254Sedward 	captain[sizeof captain - 1] = '\0';
18018254Sedward 	Write(W_CAPTAIN, ms, 1, (int)captain, 0, 0, 0);
18118254Sedward 	for (n = 0; n < 2; n++) {
18218254Sedward 		char buf[10];
18318254Sedward 
18418254Sedward 		printf("\nInitial broadside %s (grape, chain, round, double): ",
18518254Sedward 			n ? "right" : "left");
18618254Sedward 		(void) fflush(stdout);
18718254Sedward 		(void) scanf("%s", buf);
18818254Sedward 		switch (*buf) {
18918254Sedward 		case 'g':
19018254Sedward 			load = L_GRAPE;
19118254Sedward 			break;
19218254Sedward 		case 'c':
19318254Sedward 			load = L_CHAIN;
19418254Sedward 			break;
19518254Sedward 		case 'r':
19618254Sedward 			load = L_ROUND;
19718254Sedward 			break;
19818254Sedward 		case 'd':
19918254Sedward 			load = L_DOUBLE;
20018254Sedward 			break;
20118254Sedward 		default:
20218254Sedward 			load = L_ROUND;
20318254Sedward 		}
20418254Sedward 		if (n) {
20518254Sedward 			mf->loadR = load;
20618254Sedward 			mf->readyR = R_LOADED|R_INITIAL;
20718254Sedward 		} else {
20818254Sedward 			mf->loadL = load;
20918254Sedward 			mf->readyL = R_LOADED|R_INITIAL;
21018254Sedward 		}
21118254Sedward 	}
21218254Sedward 
21318254Sedward 	initscreen();
21418254Sedward 	draw_board();
21518254Sedward 	(void) sprintf(message, "Captain %s assuming command", captain);
21618254Sedward 	Write(W_SIGNAL, ms, 1, (int)message, 0, 0, 0);
21718254Sedward 	newturn();
21818254Sedward }
219