fix(07-02): #06-03-1 resolve the reuse mapping in enemy creation

- createEnemy/createEnemyById now resolve prefabs through internalGetPrefab,
  matching getPrefab/deletePrefab/modifyPrefabAttribute behaviour
- add a Chinese invariant comment above createEnemyById covering all
  code/id prefab entry points
- un-skip the two correct-expectation reuse mapping cases in manager.test.ts
  (assertions unchanged) and sync their Chinese comments
This commit is contained in:
unanmed 2026-09-15 17:16:44 +08:00
parent 657d9720af
commit b70ccbd5f6
2 changed files with 8 additions and 6 deletions

View File

@ -268,8 +268,8 @@ describe('EnemyManager reuse mapping', () => {
expect(manager.getPrefabById('missing-reuse')).toBeNull();
});
// 疑似 bugcreateEnemy/createEnemyById 未走复用映射,详见 06-TEST-FINDINGS.md #06-03-1修复后取消 skip
it.skip('creates enemies for reused codes and ids through the reuse mapping', () => {
// 验证 createEnemy 按复用 code 解析到来源模板并生成独立怪物
it('creates enemies for reused codes and ids through the reuse mapping', () => {
const manager = createManager();
manager.addPrefab(createPrefab(1, 'slime'));
manager.reusePrefab(1, 100, 'slime-reuse');
@ -278,8 +278,8 @@ describe('EnemyManager reuse mapping', () => {
expect(manager.createEnemyById('slime-reuse')!.id).toBe('slime');
});
// 疑似 bug复用映射未接入 createEnemy/createEnemyById四朝向复用同一模板各自生成独立怪物的链路不可用详见 06-TEST-FINDINGS.md #06-03-1修复后取消 skip
it.skip('creates four independent enemies from one prefab reused by four facing codes', () => {
// 验证同一模板经四个朝向 code 复用后,创建的怪物互相独立且不影响来源模板
it('creates four independent enemies from one prefab reused by four facing codes', () => {
const manager = createManager();
manager.addPrefab(createPrefab(1, 'slime'));
manager.reusePrefab(1, 100, 'slime-up');

View File

@ -117,13 +117,15 @@ export class EnemyManager<TEnemy> implements IEnemyManager<TEnemy> {
}
createEnemy(code: number): IEnemy<TEnemy> | null {
const prefab = this.prefabByCode.get(code);
const prefab = this.internalGetPrefab(code);
if (!prefab) return null;
return prefab.clone();
}
// 不变式:所有按 code/id 取模板的公开入口都必须经 internalGetPrefab 解析复用映射,
// 复用映射把同一模板的多个朝向 code 别名到来源模板,绕过解析会让这些 code 取不到模板
createEnemyById(id: string): IEnemy<TEnemy> | null {
const prefab = this.prefabById.get(id);
const prefab = this.internalGetPrefab(id);
if (!prefab) return null;
return prefab.clone();
}