feat(scripts): buildGroupParents - BelongGroupID → group-X 父节点归类

This commit is contained in:
2026-09-02 08:11:05 +08:00
parent 7f0bd17b9e
commit 9fddab82d5
2 changed files with 88 additions and 0 deletions
@@ -0,0 +1,47 @@
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { buildGroupParents } from '../../scripts/legacy-layer-to-cocos-prefab.mjs';
test('buildGroupParents 把同 group Spirit 归类', () => {
const spirits = [
{ id: '1', group: '2', indexOfLayer: '1' },
{ id: '405', group: '2', indexOfLayer: '2' },
{ id: '285', group: '2', indexOfLayer: '3' },
];
const result = buildGroupParents(spirits);
assert.equal(result.groupParents.length, 1, '只有一个 group=2');
assert.equal(result.groupParents[0].name, 'group-2');
assert.deepEqual(result.groupParents[0].childSpiritIds, ['1', '405', '285']);
assert.equal(result.rootChildSpiritIds.length, 0);
});
test('buildGroupParents 多 group 按 ID 升序', () => {
const spirits = [
{ id: '1', group: '32', indexOfLayer: '1' },
{ id: '2', group: '1', indexOfLayer: '2' },
{ id: '3', group: '1', indexOfLayer: '3' },
];
const result = buildGroupParents(spirits);
assert.deepEqual(result.groupParents.map(g => g.name), ['group-1', 'group-32']);
});
test('buildGroupParents group=0 Spirit 直挂 Layer 根', () => {
const spirits = [
{ id: '10', group: '0', indexOfLayer: '1' },
{ id: '20', group: '0', indexOfLayer: '2' },
{ id: '30', group: '2', indexOfLayer: '3' },
];
const result = buildGroupParents(spirits);
assert.equal(result.groupParents.length, 1);
assert.deepEqual(result.rootChildSpiritIds, ['10', '20']);
});
test('buildGroupParents 按 IndexOfLayer 排序子节点', () => {
const spirits = [
{ id: 'c', group: '1', indexOfLayer: '3' },
{ id: 'a', group: '1', indexOfLayer: '1' },
{ id: 'b', group: '1', indexOfLayer: '2' },
];
const result = buildGroupParents(spirits);
assert.deepEqual(result.groupParents[0].childSpiritIds, ['a', 'b', 'c']);
});
@@ -96,3 +96,44 @@ export function computeContentSize(spirit) {
height: parseFloat(spirit.h || '0'), height: parseFloat(spirit.h || '0'),
}; };
} }
/**
* 将 Spirit 记录按 BelongGroupID 归类, 生成 group-X 父节点集合 + Layer 根直挂子节点.
*
* 规则:
* - BelongGroupID === '0' (或缺失) → 直挂 Layer 根, 不进任何 group 父节点
* - BelongGroupID > 0 → 归入对应 group-<N> 父节点
* - group 父节点按 ID 升序排列; 同 group 内子节点按 IndexOfLayer 升序
* - 命名保留原 BelongGroupID 值, 不重排
*
* 数据源权威: IndexOfLayer 缺失视作 0 (XML 中该字段由 readLayerXml 提供, 必有值).
*
* @param {Array<{ id?: string, group?: string, indexOfLayer?: string }>} spirits
* @returns {{ groupParents: Array<{ name: string, childSpiritIds: string[] }>, rootChildSpiritIds: string[] }}
*/
export function buildGroupParents(spirits) {
const groupMap = new Map(); // group_id -> [{ spiritId, index }]
const rootSpirits = [];
for (const s of spirits) {
if (s.group === '0' || !s.group) {
rootSpirits.push({ spiritId: s.id, index: parseInt(s.indexOfLayer || '0', 10) });
} else {
if (!groupMap.has(s.group)) groupMap.set(s.group, []);
groupMap.get(s.group).push({ spiritId: s.id, index: parseInt(s.indexOfLayer || '0', 10) });
}
}
const groupParents = Array.from(groupMap.entries())
.sort(([a], [b]) => parseInt(a, 10) - parseInt(b, 10))
.map(([gid, items]) => ({
name: `group-${gid}`,
childSpiritIds: items.sort((a, b) => a.index - b.index).map(x => x.spiritId),
}));
const rootChildSpiritIds = rootSpirits
.sort((a, b) => a.index - b.index)
.map(x => x.spiritId);
return { groupParents, rootChildSpiritIds };
}