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 "lib/pluginlib_actions.h"
24 #include "lib/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 struct dices dice
;
50 static int sides_index
;
52 static struct opt_items nb_sides_option
[8] = {
62 static int nb_sides_values
[] = { 3, 4, 6, 8, 10, 12, 20, 100 };
63 static char *sides_conf
[] = {"3", "4", "6", "8", "10", "12", "20", "100" };
64 static struct configdata config
[] =
66 {TYPE_INT
, 0, MAX_DICES
, { .int_p
= &dice
.nb_dices
}, "dice count", NULL
},
67 {TYPE_ENUM
, 0, 8, { .int_p
= &sides_index
}, "side count", sides_conf
}
70 void dice_init(struct dices
* dice
);
71 void dice_roll(struct dices
* dice
);
72 void dice_print(struct dices
* dice
, struct screen
* display
);
73 bool dice_menu(struct dices
* dice
);
75 /* plugin entry point */
76 enum plugin_status
plugin_start(const void* parameter
) {
81 rb
->srand(*rb
->current_tick
);
83 configfile_load(CFG_FILE
, config
, 2, 0);
84 dice
.nb_sides
= nb_sides_values
[sides_index
];
87 configfile_save(CFG_FILE
, config
, 2, 0);
90 configfile_save(CFG_FILE
, config
, 2, 0);
93 dice_print( &dice
, rb
->screens
[i
] );
95 action
= pluginlib_getaction(TIMEOUT_BLOCK
,
101 dice_print( &dice
, rb
->screens
[i
] );
109 void dice_init(struct dices
* dice
){
110 dice
->nb_dices
=INITIAL_NB_DICES
;
111 sides_index
=INITIAL_NB_SIDES
;
115 void dice_roll(struct dices
* dice
) {
118 for (i
=0; i
<dice
->nb_dices
; i
++) {
119 dice
->values
[i
] = rb
->rand()%dice
->nb_sides
+ 1;
120 dice
->total
+=dice
->values
[i
];
124 void dice_print_string_buffer(struct dices
* dice
, char* buffer
,
127 for (i
=start
; i
<end
; i
++) {
128 written
=rb
->snprintf(buffer
, PRINT_BUFFER_LENGTH
,
129 " %3d", dice
->values
[i
]);
130 buffer
=&(buffer
[written
]);
134 void dice_print(struct dices
* dice
, struct screen
* display
){
135 char buffer
[PRINT_BUFFER_LENGTH
];
136 /* display characteristics */
137 int char_height
, char_width
;
138 display
->getstringsize("M", &char_width
, &char_height
);
139 int display_nb_row
=display
->getheight()/char_height
;
140 int display_nb_col
=display
->getwidth()/char_width
;
142 int nb_dices_per_line
=display_nb_col
/4;/* 4 char per dice displayed*/
143 int nb_lines_required
=dice
->nb_dices
/nb_dices_per_line
;
145 if(dice
->nb_dices
%nb_dices_per_line
!=0)
147 display
->clear_display();
148 if(display_nb_row
<nb_lines_required
){
149 /* Put everything on the same scrolling line */
150 dice_print_string_buffer(dice
, buffer
, 0, dice
->nb_dices
);
151 display
->puts_scroll(0, current_row
, buffer
);
156 for(;current_row
<nb_lines_required
;current_row
++){
157 end
=start
+nb_dices_per_line
;
158 if(end
>dice
->nb_dices
)
160 dice_print_string_buffer(dice
, buffer
, start
, end
);
161 display
->puts(0, current_row
, buffer
);
165 rb
->snprintf(buffer
, PRINT_BUFFER_LENGTH
, "Total: %d", dice
->total
);
166 display
->puts_scroll(0, current_row
, buffer
);
170 bool dice_menu(struct dices
* dice
) {
172 bool menu_quit
= false, result
= false;
174 MENUITEM_STRINGLIST(menu
,"Dice Menu",NULL
,"Roll Dice","Number of Dice",
175 "Number of Sides","Quit");
179 switch(rb
->do_menu(&menu
, &selection
, NULL
, false)){
186 rb
->set_int("Number of Dice", "", UNIT_INT
, &(dice
->nb_dices
),
187 NULL
, 1, 1, MAX_DICES
, NULL
);
191 rb
->set_option("Number of Sides", &sides_index
, INT
,
193 sizeof(nb_sides_values
)/sizeof(int), NULL
);
194 dice
->nb_sides
=nb_sides_values
[sides_index
];