- if ( pos.non_pawn_material(WHITE) == BishopValueMidgame
- && pos.piece_count(WHITE, BISHOP) == 1
- && pos.piece_count(WHITE, PAWN) >= 1)
- mi->scalingFunction[WHITE] = &ScaleKBPK;
-
- if ( pos.non_pawn_material(BLACK) == BishopValueMidgame
- && pos.piece_count(BLACK, BISHOP) == 1
- && pos.piece_count(BLACK, PAWN) >= 1)
- mi->scalingFunction[BLACK] = &ScaleKKBP;
-
- if ( pos.piece_count(WHITE, PAWN) == 0
- && pos.non_pawn_material(WHITE) == QueenValueMidgame
- && pos.piece_count(WHITE, QUEEN) == 1
- && pos.piece_count(BLACK, ROOK) == 1
- && pos.piece_count(BLACK, PAWN) >= 1)
- mi->scalingFunction[WHITE] = &ScaleKQKRP;
-
- else if ( pos.piece_count(BLACK, PAWN) == 0
- && pos.non_pawn_material(BLACK) == QueenValueMidgame
- && pos.piece_count(BLACK, QUEEN) == 1
- && pos.piece_count(WHITE, ROOK) == 1
- && pos.piece_count(WHITE, PAWN) >= 1)
- mi->scalingFunction[BLACK] = &ScaleKRPKQ;
-
- if (pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) == Value(0))
+ // Generic scaling functions that refer to more then one material
+ // distribution. Should be probed after the specialized ones.
+ // Note that these ones don't return after setting the function.
+ if (is_KBPsKs<WHITE>(pos))
+ mi->scalingFunction[WHITE] = &ScaleKBPsK[WHITE];
+
+ if (is_KBPsKs<BLACK>(pos))
+ mi->scalingFunction[BLACK] = &ScaleKBPsK[BLACK];
+
+ if (is_KQKRPs<WHITE>(pos))
+ mi->scalingFunction[WHITE] = &ScaleKQKRPs[WHITE];
+
+ else if (is_KQKRPs<BLACK>(pos))
+ mi->scalingFunction[BLACK] = &ScaleKQKRPs[BLACK];
+
+ Value npm_w = pos.non_pawn_material(WHITE);
+ Value npm_b = pos.non_pawn_material(BLACK);
+
+ if (npm_w + npm_b == VALUE_ZERO)