Sokoban: enable the plugin for the c200. Invent a new, a bit more rockboxish colour scheme since the old one didn't work in the small size that was needed for the c200's screen. Also use these colours in existing bmps and add some in-between sizes (e.g. for the Nano and Gigabeat) to use the screen size as best as possible. Rename the existing colour bmps consistently. Remove the drawing code for monochrome screens and let them use the bitmap build system too. This also allows further simplifying the code and let the plugin retrieve the tilesize from the bitmap.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17569 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Marianne Arnold 2008-05-18 13:05:45 +00:00
parent 01f7223083
commit 4ee3fed014
16 changed files with 93 additions and 120 deletions

View file

@ -76,9 +76,7 @@ sliding_puzzle.c
snake.c snake.c
snake2.c snake2.c
solitaire.c solitaire.c
#ifndef SANSA_C200
sokoban.c sokoban.c
#endif
star.c star.c
starfield.c starfield.c
#if CONFIG_LCD == LCD_SSD1815 #if CONFIG_LCD == LCD_SSD1815

View file

@ -437,22 +437,45 @@ snake2_bottom.160x128x2.bmp
#endif #endif
/* Sokoban*/ /* Sokoban*/
/* biggest tilesize: 20 columns x 16 rows + stat box need to fit (minimum)
* allow clipping of up to 4 pixels in favour of using a bigger tilesize
* stat box width of 32 in horizontal & height of 25 pixels in vertical layout
* currently the horizontal layout fits best on all wider than high displays
*/
#if LCD_WIDTH > LCD_HEIGHT
#define SOKOBAN_TILESIZE ((LCD_WIDTH + 4 -32)/20)
#else
#define SOKOBAN_TILESIZE ((LCD_WIDTH + 4)/20)
#endif
#ifdef HAVE_LCD_COLOR #ifdef HAVE_LCD_COLOR
#if (LCD_HEIGHT >= 224) && (LCD_WIDTH >= 312) || \ #if SOKOBAN_TILESIZE >= 14
(LCD_HEIGHT >= 249) && (LCD_WIDTH >= 280) sokoban_tiles.14x14x16.bmp
sokoban_tiles.14x14.bmp #elif SOKOBAN_TILESIZE >= 12
#elif (LCD_HEIGHT >= 144) && (LCD_WIDTH >= 212) || \ sokoban_tiles.12x12x16.bmp
(LCD_HEIGHT >= 169) && (LCD_WIDTH >= 180-4) #elif SOKOBAN_TILESIZE >= 9
sokoban_tiles.9x9.bmp sokoban_tiles.9x9x16.bmp
#elif (LCD_HEIGHT >= 96 && LCD_WIDTH >= 152) || \ #elif SOKOBAN_TILESIZE >= 7
(LCD_HEIGHT >= 121 && LCD_WIDTH >= 120) sokoban_tiles.7x7x16.bmp
sokoban_tiles.6x6.bmp #elif SOKOBAN_TILESIZE >= 6
#endif sokoban_tiles.6x6x16.bmp
#elif LCD_DEPTH >= 2 && \ #elif SOKOBAN_TILESIZE >= 5
((LCD_HEIGHT >= 96 && LCD_WIDTH >= 152) || \ sokoban_tiles.5x5x16.bmp
(LCD_HEIGHT >= 121 && LCD_WIDTH >= 120)) #endif /* tilesize */
#elif LCD_DEPTH > 1 /*greyscale */
#if SOKOBAN_TILESIZE >= 6
sokoban_tiles.6x6x2.bmp sokoban_tiles.6x6x2.bmp
#endif #elif SOKOBAN_TILESIZE >= 5
sokoban_tiles.5x5x2.bmp
#endif /* tilesize */
#else /* mono */
#if SOKOBAN_TILESIZE >= 6
sokoban_tiles.6x6x1.bmp
#elif SOKOBAN_TILESIZE >= 4
sokoban_tiles.4x4x1.bmp
#endif /* tilesize */
#endif /* HAVE_COLOR */
/* Solitaire and Blackjack */ /* Solitaire and Blackjack */
#ifdef HAVE_LCD_COLOR #ifdef HAVE_LCD_COLOR

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 894 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 894 B

After

Width:  |  Height:  |  Size: 406 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -22,53 +22,30 @@
#include "plugin.h" #include "plugin.h"
#include "lib/playback_control.h" #include "lib/playback_control.h"
#ifdef HAVE_LCD_BITMAP
PLUGIN_HEADER PLUGIN_HEADER
#if LCD_DEPTH >= 2 && ((LCD_HEIGHT >= 96 && LCD_WIDTH >= 152) || \
(LCD_HEIGHT >= 121 && LCD_WIDTH >= 120))
extern const fb_data sokoban_tiles[];
#endif
#define SOKOBAN_TITLE "Sokoban" #define SOKOBAN_TITLE "Sokoban"
#define SOKOBAN_LEVELS_FILE PLUGIN_GAMES_DIR "/sokoban.levels" #define SOKOBAN_LEVELS_FILE PLUGIN_GAMES_DIR "/sokoban.levels"
#define SOKOBAN_SAVE_FILE PLUGIN_GAMES_DIR "/sokoban.save" #define SOKOBAN_SAVE_FILE PLUGIN_GAMES_DIR "/sokoban.save"
#define SOKOBAN_SAVE_FOLDER "/games" #define SOKOBAN_SAVE_FOLDER "/games"
/* Magnify is the number of pixels for each block. #include "sokoban_tiles.h"
#define SOKOBAN_TILESIZE BMPWIDTH_sokoban_tiles
/* SOKOBAN_TILESIZE is the number of pixels for each block.
* Set dynamically so all targets can support levels * Set dynamically so all targets can support levels
* that fill their entire screen, less the stat box. * that fill their entire screen, less the stat box.
* 16 rows & 20 cols minimum */ * 16 rows & 20 cols minimum */
#if (LCD_HEIGHT >= 224) && (LCD_WIDTH >= 320) #if LCD_WIDTH > LCD_HEIGHT /* horizontal layout*/
#define MAGNIFY 14 #define ROWS (LCD_HEIGHT/SOKOBAN_TILESIZE)
#define ROWS (LCD_HEIGHT/MAGNIFY) #if (LCD_WIDTH+4) >= (20*SOKOBAN_TILESIZE+40) /* wide or narrow stats box */
#define COLS ((LCD_WIDTH-40)/MAGNIFY) #define COLS ((LCD_WIDTH-40)/SOKOBAN_TILESIZE)
#elif (LCD_HEIGHT >= 249) && (LCD_WIDTH >= 280)
#define MAGNIFY 14
#define ROWS ((LCD_HEIGHT-25)/MAGNIFY)
#define COLS (LCD_WIDTH/MAGNIFY)
#elif (LCD_HEIGHT >= 144) && (LCD_WIDTH >= 220)
#define MAGNIFY 9
#define ROWS (LCD_HEIGHT/MAGNIFY)
#define COLS ((LCD_WIDTH-40)/MAGNIFY)
#elif (LCD_HEIGHT >= 169) && (LCD_WIDTH+4 >= 180) /* plus 4 for sansa */
#define MAGNIFY 9
#define ROWS ((LCD_HEIGHT-25)/MAGNIFY)
#define COLS ((LCD_WIDTH+4)/MAGNIFY)
#elif (LCD_HEIGHT >= 96) && (LCD_WIDTH >= 160)
#define MAGNIFY 6
#define ROWS (LCD_HEIGHT/MAGNIFY)
#define COLS ((LCD_WIDTH-40)/MAGNIFY)
#elif (LCD_HEIGHT >= 121) && (LCD_WIDTH >= 120)
#define MAGNIFY 6
#define ROWS ((LCD_HEIGHT-25)/MAGNIFY)
#define COLS (LCD_WIDTH/MAGNIFY)
#else #else
#define MAGNIFY 4 #define COLS ((LCD_WIDTH-32)/SOKOBAN_TILESIZE)
#define ROWS 16 #endif
#define COLS 20 #else /* vertical layout*/
#define ROWS ((LCD_HEIGHT-25)/SOKOBAN_TILESIZE)
#define COLS (LCD_WIDTH/SOKOBAN_TILESIZE)
#endif #endif
/* Use either all but 16k of the plugin buffer for level data /* Use either all but 16k of the plugin buffer for level data
@ -233,6 +210,22 @@ extern const fb_data sokoban_tiles[];
#define BUTTON_SAVE BUTTON_SELECT #define BUTTON_SAVE BUTTON_SELECT
#define BUTTON_SAVE_NAME "SELECT" #define BUTTON_SAVE_NAME "SELECT"
#elif CONFIG_KEYPAD == SANSA_C200_PAD
#define SOKOBAN_LEFT BUTTON_LEFT
#define SOKOBAN_RIGHT BUTTON_RIGHT
#define SOKOBAN_UP BUTTON_UP
#define SOKOBAN_DOWN BUTTON_DOWN
#define SOKOBAN_MENU BUTTON_POWER
#define SOKOBAN_UNDO_PRE BUTTON_SELECT
#define SOKOBAN_UNDO (BUTTON_SELECT | BUTTON_REL)
#define SOKOBAN_REDO BUTTON_REC
#define SOKOBAN_LEVEL_DOWN BUTTON_VOL_DOWN
#define SOKOBAN_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_RIGHT)
#define SOKOBAN_LEVEL_UP BUTTON_VOL_UP
#define SOKOBAN_PAUSE BUTTON_SELECT
#define BUTTON_SAVE BUTTON_SELECT
#define BUTTON_SAVE_NAME "SELECT"
#elif CONFIG_KEYPAD == GIGABEAT_S_PAD #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
#define SOKOBAN_LEFT BUTTON_LEFT #define SOKOBAN_LEFT BUTTON_LEFT
#define SOKOBAN_RIGHT BUTTON_RIGHT #define SOKOBAN_RIGHT BUTTON_RIGHT
@ -797,15 +790,7 @@ static void update_screen(void)
int c, r; int c, r;
int rows, cols; int rows, cols;
#if LCD_DEPTH < 2 || ((LCD_HEIGHT < 96 || LCD_WIDTH < 152) && \ #if LCD_WIDTH - (COLS*SOKOBAN_TILESIZE) < 32
(LCD_HEIGHT < 121 || LCD_WIDTH < 120))
int i, j;
int max = MAGNIFY - 1;
int middle = max/2;
int ldelta = (middle + 1)/2;
#endif
#if LCD_WIDTH - (COLS*MAGNIFY) < 32
#define STAT_HEIGHT 25 #define STAT_HEIGHT 25
#define STAT_X (LCD_WIDTH - 120)/2 #define STAT_X (LCD_WIDTH - 120)/2
#define STAT_Y (LCD_HEIGHT - STAT_HEIGHT) #define STAT_Y (LCD_HEIGHT - STAT_HEIGHT)
@ -825,10 +810,10 @@ static void update_screen(void)
rb->lcd_drawrect(STAT_X + 37, STAT_Y, 39, STAT_HEIGHT); rb->lcd_drawrect(STAT_X + 37, STAT_Y, 39, STAT_HEIGHT);
rb->lcd_drawrect(STAT_X + 75, STAT_Y, 45, STAT_HEIGHT); rb->lcd_drawrect(STAT_X + 75, STAT_Y, 45, STAT_HEIGHT);
#else #else
#if LCD_WIDTH - (COLS*MAGNIFY) > 40 #if LCD_WIDTH - (COLS*SOKOBAN_TILESIZE) > 40
#define STAT_X (LCD_WIDTH - 40) #define STAT_X (LCD_WIDTH - 40)
#else #else
#define STAT_X COLS*MAGNIFY #define STAT_X COLS*SOKOBAN_TILESIZE
#endif #endif
#if LCD_HEIGHT >= 70 #if LCD_HEIGHT >= 70
#define STAT_Y (LCD_HEIGHT - 70)/2 #define STAT_Y (LCD_HEIGHT - 70)/2
@ -861,87 +846,56 @@ static void update_screen(void)
/* load the board to the screen */ /* load the board to the screen */
for (rows = 0; rows < ROWS; rows++) { for (rows = 0; rows < ROWS; rows++) {
for (cols = 0; cols < COLS; cols++) { for (cols = 0; cols < COLS; cols++) {
c = cols*MAGNIFY + c = cols*SOKOBAN_TILESIZE +
(BOARD_WIDTH - current_info.level.width*MAGNIFY)/2; (BOARD_WIDTH - current_info.level.width*SOKOBAN_TILESIZE)/2;
r = rows*MAGNIFY + r = rows*SOKOBAN_TILESIZE +
(BOARD_HEIGHT - current_info.level.height*MAGNIFY)/2; (BOARD_HEIGHT - current_info.level.height*SOKOBAN_TILESIZE)/2;
switch(current_info.board[rows][cols]) { switch(current_info.board[rows][cols]) {
case 'X': /* blank space outside of level */ case 'X': /* blank space outside of level */
break; break;
#if LCD_DEPTH >= 2 && ((LCD_HEIGHT >= 96 && LCD_WIDTH >= 152) || \
(LCD_HEIGHT >= 121 && LCD_WIDTH >= 120))
case ' ': /* floor */ case ' ': /* floor */
rb->lcd_bitmap_part(sokoban_tiles, 0, 0*MAGNIFY, MAGNIFY, rb->lcd_bitmap_part(sokoban_tiles, 0, 0*SOKOBAN_TILESIZE,
c, r, MAGNIFY, MAGNIFY); SOKOBAN_TILESIZE, c, r, SOKOBAN_TILESIZE,
SOKOBAN_TILESIZE);
break; break;
case '#': /* wall */ case '#': /* wall */
rb->lcd_bitmap_part(sokoban_tiles, 0, 1*MAGNIFY, MAGNIFY, rb->lcd_bitmap_part(sokoban_tiles, 0, 1*SOKOBAN_TILESIZE,
c, r, MAGNIFY, MAGNIFY); SOKOBAN_TILESIZE, c, r, SOKOBAN_TILESIZE,
SOKOBAN_TILESIZE);
break; break;
case '$': /* box */ case '$': /* box */
rb->lcd_bitmap_part(sokoban_tiles, 0, 2*MAGNIFY, MAGNIFY, rb->lcd_bitmap_part(sokoban_tiles, 0, 2*SOKOBAN_TILESIZE,
c, r, MAGNIFY, MAGNIFY); SOKOBAN_TILESIZE, c, r, SOKOBAN_TILESIZE,
SOKOBAN_TILESIZE);
break; break;
case '*': /* box on goal */ case '*': /* box on goal */
rb->lcd_bitmap_part(sokoban_tiles, 0, 3*MAGNIFY, MAGNIFY, rb->lcd_bitmap_part(sokoban_tiles, 0, 3*SOKOBAN_TILESIZE,
c, r, MAGNIFY, MAGNIFY); SOKOBAN_TILESIZE, c, r, SOKOBAN_TILESIZE,
SOKOBAN_TILESIZE);
break; break;
case '.': /* goal */ case '.': /* goal */
rb->lcd_bitmap_part(sokoban_tiles, 0, 4*MAGNIFY, MAGNIFY, rb->lcd_bitmap_part(sokoban_tiles, 0, 4*SOKOBAN_TILESIZE,
c, r, MAGNIFY, MAGNIFY); SOKOBAN_TILESIZE, c, r, SOKOBAN_TILESIZE,
SOKOBAN_TILESIZE);
break; break;
case '@': /* player */ case '@': /* player */
rb->lcd_bitmap_part(sokoban_tiles, 0, 5*MAGNIFY, MAGNIFY, rb->lcd_bitmap_part(sokoban_tiles, 0, 5*SOKOBAN_TILESIZE,
c, r, MAGNIFY, MAGNIFY); SOKOBAN_TILESIZE, c, r, SOKOBAN_TILESIZE,
SOKOBAN_TILESIZE);
break; break;
case '+': /* player on goal */ case '+': /* player on goal */
rb->lcd_bitmap_part(sokoban_tiles, 0, 6*MAGNIFY, MAGNIFY, rb->lcd_bitmap_part(sokoban_tiles, 0, 6*SOKOBAN_TILESIZE,
c, r, MAGNIFY, MAGNIFY); SOKOBAN_TILESIZE, c, r, SOKOBAN_TILESIZE,
SOKOBAN_TILESIZE);
break; break;
#else
case '#': /* wall */
for (i = c; i < c + MAGNIFY; i++)
for (j = r; j < r + MAGNIFY; j++)
if ((i ^ j) & 1)
rb->lcd_drawpixel(i, j);
break;
case '$': /* box */
rb->lcd_drawrect(c, r, MAGNIFY, MAGNIFY);
break;
case '*': /* box on goal */
rb->lcd_drawrect(c, r, MAGNIFY, MAGNIFY);
rb->lcd_drawrect(c + MAGNIFY/2 - 1, r + MAGNIFY/2 - 1,
MAGNIFY/2, MAGNIFY/2);
break;
case '.': /* goal */
rb->lcd_drawrect(c + MAGNIFY/2 - 1, r + MAGNIFY/2 - 1,
MAGNIFY/2, MAGNIFY/2);
break;
case '@': /* player */
case '+': /* player on goal */
rb->lcd_drawline(c, r + middle, c + max, r + middle);
rb->lcd_drawline(c + middle, r, c + middle,
r + max - ldelta);
rb->lcd_drawline(c + max - middle, r, c + max - middle,
r + max - ldelta);
rb->lcd_drawline(c + middle, r + max - ldelta,
c + middle - ldelta, r + max);
rb->lcd_drawline(c + max - middle, r + max - ldelta,
c + max - middle + ldelta, r + max);
break;
#endif
} }
} }
} }
@ -1617,5 +1571,3 @@ enum plugin_status plugin_start(const struct plugin_api* api, const void* parame
return sokoban_loop(); return sokoban_loop();
} }
#endif