correct -u printout
[unix-history] / usr / src / games / sail / pl_4.c
CommitLineData
d8ada91f 1#ifndef lint
e7652fcf 2static char *sccsid = "@(#)pl_4.c 1.4 83/10/14";
d8ada91f
EW
3#endif
4
5#include "player.h"
6
7changesail()
8{
9 int rig, full;
10
11 rig = mc->rig1;
12 full = mf->FS;
13 if (windspeed == 6 || windspeed == 5 && mc->class > 4)
14 rig = 0;
15 if (mc->crew3 && rig) {
16 if (!full) {
17 Signal("Increase to Full sails? ", (struct ship *)0);
18 if (sgetch(1) == 'y') {
19 changed = 1;
20 Write(W_FS, ms, 0, 1, 0, 0, 0);
21 }
22 } else {
23 Signal("Reduce to Battle sails? ", (struct ship *)0);
24 if (sgetch(1) == 'y') {
25 Write(W_FS, ms, 0, 0, 0, 0, 0);
26 changed = 1;
27 }
28 }
29 } else if (!rig)
30 Signal("Sails rent to pieces", (struct ship *)0);
31}
32
d8ada91f
EW
33acceptsignal()
34{
35 char buf[60];
36 register char *p = buf;
37
38 Signal("Message? ", (struct ship *)0);
39 *p++ = '"';
40 sgetstr(p, sizeof buf - 2);
41 while (*p++)
42 ;
43 p[-1] = '"';
44 Write(W_SIGNAL, ms, 1, (int)buf, 0, 0, 0);
45}
46
47/*VARARGS2*/
48Signal(fmt, ship, a, b, c, d)
49char *fmt;
50register struct ship *ship;
51int a, b, c, d;
52{
53 Scroll();
54 if (ship == 0)
55 (void) wprintw(scroll_w, fmt, a, b, c, d);
56 else
57 (void) wprintw(scroll_w, fmt, ship->shipname, colours(ship),
58 sterncolour(ship), a, b, c, d);
59 (void) wrefresh(scroll_w);
60}
61
62static int sline = 0;
63
64Scroll()
65{
66 (void) wmove(scroll_w, sline++, 0);
67 (void) wclrtoeol(scroll_w);
68 if (sline >= SCROLL_Y)
69 sline = 0;
70}
71
72/* make sure we have two consecutive lines */
73Scroll2()
74{
75 Scroll();
76 if (sline > SCROLL_Y - 2)
77 Scroll();
78}
79
80lastline()
81{
82 (void) wmove(scroll_w, SCROLL_Y-1, 0);
83 (void) wclrtoeol(scroll_w);
84 (void) wrefresh(scroll_w);
85}
86
87prompt()
88{
89 (void) wmove(scroll_w, sline, 0);
90 (void) wclrtoeol(scroll_w);
e7652fcf 91 (void) waddch(scroll_w, '~');
d8ada91f
EW
92 (void) wmove(scroll_w, sline, 0);
93 (void) wrefresh(scroll_w);
94}
95
96sgetch(flag)
97char flag;
98{
99 register c;
100
101 while ((c = wgetch(scroll_w)) == EOF)
102 ;
103 if (flag)
104 (void) waddch(scroll_w, c);
105 return c;
106}
107
108sgetstr(buf, n)
109char *buf;
110{
111 register c;
112 register char *p = buf;
113
114 for (;;) {
e7652fcf 115 (void) wrefresh(scroll_w);
d8ada91f
EW
116 while ((c = wgetch(scroll_w)) == EOF)
117 ;
118 switch (c) {
119 case '\n':
120 case '\r':
121 *p = 0;
122 return;
123 case '\b':
1eda8103
EW
124 if (p > buf) {
125 (void) waddstr(scroll_w, "\b \b");
d8ada91f 126 p--;
1eda8103 127 }
d8ada91f
EW
128 break;
129 default:
e7652fcf 130 if (c >= ' ' && c < 0x7f && p < buf + n - 1) {
d8ada91f
EW
131 *p++ = c;
132 (void) waddch(scroll_w, c);
e7652fcf 133 } else
d8ada91f 134 (void) putchar(CTRL(g));
d8ada91f
EW
135 }
136 }
137}
138
139newturn()
140{
141 repaired = loaded = fired = changed = 0;
6c17b19a 142 movebuf[0] = '\0';
d8ada91f
EW
143
144 (void) alarm(0);
145 if (mf->readyL & R_LOADING)
146 if (mf->readyL & R_DOUBLE)
147 mf->readyL = R_LOADING;
148 else
149 mf->readyL = R_LOADED;
150 if (mf->readyR & R_LOADING)
151 if (mf->readyR & R_DOUBLE)
152 mf->readyR = R_LOADING;
153 else
154 mf->readyR = R_LOADED;
d8ada91f
EW
155 Sync();
156 if (turn % 50 == 0) /* still playing */
6c17b19a 157 Write(W_ALIVE, SHIP(0), 0, 0, 0, 0, 0); /* XXX */
d8ada91f
EW
158 if (mf->FS == 1)
159 Write(W_FS, ms, 0, 2, 0, 0, 0);
d8ada91f
EW
160 adjustview();
161
162 screen();
163
164 (void) signal(SIGALRM, newturn);
165 (void) alarm(7);
166}
167
168screen()
169{
170 draw_view();
171 draw_turn();
172 draw_stat();
173 draw_slot();
174 (void) wrefresh(scroll_w);
175}
176
177draw_view()
178{
179 register struct ship *sp;
180
181 (void) werase(view_w);
182 foreachship(sp) {
183 if (sp->file->dir
184 && sp->file->row > viewrow
185 && sp->file->row < viewrow + VIEW_Y
186 && sp->file->col > viewcol
187 && sp->file->col < viewcol + VIEW_X) {
188 (void) wmove(view_w, sp->file->row - viewrow,
189 sp->file->col - viewcol);
190 (void) waddch(view_w, colours(sp));
191 (void) wmove(view_w,
192 sternrow(sp) - viewrow,
193 sterncol(sp) - viewcol);
194 (void) waddch(view_w, sterncolour(sp));
195 }
196 }
197 (void) wrefresh(view_w);
198}
199
200draw_turn()
201{
202 (void) wmove(turn_w, 0, 0);
203 (void) wprintw(turn_w, "Turn %d", turn);
204 (void) wrefresh(turn_w);
205}
206
207draw_stat()
208{
209 (void) wmove(stat_w, STAT_1, 0);
210 (void) wprintw(stat_w, "Points %3d\n", mf->points);
211 (void) wprintw(stat_w, "Fouls %2d\n", fouled(ms));
212 (void) wprintw(stat_w, "Grapples %2d\n", grappled(ms));
213
214 (void) wmove(stat_w, STAT_2, 0);
215 (void) wprintw(stat_w, " 0 %c(%c)\n",
216 maxmove(ms, winddir + 3, -1) + '0',
217 maxmove(ms, winddir + 3, 1) + '0');
218 (void) waddstr(stat_w, " \\|/\n");
219 (void) wprintw(stat_w, " -^-%c(%c)\n",
220 maxmove(ms, winddir + 2, -1) + '0',
221 maxmove(ms, winddir + 2, 1) + '0');
222 (void) waddstr(stat_w, " /|\\\n");
223 (void) wprintw(stat_w, " | %c(%c)\n",
224 maxmove(ms, winddir + 1, -1) + '0',
225 maxmove(ms, winddir + 1, 1) + '0');
226 (void) wprintw(stat_w, " %c(%c)\n",
227 maxmove(ms, winddir, -1) + '0',
228 maxmove(ms, winddir, 1) + '0');
229
230 (void) wmove(stat_w, STAT_3, 0);
231 (void) wprintw(stat_w, "Load %c%c %c%c\n",
232 loadname[mf->loadL], readyname(mf->readyL),
233 loadname[mf->loadR], readyname(mf->readyR));
234 (void) wprintw(stat_w, "Hull %2d\n", mc->hull);
235 (void) wprintw(stat_w, "Crew %2d %2d %2d\n",
236 mc->crew1, mc->crew2, mc->crew3);
237 (void) wprintw(stat_w, "Guns %2d %2d\n", mc->gunL, mc->gunR);
238 (void) wprintw(stat_w, "Carr %2d %2d\n", mc->carR, mc->carL);
239 (void) wprintw(stat_w, "Rigg %d %d %d ", mc->rig1, mc->rig2, mc->rig3);
240 if (mc->rig4 < 0)
241 (void) waddch(stat_w, '-');
242 else
243 (void) wprintw(stat_w, "%d", mc->rig4);
244 (void) wrefresh(stat_w);
245}
246
247draw_slot()
248{
249 if (!boarding(ms, 0)) {
250 (void) mvwaddstr(slot_w, 0, 0, " ");
251 (void) mvwaddstr(slot_w, 1, 0, " ");
252 } else
253 (void) mvwaddstr(slot_w, 1, 0, "OBP");
254 if (!boarding(ms, 1)) {
255 (void) mvwaddstr(slot_w, 2, 0, " ");
256 (void) mvwaddstr(slot_w, 3, 0, " ");
257 } else
258 (void) mvwaddstr(slot_w, 3, 0, "DBP");
259
260 (void) wmove(slot_w, SLOT_Y-4, 0);
261 if (mf->RH)
262 (void) wprintw(slot_w, "%dRH", mf->RH);
263 else
264 (void) waddstr(slot_w, " ");
265 (void) wmove(slot_w, SLOT_Y-3, 0);
266 if (mf->RG)
267 (void) wprintw(slot_w, "%dRG", mf->RG);
268 else
269 (void) waddstr(slot_w, " ");
270 (void) wmove(slot_w, SLOT_Y-2, 0);
271 if (mf->RR)
272 (void) wprintw(slot_w, "%dRR", mf->RR);
273 else
274 (void) waddstr(slot_w, " ");
275
276#define Y (SLOT_Y/2)
277 (void) wmove(slot_w, 7, 1);
278 (void) wprintw(slot_w,"%d", windspeed);
279 (void) mvwaddch(slot_w, Y, 0, ' ');
280 (void) mvwaddch(slot_w, Y, 2, ' ');
281 (void) mvwaddch(slot_w, Y-1, 0, ' ');
282 (void) mvwaddch(slot_w, Y-1, 1, ' ');
283 (void) mvwaddch(slot_w, Y-1, 2, ' ');
284 (void) mvwaddch(slot_w, Y+1, 0, ' ');
285 (void) mvwaddch(slot_w, Y+1, 1, ' ');
286 (void) mvwaddch(slot_w, Y+1, 2, ' ');
287 (void) wmove(slot_w, Y - dr[winddir], 1 - dc[winddir]);
288 switch (winddir) {
289 case 1:
290 case 5:
291 (void) waddch(slot_w, '|');
292 break;
293 case 2:
294 case 6:
295 (void) waddch(slot_w, '/');
296 break;
297 case 3:
298 case 7:
299 (void) waddch(slot_w, '-');
300 break;
301 case 4:
302 case 8:
303 (void) waddch(slot_w, '\\');
304 break;
305 }
306 (void) mvwaddch(slot_w, Y + dr[winddir], 1 + dc[winddir], '+');
307 (void) wrefresh(slot_w);
308}
309
310board()
311{
312 register int n;
313
314 (void) clear();
315 (void) werase(view_w);
316 (void) werase(slot_w);
317 (void) werase(scroll_w);
318 (void) werase(stat_w);
319 (void) werase(turn_w);
320
321 (void) move(BOX_T, BOX_L);
322 for (n = 0; n < BOX_X; n++)
323 (void) addch('-');
324 (void) move(BOX_B, BOX_L);
325 for (n = 0; n < BOX_X; n++)
326 (void) addch('-');
327 for (n = BOX_T+1; n < BOX_B; n++) {
328 (void) mvaddch(n, BOX_L, '|');
329 (void) mvaddch(n, BOX_R, '|');
330 }
331 (void) mvaddch(BOX_T, BOX_L, '+');
332 (void) mvaddch(BOX_T, BOX_R, '+');
333 (void) mvaddch(BOX_B, BOX_L, '+');
334 (void) mvaddch(BOX_B, BOX_R, '+');
335 (void) refresh();
336
337#define WSaIM "Wooden Ships & Iron Men"
338 (void) wmove(view_w, 2, (VIEW_X - sizeof WSaIM - 1) / 2);
339 (void) waddstr(view_w, WSaIM);
340 (void) wmove(view_w, 4, (VIEW_X - strlen(cc->name)) / 2);
341 (void) waddstr(view_w, cc->name);
342 (void) wrefresh(view_w);
343
344 (void) move(LINE_T, LINE_L);
345 (void) printw("Class %d %s (%d guns) '%s' (%c%c)",
346 mc->class,
347 classname[mc->class],
348 mc->guns,
349 ms->shipname,
350 colours(ms),
351 sterncolour(ms));
352 (void) refresh();
353}
354
355initscreen()
356{
357 (void) initscr();
358 view_w = newwin(VIEW_Y, VIEW_X, VIEW_T, VIEW_L);
359 slot_w = newwin(SLOT_Y, SLOT_X, SLOT_T, SLOT_L);
360 scroll_w = newwin(SCROLL_Y, SCROLL_X, SCROLL_T, SCROLL_L);
361 stat_w = newwin(STAT_Y, STAT_X, STAT_T, STAT_L);
362 turn_w = newwin(TURN_Y, TURN_X, TURN_T, TURN_L);
363 done_curses++;
364 noecho();
365 crmode();
366}
367
368centerview()
369{
370 viewrow = mf->row - VIEW_Y / 2;
371 viewcol = mf->col - VIEW_X / 2;
372}
373
374upview()
375{
376 viewrow -= VIEW_Y / 3;
377}
378
379downview()
380{
381 viewrow += VIEW_Y / 3;
382}
383
384leftview()
385{
386 viewcol -= VIEW_X / 5;
387}
388
389rightview()
390{
391 viewcol += VIEW_X / 5;
392}
393
394adjustview()
395{
396 if (dont_adjust)
397 return; /* don't adjust if out of sight */
398 if (mf->row < viewrow + VIEW_Y/4)
399 viewrow = mf->row - (VIEW_Y - VIEW_Y/4);
400 else if (mf->row > viewrow + (VIEW_Y - VIEW_Y/4))
401 viewrow = mf->row - VIEW_Y/4;
402 if (mf->col < viewcol + VIEW_X/8)
403 viewcol = mf->col - (VIEW_X - VIEW_X/8);
404 else if (mf->col > viewcol + (VIEW_X - VIEW_X/8))
405 viewcol = mf->col - VIEW_X/8;
406}