hit_feedback_processor.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "hit_feedback_processor.h"
  2. #include "../../core/component.h"
  3. #include "../../core/world.h"
  4. #include "../camera_visibility_service.h"
  5. #include "combat_types.h"
  6. #include <cmath>
  7. namespace Game::Systems::Combat {
  8. void process_hit_feedback(Engine::Core::World *world, float delta_time) {
  9. auto units = world->get_entities_with<Engine::Core::HitFeedbackComponent>();
  10. auto &visibility = CameraVisibilityService::instance();
  11. for (auto *unit : units) {
  12. if (unit->has_component<Engine::Core::PendingRemovalComponent>()) {
  13. continue;
  14. }
  15. auto *feedback = unit->get_component<Engine::Core::HitFeedbackComponent>();
  16. if (feedback == nullptr || !feedback->is_reacting) {
  17. continue;
  18. }
  19. feedback->reaction_time += delta_time;
  20. float const progress =
  21. feedback->reaction_time /
  22. Engine::Core::HitFeedbackComponent::kReactionDuration;
  23. if (progress >= 1.0F) {
  24. feedback->is_reacting = false;
  25. feedback->reaction_time = 0.0F;
  26. feedback->reaction_intensity = 0.0F;
  27. feedback->knockback_x = 0.0F;
  28. feedback->knockback_z = 0.0F;
  29. } else {
  30. auto *transform = unit->get_component<Engine::Core::TransformComponent>();
  31. if (transform != nullptr) {
  32. if (!visibility.should_process_detailed_effects(
  33. transform->position.x, transform->position.y,
  34. transform->position.z)) {
  35. continue;
  36. }
  37. float const fade = 1.0F - progress;
  38. float const dx = feedback->knockback_x * fade * delta_time;
  39. float const dz = feedback->knockback_z * fade * delta_time;
  40. float const displacement = std::sqrt(dx * dx + dz * dz);
  41. float const scale =
  42. (displacement > Constants::k_max_displacement_per_frame &&
  43. displacement > 0.0001F)
  44. ? Constants::k_max_displacement_per_frame / displacement
  45. : 1.0F;
  46. transform->position.x += dx * scale;
  47. transform->position.z += dz * scale;
  48. }
  49. }
  50. }
  51. }
  52. } // namespace Game::Systems::Combat