
/// АВТОР Бренкман Андрей (Brenkman Andrey)
/// ПОСЛЕДНЕЕ ИЗМЕНЕНИЕ 5.09.2011
/// УРОВЕНЬ МОЕГО ДОВЕРИЯ 99%


#ifndef A_POSITION_H
#define A_POSITION_H

//!
#include "a_Header_constants.h"


/// Внутреннее 64-битное  представление шахматной доски
struct Position
{
	///-------------------------------------------------
	/// доска представлена следующим образом
	/// A8(56) B8(57) C8(58) D8(59) E8(60) F8(61) G8(62) H8(63)
	/// A7(48) B7(49) C7(50) D7(51) E7(52) F7(53) G7(54) H7(55)
	/// A6(40) B6(41) C6(42) D6(43) E6(44) F6(45) G6(46) H6(47)
	/// A5(32) B5(33) C5(34) D5(35) E5(36) F5(37) G5(38) H5(39)
	/// A4(24) B4(25) C4(26) D4(27) E4(28) F4(29) G4(30) H4(31)
	/// A3(16) B3(17) C3(18) D3(19) E3(20) F3(21) G3(22) H3(23)
	/// A2(8)  B2(9)  C2(10) D2(11) E2(12) F2(13) G2(14) H2(15)
	/// A1(0)  B1(1)  C1(2)  D1(3)  E1(4)  F1(5)  G1(6)  H1(7)


	///A1(LSB)- это нулевой бит H8(MSB)-это 63 бит
	/// т.е. битовая развертка выглядит следующим образом
	/// H8(63) G8(62) F8(61) . . . . . .C1(2) B1(1) A1(0)
	///-------------------------------------------------
	/// ДОСКА
	/// в этих 64 битных переменных
	/// пишется только факт наличия или отсутствия фигуры в каком то поле
	/// причем неизвестно  что это за фигура известен только цвет по принадлежности
	/// к той или иной переменной
	unsigned __int64  all_piece;// все фигуры
	unsigned __int64  all_white_piece;// все белые фигуры
	unsigned __int64  all_black_piece;// все черные фигуры

	///-------------------------------------------------
	/// СПИСКИ ФИГУР

	/// имя фигуры
	/// 0 - нет фигуры
	/// 1 - пешка 
	/// 2 - конь 
	/// 3 - слон
	/// 4 - ладья 
	/// 5 - ферзь 
	/// 6 - король
	
	/// битовые списки белых и черных фигур
	/// каждое 64-ное число это целая доска так что к примеру по адресу 5(ферзь) 
	/// может быть максимум 64 ферзя 
	unsigned __int64 white_piece[MAX_NAME];
	unsigned __int64 black_piece[MAX_NAME];

	/// имя фигуры(0-6) от координаты(0-63) 
	unsigned __int8 white_name_from_coord[MAX_COORDINATE];
	unsigned __int8 black_name_from_coord[MAX_COORDINATE];

	///-------------------------------------------------
	/// ВСПОМОГАТЕЛЬНАЯ ИНФОРМАЦИЯ

	/// цвет хода 0 - черные 1 - белые
	bool colour_move;

	/// разрешение взятия на проходе 1/0
	bool taking_passage_yes;

	/// х координата битого поля(конвертируем из буквы)
	/// так 'а' - 0 , 'h' - 7 таким образом по х отображение прямое
	unsigned __int8 taking_passage_x;

	/// у координата битого поля
	/// так '1' - 0 , '8' - 7 таким образом отображение тоже 
	/// прямое только сдвинуто на 1
	unsigned __int8 taking_passage_y;

	/// рокировка белых в длинную сторону   1/0
	bool castling_Q;

	/// рокировка белых в короткую сторону  1/0
	bool castling_K;

	/// рокировка черных в длинную сторону  1/0
	bool castling_q;

	/// рокировка черных в короткую сторону 1/0
	bool castling_k;

	/// 64 битный хеш-ключ позиции
	unsigned __int64 hash_key ;

	/// оценка позиции материал за белых	
	unsigned __int16 value_white_material ;

	/// оценка позиции материал за черных
	unsigned __int16 value_black_material ;

};

#endif // !defined A_POSITION_H






