From b2bdcf657d06bb6bd50d5edd1f23a47706aca3ce Mon Sep 17 00:00:00 2001 From: Valery Gourov Date: Thu, 3 Sep 2026 12:14:47 +0300 Subject: [PATCH] MoveEval.bs update --- MoveEval.bs | 47 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/MoveEval.bs b/MoveEval.bs index b80d873..b93520c 100644 --- a/MoveEval.bs +++ b/MoveEval.bs @@ -214,7 +214,7 @@ mkMoveEval = module in mkMoveRule "pawn_enpassant_left" (evalPieceIs Pawn && evalPos.rank == enPassantRank && otherHist.pawnMoved2 == Just movePos.file && evalPos.file > 0 && capturable capturePos) $ EnPassant {from=evalPos; to=movePos;}) (let capturePos = Position {rank=evalPos.rank; file=evalPos.file + 1} movePos = Position {rank=evalPos.rank `pawnDirection` 1; file=evalPos.file + 1} - in mkMoveRule "pawn_enpassant_right" (evalPieceIs Pawn && evalPos.rank == enPassantRank && otherHist.pawnMoved2 == Just movePos.file && evalPos.file > 0 && capturable capturePos) $ EnPassant {from=evalPos; to=movePos;}) + in mkMoveRule "pawn_enpassant_right" (evalPieceIs Pawn && evalPos.rank == enPassantRank && otherHist.pawnMoved2 == Just movePos.file && evalPos.file < 7 && capturable capturePos) $ EnPassant {from=evalPos; to=movePos;}) `append` map (\ d -> let pos = dispPos evalPos d in mkMoveRule "king_move" (evalPieceIs King && dispInBounds evalPos d && (open pos || capturable pos)) $ Move {from=evalPos; to=pos;}) kingMoves @@ -236,16 +236,45 @@ mkMoveEval = module in mkMoveRule "diagonal_move" cond $ Move {from=evalPos; to=pos;}) (genVector :: Vector 7 Integer)) diagonalDisps) `append` vec - (let kingPath = vec kingStartPos (Position {rank=homeRank; file=3;}) (Position {rank=homeRank; file=2;}) - between = vec (Position {rank=homeRank; file=1;}) (Position {rank=homeRank; file=2;}) (Position {rank=homeRank; file=3;}) - threat = any (isThreatened state.board state.turn) kingPath + (let rookPos = Position {rank=homeRank; file=0;} + rookPresent = selectPos board rookPos == Just (Piece {color=turn; kind=Rook;}) + kingPath = vec kingStartPos + (Position {rank=homeRank; file=3;}) + (Position {rank=homeRank; file=2;}) + between = vec (Position {rank=homeRank; file=1;}) + (Position {rank=homeRank; file=2;}) + (Position {rank=homeRank; file=3;}) + threatBoard = updatePos board kingStartPos Nothing + threat = any (isThreatened threatBoard turn) kingPath clear = all open between - in mkMoveRule "castle_queenside" (evalPos == kingStartPos && not hist.kingMoved && not hist.qRookMoved && not threat && clear) $ Castle {kingSide=False}) - (let kingPath = vec kingStartPos (Position {rank=homeRank; file=5;}) (Position {rank=homeRank; file=6;}) - between = vec (Position {rank=homeRank; file=5;}) (Position {rank=homeRank; file=6;}) - threat = any (isThreatened state.board state.turn) kingPath + in mkMoveRule "castle_queenside" + (evalPieceIs King && + evalPos == kingStartPos && + not hist.kingMoved && + not hist.qRookMoved && + rookPresent && + not threat && + clear) + $ Castle {kingSide=False}) + (let rookPos = Position {rank=homeRank; file=7;} + rookPresent = selectPos board rookPos == Just (Piece {color=turn; kind=Rook;}) + kingPath = vec kingStartPos + (Position {rank=homeRank; file=5;}) + (Position {rank=homeRank; file=6;}) + between = vec (Position {rank=homeRank; file=5;}) + (Position {rank=homeRank; file=6;}) + threatBoard = updatePos board kingStartPos Nothing + threat = any (isThreatened threatBoard turn) kingPath clear = all open between - in mkMoveRule "castle_kingside" (evalPos == kingStartPos && not hist.kingMoved && not hist.kRookMoved && not threat && clear) $ Castle {kingSide=True}) + in mkMoveRule "castle_kingside" + (evalPieceIs King && + evalPos == kingStartPos && + not hist.kingMoved && + not hist.kRookMoved && + rookPresent && + not threat && + clear) + $ Castle {kingSide=True}) moveEval <- liftM (foldr1 joinMoveRule) $ sequence moveRules