private function UpdateCastlingBitmaps() { $this->nCalls++; $this->n64WhiteCastle->set_value('0x0'); $this->n64BlackCastle->set_value('0x0'); // If white king or black king are in check, then castling isn't possible; if ($this->PlayerTurn == 0 && $this->nStatus == CHESS_BOARD_STATUS::CHECK) { $this->n64WhiteCastle->set_value('0x0'); return; } else { if ($this->PlayerTurn == 1 && $this->nStatus == CHESS_BOARD_STATUS::CHECK) { $this->n64BlackCastle->set_value('0x0'); return; } } // NOTE: Limit to updating the castling bitboards to the next side to move because these bitboards // are only valid for the next move. // Need to check columns 2,3 and 5,6 for ranks 0 and 7 to see if they are empty and not attacked. if ($this->fCastleWQueenside) { if (BitBoard::_AND_($this->n64All, $this->n64WhiteCastleQFree)->is_zero()) { $bitmap = $this->FindAttacksToTile(0, 2)->_AND($this->n64BAll); if ($bitmap->is_zero()) { $bitmap = $this->FindAttacksToTile(0, 3)->_AND($this->n64BAll); if ($bitmap->is_zero()) { $this->n64WhiteCastle->_OR($this->Tiles[2]); } } } } if ($this->fCastleWKingside) { if (BitBoard::_AND_($this->n64All, $this->n64WhiteCastleKFree)->is_zero()) { $bitmap = $this->FindAttacksToTile(0, 5)->_AND($this->n64BAll); if ($bitmap->is_zero()) { $bitmap = $this->FindAttacksToTile(0, 6)->_AND($this->n64BAll); if ($bitmap->is_zero()) { $this->n64WhiteCastle->_OR($this->Tiles[6]); } } } } if ($this->fCastleBQueenside) { if (BitBoard::_AND_($this->n64All, $this->n64BlackCastleQFree)->is_zero()) { $bitmap = $this->FindAttacksToTile(7, 2)->_AND($this->n64WAll); if ($bitmap->is_zero()) { $bitmap = $this->FindAttacksToTile(7, 3)->_AND($this->n64WAll); if ($bitmap->is_zero()) { $this->n64BlackCastle->_OR($this->Tiles[58]); } } } } if ($this->fCastleBKingside) { if (BitBoard::_AND_($this->n64All, $this->n64BlackCastleKFree)->is_zero()) { $bitmap = $this->FindAttacksToTile(7, 5)->_AND($this->n64WAll); if ($bitmap->is_zero()) { $bitmap = $this->FindAttacksToTile(7, 6)->_AND($this->n64WAll); if ($bitmap->is_zero()) { $this->n64BlackCastle->_OR($this->Tiles[62]); } } } } }