component.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. #pragma once
  2. #include "../units/spawn_type.h"
  3. #include "../units/troop_type.h"
  4. #include "entity.h"
  5. #include <array>
  6. #include <cstdint>
  7. #include <optional>
  8. #include <string>
  9. #include <utility>
  10. #include <vector>
  11. namespace Engine::Core {
  12. namespace Defaults {
  13. inline constexpr int kUnitDefaultHealth = 100;
  14. inline constexpr float kUnitDefaultVisionRange = 12.0F;
  15. inline constexpr float kAttackDefaultRange = 2.0F;
  16. inline constexpr int kAttackDefaultDamage = 10;
  17. inline constexpr float kAttackMeleeRange = 1.5F;
  18. inline constexpr float kAttackHeightTolerance = 2.0F;
  19. inline constexpr float kProductionDefaultBuildTime = 4.0F;
  20. inline constexpr int kProductionMaxUnits = 5;
  21. inline constexpr float kCaptureRequiredTime = 15.0F;
  22. inline constexpr float kHoldStandUpDuration = 2.0F;
  23. } // namespace Defaults
  24. class TransformComponent : public Component {
  25. public:
  26. TransformComponent(float x = 0.0F, float y = 0.0F, float z = 0.0F,
  27. float rotX = 0.0F, float rotY = 0.0F, float rotZ = 0.0F,
  28. float scale_x = 1.0F, float scaleY = 1.0F,
  29. float scale_z = 1.0F)
  30. : position{x, y, z}, rotation{rotX, rotY, rotZ},
  31. scale{scale_x, scaleY, scale_z} {}
  32. struct Vec3 {
  33. float x, y, z;
  34. };
  35. Vec3 position;
  36. Vec3 rotation;
  37. Vec3 scale;
  38. float desiredYaw = 0.0F;
  39. bool hasDesiredYaw = false;
  40. };
  41. class RenderableComponent : public Component {
  42. public:
  43. enum class MeshKind { None, Quad, Plane, Cube, Capsule, Ring };
  44. RenderableComponent(std::string meshPath, std::string texturePath)
  45. : meshPath(std::move(meshPath)), texturePath(std::move(texturePath)) {
  46. color.fill(1.0F);
  47. }
  48. std::string meshPath;
  49. std::string texturePath;
  50. std::string rendererId;
  51. bool visible{true};
  52. MeshKind mesh{MeshKind::Cube};
  53. std::array<float, 3> color{};
  54. };
  55. class UnitComponent : public Component {
  56. public:
  57. UnitComponent(int health = Defaults::kUnitDefaultHealth,
  58. int max_health = Defaults::kUnitDefaultHealth,
  59. float speed = 1.0F,
  60. float vision = Defaults::kUnitDefaultVisionRange)
  61. : health(health), max_health(max_health), speed(speed),
  62. vision_range(vision) {}
  63. int health;
  64. int max_health;
  65. float speed;
  66. Game::Units::SpawnType spawn_type{Game::Units::SpawnType::Archer};
  67. int owner_id{0};
  68. float vision_range;
  69. std::string nation_id;
  70. };
  71. class MovementComponent : public Component {
  72. public:
  73. MovementComponent() = default;
  74. bool hasTarget{false};
  75. float target_x{0.0F}, target_y{0.0F};
  76. float goalX{0.0F}, goalY{0.0F};
  77. float vx{0.0F}, vz{0.0F};
  78. std::vector<std::pair<float, float>> path;
  79. bool pathPending{false};
  80. std::uint64_t pendingRequestId{0};
  81. float repathCooldown{0.0F};
  82. float lastGoalX{0.0F}, lastGoalY{0.0F};
  83. float timeSinceLastPathRequest{0.0F};
  84. };
  85. class AttackComponent : public Component {
  86. public:
  87. enum class CombatMode { Ranged, Melee, Auto };
  88. AttackComponent(float range = Defaults::kAttackDefaultRange,
  89. int damage = Defaults::kAttackDefaultDamage,
  90. float cooldown = 1.0F)
  91. : range(range), damage(damage), cooldown(cooldown),
  92. meleeRange(Defaults::kAttackMeleeRange), meleeDamage(damage),
  93. meleeCooldown(cooldown),
  94. max_heightDifference(Defaults::kAttackHeightTolerance) {}
  95. float range;
  96. int damage;
  97. float cooldown;
  98. float timeSinceLast{0.0F};
  99. float meleeRange;
  100. int meleeDamage;
  101. float meleeCooldown;
  102. CombatMode preferredMode{CombatMode::Auto};
  103. CombatMode currentMode{CombatMode::Ranged};
  104. bool canMelee{true};
  105. bool canRanged{false};
  106. float max_heightDifference;
  107. bool inMeleeLock{false};
  108. EntityID meleeLockTargetId{0};
  109. [[nodiscard]] auto isInMeleeRange(float distance,
  110. float height_diff) const -> bool {
  111. return distance <= meleeRange && height_diff <= max_heightDifference;
  112. }
  113. [[nodiscard]] auto isInRangedRange(float distance) const -> bool {
  114. return distance <= range && distance > meleeRange;
  115. }
  116. [[nodiscard]] auto getCurrentDamage() const -> int {
  117. return (currentMode == CombatMode::Melee) ? meleeDamage : damage;
  118. }
  119. [[nodiscard]] auto getCurrentCooldown() const -> float {
  120. return (currentMode == CombatMode::Melee) ? meleeCooldown : cooldown;
  121. }
  122. [[nodiscard]] auto getCurrentRange() const -> float {
  123. return (currentMode == CombatMode::Melee) ? meleeRange : range;
  124. }
  125. };
  126. class AttackTargetComponent : public Component {
  127. public:
  128. AttackTargetComponent() = default;
  129. EntityID target_id{0};
  130. bool shouldChase{false};
  131. };
  132. class PatrolComponent : public Component {
  133. public:
  134. PatrolComponent() = default;
  135. std::vector<std::pair<float, float>> waypoints;
  136. size_t currentWaypoint{0};
  137. bool patrolling{false};
  138. };
  139. } // namespace Engine::Core
  140. namespace Engine::Core {
  141. class BuildingComponent : public Component {
  142. public:
  143. BuildingComponent() = default;
  144. };
  145. class ProductionComponent : public Component {
  146. public:
  147. ProductionComponent()
  148. : buildTime(Defaults::kProductionDefaultBuildTime),
  149. maxUnits(Defaults::kProductionMaxUnits) {}
  150. bool inProgress{false};
  151. float buildTime;
  152. float timeRemaining{0.0F};
  153. int producedCount{0};
  154. int maxUnits;
  155. Game::Units::TroopType product_type{Game::Units::TroopType::Archer};
  156. float rallyX{0.0F}, rallyZ{0.0F};
  157. bool rallySet{false};
  158. int villagerCost{1};
  159. std::vector<Game::Units::TroopType> productionQueue;
  160. };
  161. class AIControlledComponent : public Component {
  162. public:
  163. AIControlledComponent() = default;
  164. };
  165. class CaptureComponent : public Component {
  166. public:
  167. CaptureComponent() : requiredTime(Defaults::kCaptureRequiredTime) {}
  168. int capturing_player_id{-1};
  169. float captureProgress{0.0F};
  170. float requiredTime;
  171. bool isBeingCaptured{false};
  172. };
  173. class PendingRemovalComponent : public Component {
  174. public:
  175. PendingRemovalComponent() = default;
  176. };
  177. class HoldModeComponent : public Component {
  178. public:
  179. HoldModeComponent() : standUpDuration(Defaults::kHoldStandUpDuration) {}
  180. bool active{true};
  181. float exitCooldown{0.0F};
  182. float standUpDuration;
  183. };
  184. } // namespace Engine::Core