Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pawn Promotions not Updating Board #227

Open
sethbassetti opened this issue Jan 6, 2022 · 1 comment
Open

Pawn Promotions not Updating Board #227

sethbassetti opened this issue Jan 6, 2022 · 1 comment

Comments

@sethbassetti
Copy link

sethbassetti commented Jan 6, 2022

I am currently using chessboard.js as a frontend to process a game whose logic is controlled with an engine I've written in C++. Currently, whenever I make a move (with the onDrop event and draggable set to true), it determines whether it is a valid move, makes the move on my backend C++ board, queries it for its FEN string, and updates the chessboard display accordingly. This is working fine so far, but I am running into issues when I attempt to promote a pawn.

My onDrop function looks like this:

function onDrop(source, target, piece, newPos, oldPos, orientation) {

  // Gets the start and end squares of the move
  var source_index = squareIndexes.indexOf(source);
  var target_index = squareIndexes.indexOf(target);
    
  // Returns true if this is a valid move
  if (Module.MakeMove(source_index, target_index)) {
    UpdateBoard();
    return true;
  }
  return 'snapback';
}

My Update Board function looks like this:

/* Gets the FEN string from the chess engine and updates the display */
function UpdateBoard() {
    
    // boardPosition contains an FEN string of the true board representation
  var boardPosition = Module.GetBoardPosition();
  
  // Sets the board position to the correct FEN string
    board.position(boardPosition, false);
  }

Through debugging, I've found that the chess engine is processing the move correctly, and the FEN string Module.GetBoardPosition() returns shows a queen where the pawn previously was. However, it seems that chessboard.js in this case is updating the board twice, the first time it correctly updates the pawn to a queen. This is the expected behavior, however, it somehow updates the board position a second time, reverting the queen to a pawn. (This was verified by logging with the onChange event). Upon the next move for the other side, chessboard.js gets correctly updated and a queen appears, but it only shows correctly upon the move following the promotion.

I have no idea why the board position is being updated twice in the event of a pawn promotion and even weirder, why it is reverting the promoted queen back to a pawn, even though the FEN string the board position is being set to contains a queen there.

Any help would be super appreciated as I have been battling this issue for a while.

@samboy
Copy link

samboy commented May 5, 2022

Here’s the PGN of a game to test pawn promotion:

1. e4 Nf6 2. Nc3?!  d5  3. e5 d4 4. exf6 dxc3 5. d4?! cxb2 6. fxg7 bxa1=Q 
7. gxh8=Q Qxa2?  8. Qxh7?!  a5??   9. h4??  Nc6?!   10. Nf3 a4??   11. h5??   a3??   
12. Qg8??   Qe6+??   13. Be2 a2??   14. h6 a1=Q?!   15. h7 Qdd5?!   16. h8=Q Qda5+ 
17. Kf1 Kd7 18. Qxf8 b5?!   19. Qe8+ Kd6 20. Bf4+ Kd5 21. Rh5+ f5 22. Rxf5+ Qxf5
23. Qhg8+ e6 24. c4+ Ke4?   25. Qxc6+ Kxf4 26. g3#

Source: https://lichess.org/jBC2lZJt (Rosen vs. NN 2019)

For the record, it works for me, but I use chessboardjs as part of my toolkit to put interactive chess diagrams on my webpage.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants