if (rootKnoop && zetNummer > 1 && Threads.tactischeModus && diepte >= 12 * PLY && abs(alfa) < WINST_WAARDE
&& diepte > mijnThread->vorigeTactischeDiepte)
{
mijnThread->tactischeModusGebruikt = true;
bool tactische_zet = slagOfPromotie || geeftSchaak;
if (!tactische_zet)
{
Waarde alfa_dreiging = alfa + 5 * WAARDE_PION / 4;
st++;
st->mp_eindeLijst = (st - 1)->mp_eindeLijst;
pos.speel_null_zet();
(st + 1)->doeGeenVroegePruning = true;
waarde = search<NonPV>(pos, alfa_dreiging, alfa_dreiging + WAARDE_1, 6 * PLY, false);
(st + 1)->doeGeenVroegePruning = false;
pos.neem_null_terug();
st--;
tactische_zet = (waarde > alfa_dreiging);
}
if (tactische_zet)
{
Diepte diepte_red = diepte - diepte / 8;
waarde = mijnThread->rootZetten[mijnThread->rootZetten.find(zet)].startWaarde;
Waarde score_offset = 8 * (alfa - waarde) / (diepte / PLY + 16);
do
{
if (Signals.stop.load(std::memory_order_relaxed))
return WAARDE_0;
Waarde alfa_red = waarde + score_offset;
if (alfa_red >= alfa && diepte_red <= diepte)
break;
if (alfa_red >= alfa || diepte_red >= diepte + diepte / 8)
alfa_red = alfa;
(st + 1)->doeGeenVroegePruning = true;
waarde = -search<NonPV>(pos, -alfa_red - WAARDE_1, -alfa_red, diepte_red, true);
(st + 1)->doeGeenVroegePruning = false;
if (waarde <= alfa_red)
break;
if (waarde > alfa && diepte_red >= diepte)
{
(st + 1)->pv = pv;
(st + 1)->pv[0] = GEEN_ZET;
waarde = -search<PV>(pos, -beta, -alfa, diepte_red, false);
goto einde_zet;
}
diepte_red += PLY;
} while (true);
}