That is simply not the case.
from immortal:
Функция evaluate() - это sub_404AD0. Полный аналог Ипполитов, только все веса зачем-то умножены на 2. И конечно, в конце evaluate видим вызов эндшпильных функций:
mov eax, var_C
mov ecx, dword_8F2880[eax*4] ; массив указателей на функции
movzx edx, bl
push ebp
push edx
push esi
push 0
call ecx ; dword_8F2880
Пересчет выводимой оценки - это sub_41E7F0. В Робболито она называется cp_mate (файл search.c). Если воспользоваться HexRays и немного поредактировать, то в Гудини эта функция могла бы выглядеть так:
static char * cp_mate (int value, char *s)
{ if (value > VALUE_MATE - 1024)
sprintf (s, "mate %d", (VALUE_MATE + 1 - value) / 2);
else if (value < -VALUE_MATE + 1024)
sprintf (s, "mate %d", (-VALUE_MATE - value) / 2);
// else sprintf (s, "cp %d", value);
else {
if ( (unsigned int)(value + 899) > 1798 ) value = 16 * value;
else {
if ( value > -300 ) {
if ( value > -150 ) {
if ( value > 150 ) {
if ( value > 300 ) value = 2 * (9 * value - 900);
else value = 14 * value - 600;
}
else value = 10 * value;
}
else value = 14 * value + 600;
}
else value = 2 * (9 * value + 900);
}
sprintf(s, "cp %d", value / 32);
}
return s;
}
Не забываем, что value на входе в эту функцию - это почти всегда оценка Ипполита, умноженная на 2.