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