diff --git a/data/default_ammo.json b/data/default_ammo.json index 7233f13..5b6fe29 100644 --- a/data/default_ammo.json +++ b/data/default_ammo.json @@ -27,7 +27,7 @@ "EdgeDensity": 0.2, "InitialTemperature": 2400.0, "BuoyancyFactor": 0.6, - "EffectiveConcentration": 0.0002, + "EffectiveConcentration": 0.0001, "MaxRadius": 80.0, "MaxDuration": 90.0, "SourceStrength": 12.0, diff --git a/src/CounterDrone.Core/Algorithms/ActiveFuelDamageModel.cs b/src/CounterDrone.Core/Algorithms/ActiveFuelDamageModel.cs index 7aace33..f97279f 100644 --- a/src/CounterDrone.Core/Algorithms/ActiveFuelDamageModel.cs +++ b/src/CounterDrone.Core/Algorithms/ActiveFuelDamageModel.cs @@ -14,10 +14,7 @@ namespace CounterDrone.Core.Algorithms AerosolType aerosolType, float cloudDensity, float exposureTime, float deltaTime) { if (aerosolType != AerosolType.ActiveFuel) return 0f; - if (cloudDensity < EffectiveThreshold) return 0f; - // 伤害 = 基础速率 × e^(暴露时间 × 因子) × deltaTime - // 在云团中待得越久伤害指数增长 var exponential = (float)System.Math.Exp(exposureTime * ExpFactor); var damage = BaseRate * exponential * deltaTime; diff --git a/src/CounterDrone.Core/Algorithms/ActiveMaterialDamageModel.cs b/src/CounterDrone.Core/Algorithms/ActiveMaterialDamageModel.cs index ec39af1..44f2049 100644 --- a/src/CounterDrone.Core/Algorithms/ActiveMaterialDamageModel.cs +++ b/src/CounterDrone.Core/Algorithms/ActiveMaterialDamageModel.cs @@ -15,9 +15,7 @@ namespace CounterDrone.Core.Algorithms AerosolType aerosolType, float cloudDensity, float exposureTime, float deltaTime) { if (aerosolType != AerosolType.ActiveMaterial) return 0f; - if (cloudDensity < TriggerThreshold) return 0f; - // 喷气发动机高温触发爆燃,更敏感 if (!_triggered) { _triggered = true; diff --git a/src/CounterDrone.Core/Algorithms/CloudExpansionModel.cs b/src/CounterDrone.Core/Algorithms/CloudExpansionModel.cs index 86aa15a..f53c4b2 100644 --- a/src/CounterDrone.Core/Algorithms/CloudExpansionModel.cs +++ b/src/CounterDrone.Core/Algorithms/CloudExpansionModel.cs @@ -17,6 +17,12 @@ namespace CounterDrone.Core.Algorithms /// Phase 1 爆轰初始半径 (m) public float InitialRadius => 3.3f * (float)Math.Pow(Math.Max(0.01, (float)_ammo.BurstChargeKg), 0.32f); + /// Phase 2 结束时的有效半径(30s 湍流膨胀) + public float TurbulentRadius => RadiusAt(30f); + + /// Phase 2 边界时间 + public float Phase2Duration => 30f; + /// 湍流膨胀系数 k public float TurbulentExpansionK => (float)_ammo.TurbulentExpansionK; /// 指定时刻湍流膨胀半径 R(t) = R₀ + k√t @@ -64,7 +70,7 @@ namespace CounterDrone.Core.Algorithms /// 覆盖指定距离需要的云团数量(间距=2R) public int RoundsNeeded(float requiredCoverage) { - float R = RadiusAt(30f); + float R = TurbulentRadius; float spacing = 2f * R; return Math.Max(1, (int)Math.Ceiling(requiredCoverage / spacing)); } diff --git a/src/CounterDrone.Core/Algorithms/DefaultAmmunition.cs b/src/CounterDrone.Core/Algorithms/DefaultAmmunition.cs index 4dc898a..4d1dfa1 100644 --- a/src/CounterDrone.Core/Algorithms/DefaultAmmunition.cs +++ b/src/CounterDrone.Core/Algorithms/DefaultAmmunition.cs @@ -33,7 +33,7 @@ namespace CounterDrone.Core.Algorithms InitialRadius = 5.0, CoreDensity = 2.0, EdgeDensity = 0.2, InitialTemperature = 2400, BuoyancyFactor = 0.6, - EffectiveConcentration = 0.0002, + EffectiveConcentration = 0.0001, MaxRadius = 80.0, MaxDuration = 90.0, SourceStrength = 12.0, BurstChargeKg = 4.0, TurbulentExpansionK = 4.0, diff --git a/src/CounterDrone.Core/Algorithms/DefaultDefensePlanner.cs b/src/CounterDrone.Core/Algorithms/DefaultDefensePlanner.cs index cfcdcff..85c5653 100644 --- a/src/CounterDrone.Core/Algorithms/DefaultDefensePlanner.cs +++ b/src/CounterDrone.Core/Algorithms/DefaultDefensePlanner.cs @@ -396,7 +396,12 @@ namespace CounterDrone.Core.Algorithms var mid = ThreatMidpoint(threat); var cloudModel = new CloudExpansionModel(ammo, env); - float expansionTime = cloudModel.TimeToReach(cloudModel.RadiusAt(30f)); + float expansionTime = cloudModel.TimeToReach(cloudModel.TurbulentRadius); + + // 密度检查:云团在膨胀时间后密度是否仍达标 + float densityAtPassage = cloudModel.DensityAt(expansionTime); + if (densityAtPassage < (float)ammo.EffectiveConcentration) + return events; // 云团到达时已稀释失效 // 编队 Y 偏移:按车道分布 float laneSpacingZ = yLanes > 1 ? formationWidth / (yLanes - 1) : 0f; diff --git a/src/CounterDrone.Core/Algorithms/InertGasDamageModel.cs b/src/CounterDrone.Core/Algorithms/InertGasDamageModel.cs index 8a32095..860fadb 100644 --- a/src/CounterDrone.Core/Algorithms/InertGasDamageModel.cs +++ b/src/CounterDrone.Core/Algorithms/InertGasDamageModel.cs @@ -13,9 +13,6 @@ namespace CounterDrone.Core.Algorithms AerosolType aerosolType, float cloudDensity, float exposureTime, float deltaTime) { if (aerosolType != AerosolType.InertGas) return 0f; - if (cloudDensity < EffectiveThreshold) return 0f; - - // 活塞发动机对惰性气体最敏感 var sensitivity = powerType == PowerType.Piston ? 1.5f : 1.0f; return DamageRate * sensitivity * deltaTime; } diff --git a/src/CounterDrone.Core/Simulation/SimulationEngine.cs b/src/CounterDrone.Core/Simulation/SimulationEngine.cs index 045aee9..157b657 100644 --- a/src/CounterDrone.Core/Simulation/SimulationEngine.cs +++ b/src/CounterDrone.Core/Simulation/SimulationEngine.cs @@ -253,7 +253,7 @@ namespace CounterDrone.Core.Simulation var dist = (float)System.Math.Sqrt(dx * dx + dy * dy + dz * dz); bool inside = dist <= cloud.Dispersion.EffectiveRadius; _hitLog.AppendLine($"{drone.PosX:F1},{drone.PosY:F1},{cloud.Dispersion.Center.X:F1},{cloud.Dispersion.Center.Y:F1},{dist:F1},{cloud.Dispersion.EffectiveRadius:F1},{inside}"); - if (inside) + if (inside && cloud.Dispersion.CoreDensity >= (float)_ammoSpec.EffectiveConcentration) { drone.ExposureTime += scaledDt; var dmg = _damageModel.CalculateDamage(drone.TargetType, drone.PowerType, cloud.AerosolType, cloud.Dispersion.CoreDensity, drone.ExposureTime, scaledDt);