Annotation of 43BSDTahoe/games/sail/pl_7.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.