]> code.delx.au - gnu-emacs-elpa/commitdiff
More UCI engines: fruit and glaurung.
authorMario Lang <mlang@delysid.org>
Mon, 24 Mar 2014 09:08:02 +0000 (10:08 +0100)
committerMario Lang <mlang@delysid.org>
Mon, 24 Mar 2014 09:08:02 +0000 (10:08 +0100)
chess-fruit.el [new file with mode: 0644]
chess-glaurung.el [new file with mode: 0644]
chess.el

diff --git a/chess-fruit.el b/chess-fruit.el
new file mode 100644 (file)
index 0000000..1067470
--- /dev/null
@@ -0,0 +1,68 @@
+;;; chess-fruit.el --- Play against fruit!
+
+;; 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-uci)
+
+(defgroup chess-fruit nil
+  "The publically available chess engine 'fruit'."
+  :group 'chess-engine
+  :link '(url-link "http://www.fruitchess.com/"))
+
+(defcustom chess-fruit-path (executable-find "fruit")
+  "*The path to the fruit executable."
+  :type 'file
+  :group 'chess-fruit)
+
+(defvar chess-fruit-regexp-alist
+  (list
+   (cons (concat "^bestmove\\s-+\\(" chess-algebraic-regexp "\\)")
+        (function
+         (lambda ()
+           (funcall chess-engine-response-handler 'move
+                    (chess-engine-convert-algebraic (match-string 1) t)))))
+   (cons "^id\\s-+name\\s-+\\(.+\\)$"
+        (function
+         (lambda ()
+           (setq-local chess-engine-opponent-name (match-string 1)))))))
+
+(defun chess-fruit-handler (game event &rest args)
+  (unless chess-engine-handling-event
+    (cond
+     ((eq event 'initialize)
+      (let ((proc (chess-uci-handler game 'initialize "fruit")))
+       (when (and proc (processp proc) (eq (process-status proc) 'run))
+         (process-send-string proc "uci\n")
+         (setq chess-engine-process proc)
+         t)))
+
+     (t
+      (if (and (eq event 'undo)
+              (= 1 (mod (car args) 2)))
+         (error "Cannot undo until after fruit moves"))
+
+      (apply 'chess-uci-handler game event args)))))
+
+(provide 'chess-fruit)
+
+;;; chess-fruit.el ends here
diff --git a/chess-glaurung.el b/chess-glaurung.el
new file mode 100644 (file)
index 0000000..5ce6042
--- /dev/null
@@ -0,0 +1,68 @@
+;;; chess-glaurung.el --- Play against glaurung!
+
+;; 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-uci)
+
+(defgroup chess-glaurung nil
+  "The publically available chess engine 'glaurung'."
+  :group 'chess-engine
+  :link '(url-link "http://www.glaurungchess.com/"))
+
+(defcustom chess-glaurung-path (executable-find "glaurung")
+  "*The path to the glaurung executable."
+  :type 'file
+  :group 'chess-glaurung)
+
+(defvar chess-glaurung-regexp-alist
+  (list
+   (cons (concat "^bestmove\\s-+\\(" chess-algebraic-regexp "\\)")
+        (function
+         (lambda ()
+           (funcall chess-engine-response-handler 'move
+                    (chess-engine-convert-algebraic (match-string 1) t)))))
+   (cons "^id\\s-+name\\s-+\\(.+\\)$"
+        (function
+         (lambda ()
+           (setq-local chess-engine-opponent-name (match-string 1)))))))
+
+(defun chess-glaurung-handler (game event &rest args)
+  (unless chess-engine-handling-event
+    (cond
+     ((eq event 'initialize)
+      (let ((proc (chess-uci-handler game 'initialize "glaurung")))
+       (when (and proc (processp proc) (eq (process-status proc) 'run))
+         (process-send-string proc "uci\n")
+         (setq chess-engine-process proc)
+         t)))
+
+     (t
+      (if (and (eq event 'undo)
+              (= 1 (mod (car args) 2)))
+         (error "Cannot undo until after glaurung moves"))
+
+      (apply 'chess-uci-handler game event args)))))
+
+(provide 'chess-glaurung)
+
+;;; chess-glaurung.el ends here
index da0a45242e442539dbb9ef1d8be674a64fe0163f..541715db52562c8e7496c93ba4ef8f44adf67c4d 100644 (file)
--- a/chess.el
+++ b/chess.el
@@ -107,7 +107,10 @@ These can do just about anything."
   :group 'chess)
 
 (defcustom chess-default-engine
-  '(chess-crafty chess-gnuchess chess-phalanx chess-ai)
+  '(chess-crafty
+    chess-stockfish chess-glaurung chess-fruit
+    chess-gnuchess chess-phalanx
+    chess-ai)
   "Default engine to be used when starting a chess session.
 A list indicates a series of alternatives if the first engine is not
 available."
@@ -158,7 +161,7 @@ If an element of MODULE-LIST is a sublist, treat it as alternatives."
          (while module
            (if (setq object (condition-case nil
                                 (apply create-func (car module) args)
-                              ((error nil))))
+                              (error nil)))
                (progn
                  (push object objects)
                  (setq module nil))