diff options
author | Aki <please@ignore.pl> | 2022-11-20 00:54:28 +0100 |
---|---|---|
committer | Aki <please@ignore.pl> | 2022-11-20 00:54:28 +0100 |
commit | ec2f951152cd19ce861d9ae19f0bfac67595834c (patch) | |
tree | 0a5795c00bf2bfee72d21e5c9b76179c81a32138 | |
parent | 98982513f97f449fd200132d0f19130ab31e2c36 (diff) | |
download | kurator-ec2f951152cd19ce861d9ae19f0bfac67595834c.zip kurator-ec2f951152cd19ce861d9ae19f0bfac67595834c.tar.gz kurator-ec2f951152cd19ce861d9ae19f0bfac67595834c.tar.bz2 |
Implemented verbose damage modifier based on range
-rw-r--r-- | battles/src/BaseBattle.cpp | 19 | ||||
-rw-r--r-- | universe/include/kurator/universe/TurretType.h | 4 | ||||
-rw-r--r-- | universe/src/SampleRepository.cpp | 2 |
3 files changed, 20 insertions, 5 deletions
diff --git a/battles/src/BaseBattle.cpp b/battles/src/BaseBattle.cpp index e102d79..604a607 100644 --- a/battles/src/BaseBattle.cpp +++ b/battles/src/BaseBattle.cpp @@ -1,5 +1,8 @@ #include "BaseBattle.h" +#include <algorithm> +#include <cmath> + #include <entt/entity/registry.hpp> #include <entt/signal/dispatcher.hpp> @@ -105,6 +108,15 @@ BaseBattle::floating_movement(const float dt) } +double +effective_damage(const universe::TurretType& def, const double distance) +{ + const auto overflow = distance - def.optimal_range; + const auto falloff = std::max(0.0, overflow / def.optimal_range / def.falloff_modifier); + return def.base_damage * std::pow(def.falloff_intensity, std::pow(falloff, 2)); +} + + void BaseBattle::turrets(const float dt) { @@ -123,9 +135,10 @@ BaseBattle::turrets(const float dt) auto& target_points = _registry.get<HitPoints>(state.target); const auto& target = _registry.get<Transform>(state.target); const auto distance = transform.position - target.position; - if (def.range > distance.magnitude()) { - target_points.health -= def.base_damage; - _dispatcher.trigger(Hit{def.base_damage, entity, state.target}); + const auto damage = effective_damage(def, distance.magnitude()); + if (damage > 0.0) { + target_points.health -= damage; + _dispatcher.trigger(Hit{damage, entity, state.target}); } control.reload = def.rate_of_fire; } diff --git a/universe/include/kurator/universe/TurretType.h b/universe/include/kurator/universe/TurretType.h index b3a6eb2..7723d88 100644 --- a/universe/include/kurator/universe/TurretType.h +++ b/universe/include/kurator/universe/TurretType.h @@ -14,7 +14,9 @@ struct TurretType std::string name; double base_damage; double rate_of_fire; - double range; + double optimal_range; + double falloff_modifier; + double falloff_intensity; }; diff --git a/universe/src/SampleRepository.cpp b/universe/src/SampleRepository.cpp index 1d875e7..2886e3d 100644 --- a/universe/src/SampleRepository.cpp +++ b/universe/src/SampleRepository.cpp @@ -23,7 +23,7 @@ static const std::unordered_map<std::string, ShipType> ships { static const std::unordered_map<std::string, TurretType> turrets { - {"cannon", {"Cannon", 1.0, 1.0, 1.2}}, + {"cannon", {"Cannon", 1.0, 1.0, 1.5, 0.5, 0.2}}, }; |