Index: apps/plugins/CATEGORIES =================================================================== --- apps/plugins/CATEGORIES (revision 23129) +++ apps/plugins/CATEGORIES (working copy) @@ -8,6 +8,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 23129) +++ apps/plugins/bitmaps/native/SOURCES (working copy) @@ -106,6 +106,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 >= 640) && (LCD_HEIGHT >= 480)) || \ 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/casegame.make =================================================================== --- apps/plugins/casegame/casegame.make (revision 0) +++ apps/plugins/casegame/casegame.make (revision 0) @@ -0,0 +1,52 @@ +# __________ __ ___. +# Open \______ \ ____ ____ | | _\_ |__ _______ ___ +# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +# \/ \/ \/ \/ \/ +# + +CASEGAME_SRCDIR = $(APPSDIR)/plugins/casegame +CASEGAME_OBJDIR = $(BUILDDIR)/apps/plugins/casegame + +CASEGAME_SRC := $(call preprocess, $(CASEGAME_SRCDIR)/SOURCES) +CASEGAME_OBJ := $(call c2obj, $(CASEGAME_SRC)) + +OTHER_SRC += $(CASEGAME_SRC) + +ifndef SIMVER +ifneq (,$(strip $(foreach tgt,RECORDER ONDIO,$(findstring $(tgt),$(TARGET))))) + ## lowmem targets + ROCKS += $(CASEGAME_OBJDIR)/casegame.ovl + ZXBOX_OUTLDS = $(CASEGAME_OBJDIR)/casegame.link + ZXBOX_LDFLAGS = -T$(CASEGAME_OUTLDS) -Wl,--gc-sections -Wl,-Map,$(basename $@).map +else + ### all other targets + ROCKS += $(CASEGAME_OBJDIR)/casegame.rock +endif +else + ### simulator + ROCKS += $(CASEGAME_OBJDIR)/casegame.rock +endif + +CASEGAMEFLAGS = $(filter-out -O%,$(PLUGINFLAGS)) -O3 -funroll-loops + +$(CASEGAME_OBJDIR)/casegame.rock: $(CASEGAME_OBJ) + +$(CASEGAME_OBJDIR)/casegame.refmap: $(CASEGAME_OBJ) + +$(CASEGAME_OUTLDS): $(PLUGIN_LDS) $(CASEGAME_OBJDIR)/casegame.refmap + $(call PRINTS,PP $(@F))$(call preprocess2file,$<,$@,-DOVERLAY_OFFSET=$(shell \ + $(TOOLSDIR)/ovl_offset.pl $(CASEGAME_OBJDIR)/casegame.refmap)) + +$(CASEGAME_OBJDIR)/casegame.ovl: $(CASEGAME_OBJ) $(CASEGAME_OUTLDS) + $(SILENT)$(CC) $(PLUGINFLAGS) -o $(basename $@).elf \ + $(filter %.o, $^) \ + $(filter %.a, $+) \ + -lgcc $(CASEGAME_LDFLAGS) + $(call PRINTS,LD $(@F))$(OC) -O binary $(basename $@).elf $@ + +# special pattern rule for compiling casegame with extra flags +$(CASEGAME_OBJDIR)/%.o: $(CASEGAME_SRCDIR)/%.c $(PLUGINBITMAPLIB) $(CASEGAME_SRCDIR)/casegame.make + $(SILENT)mkdir -p $(dir $@) + $(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) -I$(dir $<) $(CASEGAMEFLAGS) -c $< -o $@ Index: apps/plugins/casegame/settings.c =================================================================== --- apps/plugins/casegame/settings.c (revision 0) +++ apps/plugins/casegame/settings.c (revision 0) @@ -0,0 +1,601 @@ +#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, { .int_p = &settings.resume }, "Resume", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.turn_number }, "Turn", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.players_case }, "Selected", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[0] }, "CaseV1", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[1] }, "CaseV2", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[2] }, "CaseV3", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[3] }, "CaseV4", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[4] }, "CaseV5", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[5] }, "CaseV6", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[6] }, "CaseV7", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[7] }, "CaseV8", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[8] }, "CaseV9", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[9] }, "CaseV10", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[10] }, "CaseV11", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[11] }, "CaseV12", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[12] }, "CaseV13", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[13] }, "CaseV14", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[14] }, "CaseV15", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[15] }, "CaseV16", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[16] }, "CaseV17", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[17] }, "CaseV18", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[18] }, "CaseV19", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[19] }, "CaseV20", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[20] }, "CaseV21", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[21] }, "CaseV22", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[22] }, "CaseV23", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[23] }, "CaseV24", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[24] }, "CaseV25", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.case_values[25] }, "CaseV26", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[0] }, "ActiveC1", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[1] }, "ActiveC2", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[2] }, "ActiveC3", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[3] }, "ActiveC4", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[4] }, "ActiveC5", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[5] }, "ActiveC6", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[6] }, "ActiveC7", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[7] }, "ActiveC8", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[8] }, "ActiveC9", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[9] }, "ActiveC10", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[10] }, "ActiveC11", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[11] }, "ActiveC12", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[12] }, "ActiveC13", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[13] }, "ActiveC14", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[14] }, "ActiveC15", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[15] }, "ActiveC16", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[16] }, "ActiveC17", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[17] }, "ActiveC18", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[18] }, "ActiveC19", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[19] }, "ActiveC20", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[20] }, "ActiveC21", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[21] }, "ActiveC22", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[22] }, "ActiveC23", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[23] }, "ActiveC24", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[24] }, "ActiveC25", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_cases[25] }, "ActiveC26", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[0] }, "ActiveV1", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[1] }, "ActiveV2", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[2] }, "ActiveV3", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[3] }, "ActiveV4", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[4] }, "ActiveV5", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[5] }, "ActiveV6", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[6] }, "ActiveV7", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[7] }, "ActiveV8", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[8] }, "ActiveV9", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[9] }, "ActiveV10", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[10] }, "ActiveV11", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[11] }, "ActiveV12", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[12] }, "ActiveV13", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[13] }, "ActiveV14", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[14] }, "ActiveV15", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[15] }, "ActiveV16", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[16] }, "ActiveV17", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[17] }, "ActiveV18", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[18] }, "ActiveV19", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[19] }, "ActiveV20", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[20] }, "ActiveV21", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[21] }, "ActiveV22", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[22] }, "ActiveV23", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[23] }, "ActiveV24", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[24] }, "ActiveV25", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.active_values[25] }, "ActiveV26", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.high_score[0] }, "HighScore1", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.high_score[1] }, "HighScore2", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.high_score[2] }, "HighScore3", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.high_score[3] }, "HighScore4", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.high_score[4] }, "HighScore5", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.high_score[5] }, "HighScore6", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.high_score[6] }, "HighScore7", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.high_score[7] }, "HighScore8", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.high_score[8] }, "HighScore9", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.high_score[9] }, "HighScore10", NULL }, + { TYPE_STRING, 0, 12, { .string = (char*)&settings.high_player[0] }, "HighPlayer1", NULL }, + { TYPE_STRING, 0, 12, { .string = (char*)&settings.high_player[1] }, "HighPlayer2", NULL }, + { TYPE_STRING, 0, 12, { .string = (char*)&settings.high_player[2] }, "HighPlayer3", NULL }, + { TYPE_STRING, 0, 12, { .string = (char*)&settings.high_player[3] }, "HighPlayer4", NULL }, + { TYPE_STRING, 0, 12, { .string = (char*)&settings.high_player[4] }, "HighPlayer5", NULL }, + { TYPE_STRING, 0, 12, { .string = (char*)&settings.high_player[5] }, "HighPlayer6", NULL }, + { TYPE_STRING, 0, 12, { .string = (char*)&settings.high_player[6] }, "HighPlayer7", NULL }, + { TYPE_STRING, 0, 12, { .string = (char*)&settings.high_player[7] }, "HighPlayer8", NULL }, + { TYPE_STRING, 0, 12, { .string = (char*)&settings.high_player[8] }, "HighPlayer9", NULL }, + { TYPE_STRING, 0, 12, { .string = (char*)&settings.high_player[9] }, "HighPlayer10", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.offers[0] }, "Offer1", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.offers[1] }, "Offer2", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.offers[2] }, "Offer3", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.offers[3] }, "Offer4", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.offers[4] }, "Offer5", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.offers[5] }, "Offer6", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.offers[6] }, "Offer7", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.offers[7] }, "Offer8", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.offers[8] }, "Offer9", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.offers[9] }, "Offer10", NULL }, + { TYPE_INT, 0, INT_MAX, { .int_p = &settings.offers_count }, "OffersCount", NULL } +}; + +void init_settings(void) +{ + 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,138 @@ +#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 void* parameter) +{ + int ret = PLUGIN_OK; + + (void)(parameter); + players_name[0] = '\0'; + +#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(); + + 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,242 @@ +/*************************************************************************** + * __________ __ ___. + * 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 "lib/configfile.h" +#include "pluginbitmaps/case_light.h" +#include "pluginbitmaps/case_dark.h" +#include "pluginbitmaps/case_gray.h" +#include "pluginbitmaps/case_green.h" +#include "pluginbitmaps/case_ukeysw.h" +#include "pluginbitmaps/case_ukeysg.h" +#include "pluginbitmaps/case_lkeysw.h" +#include "pluginbitmaps/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); + +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/SUBDIRS =================================================================== --- apps/plugins/SUBDIRS (revision 23129) +++ apps/plugins/SUBDIRS (working copy) @@ -19,6 +19,7 @@ #ifdef HAVE_TAGCACHE pictureflow #endif +casegame chessbox jpeg sudoku