diff --git a/data/defaults.json b/data/defaults.json index 45a234d..bca4cda 100644 --- a/data/defaults.json +++ b/data/defaults.json @@ -118,6 +118,38 @@ } ], + "launchPlatforms": [ + { + "Id": "ground-light", "Name": "[Demo] 轻型地基发射平台", + "Description": "4通道轻型平台,800m/s初速", + "PlatformType": 1, "GunCount": 4, "ChannelsPerGun": 4, "ChannelInterval": 0.1, + "Cooldown": 5.0, "AmmoChangeTime": 30.0, "MuzzleVelocity": 800.0, + "AmmoTypes": [0, 1] + }, + { + "Id": "ground-standard", "Name": "[Demo] 标准地基发射平台", + "Description": "4通道标准平台,800m/s初速", + "PlatformType": 1, "GunCount": 4, "ChannelsPerGun": 4, "ChannelInterval": 0.1, + "Cooldown": 5.0, "AmmoChangeTime": 30.0, "MuzzleVelocity": 800.0, + "AmmoTypes": [0, 1] + }, + { + "Id": "ground-heavy", "Name": "[Demo] 重型地基发射平台", + "Description": "6通道重型平台,600m/s初速,支持全弹种", + "PlatformType": 1, "GunCount": 6, "ChannelsPerGun": 4, "ChannelInterval": 1.0, + "Cooldown": 5.0, "AmmoChangeTime": 30.0, "MuzzleVelocity": 600.0, + "AmmoTypes": [0, 1, 2] + }, + { + "Id": "air-standard", "Name": "[Demo] 标准空基发射平台", + "Description": "8通道空基平台,80m/s巡航", + "PlatformType": 0, "GunCount": 1, "ChannelsPerGun": 8, "ChannelInterval": 1.0, + "Cooldown": 5.0, "AmmoChangeTime": 30.0, + "MuzzleVelocity": 80.0, "CruiseSpeed": 80.0, "ReleaseAltitude": 1000.0, + "AmmoTypes": [0, 1] + } + ], + "drones": [ { "Id": "quadcopter", "Name": "[Demo] 小型四旋翼(DJI类)", "Model": "DJI Mavic 类", "Description": "小型四旋翼,低空侦察", diff --git a/src/CounterDrone.Core/DatabaseManager.cs b/src/CounterDrone.Core/DatabaseManager.cs index 706b1d9..60bc11c 100644 --- a/src/CounterDrone.Core/DatabaseManager.cs +++ b/src/CounterDrone.Core/DatabaseManager.cs @@ -63,6 +63,7 @@ namespace CounterDrone.Core // 插入或更新默认数据(按 Id 覆盖,不删除用户自建数据) foreach (var a in defaults.Ammunition) db.InsertOrReplace(a); foreach (var f in defaults.FireUnits) db.InsertOrReplace(f); + foreach (var l in defaults.LaunchPlatforms) db.InsertOrReplace(l); foreach (var d in defaults.Drones) db.InsertOrReplace(d); foreach (var s in defaults.Sensors) db.InsertOrReplace(s); foreach (var e in defaults.Environments) db.InsertOrReplace(e); @@ -118,6 +119,7 @@ namespace CounterDrone.Core db.CreateTable(); db.CreateTable(); db.CreateTable(); + db.CreateTable(); db.CreateTable(); db.CreateTable(); db.CreateTable(); diff --git a/src/CounterDrone.Core/DefaultData.cs b/src/CounterDrone.Core/DefaultData.cs index 3b291b1..ac2a3e6 100644 --- a/src/CounterDrone.Core/DefaultData.cs +++ b/src/CounterDrone.Core/DefaultData.cs @@ -19,6 +19,8 @@ namespace CounterDrone.Core public List Routes { get; set; } = new(); [System.Text.Json.Serialization.JsonPropertyName("fireUnits")] public List FireUnits { get; set; } = new(); + [System.Text.Json.Serialization.JsonPropertyName("launchPlatforms")] + public List LaunchPlatforms { get; set; } = new(); [System.Text.Json.Serialization.JsonPropertyName("drones")] public List Drones { get; set; } = new(); [System.Text.Json.Serialization.JsonPropertyName("detectionEquipment")] @@ -59,6 +61,8 @@ namespace CounterDrone.Core throw new InvalidOperationException($"默认数据缺少 routes: {source}"); if (data.FireUnits == null || data.FireUnits.Count == 0) throw new InvalidOperationException($"默认数据缺少 fireUnits: {source}"); + if (data.LaunchPlatforms == null || data.LaunchPlatforms.Count == 0) + throw new InvalidOperationException($"默认数据缺少 launchPlatforms: {source}"); if (data.Drones == null || data.Drones.Count == 0) throw new InvalidOperationException($"默认数据缺少 drones: {source}"); if (data.Environments == null || data.Environments.Count == 0) diff --git a/src/CounterDrone.Core/Models/FireUnitSpec.cs b/src/CounterDrone.Core/Models/FireUnitSpec.cs index 2840b1d..eaed87c 100644 --- a/src/CounterDrone.Core/Models/FireUnitSpec.cs +++ b/src/CounterDrone.Core/Models/FireUnitSpec.cs @@ -38,7 +38,7 @@ namespace CounterDrone.Core.Models { return new ScenarioUnit { - FireUnitSpecId = Id, + LaunchPlatformSpecId = Id, EquipmentRole = (int)Models.EquipmentRole.LaunchPlatform, Quantity = quantity, PositionX = posX, diff --git a/src/CounterDrone.Core/Models/LaunchPlatformSpec.cs b/src/CounterDrone.Core/Models/LaunchPlatformSpec.cs new file mode 100644 index 0000000..c9436e3 --- /dev/null +++ b/src/CounterDrone.Core/Models/LaunchPlatformSpec.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using CounterDrone.Core.Models; +using SQLite; + +namespace CounterDrone.Core.Models +{ + /// 搭载/发射平台规格(基础数据模板) + [Table("LaunchPlatformSpec")] + public class LaunchPlatformSpec + { + [PrimaryKey] + public string Id { get; set; } = ""; + public string Name { get; set; } = ""; + public string Description { get; set; } = ""; + public int PlatformType { get; set; } + public int GunCount { get; set; } = 1; + public int ChannelsPerGun { get; set; } = 1; + public double ChannelInterval { get; set; } = 1.0; + public double Cooldown { get; set; } = 5.0; + public double AmmoChangeTime { get; set; } = 30.0; + public double MuzzleVelocity { get; set; } + public double CruiseSpeed { get; set; } + public double ReleaseAltitude { get; set; } + public string ModelId { get; set; } = ""; + [Ignore] + public List AmmoTypes { get; set; } = new(); + + public ScenarioUnit ToScenarioUnit(AerosolType ammoType, int quantity, + double posX, double posY, double posZ) + { + return new ScenarioUnit + { + LaunchPlatformSpecId = Id, + EquipmentRole = (int)Models.EquipmentRole.LaunchPlatform, + Quantity = quantity, + PositionX = posX, + PositionY = posY, + PositionZ = posZ, + AerosolType = (int)ammoType, + MunitionCount = GunCount * ChannelsPerGun * quantity, + }; + } + } +} diff --git a/src/CounterDrone.Core/Models/ScenarioUnit.cs b/src/CounterDrone.Core/Models/ScenarioUnit.cs index 86306a6..39e8dba 100644 --- a/src/CounterDrone.Core/Models/ScenarioUnit.cs +++ b/src/CounterDrone.Core/Models/ScenarioUnit.cs @@ -14,8 +14,8 @@ namespace CounterDrone.Core.Models [Indexed] public string ScenarioId { get; set; } = string.Empty; - /// 外键 → FireUnitSpec(发射平台) - public string FireUnitSpecId { get; set; } = string.Empty; + /// 外键 → LaunchPlatformSpec(发射平台) + public string LaunchPlatformSpecId { get; set; } = string.Empty; /// 外键 → SensorSpec(探测设备) public string SensorSpecId { get; set; } = string.Empty; diff --git a/src/CounterDrone.Core/Services/ReportGenerator.cs b/src/CounterDrone.Core/Services/ReportGenerator.cs index 509969e..98daf2a 100644 --- a/src/CounterDrone.Core/Services/ReportGenerator.cs +++ b/src/CounterDrone.Core/Services/ReportGenerator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -13,7 +13,7 @@ namespace CounterDrone.Core.Services public string Generate(ScenarioConfig config, List events, Simulation.DroneStatus finalDroneStatus, float simulationDuration, Dictionary droneSpecs, - Dictionary fireUnitSpecs, + Dictionary fireUnitSpecs, Dictionary sensorSpecs) { var sb = new StringBuilder(); @@ -116,7 +116,7 @@ namespace CounterDrone.Core.Services { var eq = config.Units[ei]; if (eq.EquipmentRole != (int)EquipmentRole.LaunchPlatform) continue; - fireUnitSpecs.TryGetValue(eq.FireUnitSpecId, out var fuSpec); + fireUnitSpecs.TryGetValue(eq.LaunchPlatformSpecId, out var fuSpec); int channels = (fuSpec?.GunCount ?? 1) * (fuSpec?.ChannelsPerGun ?? 1); for (int j = 0; j < eq.Quantity; j++) { @@ -141,7 +141,7 @@ namespace CounterDrone.Core.Services int unitNum2 = 0; foreach (var eq in config.Units.Where(e => e.EquipmentRole == (int)EquipmentRole.LaunchPlatform)) { - fireUnitSpecs.TryGetValue(eq.FireUnitSpecId, out var fuSpec); + fireUnitSpecs.TryGetValue(eq.LaunchPlatformSpecId, out var fuSpec); int channels = (fuSpec?.GunCount ?? 1) * (fuSpec?.ChannelsPerGun ?? 1); for (int j = 0; j < eq.Quantity; j++) { diff --git a/src/CounterDrone.Core/Services/ReportService.cs b/src/CounterDrone.Core/Services/ReportService.cs index 888d291..b6f3a52 100644 --- a/src/CounterDrone.Core/Services/ReportService.cs +++ b/src/CounterDrone.Core/Services/ReportService.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -24,7 +24,7 @@ namespace CounterDrone.Core.Services List events, string finalDroneStatus, float duration) { var droneSpecs = _db.Table().ToDictionary(d => d.Id); - var fireUnitSpecs = _db.Table().ToDictionary(f => f.Id); + var fireUnitSpecs = _db.Table().ToDictionary(f => f.Id); var sensorSpecs = _db.Table().ToDictionary(s => s.Id); var destroyed = events.Count(e => e.Type == SimEventType.DroneDestroyed); diff --git a/src/CounterDrone.Core/Simulation/PlatformEntity.cs b/src/CounterDrone.Core/Simulation/PlatformEntity.cs index 421497b..b656eda 100644 --- a/src/CounterDrone.Core/Simulation/PlatformEntity.cs +++ b/src/CounterDrone.Core/Simulation/PlatformEntity.cs @@ -49,7 +49,7 @@ namespace CounterDrone.Core.Simulation /// Ready 包含:冷却就绪 + 有弹药 + 非飞行中 public bool Ready => CooldownRemaining <= 0 && MunitionCount > 0 && State != PlatformState.FlyingToTarget; - public PlatformEntity(string id, FireUnitSpec spec, ScenarioUnit deployment) + public PlatformEntity(string id, LaunchPlatformSpec spec, ScenarioUnit deployment) { Id = id; Role = (EquipmentRole)deployment.EquipmentRole; diff --git a/src/CounterDrone.Core/Simulation/SimulationEngine.cs b/src/CounterDrone.Core/Simulation/SimulationEngine.cs index 87d4833..2006f41 100644 --- a/src/CounterDrone.Core/Simulation/SimulationEngine.cs +++ b/src/CounterDrone.Core/Simulation/SimulationEngine.cs @@ -50,7 +50,7 @@ namespace CounterDrone.Core.Simulation private float _disperseHeight; private AmmunitionSpec _ammoSpec = new(); private Dictionary _droneSpecs = new(); - private Dictionary _fireUnitSpecs = new(); + private Dictionary _launchPlatformSpecs = new(); private Dictionary _sensorSpecs = new(); private int _tickRate = 20; private readonly List _fireSchedule = new(); @@ -102,7 +102,7 @@ namespace CounterDrone.Core.Simulation _ammoSpec = specDb.Table() .FirstOrDefault(a => a.AerosolType == config.Cloud.AerosolType); _droneSpecs = specDb.Table().ToDictionary(d => d.Id); - _fireUnitSpecs = specDb.Table().ToDictionary(f => f.Id); + _launchPlatformSpecs = specDb.Table().ToDictionary(f => f.Id); _sensorSpecs = specDb.Table().ToDictionary(s => s.Id); } if (_ammoSpec == null || _ammoSpec.Id == null) @@ -139,7 +139,7 @@ namespace CounterDrone.Core.Simulation { if (equip.EquipmentRole != (int)EquipmentRole.Detection) { - if (!_fireUnitSpecs.TryGetValue(equip.FireUnitSpecId, out var fuSpec)) continue; + if (!_launchPlatformSpecs.TryGetValue(equip.LaunchPlatformSpecId, out var fuSpec)) continue; for (int i = 0; i < equip.Quantity; i++) { int gunCount = fuSpec.GunCount; @@ -158,7 +158,7 @@ namespace CounterDrone.Core.Simulation // 探测设备运行时实体 _detectionEntities.Clear(); - var detectionSrcs = BuildDetectionSources(config, _fireUnitSpecs, _sensorSpecs); + var detectionSrcs = BuildDetectionSources(config, _sensorSpecs); int detIdx = 0; foreach (var src in detectionSrcs) _detectionEntities.Add(new DetectionEntity($"det_{++detIdx}", src, src.ModelId)); @@ -174,11 +174,11 @@ namespace CounterDrone.Core.Simulation // 自动从 Planner 生成发射计划 if (_fireSchedule.Count == 0) { - var fireUnits = BuildFireUnits(config, _fireUnitSpecs); + var fireUnits = BuildFireUnits(config, _launchPlatformSpecs); var threats = BuildDroneWaves(config, _droneSpecs); if (fireUnits.Count > 0 && threats.Count > 0) { - var detectionSources = BuildDetectionSources(config, _fireUnitSpecs, _sensorSpecs); + var detectionSources = BuildDetectionSources(config, _sensorSpecs); var result = _planner.Plan(fireUnits, threats, _scene, detectionSources); SetFireSchedule(result.Best.MergedSchedule); if (_fireSchedule.Count == 0) @@ -440,12 +440,12 @@ namespace CounterDrone.Core.Simulation public void Resume() { if (State == SimulationState.Paused) State = SimulationState.Running; } public void Stop() { State = SimulationState.Stopped; _frameStore.Flush(); } - private List BuildFireUnits(ScenarioConfig config, Dictionary specs) + private List BuildFireUnits(ScenarioConfig config, Dictionary specs) { var units = new List(); foreach (var eq in config.Units.Where(e => e.EquipmentRole == (int)EquipmentRole.LaunchPlatform)) { - if (!specs.TryGetValue(eq.FireUnitSpecId, out var spec)) continue; + if (!specs.TryGetValue(eq.LaunchPlatformSpecId, out var spec)) continue; int qty = Math.Max(1, eq.Quantity); for (int i = 0; i < qty; i++) { @@ -463,66 +463,37 @@ namespace CounterDrone.Core.Simulation TotalMunitions = eq.MunitionCount ?? spec.GunCount * spec.ChannelsPerGun, AmmoTypes = new List { (AerosolType)(eq.AerosolType ?? 0) }, Cooldown = (float)spec.Cooldown, - RadarRange = (float)spec.RadarRange, - EORange = (float)spec.EORange, - IRRange = (float)spec.IRRange, }); } } return units; } - private static List BuildDetectionSources(ScenarioConfig config, Dictionary fuSpecs, Dictionary sensorSpecs) + private static List BuildDetectionSources(ScenarioConfig config, Dictionary sensorSpecs) { var sources = new List(); foreach (var eq in config.Units) { - // Launch platform: get detection from FireUnitSpec - if (eq.EquipmentRole == (int)EquipmentRole.LaunchPlatform) + if (string.IsNullOrEmpty(eq.SensorSpecId)) continue; + if (!sensorSpecs.TryGetValue(eq.SensorSpecId, out var sensor)) continue; + bool hasDetection = sensor.RadarRange > 0 || sensor.EORange > 0 || sensor.IRRange > 0; + if (!hasDetection) continue; + int qty = Math.Max(1, eq.Quantity); + for (int i = 0; i < qty; i++) { - if (!fuSpecs.TryGetValue(eq.FireUnitSpecId, out var spec)) continue; - bool hasDetection = spec.RadarRange > 0 || spec.EORange > 0 || spec.IRRange > 0; - if (!hasDetection) continue; - int qty = Math.Max(1, eq.Quantity); - for (int i = 0; i < qty; i++) + sources.Add(new DetectionSource { - sources.Add(new DetectionSource - { - Position = new Algorithms.Vector3((float)eq.PositionX + i * 50, (float)eq.PositionY, (float)eq.PositionZ), - RadarRange = (float)spec.RadarRange, - EORange = (float)spec.EORange, - IRRange = (float)spec.IRRange, - Accuracy = (float)(spec.MinElevation.HasValue ? 50f : 50f), - MinElevation = (float)(spec.MinElevation ?? float.MaxValue), - MaxElevation = (float)(spec.MaxElevation ?? float.MaxValue), - MinDetectAlt = (float)(spec.MinDetectAlt ?? float.MaxValue), - MaxDetectAlt = (float)(spec.MaxDetectAlt ?? float.MaxValue), - ModelId = string.IsNullOrEmpty(spec.ModelId) ? null : spec.ModelId, - }); - } - } - else // Detection equipment: get from SensorSpec - { - if (!sensorSpecs.TryGetValue(eq.SensorSpecId, out var sensor)) continue; - bool hasDetection = sensor.RadarRange > 0 || sensor.EORange > 0 || sensor.IRRange > 0; - if (!hasDetection) continue; - int qty = Math.Max(1, eq.Quantity); - for (int i = 0; i < qty; i++) - { - sources.Add(new DetectionSource - { - Position = new Algorithms.Vector3((float)eq.PositionX + i * 50, (float)eq.PositionY, (float)eq.PositionZ), - RadarRange = (float)sensor.RadarRange, - EORange = (float)sensor.EORange, - IRRange = (float)sensor.IRRange, - Accuracy = (float)sensor.Accuracy, - MinElevation = (float)(sensor.MinElevation ?? float.MaxValue), - MaxElevation = (float)(sensor.MaxElevation ?? float.MaxValue), - MinDetectAlt = (float)(sensor.MinDetectAlt ?? float.MaxValue), - MaxDetectAlt = (float)(sensor.MaxDetectAlt ?? float.MaxValue), - ModelId = string.IsNullOrEmpty(sensor.ModelId) ? null : sensor.ModelId, - }); - } + Position = new Algorithms.Vector3((float)eq.PositionX + i * 50, (float)eq.PositionY, (float)eq.PositionZ), + RadarRange = (float)sensor.RadarRange, + EORange = (float)sensor.EORange, + IRRange = (float)sensor.IRRange, + Accuracy = (float)sensor.Accuracy, + MinElevation = (float)(sensor.MinElevation ?? float.MaxValue), + MaxElevation = (float)(sensor.MaxElevation ?? float.MaxValue), + MinDetectAlt = (float)(sensor.MinDetectAlt ?? float.MaxValue), + MaxDetectAlt = (float)(sensor.MaxDetectAlt ?? float.MaxValue), + ModelId = string.IsNullOrEmpty(sensor.ModelId) ? null : sensor.ModelId, + }); } } return sources; diff --git a/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll index 2aa92bf..edf8831 100644 Binary files a/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll and b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll differ diff --git a/src/Unity/Assets/StreamingAssets/defaults.json b/src/Unity/Assets/StreamingAssets/defaults.json index 45a234d..bca4cda 100644 --- a/src/Unity/Assets/StreamingAssets/defaults.json +++ b/src/Unity/Assets/StreamingAssets/defaults.json @@ -118,6 +118,38 @@ } ], + "launchPlatforms": [ + { + "Id": "ground-light", "Name": "[Demo] 轻型地基发射平台", + "Description": "4通道轻型平台,800m/s初速", + "PlatformType": 1, "GunCount": 4, "ChannelsPerGun": 4, "ChannelInterval": 0.1, + "Cooldown": 5.0, "AmmoChangeTime": 30.0, "MuzzleVelocity": 800.0, + "AmmoTypes": [0, 1] + }, + { + "Id": "ground-standard", "Name": "[Demo] 标准地基发射平台", + "Description": "4通道标准平台,800m/s初速", + "PlatformType": 1, "GunCount": 4, "ChannelsPerGun": 4, "ChannelInterval": 0.1, + "Cooldown": 5.0, "AmmoChangeTime": 30.0, "MuzzleVelocity": 800.0, + "AmmoTypes": [0, 1] + }, + { + "Id": "ground-heavy", "Name": "[Demo] 重型地基发射平台", + "Description": "6通道重型平台,600m/s初速,支持全弹种", + "PlatformType": 1, "GunCount": 6, "ChannelsPerGun": 4, "ChannelInterval": 1.0, + "Cooldown": 5.0, "AmmoChangeTime": 30.0, "MuzzleVelocity": 600.0, + "AmmoTypes": [0, 1, 2] + }, + { + "Id": "air-standard", "Name": "[Demo] 标准空基发射平台", + "Description": "8通道空基平台,80m/s巡航", + "PlatformType": 0, "GunCount": 1, "ChannelsPerGun": 8, "ChannelInterval": 1.0, + "Cooldown": 5.0, "AmmoChangeTime": 30.0, + "MuzzleVelocity": 80.0, "CruiseSpeed": 80.0, "ReleaseAltitude": 1000.0, + "AmmoTypes": [0, 1] + } + ], + "drones": [ { "Id": "quadcopter", "Name": "[Demo] 小型四旋翼(DJI类)", "Model": "DJI Mavic 类", "Description": "小型四旋翼,低空侦察", diff --git a/test/unit/CounterDrone.Core.Tests/TestData.cs b/test/unit/CounterDrone.Core.Tests/TestData.cs index 1228bba..7485ea9 100644 --- a/test/unit/CounterDrone.Core.Tests/TestData.cs +++ b/test/unit/CounterDrone.Core.Tests/TestData.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using CounterDrone.Core; @@ -28,8 +28,8 @@ namespace CounterDrone.Core.Tests private static DroneSpec? _droneSpec; public static DroneSpec DefaultDroneSpec => _droneSpec ??= _db.Table().First(d => d.Id == "shahed"); - private static FireUnitSpec? _groundSpec; - public static FireUnitSpec GroundSpec => _groundSpec ??= _db.Table().First(f => f.Id == "ground-light"); + private static LaunchPlatformSpec? _groundSpec; + public static LaunchPlatformSpec GroundSpec => _groundSpec ??= _db.Table().First(f => f.Id == "ground-light"); public static ScenarioDrone CreateScenarioDrone(string waveId = "w1", int quantity = 1) => new() { DroneSpecId = DefaultDroneSpec.Id, WaveId = waveId, Quantity = quantity }; @@ -39,16 +39,15 @@ namespace CounterDrone.Core.Tests public static ScenarioUnit CreateScenarioUnit(double px, double py, double pz, int ammoType = 0, int? munitionCount = null) - => new() { FireUnitSpecId = "ground-light", PositionX = px, PositionY = py, PositionZ = pz, + => new() { LaunchPlatformSpecId = "ground-light", PositionX = px, PositionY = py, PositionZ = pz, AerosolType = ammoType, MunitionCount = munitionCount ?? 8, Quantity = 1 }; - private static FireUnitSpec? _defaultFuSpec; - public static FireUnitSpec DefaultFuSpec => _defaultFuSpec ??= new FireUnitSpec + private static LaunchPlatformSpec? _defaultFuSpec; + public static LaunchPlatformSpec DefaultFuSpec => _defaultFuSpec ??= new LaunchPlatformSpec { Id = "test-fu", PlatformType = (int)PlatformType.GroundBased, GunCount = 1, ChannelsPerGun = 8, ChannelInterval = 1, MuzzleVelocity = 800, Cooldown = 5, AmmoChangeTime = 30, - RadarRange = 5000, }; private static SensorSpec? _sensorSpec; @@ -66,7 +65,7 @@ namespace CounterDrone.Core.Tests }; public static Dictionary EmptyDroneSpecs => new(); - public static Dictionary EmptyFuSpecs => new(); + public static Dictionary EmptyFuSpecs => new(); public static Dictionary EmptySensorSpecs => new(); private static DefaultData? _all; diff --git a/unity_plugins/CounterDrone.Core.dll b/unity_plugins/CounterDrone.Core.dll index 2aa92bf..edf8831 100644 Binary files a/unity_plugins/CounterDrone.Core.dll and b/unity_plugins/CounterDrone.Core.dll differ