diff --git a/CMakeLists.txt b/CMakeLists.txt index 96982191fe..8cc0a16c15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -675,6 +675,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 b92319900a..e1a2b50335 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 8ef536853b..2da227c6c6 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 //light yellow +#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 78f6bd7a74..5d771b0c2e 100644 --- a/src/graphics/window.h +++ b/src/graphics/window.h @@ -48,6 +48,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 66b8249cf0..b13814fa06 100644 --- a/src/translation/english.c +++ b/src/translation/english.c @@ -1626,6 +1626,14 @@ static translation_string all_strings[] = { {TR_BUILDING_NATIVE_WATCHTOWER_DESC,"Using these structures, the natives observe our every movement and exploit our weak points. Unless we manage to deal with the locals, the guards watching us from the towers will prevent us from expanding into this area."}, {TR_BUILDING_INFO_CARAVANSERAI_MONTHLY_CONSUMPTION, "Monthly food consumption:"}, {TR_CONFIG_CARAVANS_MOVE_OFF_ROAD, "Trade caravans do not prioritise road networks"}, + {TR_WINDOW_ADVISOR_EPITHETS, "Powers of the Gods"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP, "Divine powers granted by Great Temples"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_CERES, "Ceres divine powers"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_NEPTUNE, "Neptune divine powers"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_MERCURY, "Mercury divine powers"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_MARS, "Mars divine powers"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_VENUS, "Venus divine powers"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_PANTHEON, "Pantheon divine powers"}, }; void translation_english(const translation_string **strings, int *num_strings) diff --git a/src/translation/french.c b/src/translation/french.c index c132dc9736..3bfbdb6f8a 100644 --- a/src/translation/french.c +++ b/src/translation/french.c @@ -1610,6 +1610,14 @@ static translation_string all_strings[] = { {TR_BUILDING_LATRINES_UNNECESSARY, "Ces latrines sont superflues, car aucun logement à proximité n'en a l'utilité."}, {TR_BUILDING_LATRINES_NO_HOUSES, "Ces latrines sont actuellement inutiles, car aucun logement ne se trouve à proximité."}, {TR_CONFIG_DRAW_ASCLEPIUS, "Afficher le Bâton d'Asclépios pour le menu d'hygiène"}, + {TR_WINDOW_ADVISOR_EPITHETS, "Pouvoirs des Dieux"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP, "Pouvoirs divins conférés par les Temples monumentaux"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_CERES, "Pouvoirs divins de Cérès"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_NEPTUNE, "Pouvoirs divins de Neptune"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_MERCURY, "Pouvoirs divins de Mercure"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_MARS, "Pouvoirs divins de Mars"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_VENUS, "Pouvoirs divins de Vénus"}, + {TR_WINDOW_ADVISOR_EPITHETS_TOOLTIP_PANTHEON, "Pouvoirs divins du Panthéon"}, }; void translation_french(const translation_string **strings, int *num_strings) diff --git a/src/translation/translation.h b/src/translation/translation.h index 2b829567f5..ee7d492353 100644 --- a/src/translation/translation.h +++ b/src/translation/translation.h @@ -1445,7 +1445,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_WINDOW_ADVISOR_MILITARY_ARCHER, @@ -1620,6 +1620,14 @@ typedef enum { TR_BUILDING_NATIVE_WATCHTOWER_DESC, TR_BUILDING_INFO_CARAVANSERAI_MONTHLY_CONSUMPTION, TR_CONFIG_CARAVANS_MOVE_OFF_ROAD, + 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_PANTHEON, TRANSLATION_MAX_KEY } translation_key; diff --git a/src/window/advisor/military.c b/src/window/advisor/military.c index 99ef68b005..b9bc993130 100644 --- a/src/window/advisor/military.c +++ b/src/window/advisor/military.c @@ -31,7 +31,7 @@ static void button_empire_service(const generic_button *button); static void button_return_all_to_fort(const generic_button *button); 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, 0, 1}, diff --git a/src/window/advisor/religion.c b/src/window/advisor/religion.c index 241dbb6097..9ec4134dbb 100644 --- a/src/window/advisor/religion.c +++ b/src/window/advisor/religion.c @@ -13,11 +13,14 @@ #include "graphics/panel.h" #include "graphics/text.h" #include "window/hold_festival.h" +#include "window/epithets.h" static void button_hold_festival(const generic_button *button); +static void button_epithets(const generic_button *button); static generic_button hold_festival_button[] = { {102, 340, 300, 20, button_hold_festival}, + {590, 20, 32, 24, button_epithets} }; static unsigned 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(const generic_button *button) @@ -184,10 +191,17 @@ static void button_hold_festival(const generic_button *button) } } +static void button_epithets(const generic_button *button) +{ + 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/epithets.c b/src/window/epithets.c new file mode 100644 index 0000000000..4657ba8c36 --- /dev/null +++ b/src/window/epithets.c @@ -0,0 +1,252 @@ +#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(const struct generic_button *button); +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}, + {130, 56, 80, 90, button_god}, + {230, 56, 80, 90, button_god}, + {330, 56, 80, 90, button_god}, + {430, 56, 80, 90, button_god}, + {530, 56, 80, 90, button_god}, + {630, 56, 80, 90, button_god} +}; + +static unsigned int focus_button_id; +static unsigned 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; 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 offset_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 + offset_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 + offset_y + 1, 540, 0, FONT_SMALL_PLAIN, COLOR_BLACK); + offset_y += text_draw_multiline(translation_for(module_desc), 53, 204 + offset_y, 540, 0, FONT_SMALL_PLAIN, COLOR_WHITE); + offset_y += 34; + } + + image_buttons_draw(0, 0, image_buttons_bottom, 1); + + graphics_reset_dialog(); +} + +static void button_god(const struct generic_button *button) +{ + selected_god_id = (button - buttons_gods_size); // Calculate index based on button pointer + 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_PANTHEON; 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, 7, &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