{
struct game_state_t *gs;
struct move_t *m, *m1;
- int now, i;
+ int now, i, piece;
if (game_globals.garray[g].link >= 0) /*IanO: not implemented for bughouse yet */
return MOVE_ILLEGAL;
gs->board[kingFromFile][rank] = KING | m->color; // King fromSquare
goto cleanupMove;
}
+ piece = gs->board[m->toFile][m->toRank];
if(gs->board[m->fromFile][m->fromRank] != NOPIECE) { // [HGM] from-square occupied; move must have been Seirawan-style gating
gs->holding[gs->onMove==WHITE ? 1 : 0][piecetype(gs->board[m->fromFile][m->fromRank])-1]++; // put back in holdings (onMove not flipped yet!)
- }
- gs->board[m->fromFile][m->fromRank] = gs->board[m->toFile][m->toRank];
- if (m->piecePromotionTo != NOPIECE) {
- int piece;
+ } else
+ if (m->piecePromotionTo != NOPIECE) { // it is a real promotion
switch(piecetype(m->piecePromotionTo)) { // Spartan pieces came from Hoplite, Shogi is problematic
case KING:
case CAPTAIN:
case GOLD: // TODO: figure out what original was
default: piece = PAWN;
}
- gs->board[m->fromFile][m->fromRank] = piece |
- colorval(gs->board[m->fromFile][m->fromRank]);
+ piece |= colorval(gs->board[m->toFile][m->toRank]);
}
+ gs->board[m->fromFile][m->fromRank] = piece;
/******************
When takeback a _first_ move of rook, the ??rmoved variable
must be cleared . To check, if the move is first, we should