diff --git a/src/building/menu.c b/src/building/menu.c index f27622a388..0b1ce4c1d4 100644 --- a/src/building/menu.c +++ b/src/building/menu.c @@ -12,28 +12,31 @@ static const building_type MENU_BUILDING_TYPE[BUILD_MENU_MAX][BUILD_MENU_ITEM_MA {BUILDING_HOUSE_VACANT_LOT, 0}, {BUILDING_CLEAR_LAND, 0}, {BUILDING_ROAD, 0}, - {BUILDING_WELL, BUILDING_FOUNTAIN, BUILDING_DRAGGABLE_RESERVOIR, BUILDING_AQUEDUCT, 0}, + + {BUILDING_WELL, 0, BUILDING_DRAGGABLE_RESERVOIR, BUILDING_AQUEDUCT, BUILDING_FOUNTAIN, 0}, {BUILDING_BATHHOUSE, BUILDING_BARBER, BUILDING_DOCTOR, BUILDING_HOSPITAL, 0}, - {BUILDING_MENU_SMALL_TEMPLES, BUILDING_MENU_LARGE_TEMPLES, BUILDING_ORACLE, 0}, - {BUILDING_SCHOOL, BUILDING_ACADEMY, BUILDING_LIBRARY, BUILDING_MISSION_POST, 0}, - {BUILDING_THEATER, BUILDING_AMPHITHEATER, BUILDING_COLOSSEUM, BUILDING_HIPPODROME, - BUILDING_ACTOR_COLONY, BUILDING_GLADIATOR_SCHOOL, BUILDING_LION_HOUSE, BUILDING_CHARIOT_MAKER, 0}, - {BUILDING_FORUM, BUILDING_SENATE, - BUILDING_GOVERNORS_HOUSE, BUILDING_GOVERNORS_VILLA, BUILDING_GOVERNORS_PALACE, - BUILDING_SMALL_STATUE, BUILDING_MEDIUM_STATUE, BUILDING_LARGE_STATUE, BUILDING_TRIUMPHAL_ARCH, 0}, - {BUILDING_ENGINEERS_POST, BUILDING_GARDENS, BUILDING_PLAZA, BUILDING_LOW_BRIDGE, BUILDING_SHIP_BRIDGE, 0}, - {BUILDING_PREFECTURE, BUILDING_WALL, BUILDING_TOWER, BUILDING_GATEHOUSE, + {BUILDING_MENU_SMALL_TEMPLES, BUILDING_MENU_LARGE_TEMPLES, 0, BUILDING_ORACLE, 0}, + {BUILDING_SCHOOL, BUILDING_ACADEMY, BUILDING_LIBRARY, 0, BUILDING_MISSION_POST, 0}, + {BUILDING_THEATER, BUILDING_AMPHITHEATER, BUILDING_COLOSSEUM, 0, + BUILDING_ACTOR_COLONY, BUILDING_GLADIATOR_SCHOOL, BUILDING_LION_HOUSE, 0, + BUILDING_HIPPODROME, BUILDING_CHARIOT_MAKER, 0}, + {BUILDING_FORUM, BUILDING_SENATE, 0, + BUILDING_GOVERNORS_HOUSE, BUILDING_GOVERNORS_VILLA, BUILDING_GOVERNORS_PALACE, 0, + BUILDING_SMALL_STATUE, BUILDING_MEDIUM_STATUE, BUILDING_LARGE_STATUE, 0, + BUILDING_TRIUMPHAL_ARCH, 0}, + {BUILDING_ENGINEERS_POST, 0, BUILDING_GARDENS, BUILDING_PLAZA, 0, BUILDING_LOW_BRIDGE, BUILDING_SHIP_BRIDGE, 0}, + {BUILDING_PREFECTURE, 0, BUILDING_WALL, BUILDING_TOWER, BUILDING_GATEHOUSE, 0, BUILDING_FORT, BUILDING_MILITARY_ACADEMY, BUILDING_BARRACKS, 0}, - {BUILDING_WHARF, BUILDING_MENU_FARMS, BUILDING_MENU_RAW_MATERIALS, BUILDING_MENU_WORKSHOPS, + {BUILDING_WHARF, BUILDING_MENU_FARMS, BUILDING_MENU_RAW_MATERIALS, BUILDING_MENU_WORKSHOPS, 0, BUILDING_MARKET, BUILDING_GRANARY, BUILDING_WAREHOUSE, BUILDING_DOCK, 0}, {BUILDING_WHEAT_FARM, BUILDING_VEGETABLE_FARM, BUILDING_FRUIT_FARM, BUILDING_PIG_FARM, BUILDING_OLIVE_FARM, BUILDING_VINES_FARM, 0}, {BUILDING_CLAY_PIT, BUILDING_TIMBER_YARD, BUILDING_MARBLE_QUARRY, BUILDING_IRON_MINE, 0}, {BUILDING_POTTERY_WORKSHOP, BUILDING_FURNITURE_WORKSHOP, BUILDING_OIL_WORKSHOP, BUILDING_WINE_WORKSHOP, BUILDING_WEAPONS_WORKSHOP, 0}, - {BUILDING_MENU_SMALL_TEMPLES, BUILDING_SMALL_TEMPLE_CERES, BUILDING_SMALL_TEMPLE_NEPTUNE, + {BUILDING_MENU_SMALL_TEMPLES, 0, BUILDING_SMALL_TEMPLE_CERES, BUILDING_SMALL_TEMPLE_NEPTUNE, BUILDING_SMALL_TEMPLE_MERCURY, BUILDING_SMALL_TEMPLE_MARS, BUILDING_SMALL_TEMPLE_VENUS, 0}, - {BUILDING_MENU_LARGE_TEMPLES, BUILDING_LARGE_TEMPLE_CERES, BUILDING_LARGE_TEMPLE_NEPTUNE, + {BUILDING_MENU_LARGE_TEMPLES, 0, BUILDING_LARGE_TEMPLE_CERES, BUILDING_LARGE_TEMPLE_NEPTUNE, BUILDING_LARGE_TEMPLE_MERCURY, BUILDING_LARGE_TEMPLE_MARS, BUILDING_LARGE_TEMPLE_VENUS, 0}, {BUILDING_FORT_LEGIONARIES, BUILDING_FORT_JAVELIN, BUILDING_FORT_MOUNTED, 0}, {BUILDING_WHARF, BUILDING_SHIPYARD, 0}, @@ -272,7 +275,7 @@ int building_menu_next_index(int submenu, int current_index) { for (int i = current_index + 1; i < BUILD_MENU_ITEM_MAX; i++) { if (MENU_BUILDING_TYPE[submenu][i] <= 0) { - return 0; + continue; } if (menu_enabled[submenu][i]) { return i; @@ -281,6 +284,19 @@ int building_menu_next_index(int submenu, int current_index) return 0; } +int building_menu_is_new_category(int submenu, int current_index) +{ + for (int i = current_index - 1; i >= 0; i--) { + if (MENU_BUILDING_TYPE[submenu][i] <= 0) { + return 1; + } + if (menu_enabled[submenu][i]) { + return 0; + } + } + return 0; +} + building_type building_menu_type(int submenu, int item) { return MENU_BUILDING_TYPE[submenu][item]; diff --git a/src/building/menu.h b/src/building/menu.h index 13a8c5f1a3..3434715887 100644 --- a/src/building/menu.h +++ b/src/building/menu.h @@ -34,6 +34,8 @@ int building_menu_count_items(int submenu); int building_menu_next_index(int submenu, int current_index); +int building_menu_is_new_category(int submenu, int current_index); + building_type building_menu_type(int submenu, int item); build_menu_group building_menu_for_type(building_type type); diff --git a/src/graphics/color.h b/src/graphics/color.h index 8a55801209..90d8e9e0d1 100644 --- a/src/graphics/color.h +++ b/src/graphics/color.h @@ -13,6 +13,9 @@ typedef uint32_t color_t; #define COLOR_TOOLTIP 0x424242 #define COLOR_SIDEBAR 0xbdb592 +#define COLOR_MENU_SEPARATOR 0xdfdfdf +#define COLOR_MENU_SEPARATOR_DESERT 0xffffff + #define COLOR_FONT_RED COLOR_RED #define COLOR_FONT_BLUE 0x0055ff #define COLOR_FONT_YELLOW 0xe7e75a diff --git a/src/window/build_menu.c b/src/window/build_menu.c index cef38871d8..54b5addd42 100644 --- a/src/window/build_menu.c +++ b/src/window/build_menu.c @@ -5,6 +5,7 @@ #include "building/model.h" #include "city/view.h" #include "graphics/generic_button.h" +#include "graphics/graphics.h" #include "graphics/image.h" #include "graphics/lang_text.h" #include "graphics/panel.h" @@ -22,6 +23,7 @@ #define MENU_ITEM_HEIGHT 24 #define MENU_ITEM_WIDTH 176 #define MENU_CLICK_MARGIN 20 +#define MENU_SEPARATOR_HEIGHT 10 #define SUBMENU_NONE -1 @@ -175,24 +177,33 @@ static int is_fishing_button(building_type type) static void draw_menu_buttons(void) { int x_offset = get_sidebar_x_offset(); + int y_offset = 0; int item_index = -1; int item_x_align = x_offset - MENU_X_OFFSET; + int category = 0; for (int i = 0; i < data.num_items; i++) { item_index = building_menu_next_index(data.selected_submenu, item_index); - label_draw(item_x_align, data.y_offset + MENU_Y_OFFSET + MENU_ITEM_HEIGHT * i, 16, - data.focus_button_id == i + 1 ? 1 : 2); + y_offset = data.y_offset + MENU_Y_OFFSET + MENU_ITEM_HEIGHT * i + MENU_SEPARATOR_HEIGHT * category; + if (i > 0 && building_menu_is_new_category(data.selected_submenu, item_index)) { + color_t separator_color = (scenario_property_climate() == CLIMATE_DESERT) + ? COLOR_MENU_SEPARATOR_DESERT + : COLOR_MENU_SEPARATOR; + graphics_draw_horizontal_line(item_x_align + 16, item_x_align + build_menu_buttons[i].width - 16, + y_offset + 2, separator_color); + category++; + y_offset += MENU_SEPARATOR_HEIGHT; + } + build_menu_buttons[i].y = MENU_ITEM_HEIGHT * i + MENU_SEPARATOR_HEIGHT * category; + label_draw(item_x_align, y_offset, 16, data.focus_button_id == i + 1 ? 1 : 2); int type = building_menu_type(data.selected_submenu, item_index); if (is_all_button(type)) { - text_draw_centered(translation_for(TR_BUILD_ALL_TEMPLES), - item_x_align, data.y_offset + MENU_Y_OFFSET + 4 + MENU_ITEM_HEIGHT * i, + text_draw_centered(translation_for(TR_BUILD_ALL_TEMPLES), item_x_align, y_offset + 4, MENU_ITEM_WIDTH, FONT_NORMAL_GREEN, 0); } else if (is_fishing_button(type)) { - text_draw_centered(translation_for(TR_BUILD_MENU_FISHING), - item_x_align, data.y_offset + MENU_Y_OFFSET + 4 + MENU_ITEM_HEIGHT * i, + text_draw_centered(translation_for(TR_BUILD_MENU_FISHING), item_x_align, y_offset + 4, MENU_ITEM_WIDTH, FONT_NORMAL_GREEN, 0); } else { - lang_text_draw_centered(28, type, item_x_align, data.y_offset + MENU_Y_OFFSET + 4 + MENU_ITEM_HEIGHT * i, - MENU_ITEM_WIDTH, FONT_NORMAL_GREEN); + lang_text_draw_centered(28, type, item_x_align, y_offset + 4, MENU_ITEM_WIDTH, FONT_NORMAL_GREEN); } if (type == BUILDING_DRAGGABLE_RESERVOIR) { type = BUILDING_RESERVOIR; @@ -211,8 +222,7 @@ static void draw_menu_buttons(void) cost = model_get_building(BUILDING_LARGE_TEMPLE_CERES)->cost; } if (cost) { - text_draw_money(cost, x_offset - 82, data.y_offset + MENU_Y_OFFSET + 4 + MENU_ITEM_HEIGHT * i, - FONT_NORMAL_GREEN); + text_draw_money(cost, x_offset - 82, y_offset + 4, FONT_NORMAL_GREEN); } } } @@ -229,7 +239,8 @@ static int click_outside_menu(const mouse *m, int x_offset) (m->x < x_offset - MENU_X_OFFSET - MENU_CLICK_MARGIN || m->x > x_offset + MENU_CLICK_MARGIN || m->y < data.y_offset + MENU_Y_OFFSET - MENU_CLICK_MARGIN || - m->y > data.y_offset + MENU_Y_OFFSET + MENU_CLICK_MARGIN + MENU_ITEM_HEIGHT * data.num_items); + m->y > data.y_offset + MENU_Y_OFFSET + MENU_CLICK_MARGIN + + build_menu_buttons[data.num_items - 1].y + MENU_ITEM_HEIGHT); } static int handle_build_submenu(const mouse *m)