diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 3482d14bb..10e8e537f 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -43,6 +43,15 @@ Value Evaluation::value() const break; case Phase::placing: + if (rule.millFormationActionInPlacingPhase == + MillFormationActionInPlacingPhase::removalBasedOnMillCounts) { + if (pos.get_action() == Action::remove) { + value += VALUE_EACH_PIECE_NEEDREMOVE * pieceToRemoveDiffCount; + } else { + value += pos.mills_pieces_count_difference(); + } + break; + } case Phase::moving: if (pos.shouldConsiderMobility()) { value += pos.get_mobility_diff(); diff --git a/src/position.h b/src/position.h index 45e53e863..88ea9907a 100644 --- a/src/position.h +++ b/src/position.h @@ -191,6 +191,7 @@ class Position bool move_piece(Square from, Square to); int total_mills_count(Color c); + int mills_pieces_count_difference() const; void calculate_removal_based_on_mill_counts(); bool is_board_full_removal_at_placing_phase_end(); bool is_adjacent_to(Square s, Color c); @@ -404,6 +405,12 @@ inline int Position::get_mobility_diff() const return mobilityDiff; } +inline int Position::mills_pieces_count_difference() const +{ + return popcount(formedMillsBB[WHITE]) - + popcount(formedMillsBB[BLACK]); +} + inline bool Position::shouldFocusOnBlockingPaths() const { if (get_phase() == Phase::placing) {