Change xs.h into a proper C file. [rsc] --rw-rw-r-- M 733409 jmk sys 1285 Oct 2 12:48 sys/src/games/4s.c /n/sourcesdump/2005/1002/plan9/sys/src/games/4s.c:1,21 - /n/sourcesdump/2005/1003/plan9/sys/src/games/4s.c:1,7 - #include - #include - #include - #include - #include - #include - #include + #include "xs.h" - #define N 4 + int N = 4; - typedef struct Piece Piece; - struct Piece{ - short rot; - short tx; - Point sz; - Point d[N]; - }; - Piece pieces[]={ { 0, 0, 4,1, { 0,0, 1,0, 1,0, 1,0 }}, { 1, 0, 1,4, { 0,0, 0,1, 0,1, 0,1 }}, /n/sourcesdump/2005/1002/plan9/sys/src/games/4s.c:53,56 - /n/sourcesdump/2005/1003/plan9/sys/src/games/4s.c:39,43 { 3, 6, 2,3, { 0,0, 0,1, 1,0, 0,1 }}, }; - #include "xs.h" + int NP = nelem(pieces); + [rsc] --rw-rw-r-- M 733409 jmk sys 3621 Oct 2 12:48 sys/src/games/5s.c /n/sourcesdump/2005/1002/plan9/sys/src/games/5s.c:1,21 - /n/sourcesdump/2005/1003/plan9/sys/src/games/5s.c:1,7 - #include - #include - #include - #include - #include - #include - #include + #include "xs.h" - #define N 5 + int N = 5; - typedef struct Piece Piece; - struct Piece{ - short rot; - short tx; - Point sz; - Point d[N]; - }; - Piece pieces[]={ { 0, 1, 5,1, { 0,0, 1,0, 1,0, 1,0, 1,0 }}, { 1, 1, 1,5, { 0,0, 0,1, 0,1, 0,1, 0,1 }}, /n/sourcesdump/2005/1002/plan9/sys/src/games/5s.c:109,112 - /n/sourcesdump/2005/1003/plan9/sys/src/games/5s.c:95,99 }; - #include "xs.h" + int NP = nelem(pieces); + [rsc] --rw-rw-r-- M 733409 jmk sys 586 Oct 2 12:49 sys/src/games/mkfile /n/sourcesdump/2005/1002/plan9/sys/src/games/mkfile:16,23 - /n/sourcesdump/2005/1003/plan9/sys/src/games/mkfile:16,23 mahjongg\ sokoban\ - 4s.$O: xs.h - 5s.$O: xs.h + 4s.$O 5s.$O xs.$O: xs.h + $O.4s $O.5s: xs.$O catclock.$O: catback.p eyes.p all:V: dirall [rsc] --rw-rw-r-- M 733409 rsc sys 17124 Oct 2 12:48 sys/src/games/xs.c [rsc] --rw-rw-r-- M 733409 jmk sys 292 Oct 2 12:48 sys/src/games/xs.h /n/sourcesdump/2005/1002/plan9/sys/src/games/xs.h:1,895 - /n/sourcesdump/2005/1003/plan9/sys/src/games/xs.h:1,24 - /* - * engine for 4s, 5s, etc - * need to define N and pieces table before including this - */ + #include + #include + #include + #include + #include + #include + #include - Cursor whitearrow = { - {0, 0}, - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFC, - 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF8, 0xFF, 0xFC, - 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFC, - 0xF3, 0xF8, 0xF1, 0xF0, 0xE0, 0xE0, 0xC0, 0x40, }, - {0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0xC0, 0x1C, - 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x38, 0xC0, 0x1C, - 0xC0, 0x0E, 0xC0, 0x07, 0xCE, 0x0E, 0xDF, 0x1C, - 0xD3, 0xB8, 0xF1, 0xF0, 0xE0, 0xE0, 0xC0, 0x40, } - }; - enum { - CNone = 0, - CBounds = 1, - CPiece = 2, - NX = 10, - NY = 20, + MAXN = 5 }; - enum{ - TIMER, - MOUSE, - RESHAPE, - KBD, - SUSPEND, - NALT + typedef struct Piece Piece; + struct Piece{ + short rot; + short tx; + Point sz; + Point d[MAXN]; }; - #define NP (sizeof pieces/sizeof(Piece)) + extern int N, NP; + extern Piece pieces[]; - char board[NY][NX]; - Rectangle rboard; - Point pscore; - Point scoresz; - int pcsz = 32; - Point pos; - Image *bb, *bbmask, *bb2, *bb2mask; - Image *whitemask; - Rectangle br, br2; - long points; - int dt; - int DY; - int DMOUSE; - int lastmx; - Mouse mouse; - int newscreen; - Channel *timerc; - Channel *suspc; - Channel *mousec; - Channel *kbdc; - Mousectl *mousectl; - Keyboardctl *kbdctl; - int suspended; - - void redraw(int); - - int tsleep; - - Piece *piece; - - #define NCOL 10 - - uchar txbits[NCOL][32]={ - {0xDD,0xDD,0xFF,0xFF,0x77,0x77,0xFF,0xFF, - 0xDD,0xDD,0xFF,0xFF,0x77,0x77,0xFF,0xFF, - 0xDD,0xDD,0xFF,0xFF,0x77,0x77,0xFF,0xFF, - 0xDD,0xDD,0xFF,0xFF,0x77,0x77,0xFF,0xFF}, - {0xDD,0xDD,0x77,0x77,0xDD,0xDD,0x77,0x77, - 0xDD,0xDD,0x77,0x77,0xDD,0xDD,0x77,0x77, - 0xDD,0xDD,0x77,0x77,0xDD,0xDD,0x77,0x77, - 0xDD,0xDD,0x77,0x77,0xDD,0xDD,0x77,0x77}, - {0xAA,0xAA,0x55,0x55,0xAA,0xAA,0x55,0x55, - 0xAA,0xAA,0x55,0x55,0xAA,0xAA,0x55,0x55, - 0xAA,0xAA,0x55,0x55,0xAA,0xAA,0x55,0x55, - 0xAA,0xAA,0x55,0x55,0xAA,0xAA,0x55,0x55}, - {0xAA,0xAA,0x55,0x55,0xAA,0xAA,0x55,0x55, - 0xAA,0xAA,0x55,0x55,0xAA,0xAA,0x55,0x55, - 0xAA,0xAA,0x55,0x55,0xAA,0xAA,0x55,0x55, - 0xAA,0xAA,0x55,0x55,0xAA,0xAA,0x55,0x55}, - {0x22,0x22,0x88,0x88,0x22,0x22,0x88,0x88, - 0x22,0x22,0x88,0x88,0x22,0x22,0x88,0x88, - 0x22,0x22,0x88,0x88,0x22,0x22,0x88,0x88, - 0x22,0x22,0x88,0x88,0x22,0x22,0x88,0x88}, - {0x22,0x22,0x00,0x00,0x88,0x88,0x00,0x00, - 0x22,0x22,0x00,0x00,0x88,0x88,0x00,0x00, - 0x22,0x22,0x00,0x00,0x88,0x88,0x00,0x00, - 0x22,0x22,0x00,0x00,0x88,0x88,0x00,0x00}, - {0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, - 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, - 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, - 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00}, - {0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, - 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, - 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, - 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00}, - {0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, - 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, - 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, - 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC}, - {0xCC,0xCC,0xCC,0xCC,0x33,0x33,0x33,0x33, - 0xCC,0xCC,0xCC,0xCC,0x33,0x33,0x33,0x33, - 0xCC,0xCC,0xCC,0xCC,0x33,0x33,0x33,0x33, - 0xCC,0xCC,0xCC,0xCC,0x33,0x33,0x33,0x33}, - }; - - int txpix[NCOL] = { - DYellow, /* yellow */ - DCyan, /* cyan */ - DGreen, /* lime green */ - DGreyblue, /* slate */ - DRed, /* red */ - DGreygreen, /* olive green */ - DBlue, /* blue */ - 0xFF55AAFF, /* pink */ - 0xFFAAFFFF, /* lavender */ - 0xBB005DFF, /* maroon */ - }; - - Image *tx[NCOL]; - - int - movemouse(void) - { - mouse.xy = Pt(rboard.min.x + Dx(rboard)/2, rboard.min.y +Dy(rboard)/2); - moveto(mousectl, mouse.xy); - return mouse.xy.x; - } - - int - warp(Point p, int x) - { - if (!suspended && piece != nil) { - x = pos.x + piece->sz.x*pcsz/2; - if (p.y < rboard.min.y) - p.y = rboard.min.y; - if (p.y >= rboard.max.y) - p.y = rboard.max.y - 1; - moveto(mousectl, Pt(x, p.y)); - } - return x; - } - - Piece * - rotr(Piece *p) - { - if(p->rot == 3) - return p-3; - return p+1; - } - - Piece * - rotl(Piece *p) - { - if(p->rot == 0) - return p+3; - return p-1; - } - - int - collide(Point pt, Piece *p) - { - int i; - int c = CNone; - - pt.x = (pt.x - rboard.min.x) / pcsz; - pt.y = (pt.y - rboard.min.y) / pcsz; - for(i=0; id[i].x; - pt.y += p->d[i].y; - if(pt.x<0 || pt.x>=NX || pt.y<0 || pt.y>=NY) - c |= CBounds; - if(board[pt.y][pt.x]) - c |= CPiece; - } - return c; - } - - int - collider(Point pt, Point pmax) - { - int i, j, pi, pj, n, m; - - pi = (pt.x - rboard.min.x) / pcsz; - pj = (pt.y - rboard.min.y) / pcsz; - n = pmax.x / pcsz; - m = pmax.y / pcsz + 1; - for(i = pi; i < pi+n && i < NX; i++) - for(j = pj; j < pj+m && j < NY; j++) - if(board[j][i]) - return 1; - return 0; - } - - void - setpiece(Piece *p){ - int i; - Rectangle r, r2; - Point op, delta; - - draw(bb, bb->r, display->white, nil, ZP); - draw(bbmask, bbmask->r, display->transparent, nil, ZP); - br = Rect(0, 0, 0, 0); - br2 = br; - piece = p; - if(p == 0) - return; - r.min = bb->r.min; - for(i=0; id[i].x*pcsz; - r.min.y += p->d[i].y*pcsz; - r.max.x = r.min.x + pcsz; - r.max.y = r.min.y + pcsz; - if(i == 0){ - draw(bb, r, display->black, nil, ZP); - draw(bb, insetrect(r, 1), tx[piece->tx], nil, ZP); - draw(bbmask, r, display->opaque, nil, ZP); - op = r.min; - }else{ - draw(bb, r, bb, nil, op); - draw(bbmask, r, bbmask, nil, op); - } - if(br.max.x < r.max.x) - br.max.x = r.max.x; - if(br.max.y < r.max.y) - br.max.y = r.max.y; - } - br.max = subpt(br.max, bb->r.min); - delta = Pt(0,DY); - br2.max = addpt(br.max, delta); - r = rectaddpt(br, bb2->r.min); - r2 = rectaddpt(br2, bb2->r.min); - draw(bb2, r2, display->white, nil, ZP); - draw(bb2, rectaddpt(r,delta), bb, nil, bb->r.min); - draw(bb2mask, r2, display->transparent, nil, ZP); - draw(bb2mask, r, display->opaque, bbmask, bb->r.min); - draw(bb2mask, rectaddpt(r,delta), display->opaque, bbmask, bb->r.min); - } - - void - drawpiece(void){ - draw(screen, rectaddpt(br, pos), bb, bbmask, bb->r.min); - if (suspended) - draw(screen, rectaddpt(br, pos), display->white, whitemask, ZP); - } - - void - undrawpiece(void) - { - Image *mask = nil; - if(collider(pos, br.max)) - mask = bbmask; - draw(screen, rectaddpt(br, pos), display->white, mask, bb->r.min); - } - - void - rest(void) - { - int i; - Point pt; - - pt = divpt(subpt(pos, rboard.min), pcsz); - for(i=0; id[i].x; - pt.y += piece->d[i].y; - board[pt.y][pt.x] = piece->tx+16; - } - } - - int - canfit(Piece *p) - { - static int dx[]={0, -1, 1, -2, 2, -3, 3, 4, -4}; - int i, j; - Point z; - - j = N + 1; - if(j >= 4){ - j = p->sz.x; - if(jsz.y) - j = p->sz.y; - j = 2*j-1; - } - for(i=0; iwhite, nil, ZP); - string(screen, pscore, display->black, ZP, font, buf); - } - - void - drawsq(Image *b, Point p, int ptx){ - Rectangle r; - - r.min = p; - r.max.x = r.min.x+pcsz; - r.max.y = r.min.y+pcsz; - draw(b, r, display->black, nil, ZP); - draw(b, insetrect(r, 1), tx[ptx], nil, ZP); - } - - void - drawboard(void) - { - int i, j; - - border(screen, insetrect(rboard, -2), 2, display->black, ZP); - draw(screen, Rect(rboard.min.x, rboard.min.y-2, rboard.max.x, rboard.min.y), - display->white, nil, ZP); - for(i=0; ir, display->white, whitemask, ZP); - } - - void - choosepiece(void) - { - int i; - - do{ - i = nrand(NP); - setpiece(&pieces[i]); - pos = rboard.min; - pos.x += nrand(NX)*pcsz; - }while(collide(Pt(pos.x, pos.y+pcsz-DY), piece)); - drawpiece(); - flushimage(display, 1); - } - - int - movepiece(void) - { - Image *mask = nil; - - if(collide(Pt(pos.x, pos.y+pcsz), piece)) - return 0; - if(collider(pos, br2.max)) - mask = bb2mask; - draw(screen, rectaddpt(br2, pos), bb2, mask, bb2->r.min); - pos.y += DY; - flushimage(display, 1); - return 1; - } - - void - suspend(int s) - { - suspended = s; - if (suspended) - setcursor(mousectl, &whitearrow); - else - setcursor(mousectl, nil); - if (!suspended) - drawpiece(); - drawboard(); - flushimage(display, 1); - } - - void - pause(int t) - { - int s; - Alt alts[NALT+1]; - - alts[TIMER].c = timerc; - alts[TIMER].v = nil; - alts[TIMER].op = CHANRCV; - alts[SUSPEND].c = suspc; - alts[SUSPEND].v = &s; - alts[SUSPEND].op = CHANRCV; - alts[RESHAPE].c = mousectl->resizec; - alts[RESHAPE].v = nil; - alts[RESHAPE].op = CHANRCV; - // avoid hanging up those writing ong mousec and kbdc - // so just accept it all and keep mouse up-to-date - alts[MOUSE].c = mousec; - alts[MOUSE].v = &mouse; - alts[MOUSE].op = CHANRCV; - alts[KBD].c = kbdc; - alts[KBD].v = nil; - alts[KBD].op = CHANRCV; - alts[NALT].op = CHANEND; - - flushimage(display, 1); - for(;;) - switch(alt(alts)){ - case SUSPEND: - if (!suspended && s) { - suspend(1); - } else if (suspended && !s) { - suspend(0); - lastmx = warp(mouse.xy, lastmx); - } - break; - case TIMER: - if(suspended) - break; - if((t -= tsleep) < 0) - return; - break; - case RESHAPE: - redraw(1); - break; - } - } - - int - horiz(void) - { - int lev[N]; - int i, j, h; - Rectangle r; - - h = 0; - for(i=0; iwhite, whitemask, ZP); - flushimage(display, 1); - } - for(i=0; i<3; i++){ - pause(250); - if(newscreen){ - drawboard(); - break; - } - for(j=0; jwhite, whitemask, ZP); - } - flushimage(display, 1); - } - r = rboard; - for(j=0; jwhite, nil, ZP); - memcpy(&board[1][0], &board[0][0], NX*lev[j]); - memset(&board[0][0], 0, NX); - } - flushimage(display, 1); - return 1; - } - - void - mright(void) - { - if(!collide(Pt(pos.x+pcsz, pos.y), piece)) - if(!collide(Pt(pos.x+pcsz, pos.y+pcsz-DY), piece)){ - undrawpiece(); - pos.x += pcsz; - drawpiece(); - flushimage(display, 1); - } - } - - void - mleft(void) - { - if(!collide(Pt(pos.x-pcsz, pos.y), piece)) - if(!collide(Pt(pos.x-pcsz, pos.y+pcsz-DY), piece)){ - undrawpiece(); - pos.x -= pcsz; - drawpiece(); - flushimage(display, 1); - } - } - - void - rright(void) - { - if(canfit(rotr(piece))){ - setpiece(rotr(piece)); - drawpiece(); - flushimage(display, 1); - } - } - - void - rleft(void) - { - if(canfit(rotl(piece))){ - setpiece(rotl(piece)); - drawpiece(); - flushimage(display, 1); - } - } - - int fusst = 0; - int - drop(int f) - { - if(f){ - score(5L*(rboard.max.y-pos.y)/pcsz); - do; while(movepiece()); - } - fusst = 0; - rest(); - if(pos.y==rboard.min.y && !horiz()) - return 1; - horiz(); - setpiece(0); - pause(1500); - choosepiece(); - lastmx = warp(mouse.xy, lastmx); - return 0; - } - - int - play(void) - { - int i; - Mouse om; - int s; - Rune r; - Alt alts[NALT+1]; - - alts[TIMER].c = timerc; - alts[TIMER].v = nil; - alts[TIMER].op = CHANRCV; - alts[MOUSE].c = mousec; - alts[MOUSE].v = &mouse; - alts[MOUSE].op = CHANRCV; - alts[SUSPEND].c = suspc; - alts[SUSPEND].v = &s; - alts[SUSPEND].op = CHANRCV; - alts[RESHAPE].c = mousectl->resizec; - alts[RESHAPE].v = nil; - alts[RESHAPE].op = CHANRCV; - alts[KBD].c = kbdc; - alts[KBD].v = &r; - alts[KBD].op = CHANRCV; - alts[NALT].op = CHANEND; - - dt = 64; - lastmx = -1; - lastmx = movemouse(); - choosepiece(); - lastmx = warp(mouse.xy, lastmx); - for(;;) - switch(alt(alts)){ - case MOUSE: - if(suspended) { - om = mouse; - break; - } - if(lastmx < 0) - lastmx = mouse.xy.x; - if(mouse.xy.x > lastmx+DMOUSE){ - mright(); - lastmx = mouse.xy.x; - } - if(mouse.xy.x < lastmx-DMOUSE){ - mleft(); - lastmx = mouse.xy.x; - } - if(mouse.buttons&1 && !(om.buttons&1)) - rleft(); - if(mouse.buttons&2 && !(om.buttons&2)) - if(drop(1)) - return 1; - if(mouse.buttons&4 && !(om.buttons&4)) - rright(); - om = mouse; - break; - case SUSPEND: - if (!suspended && s) - suspend(1); - else - if (suspended && !s) { - suspend(0); - lastmx = warp(mouse.xy, lastmx); - } - break; - case RESHAPE: - redraw(1); - break; - case KBD: - if(suspended) - break; - switch(r){ - case 'f': - case ';': - mright(); - break; - case 'a': - case 'j': - mleft(); - break; - case 'd': - case 'l': - rright(); - break; - case 's': - case 'k': - rleft(); - break; - case ' ': - if(drop(1)) - return 1; - break; - } - break; - case TIMER: - if(suspended) - break; - dt -= tsleep; - if(dt < 0){ - i = 1; - dt = 16 * (points+nrand(10000)-5000) / 10000; - if(dt >= 32){ - i += (dt-32)/16; - dt = 32; - } - dt = 52-dt; - while(i-- > 0) - if(movepiece()==0 && ++fusst==40){ - if(drop(0)) - return 1; - break; - } - } - break; - } - return 0; /* not reached */ - } - - void - setparms(void) - { - char buf[32]; - int fd, n; - - tsleep = 50; - fd = open("/dev/hz", OREAD); - if(fd < 0) - return; - n = read(fd, buf, sizeof buf - 1); - close(fd); - if(n < 0) - return; - buf[n] = '\0'; - tsleep = strtoul(buf, 0, 10); - tsleep = (1000 + tsleep - 1) / tsleep; - } - - void - timerproc(void *v) - { - Channel *c; - void **arg; - - arg = v; - c = (Channel*)arg; - - for(;;){ - sleep(tsleep); - send(c, nil); - } - } - - void - suspproc(void *) - { - Mouse mouse; - Point lastm; - Rune r; - int s; - Alt alts[NALT+1]; - - alts[TIMER].op = CHANNOP; - alts[MOUSE].c = mousectl->c; - alts[MOUSE].v = &mouse; - alts[MOUSE].op = CHANRCV; - alts[SUSPEND].op = CHANNOP; - alts[RESHAPE].op = CHANNOP; - alts[KBD].c = kbdctl->c; - alts[KBD].v = &r; - alts[KBD].op = CHANRCV; - alts[NALT].op = CHANEND; - - s = 0; - lastm = Pt(-1,-1); - for(;;) - switch(alt(alts)){ - case MOUSE: - send(mousec, &mouse); - if(lastm.x < 0 || lastm.y < 0) - lastm = mouse.xy; - if(s && ptinrect(mouse.xy, rboard) && !ptinrect(lastm, rboard)){ - s = 0; - send(suspc, &s); - } else - if(!s && !ptinrect(mouse.xy,rboard)){ - s = 1; - send(suspc, &s); - } - lastm = mouse.xy; - break; - case KBD: - switch(r){ - case 'q': - case 'Q': - case 0x04: - case 0x7F: - threadexitsall(nil); - default: - if(s) { - s = 0; - send(suspc, &s); - } else - switch(r){ - case 'z': - case 'Z': - case 'p': - case 'P': - case 0x1B: - s = 1; - send(suspc, &s); - break; - default: - send(kbdc, &r); - } - break; - } - } - } - - void - redraw(int new) - { - Rectangle r; - long dx, dy; - - if(new && getwindow(display, Refmesg) < 0) - sysfatal("can't reattach to window"); - r = screen->r; - pos.x = (pos.x - rboard.min.x) / pcsz; - pos.y = (pos.y - rboard.min.y) / pcsz; - dx = r.max.x - r.min.x; - dy = r.max.y - r.min.y - 2*32; - DY = dx / NX; - if(DY > dy / NY) - DY = dy / NY; - DY /= 8; - if(DY > 4) - DY = 4; - pcsz = DY*8; - DMOUSE = pcsz/3; - if(pcsz < 8) - sysfatal("screen too small: %d", pcsz); - rboard = screen->r; - rboard.min.x += (dx-pcsz*NX)/2; - rboard.min.y += (dy-pcsz*NY)/2+32; - rboard.max.x = rboard.min.x+NX*pcsz; - rboard.max.y = rboard.min.y+NY*pcsz; - pscore.x = rboard.min.x+8; - pscore.y = rboard.min.y-32; - scoresz = stringsize(font, "000000"); - pos.x = pos.x*pcsz + rboard.min.x; - pos.y = pos.y*pcsz + rboard.min.y; - if(bb){ - freeimage(bb); - freeimage(bbmask); - freeimage(bb2); - freeimage(bb2mask); - } - bb = allocimage(display, Rect(0,0,N*pcsz,N*pcsz), screen->chan, 0, 0); - bbmask = allocimage(display, Rect(0,0,N*pcsz,N*pcsz), GREY1, 0, 0); - bb2 = allocimage(display, Rect(0,0,N*pcsz,N*pcsz+DY), screen->chan, 0, 0); - bb2mask = allocimage(display, bb2->r, GREY1, 0, 0); - if(bb==0 || bbmask==0 || bb2==0 || bb2mask==0) - sysfatal("allocimage fail (bb)"); - draw(screen, screen->r, display->white, nil, ZP); - drawboard(); - setpiece(piece); - if(piece) - drawpiece(); - lastmx = movemouse(); - newscreen = 1; - flushimage(display, 1); - } - - void - threadmain(int argc, char *argv[]) - { - Image *tb; - char buf[200]; - int i, scores; - long starttime, endtime; - - ARGBEGIN{ - }ARGEND - - suspended = 0; - setparms(); - snprint(buf, sizeof(buf), "%ds", N); - initdraw(0, 0, buf); - mousectl = initmouse(nil, display->image); /* BUG? */ - if(mousectl == nil) - sysfatal("[45]s: mouse init failed: %r"); - kbdctl = initkeyboard(nil); /* BUG? */ - if(kbdctl == nil) - sysfatal("[45]s: keyboard init failed: %r"); - starttime = time(0); - srand(starttime); - snprint(buf, sizeof(buf), "/sys/games/lib/%dscores", N); - scores = open(buf, OWRITE); - if(scores < 0) - sysfatal("can't open %s: %r", buf); - tb = 0; - if(screen->depth < 3){ - tb = allocimage(display, Rect(0,0,16,16), 0, 1, -1); - if(tb == 0) - sysfatal("allocimage fail (tb)"); - } - for(i = 0; ichan, 1, txpix[i]); - if(tx[i] == 0) - sysfatal("allocimage fail (tx)"); - if(screen->depth < 3){ - loadimage(tb, tb->r, txbits[i], 32); - draw(tx[i], tx[i]->r, tb, nil, ZP); - } - } - if(tb != 0) - freeimage(tb); - - whitemask = allocimage(display, Rect(0,0,1,1), CMAP8, 1, setalpha(DWhite, 0x7F)); - if(whitemask==0) - sysfatal("allocimage fail (whitemask)"); - - threadsetname("4s-5s"); - timerc= chancreate(sizeof(int), 0); - proccreate(timerproc, timerc, 1024); - suspc= chancreate(sizeof(int), 0); - mousec= chancreate(sizeof(Mouse), 0); - kbdc= chancreate(sizeof(Rune), 0); - threadcreate(suspproc, nil, 1024); - points = 0; - memset(board, 0, sizeof(board)); - redraw(0); - if(play()){ - endtime = time(0); - fprint(scores, "%ld\t%s\t%lud\t%ld\n", - points, getuser(), starttime, endtime-starttime); - } - threadexitsall(nil); - exits(0); - } [sys] --rwxrwxr-x M 733409 sys sys 177871 Oct 2 23:11 386/bin/games/4s [sys] --rwxrwxr-x M 733409 sys sys 180159 Oct 2 23:11 386/bin/games/5s /sys/src/games/xs.c:canfit /sys/src/games/xs.c:choosepiece /sys/src/games/xs.c:collide /sys/src/games/xs.c:collider /sys/src/games/xs.c:drawboard /sys/src/games/xs.c:drawpiece /sys/src/games/xs.c:drawsq /sys/src/games/xs.c:drop /sys/src/games/xs.c:horiz /sys/src/games/xs.c:mleft /sys/src/games/xs.c:movemouse /sys/src/games/xs.c:movepiece /sys/src/games/xs.c:mright /sys/src/games/xs.c:pause /sys/src/games/xs.c:play /sys/src/games/xs.c:redraw /sys/src/games/xs.c:rest /sys/src/games/xs.c:rleft /sys/src/games/xs.c:rotl /sys/src/games/xs.c:rotr /sys/src/games/xs.c:rright /sys/src/games/xs.c:score /sys/src/games/xs.c:setparms /sys/src/games/xs.c:setpiece /sys/src/games/xs.c:suspend /sys/src/games/xs.c:suspproc /sys/src/games/xs.c:threadmain /sys/src/games/xs.c:timerproc /sys/src/games/xs.c:undrawpiece /sys/src/games/xs.c:usage /sys/src/games/xs.c:warp /sys/src/games/xs.h:canfit /sys/src/games/xs.h:choosepiece /sys/src/games/xs.h:collide /sys/src/games/xs.h:collider /sys/src/games/xs.h:drawboard /sys/src/games/xs.h:drawpiece /sys/src/games/xs.h:drawsq /sys/src/games/xs.h:drop /sys/src/games/xs.h:horiz /sys/src/games/xs.h:mleft /sys/src/games/xs.h:movemouse /sys/src/games/xs.h:movepiece /sys/src/games/xs.h:mright /sys/src/games/xs.h:pause /sys/src/games/xs.h:play /sys/src/games/xs.h:redraw /sys/src/games/xs.h:rest /sys/src/games/xs.h:rleft /sys/src/games/xs.h:rotl /sys/src/games/xs.h:rotr /sys/src/games/xs.h:rright /sys/src/games/xs.h:score /sys/src/games/xs.h:setparms /sys/src/games/xs.h:setpiece /sys/src/games/xs.h:suspend /sys/src/games/xs.h:suspproc /sys/src/games/xs.h:threadmain /sys/src/games/xs.h:timerproc /sys/src/games/xs.h:undrawpiece /sys/src/games/xs.h:warp /sys/src/libc/fmt/fmt.c:_fmtinstall