mahjongg tweaks [jmk] --rw-rw-r-- M 368016 jmk sys 5373 Jan 12 10:39 sys/man/1/games /n/sourcesdump/2006/0112/plan9/sys/man/1/games:1,6 - /n/sourcesdump/2006/0113/plan9/sys/man/1/games:1,6 .TH GAMES 1 .SH NAME - mahjongg, sokoban, sudoku \- time wasters + 4s, 5s, juggle, mahjongg, sokoban, sudoku \- time wasters .SH SYNOPSIS .B games/4s .br /n/sourcesdump/2006/0112/plan9/sys/man/1/games:22,27 - /n/sourcesdump/2006/0113/plan9/sys/man/1/games:22,29 [ .B -c ] [ + .B -f + ] [ .B -b .I background ] [ /n/sourcesdump/2006/0112/plan9/sys/man/1/games:47,54 - /n/sourcesdump/2006/0113/plan9/sys/man/1/games:49,54 Move tiles left or right by moving the mouse. Rotate tiles with buttons 1 and 3. Drop tiles for more points with button 2 or the space bar. - Move the mouse out of or back into the play area to - suspend or resume the game. Keys .LR a and /n/sourcesdump/2006/0112/plan9/sys/man/1/games:107,114 - /n/sourcesdump/2006/0113/plan9/sys/man/1/games:107,116 .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, [jmk] --rw-rw-r-- M 368016 jmk sys 7054 Jan 12 10:39 sys/src/games/mahjongg/graphics.c /n/sourcesdump/2006/0112/plan9/sys/src/games/mahjongg/graphics.c:84,89 - /n/sourcesdump/2006/0113/plan9/sys/src/games/mahjongg/graphics.c:84,92 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); /n/sourcesdump/2006/0112/plan9/sys/src/games/mahjongg/graphics.c:248,253 - /n/sourcesdump/2006/0113/plan9/sys/src/games/mahjongg/graphics.c:251,320 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); + } } } [jmk] --rw-rw-r-- M 368016 jmk sys 2560 Jan 12 10:39 sys/src/games/mahjongg/level.c /n/sourcesdump/2006/0112/plan9/sys/src/games/mahjongg/level.c:145,150 - /n/sourcesdump/2006/0113/plan9/sys/src/games/mahjongg/level.c:145,152 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; } [jmk] --rw-rw-r-- M 368016 jmk sys 3631 Jan 12 10:39 sys/src/games/mahjongg/mahjongg.c /n/sourcesdump/2006/0112/plan9/sys/src/games/mahjongg/mahjongg.c:14,20 - /n/sourcesdump/2006/0113/plan9/sys/src/games/mahjongg/mahjongg.c:14,22 char *deflayout = "/sys/games/lib/mahjongg/layouts/default.layout"; ulong defchan; + int trace; + char *buttons[] = { "new", /n/sourcesdump/2006/0112/plan9/sys/src/games/mahjongg/mahjongg.c:32,38 - /n/sourcesdump/2006/0113/plan9/sys/src/games/mahjongg/mahjongg.c:34,40 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"); } /n/sourcesdump/2006/0112/plan9/sys/src/games/mahjongg/mahjongg.c:74,79 - /n/sourcesdump/2006/0113/plan9/sys/src/games/mahjongg/mahjongg.c:76,82 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); /n/sourcesdump/2006/0112/plan9/sys/src/games/mahjongg/mahjongg.c:104,109 - /n/sourcesdump/2006/0113/plan9/sys/src/games/mahjongg/mahjongg.c:107,115 ARGBEGIN{ case 'h': usage(argv0); + case 'f': + trace = 1; + break; case 'b': defbackgr = EARGF(usage(argv0)); break; /n/sourcesdump/2006/0112/plan9/sys/src/games/mahjongg/mahjongg.c:148,155 - /n/sourcesdump/2006/0113/plan9/sys/src/games/mahjongg/mahjongg.c:154,164 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 */ } [jmk] --rw-rw-r-- M 368016 jmk sys 1687 Jan 12 10:39 sys/src/games/mahjongg/mahjongg.h /n/sourcesdump/2006/0112/plan9/sys/src/games/mahjongg/mahjongg.h:55,60 - /n/sourcesdump/2006/0113/plan9/sys/src/games/mahjongg/mahjongg.h:55,61 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; /n/sourcesdump/2006/0112/plan9/sys/src/games/mahjongg/mahjongg.h:69,74 - /n/sourcesdump/2006/0113/plan9/sys/src/games/mahjongg/mahjongg.h:70,76 Image *mask; Image *background; Image *selected; + Image *litbrdr; Image *gameover; /* graphics.c */ /n/sourcesdump/2006/0112/plan9/sys/src/games/mahjongg/mahjongg.h:75,80 - /n/sourcesdump/2006/0113/plan9/sys/src/games/mahjongg/mahjongg.h:77,83 void drawlevel(void); void resize(Point); void clicked(Point); + void light(Point); void hint(void); void done(void); void clearlevel(void);