Ejemplo n.º 1
0
bool Mate::isProtected_(const Board& board, const Square to, const Bitboard& occ, const Bitboard& occNoAttacker, const Square king) {
  // pawn
  Bitboard bb = (black ? board.getBPawn() : board.getWPawn()) & occNoAttacker;
  if (bb.check(black ? to.safetyDown() : to.safetyUp())) {
    return true;
  }

  // lance
  bb = (black ? board.getBLance() : board.getWLance()) & occNoAttacker;
  bb &= black ? MoveTables::wlance(to, occ) : MoveTables::blance(to, occ);
  if (bb) { return true; }

  // knight
  bb = (black ? board.getBKnight() : board.getWKnight()) & occNoAttacker;
  bb &= black ? MoveTables::wknight(to) : MoveTables::bknight(to);
  if (bb) { return true; }

  // silver
  bb = (black ? board.getBSilver() : board.getWSilver()) & occNoAttacker;
  bb &= black ? MoveTables::wsilver(to) : MoveTables::bsilver(to);
  if (bb) { return true; }

  // gold
  bb = (black ? board.getBGold() : board.getWGold()) & occNoAttacker;
  bb &= black ? MoveTables::wgold(to) : MoveTables::bgold(to);
  if (bb) { return true; }

  // bishop
  bb = (black ? board.getBBishop() : board.getWBishop()) & occNoAttacker;
  bb &= MoveTables::bishop(to, occ);
  if (bb) { return true; }

  // rook
  bb = (black ? board.getBRook() : board.getWRook()) & occNoAttacker;
  bb &= MoveTables::rook(to, occ);
  if (bb) { return true; }

  // tokin
  bb = (black ? board.getBTokin() : board.getWTokin()) & occNoAttacker;
  bb &= black ? MoveTables::wgold(to) : MoveTables::bgold(to);
  if (bb) { return true; }

  // promoted lance
  bb = (black ? board.getBProLance() : board.getWProLance()) & occNoAttacker;
  bb &= black ? MoveTables::wgold(to) : MoveTables::bgold(to);
  if (bb) { return true; }

  // promoted knight
  bb = (black ? board.getBProKnight() : board.getWProKnight()) & occNoAttacker;
  bb &= black ? MoveTables::wgold(to) : MoveTables::bgold(to);
  if (bb) { return true; }

  // promoted silver
  bb = (black ? board.getBProSilver() : board.getWProSilver()) & occNoAttacker;
  bb &= black ? MoveTables::wgold(to) : MoveTables::bgold(to);
  if (bb) { return true; }

  // horse
  bb = (black ? board.getBHorse() : board.getWHorse()) & occNoAttacker;
  bb &= MoveTables::horse(to, occ);
  if (bb) { return true; }

  // dragon
  bb = (black ? board.getBDragon() : board.getWDragon()) & occNoAttacker;
  bb &= MoveTables::dragon(to, occ);
  if (bb) { return true; }

  // king
  if (king.isValid()) {
    if (MoveTables::king(king).check(to) &&
        (!recursive || !isProtected_<!black>(board, to, occ, occNoAttacker, Square::Invalid))) {
      return true;
    }
  }

  return false;
}