Annotation of 42BSD/games/backgammon/subs.c, revision 1.1.1.1

1.1       root        1: static char sccsid[] = "       subs.c  4.2     82/11/27        ";
                      2: 
                      3: #include <stdio.h>
                      4: #include "back.h"
                      5: 
                      6: int    buffnum;
                      7: char   outbuff[BUFSIZ];
                      8: 
                      9: static char    plred[] = "Player is red, computer is white.";
                     10: static char    plwhite[] = "Player is white, computer is red.";
                     11: static char    nocomp[] = "(No computer play.)";
                     12: 
                     13: char  *descr[] = {
                     14:        "Usage:  backgammon [-] [n r w b pr pw pb t3a]\n",
                     15:        "\t-\tgets this list\n\tn\tdon't ask for rules or instructions",
                     16:        "\tr\tplayer is red (implies n)\n\tw\tplayer is white (implies n)",
                     17:        "\tb\ttwo players, red and white (implies n)",
                     18:        "\tpr\tprint the board before red's turn",
                     19:        "\tpw\tprint the board before white's turn",
                     20:        "\tpb\tprint the board before both player's turn",
                     21:        "\tterm\tterminal is a term",
                     22:        "\tsfile\trecover saved game from file",
                     23:        0
                     24: };
                     25: 
                     26: errexit (s)
                     27: register char  *s;
                     28: {
                     29:        write (2,"\n",1);
                     30:        perror (s);
                     31:        getout();
                     32: }
                     33: 
                     34: strset (s1,s2)
                     35: register char  *s1, *s2;
                     36: {
                     37:        while ( (*s1++ = *s2++) != '\0');
                     38: }
                     39: 
                     40: addbuf (c)
                     41: register char  c;
                     42: 
                     43: {
                     44:        buffnum++;
                     45:        if (buffnum == BUFSIZ)  {
                     46:                if (write(1,outbuff,BUFSIZ) != BUFSIZ)
                     47:                        errexit ("addbuf (write):");
                     48:                buffnum = 0;
                     49:        }
                     50:        outbuff[buffnum] = c;
                     51: }
                     52: 
                     53: buflush ()  {
                     54:        if (buffnum < 0)
                     55:                return;
                     56:        buffnum++;
                     57:        if (write (1,outbuff,buffnum) != buffnum)
                     58:                errexit ("buflush (write):");
                     59:        buffnum = -1;
                     60: }
                     61: 
                     62: readc () {
                     63:        char    c;
                     64: 
                     65:        if (tflag)  {
                     66:                cline();
                     67:                newpos();
                     68:        }
                     69:        buflush();
                     70:        if (read(0,&c,1) != 1)
                     71:                errexit ("readc");
                     72:        if (c == '\177')
                     73:                getout();
                     74:        if (c == '\033' || c == '\015')
                     75:                return ('\n');
                     76:        if (cflag)
                     77:                return (c);
                     78:        if (c == '\014')
                     79:                return ('R');
                     80:        if (c >= 'a' && c <= 'z')
                     81:                return (c & 0137);
                     82:        return (c);
                     83: }
                     84: 
                     85: writec (c)
                     86: char   c;
                     87: {
                     88:        if (tflag)
                     89:                fancyc (c);
                     90:        else
                     91:                addbuf (c);
                     92: }
                     93: 
                     94: writel (l)
                     95: register char  *l;
                     96: {
                     97: #ifdef DEBUG
                     98:        register char   *s;
                     99: 
                    100:        if (trace == NULL)
                    101:                trace = fopen ("bgtrace","w");
                    102:        
                    103:        fprintf (trace,"writel: \"");
                    104:        for (s = l; *s; s++) {
                    105:                if (*s < ' ' || *s == '\177')
                    106:                        fprintf (trace,"^%c",(*s)^0100);
                    107:                else
                    108:                        putc (*s,trace);
                    109:        }
                    110:        fprintf (trace,"\"\n");
                    111:        fflush (trace);
                    112: #endif
                    113: 
                    114:        while (*l)
                    115:                writec (*l++);
                    116: }
                    117: 
                    118: proll ()   {
                    119:        if (d0)
                    120:                swap;
                    121:        if (cturn == 1)
                    122:                writel ("Red's roll:  ");
                    123:        else
                    124:                writel ("White's roll:  ");
                    125:        writec (D0+'0');
                    126:        writec ('\040');
                    127:        writec (D1+'0');
                    128:        if (tflag)
                    129:                cline();
                    130: }
                    131: 
                    132: wrint (n)
                    133: int    n;
                    134: {
                    135:        register int    i, j, t;
                    136: 
                    137:        for (i = 4; i > 0; i--)  {
                    138:                t = 1;
                    139:                for (j = 0; j<i; j++)
                    140:                        t *= 10;
                    141:                if (n > t-1)
                    142:                        writec ((n/t)%10+'0');
                    143:        }
                    144:        writec (n%10+'0');
                    145: }
                    146: 
                    147: gwrite()  {
                    148:        register int    r, c;
                    149: 
                    150:        if (tflag)  {
                    151:                r = curr;
                    152:                c = curc;
                    153:                curmove (16,0);
                    154:        }
                    155: 
                    156:        if (gvalue > 1)  {
                    157:                writel ("Game value:  ");
                    158:                wrint (gvalue);
                    159:                writel (".  ");
                    160:                if (dlast == -1)
                    161:                        writel (color[0]);
                    162:                else
                    163:                        writel (color[1]);
                    164:                writel (" doubled last.");
                    165:        } else  {
                    166:                switch (pnum)  {
                    167:                case -1:                            /* player is red */
                    168:                        writel (plred);
                    169:                        break;
                    170:                case 0:                             /* player is both colors */
                    171:                        writel (nocomp);
                    172:                        break;
                    173:                case 1:                             /* player is white */
                    174:                        writel (plwhite);
                    175:                }
                    176:        }
                    177: 
                    178:        if (rscore || wscore)  {
                    179:                writel ("  ");
                    180:                wrscore();
                    181:        }
                    182: 
                    183:        if (tflag)  {
                    184:                cline();
                    185:                curmove (r,c);
                    186:        }
                    187: }
                    188: 
                    189: quit ()  {
                    190:        register int    i;
                    191: 
                    192:        if (tflag)  {
                    193:                curmove (20,0);
                    194:                clend();
                    195:        } else
                    196:                writec ('\n');
                    197:        writel ("Are you sure you want to quit?");
                    198:        if (yorn (0))  {
                    199:                if (rfl)  {
                    200:                        writel ("Would you like to save this game?");
                    201:                        if (yorn(0))
                    202:                                save(0);
                    203:                }
                    204:                cturn = 0;
                    205:                return (1);
                    206:        }
                    207:        return (0);
                    208: }
                    209: 
                    210: yorn (special)
                    211: register char  special;                        /* special response */
                    212: {
                    213:        register char   c;
                    214:        register int    i;
                    215: 
                    216:        i = 1;
                    217:        while ( (c = readc()) != 'Y' && c != 'N')  {
                    218:                if (special && c == special)
                    219:                        return (2);
                    220:                if (i)  {
                    221:                        if (special)  {
                    222:                                writel ("  (Y, N, or ");
                    223:                                writec (special);
                    224:                                writec (')');
                    225:                        } else
                    226:                                writel ("  (Y or N)");
                    227:                        i = 0;
                    228:                } else
                    229:                        writec ('\007');
                    230:        }
                    231:        if (c == 'Y')
                    232:                writel ("  Yes.\n");
                    233:        else
                    234:                writel ("  No.\n");
                    235:        if (tflag)
                    236:                buflush();
                    237:        return (c == 'Y');
                    238: }
                    239: 
                    240: wrhit (i)
                    241: register int   i;
                    242: {
                    243:        writel ("Blot hit on ");
                    244:        wrint (i);
                    245:        writec ('.');
                    246:        writec ('\n');
                    247: }
                    248: 
                    249: nexturn ()  {
                    250:        register int    c;
                    251: 
                    252:        cturn = -cturn;
                    253:        c = cturn/abs(cturn);
                    254:        home = bar;
                    255:        bar = 25-bar;
                    256:        offptr += c;
                    257:        offopp -= c;
                    258:        inptr += c;
                    259:        inopp -= c;
                    260:        Colorptr += c;
                    261:        colorptr += c;
                    262: }
                    263: 
                    264: getarg (arg)
                    265: register char  ***arg;
                    266: 
                    267: {
                    268:        register char   **s;
                    269: 
                    270:        /* process arguments here.  dashes are ignored, nbrw are ignored
                    271:           if the game is being recovered */
                    272: 
                    273:        s = *arg;
                    274:        while (s[0][0] == '-') {
                    275:                switch (s[0][1])  {
                    276: 
                    277:                /* don't ask if rules or instructions needed */
                    278:                case 'n':
                    279:                        if (rflag)
                    280:                                break;
                    281:                        aflag = 0;
                    282:                        args[acnt++] = 'n';
                    283:                        break;
                    284: 
                    285:                /* player is both read and white */
                    286:                case 'b':
                    287:                        if (rflag)
                    288:                                break;
                    289:                        pnum = 0;
                    290:                        aflag = 0;
                    291:                        args[acnt++] = 'b';
                    292:                        break;
                    293: 
                    294:                /* player is red */
                    295:                case 'r':
                    296:                        if (rflag)
                    297:                                break;
                    298:                        pnum = -1;
                    299:                        aflag = 0;
                    300:                        args[acnt++] = 'r';
                    301:                        break;
                    302: 
                    303:                /* player is white */
                    304:                case 'w':
                    305:                        if (rflag)
                    306:                                break;
                    307:                        pnum = 1;
                    308:                        aflag = 0;
                    309:                        args[acnt++] = 'w';
                    310:                        break;
                    311: 
                    312:                /* print board after move according to following character */
                    313:                case 'p':
                    314:                        if (s[0][2] != 'r' && s[0][2] != 'w' && s[0][2] != 'b')
                    315:                                break;
                    316:                        args[acnt++] = 'p';
                    317:                        args[acnt++] = s[0][2];
                    318:                        if (s[0][2] == 'r')
                    319:                                bflag = 1;
                    320:                        if (s[0][2] == 'w')
                    321:                                bflag = -1;
                    322:                        if (s[0][2] == 'b')
                    323:                                bflag = 0;
                    324:                        break;
                    325: 
                    326:                case 't':
                    327:                        if (s[0][2] == '\0') {  /* get terminal caps */
                    328:                                s++;
                    329:                                tflag = getcaps (*s);
                    330:                        } else
                    331:                                tflag = getcaps (&s[0][2]);
                    332:                        break;
                    333: 
                    334:                case 's':
                    335:                        s++;
                    336:                        /* recover file */
                    337:                        recover (s[0]);
                    338:                        break;
                    339:                }
                    340:                s++;
                    341:        }
                    342:        if (s[0] != 0)
                    343:                recover(s[0]);
                    344: }
                    345: 
                    346: init ()  {
                    347:        register int    i;
                    348:        for (i = 0; i < 26;)
                    349:                board[i++] = 0;
                    350:        board[1] = 2;
                    351:        board[6] = board[13] = -5;
                    352:        board[8] = -3;
                    353:        board[12] = board[19] = 5;
                    354:        board[17] = 3;
                    355:        board[24] = -2;
                    356:        off[0] = off[1] = -15;
                    357:        in[0] = in[1] = 5;
                    358:        gvalue = 1;
                    359:        dlast = 0;
                    360: }
                    361: 
                    362: wrscore ()  {
                    363:        writel ("Score:  ");
                    364:        writel (color[1]);
                    365:        writec (' ');
                    366:        wrint (rscore);
                    367:        writel (", ");
                    368:        writel (color[0]);
                    369:        writec (' ');
                    370:        wrint (wscore);
                    371: }
                    372: 
                    373: fixtty (mode)
                    374: int    mode;
                    375: {
                    376:        if (tflag)
                    377:                newpos();
                    378:        buflush();
                    379:        tty.sg_flags = mode;
                    380:        if (stty (0,&tty) < 0)
                    381:                errexit("fixtty");
                    382: }
                    383: 
                    384: getout ()  {
                    385:        /* go to bottom of screen */
                    386:        if (tflag)  {
                    387:                curmove (23,0);
                    388:                cline();
                    389:        } else
                    390:                writec ('\n');
                    391: 
                    392:        /* fix terminal status */
                    393:        fixtty (old);
                    394:        exit();
                    395: }
                    396: roll ()  {
                    397:        register char   c;
                    398:        register int    row;
                    399:        register int    col;
                    400: 
                    401:        if (iroll)  {
                    402:                if (tflag)  {
                    403:                        row = curr;
                    404:                        col = curc;
                    405:                        curmove (17,0);
                    406:                } else
                    407:                        writec ('\n');
                    408:                writel ("ROLL: ");
                    409:                c = readc();
                    410:                if (c != '\n')  {
                    411:                        while (c < '1' || c > '6')
                    412:                                c = readc();
                    413:                        D0 = c-'0';
                    414:                        writec (' ');
                    415:                        writec (c);
                    416:                        c = readc();
                    417:                        while (c < '1' || c > '6')
                    418:                                c = readc();
                    419:                        D1 = c-'0';
                    420:                        writec (' ');
                    421:                        writec (c);
                    422:                        if (tflag)  {
                    423:                                curmove (17,0);
                    424:                                cline();
                    425:                                curmove (row,col);
                    426:                        } else
                    427:                                writec ('\n');
                    428:                        return;
                    429:                }
                    430:                if (tflag)  {
                    431:                        curmove (17,0);
                    432:                        cline();
                    433:                        curmove (row,col);
                    434:                } else
                    435:                        writec ('\n');
                    436:        }
                    437:        D0 = rnum(6)+1;
                    438:        D1 = rnum(6)+1;
                    439:        d0 = 0;
                    440: }

unix.superglobalmegacorp.com

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