/* * 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); } }
/* * 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); }