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