@@ -882,6 +882,12 @@ static void eval_piece(const board_t * board, const material_info_t * mat_info,
882882 int king;
883883 int delta;
884884 int att;
885+ int vector; // for mobility loops
886+
887+ static const int knight_vector[8 ] = {-33 , -31 , -18 , -14 , 33 , 31 , 18 , 14 };
888+ static const int bishop_vector[4 ] = {-17 , -15 , 15 , 17 };
889+ static const int rook_vector[4 ] = { -1 , -16 , 16 , 1 };
890+ static const int queen_vector[8 ] = {-17 , -15 , 15 , 17 , -1 , -16 , 16 , 1 };
885891
886892 ASSERT (board!=NULL );
887893 ASSERT (mat_info!=NULL );
@@ -921,69 +927,15 @@ static void eval_piece(const board_t * board, const material_info_t * mat_info,
921927
922928 // mobility
923929
924- to = from - 33 ;
925- if ((capture = unit[board->square [to]]) > MobDefense) {
926- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob++;
927- if (UseMobAttack && capture > MobAttack) {
928- if (NO_DEFENDER (to,pawn_safe)) att += capture;
929- }
930- }
931-
932- to = from - 31 ;
933- if ((capture = unit[board->square [to]]) > MobDefense) {
934- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob++;
935- if (UseMobAttack && capture > MobAttack) {
936- if (NO_DEFENDER (to,pawn_safe)) att += capture;
937- }
938- }
939-
940- to = from - 18 ;
941- if ((capture = unit[board->square [to]]) > MobDefense) {
942- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob++;
943- if (UseMobAttack && capture > MobAttack) {
944- if (NO_DEFENDER (to,pawn_safe)) att += capture;
945- }
946- }
947-
948- to = from - 14 ;
949- if ((capture = unit[board->square [to]]) > MobDefense) {
950- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob++;
951- if (UseMobAttack && capture > MobAttack) {
952- if (NO_DEFENDER (to,pawn_safe)) att += capture;
953- }
954- }
955-
956- to = from + 14 ;
957- if ((capture = unit[board->square [to]]) > MobDefense) {
958- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob++;
959- if (UseMobAttack && capture > MobAttack) {
960- if (NO_DEFENDER (to,pawn_safe)) att += capture;
961- }
962- }
963-
964- to = from + 18 ;
965- if ((capture = unit[board->square [to]]) > MobDefense) {
966- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob++;
967- if (UseMobAttack && capture > MobAttack) {
968- if (NO_DEFENDER (to,pawn_safe)) att += capture;
969- }
970- }
971-
972- to = from + 31 ;
973- if ((capture = unit[board->square [to]]) > MobDefense) {
974- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob++;
975- if (UseMobAttack && capture > MobAttack) {
976- if (NO_DEFENDER (to,pawn_safe)) att += capture;
977- }
978- }
979-
980- to = from + 33 ;
981- if ((capture = unit[board->square [to]]) > MobDefense) {
982- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob++;
983- if (UseMobAttack && capture > MobAttack) {
984- if (NO_DEFENDER (to,pawn_safe)) att += capture;
985- }
986- }
930+ for (int i = 0 ; i < 8 ; i++) {
931+ to = from + knight_vector[i];
932+ if ((capture = unit[board->square [to]]) > MobDefense) {
933+ if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob++;
934+ if (UseMobAttack && capture > MobAttack) {
935+ if (NO_DEFENDER (to,pawn_safe)) att += capture;
936+ }
937+ }
938+ }
987939
988940 if (UseMobLinear) {
989941 op[me] += (mob - KnightUnit) * KnightMobOpening;
@@ -1004,81 +956,26 @@ static void eval_piece(const board_t * board, const material_info_t * mat_info,
1004956
1005957 // mobility
1006958
1007- // direction -17
1008-
1009- for (to = from-17 ; capture=board->square [to], THROUGH (capture); to -= 17 ) {
1010- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1011- }
1012-
1013- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1014- mob += MobAttack;
1015- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
959+ for (int i = 0 ; i < 4 ; i++) {
960+ vector = bishop_vector[i];
1016961
1017- } else if (UseMobXRay && (capture & BishopFlag) != 0 ) { // MobXRay
1018- do {
1019- ASSERT (COLOUR_IS (capture,me));
1020- for (to -= 17 ; capture=board->square [to], THROUGH (capture); to -= 17 ) {
1021- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1022- }
1023- } while ((capture & BishopFlag) != 0 && PIECE_COLOUR (capture) == me);
1024- }
1025-
1026- // direction -15
1027-
1028- for (to = from-15 ; capture=board->square [to], THROUGH (capture); to -= 15 ) {
1029- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1030- }
1031-
1032- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1033- mob += MobAttack;
1034- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1035-
1036- } else if (UseMobXRay && (capture & BishopFlag) != 0 ) { // MobXRay
1037- do {
1038- ASSERT (COLOUR_IS (capture,me));
1039- for (to -= 15 ; capture=board->square [to], THROUGH (capture); to -= 15 ) {
1040- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1041- }
1042- } while ((capture & BishopFlag) != 0 && PIECE_COLOUR (capture) == me);
1043- }
962+ for (to = from+vector; capture=board->square [to], THROUGH (capture); to += vector) {
963+ if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
964+ }
1044965
1045- // direction +15
1046-
1047- for (to = from+15 ; capture=board->square [to], THROUGH (capture); to += 15 ) {
1048- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1049- }
966+ if ((piece = unit[capture]) > MobDefense) { // MobAttack
967+ mob += MobAttack;
968+ if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1050969
1051- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1052- mob += MobAttack;
1053- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1054-
1055- } else if (UseMobXRay && (capture & BishopFlag) != 0 ) { // MobXRay
1056- do {
1057- ASSERT (COLOUR_IS (capture,me));
1058- for (to += 15 ; capture=board->square [to], THROUGH (capture); to += 15 ) {
1059- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1060- }
1061- } while ((capture & BishopFlag) != 0 && PIECE_COLOUR (capture) == me);
1062- }
1063-
1064- // direction +17
1065-
1066- for (to = from+17 ; capture=board->square [to], THROUGH (capture); to += 17 ) {
1067- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1068- }
1069-
1070- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1071- mob += MobAttack;
1072- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1073-
1074- } else if (UseMobXRay && (capture & BishopFlag) != 0 ) { // MobXRay
1075- do {
1076- ASSERT (COLOUR_IS (capture,me));
1077- for (to += 17 ; capture=board->square [to], THROUGH (capture); to += 17 ) {
1078- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1079- }
1080- } while ((capture & BishopFlag) != 0 && PIECE_COLOUR (capture) == me);
1081- }
970+ } else if (UseMobXRay && (capture & BishopFlag) != 0 ) { // MobXRay
971+ do {
972+ ASSERT (COLOUR_IS (capture,me));
973+ for (to += vector; capture=board->square [to], THROUGH (capture); to += vector) {
974+ if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
975+ }
976+ } while ((capture & BishopFlag) != 0 && PIECE_COLOUR (capture) == me);
977+ }
978+ }
1082979
1083980 if (UseMobLinear) {
1084981 op[me] += (mob - BishopUnit) * BishopMobOpening;
@@ -1099,81 +996,26 @@ static void eval_piece(const board_t * board, const material_info_t * mat_info,
1099996
1100997 // mobility
1101998
1102- // direction -16
1103-
1104- for (to = from-16 ; capture=board->square [to], THROUGH (capture); to -= 16 ) {
1105- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1106- }
1107-
1108- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1109- mob += MobAttack;
1110- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1111-
1112- } else if (UseMobXRay && (capture & RookFlag) != 0 ) { // MobXRay
1113- do {
1114- ASSERT (COLOUR_IS (capture,me));
1115- for (to -= 16 ; capture=board->square [to], THROUGH (capture); to -= 16 ) {
1116- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1117- }
1118- } while ((capture & RookFlag) != 0 && PIECE_COLOUR (capture) == me);
1119- }
1120-
1121- // direction -1
1122-
1123- for (to = from- 1 ; capture=board->square [to], THROUGH (capture); to -= 1 ) {
1124- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1125- }
1126-
1127- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1128- mob += MobAttack;
1129- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1130-
1131- } else if (UseMobXRay && (capture & RookFlag) != 0 ) { // MobXRay
1132- do {
1133- ASSERT (COLOUR_IS (capture,me));
1134- for (to -= 1 ; capture=board->square [to], THROUGH (capture); to -= 1 ) {
1135- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1136- }
1137- } while ((capture & RookFlag) != 0 && PIECE_COLOUR (capture) == me);
1138- }
1139-
1140- // direction +1
999+ for (int i = 0 ; i < 4 ; i++) {
1000+ vector = rook_vector[i];
11411001
1142- for (to = from+ 1 ; capture=board->square [to], THROUGH (capture); to += 1 ) {
1143- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1144- }
1002+ for (to = from+vector ; capture=board->square [to], THROUGH (capture); to += vector ) {
1003+ if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1004+ }
11451005
1146- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1147- mob += MobAttack;
1148- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1006+ if ((piece = unit[capture]) > MobDefense) { // MobAttack
1007+ mob += MobAttack;
1008+ if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
11491009
1150- } else if (UseMobXRay && (capture & RookFlag) != 0 ) { // MobXRay
1151- do {
1152- ASSERT (COLOUR_IS (capture,me));
1153- for (to += 1 ; capture=board->square [to], THROUGH (capture); to += 1 ) {
1154- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1155- }
1156- } while ((capture & RookFlag) != 0 && PIECE_COLOUR (capture) == me);
1157- }
1158-
1159- // direction +16
1160-
1161- for (to = from+16 ; capture=board->square [to], THROUGH (capture); to += 16 ) {
1162- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1163- }
1164-
1165- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1166- mob += MobAttack;
1167- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1168-
1169- } else if (UseMobXRay && (capture & RookFlag) != 0 ) { // MobXRay
1170- do {
1171- ASSERT (COLOUR_IS (capture,me));
1172- for (to += 16 ; capture=board->square [to], THROUGH (capture); to += 16 ) {
1173- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1174- }
1175- } while ((capture & RookFlag) != 0 && PIECE_COLOUR (capture) == me);
1176- }
1010+ } else if (UseMobXRay && (capture & RookFlag) != 0 ) { // MobXRay
1011+ do {
1012+ ASSERT (COLOUR_IS (capture,me));
1013+ for (to += vector; capture=board->square [to], THROUGH (capture); to += vector) {
1014+ if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1015+ }
1016+ } while ((capture & RookFlag) != 0 && PIECE_COLOUR (capture) == me);
1017+ }
1018+ }
11771019
11781020 if (UseMobLinear) {
11791021 op[me] += (mob - RookUnit) * RookMobOpening;
@@ -1238,93 +1080,19 @@ static void eval_piece(const board_t * board, const material_info_t * mat_info,
12381080
12391081 // mobility
12401082
1241- // direction -17
1242-
1243- for (to = from-17 ; capture=board->square [to], THROUGH (capture); to -= 17 ) {
1244- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1245- }
1246-
1247- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1248- mob += MobAttack;
1249- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1250- }
1251-
1252- // direction -16
1253-
1254- for (to = from-16 ; capture=board->square [to], THROUGH (capture); to -= 16 ) {
1255- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1256- }
1257-
1258- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1259- mob += MobAttack;
1260- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1261- }
1262-
1263- // direction -15
1264-
1265- for (to = from-15 ; capture=board->square [to], THROUGH (capture); to -= 15 ) {
1266- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1267- }
1268-
1269- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1270- mob += MobAttack;
1271- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1272- }
1273-
1274- // direction -1
1275-
1276- for (to = from- 1 ; capture=board->square [to], THROUGH (capture); to -= 1 ) {
1277- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1278- }
1279-
1280- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1281- mob += MobAttack;
1282- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1283- }
1284-
1285- // direction +1
1083+ for (int i = 0 ; i < 8 ; i++) {
1084+ vector = queen_vector[i];
12861085
1287- for (to = from+ 1 ; capture=board->square [to], THROUGH (capture); to += 1 ) {
1288- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1289- }
1290-
1291- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1292- mob += MobAttack;
1293- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1294- }
1086+ for (to = from+vector; capture=board->square [to], THROUGH (capture); to += vector) {
1087+ if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1088+ }
12951089
1296- // direction +15
1090+ if ((piece = unit[capture]) > MobDefense) { // MobAttack
1091+ mob += MobAttack;
1092+ if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1093+ }
1094+ }
12971095
1298- for (to = from+15 ; capture=board->square [to], THROUGH (capture); to += 15 ) {
1299- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1300- }
1301-
1302- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1303- mob += MobAttack;
1304- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1305- }
1306-
1307- // direction +16
1308-
1309- for (to = from+16 ; capture=board->square [to], THROUGH (capture); to += 16 ) {
1310- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1311- }
1312-
1313- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1314- mob += MobAttack;
1315- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1316- }
1317-
1318- // direction +17
1319-
1320- for (to = from+17 ; capture=board->square [to], THROUGH (capture); to += 17 ) {
1321- if (!UseMobPawnSafe || NO_ATTACKER (to,pawn_safe)) mob += MobMove;
1322- }
1323-
1324- if ((piece = unit[capture]) > MobDefense) { // MobAttack
1325- mob += MobAttack;
1326- if (UseMobAttack && NO_DEFENDER (to,pawn_safe)) att += piece;
1327- }
13281096
13291097 if (UseMobLinear) {
13301098 op[me] += (mob - QueenUnit) * QueenMobOpening;
0 commit comments