xref: /dragonfly/games/sail/pl_7.c (revision 333227be)
1 /*
2  * Copyright (c) 1983, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *	This product includes software developed by the University of
16  *	California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * @(#)pl_7.c	8.1 (Berkeley) 5/31/93
34  * $FreeBSD: src/games/sail/pl_7.c,v 1.7 1999/11/30 03:49:37 billf Exp $
35  * $DragonFly: src/games/sail/pl_7.c,v 1.2 2003/06/17 04:25:25 dillon Exp $
36  */
37 
38 #include <sys/ttydefaults.h>
39 #include <string.h>
40 #include "player.h"
41 
42 
43 /*
44  * Display interface
45  */
46 
47 static char sc_hasprompt;
48 static char *sc_prompt;
49 static char *sc_buf;
50 static int sc_line;
51 
52 initscreen()
53 {
54 	/* initscr() already done in SCREENTEST() */
55 	view_w = newwin(VIEW_Y, VIEW_X, VIEW_T, VIEW_L);
56 	slot_w = newwin(SLOT_Y, SLOT_X, SLOT_T, SLOT_L);
57 	scroll_w = newwin(SCROLL_Y, SCROLL_X, SCROLL_T, SCROLL_L);
58 	stat_w = newwin(STAT_Y, STAT_X, STAT_T, STAT_L);
59 	turn_w = newwin(TURN_Y, TURN_X, TURN_T, TURN_L);
60 	done_curses++;
61 	(void) leaveok(view_w, 1);
62 	(void) leaveok(slot_w, 1);
63 	(void) leaveok(stat_w, 1);
64 	(void) leaveok(turn_w, 1);
65 	noecho();
66 	crmode();
67 }
68 
69 cleanupscreen()
70 {
71 	/* alarm already turned off */
72 	if (done_curses) {
73 		(void) wmove(scroll_w, SCROLL_Y - 1, 0);
74 		(void) wclrtoeol(scroll_w);
75 		draw_screen();
76 		endwin();
77 	}
78 }
79 
80 void
81 newturn()
82 {
83 	repaired = loaded = fired = changed = 0;
84 	movebuf[0] = '\0';
85 
86 	(void) alarm(0);
87 	if (mf->readyL & R_LOADING) {
88 		if (mf->readyL & R_DOUBLE)
89 			mf->readyL = R_LOADING;
90 		else
91 			mf->readyL = R_LOADED;
92 	}
93 	if (mf->readyR & R_LOADING) {
94 		if (mf->readyR & R_DOUBLE)
95 			mf->readyR = R_LOADING;
96 		else
97 			mf->readyR = R_LOADED;
98 	}
99 	if (!hasdriver)
100 		Write(W_DDEAD, SHIP(0), 0, 0, 0, 0, 0);
101 
102 	if (sc_hasprompt) {
103 		(void) wmove(scroll_w, sc_line, 0);
104 		(void) wclrtoeol(scroll_w);
105 	}
106 	if (Sync() < 0)
107 		leave(LEAVE_SYNC);
108 	if (!hasdriver)
109 		leave(LEAVE_DRIVER);
110 	if (sc_hasprompt)
111 		(void) wprintw(scroll_w, "%s%s", sc_prompt, sc_buf);
112 
113 	if (turn % 50 == 0)
114 		Write(W_ALIVE, SHIP(0), 0, 0, 0, 0, 0);
115 	if (mf->FS && (!mc->rig1 || windspeed == 6))
116 		Write(W_FS, ms, 0, 0, 0, 0, 0);
117 	if (mf->FS == 1)
118 		Write(W_FS, ms, 0, 2, 0, 0, 0);
119 
120 	if (mf->struck)
121 		leave(LEAVE_QUIT);
122 	if (mf->captured != 0)
123 		leave(LEAVE_CAPTURED);
124 	if (windspeed == 7)
125 		leave(LEAVE_HURRICAN);
126 
127 	adjustview();
128 	draw_screen();
129 
130 	(void) signal(SIGALRM, newturn);
131 	(void) alarm(7);
132 }
133 
134 /*VARARGS2*/
135 Signal(fmt, ship, a, b, c, d)
136 char *fmt;
137 struct ship *ship;
138 int a, b, c, d;
139 {
140 	if (!done_curses)
141 		return;
142 	if (*fmt == '\7')
143 		putchar(*fmt++);
144 	if (ship == 0)
145 		(void) wprintw(scroll_w, fmt, a, b, c, d);
146 	else
147 		(void) wprintw(scroll_w, fmt, ship->shipname,
148 			colours(ship), sterncolour(ship), a, b, c, d);
149 	Scroll();
150 }
151 
152 Scroll()
153 {
154 	if (++sc_line >= SCROLL_Y)
155 		sc_line = 0;
156 	(void) wmove(scroll_w, sc_line, 0);
157 	(void) wclrtoeol(scroll_w);
158 }
159 
160 prompt(p, ship)
161 char *p;
162 struct ship *ship;
163 {
164 	static char buf[60];
165 
166 	if (ship != 0) {
167 		(void)sprintf(buf, p, ship->shipname, colours(ship),
168 			sterncolour(ship));
169 		p = buf;
170 	}
171 	sc_prompt = p;
172 	sc_buf = "";
173 	sc_hasprompt = 1;
174 	(void) waddstr(scroll_w, p);
175 }
176 
177 endprompt(flag)
178 char flag;
179 {
180 	sc_hasprompt = 0;
181 	if (flag)
182 		Scroll();
183 }
184 
185 sgetch(p, ship, flag)
186 char *p;
187 struct ship *ship;
188 char flag;
189 {
190 	int c;
191 
192 	prompt(p, ship);
193 	blockalarm();
194 	(void) wrefresh(scroll_w);
195 	unblockalarm();
196 	while ((c = wgetch(scroll_w)) == EOF)
197 		;
198 	if (flag && c >= ' ' && c < 0x7f)
199 		(void) waddch(scroll_w, c);
200 	endprompt(flag);
201 	return c;
202 }
203 
204 sgetstr(pr, buf, n)
205 char *pr;
206 char *buf;
207 int n;
208 {
209 	int c;
210 	char *p = buf;
211 
212 	prompt(pr, (struct ship *)0);
213 	sc_buf = buf;
214 	for (;;) {
215 		*p = 0;
216 		blockalarm();
217 		(void) wrefresh(scroll_w);
218 		unblockalarm();
219 		while ((c = wgetch(scroll_w)) == EOF)
220 			;
221 		switch (c) {
222 		case '\n':
223 		case '\r':
224 			endprompt(1);
225 			return;
226 		case '\b':
227 			if (p > buf) {
228 				(void) waddstr(scroll_w, "\b \b");
229 				p--;
230 			}
231 			break;
232 		default:
233 			if (c >= ' ' && c < 0x7f && p < buf + n - 1) {
234 				*p++ = c;
235 				(void) waddch(scroll_w, c);
236 			} else
237 				(void) putchar(CTRL('g'));
238 		}
239 	}
240 }
241 
242 draw_screen()
243 {
244 	draw_view();
245 	draw_turn();
246 	draw_stat();
247 	draw_slot();
248 	(void) wrefresh(scroll_w);		/* move the cursor */
249 }
250 
251 draw_view()
252 {
253 	struct ship *sp;
254 
255 	(void) werase(view_w);
256 	foreachship(sp) {
257 		if (sp->file->dir
258 		    && sp->file->row > viewrow
259 		    && sp->file->row < viewrow + VIEW_Y
260 		    && sp->file->col > viewcol
261 		    && sp->file->col < viewcol + VIEW_X) {
262 			(void) wmove(view_w, sp->file->row - viewrow,
263 				sp->file->col - viewcol);
264 			(void) waddch(view_w, colours(sp));
265 			(void) wmove(view_w,
266 				sternrow(sp) - viewrow,
267 				sterncol(sp) - viewcol);
268 			(void) waddch(view_w, sterncolour(sp));
269 		}
270 	}
271 	(void) wrefresh(view_w);
272 }
273 
274 draw_turn()
275 {
276 	(void) wmove(turn_w, 0, 0);
277 	(void) wprintw(turn_w, "%cTurn %d", dont_adjust?'*':'-', turn);
278 	(void) wrefresh(turn_w);
279 }
280 
281 draw_stat()
282 {
283 	(void) wmove(stat_w, STAT_1, 0);
284 	(void) wprintw(stat_w, "Points  %3d\n", mf->points);
285 	(void) wprintw(stat_w, "Fouls    %2d\n", fouled(ms));
286 	(void) wprintw(stat_w, "Grapples %2d\n", grappled(ms));
287 
288 	(void) wmove(stat_w, STAT_2, 0);
289 	(void) wprintw(stat_w, "    0 %c(%c)\n",
290 		maxmove(ms, winddir + 3, -1) + '0',
291 		maxmove(ms, winddir + 3, 1) + '0');
292 	(void) waddstr(stat_w, "   \\|/\n");
293 	(void) wprintw(stat_w, "   -^-%c(%c)\n",
294 		maxmove(ms, winddir + 2, -1) + '0',
295 		maxmove(ms, winddir + 2, 1) + '0');
296 	(void) waddstr(stat_w, "   /|\\\n");
297 	(void) wprintw(stat_w, "    | %c(%c)\n",
298 		maxmove(ms, winddir + 1, -1) + '0',
299 		maxmove(ms, winddir + 1, 1) + '0');
300 	(void) wprintw(stat_w, "   %c(%c)\n",
301 		maxmove(ms, winddir, -1) + '0',
302 		maxmove(ms, winddir, 1) + '0');
303 
304 	(void) wmove(stat_w, STAT_3, 0);
305 	(void) wprintw(stat_w, "Load  %c%c %c%c\n",
306 		loadname[mf->loadL], readyname(mf->readyL),
307 		loadname[mf->loadR], readyname(mf->readyR));
308 	(void) wprintw(stat_w, "Hull %2d\n", mc->hull);
309 	(void) wprintw(stat_w, "Crew %2d %2d %2d\n",
310 		mc->crew1, mc->crew2, mc->crew3);
311 	(void) wprintw(stat_w, "Guns %2d %2d\n", mc->gunL, mc->gunR);
312 	(void) wprintw(stat_w, "Carr %2d %2d\n", mc->carL, mc->carR);
313 	(void) wprintw(stat_w, "Rigg %d %d %d ", mc->rig1, mc->rig2, mc->rig3);
314 	if (mc->rig4 < 0)
315 		(void) waddch(stat_w, '-');
316 	else
317 		(void) wprintw(stat_w, "%d", mc->rig4);
318 	(void) wrefresh(stat_w);
319 }
320 
321 draw_slot()
322 {
323 	if (!boarding(ms, 0)) {
324 		(void) mvwaddstr(slot_w, 0, 0, "   ");
325 		(void) mvwaddstr(slot_w, 1, 0, "   ");
326 	} else
327 		(void) mvwaddstr(slot_w, 1, 0, "OBP");
328 	if (!boarding(ms, 1)) {
329 		(void) mvwaddstr(slot_w, 2, 0, "   ");
330 		(void) mvwaddstr(slot_w, 3, 0, "   ");
331 	} else
332 		(void) mvwaddstr(slot_w, 3, 0, "DBP");
333 
334 	(void) wmove(slot_w, SLOT_Y-4, 0);
335 	if (mf->RH)
336 		(void) wprintw(slot_w, "%dRH", mf->RH);
337 	else
338 		(void) waddstr(slot_w, "   ");
339 	(void) wmove(slot_w, SLOT_Y-3, 0);
340 	if (mf->RG)
341 		(void) wprintw(slot_w, "%dRG", mf->RG);
342 	else
343 		(void) waddstr(slot_w, "   ");
344 	(void) wmove(slot_w, SLOT_Y-2, 0);
345 	if (mf->RR)
346 		(void) wprintw(slot_w, "%dRR", mf->RR);
347 	else
348 		(void) waddstr(slot_w, "   ");
349 
350 #define Y	(SLOT_Y/2)
351 	(void) wmove(slot_w, 7, 1);
352 	(void) wprintw(slot_w,"%d", windspeed);
353 	(void) mvwaddch(slot_w, Y, 0, ' ');
354 	(void) mvwaddch(slot_w, Y, 2, ' ');
355 	(void) mvwaddch(slot_w, Y-1, 0, ' ');
356 	(void) mvwaddch(slot_w, Y-1, 1, ' ');
357 	(void) mvwaddch(slot_w, Y-1, 2, ' ');
358 	(void) mvwaddch(slot_w, Y+1, 0, ' ');
359 	(void) mvwaddch(slot_w, Y+1, 1, ' ');
360 	(void) mvwaddch(slot_w, Y+1, 2, ' ');
361 	(void) wmove(slot_w, Y - dr[winddir], 1 - dc[winddir]);
362 	switch (winddir) {
363 	case 1:
364 	case 5:
365 		(void) waddch(slot_w, '|');
366 		break;
367 	case 2:
368 	case 6:
369 		(void) waddch(slot_w, '/');
370 		break;
371 	case 3:
372 	case 7:
373 		(void) waddch(slot_w, '-');
374 		break;
375 	case 4:
376 	case 8:
377 		(void) waddch(slot_w, '\\');
378 		break;
379 	}
380 	(void) mvwaddch(slot_w, Y + dr[winddir], 1 + dc[winddir], '+');
381 	(void) wrefresh(slot_w);
382 }
383 
384 draw_board()
385 {
386 	int n;
387 
388 	(void) clear();
389 	(void) werase(view_w);
390 	(void) werase(slot_w);
391 	(void) werase(scroll_w);
392 	(void) werase(stat_w);
393 	(void) werase(turn_w);
394 
395 	sc_line = 0;
396 
397 	(void) move(BOX_T, BOX_L);
398 	for (n = 0; n < BOX_X; n++)
399 		(void) addch('-');
400 	(void) move(BOX_B, BOX_L);
401 	for (n = 0; n < BOX_X; n++)
402 		(void) addch('-');
403 	for (n = BOX_T+1; n < BOX_B; n++) {
404 		(void) mvaddch(n, BOX_L, '|');
405 		(void) mvaddch(n, BOX_R, '|');
406 	}
407 	(void) mvaddch(BOX_T, BOX_L, '+');
408 	(void) mvaddch(BOX_T, BOX_R, '+');
409 	(void) mvaddch(BOX_B, BOX_L, '+');
410 	(void) mvaddch(BOX_B, BOX_R, '+');
411 	(void) refresh();
412 
413 #define WSaIM "Wooden Ships & Iron Men"
414 	(void) wmove(view_w, 2, (VIEW_X - sizeof WSaIM - 1) / 2);
415 	(void) waddstr(view_w, WSaIM);
416 	(void) wmove(view_w, 4, (VIEW_X - strlen(cc->name)) / 2);
417 	(void) waddstr(view_w, cc->name);
418 	(void) wrefresh(view_w);
419 
420 	(void) move(LINE_T, LINE_L);
421 	(void) printw("Class %d %s (%d guns) '%s' (%c%c)",
422 		mc->class,
423 		classname[mc->class],
424 		mc->guns,
425 		ms->shipname,
426 		colours(ms),
427 		sterncolour(ms));
428 	(void) refresh();
429 }
430 
431 centerview()
432 {
433 	viewrow = mf->row - VIEW_Y / 2;
434 	viewcol = mf->col - VIEW_X / 2;
435 }
436 
437 upview()
438 {
439 	viewrow -= VIEW_Y / 3;
440 }
441 
442 downview()
443 {
444 	viewrow += VIEW_Y / 3;
445 }
446 
447 leftview()
448 {
449 	viewcol -= VIEW_X / 5;
450 }
451 
452 rightview()
453 {
454 	viewcol += VIEW_X / 5;
455 }
456 
457 adjustview()
458 {
459 	if (dont_adjust)
460 		return;
461 	if (mf->row < viewrow + VIEW_Y/4)
462 		viewrow = mf->row - (VIEW_Y - VIEW_Y/4);
463 	else if (mf->row > viewrow + (VIEW_Y - VIEW_Y/4))
464 		viewrow = mf->row - VIEW_Y/4;
465 	if (mf->col < viewcol + VIEW_X/8)
466 		viewcol = mf->col - (VIEW_X - VIEW_X/8);
467 	else if (mf->col > viewcol + (VIEW_X - VIEW_X/8))
468 		viewcol = mf->col - VIEW_X/8;
469 }
470