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