From c3acf44ac8dce310b1d599071fb1ace1ed39671d Mon Sep 17 00:00:00 2001 From: Peter Osterlund Date: Thu, 3 Jul 2014 09:22:16 +0000 Subject: [PATCH] DroidFish: Workaround for GTB en passant probing bug. --- .../petero/droidfish/gamelogic/MoveGen.java | 2 +- .../src/org/petero/droidfish/gtb/Probe.java | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/DroidFish/src/org/petero/droidfish/gamelogic/MoveGen.java b/DroidFish/src/org/petero/droidfish/gamelogic/MoveGen.java index dadcd96..7852ab0 100644 --- a/DroidFish/src/org/petero/droidfish/gamelogic/MoveGen.java +++ b/DroidFish/src/org/petero/droidfish/gamelogic/MoveGen.java @@ -26,7 +26,7 @@ import java.util.ArrayList; * @author petero */ public class MoveGen { - static MoveGen instance; + public static MoveGen instance; static { instance = new MoveGen(); } diff --git a/DroidFish/src/org/petero/droidfish/gtb/Probe.java b/DroidFish/src/org/petero/droidfish/gtb/Probe.java index 059229d..6b785b2 100644 --- a/DroidFish/src/org/petero/droidfish/gtb/Probe.java +++ b/DroidFish/src/org/petero/droidfish/gtb/Probe.java @@ -72,6 +72,39 @@ public class Probe { * @return True if success. */ public final ProbeResult probeHard(Position pos) { + ProbeResult ret = probeHardRaw(pos); + if (ret.result == ProbeResult.DRAW && pos.getEpSquare() != -1) { + ArrayList moveList = MoveGen.instance.legalMoves(pos); + int pawn = pos.whiteMove ? Piece.WPAWN : Piece.BPAWN; + int maxMate = -1; + UndoInfo ui = new UndoInfo(); + for (Move move : moveList) { + if ((move.to != pos.getEpSquare()) || (pos.getPiece(move.from) != pawn)) + return ret; + pos.makeMove(move, ui); + ProbeResult ret2 = probeHard(pos); + pos.unMakeMove(move, ui); + switch (ret2.result) { + case ProbeResult.DRAW: + break; + case ProbeResult.WMATE: + case ProbeResult.BMATE: + maxMate = Math.max(maxMate, ret2.movesToMate); + break; + case ProbeResult.UNKNOWN: + ret.result = ProbeResult.UNKNOWN; + return ret; + } + } + if (maxMate != -1) { + ret.result = pos.whiteMove ? ProbeResult.BMATE : ProbeResult.WMATE; + ret.movesToMate = maxMate; + } + } + return ret; + } + + private final ProbeResult probeHardRaw(Position pos) { int castleMask = 0; if (pos.a1Castle()) castleMask |= GtbProbe.A1_CASTLE; if (pos.h1Castle()) castleMask |= GtbProbe.H1_CASTLE;