Antkeeper  0.0.1
language-menu-state.cpp
Go to the documentation of this file.
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 
22 #include "game/controls.hpp"
23 #include <engine/scene/text.hpp>
24 #include <engine/debug/log.hpp>
25 #include "game/fonts.hpp"
26 #include "game/menu.hpp"
27 #include "game/strings.hpp"
30 #include <algorithm>
31 #include <cctype>
32 
33 using namespace hash::literals;
34 
36  game_state(ctx)
37 {
38  debug::log_trace("Entering language menu state...");
39 
40  // Load language manifest
41  language_manifest = ctx.resource_manager->load<text_file>("languages.txt");
42  if (!language_manifest)
43  {
44  throw std::runtime_error("Failed to load language manifest");
45  }
46 
47  // Determine index of current language
48  language_index = 0;
49  for (std::size_t i = 0; i < language_manifest->lines.size(); ++i)
50  {
51  if (ctx.language_tag == language_manifest->lines[i])
52  {
53  language_index = i;
54  break;
55  }
56  }
57 
58  // Construct menu item texts
59  language_name_text = std::make_unique<scene::text>();
60  language_value_text = std::make_unique<scene::text>();
61  back_text = std::make_unique<scene::text>();
62 
63  // Build list of menu item texts
64  ctx.menu_item_texts.push_back({language_name_text.get(), language_value_text.get()});
65  ctx.menu_item_texts.push_back({back_text.get(), nullptr});
66 
67  // Set content of menu item texts
68  update_text_content();
69 
70  // Init menu item index
71  ::menu::init_menu_item_index(ctx, "language");
72 
78 
79  auto change_language = [this, &ctx]()
80  {
81  const std::string& language_tag = this->language_manifest->lines[this->language_index];
82 
83  // Slugify language tag
84  std::string language_slug = language_tag;
85  std::transform
86  (
87  language_slug.begin(),
88  language_slug.end(),
89  language_slug.begin(),
90  [](unsigned char c)
91  {
92  return std::tolower(c);
93  }
94  );
95 
96  // Load language strings
97  ctx.string_map = ctx.resource_manager->load<i18n::string_map>(language_slug + ".str");
98 
99  // Update language settings
100  ctx.language_tag = language_tag;
101  (*ctx.settings)["language_tag"] = ctx.language_tag;
102 
103  // Log language change
104  debug::log_info("Language tag: {}", ctx.language_tag);
105 
106  // Reload fonts
107  debug::log_trace("Reloading fonts...");
108  ::load_fonts(ctx);
109  debug::log_trace("Reloaded fonts");
110 
111  // Update menus
113  this->update_text_content();
116  };
117 
118  // Construct menu item callbacks
119  auto next_language_callback = [this, &ctx, change_language]()
120  {
121  this->language_index = (this->language_index + 1) % this->language_manifest->lines.size();
122  change_language();
123  };
124  auto previous_language_callback = [this, &ctx, change_language]()
125  {
126  if (this->language_index > 0)
127  {
128  --this->language_index;
129  }
130  else
131  {
132  this->language_index = this->language_manifest->lines.size() - 1;
133  }
134 
135  change_language();
136  };
137  auto select_back_callback = [&ctx]()
138  {
139  // Disable menu controls
140  ctx.function_queue.push(std::bind(::disable_menu_controls, std::ref(ctx)));
141 
143  (
144  ctx,
145  [&ctx]()
146  {
147  // Queue change to options menu state
148  ctx.function_queue.push
149  (
150  [&ctx]()
151  {
152  ctx.state_machine.pop();
153  ctx.state_machine.emplace(std::make_unique<options_menu_state>(ctx));
154  }
155  );
156  }
157  );
158  };
159 
160  // Build list of menu select callbacks
161  ctx.menu_select_callbacks.push_back(next_language_callback);
162  ctx.menu_select_callbacks.push_back(select_back_callback);
163 
164  // Build list of menu left callbacks
165  ctx.menu_left_callbacks.push_back(previous_language_callback);
166  ctx.menu_left_callbacks.push_back(nullptr);
167 
168  // Build list of menu right callbacks
169  ctx.menu_right_callbacks.push_back(next_language_callback);
170  ctx.menu_right_callbacks.push_back(nullptr);
171 
172  // Set menu back callback
173  ctx.menu_back_callback = select_back_callback;
174 
175  // Enable menu controls next frame
176  ctx.function_queue.push(std::bind(::enable_menu_controls, std::ref(ctx)));
177 
178  // Fade in menu
179  ::menu::fade_in(ctx, nullptr);
180 
181  debug::log_trace("Entered language menu state");
182 }
183 
185 {
186  debug::log_trace("Exiting language menu state...");
187 
188  // Destruct menu
194 
195  debug::log_trace("Exited language menu state");
196 }
197 
198 void language_menu_state::update_text_content()
199 {
200  auto [language_name, language_value] = ctx.menu_item_texts[0];
201  auto [back_name, back_value] = ctx.menu_item_texts[1];
202 
203  language_name->set_content(get_string(ctx, "language_menu_language"));
204  language_value->set_content(get_string(ctx, "language_name_native"));
205  back_name->set_content(get_string(ctx, "back"));
206 }
Abstract base class for game states.
Definition: game-state.hpp:29
::game & ctx
Definition: game-state.hpp:44
Definition: game.hpp:121
std::vector< std::function< void()> > menu_left_callbacks
Definition: game.hpp:348
std::vector< std::function< void()> > menu_right_callbacks
Definition: game.hpp:349
hsm::state_machine< game_state > state_machine
Definition: game.hpp:299
std::shared_ptr< i18n::string_map > string_map
Definition: game.hpp:183
std::vector< std::function< void()> > menu_select_callbacks
Definition: game.hpp:347
std::string language_tag
Definition: game.hpp:182
std::shared_ptr< dict< hash::fnv1a32_t > > settings
Definition: game.hpp:162
std::vector< std::tuple< scene::text *, scene::text * > > menu_item_texts
Definition: game.hpp:351
std::unique_ptr< resource_manager > resource_manager
Definition: game.hpp:152
std::queue< std::function< void()> > function_queue
Definition: game.hpp:303
std::function< void()> menu_back_callback
Definition: game.hpp:350
language_menu_state(::game &ctx)
void load_fonts(::game &ctx)
Definition: fonts.cpp:64
void enable_menu_controls(::game &ctx)
void disable_menu_controls(::game &ctx)
log_message< log_message_severity::trace, Args... > log_trace
Formats and logs a trace message.
Definition: log.hpp:88
User-defined literals for compile-time string hashing.
Definition: fnv1a.hpp:232
std::unordered_map< hash::fnv1a32_t, std::string > string_map
Maps 32-bit keys to strings.
Definition: string-map.hpp:32
void init_menu_item_index(::game &ctx, hash::fnv1a32_t menu_name)
Definition: menu.cpp:31
void update_text_color(::game &ctx)
Definition: menu.cpp:59
void clear_callbacks(::game &ctx)
Definition: menu.cpp:197
void delete_animations(::game &ctx)
Definition: menu.cpp:191
void align_text(::game &ctx, bool center, bool has_back, float anchor_y)
Definition: menu.cpp:73
void setup_animations(::game &ctx)
Definition: menu.cpp:206
void refresh_text(::game &ctx)
Definition: menu.cpp:156
void add_text_to_ui(::game &ctx)
Definition: menu.cpp:166
void fade_out(::game &ctx, const std::function< void()> &end_callback)
Definition: menu.cpp:263
void update_text_font(::game &ctx)
Definition: menu.cpp:44
void fade_in(::game &ctx, const std::function< void()> &end_callback)
Definition: menu.cpp:233
void remove_text_from_ui(::game &ctx)
Definition: menu.cpp:176
void delete_text(::game &ctx)
Definition: menu.cpp:186
std::string get_string(const ::game &ctx, hash::fnv1a32_t key)
Returns a localized string.
Definition: strings.cpp:23
Self-formatting message that logs itself to the default logger on construction.
Definition: log.hpp:53
Virtual text file.
Definition: text-file.hpp:30