#include "all.h"

void init_board()
{
int i, x, y, z;
int x1, y1;

for (x = 0; x < 8; x++)
	for (y = 0; y < 8; y++)
		for (z = 0; z < 4; z++)
			board[x][y][z] = 0;

for (i = 0; i < 4; i++)
	board[rand()%8][rand()%8][LAY_HIDDEN] = 1;

foxN = 0;
for (x = 0; x < 8; x++)
	for (y = 0; y < 8; y++)
		if (board[x][y][LAY_HIDDEN] == 1)
			foxN++;

if (foxN < 4) // if some foxes are in one hole
	{
	init_board();
	return;
	}

// count of visible foxes	
for (x = 0; x < 8; x++)
	for (y = 0; y < 8; y++)
		{

		for (x1 = 0; x1 < 8; x1++) // horizontal
			if (board[x1][y][LAY_HIDDEN] == 1)
				board[x][y][LAY_NUM]++;

				
		for (y1 = 0; y1 < 8; y1++) // vertical
			if (board[x][y1][LAY_HIDDEN] == 1)
				board[x][y][LAY_NUM]++;


		if (x-y>0) // north-west to south-east
			x1 = x-y;
		else
			x1 = 0;

		if (y-x>0)
			y1 = y-x;
		else
			y1 = 0;
			
		do
			{
			if (board[x1][y1][LAY_HIDDEN] == 1)
				board[x][y][LAY_NUM]++;
			x1++;
			y1++;
			} while ((x1<8)&&(y1<8));

			
		if (x+y-7>0) // south-west to north-east
			x1 = x+y-7;
		else
			x1 = 0;

		if (x+y<8)
			y1 = x+y;
		else
			y1 = 7;
			
		do
			{
			if (board[x1][y1][LAY_HIDDEN] == 1)
				board[x][y][LAY_NUM]++;
			x1++;
			y1--;
			} while ((x1<8)&&(y1>-1));
			
			
		if (board[x][y][LAY_HIDDEN] == 1)
			board[x][y][LAY_NUM] -= 3;
			
		}

foxLeft = foxN;
moves = 0;
result = 0;
		
}

void init_grid_sizes()
{
size = 20;
x_start = 5;
y_start = 30;
window_width = 2*x_start + 8*size + 9;
window_height = y_start + x_start + 8*size + kol_skin_height() + 9 + 14;
}

void wnd_draw()
{

int i;
int x, y;
int x1, y1;
char tmp[64];
char tmp2[64];

kol_paint_start();

kol_wnd_define(100, 100, window_width, window_height, 0x34ddddff, 0x34ddddff, "FoxHunt v0.2 by Albom");

kol_btn_define(x_start, x_start, 40, 16, 2, 0xccccee);
kol_paint_string(x_start+20-12, x_start+5, "New", 0x902222ff);

strcpy(tmp, "F:");
itoa(foxLeft, tmp2);
strcat(tmp, tmp2);
strcat(tmp, "/4");
kol_paint_string(x_start+55, x_start+5, tmp, 0x902222ff);

strcpy(tmp, "M:");
itoa(moves, tmp2);
strcat(tmp, tmp2);
kol_paint_string(x_start+110, x_start+5, tmp, 0x902222ff);

for (i = 0; i <= 8; i++)
	{
	kol_paint_line(x_start+i*size, y_start, x_start+i*size, y_start+8*size, 0x33); // vertical
	kol_paint_line(x_start, y_start+i*size, x_start+8*size, y_start+i*size, 0x33); // horizontal
	}

// foxes found by user	
for (x1 = 0; x1 < 8; x1++)
	for (y1 = 0; y1 < 8; y1++)
		{
		if (board[x1][y1][LAY_FOUND]==1)
			{
			grid_to_pos(x1, y1, &x, &y);
			kol_paint_string(x+size/2-4, y+size/2-4, "F", 0x90227722);
			}
		}	

// opened cells
for (x1 = 0; x1 < 8; x1++)
	for (y1 = 0; y1 < 8; y1++)
	{
	if (board[x1][y1][LAY_OPENED] == 1)
		{
		itoa(board[x1][y1][LAY_NUM], tmp);
		grid_to_pos(x1, y1, &x, &y);
		kol_paint_string(x+size/2-4, y+size/2-4, tmp, 0x902222ff);
		}
	}		
		
if (result > 0)
	{
	char victory[]={"V I C T O R Y !"};
	kol_paint_string(window_width/2-7*8+4, window_height-14-kol_skin_height()-4, victory, 0x90227722);
	kol_paint_string(window_width/2-7*8+4-1, window_height-14-kol_skin_height()-4, victory, 0x90227722);
	kol_paint_string(window_width/2-7*8+4+1, window_height-14-kol_skin_height()-4, victory, 0x90227722);
	}

if (result < 0)
	{

	// draw real position of foxes
	for (x1 = 0; x1 < 8; x1++)
		for (y1 = 0; y1 < 8; y1++)
			{
			if (board[x1][y1][LAY_HIDDEN]==1)
				{
				grid_to_pos(x1, y1, &x, &y);
				kol_paint_string(x+size/2-2, y+size/2-2, "F", 0x90ff2222);
				}
			}		
			
	char game_over[]={"G A M E   O V E R !"};
	kol_paint_string(window_width/2-9*8+4, window_height-14-kol_skin_height()-4, game_over, 0x90ff2222);
	kol_paint_string(window_width/2-9*8+4-1, window_height-14-kol_skin_height()-4, game_over, 0x90ff2222);
	kol_paint_string(window_width/2-9*8+4+1, window_height-14-kol_skin_height()-4, game_over, 0x90ff2222);
	}	
		
kol_paint_end();



}


int check()
{
int x, y;
for (x = 0; x < 8; x++)
	for (y = 0; y < 8; y++)
		if (board[x][y][LAY_HIDDEN] != board[x][y][LAY_FOUND])
			return -1;
return 1;
}


void grid_to_pos(unsigned gx, unsigned gy, unsigned* x, unsigned* y)
{
*x = gx*size + x_start;
*y = gy*size + y_start;
}


int pos_to_grid(unsigned x, unsigned y, int* gx, int* gy)
{

*gx = (x - x_start)/size;
*gy = (y - y_start)/size;

if ((*gx < 0) || (*gx>7) || (*gy < 0) || (*gy>7) )
	return -1;
else
	return 1;
}


/// ===========================================================

void kol_main()
{

unsigned event;
unsigned key;
unsigned btn;
unsigned pos, x, y;
int gx, gy;


srand(kol_system_time_get());

kol_event_mask( 0xC0000027 ); // enable using of mouse 
init_grid_sizes();
init_board();
wnd_draw();


for(;;)
	{
	event = kol_event_wait();

	switch (event)
		{
		case 1:
			wnd_draw();
			break;

		case 2:
			key = (kol_key_get() & 0xff00)>>8;
			break;
			
		case 3:
			switch ((kol_btn_get() & 0xff00)>>8)
				{
				case 1: // close button
					kol_exit();
				case 2: // 'new' button 
					init_board();
					wnd_draw();
					break;
				}
			break;
			
		case 6:
			btn = kol_mouse_btn(); // read mouse button
			pos = kol_mouse_posw(); // read mouse position
			x = pos / 65536;
			y = pos % 65536;
			if (x > window_width)
				x=0;
			if (y > window_height)
				y=0;

			if ( pos_to_grid(x, y, &gx, &gy) > 0 )
				{
				switch (btn & 3)
					{
					case 1: // left button
						if (result == 0) // are we in game?
							{
							if (board[gx][gy][LAY_FOUND] == 0)
								{
								if ( board[gx][gy][LAY_OPENED] == 0 )
									board[gx][gy][LAY_OPENED] = 1;
								else
									board[gx][gy][LAY_OPENED] = 0;
								moves++;
								wnd_draw();
								}
							}
						break;
					case 2: // right button
						if (result == 0) // are we in game?
							{
							if (board[gx][gy][LAY_FOUND] == 0)
								{
								if ( board[gx][gy][LAY_OPENED] == 0 )
									{
									board[gx][gy][LAY_FOUND] = 1;
									foxLeft--;
									moves++;
									}
								}
							else
								{
								board[gx][gy][LAY_FOUND] = 0;
								foxLeft++;
								moves++;
								}
								
							if (foxLeft == 0) // all 4 foxes are marked
								result = check();
								
							wnd_draw();
							}
						break;
					}
				}
				break;
		}

	
	}

kol_exit();
}

/// ===========================================================