From 21cc9a6d761bf1d99a9938a13259c19abe23d281 Mon Sep 17 00:00:00 2001 From: Kevin Ferrare Date: Fri, 20 Jul 2007 02:47:37 +0000 Subject: [PATCH] Dice plugin now works on remote and uses the action api ; cleaned up the code a little bit as well git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13935 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/dice.c | 293 ++++++++++----------------- apps/plugins/lib/pluginlib_actions.h | 4 +- 2 files changed, 110 insertions(+), 187 deletions(-) diff --git a/apps/plugins/dice.c b/apps/plugins/dice.c index 0875248bdc..73927372a6 100644 --- a/apps/plugins/dice.c +++ b/apps/plugins/dice.c @@ -17,213 +17,133 @@ * ****************************************************************************/ -/***************************************************************************** -Dice by lostlogic - -use left and right to pick between sides and number of dice -use up and down to select number of sides or number of dice -use select or play to roll the dice -use stop to exit - -*****************************************************************************/ - #include "plugin.h" +#include "pluginlib_actions.h" -#define MAX_DICE 12 -#define NUM_SIDE_CHOICES 8 -#if (CONFIG_KEYPAD == PLAYER_PAD) - #define START_DICE_ROW 1 - #define ROWS 1 - #define LINE_LENGTH 50 - #define SELECTIONS_ROW 0 -#else - #if (CONFIG_KEYPAD == RECORDER_PAD) || (CONFIG_KEYPAD == ONDIO_PAD) - #define START_DICE_ROW 0 - #define ROWS 3 - #define LINE_LENGTH 18 - #else - #define START_DICE_ROW 0 - #define ROWS 2 - #define LINE_LENGTH 26 - #endif -#endif - -#define min(x,y) (xy?x:y) - -#if CONFIG_KEYPAD == RECORDER_PAD -#define DICE_BUTTON_ON BUTTON_ON -#define DICE_BUTTON_OFF BUTTON_OFF -#define DICE_BUTTON_SELECT BUTTON_PLAY - -#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD -#define DICE_BUTTON_ON BUTTON_ON -#define DICE_BUTTON_OFF BUTTON_OFF -#define DICE_BUTTON_SELECT BUTTON_SELECT - -#elif CONFIG_KEYPAD == ONDIO_PAD -#define DICE_BUTTON_ON (BUTTON_MENU|BUTTON_OFF) -#define DICE_BUTTON_OFF BUTTON_OFF -#define DICE_BUTTON_SELECT (BUTTON_MENU|BUTTON_REL) - -#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) -#define DICE_BUTTON_ON BUTTON_ON -#define DICE_BUTTON_OFF BUTTON_OFF -#define DICE_BUTTON_SELECT BUTTON_SELECT - -#define DICE_BUTTON_RC_OFF BUTTON_RC_STOP - -#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) -#define DICE_BUTTON_ON (BUTTON_SELECT|BUTTON_PLAY) -#define DICE_BUTTON_OFF (BUTTON_PLAY|BUTTON_REPEAT) -#define DICE_BUTTON_SELECT BUTTON_SELECT - -#elif CONFIG_KEYPAD == PLAYER_PAD -#define DICE_BUTTON_ON (BUTTON_ON|BUTTON_REPEAT) -#define DICE_BUTTON_OFF BUTTON_MENU -#define DICE_BUTTON_SELECT BUTTON_ON - -#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD -#define DICE_BUTTON_ON BUTTON_PLAY -#define DICE_BUTTON_OFF BUTTON_POWER -#define DICE_BUTTON_SELECT BUTTON_SELECT - -#elif CONFIG_KEYPAD == GIGABEAT_PAD -#define DICE_BUTTON_ON BUTTON_A -#define DICE_BUTTON_OFF BUTTON_POWER -#define DICE_BUTTON_SELECT BUTTON_SELECT - -#elif CONFIG_KEYPAD == SANSA_E200_PAD -#define DICE_BUTTON_ON BUTTON_UP -#define DICE_BUTTON_OFF BUTTON_POWER -#define DICE_BUTTON_SELECT BUTTON_SELECT - -#elif CONFIG_KEYPAD == IRIVER_H10_PAD -#define DICE_BUTTON_ON BUTTON_PLAY -#define DICE_BUTTON_OFF BUTTON_POWER -#define DICE_BUTTON_SELECT BUTTON_REW - -#else - #error DICE: Unsupported keypad -#endif +#define MAX_DICES 12 +#define INITIAL_NB_DICES 1 +#define DICE_QUIT PLA_QUIT +#define DICE_ROLL PLA_START +const struct button_mapping* plugin_contexts[]={generic_actions}; +struct dices +{ + int values[MAX_DICES]; + int total; + int nb_dices; + int nb_sides; +}; +#define PRINT_BUFFER_LENGTH MAX_DICES*4 PLUGIN_HEADER - /* 0, 1, 2, 3, 4, 5, 6, 7 */ -static const int SIDES[] = { 3, 4, 6, 8, 10, 12, 20, 100 }; static struct plugin_api* rb; -static int roll_dice(int dice[], const int num_dice, const int side_index); -static void print_dice(const int dice[], const int total); -static bool dice_menu(int *num_dice, int *side_index); +void dice_init(struct dices* dice); +void dice_roll(struct dices* dice); +void dice_print(struct dices* dice, struct screen* display); +bool dice_menu(struct dices* dice); /* plugin entry point */ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - int side_index = 6; - int num_dice = 1; - bool exit = false; - int dice[MAX_DICE]; - int total; - - /* plugin init */ (void)parameter; rb = api; + int i, action; + struct dices dice; - rb->lcd_clear_display(); + dice_init(&dice); rb->srand(*rb->current_tick); - /* end of plugin init */ - - if(!dice_menu(&num_dice, &side_index)) - exit = true; - else { - total = roll_dice(dice, num_dice, side_index); - print_dice(dice, total); - } - while(!exit) { - switch(rb->button_get(true)) { - case DICE_BUTTON_ON: - case DICE_BUTTON_SELECT: - total = roll_dice(dice, num_dice, side_index); - print_dice(dice, total); - break; -#ifdef DICE_BUTTON_RC_OFF - case DICE_BUTTON_RC_OFF: -#endif - case DICE_BUTTON_OFF: - exit=true; - break; - default: + if(!dice_menu(&dice)) + return PLUGIN_OK; + dice_roll(&dice); + FOR_NB_SCREENS(i) + dice_print( &dice, rb->screens[i] ); + while(true) { + action = pluginlib_getaction(rb, TIMEOUT_BLOCK, + plugin_contexts, 1); + switch(action) { + case DICE_ROLL: + dice_roll(&dice); + FOR_NB_SCREENS(i) + dice_print( &dice, rb->screens[i] ); break; - } /* switch */ - } /* while */ - - return PLUGIN_OK; + case DICE_QUIT: + return PLUGIN_OK; + } + } } -/* Clears the dice array, rolls the dice and returns the sum */ -static int roll_dice(int dice[], const int num_dice, const int side_index) { +void dice_init(struct dices* dice){ + dice->nb_dices=INITIAL_NB_DICES; +} + +void dice_roll(struct dices* dice) { int i; - int total = 0; - rb->memset((void*)dice,0,MAX_DICE*sizeof(int)); - for (i=0; irand()%SIDES[side_index] + 1; - total+=dice[i]; + dice->total = 0; + for (i=0; inb_dices; i++) { + dice->values[i] = rb->rand()%dice->nb_sides + 1; + dice->total+=dice->values[i]; } - return total; } -/* Prints the dice, and the sum of the dice values */ -static void print_dice(const int dice[], const int total) { - const int dice_per_row = MAX_DICE/ROWS + (MAX_DICE%ROWS?1:0); - char showdice[LINE_LENGTH]; - int row; - rb->lcd_clear_display(); - for (row=0; /*break;*/; row++) { - const int start = row*dice_per_row; - const int end = min(MAX_DICE,start+dice_per_row); - char *pointer = showdice; - int space = LINE_LENGTH; - int i; - rb->memset((void*)showdice,0,LINE_LENGTH*sizeof(char)); - for (i=start; i0; i++) { - int count = rb->snprintf(pointer,space," %3d",dice[i]); - pointer = &pointer[count]; - space -= count; - } - if (i > start) { - rb->lcd_puts_scroll(0,START_DICE_ROW+row,showdice); - } else { - row--; - break; - } - if (i < end || end == MAX_DICE) break; +void dice_print_string_buffer(struct dices* dice, char* buffer, + int start, int end){ + int i, written; + for (i=start; isnprintf(buffer, PRINT_BUFFER_LENGTH, + " %3d", dice->values[i]); + buffer=&(buffer[written]); } -#if (CONFIG_KEYPAD == PLAYER_PAD) - (void)total; -#else - rb->lcd_puts(0,START_DICE_ROW+(++row)," "); - if (total > 0) { - rb->snprintf(showdice,LINE_LENGTH,"Total: %4d",total); - rb->lcd_puts(1,START_DICE_ROW+(++row),showdice); - } - while (row < ROWS+2) { - rb->lcd_puts(0,START_DICE_ROW+(++row)," "); - } -#endif - rb->lcd_update(); } -static bool dice_menu(int *num_dice, int *side_index) { + +void dice_print(struct dices* dice, struct screen* display){ + char buffer[PRINT_BUFFER_LENGTH]; + /* display characteristics */ + int char_height, char_width; + display->getstringsize("M", &char_width, &char_height); + int display_nb_row=display->height/char_height; + int display_nb_col=display->width/char_width; + + int nb_dices_per_line=display_nb_col/4;/* 4 char per dice displayed*/ + int nb_lines_required=dice->nb_dices/nb_dices_per_line; + int current_row=0; + if(dice->nb_dices%nb_dices_per_line!=0) + nb_lines_required++; + display->clear_display(); + if(display_nb_rownb_dices); + display->puts_scroll(0, current_row, buffer); + current_row++; + }else{ + int start=0; + int end=0; + for(;current_rowdice->nb_dices) + end=dice->nb_dices; + dice_print_string_buffer(dice, buffer, start, end); + display->puts(0, current_row, buffer); + start=end; + } + } + rb->snprintf(buffer, PRINT_BUFFER_LENGTH, "Total: %4d", dice->total); + display->puts(0, current_row, buffer); + display->update(); +} + +bool dice_menu(struct dices * dice) { int selection; + int side_index; bool menu_quit = false, result = false; - + MENUITEM_STRINGLIST(menu,"Dice Menu",NULL,"Roll Dice","Number of Dice", "Number of Sides","Quit"); - static const struct opt_items num_sides_option[8] = { + struct opt_items nb_sides_option[8] = { { "3", -1 }, { "4", -1 }, { "6", -1 }, @@ -233,31 +153,32 @@ static bool dice_menu(int *num_dice, int *side_index) { { "20", -1 }, { "100", -1 } }; - + int nb_sides_values[] = { 3, 4, 6, 8, 10, 12, 20, 100 }; while (!menu_quit) { - switch(rb->do_menu(&menu, &selection)) - { + switch(rb->do_menu(&menu, &selection)){ case 0: menu_quit = true; result = true; break; - + case 1: - rb->set_int("Number of Dice", "", UNIT_INT, num_dice, NULL, - 1, 1, MAX_DICE, NULL ); + rb->set_int("Number of Dice", "", UNIT_INT, &(dice->nb_dices), + NULL, 1, 1, MAX_DICES, NULL ); break; - + case 2: - rb->set_option("Number of Sides", side_index, INT, - num_sides_option, 8, NULL); + side_index=6; + rb->set_option("Number of Sides", &side_index, INT, + nb_sides_option, + sizeof(nb_sides_values)/sizeof(int), NULL); + dice->nb_sides=nb_sides_values[side_index]; break; - + default: menu_quit = true; result = false; break; } } - return result; } diff --git a/apps/plugins/lib/pluginlib_actions.h b/apps/plugins/lib/pluginlib_actions.h index a5c199d209..26370d2b99 100644 --- a/apps/plugins/lib/pluginlib_actions.h +++ b/apps/plugins/lib/pluginlib_actions.h @@ -219,8 +219,9 @@ static const struct button_mapping generic_actions[] = { #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) {PLA_QUIT, BUTTON_OFF, BUTTON_NONE}, - {PLA_QUIT, BUTTON_RC_STOP, BUTTON_NONE}, + {PLA_QUIT, BUTTON_RC_STOP, BUTTON_NONE}, {PLA_START, BUTTON_ON, BUTTON_NONE}, + {PLA_START, BUTTON_RC_ON, BUTTON_NONE}, {PLA_MENU, BUTTON_MODE, BUTTON_NONE}, {PLA_FIRE, BUTTON_SELECT, BUTTON_NONE}, {PLA_FIRE_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE}, @@ -233,6 +234,7 @@ static const struct button_mapping generic_actions[] = #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD {PLA_QUIT, BUTTON_POWER, BUTTON_NONE}, {PLA_START, BUTTON_PLAY, BUTTON_NONE}, + {PLA_START, BUTTON_RC_PLAY, BUTTON_NONE}, {PLA_MENU, BUTTON_REC, BUTTON_NONE}, {PLA_FIRE, BUTTON_SELECT, BUTTON_NONE}, {PLA_FIRE_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE},