Cleanup 2
This commit is contained in:
+2
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-04-02
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
## Context
|
||||
|
||||
`SimulationWorld` 的运行时收敛已经完成,但代码和文档层面仍留有三类误导性遗留:`SimulationWorld.UseSimulationMovement` 这类恒真属性、`EnemyBase.IsSimulationMovementEnabled()` 这类恒真帮助方法,以及 `EnemySeparationSolverProvider` / `IEnemySeparationSolver` 与两个 legacy solver 实现。这些残留类型不再参与真实运行时调度,却继续把当前架构表述成“单路径之上还保留一套可切换兼容层”。
|
||||
|
||||
本次变更是一次尾部收口,不重新设计仿真数据流,也不扩展新的 solver 能力;目标是让代码表面与已经落地的运行时事实保持一致。
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
**Goals:**
|
||||
- 删除仍对外暴露旧路径语义的兼容属性和帮助方法。
|
||||
- 删除不再被运行时使用的 enemy separation provider/interface/legacy solver 类型。
|
||||
- 让测试和文档表达与当前单一路径实现一致。
|
||||
- 把影响收敛在 `SimulationWorld`、enemy runtime、legacy solver 文件和对应回归覆盖内。
|
||||
|
||||
**Non-Goals:**
|
||||
- 不在本次 change 中处理 Unity 场景序列化残留字段。
|
||||
- 不重做 `SimulationWorld` 的敌人分离算法或数据结构。
|
||||
- 不引入新的运行时调试面板、配置项或回滚开关。
|
||||
|
||||
## Decisions
|
||||
|
||||
### Remove compatibility members instead of renaming them
|
||||
直接删除 `UseSimulationMovement` 和 `IsSimulationMovementEnabled()`,而不是把它们改名为新的恒真语义成员。原因是这些成员的唯一历史价值就是表达“可选择是否启用 SimulationWorld”,继续保留只会延长错误心智模型。替代方案是保留只读属性并在注释里声明恒真,但这仍会让调用方继续围绕“是否启用”写分支,因此不采用。
|
||||
|
||||
### Delete legacy solver types rather than keep them as dead abstractions
|
||||
`EnemySeparationSolverProvider` 与 `IEnemySeparationSolver` 已不再承载运行时能力,继续保留会产生“还有第二套 enemy separation 入口”的假象。本次直接删除 provider、interface 以及两个实现类,而不是把 provider 改成内部空壳。替代方案是保留文件供历史参考,但仓库历史已经足够承担这个角色,不需要源码继续占位。
|
||||
|
||||
### Tighten regression coverage around absence of legacy entry points
|
||||
回归重点不是验证某个字段恒真,而是验证调用面已经不再依赖这些兼容入口。因此测试和文档只覆盖单路径可观察行为,并显式移除对旧壳层 API 的引用。替代方案是增加“成员不存在”的反射测试,但那类测试脆弱且价值低,不采用。
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- [外部代码仍引用这些壳层成员] → 在实现前用全文检索清理调用点,并通过编译验证所有受影响程序集。
|
||||
- [删除 legacy solver 文件后,文档或测试仍残留旧名称] → 同步更新 `docs/` 和 `Assets/Tests/Simulation/` 中的直接引用。
|
||||
- [未来有人希望恢复独立 enemy separation 实验入口] → 若确实需要,应以新的 `SimulationWorld` 内部实验点重新设计,而不是恢复旧 provider 抽象。
|
||||
|
||||
## Migration Plan
|
||||
|
||||
1. 删除 `UseSimulationMovement` 与 `IsSimulationMovementEnabled()` 及其剩余引用。
|
||||
2. 删除 `EnemySeparationSolverProvider`、`IEnemySeparationSolver` 与 legacy solver 实现文件。
|
||||
3. 更新受影响测试与文档,使其不再依赖这些符号。
|
||||
4. 通过编译与相关仿真测试验证仓库仍在单路径语义下工作。
|
||||
|
||||
无需运行时迁移或数据迁移;这是源码级收口。回滚方式仅为恢复该 change 的提交,不提供运行时开关回退。
|
||||
|
||||
## Open Questions
|
||||
|
||||
- None.
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
## Why
|
||||
|
||||
`SimulationWorld` 已经成为唯一运行时执行路径,但仓库里仍保留 `UseSimulationMovement`、`EnemyBase.IsSimulationMovementEnabled()` 以及 `EnemySeparationSolverProvider` / `IEnemySeparationSolver` 这类旧路径壳层。它们不再承载真实运行时能力,却继续制造双路径仍可恢复的错误信号,也增加后续维护和阅读成本。
|
||||
|
||||
## What Changes
|
||||
|
||||
- 删除 `SimulationWorld.UseSimulationMovement` 这类恒真兼容属性,改为直接暴露单路径语义。
|
||||
- 删除 `EnemyBase.IsSimulationMovementEnabled()` 及其调用点,去除敌人运行时代码里残留的旧路径判断壳层。
|
||||
- 删除 `EnemySeparationSolverProvider`、`IEnemySeparationSolver` 及其 legacy solver 实现,明确敌人间分离仅由 `SimulationWorld` 负责。
|
||||
- 更新测试与文档,确保回归覆盖和架构说明不再引用这些兼容壳层或 legacy solver 接口。
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
None.
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
- `simulationworld-runtime-convergence`: 收紧单路径运行时要求,明确不得保留可被误解为旧路径开关、能力接口或 solver 提供器的兼容壳层。
|
||||
|
||||
## Impact
|
||||
|
||||
- Affected code: `Assets/GameMain/Scripts/Simulation`, `Assets/GameMain/Scripts/Entity/EntityLogic/Enemy`, `Assets/GameMain/Scripts/Utility/EnemySeperator`, and related tests/docs.
|
||||
- APIs: removes compatibility-facing members that still imply legacy movement routing or solver substitution.
|
||||
- Systems: clarifies that enemy separation and movement execution stay exclusively on the `SimulationWorld` path.
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: SimulationWorld SHALL be the sole battle simulation executor
|
||||
The battle runtime MUST execute movement, projectile stepping, collision broad-phase, and related simulation state updates through `SimulationWorld`, and it MUST NOT route these responsibilities through an alternative non-`SimulationWorld` runtime path or expose compatibility switches that imply such a runtime path still exists.
|
||||
|
||||
#### Scenario: Battle tick advances through SimulationWorld
|
||||
- **WHEN** the battle update loop advances a gameplay frame
|
||||
- **THEN** `SimulationWorld` executes the simulation pipeline for that frame as the authoritative runtime update path
|
||||
|
||||
#### Scenario: Legacy routing switch does not select an alternate executor
|
||||
- **WHEN** runtime configuration related to simulation movement is evaluated
|
||||
- **THEN** it does not select or re-enable a separate legacy movement execution path
|
||||
|
||||
#### Scenario: Runtime API does not expose legacy movement enablement shims
|
||||
- **WHEN** gameplay runtime code integrates with movement simulation
|
||||
- **THEN** it does not depend on compatibility members whose purpose is to report whether `SimulationWorld` movement is enabled
|
||||
|
||||
### Requirement: Runtime surfaces SHALL reflect the single-path architecture
|
||||
Runtime debug surfaces, automated tests, architecture documents, and compatibility-facing runtime APIs MUST reflect that the project supports one authoritative `SimulationWorld` execution path rather than dual-path behavior, and MUST NOT preserve legacy solver provider abstractions that imply an alternate runtime separation path is still supported.
|
||||
|
||||
#### Scenario: Debug panel omits legacy solver controls
|
||||
- **WHEN** runtime simulation debugging is displayed
|
||||
- **THEN** it shows current `SimulationWorld` metrics without exposing legacy solver switching or dual-path controls
|
||||
|
||||
#### Scenario: Regression tests validate observable single-path behavior
|
||||
- **WHEN** simulation regression coverage is maintained
|
||||
- **THEN** tests validate observable outcomes such as movement, projectile lifetime, hit results, and hide/remove lifecycle instead of asserting private compatibility fields for legacy paths
|
||||
|
||||
#### Scenario: Runtime codebase omits legacy solver provider abstractions
|
||||
- **WHEN** enemy separation behavior is implemented or documented
|
||||
- **THEN** it is described as `SimulationWorld`-owned runtime behavior without referencing `EnemySeparationSolverProvider`, `IEnemySeparationSolver`, or equivalent legacy provider abstractions
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
## 1. Runtime API cleanup
|
||||
|
||||
- [x] 1.1 Remove `SimulationWorld.UseSimulationMovement` and any remaining runtime call sites that branch on that compatibility property.
|
||||
- [x] 1.2 Remove `EnemyBase.IsSimulationMovementEnabled()` and update enemy runtime code to rely directly on single-path `SimulationWorld` behavior.
|
||||
|
||||
## 2. Legacy solver removal
|
||||
|
||||
- [x] 2.1 Delete `EnemySeparationSolverProvider`, `IEnemySeparationSolver`, and the legacy solver implementations from `Assets/GameMain/Scripts/Utility/EnemySeperator/`.
|
||||
- [x] 2.2 Clean up any compile-time references, comments, or documentation text that still mention the removed legacy solver provider abstractions.
|
||||
|
||||
## 3. Regression and documentation alignment
|
||||
|
||||
- [x] 3.1 Update simulation/runtime tests so they no longer reference removed compatibility members and still cover observable single-path behavior.
|
||||
- [x] 3.2 Update architecture and roadmap docs to state that no compatibility movement switch or legacy enemy separation provider remains in the runtime codebase.
|
||||
- [x] 3.3 Run a build and targeted verification for the affected simulation/runtime surface.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user