1 
2 #ifndef __global_h
3 #	include "global.H"
4 #endif
5 #ifndef __board_h
6 #	include "board.H"
7 #endif
8 #ifndef __tile_h
9 #	include "tile.H"
10 #endif
11 
12 #include <stdlib.h>
13 
Board(int width,int height)14 Board::Board( int width, int height )
15 {
16 	dx = width;
17 	dy = height;
18 	ntiles = dx * dy;
19 	if (ntiles%2)	dx++;		// make even dimension
20 	ntiles = dx * dy;
21 	ntiles /= 2;
22 
23 	Tile::init_used_syms(ntiles);
24 	f = new Field[2*ntiles];
25 }
26 
~Board()27 Board::~Board() {
28 	delete f;
29 }
30 
check_swap(int op,int np)31 int Board::check_swap( int op, int np ) {
32 int x1,y1,x2,y2;
33 int j;
34 int help;
35 int dist;
36 #ifndef ABS
37 #	define ABS(x)	(((x)>0)?(x):-(x))
38 #endif
39 
40 	help=f[op].tile_id;
41 	x1=np%dx;
42 	y1=np/dx;
43 	for (j=0;j<2*ntiles;j++)
44 		if (help==f[j].tile_id&&j!=op)		break;
45 	x2=j%dx;
46 	y2=j/dx;
47 	dist=ABS(x1-x2)+ABS(y1-y2);
48 	if (dist<3)		return 0;
49 
50 	help=f[np].tile_id;
51 	x1=op%dx;
52 	y1=op/dx;
53 	for (j=0;j<2*ntiles;j++)
54 		if (help==f[j].tile_id&&j!=np)		break;
55 	x2=j%dx;
56 	y2=j/dx;
57 	dist=ABS(x1-x2)+ABS(y1-y2);
58 	if (dist<3)		return 0;
59 
60 	return 1;
61 }
62 
reset()63 void Board::reset() {
64 int		i,j;
65 Field	help;
66 
67 	for (i=0;i<2*ntiles;i++)		 f[i].reset(i/2);
68 	for (i=0;i<2*ntiles;i++) {
69 		do {
70 			j = rand()%(2*ntiles);
71 		} while (!check_swap(i,j));
72 		help = f[i];
73 		f[i] = f[j];
74 		f[j] = help;
75 	}
76 	tiles_left=ntiles;
77 	finished=0;
78 }
79 
color_removed(int id)80 void Board::color_removed( int id ) {
81 int i;
82 int back=0;
83 
84 	for (i=0;i<2*ntiles;i++) {
85 		if (f[i].lock_col>=id) {
86 			if (f[i].lock_col==id) {
87 				f[i].locked=0;
88 				f[i].found =0;
89 				f[i].flash =0;
90 				if (f[i].gone) {
91 					f[i].gone=0;
92 					back++;
93 				}
94 			}
95 			f[i].lock_col--;
96 		}
97 	}
98 	tiles_left+=(back/2);
99 	if (tiles_left)	finished=0;
100 }
101 
tile_removed(int)102 int Board::tile_removed(int /* color_id */) {
103 	if (--tiles_left)		return 0;
104 	else {
105 		finished = current_time;
106 		return 1;
107 	}
108 }
109 
field(int x,int y)110 Field *Board::field( int x, int y )
111 {
112 	if ((x<0)||(x>=dx)||(y<0)||(y>=dy))		return(0);
113 	return( &f[x+y*dx] );
114 }
115 
field(int fid)116 Field *Board::field( int fid )
117 {
118 	return( field( fid%dx, fid/dx ) );
119 }
120 
121