;;; life.el --- John Horton Conway's `Life' game for GNU Emacs
-;; Copyright (C) 1988 Free Software Foundation, Inc.
+;; Copyright (C) 1988, 2001, 2002, 2003, 2004,
+;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
;; Author: Kyle Jones <kyleuunet.uu.net>
+;; Maintainer: FSF
;; Keywords: games
;; This file is part of GNU Emacs.
;; GNU Emacs 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)
+;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; 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:
;;; Code:
-(defconst life-patterns
+(defvar life-patterns
[("@@@" " @@" "@@@")
("@@@ @@@" "@@ @@ " "@@@ @@@")
("@@@ @@@" "@@ @@" "@@@ @@@")
" @@ " " @@ " " @@ "
" @@ " " @@ " " @@ "
" @@")
- ("@@@@@@@@@" "@ @ @" "@ @@@@@ @" "@ @ @ @" "@@@ @@@"
- "@ @ @ @" "@ @@@@@ @" "@ @ @" "@@@@@@@@@")]
+ ("@@@@@@@@@" "@ @ @" "@ @@@@@ @" "@ @ @ @" "@@@ @@@"
+ "@ @ @ @" "@ @@@@@ @" "@ @ @" "@@@@@@@@@")
+ (" @ "
+ " @ @ "
+ " @@ @@ @@"
+ " @ @ @@ @@"
+ "@@ @ @ @@ "
+ "@@ @ @ @@ @ @ "
+ " @ @ @ "
+ " @ @ "
+ " @@ ")
+ (" @ "
+ " @ @@"
+ " @ @ "
+ " @ "
+ " @ "
+ "@ @ ")
+ ("@@@ @"
+ "@ "
+ " @@"
+ " @@ @"
+ "@ @ @")
+ ("@@@@@@@@ @@@@@ @@@ @@@@@@@ @@@@@")]
"Vector of rectangles containing some Life startup patterns.")
;; Macros are used macros for manifest constants instead of variables
;; list of numbers that tell how many characters to move to get to
;; each of a cell's eight neighbors.
-(defconst life-neighbor-deltas nil)
+(defvar life-neighbor-deltas nil)
;; window display always starts here. Easier to deal with than
;; (scroll-up) and (scroll-down) when trying to center the display.
-(defconst life-window-start nil)
+(defvar life-window-start nil)
;; For mode line
-(defconst life-current-generation nil)
+(defvar life-current-generation nil)
;; Sadly, mode-line-format won't display numbers.
-(defconst life-generation-string nil)
+(defvar life-generation-string nil)
(defvar life-initialized nil
"Non-nil if `life' has been run at least once.")
(setq life-initialized t)
(or sleeptime (setq sleeptime 1))
(life-setup)
- (life-display-generation sleeptime)
(catch 'life-exit
(while t
(let ((inhibit-quit t))
+ (life-display-generation sleeptime)
(life-grim-reaper)
(life-expand-plane-if-needed)
- (life-increment-generation)
- (life-display-generation sleeptime)))))
+ (life-increment-generation)))))
(defalias 'life-mode 'life)
(put 'life-mode 'mode-class 'special)
mode-name "Life"
major-mode 'life-mode
truncate-lines t
+ show-trailing-whitespace nil
life-current-generation 0
life-generation-string "0"
mode-line-buffer-identification '("Life: generation "
(defun life-display-generation (sleeptime)
(goto-char life-window-start)
(recenter 0)
-
+
;; Redisplay; if the user has hit a key, exit the loop.
- (or (eq t (sit-for sleeptime))
+ (or (and (sit-for sleeptime) (< 0 sleeptime))
+ (not (input-pending-p))
(throw 'life-exit nil)))
(defun life-extinct-quit ()
(provide 'life)
+;;; arch-tag: e9373544-755e-42f5-a9a1-4d4c422bb97a
;;; life.el ends here