]> code.delx.au - gnu-emacs-elpa/blobdiff - chess-network.el
Try to improve the promotion situation on ICS by allowing chess-ply to query for...
[gnu-emacs-elpa] / chess-network.el
index ed1c5128f2b1ef7a24337fc593307dd3d5bba69a..efc9d280a403fe64cef8d5aa9db307e4764e5344 100644 (file)
@@ -52,7 +52,7 @@
         (function
          (lambda ()
            (funcall chess-engine-response-handler 'undo
-                    (string-to-int (match-string 1))))))
+                    (string-to-number (match-string 1))))))
    (cons "accept\\(\\s-+\\(.+\\)\\)?$"
         (function
          (lambda ()
         (function
          (lambda ()
            (funcall chess-engine-response-handler 'illegal))))
-   (cons "call flag$"
+   (cons "flag$"
         (function
          (lambda ()
            (funcall chess-engine-response-handler 'call-flag))))
+   (cons "forfeit$"
+        (function
+         (lambda ()
+           (funcall chess-engine-response-handler 'flag-fell))))
    (cons "kibitz\\s-+\\(.+\\)$"
         (function
          (lambda ()
@@ -88,7 +92,7 @@
 (chess-message-catalog 'english
   '((network-starting  . "Starting network client/server...")
     (network-waiting   . "Now waiting for your opponent to connect...")
-    (network-connected ."You have connected; pass now or make your move.")))
+    (takeback-sent     . "Sent request to undo %d ply(s) to your opponent")))
 
 (defun chess-network-flatten-multiline (str)
   (while (string-match "\n" str)
     (setq str (replace-match "\n" t t str)))
   str)
 
+(defvar chess-network-kind)
+(make-variable-buffer-local 'chess-network-kind)
+
 (defun chess-network-handler (game event &rest args)
   "Initialize the network chess engine."
   (unless chess-engine-handling-event
                  (if (fboundp 'open-network-stream-server)
                      (open-network-stream-server "*chess-network*"
                                                  (current-buffer)
-                                                 (read-string "Port: "))
+                                                 (string-to-number
+                                                  (read-string "Port: ")))
                    (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)
-           (chess-message 'network-waiting)
-         (chess-network-handler 'match)
-         (chess-message 'network-connected))
+       (setq chess-engine-process proc
+             chess-network-kind (if (eq which ?s) 'server 'client))
        t))
 
-     ((eq event 'ready))               ; don't set active yet
+     ((eq event 'ready)                        ; don't set active yet
+      (chess-game-run-hooks game 'announce-autosave)
+      (if (eq chess-network-kind 'server)
+         (chess-message 'network-waiting)
+       (chess-network-handler game 'match)))
 
      ((eq event 'setup-pos)
       (chess-engine-send nil (format "fen %s\n"
       (setq chess-engine-pending-offer 'match)
       (chess-engine-send nil (format "chess match %s\n" chess-full-name)))
 
-     ((eq event 'resign)
-      (chess-engine-send nil "resign\n")
-      (chess-game-set-data game 'active nil))
-
      ((eq event 'draw)
       (if chess-engine-pending-offer
          (chess-engine-command nil 'retract))
          (chess-engine-command nil 'retract))
       (setq chess-engine-pending-offer 'undo
            chess-engine-pending-arg (car args))
-      (chess-engine-send nil (format "takeback %d\n" (car args))))
+
+      (chess-engine-send nil (format "takeback %d\n" (car args)))
+      (chess-message 'takeback-sent (car args)))
 
      ((eq event 'accept)
-      (chess-engine-send nil "accept\n"))
+      (chess-engine-send nil (if (car args)
+                                (format "accept %s\n" (car args))
+                              "accept\n")))
 
      ((eq event 'decline)
       (chess-engine-send nil "decline\n"))
       (chess-engine-send nil "illegal\n"))
 
      ((eq event 'call-flag)
-      (chess-engine-send nil "call flag\n"))
+      (chess-engine-send nil "flag\n"))
 
      ((eq event 'kibitz)
       (chess-engine-send nil (format "kibitz %s\n"
      ((eq event 'set-index)
       (chess-engine-send nil (format "index %d\n" (car args))))
 
+     ((eq event 'flag-fell)
+      (chess-engine-send nil "forfeit\n")
+      (chess-common-handler game 'flag-fell))
+
      (t
       (apply 'chess-common-handler game event args)))))