X-Git-Url: http://cgit.sxemacs.org/?p=riece;a=blobdiff_plain;f=lisp%2Friece-hangman.el;h=426935ecf8cab50c74768c1ab0796135e9dc27c2;hp=8811e09b622742ad5e07b70f8137fc434826302d;hb=5a45c8b53ddb25f03bdab9f3491a92c064c47c7a;hpb=93cc8b9f10b1b3e74d76de99a0e1e476b1ce0a11;ds=sidebyside diff --git a/lisp/riece-hangman.el b/lisp/riece-hangman.el index 8811e09..426935e 100644 --- a/lisp/riece-hangman.el +++ b/lisp/riece-hangman.el @@ -1,4 +1,4 @@ -;;; riece-hangman.el --- hangman +;;; riece-hangman.el --- allow channel members to play the hangman game ;; Copyright (C) 1998-2004 Daiki Ueno ;; Author: Daiki Ueno @@ -18,13 +18,12 @@ ;; 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. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: -;; To use, add the following line to your ~/.riece/init.el: -;; (add-to-list 'riece-addons 'riece-hangman t) +;; NOTE: This is an add-on module for Riece. ;;; Code: @@ -34,16 +33,16 @@ (require 'riece-server) (defgroup riece-hangman nil - "Interface to hangman.el" + "Allow channel members to play the hangman game." :prefix "riece-" :group 'riece) -(defcustom riece-hangman-hello-regexp "^, hangman" +(defcustom riece-hangman-hello-regexp "^,hangman$" "Pattern of string to start the game." :type 'string :group 'riece-hangman) -(defcustom riece-hangman-bye-regexp "^, bye hangman" +(defcustom riece-hangman-bye-regexp "^,hangman bye$" "Pattern of string to end the game." :type 'string :group 'riece-hangman) @@ -53,42 +52,57 @@ :type 'file :group 'riece-hangman) -(defvar riece-hangman-players nil) +(defvar riece-hangman-player-context-alist nil) (defvar riece-hangman-words-buffer nil) +(defconst riece-hangman-description + "Allow channel members to play the hangman game.") + +(put 'riece-hangman 'riece-addon-default-disabled t) + (defun riece-hangman-make-context (word) + "Make an instance of player context object. +This function is for internal use only." (vector word nil 0)) (defun riece-hangman-context-word (context) + "Return the correct word of CONTEXT. +This function is for internal use only." (aref context 0)) (defun riece-hangman-context-guessed (context) + "Return the guessed letters in this CONTEXT. +This function is for internal use only." (aref context 1)) (defun riece-hangman-context-missed-count (context) + "Return the count of missed guesses in this CONTEXT. +This function is for internal use only." (aref context 2)) -(defun riece-hangman-context-set-word (context word) - (aset context 0 word)) - (defun riece-hangman-context-set-guessed (context guessed) + "Set the GUESSED letters in this CONTEXT. +This function is for internal use only." (aset context 1 guessed)) (defun riece-hangman-context-set-missed-count (context missed-count) + "Set the count of MISSED guesses in this CONTEXT. +This function is for internal use only." (aset context 2 missed-count)) (defun riece-hangman-word () - (unless riece-hangman-words-buffer + "Return random word. +The wordlist is read from `riece-hangman-words-file'." + (unless (and riece-hangman-words-buffer + (buffer-name riece-hangman-words-buffer)) (setq riece-hangman-words-buffer (generate-new-buffer " *riece-hangman*")) - (save-excursion - (set-buffer riece-hangman-words-buffer) + (with-current-buffer riece-hangman-words-buffer (buffer-disable-undo) (insert-file-contents riece-hangman-words-file) (let ((case-fold-search nil)) - (delete-non-matching-lines "^[a-z][a-z][a-z][a-z][a-z][a-z]")))) - (save-excursion - (set-buffer riece-hangman-words-buffer) - (goto-char (% (1+ (random)) (buffer-size))) + (delete-non-matching-lines "^[a-z][a-z][a-z][a-z][a-z][a-z]+")))) + (with-current-buffer riece-hangman-words-buffer + (goto-char (1+ (random (buffer-size)))) (if (eobp) (beginning-of-line -1) (beginning-of-line)) @@ -102,108 +116,119 @@ string 'notice t)) (riece-send-string (format "NOTICE %s :%s\r\n" target string))) -(defun riece-hangman-reply-with-context (target context) - (let* ((word (riece-hangman-context-word context)) - (masked-word (make-string (length word) ?-)) - (guessed (riece-hangman-context-guessed context)) - (index 0)) - (while (< index (length word)) - (if (memq (aref word index) guessed) - (aset masked-word index (aref word index))) +(defun riece-hangman-reply-with-context (user target context) + (let ((masked-word (make-string + (length (riece-hangman-context-word context)) + ?-)) + (guessed (copy-sequence (riece-hangman-context-guessed context))) + (index 0)) + (while (< index (length (riece-hangman-context-word context))) + (if (memq (aref (riece-hangman-context-word context) index) guessed) + (aset masked-word index + (aref (riece-hangman-context-word context) index))) (setq index (1+ index))) (riece-hangman-reply target - (format "Word: %s, Guessed: %s" - masked-word - (apply #'string (sort (copy-sequence guessed) #'<)))))) + (format "%s: Word: %s, Guessed: %s" + user masked-word + (if guessed + (apply #'string (sort guessed #'<)) + ""))))) (defun riece-hangman-after-privmsg-hook (prefix string) - (let* ((user (riece-make-identity (riece-prefix-nickname prefix) - riece-server-name)) - (parameters (riece-split-parameters string)) - (targets (split-string (car parameters) ",")) - (message (nth 1 parameters)) - pointer) - (if (string-match riece-hangman-hello-regexp message) - (if (riece-identity-assoc user riece-hangman-players) - (riece-hangman-reply - (car targets) - (format "%s: You are already playing the game." - (riece-format-identity user t))) - (let ((context (riece-hangman-make-context (riece-hangman-word)))) - (setq riece-hangman-players (cons (cons user context) - riece-hangman-players)) - (riece-hangman-reply-with-context (car targets) context))) - (if (string-match riece-hangman-bye-regexp message) - (when (setq pointer (riece-identity-assoc user - riece-hangman-players)) - (setq riece-hangman-players (delq pointer riece-hangman-players)) - (riece-hangman-reply - (car targets) - (format "%s: Sorry, the word was \"%s\"" - (riece-format-identity user t) - (riece-hangman-context-word (cdr pointer))))) - (if (setq pointer (riece-identity-assoc user riece-hangman-players)) - (if (or (/= (length message) 1) - (not (string-match "[a-z]" message))) + (if (get 'riece-hangman 'riece-addon-enabled) + (let* ((user (riece-prefix-nickname prefix)) + (parameters (riece-split-parameters string)) + (targets (split-string (car parameters) ",")) + (message (nth 1 parameters)) + case-fold-search + pointer word guessed index) + (if (string-match riece-hangman-hello-regexp message) + (if (riece-identity-assoc user riece-hangman-player-context-alist + t) (riece-hangman-reply (car targets) - (format "%s: Not a valid guess: %s" - (riece-format-identity user t) - message)) - (if (memq (aref message 0) - (riece-hangman-context-guessed (cdr pointer))) - (riece-hangman-reply (car targets) - (format "%s: Already guessed '%c'" - (riece-format-identity user t) - (aref message 0))) - (riece-hangman-context-set-guessed - (cdr pointer) - (cons (aref message 0) - (riece-hangman-context-guessed (cdr pointer)))) - (let ((word (riece-hangman-context-word (cdr pointer))) - (index 0) - (char (aref message 0))) - (unless (catch 'found + (format "%s: You are already playing the game." user)) + (let ((context (riece-hangman-make-context + (riece-hangman-word)))) + (setq riece-hangman-player-context-alist + (cons (cons user context) + riece-hangman-player-context-alist)) + (riece-hangman-reply-with-context user (car targets) context))) + (if (string-match riece-hangman-bye-regexp message) + (when (setq pointer (riece-identity-assoc + user riece-hangman-player-context-alist t)) + (setq riece-hangman-player-context-alist + (delq pointer riece-hangman-player-context-alist)) + (riece-hangman-reply + (car targets) + (format "%s: Sorry, the word was \"%s\"" + user + (riece-hangman-context-word (cdr pointer))))) + (if (setq pointer (riece-identity-assoc + user riece-hangman-player-context-alist t)) + (if (or (/= (length message) 1) + (not (string-match "[a-z]" message))) + (riece-hangman-reply + (car targets) + (format "%s: Not a valid guess: %s" user message)) + (if (memq (aref message 0) + (riece-hangman-context-guessed (cdr pointer))) + (riece-hangman-reply (car targets) + (format "%s: Already guessed '%c'" + user (aref message 0))) + (setq guessed (riece-hangman-context-set-guessed + (cdr pointer) + (cons (aref message 0) + (riece-hangman-context-guessed + (cdr pointer)))) + word (riece-hangman-context-word (cdr pointer))) + (unless (catch 'found + (setq index 0) + (while (< index (length word)) + (if (eq (aref word index) (aref message 0)) + (throw 'found t)) + (setq index (1+ index)))) + (riece-hangman-context-set-missed-count + (cdr pointer) + (1+ (riece-hangman-context-missed-count + (cdr pointer))))) + (if (>= (riece-hangman-context-missed-count (cdr pointer)) + 7) + (progn + (riece-hangman-reply + (car targets) + (format "%s: Sorry, the word was \"%s\"" + user + (riece-hangman-context-word (cdr pointer)))) + (setq riece-hangman-player-context-alist + (delq pointer + riece-hangman-player-context-alist))) + (if (catch 'missing + (setq index 0) (while (< index (length word)) - (if (eq (aref word index) char) - (throw 'found t)) + (unless (memq (aref word index) guessed) + (throw 'missing t)) (setq index (1+ index)))) - (riece-hangman-context-set-missed-count - (cdr pointer) - (1+ (riece-hangman-context-missed-count - (cdr pointer)))))) - (if (>= (riece-hangman-context-missed-count (cdr pointer)) 7) - (progn - (riece-hangman-reply - (car targets) - (format "%s: Sorry, the word was \"%s\"" - (riece-format-identity user t) - (riece-hangman-context-word (cdr pointer)))) - (setq riece-hangman-players - (delq pointer - riece-hangman-players))) - (let ((word (riece-hangman-context-word (cdr pointer))) - (guessed (riece-hangman-context-guessed (cdr pointer))) - (index 0) - (char (aref message 0))) - (if (catch 'missing - (while (< index (length word)) - (unless (memq (aref word index) guessed) - (throw 'missing t)) - (setq index (1+ index)))) - (riece-hangman-reply-with-context - (car targets) (cdr pointer)) - (riece-hangman-reply - (car targets) - (format "%s: You got it!" - (riece-format-identity user t))) - (setq riece-hangman-players - (delq pointer riece-hangman-players)))))))))))) + (riece-hangman-reply-with-context user (car targets) + (cdr pointer)) + (riece-hangman-reply (car targets) + (format "%s: You got it! (%s)" + user word)) + (setq riece-hangman-player-context-alist + (delq + pointer + riece-hangman-player-context-alist)))))))))))) (defun riece-hangman-insinuate () (add-hook 'riece-after-privmsg-hook 'riece-hangman-after-privmsg-hook)) +(defun riece-hangman-uninstall () + (remove-hook 'riece-after-privmsg-hook 'riece-hangman-after-privmsg-hook)) + +(defun riece-hangman-enable () + (random t)) + (provide 'riece-hangman) ;;; riece-hangman.el ends here