private void AddMove(ICollection <Move> moves, Piece piece, Square from, Square to, Piece promoted, EMoveType type = EMoveType.Quiet) { Move move; if (type.HasFlagFast(EMoveType.Capture)) { move = new Move(piece, Position.GetPiece(to), from, to, type, promoted); } else if (type.HasFlagFast(EMoveType.Epcapture)) { move = new Move(piece, EPieceType.Pawn.MakePiece(~SideToMove), from, to, type, promoted); } else { move = new Move(piece, from, to, type, promoted); } // check if move is actual a legal move if the flag is enabled if (Flags.HasFlagFast(Emgf.Legalmoves) && !IsLegal(move, piece, from, type)) { return; } moves.Add(move); }
private static void AddMove(this IPosition pos, MoveList moves, Piece piece, Square from, Square to, Piece promoted, Emgf flags, EMoveType type = EMoveType.Quiet) { Move move; if (type.HasFlagFast(EMoveType.Capture)) { move = new Move(piece, pos.GetPiece(to), from, to, type, promoted); } else if (type.HasFlagFast(EMoveType.Epcapture)) { move = new Move(piece, EPieceType.Pawn.MakePiece(~pos.State.SideToMove), from, to, type, promoted); } else { move = new Move(piece, from, to, type, promoted); } // check if move is actual a legal move if the flag is enabled if (flags.HasFlagFast(Emgf.Legalmoves) && !pos.IsLegal(move, piece, from, type)) { return; } moves.Add(move); }
/// <summary> /// Determine if a move is legal or not, by performing the move and checking if the king is under attack afterwards. /// </summary> /// <param name="move">The move to check</param> /// <param name="piece">The moving piece</param> /// <param name="from">The from square</param> /// <param name="type">The move type</param> /// <returns>true if legal, otherwise false</returns> public bool IsLegal(Move move, Piece piece, Square from, EMoveType type) { if (!InCheck && piece.Type() != EPieceType.King && (Pinned & from).Empty() && !type.HasFlagFast(EMoveType.Epcapture)) { return(true); } Position.IsProbing = true; Position.MakeMove(move); var opponentAttacking = Position.IsAttacked(Position.KingSquares[SideToMove.Side], ~SideToMove); Position.TakeMove(move); Position.IsProbing = false; return(!opponentAttacking); }