summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/plugins/codebuster.c119
1 files changed, 62 insertions, 57 deletions
diff --git a/apps/plugins/codebuster.c b/apps/plugins/codebuster.c
index 2abf5ec81b..bfcc25f9b5 100644
--- a/apps/plugins/codebuster.c
+++ b/apps/plugins/codebuster.c
@@ -64,31 +64,38 @@ struct mm_line {
64}; 64};
65 65
66const int colors[MAX_COLORS_COUNT] = { 66const int colors[MAX_COLORS_COUNT] = {
67 LCD_RGBPACK(252, 233, 79), 67 LCD_RGBPACK(252, 233, 79),
68 LCD_RGBPACK(206, 92, 0), 68 LCD_RGBPACK(206, 92, 0),
69 LCD_RGBPACK(143, 89, 2), 69 LCD_RGBPACK(143, 89, 2),
70 LCD_RGBPACK( 78, 154, 6), 70 LCD_RGBPACK( 78, 154, 6),
71 /* LCD_RGBPACK( 32, 74, 135), */ 71 /* LCD_RGBPACK( 32, 74, 135), */
72 LCD_RGBPACK( 52, 101, 164), 72 LCD_RGBPACK( 52, 101, 164),
73 /* LCD_RGBPACK(114, 159, 207), */ 73 /* LCD_RGBPACK(114, 159, 207), */
74 LCD_RGBPACK(117, 80, 123), 74 LCD_RGBPACK(117, 80, 123),
75 /* LCD_RGBPACK(173, 127, 168), */ 75 /* LCD_RGBPACK(173, 127, 168), */
76 LCD_RGBPACK(164, 0, 0), 76 LCD_RGBPACK(164, 0, 0),
77 LCD_RGBPACK(238, 238, 236), 77 LCD_RGBPACK(238, 238, 236),
78 }; 78};
79 79
80/* Flags */ 80/* Flags */
81static bool quit, leave, usb; 81static bool quit, leave, usb;
82static bool found, game_ended; 82static bool found, game_ended;
83 83
84/* Settings */ 84/* Settings */
85struct settings {
86 int pieces;
87 int colors;
88 int guesses;
89 bool labeling;
90 bool framing;
91};
92static struct settings settings = {
93 5, 7, 10, false, false,
94};
95static struct settings old_settings;
85static int pieces_count; 96static int pieces_count;
86static int colors_count; 97static int colors_count;
87static int guesses_count; 98static int guesses_count;
88static int pieces_tmp = 5;
89static int colors_tmp = 7;
90static int guesses_tmp = 10;
91static bool labeling = false, framing = false;
92 99
93/* Display */ 100/* Display */
94#define ALUMINIUM LCD_RGBPACK(136, 138, 133) 101#define ALUMINIUM LCD_RGBPACK(136, 138, 133)
@@ -102,13 +109,12 @@ static bool labeling = false, framing = false;
102#define CONFIG_FILE_NAME "codebuster.cfg" 109#define CONFIG_FILE_NAME "codebuster.cfg"
103 110
104static struct configdata config[] = { 111static struct configdata config[] = {
105 {TYPE_INT, 0, MAX_PIECES_COUNT, { .int_p = &pieces_tmp }, "pieces", NULL}, 112 {TYPE_INT, 0, MAX_PIECES_COUNT, { .int_p = &settings.pieces }, "pieces", NULL},
106 {TYPE_INT, 0, MAX_COLORS_COUNT, { .int_p = &colors_tmp }, "colors", NULL}, 113 {TYPE_INT, 0, MAX_COLORS_COUNT, { .int_p = &settings.colors }, "colors", NULL},
107 {TYPE_INT, 0, MAX_GUESSES_COUNT, { .int_p = &guesses_tmp }, "guesses", NULL}, 114 {TYPE_INT, 0, MAX_GUESSES_COUNT, { .int_p = &settings.guesses }, "guesses", NULL},
108 {TYPE_BOOL, 0, 1, { .bool_p = &labeling }, "labeling", NULL}, 115 {TYPE_BOOL, 0, 1, { .bool_p = &settings.labeling }, "labeling", NULL},
109 {TYPE_BOOL, 0, 1, { .bool_p = &framing }, "framing", NULL}, 116 {TYPE_BOOL, 0, 1, { .bool_p = &settings.framing }, "framing", NULL},
110}; 117};
111static bool settings_changed = false;
112 118
113static int line_h; 119static int line_h;
114static int piece_w, tick_w; 120static int piece_w, tick_w;
@@ -158,22 +164,22 @@ static void draw_piece(int x, int y, int w, int h, int color_id, bool emph) {
158 else 164 else
159 fill_color_rect(x, y, w, h, color); 165 fill_color_rect(x, y, w, h, color);
160 166
161 if (!emph && framing) 167 if (!emph && settings.framing)
162 rb->lcd_drawrect(x, y, w, h); 168 rb->lcd_drawrect(x, y, w, h);
163 169
164 if (labeling && color_id >= 0) { 170 if (settings.labeling && color_id >= 0) {
165 char text[2]; 171 char text[2];
166 rb->snprintf(text, 2, "%d", color_id); 172 rb->snprintf(text, 2, "%d", color_id);
167 173
168 int fw, fh; rb->font_getstringsize(text, &fw, &fh, FONT_SYSFIXED); 174 int fw, fh; rb->font_getstringsize(text, &fw, &fh, FONT_SYSFIXED);
169 rb->lcd_putsxy(x + get_margin(fw, w), y + get_margin(fh, h), text); 175 rb->lcd_putsxy(x + get_margin(fw, w), y + get_margin(fh, h), text);
170 } 176 }
171} 177}
172 178
173/* Compute the score for a given guess (expressed in ticks) */ 179/* Compute the score for a given guess (expressed in ticks) */
174static void validate_guess(struct mm_line* guess) { 180static void validate_guess(struct mm_line* guess) {
175 bool solution_match[pieces_count]; 181 bool solution_match[MAX_PIECES_COUNT];
176 bool guess_match[pieces_count]; 182 bool guess_match[MAX_PIECES_COUNT];
177 183
178 guess->score.misplaced = 0; 184 guess->score.misplaced = 0;
179 guess->score.correct = 0; 185 guess->score.correct = 0;
@@ -289,10 +295,10 @@ static void init_vars(void) {
289} 295}
290 296
291static void init_board(void) { 297static void init_board(void) {
292 298
293 pieces_count = pieces_tmp; 299 pieces_count = settings.pieces;
294 colors_count = colors_tmp; 300 colors_count = settings.colors;
295 guesses_count = guesses_tmp; 301 guesses_count = settings.guesses;
296 302
297 line_h = GAME_H / (2 * (guesses_count + 2) - 1); 303 line_h = GAME_H / (2 * (guesses_count + 2) - 1);
298 304
@@ -316,31 +322,31 @@ static void randomize_solution(void) {
316static void settings_menu(void) { 322static void settings_menu(void) {
317 MENUITEM_STRINGLIST(settings_menu, "Settings", NULL, 323 MENUITEM_STRINGLIST(settings_menu, "Settings", NULL,
318 "Number of colours", "Number of pegs", 324 "Number of colours", "Number of pegs",
319 "Number of guesses", "Labels", "Frames"); 325 "Number of guesses",
320 326 "Display labels", "Display frames");
321 int cur_item =0; 327 int cur_item = 0;
322
323 bool menu_quit = false; 328 bool menu_quit = false;
329
324 while(!menu_quit) { 330 while(!menu_quit) {
325 331
326 switch(rb->do_menu(&settings_menu, &cur_item, NULL, false)) { 332 switch(rb->do_menu(&settings_menu, &cur_item, NULL, false)) {
327 case 0: 333 case 0:
328 rb->set_int("Number of colours", "", UNIT_INT, &colors_tmp, 334 rb->set_int("Number of colours", "", UNIT_INT, &settings.colors,
329 NULL, -1, MAX_COLORS_COUNT, 1, NULL); 335 NULL, -1, MAX_COLORS_COUNT, 1, NULL);
330 break; 336 break;
331 case 1: 337 case 1:
332 rb->set_int("Number of pegs", "", UNIT_INT, &pieces_tmp, 338 rb->set_int("Number of pegs", "", UNIT_INT, &settings.pieces,
333 NULL, -1, MAX_PIECES_COUNT, 1, NULL); 339 NULL, -1, MAX_PIECES_COUNT, 1, NULL);
334 break; 340 break;
335 case 2: 341 case 2:
336 rb->set_int("Number of guesses", "", UNIT_INT, &guesses_tmp, 342 rb->set_int("Number of guesses", "", UNIT_INT, &settings.guesses,
337 NULL, -1, MAX_GUESSES_COUNT, 1, NULL); 343 NULL, -1, MAX_GUESSES_COUNT, 1, NULL);
338 break; 344 break;
339 case 3: 345 case 3:
340 rb->set_bool("Display labels", &labeling); 346 rb->set_bool("Display labels", &settings.labeling);
341 break; 347 break;
342 case 4: 348 case 4:
343 rb->set_bool("Display frames", &framing); 349 rb->set_bool("Display frames", &settings.framing);
344 break; 350 break;
345 case GO_TO_PREVIOUS: 351 case GO_TO_PREVIOUS:
346 menu_quit = true; 352 menu_quit = true;
@@ -364,10 +370,9 @@ static void main_menu(void) {
364 MENUITEM_STRINGLIST(main_menu, "Codebuster Menu", menu_cb, 370 MENUITEM_STRINGLIST(main_menu, "Codebuster Menu", menu_cb,
365 "Resume Game", "Start New Game", "Settings", 371 "Resume Game", "Start New Game", "Settings",
366 "Playback Control", "Quit"); 372 "Playback Control", "Quit");
367 373 int cur_item = 0;
368 int cur_item =0;
369
370 bool menu_quit = false; 374 bool menu_quit = false;
375
371 while(!menu_quit) { 376 while(!menu_quit) {
372 377
373 switch(rb->do_menu(&main_menu, &cur_item, NULL, false)) { 378 switch(rb->do_menu(&main_menu, &cur_item, NULL, false)) {
@@ -381,7 +386,6 @@ static void main_menu(void) {
381 break; 386 break;
382 case 2: 387 case 2:
383 settings_menu(); 388 settings_menu();
384 settings_changed = true;
385 break; 389 break;
386 case 3: 390 case 3:
387 playback_control(NULL); 391 playback_control(NULL);
@@ -406,15 +410,16 @@ enum plugin_status plugin_start(const void* parameter) {
406 rb->lcd_set_backdrop(NULL); 410 rb->lcd_set_backdrop(NULL);
407 rb->lcd_set_foreground(LCD_WHITE); 411 rb->lcd_set_foreground(LCD_WHITE);
408 rb->lcd_set_background(LCD_BLACK); 412 rb->lcd_set_background(LCD_BLACK);
409 413
410 configfile_load(CONFIG_FILE_NAME,config,5,0); 414 configfile_load(CONFIG_FILE_NAME, config, ARRAYLEN(config), 0);
415 rb->memcpy(&old_settings, &settings, sizeof(settings));
411 416
412 main_menu(); 417 main_menu();
413 while (!quit) { 418 while (!quit) {
414 init_board(); 419 init_board();
415 randomize_solution(); 420 randomize_solution();
416 init_vars(); 421 init_vars();
417 422
418 draw_board(0, 0); 423 draw_board(0, 0);
419 int button = 0, guess = 0, piece = 0; 424 int button = 0, guess = 0, piece = 0;
420 for (guess = 0; guess < guesses_count && !stop_game(); guess++) { 425 for (guess = 0; guess < guesses_count && !stop_game(); guess++) {
@@ -491,19 +496,19 @@ enum plugin_status plugin_start(const void* parameter) {
491 rb->splash(HZ, "Well done :)"); 496 rb->splash(HZ, "Well done :)");
492 else 497 else
493 rb->splash(HZ, "Wooops :("); 498 rb->splash(HZ, "Wooops :(");
494 do { 499 do {
495 button = rb->button_get(true); 500 button = rb->button_get(true);
496 if (rb->default_event_handler(button) == SYS_USB_CONNECTED) { 501 if (rb->default_event_handler(button) == SYS_USB_CONNECTED) {
497 quit = usb = true; 502 quit = usb = true;
498 } 503 }
499 } while( ( button == BUTTON_NONE ) 504 } while( ( button == BUTTON_NONE )
500 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) ); 505 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) );
501 main_menu(); 506 main_menu();
502 } 507 }
503 } 508 }
504 if (settings_changed) 509 if (rb->memcmp(&old_settings, &settings, sizeof(settings)))
505 configfile_save(CONFIG_FILE_NAME,config,5,0); 510 configfile_save(CONFIG_FILE_NAME, config, ARRAYLEN(config), 0);
506 511
507 rb->lcd_setfont(FONT_UI); 512 rb->lcd_setfont(FONT_UI);
508 return (usb) ? PLUGIN_USB_CONNECTED : PLUGIN_OK; 513 return (usb) ? PLUGIN_USB_CONNECTED : PLUGIN_OK;
509} 514}