💿🐜 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.

231 lines
6.4 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/pause-menu.hpp"
  20. #include "game/state/main-menu.hpp"
  21. #include "game/state/options-menu.hpp"
  22. #include "game/state/nuptial-flight.hpp"
  23. #include "game/menu.hpp"
  24. #include "animation/ease.hpp"
  25. #include "animation/animation.hpp"
  26. #include "animation/animator.hpp"
  27. #include "application.hpp"
  28. #include "scene/text.hpp"
  29. #include "debug/log.hpp"
  30. #include "animation/screen-transition.hpp"
  31. #include "config.hpp"
  32. #include "game/strings.hpp"
  33. #include "utility/hash/fnv1a.hpp"
  34. using namespace hash::literals;
  35. namespace game {
  36. namespace state {
  37. pause_menu::pause_menu(game::context& ctx):
  38. game::state::base(ctx)
  39. {
  40. debug::log::trace("Entering pause menu state...");
  41. // Construct menu item texts
  42. scene::text* resume_text = new scene::text();
  43. scene::text* options_text = new scene::text();
  44. scene::text* main_menu_text = new scene::text();
  45. scene::text* quit_text = new scene::text();
  46. // Set content of menu item texts
  47. resume_text->set_content(get_string(ctx, "pause_menu_resume"_fnv1a32));
  48. options_text->set_content(get_string(ctx, "pause_menu_options"_fnv1a32));
  49. main_menu_text->set_content(get_string(ctx, "pause_menu_main_menu"_fnv1a32));
  50. quit_text->set_content(get_string(ctx, "pause_menu_quit"_fnv1a32));
  51. // Build list of menu item texts
  52. ctx.menu_item_texts.push_back({resume_text, nullptr});
  53. ctx.menu_item_texts.push_back({options_text, nullptr});
  54. ctx.menu_item_texts.push_back({main_menu_text, nullptr});
  55. ctx.menu_item_texts.push_back({quit_text, nullptr});
  56. // Init menu item index
  57. game::menu::init_menu_item_index(ctx, "pause");
  58. game::menu::update_text_color(ctx);
  59. game::menu::update_text_font(ctx);
  60. game::menu::align_text(ctx, true, false);
  61. game::menu::update_text_tweens(ctx);
  62. game::menu::add_text_to_ui(ctx);
  63. game::menu::setup_animations(ctx);
  64. // Construct menu item callbacks
  65. auto select_resume_callback = [&ctx]()
  66. {
  67. // Disable unpause control
  68. //ctx.controls["pause"]->set_activated_callback(nullptr);
  69. // Disable menu controls
  70. game::menu::clear_controls(ctx);
  71. auto resume_paused_state = [&ctx]()
  72. {
  73. ctx.function_queue.push
  74. (
  75. [&ctx]()
  76. {
  77. ctx.state_machine.pop();
  78. ctx.resume_callback();
  79. }
  80. );
  81. };
  82. // Fade out pause menu then resume paused state
  83. game::menu::fade_out(ctx, resume_paused_state);
  84. game::menu::fade_out_bg(ctx);
  85. };
  86. auto select_options_callback = [&ctx]()
  87. {
  88. // Disable unpause control
  89. //ctx.controls["pause"]->set_activated_callback(nullptr);
  90. // Disable menu controls
  91. game::menu::clear_controls(ctx);
  92. // Fade out pause menu then open options menu
  93. game::menu::fade_out
  94. (
  95. ctx,
  96. [&ctx]()
  97. {
  98. // Queue change to options menu state
  99. ctx.function_queue.push
  100. (
  101. [&ctx]()
  102. {
  103. ctx.state_machine.pop();
  104. ctx.state_machine.emplace(new game::state::options_menu(ctx));
  105. }
  106. );
  107. }
  108. );
  109. };
  110. auto select_main_menu_callback = [&ctx]()
  111. {
  112. // Disable unpause control
  113. //ctx.controls["pause"]->set_activated_callback(nullptr);
  114. // Disable menu controls
  115. game::menu::clear_controls(ctx);
  116. // Clear resume callback
  117. ctx.resume_callback = nullptr;
  118. auto fade_out_callback = [&ctx]()
  119. {
  120. // Queue change to main menu state
  121. ctx.function_queue.push
  122. (
  123. [&ctx]()
  124. {
  125. ctx.menu_bg_billboard->set_active(false);
  126. ctx.state_machine.pop();
  127. ctx.state_machine.pop();
  128. ctx.state_machine.emplace(new game::state::main_menu(ctx, true));
  129. }
  130. );
  131. };
  132. // Fade out pause menu
  133. game::menu::fade_out(ctx, nullptr);
  134. // Fade out to black then return to main menu
  135. ctx.fade_transition_color->set_value({0, 0, 0});
  136. ctx.fade_transition->transition(config::quit_fade_out_duration, false, ease<float>::out_cubic, false, fade_out_callback);
  137. };
  138. auto select_quit_callback = [&ctx]()
  139. {
  140. // Disable unpause control
  141. //ctx.controls["pause"]->set_activated_callback(nullptr);
  142. // Disable menu controls
  143. game::menu::clear_controls(ctx);
  144. // Clear paused state
  145. //ctx.paused_state.reset();
  146. // Fade out pause menu
  147. game::menu::fade_out(ctx, nullptr);
  148. // Fade out to black then quit
  149. ctx.fade_transition_color->set_value({0, 0, 0});
  150. ctx.fade_transition->transition(config::quit_fade_out_duration, false, ease<float>::out_cubic, false, std::bind(&application::close, ctx.app));
  151. };
  152. // Build list of menu select callbacks
  153. ctx.menu_select_callbacks.push_back(select_resume_callback);
  154. ctx.menu_select_callbacks.push_back(select_options_callback);
  155. ctx.menu_select_callbacks.push_back(select_main_menu_callback);
  156. ctx.menu_select_callbacks.push_back(select_quit_callback);
  157. // Build list of menu right callbacks
  158. ctx.menu_right_callbacks.resize(4, nullptr);
  159. // Build list of menu left callbacks
  160. ctx.menu_left_callbacks.resize(4, nullptr);
  161. // Set menu back callback
  162. ctx.menu_back_callback = select_resume_callback;
  163. // Queue control setup
  164. ctx.function_queue.push
  165. (
  166. [&ctx, select_resume_callback]()
  167. {
  168. // Enable unpause control
  169. //ctx.controls["pause"]->set_activated_callback(select_resume_callback);
  170. // Enable menu controls
  171. game::menu::setup_controls(ctx);
  172. }
  173. );
  174. // Fade in menu and menu BG
  175. game::menu::fade_in(ctx, nullptr);
  176. if (!ctx.menu_bg_billboard->is_active())
  177. game::menu::fade_in_bg(ctx);
  178. // Save colony
  179. //game::save::colony(ctx);
  180. debug::log::trace("Entered pause menu state");
  181. }
  182. pause_menu::~pause_menu()
  183. {
  184. debug::log::trace("Exiting pause menu state...");
  185. // Destruct menu
  186. game::menu::clear_controls(ctx);
  187. game::menu::clear_callbacks(ctx);
  188. game::menu::delete_animations(ctx);
  189. game::menu::remove_text_from_ui(ctx);
  190. game::menu::delete_text(ctx);
  191. debug::log::trace("Exited pause menu state");
  192. }
  193. } // namespace state
  194. } // namespace game