public void extract_pv_from_tt(cPosicion pos) { cPosInfo[] estate = new cPosInfo[cSearch.MAX_PLY_PLUS_6]; for (int i = 0; i < cSearch.MAX_PLY_PLUS_6; i++) estate[i] = new cPosInfo(); cTablaHashStruct tte; int st = 0; int ply = 1; mov m = m_PV[0]; val expectedScore = m_nVal; m_PV.Clear(); do { m_PV.Add(m); pos.DoMov(m_PV[ply++ - 1], estate[st++]); tte = cMotor.m_TablaHash.Buscar(pos.ClaveHash()); expectedScore = -expectedScore; } while (tte != null && expectedScore == cSearch.value_from_tt(tte.GetValue(), ply) && pos.IsPseudoLegalMov(m = tte.GetMove()) && pos.IsLegalMov(m, pos.pinned_pieces(pos.ColorMueve())) && ply < cSearch.MAX_PLY && (!pos.IsTablas() || ply <= 2)); m_PV.Add(cMovType.MOV_NAN); while (--ply != 0) pos.DesMov(m_PV[ply - 1]); }