- typedef Key ZM[2][8][16];
- const ZM& z = Position::zobMaterial;
-
- static const Color W = WHITE;
- static const Color B = BLACK;
-
- KNNKMaterialKey = z[W][KNIGHT][1] ^ z[W][KNIGHT][2];
- KKNNMaterialKey = z[B][KNIGHT][1] ^ z[B][KNIGHT][2];
-
- add(z[W][PAWN][1], &EvaluateKPK);
- add(z[B][PAWN][1], &EvaluateKKP);
-
- add(z[W][BISHOP][1] ^ z[W][KNIGHT][1], &EvaluateKBNK);
- add(z[B][BISHOP][1] ^ z[B][KNIGHT][1], &EvaluateKKBN);
- add(z[W][ROOK][1] ^ z[B][PAWN][1], &EvaluateKRKP);
- add(z[W][PAWN][1] ^ z[B][ROOK][1], &EvaluateKPKR);
- add(z[W][ROOK][1] ^ z[B][BISHOP][1], &EvaluateKRKB);
- add(z[W][BISHOP][1] ^ z[B][ROOK][1], &EvaluateKBKR);
- add(z[W][ROOK][1] ^ z[B][KNIGHT][1], &EvaluateKRKN);
- add(z[W][KNIGHT][1] ^ z[B][ROOK][1], &EvaluateKNKR);
- add(z[W][QUEEN][1] ^ z[B][ROOK][1], &EvaluateKQKR);
- add(z[W][ROOK][1] ^ z[B][QUEEN][1], &EvaluateKRKQ);
-
- add(z[W][KNIGHT][1] ^ z[W][PAWN][1], W, &ScaleKNPK);
- add(z[B][KNIGHT][1] ^ z[B][PAWN][1], B, &ScaleKKNP);
-
- add(z[W][ROOK][1] ^ z[W][PAWN][1] ^ z[B][ROOK][1] , W, &ScaleKRPKR);
- add(z[W][ROOK][1] ^ z[B][ROOK][1] ^ z[B][PAWN][1] , B, &ScaleKRKRP);
- add(z[W][BISHOP][1] ^ z[W][PAWN][1] ^ z[B][BISHOP][1], W, &ScaleKBPKB);
- add(z[W][BISHOP][1] ^ z[B][BISHOP][1] ^ z[B][PAWN][1] , B, &ScaleKBKBP);
- add(z[W][BISHOP][1] ^ z[W][PAWN][1] ^ z[B][KNIGHT][1], W, &ScaleKBPKN);
- add(z[W][KNIGHT][1] ^ z[B][BISHOP][1] ^ z[B][PAWN][1] , B, &ScaleKNKBP);
-
- add(z[W][ROOK][1] ^ z[W][PAWN][1] ^ z[W][PAWN][2] ^ z[B][ROOK][1] ^ z[B][PAWN][1], W, &ScaleKRPPKRP);
- add(z[W][ROOK][1] ^ z[W][PAWN][1] ^ z[B][ROOK][1] ^ z[B][PAWN][1] ^ z[B][PAWN][2], B, &ScaleKRPKRPP);
+ KNNKMaterialKey = buildKey("KNNK");
+ KKNNMaterialKey = buildKey("KKNN");
+
+ add_ef<KPK>("KPK");
+ add_ef<KBNK>("KBNK");
+ add_ef<KRKP>("KRKP");
+ add_ef<KRKB>("KRKB");
+ add_ef<KRKN>("KRKN");
+ add_ef<KQKR>("KQKR");
+ add_ef<KBBKN>("KBBKN");
+
+ add_sf<KNPK>("KNPK");
+ add_sf<KRPKR>("KRPKR");
+ add_sf<KBPKB>("KBPKB");
+ add_sf<KBPPKB>("KBPPKB");
+ add_sf<KBPKN>("KBPKN");
+ add_sf<KRPPKRP>("KRPPKRP");
+ add_sf<KRPPKRP>("KRPPKRP");