diff options
Diffstat (limited to 'chess-network.el')
| -rw-r--r-- | chess-network.el | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/chess-network.el b/chess-network.el new file mode 100644 index 0000000..f2dedb2 --- /dev/null +++ b/chess-network.el @@ -0,0 +1,89 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Play against an opponent over the network +;; +;; $Revision$ + +(require 'chess-engine) +(require 'chess-fen) +(require 'chess-algebraic) + +(defvar chess-network-now-moving nil) + +(defvar chess-network-regexp-alist + (list (cons (concat "\\(Black\\|White\\):\\s-*" + chess-algebraic-regexp "\\s-+") + 'chess-network-perform-move) + (cons "PASS" + (function + (lambda () + (message "Your opponent has passed the move to you")))) + (cons "CONNECT\\s-+\\(.*\\)" + (function + (lambda () + ;; jww (2002-04-07): Set the appropriate Black or + ;; White tag at this point + (message "Your opponent, %s, has connected" + (match-string 1))))) + (cons "SETBOARD\\s-+\\(.*\\)" + (function + (lambda () + (let* ((position (chess-fen-to-pos (match-string 1))) + (ply (chess-ply-create position))) + (chess-game-set-plies (chess-engine-game nil) + (list ply)))))))) + +(defun chess-network-perform-move () + (let ((position (chess-engine-position nil)) + (move (match-string 2)) ply) + (when (string= (if (chess-pos-side-to-move position) + "White" "Black") + (match-string 1)) + (setq ply (chess-algebraic-to-ply position move)) + (unless ply + (error "Could not convert engine move: %s" move)) + (let ((chess-network-now-moving t)) + (funcall chess-engine-response-handler 'move ply))))) + +(defun chess-network-handler (event &rest args) + "Initialize the network chess engine." + (cond + ((eq event 'initialize) + (let ((which (read-char "cAre you the c)lient or s)erver? ")) + proc) + (message "Starting network client/server...") + (setq proc (if (eq which ?s) + (start-process "*chess-network*" + (current-buffer) "/usr/bin/nc" + "-l" "-p" (read-string "Port: ")) + (open-network-stream "*chess-network*" (current-buffer) + (read-string "Host: ") + (read-string "Port: ")))) + (if (eq which ?s) + (message "Now waiting for your opponent to connect...") + (process-send-string proc (format "CONNECT %s\n" (user-full-name))) + (message "You have connected; pass now or make your move.")) + proc)) + + ((eq event 'shutdown) + (chess-engine-send nil "QUIT\n")) + + ((eq event 'setup) + (chess-engine-send nil (format "SETBOARD %s\n" + (chess-pos-to-fen (car args))))) + + ((eq event 'pass) + (chess-engine-send nil "PASS\n")) + + ((eq event 'move) + (unless chess-network-now-moving + (chess-engine-send + nil (concat (if (chess-pos-side-to-move (chess-ply-pos (car args))) + "White:" + "Black:") + (chess-ply-to-algebraic (car args)) + "\n")))))) + +(provide 'chess-network) + +;;; chess-network.el ends here |
