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