Fix king evasions in palace for Janggi
authorFabian Fichter <ianfab@users.noreply.github.com>
Tue, 31 Mar 2020 17:46:28 +0000 (19:46 +0200)
committerFabian Fichter <ianfab@users.noreply.github.com>
Tue, 31 Mar 2020 17:46:28 +0000 (19:46 +0200)
Closes #90.

src/movegen.cpp
tests/perft.sh

index 38dc282..200d30a 100644 (file)
@@ -521,6 +521,19 @@ ExtMove* generate<EVASIONS>(const Position& pos, ExtMove* moveList) {
   while (b)
       moveList = make_move_and_gating<NORMAL>(pos, moveList, us, ksq, pop_lsb(&b));
 
+  // Janggi king palace moves
+  if (pos.diagonal_lines() & ksq)
+  {
+      PieceType movePt = pos.king_type();
+      PieceType diagType = movePt == WAZIR ? FERS : movePt == SOLDIER ? PAWN : movePt == ROOK ? BISHOP : NO_PIECE_TYPE;
+      if (diagType)
+      {
+          b = attacks_bb(us, diagType, ksq, pos.pieces()) & pos.board_bb(us, KING) & pos.diagonal_lines() & ~pos.pieces(us) & ~sliderAttacks;
+          while (b)
+              moveList = make_move_and_gating<SPECIAL>(pos, moveList, us, ksq, pop_lsb(&b));
+      }
+  }
+
   if (more_than_one(pos.checkers()))
       return moveList; // Double check, only a king move can save the day
 
index f1eab99..59f21e4 100755 (executable)
@@ -74,8 +74,8 @@ if [[ $1 == "largeboard" ]]; then
   expect perft.exp courier startpos 4 500337 > /dev/null
   expect perft.exp grand startpos 3 259514 > /dev/null
   expect perft.exp xiangqi startpos 4 3290240 > /dev/null
-  expect perft.exp janggi startpos 4 948462 > /dev/null
-  expect perft.exp janggi "fen 1n1kaabn1/cr2N4/5C1c1/p1pNp3p/9/9/P1PbP1P1P/3r1p3/4A4/R1BA1KB1R b - - 0 1" 4 70254 > /dev/null
+  expect perft.exp janggi startpos 4 948468 > /dev/null
+  expect perft.exp janggi "fen 1n1kaabn1/cr2N4/5C1c1/p1pNp3p/9/9/P1PbP1P1P/3r1p3/4A4/R1BA1KB1R b - - 0 1" 4 70256 > /dev/null
 fi
 
 rm perft.exp