I made a screen recording showing the long delay when adding moves. Sorry for the low resolution, had to compress it to get it to upload.
ChessX is inefficient when making moves on very large games
Took a look at the commit - does it account for the scenario where en passant rights actually DO affect three-fold repetition?
So any time a BoardX's hash is generated in BoardX::createHash, it runs BoardX::hashEpSquare, which XORs the en passant square onto the hash, defined by BoardX::m_epFile as the "file of a possible ep capture". Therefore, the hash state of a board where a pawn was just pushed two squares, even if no en passant is possible, is different from the hash state two moves later when the board looks exactly the same.
Another related fix might be improving the efficiency of GameX::positionRepetition for very long games (hundreds of moves). As it is, if I'm understanding the code correctly, the method checks every past board hash. However, it is not necessary to check beyond the most recent pawn move or capture, as no position before then can possibly be identical to the current one.
So in GameX::positionRepetition, position equality is determined using the == operator for BoardX objects. In that operator, board equality is determined using the board's getHashValue method, which seems to be related somehow to the position's FEN.
So in GameX::positionRepetition, position equality is determined using the == operator for BoardX objects. Therefore, the bug must be found there.
Mistake in Threefold Repetition Rule relating to En Passant