/usr/share/emacs/site-lisp/chess/chess-gnuchess.el is in emacs-chess 2.0b6-1.1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Play against gnuchess!
;;
(require 'chess-common)
(defgroup chess-gnuchess nil
"The publically available chess engine 'gnuchess'."
:group 'chess-engine)
(defcustom chess-gnuchess-path (let ((exec-path (cons "/usr/games" exec-path)))
(executable-find "gnuchess"))
"*The path to the gnuchess executable."
:type 'file
:group 'chess-gnuchess)
(defvar chess-gnuchess-bad-board nil)
(make-variable-buffer-local 'chess-gnuchess-bad-board)
(defvar chess-gnuchess-regexp-alist
(list
(cons (concat "My move is : \\(" chess-algebraic-regexp "\\)")
(function
(lambda ()
(funcall chess-engine-response-handler 'move
(chess-engine-convert-algebraic (match-string 1) t)))))
(cons "Illegal move:"
(function
(lambda ()
(chess-error 'illegal-move))))
(cons "Board is wrong!"
(function
(lambda ()
;; gnuchess didn't like the given position, which
;; means it won't play against it unless we send a
;; "go" after the user's move
(setq chess-gnuchess-bad-board t))))))
(defun chess-gnuchess-handler (game event &rest args)
(unless chess-engine-handling-event
(cond
((eq event 'initialize)
(let ((proc (chess-common-handler game 'initialize "gnuchess")))
(when (and proc (processp proc)
(eq (process-status proc) 'run))
(process-send-string proc "nopost\n")
(setq chess-engine-process proc
chess-engine-opponent-name "GnuChess")
t)))
((eq event 'setup-pos)
(let ((file (chess-with-temp-file
(insert (chess-pos-to-string (car args)) ?\n))))
(chess-engine-send nil (format "epdload %s\n" file))))
((eq event 'setup-game)
(if (zerop (chess-game-index (car args)))
(chess-gnuchess-handler game 'setup-pos (chess-game-pos game 0))
(let ((file (chess-with-temp-file
(insert (chess-game-to-string (car args)) ?\n))))
(chess-engine-send nil (format "pgnload %s\n" file)))))
((eq event 'pass)
(chess-engine-send nil (concat (if (chess-pos-side-to-move
(chess-engine-position nil))
"white" "black")
"\n"))
(chess-engine-send nil "go\n")
(setq chess-gnuchess-bad-board nil))
((eq event 'move)
(chess-common-handler game 'move (car args))
(when chess-gnuchess-bad-board
(chess-engine-send nil "go\n")
(setq chess-gnuchess-bad-board nil)))
(t
(apply 'chess-common-handler game event args)))))
(provide 'chess-gnuchess)
;;; chess-gnuchess.el ends here
|