diff --git a/CMakeLists.txt b/CMakeLists.txt index 485b5e940f..18abeeb6ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -618,6 +618,7 @@ set(WINDOW_FILES ${PROJECT_SOURCE_DIR}/src/window/editor/start_year.c ${PROJECT_SOURCE_DIR}/src/window/editor/starting_conditions.c ${PROJECT_SOURCE_DIR}/src/window/editor/win_criteria.c + ${PROJECT_SOURCE_DIR}/src/window/epithets.c ${PROJECT_SOURCE_DIR}/src/window/cck_selection.c ${PROJECT_SOURCE_DIR}/src/window/city.c ${PROJECT_SOURCE_DIR}/src/window/config.c diff --git a/res/assets/Graphics/ui.xml b/res/assets/Graphics/ui.xml index 97bbf4099d..5302bc8543 100644 --- a/res/assets/Graphics/ui.xml +++ b/res/assets/Graphics/ui.xml @@ -45,6 +45,7 @@ + diff --git a/src/graphics/color.h b/src/graphics/color.h index 478594e9cb..b63cf981bb 100644 --- a/src/graphics/color.h +++ b/src/graphics/color.h @@ -17,7 +17,9 @@ typedef uint32_t color_t; #define COLOR_SIDEBAR 0xffbdb592 #define COLOR_BORDER_GREEN 0xfffae094 +#define COLOR_BORDER_ORANGE 0xffffb584 #define COLOR_BORDER_RED 0xffac5446 +#define COLOR_BORDER_BROWN 0xff684a34 #define COLOR_FONT_RED COLOR_RED #define COLOR_FONT_BLUE 0xff0055ff diff --git a/src/graphics/window.h b/src/graphics/window.h index db6872dcf6..7f8b87407b 100644 --- a/src/graphics/window.h +++ b/src/graphics/window.h @@ -47,6 +47,7 @@ typedef enum { WINDOW_TRADE_PRICES, WINDOW_RESOURCE_SETTINGS, WINDOW_HOLD_FESTIVAL, + WINDOW_EPITHETS, // empire and dialog WINDOW_EMPIRE, WINDOW_TRADE_OPENED, diff --git a/src/translation/english.c b/src/translation/english.c index 22e7d8fc21..9be50b9bd2 100644 --- a/src/translation/english.c +++ b/src/translation/english.c @@ -1416,6 +1416,14 @@ static translation_string all_strings[] = { {TR_EDITOR_CAESAR_SALARY, "Caesar's salary"}, {TR_CITY_MESSAGE_TEXT_CARAVANSERAI_COMPLETE, "The caravanserai is completed. New commercial horizons are emerging. Caravans from all over the world are eager to come and trade in your city."}, {TR_CONFIG_SHOW_DESIRABILITY_RANGE, "Show desirability when building mausoleums and nymphaeums"}, + {TR_WINDOW_ADVISOR_EPITHETS, "Gods Epithets"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP, "What the gods can grant you"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_CERES, "Ceres gifts"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_NEPTUNE, "Neptune gifts"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_MERCURY, "Mercury gifts"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_MARS, "Mars gifts"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_VENUS, "Venus gifts"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_JUPITER, "Jupiter gifts"}, }; void translation_english(const translation_string **strings, int *num_strings) diff --git a/src/translation/french.c b/src/translation/french.c index 719c368f41..c557e4cfe2 100644 --- a/src/translation/french.c +++ b/src/translation/french.c @@ -1402,13 +1402,21 @@ static translation_string all_strings[] = { {TR_WINDOW_CAMPAIGN_NO_DESC, "Pas de description"}, {TR_WINDOW_ORIGINAL_CAMPAIGN_NAME, "Campagne d'origine" }, {TR_WINDOW_ORIGINAL_CAMPAIGN_DESC, "Campagne originelle de Caesar III, dans toute sa gloire d'antan et ses 25 ans d'âge."}, - {TR_WINDOW_INVALID_CAMPAIGN_TITLE, "Fichier de campagne invalide" }, + {TR_WINDOW_INVALID_CAMPAIGN_TITLE, "Fichier de campagne invalide" }, {TR_WINDOW_INVALID_CAMPAIGN_TEXT, "Le fichier de campagne est invalide.\nVeuillez consulter augustus-log.txt dans votre répertoire Augustus pour plus de détails."}, {TR_WINDOW_CAMPAIGN_MISSION_FAILED_TO_LOAD_TITLE, "Impossible d'ouvrir la mission"}, {TR_WINDOW_CAMPAIGN_MISSION_FAILED_TO_LOAD_TEXT, "La mission choisie ne peut être ouverte.\nVeuillez consulter augustus-log.txt dans votre répertoire Augustus pour plus de détails."}, {TR_EDITOR_CAESAR_SALARY, "Salaire de Caesar"}, {TR_CITY_MESSAGE_TEXT_CARAVANSERAI_COMPLETE, "Le caravanserail est achevé. De nouveaux horizons commerciaux se profilent. Les caravanes des quatre coins du monde sont enthousiastes à l'idée de venir commercer dans votre cité."}, {TR_CONFIG_SHOW_DESIRABILITY_RANGE , "Voir l'attrait des mausolées et des nymphées lors du placement"}, + {TR_WINDOW_ADVISOR_EPITHETS, "Epithètes des dieux"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP, "Ce que les dieux peuvent vous accorder"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_CERES, "Dons de Ceres"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_NEPTUNE, "Dons de Neptune"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_MERCURY, "Dons de Mercury"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_MARS, "Dons de Mars"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_VENUS, "Dons de Venus"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_JUPITER, "Dons de Jupiter"}, }; void translation_french(const translation_string **strings, int *num_strings) diff --git a/src/translation/translation.h b/src/translation/translation.h index ce1e3f723a..fefe0ff78e 100644 --- a/src/translation/translation.h +++ b/src/translation/translation.h @@ -1376,7 +1376,7 @@ typedef enum { TR_BUILDING_OVERGROWN_GARDENS, TR_WINDOW_ADVISOR_RELIGION_ALTARS_HEADER, TR_REPLAY_MAP_NOT_FOUND_TITLE, - TR_REPLAY_MAP_NOT_FOUND_MESSAGE, + TR_REPLAY_MAP_NOT_FOUND_MESSAGE, TR_BUILDING_FORT_AUXILIA_INFANTRY, TR_WINDOW_ADVISOR_MILITARY_INFANTRY, TR_TOOLTIP_BUTTON_ROADBLOCK_ORDER_ACCEPT_ALL, @@ -1410,6 +1410,14 @@ typedef enum { TR_EDITOR_CAESAR_SALARY, TR_CITY_MESSAGE_TEXT_CARAVANSERAI_COMPLETE, TR_CONFIG_SHOW_DESIRABILITY_RANGE, + TR_WINDOW_ADVISOR_EPITHETS, + TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP, + TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_CERES, + TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_NEPTUNE, + TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_MERCURY, + TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_MARS, + TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_VENUS, + TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_JUPITER, TRANSLATION_MAX_KEY } translation_key; diff --git a/src/window/advisor/military.c b/src/window/advisor/military.c index d240e07749..1be2279926 100644 --- a/src/window/advisor/military.c +++ b/src/window/advisor/military.c @@ -30,7 +30,7 @@ static void button_empire_service(int legion_id, int param2); static void button_return_all_to_fort(int param1, int param2); static void on_scroll(void); -static scrollbar_type scrollbar = { 592, 70, 272, 576, MAX_VISIBLE_LEGIONS, on_scroll }; +static scrollbar_type scrollbar = { 592, 70, 270, 576, MAX_VISIBLE_LEGIONS, on_scroll, 0, 4}; static generic_button fort_buttons[] = { {384, 83, 30, 30, button_go_to_legion, button_none, 1, 0}, diff --git a/src/window/advisor/religion.c b/src/window/advisor/religion.c index 1e31fa10d1..e32430df0b 100644 --- a/src/window/advisor/religion.c +++ b/src/window/advisor/religion.c @@ -12,11 +12,14 @@ #include "graphics/panel.h" #include "graphics/text.h" #include "window/hold_festival.h" +#include "window/epithets.h" static void button_hold_festival(int param1, int param2); +static void button_epithets(int param1, int param2); static generic_button hold_festival_button[] = { {102, 340, 300, 20, button_hold_festival, button_none, 0, 0}, + {590, 20, 32, 24, button_epithets, button_none, 0, 1} }; static int focus_button_id; @@ -170,11 +173,15 @@ static void draw_foreground(void) if (!city_festival_is_planned()) { button_border_draw(102, 335, 300, 20, focus_button_id == 1); } + + button_border_draw(590, 20, 32, 24, focus_button_id == 2); + + image_draw(982, 594, 24, COLOR_MASK_NONE, SCALE_NONE); } static int handle_mouse(const mouse *m) { - return generic_buttons_handle_mouse(m, 0, 0, hold_festival_button, 1, &focus_button_id); + return generic_buttons_handle_mouse(m, 0, 0, hold_festival_button, 2, &focus_button_id); } static void button_hold_festival(int param1, int param2) @@ -184,10 +191,17 @@ static void button_hold_festival(int param1, int param2) } } +static void button_epithets(int param1, int param2) +{ + window_epithets_show(); +} + static void get_tooltip_text(advisor_tooltip_result *r) { - if (focus_button_id) { + if (focus_button_id == 1) { r->text_id = 112; + } else if (focus_button_id == 2) { + r->translation_key = TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP; } } diff --git a/src/window/advisor/trade.c b/src/window/advisor/trade.c index 938b4b4b36..3df36a62a1 100644 --- a/src/window/advisor/trade.c +++ b/src/window/advisor/trade.c @@ -194,10 +194,6 @@ static int draw_background(void) button_border_draw(160, 392, 200, 24, data.focus_button_id == 2); lang_text_draw_centered(54, 30, 160, 398, 200, FONT_NORMAL_BLACK); - if (data.list.size > MAX_VISIBLE_ROWS) { - inner_panel_draw(scrollbar.x + 4, scrollbar.y + 28, 2, scrollbar.height / BLOCK_SIZE - 3); - } - int land_policy_available = building_monument_working(BUILDING_CARAVANSERAI); int sea_policy_available = building_monument_working(BUILDING_LIGHTHOUSE); diff --git a/src/window/building/culture.c b/src/window/building/culture.c index 1990caad5a..20c4f17f01 100644 --- a/src/window/building/culture.c +++ b/src/window/building/culture.c @@ -947,18 +947,18 @@ void window_building_draw_colosseum_background(building_info_context *c) window_building_draw_employment(c, 138); window_building_draw_risks(c, c->x_offset + c->width_blocks * BLOCK_SIZE - 76, c->y_offset + 144); if (b->data.entertainment.days1 > 0) { - int width = lang_text_draw(74, 8, c->x_offset + 32, c->y_offset + 182, FONT_NORMAL_BROWN); + int width = lang_text_draw(74, 8, c->x_offset + 32, c->y_offset + 188, FONT_NORMAL_BROWN); lang_text_draw_amount(8, 44, 2 * b->data.entertainment.days1, - c->x_offset + width + 32, c->y_offset + 182, FONT_NORMAL_BROWN); + c->x_offset + width + 32, c->y_offset + 188, FONT_NORMAL_BROWN); } else { - lang_text_draw(74, 7, c->x_offset + 32, c->y_offset + 182, FONT_NORMAL_BROWN); + lang_text_draw(74, 7, c->x_offset + 32, c->y_offset + 188, FONT_NORMAL_BROWN); } if (b->data.entertainment.days2 > 0) { - int width = lang_text_draw(74, 10, c->x_offset + 32, c->y_offset + 202, FONT_NORMAL_BROWN); + int width = lang_text_draw(74, 10, c->x_offset + 32, c->y_offset + 208, FONT_NORMAL_BROWN); lang_text_draw_amount(8, 44, 2 * b->data.entertainment.days2, - c->x_offset + width + 32, c->y_offset + 202, FONT_NORMAL_BROWN); + c->x_offset + width + 32, c->y_offset + 208, FONT_NORMAL_BROWN); } else { - lang_text_draw(74, 9, c->x_offset + 32, c->y_offset + 202, FONT_NORMAL_BROWN); + lang_text_draw(74, 9, c->x_offset + 32, c->y_offset + 208, FONT_NORMAL_BROWN); } if (b->type == BUILDING_ARENA) { diff --git a/src/window/epithets.c b/src/window/epithets.c new file mode 100644 index 0000000000..85352ce479 --- /dev/null +++ b/src/window/epithets.c @@ -0,0 +1,254 @@ +#include "epithets.h" + +#include "assets/assets.h" +#include "city/constants.h" +#include "city/gods.h" +#include "core/image_group.h" +#include "graphics/color.h" +#include "graphics/generic_button.h" +#include "graphics/graphics.h" +#include "graphics/image.h" +#include "graphics/image_button.h" +#include "graphics/lang_text.h" +#include "graphics/panel.h" +#include "graphics/text.h" +#include "graphics/window.h" +#include "input/input.h" +#include "window/advisors.h" +#include "window/message_dialog.h" +#include "window/option_popup.h" + +static void button_god(int god, int param2); +static void button_close(int param1, int param2); + + +static struct { + option_menu_item option; + const char image_id[32]; +} epithets_options[18] = { + { + { TR_BUILDING_GRAND_TEMPLE_CERES_DESC, TR_BUILDING_GRAND_TEMPLE_CERES_BONUS_DESC }, + "Ceres M Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_CERES_DESC_MODULE_1, TR_BUILDING_GRAND_TEMPLE_CERES_MODULE_1_DESC }, + "Ceres M Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_CERES_DESC_MODULE_2, TR_BUILDING_GRAND_TEMPLE_CERES_MODULE_2_DESC }, + "Ceres M2 Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_NEPTUNE_DESC, TR_BUILDING_GRAND_TEMPLE_NEPTUNE_BONUS_DESC }, + "Nept M2 Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_NEPTUNE_DESC_MODULE_1, TR_BUILDING_GRAND_TEMPLE_NEPTUNE_MODULE_1_DESC }, + "Nept M2 Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_NEPTUNE_DESC_MODULE_2, TR_BUILDING_GRAND_TEMPLE_NEPTUNE_MODULE_2_DESC }, + "Nept M Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_MERCURY_DESC, TR_BUILDING_GRAND_TEMPLE_MERCURY_BONUS_DESC }, + "Merc M Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_MERCURY_DESC_MODULE_1, TR_BUILDING_GRAND_TEMPLE_MERCURY_MODULE_1_DESC }, + "Merc M Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_MERCURY_DESC_MODULE_2, TR_BUILDING_GRAND_TEMPLE_MERCURY_MODULE_2_DESC }, + "Merc M2 Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_MARS_DESC, TR_BUILDING_GRAND_TEMPLE_MARS_BONUS_DESC }, + "Mars M2 Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_MARS_DESC_MODULE_1, TR_BUILDING_GRAND_TEMPLE_MARS_MODULE_1_DESC }, + "Mars M2 Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_MARS_DESC_MODULE_2, TR_BUILDING_GRAND_TEMPLE_MARS_MODULE_2_DESC }, + "Mars M Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_VENUS_DESC, TR_BUILDING_GRAND_TEMPLE_VENUS_BONUS_DESC }, + "Venus M Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_VENUS_DESC_MODULE_1, TR_BUILDING_GRAND_TEMPLE_VENUS_MODULE_1_DESC }, + "Venus M Icon" + }, + { + { TR_BUILDING_GRAND_TEMPLE_VENUS_DESC_MODULE_2, TR_BUILDING_GRAND_TEMPLE_VENUS_MODULE_2_DESC }, + "Venus M2 Icon" + }, + { + { TR_BUILDING_PANTHEON_DESC, TR_BUILDING_PANTHEON_BONUS_DESC }, + "Panth M Icon" + }, + { + { TR_BUILDING_PANTHEON_DESC_MODULE_1, TR_BUILDING_PANTHEON_MODULE_1_DESC }, + "Panth M Icon" + }, + { + { TR_BUILDING_PANTHEON_DESC_MODULE_2, TR_BUILDING_PANTHEON_MODULE_2_DESC }, + "Panth M2 Icon" + } +}; + +static int selected_god_id; + +static image_button image_buttons_bottom[] = { + {605, 394, 24, 24, IB_NORMAL, GROUP_CONTEXT_ICONS, 4, button_close, button_none, 0, 0, 1} +}; + +static generic_button buttons_gods_size[] = { + {30, 56, 80, 90, button_god, button_none, 0, 0}, + {130, 56, 80, 90, button_god, button_none, 1, 0}, + {230, 56, 80, 90, button_god, button_none, 2, 0}, + {330, 56, 80, 90, button_god, button_none, 3, 0}, + {430, 56, 80, 90, button_god, button_none, 4, 0}, + {530, 56, 80, 90, button_god, button_none, 5, 0}, + {630, 56, 80, 90, button_god, button_none, 6, 0} +}; + +static int focus_button_id; +static int focus_image_button_id; + +static void init(void) +{ + selected_god_id = 0; +} + +static void draw_background(void) +{ + window_advisors_draw_dialog_background(); + + graphics_in_dialog(); + + outer_panel_draw(0, 0, 40, 27); + + lang_text_draw_centered(CUSTOM_TRANSLATION, TR_WINDOW_ADVISOR_EPITHETS, 0, 15, 640, FONT_LARGE_BLACK); + int border_image_id = assets_get_image_id("UI", "Image Border Small"); + int highlight_image_id = assets_get_image_id("UI", "Highlight"); + int base_image_id = assets_get_image_id("UI", "Pantheon_Epithet_Button_01"); + color_t border_color = COLOR_BORDER_ORANGE; + color_t highlight_color = COLOR_MASK_NONE; + + for (int god = 0; god < MAX_GODS + 1; god++) { + if (god == selected_god_id) { + button_border_draw(100 * god + 26, 52, 90, 100, 1); + + if (god == MAX_GODS) { + image_draw_border(border_image_id, 100 * god + 30, 56, border_color); + image_draw(base_image_id, 100 * god + 35, 61, COLOR_MASK_NONE, SCALE_NONE); + image_draw_border(highlight_image_id, 100 * god + 35, 61, highlight_color); + } else { + image_draw(image_group(GROUP_PANEL_WINDOWS) + god + 21, 100 * god + 30, 56, COLOR_MASK_NONE, SCALE_NONE); + } + } else { + if (god == MAX_GODS) { + highlight_color = COLOR_BLACK; + border_color = COLOR_BORDER_BROWN; + image_draw_border(border_image_id, 100 * god + 30, 56, border_color); + image_draw(base_image_id, 100 * god + 35, 61, COLOR_MASK_NONE, SCALE_NONE); + image_draw_border(highlight_image_id, 100 * god + 35, 61, highlight_color); + } else { + image_draw(image_group(GROUP_PANEL_WINDOWS) + god + 16, 100 * god + 30, 56, COLOR_MASK_NONE, SCALE_NONE); + } + } + } + + graphics_reset_dialog(); +} + + +static void draw_foreground(void) +{ + graphics_in_dialog(); + + inner_panel_draw(33, 170, 36, 14); + + int offet_y = 0; + + for (int i = 0; i < 3; i++) { + int module_name = epithets_options[selected_god_id * 3 + i].option.header; + text_draw_centered(translation_for(module_name), 53, 184 + offet_y , 540, FONT_NORMAL_GREEN, 0); + + int module_desc = epithets_options[selected_god_id * 3 + i].option.desc; + // Draw in black and then white to create shadow effect + text_draw_multiline(translation_for(module_desc), 53 + 1, 204 + offet_y + 1, 540, FONT_SMALL_PLAIN, COLOR_BLACK); + offet_y += text_draw_multiline(translation_for(module_desc), 53, 204 + offet_y, 540, FONT_SMALL_PLAIN, COLOR_WHITE); + offet_y += 34; + } + + image_buttons_draw(0, 0, image_buttons_bottom, 1); + + graphics_reset_dialog(); +} + +static void button_god(int god, int param2) +{ + selected_god_id = god; + window_invalidate(); +} + +static void button_close(int param1, int param2) +{ + window_advisors_show(); +} + +static void get_tooltip(tooltip_context *c) +{ + if (!focus_image_button_id && !focus_button_id) { + return; + } + + c->type = TOOLTIP_BUTTON; + + // image buttons + if (focus_image_button_id) { + c->text_id = 2; + } + // gods + switch (focus_button_id) { + case 1: c->translation_key = TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_CERES; break; + case 2: c->translation_key = TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_NEPTUNE; break; + case 3: c->translation_key = TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_MERCURY; break; + case 4: c->translation_key = TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_MARS; break; + case 5: c->translation_key = TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_VENUS; break; + case 6: c->translation_key = TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_JUPITER; break; + } +} + +static void handle_input(const mouse *m, const hotkeys *h) +{ + const mouse *m_dialog = mouse_in_dialog(m); + int handled = image_buttons_handle_mouse(m_dialog, 0, 0, image_buttons_bottom, 1, &focus_image_button_id) | + generic_buttons_handle_mouse(m_dialog, 0, 0, buttons_gods_size, 6, &focus_button_id); + + if (focus_image_button_id) { + focus_button_id = 0; + } + + if (!handled && input_go_back_requested(m, h)) { + window_advisors_show(); + } +} + +void window_epithets_show(void) +{ + window_type window = { + WINDOW_EPITHETS, + draw_background, + draw_foreground, + handle_input, + get_tooltip + }; + init(); + window_show(&window); +} diff --git a/src/window/epithets.h b/src/window/epithets.h new file mode 100644 index 0000000000..94e0220060 --- /dev/null +++ b/src/window/epithets.h @@ -0,0 +1,6 @@ +#ifndef WINDOW_EPITHETS_H +#define WINDOW_EPITHETS_H + +void window_epithets_show(void); + +#endif // WINDOW_EPITHETS_H