-f causes mahjongg to indicate non-blocked tiles on mouse-over. Reference: /n/sources/patch/applied/mahjongg-control Date: Wed Jan 11 23:13:09 CET 2006 --- /sys/src/games/mahjongg/graphics.c Wed Jan 11 23:11:51 2006 +++ /sys/src/games/mahjongg/graphics.c Wed Jan 11 23:11:49 2006 @@ -84,6 +84,9 @@ if(level.board[d][x][y].clicked) draw(img, r, selected, nil, ZP); + if(level.l.d == d && eqpt(level.l.p, Pt(x, y))) + border(img, r, 2, litbrdr, level.board[d][x][y].start); + /* looks better without borders, uncomment to check it out with'em */ // r = Rpt(r.min, addpt(r.min, Pt(Tilex, Tiley))); // draw(img, r, brdr, nil, ZP); @@ -248,6 +251,70 @@ drawlevel(); if(!canmove()) done(); + } +} + +void +light(Point coord) +{ + Point p; + int d; + + /* ugly on purpose */ + + for(d = Depth - 1; d >= 0; d--) { + p = Pt((coord.x + TileDxy*d)/(Facex/2), (coord.y + TileDxy*d)/(Facey/2)); + switch(level.board[d][p.x][p.y].which) { + case 0: + break; + case 1: + goto Found; + case 2: + p = Pt(p.x-1, p.y); + goto Found; + case 3: + p = Pt(p.x-1, p.y-1); + goto Found; + case 4: + p = Pt(p.x, p.y-1); + goto Found; + } + } + + return; + +Found: + if(level.l.d == d && eqpt(level.l.p, p)) + return; + + if(freeup(d, p) && (freeleft(d, p) || freeright(d, p))) { + Point tmpp; + int tmpd; + + tmpd = level.l.d; + tmpp = level.l.p; + + level.l.d = d; + level.l.p = p; + drawbrick(d, p.x, p.y); + + /* clean up the previously lit brick */ + if(tmpd != -1 && level.board[tmpd][tmpp.x][tmpp.y].which == 1) + drawbrick(tmpd, tmpp.x, tmpp.y); + + draw(screen, screen->r, img, nil, ZP); + flushimage(display, 1); + } else if(level.l.d != -1) { + d = level.l.d; + p = level.l.p; + level.l.d = -1; + level.l.p = Pt(0, 0); + + if(level.board[d][p.x][p.y].which == 1) { + drawbrick(d, p.x, p.y); + draw(screen, screen->r, img, nil, ZP); + flushimage(display, 1); + } } } --- /sys/src/games/mahjongg/level.c Wed Jan 11 23:12:02 2006 +++ /sys/src/games/mahjongg/level.c Wed Jan 11 23:12:00 2006 @@ -145,6 +145,8 @@ orig.c.d = -1; orig.c.p = Pt(0, 0); + orig.l.d = -1; + orig.l.p = Pt(0, 0); orig.done = 0; level = orig; } --- /sys/src/games/mahjongg/mahjongg.c Wed Jan 11 23:12:14 2006 +++ /sys/src/games/mahjongg/mahjongg.c Wed Jan 11 23:12:12 2006 @@ -14,6 +14,8 @@ char *deflayout = "/sys/games/lib/mahjongg/layouts/default.layout"; ulong defchan; +int trace; + char *buttons[] = { @@ -32,7 +34,7 @@ void usage(char *progname) { - fprint(2, "usage: %s [-b background] [-l layout] [-t tileset] -c\n", progname); + fprint(2, "usage: %s [-b background] [-l layout] [-t tileset] [-c] [-f]\n", progname); exits("usage"); } @@ -74,6 +76,7 @@ Rectangle one = Rect(0, 0, 1, 1); selected = eallocimage(one, 1, RGBA32, setalpha(DPalebluegreen, 0x5f)); + litbrdr = eallocimage(one, 1, RGBA32, DGreen); img = eallocimage(Rect(0, 0, Sizex, Sizey), 0, defchan ? defchan : screen->chan, DBlack); background = eloadfile(defbackgr); @@ -104,6 +107,9 @@ ARGBEGIN{ case 'h': usage(argv0); + case 'f': + trace = 1; + break; case 'b': defbackgr = EARGF(usage(argv0)); break; @@ -148,8 +154,11 @@ clickety = 1; clicked(subpt(m.xy, addpt(screen->r.min, Pt(30, 30)))); } - } else + } else { clickety = 0; + if(trace) + light(subpt(m.xy, addpt(screen->r.min, Pt(30, 30)))); + } if(m.buttons&2) { /* nothing here for the moment */ } --- /sys/src/games/mahjongg/mahjongg.h Wed Jan 11 23:12:29 2006 +++ /sys/src/games/mahjongg/mahjongg.h Wed Jan 11 23:12:27 2006 @@ -55,6 +55,7 @@ typedef struct { Brick board[Depth][Lx][Ly]; Click c; /* player has a brick selected */ + Click l; /* mouse-over-brick indicator */ int done; int remaining; } Level; @@ -69,12 +70,14 @@ Image *mask; Image *background; Image *selected; +Image *litbrdr; Image *gameover; /* graphics.c */ void drawlevel(void); void resize(Point); void clicked(Point); +void light(Point); void hint(void); void done(void); void clearlevel(void); --- /sys/man/1/games Wed Jan 11 23:12:46 2006 +++ /sys/man/1/games Wed Jan 11 23:12:44 2006 @@ -22,6 +22,8 @@ [ .B -c ] [ +.B -f +] [ .B -b .I background ] [ @@ -107,8 +109,10 @@ .RB (-l) images; .RB -c -selects a true-color buffer image, use with -drawterm or in case selecting a tile obscures it completely. +selects a true-color buffer image, for use with +drawterm or in case selecting a tile obscures it completely; +.RB -f +causes mahjongg to indicate non-blocked tiles on mouse-over. The .LR N key will generate a new level,