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