|
|
1.1 ! root 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) 6/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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.