first cut at new makefile; file reorg, new depend
[unix-history] / usr / src / games / sail / pl_main.c
CommitLineData
b5f0675e 1/*
1e008c14 2 * Copyright (c) 1983 Regents of the University of California.
c0ca48ec
KB
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
65c7d3b6
KB
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
b5f0675e
EW
16 */
17
14665d6c 18#ifndef lint
65c7d3b6 19static char sccsid[] = "@(#)pl_main.c 5.3 (Berkeley) %G%";
c0ca48ec 20#endif /* not lint */
14665d6c
EW
21
22#include "player.h"
23#include <sys/types.h>
24#include <sys/wait.h>
25
26int choke(), child();
27
28/*ARGSUSED*/
29pl_main()
30{
31
32 if (!SCREENTEST()) {
33 printf("Can't sail on this terminal.\n");
34 exit(1);
35 }
36 initialize();
37 Signal("Aye aye, Sir", (struct ship *)0);
38 play();
f52d88b6 39 return 0; /* for lint, play() never returns */
14665d6c
EW
40}
41
42initialize()
43{
44 register struct File *fp;
45 register struct ship *sp;
46 char captain[80];
47 char message[60];
48 int load;
49 register int n;
50 char *nameptr;
51 int nat[NNATION];
52
53 if (game < 0) {
54 (void) puts("Choose a scenario:\n");
55 (void) puts("\n\tNUMBER\tSHIPS\tIN PLAY\tTITLE");
56 for (n = 0; n < NSCENE; n++) {
57 /* ( */
58 printf("\t%d):\t%d\t%s\t%s\n", n, scene[n].vessels,
59 sync_exists(n) ? "YES" : "no",
60 scene[n].name);
61 }
62reprint:
63 printf("\nScenario number? ");
64 (void) fflush(stdout);
65 (void) scanf("%d", &game);
66 while (getchar() != '\n')
67 ;
68 }
69 if (game < 0 || game >= NSCENE) {
70 (void) puts("Very funny.");
71 exit(1);
72 }
73 cc = &scene[game];
74 ls = SHIP(cc->vessels);
75
76 for (n = 0; n < NNATION; n++)
77 nat[n] = 0;
78 foreachship(sp) {
79 if (sp->file == NULL &&
80 (sp->file = (struct File *)calloc(1, sizeof (struct File))) == NULL) {
81 (void) puts("OUT OF MEMORY");
82 exit(1);
83 }
84 sp->file->index = sp - SHIP(0);
85 sp->file->stern = nat[sp->nationality]++;
86 sp->file->dir = sp->shipdir;
87 sp->file->row = sp->shiprow;
88 sp->file->col = sp->shipcol;
89 }
90 windspeed = cc->windspeed;
91 winddir = cc->winddir;
92
93 (void) signal(SIGHUP, choke);
94 (void) signal(SIGINT, choke);
95
96 hasdriver = sync_exists(game);
97 if (sync_open() < 0) {
98 perror("sail: syncfile");
99 exit(1);
100 }
101
102 if (hasdriver) {
103 (void) puts("Synchronizing with the other players...");
104 (void) fflush(stdout);
105 if (Sync() < 0)
106 leave(LEAVE_SYNC);
107 }
108 for (;;) {
109 foreachship(sp)
110 if (sp->file->captain[0] == 0 && !sp->file->struck
111 && sp->file->captured == 0)
112 break;
113 if (sp >= ls) {
114 (void) puts("All ships taken in that scenario.");
115 foreachship(sp)
116 free((char *)sp->file);
117 sync_close(0);
118 people = 0;
119 goto reprint;
120 }
121 if (randomize) {
122 player = sp - SHIP(0);
123 } else {
124 printf("%s\n\n", cc->name);
125 foreachship(sp)
126 printf(" %2d: %-10s %-15s (%-2d pts) %s\n",
127 sp->file->index,
128 countryname[sp->nationality],
129 sp->shipname,
130 sp->specs->pts,
131 saywhat(sp, 1));
132 printf("\nWhich ship (0-%d)? ", cc->vessels-1);
133 (void) fflush(stdout);
134 if (scanf("%d", &player) != 1 || player < 0
135 || player >= cc->vessels) {
136 while (getchar() != '\n')
137 ;
138 (void) puts("Say what?");
139 player = -1;
140 } else
141 while (getchar() != '\n')
142 ;
143 }
144 if (player < 0)
145 continue;
146 if (Sync() < 0)
147 leave(LEAVE_SYNC);
148 fp = SHIP(player)->file;
149 if (fp->captain[0] || fp->struck || fp->captured != 0)
150 (void) puts("That ship is taken.");
151 else
152 break;
153 }
154
155 ms = SHIP(player);
156 mf = ms->file;
157 mc = ms->specs;
158
159 Write(W_BEGIN, ms, 0, 0, 0, 0, 0);
160 if (Sync() < 0)
161 leave(LEAVE_SYNC);
162
163 (void) signal(SIGCHLD, child);
164 if (!hasdriver)
165 switch (fork()) {
166 case 0:
167 longjmp(restart, MODE_DRIVER);
168 /*NOTREACHED*/
169 case -1:
170 perror("fork");
171 leave(LEAVE_FORK);
172 break;
173 default:
174 hasdriver++;
175 }
176
177 printf("Your ship is the %s, a %d gun %s (%s crew).\n",
178 ms->shipname, mc->guns, classname[mc->class],
179 qualname[mc->qual]);
180 if ((nameptr = (char *) getenv("SAILNAME")) && *nameptr)
181 (void) strncpy(captain, nameptr, sizeof captain);
182 else {
183 (void) printf("Your name, Captain? ");
184 (void) fflush(stdout);
185 (void) gets(captain);
186 if (!*captain)
187 (void) strcpy(captain, "no name");
188 }
189 captain[sizeof captain - 1] = '\0';
190 Write(W_CAPTAIN, ms, 1, (int)captain, 0, 0, 0);
191 for (n = 0; n < 2; n++) {
192 char buf[10];
193
194 printf("\nInitial broadside %s (grape, chain, round, double): ",
195 n ? "right" : "left");
196 (void) fflush(stdout);
197 (void) scanf("%s", buf);
198 switch (*buf) {
199 case 'g':
200 load = L_GRAPE;
201 break;
202 case 'c':
203 load = L_CHAIN;
204 break;
205 case 'r':
206 load = L_ROUND;
207 break;
208 case 'd':
209 load = L_DOUBLE;
210 break;
211 default:
212 load = L_ROUND;
213 }
214 if (n) {
215 mf->loadR = load;
216 mf->readyR = R_LOADED|R_INITIAL;
217 } else {
218 mf->loadL = load;
219 mf->readyL = R_LOADED|R_INITIAL;
220 }
221 }
222
223 initscreen();
224 draw_board();
225 (void) sprintf(message, "Captain %s assuming command", captain);
226 Write(W_SIGNAL, ms, 1, (int)message, 0, 0, 0);
227 newturn();
228}