diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2005-10-06 12:42:19 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2005-10-06 12:42:19 +0000 |
commit | 1c3a83c44e6dd18990d813c2f12e83bab67f313a (patch) | |
tree | 59b6ad9145b1c49070b014dbd48e9fc1dcb20709 | |
parent | af48260399151e575bc40c7a648e3a2e0037e04e (diff) |
Patch #1264727 by Dave Hooper, Colorize red cards on screens with LCD_DEPTH > 1
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7583 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/plugins/solitaire.c | 135 |
1 files changed, 81 insertions, 54 deletions
diff --git a/apps/plugins/solitaire.c b/apps/plugins/solitaire.c index 89cadc3592..b2af0828e2 100644 --- a/apps/plugins/solitaire.c +++ b/apps/plugins/solitaire.c @@ -23,11 +23,10 @@ Solitaire by dionoea use arrows to move the cursor use ON to select cards, move cards, reveal hidden cards, ... use PLAY to move a card from the remains' stack to the top of the cursor -use F1 to put card under cursor on one of the 4 final color stacks +use F1 to put card under cursor on one of the 4 final stacks use F2 to un-select card if a card was selected, else draw 3 new cards out of the remains' stack -use F3 to put card on top of the remains' stack on one of the 4 final color - stacks +use F3 to put card on top of the remains' stack on one of the 4 final stacks *****************************************************************************/ @@ -115,27 +114,37 @@ static struct plugin_api* rb; #define HELP_SOL_MOVE "ON: Select cards, Move cards, reveal hidden cards ..." #define HELP_SOL_DRAW "F2: Un-select a card if it was selected. Else, draw 3 new cards out of the remains' stack." #define HELP_SOL_REM2CUR "PLAY: Put the card on top of the remains' stack on top of the cursor." -#define HELP_SOL_CUR2STACK "F1: Put the card under the cursor on one of the 4 final color stacks." -#define HELP_SOL_REM2STACK "F3: Put the card on top of the remains' stack on one of the 4 final color stacks." +#define HELP_SOL_CUR2STACK "F1: Put the card under the cursor on one of the 4 final stacks." +#define HELP_SOL_REM2STACK "F3: Put the card on top of the remains' stack on one of the 4 final stacks." #elif CONFIG_KEYPAD == ONDIO_PAD #define HELP_SOL_MOVE "MODE: Select cards, Move cards, reveal hidden cards ..." #define HELP_SOL_DRAW "MODE..: Un-select a card if it was selected. Else, draw 3 new cards out of the remains' stack." #define HELP_SOL_REM2CUR "LEFT..: Put the card on top of the remains' stack on top of the cursor." -#define HELP_SOL_CUR2STACK "RIGHT..: Put the card under the cursor on one of the 4 final color stacks." -#define HELP_SOL_REM2STACK "UP..: Put the card on top of the remains' stack on one of the 4 final color stacks." +#define HELP_SOL_CUR2STACK "RIGHT..: Put the card under the cursor on one of the 4 final stacks." +#define HELP_SOL_REM2STACK "UP..: Put the card on top of the remains' stack on one of the 4 final stacks." #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ (CONFIG_KEYPAD == IRIVER_H300_PAD) #define HELP_SOL_MOVE "SELECT: Select cards, Move cards, reveal hidden cards ..." #define HELP_SOL_DRAW "REC: Un-select a card if it was selected. Else, draw 3 new cards out of the remains' stack." #define HELP_SOL_REM2CUR "PLAY+LEFT: Put the card on top of the remains' stack on top of the cursor." -#define HELP_SOL_CUR2STACK "SELECT..: Put the card under the cursor on one of the 4 final color stacks." -#define HELP_SOL_REM2STACK "PLAY+RIGHT: Put the card on top of the remains' stack on one of the 4 final color stacks." +#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." #endif -static unsigned char colors[4][8] = { +#if LCD_DEPTH>1 +#ifdef HAVE_LCD_COLOR +static const unsigned struct rgb colors[4] = { + { 0, 0, 0 }, { LCD_MAX_RED, 0, 0 }, { 0, 0, 0 }, { LCD_MAX_RED, 0, 0 } +}; +#else +static const int colors[4] = { LCD_BLACK, LCD_MAX_LEVEL/2, LCD_BLACK, LCD_MAX_LEVEL/2 }; +#endif +#endif + +static const unsigned char suits[4][8] = { /* Spades */ {0x00, /* ........ */ 0x18, /* ...O.... */ @@ -296,20 +305,20 @@ static unsigned char numbers[13][8] = { #define NOT_A_CARD 255 -/* number of cards per color */ -#define CARDS_PER_COLOR 13 +/* number of cards per suit */ +#define CARDS_PER_SUIT 13 -/* number of colors */ -#define COLORS 4 +/* number of suits */ +#define SUITS 4 /* number of columns */ #define COL_NUM 7 /* pseudo column numbers to be used for cursor coordinates */ -/* columns COL_NUM t COL_NUM + COLORS - 1 correspond to the color stacks */ +/* columns COL_NUM t COL_NUM + SUITS - 1 correspond to the final stacks */ #define STACKS_COL COL_NUM -/* column COL_NUM + COLORS corresponds to the remains' stack */ -#define REM_COL (STACKS_COL + COLORS) +/* column COL_NUM + SUITS corresponds to the remains' stack */ +#define REM_COL (STACKS_COL + SUITS) #define NOT_A_COL 255 @@ -321,7 +330,7 @@ static unsigned char numbers[13][8] = { #define CARD_HEIGHT 10 typedef struct card { - unsigned char color : 2; + unsigned char suit : 2; unsigned char num : 4; unsigned char known : 1; unsigned char used : 1;/* this is what is used when dealing cards */ @@ -331,11 +340,11 @@ typedef struct card { unsigned char next_random_card(card *deck){ unsigned char i,r; - r = rb->rand()%(COLORS * CARDS_PER_COLOR)+1; + r = rb->rand()%(SUITS * CARDS_PER_SUIT)+1; i = 0; while(r>0){ - i = (i + 1)%(COLORS * CARDS_PER_COLOR); + i = (i + 1)%(SUITS * CARDS_PER_SUIT); if(!deck[i].used) r--; } @@ -587,7 +596,7 @@ unsigned char cur_col; unsigned char sel_card; /* the deck */ -card deck[COLORS * CARDS_PER_COLOR]; +card deck[SUITS * CARDS_PER_SUIT]; /* the remaining cards */ unsigned char rem; @@ -596,8 +605,8 @@ unsigned char cur_rem; /* the 7 game columns */ unsigned char cols[COL_NUM]; -/* the 4 final color stacks */ -unsigned char stacks[COLORS]; +/* the 4 final stacks */ +unsigned char stacks[SUITS]; /* initialize the game */ void solitaire_init(void){ @@ -605,13 +614,13 @@ void solitaire_init(void){ int i,j; /* init deck */ - for(i=0;i<COLORS;i++){ - for(j=0;j<CARDS_PER_COLOR;j++){ - deck[i*CARDS_PER_COLOR+j].color = i; - deck[i*CARDS_PER_COLOR+j].num = j; - deck[i*CARDS_PER_COLOR+j].known = 1; - deck[i*CARDS_PER_COLOR+j].used = 0; - deck[i*CARDS_PER_COLOR+j].next = NOT_A_CARD; + for(i=0;i<SUITS;i++){ + for(j=0;j<CARDS_PER_SUIT;j++){ + deck[i*CARDS_PER_SUIT+j].suit = i; + deck[i*CARDS_PER_SUIT+j].num = j; + deck[i*CARDS_PER_SUIT+j].known = 1; + deck[i*CARDS_PER_SUIT+j].used = 0; + deck[i*CARDS_PER_SUIT+j].next = NOT_A_CARD; } } @@ -635,7 +644,7 @@ void solitaire_init(void){ rem = next_random_card(deck); c = rem; - for(i=1; i<COLORS * CARDS_PER_COLOR - COL_NUM * (COL_NUM + 1)/2; i++){ + for(i=1; i<SUITS * CARDS_PER_SUIT - COL_NUM * (COL_NUM + 1)/2; i++){ deck[c].next = next_random_card(deck); c = deck[c].next; } @@ -643,7 +652,7 @@ void solitaire_init(void){ /* we now finished dealing the cards. The game can start ! (at last) */ /* init the stack */ - for(i = 0; i<COLORS; i++){ + for(i = 0; i<SUITS; i++){ stacks[i] = NOT_A_CARD; } @@ -673,7 +682,7 @@ unsigned char find_card_col(unsigned char card){ } } - for(i=0; i<COLORS; i++){ + for(i=0; i<SUITS; i++){ c = stacks[i]; while(c!=NOT_A_CARD){ if(c == card) return STACKS_COL + i; @@ -689,7 +698,7 @@ unsigned char find_card_col(unsigned char card){ unsigned char find_prev_card(unsigned char card){ int i; - for(i=0; i<COLORS*CARDS_PER_COLOR; i++){ + for(i=0; i<SUITS*CARDS_PER_SUIT; i++){ if(deck[i].next == card) return i; } @@ -739,7 +748,7 @@ unsigned char move_card(unsigned char dest_col, unsigned char src_card){ dest_card = find_last_card(dest_col); src_card_prev = find_prev_card(src_card); - /* you can't move more than one card at a time from the colors stack */ + /* you can't move more than one card at a time from the final stack */ /* to the rest of the game */ if(src_col >= COL_NUM && src_col < REM_COL && deck[src_card].next != NOT_A_CARD){ @@ -750,12 +759,12 @@ unsigned char move_card(unsigned char dest_col, unsigned char src_card){ if(dest_col < COL_NUM){ /* ... check is we are on an empty color and that the src is a king */ if(dest_card == NOT_A_CARD - && deck[src_card].num == CARDS_PER_COLOR - 1){ + && deck[src_card].num == CARDS_PER_SUIT - 1){ /* this is a winning combination */ cols[dest_col] = src_card; } - /* ... or check if the cards follow one another and have same color */ - else if((deck[dest_card].color + deck[src_card].color)%2==1 + /* ... or check if the cards follow one another and have same suit */ + else if((deck[dest_card].suit + deck[src_card].suit)%2==1 && deck[dest_card].num == deck[src_card].num + 1){ /* this is a winning combination */ deck[dest_card].next = src_card; @@ -766,20 +775,20 @@ unsigned char move_card(unsigned char dest_col, unsigned char src_card){ return MOVE_NOT_OK; } } - /* if we are on one of the 4 color stacks ... */ + /* if we are on one of the 4 final stacks ... */ else if(dest_col < REM_COL){ /* ... check if we are on an empty stack, that the src is an - * ace and that this is the good color stack */ + * ace and that this is the good final stack */ if(dest_card == NOT_A_CARD && deck[src_card].num == 0 - && deck[src_card].color == dest_col - STACKS_COL){ + && deck[src_card].suit == dest_col - STACKS_COL){ /* this is a winning combination */ stacks[dest_col - STACKS_COL] = src_card; } /* ... or check if the cards follow one another, have the same - * color and {that src has no .next element or is from the remains' + * suit and {that src has no .next element or is from the remains' * stack} */ - else if(deck[dest_card].color == deck[src_card].color + else if(deck[dest_card].suit == deck[src_card].suit && deck[dest_card].num + 1 == deck[src_card].num && (deck[src_card].next == NOT_A_CARD || src_col == REM_COL) ){ /* this is a winning combination */ @@ -902,8 +911,14 @@ int solitaire(void){ rb->lcd_set_drawmode(DRMODE_SOLID); /* known card */ if(deck[c].known){ +#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(colors[deck[c].color], i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM+7, j, 8, 8); + rb->lcd_mono_bitmap(suits[deck[c].suit], i*(LCD_WIDTH - CARD_WIDTH)/COL_NUM+7, j, 8, 8); +#if LCD_DEPTH>1 + rb->lcd_set_foreground(LCD_BLACK); +#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); @@ -938,17 +953,23 @@ int solitaire(void){ } /* draw the stacks */ - for(i=0; i<COLORS; i++){ + for(i=0; i<SUITS; i++){ c = stacks[i]; if(c!=NOT_A_CARD){ while(deck[c].next != NOT_A_CARD){ c = deck[c].next; } } +#if LCD_DEPTH>1 + rb->lcd_set_foreground(colors[i]); +#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(colors[i], LCD_WIDTH2 - CARD_WIDTH+7, 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]); +#endif /* draw a selected card */ if(c != NOT_A_CARD) { if(sel_card == c){ @@ -978,9 +999,15 @@ int solitaire(void){ rb->lcd_drawline(LCD_WIDTH2,LCD_HEIGHT-CARD_HEIGHT,LCD_WIDTH2,LCD_HEIGHT-2); #endif if(cur_rem != NOT_A_CARD){ +#if LCD_DEPTH>1 + rb->lcd_set_foreground(colors[deck[cur_rem].suit]); +#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(colors[deck[cur_rem].color], LCD_WIDTH2 - CARD_WIDTH+7, 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 LCD_DEPTH>1 + rb->lcd_set_foreground(LCD_BLACK); +#endif if(sel_card == cur_rem){ rb->lcd_drawrect(LCD_WIDTH2 - CARD_WIDTH+1, LCD_HEIGHT-CARD_HEIGHT,CARD_WIDTH-1, CARD_HEIGHT-1); } @@ -1001,7 +1028,7 @@ int solitaire(void){ switch(button){ /* move cursor to the last card of the previous column */ - /* or to the previous color stack */ + /* or to the previous final stack */ /* or to the remains stack */ case SOL_RIGHT: #ifdef SOL_RIGHT_PRE @@ -1023,7 +1050,7 @@ int solitaire(void){ break; /* move cursor to the last card of the next column */ - /* or to the next color stack */ + /* or to the next final stack */ /* or to the remains stack */ case SOL_LEFT: #ifdef SOL_LEFT_PRE @@ -1051,7 +1078,7 @@ int solitaire(void){ break; #endif if(cur_col >= COL_NUM) { - cur_col = (cur_col - COL_NUM + 1)%(COLORS + 1) + COL_NUM; + cur_col = (cur_col - COL_NUM + 1)%(SUITS + 1) + COL_NUM; if(cur_col == REM_COL){ cur_card = cur_rem; } else { @@ -1078,7 +1105,7 @@ int solitaire(void){ break; #endif if(cur_col >= COL_NUM) { - cur_col = (cur_col - COL_NUM + COLORS)%(COLORS + 1) + COL_NUM; + cur_col = (cur_col - COL_NUM + SUITS)%(SUITS + 1) + COL_NUM; if(cur_col == REM_COL){ cur_card = cur_rem; } else { @@ -1103,7 +1130,7 @@ int solitaire(void){ break; #endif if(cur_card != NOT_A_CARD){ - move_card(deck[cur_card].color + STACKS_COL, cur_card); + move_card(deck[cur_card].suit + STACKS_COL, cur_card); } break; @@ -1125,7 +1152,7 @@ int solitaire(void){ } /* unselect card or try putting card on one of the 4 stacks */ } else if(sel_card == cur_card) { - move_card(deck[sel_card].color + COL_NUM, sel_card); + move_card(deck[sel_card].suit + COL_NUM, sel_card); sel_card = NOT_A_CARD; /* try moving cards */ } else { @@ -1153,7 +1180,7 @@ int solitaire(void){ break; #endif if(cur_rem != NOT_A_CARD){ - move_card(deck[cur_rem].color + COL_NUM, cur_rem); + move_card(deck[cur_rem].suit + COL_NUM, cur_rem); } break; |