1*8fd921c8SDavid du Colombier #include <u.h>
2*8fd921c8SDavid du Colombier #include <libc.h>
3*8fd921c8SDavid du Colombier #include <draw.h>
4*8fd921c8SDavid du Colombier #include <event.h>
5*8fd921c8SDavid du Colombier
6*8fd921c8SDavid du Colombier #include "mahjongg.h"
7*8fd921c8SDavid du Colombier
8*8fd921c8SDavid du Colombier Click NC = { -1, 0, 0, };
9*8fd921c8SDavid du Colombier
10*8fd921c8SDavid du Colombier Click
Cl(int d,int x,int y)11*8fd921c8SDavid du Colombier Cl(int d, int x, int y)
12*8fd921c8SDavid du Colombier {
13*8fd921c8SDavid du Colombier return (Click){d, x, y};
14*8fd921c8SDavid du Colombier }
15*8fd921c8SDavid du Colombier
16*8fd921c8SDavid du Colombier int
eqcl(Click c1,Click c2)17*8fd921c8SDavid du Colombier eqcl(Click c1, Click c2)
18*8fd921c8SDavid du Colombier {
19*8fd921c8SDavid du Colombier return c1.d == c2.d && c1.x == c2.x && c1.y == c2.y;
20*8fd921c8SDavid du Colombier }
21*8fd921c8SDavid du Colombier
22*8fd921c8SDavid du Colombier int
freeup(Click c)23*8fd921c8SDavid du Colombier freeup(Click c)
24*8fd921c8SDavid du Colombier {
25*8fd921c8SDavid du Colombier if(c.d == Depth -1 || (level.board[c.d+1][c.x][c.y].which == None &&
26*8fd921c8SDavid du Colombier level.board[c.d+1][c.x+1][c.y].which == None &&
27*8fd921c8SDavid du Colombier level.board[c.d+1][c.x][c.y+1].which == None &&
28*8fd921c8SDavid du Colombier level.board[c.d+1][c.x+1][c.y+1].which == None))
29*8fd921c8SDavid du Colombier return 1;
30*8fd921c8SDavid du Colombier return 0;
31*8fd921c8SDavid du Colombier }
32*8fd921c8SDavid du Colombier
33*8fd921c8SDavid du Colombier int
freeleft(Click c)34*8fd921c8SDavid du Colombier freeleft(Click c)
35*8fd921c8SDavid du Colombier {
36*8fd921c8SDavid du Colombier if(c.x == 0 || (level.board[c.d][c.x-1][c.y].which == None &&
37*8fd921c8SDavid du Colombier level.board[c.d][c.x-1][c.y+1].which == None))
38*8fd921c8SDavid du Colombier return 1;
39*8fd921c8SDavid du Colombier return 0;
40*8fd921c8SDavid du Colombier }
41*8fd921c8SDavid du Colombier
42*8fd921c8SDavid du Colombier int
freeright(Click c)43*8fd921c8SDavid du Colombier freeright(Click c)
44*8fd921c8SDavid du Colombier {
45*8fd921c8SDavid du Colombier if(c.x == Lx-2 || (level.board[c.d][c.x+2][c.y].which == None &&
46*8fd921c8SDavid du Colombier level.board[c.d][c.x+2][c.y+1].which == None))
47*8fd921c8SDavid du Colombier return 1;
48*8fd921c8SDavid du Colombier return 0;
49*8fd921c8SDavid du Colombier }
50*8fd921c8SDavid du Colombier
51*8fd921c8SDavid du Colombier int
isfree(Click c)52*8fd921c8SDavid du Colombier isfree(Click c)
53*8fd921c8SDavid du Colombier {
54*8fd921c8SDavid du Colombier return (freeleft(c) || freeright(c)) && freeup(c);
55*8fd921c8SDavid du Colombier }
56*8fd921c8SDavid du Colombier
57*8fd921c8SDavid du Colombier Click
cmatch(Click c,int dtop)58*8fd921c8SDavid du Colombier cmatch(Click c, int dtop)
59*8fd921c8SDavid du Colombier {
60*8fd921c8SDavid du Colombier Click lc;
61*8fd921c8SDavid du Colombier
62*8fd921c8SDavid du Colombier lc.d = dtop;
63*8fd921c8SDavid du Colombier do {
64*8fd921c8SDavid du Colombier for(lc.y = 0; lc.y < Ly; lc.y++)
65*8fd921c8SDavid du Colombier for(lc.x = 0; lc.x < Lx; lc.x++)
66*8fd921c8SDavid du Colombier if(level.board[lc.d][lc.x][lc.y].which == TL &&
67*8fd921c8SDavid du Colombier isfree(lc) && !eqcl(c, lc) &&
68*8fd921c8SDavid du Colombier level.board[c.d][c.x][c.y].type ==
69*8fd921c8SDavid du Colombier level.board[lc.d][lc.x][lc.y].type)
70*8fd921c8SDavid du Colombier return lc;
71*8fd921c8SDavid du Colombier } while(--lc.d >= 0);
72*8fd921c8SDavid du Colombier return NC;
73*8fd921c8SDavid du Colombier }
74*8fd921c8SDavid du Colombier
75*8fd921c8SDavid du Colombier Brick *
bmatch(Click c)76*8fd921c8SDavid du Colombier bmatch(Click c)
77*8fd921c8SDavid du Colombier {
78*8fd921c8SDavid du Colombier Click lc;
79*8fd921c8SDavid du Colombier
80*8fd921c8SDavid du Colombier lc = cmatch(c, Depth);
81*8fd921c8SDavid du Colombier if(lc.d == -1)
82*8fd921c8SDavid du Colombier return nil;
83*8fd921c8SDavid du Colombier else
84*8fd921c8SDavid du Colombier return &level.board[lc.d][lc.x][lc.y];
85*8fd921c8SDavid du Colombier }
86*8fd921c8SDavid du Colombier
87*8fd921c8SDavid du Colombier int
canmove(void)88*8fd921c8SDavid du Colombier canmove(void)
89*8fd921c8SDavid du Colombier {
90*8fd921c8SDavid du Colombier Click c;
91*8fd921c8SDavid du Colombier
92*8fd921c8SDavid du Colombier for(c.d = Depth - 1; c.d >= 0; c.d--)
93*8fd921c8SDavid du Colombier for(c.y = 0; c.y < Ly; c.y++)
94*8fd921c8SDavid du Colombier for(c.x = 0; c.x < Lx; c.x++)
95*8fd921c8SDavid du Colombier if(level.board[c.d][c.x][c.y].which == TL &&
96*8fd921c8SDavid du Colombier isfree(c) && bmatch(c) != nil)
97*8fd921c8SDavid du Colombier return 1;
98*8fd921c8SDavid du Colombier return 0;
99*8fd921c8SDavid du Colombier }
100