| | | 1 | | using System; |
| | | 2 | | using CounterDrone.Core.Models; |
| | | 3 | | |
| | | 4 | | namespace CounterDrone.Core.Algorithms |
| | | 5 | | { |
| | | 6 | | /// <summary>爆燃式 — 触发型:双条件满足后瞬间高伤害</summary> |
| | | 7 | | public class ActiveMaterialDamageModel : IDamageModel |
| | | 8 | | { |
| | | 9 | | private const float TriggerThreshold = 0.1f; // 触发浓度阈值 |
| | | 10 | | private const float BurstDamage = 0.85f; // 一次爆发伤害 |
| | | 11 | | private const float ResidualRate = 0.05f; // 后续余伤速率 |
| | | 12 | | private bool _triggered; |
| | | 13 | | |
| | | 14 | | public float CalculateDamage(TargetType droneType, PowerType powerType, |
| | | 15 | | AerosolType aerosolType, float cloudDensity, float exposureTime, float deltaTime) |
| | 5 | 16 | | { |
| | 5 | 17 | | if (aerosolType != AerosolType.ActiveMaterial) return 0f; |
| | 5 | 18 | | if (cloudDensity < TriggerThreshold) return 0f; |
| | | 19 | | |
| | | 20 | | // 喷气发动机高温触发爆燃,更敏感 |
| | 5 | 21 | | if (!_triggered) |
| | 4 | 22 | | { |
| | 4 | 23 | | _triggered = true; |
| | 4 | 24 | | var sensitivity = powerType == PowerType.Jet ? 1.3f : 1.0f; |
| | 4 | 25 | | return BurstDamage * sensitivity; |
| | | 26 | | } |
| | | 27 | | |
| | 1 | 28 | | return ResidualRate * deltaTime; |
| | 5 | 29 | | } |
| | | 30 | | |
| | | 31 | | public DamageStage GetDamageStage(float accumulatedDamage) |
| | 0 | 32 | | { |
| | 0 | 33 | | if (accumulatedDamage >= 1.0f) return DamageStage.Destroyed; |
| | 0 | 34 | | if (accumulatedDamage >= 0.5f) return DamageStage.AttitudeLoss; // 爆燃后更快进入失控 |
| | 0 | 35 | | if (accumulatedDamage >= 0.2f) return DamageStage.EngineAnomaly; |
| | 0 | 36 | | return DamageStage.Normal; |
| | 0 | 37 | | } |
| | | 38 | | } |
| | | 39 | | } |