Annotation of 42BSD/games/worms.c, revision 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.