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
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
BIN
apps/plugins/bitmaps/native/sokoban_tiles.12x12x16.bmp
Normal file
After Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 4.3 KiB |
BIN
apps/plugins/bitmaps/native/sokoban_tiles.14x14x16.bmp
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
apps/plugins/bitmaps/native/sokoban_tiles.4x4x1.bmp
Normal file
After Width: | Height: | Size: 174 B |
BIN
apps/plugins/bitmaps/native/sokoban_tiles.5x5x16.bmp
Normal file
After Width: | Height: | Size: 614 B |
BIN
apps/plugins/bitmaps/native/sokoban_tiles.5x5x2.bmp
Normal file
After Width: | Height: | Size: 350 B |
Before Width: | Height: | Size: 894 B |
BIN
apps/plugins/bitmaps/native/sokoban_tiles.6x6x1.bmp
Normal file
After Width: | Height: | Size: 230 B |
BIN
apps/plugins/bitmaps/native/sokoban_tiles.6x6x16.bmp
Normal file
After Width: | Height: | Size: 894 B |
Before Width: | Height: | Size: 894 B After Width: | Height: | Size: 406 B |
BIN
apps/plugins/bitmaps/native/sokoban_tiles.7x7x16.bmp
Normal file
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.8 KiB |
BIN
apps/plugins/bitmaps/native/sokoban_tiles.9x9x16.bmp
Normal file
After Width: | Height: | Size: 1.8 KiB |
|
@ -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
|
|
||||||
|
|