Put unmake struct on a diet

This commit is contained in:
Quinten Kock 2020-06-17 23:58:43 +02:00
parent 6954cfcb0c
commit e400106b55
1 changed files with 12 additions and 10 deletions

22
Board.h
View File

@ -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() {