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

223 lines
6.1 KiB

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