10 * mark tiles that partially obscure the given tile.
11 * relies on Depth*Dxy <= Tilex/2
14 markabove(int d, int x, int y)
18 for(d++; d < Depth; d++)
19 for(dx = -1; dx <= 2; dx++)
20 for(dy = -1; dy <= 2; dy++)
21 if(x+dx < Lx && x+dx >= 0 &&
22 y+dy < Ly && y+dy >= 0)
23 level.board[d][x+dx][y+dy].redraw = 1;
27 markbelow(int d, int x, int y)
32 for(dx = -2; dx <= 1; dx++)
33 for(dy = -2; dy <= 1; dy++)
34 if(x+dx < Lx && x+dx >= 0 &&
35 y+dy < Ly && y+dy >= 0)
36 level.board[d][x+dx][y+dy].redraw = 1;
45 p = Pt(c.x*(Facex/2)-(c.d*TileDxy), c.y*(Facey/2)-(c.d*TileDxy));
46 r = Rpt(p, addpt(p, Pt(Facex, Facey)));
47 return rectaddpt(r, Pt(Depth*TileDxy, Depth*TileDxy));
55 level.hist[--level.remaining] = c;
57 level.board[c.d][c.x][c.y].which = None;
58 level.board[c.d][c.x+1][c.y].which = None;
59 level.board[c.d][c.x][c.y+1].which = None;
60 level.board[c.d][c.x+1][c.y+1].which = None;
63 draw(img, r, background, nil, r.min);
65 markabove(c.d, c.x, c.y);
66 markbelow(c.d, c.x, c.y);
75 draw(img, r, tileset, nil, level.board[c.d][c.x][c.y].start);
77 if(level.board[c.d][c.x][c.y].clicked)
78 draw(img, r, selected, nil, ZP);
81 border(img, r, 2, litbrdr, level.board[c.d][c.x][c.y].start);
83 /* looks better without borders, uncomment to check it out with'em */
84 // r = Rpt(r.min, addpt(r.min, Pt(Tilex, Tiley)));
85 // draw(img, r, brdr, nil, ZP);
94 for(d = 0; d < Depth; d++)
95 for(y = 0; y < Ly; y++)
96 for(x = 0; x < Lx; x++) {
97 b = &level.board[d][x][y];
98 if(b->which == TL && (all || b->redraw)) {
105 draw(screen, screen->r, img, nil, ZP);
106 flushimage(display, 1);
118 draw(img, img->r, background, nil, ZP);
127 fd = open("/dev/wctl", OWRITE);
129 fprint(fd, "resize -dx %d -dy %d", p.x, p.y);
137 int d = 0, x = 0, y = 0;
140 if(level.c.d != -1) {
141 if((b = bmatch(level.c)) != nil) {
147 for(d = Depth - 1; d >= 0; d--)
148 for(y = 0; y < Ly; y++)
149 for(x = 0; x < Lx; x++)
150 if(level.board[d][x][y].which == TL &&
152 (b = bmatch(Cl(d,x,y))) != nil)
158 a = &level.board[d][x][y];
192 draw(screen, screen->r, selected, gameover, ZP);
193 flushimage(display, 1);
197 findclick(Point coord)
201 for(c.d = Depth - 1; c.d >= 0; c.d--) {
202 c.x = (coord.x + TileDxy*c.d)/(Facex/2);
203 c.y = (coord.y + TileDxy*c.d)/(Facey/2);
204 switch(level.board[c.d][c.x][c.y].which) {
230 c = findclick(coord);
234 b = &level.board[c.d][c.x][c.y];
236 if(level.c.d == -1) {
240 } else if(eqcl(c, level.c)) {
245 bc = &level.board[level.c.d][level.c.x][level.c.y];
246 if(b->type == bc->type) {
270 if(level.remaining >= Tiles)
273 for(i=1; i<=2; i++) {
274 j = level.remaining++;
278 level.board[d][x][y].which = TL;
279 level.board[d][x+1][y].which = TR;
280 level.board[d][x+1][y+1].which = BR;
281 level.board[d][x][y+1].which = BL;
282 level.board[d][x][y].redraw = 1;
294 b = &level.board[level.c.d][level.c.x][level.c.y];
304 Click c = findclick(coord);
311 if (level.l.d != -1) {
312 level.board[level.l.d][level.l.x][level.l.y].redraw = 1;
318 level.board[c.d][c.x][c.y].redraw = 1;
329 for(c.d = Depth - 1; c.d >= 0; c.d--)
330 for(c.y = 0; c.y < Ly; c.y++)
331 for(c.x = 0; c.x < Lx; c.x++)
332 if(level.board[c.d][c.x][c.y].which == TL &&