feat(scripts): mapSpiritTypeToComponent - SpiritType → cc.* 组件映射(读 spirit-semantics.json)
This commit is contained in:
@@ -1,6 +1,23 @@
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { dirname, join } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { DOMParser } from '@xmldom/xmldom';
|
||||
|
||||
// SpiritType → cc.* 组件映射表 (数据源). 读取 fixtures/spirit-semantics.json,
|
||||
// 该文件由 Task 5 (gameabc.min.js 逆向) 维护, 下游不得兜底.
|
||||
// 路径: scripts/legacy-layer-to-cocos-prefab.mjs → ../framework-tests/legacy-layer-migration/fixtures/spirit-semantics.json
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const SEMANTICS_PATH = join(
|
||||
__dirname,
|
||||
'../framework-tests/legacy-layer-migration/fixtures/spirit-semantics.json'
|
||||
);
|
||||
|
||||
let _semantics = null;
|
||||
function loadSemantics() {
|
||||
if (!_semantics) _semantics = JSON.parse(readFileSync(SEMANTICS_PATH, 'utf8'));
|
||||
return _semantics;
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取 Game_Surface_3 风格的 Layer XML (UTF-8 编码), 解析 Layer + Spirit 字段.
|
||||
*
|
||||
@@ -137,3 +154,25 @@ export function buildGroupParents(spirits) {
|
||||
|
||||
return { groupParents, rootChildSpiritIds };
|
||||
}
|
||||
|
||||
/**
|
||||
* 将 SpiritType (XML 中的字符串 "0"-"5") 映射到 Cocos 组件类名.
|
||||
*
|
||||
* 数据源权威唯一: 读取 fixtures/spirit-semantics.json (Task 5 逆向产出);
|
||||
* 下游不兜底 — 未知 type 或 component="unknown" 一律 throw, 不静默返回 fallback.
|
||||
*
|
||||
* @param {string} type - SpiritType 字符串 (e.g. "0", "1", "3", "4", "5")
|
||||
* @returns {string} Cocos 组件类名 (e.g. "cc.Sprite", "cc.Label", "cc.ProgressBar", "cc.EditBox")
|
||||
* @throws {Error} 未知 SpiritType 或 component 字段为 "unknown" 时抛错
|
||||
*/
|
||||
export function mapSpiritTypeToComponent(type) {
|
||||
const semantics = loadSemantics();
|
||||
const entry = semantics.spirit_types[type];
|
||||
if (!entry) {
|
||||
throw new Error(`Unknown SpiritType "${type}" - not in fixtures/spirit-semantics.json`);
|
||||
}
|
||||
if (entry.component === 'unknown') {
|
||||
throw new Error(`SpiritType "${type}" component not yet reverse-engineered - complete Task 5 (gameabc.min.js 逆向) first`);
|
||||
}
|
||||
return entry.component;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user