enum plugin_status
plugin_start (const void *parameter)
{
    int btn;

    rb->mkdir (DEFAULT_SAVE_DIR);

    global_setup ();

#ifdef GBN_TEST
    run_tests ();
    return PLUGIN_OK;
#endif

    if (!(parameter && load_game (parameter)))
    {
        if (parameter)
        {
            rb->splashf (2 * HZ, "Loading %s failed.", (char *) parameter);
        }

        if (!load_game (DEFAULT_SAVE))
        {
            rb->strcpy (save_file, DEFAULT_SAVE);

            if (!setup_game (MAX_BOARD_SIZE, MAX_BOARD_SIZE, 0, 0))
            {
                return PLUGIN_ERROR;
            }
        }
    }
    else
    {
        /* game loaded */
        if (rb->strcmp (save_file, DEFAULT_SAVE))
        {
            /* delete the scratch file if we loaded a game and it wasn't
             * from the scratch file
             */
            rb->remove (DEFAULT_SAVE);
        }
    }

    draw_screen_display ();

    autosave_counter = 0;
    for (;;)
    {
        btn = rb->button_get_w_tmo (HZ * 30);

        if (disable_shutdown)
        {
            /* tell rockbox we're not idle */
            rb->reset_poweroff_timer ();
        }

        bool is_idle = false;

        switch (btn)
        {

#if defined(GBN_BUTTON_NAV_MODE)
        case GBN_BUTTON_NAV_MODE:
        case GBN_BUTTON_NAV_MODE | BUTTON_REPEAT:
            if (nav_mode == NAV_MODE_TREE)
            {
                nav_mode = NAV_MODE_BOARD;
                rb->splash (2 * HZ / 3, "board navigation mode");
                draw_screen_display ();
            }
            else
            {
                nav_mode = NAV_MODE_TREE;
                rb->splash (2 * HZ / 3, "tree navigation mode");
                draw_screen_display ();
            }
            break;
#endif

#if defined(GBN_BUTTON_ADVANCE)
        case GBN_BUTTON_ADVANCE:
        case GBN_BUTTON_ADVANCE | BUTTON_REPEAT:
            if (has_more_nodes_sgf ())
            {
                if (!redo_node_sgf ())
                {
                    rb->splash (2 * HZ, "redo failed");
                }
                draw_screen_display ();
            }
            break;
#endif

#if defined(GBN_BUTTON_RETREAT)
        case GBN_BUTTON_RETREAT:
        case GBN_BUTTON_RETREAT | BUTTON_REPEAT:
            if (has_prev_nodes_sgf ())
            {
                if (!undo_node_sgf ())
                {
                    rb->splash (3 * HZ / 2, "Undo Failed");
                }
                draw_screen_display ();
            }
            break;
#endif

        case GBN_BUTTON_PLAY:
            if (play_mode == MODE_PLAY || play_mode == MODE_FORCE_PLAY)
            {
                if (!play_move_sgf (cursor_pos, current_player))
                {
                    rb->splash (HZ / 3, "Illegal Move");
                }
            }
            else if (play_mode == MODE_ADD_BLACK)
            {
                if (!add_stone_sgf (cursor_pos, BLACK))
                {
                    rb->splash (HZ / 3, "Illegal");
                }
            }
            else if (play_mode == MODE_ADD_WHITE)
            {
                if (!add_stone_sgf (cursor_pos, WHITE))
                {
                    rb->splash (HZ / 3, "Illegal");
                }
            }
            else if (play_mode == MODE_REMOVE)
            {
                if (!add_stone_sgf (cursor_pos, EMPTY))
                {
                    rb->splash (HZ / 3, "Illegal");
                }
            }
            else if (play_mode == MODE_MARK)
            {
                if (!add_mark_sgf (cursor_pos, PROP_MARK))
                {
                    rb->splash (HZ / 3, "Couldn't Mark");
                }
            }
            else if (play_mode == MODE_CIRCLE)
            {
                if (!add_mark_sgf (cursor_pos, PROP_CIRCLE))
                {
                    rb->splash (HZ / 3, "Couldn't Mark");
                }
            }
            else if (play_mode == MODE_SQUARE)
            {
                if (!add_mark_sgf (cursor_pos, PROP_SQUARE))
                {
                    rb->splash (HZ / 3, "Couldn't Mark");
                }
            }
            else if (play_mode == MODE_TRIANGLE)
            {
                if (!add_mark_sgf (cursor_pos, PROP_TRIANGLE))
                {
                    rb->splash (HZ / 3, "Couldn't Mark");
                }
            }
            else if (play_mode == MODE_LABEL)
            {
                if (!add_mark_sgf (cursor_pos, PROP_LABEL))
                {
                    rb->splash (HZ / 3, "Couldn't Label");
                }
            }
            else
            {
                rb->splash (HZ, "mode not implemented");
            }

            draw_screen_display ();
            break;

        case GBN_BUTTON_RIGHT:
        case GBN_BUTTON_RIGHT | BUTTON_REPEAT:
#if defined(GBN_BUTTON_NAV_MODE)
            if (nav_mode == NAV_MODE_TREE)
            {
                if (has_more_nodes_sgf ())
                {
                    if (!redo_node_sgf ())
                    {
                        rb->splash (2 * HZ, "Redo Failed");
                    }
                    draw_screen_display ();
                }
            }
            else
            {
#endif
                cursor_pos = WRAP (EAST (cursor_pos));
                draw_screen_display ();
#if defined(GBN_BUTTON_NAV_MODE)
            }
#endif
            break;

        case GBN_BUTTON_LEFT:
        case GBN_BUTTON_LEFT | BUTTON_REPEAT:
#if defined(GBN_BUTTON_NAV_MODE)
            if (nav_mode == NAV_MODE_TREE)
            {
                if (has_prev_nodes_sgf ())
                {
                    if (!undo_node_sgf ())
                    {
                        rb->splash (2 * HZ, "Undo Failed");
                    }
                    draw_screen_display ();
                }
            }
            else
            {
#endif
                cursor_pos = WRAP (WEST (cursor_pos));
                draw_screen_display ();
#if defined(GBN_BUTTON_NAV_MODE)
            }
#endif
            break;

        case GBN_BUTTON_DOWN:
        case GBN_BUTTON_DOWN | BUTTON_REPEAT:
            cursor_pos = WRAP (SOUTH (cursor_pos));
            draw_screen_display ();
            break;

        case GBN_BUTTON_UP:
        case GBN_BUTTON_UP | BUTTON_REPEAT:
            cursor_pos = WRAP (NORTH (cursor_pos));
            draw_screen_display ();
            break;

        case GBN_BUTTON_MENU:
            if (do_main_menu ())
            {
                save_game (DEFAULT_SAVE);

                global_cleanup ();
                return PLUGIN_OK;
            }

            draw_screen_display ();
            break;

#if defined(GBN_BUTTON_CONTEXT)
        case GBN_BUTTON_CONTEXT:
            do_context_menu ();
            draw_screen_display ();
            break;
#endif

#if defined(GBN_BUTTON_NEXT_VAR)
        case GBN_BUTTON_NEXT_VAR:
        case GBN_BUTTON_NEXT_VAR | BUTTON_REPEAT:
        {
            int temp;
            if ((temp = next_variation_sgf ()) >= 0)
            {
                draw_screen_display ();
                rb->splashf (2 * HZ / 3, "%d of %d", temp,
                             num_variations_sgf ());
                draw_screen_display ();
            }
            else
            {
                if (num_variations_sgf () > 1)
                {
                    rb->splashf (HZ, "Error %d in next_variation_sgf", temp);
                }
                draw_screen_display ();
            }
            break;
        }
#endif

        case BUTTON_NONE:
            is_idle = true;
        default:
            if (rb->default_event_handler (btn) == SYS_USB_CONNECTED)
            {
                return PLUGIN_USB_CONNECTED;
            }
            break;
        };

        if (is_idle && autosave_dirty)
        {
            ++autosave_counter;

            if (autosave_time != 0 &&
                autosave_counter / 2 >= autosave_time)
                /* counter is in 30 second increments, autosave_time is in
                 * minutes
                 */
            {
                DEBUGF("autosaving\n");
                rb->splash(HZ / 4, "Autosaving...");
                save_game(DEFAULT_SAVE);
                draw_screen_display();
                autosave_counter = 0;
            }
        }
        else
        {
            autosave_counter = 0;
        }
    }

    return PLUGIN_OK;
}
Exemple #2
0
static void
draw_footer (void)
{
    char captures_buffer[16];
    char display_flags[16] = "";
    int size_x, size_y;
    int vert_x, vert_y;

    (void) vert_x;
    (void) vert_y;

#if LCD_DEPTH > 1
    rb->lcd_set_background (BACKGROUND_COLOR);
    rb->lcd_set_foreground (BLACK_COLOR);
#else
    rb->lcd_set_drawmode (DRMODE_SOLID + DRMODE_INVERSEVID);
#endif

    rb->snprintf (captures_buffer, sizeof (captures_buffer),
                  "%d", white_captures);


    rb->lcd_getstringsize (captures_buffer, &size_x, &size_y);
#if defined(GBN_TALL_SCREEN)
    rb->lcd_putsxy (size_y + 2, LCD_HEIGHT - size_y, captures_buffer);
#else
    vert_string_size (captures_buffer, &vert_x, &vert_y);
    if (board_pixel_width + size_x <= LCD_WIDTH)
    {
        rb->lcd_putsxy (LCD_WIDTH - size_x - 1, vert_x + 2, captures_buffer);
    }
    else
    {
        putsxy_vertical (LCD_WIDTH - vert_x - 1, vert_x + 2, vert_x,
                         captures_buffer);
    }
#endif

#if LCD_DEPTH == 1
    rb->lcd_set_drawmode (DRMODE_SOLID);
#endif

#if defined(GBN_TALL_SCREEN)
    draw_circle (size_y / 2,
                 LCD_HEIGHT - (size_y / 2), (size_y - 1) / 2, true);

#if LCD_DEPTH == 1
    rb->lcd_set_drawmode (DRMODE_SOLID + DRMODE_INVERSEVID);
    draw_circle (size_y / 2,
                 LCD_HEIGHT - (size_y / 2), (size_y - 1) / 2, false);
#endif /* LCD_DEPTH */

#else /* !GBN_TALL_SCREEN */
    draw_circle (LCD_WIDTH - 1 - vert_x / 2,
                 (vert_x / 2), (vert_x - 1) / 2, true);

#if LCD_DEPTH == 1
    rb->lcd_set_drawmode (DRMODE_SOLID + DRMODE_INVERSEVID);
    draw_circle (LCD_WIDTH - 1 - vert_x / 2,
                 (vert_x / 2), (vert_x - 1) / 2, false);
#endif /* LCD_DEPTH */

#endif /* GBN_TALL_SCREEN */


#if LCD_DEPTH > 1
    rb->lcd_set_foreground (WHITE_COLOR);
#endif
    rb->snprintf (captures_buffer, sizeof (captures_buffer),
                  "%d", black_captures);

    rb->lcd_getstringsize (captures_buffer, &size_x, &size_y);
#if defined(GBN_TALL_SCREEN)
    rb->lcd_putsxy (LCD_WIDTH - (size_y + 1) - size_x,
                    LCD_HEIGHT - size_y, captures_buffer);

    draw_circle (LCD_WIDTH - (size_y / 2),
                 LCD_HEIGHT - (size_y / 2), (size_y - 1) / 2, true);
#else
    vert_string_size (captures_buffer, &vert_x, &vert_y);
    if (board_pixel_width + size_x <= LCD_WIDTH)
    {
        rb->lcd_putsxy (LCD_WIDTH - size_x - 1,
                        LCD_HEIGHT - vert_x - size_y - 3, captures_buffer);
    }
    else
    {
        putsxy_vertical (LCD_WIDTH - vert_x - 1,
                         LCD_HEIGHT - vert_x - 3 - vert_y,
                         vert_x, captures_buffer);
    }

    draw_circle (LCD_WIDTH - 1 - vert_x / 2,
                 LCD_HEIGHT - 1 - vert_x / 2, (vert_x - 1) / 2, true);
#endif


#if LCD_DEPTH > 1
    rb->lcd_set_foreground (BLACK_COLOR);
#endif

    if (has_comment)
    {
        rb->strcat (display_flags, "C");
    }

    if (has_more_nodes_sgf ())
    {
        rb->strcat (display_flags, "+");
    }

    if (num_variations_sgf () > 1)
    {
        rb->strcat (display_flags, "*");
    }



    rb->snprintf (captures_buffer, sizeof (captures_buffer),
                  "%d%s", move_num, display_flags);

    rb->lcd_getstringsize (captures_buffer, &size_x, &size_y);
#if defined(GBN_TALL_SCREEN)
    rb->lcd_putsxy ((LCD_WIDTH - size_x) / 2,
                    LCD_HEIGHT - size_y, captures_buffer);
#else
    if (board_pixel_width + size_x <= LCD_WIDTH)
    {
        rb->lcd_putsxy (LCD_WIDTH - size_x - 1,
                        (LCD_HEIGHT - size_y) / 2, captures_buffer);
    }
    else
    {
        vert_string_size (captures_buffer, &vert_x, &vert_y);
        putsxy_vertical (LCD_WIDTH - vert_x - 1,
                         (LCD_HEIGHT - vert_y) / 2, vert_x, captures_buffer);
    }
#endif


    rb->lcd_set_drawmode (DRMODE_SOLID);
}