// Connect-n
if (pos.connect_n() > 0)
{
+ //Calculate eligible pieces for connection once.
+ //Still consider all opponent pieces as blocking.
+ Bitboard connectPiecesUs = 0;
+ for (PieceSet ps = pos.connect_piece_types(); ps;){
+ PieceType pt = pop_lsb(ps);
+ connectPiecesUs |= pos.pieces(pt);
+ };
+ connectPiecesUs &= pos.pieces(Us);
+
for (const Direction& d : pos.getConnectDirections())
{
Square s = pop_lsb(b);
int c = 0;
for (int j = 0; j < pos.connect_n(); j++)
- if (pos.pieces(Us) & (s - j * d))
+ if (connectPiecesUs & (s - j * d))
c++;
score += make_score(200, 200) * c / (pos.connect_n() - c) / (pos.connect_n() - c);
}
}
// Check for bikjang rule (Janggi), double passing, or board running full
- if ( (st->pliesFromNull > 0 && ((st->bikjang && st->previous->bikjang) || (st->pass && st->previous->pass)))
+ if ( (st->pliesFromNull > 0 && ((st->bikjang && st->previous->bikjang) || ((st->pass && st->previous->pass)&&!var->wallOrMove)))
|| (var->adjudicateFullBoard && !(~pieces() & board_bb())))
{
result = var->materialCounting ? convert_mate_value(material_counting_result(), ply) : VALUE_DRAW;
inline PieceSet Position::connect_piece_types() const {
assert(var != nullptr);
- return var->connectPieceTypes;
+ return var->connectPieceTypesTrimmed;
}
inline bool Position::connect_horizontal() const {
connect_directions.push_back(SOUTH_EAST);
}
- // If not a connect variant, set connectPieceTypes to no pieces.
+ // If not a connect variant, set connectPieceTypesTrimmed to no pieces.
+ // connectPieceTypesTrimmed is separated so that connectPieceTypes is left unchanged for inheritance.
if ( !(connectRegion1[WHITE] || connectRegion1[BLACK] || connectN || connectNxN || collinearN) )
{
- connectPieceTypes = NO_PIECE_SET;
+ connectPieceTypesTrimmed = NO_PIECE_SET;
}
//Otherwise optimize to pieces actually in the game.
else
{
- connectPieceTypes = connectPieceTypes & pieceTypes;
+ connectPieceTypesTrimmed = connectPieceTypes & pieceTypes;
};
return this;
bool endgameEval = false;
bool shogiStylePromotions = false;
std::vector<Direction> connect_directions;
-
+ PieceSet connectPieceTypesTrimmed = ~NO_PIECE_SET;
void add_piece(PieceType pt, char c, std::string betza = "", char c2 = ' ') {
// Avoid ambiguous definition by removing existing piece with same letter
size_t idx;