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