💿🐜 Antkeeper source code https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
5.7 KiB

  1. /*
  2. * Copyright (C) 2023 Christopher J. Howard
  3. *
  4. * This file is part of Antkeeper source code.
  5. *
  6. * Antkeeper source code is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * Antkeeper source code is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with Antkeeper source code. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include "game/state/language-menu.hpp"
  20. #include "game/state/options-menu.hpp"
  21. #include "application.hpp"
  22. #include "scene/text.hpp"
  23. #include "debug/log.hpp"
  24. #include "game/fonts.hpp"
  25. #include "game/menu.hpp"
  26. #include "game/strings.hpp"
  27. #include "utility/hash/fnv1a.hpp"
  28. using namespace hash::literals;
  29. namespace game {
  30. namespace state {
  31. language_menu::language_menu(game::context& ctx):
  32. game::state::base(ctx)
  33. {
  34. debug::log::trace("Entering language menu state...");
  35. // Construct menu item texts
  36. scene::text* language_name_text = new scene::text();
  37. scene::text* language_value_text = new scene::text();
  38. scene::text* back_text = new scene::text();
  39. // Build list of menu item texts
  40. ctx.menu_item_texts.push_back({language_name_text, language_value_text});
  41. ctx.menu_item_texts.push_back({back_text, nullptr});
  42. // Set content of menu item texts
  43. update_text_content();
  44. // Init menu item index
  45. game::menu::init_menu_item_index(ctx, "language");
  46. game::menu::update_text_color(ctx);
  47. game::menu::update_text_font(ctx);
  48. game::menu::align_text(ctx);
  49. game::menu::update_text_tweens(ctx);
  50. game::menu::add_text_to_ui(ctx);
  51. game::menu::setup_animations(ctx);
  52. // Construct menu item callbacks
  53. auto next_language_callback = [this, &ctx]()
  54. {
  55. // Increment language index
  56. ctx.language_index = (ctx.language_index + 1) % ctx.language_count;
  57. // Update language index setting
  58. (*ctx.settings)["language_index"_fnv1a32] = ctx.language_index;
  59. // Build string map for current language if not built
  60. if (ctx.string_maps[ctx.language_index].empty())
  61. {
  62. i18n::build_string_map(*ctx.string_table, 0, ctx.language_index + 2, ctx.string_maps[ctx.language_index]);
  63. }
  64. // Log language change
  65. debug::log::info("Language index: {}; code: {}", ctx.language_index, get_string(ctx, "language_code"_fnv1a32));
  66. // Reload fonts
  67. debug::log::trace("Reloading fonts...");
  68. game::load_fonts(ctx);
  69. debug::log::trace("Reloaded fonts");
  70. game::menu::update_text_font(ctx);
  71. this->update_text_content();
  72. game::menu::refresh_text(ctx);
  73. game::menu::align_text(ctx);
  74. game::menu::update_text_tweens(ctx);
  75. };
  76. auto previous_language_callback = [this, &ctx]()
  77. {
  78. // Decrement language index
  79. if (ctx.language_index > 0)
  80. {
  81. --ctx.language_index;
  82. }
  83. else
  84. {
  85. ctx.language_index = ctx.language_count - 1;
  86. }
  87. // Update language index setting
  88. (*ctx.settings)["language_index"_fnv1a32] = ctx.language_index;
  89. // Build string map for current language if not built
  90. if (ctx.string_maps[ctx.language_index].empty())
  91. {
  92. i18n::build_string_map(*ctx.string_table, 0, ctx.language_index + 2, ctx.string_maps[ctx.language_index]);
  93. }
  94. // Log language change
  95. debug::log::info("Language index: {}; code: {}", ctx.language_index, get_string(ctx, "language_code"_fnv1a32));
  96. // Reload fonts
  97. debug::log::trace("Reloading fonts...");
  98. game::load_fonts(ctx);
  99. debug::log::trace("Reloaded fonts");
  100. game::menu::update_text_font(ctx);
  101. this->update_text_content();
  102. game::menu::refresh_text(ctx);
  103. game::menu::align_text(ctx);
  104. game::menu::update_text_tweens(ctx);
  105. };
  106. auto select_back_callback = [&ctx]()
  107. {
  108. // Disable controls
  109. game::menu::clear_controls(ctx);
  110. game::menu::fade_out
  111. (
  112. ctx,
  113. [&ctx]()
  114. {
  115. // Queue change to options menu state
  116. ctx.function_queue.push
  117. (
  118. [&ctx]()
  119. {
  120. ctx.state_machine.pop();
  121. ctx.state_machine.emplace(new game::state::options_menu(ctx));
  122. }
  123. );
  124. }
  125. );
  126. };
  127. // Build list of menu select callbacks
  128. ctx.menu_select_callbacks.push_back(next_language_callback);
  129. ctx.menu_select_callbacks.push_back(select_back_callback);
  130. // Build list of menu left callbacks
  131. ctx.menu_left_callbacks.push_back(previous_language_callback);
  132. ctx.menu_left_callbacks.push_back(nullptr);
  133. // Build list of menu right callbacks
  134. ctx.menu_right_callbacks.push_back(next_language_callback);
  135. ctx.menu_right_callbacks.push_back(nullptr);
  136. // Set menu back callback
  137. ctx.menu_back_callback = select_back_callback;
  138. // Queue menu control setup
  139. ctx.function_queue.push(std::bind(game::menu::setup_controls, std::ref(ctx)));
  140. // Fade in menu
  141. game::menu::fade_in(ctx, nullptr);
  142. debug::log::trace("Entered language menu state");
  143. }
  144. language_menu::~language_menu()
  145. {
  146. debug::log::trace("Exiting language menu state...");
  147. // Destruct menu
  148. game::menu::clear_controls(ctx);
  149. game::menu::clear_callbacks(ctx);
  150. game::menu::delete_animations(ctx);
  151. game::menu::remove_text_from_ui(ctx);
  152. game::menu::delete_text(ctx);
  153. debug::log::trace("Exited language menu state...");
  154. }
  155. void language_menu::update_text_content()
  156. {
  157. auto [language_name, language_value] = ctx.menu_item_texts[0];
  158. auto [back_name, back_value] = ctx.menu_item_texts[1];
  159. language_name->set_content(get_string(ctx, "language_menu_language"_fnv1a32));
  160. language_value->set_content(get_string(ctx, "language_name"_fnv1a32));
  161. back_name->set_content(get_string(ctx, "back"_fnv1a32));
  162. }
  163. } // namespace state
  164. } // namespace game