From 4a9bcb8a2191c209016f669e3877728488a05d70 Mon Sep 17 00:00:00 2001 From: Peter Osterlund Date: Sun, 13 Nov 2016 03:34:02 +0100 Subject: [PATCH] DroidFish: Added setting to control when ECO codes are displayed. --- DroidFish/res/values/strings.xml | 12 +++++++ DroidFish/res/xml/preferences.xml | 8 +++++ .../src/org/petero/droidfish/DroidFish.java | 13 +++++-- .../org/petero/droidfish/GUIInterface.java | 1 + .../src/org/petero/droidfish/book/EcoDb.java | 7 ++-- .../gamelogic/DroidChessController.java | 21 ++++++++--- .../droidfish/gamelogic/SearchListener.java | 3 +- .../org/petero/droidfish/book/EcoTest.java | 36 +++++++++---------- 8 files changed, 72 insertions(+), 29 deletions(-) diff --git a/DroidFish/res/values/strings.xml b/DroidFish/res/values/strings.xml index 7c9b5d9..375afa6 100644 --- a/DroidFish/res/values/strings.xml +++ b/DroidFish/res/values/strings.xml @@ -282,6 +282,8 @@ you are not actively using the program.\ Display opening book move hints for human player Use Arrows Use arrows to display moves on chess board + Show ECO codes + Show \'Encyclopedia of Chess Openings\' classification of openings Appearance Behavior Animate Moves @@ -590,6 +592,16 @@ you are not actively using the program.\ 16 21 + + Off + Auto + Always + + + 0 + 1 + 2 + No arrows Max 1 Arrow diff --git a/DroidFish/res/xml/preferences.xml b/DroidFish/res/xml/preferences.xml index c16a696..36d92c8 100644 --- a/DroidFish/res/xml/preferences.xml +++ b/DroidFish/res/xml/preferences.xml @@ -71,6 +71,14 @@ android:summary="@string/prefs_bookHints_summary" android:defaultValue="true"> + + > pvMoves = new ArrayList>(); private ArrayList bookMoves = null; @@ -1959,6 +1966,7 @@ public class DroidFish extends Activity thinkingStr2 = ti.statStr; bookInfoStr = ti.bookInfo; ecoInfoStr = ti.eco; + ecoInTree = ti.ecoInTree; pvMoves = ti.pvMoves; bookMoves = ti.bookMoves; updateThinkingInfo(); @@ -1987,13 +1995,14 @@ public class DroidFish extends Activity } thinking.setText(s, TextView.BufferType.SPANNABLE); } - if (mShowBookHints && !ecoInfoStr.isEmpty()) { + if ((mEcoHints == ECO_HINTS_ALWAYS || (mEcoHints == ECO_HINTS_AUTO && ecoInTree)) && + !ecoInfoStr.isEmpty()) { String s = thinkingEmpty ? "" : "
"; s += ecoInfoStr; thinking.append(Html.fromHtml(s)); thinkingEmpty = false; } - if (mShowBookHints && !bookInfoStr.isEmpty()) { + if (mShowBookHints && !bookInfoStr.isEmpty() && ctrl.humansTurn()) { String s = thinkingEmpty ? "" : "
"; s += Util.boldStart + getString(R.string.book) + Util.boldStop + bookInfoStr; thinking.append(Html.fromHtml(s)); diff --git a/DroidFish/src/org/petero/droidfish/GUIInterface.java b/DroidFish/src/org/petero/droidfish/GUIInterface.java index 12df593..15c9354 100644 --- a/DroidFish/src/org/petero/droidfish/GUIInterface.java +++ b/DroidFish/src/org/petero/droidfish/GUIInterface.java @@ -60,6 +60,7 @@ public interface GUIInterface { public ArrayList> pvMoves; public ArrayList bookMoves; public String eco; + public boolean ecoInTree; } /** Update the computer thinking information. */ diff --git a/DroidFish/src/org/petero/droidfish/book/EcoDb.java b/DroidFish/src/org/petero/droidfish/book/EcoDb.java index b4a66de..b2d0893 100644 --- a/DroidFish/src/org/petero/droidfish/book/EcoDb.java +++ b/DroidFish/src/org/petero/droidfish/book/EcoDb.java @@ -31,6 +31,7 @@ import java.util.WeakHashMap; import org.petero.droidfish.gamelogic.ChessParseError; import org.petero.droidfish.gamelogic.GameTree; import org.petero.droidfish.gamelogic.Move; +import org.petero.droidfish.gamelogic.Pair; import org.petero.droidfish.gamelogic.Position; import org.petero.droidfish.gamelogic.TextIO; import org.petero.droidfish.gamelogic.UndoInfo; @@ -49,7 +50,7 @@ public class EcoDb { } /** Get ECO classification for a given tree node. */ - public String getEco(GameTree gt, GameTree.Node node) { + public Pair getEco(GameTree gt, GameTree.Node node) { ArrayList gtNodePath = new ArrayList(); int nodeIdx = -1; boolean inEcoTree = true; @@ -94,9 +95,9 @@ public class EcoDb { if (nodeIdx != -1) { Node n = readNode(nodeIdx); if (n.nameIdx >= 0) - return ecoNames[n.nameIdx]; + return new Pair(ecoNames[n.nameIdx], inEcoTree); } - return ""; + return new Pair("", false); } diff --git a/DroidFish/src/org/petero/droidfish/gamelogic/DroidChessController.java b/DroidFish/src/org/petero/droidfish/gamelogic/DroidChessController.java index 0600c9f..c7085ef 100644 --- a/DroidFish/src/org/petero/droidfish/gamelogic/DroidChessController.java +++ b/DroidFish/src/org/petero/droidfish/gamelogic/DroidChessController.java @@ -684,6 +684,7 @@ public class DroidChessController { private String bookInfo = ""; private ArrayList bookMoves = null; private String eco = ""; // ECO classification + private boolean ecoInTree = false; // True if current position is inside the EcoDB tree private Move ponderMove = null; private ArrayList pvInfoV = new ArrayList(); @@ -697,6 +698,7 @@ public class DroidChessController { bookInfo = ""; bookMoves = null; eco = ""; + ecoInTree = false; setSearchInfo(id); } @@ -787,6 +789,7 @@ public class DroidChessController { ti.statStr = statStr; ti.bookInfo = bookInfo; ti.eco = eco; + ti.ecoInTree = ecoInTree; ti.pvMoves = pvMoves; ti.bookMoves = bookMoves; latestThinkingInfo = ti; @@ -860,10 +863,11 @@ public class DroidChessController { @Override public void notifyBookInfo(int id, String bookInfo, ArrayList moveList, - String eco) { + String eco, boolean ecoInTree) { this.bookInfo = bookInfo; bookMoves = moveList; this.eco = eco; + this.ecoInTree = ecoInTree; setSearchInfo(id); } @@ -925,10 +929,13 @@ public class DroidChessController { } private final void updateBookHints() { - if (humansTurn()) { + if (game != null) { Pair> bi = computerPlayer.getBookHints(game.currPos(), localPt()); - String eco = EcoDb.getInstance(gui.getContext()).getEco(game.tree, game.tree.currentNode); - listener.notifyBookInfo(searchId, bi.first, bi.second, eco); + Pair ecoData = + EcoDb.getInstance(gui.getContext()).getEco(game.tree, game.tree.currentNode); + String eco = ecoData.first; + boolean ecoInTree = ecoData.second; + listener.notifyBookInfo(searchId, bi.first, bi.second, eco, ecoInTree); } } @@ -968,7 +975,11 @@ public class DroidChessController { computerPlayer.queueAnalyzeRequest(sr); } else if (computersTurn || ponder) { listener.clearSearchInfo(searchId); - listener.notifyBookInfo(searchId, "", null, ""); + Pair ecoData = + EcoDb.getInstance(gui.getContext()).getEco(game.tree, game.tree.currentNode); + String eco = ecoData.first; + boolean ecoInTree = ecoData.second; + listener.notifyBookInfo(searchId, "", null, eco, ecoInTree); final Pair> ph = game.getUCIHistory(); Position currPos = new Position(game.currPos()); long now = System.currentTimeMillis(); diff --git a/DroidFish/src/org/petero/droidfish/gamelogic/SearchListener.java b/DroidFish/src/org/petero/droidfish/gamelogic/SearchListener.java index 68c5ed4..a3e5ed4 100644 --- a/DroidFish/src/org/petero/droidfish/gamelogic/SearchListener.java +++ b/DroidFish/src/org/petero/droidfish/gamelogic/SearchListener.java @@ -71,7 +71,8 @@ public interface SearchListener { public void notifyStats(int id, long nodes, int nps, long tbHits, int hash, int time); /** Report opening book information. */ - public void notifyBookInfo(int id, String bookInfo, ArrayList moveList, String eco); + public void notifyBookInfo(int id, String bookInfo, ArrayList moveList, + String eco, boolean ecoInTree); /** Report move (or command, such as "resign") played by the engine. */ public void notifySearchResult(int id, String cmd, Move ponder); diff --git a/DroidFishTest/src/org/petero/droidfish/book/EcoTest.java b/DroidFishTest/src/org/petero/droidfish/book/EcoTest.java index 07ef58f..c7c990e 100644 --- a/DroidFishTest/src/org/petero/droidfish/book/EcoTest.java +++ b/DroidFishTest/src/org/petero/droidfish/book/EcoTest.java @@ -36,27 +36,27 @@ public class EcoTest extends AndroidTestCase { { String pgn = "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1"; GameTree gt = readPGN(pgn); - String eco = ecoDb.getEco(gt, gt.currentNode); + String eco = ecoDb.getEco(gt, gt.currentNode).first; assertEquals("", eco); gt.goForward(0); - eco = ecoDb.getEco(gt, gt.currentNode); + eco = ecoDb.getEco(gt, gt.currentNode).first; assertEquals("B00: King's pawn opening", eco); gt.goForward(0); - eco = ecoDb.getEco(gt, gt.currentNode); + eco = ecoDb.getEco(gt, gt.currentNode).first; assertEquals("C20: King's pawn game", eco); gt.goForward(0); - eco = ecoDb.getEco(gt, gt.currentNode); + eco = ecoDb.getEco(gt, gt.currentNode).first; assertEquals("C40: King's knight opening", eco); gt.goForward(0); - eco = ecoDb.getEco(gt, gt.currentNode); + eco = ecoDb.getEco(gt, gt.currentNode).first; assertEquals("C44: King's pawn game", eco); gt.goForward(0); - eco = ecoDb.getEco(gt, gt.currentNode); + eco = ecoDb.getEco(gt, gt.currentNode).first; assertEquals("C60: Ruy Lopez (Spanish opening)", eco); } { @@ -65,48 +65,48 @@ public class EcoTest extends AndroidTestCase { game.processString("e5"); game.processString("Nf3"); game.processString("Nf6"); - String eco = ecoDb.getEco(game.tree, game.tree.currentNode); + String eco = ecoDb.getEco(game.tree, game.tree.currentNode).first; assertEquals("C42: Petrov's defence", eco); game.processString("Nxe5"); - eco = ecoDb.getEco(game.tree, game.tree.currentNode); + eco = ecoDb.getEco(game.tree, game.tree.currentNode).first; assertEquals("C42: Petrov's defence", eco); game.processString("d6"); - eco = ecoDb.getEco(game.tree, game.tree.currentNode); + eco = ecoDb.getEco(game.tree, game.tree.currentNode).first; assertEquals("C42: Petrov's defence", eco); game.processString("Nxf7"); - eco = ecoDb.getEco(game.tree, game.tree.currentNode); + eco = ecoDb.getEco(game.tree, game.tree.currentNode).first; assertEquals("C42: Petrov, Cochrane gambit", eco); game.undoMove(); - eco = ecoDb.getEco(game.tree, game.tree.currentNode); + eco = ecoDb.getEco(game.tree, game.tree.currentNode).first; assertEquals("C42: Petrov's defence", eco); game.processString("Nf3"); game.processString("Nxe4"); game.processString("d4"); - eco = ecoDb.getEco(game.tree, game.tree.currentNode); + eco = ecoDb.getEco(game.tree, game.tree.currentNode).first; assertEquals("C42: Petrov, classical attack", eco); } { Game game = new Game(null, new TimeControlData()); game.processString("e4"); game.processString("c5"); - String eco = ecoDb.getEco(game.tree, game.tree.currentNode); + String eco = ecoDb.getEco(game.tree, game.tree.currentNode).first; assertEquals("B20: Sicilian defence", eco); game.processString("h3"); - eco = ecoDb.getEco(game.tree, game.tree.currentNode); + eco = ecoDb.getEco(game.tree, game.tree.currentNode).first; assertEquals("B20: Sicilian defence", eco); game.processString("Nc6"); - eco = ecoDb.getEco(game.tree, game.tree.currentNode); + eco = ecoDb.getEco(game.tree, game.tree.currentNode).first; assertEquals("B20: Sicilian defence", eco); game.processString("g3"); - eco = ecoDb.getEco(game.tree, game.tree.currentNode); + eco = ecoDb.getEco(game.tree, game.tree.currentNode).first; assertEquals("B20: Sicilian defence", eco); } } @@ -114,11 +114,11 @@ public class EcoTest extends AndroidTestCase { public void testEcoFromFEN() throws Throwable { EcoDb ecoDb = EcoDb.getInstance(getContext()); GameTree gt = gtFromFEN("rnbqkbnr/ppp2ppp/8/3p4/3P4/8/PPP2PPP/RNBQKBNR w KQkq - 0 4"); - String eco = ecoDb.getEco(gt, gt.currentNode); + String eco = ecoDb.getEco(gt, gt.currentNode).first; assertEquals("C01: French, exchange variation", eco); gt = gtFromFEN("rnbqk1nr/ppppppbp/6p1/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - 1 3"); - eco = ecoDb.getEco(gt, gt.currentNode); + eco = ecoDb.getEco(gt, gt.currentNode).first; assertEquals("B06: Robatsch (modern) defence", eco); }