1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2005 by Brandon Low
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
23 #include "pluginlib_actions.h"
24 #include "configfile.h"
27 #define INITIAL_NB_DICES 1
28 #define INITIAL_NB_SIDES 2 /* corresponds to 6 sides in the array */
30 #define DICE_QUIT PLA_QUIT
31 #define DICE_ROLL PLA_START
34 #define CFG_FILE "dice.cfg"
36 const struct button_mapping
* plugin_contexts
[]={generic_actions
};
40 int values
[MAX_DICES
];
46 #define PRINT_BUFFER_LENGTH MAX_DICES*4
49 static const struct plugin_api
* rb
;
50 static struct dices dice
;
51 static int sides_index
;
53 static struct opt_items nb_sides_option
[8] = {
63 static int nb_sides_values
[] = { 3, 4, 6, 8, 10, 12, 20, 100 };
64 static char *sides_conf
[] = {"3", "4", "6", "8", "10", "12", "20", "100" };
65 static struct configdata config
[] =
67 {TYPE_INT
, 0, MAX_DICES
, &dice
.nb_dices
, "dice count", NULL
, NULL
},
68 {TYPE_ENUM
, 0, 8, &sides_index
, "side count", sides_conf
, NULL
}
71 void dice_init(struct dices
* dice
);
72 void dice_roll(struct dices
* dice
);
73 void dice_print(struct dices
* dice
, struct screen
* display
);
74 bool dice_menu(struct dices
* dice
);
76 /* plugin entry point */
77 enum plugin_status
plugin_start(const struct plugin_api
* api
, const void* parameter
) {
83 rb
->srand(*rb
->current_tick
);
86 configfile_load(CFG_FILE
, config
, 2, 0);
87 dice
.nb_sides
= nb_sides_values
[sides_index
];
90 configfile_save(CFG_FILE
, config
, 2, 0);
93 configfile_save(CFG_FILE
, config
, 2, 0);
96 dice_print( &dice
, rb
->screens
[i
] );
98 action
= pluginlib_getaction(rb
, TIMEOUT_BLOCK
,
104 dice_print( &dice
, rb
->screens
[i
] );
112 void dice_init(struct dices
* dice
){
113 dice
->nb_dices
=INITIAL_NB_DICES
;
114 sides_index
=INITIAL_NB_SIDES
;
118 void dice_roll(struct dices
* dice
) {
121 for (i
=0; i
<dice
->nb_dices
; i
++) {
122 dice
->values
[i
] = rb
->rand()%dice
->nb_sides
+ 1;
123 dice
->total
+=dice
->values
[i
];
127 void dice_print_string_buffer(struct dices
* dice
, char* buffer
,
130 for (i
=start
; i
<end
; i
++) {
131 written
=rb
->snprintf(buffer
, PRINT_BUFFER_LENGTH
,
132 " %3d", dice
->values
[i
]);
133 buffer
=&(buffer
[written
]);
137 void dice_print(struct dices
* dice
, struct screen
* display
){
138 char buffer
[PRINT_BUFFER_LENGTH
];
139 /* display characteristics */
140 int char_height
, char_width
;
141 display
->getstringsize("M", &char_width
, &char_height
);
142 int display_nb_row
=display
->getheight()/char_height
;
143 int display_nb_col
=display
->getwidth()/char_width
;
145 int nb_dices_per_line
=display_nb_col
/4;/* 4 char per dice displayed*/
146 int nb_lines_required
=dice
->nb_dices
/nb_dices_per_line
;
148 if(dice
->nb_dices
%nb_dices_per_line
!=0)
150 display
->clear_display();
151 if(display_nb_row
<nb_lines_required
){
152 /* Put everything on the same scrolling line */
153 dice_print_string_buffer(dice
, buffer
, 0, dice
->nb_dices
);
154 display
->puts_scroll(0, current_row
, buffer
);
159 for(;current_row
<nb_lines_required
;current_row
++){
160 end
=start
+nb_dices_per_line
;
161 if(end
>dice
->nb_dices
)
163 dice_print_string_buffer(dice
, buffer
, start
, end
);
164 display
->puts(0, current_row
, buffer
);
168 rb
->snprintf(buffer
, PRINT_BUFFER_LENGTH
, "Total: %d", dice
->total
);
169 display
->puts_scroll(0, current_row
, buffer
);
173 bool dice_menu(struct dices
* dice
) {
175 bool menu_quit
= false, result
= false;
177 MENUITEM_STRINGLIST(menu
,"Dice Menu",NULL
,"Roll Dice","Number of Dice",
178 "Number of Sides","Quit");
182 switch(rb
->do_menu(&menu
, &selection
, NULL
, false)){
189 rb
->set_int("Number of Dice", "", UNIT_INT
, &(dice
->nb_dices
),
190 NULL
, 1, 1, MAX_DICES
, NULL
);
194 rb
->set_option("Number of Sides", &sides_index
, INT
,
196 sizeof(nb_sides_values
)/sizeof(int), NULL
);
197 dice
->nb_sides
=nb_sides_values
[sides_index
];