void UpdateListsMaterial(S_BOARD *pos) { int piece,sq,index,colour; for(index = 0; index < BRD_SQ_NUM; ++index) { sq = index; piece = pos->pieces[index]; ASSERT(PceValidEmptyOffbrd(piece)); if(piece!=OFFBOARD && piece!= EMPTY) { colour = PieceCol[piece]; ASSERT(SideValid(colour)); if( PieceBig[piece] == TRUE) pos->bigPce[colour]++; if( PieceMin[piece] == TRUE) pos->minPce[colour]++; if( PieceMaj[piece] == TRUE) pos->majPce[colour]++; pos->material[colour] += PieceVal[piece]; ASSERT(pos->pceNum[piece] < 10 && pos->pceNum[piece] >= 0); pos->pList[piece][pos->pceNum[piece]] = sq; pos->pceNum[piece]++; if(piece==wK) pos->KingSq[WHITE] = sq; if(piece==bK) pos->KingSq[BLACK] = sq; if(piece==wP) { SETBIT(pos->pawns[WHITE],SQ64(sq)); SETBIT(pos->pawns[BOTH],SQ64(sq)); } else if(piece==bP) { SETBIT(pos->pawns[BLACK],SQ64(sq)); SETBIT(pos->pawns[BOTH],SQ64(sq)); } } } }
int SqAttacked(const int sq, const int side, const S_BOARD *pos) { int piece; int tmpSQ; int dir; int i; ASSERT(SqOnBoard(sq)); ASSERT(SideValid(side)); ASSERT(checkBoard(pos)); //pawn attacks if(side == WHITE) { if(pos->pieces[sq-11] == wP || pos->pieces[sq-9] == wP) return TRUE; } else { //BLACK if(pos->pieces[sq+11] == bP || pos->pieces[sq+9] == bP) return TRUE; } //knight attacks for(i = 0; i < 8; i++) { piece = pos->pieces[ sq + KnDir[i] ]; if(piece != OFFBOARD && IsKn(piece) && PieceColor[piece]==side) return TRUE; } //king attacks for(i = 0; i < 8; i++) { piece = pos->pieces[ sq + KiDir[i] ]; if(piece != OFFBOARD && IsKi(piece) && PieceColor[piece]==side) { return TRUE; } } //rook and Queen attacks for(i = 0; i < 4; i++) { dir = RkDir[i]; tmpSQ = sq + dir; piece = pos->pieces[tmpSQ]; while(piece != OFFBOARD) { if(piece != EMPTY) { if(piece != OFFBOARD && IsRQ(piece) && PieceColor[piece] == side) return TRUE; break; } tmpSQ += dir; piece = pos->pieces[tmpSQ]; } } //bishop and queen attacks for(i = 0; i < 4; i++) { dir = BiDir[i]; tmpSQ = sq + dir; piece = pos->pieces[tmpSQ]; while(piece != OFFBOARD) { if(piece != EMPTY) { if(piece != OFFBOARD && IsBQ(piece) && PieceColor[piece] == side) return TRUE; break; } tmpSQ += dir; piece = pos->pieces[tmpSQ]; } } return FALSE; }