summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/recorder/tetris.c70
1 files changed, 40 insertions, 30 deletions
diff --git a/apps/recorder/tetris.c b/apps/recorder/tetris.c
index ac0d373526..a0a2f4b95a 100644
--- a/apps/recorder/tetris.c
+++ b/apps/recorder/tetris.c
@@ -38,10 +38,10 @@
38#define TETRIS_TITLE_XLOC 43 38#define TETRIS_TITLE_XLOC 43
39#define TETRIS_TITLE_YLOC 15 39#define TETRIS_TITLE_YLOC 15
40 40
41static const int start_x = 1; 41static const int start_x = 5;
42static const int start_y = 2; 42static const int start_y = 5;
43static const int max_x = 104; 43static const int max_x = 4 * 17;
44static const int max_y = 48; 44static const int max_y = 3 * 10;
45static const short level_speeds[10] = {1000,900,800,700,600,500,400,300,250,200}; 45static const short level_speeds[10] = {1000,900,800,700,600,500,400,300,250,200};
46static const int blocks = 7; 46static const int blocks = 7;
47static const int block_frames[7] = {1,2,2,2,4,4,4}; 47static const int block_frames[7] = {1,2,2,2,4,4,4};
@@ -115,6 +115,9 @@ void draw_frame(int fstart_x,int fstop_x,int fstart_y,int fstop_y)
115 115
116 lcd_drawline(fstart_x, fstart_y, fstart_x, fstop_y); 116 lcd_drawline(fstart_x, fstart_y, fstart_x, fstop_y);
117 lcd_drawline(fstop_x, fstart_y, fstop_x, fstop_y); 117 lcd_drawline(fstop_x, fstart_y, fstop_x, fstop_y);
118
119 lcd_drawline(fstart_x - 1, fstart_y + 1, fstart_x - 1, fstop_y + 1);
120 lcd_drawline(fstart_x - 1, fstop_y + 1, fstop_x - 1, fstop_y + 1);
118} 121}
119 122
120void draw_block(int x, int y, int block, int frame, bool clear) 123void draw_block(int x, int y, int block, int frame, bool clear)
@@ -123,17 +126,17 @@ void draw_block(int x, int y, int block, int frame, bool clear)
123 for(i=0;i < 4;i++) { 126 for(i=0;i < 4;i++) {
124 if (clear) 127 if (clear)
125 { 128 {
126 for (a = 0; a < 4; a++) 129 for (a = 0; a < 3; a++)
127 for (b = 0; b < 4; b++) 130 for (b = 0; b < 4; b++)
128 lcd_clearpixel(start_x + x + block_data[block][frame][1][i] * 4 + b, 131 lcd_clearpixel(start_x + x + block_data[block][frame][1][i] * 4 - b,
129 start_y + y + block_data[block][frame][0][i] * 4 + a); 132 start_y + y + block_data[block][frame][0][i] * 3 + a);
130 } 133 }
131 else 134 else
132 { 135 {
133 for (a = 0; a < 4; a++) 136 for (a = 0; a < 3; a++)
134 for (b = 0; b < 4; b++) 137 for (b = 0; b < 4; b++)
135 lcd_drawpixel(start_x+x+block_data[block][frame][1][i] * 4 + b, 138 lcd_drawpixel(start_x+x+block_data[block][frame][1][i] * 4 - b,
136 start_y+y+block_data[block][frame][0][i] * 4 + a); 139 start_y+y+block_data[block][frame][0][i] * 3 + a);
137 } 140 }
138 } 141 }
139} 142}
@@ -141,22 +144,21 @@ void draw_block(int x, int y, int block, int frame, bool clear)
141void to_virtual(void) 144void to_virtual(void)
142{ 145{
143 int i,a,b; 146 int i,a,b;
147
144 for(i = 0; i < 4; i++) 148 for(i = 0; i < 4; i++)
145 { 149 for (a = 0; a < 3; a++)
146 for (a = 0; a < 4; a++)
147 for (b = 0; b < 4; b++) 150 for (b = 0; b < 4; b++)
148 *(virtual + 151 *(virtual +
149 (current_y + block_data[current_b][current_f][0][i] * 4 + a) * max_x + 152 (current_y + block_data[current_b][current_f][0][i] * 3 + a) * max_x +
150 current_x + block_data[current_b][current_f][1][i] * 4 + b) = current_b + 1; 153 current_x + block_data[current_b][current_f][1][i] * 4 - b) = current_b + 1;
151 }
152} 154}
153 155
154bool block_touch (int x, int y) 156bool block_touch (int x, int y)
155{ 157{
156 int a,b; 158 int a,b;
157 for (a = 0; a < 4; a++) 159 for (a = 0; a < 4; a++)
158 for (b = 0; b < 4; b++) 160 for (b = 0; b < 3; b++)
159 if (*(virtual + (y + b) * max_x + (x + a)) != 0) 161 if (*(virtual + (y + b) * max_x + (x - a)) != 0)
160 return true; 162 return true;
161 return false; 163 return false;
162} 164}
@@ -173,7 +175,7 @@ bool gameover(void)
173 175
174 for(i = 0; i < 4; i++){ 176 for(i = 0; i < 4; i++){
175 /* Do we have blocks touching? */ 177 /* Do we have blocks touching? */
176 if(block_touch(x + block_data[block][frame][1][i] * 4, y + block_data[block][frame][0][i] * 4)) 178 if(block_touch(x + block_data[block][frame][1][i] * 4, y + block_data[block][frame][0][i] * 3))
177 { 179 {
178 /* Are we at the top of the frame? */ 180 /* Are we at the top of the frame? */
179 if(y + block_data[block][frame][1][i] * 4 < start_y) 181 if(y + block_data[block][frame][1][i] * 4 < start_y)
@@ -190,11 +192,11 @@ bool valid_position(int x, int y, int block, int frame)
190{ 192{
191 int i; 193 int i;
192 for(i=0;i < 4;i++) 194 for(i=0;i < 4;i++)
193 if ((y + block_data[block][frame][0][i] * 4 > max_y - 4) || 195 if ((y + block_data[block][frame][0][i] * 3 > max_y - 3) ||
194 (x + block_data[block][frame][1][i] * 4 > max_x) || 196 (x + block_data[block][frame][1][i] * 4 > max_x - 4) ||
195 (y + block_data[block][frame][0][i] * 4 < 0) || 197 (y + block_data[block][frame][0][i] * 3 < 0) ||
196 (x + block_data[block][frame][1][i] * 4 < 0) || 198 (x + block_data[block][frame][1][i] * 4 < 4) ||
197 block_touch (x + block_data[block][frame][1][i] * 4, y + block_data[block][frame][0][i] * 4)) 199 block_touch (x + block_data[block][frame][1][i] * 4, y + block_data[block][frame][0][i] * 3))
198 return false; 200 return false;
199 return true; 201 return true;
200} 202}
@@ -238,12 +240,20 @@ void new_block(void)
238{ 240{
239 current_b = next_b; 241 current_b = next_b;
240 current_f = next_f; 242 current_f = next_f;
241 current_x = max_x - 15; 243 current_x = max_x - 16;
242 current_y = (int)((max_y)/2); 244 current_y = (int)12;
243 next_b = t_rand(blocks); 245 next_b = t_rand(blocks);
244 next_f = t_rand(block_frames[next_b]); 246 next_f = t_rand(block_frames[next_b]);
245 // draw_block(max_x + 2, start_y - 1, current_b, current_f, true); 247
246 // draw_block(max_x + 2, start_y - 1, next_b, next_f, false); 248 lcd_drawline (max_x + 7, start_y - 1, max_x + 29, start_y - 1);
249 lcd_drawline (max_x + 29, start_y, max_x + 29, start_y + 14);
250 lcd_drawline (max_x + 29, start_y + 14, max_x + 7, start_y + 14);
251 lcd_drawline (max_x + 7, start_y + 14, max_x + 7, start_y - 1);
252 lcd_drawline (max_x + 6, start_y + 15, max_x + 6, start_y);
253 lcd_drawline (max_x + 6, start_y + 15, max_x + 28, start_y + 15);
254
255 draw_block(max_x + 9, start_y - 4, current_b, current_f, true);
256 draw_block(max_x + 9, start_y - 4, next_b, next_f, false);
247 if(!valid_position(current_x, current_y, current_b, current_f)) 257 if(!valid_position(current_x, current_y, current_b, current_f))
248 { 258 {
249 draw_block(current_x, current_y, current_b, current_f, false); 259 draw_block(current_x, current_y, current_b, current_f, false);
@@ -327,13 +337,13 @@ void game_loop(void)
327 return; /* get out of here */ 337 return; /* get out of here */
328 338
329 if ( b & BUTTON_UP ) 339 if ( b & BUTTON_UP )
330 move_block(0,-4,0); 340 move_block(0,-3,0);
331 341
332 if ( b & BUTTON_DOWN ) 342 if ( b & BUTTON_DOWN )
333 move_block(0,4,0); 343 move_block(0,3,0);
334 344
335 if ( b & BUTTON_RIGHT ) 345 if ( b & BUTTON_RIGHT )
336 move_block(0,0,-1); 346 move_block(0,0,1);
337 347
338 if ( b & BUTTON_LEFT ) 348 if ( b & BUTTON_LEFT )
339 move_down(); 349 move_down();