summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Arends <edx@rockbox.org>2002-05-31 22:16:10 +0000
committerFelix Arends <edx@rockbox.org>2002-05-31 22:16:10 +0000
commit739f2ae0fe6ba73b6e9f52fcf96dce3c11a7979c (patch)
tree0b65e9075f681a2909f815eff56c125dc60c79ec
parent7844e67034b298242227837a499fd59e772433b0 (diff)
downloadrockbox-739f2ae0fe6ba73b6e9f52fcf96dce3c11a7979c.tar.gz
rockbox-739f2ae0fe6ba73b6e9f52fcf96dce3c11a7979c.zip
Zoomed Screen
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@864 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/recorder/tetris.c137
1 files changed, 90 insertions, 47 deletions
diff --git a/apps/recorder/tetris.c b/apps/recorder/tetris.c
index 8748231fbf..9e08635e62 100644
--- a/apps/recorder/tetris.c
+++ b/apps/recorder/tetris.c
@@ -33,14 +33,14 @@
33#endif 33#endif
34 34
35#define TETRIS_TITLE "Tetris!" 35#define TETRIS_TITLE "Tetris!"
36#define TETRIS_TITLE_FONT 2 36#define TETRIS_TITLE_FONT 1
37#define TETRIS_TITLE_XLOC 10 37#define TETRIS_TITLE_XLOC 43
38#define TETRIS_TITLE_YLOC 32 38#define TETRIS_TITLE_YLOC 15
39 39
40int start_x = 1; 40int start_x = 2;
41int start_y = 1; 41int start_y = 1;
42int max_x = 14; 42int max_x = 28;
43int max_y = 24; 43int max_y = 48;
44int current_x = 0; 44int current_x = 0;
45int current_y = 0; 45int current_y = 0;
46int current_f = 0; 46int current_f = 0;
@@ -127,22 +127,59 @@ void draw_block(int x,int y,int block,int frame,bool clear)
127{ 127{
128 int i; 128 int i;
129 for(i=0;i < 4;i++) { 129 for(i=0;i < 4;i++) {
130 if (clear) 130 if (clear)
131 lcd_clearpixel(start_x+x+block_data[block][frame][0][i], 131 {
132 start_y+y+block_data[block][frame][1][i]); 132 lcd_clearpixel(start_x+x+block_data[block][frame][0][i] * 2,
133 start_y+y+block_data[block][frame][1][i] * 2);
134 lcd_clearpixel(start_x+x+block_data[block][frame][0][i] * 2 + 1,
135 start_y+y+block_data[block][frame][1][i] * 2);
136 lcd_clearpixel(start_x+x+block_data[block][frame][0][i] * 2,
137 start_y+y+block_data[block][frame][1][i] * 2 + 1);
138 lcd_clearpixel(start_x+x+block_data[block][frame][0][i] * 2 + 1,
139 start_y+y+block_data[block][frame][1][i] * 2 + 1);
140 }
133 else 141 else
134 lcd_drawpixel(start_x+x+block_data[block][frame][0][i], 142 {
135 start_y+y+block_data[block][frame][1][i]); 143 lcd_drawpixel(start_x+x+block_data[block][frame][0][i] * 2,
144 start_y+y+block_data[block][frame][1][i] * 2);
145 lcd_drawpixel(start_x+x+block_data[block][frame][0][i] * 2 + 1,
146 start_y+y+block_data[block][frame][1][i] * 2);
147 lcd_drawpixel(start_x+x+block_data[block][frame][0][i] * 2,
148 start_y+y+block_data[block][frame][1][i] * 2 + 1);
149 lcd_drawpixel(start_x+x+block_data[block][frame][0][i] * 2 + 1,
150 start_y+y+block_data[block][frame][1][i] * 2 + 1);
151 }
136 } 152 }
137} 153}
138 154
139void to_virtual(void) 155void to_virtual(void)
140{ 156{
141 int i; 157 int i;
142 for(i=0;i < 4;i++) 158 for(i = 0; i < 4; i++)
143 *(virtual+ 159 {
144 ((current_y+block_data[current_b][current_f][1][i])*max_x)+ 160 *(virtual +
145 (current_x+block_data[current_b][current_f][0][i])) = current_b+1; 161 (current_y + block_data[current_b][current_f][1][i] * 2) * max_x +
162 current_x + block_data[current_b][current_f][0][i] * 2) = current_b + 1;
163 *(virtual +
164 (current_y + block_data[current_b][current_f][1][i] * 2 + 1) * max_x +
165 current_x + block_data[current_b][current_f][0][i] * 2) = current_b + 1;
166 *(virtual +
167 (current_y + block_data[current_b][current_f][1][i] * 2) * max_x +
168 current_x + block_data[current_b][current_f][0][i] * 2 + 1) = current_b + 1;
169 *(virtual +
170 (current_y + block_data[current_b][current_f][1][i] * 2 + 1) * max_x +
171 current_x + block_data[current_b][current_f][0][i] * 2 + 1) = current_b + 1;
172 }
173}
174
175bool block_touch (int x, int y)
176{
177 if (*(virtual + y * max_x + x) != 0 ||
178 *(virtual + y * max_x + x + 1) != 0 ||
179 *(virtual + (y + 1) * max_x + x) != 0 ||
180 *(virtual + (y + 1) * max_x + x + 1) != 0)
181 return true;
182 return false;
146} 183}
147 184
148bool gameover(void) 185bool gameover(void)
@@ -157,11 +194,10 @@ bool gameover(void)
157 194
158 for(i=0;i < 4; i++){ 195 for(i=0;i < 4; i++){
159 /* Do we have blocks touching? */ 196 /* Do we have blocks touching? */
160 if(*(virtual+((y+block_data[block][frame][1][i])*max_x)+x+ 197 if(block_touch(x + block_data[block][frame][0][i] * 2, y + block_data[block][frame][1][i] * 2))
161 block_data[block][frame][0][i]) != 0)
162 { 198 {
163 /* Are we at the top of the frame? */ 199 /* Are we at the top of the frame? */
164 if(y+block_data[block][frame][1][i] < start_y) 200 if(y + block_data[block][frame][1][i] * 2 < start_y)
165 { 201 {
166 /* Game over ;) */ 202 /* Game over ;) */
167 return true; 203 return true;
@@ -175,12 +211,11 @@ bool valid_position(int x,int y,int block,int frame)
175{ 211{
176 int i; 212 int i;
177 for(i=0;i < 4;i++) 213 for(i=0;i < 4;i++)
178 if( (*(virtual+((y+block_data[block][frame][1][i])*max_x)+x+ 214 if ((y + block_data[block][frame][1][i] * 2 > max_y - 2) ||
179 block_data[block][frame][0][i]) != 0) || 215 (x + block_data[block][frame][0][i] * 2 > max_x - 2) ||
180 (x+block_data[block][frame][0][i] < 0) || 216 (y + block_data[block][frame][1][i] * 2 < 0) ||
181 (x+block_data[block][frame][0][i] > max_x-1) || 217 (x + block_data[block][frame][0][i] * 2 < 0) ||
182 (y+block_data[block][frame][1][i] < 0) || 218 block_touch (x + block_data[block][frame][0][i] * 2, y + block_data[block][frame][1][i] * 2))
183 (y+block_data[block][frame][1][i] > max_y-1))
184 return false; 219 return false;
185 return true; 220 return true;
186} 221}
@@ -188,12 +223,12 @@ bool valid_position(int x,int y,int block,int frame)
188void from_virtual(void) 223void from_virtual(void)
189{ 224{
190 int x,y; 225 int x,y;
191 for(y=0;y < max_y;y++) 226 for(y = 0; y < max_y; y++)
192 for(x=0;x < max_x;x++) 227 for(x = 1; x < max_x - 1; x ++)
193 if(*(virtual+(y*max_x)+x)) 228 if(*(virtual + (y * max_x) + x) != 0)
194 lcd_drawpixel(start_x+x,start_y+y); 229 lcd_drawpixel(start_x + x, start_y + y);
195 else 230 else
196 lcd_clearpixel(start_x+x,start_y+y); 231 lcd_clearpixel(start_x + x, start_y + y);
197} 232}
198 233
199void move_block(int x,int y,int f) 234void move_block(int x,int y,int f)
@@ -206,7 +241,8 @@ void move_block(int x,int y,int f)
206 current_f = 0; 241 current_f = 0;
207 if(current_f < 0) 242 if(current_f < 0)
208 current_f = block_frames[current_b]-1; 243 current_f = block_frames[current_b]-1;
209 } 244 }
245
210 if(valid_position(current_x+x,current_y+y,current_b,current_f)) 246 if(valid_position(current_x+x,current_y+y,current_b,current_f))
211 { 247 {
212 draw_block(current_x,current_y,current_b,last_frame,true); 248 draw_block(current_x,current_y,current_b,last_frame,true);
@@ -243,32 +279,34 @@ int check_lines(void)
243 int x,y,i; 279 int x,y,i;
244 bool line; 280 bool line;
245 int lines = 0; 281 int lines = 0;
246 for(y=0;y < max_y;y++) 282 for(y = 0; y < max_y; y++)
247 { 283 {
248 line = true; 284 line = true;
249 for(x=0;x < max_x;x++) 285 for(x = 1; x < max_x - 1; x++)
250 if(virtual[y*max_x+x] == 0) 286 if(*(virtual + y * max_x + x) == 0)
287 {
251 line = false; 288 line = false;
289 break;
290 }
252 if(line) 291 if(line)
253 { 292 {
254 lines++; 293 lines++;
255 for(i=y;i > 1;i--) 294 for(i = y; i > 1; i--)
256 for (x=0;x<max_x;x++) 295 memcpy(virtual + i * max_x + 1, virtual + (i-1) * max_x + 1, max_x - 2);
257 memcpy(&virtual[i*max_x], &virtual[((i-1)*max_x)], max_x); 296 memset (&virtual[max_x] + 1, 0, max_x - 2);
258 for (x=0;x<max_x;x++)
259 memset (&virtual[max_x], 0, max_x);
260 } 297 }
261 } 298 }
262 return lines; 299 return lines / 2;
263} 300}
264 301
265void move_down(void) 302void move_down(void)
266{ 303{
267 int l; 304 int l;
305 char s[25];
268 if(!valid_position(current_x,current_y+1,current_b,current_f)) 306 if(!valid_position(current_x,current_y+1,current_b,current_f))
269 { 307 {
270 to_virtual(); 308 to_virtual();
271 l = check_lines(); 309 l = check_lines();
272 if(l) 310 if(l)
273 { 311 {
274 lines += l; 312 lines += l;
@@ -278,11 +316,13 @@ void move_down(void)
278 from_virtual(); 316 from_virtual();
279 score += l*l; 317 score += l*l;
280 } 318 }
319 sprintf (s, "%d Rows - Level %d", lines, level);
320 lcd_putsxy (2, 52, s, 0);
281 new_block(); 321 new_block();
282 move_block(0,0,0); 322 move_block(0,0,0);
283 } 323 }
284 else 324 else
285 move_block(0,1,0); 325 move_block(0,2,0);
286} 326}
287 327
288void game_loop(void) 328void game_loop(void)
@@ -298,10 +338,10 @@ void game_loop(void)
298 return; /* get out of here */ 338 return; /* get out of here */
299 339
300 if ( b & BUTTON_LEFT ) { 340 if ( b & BUTTON_LEFT ) {
301 move_block(-1,0,0); 341 move_block(-2,0,0);
302 } 342 }
303 if ( b & BUTTON_RIGHT ) { 343 if ( b & BUTTON_RIGHT ) {
304 move_block(1,0,0); 344 move_block(2,0,0);
305 } 345 }
306 if ( b & BUTTON_UP ) { 346 if ( b & BUTTON_UP ) {
307 move_block(0,0,1); 347 move_block(0,0,1);
@@ -332,10 +372,10 @@ void game_loop(void)
332void init_tetris(void) 372void init_tetris(void)
333{ 373{
334 memset(&virtual, 0, sizeof(virtual)); 374 memset(&virtual, 0, sizeof(virtual));
335 start_x = 1; 375 start_x = 2;
336 start_y = 1; 376 start_y = 1;
337 max_x = 14; 377 max_x = 28;
338 max_y = 24; 378 max_y = 48;
339 current_x = 0; 379 current_x = 0;
340 current_y = 0; 380 current_y = 0;
341 current_f = 0; 381 current_f = 0;
@@ -351,9 +391,12 @@ void tetris(void)
351{ 391{
352 init_tetris(); 392 init_tetris();
353 393
354 draw_frame(start_x-1,start_x+max_x,start_y-1,start_y+max_y); 394 draw_frame(start_x,start_x + max_x - 1, start_y - 1, start_y + max_y);
355 lcd_putsxy(TETRIS_TITLE_XLOC, TETRIS_TITLE_YLOC, TETRIS_TITLE, 395 lcd_putsxy(TETRIS_TITLE_XLOC, TETRIS_TITLE_YLOC, TETRIS_TITLE,
356 TETRIS_TITLE_FONT); 396 TETRIS_TITLE_FONT);
397 lcd_putsxy(TETRIS_TITLE_XLOC, TETRIS_TITLE_YLOC + 16, "*******",
398 TETRIS_TITLE_FONT);
399 lcd_putsxy (2, 52, "0 Rows - Level 0", 0);
357 lcd_update(); 400 lcd_update();
358 401
359 next_b = t_rand(blocks); 402 next_b = t_rand(blocks);