command_service.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #pragma once
  2. #include <QVector3D>
  3. #include <atomic>
  4. #include <cstdint>
  5. #include <memory>
  6. #include <mutex>
  7. #include <unordered_map>
  8. #include <vector>
  9. namespace Engine::Core {
  10. class World;
  11. using EntityID = unsigned int;
  12. struct MovementComponent;
  13. } // namespace Engine::Core
  14. namespace Game::Systems {
  15. class Pathfinding;
  16. struct Point;
  17. class CommandService {
  18. public:
  19. struct MoveOptions {
  20. bool allow_direct_fallback = true;
  21. bool clear_attack_intent = true;
  22. bool group_move = false;
  23. };
  24. static constexpr int DIRECT_PATH_THRESHOLD = 8;
  25. static constexpr float WAYPOINT_SKIP_THRESHOLD_SQ = 0.16F;
  26. static void initialize(int world_width, int world_height);
  27. static auto get_pathfinder() -> Pathfinding *;
  28. static auto world_to_grid(float world_x, float world_z) -> Point;
  29. static auto grid_to_world(const Point &grid_pos) -> QVector3D;
  30. static auto get_unit_radius(Engine::Core::World &world,
  31. Engine::Core::EntityID entity_id) -> float;
  32. static void move_units(Engine::Core::World &world,
  33. const std::vector<Engine::Core::EntityID> &units,
  34. const std::vector<QVector3D> &targets);
  35. static void move_units(Engine::Core::World &world,
  36. const std::vector<Engine::Core::EntityID> &units,
  37. const std::vector<QVector3D> &targets,
  38. const MoveOptions &options);
  39. static void process_path_results(Engine::Core::World &world);
  40. static void attack_target(Engine::Core::World &world,
  41. const std::vector<Engine::Core::EntityID> &units,
  42. Engine::Core::EntityID target_id,
  43. bool should_chase = true);
  44. private:
  45. struct PendingPathRequest {
  46. Engine::Core::EntityID entity_id{};
  47. QVector3D target;
  48. MoveOptions options;
  49. std::vector<Engine::Core::EntityID> group_members;
  50. std::vector<QVector3D> group_targets;
  51. float unit_radius{0.0F};
  52. };
  53. static std::unique_ptr<Pathfinding> s_pathfinder;
  54. static std::unordered_map<std::uint64_t, PendingPathRequest>
  55. s_pending_requests;
  56. static std::unordered_map<Engine::Core::EntityID, std::uint64_t>
  57. s_entity_to_request;
  58. static std::mutex s_pending_mutex;
  59. static std::atomic<std::uint64_t> s_next_request_id;
  60. static void clear_pending_request(Engine::Core::EntityID entity_id);
  61. static void move_group(Engine::Core::World &world,
  62. const std::vector<Engine::Core::EntityID> &units,
  63. const std::vector<QVector3D> &targets,
  64. const MoveOptions &options);
  65. };
  66. } // namespace Game::Systems