# Changelog

---

## [0.8.0] - 2026-06-16

### Added — 探测实时链路（Phase 10）

- **3D 球冠探测**：`DetectionCalculator.IsInCoverage`（水平距离 + 俯仰角 + 高度门限），planner 与运行时共用
- **EarliestDetection 采样法**：线段-圆求交改为沿航路采样（步长≤50m）调 `IsInCoverage`
- **DetectionEntity**：运行时探测实体 + per-drone 状态机（Undetected ⇄ Detected），Tick 第5步扫描
- **实时探测事件**：`OnTargetDetected` / `SimEventType.TargetDetected` / `PlanningFailed`
- **EquipmentDeployment + DetectionSource**：+4 个 3D 球冠字段（MinElevation/MaxElevation/MinDetectAlt/MaxDetectAlt）
- **默认数据全部加入 3D 球冠参数**（地基 -5°~85°、空基 -80°~30°）

### Added — Planner 诊断 + 拦截点计算

- **InterceptCalculator**：抛物线与直线联立方程求解拦截点（地基可变角度 + 空基固定水平 θ=0°）
- **HasInterceptWindow**：拦截窗口可行性检查（从探测边界算有效飞行时间）
- **TryGenerateFireEvents**：每个 `return events` 带拒绝原因
- **Planner Summary**：含失败原因 + 建议值（探测范围/弧长/反应时间）
- **PlannerConfig**：+`ReactionTime`（5s）/ `ExpansionFactor`（0.9）/ `TimingSafetyMargin`（1s）

### Changed — 消除硬编码

- **速度从 waypoint.Speed 读取**：`DroneEntity.CruiseSpeed` / `GetDroneSpeedKph` 不再用 `TargetConfig.TypicalSpeed`
- **`AmmunitionSpec` +`Phase2Duration`**（30s）：`CloudExpansionModel` 不再写死 `30f`
- **`GetArrivalTime` 基于 DetectArc**：从探测点到中点算到达时间（而非航路起点）
- **TestData 改为从 seeded 数据库读取**（不再内嵌 JSON 重复 defaults.json）

### Changed — 默认想定参数

- 巡航导弹速度 300→200 km/h
- 空基航路 10km→20km，平台位置 1500→6000，巡航速度 55→80 m/s
- 地基火力单元放航路终点，探测范围按 80% 规则

### Metrics

- 测试 204 → **231**（+27），全量通过 7s

---

## [0.7.0] - 2026-06-15

### Breaking — 概念升级：编组拆分 + Group 表移除

- **Group 表移除**：原 `Group` 表（DroneFleet / EquipmentGroup）不再创建。向后兼容保留旧库中的 Group 表，但不再主动读写
- **GroupType 枚举删除**：不再区分 DroneFleet / EquipmentGroup
- **GroupService / IGroupService / GroupRepository 删除**：不再需要编组管理服务
- **Unity GroupManager 删除**：不再需要编组管理桥接

### Changed — 数据模型重命名

- **`GroupId` → `WaveId`**：TargetConfig、EquipmentDeployment、RoutePlan、Waypoint 四表的编组外键重命名为批次外键
- **RoutePlan 索引重命名**：`(TaskId, GroupId)` → `(TaskId, WaveId)`
- **RoutePlanRepository / WaypointRepository**：`GetByTaskAndGroup` → `GetByTaskAndWave`
- **IScenarioService.SaveRoute**：`groupId` 参数 → `waveId`

### Changed — 算法类型重命名

- **`DroneGroup` → `DroneWave`**：AlgorithmTypes、IDefensePlanner、DefensePlanner、SimulationEngine 全部使用新类型名
- **`DroneGroupId` → `DroneWaveId`**：UnitAssignment 中的编队引用 → 批次引用
- **`BuildDroneGroups()` → `BuildDroneWaves()`**：SimulationEngine 构建方法重命名

### Changed — 文档同步

- 总体架构设计：编组概念升级说明
- DefensePlanner 技术方案：DroneGroup → DroneWave
- 实施计划：GroupService 移除、多编队 → 多批次
- Unity 前端对接文档：DefaultDefenseAdvisor → DefensePlanner，SaveRoute 签名更新
- 仿真器实体事件映射：BuildDroneGroups → BuildDroneWaves

### Removed

- 7 个文件：Group.cs / GroupRepository.cs / IGroupService.cs / GroupService.cs / GroupManager.cs / GroupServiceTests.cs / GroupRepositoryTests.cs

### Metrics

- 测试 208 → **204**（−4，删除 Group 相关测试），全量通过 63s
- 0 编译错误，0 编译警告

---

## [0.6.0] - 2026-06-15

### Added — 探测驱动的规划（8.1.1）

- **DetectionCalculator 静态工具类**：探测能力评估的唯一实现（与 Kinematics/RouteGeometry 同范式）。光电受 Visibility 衰减（`有效=基准×min(1,Visibility/基准)`），雷达/红外不受影响；统一信息网络找最早探测点（线段-圆求交）
- **探测源模型**（DetectionSource）：独立探测设备 + 火力单元自带探测统一表达（雷达/光电/红外三距离 + 精度）
- **EquipmentDeployment 扩展**：删单一 `DetectionRadius`，加 `RadarRange/EORange/IRange/DetectionAccuracy` 四字段
- **FireUnit 探测字段激活**：BuildFireUnits 从 EquipmentDeployment 读取并赋值（原为死代码）
- **planner 接口扩展**：`IDefensePlanner.Plan` 加第 4 参数 `detectionSources`
- **PlannerConfig 加 DefaultDetectionAccuracy**（无探测时回退精度）
- 单元测试：DetectionCalculator 13 项、探测驱动规划 2 项

### Changed — planner 基于探测信息规划

- planner 假设威胁从探测边界被发现，到达时间 = (拦截弧长 − 探测弧长)/速度，而非上帝视角的航路起点
- SimulationEngine.Initialize 构建 `List<DetectionSource>`（独立探测 + 火力单元自带），传入 planner
- 报告探测设备表用新字段（雷达/光电/红外/精度）

### Fixed

- Solve 健壮性：GenerateFireEventsAt 返回空时（探测边界太靠后来不及拦截）不再 IndexOutOfRange

### Metrics

- 测试 193 → **208**（+15），全量通过 64s
- 0 编译警告

---

## [0.5.0] - 2026-06-14

### Added — 物理模型统一架构

- **RouteGeometry 静态工具类**：航路几何唯一实现（总弧长/弧长→位置/点→最近弧长/切向量/到达时间）。planner（预测）和 DroneEntity（执行）共用，消除本地折线插值
- **PlannerConfig + planner_config.json**：planner 策略参数全部外置（重叠系数、威胁类型系数、弹药匹配表、临界/上限概率阈值）。代码零默认值，文件缺失即抛异常
- 单元测试：RouteGeometry 16 项、PlannerConfig 6 项、DroneEntity L 形多 waypoint 1 项、Z 向航路感知 1 项

### Changed — planner 不再写本地物理公式

- **DefaultDefensePlanner 航路感知布局**：云团 offset 沿航路切向（`RouteGeometry.TangentAt`），不再写死 X 轴；穿越点用 `RouteGeometry.PositionAt`，到达时间用 `RouteGeometry.TravelTimeTo`——支持任意方向/折线航路
- **云团重叠**：间距从 `2R`（相切）改为 `2R×(1−重叠系数)`，重叠 20% 由配置驱动，消除相切处的密度空洞
- **DroneEntity 弧长驱动**：运动改为 `_traveledArc += speed×dt` + `RouteGeometry.PositionAt`，删除 `CurrentWaypointIndex` 逐段插值、`dist<1.0` 阈值、`step>=dist` snap 丢位移等本地逻辑
- **CloudExpansionModel.RoundsNeeded** 签名：`effectiveRadius` 参数改为 `spacing`，间距由调用方（planner）按重叠系数传入，公式仍在共享模块
- **策略参数从配置读**：威胁类型系数、弹药匹配表、临界概率（0.5）、拦截概率上限（0.95）全部从 `PlannerConfig` 读，planner 内零硬编码

### Fixed — planner 与引擎物理一致性

- **PathInSphere 云团参考系修正**：毁伤判定改在云团参考系计算（`drone.Pos − cloud.Center`），修正云团在 tick 内移动导致的每 tick ~2m 系统误差
- **ComputeEffectiveRadius 云龄 bug**：从 `ArrivalTime×2`（无人机飞行时间，概念错误）改为 `expansionTime`（云团自身膨胀时长）

### Removed

- SimulationEngine 所有硬编码桌面路径的诊断写入（`planner_targets.csv`/`cloud_actual.csv`/`path_in_cloud.txt`/`_hitLog`/`_totalPathInCloud`）——这些造成集成测试并行时文件竞争（flaky 失败根因）
- DefaultDefensePlanner 的硬编码 `MatchTable`/`TypeCoefficient` 字典（移入配置）

### Metrics

- 测试 167 → **191**（+24），全量通过 41s
- 关键验证：活塞+西风、空基+东风有风场景击毁成功；Z 向航路云团沿航路分布；L 形折线多 waypoint 运动正确

---

## [0.4.1] - 2026-06-14

### Added

- 天气纳入 Planner 规划：抛撒点风偏预补偿。云团生成后会在 `expansionTime` 内被风吹偏 `windVec × expansionTime`，Planner 逆风预置抛撒点 `cloudGen = 穿越点 − windVec × expansionTime`，使云团漂移后中心正好回到无人机航路上
- 单元测试：`DispersionModelTests` Phase3 天气差异 2 项（雾 vs 晴、夜 vs 晴）；`DefensePlannerTests` 风偏补偿 4 项（无风/东风/西风/北风方向性）

### Fixed

- `GaussianPuffDispersion.Tick` Phase3 写死 `WeatherType.Sunny` 的 bug：原代码 `GetStabilityClass((WeatherType)0, windSpeed)` 导致任何天气下扩散行为都相同，预估（`CloudExpansionModel` 已正确读 env）与运行时模型不一致。改为存储 `env` 字段，使用真实 `env.WeatherType`

### Changed

- `DefaultDefensePlanner.GenerateFireEventsAt` 区分无人机穿越点 `tx,tz`（用于 `txArrival` 计算）与云团生成点 `cloudGenX,Z`（弹药瞄准目标 + FireEvent 输出）
- 移除 `Solve` 中 `e.TargetX = mid.X + offset` 的覆盖（会抹掉风偏补偿；多发散布偏移已由 `targetOffset` 参数处理）

---

## [0.4.0] - 2026-06-13

### Added

- 路径积分毁伤判定：`DamageAssessment.PathInSphere` 替代离散 `ContainsPoint`，无人机穿云暴露精确计算
- 损伤模型暴露所需暴露时间：`IDamageModel.RequiredExposureSeconds`，Planner 从损伤模型读取所需覆盖时长
- 云团膨胀独立模块：`CloudExpansionModel`，封装 `RadiusAt`/`DensityAt`/`TimeToReach`/`TimeToDensity`/`RoundsNeeded`
- 单元测试：`DamageAssessment` 5 项 (穿心/相邻/间隙/9 链/跨云)、`Kinematics` 抛物线 4 项 (45°标准公式验证)
- 密度阈值统一：引擎处 `cloudDensity >= ammo.EffectiveConcentration` 统一检查，三个损伤模型去掉各自硬编码阈值

### Changed

- Planner `CalcRoundsNeeded` 从硬编码 `2:6s` 改为 `_damageModel.RequiredExposureSeconds`
- `CloudExpansionModel.RoundsNeeded` 间距 `= 2R`（消除 `1.5f` 魔法数字）
- `FireUnit` = 物理单元（不拆通道），Planner 一辆车发一条线
- `MunitionEntity.HasArrived` 上升段触发（不再要求下行），附带精确插值
- 空基平台投放逻辑：飞向云位、距目标 `driftDist` 释放、位置插值保留
- 仿真场景缩短：Piston 5km/150km/h、Jet 5km/200km/h、AirBased 10km/150km/h，全量 22s

### Fixed

- 抛物线弹道精确求解：`CalculateLaunchAngle`/`ParabolicShellTime` 解 tan(θ) 二次方程取平射解
- 空基 `PlatformEntity` 投放时不再传送到终点
- 缺失 `else` 导致空基走地基分支
- `Event.OccurredAt` 使用精确 `FireEvent.FireTime`/`m.ArrivalTime`
- `_frameDb.Commit` 批量 50 帧
- 报告火力单元计数（`_entityCounter` 重置）

### Removed

- `ComputeEffectiveRadius` 公式转移到 `CloudExpansionModel`
- 损伤模型内部浓度阈值（`TriggerThreshold`/`EffectiveThreshold`）
- `CalcRoundsNeeded` `/2` 魔法加 1

### Added

- DefensePlanner 防御规划引擎：五步流水线（威胁排序 → 弹药匹配 → 候选生成 → 贪心分配 → 时序生成）
- 空基平台飞行与投弹：状态机（Idle → FlyingToTarget → ReadyToRelease），载机速度继承，弹药抛物线下落
- 火力单元通道模型：GunCount × ChannelsPerGun，ChannelInterval 物理间隔，Cooldown 冷却
- 默认火力单元配置：4 种模板（轻型/标准/重地基 + 标准空基 8 通道）
- 推荐算法统一处理空基/地基平台类型
- 物理间隔错开发射：发射间隔 = 云团直径 / 无人机速度
- 每发弹按目标点位置独立计算到达时间
- 报告显示 per-unit 发射数 + 事件标注火力单元

### Changed

- IDefenseAdvisor → IDefensePlanner：统一输入 `List<FireUnit>` + `List<DroneGroup>`
- FireUnit 重构：统一表达空基/地基平台（Type/Position/GunCount/ChannelsPerGun）
- SimulationEngine 内部调用 Planner 自动生成发射计划
- MunitionEntity 空投使用 Kinematics.AirDropPosition（继承载机速度 + 重力）
- PlatformEntity 加入 CurrentVelocity 属性

### Fixed

- 同平台多弹 FireTime 相同导致冷却跳过：FireTime += i × Cooldown
- 同平台弹药飞行时间按目标位置变化被吃掉：统一用中心点飞行时间
- recommendedTiming 按每发目标点独立计算（非中点）
- 空基 FireEvent.MuzzleVelocity 错误写 800
- SQLite domain reload 崩溃：SqliteConnectionTracker + AssemblyReloadEvents.beforeAssemblyReload

### Removed

- IDefenseAdvisor / DefaultDefenseAdvisor / RecommendMultiGroup
- SimulationRunner.BuildFireSchedule fallback
- 所有硬编码默认值（55f/800f/1000f/+500f/0.1f clamp）
- 所有静默 fallback（null return/empty events）
- Models.SimEvent 死代码

---

## [0.2.0] - 2026-06-12

### Added

- 三阶段气溶胶扩散模型（爆轰膨胀 → 湍流扩散 → 高斯扩散）
- 防御推荐算法：根据弹药规格自动计算齐射数、间距、拦截概率
- 仿真引擎事件驱动：OnMunitionLaunched / OnCloudGenerated / OnDroneDestroyed 等 6 个事件
- FireSchedule 发射计划：推荐方案直接生成，引擎执行
- 多编队多批次支持：RoutePlan 多航路、RecommendMultiGroup 火力分配
- 仿真报告：七章结构（结果/环境/目标/推荐/部署/时序/时间线），自动导出 Markdown
- 数据库种子：首次建表自动从 JSON 导入弹药规格
- 帧数据 TTL 清理（6 个月过期自动删除）
- 仿真加速：TimeScale 支持
- Unity Manager 桥接层：ModelManager / ScenarioManager / SimulationRunner / ReportManager / ReplayController / GroupManager
- Unity 全流程验证：一键菜单验证 7 个模块
- 边界测试：空部署 / 强风 / 超长航路 / 空基弹药

### Changed

- 仿真引擎重构为纯执行器，不包含决策逻辑
- RoutePlan 主键改为 Id，支持多编队
- 弹药参数改为 JSON 文件配置
- 报告结构重组，结果前置

### Fixed

- 弹药飞行时间用真实弹道计算
- 云团生成位置使用目标坐标
- 编队偏移应用到初始位置
- Edit 模式下 AddComponent 不触发 Awake

---

## [0.1.0] - 2026-06-11

### Added

- 项目初始化：.NET Standard 2.1 类库 + xUnit 测试框架
- 数据模型（11 张业务表 + 2 张运行时表）
- SQLite 持久化 + 任务分库架构
- 想定管理（5 步配置 CRUD）
- 仿真引擎基础框架
