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


///!
#include "a_Header_constants.h"
#include "a_List.h"


/// линия главного варианта

struct PV_line
{
	/// описание хода смотреть в классе List
	__int32 move[MAX_DEPTH]; 

	/// оценка варианта
	__int32 score_move;

	/// длина варианта
	unsigned __int8  depth_max;

};

class m_PV_save
{

/// поля класса
//////////////////////////////////////////////////////////////////////////////////////
private:

	struct PV_line pv_current;/// текущий вариант общий для всего поиска(заполняем при погружении на глубину)
	struct PV_line pv_best;/// лучший вариант общий для всего поиска(заполняем при всплытии)

	__int32 save_value; /// запоминаем оценку последнего выведенного варианта
	unsigned __int8 save_Depth_Max; /// запоминаем глубину последнего выведенного варианта


//////////////////////////////////////////////////////////////////////////////////////
public:

	///---------------------------------------------------------------------------
	/// возвращаем лучший вариант
	struct PV_line & get_pv_best();

	///---------------------------------------------------------------------------
	/// возвращаем текущий вариант
	struct PV_line & get_pv_current();

	///---------------------------------------------------------------------------
	/// обновляем линию лучшего варианта в узле
	void update_PV_best_point
	(
		struct PV_line & PV_best_point/// лучший вариант найденный в узле
	);

	///---------------------------------------------------------------------------
	/// обновляем линию лучшего варианта
	void update_PV_best
	(
		const struct PV_line & PV_best_point/// лучший вариант найденный в узле
	);

	///---------------------------------------------------------------------------
	/// обновляем линию лучшего варианта на максимальной глубине
	void update_PV_best_max_depth
	(
		const __int32 & score,/// оценка позиции в конце варианта
		const unsigned __int8 & depth/// текущая глубина
	);

	///---------------------------------------------------------------------------
	/// записываем ход в текущий вариант
	void update_PV_current
	(
		const unsigned __int8 & i,/// номер хода в списке ходов
		const unsigned __int8 & depth,/// текущая глубина
		const struct List & list_surplus_moves///список возможных ходов
	);

	///---------------------------------------------------------------------------
	/// выводим ход который обдумываем
	void print_currmove
	(
		const struct List & list_surplus_moves,///список возможных ходов
		const unsigned __int8 nodes_0,/// количество ходов на нулевой глубине
		const unsigned __int8 i,/// номер хода по списку
		const unsigned __int8 Depth_Max/// максимальная глубина
	);

	///---------------------------------------------------------------------------
	/// выводим текущий вариант в оболочку
	void print_pv_line
	(
		const bool colour_move,/// цвет печатающей стороны
		const struct List & list_surplus_moves,///список возможных ходов
		const struct PV_line & PV_best_point,/// лучший вариант
		const __int64 print_nodes,/// количество узлов
		const unsigned __int8 i,/// номер хода в списке
		const unsigned __int8 Depth_Max,/// максимальная глубина
		const __int32 value,/// оценка позиции
		const bool all_line/// вывод всех линий
		//,const double time_nodes// время расчета варианта
	);


//////////////////////////////////////////////////////////////////////////////////////
public:

	///-----------------------------------------------------------------
	/// функция встречалось в коде Анд чесс от 9.01.06 
	/// сохраню как историческую ценность :)) 
	/// конвертируем число фигуры в букву
	/// 0-нет фигуры, 1-пешка, 2-конь, 3-слон, 4-ладья, 5-ферзь, 6-король	
	__int8 int_to_char_board
	(
		const int i,/// код фигуры
		const int z/// цвет фигуры
	);

	///---------------------------------------------------------------------------
	///	по координате х доски выдаем букву нотации например 0 - 'а', 1 - 'b', ..., 7 - 'h'	
	__int8 x_to_notation
	(
		const int x/// горизонтальная координата доски (0-7)
	);

};
