Index: apps/plugins/CATEGORIES =================================================================== --- apps/plugins/CATEGORIES (revision 19102) +++ apps/plugins/CATEGORIES (working copy) @@ -7,6 +7,7 @@ bubbles,games calculator,apps calendar,apps +casegame,games chessbox,games chessclock,apps chip8,viewers Index: apps/plugins/bitmaps/native/SOURCES =================================================================== --- apps/plugins/bitmaps/native/SOURCES (revision 19102) +++ apps/plugins/bitmaps/native/SOURCES (working copy) @@ -84,6 +84,23 @@ /* Jackpot */ jackpot_slots.30x420x1.bmp +/* CaseGame */ +#if (LCD_WIDTH >= 176) && (LCD_HEIGHT >= 220) +case_gray.20x20.bmp +case_green.20x20.bmp +case_light.60x10.bmp +case_dark.60x10.bmp +#else +case_gray.15x15.bmp +case_green.15x15.bmp +case_light.48x8.bmp +case_dark.48x8.bmp +#endif +case_ukeysw.15x15.bmp +case_ukeysg.15x15.bmp +case_lkeysw.15x15.bmp +case_lkeysg.15x15.bmp + /* Bubbles */ #ifdef HAVE_LCD_COLOR #if (LCD_WIDTH >= 320) && (LCD_HEIGHT >= 240) Index: apps/plugins/casegame/cases.c =================================================================== --- apps/plugins/casegame/cases.c (revision 0) +++ apps/plugins/casegame/cases.c (revision 0) @@ -0,0 +1,342 @@ +#include "casegame.h" + +int num_cases_left(void) +{ + int i, ret = 0; + for (i=0; i<26; i++) + if (settings.active_cases[i] == 1) + ret++; + return ret; +} + +int prev_available_case(int pos) +{ + int i; + + for (i=pos-1; i>=0; i--) + if (settings.active_cases[i] == 1) + return i; + + for (i=25; i>=0; i--) + if (settings.active_cases[i] == 1) + return i; + + return pos; +} + +int next_available_case(int pos) +{ + int i; + + for (i=pos+1; i<26; i++) + if (settings.active_cases[i] == 1) + return i; + + for (i=0; i<26; i++) + if (settings.active_cases[i] == 1) + return i; + + return pos; +} + +int lowest_available_case(void) +{ + int i; + for (i=0; i<26; i++) + { + if (settings.active_cases[i] == 1) + return i; + } + return -1; +} + +void cases_reset (void) +{ + int i, val; + + rb->srand(*rb->current_tick); + for (i=0; i<26; i++) + settings.active_cases[i] = 1; + + for (i=0; i<26; i++) + { + val = (rb->rand() % 26); + while (settings.active_cases[val] == 0) + { + val++; + if (val > 25) + val = 0; + } + settings.case_values[i] = val; + settings.active_cases[val] = 0; + } + + for (i=0; i<26; i++) + settings.active_cases[i] = 1; +} + +void cases_remove_item (int pos) +{ + settings.active_cases[pos] = 0; + if (settings.players_case != -1) + board_remove_item(settings.case_values[pos]); +} + +void open_case (unsigned int case_index) +{ +#ifndef HAVE_LCD_COLOR + char contents[32]; +#endif + rb->lcd_clear_display(); + rb->lcd_putsxy((LCD_WIDTH-100)/2, LCD_HEIGHT/3-CASE_HEIGHT, + "Open the case ..."); + DRAW_GRAY_CASE(case_index, (LCD_WIDTH-CASE_WIDTH)/2, + LCD_HEIGHT/3); + rb->lcd_update(); + rb->sleep(HZ); +#ifdef HAVE_LCD_COLOR + rb->splash(HZ*2, board[settings.case_values[case_index]]); +#else + rb->snprintf(contents, sizeof(contents), + board[settings.case_values[case_index]]); + rb->lcd_putsxy((LCD_WIDTH-50)/2, LCD_HEIGHT/2, contents); + rb->lcd_update(); + rb->sleep(HZ*2); +#endif +} + +void open_players_case(void) +{ +#ifndef HAVE_LCD_COLOR + char contents[32]; +#endif + rb->lcd_clear_display(); + rb->lcd_putsxy((LCD_WIDTH-130)/2, LCD_HEIGHT/3-CASE_HEIGHT, + "Your case contains ..."); + DRAW_GRAY_CASE(settings.players_case, LCD_WIDTH/2-CASE_WIDTH/2, + LCD_HEIGHT/3); + rb->lcd_update(); + rb->sleep(HZ*2); +#ifdef HAVE_LCD_COLOR + rb->splash(HZ*4, board[settings.case_values[settings.players_case]]); +#else + rb->snprintf(contents, sizeof(contents), + board[settings.case_values[settings.players_case]]); + rb->lcd_putsxy((LCD_WIDTH-50)/2, LCD_HEIGHT/2, contents); + rb->lcd_update(); + rb->sleep(HZ*4); +#endif + score = banker_board[settings.case_values[settings.players_case]]; +} + +void cases_display (unsigned int highlight, + int offerFlag) +{ + int i, r, c, c_max, x, y; + unsigned int case_index = 0; + char turn_info[32]; + + rb->lcd_clear_display(); + + for (r=3; r>=0; r--) + { + if (r == 0 || r == 3) + c_max = 6; + else + c_max = 7; + + for (c=0; clcd_putsxy(0, LCD_HEIGHT-70, "Welcome to The Case Game."); + rb->lcd_putsxy(0, LCD_HEIGHT-56, "Please choose a case."); + rb->lcd_putsxy(0, LCD_HEIGHT-40, "The contents of this case"); + rb->lcd_putsxy(0, LCD_HEIGHT-32, "are yours to keep unless"); + rb->lcd_putsxy(0, LCD_HEIGHT-24, "you choose to sell the case."); + rb->lcd_putsxy(0, LCD_HEIGHT-8, "Press SELECT to choose case."); + } + else + { + if (offerFlag == 1) + { + if (settings.offers_count > 1) + { + rb->lcd_putsxy(0, LCD_HEIGHT-80, "Previous Offers:"); + for (i=0; isnprintf(turn_info, sizeof(turn_info), "%u: $ %u", + i+1, settings.offers[i]); + if (i < 5) + rb->lcd_putsxy(0, LCD_HEIGHT-(5-i)*8-32, turn_info); + else + rb->lcd_putsxy(LCD_WIDTH/2, LCD_HEIGHT-(10-i)*8-32, + turn_info); + } + } + rb->lcd_putsxy(0, LCD_HEIGHT-16, "Press UP to view offer."); + rb->lcd_putsxy(0, LCD_HEIGHT-8, "Press DOWN for high scores."); + } + else + { + rb->lcd_putsxy(LCD_WIDTH/2-15, LCD_HEIGHT/3*2, "Cases before"); + rb->snprintf(turn_info, sizeof(turn_info), + "next offer: %u", settings.turn_number); + rb->lcd_putsxy(LCD_WIDTH/2-15, LCD_HEIGHT/3*2+8, turn_info); + + rb->lcd_putsxy(5, LCD_HEIGHT-40-CASE_HEIGHT, "Your"); + rb->lcd_putsxy(5, LCD_HEIGHT-32-CASE_HEIGHT, "Case"); + DRAW_GRAY_CASE(settings.players_case, 8, + LCD_HEIGHT-24-CASE_HEIGHT); + + rb->lcd_putsxy(0, LCD_HEIGHT-16, "Press UP to view $ board."); + rb->lcd_putsxy(0, LCD_HEIGHT-8, "Press DOWN for high scores."); + } + } + rb->lcd_update(); +} + +void display_swap_options(int swap) +{ + if (swap == 1) + { + rb->lcd_set_foreground(LCD_WHITE); + rb->lcd_putsxy(30, LCD_HEIGHT-20, "SWAP"); + rb->lcd_set_foreground(LCD_DARKGRAY); + rb->lcd_putsxy(90, LCD_HEIGHT-20, "OPEN MY CASE"); + } + else + { + rb->lcd_set_foreground(LCD_DARKGRAY); + rb->lcd_putsxy(30, LCD_HEIGHT-20, "SWAP"); + rb->lcd_set_foreground(LCD_WHITE); + rb->lcd_putsxy(90, LCD_HEIGHT-20, "OPEN MY CASE"); + } + rb->lcd_set_foreground(LCD_WHITE); + rb->lcd_update(); +} + +int display_last_case(void) +{ + int r, c, c_max, offset, case1, case2; + unsigned int case_index = 0; + int remaining_case = -1; + char case_str[32]; + + rb->lcd_clear_display(); + + for (r=3; r>=0; r--) + { + if (r == 0 || r == 3) + { + c_max = 6; + offset = 8; + } + else + { + c_max = 7; + offset = 0; + } + + for (c=0; clcd_putsxy(0, LCD_HEIGHT/3*2-16, "Just 2 cases remain."); + + case1 = banker_board[settings.case_values[remaining_case]]; + case2 = banker_board[settings.case_values[settings.players_case]]; + + if (case1 == 0) + rb->snprintf(case_str, sizeof(case_str), + "$0.1 and $%u", case2); + else if (case2 == 0) + rb->snprintf(case_str, sizeof(case_str), + "$0.1 and $%u", case1); + else + rb->snprintf(case_str, sizeof(case_str), + "$%u and $%u", + (case1case2)?case1:case2); + rb->lcd_putsxy(0, LCD_HEIGHT/3*2-8, case_str); + + rb->lcd_putsxy(0, LCD_HEIGHT/3*2+8, "You have case:"); + DRAW_GRAY_CASE(settings.players_case, LCD_WIDTH/2, + LCD_HEIGHT/3*2+8-CASE_HEIGHT/3); + + rb->lcd_putsxy(0, LCD_HEIGHT/3*2+24, "Would you like to swap cases?"); + + return remaining_case; +} + +void cases_display_swap (void) +{ + int button = 0; + int quit = 0; + int swap = 0; + int remaining_case = display_last_case(); + + display_swap_options(swap); + + while (quit == 0) + { + button = rb->button_get(true); + + switch (button) + { + case CASEGAME_LEFT: + case CASEGAME_SCROLL_UP: + case CASEGAME_SCROLL_UP | BUTTON_REPEAT: + swap = 1; + remaining_case = display_last_case(); + display_swap_options(swap); + break; + case CASEGAME_RIGHT: + case CASEGAME_SCROLL_DOWN: + case CASEGAME_SCROLL_DOWN | BUTTON_REPEAT: + swap = 0; + remaining_case = display_last_case(); + display_swap_options(swap); + break; + case CASEGAME_SELECT: + if (swap == 1) + { + settings.active_cases[remaining_case] = 0; + settings.active_cases[settings.players_case] = 1; + swap = settings.players_case; + settings.players_case = remaining_case; + remaining_case = swap; + swap = 1; + remaining_case = display_last_case(); + display_swap_options(swap); + } + else + quit = 1; + break; + default: + break; + } + rb->yield(); + } +} Index: apps/plugins/casegame/settings.c =================================================================== --- apps/plugins/casegame/settings.c (revision 0) +++ apps/plugins/casegame/settings.c (revision 0) @@ -0,0 +1,603 @@ +#include "casegame.h" + +char players_name[12]; + +char keysu[] = +{ + 'Q','W','E','R','T','Y','U','I','O','P', + 'A','S','D','F','G','H','J','K','L', + 'Z','X','C','V','B','N','M', ' ', + ' ', ' ', ' ' +}; + +char keysl[] = +{ + 'q','w','e','r','t','y','u','i','o','p', + 'a','s','d','f','g','h','j','k','l', + 'z','x','c','v','b','n','m', ' ', + ' ', ' ', ' ' +}; + +static struct configdata config[] = +{ + {TYPE_INT,0,INT_MAX,&settings.resume,"Resume",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.turn_number,"Turn",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.players_case,"Selected",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[0],"CaseV1",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[1],"CaseV2",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[2],"CaseV3",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[3],"CaseV4",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[4],"CaseV5",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[5],"CaseV6",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[6],"CaseV7",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[7],"CaseV8",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[8],"CaseV9",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[9],"CaseV10",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[10],"CaseV11",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[11],"CaseV12",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[12],"CaseV13",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[13],"CaseV14",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[14],"CaseV15",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[15],"CaseV16",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[16],"CaseV17",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[17],"CaseV18",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[18],"CaseV19",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[19],"CaseV20",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[20],"CaseV21",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[21],"CaseV22",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[22],"CaseV23",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[23],"CaseV24",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[24],"CaseV25",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.case_values[25],"CaseV26",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[0],"ActiveC1",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[1],"ActiveC2",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[2],"ActiveC3",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[3],"ActiveC4",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[4],"ActiveC5",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[5],"ActiveC6",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[6],"ActiveC7",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[7],"ActiveC8",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[8],"ActiveC9",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[9],"ActiveC10",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[10],"ActiveC11",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[11],"ActiveC12",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[12],"ActiveC13",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[13],"ActiveC14",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[14],"ActiveC15",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[15],"ActiveC16",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[16],"ActiveC17",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[17],"ActiveC18",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[18],"ActiveC19",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[19],"ActiveC20",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[20],"ActiveC21",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[21],"ActiveC22",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[22],"ActiveC23",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[23],"ActiveC24",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[24],"ActiveC25",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_cases[25],"ActiveC26",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[0],"ActiveV1",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[1],"ActiveV2",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[2],"ActiveV3",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[3],"ActiveV4",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[4],"ActiveV5",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[5],"ActiveV6",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[6],"ActiveV7",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[7],"ActiveV8",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[8],"ActiveV9",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[9],"ActiveV10",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[10],"ActiveV11",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[11],"ActiveV12",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[12],"ActiveV13",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[13],"ActiveV14",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[14],"ActiveV15",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[15],"ActiveV16",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[16],"ActiveV17",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[17],"ActiveV18",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[18],"ActiveV19",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[19],"ActiveV20",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[20],"ActiveV21",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[21],"ActiveV22",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[22],"ActiveV23",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[23],"ActiveV24",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[24],"ActiveV25",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.active_values[25],"ActiveV26",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.high_score[0],"HighScore1",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.high_score[1],"HighScore2",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.high_score[2],"HighScore3",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.high_score[3],"HighScore4",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.high_score[4],"HighScore5",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.high_score[5],"HighScore6",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.high_score[6],"HighScore7",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.high_score[7],"HighScore8",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.high_score[8],"HighScore9",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.high_score[9],"HighScore10",NULL,NULL}, + {TYPE_STRING,0,12,NULL,"HighPlayer1",NULL,(char*)&settings.high_player[0]}, + {TYPE_STRING,0,12,NULL,"HighPlayer2",NULL,(char*)&settings.high_player[1]}, + {TYPE_STRING,0,12,NULL,"HighPlayer3",NULL,(char*)&settings.high_player[2]}, + {TYPE_STRING,0,12,NULL,"HighPlayer4",NULL,(char*)&settings.high_player[3]}, + {TYPE_STRING,0,12,NULL,"HighPlayer5",NULL,(char*)&settings.high_player[4]}, + {TYPE_STRING,0,12,NULL,"HighPlayer6",NULL,(char*)&settings.high_player[5]}, + {TYPE_STRING,0,12,NULL,"HighPlayer7",NULL,(char*)&settings.high_player[6]}, + {TYPE_STRING,0,12,NULL,"HighPlayer8",NULL,(char*)&settings.high_player[7]}, + {TYPE_STRING,0,12,NULL,"HighPlayer9",NULL,(char*)&settings.high_player[8]}, + {TYPE_STRING,0,12,NULL,"HighPlayer10",NULL,(char*)&settings.high_player[9]}, + {TYPE_INT,0,INT_MAX,&settings.offers[0],"Offer1",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.offers[1],"Offer2",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.offers[2],"Offer3",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.offers[3],"Offer4",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.offers[4],"Offer5",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.offers[5],"Offer6",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.offers[6],"Offer7",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.offers[7],"Offer8",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.offers[8],"Offer9",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.offers[9],"Offer10",NULL,NULL}, + {TYPE_INT,0,INT_MAX,&settings.offers_count,"OffersCount",NULL,NULL} +}; + +void init_settings(void) +{ + configfile_init(rb); + + if (configfile_load(SETTINGS_FILENAME, config, + sizeof(config)/sizeof(*config), + SETTINGS_VERSION) < 0) + { + /* load failed, setup defaults scores*/ + settings.high_score[9] = 500000; + settings.high_score[8] = 400000; + settings.high_score[7] = 300000; + settings.high_score[6] = 200000; + settings.high_score[5] = 100000; + settings.high_score[4] = 75000; + settings.high_score[3] = 50000; + settings.high_score[2] = 40000; + settings.high_score[1] = 30000; + settings.high_score[0] = 20000; + rb->strcpy(settings.high_player[9], "Brian Morey"); + rb->strcpy(settings.high_player[8], "John Gwynne"); + rb->strcpy(settings.high_player[7], "No Dealer"); + rb->strcpy(settings.high_player[6], "Big Winner"); + rb->strcpy(settings.high_player[5], "Scottipedia"); + rb->strcpy(settings.high_player[4], "Mo Money"); + rb->strcpy(settings.high_player[3], "Case Master"); + rb->strcpy(settings.high_player[2], "Dollar Bill"); + rb->strcpy(settings.high_player[1], "S Harley"); + rb->strcpy(settings.high_player[0], "Star Player"); + board_reset(); + cases_reset(); + settings.players_case = -1; + settings.turn_number = 6; + settings.offers_count = 0; + } + else + { + if (settings.resume == 0) + { + board_reset(); + cases_reset(); + settings.players_case = -1; + settings.turn_number = 6; + settings.offers_count = 0; + } + } +} + +void save_settings(void) +{ + if (score == -1 && settings.players_case != -1) + settings.resume = 1; + else + settings.resume = 0; + + configfile_save(SETTINGS_FILENAME, config, + sizeof(config)/sizeof(*config), + SETTINGS_VERSION); +} + +void display_keyboard(int shift, int highlight) +{ + int i,x,y; + + /* draw the [Q-P] keys */ + for (i=0; i<10; i++) + { + x = (LCD_WIDTH-11*KEY_WIDTH)/2+i*KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT*4; + + if (i == highlight) + { + if (shift == 0) + DRAW_UPPER_KEY_GREEN(i, x, y, 0); + if (shift != 0) + DRAW_LOWER_KEY_GREEN(i, x, y, 0); + } + + if (i != highlight) + { + if (shift == 0) + DRAW_UPPER_KEY_WHITE(i, x, y, 0); + if (shift != 0) + DRAW_LOWER_KEY_WHITE(i, x, y, 0); + } + } + + /* draw the [A-L] keys */ + for (i=0; i<9; i++) + { + x = (LCD_WIDTH-10*KEY_WIDTH)/2+i*KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT*3; + + if (10+i == highlight) + { + if (shift == 0) + DRAW_UPPER_KEY_GREEN(i, x, y, 1); + if (shift != 0) + DRAW_LOWER_KEY_GREEN(i, x, y, 1); + } + + if (10+i != highlight) + { + if (shift == 0) + DRAW_UPPER_KEY_WHITE(i, x, y, 1); + if (shift != 0) + DRAW_LOWER_KEY_WHITE(i, x, y, 1); + } + } + + /* draw the [Z-M] keys */ + for (i=0; i<7; i++) + { + x = (LCD_WIDTH-9*KEY_WIDTH)/2+i*KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT*2; + + if (19+i == highlight) + { + if (shift == 0) + DRAW_UPPER_KEY_GREEN(i, x, y, 2); + if (shift != 0) + DRAW_LOWER_KEY_GREEN(i, x, y, 2); + } + + if (19+i != highlight) + { + if (shift == 0) + DRAW_UPPER_KEY_WHITE(i, x, y, 2); + if (shift != 0) + DRAW_LOWER_KEY_WHITE(i, x, y, 2); + } + } + + /* draw the [Shift] key */ + for (i=0; i<2; i++) + { + x = (LCD_WIDTH-9*KEY_WIDTH)/2+(7+i)*KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT*2; + + if (KEY_SHIFT == highlight) + { + if (shift == 0) + DRAW_UPPER_KEY_GREEN(10, x, y, i); + if (shift != 0) + DRAW_LOWER_KEY_GREEN(10, x, y, i); + } + if (KEY_SHIFT != highlight) + { + if (shift == 0) + DRAW_UPPER_KEY_WHITE(10, x, y, i); + if (shift != 0) + DRAW_LOWER_KEY_WHITE(10, x, y, i); + } + } + + /* draw the [<-] key (backspace) */ + x = (LCD_WIDTH-6*KEY_WIDTH)/2-KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT; + if (KEY_BACKSPACE == highlight) + { + if (shift == 0) + DRAW_UPPER_KEY_GREEN(10, x, y, 2); + if (shift != 0) + DRAW_LOWER_KEY_GREEN(10, x, y, 2); + } + if (KEY_BACKSPACE != highlight) + { + if (shift == 0) + DRAW_UPPER_KEY_WHITE(10, x, y, 2); + if (shift != 0) + DRAW_LOWER_KEY_WHITE(10, x, y, 2); + } + + /* draw the [Space] bar */ + if (KEY_SPACE == highlight) + { + x = (LCD_WIDTH-6*KEY_WIDTH)/2; + y = LCD_HEIGHT-KEY_HEIGHT; + if (shift == 0) + DRAW_UPPER_KEY_GREEN(11, x, y, 0); + if (shift != 0) + DRAW_LOWER_KEY_GREEN(11, x, y, 0); + x = (LCD_WIDTH-6*KEY_WIDTH)/2+KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT; + if (shift == 0) + DRAW_UPPER_KEY_GREEN(11, x, y, 1); + if (shift != 0) + DRAW_LOWER_KEY_GREEN(11, x, y, 1); + x = (LCD_WIDTH-6*KEY_WIDTH)/2+2*KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT; + if (shift == 0) + DRAW_UPPER_KEY_GREEN(11, x, y, 1); + if (shift != 0) + DRAW_LOWER_KEY_GREEN(11, x, y, 1); + x = (LCD_WIDTH-6*KEY_WIDTH)/2+3*KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT; + if (shift == 0) + DRAW_UPPER_KEY_GREEN(11, x, y, 1); + if (shift != 0) + DRAW_LOWER_KEY_GREEN(11, x, y, 1); + x = (LCD_WIDTH-6*KEY_WIDTH)/2+4*KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT; + if (shift == 0) + DRAW_UPPER_KEY_GREEN(11, x, y, 2); + if (shift != 0) + DRAW_LOWER_KEY_GREEN(11, x, y, 2); + } + + if (KEY_SPACE != highlight) + { + x = (LCD_WIDTH-6*KEY_WIDTH)/2; + y = LCD_HEIGHT-KEY_HEIGHT; + if (shift == 0) + DRAW_UPPER_KEY_WHITE(11, x, y, 0); + if (shift != 0) + DRAW_LOWER_KEY_WHITE(11, x, y, 0); + x = (LCD_WIDTH-6*KEY_WIDTH)/2+KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT; + if (shift == 0) + DRAW_UPPER_KEY_WHITE(11, x, y, 1); + if (shift != 0) + DRAW_LOWER_KEY_WHITE(11, x, y, 1); + x = (LCD_WIDTH-6*KEY_WIDTH)/2+2*KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT; + if (shift == 0) + DRAW_UPPER_KEY_WHITE(11, x, y, 1); + if (shift != 0) + DRAW_LOWER_KEY_WHITE(11, x, y, 1); + x = (LCD_WIDTH-6*KEY_WIDTH)/2+3*KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT; + if (shift == 0) + DRAW_UPPER_KEY_WHITE(11, x, y, 1); + if (shift != 0) + DRAW_LOWER_KEY_WHITE(11, x, y, 1); + x = (LCD_WIDTH-6*KEY_WIDTH)/2+4*KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT; + if (shift == 0) + DRAW_UPPER_KEY_WHITE(11, x, y, 2); + if (shift != 0) + DRAW_LOWER_KEY_WHITE(11, x, y, 2); + } + + /* draw the [Done] key */ + for (i=0; i<2; i++) + { + x = (LCD_WIDTH-6*KEY_WIDTH)/2+(5+i)*KEY_WIDTH; + y = LCD_HEIGHT-KEY_HEIGHT; + if (KEY_DONE == highlight) + { + if (shift == 0) + DRAW_UPPER_KEY_GREEN(9, x, y, (i+1)); + if (shift != 0) + DRAW_LOWER_KEY_GREEN(9, x, y, (i+1)); + } + if (KEY_DONE != highlight) + { + if (shift == 0) + DRAW_UPPER_KEY_WHITE(9, x, y, (i+1)); + if (shift != 0) + DRAW_LOWER_KEY_WHITE(9, x, y, (i+1)); + } + } + rb->lcd_update(); +} + +void display_high_scores(int offerFlag, int player_index) +{ + int i;; + char disp[64]; + + rb->lcd_clear_display(); + rb->lcd_putsxy(0, 8, "All Time High Scores"); + for (i=9; i>0; i--) + { + if (player_index == i) + rb->lcd_set_foreground(LCD_LIGHTGRAY); + else + rb->lcd_set_foreground(LCD_WHITE); + + rb->snprintf(disp, sizeof(disp), + " %u: $%8u %s", 10-i, settings.high_score[i], + settings.high_player[i]); + rb->lcd_putsxy(0, 24+8*(10-i), disp); + } + if (player_index == i) + rb->lcd_set_foreground(LCD_LIGHTGRAY); + else + rb->lcd_set_foreground(LCD_WHITE); + rb->snprintf(disp, sizeof(disp), + "%u: $%8u %s", 10-i, settings.high_score[i], + settings.high_player[i]); + rb->lcd_putsxy(0, 24+8*(10-i), disp); + rb->lcd_set_foreground(LCD_WHITE); + + if (offerFlag == 1) + { + rb->lcd_putsxy(0, LCD_HEIGHT-16, "Press UP to view cases."); + rb->lcd_putsxy(0, LCD_HEIGHT-8, "Press DOWN to view offer."); + } + else if (offerFlag == 0) + { + rb->lcd_putsxy(0, LCD_HEIGHT-16, "Press UP to view $ board."); + rb->lcd_putsxy(0, LCD_HEIGHT-8, "Press DOWN to view cases."); + } + + rb->lcd_update(); +} + +void get_players_name(int index) +{ + int button = 0; + int quit = 0; + int key_val = 0; + int shift = 0; + int len = 0; + + display_high_scores(2, index); + display_keyboard(shift, key_val); + + while (quit == 0) + { + rb->button_clear_queue(); + button = rb->button_get(true); + + switch (button) + { + case CASEGAME_LEFT: + case CASEGAME_LEFT | BUTTON_REPEAT: + case CASEGAME_SCROLL_UP: + case CASEGAME_SCROLL_UP | BUTTON_REPEAT: + if (--key_val < 0) + key_val = 29; + display_keyboard(shift, key_val); + break; + case CASEGAME_RIGHT: + case CASEGAME_RIGHT | BUTTON_REPEAT: + case CASEGAME_SCROLL_DOWN: + case CASEGAME_SCROLL_DOWN | BUTTON_REPEAT: + if (++key_val > 29) + key_val = 0; + display_keyboard(shift, key_val); + break; + case CASEGAME_SELECT: + if (key_val == KEY_SHIFT) + { + shift = (shift==0)?1:0; + display_keyboard(shift, key_val); + } + else if (key_val == KEY_BACKSPACE) + { + len = rb->strlen(players_name); + if (len > 0) + { + players_name[len-1] = '\0'; + rb->strcpy(settings.high_player[index], players_name); + display_high_scores(2, index); + display_keyboard(shift, key_val); + } + } + else if (key_val == KEY_DONE) + quit = 1; + else + { + len = rb->strlen(players_name); + if (len < 11) + { + if (shift == 0) + players_name[len] = keysu[key_val]; + else + players_name[len] = keysl[key_val]; + + players_name[len+1] = '\0'; + rb->strcpy(settings.high_player[index], players_name); + display_high_scores(2, index); + display_keyboard(shift, key_val); + } + } + break; + default: + break; + } + rb->yield(); + } +} + +void game_over(void) +{ + int quit = 0; + int button; + int i; + int add_score = 1; + int index = -1; + char amount[32]; + + /* ignore duplicate scores */ + for (i=0; i<10; i++) + if (score == (int)settings.high_score[i]) + { + add_score = 0; + index = i; + } + + /* add new high score */ + i=0; + if (add_score == 1 && + score>(int)settings.high_score[i++]) + { + while (score>(int)settings.high_score[i] && i<10) + { + settings.high_score[i-1] = settings.high_score[i]; + rb->strcpy(settings.high_player[i-1], settings.high_player[i]); + i++; + } + + index = i-1; + settings.high_score[index] = score; + rb->strcpy(settings.high_player[index], players_name); + } + + if (index != -1) + get_players_name(index); + + display_high_scores(2, -1); + + rb->lcd_putsxy(LCD_WIDTH/2-30, LCD_HEIGHT-60, "Game Over"); + + rb->lcd_putsxy(5, LCD_HEIGHT-CASE_HEIGHT-20, "Your case contained ..."); + DRAW_GRAY_CASE(settings.players_case, 10, LCD_HEIGHT-CASE_HEIGHT-10); + + if (banker_board[settings.case_values[settings.players_case]] == 0) + rb->lcd_putsxy(CASE_WIDTH+20, LCD_HEIGHT-CASE_HEIGHT, "$ .01"); + else + { + rb->snprintf(amount, sizeof(amount), "$ %u", + banker_board[settings.case_values[settings.players_case]]); + + rb->lcd_putsxy(CASE_WIDTH+20, LCD_HEIGHT-CASE_HEIGHT, amount); + } + + rb->lcd_update(); + + while (quit == 0) + { + rb->button_clear_queue(); + button = rb->button_get(true); + + switch (button) + { + case CASEGAME_UP: + case CASEGAME_UP | BUTTON_REPEAT: + case CASEGAME_DOWN: + case CASEGAME_DOWN | BUTTON_REPEAT: + case CASEGAME_LEFT: + case CASEGAME_SCROLL_UP: + case CASEGAME_SCROLL_UP | BUTTON_REPEAT: + case CASEGAME_RIGHT: + case CASEGAME_SCROLL_DOWN: + case CASEGAME_SCROLL_DOWN | BUTTON_REPEAT: + case CASEGAME_SELECT: + quit = 1; + break; + default: + break; + } + rb->yield(); + } +} Index: apps/plugins/casegame/SOURCES =================================================================== --- apps/plugins/casegame/SOURCES (revision 0) +++ apps/plugins/casegame/SOURCES (revision 0) @@ -0,0 +1,5 @@ +casegame.c +banker.c +board.c +cases.c +settings.c Index: apps/plugins/casegame/banker.c =================================================================== --- apps/plugins/casegame/banker.c (revision 0) +++ apps/plugins/casegame/banker.c (revision 0) @@ -0,0 +1,190 @@ +#include "casegame.h" + +int score = -1; + +int banker_board[26] = +{ + 0, + 1, + 5, + 10, + 25, + 50, + 75, + 100, + 200, + 300, + 400, + 500, + 750, + 1000, + 5000, + 10000, + 25000, + 50000, + 75000, + 100000, + 200000, + 300000, + 400000, + 500000, + 750000, + 1000000 +}; + +unsigned int calculate_offer() +{ + int i; + unsigned int sum = 0; + unsigned int count = 0; + unsigned int offer = 0; + + for (i=0; i<26; i++) + { + if (settings.active_cases[i] == 1) + { + count++; + sum += banker_board[settings.case_values[i]]; + } + } + count++; + sum += banker_board[settings.case_values[settings.players_case]]; + + if (count == 0) + return 0; + else + { + if ((settings.offers_count+1) > 7) + offer = sum/count; + else + offer = sum/count*(settings.offers_count+1)/7; + if ((offer-(offer%100)) == 0) + return offer; + else + return offer-(offer%100); + } +} + +void display_options(int accept) +{ + if (accept == 1) + { + rb->lcd_set_foreground(LCD_WHITE); + rb->lcd_putsxy(LCD_WIDTH/2-50, LCD_HEIGHT-27, "ACCEPT"); + rb->lcd_set_foreground(LCD_DARKGRAY); + rb->lcd_putsxy(LCD_WIDTH/2+8, LCD_HEIGHT-27, "DECLINE"); + } + else + { + rb->lcd_set_foreground(LCD_DARKGRAY); + rb->lcd_putsxy(LCD_WIDTH/2-50, LCD_HEIGHT-27, "ACCEPT"); + rb->lcd_set_foreground(LCD_WHITE); + rb->lcd_putsxy(LCD_WIDTH/2+8, LCD_HEIGHT-27, "DECLINE"); + } + rb->lcd_set_foreground(LCD_WHITE); + rb->lcd_update(); +} + +int make_offer() +{ +#ifndef HAVE_LCD_COLOR + char contents[32]; +#endif + int button = 0; + int quit = 0; + int accept = 0; + char won[32]; + int high_score_toggle = 0; + int cases_toggle = 0; + unsigned int offer_amount = calculate_offer(); + + settings.offers[settings.offers_count++] = offer_amount; + + board_display(offer_amount); + display_options(accept); + while (quit == 0) + { + rb->button_clear_queue(); + button = rb->button_get(true); + + switch (button) + { + case CASEGAME_UP: + case CASEGAME_UP | BUTTON_REPEAT: + if (cases_toggle == 0) + { + cases_toggle = 1; + high_score_toggle = 0; + cases_display(current_case, 1); + } + else + { + cases_toggle = 0; + board_display(offer_amount); + display_options(accept); + } + break; + case CASEGAME_DOWN: + case CASEGAME_DOWN | BUTTON_REPEAT: + if (high_score_toggle == 0) + { + high_score_toggle = 1; + cases_toggle = 0; + display_high_scores(1, -1); + } + else + { + high_score_toggle = 0; + board_display(offer_amount); + display_options(accept); + } + break; + case CASEGAME_LEFT: + case CASEGAME_SCROLL_UP: + case CASEGAME_SCROLL_UP | BUTTON_REPEAT: + if (high_score_toggle == 0 && cases_toggle == 0) + { + accept = 1; + board_display(offer_amount); + display_options(accept); + } + break; + case CASEGAME_RIGHT: + case CASEGAME_SCROLL_DOWN: + case CASEGAME_SCROLL_DOWN | BUTTON_REPEAT: + if (high_score_toggle == 0 && cases_toggle == 0) + { + accept = 0; + board_display(offer_amount); + display_options(accept); + } + break; + case CASEGAME_SELECT: + if (high_score_toggle == 0 && cases_toggle == 0) + { + if (accept == 1) + { + rb->snprintf(won, sizeof(won), "Total score: $%u", + offer_amount); +#ifdef HAVE_LCD_COLOR + rb->splash(HZ*4, won); +#else + rb->lcd_clear_display(); + rb->snprintf(contents, sizeof(contents), won); + rb->lcd_putsxy((LCD_WIDTH-100)/2, LCD_HEIGHT/2, contents); + rb->lcd_update(); + rb->sleep(HZ*4); +#endif + score = offer_amount; + } + quit = 1; + } + break; + default: + break; + } + rb->yield(); + } + rb->lcd_set_foreground(LCD_WHITE); + return accept; +} Index: apps/plugins/casegame/casegame.c =================================================================== --- apps/plugins/casegame/casegame.c (revision 0) +++ apps/plugins/casegame/casegame.c (revision 0) @@ -0,0 +1,143 @@ +#include "casegame.h" + +PLUGIN_HEADER + +int current_case; + +int play_case_game (void) +{ + int button = 0; + int quit = 0; + int board_toggle = 0; + int high_score_toggle = 0; + + current_case = lowest_available_case(); + cases_display(current_case, 0); + + while (quit == 0) + { + if (settings.turn_number == 0) + { + settings.turn_number = ((settings.offers_count+1)<6) ? + (6-(settings.offers_count+1)) : 1; + + if (make_offer() == 1) + { + game_over(); + save_settings(); + quit = 1; + continue; + } + cases_display(current_case, 0); + } + if (num_cases_left() == 1) + { + cases_display_swap(); + open_players_case(); + game_over(); + save_settings(); + quit = 1; + continue; + } + + rb->button_clear_queue(); + button = rb->button_get(true); + + switch (button) + { + case CASEGAME_UP: + case CASEGAME_UP | BUTTON_REPEAT: + if (board_toggle == 0) + { + board_toggle = 1; + high_score_toggle = 0; + board_display(0); + } + else + { + board_toggle = 0; + cases_display(current_case, 0); + } + break; + case CASEGAME_DOWN: + case CASEGAME_DOWN | BUTTON_REPEAT: + if (high_score_toggle == 0) + { + high_score_toggle = 1; + board_toggle = 0; + display_high_scores(0, -1); + } + else + { + high_score_toggle = 0; + cases_display(current_case, 0); + } + break; + case CASEGAME_LEFT: + case CASEGAME_LEFT | BUTTON_REPEAT: + case CASEGAME_SCROLL_UP: + case CASEGAME_SCROLL_UP | BUTTON_REPEAT: + current_case = prev_available_case(current_case); + cases_display(current_case, 0); + break; + case CASEGAME_RIGHT: + case CASEGAME_RIGHT | BUTTON_REPEAT: + case CASEGAME_SCROLL_DOWN: + case CASEGAME_SCROLL_DOWN | BUTTON_REPEAT: + current_case = next_available_case(current_case); + cases_display(current_case, 0); + break; + case CASEGAME_SELECT: + cases_remove_item(current_case); + if (settings.players_case == -1) + settings.players_case = current_case; + else + { + open_case(current_case); + settings.turn_number--; + } + current_case = lowest_available_case(); + cases_display(current_case, 0); + break; + case CASEGAME_EXIT: + quit = 1; + break; + default: + if (rb->default_event_handler (button) == SYS_USB_CONNECTED) + return PLUGIN_USB_CONNECTED; + break; + } + rb->yield(); + } + + return PLUGIN_OK; +} + +enum plugin_status plugin_start(const struct plugin_api* api, const void* parameter) +{ + int ret = PLUGIN_OK; + + (void)(parameter); + rb = api; + players_name[0] = '\0'; + /* Turn off backlight timeout */ + backlight_force_on(rb); + +#ifdef HAVE_LCD_COLOR + rb->splash(HZ/2, "The Case Game"); +#endif + + rb->lcd_setfont (FONT_SYSFIXED); + rb->lcd_clear_display(); + rb->lcd_set_foreground(LCD_WHITE); + rb->lcd_set_background(LCD_BLACK); + + init_settings(); + ret = play_case_game(); + save_settings(); + + /* Turn on backlight timeout (revert to settings) */ + backlight_use_settings(rb); + rb->lcd_setfont (FONT_UI); + return ret; +} Index: apps/plugins/casegame/board.c =================================================================== --- apps/plugins/casegame/board.c (revision 0) +++ apps/plugins/casegame/board.c (revision 0) @@ -0,0 +1,89 @@ +#include "casegame.h" + +char board[26][12] = +{ + "$ .01\0", + "$ 1\0", + "$ 5\0", + "$ 10\0", + "$ 25\0", + "$ 50\0", + "$ 75\0", + "$ 100\0", + "$ 200\0", + "$ 300\0", + "$ 400\0", + "$ 500\0", + "$ 750\0", + "$ 1,000\0", + "$ 5,000\0", + "$ 10,000\0", + "$ 25,000\0", + "$ 50,000\0", + "$ 75,000\0", + "$ 100,000\0", + "$ 200,000\0", + "$ 300,000\0", + "$ 400,000\0", + "$ 500,000\0", + "$ 750,000\0", + "$ 1,000,000\0" +}; + +void board_reset (void) +{ + int i; + for (i=0; i<26; i++) + settings.active_values[i] = 1; +} + +void board_remove_item (int pos) +{ + settings.active_values[pos] = 0; +} + +int board_display (unsigned int offer) +{ + int i, x, y; + char offer_str[64]; + + rb->lcd_clear_display(); + rb->lcd_drawrect(0, 0, LCD_WIDTH, 24); + + if (offer > 0) + { + rb->snprintf(offer_str, sizeof(offer_str), "OFFER: $%u", offer); + rb->lcd_putsxy(LCD_WIDTH/2-35, 8, offer_str); + } + else + rb->lcd_putsxy(LCD_WIDTH/2-35, 8, "The Case Game"); + + for (i=0; i<13; i++) + { + x = (LCD_WIDTH-VALUE_WIDTH*2)/2-4; + y = 30+((VALUE_HEIGHT+1)*i); + + if (settings.active_values[i] == 1) + DRAW_LIGHT_VALUE(i, x, y); + + if (settings.active_values[i] != 1) + DRAW_DARK_VALUE(i, x, y); + } + for (i=13; i<26; i++) + { + x = (LCD_WIDTH-VALUE_WIDTH*2)/2+VALUE_WIDTH+4; + y = 30+((VALUE_HEIGHT+1)*(i-13)); + + if (settings.active_values[i] == 1) + DRAW_LIGHT_VALUE(i, x, y); + + if (settings.active_values[i] != 1) + DRAW_DARK_VALUE(i, x, y); + } + + rb->lcd_putsxy(0, LCD_HEIGHT-16, "Press UP to view cases."); + rb->lcd_putsxy(0, LCD_HEIGHT-8, "Press DOWN for high scores."); + rb->lcd_update(); + + return 0; +} Index: apps/plugins/casegame/casegame.h =================================================================== --- apps/plugins/casegame/casegame.h (revision 0) +++ apps/plugins/casegame/casegame.h (revision 0) @@ -0,0 +1,246 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: casegame.h 15852 2007-11-29 08:57:27Z amiconn $ + * + * Copyright (c) 2006 Brian J. Morey + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "plugin.h" +#include "helper.h" +#include "lib/configfile.h" +#include "case_light.h" +#include "case_dark.h" +#include "case_gray.h" +#include "case_green.h" +#include "case_ukeysw.h" +#include "case_ukeysg.h" +#include "case_lkeysw.h" +#include "case_lkeysg.h" + +/* button definitions */ +#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ + (CONFIG_KEYPAD == IRIVER_H300_PAD) +#define CASEGAME_SELECT BUTTON_ON +#define CASEGAME_SCROLL_UP (BUTTON_LEFT | BUTTON_UP) +#define CASEGAME_SCROLL_DOWN (BUTTON_RIGHT | BUTTON_DOWN) +#define CASEGAME_LEFT BUTTON_LEFT +#define CASEGAME_RIGHT BUTTON_RIGHT +#define CASEGAME_UP BUTTON_UP +#define CASEGAME_DOWN BUTTON_DOWN +#define CASEGAME_EXIT BUTTON_OFF + +#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD +#define CASEGAME_SELECT BUTTON_SELECT +#define CASEGAME_SCROLL_UP BUTTON_F1 +#define CASEGAME_SCROLL_DOWN BUTTON_F2 +#define CASEGAME_LEFT BUTTON_LEFT +#define CASEGAME_RIGHT BUTTON_RIGHT +#define CASEGAME_UP BUTTON_UP +#define CASEGAME_DOWN BUTTON_DOWN +#define CASEGAME_EXIT BUTTON_OFF + +#elif CONFIG_KEYPAD == ONDIO_PAD +#define CASEGAME_SELECT BUTTON_MENU +#define CASEGAME_SCROLL_UP (BUTTON_MENU | BUTTON_UP) +#define CASEGAME_SCROLL_DOWN (BUTTON_MENU | BUTTON_DOWN) +#define CASEGAME_LEFT BUTTON_LEFT +#define CASEGAME_RIGHTT BUTTON_RIGHT +#define CASEGAME_UP BUTTON_UP +#define CASEGAME_DOWN BUTTON_DOWN +#define CASEGAME_EXIT BUTTON_OFF + +#elif (CONFIG_KEYPAD == SANSA_E200_PAD) +#define CASEGAME_SELECT BUTTON_SELECT +#define CASEGAME_SCROLL_UP BUTTON_SCROLL_BACK +#define CASEGAME_SCROLL_DOWN BUTTON_SCROLL_FWD +#define CASEGAME_LEFT BUTTON_LEFT +#define CASEGAME_RIGHT BUTTON_RIGHT +#define CASEGAME_UP BUTTON_UP +#define CASEGAME_DOWN BUTTON_DOWN +#define CASEGAME_EXIT BUTTON_POWER + +#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) +#define CASEGAME_SELECT BUTTON_PLAY +#define CASEGAME_SCROLL_UP (BUTTON_LEFT | BUTTON_UP) +#define CASEGAME_SCROLL_DOWN (BUTTON_RIGHT | BUTTON_DOWN) +#define CASEGAME_LEFT BUTTON_LEFT +#define CASEGAME_RIGHT BUTTON_RIGHT +#define CASEGAME_UP BUTTON_UP +#define CASEGAME_DOWN BUTTON_DOWN +#define CASEGAME_EXIT BUTTON_POWER + +#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ + (CONFIG_KEYPAD == IPOD_3G_PAD) || \ + (CONFIG_KEYPAD == IPOD_1G2G_PAD) +#define CASEGAME_SELECT BUTTON_SELECT +#define CASEGAME_SCROLL_UP BUTTON_SCROLL_BACK +#define CASEGAME_SCROLL_DOWN BUTTON_SCROLL_FWD +#define CASEGAME_LEFT BUTTON_LEFT +#define CASEGAME_RIGHT BUTTON_RIGHT +#define CASEGAME_UP BUTTON_MENU +#define CASEGAME_DOWN BUTTON_PLAY +#define CASEGAME_EXIT (BUTTON_SELECT | BUTTON_MENU) + +#elif CONFIG_KEYPAD == GIGABEAT_PAD +#define CASEGAME_SELECT BUTTON_SELECT +#define CASEGAME_SCROLL_UP BUTTON_VOL_UP +#define CASEGAME_SCROLL_DOWN BUTTON_VOL_DOWN +#define CASEGAME_LEFT BUTTON_LEFT +#define CASEGAME_RIGHT BUTTON_RIGHT +#define CASEGAME_UP BUTTON_UP +#define CASEGAME_DOWN BUTTON_DOWN +#define CASEGAME_EXIT BUTTON_POWER + +#elif CONFIG_KEYPAD == IRIVER_H10_PAD +#define CASEGAME_SELECT BUTTON_PLAY +#define CASEGAME_SCROLL_UP BUTTON_SCROLL_UP +#define CASEGAME_SCROLL_DOWN BUTTON_SCROLL_DOWN +#define CASEGAME_LEFT BUTTON_LEFT +#define CASEGAME_RIGHT BUTTON_RIGHT +#define CASEGAME_UP BUTTON_UP +#define CASEGAME_DOWN BUTTON_DOWN +#define CASEGAME_EXIT BUTTON_POWER + +#elif (CONFIG_KEYPAD == SANSA_C200_PAD) +#define CASEGAME_SELECT BUTTON_SELECT +#define CASEGAME_SCROLL_UP BUTTON_VOL_UP +#define CASEGAME_SCROLL_DOWN BUTTON_VOL_DOWN +#define CASEGAME_LEFT BUTTON_LEFT +#define CASEGAME_RIGHT BUTTON_RIGHT +#define CASEGAME_UP BUTTON_UP +#define CASEGAME_DOWN BUTTON_DOWN +#define CASEGAME_EXIT BUTTON_POWER + +#elif CONFIG_KEYPAD == MROBE500_PAD +#define CASEGAME_SELECT BUTTON_RC_HEART +#define CASEGAME_SCROLL_UP BUTTON_RC_VOL_UP +#define CASEGAME_SCROLL_DOWN BUTTON_RC_VOL_DOWN +#define CASEGAME_LEFT BUTTON_LEFT +#define CASEGAME_RIGHT BUTTON_RIGHT +#define CASEGAME_UP BUTTON_RC_PLAY +#define CASEGAME_DOWN BUTTON_RC_DOWN +#define CASEGAME_EXIT BUTTON_POWER + +#else +#error CaseGame: Unsupported keypad +#endif + +#define SETTINGS_VERSION 1 +#define SETTINGS_FILENAME "casegame.cfg" +#define VALUE_WIDTH BMPWIDTH_case_light +#define VALUE_HEIGHT (BMPHEIGHT_case_light/26) +#define CASE_WIDTH BMPWIDTH_case_gray +#define CASE_HEIGHT (BMPHEIGHT_case_gray/26) +#define KEY_WIDTH (BMPWIDTH_case_ukeysw/3) +#define KEY_HEIGHT (BMPHEIGHT_case_ukeysw/12) +#define KEY_SHIFT 26 +#define KEY_BACKSPACE 27 +#define KEY_SPACE 28 +#define KEY_DONE 29 + +#define DRAW_LIGHT_VALUE(value_index,x,y) \ + rb->lcd_bitmap_part(case_light, 0, \ + value_index*VALUE_HEIGHT, VALUE_WIDTH, \ + x, y, VALUE_WIDTH, VALUE_HEIGHT); + +#define DRAW_DARK_VALUE(value_index,x,y) \ + rb->lcd_bitmap_part(case_dark, 0, \ + value_index*VALUE_HEIGHT, VALUE_WIDTH, \ + x, y, VALUE_WIDTH, VALUE_HEIGHT); + +#define DRAW_GRAY_CASE(case_index,x,y) \ + rb->lcd_bitmap_part(case_gray, 0, \ + (25-case_index)*CASE_HEIGHT, CASE_WIDTH, \ + x, y, CASE_WIDTH, CASE_HEIGHT); + +#define DRAW_GREEN_CASE(case_index,x,y) \ + rb->lcd_bitmap_part(case_green, 0, \ + (25-case_index)*CASE_HEIGHT, CASE_WIDTH, \ + x, y, CASE_WIDTH, CASE_HEIGHT); + +#define DRAW_UPPER_KEY_WHITE(key_index,x,y,c) \ + rb->lcd_bitmap_part(case_ukeysw, c*KEY_WIDTH, \ + key_index*KEY_HEIGHT, KEY_WIDTH*3, \ + x, y, KEY_WIDTH, KEY_HEIGHT); + +#define DRAW_UPPER_KEY_GREEN(key_index,x,y,c) \ + rb->lcd_bitmap_part(case_ukeysg, c*KEY_WIDTH, \ + key_index*KEY_HEIGHT, KEY_WIDTH*3, \ + x, y, KEY_WIDTH, KEY_HEIGHT); + +#define DRAW_LOWER_KEY_WHITE(key_index,x,y,c) \ + rb->lcd_bitmap_part(case_lkeysw, c*KEY_WIDTH, \ + key_index*KEY_HEIGHT, KEY_WIDTH*3, \ + x, y, KEY_WIDTH, KEY_HEIGHT); + +#define DRAW_LOWER_KEY_GREEN(key_index,x,y,c) \ + rb->lcd_bitmap_part(case_lkeysg, c*KEY_WIDTH, \ + key_index*KEY_HEIGHT, KEY_WIDTH*3, \ + x, y, KEY_WIDTH, KEY_HEIGHT); + + +const struct plugin_api* rb; + +struct casegame_settings +{ + int resume; + int turn_number; + int players_case; /* players selected case */ + int case_values[26]; /* randomized case amounts */ + unsigned int active_cases[26]; /* cases still in play */ + unsigned int active_values[26]; /* values still in play */ + unsigned int high_score[10]; /* top 10 scores */ + char high_player[10][12]; /* name of high score holder */ + unsigned int offers[10]; /* previous offers */ + int offers_count; /* number of prev offers */ +} settings; + +extern int current_case; +extern int score; +extern char players_name[12]; +extern char board[26][12]; +extern int banker_board[26]; + +/* banker.c */ +unsigned int calculate_offer(void); +void display_options(int accept); +int make_offer(void); + +/* board.c */ +void board_reset (void); +void board_remove_item (int pos); +int board_display (unsigned int offer); + +/* cases.c */ +int num_cases_left(void); +int prev_available_case(int pos); +int next_available_case(int pos); +int lowest_available_case(void); +void cases_reset (void); +void cases_remove_item (int pos); +void open_case (unsigned int case_index); +void open_players_case(void); +void cases_display (unsigned int highlight, int offerFlag); +void display_swap_options(int swap); +int display_last_case(void); +void cases_display_swap (void); + +/* settings.c */ +void init_settings(void); +void save_settings(void); +void display_keyboard(int shift, int highlight); +void display_high_scores(int offerFlag, int player_index); +void get_players_name(int index); +void game_over(void); Index: apps/plugins/casegame/Makefile =================================================================== --- apps/plugins/casegame/Makefile (revision 0) +++ apps/plugins/casegame/Makefile (revision 0) @@ -0,0 +1,106 @@ +INCLUDES = -I$(APPSDIR) -I.. -I. $(TARGET_INC) \ + -I$(FIRMDIR)/include -I$(FIRMDIR)/export \ + -I$(FIRMDIR)/common -I$(FIRMDIR)/drivers \ + -I$(OUTDIR) -I$(BUILDDIR) \ + -I$(BUILDDIR)/pluginbitmaps \ + -I$(APPSDIR)/plugins/lib + +CFLAGS = $(INCLUDES) $(GCCOPTS) $(TARGET) $(EXTRA_DEFINES) \ + -DTARGET_ID=$(TARGET_ID) -DMEM=${MEMORYSIZE} -DPLUGIN + +ifdef APPEXTRA + INCLUDES += $(patsubst %,-I$(APPSDIR)/%,$(subst :, ,$(APPEXTRA))) +endif + +LINKFILE := $(OBJDIR)/link.lds +DEPFILE = $(OBJDIR)/dep-casegame + +# This sets up 'SRC' based on the files mentioned in SOURCES +include $(TOOLSDIR)/makesrc.inc + +SOURCES = $(SRC) +OBJS := $(SRC:%.c=$(OBJDIR)/%.o) +DIRS = . + +ifndef SIMVER + LDS := ../plugin.lds + OUTPUT = $(OUTDIR)/casegame.rock +else ## simulators + OUTPUT = $(OUTDIR)/casegame.rock +endif + +all: $(OUTPUT) + +ifndef SIMVER +$(OBJDIR)/casegame.elf: $(OBJS) $(LINKFILE) $(BITMAPLIBS) + $(call PRINTS,LD $(@F))$(CC) $(CFLAGS) -o $@ $(OBJS) -L$(BUILDDIR) -lplugin -lgcc \ + $(LINKBITMAPS) -T$(LINKFILE) -Wl,-Map,$(OBJDIR)/casegame.map + +$(OUTPUT): $(OBJDIR)/casegame.elf + $(call PRINTS,OBJCOPY $(@F))$(OC) -O binary $< $@ +else + +ifeq ($(SIMVER), x11) +################################################### +# This is the X11 simulator version + +$(OUTPUT): $(OBJS) + $(call PRINTS,LD $(@F))$(CC) $(CFLAGS) $(SHARED_FLAG) $(OBJS) -L$(BUILDDIR) -lplugin $(LINKBITMAPS) -o $@ +ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN) +# 'x' must be kept or you'll have "Win32 error 5" +# $ fgrep 5 /usr/include/w32api/winerror.h | head -1 +# #define ERROR_ACCESS_DENIED 5L +else + @chmod -x $@ +endif + +else # end of x11-simulator +ifeq ($(SIMVER), sdl) +################################################### +# This is the SDL simulator version + +$(OUTPUT): $(OBJS) + $(call PRINTS,LD $(@F))$(CC) $(CFLAGS) $(SHARED_FLAG) $(OBJS) -L$(BUILDDIR) -lplugin $(LINKBITMAPS) -o $@ +ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN) +# 'x' must be kept or you'll have "Win32 error 5" +# $ fgrep 5 /usr/include/w32api/winerror.h | head -1 +# #define ERROR_ACCESS_DENIED 5L +else + @chmod -x $@ +endif + +else # end of sdl-simulator +################################################### +# This is the win32 simulator version +DLLTOOLFLAGS = --export-all +DLLWRAPFLAGS = -s --entry _DllMain@12 --target=i386-mingw32 -mno-cygwin + +$(OUTPUT): $(OBJS) + $(call PRINTS,DLL $(@F))$(DLLTOOL) $(DLLTOOLFLAGS) -z $(OBJDIR)/$*.def $(OBJS) + $(SILENT)$(DLLWRAP) $(DLLWRAPFLAGS) --def $(OBJDIR)/$*.def $(OBJS) \ + $(BUILDDIR)/libplugin.a $(BITMAPLIBS) -o $@ +ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN) +# 'x' must be kept or you'll have "Win32 error 5" +# $ fgrep 5 /usr/include/w32api/winerror.h | head -1 +# #define ERROR_ACCESS_DENIED 5L +else + @chmod -x $@ +endif +endif # end of win32-simulator +endif +endif # end of simulator section + + +include $(TOOLSDIR)/make.inc + +# MEMORYSIZE should be passed on to this makefile with the chosen memory size +# given in number of MB +$(LINKFILE): $(LDS) + $(call PRINTS,build $(@F))cat $< | $(CC) -DMEMORYSIZE=$(MEMORYSIZE) $(INCLUDES) $(TARGET) \ + $(DEFINES) -E -P - >$@ + +clean: + $(call PRINTS,cleaning casegame)rm -rf $(OBJDIR)/casegame + $(SILENT)rm -f $(OBJDIR)/casegame.* $(DEPFILE) + +-include $(DEPFILE) Index: apps/plugins/SUBDIRS =================================================================== --- apps/plugins/SUBDIRS (revision 19102) +++ apps/plugins/SUBDIRS (working copy) @@ -16,6 +16,7 @@ /* For all targets with a bitmap display */ #ifdef HAVE_LCD_BITMAP +casegame chessbox jpeg sudoku