xref: /csrg-svn/games/sail/pl_7.c (revision 60848)
118708Sedward /*
2*60848Sbostic  * Copyright (c) 1983, 1993
3*60848Sbostic  *	The Regents of the University of California.  All rights reserved.
433695Sbostic  *
542605Sbostic  * %sccs.include.redist.c%
618708Sedward  */
718708Sedward 
815310Sedward #ifndef lint
9*60848Sbostic static char sccsid[] = "@(#)pl_7.c	8.1 (Berkeley) 05/31/93";
1033695Sbostic #endif /* not lint */
1115310Sedward 
1256082Selan #include <sys/ttydefaults.h>
1315310Sedward #include "player.h"
1415310Sedward 
1556082Selan 
1615310Sedward /*
1715310Sedward  * Display interface
1815310Sedward  */
1915310Sedward 
2015310Sedward static char sc_hasprompt;
2115310Sedward static char *sc_prompt;
2215310Sedward static char *sc_buf;
2315310Sedward static int sc_line;
2415310Sedward 
initscreen()2515310Sedward initscreen()
2615310Sedward {
2716084Sedward 	/* initscr() already done in SCREENTEST() */
2815310Sedward 	view_w = newwin(VIEW_Y, VIEW_X, VIEW_T, VIEW_L);
2915310Sedward 	slot_w = newwin(SLOT_Y, SLOT_X, SLOT_T, SLOT_L);
3015310Sedward 	scroll_w = newwin(SCROLL_Y, SCROLL_X, SCROLL_T, SCROLL_L);
3115310Sedward 	stat_w = newwin(STAT_Y, STAT_X, STAT_T, STAT_L);
3215310Sedward 	turn_w = newwin(TURN_Y, TURN_X, TURN_T, TURN_L);
3315310Sedward 	done_curses++;
3415310Sedward 	(void) leaveok(view_w, 1);
3515310Sedward 	(void) leaveok(slot_w, 1);
3615310Sedward 	(void) leaveok(stat_w, 1);
3715310Sedward 	(void) leaveok(turn_w, 1);
3815310Sedward 	noecho();
3915310Sedward 	crmode();
4015310Sedward }
4115310Sedward 
cleanupscreen()4215310Sedward cleanupscreen()
4315310Sedward {
4415702Sedward 	/* alarm already turned off */
4515310Sedward 	if (done_curses) {
4615394Sedward 		(void) wmove(scroll_w, SCROLL_Y - 1, 0);
4715394Sedward 		(void) wclrtoeol(scroll_w);
4815310Sedward 		draw_screen();
4915310Sedward 		endwin();
5015310Sedward 	}
5115310Sedward }
5215310Sedward 
5346759Sbostic void
newturn()5415310Sedward newturn()
5515310Sedward {
5615310Sedward 	repaired = loaded = fired = changed = 0;
5715310Sedward 	movebuf[0] = '\0';
5815310Sedward 
5915310Sedward 	(void) alarm(0);
6015310Sedward 	if (mf->readyL & R_LOADING)
6115310Sedward 		if (mf->readyL & R_DOUBLE)
6215310Sedward 			mf->readyL = R_LOADING;
6315310Sedward 		else
6415310Sedward 			mf->readyL = R_LOADED;
6515310Sedward 	if (mf->readyR & R_LOADING)
6615310Sedward 		if (mf->readyR & R_DOUBLE)
6715310Sedward 			mf->readyR = R_LOADING;
6815310Sedward 		else
6915310Sedward 			mf->readyR = R_LOADED;
7016084Sedward 	if (!hasdriver)
7116084Sedward 		Write(W_DDEAD, SHIP(0), 0, 0, 0, 0, 0);
7215310Sedward 
7315310Sedward 	if (sc_hasprompt) {
7415310Sedward 		(void) wmove(scroll_w, sc_line, 0);
7515310Sedward 		(void) wclrtoeol(scroll_w);
7615310Sedward 	}
7716084Sedward 	if (Sync() < 0)
7816084Sedward 		leave(LEAVE_SYNC);
7916084Sedward 	if (!hasdriver)
8016084Sedward 		leave(LEAVE_DRIVER);
8115310Sedward 	if (sc_hasprompt)
8215310Sedward 		(void) wprintw(scroll_w, "%s%s", sc_prompt, sc_buf);
8315310Sedward 
8415310Sedward 	if (turn % 50 == 0)
8515310Sedward 		Write(W_ALIVE, SHIP(0), 0, 0, 0, 0, 0);
8615310Sedward 	if (mf->FS && (!mc->rig1 || windspeed == 6))
8715310Sedward 		Write(W_FS, ms, 0, 0, 0, 0, 0);
8815310Sedward 	if (mf->FS == 1)
8915310Sedward 		Write(W_FS, ms, 0, 2, 0, 0, 0);
9015310Sedward 
9115310Sedward 	if (mf->struck)
9215310Sedward 		leave(LEAVE_QUIT);
9315310Sedward 	if (mf->captured != 0)
9415310Sedward 		leave(LEAVE_CAPTURED);
9515310Sedward 	if (windspeed == 7)
9615310Sedward 		leave(LEAVE_HURRICAN);
9715310Sedward 
9815310Sedward 	adjustview();
9915310Sedward 	draw_screen();
10015310Sedward 
10115310Sedward 	(void) signal(SIGALRM, newturn);
10215310Sedward 	(void) alarm(7);
10315310Sedward }
10415310Sedward 
10515310Sedward /*VARARGS2*/
Signal(fmt,ship,a,b,c,d)10615310Sedward Signal(fmt, ship, a, b, c, d)
10715310Sedward char *fmt;
10815310Sedward register struct ship *ship;
10915310Sedward int a, b, c, d;
11015310Sedward {
11115310Sedward 	if (!done_curses)
11215310Sedward 		return;
11315310Sedward 	if (*fmt == '\7')
11415310Sedward 		putchar(*fmt++);
11515310Sedward 	if (ship == 0)
11615310Sedward 		(void) wprintw(scroll_w, fmt, a, b, c, d);
11715310Sedward 	else
11815310Sedward 		(void) wprintw(scroll_w, fmt, ship->shipname,
11915310Sedward 			colours(ship), sterncolour(ship), a, b, c, d);
12015310Sedward 	Scroll();
12115310Sedward }
12215310Sedward 
Scroll()12315310Sedward Scroll()
12415310Sedward {
12515310Sedward 	if (++sc_line >= SCROLL_Y)
12615310Sedward 		sc_line = 0;
12715310Sedward 	(void) wmove(scroll_w, sc_line, 0);
12815310Sedward 	(void) wclrtoeol(scroll_w);
12915310Sedward }
13015310Sedward 
prompt(p,ship)13115310Sedward prompt(p, ship)
13215310Sedward register char *p;
13315310Sedward struct ship *ship;
13415310Sedward {
13515310Sedward 	static char buf[60];
13615310Sedward 
13732356Sbostic 	if (ship != 0) {
13832356Sbostic 		(void)sprintf(buf, p, ship->shipname, colours(ship),
13915310Sedward 			sterncolour(ship));
14032356Sbostic 		p = buf;
14132356Sbostic 	}
14215310Sedward 	sc_prompt = p;
14315310Sedward 	sc_buf = "";
14415310Sedward 	sc_hasprompt = 1;
14515310Sedward 	(void) waddstr(scroll_w, p);
14615310Sedward }
14715310Sedward 
endprompt(flag)14815310Sedward endprompt(flag)
14915310Sedward char flag;
15015310Sedward {
15115310Sedward 	sc_hasprompt = 0;
15215310Sedward 	if (flag)
15315310Sedward 		Scroll();
15415310Sedward }
15515310Sedward 
sgetch(p,ship,flag)15615310Sedward sgetch(p, ship, flag)
15715310Sedward char *p;
15815310Sedward struct ship *ship;
15915310Sedward char flag;
16015310Sedward {
16115310Sedward 	register c;
16215310Sedward 
16315310Sedward 	prompt(p, ship);
16415731Sedward 	blockalarm();
16515310Sedward 	(void) wrefresh(scroll_w);
16615731Sedward 	unblockalarm();
16715310Sedward 	while ((c = wgetch(scroll_w)) == EOF)
16815310Sedward 		;
16915310Sedward 	if (flag && c >= ' ' && c < 0x7f)
17015310Sedward 		(void) waddch(scroll_w, c);
17115310Sedward 	endprompt(flag);
17215310Sedward 	return c;
17315310Sedward }
17415310Sedward 
sgetstr(pr,buf,n)17515310Sedward sgetstr(pr, buf, n)
17615310Sedward char *pr;
17715310Sedward register char *buf;
17815310Sedward register n;
17915310Sedward {
18015310Sedward 	register c;
18115310Sedward 	register char *p = buf;
18215310Sedward 
18315310Sedward 	prompt(pr, (struct ship *)0);
18415310Sedward 	sc_buf = buf;
18515310Sedward 	for (;;) {
18615310Sedward 		*p = 0;
18715731Sedward 		blockalarm();
18815310Sedward 		(void) wrefresh(scroll_w);
18915731Sedward 		unblockalarm();
19015310Sedward 		while ((c = wgetch(scroll_w)) == EOF)
19115310Sedward 			;
19215310Sedward 		switch (c) {
19315310Sedward 		case '\n':
19415310Sedward 		case '\r':
19515310Sedward 			endprompt(1);
19615310Sedward 			return;
19715310Sedward 		case '\b':
19815310Sedward 			if (p > buf) {
19915310Sedward 				(void) waddstr(scroll_w, "\b \b");
20015310Sedward 				p--;
20115310Sedward 			}
20215310Sedward 			break;
20315310Sedward 		default:
20415310Sedward 			if (c >= ' ' && c < 0x7f && p < buf + n - 1) {
20515310Sedward 				*p++ = c;
20615310Sedward 				(void) waddch(scroll_w, c);
20715310Sedward 			} else
20833113Sbostic 				(void) putchar(CTRL('g'));
20915310Sedward 		}
21015310Sedward 	}
21115310Sedward }
21215310Sedward 
draw_screen()21315310Sedward draw_screen()
21415310Sedward {
21515310Sedward 	draw_view();
21615310Sedward 	draw_turn();
21715310Sedward 	draw_stat();
21815310Sedward 	draw_slot();
21915310Sedward 	(void) wrefresh(scroll_w);		/* move the cursor */
22015310Sedward }
22115310Sedward 
draw_view()22215310Sedward draw_view()
22315310Sedward {
22415310Sedward 	register struct ship *sp;
22515310Sedward 
22615310Sedward 	(void) werase(view_w);
22715310Sedward 	foreachship(sp) {
22815310Sedward 		if (sp->file->dir
22915310Sedward 		    && sp->file->row > viewrow
23015310Sedward 		    && sp->file->row < viewrow + VIEW_Y
23115310Sedward 		    && sp->file->col > viewcol
23215310Sedward 		    && sp->file->col < viewcol + VIEW_X) {
23315310Sedward 			(void) wmove(view_w, sp->file->row - viewrow,
23415310Sedward 				sp->file->col - viewcol);
23515310Sedward 			(void) waddch(view_w, colours(sp));
23615310Sedward 			(void) wmove(view_w,
23715310Sedward 				sternrow(sp) - viewrow,
23815310Sedward 				sterncol(sp) - viewcol);
23915310Sedward 			(void) waddch(view_w, sterncolour(sp));
24015310Sedward 		}
24115310Sedward 	}
24215310Sedward 	(void) wrefresh(view_w);
24315310Sedward }
24415310Sedward 
draw_turn()24515310Sedward draw_turn()
24615310Sedward {
24715310Sedward 	(void) wmove(turn_w, 0, 0);
24815393Sedward 	(void) wprintw(turn_w, "%cTurn %d", dont_adjust?'*':'-', turn);
24915310Sedward 	(void) wrefresh(turn_w);
25015310Sedward }
25115310Sedward 
draw_stat()25215310Sedward draw_stat()
25315310Sedward {
25415310Sedward 	(void) wmove(stat_w, STAT_1, 0);
25515310Sedward 	(void) wprintw(stat_w, "Points  %3d\n", mf->points);
25615310Sedward 	(void) wprintw(stat_w, "Fouls    %2d\n", fouled(ms));
25715310Sedward 	(void) wprintw(stat_w, "Grapples %2d\n", grappled(ms));
25815310Sedward 
25915310Sedward 	(void) wmove(stat_w, STAT_2, 0);
26015310Sedward 	(void) wprintw(stat_w, "    0 %c(%c)\n",
26115310Sedward 		maxmove(ms, winddir + 3, -1) + '0',
26215310Sedward 		maxmove(ms, winddir + 3, 1) + '0');
26315310Sedward 	(void) waddstr(stat_w, "   \\|/\n");
26415310Sedward 	(void) wprintw(stat_w, "   -^-%c(%c)\n",
26515310Sedward 		maxmove(ms, winddir + 2, -1) + '0',
26615310Sedward 		maxmove(ms, winddir + 2, 1) + '0');
26715310Sedward 	(void) waddstr(stat_w, "   /|\\\n");
26815310Sedward 	(void) wprintw(stat_w, "    | %c(%c)\n",
26915310Sedward 		maxmove(ms, winddir + 1, -1) + '0',
27015310Sedward 		maxmove(ms, winddir + 1, 1) + '0');
27115310Sedward 	(void) wprintw(stat_w, "   %c(%c)\n",
27215310Sedward 		maxmove(ms, winddir, -1) + '0',
27315310Sedward 		maxmove(ms, winddir, 1) + '0');
27415310Sedward 
27515310Sedward 	(void) wmove(stat_w, STAT_3, 0);
27615310Sedward 	(void) wprintw(stat_w, "Load  %c%c %c%c\n",
27715310Sedward 		loadname[mf->loadL], readyname(mf->readyL),
27815310Sedward 		loadname[mf->loadR], readyname(mf->readyR));
27915310Sedward 	(void) wprintw(stat_w, "Hull %2d\n", mc->hull);
28015310Sedward 	(void) wprintw(stat_w, "Crew %2d %2d %2d\n",
28115310Sedward 		mc->crew1, mc->crew2, mc->crew3);
28215310Sedward 	(void) wprintw(stat_w, "Guns %2d %2d\n", mc->gunL, mc->gunR);
28315923Sedward 	(void) wprintw(stat_w, "Carr %2d %2d\n", mc->carL, mc->carR);
28415310Sedward 	(void) wprintw(stat_w, "Rigg %d %d %d ", mc->rig1, mc->rig2, mc->rig3);
28515310Sedward 	if (mc->rig4 < 0)
28615310Sedward 		(void) waddch(stat_w, '-');
28715310Sedward 	else
28815310Sedward 		(void) wprintw(stat_w, "%d", mc->rig4);
28915310Sedward 	(void) wrefresh(stat_w);
29015310Sedward }
29115310Sedward 
draw_slot()29215310Sedward draw_slot()
29315310Sedward {
29415310Sedward 	if (!boarding(ms, 0)) {
29515310Sedward 		(void) mvwaddstr(slot_w, 0, 0, "   ");
29615310Sedward 		(void) mvwaddstr(slot_w, 1, 0, "   ");
29715310Sedward 	} else
29815310Sedward 		(void) mvwaddstr(slot_w, 1, 0, "OBP");
29915310Sedward 	if (!boarding(ms, 1)) {
30015310Sedward 		(void) mvwaddstr(slot_w, 2, 0, "   ");
30115310Sedward 		(void) mvwaddstr(slot_w, 3, 0, "   ");
30215310Sedward 	} else
30315310Sedward 		(void) mvwaddstr(slot_w, 3, 0, "DBP");
30415310Sedward 
30515310Sedward 	(void) wmove(slot_w, SLOT_Y-4, 0);
30615310Sedward 	if (mf->RH)
30715310Sedward 		(void) wprintw(slot_w, "%dRH", mf->RH);
30815310Sedward 	else
30915310Sedward 		(void) waddstr(slot_w, "   ");
31015310Sedward 	(void) wmove(slot_w, SLOT_Y-3, 0);
31115310Sedward 	if (mf->RG)
31215310Sedward 		(void) wprintw(slot_w, "%dRG", mf->RG);
31315310Sedward 	else
31415310Sedward 		(void) waddstr(slot_w, "   ");
31515310Sedward 	(void) wmove(slot_w, SLOT_Y-2, 0);
31615310Sedward 	if (mf->RR)
31715310Sedward 		(void) wprintw(slot_w, "%dRR", mf->RR);
31815310Sedward 	else
31915310Sedward 		(void) waddstr(slot_w, "   ");
32015310Sedward 
32115310Sedward #define Y	(SLOT_Y/2)
32215310Sedward 	(void) wmove(slot_w, 7, 1);
32315310Sedward 	(void) wprintw(slot_w,"%d", windspeed);
32415310Sedward 	(void) mvwaddch(slot_w, Y, 0, ' ');
32515310Sedward 	(void) mvwaddch(slot_w, Y, 2, ' ');
32615310Sedward 	(void) mvwaddch(slot_w, Y-1, 0, ' ');
32715310Sedward 	(void) mvwaddch(slot_w, Y-1, 1, ' ');
32815310Sedward 	(void) mvwaddch(slot_w, Y-1, 2, ' ');
32915310Sedward 	(void) mvwaddch(slot_w, Y+1, 0, ' ');
33015310Sedward 	(void) mvwaddch(slot_w, Y+1, 1, ' ');
33115310Sedward 	(void) mvwaddch(slot_w, Y+1, 2, ' ');
33215310Sedward 	(void) wmove(slot_w, Y - dr[winddir], 1 - dc[winddir]);
33315310Sedward 	switch (winddir) {
33415310Sedward 	case 1:
33515310Sedward 	case 5:
33615310Sedward 		(void) waddch(slot_w, '|');
33715310Sedward 		break;
33815310Sedward 	case 2:
33915310Sedward 	case 6:
34015310Sedward 		(void) waddch(slot_w, '/');
34115310Sedward 		break;
34215310Sedward 	case 3:
34315310Sedward 	case 7:
34415310Sedward 		(void) waddch(slot_w, '-');
34515310Sedward 		break;
34615310Sedward 	case 4:
34715310Sedward 	case 8:
34815310Sedward 		(void) waddch(slot_w, '\\');
34915310Sedward 		break;
35015310Sedward 	}
35115310Sedward 	(void) mvwaddch(slot_w, Y + dr[winddir], 1 + dc[winddir], '+');
35215310Sedward 	(void) wrefresh(slot_w);
35315310Sedward }
35415310Sedward 
draw_board()35515310Sedward draw_board()
35615310Sedward {
35715310Sedward 	register int n;
35815310Sedward 
35915310Sedward 	(void) clear();
36015310Sedward 	(void) werase(view_w);
36115310Sedward 	(void) werase(slot_w);
36215310Sedward 	(void) werase(scroll_w);
36315310Sedward 	(void) werase(stat_w);
36415310Sedward 	(void) werase(turn_w);
36515310Sedward 
36615310Sedward 	sc_line = 0;
36715310Sedward 
36815310Sedward 	(void) move(BOX_T, BOX_L);
36915310Sedward 	for (n = 0; n < BOX_X; n++)
37015310Sedward 		(void) addch('-');
37115310Sedward 	(void) move(BOX_B, BOX_L);
37215310Sedward 	for (n = 0; n < BOX_X; n++)
37315310Sedward 		(void) addch('-');
37415310Sedward 	for (n = BOX_T+1; n < BOX_B; n++) {
37515310Sedward 		(void) mvaddch(n, BOX_L, '|');
37615310Sedward 		(void) mvaddch(n, BOX_R, '|');
37715310Sedward 	}
37815310Sedward 	(void) mvaddch(BOX_T, BOX_L, '+');
37915310Sedward 	(void) mvaddch(BOX_T, BOX_R, '+');
38015310Sedward 	(void) mvaddch(BOX_B, BOX_L, '+');
38115310Sedward 	(void) mvaddch(BOX_B, BOX_R, '+');
38215310Sedward 	(void) refresh();
38315310Sedward 
38415310Sedward #define WSaIM "Wooden Ships & Iron Men"
38515310Sedward 	(void) wmove(view_w, 2, (VIEW_X - sizeof WSaIM - 1) / 2);
38615310Sedward 	(void) waddstr(view_w, WSaIM);
38715310Sedward 	(void) wmove(view_w, 4, (VIEW_X - strlen(cc->name)) / 2);
38815310Sedward 	(void) waddstr(view_w, cc->name);
38915310Sedward 	(void) wrefresh(view_w);
39015310Sedward 
39115310Sedward 	(void) move(LINE_T, LINE_L);
39215310Sedward 	(void) printw("Class %d %s (%d guns) '%s' (%c%c)",
39315310Sedward 		mc->class,
39415310Sedward 		classname[mc->class],
39515310Sedward 		mc->guns,
39615310Sedward 		ms->shipname,
39715310Sedward 		colours(ms),
39815310Sedward 		sterncolour(ms));
39915310Sedward 	(void) refresh();
40015310Sedward }
40115310Sedward 
centerview()40215310Sedward centerview()
40315310Sedward {
40415310Sedward 	viewrow = mf->row - VIEW_Y / 2;
40515310Sedward 	viewcol = mf->col - VIEW_X / 2;
40615310Sedward }
40715310Sedward 
upview()40815310Sedward upview()
40915310Sedward {
41015310Sedward 	viewrow -= VIEW_Y / 3;
41115310Sedward }
41215310Sedward 
downview()41315310Sedward downview()
41415310Sedward {
41515310Sedward 	viewrow += VIEW_Y / 3;
41615310Sedward }
41715310Sedward 
leftview()41815310Sedward leftview()
41915310Sedward {
42015310Sedward 	viewcol -= VIEW_X / 5;
42115310Sedward }
42215310Sedward 
rightview()42315310Sedward rightview()
42415310Sedward {
42515310Sedward 	viewcol += VIEW_X / 5;
42615310Sedward }
42715310Sedward 
adjustview()42815310Sedward adjustview()
42915310Sedward {
43015310Sedward 	if (dont_adjust)
43115310Sedward 		return;
43215310Sedward 	if (mf->row < viewrow + VIEW_Y/4)
43315310Sedward 		viewrow = mf->row - (VIEW_Y - VIEW_Y/4);
43415310Sedward 	else if (mf->row > viewrow + (VIEW_Y - VIEW_Y/4))
43515310Sedward 		viewrow = mf->row - VIEW_Y/4;
43615310Sedward 	if (mf->col < viewcol + VIEW_X/8)
43715310Sedward 		viewcol = mf->col - (VIEW_X - VIEW_X/8);
43815310Sedward 	else if (mf->col > viewcol + (VIEW_X - VIEW_X/8))
43915310Sedward 		viewcol = mf->col - VIEW_X/8;
44015310Sedward }
441