Conversation
| if (popcount((DarkSquares & to ? DarkSquares : ~DarkSquares) & pieces(us, BISHOP)) + 1 > (count_with_hand(us, BISHOP) + 1) / 2) | ||
| return false; | ||
| } | ||
| if (type_of(m) == DROP && (!var->isPriorityDrop[type_of(moved_piece(m))]) && priorityDropCountInHand[us] > 0) |
There was a problem hiding this comment.
For efficiency, I think these two new conditions should be checked in reverse order.
ianfab
left a comment
There was a problem hiding this comment.
Thanks for your PR and sorry for the delay. I added a few comments.
| bool mustCapture = false; | ||
| bool mustDrop = false; | ||
| PieceType mustDropType = ALL_PIECES; | ||
| bool isPriorityDrop[PIECE_TYPE_NB] = {}; |
There was a problem hiding this comment.
It would be more consistent and storage efficient to use a PieceSet here, similar as for other properties. This would also simplify the parsing, since it can reuse existing logic. It could perhaps also already be made color-specific, similar as promotionPieceTypes or the like.
| if (popcount((DarkSquares & to ? DarkSquares : ~DarkSquares) & pieces(us, BISHOP)) + 1 > (count_with_hand(us, BISHOP) + 1) / 2) | ||
| return false; | ||
| } | ||
| if (type_of(m) == DROP && (!var->isPriorityDrop[type_of(moved_piece(m))]) && priorityDropCountInHand[us] > 0) |
There was a problem hiding this comment.
Since this is fairly trivial logic and does not depend on other moves, it should be more suitable to validate this in move generation and pseudo-legal validation instead of in legal validation.
Implementation of priority drops, a feature I needed for my chess variant. Pieces from
priorityDropTypesmust be dropped before dropping any other pieces. In my variant, I use this feature to control the early game setup, even though I don't technically impose a separate setup phase: stronger pieces can be dropped only after all the weaker ones have been dropped.