/*
 * Create the wid_game_map_client
 */
void wid_game_map_client_wid_create (void)
{
    if (sdl_is_exiting()) {
        return;
    }

    if (wid_game_map_client_window) {
        return;
    }

    wid_notify_flush();

    LOG("Client: Create map");

    {
        fpoint tl = {0.0f, 0.0f};
        fpoint br = {1.0f, 1.0f};

        wid_game_map_client_window = 
                        wid_new_square_window("wid_game_map_client");
        wid_set_movable(wid_game_map_client_window, false);
        wid_set_do_not_raise(wid_game_map_client_window, true);
        wid_set_no_shape(wid_game_map_client_window);

        wid_set_mode(wid_game_map_client_window, WID_MODE_NORMAL);

        wid_set_text_advance(wid_game_map_client_window, 0.9f);
        wid_set_text_scaling(wid_game_map_client_window, 2.0f);
        wid_set_text_pos(wid_game_map_client_window, true, 0.5f, 0.10f);

        wid_set_text_bot(wid_game_map_client_window, true);
        wid_set_text_lhs(wid_game_map_client_window, true);
        wid_set_tl_br_pct(wid_game_map_client_window, tl, br);

        fsize sz = {0.0f, 0.0f};
        wid_set_tex_tl(wid_game_map_client_window, sz);

        fsize sz2 = {1.0f, 1.0f};
        wid_set_tex_br(wid_game_map_client_window, sz2);

        wid_set_on_key_down(wid_game_map_client_window, 
                            wid_game_map_key_event);
        wid_set_on_joy_down(wid_game_map_client_window, 
                            wid_game_map_joy_event);
    }

    {
        fpoint tl = {0.00f, 0.00f};
        fpoint br = {1.00f, 1.00f};

        wid_game_map_client_grid_container =
                        wid_new_container(wid_game_map_client_window,
                                          "wid game client grid container");

        wid_set_no_shape(wid_game_map_client_grid_container);

        wid_set_color(wid_game_map_client_grid_container, WID_COLOR_TL, BLACK);
        wid_set_color(wid_game_map_client_grid_container, WID_COLOR_BG, BLACK);
        wid_set_color(wid_game_map_client_grid_container, WID_COLOR_BR, BLACK);
        wid_set_on_mouse_motion(wid_game_map_client_grid_container,
                                wid_game_map_client_receive_mouse_motion);

        wid_set_tl_br_pct(wid_game_map_client_grid_container, tl, br);
        wid_set_tex(wid_game_map_client_grid_container, 0, 0);

        wid_set_on_key_down(wid_game_map_client_grid_container, 
                            wid_game_map_key_event);

        wid_set_on_joy_down(wid_game_map_client_grid_container, 
                            wid_game_map_joy_event);

        LOG("Client: Created map container window");
    }

    {
        double base_tile_width =
                ((1.0f / ((double)TILES_SCREEN_WIDTH)) *
                    (double)global_config.video_gl_width);

        double base_tile_height =
                ((1.0f / ((double)TILES_SCREEN_HEIGHT)) *
                    (double)global_config.video_gl_height);

        fpoint tl = { 0, 0 };
        fpoint br = { 0, 0 };

        br.x += base_tile_width;
        br.y += base_tile_height;

        client_tile_width = br.x - tl.x;
        client_tile_height = br.y - tl.y;
        client_tile_width = br.x - tl.x;
        client_tile_height = br.y - tl.y;

        if (!client_tile_width) {
            client_tile_width = TILE_WIDTH;
        }

        if (!client_tile_height) {
            client_tile_height = TILE_HEIGHT;
        }

        wid_new_grid(wid_game_map_client_grid_container,
                     MAP_WIDTH,
                     MAP_HEIGHT, client_tile_width, client_tile_height);

        LOG("Client: Created map container window grid");
    }

    /*
     * Mark that we want to learn the starting stats so we can use those
     * when starting again with this player type.
     */
    global_config.starting_stats_inited = false;

    level_pos_t level_pos = global_config.stats.level_pos;

    if (!level_pos.x && !level_pos.y) {
        level_pos.x = (myrand() % LEVEL_INITIAL_RANDOM) + 1;
        level_pos.y = 1;
    }

    client_level = level_new(wid_game_map_client_grid_container, 
                             level_pos, 
                             false /* is_editor */,
                             false /* is_map_editor */,
                             false /* on_server */);

    LOG("Client: Created level %d.%d", level_pos.y, level_pos.x);

    if (!client_level) {
        WARN("failed to load level %u.%u", level_pos.y, level_pos.x);
    }

    wid_game_map_client_vert_scroll =
        wid_new_vert_scroll_bar(wid_game_map_client_window,
                                wid_game_map_client_grid_container);
    wid_game_map_client_horiz_scroll =
        wid_new_horiz_scroll_bar(wid_game_map_client_window,
                                 wid_game_map_client_grid_container);

    wid_visible(wid_get_parent(wid_game_map_client_vert_scroll), 0);
    wid_visible(wid_get_parent(wid_game_map_client_horiz_scroll), 0);
    wid_visible(wid_game_map_client_vert_scroll, 0);
    wid_visible(wid_game_map_client_horiz_scroll, 0);

    wid_update(wid_game_map_client_vert_scroll);
    wid_update(wid_game_map_client_horiz_scroll);

    wid_game_map_client_score_update(client_level, true /* redo */);

    wid_hide(wid_game_map_client_window, 0);

    if (global_config.server_current_players > 1) {
        wid_visible(wid_chat_window, 0);
    }
}
Example #2
0
/*
 * Create the wid_text_input
 */
widp wid_text_input (const char *title, double x, double y, int32_t args, ...)
{
    widp wid_text_input_container;
    widp wid_text_input_title;
    widp wid_text_input_window;
    widp wid_text_input_textbox;
    double title_h;
    uint32_t toth = 0;
    uint32_t maxbuttonw = 0;
    uint32_t maxbuttonh = 0;
    uint32_t button_y;
    va_list ap;
    const char *button_names[args];
    double maxw;
    double maxh;

    wid_text_input_callback button_callback[args];
    memset(button_callback, 0, sizeof(button_callback));

    {
        double w;
        fontp font = large_font;

        ttf_text_size(&font,
                      "TITLE", &w, &title_h, 0, 1.0f, 1.0f,
                      false /* fixed width */);

        toth += title_h;
    }

    {
        fontp font = small_font;

        ttf_text_size(&font,
                      "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                      &maxw, &maxh, 0, 1.0f, 1.0f,
                      false /* fixed width */);
    }

    maxw = min(maxw, (uint32_t) ((game.video_gl_width * 3) / 4));

    {
        int32_t n = args;

        while (n--) {
            button_names[n] = 0;
        }
    }

    {
        va_start(ap, args);

        int32_t n = args;

        while (n--) {
            button_names[args - n - 1] = va_arg(ap, const char*);
            button_callback[args - n - 1] = va_arg(ap, wid_text_input_callback);
        }

        va_end(ap);
    }

    {
        int32_t n = args;

        while (n--) {
            double w;
            double h;
            fontp font = med_font;

            const char *button_name = button_names[n];

            if (!button_name){
                button_name = "<bug>";
            }

            ttf_text_size(&font, button_name, &w, &h, 0, 1.0f, 1.0f,
                          false /* fixed width */);

            w += BUTTON_PAD_X;

            maxbuttonw = max(w, maxbuttonw);
            maxbuttonh = max(h, maxbuttonh);
        }
    }

    {
        wid_text_input_window = wid_new_rounded_window("wid_text_input");

        wid_set_color(wid_text_input_window, WID_COLOR_TEXT, WHITE);

        color c = STEELBLUE2;
        c.a = 200;
        wid_set_color(wid_text_input_window, WID_COLOR_BG, c);

        c = STEELBLUE;
        c.a = 150;
        wid_set_color(wid_text_input_window, WID_COLOR_TL, c);
        wid_set_color(wid_text_input_window, WID_COLOR_BR, c);
        wid_set_bevel(wid_text_input_window, 4);

        fpoint tl = {0, 0};
        fpoint br = {0, 0};

        br.x += maxw;
        br.y += toth;

        br.x += PAD_X;
        br.y += PAD_Y;

        /*
         * Space for input box.
         */
        br.y += maxbuttonh;

        button_y = br.y;
        br.y += maxbuttonh;

        wid_set_tl_br(wid_text_input_window, tl, br);
    }

    if (title) {
        fpoint tl = {0, 0};
        fpoint br = {0, 0};

        br.x += maxw + PAD_X;
        br.y += title_h;

        tl.y += BUTTON_PAD_Y/2;
        br.y += BUTTON_PAD_Y/2;

        wid_text_input_title = wid_new_container(wid_text_input_window,
                                              "wid text_input container1");
        wid_set_tl_br(wid_text_input_title, tl, br);

        wid_set_font(wid_text_input_title, large_font);
        wid_set_text(wid_text_input_title, title);
    }

    {
        fpoint tl = {0, 0};
        fpoint br = {0, 0};

        br.x = maxw;
        br.y += toth;

        tl.x += PAD_X/2;
        br.x += PAD_X/2;

        if (title) {
            /*
             * Add space for title.
             */
            tl.y += title_h;
            br.y += title_h;
        }

        wid_text_input_container =
                        wid_new_container(wid_text_input_window,
                                          wid_text_input_filelist_container_str);
        wid_set_tl_br(wid_text_input_container, tl, br);
    }

    {
        widp child;

        fpoint tl = {0.0f, 0.0f};
        fpoint br = {0.0f, 0.0f};

        tl.x = PAD_X / 2;
        tl.y = button_y - maxbuttonh - PAD_Y / 2;
        br.x = maxw + PAD_X / 2;
        br.y = tl.y + maxbuttonh;

        child = wid_new_square_button(wid_text_input_window,
                                      wid_text_input_filename_input_str);

        wid_set_color(child, WID_COLOR_BG, BLACK);
        wid_set_color(child, WID_COLOR_TL, WHITE);
        wid_set_color(child, WID_COLOR_BR, WHITE);

        color c;
        c = GREEN;

        wid_set_mode(child, WID_MODE_NORMAL);
        c.a = 100;
        wid_set_color(child, WID_COLOR_BG, c);

        wid_set_mode(child, WID_MODE_OVER);
        c.a = 50;
        wid_set_color(child, WID_COLOR_BG, c);

        wid_set_mode(child, WID_MODE_ACTIVE);
        c.a = 60;
        wid_set_color(child, WID_COLOR_BG, c);

        wid_set_mode(child, WID_MODE_NORMAL);

        wid_set_tl_br(child, tl, br);
        wid_set_text_lhs(child, true);
        wid_set_font(child, small_font);
        wid_set_text_outline(child, true);

        wid_set_on_key_down(child, wid_text_input_receive_input);
        wid_set_show_cursor(child, true);
        wid_set_focusable(child, args + 2);

        wid_text_input_textbox = child;
    }

    {
        int32_t x = 0;
        int32_t n = args;
        int32_t focus_order = args + 1;

        x += maxw;
        x += PAD_X/2;

        while (n--) {
            double w;
            double h;
            fontp font = med_font;

            const char *button_name = button_names[n];
            ttf_text_size(&font, button_name, &w, &h, 0, 1.0f, 1.0f,
                          false /* fixed width */);

            widp child;
            child = wid_new_rounded_small_button(wid_text_input_window,
                                                 button_name);

            fpoint tl;
            fpoint br;

            tl.y = button_y;
            br.y = tl.y + maxbuttonh;
            br.x = x;
            tl.x = br.x - maxbuttonw;

            x = tl.x;
            x -= BUTTON_PAD_X;

            tl.y -= BUTTON_PAD_Y/2;
            br.y -= BUTTON_PAD_Y/2;

            wid_set_tl_br(child, tl, br);
            wid_set_text(child, button_name);
            wid_set_font(child, font);

            color c;
            if (focus_order == 1) {
                c = DARKGREEN;
                wid_set_tex(child, 0, "button_black");
            } else if (focus_order == 2) {
                c = STEELBLUE2;
                wid_set_tex(child, 0, "button_black");
            } else if (focus_order == 3) {
                c = STEELBLUE;
                wid_set_tex(child, 0, "button_black");
            } else {
                wid_set_tex(child, 0, "button_black");
                c = GRAY;
            }

            wid_set_square(child);

            c = WHITE;
            c.a = 200;
            wid_set_mode(child, WID_MODE_NORMAL);
            wid_set_color(child, WID_COLOR_BG, c);

            c.a = 255;
            wid_set_mode(child, WID_MODE_OVER);
            wid_set_color(child, WID_COLOR_BG, c);

            wid_set_mode(child, WID_MODE_FOCUS);

            wid_set_mode(child, WID_MODE_NORMAL);
            wid_set_focusable(child, focus_order--);

            wid_set_on_mouse_down(child, wid_text_input_button_event);

            wid_set_context(child, (void*)button_callback[n]);
        }
    }

    wid_fade_in(wid_text_input_window, wid_fade_delay);
    wid_move_to_pct_centered(wid_text_input_window, x, y);
    wid_raise(wid_text_input_window);
    wid_focus_lock(wid_text_input_window);

    wid_update(wid_text_input_window);

    wid_set_square(wid_text_input_window);

    wid_move_to_pct_centered(wid_text_input_window, 0.5, 0.5 - 1.0);
    wid_move_to_pct_centered_in(wid_text_input_window, 0.5, 0.5, 200);

    return (wid_text_input_textbox);
}