summaryrefslogtreecommitdiff
path: root/apps/plugins/sliding_puzzle.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/sliding_puzzle.c')
-rw-r--r--apps/plugins/sliding_puzzle.c49
1 files changed, 22 insertions, 27 deletions
diff --git a/apps/plugins/sliding_puzzle.c b/apps/plugins/sliding_puzzle.c
index ce2ae810d5..f1119614ea 100644
--- a/apps/plugins/sliding_puzzle.c
+++ b/apps/plugins/sliding_puzzle.c
@@ -102,20 +102,14 @@ PLUGIN_HEADER
102#define IMAGE_SIZE IMAGE_WIDTH 102#define IMAGE_SIZE IMAGE_WIDTH
103 103
104static struct plugin_api* rb; 104static struct plugin_api* rb;
105#if LCD_DEPTH==1 105
106/* for Archos, use rectangular image, 5x4 puzzle */ 106/* use a square image, (the default Archos bitmap looks square on its display)
107#define SPOTS_X 5
108#define SPOTS_Y 4
109#else
110/* for other targets, use a square image, 4x4 puzzle
111 Puzzle image dimension is min(lcd_height,lcd_width) 107 Puzzle image dimension is min(lcd_height,lcd_width)
112 4x4 is more convenient than 5x4 for square puzzles 108 4x4 is more convenient for square puzzles
113 Note: sliding_puzzle.bmp should be evenly divisible by SPOTS_X 109 Note: sliding_puzzle.bmp should be evenly divisible by SPOTS_X
114 and SPOTS_Y, otherwise lcd_bitmap_part stride won't be correct */ 110 and SPOTS_Y, otherwise lcd_bitmap_part stride won't be correct */
115#define SPOTS_X 4 111#define SPOTS_X 4
116#define SPOTS_Y 4 112#define SPOTS_Y 4
117#endif
118
119#define SPOTS_WIDTH (IMAGE_WIDTH / SPOTS_X) 113#define SPOTS_WIDTH (IMAGE_WIDTH / SPOTS_X)
120#define SPOTS_HEIGHT (IMAGE_HEIGHT / SPOTS_Y) 114#define SPOTS_HEIGHT (IMAGE_HEIGHT / SPOTS_Y)
121#define NUM_SPOTS (SPOTS_X*SPOTS_Y) 115#define NUM_SPOTS (SPOTS_X*SPOTS_Y)
@@ -321,12 +315,11 @@ static void move_spot(int x, int y)
321 moves++; 315 moves++;
322 rb->snprintf(s, sizeof(s), "%d", moves); 316 rb->snprintf(s, sizeof(s), "%d", moves);
323 s[sizeof(s)-1] = '\0'; 317 s[sizeof(s)-1] = '\0';
324#if (LCD_WIDTH>IMAGE_SIZE) 318#if ((LCD_WIDTH - IMAGE_SIZE) > (LCD_HEIGHT - IMAGE_HEIGHT))
325 rb->lcd_putsxy(IMAGE_WIDTH+5, 20, (unsigned char *)s); 319 rb->lcd_putsxy(IMAGE_WIDTH+5, 20, (unsigned char *)s);
326#else 320#else
327 rb->lcd_putsxy(5, IMAGE_HEIGHT+20, (unsigned char *)s); 321 rb->lcd_putsxy(40, IMAGE_HEIGHT+7, (unsigned char *)s);
328#endif 322#endif
329
330 for(i=1;i<=4;i++) 323 for(i=1;i<=4;i++)
331 { 324 {
332 draw_spot(HOLE_ID, 325 draw_spot(HOLE_ID,
@@ -358,14 +351,15 @@ static void puzzle_init(void)
358 rb->lcd_clear_display(); 351 rb->lcd_clear_display();
359 rb->snprintf(s, sizeof(s), "%d", moves); 352 rb->snprintf(s, sizeof(s), "%d", moves);
360 353
361#if (LCD_WIDTH>IMAGE_SIZE) 354#if ((LCD_WIDTH - IMAGE_SIZE) > (LCD_HEIGHT - IMAGE_HEIGHT))
362 rb->lcd_drawrect(IMAGE_WIDTH, 0, 32, 64); 355 rb->lcd_drawrect(IMAGE_WIDTH, 0, LCD_WIDTH-IMAGE_WIDTH, IMAGE_HEIGHT);
363 rb->lcd_putsxy(IMAGE_WIDTH+1, 10, (unsigned char *)"Moves"); 356 rb->lcd_putsxy(IMAGE_WIDTH+1, 10, (unsigned char *)"Moves");
364 rb->lcd_putsxy(IMAGE_WIDTH+5, 20, (unsigned char *)s); 357 rb->lcd_putsxy(IMAGE_WIDTH+5, 20, (unsigned char *)s);
365#else 358#else
366 rb->lcd_drawrect(0, IMAGE_HEIGHT, 32, 64); 359 rb->lcd_drawrect(0, IMAGE_HEIGHT, IMAGE_WIDTH,
367 rb->lcd_putsxy(1, IMAGE_HEIGHT+10, (unsigned char *)"Moves"); 360 (LCD_HEIGHT-IMAGE_HEIGHT));
368 rb->lcd_putsxy(5, IMAGE_HEIGHT+20, (unsigned char *)s); 361 rb->lcd_putsxy(3, IMAGE_HEIGHT+7, (unsigned char *)"Moves: ");
362 rb->lcd_putsxy(40, IMAGE_HEIGHT+7, (unsigned char *)s);
369#endif 363#endif
370 364
371 /* shuffle spots */ 365 /* shuffle spots */
@@ -468,14 +462,15 @@ static int puzzle_loop(void)
468 /* tell the user what mode we picked in the end! */ 462 /* tell the user what mode we picked in the end! */
469 rb->splash(HZ,picmode_descriptions[ picmode ] ); 463 rb->splash(HZ,picmode_descriptions[ picmode ] );
470 rb->lcd_clear_display(); 464 rb->lcd_clear_display();
471#if (LCD_WIDTH>IMAGE_SIZE) 465#if ((LCD_WIDTH - IMAGE_SIZE) > (LCD_HEIGHT - IMAGE_HEIGHT))
472 rb->lcd_drawrect(IMAGE_WIDTH, 0, 32, 64); 466 rb->lcd_drawrect(IMAGE_WIDTH, 0, LCD_WIDTH-IMAGE_WIDTH,
467 IMAGE_HEIGHT);
473 rb->lcd_putsxy(IMAGE_WIDTH+1, 10, (unsigned char *)"Moves"); 468 rb->lcd_putsxy(IMAGE_WIDTH+1, 10, (unsigned char *)"Moves");
474#else 469#else
475 rb->lcd_drawrect(0,IMAGE_HEIGHT,32,64); 470 rb->lcd_drawrect(0, IMAGE_HEIGHT, IMAGE_WIDTH,
476 rb->lcd_putsxy(1,IMAGE_HEIGHT+10, (unsigned char *)"Moves"); 471 (LCD_HEIGHT-IMAGE_HEIGHT));
472 rb->lcd_putsxy(3, IMAGE_HEIGHT+7, (unsigned char *)"Moves: ");
477#endif 473#endif
478
479 for (i=0; i<NUM_SPOTS; i++) 474 for (i=0; i<NUM_SPOTS; i++)
480 draw_spot(spots[i], 475 draw_spot(spots[i],
481 (i%SPOTS_X)*SPOTS_WIDTH, 476 (i%SPOTS_X)*SPOTS_WIDTH,
@@ -606,14 +601,14 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
606#endif 601#endif
607 602
608 rb->lcd_clear_display(); 603 rb->lcd_clear_display();
609#if (LCD_WIDTH>IMAGE_SIZE) 604#if ((LCD_WIDTH - IMAGE_SIZE) > (LCD_HEIGHT - IMAGE_HEIGHT))
610 rb->lcd_drawrect(IMAGE_WIDTH, 0, 32, 64); 605 rb->lcd_drawrect(IMAGE_WIDTH, 0, LCD_WIDTH-IMAGE_WIDTH, IMAGE_HEIGHT);
611 rb->lcd_putsxy(IMAGE_WIDTH+1, 10, (unsigned char *)"Moves"); 606 rb->lcd_putsxy(IMAGE_WIDTH+1, 10, (unsigned char *)"Moves");
612#else 607#else
613 rb->lcd_drawrect(0,IMAGE_HEIGHT,32,64); 608 rb->lcd_drawrect(0, IMAGE_HEIGHT, IMAGE_WIDTH,
614 rb->lcd_putsxy(1,IMAGE_HEIGHT+10, (unsigned char *)"Moves"); 609 (LCD_HEIGHT-IMAGE_HEIGHT));
610 rb->lcd_putsxy(3, IMAGE_HEIGHT+7, (unsigned char *)"Moves: ");
615#endif 611#endif
616
617 for (i=0; i<NUM_SPOTS; i++) { 612 for (i=0; i<NUM_SPOTS; i++) {
618 spots[i]=(i+1); 613 spots[i]=(i+1);
619 draw_spot(spots[i], (i%SPOTS_X)*SPOTS_WIDTH, (i/SPOTS_X)*SPOTS_HEIGHT); 614 draw_spot(spots[i], (i%SPOTS_X)*SPOTS_WIDTH, (i/SPOTS_X)*SPOTS_HEIGHT);