summaryrefslogtreecommitdiff
path: root/chess-uci.el
diff options
context:
space:
mode:
authorMario Lang <mlang@delysid.org>2014-03-24 01:58:43 +0100
committerMario Lang <mlang@delysid.org>2014-03-24 01:58:43 +0100
commit1c1607589eadf378812f1dbfd18b2826cf921db0 (patch)
treed567d220af14740e596114378ce36c22a79ec61a /chess-uci.el
parent69b3e6329652da55900ca40f5e72f12138c6330e (diff)
(incomplete) support for the stockfish engine.
Diffstat (limited to 'chess-uci.el')
-rw-r--r--chess-uci.el62
1 files changed, 62 insertions, 0 deletions
diff --git a/chess-uci.el b/chess-uci.el
new file mode 100644
index 0000000..befdaaa
--- /dev/null
+++ b/chess-uci.el
@@ -0,0 +1,62 @@
+;;; chess-uci.el --- Universal chess interface protocol for emacs-chess
+
+;; Copyright (C) 2014 Free Software Foundation, Inc.
+
+;; Author: Mario Lang <mlang@delysid.org>
+;; Keywords: games
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to
+;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
+
+(require 'chess-common)
+
+(defvar chess-uci-move-regexp "[a-h][1-8][a-h][1-8][nbrq]?"
+ "A regular expression matching a UCI move.")
+
+(defun chess-uci-position (game)
+ (concat "position fen " (chess-pos-to-fen (chess-game-pos game 0) t)
+ " moves " (mapconcat (lambda (ply)
+ (let ((source (chess-ply-source ply))
+ (target (chess-ply-target ply)))
+ (if (and source target)
+ (concat (chess-index-to-coord source)
+ (chess-index-to-coord target)
+ (if (chess-ply-keyword ply :promote)
+ (string (downcase (chess-ply-keyword ply :promote)))
+ ""))
+ "")))
+ (chess-game-plies game) " ")
+ "\n"))
+
+(defun chess-uci-handler (game event &rest args)
+ (unless chess-engine-handling-event
+ (cond
+ ((eq event 'move)
+ (when (= 1 (chess-game-index game))
+ (chess-game-set-tag game "White" chess-full-name)
+ (chess-game-set-tag game "Black" chess-engine-opponent-name))
+
+ (chess-engine-send nil (concat (chess-uci-position game) "go\n"))
+ (if (chess-game-over-p game)
+ (chess-game-set-data game 'active nil)))
+
+ (t
+ (apply 'chess-common-handler game event args)))))
+
+(provide 'chess-uci)
+
+;;; chess-uci.el ends here