Annotation of 42BSD/games/worms.c, revision 1.1.1.1

1.1       root        1: 
                      2: static char sccsid[] = "       worms.c 4.1     82/10/24        ";
                      3: 
                      4: /*
                      5: 
                      6:         @@@        @@@    @@@@@@@@@@     @@@@@@@@@@@    @@@@@@@@@@@@
                      7:         @@@        @@@   @@@@@@@@@@@@    @@@@@@@@@@@@   @@@@@@@@@@@@@
                      8:         @@@        @@@  @@@@      @@@@   @@@@           @@@@ @@@  @@@@
                      9:         @@@   @@   @@@  @@@        @@@   @@@            @@@  @@@   @@@
                     10:         @@@  @@@@  @@@  @@@        @@@   @@@            @@@  @@@   @@@
                     11:         @@@@ @@@@ @@@@  @@@        @@@   @@@            @@@  @@@   @@@
                     12:          @@@@@@@@@@@@   @@@@      @@@@   @@@            @@@  @@@   @@@
                     13:           @@@@  @@@@     @@@@@@@@@@@@    @@@            @@@  @@@   @@@
                     14:            @@    @@       @@@@@@@@@@     @@@            @@@  @@@   @@@
                     15: 
                     16:                                 Eric P. Scott
                     17:                          Caltech High Energy Physics
                     18:                                 October, 1980
                     19: 
                     20: */
                     21: #include <stdio.h>
                     22: #include <sgtty.h>
                     23: #define cursor(col,row) tputs(tgoto(CM,col,row),1,outc)
                     24: outc(c)
                     25: {
                     26:        putchar(c);
                     27: }
                     28: extern char *UP;
                     29: extern short ospeed;
                     30: int Wrap;
                     31: short *ref[24];
                     32: static char flavor[]={
                     33:     'O', '*', '#', '$', '%', '0'
                     34: };
                     35: static short xinc[]={
                     36:      1,  1,  1,  0, -1, -1, -1,  0
                     37: }, yinc[]={
                     38:     -1,  0,  1,  1,  1,  0, -1, -1
                     39: };
                     40: static struct worm {
                     41:     int orientation, head;
                     42:     short *xpos, *ypos;
                     43: } worm[40];
                     44: static char *field;
                     45: static int length=16, number=3, trail=' ';
                     46: static struct options {
                     47:     int nopts;
                     48:     int opts[3];
                     49: } normal[8]={
                     50:     { 3, { 7, 0, 1 } },
                     51:     { 3, { 0, 1, 2 } },
                     52:     { 3, { 1, 2, 3 } },
                     53:     { 3, { 2, 3, 4 } },
                     54:     { 3, { 3, 4, 5 } },
                     55:     { 3, { 4, 5, 6 } },
                     56:     { 3, { 5, 6, 7 } },
                     57:     { 3, { 6, 7, 0 } }
                     58: }, upper[8]={
                     59:     { 1, { 1, 0, 0 } },
                     60:     { 2, { 1, 2, 0 } },
                     61:     { 0, { 0, 0, 0 } },
                     62:     { 0, { 0, 0, 0 } },
                     63:     { 0, { 0, 0, 0 } },
                     64:     { 2, { 4, 5, 0 } },
                     65:     { 1, { 5, 0, 0 } },
                     66:     { 2, { 1, 5, 0 } }
                     67: }, left[8]={
                     68:     { 0, { 0, 0, 0 } },
                     69:     { 0, { 0, 0, 0 } },
                     70:     { 0, { 0, 0, 0 } },
                     71:     { 2, { 2, 3, 0 } },
                     72:     { 1, { 3, 0, 0 } },
                     73:     { 2, { 3, 7, 0 } },
                     74:     { 1, { 7, 0, 0 } },
                     75:     { 2, { 7, 0, 0 } }
                     76: }, right[8]={
                     77:     { 1, { 7, 0, 0 } },
                     78:     { 2, { 3, 7, 0 } },
                     79:     { 1, { 3, 0, 0 } },
                     80:     { 2, { 3, 4, 0 } },
                     81:     { 0, { 0, 0, 0 } },
                     82:     { 0, { 0, 0, 0 } },
                     83:     { 0, { 0, 0, 0 } },
                     84:     { 2, { 6, 7, 0 } }
                     85: }, lower[8]={
                     86:     { 0, { 0, 0, 0 } },
                     87:     { 2, { 0, 1, 0 } },
                     88:     { 1, { 1, 0, 0 } },
                     89:     { 2, { 1, 5, 0 } },
                     90:     { 1, { 5, 0, 0 } },
                     91:     { 2, { 5, 6, 0 } },
                     92:     { 0, { 0, 0, 0 } },
                     93:     { 0, { 0, 0, 0 } }
                     94: }, upleft[8]={
                     95:     { 0, { 0, 0, 0 } },
                     96:     { 0, { 0, 0, 0 } },
                     97:     { 0, { 0, 0, 0 } },
                     98:     { 0, { 0, 0, 0 } },
                     99:     { 0, { 0, 0, 0 } },
                    100:     { 1, { 3, 0, 0 } },
                    101:     { 2, { 1, 3, 0 } },
                    102:     { 1, { 1, 0, 0 } }
                    103: }, upright[8]={
                    104:     { 2, { 3, 5, 0 } },
                    105:     { 1, { 3, 0, 0 } },
                    106:     { 0, { 0, 0, 0 } },
                    107:     { 0, { 0, 0, 0 } },
                    108:     { 0, { 0, 0, 0 } },
                    109:     { 0, { 0, 0, 0 } },
                    110:     { 0, { 0, 0, 0 } },
                    111:     { 1, { 5, 0, 0 } }
                    112: }, lowleft[8]={
                    113:     { 3, { 7, 0, 1 } },
                    114:     { 0, { 0, 0, 0 } },
                    115:     { 0, { 0, 0, 0 } },
                    116:     { 1, { 1, 0, 0 } },
                    117:     { 2, { 1, 7, 0 } },
                    118:     { 1, { 7, 0, 0 } },
                    119:     { 0, { 0, 0, 0 } },
                    120:     { 0, { 0, 0, 0 } }
                    121: }, lowright[8]={
                    122:     { 0, { 0, 0, 0 } },
                    123:     { 1, { 7, 0, 0 } },
                    124:     { 2, { 5, 7, 0 } },
                    125:     { 1, { 5, 0, 0 } },
                    126:     { 0, { 0, 0, 0 } },
                    127:     { 0, { 0, 0, 0 } },
                    128:     { 0, { 0, 0, 0 } },
                    129:     { 0, { 0, 0, 0 } }
                    130: };
                    131: main(argc,argv)
                    132: int argc;
                    133: char *argv[];
                    134: {
                    135:     extern fputchar();
                    136:     char *malloc();
                    137:     char *getenv();
                    138:     char *tgetstr(), *tgoto();
                    139:     float ranf();
                    140:     register int x, y;
                    141:     register int n;
                    142:     register struct worm *w;
                    143:     register struct options *op;
                    144:     register int h;
                    145:     register short *ip;
                    146:     char *AL, *BC, *CM, *EI, *HO, *IC, *IM, *IP, *SR;
                    147:     int CO, IN, LI, last, bottom;
                    148:     char *tcp;
                    149:     register char *term;
                    150:     char tcb[100];
                    151:     struct sgttyb sg;
                    152:     setbuf(stdout,malloc(BUFSIZ));
                    153:     for (x=1;x<argc;x++) {
                    154:        register char *p;
                    155:        p=argv[x];
                    156:        if (*p=='-') p++;
                    157:        switch (*p) {
                    158:        case 'f':
                    159:            field="WORM";
                    160:            break;
                    161:        case 'l':
                    162:            if (++x==argc) goto usage;
                    163:            if ((length=atoi(argv[x]))<2||length>1024) {
                    164:                fprintf(stderr,"%s: Invalid length\n",*argv);
                    165:                exit(1);
                    166:            }
                    167:            break;
                    168:        case 'n':
                    169:            if (++x==argc) goto usage;
                    170:            if ((number=atoi(argv[x]))<1||number>40) {
                    171:                fprintf(stderr,"%s: Invalid number of worms\n",*argv);
                    172:                exit(1);
                    173:            }
                    174:            break;
                    175:        case 't':
                    176:            trail='.';
                    177:            break;
                    178:        default:
                    179:        usage:
                    180:            fprintf(stderr,
                    181:                "usage: %s [-field] [-length #] [-number #] [-trail]\n",*argv);
                    182:            exit(1);
                    183:            break;
                    184:        }
                    185:     }
                    186:     if (!(term=getenv("TERM"))) {
                    187:        fprintf(stderr,"%s: TERM: parameter not set\n",*argv);
                    188:        exit(1);
                    189:     }
                    190:     if (tgetent(malloc(1024),term)<=0) {
                    191:        fprintf(stderr,"%s: %s: unknown terminal type\n",*argv,term);
                    192:        exit(1);
                    193:     }
                    194:     tcp=tcb;
                    195:     if (!(CM=tgetstr("cm",&tcp))) {
                    196:        fprintf(stderr,"%s: terminal not capable of cursor motion\n",*argv);
                    197:        exit(1);
                    198:     }
                    199:     AL=tgetstr("al",&tcp);
                    200:     BC=tgetflag("bs") ? "\b" : tgetstr("bc",&tcp);
                    201:     if ((CO=tgetnum("co"))<=0) CO=80;
                    202:     last=CO-1;
                    203:     EI=tgetstr("ei",&tcp);
                    204:     HO=tgetstr("ho",&tcp);
                    205:     IC=tgetstr("ic",&tcp);
                    206:     IM=tgetstr("im",&tcp);
                    207:     IN=tgetflag("in");
                    208:     IP=tgetstr("ip",&tcp);
                    209:     if ((LI=tgetnum("li"))<=0) LI=24;
                    210:     bottom=LI-1;
                    211:     SR=tgetstr("sr",&tcp);
                    212:     UP=tgetstr("up",&tcp);
                    213:     gtty(fileno(stdout),&sg);
                    214:     ospeed=sg.sg_ospeed;
                    215:     Wrap=tgetflag("am");
                    216:     ip=(short *)malloc(LI*CO*sizeof (short));
                    217:     for (n=0;n<LI;) {
                    218:        ref[n++]=ip; ip+=CO;
                    219:     }
                    220:     for (ip=ref[0],n=LI*CO;--n>=0;) *ip++=0;
                    221:     if (Wrap) ref[bottom][last]=1;
                    222:     for (n=number, w= &worm[0];--n>=0;w++) {
                    223:        w->orientation=w->head=0;
                    224:        if (!(ip=(short *)malloc(length*sizeof (short)))) {
                    225:            fprintf(stderr,"%s: out of memory\n",*argv);
                    226:            exit(1);
                    227:        }
                    228:        w->xpos=ip;
                    229:        for (x=length;--x>=0;) *ip++ = -1;
                    230:        if (!(ip=(short *)malloc(length*sizeof (short)))) {
                    231:            fprintf(stderr,"%s: out of memory\n",*argv);
                    232:            exit(1);
                    233:        }
                    234:        w->ypos=ip;
                    235:        for (y=length;--y>=0;) *ip++ = -1;
                    236:     }
                    237:     tputs(tgetstr("cl",&tcp),1,fputchar);
                    238:     if (field) {
                    239:        register char *p;
                    240:        p=field;
                    241:        for (y=bottom;--y>=0;) {
                    242:            for (x=CO;--x>=0;) {
                    243:                putchar(*p++);
                    244:                if (!*p) p=field;
                    245:            }
                    246:             if (!Wrap) putchar('\n');
                    247:             fflush(stdout);
                    248:         }
                    249:        if (Wrap) {
                    250:            if (IM&&!IN) {
                    251:                for (x=last;--x>0;) {
                    252:                    putchar(*p++);
                    253:                    if (!*p) p=field;
                    254:                }
                    255:                y= *p++; if (!*p) p=field;
                    256:                putchar(*p);
                    257:                if (BC) fputs(BC,stdout);
                    258:                else cursor(last-1,bottom);
                    259:                fputs(IM,stdout);
                    260:                if (IC) tputs(IC,1,fputchar);
                    261:                putchar(y);
                    262:                if (IP) tputs(IP,1,fputchar);
                    263:                fputs(EI,stdout);
                    264:            }
                    265:            else if (SR||AL) {
                    266:                if (HO) fputs(HO,stdout);
                    267:                else cursor(0,0);
                    268:                if (SR) tputs(SR,1,fputchar);
                    269:                else tputs(AL,LI,fputchar);
                    270:                for (x=CO;--x>=0;) {
                    271:                    putchar(*p++);
                    272:                    if (!*p) p=field;
                    273:                }
                    274:            }
                    275:            else for (x=last;--x>=0;) {
                    276:                    putchar(*p++);
                    277:                    if (!*p) p=field;
                    278:            }
                    279:        }
                    280:        else for (x=CO;--x>=0;) {
                    281:            putchar(*p++);
                    282:            if (!*p) p=field;
                    283:        }
                    284:     }
                    285:     fflush(stdout);
                    286:     for (;;) {
                    287:        for (n=0,w= &worm[0];n<number;n++,w++) {
                    288:            if ((x=w->xpos[h=w->head])<0) {
                    289:                cursor(x=w->xpos[h]=0,y=w->ypos[h]=bottom);
                    290:                putchar(flavor[n%6]);
                    291:                ref[y][x]++;
                    292:            }
                    293:            else y=w->ypos[h];
                    294:            if (++h==length) h=0;
                    295:            if (w->xpos[w->head=h]>=0) {
                    296:                register int x1, y1;
                    297:                x1=w->xpos[h]; y1=w->ypos[h];
                    298:                if (--ref[y1][x1]==0) {
                    299:                    cursor(x1,y1); putchar(trail);
                    300:                }
                    301:            }
                    302:             op= &(x==0 ? (y==0 ? upleft : (y==bottom ? lowleft : left)) :
                    303:                 (x==last ? (y==0 ? upright : (y==bottom ? lowright : right)) :
                    304:                (y==0 ? upper : (y==bottom ? lower : normal))))[w->orientation];
                    305:            switch (op->nopts) {
                    306:            case 0:
                    307:                fflush(stdout);
                    308:                abort();
                    309:                return;
                    310:            case 1:
                    311:                w->orientation=op->opts[0];
                    312:                break;
                    313:            default:
                    314:                w->orientation=op->opts[(int)(ranf()*(float)op->nopts)];
                    315:            }
                    316:            cursor(x+=xinc[w->orientation], y+=yinc[w->orientation]);
                    317:            if (!Wrap||x!=last||y!=bottom) putchar(flavor[n%6]);
                    318:            ref[w->ypos[h]=y][w->xpos[h]=x]++;
                    319:        }
                    320:        fflush(stdout);
                    321:     }
                    322: }
                    323: fputchar(c)
                    324: char c;
                    325: {
                    326:     putchar(c);
                    327: }
                    328: float ranf() {
                    329:     return((float)rand()/2147483647.);
                    330: }

unix.superglobalmegacorp.com

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