summaryrefslogtreecommitdiff
path: root/apps/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins')
-rw-r--r--apps/plugins/solitaire.c727
1 files changed, 481 insertions, 246 deletions
diff --git a/apps/plugins/solitaire.c b/apps/plugins/solitaire.c
index ea56e2a693..306c0dcc8d 100644
--- a/apps/plugins/solitaire.c
+++ b/apps/plugins/solitaire.c
@@ -16,9 +16,10 @@
* KIND, either express or implied.
*
****************************************************************************/
-
+
/*****************************************************************************
Solitaire by dionoea
+Graphics & Fix Bugs by Ben Basha
use arrows to move the cursor
use ON to select cards, move cards, reveal hidden cards, ...
@@ -31,9 +32,11 @@ use F3 to put card on top of the remains' stack on one of the 4 final stacks
*****************************************************************************/
#include "plugin.h"
+#include "configfile.h"
#include "button.h"
#include "lcd.h"
+
#ifdef HAVE_LCD_BITMAP
/* here is a global api struct pointer. while not strictly necessary,
@@ -43,6 +46,7 @@ static struct plugin_api* rb;
#define min(a,b) (a<b?a:b)
+
/* variable button definitions */
#if CONFIG_KEYPAD == RECORDER_PAD
#define SOL_QUIT BUTTON_OFF
@@ -100,23 +104,8 @@ static struct plugin_api* rb;
#define SOL_MENU_RUN BUTTON_SELECT
#define SOL_MENU_RUN2 BUTTON_RIGHT
#define SOL_MENU_INFO BUTTON_MODE
-#define SOL_MENU_INFO2 BUTTON_REC
-
-#elif (CONFIG_KEYPAD == IPOD_4G_PAD)
-
-#define SOL_QUIT (BUTTON_SELECT | BUTTON_MENU)
-#define SOL_UP BUTTON_MENU
-#define SOL_DOWN BUTTON_PLAY
-#define SOL_LEFT BUTTON_LEFT
-#define SOL_RIGHT BUTTON_RIGHT
-#define SOL_MOVE BUTTON_SELECT
-#define SOL_DRAW (BUTTON_SELECT | BUTTON_PLAY)
-#define SOL_REM2CUR (BUTTON_SELECT | BUTTON_LEFT)
-#define SOL_CUR2STACK (BUTTON_SELECT | BUTTON_RIGHT)
-#define SOL_REM2STACK (BUTTON_LEFT | BUTTON_RIGHT)
-#define SOL_MENU_RUN BUTTON_SELECT
-#define SOL_MENU_INFO (BUTTON_PLAY | BUTTON_MENU)
-
+#define SOL_OPT BUTTON_ON
+#define SOL_REM BUTTON_REC
#endif
/* common help definitions */
@@ -148,13 +137,6 @@ static struct plugin_api* rb;
#define HELP_SOL_CUR2STACK "SELECT..: Put the card under the cursor on one of the 4 final stacks."
#define HELP_SOL_REM2STACK "PLAY+RIGHT: Put the card on top of the remains' stack on one of the 4 final stacks."
-#elif (CONFIG_KEYPAD == IPOD_4G_PAD)
-#define HELP_SOL_MOVE "SELECT: Select cards, Move cards, reveal hidden cards ..."
-#define HELP_SOL_DRAW "SELECT+PLAY: Un-select a card if it was selected. Else, draw 3 new cards out of the remains' stack."
-#define HELP_SOL_REM2CUR "SELECT+LEFT: Put the card on top of the remains' stack on top of the cursor."
-#define HELP_SOL_CUR2STACK "SELECT+RIGHT..: Put the card under the cursor on one of the 4 final stacks."
-#define HELP_SOL_REM2STACK "LEFT+RIGHT: Put the card on top of the remains' stack on one of the 4 final stacks."
-
#endif
#if LCD_DEPTH>1
@@ -167,165 +149,162 @@ static const unsigned colors[4] = {
};
#endif
-static const unsigned char suits[4][8] = {
+#define BMPHEIGHT_c 10
+#define BMPWIDTH_c 8
+#define BMPHEIGHT_BACKSIDE 33
+#define BMPWIDTH_BACKSIDE 26
+
+static const unsigned short backside[33*26] = {
+0x9572, 0xdf3a, 0xdf3a, 0xdf39, 0xdf39, 0xdf39, 0xdf39, 0xdf39, 0xdf39, 0xdf39,
+0xdf3a, 0xdf3a, 0xdf39, 0xdf39, 0xdf39, 0xdf39, 0xdf39, 0xdf39, 0xdf39, 0xdf39,
+0xdf39, 0xdf39, 0xdf39, 0xdf3a, 0xdf3a, 0x9572,
+0xe77b, 0xfffc, 0xffbc, 0xfffd, 0xfffd, 0xfffc, 0xfffc, 0xfffd, 0xfffd, 0xfffc,
+0xfffc, 0xfffc, 0xfffd, 0xfffc, 0xfffc, 0xfffd, 0xfffc, 0xfffc, 0xfffc, 0xfffd,
+0xfffd, 0xfffd, 0xfffd, 0xffbc, 0xfffc, 0xe73a,
+0xdf3a, 0xfffb, 0xf7bc, 0xc639, 0xbdf9, 0xc63a, 0xc67a, 0xc67b, 0xc63a, 0xbe3a,
+0xc639, 0xbe39, 0xbe3a, 0xbe3a, 0xbe3a, 0xc63b, 0xbe3a, 0xc63a, 0xc63a, 0xb5fa,
+0xb5f9, 0xb5f9, 0xc63b, 0xf77c, 0xf7fc, 0xe6fa,
+0xdefa, 0xfffc, 0xc679, 0x6bd4, 0x5b54, 0x6394, 0x5b54, 0x6c34, 0x7433, 0x7435,
+0x7c34, 0x9536, 0x7c35, 0x7c35, 0x8cb5, 0x7434, 0x8474, 0x7c74, 0x8cf5, 0x7434,
+0x8475, 0x7c75, 0x6b93, 0xc63a, 0xfffc, 0xe6f9,
+0xdefa, 0xfffd, 0xc6ba, 0x6395, 0x42d3, 0x7c77, 0x7436, 0x73d5, 0x5b11, 0x8cb6,
+0xa578, 0x7c35, 0xadb9, 0xadb8, 0x6bd4, 0x9537, 0x84b6, 0x5312, 0x5b53, 0x7436,
+0x9538, 0x7436, 0x5b94, 0xc67b, 0xfffd, 0xdefa,
+0xdefa, 0xfffc, 0xce7a, 0x6bd5, 0x5311, 0x73d4, 0x94f7, 0xa5b8, 0x7435, 0x9538,
+0x84b6, 0x190d, 0x7c35, 0x94f7, 0x088d, 0x7c76, 0x84b7, 0x7c75, 0x8cb6, 0xadb9,
+0x7c35, 0x7436, 0x6bd3, 0xce7b, 0xfffd, 0xdefa,
+0xdf39, 0xfffd, 0xceba, 0x63d5, 0x6bd5, 0x31cf, 0x8476, 0xa577, 0x84b7, 0x5b54,
+0x7436, 0x6b94, 0x84b5, 0x9d38, 0x7394, 0x7c37, 0x84b7, 0x84b7, 0xa578, 0x9d77,
+0x31cf, 0x6bd5, 0x6bd4, 0xcebb, 0xfffc, 0xdefa,
+0xdf3a, 0xfffc, 0xce7a, 0x6c35, 0x7c76, 0x9537, 0xa5b9, 0x6b94, 0x5291, 0x4ad2,
+0x7c35, 0x9537, 0x6394, 0x5353, 0x9578, 0x8cb6, 0x5b13, 0x3a11, 0x5b13, 0x9538,
+0x9539, 0x7434, 0x7434, 0xce7a, 0xfffc, 0xe6fa,
+0xdf3a, 0xfffd, 0xc67a, 0x6394, 0x84b7, 0x7c75, 0xa578, 0x94f7, 0x8cb6, 0x94f6,
+0xa5b8, 0x5b12, 0x4b13, 0x4b13, 0x4291, 0xa5b9, 0x6bd4, 0x73d5, 0x7c34, 0xa578,
+0x6bd5, 0x7c75, 0x6b94, 0xc67a, 0xfffd, 0xdefa,
+0xdf3a, 0xfffd, 0xc67a, 0x63d4, 0x7c76, 0x320f, 0xc67b, 0xadf9, 0x5b52, 0xadba,
+0x5b53, 0x6bd4, 0x4b13, 0x6bd5, 0x6bd5, 0x52d2, 0xbe7b, 0x4a91, 0x94f7, 0xbe7b,
+0x320f, 0x7c35, 0x6b94, 0xc67a, 0xfffd, 0xdefa,
+0xdf3a, 0xfffd, 0xbe39, 0x6bd5, 0x84b7, 0x9537, 0xb5f9, 0x6352, 0xbe3b, 0x6393,
+0x4ad4, 0x73d5, 0x6395, 0x6bd5, 0x84b6, 0x52d3, 0x7c76, 0xbe3a, 0x5ad2, 0x8477,
+0x6bd5, 0x84b6, 0x73d5, 0xbe39, 0xfffd, 0xdefa,
+0xdf3a, 0xfffc, 0xc639, 0x7cb6, 0x8cf6, 0xa578, 0x4ad0, 0xc63a, 0x7c74, 0x7475,
+0x84b8, 0x3a51, 0x3210, 0x4292, 0x4250, 0x9d79, 0x7c77, 0x7435, 0xbe3a, 0x424f,
+0x84b8, 0x84b6, 0x84b6, 0xc63a, 0xfffd, 0xdefb,
+0xdf3a, 0xfffd, 0xc63a, 0x6bd5, 0x7c75, 0x4ad0, 0xb5fa, 0x9d38, 0x8cf6, 0x6353,
+0x5313, 0x6395, 0x7c77, 0x7c76, 0x7436, 0x6bd4, 0x5b52, 0xa5b9, 0xb5fa, 0xbdf9,
+0x4a91, 0x7435, 0x6c34, 0xc63a, 0xfffe, 0xdefb,
+0xdf3a, 0xfffd, 0xbe39, 0x7c76, 0x8cb6, 0xb639, 0x9d78, 0x7c35, 0x52d2, 0x2990,
+0x9538, 0xbe3b, 0x9d78, 0xadfa, 0xb63c, 0xadb9, 0x73d5, 0x5b13, 0x6353, 0x9d38,
+0xadf9, 0x8cb5, 0x7c75, 0xbe39, 0xfffd, 0xdefb,
+0xdf3b, 0xfffe, 0xbdf9, 0x5312, 0xadfa, 0x9d78, 0x3a51, 0x9d78, 0x4251, 0x84b8,
+0x7c75, 0x8d37, 0x7cb7, 0x7476, 0x84f7, 0x9d37, 0xcebc, 0x6bd4, 0x94f7, 0x5b53,
+0x94f6, 0xadf8, 0x5b13, 0xb5f9, 0xfffd, 0xdefa,
+0xdf3b, 0xffff, 0xb5f9, 0x63d5, 0x8cf8, 0x4ad2, 0x4ad4, 0x6c35, 0x4293, 0x9d78,
+0x7cb7, 0x6435, 0x5b55, 0x4b13, 0x63d4, 0x9537, 0x9d37, 0x84b7, 0x63d4, 0x84b7,
+0x4292, 0x8cb6, 0x6bd4, 0xb5f9, 0xfffd, 0xdefa,
+0xdf3b, 0xffff, 0xadf9, 0x5b54, 0x7c77, 0x6c35, 0x42d4, 0x218f, 0x4292, 0x9537,
+0x8d38, 0x5354, 0x7475, 0x9538, 0x5b94, 0x7c76, 0x9537, 0x84b8, 0x114e, 0x4b13,
+0x5315, 0x7c76, 0x6353, 0xb5b9, 0xfffd, 0xdefa,
+0xdf3b, 0xffff, 0xb5f9, 0x6395, 0x8cf8, 0x6bd4, 0x5313, 0x7cb6, 0x4ad3, 0xb63b,
+0x8cf7, 0x7436, 0x6c35, 0x6bd6, 0x7cb7, 0xadba, 0xadb8, 0x8477, 0x7435, 0x7435,
+0x4ad2, 0x7cb6, 0x6b95, 0xb5fa, 0xfffc, 0xdefa,
+0xdf3b, 0xffff, 0xadb8, 0x5b53, 0xadfa, 0xb63a, 0x42d2, 0x8cf7, 0x29cf, 0x7c77,
+0x8cb6, 0x7cb6, 0x7436, 0x7435, 0x9538, 0x84b6, 0xa5ba, 0x4a91, 0x84b7, 0x4b12,
+0x8cf7, 0xb63a, 0x5b53, 0xadb8, 0xfffd, 0xdefa,
+0xdf3b, 0xffff, 0xadf9, 0x5353, 0x7cb6, 0x9d36, 0xadfa, 0x6393, 0x5b53, 0x194f,
+0x6395, 0x8d38, 0x9538, 0x9537, 0xa5b9, 0x9539, 0x4a92, 0x4291, 0x6352, 0x8476,
+0xa578, 0x7435, 0x5b53, 0xadb9, 0xfffd, 0xdefa,
+0xdf3b, 0xffff, 0xb5f9, 0x6394, 0x8cf7, 0x4ad1, 0xadb9, 0xa5f9, 0x84b6, 0x6b94,
+0x4a92, 0x31d0, 0x5b55, 0x5314, 0x4252, 0x4a92, 0x52d2, 0x94f8, 0x9d78, 0xb5f9,
+0x5ad2, 0x8477, 0x6b95, 0xb5b9, 0xfffc, 0xdefa,
+0xdf3b, 0xffff, 0xadb9, 0x5354, 0x84f8, 0x7435, 0x4292, 0xadb8, 0x8475, 0x5b53,
+0x7c77, 0x3a93, 0x29d1, 0x4b13, 0x3a51, 0x6bd5, 0x6355, 0x5312, 0xa5b8, 0x4a91,
+0x84b7, 0x7cb6, 0x5b54, 0xadb9, 0xfffc, 0xdefa,
+0xdf3b, 0xffff, 0xadb8, 0x6394, 0x8cf8, 0x6393, 0xa57a, 0x6352, 0xbe7b, 0x7c75,
+0x2a10, 0x5b54, 0x4ad4, 0x5353, 0x5b54, 0x4292, 0x6354, 0xadb9, 0x5b12, 0xa5b9,
+0x6394, 0x7c76, 0x6394, 0xadb8, 0xfffd, 0xdefa,
+0xdf3b, 0xffff, 0xb5f9, 0x6c35, 0x8cf7, 0x31cf, 0x9578, 0x84b7, 0x4a91, 0xadf9,
+0x5b53, 0x5b94, 0x4293, 0x4b53, 0x5b55, 0x4291, 0xa5b8, 0x6352, 0x7c36, 0xc6bb,
+0x4a91, 0x6b95, 0x7436, 0xb5b9, 0xfffd, 0xdefa,
+0xdf3b, 0xffff, 0xb5f8, 0x5b53, 0x9539, 0x7435, 0x6bd5, 0x6bd5, 0x7c75, 0x6b94,
+0xadb9, 0x6bd4, 0x2a11, 0x2a11, 0x3a51, 0x84b6, 0x7434, 0x8476, 0x73d4, 0xa5b9,
+0x7435, 0x7476, 0x6394, 0xadb9, 0xfffd, 0xdefa,
+0xdf3b, 0xffff, 0xb5f9, 0x6bd4, 0x9539, 0x9d38, 0x6bd6, 0x5313, 0x4291, 0x4ad2,
+0x94f6, 0xd6fd, 0x5b52, 0x5353, 0x8cb7, 0x9538, 0x5b53, 0x4292, 0x5b52, 0x9537,
+0xb5fa, 0x7c36, 0x6c35, 0xb5f9, 0xfffd, 0xdefa,
+0xdf3b, 0xffff, 0xb5f8, 0x7434, 0x84b7, 0x298e, 0x8cf6, 0xadf9, 0x9538, 0xadf9,
+0x9d78, 0x5312, 0xadb9, 0xadf9, 0x6bd4, 0x6395, 0x8cf7, 0x7435, 0x9d77, 0xa578,
+0x3a10, 0x6394, 0x7c75, 0xb5f9, 0xfffd, 0xdefa,
+0xdf3b, 0xffff, 0xbe39, 0x63d5, 0x6394, 0x84b6, 0xa5b8, 0x84b7, 0x6353, 0xa5b8,
+0x8cf7, 0x008c, 0x6b93, 0xadb9, 0x190d, 0x7476, 0xadfa, 0x6c35, 0x8cf7, 0xbe3a,
+0x6393, 0x7c75, 0x63d5, 0xb63a, 0xfffd, 0xdefa,
+0xdf3b, 0xffff, 0xb5f9, 0x5354, 0x6354, 0x94f8, 0x5b54, 0x63d4, 0x5b93, 0x84b7,
+0xa578, 0x7434, 0xadb9, 0xb5f9, 0x8cb6, 0x9d78, 0x9537, 0x5b93, 0x6bd5, 0x84b6,
+0x8cf7, 0x84b6, 0x5353, 0xb639, 0xfffd, 0xdefa,
+0xdf3a, 0xfffe, 0xbdf8, 0x63d4, 0x5b53, 0x6394, 0x6354, 0x7434, 0x7433, 0x7435,
+0x7433, 0x9537, 0x7c35, 0x7c34, 0x84b4, 0x7433, 0x7c74, 0x7474, 0x84b5, 0x73d4,
+0x8476, 0x7c35, 0x6393, 0xbe38, 0xfffd, 0xdefa,
+0xdf3a, 0xffbc, 0xf7bc, 0xc67a, 0xbe3a, 0xc67a, 0xc67b, 0xce7a, 0xc67a, 0xc63a,
+0xc67a, 0xc67a, 0xc63a, 0xc63b, 0xc67a, 0xc67a, 0xc63a, 0xc67a, 0xc63a, 0xbdf9,
+0xbdf9, 0xb5f9, 0xc67a, 0xf7bc, 0xfffc, 0xdefa,
+0xdf7b, 0xfffc, 0xffbc, 0xfffc, 0xfffd, 0xfffc, 0xfffc, 0xfffc, 0xfffd, 0xfffd,
+0xfffd, 0xfffc, 0xfffc, 0xfffc, 0xfffc, 0xfffd, 0xfffc, 0xfffb, 0xfffd, 0xfffd,
+0xfffc, 0xfffc, 0xfffd, 0xfffc, 0xfffc, 0xdefa,
+0x9572, 0xe73b, 0xdefa, 0xdefa, 0xdefa, 0xdefa, 0xdefa, 0xdefa, 0xdefa, 0xdefa,
+0xdefa, 0xdefa, 0xe6fa, 0xe6fa, 0xdefa, 0xdefa, 0xdefa, 0xdefa, 0xdefa, 0xdefa,
+0xdefa, 0xdefa, 0xdefa, 0xdefa, 0xe73a, 0xd6b9};
+
+static const unsigned char suitsi[4][30] = {
+ {0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x07, 0x0f, 0x1f, 0x1f, 0x0f, 0x7f, 0x7f, 0x7f, 0x0f, 0x1f, 0x1f, 0x0f, 0x07, 0x00},
+ {0x00, 0xf0, 0xf8, 0xfc, 0xfe, 0xfc, 0xf8, 0xf0, 0xf8, 0xfc, 0xfe, 0xfc, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x7f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00, 0x00},
+ {0x00, 0xc0, 0xe0, 0xe0, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xe0, 0xe0, 0xc0, 0x00, 0x00, 0x03, 0x07, 0x07, 0x0f, 0x0f, 0x7f, 0x7f, 0x7f, 0x0f, 0x0f, 0x07, 0x07, 0x03, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x80, 0xe0, 0xf8, 0xfe, 0xfe, 0xf8, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1f, 0x7f, 0x7f, 0x1f, 0x07, 0x01, 0x00, 0x00, 0x00},
+};
+static const unsigned char suits[4][16] = {
/* Spades */
- {0x00, /* ........ */
- 0x18, /* ...O.... */
- 0x1c, /* ..OOO... */
- 0x3e, /* .OOOOO.. */
- 0x1c, /* .OOOOO.. */
- 0x18, /* ...O.... */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0x78, 0x3c, 0xfe, 0xfe, 0x3c, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00},/* ........ */
/* Hearts */
- {0x00, /* ........ */
- 0x0c, /* ..O.O... */
- 0x1e, /* .OOOOO.. */
- 0x3c, /* .OOOOO.. */
- 0x1e, /* ..OOO... */
- 0x0c, /* ...O.... */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0x3c, 0x7e, 0xfc, 0xf8, 0xfc, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00},/* ........ */
/* Clubs */
- {0x00, /* ........ */
- 0x18, /* ..OOO... */
- 0x0a, /* ...O.... */
- 0x3e, /* .OOOOO.. */
- 0x0a, /* .O.O.O.. */
- 0x18, /* ...O.... */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0x70, 0x34, 0xfe, 0xfe, 0x34, 0x70, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00},/* ........ */
/* Diamonds */
- {0x00, /* ........ */
- 0x08, /* ...O.... */
- 0x1c, /* ..OOO... */
- 0x3e, /* .OOOOO.. */
- 0x1c, /* ..OOO... */
- 0x08, /* ...O.... */
- 0x00, /* ........ */
- 0x00} /* ........ */
+ {0x00, 0x70, 0xfc, 0xfe, 0xfe, 0xfc, 0x70, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00} /* ........ */
};
-static unsigned char numbers[13][8] = {
+static unsigned char numbers[13][16] = {
/* Ace */
- {0x00, /* ........ */
- 0x38, /* ...O.... */
- 0x14, /* ..O.O... */
- 0x12, /* .O...O.. */
- 0x14, /* .OOOOO.. */
- 0x38, /* .O...O.. */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0xf0, 0xfc, 0x7e, 0x36, 0x7e, 0xfc, 0xf0, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01},
/* 2 */
- {0x00, /* ........ */
- 0x24, /* ..OOO... */
- 0x32, /* .O...O.. */
- 0x32, /* ....O... */
- 0x2a, /* ..OO.... */
- 0x24, /* .OOOOO.. */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0x8c, 0xce, 0xe6, 0xf6, 0xbe, 0x9c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00}, /* ........ */
/* 3 */
- {0x00, /* ........ */
- 0x22, /* .OOOO... */
- 0x2a, /* .....O.. */
- 0x2a, /* ..OOO... */
- 0x2a, /* .....O.. */
- 0x14, /* .OOOO... */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0xcc, 0x86, 0xb6, 0xb6, 0xfe, 0xdc, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00}, /* ........ */
/* 4 */
- {0x00, /* ........ */
- 0x10, /* ....O... */
- 0x18, /* ...O.... */
- 0x34, /* ..O..... */
- 0x12, /* .OOOOO.. */
- 0x10, /* ...O.... */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0x3e, 0x3e, 0x30, 0xfe, 0xfe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00}, /* ........ */
/* 5 */
- {0x00, /* ........ */
- 0x2e, /* .OOOOO.. */
- 0x2a, /* .O...... */
- 0x2a, /* .OOOO... */
- 0x2a, /* .....O.. */
- 0x12, /* .OOOO... */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0xbe, 0xbe, 0xb6, 0xb6, 0xf6, 0xe6, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00}, /* ........ */
/* 6 */
- {0x00, /* ........ */
- 0x1c, /* ..OOO... */
- 0x2a, /* .O...... */
- 0x2a, /* .OOOO... */
- 0x2a, /* .O...O.. */
- 0x10, /* ..OOO... */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0xfc, 0xfe, 0xb6, 0xb6, 0xf6, 0xe4, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00}, /* ........ */
/* 7 */
- {0x00, /* ........ */
- 0x22, /* .OOOOO.. */
- 0x12, /* ....O... */
- 0x0a, /* ...O.... */
- 0x06, /* ..O..... */
- 0x02, /* .O...... */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0x86, 0xc6, 0x66, 0x36, 0x1e, 0x0e, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}, /* ........ */
/* 8 */
- {0x00, /* ........ */
- 0x14, /* ..OOO... */
- 0x2a, /* .O...O.. */
- 0x2a, /* ..OOO... */
- 0x2a, /* .O...O.. */
- 0x14, /* ..OOO... */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0xdc, 0xfe, 0xb6, 0xb6, 0xfe, 0xdc, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00}, /* ........ */
/* 9 */
- {0x00, /* ........ */
- 0x04, /* ..OOO... */
- 0x2a, /* .O...O.. */
- 0x2a, /* ..OOOO.. */
- 0x2a, /* .....O.. */
- 0x1c, /* ..OOO... */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0x9c, 0xbe, 0xb6, 0xb6, 0xfe, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00}, /* ........ */
/* 10 */
- {0x00, /* ........ */
- 0x3e, /* .O..O... */
- 0x00, /* .O.O.O.. */
- 0x1c, /* .O.O.O.. */
- 0x22, /* .O.O.O.. */
- 0x1c, /* .O..O... */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0x18, 0x0c, 0xfe, 0x00, 0xfc, 0x86, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00}, /* ........ */
/* Jack */
- {0x00, /* ........ */
- 0x12, /* .OOOOO.. */
- 0x22, /* ...O.... */
- 0x1e, /* ...O.... */
- 0x02, /* .O.O.... */
- 0x02, /* ..O..... */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0xe6, 0xc6, 0x86, 0xfe, 0xfe, 0x06, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00}, /* ........ */
/* Queen */
- {0x00, /* ........ */
- 0x1c, /* ..OOO... */
- 0x22, /* .O...O.. */
- 0x32, /* .O...O.. */
- 0x22, /* .O.O.O.. */
- 0x1c, /* ..OOO... */
- 0x00, /* ........ */
- 0x00},/* ........ */
+ {0x00, 0x7c, 0xfe, 0xc6, 0xe6, 0xfe, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00}, /* ........ */
/* King */
- {0x00, /* ........ */
- 0x3e, /* .O...O.. */
- 0x08, /* .O..O... */
- 0x08, /* .OOO.... */
- 0x14, /* .O..O... */
- 0x22, /* .O...O.. */
- 0x00, /* ........ */
- 0x00} /* ........ */
+ {0x00, 0xfe, 0xfe, 0x38, 0x7c, 0xee, 0xc6, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00} /* ........ */
};
+
+#define FILENAME "sol.cfg"
+
+
#define NOT_A_CARD 255
/* number of cards per suit */
@@ -345,12 +324,29 @@ static unsigned char numbers[13][8] = {
#define NOT_A_COL 255
-/* number of cards that are drawn on the remains' stack (by pressing F2) */
-#define CARDS_PER_DRAW 3
/* size of a card on the screen */
-#define CARD_WIDTH 14
-#define CARD_HEIGHT 10
+#if (CONFIG_KEYPAD == IRIVER_H300_PAD)
+#define CARD_WIDTH 26
+#define CARD_HEIGHT 34
+#else
+#define CARD_WIDTH 18
+#define CARD_HEIGHT 24
+#endif
+
+/* where the cards start */
+#define CARD_START CARD_HEIGHT +4
+
+#if (CONFIG_KEYPAD == IRIVER_H300_PAD)
+#define KNOWN_CARD 23
+#define NOT_KNOWN_CARD 30
+#else
+#define KNOWN_CARD 13
+#define NOT_KNOWN_CARD 20
+#endif
+
+/* background color */
+#define background_color LCD_RGBPACK(0,157,0)
typedef struct card {
unsigned char suit : 2;
@@ -503,51 +499,74 @@ int solitaire_help(void){
lastbutton = button;
}
}
+#define CFGFILE_VERSION 0
+int draw_type;
+
+
+unsigned char change_draw(unsigned char draw){
+ if (draw == 0)
+ return 1;
+ else
+ return 0;
+}
+static struct configdata config[] = {
+ { TYPE_INT, 0, 1, &draw_type, "draw_type", NULL, NULL }
+};
/* menu return codes */
#define MENU_RESUME 0
#define MENU_RESTART 1
-#define MENU_HELP 2
-#define MENU_QUIT 3
-#define MENU_USB 4
+#define MENU_HELP 3
+#define MENU_QUIT 4
+#define MENU_USB 5
+#define MENU_OPT 2
/* menu item number */
-#define MENU_LENGTH 4
+#define MENU_LENGTH 5
/* different menu behaviors */
-#define MENU_BEFOREGAME 0
-#define MENU_DURINGGAME 1
+#define MENU_BEFOREGAME 0
+#define MENU_BEFOREGAMEOP 1
+#define MENU_DURINGGAME 2
+unsigned char when;
/* the menu */
/* text displayed changes depending on the 'when' parameter */
-int solitaire_menu(unsigned char when)
+int solitaire_menu(unsigned char when_n)
{
- static char menu[2][MENU_LENGTH][13] =
+ static char menu[3][MENU_LENGTH][17] =
{ { "Start Game",
"",
+ "Draw Three Cards",
+ "Help",
+ "Quit" },
+ { "Start Game",
+ "",
+ "Draw One Card",
"Help",
"Quit" },
{ "Resume Game",
"Restart Game",
+ "",
"Help",
- "Quit"}
+ "Quit"},
};
+
int i;
int cursor=0;
int button;
int fh;
-
+ when=when_n;
rb->lcd_getstringsize("A", NULL, &fh);
fh++;
- if(when!=MENU_BEFOREGAME && when!=MENU_DURINGGAME)
+ if(when != MENU_BEFOREGAMEOP && when!=MENU_BEFOREGAME && when!=MENU_DURINGGAME)
when = MENU_DURINGGAME;
while(1){
rb->lcd_clear_display();
-
rb->lcd_putsxy(20, 1, "Solitaire");
for(i = 0; i<MENU_LENGTH; i++){
@@ -563,11 +582,11 @@ int solitaire_menu(unsigned char when)
button = rb->button_get(true);
switch(button){
- case SOL_UP:
+ case BUTTON_UP:
cursor = (cursor + MENU_LENGTH - 1)%MENU_LENGTH;
break;
- case SOL_DOWN:
+ case BUTTON_DOWN:
cursor = (cursor + 1)%MENU_LENGTH;
break;
@@ -581,6 +600,7 @@ int solitaire_menu(unsigned char when)
switch(cursor){
case MENU_RESUME:
case MENU_RESTART:
+ case MENU_OPT:
case MENU_QUIT:
return cursor;
@@ -598,10 +618,11 @@ int solitaire_menu(unsigned char when)
#endif
rb->splash(HZ, true, "Solitaire for Rockbox by dionoea");
break;
-
- case SOL_QUIT:
+ case BUTTON_ON:
+ return MENU_OPT;
+ case BUTTON_OFF:
return MENU_QUIT;
-
+
default:
if(rb->default_event_handler(button) == SYS_USB_CONNECTED)
return MENU_USB;
@@ -624,18 +645,32 @@ card deck[SUITS * CARDS_PER_SUIT];
/* the remaining cards */
unsigned char rem;
unsigned char cur_rem;
+unsigned char coun_rem;
/* the 7 game columns */
unsigned char cols[COL_NUM];
+int CARDS_PER_DRAW;
/* the 4 final stacks */
unsigned char stacks[SUITS];
/* initialize the game */
void solitaire_init(void){
+
unsigned char c;
int i,j;
-
+#if LCD_DEPTH>1
+ rb->lcd_set_foreground(LCD_BLACK);
+#ifdef HAVE_LCD_COLOR
+ rb->lcd_set_background(background_color);
+#endif
+#endif
+/* number of cards that are drawn on the remains' stack (by pressing F2) */
+ if(draw_type == 0) {
+ CARDS_PER_DRAW =3;
+ } else {
+ CARDS_PER_DRAW=1;
+ }
/* init deck */
for(i=0;i<SUITS;i++){
for(j=0;j<CARDS_PER_SUIT;j++){
@@ -688,6 +723,8 @@ void solitaire_init(void){
/* init the remainder */
cur_rem = NOT_A_CARD;
+
+ coun_rem=0;
}
/* find the column number in which 'card' can be found */
@@ -835,6 +872,7 @@ unsigned char move_card(unsigned char dest_col, unsigned char src_card){
/* if src card is the first card from the stack */
if(src_card_prev == NOT_A_CARD){
rem = deck[src_card].next;
+ coun_rem = coun_rem-1;
}
/* if src card is not the first card from the stack */
else {
@@ -842,6 +880,7 @@ unsigned char move_card(unsigned char dest_col, unsigned char src_card){
}
cur_rem = src_card_prev;
deck[src_card].next = NOT_A_CARD;
+ coun_rem = coun_rem-1;
}
/* if the src card is from somewhere else, just take everything */
else {
@@ -855,11 +894,13 @@ unsigned char move_card(unsigned char dest_col, unsigned char src_card){
deck[src_card_prev].next = NOT_A_CARD;
}
}
-
+ sel_card = NOT_A_CARD;
/* tada ! */
return MOVE_OK;
}
+
+
#define SOLITAIRE_WIN 0
#define SOLITAIRE_QUIT 1
#define SOLITAIRE_USB 2
@@ -874,21 +915,35 @@ unsigned char move_card(unsigned char dest_col, unsigned char src_card){
/* the game */
int solitaire(void){
- int i,j;
+ int i,j,x;
int button, lastbutton = 0;
- unsigned char c;
+ unsigned char c,h,prevcard;
int biggest_col_length;
-
+
+ configfile_init(rb);
+ configfile_load(FILENAME, config, 1, 0);
+
rb->srand( *rb->current_tick );
-
- switch(solitaire_menu(MENU_BEFOREGAME)) {
- case MENU_QUIT:
+ switch(solitaire_menu(draw_type==0?MENU_BEFOREGAME:MENU_BEFOREGAMEOP)) {
+ case MENU_QUIT:
return SOLITAIRE_QUIT;
case MENU_USB:
return SOLITAIRE_USB;
+ case MENU_OPT:
+ draw_type=change_draw(draw_type);
+ configfile_save(FILENAME, config, 1, 0);
+ when=draw_type==0?MENU_BEFOREGAME:MENU_BEFOREGAMEOP;
+ return NULL;
}
-
+#if LCD_DEPTH>1
+ rb->lcd_set_foreground(LCD_BLACK);
+#ifdef HAVE_LCD_COLOR
+ rb->lcd_set_background(background_color);
+#else
+ rb->lcd_set_background(LCD_DEFAULT_BG);
+#endif
+#endif
solitaire_init();
while(true){
@@ -918,63 +973,100 @@ int solitaire(void){
/* draw the columns */
for(i=0;i<COL_NUM;i++){
c = cols[i];
- j = 0;
+ j = CARD_START;
while(true){
if(c==NOT_A_CARD) {
/* draw the cursor on empty columns */
if(cur_col == i){
rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
- rb->lcd_fillrect(i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM+2, 2, CARD_WIDTH-3, CARD_HEIGHT-1);
+ rb->lcd_fillrect(1+i*(LCD_WIDTH-2)/COL_NUM+1, j+1, CARD_WIDTH-1, CARD_HEIGHT-1);
}
break;
}
/* clear the card's spot */
+
rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
- rb->lcd_fillrect(i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM, j+1, CARD_WIDTH, CARD_HEIGHT-1);
+ rb->lcd_fillrect(1+i*(LCD_WIDTH - 2)/COL_NUM, j+1, CARD_WIDTH, CARD_HEIGHT-1);
rb->lcd_set_drawmode(DRMODE_SOLID);
/* known card */
- if(deck[c].known){
+ if(deck[c].known == 1){
+#if LCD_DEPTH>1
+ #ifdef HAVE_LCD_COLOR
+ rb->lcd_set_foreground(LCD_WHITE);
+ rb->lcd_set_background(LCD_WHITE);
+ #else
+ rb->lcd_set_foreground(LCD_DEFAULT_BG);
+ rb->lcd_set_background(LCD_DEFAULT_BG);
+ #endif
+#endif
+ rb->lcd_fillrect(1+i*(LCD_WIDTH - 2)/COL_NUM+1, j+1, CARD_WIDTH-1, CARD_HEIGHT-1);
#if LCD_DEPTH>1
rb->lcd_set_foreground(colors[deck[c].suit]);
#endif
- rb->lcd_mono_bitmap(numbers[deck[c].num], i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM+1, j, 8, 8);
- rb->lcd_mono_bitmap(suits[deck[c].suit], i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM+7, j, 8, 8);
+ rb->lcd_mono_bitmap(numbers[deck[c].num], 1+i*(LCD_WIDTH - 2)/COL_NUM+1, j+1, BMPWIDTH_c, BMPHEIGHT_c);
+ rb->lcd_mono_bitmap(suits[deck[c].suit], 1+i*(LCD_WIDTH - 2)/COL_NUM+ BMPWIDTH_c +2, j+1, BMPWIDTH_c, BMPHEIGHT_c);
#if LCD_DEPTH>1
rb->lcd_set_foreground(LCD_BLACK);
+#ifdef HAVE_LCD_COLOR
+ rb->lcd_set_background(background_color);
+#endif
+#endif
+ } else {
+#ifdef HAVE_LCD_COLOR
+ rb->lcd_bitmap(backside, 1+i*(LCD_WIDTH - 2)/COL_NUM+1, j+1, BMPWIDTH_BACKSIDE, BMPHEIGHT_BACKSIDE);
#endif
}
/* draw top line of the card */
- rb->lcd_drawline(i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM+1,j,i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM+CARD_WIDTH-1,j);
+ rb->lcd_drawline(1+i*(LCD_WIDTH - 2)/COL_NUM+1,j,1+i*(LCD_WIDTH - 2)/COL_NUM+CARD_WIDTH-1,j);
/* selected card */
if(c == sel_card && sel_card != NOT_A_CARD){
- rb->lcd_drawrect(i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM+1, j+1, CARD_WIDTH-1, CARD_HEIGHT-1);
+ rb->lcd_drawrect(1+i*(LCD_WIDTH - 2)/COL_NUM+1, j+1, CARD_WIDTH-1, CARD_HEIGHT-1);
}
/* cursor (or not) */
if(c == cur_card){
rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
- rb->lcd_fillrect(i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM+1, j+1, CARD_WIDTH-1, CARD_HEIGHT-1);
+ rb->lcd_fillrect(1+i*(LCD_WIDTH - 2)/COL_NUM+1, j+1, CARD_WIDTH-1, CARD_HEIGHT-1);
rb->lcd_set_drawmode(DRMODE_SOLID);
/* go to the next card */
c = deck[c].next;
if(c == NOT_A_CARD) break;
- j += CARD_HEIGHT - 2;
+ else {
+ if(deck[c].known == 0) {
+ j += CARD_HEIGHT - NOT_KNOWN_CARD;
+ } else {
+ j += CARD_HEIGHT - KNOWN_CARD;
+ }
+ }
} else {
/* go to the next card */
- c = deck[c].next;
+ h = c;
+ c = deck[c].next;
if(c == NOT_A_CARD) break;
- j += min(CARD_HEIGHT - 2, (LCD_HEIGHT - CARD_HEIGHT)/biggest_col_length);
+ if(c!=NOT_A_CARD) {
+ if(deck[h].known == 0) {
+ /*changeeee*/ j += CARD_HEIGHT - NOT_KNOWN_CARD;
+ } else {
+ j += min(CARD_HEIGHT - KNOWN_CARD, (LCD_HEIGHT - CARD_START - CARD_HEIGHT)/biggest_col_length);
+ }
+ }
}
}
if(cols[i]!=NOT_A_CARD){
/* draw line to the left of the column */
- rb->lcd_drawline(i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM,1,i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM,j+CARD_HEIGHT-1);
+ rb->lcd_drawline(1+i*(LCD_WIDTH - 2)/COL_NUM,CARD_START,1+i*(LCD_WIDTH - 2)/COL_NUM,j+CARD_HEIGHT-1);
/* draw line to the right of the column */
- rb->lcd_drawline(i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM+CARD_WIDTH,1,i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM+CARD_WIDTH,j+CARD_HEIGHT-1);
+ rb->lcd_drawline(1+i*(LCD_WIDTH - 2)/COL_NUM+CARD_WIDTH,CARD_START,1+i*(LCD_WIDTH - 2)/COL_NUM+CARD_WIDTH,j+CARD_HEIGHT-1);
/* draw bottom of the last card */
- rb->lcd_drawline(i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM+1,j+CARD_HEIGHT,i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM+CARD_WIDTH-1,j+CARD_HEIGHT);
+ rb->lcd_drawline(1+i*(LCD_WIDTH - 2)/COL_NUM+1,j+CARD_HEIGHT,1+i*(LCD_WIDTH - 2)/COL_NUM+CARD_WIDTH-1,j+CARD_HEIGHT);
}
}
-
+#if LCD_DEPTH>1
+ rb->lcd_set_foreground(LCD_BLACK);
+#ifdef HAVE_LCD_COLOR
+ rb->lcd_set_background(background_color);
+#endif
+#endif
+ rb->lcd_set_drawmode(DRMODE_SOLID);
/* draw the stacks */
for(i=0; i<SUITS; i++){
c = stacks[i];
@@ -983,67 +1075,177 @@ int solitaire(void){
c = deck[c].next;
}
}
+
+ if(c != NOT_A_CARD) {
+#if LCD_DEPTH>1
+ #ifdef HAVE_LCD_COLOR
+ rb->lcd_set_foreground(LCD_WHITE);
+ rb->lcd_set_background(LCD_WHITE);
+ #else
+ rb->lcd_set_foreground(LCD_DEFAULT_BG);
+ rb->lcd_set_background(LCD_DEFAULT_BG);
+ #endif
+#endif
+ rb->lcd_fillrect(LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2+1, 2, CARD_WIDTH-1, CARD_HEIGHT-1);
+#if LCD_DEPTH>1
+ rb->lcd_set_foreground(colors[i]);
+#endif
+ rb->lcd_mono_bitmap(numbers[deck[c].num], LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2+1, 2, BMPWIDTH_c, BMPHEIGHT_c);
+ rb->lcd_mono_bitmap(suits[deck[c].suit], LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2+10, 2, BMPWIDTH_c, BMPHEIGHT_c);
+ } else {
+#if LCD_DEPTH>1
+ #ifdef HAVE_LCD_COLOR
+ rb->lcd_set_foreground(LCD_WHITE);
+ rb->lcd_set_background(LCD_WHITE);
+ #else
+ rb->lcd_set_foreground(LCD_DEFAULT_BG);
+ rb->lcd_set_background(LCD_DEFAULT_BG);
+ #endif
+#endif
+ rb->lcd_fillrect(LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2+1, 2, CARD_WIDTH-1, CARD_HEIGHT-1);
#if LCD_DEPTH>1
rb->lcd_set_foreground(colors[i]);
+#endif
+#ifdef HAVE_LCD_COLOR
+ rb->lcd_mono_bitmap(suitsi[i], LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2+(CARD_WIDTH/2-7), CARD_HEIGHT/2-7, 15, 16);
#endif
- if(c != NOT_A_CARD) {
- rb->lcd_mono_bitmap(numbers[deck[c].num], LCD_WIDTH2 - CARD_WIDTH+1, i*CARD_HEIGHT, 8, 8);
}
- rb->lcd_mono_bitmap(suits[i], LCD_WIDTH2 - CARD_WIDTH+7, i*CARD_HEIGHT, 8, 8);
#if LCD_DEPTH>1
- rb->lcd_set_foreground(colors[deck[c].suit]);
+ rb->lcd_set_foreground(LCD_BLACK);
+#ifdef HAVE_LCD_COLOR
+ rb->lcd_set_background(background_color);
+#endif
#endif
/* draw a selected card */
if(c != NOT_A_CARD) {
if(sel_card == c){
- rb->lcd_drawrect(LCD_WIDTH2 - CARD_WIDTH+1, i*CARD_HEIGHT + 1, CARD_WIDTH-1, CARD_HEIGHT-1);
+ rb->lcd_drawrect(LCD_WIDTH2 -(CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2+1, 2, CARD_WIDTH-1, CARD_HEIGHT-1);
}
- }
- rb->lcd_drawline(LCD_WIDTH2 - CARD_WIDTH+1, i*CARD_HEIGHT,LCD_WIDTH2 - 1,i*CARD_HEIGHT);
- rb->lcd_drawline(LCD_WIDTH2 - CARD_WIDTH,i*CARD_HEIGHT+1,LCD_WIDTH2 - CARD_WIDTH,(i+1)*CARD_HEIGHT-1);
- rb->lcd_drawline(LCD_WIDTH2 - CARD_WIDTH+1,(i+1)*CARD_HEIGHT,LCD_WIDTH2 - 1,(i+1)*CARD_HEIGHT);
+ }
+ rb->lcd_drawline(LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2+1, 1,LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2+CARD_WIDTH,1);
+ rb->lcd_drawline(LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2 ,2,LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2,CARD_HEIGHT);
+ rb->lcd_drawline(LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2+1,CARD_HEIGHT+1,LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2+CARD_WIDTH - 1,CARD_HEIGHT+1);
#if BIG_SCREEN
- rb->lcd_drawline(LCD_WIDTH2,i*CARD_HEIGHT+1,LCD_WIDTH2,(i+1)*CARD_HEIGHT-1);
+ rb->lcd_drawline(LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2+CARD_WIDTH,2,LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2+CARD_WIDTH,CARD_HEIGHT);
#endif
/* draw the cursor on one of the stacks */
if(cur_col == STACKS_COL + i){
rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
- rb->lcd_fillrect(LCD_WIDTH2 - CARD_WIDTH+1, i*CARD_HEIGHT + 1, CARD_WIDTH-1, CARD_HEIGHT-1);
+ rb->lcd_fillrect(LCD_WIDTH2 - (CARD_WIDTH*4+8)+CARD_WIDTH*i+i*2+1, 2, CARD_WIDTH-1, CARD_HEIGHT-1);
rb->lcd_set_drawmode(DRMODE_SOLID);
}
}
/* draw the remains */
- if(rem != NOT_A_CARD) {
- rb->lcd_drawline(LCD_WIDTH2 - CARD_WIDTH+1,LCD_HEIGHT-CARD_HEIGHT-1,LCD_WIDTH2 - 1,LCD_HEIGHT-CARD_HEIGHT-1);
- rb->lcd_drawline(LCD_WIDTH2 - CARD_WIDTH,LCD_HEIGHT-CARD_HEIGHT,LCD_WIDTH2 - CARD_WIDTH,LCD_HEIGHT-2);
- rb->lcd_drawline(LCD_WIDTH2 - CARD_WIDTH+1,LCD_HEIGHT-1,LCD_WIDTH2 - 1,LCD_HEIGHT-1);
-#if BIG_SCREEN
- rb->lcd_drawline(LCD_WIDTH2,LCD_HEIGHT-CARD_HEIGHT,LCD_WIDTH2,LCD_HEIGHT-2);
+
+
+ if(rem != NOT_A_CARD) {
+ coun_rem = coun_rem>2?coun_rem=2:coun_rem;
+ if(cur_rem != NOT_A_CARD && find_prev_card(cur_rem) != NOT_A_CARD && CARDS_PER_DRAW != 1) {
+ j = (coun_rem)*(BMPWIDTH_c+2);
+ for(i=0;i<=coun_rem;i++) {
+ if (i>0 && i<3){
+#if LCD_DEPTH>1
+ #ifdef HAVE_LCD_COLOR
+ rb->lcd_set_foreground(LCD_WHITE);
+ rb->lcd_set_background(LCD_WHITE);
+ #else
+ rb->lcd_set_foreground(LCD_DEFAULT_BG);
+ rb->lcd_set_background(LCD_DEFAULT_BG);
+ #endif
#endif
- if(cur_rem != NOT_A_CARD){
+ rb->lcd_fillrect(CARD_WIDTH+4+j+1, 2, BMPWIDTH_c+1, CARD_HEIGHT-1);
+ #if LCD_DEPTH>1
+ rb->lcd_set_foreground(LCD_BLACK);
+ #endif
+ rb->lcd_drawline(CARD_WIDTH+4+j+1,1,CARD_WIDTH+4+j+BMPWIDTH_c+2,1); /* top line */
+ rb->lcd_drawline(CARD_WIDTH+4+j+1,CARD_HEIGHT+1,CARD_WIDTH+4+j+BMPWIDTH_c+2,CARD_HEIGHT+1); /* bottom line */
+ rb->lcd_drawline(CARD_WIDTH+4+j,2,CARD_WIDTH+4+j,CARD_HEIGHT); /* right line */
+
+
+ prevcard = cur_rem;
+ for(x=0;i>x;x++)
+ prevcard = find_prev_card(prevcard);
+ #if LCD_DEPTH>1
+ rb->lcd_set_foreground(colors[deck[prevcard].suit]);
+ #ifdef HAVE_LCD_COLOR
+ rb->lcd_set_background(LCD_WHITE);
+ #endif
+ #endif
+ rb->lcd_mono_bitmap(numbers[deck[prevcard].num], CARD_WIDTH+4+j+1, 3, BMPWIDTH_c, BMPHEIGHT_c);
+ rb->lcd_mono_bitmap(suits[deck[prevcard].suit], CARD_WIDTH+4+j+1, 4+BMPHEIGHT_c, BMPWIDTH_c, BMPHEIGHT_c);
+
+
+ }
+ j -= BMPWIDTH_c+2;
+ }
+ }
#if LCD_DEPTH>1
- rb->lcd_set_foreground(colors[deck[cur_rem].suit]);
+ rb->lcd_set_foreground(LCD_BLACK);
#endif
- rb->lcd_mono_bitmap(numbers[deck[cur_rem].num], LCD_WIDTH2 - CARD_WIDTH+1, LCD_HEIGHT-CARD_HEIGHT, 8, 8);
- rb->lcd_mono_bitmap(suits[deck[cur_rem].suit], LCD_WIDTH2 - CARD_WIDTH+7, LCD_HEIGHT-CARD_HEIGHT, 8, 8);
- /* draw a selected card */
+ if(CARDS_PER_DRAW==1 || cur_rem==NOT_A_CARD)
+ j=0;
+ else
+ j=(coun_rem)*(BMPWIDTH_c+2);
+ if(cur_rem != NOT_A_CARD){
+ rb->lcd_drawline(CARD_WIDTH+4+j+1,1,CARD_WIDTH+4+j+CARD_WIDTH-1,1); /* top line */
+ rb->lcd_drawline(CARD_WIDTH+4+j,2,CARD_WIDTH+4+j,CARD_HEIGHT); /* left line */
+ rb->lcd_drawline(CARD_WIDTH+4+j+1,CARD_HEIGHT+1,CARD_WIDTH+4+j+CARD_WIDTH - 1,CARD_HEIGHT+1); /* bottom line */
+ rb->lcd_drawline(CARD_WIDTH+4+j+CARD_WIDTH,2,CARD_WIDTH+4+j+CARD_WIDTH,CARD_HEIGHT); /* right line */
+ }
+
+ rb->lcd_drawline(2,1,CARD_WIDTH+1,1); /* top line */
+ rb->lcd_drawline(1,2,1,CARD_HEIGHT); /* left line */
+ rb->lcd_drawline(2,CARD_HEIGHT+1,CARD_WIDTH + 1,CARD_HEIGHT+1); /* bottom line */
+ rb->lcd_drawline(CARD_WIDTH+2,2,CARD_WIDTH+2,CARD_HEIGHT); /* right line */
+
+ if(cur_rem != NOT_A_CARD){
#if LCD_DEPTH>1
- rb->lcd_set_foreground(LCD_BLACK);
+ #ifdef HAVE_LCD_COLOR
+ rb->lcd_set_foreground(LCD_WHITE);
+ rb->lcd_set_background(LCD_WHITE);
+ #else
+ rb->lcd_set_foreground(LCD_DEFAULT_BG);
+ rb->lcd_set_background(LCD_DEFAULT_BG);
+ #endif
#endif
- if(sel_card == cur_rem){
- rb->lcd_drawrect(LCD_WIDTH2 - CARD_WIDTH+1, LCD_HEIGHT-CARD_HEIGHT,CARD_WIDTH-1, CARD_HEIGHT-1);
+ rb->lcd_fillrect(CARD_WIDTH+4+j+1, 2, CARD_WIDTH-1, CARD_HEIGHT-1);
+ #if LCD_DEPTH>1
+ rb->lcd_set_foreground(colors[deck[cur_rem].suit]);
+ #endif
+ rb->lcd_mono_bitmap(numbers[deck[cur_rem].num], CARD_WIDTH+4+j+1, 3, BMPWIDTH_c, BMPHEIGHT_c);
+ rb->lcd_mono_bitmap(suits[deck[cur_rem].suit], CARD_WIDTH+4+j+10, 3, BMPWIDTH_c, BMPHEIGHT_c);
+ /* draw a selected card */
+ #if LCD_DEPTH>1
+ rb->lcd_set_foreground(LCD_BLACK);
+ #ifdef HAVE_LCD_COLOR
+ rb->lcd_set_background(background_color);
+ #endif
+ #endif
+ if(sel_card == cur_rem){
+ rb->lcd_drawrect(CARD_WIDTH+4+j+1, 2,CARD_WIDTH-1, CARD_HEIGHT-1);
+ }
}
+ if(rem != NOT_A_CARD){
+#ifdef HAVE_LCD_COLOR
+ rb->lcd_bitmap(backside, 2, 2, BMPWIDTH_BACKSIDE, BMPHEIGHT_BACKSIDE);
+#endif
+ }
}
- }
+
+
/* draw the cursor */
- if(cur_col == REM_COL){
+ if(cur_col == REM_COL && rem != NOT_A_CARD){
+ rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
+ rb->lcd_fillrect(CARD_WIDTH+4+j+1, 2,CARD_WIDTH-1, CARD_HEIGHT-1);
+ rb->lcd_set_drawmode(DRMODE_SOLID);
+ } else if(cur_col == REM_COL && rem == NOT_A_CARD) {
rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
- rb->lcd_fillrect(LCD_WIDTH2 - CARD_WIDTH+1, LCD_HEIGHT-CARD_HEIGHT,CARD_WIDTH-1, CARD_HEIGHT-1);
+ rb->lcd_fillrect(CARD_WIDTH+4+1, 2,CARD_WIDTH-1, CARD_HEIGHT-1);
rb->lcd_set_drawmode(DRMODE_SOLID);
}
-
-
+
+
rb->lcd_update();
/* what to do when a key is pressed ... */
@@ -1104,7 +1306,8 @@ int solitaire(void){
cur_col = (cur_col - COL_NUM + 1)%(SUITS + 1) + COL_NUM;
if(cur_col == REM_COL){
cur_card = cur_rem;
- } else {
+ }
+ else {
cur_card = find_last_card(cur_col);
}
break;
@@ -1154,6 +1357,7 @@ int solitaire(void){
#endif
if(cur_card != NOT_A_CARD){
move_card(deck[cur_card].suit + STACKS_COL, cur_card);
+ sel_card = NOT_A_CARD;
}
break;
@@ -1163,11 +1367,14 @@ int solitaire(void){
if(lastbutton != SOL_MOVE_PRE)
break;
#endif
+
if(sel_card == NOT_A_CARD) {
- if(cur_card != NOT_A_CARD){
+ if(cur_card != NOT_A_CARD) {
/* reveal a hidden card */
if(deck[cur_card].next == NOT_A_CARD && deck[cur_card].known==0){
deck[cur_card].known = 1;
+ } else if(cur_col == REM_COL && cur_rem == NOT_A_CARD) {
+ break;
/* select a card */
} else {
sel_card = cur_card;
@@ -1192,7 +1399,9 @@ int solitaire(void){
if(lastbutton != SOL_REM2CUR_PRE)
break;
#endif
+ coun_rem = coun_rem-1;
move_card(cur_col, cur_rem);
+ sel_card = NOT_A_CARD;
break;
/* If the card on top of the remains can be put on one */
@@ -1204,9 +1413,26 @@ int solitaire(void){
#endif
if(cur_rem != NOT_A_CARD){
move_card(deck[cur_rem].suit + COL_NUM, cur_rem);
+ sel_card = NOT_A_CARD;
+ coun_rem = coun_rem-1;
}
break;
+
+#ifdef SOL_REM
+ case SOL_REM:
+ if(sel_card != NOT_A_CARD){
+ /* unselect selected card */
+ sel_card = NOT_A_CARD;
+ break;
+ }
+ if(rem != NOT_A_CARD && cur_rem != NOT_A_CARD) {
+ sel_card=cur_rem;
+ break;
+ }
+ break;
+#endif
+
/* unselect selected card or ... */
/* draw new cards from the remains of the deck */
case SOL_DRAW:
@@ -1221,38 +1447,47 @@ int solitaire(void){
}
if(rem != NOT_A_CARD) {
int cur_rem_old = cur_rem;
+ coun_rem = 0;
/* draw new cards form the remains of the deck */
- if(cur_rem == NOT_A_CARD){
+ if(cur_rem == NOT_A_CARD){ /*if the cursor card is null*/
cur_rem = rem;
i = CARDS_PER_DRAW - 1;
} else {
i = CARDS_PER_DRAW;
}
+
while(i>0 && deck[cur_rem].next != NOT_A_CARD){
cur_rem = deck[cur_rem].next;
i--;
+ coun_rem = coun_rem +1;
}
/* test if any cards are really left on */
/* the remains' stack */
if(i == CARDS_PER_DRAW){
cur_rem = NOT_A_CARD;
+ coun_rem = 0;
}
/* if cursor was on remains' stack when new cards were
* drawn, put cursor on top of remains' stack */
- if(cur_col == REM_COL && cur_card == cur_rem_old)
+ if(cur_col == REM_COL && cur_card == cur_rem_old) {
cur_card = cur_rem;
+ sel_card = NOT_A_CARD;
+ }
}
break;
/* Show the menu */
case SOL_QUIT:
+#if LCD_DEPTH>1
+ rb->lcd_set_background(LCD_DEFAULT_BG);
+#endif
switch(solitaire_menu(MENU_DURINGGAME)){
case MENU_QUIT:
return SOLITAIRE_QUIT;
case MENU_USB:
return SOLITAIRE_USB;
-
+
case MENU_RESTART:
solitaire_init();
break;
@@ -1285,9 +1520,9 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
(void)parameter;
rb = api;
/* end of plugin init */
-
/* Welcome to Solitaire ! */
- rb->splash(HZ*2, true, "Welcome to Solitaire !");
+
+ rb->splash(HZ, true, "Welcome to Solitaire !");
/* play the game :) */
/* Keep playing if a game was won (that means display the menu after */