From b70ccbd5f672d186271a4a362b0e63ba2cbb2616 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Tue, 15 Sep 2026 17:16:44 +0800 Subject: [PATCH] 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 --- packages-user/data-base/src/enemy/manager.test.ts | 8 ++++---- packages-user/data-base/src/enemy/manager.ts | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages-user/data-base/src/enemy/manager.test.ts b/packages-user/data-base/src/enemy/manager.test.ts index 430c964..f128f9a 100644 --- a/packages-user/data-base/src/enemy/manager.test.ts +++ b/packages-user/data-base/src/enemy/manager.test.ts @@ -268,8 +268,8 @@ describe('EnemyManager reuse mapping', () => { expect(manager.getPrefabById('missing-reuse')).toBeNull(); }); - // 疑似 bug:createEnemy/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'); diff --git a/packages-user/data-base/src/enemy/manager.ts b/packages-user/data-base/src/enemy/manager.ts index de12685..4ea54b4 100644 --- a/packages-user/data-base/src/enemy/manager.ts +++ b/packages-user/data-base/src/enemy/manager.ts @@ -117,13 +117,15 @@ export class EnemyManager implements IEnemyManager { } createEnemy(code: number): IEnemy | 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 | null { - const prefab = this.prefabById.get(id); + const prefab = this.internalGetPrefab(id); if (!prefab) return null; return prefab.clone(); }