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

#ifndef A_LIST_H
#define A_LIST_H

//!
#include "a_Header_constants.h"


/// Список избыточных ходов. Т.е. здесь могут быть взятия короля и ходы под шах.
struct List
{
	/// в целом числе массива move мы упаковали следующую информацию (используем 27 бит)
	/// --3 бит--      --6 бит--   --6 бит--     --6 бит--  --6 бит-- 
	/// ходящая фигура  куда ходим  откуда ходим  тип хода   взятая фигура

	///-----------------------------------------------
	/// идем справа т.е. с младшего бита
	/// --6 бит-- 
	/// взятая фигура

	/// 0 - нет фигуры
	/// 1 - пешка 
	/// 2 - конь 
	/// 3 - слон
	/// 4 - ладья 
	/// 5 - ферзь 
	/// 6 - король

	/// запись move = тип фигуры
	/// чтение move & 63 ( 63 это ...000111111)

	///-------------------------------------------------
	/// --6 бит--
	/// тип хода

	/// 0 - нет хода
	/// 1 – простой ход
	/// 2 – взятие
	/// 3 – длинная рокировка
	/// 4 – короткая рокировка
	/// 5 – взятие на проходе

	/// 12 - превращение в конь 
	/// 13 - превращение в слон
	/// 14 - превращение в ладья 
	/// 15 - превращение в ферзь 

	/// 22 - взятие с превращением в конь 
	/// 23 - взятие с превращением в слон
	/// 24 - взятие с превращением в ладья 
	/// 25 - взятие с превращением в ферзь 
 
	/// запись move = move | (тип хода << 6)
	/// чтение (move>>6) & 63

	///-------------------------------------------------
	/// --6 бит--
	/// откуда ходим (0 -63)
	/// запись move = move | (откуда ходим << 12)
	/// чтение (move>>12) & 63

	///-------------------------------------------------
	/// --6 бит--
	/// куда ходим (0 -63)
	/// запись move = move | (куда ходим << 18)
	/// чтение (move>>18) & 63

	///-------------------------------------------------
	/// --3 бит-- 
	/// ходящая фигура
	/// 0 - нет фигуры
	/// 1 - пешка 
	/// 2 - конь 
	/// 3 - слон
	/// 4 - ладья 
	/// 5 - ферзь 
	/// 6 - король
	/// запись move = move | (куда ходим << 24)
	/// чтение (move>>24) & 7 ( 7 это ...000111)

	__int32 move[MAX_MOVE];

	/// оценка используемая для сортировки ходов
	__int32 sorting_score[MAX_MOVE];

	/// конец взятий в списке точнее первое не взятие т.е количество взятий 
	/// (помним что массив у нас начинается с нуля)
	unsigned __int8 end_captures;

	/// конец списка точнее первая пустая позиция т.е. количество ходов
	unsigned __int8 end_list;

};

#endif // !defined A_LIST_H






