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