diff --git a/Board.h b/Board.h index 741d8a6..30f5ff3 100644 --- a/Board.h +++ b/Board.h @@ -8,8 +8,7 @@ struct Unmove { byte sq_from; // 0b(1unused)(3rank)(1unused)(3file) byte sq_to; // 0b(1promoted?)(3rank)(1unused)(3file) - byte captured; // 0b(4unused)(1color)(3piecetype) - byte enpassant; // store enpassant state + byte captured; // 0b(4enpassantinfo)(1color)(3piecetype) byte revmov; // 8bit integer }; @@ -97,7 +96,7 @@ void Board::make(Move m) { // fill unmove struct with basic data Unmove u; u.revmov = field[PTR_REVMOV]; - u.captured = field[m.sq_to]; + u.captured = field[m.sq_to] | (field[PTR_ENPASSANT] << 4); u.sq_from = m.sq_from; u.sq_to = m.sq_to; @@ -155,15 +154,14 @@ void Board::make(Move m) { (m.sq_to & 0x7) == (field[PTR_ENPASSANT] & 0x7) && (m.sq_to & 0x70) == (0x50 - 0x30*black_moving()) ) { - // we are also going to the correct square to do EP. + // all EP-conditions are met // therefore, delete the EP-vurnerable pawn byte ep_field = m.sq_to - 16 + 32*black_moving(); field[ep_field] = P_EMPTY; + // also put information that we did an EP-capture + u.sq_to |= 0x08; } - // Store the current enpassant situation - u.enpassant = field[PTR_ENPASSANT]; - // handle enpassant setup (double pawn move) if( piece_type == W_PAWN && @@ -199,6 +197,7 @@ void Board::make(Move m) { void Board::unmake() { Unmove u = read_unmove(); + field[PTR_REVMOV] = u.revmov; byte sq_to = u.sq_to & 0x77; byte prom_ep_capt = u.sq_to & 0x88; @@ -206,20 +205,23 @@ void Board::unmake() { if(prom_ep_capt == 0) { // regular move - field[u.sq_from] = field[u.sq_to]; + field[u.sq_from] = field[sq_to]; } else if (prom_ep_capt == 0x80) { // piece was promoted // so the source is a pawn field[u.sq_from] = W_PAWN | (field[u.sq_to] & 0b1000); } else if (prom_ep_capt == 0x08) { // we did an enpassant capture - byte ep_sq = (sq_to & 0x07) | (u.sq_from & 0x70); + byte ep_sq = (u.sq_to & 0x07) | (u.sq_from & 0x70); field[ep_sq] = W_PAWN | black_moving() << 3; + // also undo the regular move + field[u.sq_from] = field[sq_to]; } - field[u.sq_to] = u.captured & 0b1111; + field[sq_to] = u.captured & 0b1111; field[PTR_SIDE_AND_CASTLERIGHT] ^= 0x01; + field[PTR_ENPASSANT] = u.captured >> 4; } void Board::next_unmove() {