
(provide (quote getris))

(defvar getris-initial-delay 50 "\
*Delay count to control the speed of getris game.  Bigger means slower.
You should substitute this value according to your system's performance.")

(defvar getris-min-delay 2 "\
*Minimum delay count to control the maximum speed of getris game.
Smaller means faster.  The default value, 2, means `as fast as possible.'")

(defvar getris-acceleration 100 "\
*Acceleration rate of getris game.
Smaller value means quicker speed-up.  This value is performance independent.")

(defvar getris-high-score-file (or (getenv "GETRISFILE") (if (eq system-type (quote vax-vms)) "sys$login:getris.txt" "$HOME/.getris")) "\
*File name where top ten scores of getris are recorded.
Initialized from GETRISFILE environment variable.
Nil means does not record scores.")

(defvar getris-block-string "[]" "\
*String for getris block.  Must be width of two column.")

(defvar getris-width 10 "\
*Width of getris board (number of blocks).  Each block occupies two
column width on window.")

(defvar getris-use-full-window nil "\
*Non-nil means that starting Getris game deletes other windows.")

(defun getris nil "\
Clone of a famous Russian game program." (interactive) (byte-code "ÁˆÂ ‰ˆÃÄ!ˆÅ ˆÆ ‡" [getris-previous-window-configuration nil current-window-configuration switch-to-buffer "*Getris*" getris-mode getris-startup] 5))

(defvar getris-command-vector nil "\
Vector of functions which maps character to getris command.")

(defvar getris-mode-map nil)

(defvar getris-piece-data nil "\
Vector of piece data.
Each element of this vector is vector of size four, which correspond
to four directions of piece.  And each element of four size vectors is
a list of form:
	(max-y-offset (x1 . y1) (x2 . y2) (x3 . y3) (x4 . y4))
where:
	(x1 . y1) ... (x4 . y4) are offsets of dot from imaginary `origin'
				at upper-left side of the piece,
	0 <= y[1-4] <= max-y-offset.")

(defvar getris-left-margin)

(defvar getris-height)

(defvar getris-previous-window-configuration nil)

(defvar getris-blank-line)

(defvar getris-complete-line)

(defvar getris-line-length)

(defun getris-startup nil (byte-code "Á‰ˆÃ ˆebˆÄÅ!cˆÆed\"ˆÂ‰‡" [buffer-read-only nil t erase-buffer substitute-command-keys "
 
<<< G E T R I S >>>
 
Clone of a famous Russian game program.
 
Originally written by
MAEDA Atusi
mad@nakanishi.math.keio.junet
 
 
<Type \\[getris-mode-help] for help, \\[getris-start] to start game.>
" center-region] 5))

(defun getris-mode-help nil (interactive) (byte-code "ÀˆÁÂÃÄ!ÃÅ!ÃÆ!ÃÇ!ÃÈ!%!‡" [nil message concat substitute-command-keys "\\[getris-mode-help]:Print this  " "\\[getris-start]:Start new game  " "\\[getris-help]:List action keys  " "\\[boss-has-come]:Boss has come!  " "\\[getris-exit]:Exit"] 12))

(or getris-mode-map (progn (setq getris-mode-map (make-sparse-keymap)) (define-key getris-mode-map "?" (quote getris-mode-help)) (define-key getris-mode-map "" (quote getris-start)) (define-key getris-mode-map "h" (quote getris-help)) (define-key getris-mode-map "" (quote boss-has-come)) (define-key getris-mode-map "q" (quote getris-exit))))

(defun getris-help nil (interactive) (byte-code "ÀˆÁÂ!‡" [nil message "j:Left  k:Rotate  l:Right  Space:Drop  ESC:Escape  q:Exit"] 2))

(or getris-command-vector (progn (setq getris-command-vector (make-vector 256 (quote getris-help))) (aset getris-command-vector 106 (quote getris-move-left)) (aset getris-command-vector 107 (quote getris-rotate)) (aset getris-command-vector 108 (quote getris-move-right)) (aset getris-command-vector 32 (quote getris-drop)) (aset getris-command-vector 113 (quote getris-quit)) (aset getris-command-vector 27 (quote getris-boss-has-come))))

(defun getris-mode nil "\
Major mode for playing getris game.
\\{getris-mode-map}
Type \\[getris-help] for key action in the game.
Entry to this mode calls the value of getris-mode-hook
if that value is non-nil." (interactive) (byte-code "ÅˆÆ ˆÇÈ!ˆÉ‰ˆÊ‰ˆË
!ˆÌp!ˆÄ‰ˆÍ ˆÎÏ!‡" [major-mode mode-name getris-mode-map buffer-read-only t nil kill-all-local-variables make-local-variable global-mode-string getris-mode "Getris" use-local-map buffer-flush-undo getris-mode-help run-hooks getris-mode-hook] 7))

(defun getris-start nil (interactive) (byte-code "ËˆÍÎ!ˆƒ Ï ‚. Ð ˆ	ÑW…\" ÒÓÔÑ	Z\"TÂ\"ˆÕW…. ÒÕZ!ˆÐ ˆÕW†; 	ÑW…A Ö×!ˆØ	SÙ\"ÚØÓÔ\"Ù\"ÛR‰ˆÜÚÝ\"ÚR!‰ˆG‰	ˆË‰
ˆÞ ˆßW…Œ cˆT‰ˆ‚x )ˆØàÓÔ\"\\á\"Pc)ˆâÂ!ˆãä�‡" [getris-use-full-window getris-left-margin t getris-height left-margin-space getris-blank-line getris-width getris-complete-line getris-block-string getris-line-length buffer-read-only nil i switch-to-buffer "*Getris*" delete-other-windows getris-get-window-size 5 enlarge-window * 2 20 error "Window size too small for getris." make-string 32 "||" "||
" regexp-quote getris-repeat-string erase-buffer 0 4 61 random getris-quit-tag (byte-code "À ˆÁ ‡" [getris-main-loop getris-mode-help] 3)] 20))

(defun getris-get-window-size nil (byte-code "Ã ÄZ‰ˆÅÆÇ ÈÄ
\"É#Ä\"‰‡" [getris-height getris-left-margin getris-width window-height 2 / - window-width * 4] 8))

(defun getris-repeat-string (string times) (byte-code "Ã	ÄV… 
P‰ˆ	S‰ˆ‚ ˆ)‡" [result times string "" 0] 3))

(defun getris-exit nil (interactive) (byte-code "ÁˆÂ!‡" [getris-previous-window-configuration nil set-window-configuration] 2))

(defun abs (number) (byte-code "ÁWƒ [‚ ‡" [number 0] 2))

(defun getris-main-loop nil (byte-code "	××ØÙÚ\"Û#ÜÝ\"ÞÞÞÞÞ
	ßàá \"Ú\"\\	â
àãá !Ý\"àãá !ä\"HH‰ˆå	×#…Ú å	
T#…» æ	
T‰
#ˆçè	Ü\"Z#‰ˆ‰ˆS‰×V…® T‰ˆé …ª êrH!ˆ‚� ˆë	
#ˆ‚b ˆæ	
#ˆØ
@ì
\"#‰ˆí ˆ‚& ˆîÚ!ˆïcˆÕ‰ˆ…î ð .
‡" [delay getris-initial-delay score loop-count center getris-left-margin getris-width disp delay-count x y direction kind piece-num piece-vector getris-piece-data piece-data getris-min-delay getris-acceleration getris-command-vector buffer-read-only t getris-high-score-file 0 + logior 1 -2 / 4 nil ash mod random -1 abs 7 getris-puttable-p getris-set-piece max 2 input-pending-p funcall getris-unset-piece getris-test-delete-line getris-show-score end-of-line "*** GAME OVER ***" getris-show-high-score] 28))

(defmacro getris-goto-x-y (x y) (byte-code "ÂÃÄÅE	ÆFD‡" [y x goto-char + * getris-line-length 1] 5))

(defmacro sit-for-getris (n) (byte-code "ÁÂÃDE‡" [n progn (goto-char (point-min)) sit-for] 4))

(defun getris-puttable-p (x y piece-data) (byte-code "Á
A‰…
 …- ÇÈ
@A\\\"
@@\\É#bˆgÊU?…) Æ‰ˆ‚ ˆ)‡" [result t piece-data y getris-line-length x nil + * 1 32] 6))

(defun getris-set-piece (x y piece-data) (byte-code "A‰…* ÅÆ	@A\\
\"@@\\Ç#bˆÈÉ!ˆcˆebˆÊË!ˆ‚  ‡" [piece-data y getris-line-length x getris-block-string + * 1 delete-char 2 sit-for 0] 6))

(defun getris-unset-piece (x y piece-data) (byte-code "A‰…# ÄÅ	@A\\
\"@@\\Æ#bˆÇÈ!ˆÉcˆ‚  ‡" [piece-data y getris-line-length x + * 1 delete-char 2 "  "] 6))

(defun getris-test-delete-line (y piece-data) (byte-code "	
@\\Ç	X…U ÈÉ	\"ÇÊ#bˆË!…L T‰ˆÌ ˆÍ`ÎÊ!ˆ`\"ˆcˆÏÊ!ˆÍ`ÐÊ!ˆ`\"ˆebˆcˆebˆÏÇ!ˆ	T‰ˆ‚ ˆÉ#*‡" [max-y y piece-data lines-deleted getris-line-length getris-complete-line getris-blank-line 0 + * 1 looking-at ding delete-region next-line sit-for previous-line] 14))

(defun getris-show-score nil (byte-code "ÂÃ	\"‰ˆŠÄ q)ˆÅÆ !ˆÇÈ!‡" [global-mode-string score format "Score: %d" other-buffer set-buffer-modified-p buffer-modified-p sit-for 0] 6))

(defun getris-show-high-score nil (byte-code "Ã	!Ä!ˆdbˆÅÆ
Ç È É %cˆÊËed#ˆÌÍ!ˆÎÏ!ˆÐ`d\"ˆÑ!ˆebˆÒÓ!)‡" [file getris-high-score-file score substitute-in-file-name find-file-other-window format "  %08d %20s at %s on %s
" user-full-name current-time-string system-name sort-fields -1 goto-line 11 move-to-column 0 delete-region write-file pop-to-buffer "*Getris*"] 13))

(defun getris-move-left nil (byte-code "Ã	
#ˆÄÅÆZ	
#ƒ ÆZ‰‚ 	
#‡" [x y piece-data getris-unset-piece getris-set-piece getris-puttable-p 2] 6))

(defun getris-move-right nil (byte-code "Ã	
#ˆÄÅÆ\\	
#ƒ Æ\\‰‚ 	
#‡" [x y piece-data getris-unset-piece getris-set-piece getris-puttable-p 2] 6))

(defun getris-rotate nil (byte-code "	ÆUƒ
 Ç‚ 	TÈ
#ˆÉ
Ê
H#ƒ* ‰H‰‚+ #)‡" [new-direction direction x y piece-data piece-vector 3 0 getris-unset-piece getris-set-piece getris-puttable-p] 9))

(defun getris-drop nil (byte-code "Å	
#ˆÆ	T
#… 	T‰ˆ‚ ˆ‰‡" [x y piece-data delay-count delay getris-unset-piece getris-puttable-p] 5))

(defun getris-quit nil (byte-code "ÂÃ!… Á‰ˆÄÅÆ \"‡" [buffer-read-only t y-or-n-p "Are you sure to quit Getris? " throw getris-quit-tag getris-exit] 5))

(defun getris-boss-has-come nil (byte-code "À‹‡" [((byte-code "À ˆÁÂÃ\"ˆÄ ‡" [boss-has-come local-set-key "" getris-boss-goes-away recursive-edit] 4))] 1))

(defun getris-boss-goes-away nil (interactive) (byte-code "ÀˆÁ ˆÂ ‡" [nil boss-goes-away exit-recursive-edit] 3))

(defun getris-make-piece-data (raw-piece-data) (byte-code "Î	GÂ\"‰ˆÏ	…± Ï	@ÎÐÂ\"…ž ÏÂÏ@
	
…‡ Ï
@
@GW…v HÑU…k \\BB‰ˆ	V…k ‰	ˆT‰ˆ‚= ˆ
A
T‰+ˆ‚* ˆ	BI,ˆAT‰ˆ‚ ˆI+ˆ	AT‰ˆ‚
 )‡" [getris-piece-data raw-piece-data nil kind direction four-list four-vector y piece-data max-y lines x line len make-vector 0 4 35] 8))

(or getris-piece-data (getris-make-piece-data (quote ((("" "" "####" "") (" #" " #" " #" " #") ("" "####" "" "") ("  #" "  #" "  #" "  #")) (("##" "##") ("##" "##") ("##" "##") ("##" "##")) (("##" " ##") (" #" "##" "#") ("##" " ##") (" #" "##" "#")) ((" ##" "##") ("#" "##" " #") (" ##" "##") ("#" "##" " #")) ((" #" "###") (" #" "##" " #") ("" "###" " #") (" #" " ##" " #")) (("" "###" "#") ("#" "#" "##") ("  #" "###") (" ##" "  #" "  #")) (("" "###" "  #") ("##" "#" "#") ("#" "###") ("  #" "  #" " ##"))))))
