int eval( int alpha, int beta) { int opening, endgame; int phase; int eval; material_info_t mat_info[1]; opening = 0; endgame = 0; // material material_get_info(mat_info); opening += mat_info->opening; endgame += mat_info->endgame; // PST opening += Opening; endgame += Endgame; phase = mat_info->phase; eval = ((opening * (256 - phase)) + (endgame * phase)) / 256; if (COLOUR_IS_BLACK(Turn)) eval = -eval; return eval; }
bool recog_draw( const board_t *board, int ThreadId ) { material_info_t mat_info[1]; ASSERT(board != NULL); if( board->number[RedRook] + board->number[RedKnight] + board->number[RedCannon] > 1 ) return false; if(board->number[BlackRook] + board->number[BlackKnight] + board->number[BlackCannon] > 1) return false; if(board->number[RedPawn] > 2 || board->number[BlackPawn] > 2) return false; // material material_get_info(mat_info, board, ThreadId); if(mat_info->recog == MAT_KK) return true; else if(mat_info->recog == MAT_KABKAB) return true; else if(mat_info->recog == MAT_KPKAB || mat_info->recog == MAT_KABKP) return true; else if(mat_info->recog == MAT_KABKR || mat_info->recog == MAT_KRKAB) return true; else if(mat_info->recog == MAT_KNKN) return true; else if(mat_info->recog == MAT_KCKC) return true; else if(mat_info->recog == MAT_KPKP) return true; else if(mat_info->recog == MAT_KRKR) { return draw_krkr(board); } return false; }
bool recog_draw(const board_t * board, int ThreadId) { material_info_t mat_info[1]; ASSERT(board!=NULL); // material if (board->piece_nb > 4) return false; material_get_info(mat_info,board,ThreadId); if ((mat_info->flags & DrawNodeFlag) == 0) return false; // recognisers if (false) { } else if (mat_info->recog == MAT_KK) { // KK return true; } else if (mat_info->recog == MAT_KBK) { // KBK (white) return true; } else if (mat_info->recog == MAT_KKB) { // KBK (black) return true; } else if (mat_info->recog == MAT_KNK) { // KNK (white) return true; } else if (mat_info->recog == MAT_KKN) { // KNK (black) return true; } else if (mat_info->recog == MAT_KPK) { // KPK (white) int me, opp; int wp, wk, bk; me = White; opp = COLOUR_OPP(me); wp = board->pawn[me][0]; wk = KING_POS(board,me); bk = KING_POS(board,opp); if (SQUARE_FILE(wp) >= FileE) { wp = SQUARE_FILE_MIRROR(wp); wk = SQUARE_FILE_MIRROR(wk); bk = SQUARE_FILE_MIRROR(bk); } if (kpk_draw(wp,wk,bk,board->turn)) { return true; } } else if (mat_info->recog == MAT_KKP) { // KPK (black) int me, opp; int wp, wk, bk; me = Black; opp = COLOUR_OPP(me); wp = SQUARE_RANK_MIRROR(board->pawn[me][0]); wk = SQUARE_RANK_MIRROR(KING_POS(board,me)); bk = SQUARE_RANK_MIRROR(KING_POS(board,opp)); if (SQUARE_FILE(wp) >= FileE) { wp = SQUARE_FILE_MIRROR(wp); wk = SQUARE_FILE_MIRROR(wk); bk = SQUARE_FILE_MIRROR(bk); } if (kpk_draw(wp,wk,bk,COLOUR_OPP(board->turn))) { return true; } } else if (mat_info->recog == MAT_KBKB) { // KBKB int wb, bb; wb = board->piece[White][1]; bb = board->piece[Black][1]; if (SQUARE_COLOUR(wb) == SQUARE_COLOUR(bb)) { // bishops on same colour return true; } } else if (mat_info->recog == MAT_KBPK) { // KBPK (white) int me, opp; int wp, wb, bk; me = White; opp = COLOUR_OPP(me); wp = board->pawn[me][0]; wb = board->piece[me][1]; bk = KING_POS(board,opp); if (SQUARE_FILE(wp) >= FileE) { wp = SQUARE_FILE_MIRROR(wp); wb = SQUARE_FILE_MIRROR(wb); bk = SQUARE_FILE_MIRROR(bk); } if (kbpk_draw(wp,wb,bk)) return true; } else if (mat_info->recog == MAT_KKBP) { // KBPK (black) int me, opp; int wp, wb, bk; me = Black; opp = COLOUR_OPP(me); wp = SQUARE_RANK_MIRROR(board->pawn[me][0]); wb = SQUARE_RANK_MIRROR(board->piece[me][1]); bk = SQUARE_RANK_MIRROR(KING_POS(board,opp)); if (SQUARE_FILE(wp) >= FileE) { wp = SQUARE_FILE_MIRROR(wp); wb = SQUARE_FILE_MIRROR(wb); bk = SQUARE_FILE_MIRROR(bk); } if (kbpk_draw(wp,wb,bk)) return true; } else { ASSERT(false); } return false; }