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