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

430 lines
24 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/controls.hpp"
  20. #include "game/graphics.hpp"
  21. #include "game/menu.hpp"
  22. #include "game/control-profile.hpp"
  23. #include "game/states/pause-menu-state.hpp"
  24. #include <engine/resources/resource-manager.hpp>
  25. #include <engine/utility/json.hpp>
  26. #include <engine/input/modifier-key.hpp>
  27. #include <engine/utility/hash/fnv1a.hpp>
  28. void reset_control_profile(::control_profile& profile)
  29. {
  30. auto& mappings = profile.mappings;
  31. auto& settings = profile.settings;
  32. mappings.clear();
  33. settings.clear();
  34. // Fullscreen
  35. mappings.emplace("fullscreen", std::make_unique<input::key_mapping>(nullptr, input::scancode::f11, 0, false));
  36. mappings.emplace("fullscreen", std::make_unique<input::key_mapping>(nullptr, input::scancode::enter, input::modifier_key::alt, false));
  37. // Screenshot
  38. mappings.emplace("screenshot", std::make_unique<input::key_mapping>(nullptr, input::scancode::f12, 0, false));
  39. mappings.emplace("screenshot", std::make_unique<input::key_mapping>(nullptr, input::scancode::print_screen, 0, false));
  40. // Menu up
  41. mappings.emplace("menu_up", std::make_unique<input::key_mapping>(nullptr, input::scancode::up, 0, true));
  42. mappings.emplace("menu_up", std::make_unique<input::key_mapping>(nullptr, input::scancode::w, 0, true));
  43. mappings.emplace("menu_up", std::make_unique<input::key_mapping>(nullptr, input::scancode::i, 0, true));
  44. mappings.emplace("menu_up", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::left_stick_y, true));
  45. mappings.emplace("menu_up", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::right_stick_y, true));
  46. mappings.emplace("menu_up", std::make_unique<input::gamepad_button_mapping>(nullptr, input::gamepad_button::dpad_up));
  47. // Menu down
  48. mappings.emplace("menu_down", std::make_unique<input::key_mapping>(nullptr, input::scancode::down, 0, true));
  49. mappings.emplace("menu_down", std::make_unique<input::key_mapping>(nullptr, input::scancode::s, 0, true));
  50. mappings.emplace("menu_down", std::make_unique<input::key_mapping>(nullptr, input::scancode::k, 0, true));
  51. mappings.emplace("menu_down", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::left_stick_y, false));
  52. mappings.emplace("menu_down", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::right_stick_y, false));
  53. mappings.emplace("menu_down", std::make_unique<input::gamepad_button_mapping>(nullptr, input::gamepad_button::dpad_down));
  54. // Menu left
  55. mappings.emplace("menu_left", std::make_unique<input::key_mapping>(nullptr, input::scancode::left, 0, true));
  56. mappings.emplace("menu_left", std::make_unique<input::key_mapping>(nullptr, input::scancode::a, 0, true));
  57. mappings.emplace("menu_left", std::make_unique<input::key_mapping>(nullptr, input::scancode::j, 0, true));
  58. mappings.emplace("menu_left", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::left_stick_x, true));
  59. mappings.emplace("menu_left", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::right_stick_x, true));
  60. mappings.emplace("menu_left", std::make_unique<input::gamepad_button_mapping>(nullptr, input::gamepad_button::dpad_left));
  61. mappings.emplace("menu_left", std::make_unique<input::mouse_scroll_mapping>(nullptr, input::mouse_scroll_axis::x, true));
  62. mappings.emplace("menu_left", std::make_unique<input::mouse_scroll_mapping>(nullptr, input::mouse_scroll_axis::y, true));
  63. // Menu right
  64. mappings.emplace("menu_right", std::make_unique<input::key_mapping>(nullptr, input::scancode::right, 0, true));
  65. mappings.emplace("menu_right", std::make_unique<input::key_mapping>(nullptr, input::scancode::d, 0, true));
  66. mappings.emplace("menu_right", std::make_unique<input::key_mapping>(nullptr, input::scancode::l, 0, true));
  67. mappings.emplace("menu_right", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::left_stick_x, false));
  68. mappings.emplace("menu_right", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::right_stick_x, false));
  69. mappings.emplace("menu_right", std::make_unique<input::gamepad_button_mapping>(nullptr, input::gamepad_button::dpad_right));
  70. mappings.emplace("menu_right", std::make_unique<input::mouse_scroll_mapping>(nullptr, input::mouse_scroll_axis::x, false));
  71. mappings.emplace("menu_right", std::make_unique<input::mouse_scroll_mapping>(nullptr, input::mouse_scroll_axis::y, false));
  72. // Menu select
  73. mappings.emplace("menu_select", std::make_unique<input::key_mapping>(nullptr, input::scancode::enter, 0, false));
  74. mappings.emplace("menu_select", std::make_unique<input::key_mapping>(nullptr, input::scancode::space, 0, false));
  75. mappings.emplace("menu_select", std::make_unique<input::key_mapping>(nullptr, input::scancode::e, 0, false));
  76. mappings.emplace("menu_select", std::make_unique<input::gamepad_button_mapping>(nullptr, input::gamepad_button::a));
  77. // Menu back
  78. mappings.emplace("menu_back", std::make_unique<input::key_mapping>(nullptr, input::scancode::escape, 0, false));
  79. mappings.emplace("menu_back", std::make_unique<input::key_mapping>(nullptr, input::scancode::backspace, 0, false));
  80. mappings.emplace("menu_back", std::make_unique<input::key_mapping>(nullptr, input::scancode::q, 0, false));
  81. mappings.emplace("menu_back", std::make_unique<input::gamepad_button_mapping>(nullptr, input::gamepad_button::b));
  82. mappings.emplace("menu_back", std::make_unique<input::gamepad_button_mapping>(nullptr, input::gamepad_button::back));
  83. // Menu modifier
  84. mappings.emplace("menu_modifier", std::make_unique<input::key_mapping>(nullptr, input::scancode::left_shift, 0, false));
  85. mappings.emplace("menu_modifier", std::make_unique<input::key_mapping>(nullptr, input::scancode::right_shift, 0, false));
  86. // Move forward
  87. mappings.emplace("move_forward", std::make_unique<input::key_mapping>(nullptr, input::scancode::w, 0, false));
  88. mappings.emplace("move_forward", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::left_stick_y, true));
  89. // Move back
  90. mappings.emplace("move_back", std::make_unique<input::key_mapping>(nullptr, input::scancode::s, 0, false));
  91. mappings.emplace("move_back", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::left_stick_y, false));
  92. // Move left
  93. mappings.emplace("move_left", std::make_unique<input::key_mapping>(nullptr, input::scancode::a, 0, false));
  94. mappings.emplace("move_left", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::left_stick_x, true));
  95. // Move right
  96. mappings.emplace("move_right", std::make_unique<input::key_mapping>(nullptr, input::scancode::d, 0, false));
  97. mappings.emplace("move_right", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::left_stick_x, false));
  98. // Move up
  99. mappings.emplace("move_up", std::make_unique<input::mouse_scroll_mapping>(nullptr, input::mouse_scroll_axis::y, false));
  100. mappings.emplace("move_up", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::right_trigger, false));
  101. // Move down
  102. mappings.emplace("move_down", std::make_unique<input::mouse_scroll_mapping>(nullptr, input::mouse_scroll_axis::y, true));
  103. mappings.emplace("move_down", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::left_trigger, false));
  104. // Interact
  105. mappings.emplace("interact", std::make_unique<input::key_mapping>(nullptr, input::scancode::e, 0, false));
  106. mappings.emplace("interact", std::make_unique<input::gamepad_button_mapping>(nullptr, input::gamepad_button::a));
  107. // Move fast
  108. // mappings.emplace("move_fast", std::make_unique<input::key_mapping>(nullptr, input::scancode::left_shift, 0, false));
  109. // Move slow
  110. mappings.emplace("move_slow", std::make_unique<input::key_mapping>(nullptr, input::scancode::left_ctrl, 0, false));
  111. // Camera mouse pick
  112. mappings.emplace("camera_mouse_pick", std::make_unique<input::mouse_button_mapping>(nullptr, input::mouse_button::left));
  113. // Camera mouse look
  114. mappings.emplace("camera_mouse_look", std::make_unique<input::mouse_button_mapping>(nullptr, input::mouse_button::right));
  115. // Camera mouse drag
  116. mappings.emplace("camera_mouse_drag", std::make_unique<input::mouse_button_mapping>(nullptr, input::mouse_button::middle));
  117. // Camera zoom
  118. mappings.emplace("camera_mouse_zoom", std::make_unique<input::key_mapping>(nullptr, input::scancode::z, 0, false));
  119. mappings.emplace("camera_zoom_in", std::make_unique<input::mouse_scroll_mapping>(nullptr, input::mouse_scroll_axis::y, false));
  120. mappings.emplace("camera_zoom_out", std::make_unique<input::mouse_scroll_mapping>(nullptr, input::mouse_scroll_axis::y, true));
  121. // Camera orbit
  122. mappings.emplace("camera_orbit_left", std::make_unique<input::key_mapping>(nullptr, input::scancode::left, 0, false));
  123. mappings.emplace("camera_orbit_left", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::right_stick_x, false));
  124. mappings.emplace("camera_orbit_right", std::make_unique<input::key_mapping>(nullptr, input::scancode::right, 0, false));
  125. mappings.emplace("camera_orbit_right", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::right_stick_x, true));
  126. mappings.emplace("camera_orbit_up", std::make_unique<input::key_mapping>(nullptr, input::scancode::up, 0, false));
  127. mappings.emplace("camera_orbit_up", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::right_stick_y, true));
  128. mappings.emplace("camera_orbit_down", std::make_unique<input::key_mapping>(nullptr, input::scancode::up, 0, false));
  129. mappings.emplace("camera_orbit_down", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::right_stick_y, false));
  130. // Camera look ahead
  131. mappings.emplace("camera_look_ahead", std::make_unique<input::key_mapping>(nullptr, input::scancode::left_shift, 0, false));
  132. mappings.emplace("camera_look_ahead", std::make_unique<input::gamepad_axis_mapping>(nullptr, input::gamepad_axis::left_trigger, false));
  133. // Camera presets
  134. mappings.emplace("camera_preset_1", std::make_unique<input::key_mapping>(nullptr, input::scancode::digit_1, 0, false));
  135. mappings.emplace("camera_preset_2", std::make_unique<input::key_mapping>(nullptr, input::scancode::digit_2, 0, false));
  136. mappings.emplace("camera_preset_3", std::make_unique<input::key_mapping>(nullptr, input::scancode::digit_3, 0, false));
  137. mappings.emplace("camera_preset_4", std::make_unique<input::key_mapping>(nullptr, input::scancode::digit_4, 0, false));
  138. mappings.emplace("camera_preset_5", std::make_unique<input::key_mapping>(nullptr, input::scancode::digit_5, 0, false));
  139. mappings.emplace("camera_preset_6", std::make_unique<input::key_mapping>(nullptr, input::scancode::digit_6, 0, false));
  140. mappings.emplace("camera_preset_7", std::make_unique<input::key_mapping>(nullptr, input::scancode::digit_7, 0, false));
  141. mappings.emplace("camera_preset_8", std::make_unique<input::key_mapping>(nullptr, input::scancode::digit_8, 0, false));
  142. mappings.emplace("camera_preset_9", std::make_unique<input::key_mapping>(nullptr, input::scancode::digit_9, 0, false));
  143. mappings.emplace("camera_preset_10", std::make_unique<input::key_mapping>(nullptr, input::scancode::digit_0, 0, false));
  144. mappings.emplace("camera_save_preset", std::make_unique<input::key_mapping>(nullptr, input::scancode::left_ctrl, 0, false));
  145. mappings.emplace("camera_save_preset", std::make_unique<input::key_mapping>(nullptr, input::scancode::right_ctrl, 0, false));
  146. // Oviposit
  147. mappings.emplace("oviposit", std::make_unique<input::key_mapping>(nullptr, input::scancode::left_alt, 0, false));
  148. // Pause
  149. mappings.emplace("pause", std::make_unique<input::key_mapping>(nullptr, input::scancode::escape, 0, false));
  150. mappings.emplace("pause", std::make_unique<input::gamepad_button_mapping>(nullptr, input::gamepad_button::start));
  151. // Toggle debug UI
  152. mappings.emplace("toggle_debug", std::make_unique<input::key_mapping>(nullptr, input::scancode::grave, 0, false));
  153. // Adjust exposure
  154. mappings.emplace("adjust_exposure", std::make_unique<input::key_mapping>(nullptr, input::scancode::b, 0, false));
  155. // Adjust time
  156. mappings.emplace("adjust_time", std::make_unique<input::key_mapping>(nullptr, input::scancode::t, 0, false));
  157. }
  158. void apply_control_profile(::game& ctx, const ::control_profile& profile)
  159. {
  160. auto add_mappings = [&profile](input::action_map& map, input::action& action, hash::fnv1a32_t key)
  161. {
  162. auto range = profile.mappings.equal_range(key);
  163. for (auto i = range.first; i != range.second; ++i)
  164. {
  165. map.add_mapping(action, *i->second);
  166. }
  167. };
  168. // Window controls
  169. ctx.window_action_map.remove_mappings();
  170. add_mappings(ctx.window_action_map, ctx.fullscreen_action, "fullscreen");
  171. add_mappings(ctx.window_action_map, ctx.screenshot_action, "screenshot");
  172. // Menu controls
  173. ctx.menu_action_map.remove_mappings();
  174. add_mappings(ctx.menu_action_map, ctx.menu_up_action, "menu_up");
  175. add_mappings(ctx.menu_action_map, ctx.menu_down_action, "menu_down");
  176. add_mappings(ctx.menu_action_map, ctx.menu_left_action, "menu_left");
  177. add_mappings(ctx.menu_action_map, ctx.menu_right_action, "menu_right");
  178. add_mappings(ctx.menu_action_map, ctx.menu_select_action, "menu_select");
  179. add_mappings(ctx.menu_action_map, ctx.menu_back_action, "menu_back");
  180. add_mappings(ctx.menu_action_map, ctx.menu_modifier_action, "menu_modifier");
  181. // Movement controls
  182. ctx.movement_action_map.remove_mappings();
  183. add_mappings(ctx.movement_action_map, ctx.move_forward_action, "move_forward");
  184. add_mappings(ctx.movement_action_map, ctx.move_back_action, "move_back");
  185. add_mappings(ctx.movement_action_map, ctx.move_left_action, "move_left");
  186. add_mappings(ctx.movement_action_map, ctx.move_right_action, "move_right");
  187. add_mappings(ctx.movement_action_map, ctx.move_up_action, "move_up");
  188. add_mappings(ctx.movement_action_map, ctx.move_down_action, "move_down");
  189. add_mappings(ctx.movement_action_map, ctx.move_fast_action, "move_fast");
  190. add_mappings(ctx.movement_action_map, ctx.move_slow_action, "move_slow");
  191. add_mappings(ctx.movement_action_map, ctx.pause_action, "pause");
  192. // Camera controls
  193. ctx.camera_action_map.remove_mappings();
  194. add_mappings(ctx.camera_action_map, ctx.camera_mouse_pick_action, "camera_mouse_pick");
  195. add_mappings(ctx.camera_action_map, ctx.camera_mouse_look_action, "camera_mouse_look");
  196. add_mappings(ctx.camera_action_map, ctx.camera_mouse_drag_action, "camera_mouse_drag");
  197. add_mappings(ctx.camera_action_map, ctx.camera_mouse_zoom_action, "camera_mouse_zoom");
  198. add_mappings(ctx.camera_action_map, ctx.camera_zoom_in_action, "camera_zoom_in");
  199. add_mappings(ctx.camera_action_map, ctx.camera_zoom_out_action, "camera_zoom_out");
  200. add_mappings(ctx.camera_action_map, ctx.camera_orbit_left_action, "camera_orbit_left");
  201. add_mappings(ctx.camera_action_map, ctx.camera_orbit_right_action, "camera_orbit_right");
  202. add_mappings(ctx.camera_action_map, ctx.camera_orbit_up_action, "camera_orbit_up");
  203. add_mappings(ctx.camera_action_map, ctx.camera_orbit_down_action, "camera_orbit_down");
  204. add_mappings(ctx.camera_action_map, ctx.camera_look_ahead_action, "camera_look_ahead");
  205. add_mappings(ctx.camera_action_map, ctx.camera_preset_1_action, "camera_preset_1");
  206. add_mappings(ctx.camera_action_map, ctx.camera_preset_2_action, "camera_preset_2");
  207. add_mappings(ctx.camera_action_map, ctx.camera_preset_3_action, "camera_preset_3");
  208. add_mappings(ctx.camera_action_map, ctx.camera_preset_4_action, "camera_preset_4");
  209. add_mappings(ctx.camera_action_map, ctx.camera_preset_5_action, "camera_preset_5");
  210. add_mappings(ctx.camera_action_map, ctx.camera_preset_6_action, "camera_preset_6");
  211. add_mappings(ctx.camera_action_map, ctx.camera_preset_7_action, "camera_preset_7");
  212. add_mappings(ctx.camera_action_map, ctx.camera_preset_8_action, "camera_preset_8");
  213. add_mappings(ctx.camera_action_map, ctx.camera_preset_9_action, "camera_preset_9");
  214. add_mappings(ctx.camera_action_map, ctx.camera_preset_10_action, "camera_preset_10");
  215. add_mappings(ctx.camera_action_map, ctx.camera_save_preset_action, "camera_save_preset");
  216. // Ant controls
  217. ctx.ant_action_map.remove_mappings();
  218. add_mappings(ctx.ant_action_map, ctx.ant_move_forward_action, "move_forward");
  219. add_mappings(ctx.ant_action_map, ctx.ant_move_back_action, "move_back");
  220. add_mappings(ctx.ant_action_map, ctx.ant_move_left_action, "move_left");
  221. add_mappings(ctx.ant_action_map, ctx.ant_move_right_action, "move_right");
  222. add_mappings(ctx.ant_action_map, ctx.ant_move_fast_action, "move_fast");
  223. add_mappings(ctx.ant_action_map, ctx.ant_move_slow_action, "move_slow");
  224. add_mappings(ctx.ant_action_map, ctx.ant_interact_action, "interact");
  225. add_mappings(ctx.ant_action_map, ctx.ant_oviposit_action, "oviposit");
  226. // Debug controls
  227. add_mappings(ctx.debug_action_map, ctx.toggle_debug_ui_action, "toggle_debug");
  228. add_mappings(ctx.debug_action_map, ctx.adjust_exposure_action, "adjust_exposure");
  229. add_mappings(ctx.debug_action_map, ctx.adjust_time_action, "adjust_time");
  230. }
  231. void update_control_profile(::game& ctx, ::control_profile& profile)
  232. {
  233. auto add_mappings = [&profile](const input::action_map& map, const input::action& action, hash::fnv1a32_t key)
  234. {
  235. auto gamepad_axis_mappings = map.get_gamepad_axis_mappings(action);
  236. auto gamepad_button_mappings = map.get_gamepad_button_mappings(action);
  237. auto key_mappings = map.get_key_mappings(action);
  238. auto mouse_button_mappings = map.get_mouse_button_mappings(action);
  239. auto mouse_motion_mappings = map.get_mouse_motion_mappings(action);
  240. auto mouse_scroll_mappings = map.get_mouse_scroll_mappings(action);
  241. for (const auto& mapping: gamepad_axis_mappings)
  242. {
  243. profile.mappings.emplace(key, std::make_unique<input::gamepad_axis_mapping>(mapping));
  244. }
  245. for (const auto& mapping: gamepad_button_mappings)
  246. {
  247. profile.mappings.emplace(key, std::make_unique<input::gamepad_button_mapping>(mapping));
  248. }
  249. for (const auto& mapping: key_mappings)
  250. {
  251. profile.mappings.emplace(key, std::make_unique<input::key_mapping>(mapping));
  252. }
  253. for (const auto& mapping: mouse_button_mappings)
  254. {
  255. profile.mappings.emplace(key, std::make_unique<input::mouse_button_mapping>(mapping));
  256. }
  257. for (const auto& mapping: mouse_motion_mappings)
  258. {
  259. profile.mappings.emplace(key, std::make_unique<input::mouse_motion_mapping>(mapping));
  260. }
  261. for (const auto& mapping: mouse_scroll_mappings)
  262. {
  263. profile.mappings.emplace(key, std::make_unique<input::mouse_scroll_mapping>(mapping));
  264. }
  265. };
  266. profile.mappings.clear();
  267. // Window controls
  268. add_mappings(ctx.window_action_map, ctx.fullscreen_action, "fullscreen");
  269. add_mappings(ctx.window_action_map, ctx.screenshot_action, "screenshot");
  270. // Menu controls
  271. add_mappings(ctx.menu_action_map, ctx.menu_up_action, "menu_up");
  272. add_mappings(ctx.menu_action_map, ctx.menu_down_action, "menu_down");
  273. add_mappings(ctx.menu_action_map, ctx.menu_left_action, "menu_left");
  274. add_mappings(ctx.menu_action_map, ctx.menu_right_action, "menu_right");
  275. add_mappings(ctx.menu_action_map, ctx.menu_select_action, "menu_select");
  276. add_mappings(ctx.menu_action_map, ctx.menu_back_action, "menu_back");
  277. add_mappings(ctx.menu_action_map, ctx.menu_modifier_action, "menu_modifier");
  278. // Movement controls
  279. add_mappings(ctx.movement_action_map, ctx.move_forward_action, "move_forward");
  280. add_mappings(ctx.movement_action_map, ctx.move_back_action, "move_back");
  281. add_mappings(ctx.movement_action_map, ctx.move_left_action, "move_left");
  282. add_mappings(ctx.movement_action_map, ctx.move_right_action, "move_right");
  283. add_mappings(ctx.movement_action_map, ctx.move_up_action, "move_up");
  284. add_mappings(ctx.movement_action_map, ctx.move_down_action, "move_down");
  285. add_mappings(ctx.movement_action_map, ctx.move_fast_action, "move_fast");
  286. add_mappings(ctx.movement_action_map, ctx.move_slow_action, "move_slow");
  287. add_mappings(ctx.movement_action_map, ctx.pause_action, "pause");
  288. // Ant controls
  289. add_mappings(ctx.ant_action_map, ctx.ant_move_forward_action, "move_forward");
  290. add_mappings(ctx.ant_action_map, ctx.ant_move_back_action, "move_back");
  291. add_mappings(ctx.ant_action_map, ctx.ant_move_left_action, "move_left");
  292. add_mappings(ctx.ant_action_map, ctx.ant_move_right_action, "move_right");
  293. add_mappings(ctx.ant_action_map, ctx.ant_move_fast_action, "move_fast");
  294. add_mappings(ctx.ant_action_map, ctx.ant_move_slow_action, "move_slow");
  295. add_mappings(ctx.ant_action_map, ctx.ant_interact_action, "interact");
  296. add_mappings(ctx.ant_action_map, ctx.ant_oviposit_action, "oviposit");
  297. // Camera controls
  298. add_mappings(ctx.camera_action_map, ctx.camera_mouse_pick_action, "camera_mouse_pick");
  299. add_mappings(ctx.camera_action_map, ctx.camera_mouse_look_action, "camera_mouse_look");
  300. add_mappings(ctx.camera_action_map, ctx.camera_mouse_drag_action, "camera_mouse_drag");
  301. add_mappings(ctx.camera_action_map, ctx.camera_mouse_zoom_action, "camera_mouse_zoom");
  302. add_mappings(ctx.camera_action_map, ctx.camera_zoom_in_action, "camera_zoom_in");
  303. add_mappings(ctx.camera_action_map, ctx.camera_zoom_out_action, "camera_zoom_out");
  304. add_mappings(ctx.camera_action_map, ctx.camera_orbit_left_action, "camera_orbit_left");
  305. add_mappings(ctx.camera_action_map, ctx.camera_orbit_right_action, "camera_orbit_right");
  306. add_mappings(ctx.camera_action_map, ctx.camera_orbit_up_action, "camera_orbit_up");
  307. add_mappings(ctx.camera_action_map, ctx.camera_orbit_down_action, "camera_orbit_down");
  308. add_mappings(ctx.camera_action_map, ctx.camera_look_ahead_action, "camera_look_ahead");
  309. add_mappings(ctx.camera_action_map, ctx.camera_preset_1_action, "camera_preset_1");
  310. add_mappings(ctx.camera_action_map, ctx.camera_preset_2_action, "camera_preset_2");
  311. add_mappings(ctx.camera_action_map, ctx.camera_preset_3_action, "camera_preset_3");
  312. add_mappings(ctx.camera_action_map, ctx.camera_preset_4_action, "camera_preset_4");
  313. add_mappings(ctx.camera_action_map, ctx.camera_preset_5_action, "camera_preset_5");
  314. add_mappings(ctx.camera_action_map, ctx.camera_preset_6_action, "camera_preset_6");
  315. add_mappings(ctx.camera_action_map, ctx.camera_preset_7_action, "camera_preset_7");
  316. add_mappings(ctx.camera_action_map, ctx.camera_preset_8_action, "camera_preset_8");
  317. add_mappings(ctx.camera_action_map, ctx.camera_preset_9_action, "camera_preset_9");
  318. add_mappings(ctx.camera_action_map, ctx.camera_preset_10_action, "camera_preset_10");
  319. add_mappings(ctx.camera_action_map, ctx.camera_save_preset_action, "camera_save_preset");
  320. // Debug controls
  321. add_mappings(ctx.debug_action_map, ctx.toggle_debug_ui_action, "toggle_debug");
  322. add_mappings(ctx.debug_action_map, ctx.adjust_exposure_action, "adjust_exposure");
  323. add_mappings(ctx.debug_action_map, ctx.adjust_time_action, "adjust_time");
  324. }
  325. void setup_game_controls(::game& ctx)
  326. {
  327. // Setup pause control
  328. ctx.movement_action_subscriptions.emplace_back
  329. (
  330. ctx.pause_action.get_activated_channel().subscribe
  331. (
  332. [&ctx](const auto& event)
  333. {
  334. if (!ctx.resume_callback)
  335. {
  336. // Queue disable game controls and push pause state
  337. ctx.function_queue.push
  338. (
  339. [&ctx]()
  340. {
  341. // Disable game controls
  342. ::disable_game_controls(ctx);
  343. // Push pause menu state
  344. ctx.state_machine.emplace(std::make_unique<pause_menu_state>(ctx));
  345. }
  346. );
  347. // Set resume callback
  348. ctx.resume_callback = [&ctx]()
  349. {
  350. enable_game_controls(ctx);
  351. ctx.resume_callback = nullptr;
  352. };
  353. }
  354. }
  355. )
  356. );
  357. }
  358. void enable_game_controls(::game& ctx)
  359. {
  360. ctx.movement_action_map.enable();
  361. }
  362. void disable_game_controls(::game& ctx)
  363. {
  364. ctx.movement_action_map.disable();
  365. ctx.move_forward_action.reset();
  366. ctx.move_back_action.reset();
  367. ctx.move_left_action.reset();
  368. ctx.move_right_action.reset();
  369. ctx.move_up_action.reset();
  370. ctx.move_down_action.reset();
  371. ctx.move_fast_action.reset();
  372. ctx.move_slow_action.reset();
  373. ctx.pause_action.reset();
  374. }