void
    Outro::on_draw()
    {
        if (m_snd_game_exit != NULL)
        {
            if (timer_elapsed() > static_cast<unsigned int>(m_snd_game_exit->length_in_ms) + 100)
            {
                next_state();
            }
        }

        Globals g;

        g.render().DrawTile(0,0, g.values().res_w(), g.values().res_h(), m_img_mainmenu);

        string text1 = g.snd2txt().text();
        string text2 = "";

        if (text1.length() >= 25)
        {
            text2 = text1;
            text1.erase(25, string::npos);
            text2.erase(0, 25);
        }
        g.render().DrawText(500, 400, 1.0, 1.0, 1.0, text1);
        g.render().DrawText(500, 450, 1.0, 1.0, 1.0, text2);
    }
void
ConfigureKeys::on_draw()
{
#ifndef DISABLE_LIBSIGC
    Globals g;

    // background image
    g.render().DrawTile(0, 0, g.values().res_w(), g.values().res_h(), m_bg);

    int width  = g.values().res_w();
    int half   = width / 2;
    int quarter= width / 4;

    SDL_Rect top = {quarter - 220, 80, width - 2*(quarter-220), 80};
    SDL_Rect rl  = {quarter - 220, 170, half - 50, 500};
    SDL_Rect rr  = {half + (half -(quarter - 220 + (half - 50))), 170, half - 50, 500};

    g.render().FillRect(top,.0, .0, .0, 0.5f);
    g.render().FillRect(rl ,.0, .0, .0, 0.5f);
    g.render().FillRect(rr ,.0, .0, .0, 0.5f);

    m_con_active.draw_all();
    m_con_passive.draw_all();

    draw_player_keys();

    m_anim_bomb.Update();

    if (mb_grab_key)
    {
        draw_grab_key();
        m_anim_bomb.Draw(quarter - 185, 740, 50, 50);
        m_anim_bomb.Draw(quarter - 220 + (width - 2*(quarter-220)) - 45, 740, 50, 50);
    }
    else
    {
        int index = m_con_active.current_focused();
        m_anim_bomb.Draw(quarter-145 + 512*(index>5?1:0), 142 + 75*((index>5?(index-6):index)+1), 50, 50);
    }
#endif // DISABLE_LIBSIGC
}
void
ConfigureKeys::on_enter()
{
#ifndef DISABLE_LIBSIGC
    Globals g;

    SDL_EnableKeyRepeat(g.values().get(VAL_MENU_KEYREPEAT_DELAY), g.values().get(VAL_MENU_KEYREPEAT_INTERVAL));

    create_key_map();
    create_gui();

    mb_grab_key = false;
    m_which_player = 0;

    m_bg = g.render().LoadTexture(g.images().background_random());

    m_anim_bomb.SetAnimation(ANI_BOMB);
    m_anim_bomb.Start();

    mp_keyconfig    = &g.keycfg();

    g.render().SetTextSizes(16, 16);
#endif // DISABLE_LIBSIGC
}
void
ConfigureKeys::draw_grab_key()
{
    Globals g;
    int width  = g.values().res_w();
    int height = g.values().res_h();
    int quarter= width / 4;

    SDL_Rect r = {quarter - 220, 680, width - 2*(quarter-220), 70};

    g.render().FillRect(r, .0, .0, .0, .5f);

    string str = "Press a key for ";

    switch (m_which_player)
    {
        case 0: str += "Player 1!"; break;
        case 1: str += "Player 2!"; break;
    }

    g.render().SetTextSizes(24, 24);
    g.render().DrawText(r, 255, 255, 255, str);
}
void
ConfigureKeys::create_gui()
{
#ifndef DISABLE_LIBSIGC
    Globals g;

    int width  = g.values().res_w();
    int height = g.values().res_h();
    int half   = width / 2;
    int quarter= half / 2;

    // create buttons
    m_btn_p1_head    = new PushButton("Player 1");
    m_btn_p1_up      = new PushButton("Up");
    m_btn_p1_down    = new PushButton("Down");
    m_btn_p1_left    = new PushButton("Left");
    m_btn_p1_right   = new PushButton("Right");
    m_btn_p1_drop    = new PushButton("Drop bomb");
    m_btn_p1_special = new PushButton("Special key");

    m_btn_p2_head    = new PushButton("Player 2");
    m_btn_p2_up      = new PushButton("Up");
    m_btn_p2_down    = new PushButton("Down");
    m_btn_p2_left    = new PushButton("Left");
    m_btn_p2_right   = new PushButton("Right");
    m_btn_p2_drop    = new PushButton("Drop bomb");
    m_btn_p2_special = new PushButton("Special key");

    int d = 75;

    // positions
    m_btn_p1_head    ->wnd_set_rect(quarter - 200, 100, 400, 40);
    m_btn_p1_up      ->wnd_set_rect(quarter - 100, 100 + 1*d, 200, 40);
    m_btn_p1_down    ->wnd_set_rect(quarter - 100, 100 + 2*d, 200, 40);
    m_btn_p1_left    ->wnd_set_rect(quarter - 100, 100 + 3*d, 200, 40);
    m_btn_p1_right   ->wnd_set_rect(quarter - 100, 100 + 4*d, 200, 40);
    m_btn_p1_drop    ->wnd_set_rect(quarter - 100, 100 + 5*d, 200, 40);
    m_btn_p1_special ->wnd_set_rect(quarter - 100, 100 + 6*d, 200, 40);

    m_btn_p2_head    ->wnd_set_rect(3*quarter - 200, 100, 400, 40);
    m_btn_p2_up      ->wnd_set_rect(3*quarter - 100, 100 + 1*d, 200, 40);
    m_btn_p2_down    ->wnd_set_rect(3*quarter - 100, 100 + 2*d, 200, 40);
    m_btn_p2_left    ->wnd_set_rect(3*quarter - 100, 100 + 3*d, 200, 40);
    m_btn_p2_right   ->wnd_set_rect(3*quarter - 100, 100 + 4*d, 200, 40);
    m_btn_p2_drop    ->wnd_set_rect(3*quarter - 100, 100 + 5*d, 200, 40);
    m_btn_p2_special ->wnd_set_rect(3*quarter - 100, 100 + 6*d, 200, 40);

    // font size
    m_btn_p1_head    ->set_font_size(24, 24);
    m_btn_p1_up      ->set_font_size(16, 16);
    m_btn_p1_down    ->set_font_size(16, 16);
    m_btn_p1_left    ->set_font_size(16, 16);
    m_btn_p1_right   ->set_font_size(16, 16);
    m_btn_p1_drop    ->set_font_size(16, 16);
    m_btn_p1_special ->set_font_size(16, 16);

    m_btn_p2_head    ->set_font_size(24, 24);
    m_btn_p2_up      ->set_font_size(16, 16);
    m_btn_p2_down    ->set_font_size(16, 16);
    m_btn_p2_left    ->set_font_size(16, 16);
    m_btn_p2_right   ->set_font_size(16, 16);
    m_btn_p2_drop    ->set_font_size(16, 16);
    m_btn_p2_special ->set_font_size(16, 16);

    // text alignment
/*    m_btn_p1_head    ->set_text_alignment(TAL_CENTER);
    m_btn_p1_up      ->set_text_alignment(TAL_LEFT);
    m_btn_p1_down    ->set_text_alignment(TAL_LEFT);
    m_btn_p1_left    ->set_text_alignment(TAL_LEFT);
    m_btn_p1_right   ->set_text_alignment(TAL_LEFT);
    m_btn_p1_drop    ->set_text_alignment(TAL_LEFT);
    m_btn_p1_special ->set_text_alignment(TAL_LEFT);

    m_btn_p2_head    ->set_text_alignment(TAL_CENTER);
    m_btn_p2_up      ->set_text_alignment(TAL_LEFT);
    m_btn_p2_down    ->set_text_alignment(TAL_LEFT);
    m_btn_p2_left    ->set_text_alignment(TAL_LEFT);
    m_btn_p2_right   ->set_text_alignment(TAL_LEFT);
    m_btn_p2_drop    ->set_text_alignment(TAL_LEFT);
    m_btn_p2_special ->set_text_alignment(TAL_LEFT);
*/

    m_btn_p1_up      ->set_border_type(BT_MOUSE_OVER);
    m_btn_p1_down    ->set_border_type(BT_MOUSE_OVER);
    m_btn_p1_left    ->set_border_type(BT_MOUSE_OVER);
    m_btn_p1_right   ->set_border_type(BT_MOUSE_OVER);
    m_btn_p1_drop    ->set_border_type(BT_MOUSE_OVER);
    m_btn_p1_special ->set_border_type(BT_MOUSE_OVER);

    m_btn_p2_up      ->set_border_type(BT_MOUSE_OVER);
    m_btn_p2_down    ->set_border_type(BT_MOUSE_OVER);
    m_btn_p2_left    ->set_border_type(BT_MOUSE_OVER);
    m_btn_p2_right   ->set_border_type(BT_MOUSE_OVER);
    m_btn_p2_drop    ->set_border_type(BT_MOUSE_OVER);
    m_btn_p2_special ->set_border_type(BT_MOUSE_OVER);

    m_con_active.add(m_btn_p1_up     );
    m_con_active.add(m_btn_p1_down   );
    m_con_active.add(m_btn_p1_left   );
    m_con_active.add(m_btn_p1_right  );
    m_con_active.add(m_btn_p1_drop   );
    m_con_active.add(m_btn_p1_special);

    m_con_active.add(m_btn_p2_up     );
    m_con_active.add(m_btn_p2_down   );
    m_con_active.add(m_btn_p2_left   );
    m_con_active.add(m_btn_p2_right  );
    m_con_active.add(m_btn_p2_drop   );
    m_con_active.add(m_btn_p2_special);

    // signals & slots
    m_btn_p1_up     ->on_clicked.connect(slot(*this, &ConfigureKeys::p1_up_clicked));
    m_btn_p1_down   ->on_clicked.connect(slot(*this, &ConfigureKeys::p1_down_clicked));
    m_btn_p1_left   ->on_clicked.connect(slot(*this, &ConfigureKeys::p1_left_clicked));
    m_btn_p1_right  ->on_clicked.connect(slot(*this, &ConfigureKeys::p1_right_clicked));
    m_btn_p1_drop   ->on_clicked.connect(slot(*this, &ConfigureKeys::p1_drop_clicked));
    m_btn_p1_special->on_clicked.connect(slot(*this, &ConfigureKeys::p1_special_clicked));

    m_btn_p2_up     ->on_clicked.connect(slot(*this, &ConfigureKeys::p2_up_clicked));
    m_btn_p2_down   ->on_clicked.connect(slot(*this, &ConfigureKeys::p2_down_clicked));
    m_btn_p2_left   ->on_clicked.connect(slot(*this, &ConfigureKeys::p2_left_clicked));
    m_btn_p2_right  ->on_clicked.connect(slot(*this, &ConfigureKeys::p2_right_clicked));
    m_btn_p2_drop   ->on_clicked.connect(slot(*this, &ConfigureKeys::p2_drop_clicked));
    m_btn_p2_special->on_clicked.connect(slot(*this, &ConfigureKeys::p2_special_clicked));

    m_con_active.create_tab_order();
    // delete objects when calling m_con_active.clear()!
    m_con_active.set_autodelete(true);
    m_btn_p1_up->set_focus(true);

    m_con_passive.add(m_btn_p1_head   );
    m_con_passive.add(m_btn_p2_head   );
    m_con_passive.create_tab_order();
    m_con_passive.set_autodelete(true);
#endif // DISABLE_LIBSIGC
}