Consider sideway attacks of soldiers in mobility
authorFabian Fichter <ianfab@users.noreply.github.com>
Fri, 24 Apr 2020 15:31:22 +0000 (17:31 +0200)
committerFabian Fichter <ianfab@users.noreply.github.com>
Fri, 24 Apr 2020 15:31:22 +0000 (17:31 +0200)
janggi
Total: 200 W: 89 L: 92 D: 19

xiangqi
Total: 200 W: 61 L: 57 D: 82

src/evaluate.cpp
src/position.cpp
src/position.h

index 50692b9..c1b2b7b 100644 (file)
@@ -245,7 +245,10 @@ namespace {
     if (pos.must_capture())
         mobilityArea[Us] = AllSquares;
     else
-        mobilityArea[Us] = ~(b | pos.pieces(Us, KING, QUEEN) | pos.blockers_for_king(Us) | pe->pawn_attacks(Them) | shift<Down>(pos.pieces(Them, SHOGI_PAWN, SOLDIER)));
+        mobilityArea[Us] = ~(b | pos.pieces(Us, KING, QUEEN) | pos.blockers_for_king(Us) | pe->pawn_attacks(Them)
+                               | shift<Down>(pos.pieces(Them, SHOGI_PAWN, SOLDIER))
+                               | shift<EAST>(pos.promoted_soldiers(Them))
+                               | shift<WEST>(pos.promoted_soldiers(Them)));
 
     // Initialize attackedBy[] for king and pawns
     attackedBy[Us][KING] = pos.count<KING>(Us) ? pos.attacks_from<KING>(ksq, Us) : Bitboard(0);
index 228cf7a..32e1934 100644 (file)
@@ -801,7 +801,7 @@ Bitboard Position::attackers_to(Square s, Bitboard occupied, Color c, Bitboard j
       b |= diags & diagonal_lines();
   }
 
-  if (unpromoted_soldier(c, s))
+  if (b & pieces(SOLDIER) && relative_rank(c, s, max_rank()) < var->soldierPromotionRank)
       b ^= b & pieces(SOLDIER) & ~PseudoAttacks[~c][SHOGI_PAWN][s];
 
   return b;
index 8b3824d..b77f286 100644 (file)
@@ -145,7 +145,7 @@ public:
   Bitboard diagonal_lines() const;
   bool king_pass() const;
   bool king_pass_on_stalemate() const;
-  bool unpromoted_soldier(Color c, Square s) const;
+  Bitboard promoted_soldiers(Color c) const;
   bool makpong() const;
   // winning conditions
   int n_move_rule() const;
@@ -591,9 +591,9 @@ inline bool Position::king_pass_on_stalemate() const {
   return var->kingPassOnStalemate;
 }
 
-inline bool Position::unpromoted_soldier(Color c, Square s) const {
+inline Bitboard Position::promoted_soldiers(Color c) const {
   assert(var != nullptr);
-  return relative_rank(c, s, var->maxRank) < var->soldierPromotionRank;
+  return pieces(c, SOLDIER) & promotion_zone_bb(c, var->soldierPromotionRank, max_rank());
 }
 
 inline bool Position::makpong() const {
@@ -848,7 +848,7 @@ inline Bitboard Position::attacks_from(Color c, PieceType pt, Square s) const {
   PieceType movePt = pt == KING ? king_type() : pt;
   Bitboard b = attacks_bb(c, movePt, s, byTypeBB[ALL_PIECES]);
   // Xiangqi soldier
-  if (pt == SOLDIER && unpromoted_soldier(c, s))
+  if (pt == SOLDIER && !(promoted_soldiers(c) & s))
       b &= file_bb(file_of(s));
   // Janggi cannon restrictions
   if (pt == JANGGI_CANNON)
@@ -876,7 +876,7 @@ inline Bitboard Position::moves_from(Color c, PieceType pt, Square s) const {
   PieceType movePt = pt == KING ? king_type() : pt;
   Bitboard b = moves_bb(c, movePt, s, byTypeBB[ALL_PIECES]);
   // Xiangqi soldier
-  if (pt == SOLDIER && unpromoted_soldier(c, s))
+  if (pt == SOLDIER && !(promoted_soldiers(c) & s))
       b &= file_bb(file_of(s));
   // Janggi cannon restrictions
   if (pt == JANGGI_CANNON)