annotate lisp/games/tetris.el @ 185:3d6bfa290dbd r20-3b19

Import from CVS: tag r20-3b19
author cvs
date Mon, 13 Aug 2007 09:55:28 +0200
parents
children b405438285a2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
185
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
1 ;;; tetris.el -- Implementation of Tetris for Emacs.
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
2
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
3 ;; Copyright (C) 1997 Glynn Clements <glynn@sensei.co.uk>
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
4
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
5 ;; Author: Glynn Clements <glynn@sensei.co.uk>
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
6 ;; Version: 1.7
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
7 ;; Created: 1997-08-13
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
8 ;; Keywords: games
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
9
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
10 ;; This file is part of XEmacs.
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
11
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
12 ;; XEmacs is free software; you can redistribute it and/or modify it
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
13 ;; under the terms of the GNU General Public License as published by
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
14 ;; the Free Software Foundation; either version 2 of the License, or
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
15 ;; (at your option) any later version.
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
16
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
17 ;; XEmacs is distributed in the hope that it will be useful, but
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
18 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
20 ;; General Public License for more details.
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
21
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
23 ;; along with XEmacs; see the file COPYING. If not, write to the Free
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
24 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
25 ;; 02111-1307, USA.
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
26
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
27 ;;; Synched up with: Not synched.
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
28
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
29 ;;; Commentary:
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
30
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
31 ;; Modified: 1997-08-17, added tetris-move-bottom
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
32 ;; Modified: 1997-08-22, changed setting of display table for compatibility
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
33 ;; with XEmacs 19.15
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
34 ;; Modified: 1997-08-23, changed setting of display table for TTY compatibility
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
35 ;; Modified: 1997-08-24, various changes for FSF Emacs compatibility
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
36 ;; Modified: 1997-08-25
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
37 ;; modified existing docstrings, added new docstrings
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
38 ;; L now rotates the same way as T and mirror-L
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
39 ;; now adds tetris-end-game to buffer-local value of kill-buffer-hook
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
40 ;; Modified: 1997-08-26, miscellaneous bugfixes
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
41 ;; Modified: 1997-08-27
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
42 ;; added color support for non-glyph mode
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
43 ;; added tetris-mode-hook
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
44 ;; added tetris-update-speed-function
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
45 ;; URL: ftp://sensei.co.uk/misc/tetris.el.gz
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
46 ;; Tested with XEmacs 20.3-beta and Emacs 19.34
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
47 ;; Reported to work with XEmacs 19.15 and 20.2
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
48
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
49 (eval-when-compile
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
50 (require 'cl))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
51
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
52 ;; ;;;;;;;;;;;;; customization variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
53
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
54 (defvar tetris-use-glyphs t
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
55 "Non-nil means use glyphs when available")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
56
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
57 (defvar tetris-use-color t
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
58 "Non-nil means use color when available")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
59
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
60 (defvar tetris-draw-border-with-glyphs t
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
61 "Non-nil means draw a border even when using glyphs")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
62
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
63 (defvar tetris-font "-*-courier-medium-r-*-*-*-140-100-75-*-*-iso8859-*"
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
64 "Name of the font used for tetris in X mode")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
65
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
66 (defvar tetris-default-tick-period 0.3
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
67 "The default time taken for a shape to drop one row")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
68
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
69 (defvar tetris-update-speed-function
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
70 'tetris-default-update-speed-function
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
71 "Function run whenever the Tetris score changes
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
72 Called with two arguments: (SHAPES ROWS)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
73 SHAPES is the number of shapes which have been dropped
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
74 ROWS is the number of rows which have been completed
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
75
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
76 If the return value is a number, it is used as the timer period")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
77
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
78 (defvar tetris-mode-hook nil
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
79 "Hook run upon starting Tetris")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
80
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
81 ;; ;;;;;;;;;;;;; constants ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
82
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
83 (defconst tetris-buffer-name "*Tetris*"
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
84 "Name used for Tetris buffer")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
85
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
86 (defconst tetris-space-char [?\040]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
87 "Character vector used for a space")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
88
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
89 (defconst tetris-block-char [?\040]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
90 "Character vector for a full square in text mode")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
91
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
92 (defconst tetris-emacs-block-char [?O]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
93 "Character vector for a full square in text mode under Emacs")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
94
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
95 (defconst tetris-border-char [?\+]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
96 "Character vector for a border square in text mode")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
97
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
98 (defconst tetris-buffer-width 25
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
99 "Width of used portion of buffer")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
100
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
101 (defconst tetris-buffer-height 25
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
102 "Height of used portion of buffer")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
103
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
104 (defconst tetris-width 10
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
105 "Width of playing area")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
106
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
107 (defconst tetris-height 20
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
108 "Height of playing area")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
109
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
110 (defconst tetris-top-left-x 3
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
111 "X position of top left of playing area")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
112
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
113 (defconst tetris-top-left-y 1
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
114 "Y position of top left of playing area")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
115
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
116 (defconst tetris-next-x (+ (* 2 tetris-top-left-x) tetris-width)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
117 "X position of next shape")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
118
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
119 (defconst tetris-next-y tetris-top-left-y
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
120 "Y position of next shape")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
121
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
122 (defconst tetris-score-x tetris-top-left-x
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
123 "X position of score")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
124
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
125 (defconst tetris-score-y (+ tetris-top-left-y tetris-height 2)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
126 "Y position of score")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
127
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
128 (defconst tetris-blank 0)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
129
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
130 (defconst tetris-space ?\.)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
131
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
132 (defconst tetris-border ?\*)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
133
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
134 (defconst tetris-shapes
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
135 [[[[1 1 0 0] [1 1 0 0] [1 1 0 0] [1 1 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
136 [[1 1 0 0] [1 1 0 0] [1 1 0 0] [1 1 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
137 [[0 0 0 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
138 [[0 0 0 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
139
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
140 [[[2 2 2 0] [0 2 0 0] [2 0 0 0] [2 2 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
141 [[0 0 2 0] [0 2 0 0] [2 2 2 0] [2 0 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
142 [[0 0 0 0] [2 2 0 0] [0 0 0 0] [2 0 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
143 [[0 0 0 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
144
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
145 [[[3 3 3 0] [3 3 0 0] [0 0 3 0] [3 0 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
146 [[3 0 0 0] [0 3 0 0] [3 3 3 0] [3 0 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
147 [[0 0 0 0] [0 3 0 0] [0 0 0 0] [3 3 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
148 [[0 0 0 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
149
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
150 [[[4 4 0 0] [0 4 0 0] [4 4 0 0] [0 4 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
151 [[0 4 4 0] [4 4 0 0] [0 4 4 0] [4 4 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
152 [[0 0 0 0] [4 0 0 0] [0 0 0 0] [4 0 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
153 [[0 0 0 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
154
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
155 [[[0 5 5 0] [5 0 0 0] [0 5 5 0] [5 0 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
156 [[5 5 0 0] [5 5 0 0] [5 5 0 0] [5 5 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
157 [[0 0 0 0] [0 5 0 0] [0 0 0 0] [0 5 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
158 [[0 0 0 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
159
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
160 [[[0 6 0 0] [6 0 0 0] [6 6 6 0] [0 6 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
161 [[6 6 6 0] [6 6 0 0] [0 6 0 0] [6 6 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
162 [[0 0 0 0] [6 0 0 0] [0 0 0 0] [0 6 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
163 [[0 0 0 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
164
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
165 [[[7 7 7 7] [7 0 0 0] [7 7 7 7] [7 0 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
166 [[0 0 0 0] [7 0 0 0] [0 0 0 0] [7 0 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
167 [[0 0 0 0] [7 0 0 0] [0 0 0 0] [7 0 0 0]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
168 [[0 0 0 0] [7 0 0 0] [0 0 0 0] [7 0 0 0]]]])
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
169
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
170 (defconst tetris-shape-dimensions
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
171 [[2 2] [3 2] [3 2] [3 2] [3 2] [3 2] [4 1]])
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
172
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
173 (defconst tetris-text-colors
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
174 ["black" "blue" "white" "yellow"
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
175 "magenta" "cyan" "green" "red"]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
176 "Vector of colors of the various shapes in text mode
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
177 Element 0 is the background color")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
178
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
179 (defconst tetris-colors
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
180 [[0 0 0] [0 0 1] [0.7 0 1] [1 1 0]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
181 [1 0 1] [0 1 1] [0 1 0] [1 0 0]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
182 [0.5 0.5 0.5]]
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
183 "Vector of colors of the various shapes
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
184 Element 0 is the background color
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
185 Element 8 is the border color")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
186
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
187 (defconst tetris-xpm "\
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
188 /* XPM */
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
189 static char *noname[] = {
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
190 /* width height ncolors chars_per_pixel */
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
191 \"16 16 3 1\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
192 /* colors */
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
193 \"+ s col1\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
194 \". s col2\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
195 \"- s col3\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
196 /* pixels */
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
197 \"---------------+\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
198 \"--------------++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
199 \"--............++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
200 \"--............++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
201 \"--............++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
202 \"--............++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
203 \"--............++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
204 \"--............++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
205 \"--............++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
206 \"--............++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
207 \"--............++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
208 \"--............++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
209 \"--............++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
210 \"--............++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
211 \"-+++++++++++++++\",
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
212 \"++++++++++++++++\"
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
213 };
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
214 "
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
215 "XPM format image used for each square")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
216
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
217 (defun tetris-default-update-speed-function (shapes rows)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
218 (/ 20.0 (+ 50.0 rows)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
219
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
220 ;; ;;;;;;;;;;;;; variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
221
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
222 (defvar tetris-faces (make-vector 256 nil))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
223
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
224 (defvar tetris-buffer-start 1)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
225
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
226 (defvar tetris-display-mode nil)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
227
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
228 (defvar tetris-shape 0)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
229 (defvar tetris-rot 0)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
230 (defvar tetris-next-shape 0)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
231 (defvar tetris-n-shapes 0)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
232 (defvar tetris-n-rows 0)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
233 (defvar tetris-pos-x 0)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
234 (defvar tetris-pos-y 0)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
235
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
236 (defvar tetris-timer nil)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
237
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
238 (defvar tetris-display-table nil)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
239
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
240 ;; ;;;;;;;;;;;;; keymaps ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
241
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
242 (defvar tetris-mode-map
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
243 (make-sparse-keymap 'tetris-mode-map))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
244
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
245 (define-key tetris-mode-map "n" 'tetris-start-game)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
246 (define-key tetris-mode-map "q" 'tetris-end-game)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
247
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
248 (define-key tetris-mode-map " " 'tetris-move-bottom)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
249 (define-key tetris-mode-map [left] 'tetris-move-left)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
250 (define-key tetris-mode-map [right] 'tetris-move-right)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
251 (define-key tetris-mode-map [up] 'tetris-rotate-prev)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
252 (define-key tetris-mode-map [down] 'tetris-rotate-next)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
253
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
254 (defvar tetris-null-map
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
255 (make-sparse-keymap 'tetris-null-map))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
256
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
257 (define-key tetris-null-map "n" 'tetris-start-game)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
258
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
259 ;; ;;;;;;;;;;;;;;;; timer functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
260
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
261 (defun tetris-start-timer (period)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
262 (setq tetris-timer
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
263 (if (featurep 'itimer)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
264 (start-itimer
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
265 "Tetris"
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
266 'tetris-update-game period period
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
267 nil t (current-buffer))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
268 (run-with-timer
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
269 period period
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
270 'tetris-update-game (current-buffer)))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
271
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
272 (defun tetris-set-timer (delay)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
273 (if tetris-timer
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
274 (if (featurep 'itimer)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
275 (set-itimer-restart tetris-timer delay)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
276 (timer-set-time tetris-timer
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
277 (list (aref tetris-timer 1)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
278 (aref tetris-timer 2)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
279 (aref tetris-timer 3))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
280 delay))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
281
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
282 (defun tetris-kill-timer ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
283 (if tetris-timer
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
284 (if (featurep 'itimer)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
285 (delete-itimer tetris-timer)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
286 (timer-set-time tetris-timer '(0 0 0) nil)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
287 (setq tetris-timer nil))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
288
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
289 ;; ;;;;;;;;;;;;; display functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
290
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
291 (defun tetris-color (col shade)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
292 (let* ((vec (aref tetris-colors col))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
293 (v (floor (* shade 255)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
294 (r (* v (aref vec 0)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
295 (g (* v (aref vec 1)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
296 (b (* v (aref vec 2))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
297 (format "#%02x%02x%02x" r g b)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
298
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
299 (defun tetris-set-font (face)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
300 (if tetris-font
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
301 (condition-case nil
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
302 (set-face-font face tetris-font)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
303 ('error nil))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
304
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
305 (defun tetris-setup-face (face color)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
306 (set-face-foreground face color)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
307 (set-face-background face color)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
308 (tetris-set-font face)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
309 (condition-case nil
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
310 (set-face-background-pixmap face [nothing]) ;; XEmacs
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
311 ('error nil))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
312 (condition-case nil
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
313 (set-face-background-pixmap face nil) ;; Emacs
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
314 ('error nil)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
315
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
316 (defun tetris-make-mono-tty-face ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
317 (let ((face (make-face 'tetris-mono-tty-face)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
318 (condition-case nil
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
319 (set-face-property face 'reverse t)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
320 ('error nil))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
321 face))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
322
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
323 (defun tetris-make-color-tty-face (c)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
324 (let* ((name (intern (format "tetris-color-tty-face-%d" c)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
325 (face (make-face name)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
326 (tetris-setup-face face (aref tetris-text-colors c))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
327 face))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
328
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
329 (defun tetris-make-x-border-face ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
330 (let ((face (make-face 'tetris-x-border-face)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
331 (tetris-set-font face)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
332 face))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
333
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
334 (defun tetris-make-mono-x-face ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
335 (let ((face (make-face 'tetris-mono-x-face))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
336 (color (face-foreground 'default)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
337 (if (null color)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
338 (setq color
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
339 (cdr-safe (assq 'foreground-color (frame-parameters)))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
340 (tetris-setup-face face color)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
341 face))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
342
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
343 (defun tetris-make-color-x-face (c)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
344 (let* ((name (intern (format "tetris-color-x-face-%d" c)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
345 (face (make-face name)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
346 (tetris-setup-face face (tetris-color c 1.0))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
347 face))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
348
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
349 (defun tetris-make-mono-tty-faces ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
350 (let ((face (tetris-make-mono-tty-face)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
351 (loop for c from 0 to 255 do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
352 (aset tetris-faces c
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
353 (cond
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
354 ((or (= c 0) (> c 7))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
355 'default)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
356 (t
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
357 face))))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
358
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
359 (defun tetris-make-color-tty-faces ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
360 (loop for c from 0 to 255 do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
361 (aset tetris-faces c
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
362 (cond
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
363 ((> c 7)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
364 'default)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
365 (t
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
366 (tetris-make-color-tty-face c))))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
367
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
368 (defun tetris-make-mono-x-faces ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
369 (let ((face (tetris-make-mono-x-face))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
370 (face2 (tetris-make-x-border-face)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
371 (loop for c from 0 to 255 do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
372 (aset tetris-faces c
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
373 (cond
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
374 ((or (= c 0) (= c tetris-border))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
375 face2)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
376 ((> c 7)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
377 'default)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
378 (t
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
379 face))))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
380
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
381 (defun tetris-make-color-x-faces ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
382 (loop for c from 0 to 255 do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
383 (aset tetris-faces c
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
384 (cond
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
385 ((= c tetris-border)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
386 (tetris-make-x-border-face))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
387 ((> c 7)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
388 'default)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
389 (t
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
390 (tetris-make-color-x-face c))))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
391
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
392 (defun tetris-make-glyph (index)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
393 (make-glyph
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
394 (vector
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
395 'xpm
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
396 :data tetris-xpm
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
397 :color-symbols (list
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
398 (cons "col1" (tetris-color index 0.6))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
399 (cons "col2" (tetris-color index 0.8))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
400 (cons "col3" (tetris-color index 1.0))))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
401
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
402 (defun tetris-make-display-table ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
403 (setq tetris-display-table (make-display-table))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
404 (aset tetris-display-table tetris-space tetris-space-char)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
405 (case tetris-display-mode
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
406 ('glyph
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
407 (aset tetris-display-table tetris-border (tetris-make-glyph 8))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
408 (aset tetris-display-table tetris-blank (tetris-make-glyph 0)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
409 (otherwise
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
410 (aset tetris-display-table tetris-border tetris-border-char)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
411 (aset tetris-display-table tetris-blank tetris-space-char)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
412 (loop for i from 1 to 7 do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
413 (aset tetris-display-table
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
414 (+ tetris-blank i)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
415 (case tetris-display-mode
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
416 ('glyph
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
417 (tetris-make-glyph i))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
418 ('emacs-tty
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
419 tetris-emacs-block-char)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
420 (otherwise
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
421 tetris-block-char)))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
422
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
423 (defun tetris-color-display-p ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
424 (if (fboundp 'device-class)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
425 (eq (device-class (selected-device)) 'color)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
426 (eq (cdr-safe (assq 'display-type (frame-parameters))) 'color)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
427
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
428 (defun tetris-display-type ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
429 (cond ((and tetris-use-glyphs (eq window-system 'x) (featurep 'xpm))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
430 'glyph)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
431 ((and tetris-use-color (eq window-system 'x) (tetris-color-display-p))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
432 'color-x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
433 ((eq window-system 'x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
434 'mono-x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
435 ((and tetris-use-color (tetris-color-display-p))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
436 'color-tty)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
437 (t
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
438 (if (fboundp 'set-face-property)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
439 'mono-tty
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
440 'emacs-tty))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
441
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
442 (defun tetris-initialize-display ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
443 (setq tetris-display-mode (tetris-display-type))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
444 (tetris-make-display-table)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
445 (case tetris-display-mode
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
446 ('mono-tty
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
447 (tetris-make-mono-tty-faces))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
448 ('color-tty
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
449 (tetris-make-color-tty-faces))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
450 ('mono-x
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
451 (tetris-make-mono-x-faces))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
452 ('color-x
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
453 (tetris-make-color-x-faces))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
454
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
455 (defun tetris-set-display-table ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
456 (if (fboundp 'specifierp)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
457 (add-spec-to-specifier current-display-table
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
458 tetris-display-table
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
459 (current-buffer)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
460 nil 'remove-locale)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
461 (setq buffer-display-table tetris-display-table)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
462
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
463 (defun tetris-hide-cursor ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
464 (if (fboundp 'specifierp)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
465 (set-specifier text-cursor-visible-p nil (current-buffer))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
466
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
467 (defun tetris-draw-border-p ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
468 (or (not (eq tetris-display-mode 'glyph))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
469 tetris-draw-border-with-glyphs))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
470
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
471 (defun tetris-set-color (c)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
472 (unless (eq tetris-display-mode 'glyph)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
473 (put-text-property
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
474 (1- (point)) (point) 'face (aref tetris-faces c))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
475
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
476 ;; ;;;;;;;;;;;;;;;; game functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
477
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
478 (defun tetris-get-tick-period ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
479 (if (boundp 'tetris-update-speed-function)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
480 (let ((period (apply tetris-update-speed-function
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
481 tetris-n-shapes
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
482 tetris-n-rows nil)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
483 (and (numberp period) period))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
484
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
485 (defun tetris-cell-offset (x y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
486 (+ tetris-buffer-start
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
487 (* (1+ tetris-buffer-width) y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
488 x))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
489
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
490 (defun tetris-get-cell (x y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
491 (char-after (tetris-cell-offset x y)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
492
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
493 (defun tetris-set-cell (x y c)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
494 (save-excursion
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
495 (let ((buffer-read-only nil))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
496 (goto-char (tetris-cell-offset x y))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
497 (delete-char 1)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
498 (insert-char c 1)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
499 (tetris-set-color c))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
500
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
501 (defun tetris-get-shape-cell (x y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
502 (aref
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
503 (aref
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
504 (aref
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
505 (aref tetris-shapes tetris-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
506 y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
507 tetris-rot)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
508 x))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
509
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
510 (defun tetris-shape-width ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
511 (aref (aref tetris-shape-dimensions tetris-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
512 (% tetris-rot 2)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
513
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
514 (defun tetris-shape-height ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
515 (aref (aref tetris-shape-dimensions tetris-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
516 (- 1 (% tetris-rot 2))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
517
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
518 (defun tetris-draw-score ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
519 (let ((strings (vector
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
520 (format "Shapes: %05d" tetris-n-shapes)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
521 (format "Rows: %05d" tetris-n-rows))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
522 (loop for y from 0 to 1 do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
523 (let* ((string (aref strings y))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
524 (len (length string)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
525 (loop for x from 0 to (1- len) do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
526 (tetris-set-cell
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
527 (+ tetris-score-x x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
528 (+ tetris-score-y y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
529 (aref string x)))))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
530
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
531 (defun tetris-update-score ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
532 (tetris-draw-score)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
533 (let ((period (tetris-get-tick-period)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
534 (if period (tetris-set-timer period))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
535
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
536 (defun tetris-new-shape ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
537 (setq tetris-shape tetris-next-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
538 (setq tetris-rot 0)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
539 (setq tetris-next-shape (random 7))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
540 (setq tetris-pos-x (random (- tetris-width (tetris-shape-width))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
541 (setq tetris-pos-y 0)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
542 (setq tetris-n-shapes (1+ tetris-n-shapes))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
543 (tetris-draw-next-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
544 (tetris-update-score))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
545
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
546 (defun tetris-draw-next-shape ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
547 (loop for y from 0 to 3 do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
548 (loop for x from 0 to 3 do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
549 (tetris-set-cell
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
550 (+ tetris-next-x x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
551 (+ tetris-next-y y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
552 (let ((tetris-shape tetris-next-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
553 (tetris-rot 0))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
554 (tetris-get-shape-cell x y))))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
555
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
556 (defun tetris-draw-shape ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
557 (loop for y from 0 to (1- (tetris-shape-height)) do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
558 (loop for x from 0 to (1- (tetris-shape-width)) do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
559 (let ((c (tetris-get-shape-cell x y)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
560 (if (/= c tetris-blank)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
561 (tetris-set-cell
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
562 (+ tetris-top-left-x tetris-pos-x x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
563 (+ tetris-top-left-y tetris-pos-y y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
564 c))))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
565
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
566 (defun tetris-erase-shape ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
567 (loop for y from 0 to (1- (tetris-shape-height)) do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
568 (loop for x from 0 to (1- (tetris-shape-width)) do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
569 (let ((c (tetris-get-shape-cell x y)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
570 (if (/= c tetris-blank)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
571 (tetris-set-cell
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
572 (+ tetris-top-left-x tetris-pos-x x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
573 (+ tetris-top-left-y tetris-pos-y y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
574 tetris-blank))))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
575
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
576 (defun tetris-test-shape ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
577 (let ((hit nil))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
578 (loop for y from 0 to (1- (tetris-shape-height)) do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
579 (loop for x from 0 to (1- (tetris-shape-width)) do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
580 (unless hit
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
581 (setq hit
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
582 (let ((c (tetris-get-shape-cell x y))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
583 (xx (+ tetris-pos-x x))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
584 (yy (+ tetris-pos-y y)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
585 (and (/= c tetris-blank)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
586 (or (>= xx tetris-width)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
587 (>= yy tetris-height)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
588 (/= (tetris-get-cell
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
589 (+ tetris-top-left-x xx)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
590 (+ tetris-top-left-y yy))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
591 tetris-blank))))))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
592 hit))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
593
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
594 (defun tetris-full-row (y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
595 (let ((full t))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
596 (loop for x from 0 to (1- tetris-width) do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
597 (if (= (tetris-get-cell
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
598 (+ tetris-top-left-x x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
599 (+ tetris-top-left-y y))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
600 tetris-blank)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
601 (setq full nil)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
602 full))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
603
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
604 (defun tetris-shift-row (y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
605 (loop for x from 0 to (1- tetris-width) do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
606 (let ((c (tetris-get-cell
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
607 (+ tetris-top-left-x x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
608 (+ tetris-top-left-y y -1))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
609 (tetris-set-cell
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
610 (+ tetris-top-left-x x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
611 (+ tetris-top-left-y y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
612 c))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
613
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
614 (defun tetris-shift-down ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
615 (loop for y0 from (1- tetris-height) downto 0 do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
616 (if (tetris-full-row y0)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
617 (progn
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
618 (setq tetris-n-rows (1+ tetris-n-rows))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
619 (tetris-update-score)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
620 (loop for y from y0 downto 1 do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
621 (tetris-shift-row y))))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
622
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
623 (defun tetris-init-buffer ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
624 (let ((line (concat
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
625 (make-string tetris-buffer-width tetris-space)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
626 "\n"))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
627 (buffer-read-only nil))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
628 (erase-buffer)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
629 (setq tetris-buffer-start (point))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
630 (dotimes (i tetris-buffer-height)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
631 (insert-string line))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
632 (if (tetris-draw-border-p)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
633 (loop for y from -1 to tetris-height do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
634 (loop for x from -1 to tetris-width do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
635 (tetris-set-cell
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
636 (+ tetris-top-left-x x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
637 (+ tetris-top-left-y y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
638 tetris-border))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
639 (loop for y from 0 to (1- tetris-height) do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
640 (loop for x from 0 to (1- tetris-width) do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
641 (tetris-set-cell
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
642 (+ tetris-top-left-x x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
643 (+ tetris-top-left-y y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
644 tetris-blank)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
645 (if (tetris-draw-border-p)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
646 (loop for y from -1 to 4 do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
647 (loop for x from -1 to 4 do
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
648 (tetris-set-cell
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
649 (+ tetris-next-x x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
650 (+ tetris-next-y y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
651 tetris-border))))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
652
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
653 (defun tetris-reset-game ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
654 (tetris-kill-timer)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
655 (tetris-init-buffer)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
656 (setq tetris-next-shape (random 7))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
657 (setq tetris-shape 0
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
658 tetris-rot 0
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
659 tetris-n-shapes 0
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
660 tetris-n-rows 0
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
661 tetris-pos-x 0
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
662 tetris-pos-y 0)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
663 (tetris-new-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
664 (tetris-draw-shape))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
665
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
666 (defun tetris-shape-done ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
667 (tetris-shift-down)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
668 (tetris-new-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
669 (if (tetris-test-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
670 (progn
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
671 (tetris-end-game))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
672 (tetris-draw-shape)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
673
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
674 (defun tetris-update-game (tetris-buffer)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
675 "Called on each clock tick.
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
676 Drops the shape one square, testing for collision."
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
677 (if (eq (current-buffer) tetris-buffer)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
678 (let (hit)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
679 (tetris-erase-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
680 (setq tetris-pos-y (1+ tetris-pos-y))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
681 (setq hit (tetris-test-shape))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
682 (if hit
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
683 (setq tetris-pos-y (1- tetris-pos-y)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
684 (tetris-draw-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
685 (if hit
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
686 (tetris-shape-done)))))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
687
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
688 (defun tetris-move-bottom ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
689 "Drops the shape to the bottom of the playing area"
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
690 (interactive)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
691 (let ((hit nil))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
692 (tetris-erase-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
693 (while (not hit)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
694 (setq tetris-pos-y (1+ tetris-pos-y))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
695 (setq hit (tetris-test-shape)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
696 (setq tetris-pos-y (1- tetris-pos-y))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
697 (tetris-draw-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
698 (tetris-shape-done)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
699
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
700 (defun tetris-move-left ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
701 "Moves the shape one square to the left"
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
702 (interactive)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
703 (unless (= tetris-pos-x 0)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
704 (tetris-erase-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
705 (setq tetris-pos-x (1- tetris-pos-x))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
706 (if (tetris-test-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
707 (setq tetris-pos-x (1+ tetris-pos-x)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
708 (tetris-draw-shape)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
709
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
710 (defun tetris-move-right ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
711 "Moves the shape one square to the right"
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
712 (interactive)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
713 (unless (= (+ tetris-pos-x (tetris-shape-width))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
714 tetris-width)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
715 (tetris-erase-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
716 (setq tetris-pos-x (1+ tetris-pos-x))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
717 (if (tetris-test-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
718 (setq tetris-pos-x (1- tetris-pos-x)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
719 (tetris-draw-shape)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
720
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
721 (defun tetris-rotate-prev ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
722 "Rotates the shape clockwise"
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
723 (interactive)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
724 (tetris-erase-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
725 (setq tetris-rot (% (+ 1 tetris-rot) 4))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
726 (if (tetris-test-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
727 (setq tetris-rot (% (+ 3 tetris-rot) 4)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
728 (tetris-draw-shape))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
729
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
730 (defun tetris-rotate-next ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
731 "Rotates the shape anticlockwise"
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
732 (interactive)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
733 (tetris-erase-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
734 (setq tetris-rot (% (+ 3 tetris-rot) 4))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
735 (if (tetris-test-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
736 (setq tetris-rot (% (+ 1 tetris-rot) 4)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
737 (tetris-draw-shape))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
738
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
739 (defun tetris-end-game ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
740 "Terminates the current game"
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
741 (interactive)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
742 (tetris-kill-timer)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
743 (use-local-map tetris-null-map))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
744
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
745 (defun tetris-start-game ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
746 "Starts a new game of Tetris"
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
747 (interactive)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
748 (tetris-reset-game)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
749 (use-local-map tetris-mode-map)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
750 (let ((period (or (tetris-get-tick-period)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
751 tetris-default-tick-period)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
752 (tetris-start-timer period)))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
753
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
754 (put 'tetris-mode 'mode-class 'special)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
755
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
756 (defun tetris-mode ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
757 "A mode for playing Tetris.
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
758
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
759 tetris-mode keybindings:
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
760 \\{tetris-mode-map}
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
761 "
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
762 (kill-all-local-variables)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
763
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
764 (make-local-hook 'kill-buffer-hook)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
765 (add-hook 'kill-buffer-hook 'tetris-end-game nil t)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
766
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
767 (make-local-variable 'tetris-display-mode)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
768 (make-local-variable 'tetris-display-table)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
769 (make-local-variable 'tetris-faces)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
770 (make-local-variable 'tetris-timer)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
771 (make-local-variable 'tetris-buffer-start)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
772 (make-local-variable 'tetris-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
773 (make-local-variable 'tetris-rot)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
774 (make-local-variable 'tetris-next-shape)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
775 (make-local-variable 'tetris-n-shapes)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
776 (make-local-variable 'tetris-n-rows)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
777 (make-local-variable 'tetris-pos-x)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
778 (make-local-variable 'tetris-pos-y)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
779
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
780 (use-local-map tetris-null-map)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
781
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
782 (setq buffer-read-only t)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
783 (setq truncate-lines 't)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
784 (setq major-mode 'tetris-mode)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
785 (setq mode-name "Tetris")
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
786
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
787 (buffer-disable-undo (current-buffer))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
788
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
789 (tetris-initialize-display)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
790 (tetris-set-display-table)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
791 (tetris-hide-cursor)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
792
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
793 (run-hooks 'tetris-mode-hook))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
794
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
795 (defun tetris ()
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
796 "Tetris
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
797
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
798 Shapes drop from the top of the screen, and the user has to move and
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
799 rotate the shape to fit in with those at the bottom of the screen so
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
800 as to form complete rows.
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
801
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
802 tetris-mode keybindings:
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
803 \\<tetris-mode-map>
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
804 \\[tetris-start-game] Starts a new game of Tetris
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
805 \\[tetris-end-game] Terminates the current game
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
806 \\[tetris-move-left] Moves the shape one square to the left
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
807 \\[tetris-move-right] Moves the shape one square to the right
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
808 \\[tetris-rotate-prev] Rotates the shape clockwise
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
809 \\[tetris-rotate-next] Rotates the shape anticlockwise
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
810 \\[tetris-move-bottom] Drops the shape to the bottom of the playing area
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
811
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
812 "
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
813 (interactive)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
814
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
815 (switch-to-buffer tetris-buffer-name)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
816 (tetris-kill-timer)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
817 (tetris-mode)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
818 (tetris-start-game))
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
819
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
820 (provide 'tetris)
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
821
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
822 ;;; tetris.el ends here
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents:
diff changeset
823