Commit | Line | Data |
---|---|---|
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 | 19 | static 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 | ||
26 | int choke(), child(); | |
27 | ||
28 | /*ARGSUSED*/ | |
29 | pl_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 | ||
42 | initialize() | |
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 | } | |
62 | reprint: | |
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 | } |