Annotation of 43BSD/contrib/X/hacks/maze/maze.c, revision 1.1

1.1     ! root        1: /* Copyright    Massachusetts Institute of Technology    1984, 1985    */
        !             2: 
        !             3: #include <X/Xlib.h>
        !             4: #include <stdio.h>
        !             5: #include <sgtty.h>
        !             6: #define MAZE_SIZE 36
        !             7: #define PIXSIZE 768
        !             8: #define SCANSIZE (PIXSIZE/16)
        !             9: #define HALFSIZE (SCANSIZE/2)
        !            10: #define CENTER (PIXSIZE/2)
        !            11: #define SIDE (PIXSIZE/3)
        !            12: #define MASK_SIZE ((PIXSIZE*PIXSIZE)/16)
        !            13: #define STRIP_SIZE (((PIXSIZE/6)*PIXSIZE)/16)
        !            14: 
        !            15: struct room {
        !            16:     struct room *north;
        !            17:     struct room *south;
        !            18:     struct room *east;
        !            19:     struct room *west;
        !            20: };
        !            21: 
        !            22: struct room *front(dir, rm)
        !            23: int dir;
        !            24: struct room *rm;
        !            25: {
        !            26:     if(rm == NULL) {
        !            27:        printf("NULL room\n");
        !            28:        exit(1);
        !            29:     }
        !            30:     switch (dir) {
        !            31:        case 2:  return(rm->south);
        !            32:        case 1:  return(rm->east);
        !            33:        case 0:  return(rm->north);
        !            34:        case 3:  return(rm->west);
        !            35:        default: printf("dir = %d\n",dir);
        !            36:                 exit(1);
        !            37:        }
        !            38: }
        !            39: 
        !            40: struct room *left(dir, rm)
        !            41: int dir;
        !            42: struct room *rm;
        !            43: {
        !            44:     return(front((dir + 3) % 4, rm));
        !            45: }
        !            46: 
        !            47: struct room *right(dir, rm)
        !            48: int dir;
        !            49: struct room *rm;
        !            50: {
        !            51:     return(front((dir + 1) % 4, rm));
        !            52: }
        !            53: 
        !            54: Window win;
        !            55: int forepix, backpix;
        !            56: Bitmap pat[20];
        !            57: 
        !            58: main(argc,argv)
        !            59:     int argc;
        !            60:     char **argv;
        !            61: {
        !            62:     int dir,i,fd,moved;
        !            63:     struct room m[MAZE_SIZE],*this_room,*next_room;
        !            64:     char c;
        !            65:     XEvent ev;
        !            66:     char *str, *prog;
        !            67:     char *maze_file = NULL;
        !            68:     char *display = NULL;
        !            69:     int nbytes;
        !            70:     int bwidth;
        !            71:     char *fore_color, *back_color, *brdr_color;
        !            72:     Pixmap bground, border;
        !            73:     int reverse = 0;
        !            74:     ColorDef cdef;
        !            75:     WindowInfo info;
        !            76: 
        !            77:     prog = *argv;
        !            78:     if ((str = XGetDefault(prog, "ReverseVideo")) && strcmp(str, "on") == 0)
        !            79:            reverse = 1;
        !            80:     bwidth = 2;
        !            81:     if (str = XGetDefault(prog, "BorderWidth"))
        !            82:            bwidth = atoi(str);
        !            83:     fore_color = XGetDefault(prog, "ForeGround");
        !            84:     back_color = XGetDefault(prog, "BackGround");
        !            85:     brdr_color = XGetDefault(prog, "Border");
        !            86:     for (argv++; --argc; argv++) {
        !            87:        if (!strcmp(*argv, "-rv")) {
        !            88:            reverse = 1;
        !            89:        } else if (!strcmp(*argv, "-fg") && argc) {
        !            90:            argv++;
        !            91:            argc--;
        !            92:            fore_color = *argv;
        !            93:        } else if (!strcmp(*argv, "-bg") && argc) {
        !            94:            argv++;
        !            95:            argc--;
        !            96:            back_color = *argv;
        !            97:        } else if (!strcmp(*argv, "-bd") && argc) {
        !            98:            argv++;
        !            99:            argc--;
        !           100:            brdr_color = *argv;
        !           101:        } else if (index(*argv, ':')) {
        !           102:            display = *argv;
        !           103:        } else if (**argv == '-' || maze_file != NULL) {
        !           104:            printf("usage: maze [-rv] [-fg <color>] [-bg <color>] [-bd <color>] [host:display] [file]\n");
        !           105:            exit(1);
        !           106:        } else {
        !           107:            maze_file = *argv;
        !           108:        }
        !           109:     }
        !           110:     if (!XOpenDisplay(display)) {
        !           111:        perror(prog);
        !           112:        exit(1);
        !           113:     }
        !           114:     if (reverse) {
        !           115:            forepix = BlackPixel;
        !           116:            backpix = WhitePixel;
        !           117:            bground = WhitePixmap;
        !           118:            border = BlackPixmap;
        !           119:     } else {
        !           120:            forepix = WhitePixel;
        !           121:            backpix = BlackPixel;
        !           122:            bground = BlackPixmap;
        !           123:            border = WhitePixmap;
        !           124:     }
        !           125:     if (DisplayCells() > 2) {
        !           126:            if (fore_color && XParseColor(fore_color, &cdef) &&
        !           127:                    XGetHardwareColor(&cdef))
        !           128:                    forepix = cdef.pixel;
        !           129:            if (back_color && XParseColor(back_color, &cdef) &&
        !           130:                    XGetHardwareColor(&cdef))
        !           131:                    bground = XMakeTile(backpix = cdef.pixel);
        !           132:            if (brdr_color && XParseColor(brdr_color, &cdef) &&
        !           133:                    XGetHardwareColor(&cdef))
        !           134:                    border = XMakeTile(cdef.pixel);
        !           135:     }
        !           136: 
        !           137:     get_maze(m, maze_file);
        !           138:     this_room = &m[0];
        !           139:     next_room = NULL;
        !           140:     dir = 1;
        !           141:     XQueryWindow(RootWindow, &info);
        !           142:     win = XCreateWindow(RootWindow,
        !           143:                        (info.width - PIXSIZE - (bwidth<<1))>>1,
        !           144:                        (info.height - PIXSIZE - (bwidth<<1))>>1,
        !           145:                        PIXSIZE,PIXSIZE,bwidth,border,bground);
        !           146:     XMapWindow(win);
        !           147:     XSelectInput(win, ButtonPressed|KeyPressed|ExposeWindow);
        !           148:     set_up_maze();
        !           149:     while (1) {
        !           150:        XClear(win);
        !           151:         next_room = this_room;
        !           152:        for(i=0;i<9;i++){
        !           153:            if(right(dir,next_room) != NULL) draw_pass(i-1,1);
        !           154:            else draw_wall(i-1,1);
        !           155:            if(left(dir,next_room) != NULL) draw_pass(i-1,-1);
        !           156:            else draw_wall(i-1,-1);
        !           157:            if((next_room = front(dir,next_room)) == NULL){
        !           158:                draw_block(i);
        !           159:                break;
        !           160:            }
        !           161:        }
        !           162:        if(i==9) XPixSet(win,CENTER-1,0,2,PIXSIZE,backpix);
        !           163:        moved = 0;
        !           164:        while(!moved){
        !           165:            XNextEvent(&ev);
        !           166:            switch(ev.type){
        !           167:            case ButtonPressed:
        !           168:                switch(((XButtonPressedEvent *)&ev)->detail & ValueMask) {
        !           169:                case LeftButton:
        !           170:                        str = "l";
        !           171:                        break;
        !           172:                case MiddleButton:
        !           173:                        if (((XButtonPressedEvent *)&ev)->detail & ShiftMask)
        !           174:                            str = "b";
        !           175:                        else
        !           176:                            str = "f";
        !           177:                        break;
        !           178:                case RightButton:
        !           179:                        str = "r";
        !           180:                        break;
        !           181:                }
        !           182:                nbytes = 1;
        !           183:                break;
        !           184:            case KeyPressed:
        !           185:                str = XLookupMapping (&ev, &nbytes);
        !           186:                break;
        !           187:            case ExposeWindow:
        !           188:                XSync(0);
        !           189:                while (QLength()) {
        !           190:                        XPeekEvent(&ev);
        !           191:                        if (ev.type != ExposeWindow)
        !           192:                                break;
        !           193:                        XNextEvent(&ev);
        !           194:                }
        !           195:                nbytes = 0;
        !           196:                moved++;
        !           197:            }
        !           198:            if (nbytes == 1)
        !           199:             switch (*str) {
        !           200:                case 'r':
        !           201:                    dir = (dir + 1) % 4;
        !           202:                    moved++;
        !           203:                    break;
        !           204:                case 'l':
        !           205:                    dir = (dir + 3) % 4;
        !           206:                    moved++;
        !           207:                    break;
        !           208:                case 'f':
        !           209:                   next_room = front(dir,this_room);
        !           210:                    if(next_room != NULL){
        !           211:                        this_room = next_room;
        !           212:                        moved++;
        !           213:                    }
        !           214:                    break;
        !           215:                case 'b':
        !           216:                    next_room = front((dir+2)%4,this_room);
        !           217:                    if(next_room != NULL){
        !           218:                        this_room = next_room;
        !           219:                        moved++;
        !           220:                    }
        !           221:                    break;
        !           222:                case 'q':
        !           223:                    exit(0);
        !           224:                default:
        !           225:                    break;
        !           226:            }
        !           227:        }
        !           228:     }
        !           229: }
        !           230:                    
        !           231: #ifdef notdef
        !           232: #define MAZE_SIDE 6
        !           233: print_maze(m)
        !           234: struct room m[MAZE_SIZE];
        !           235: {
        !           236:     register int x, y;
        !           237: 
        !           238:     for(x=0;x<MAZE_SIDE;x++){
        !           239:        for(y=0;y<MAZE_SIDE;y++){
        !           240:            if(m[6*x+y].north == NULL){
        !           241:                printf("+--+");
        !           242:            }
        !           243:            else printf("+  +");
        !           244:        }
        !           245:        printf("\n");
        !           246:        for(y=0;y<MAZE_SIDE;y++){
        !           247:            if(m[6*x+y].west == NULL){
        !           248:                printf("|  ");
        !           249:            }
        !           250:            else printf("   ");
        !           251:            if(m[6*x+y].east == NULL){
        !           252:                printf("|");
        !           253:            }
        !           254:            else printf(" ");
        !           255:        }
        !           256:        printf("\n");
        !           257:        for(y=0;y<MAZE_SIDE;y++){
        !           258:            if(m[6*x+y].south == NULL){
        !           259:                printf("+--+");
        !           260:            }
        !           261:            else printf("+  +");
        !           262:        }
        !           263:        printf("\n");
        !           264:     }
        !           265: }
        !           266: #endif
        !           267: 
        !           268: draw_wall(dist,side)
        !           269: int dist,side;
        !           270: {
        !           271:     int x3,x4;
        !           272:     
        !           273:     x3 = SIDE>>dist;
        !           274:     x4 = SIDE>>(dist+1);
        !           275:  
        !           276:     if (x3>CENTER) {
        !           277:        x4 >>= 1;
        !           278:        if (side < 0) {
        !           279:            XPixFill(win,0,0,x4,PIXSIZE,forepix,pat[0],GXcopy,AllPlanes);
        !           280:        } else {
        !           281:            XPixFill(win,PIXSIZE-x4+1,0,x4-1,PIXSIZE,forepix,pat[19-dist-1],GXcopy,AllPlanes);
        !           282:        }
        !           283:     } else {
        !           284:        if(side<0) {
        !           285:            XPixFill(win,CENTER-x3+1,0,x4-1,PIXSIZE,forepix,pat[dist+1],GXcopy,AllPlanes);
        !           286:        } else {
        !           287:            XPixFill(win,CENTER+x4+1,0,x4-1,PIXSIZE,forepix,pat[19-dist-1],GXcopy,AllPlanes);
        !           288:        }
        !           289:     }
        !           290: }
        !           291: 
        !           292: draw_pass(dist,side)
        !           293: int dist,side;
        !           294: {
        !           295:     int x3,x4,i;
        !           296: 
        !           297:     x3 = SIDE>>dist;
        !           298:     x4 = SIDE>>(dist+1);
        !           299: 
        !           300:     if(side < 0){
        !           301:        XPixSet(win,CENTER-x3,CENTER-x4,x4,x3,forepix);
        !           302:        XPixSet(win,CENTER-x3,0,1,PIXSIZE,backpix);
        !           303:        XPixSet(win,CENTER-x4,0,1,PIXSIZE,backpix);
        !           304:     }
        !           305:     else {
        !           306:        XPixSet(win,CENTER+x4,CENTER-x4,x4,x3,forepix);
        !           307:        XPixSet(win,CENTER+x4,0,1,PIXSIZE,backpix);
        !           308:        XPixSet(win,CENTER+x3,0,1,PIXSIZE,backpix);
        !           309:     }
        !           310: }
        !           311: 
        !           312: draw_block(dist)
        !           313: int dist;
        !           314: {
        !           315:     int x3,x4,i;
        !           316:     Vertex verts[5];
        !           317: 
        !           318:     x3 = SIDE>>dist;
        !           319:     x4 = SIDE>>(dist+1);
        !           320:     
        !           321:     XPixSet(win,CENTER-x3+1,CENTER-x3,2*x3-1,2*x3,forepix);
        !           322: }
        !           323: 
        !           324: int default_maze[] = {-1,-1,6,-1,
        !           325:                      -1,2,-1,-1,
        !           326:                      -1,-1,8,1,
        !           327:                      -1,4,9,-1,
        !           328:                      -1,5,-1,3,
        !           329:                      -1,-1,-1,4,
        !           330:                      0,7,12,11,
        !           331:                      -1,8,-1,6,
        !           332:                      2,9,-1,7,
        !           333:                      3,10,-1,8,
        !           334:                      -1,11,16,9,
        !           335:                      -1,6,-1,10,
        !           336:                      6,-1,18,-1,
        !           337:                      -1,14,19,-1,
        !           338:                      -1,15,20,13,
        !           339:                      -1,-1,21,-1,
        !           340:                      10,17,-1,-1,
        !           341:                      -1,-1,-1,16,
        !           342:                      12,19,-1,-1,
        !           343:                      13,-1,-1,18,
        !           344:                      14,-1,26,-1,
        !           345:                      15,22,27,-1,
        !           346:                      -1,23,28,21,
        !           347:                      -1,-1,-1,22,
        !           348:                      -1,25,30,-1,
        !           349:                      -1,-1,31,24,
        !           350:                      20,27,-1,-1,
        !           351:                      21,-1,-1,26,
        !           352:                      22,29,34,-1,
        !           353:                      -1,-1,-1,28,
        !           354:                      24,-1,-1,-1,
        !           355:                      25,32,-1,-1,
        !           356:                      -1,33,-1,31,
        !           357:                      -1,34,-1,32,
        !           358:                      28,35,-1,33,
        !           359:                      -1,-1,-1,34};
        !           360: 
        !           361: get_maze(m, maze_file)
        !           362: struct room m[MAZE_SIZE];
        !           363: char *maze_file;
        !           364: {
        !           365:     FILE *fp;
        !           366:     int i,j,n,e,s,w;
        !           367:     
        !           368:     if (maze_file == NULL) {
        !           369:        for (i=0,j=0;i<MAZE_SIZE;i++){
        !           370:                n=default_maze[j++];
        !           371:                e=default_maze[j++];
        !           372:                s=default_maze[j++];
        !           373:                w=default_maze[j++];
        !           374:                if(n == -1) m[i].north = NULL;
        !           375:                else m[i].north = &m[n];
        !           376:                if(s == -1) m[i].south = NULL;
        !           377:                else m[i].south = &m[s];
        !           378:                if(e == -1) m[i].east = NULL;
        !           379:                else m[i].east = &m[e];
        !           380:                if(w == -1) m[i].west = NULL;
        !           381:                else m[i].west = &m[w];
        !           382:        }
        !           383:        return;
        !           384:     }
        !           385:     if((fp = fopen(maze_file,"r")) == NULL){
        !           386:        perror("maze");
        !           387:        exit(1);
        !           388:     }
        !           389:     for(i=0;i<MAZE_SIZE;i++){
        !           390:        fscanf(fp,"%d,%d,%d,%d\n",&n,&e,&s,&w);
        !           391:        if(n == -1) m[i].north = NULL;
        !           392:        else m[i].north = &m[n];
        !           393:        if(s == -1) m[i].south = NULL;
        !           394:        else m[i].south = &m[s];
        !           395:        if(e == -1) m[i].east = NULL;
        !           396:        else m[i].east = &m[e];
        !           397:        if(w == -1) m[i].west = NULL;
        !           398:        else m[i].west = &m[w];
        !           399:     }
        !           400:     fclose(fp);
        !           401: }
        !           402: 
        !           403: set_up_maze()
        !           404: {
        !           405:     Bitmap b;
        !           406:     int i,bound[21],top[21],k,j,x;
        !           407:     short *strips[21],*mask;
        !           408: 
        !           409:     bound[0] = 0;
        !           410:     bound[10] = CENTER;
        !           411:     bound[20] = PIXSIZE;
        !           412:     for(i=1;i<10;i++){
        !           413:        bound[10-i]=CENTER-(SIDE/(1<<(9-i)));
        !           414:        bound[10+i]=CENTER+(SIDE/(1<<(9-i)));
        !           415:     }
        !           416:     for(i=0;i<21;i++)
        !           417:        top[i] = 0;
        !           418:     mask = (short *)calloc(MASK_SIZE, sizeof(short));
        !           419:     for (i=0;i<21;i++)
        !           420:        strips[i]=(short *)malloc(STRIP_SIZE * sizeof(short));
        !           421:     for(i=0;i<HALFSIZE;i++){
        !           422:        for(j=0;j<16;j++){
        !           423:            mask[SCANSIZE*(16*i+j)+i] = 0xaaaa>>(15-j);
        !           424:            mask[SCANSIZE*(16*i+j)+SCANSIZE-1-i] = 0xaaaa<<(15-j);
        !           425:            mask[SCANSIZE*(PIXSIZE-1-16*i-j)+i] = 0x5555>>(15-j);
        !           426:            mask[SCANSIZE*(PIXSIZE-1-16*i-j)+SCANSIZE-1-i] = 0x5555<<(15-j);
        !           427:        }
        !           428:     }
        !           429:     for(i=0;i<(HALFSIZE-1);i++){
        !           430:        for(j=(i+1)*16;j<CENTER;j++){
        !           431:            if((j % 2) == 1){
        !           432:                mask[SCANSIZE*j+i] = 0xaaaa;
        !           433:                mask[SCANSIZE*j+SCANSIZE-1-i] = 0xaaaa;
        !           434:                mask[SCANSIZE*(PIXSIZE-1-j)+i] = 0x5555;
        !           435:                mask[SCANSIZE*(PIXSIZE-1-j)+SCANSIZE-1-i] = 0x5555;
        !           436:            }
        !           437:            else {
        !           438:                mask[SCANSIZE*j+i] = 0x5555;
        !           439:                mask[SCANSIZE*j+SCANSIZE-1-i] = 0x5555;
        !           440:                mask[SCANSIZE*(PIXSIZE-1-j)+i] = 0xaaaa;
        !           441:                mask[SCANSIZE*(PIXSIZE-1-j)+SCANSIZE-1-i] = 0xaaaa;
        !           442:            }
        !           443:        }
        !           444:     }
        !           445:     for(j=0;j<PIXSIZE;j++){
        !           446:         for(i=0;i<SCANSIZE;i++){
        !           447:            for(k=1;k<21;k++){
        !           448:                if((i*16) < bound[k]) {
        !           449:                    strips[k-1][top[k-1]++] = mask[SCANSIZE*j+i];
        !           450:                    break;
        !           451:                }
        !           452:            }
        !           453:        }
        !           454:     }
        !           455:     for(i=5;i<15;i++)
        !           456:        top[i] = 0;
        !           457:     for(i=0;i<PIXSIZE;i++){
        !           458:        strips[5][top[5]++] = mask[SCANSIZE*i+HALFSIZE-1];
        !           459:        strips[6][top[6]++] = mask[SCANSIZE*i+HALFSIZE-1]>>8;
        !           460:        strips[7][top[7]++] = mask[SCANSIZE*i+HALFSIZE-1]>>12;
        !           461:        strips[8][top[8]++] = mask[SCANSIZE*i+HALFSIZE-1]>>14;
        !           462:        strips[9][top[9]++] = mask[SCANSIZE*i+HALFSIZE-1]>>15;
        !           463:        strips[10][top[10]++] = mask[SCANSIZE*i+HALFSIZE];
        !           464:        strips[11][top[11]++] = mask[SCANSIZE*i+HALFSIZE]>>1;
        !           465:        strips[12][top[12]++] = mask[SCANSIZE*i+HALFSIZE]>>2;
        !           466:        strips[13][top[13]++] = mask[SCANSIZE*i+HALFSIZE]>>4;
        !           467:        strips[14][top[14]++] = mask[SCANSIZE*i+HALFSIZE]>>8;
        !           468:     }
        !           469:     for(k=1;k<21;k++){
        !           470:        if (bound[k] != bound[k-1]) {
        !           471:            pat[k-1] = XStoreBitmap(bound[k]-bound[k-1],PIXSIZE,strips[k-1]);
        !           472:            if (pat[k-1] == NULL)
        !           473:                exit(1);
        !           474:        } else
        !           475:           pat[k-1] = NULL;
        !           476:     }
        !           477:     free(mask);
        !           478:     for (i=0;i<21;i++)
        !           479:        free(strips[i]);
        !           480: }

unix.superglobalmegacorp.com

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