//---------------------------------------------------------------------------------------- public static int Enroques(cPosicion pos, cMov[] mlist, int mPos, color us, cInfoJaque ci, enroque Cr, bool Checks, bool Chess960) { bool KingSide = (Cr==cEnroque.OO_BLANCAS||Cr==cEnroque.OO_NEGRAS); if(pos.CanNotEnroque(Cr)||0==pos.PosibleEnrocar(Cr)) return mPos; sq kfrom = pos.GetRey(us); sq rfrom = pos.CasillaTorreEnroque(Cr); sq kto = cTypes.CasillaProxima(us, KingSide ? cCasilla.G1 : cCasilla.C1); bitbrd enemies = pos.PiezasColor(cTypes.Contrario(us)); sq K = Chess960 ? kto>kfrom ? cCasilla.OESTE : cCasilla.ESTE : KingSide ? cCasilla.OESTE : cCasilla.ESTE; for(sq s = kto; s!=kfrom; s+=K) if((pos.AtaquesA(s)&enemies)!=0) return mPos; if(Chess960&&(cBitBoard.AtaquesPieza(kto, pos.Piezas()^cBitBoard.m_nCasillas[rfrom], cPieza.TORRE)&pos.PiezasColor(cTypes.Contrario(us), cPieza.TORRE, cPieza.DAMA))!=0) return mPos; mov m = cTypes.CreaMov(kfrom, rfrom, cMovType.ENROQUE, cPieza.CABALLO); if(Checks&&!pos.IsJaque(m, ci)) return mPos; mlist[mPos++].m=m; return mPos; }
//------------------------------------------------------------------------------------ public static hash PolyglotKey(cPosicion posicion) { hash key = 0; bitbrd bitBoard = posicion.Piezas(); while (bitBoard != 0) { sq s = cBitBoard.GetLSB(ref bitBoard); pieza pc = posicion.GetPieza(s); int pieceOfs = 2 * (cTypes.TipoPieza(pc) - 1) + ((cTypes.GetColor(pc) == cColor.BLANCO) ? 1 : 0); key ^= PG[nCasillaPeon + (64 * pieceOfs + s)]; } bitBoard = (ulong)posicion.PosibleEnrocar(cEnroque.CUALQUIER_ENROQUE); while (bitBoard != 0) key ^= PG[m_nEnroque + cBitBoard.GetLSB(ref bitBoard)]; if (posicion.CasillaEnPaso() != cCasilla.NONE) key ^= PG[m_nEnPaso + cTypes.Columna(posicion.CasillaEnPaso())]; if (posicion.ColorMueve() == cColor.BLANCO) key ^= PG[m_nTurno + 0]; return key; }