同步主站 Cocos 当前工程:关卡资源、运行脚本与打包工具。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -4,11 +4,10 @@
|
||||
* 运行时包(唯一真相):
|
||||
* Build/
|
||||
* StreamingAssets/
|
||||
* levels-database.json
|
||||
* levels-database.json.br
|
||||
* levels-db-index.json
|
||||
* levels-db-index.json.br
|
||||
* StreamingAssets/aa/levels-db/
|
||||
* StreamingAssets/aa/levels-db/ (默认仅 .json.br)
|
||||
* 可选: levels-database.json(.br) — KEEP_LEGACY_DB=1
|
||||
*
|
||||
* 不含 index.html / TemplateData(仅 standalone-player 独立调试页使用)
|
||||
*/
|
||||
@@ -49,6 +48,19 @@ function listRuntimeFiles(packDir) {
|
||||
return files.sort((a, b) => a.rel.localeCompare(b.rel));
|
||||
}
|
||||
|
||||
function existsPlainOrBr(filePath) {
|
||||
if (fs.existsSync(filePath) && fs.statSync(filePath).size > 0) return true;
|
||||
const br = `${filePath}.br`;
|
||||
return fs.existsSync(br) && fs.statSync(br).size > 0;
|
||||
}
|
||||
|
||||
function readJsonPlainOrBr(filePath) {
|
||||
if (fs.existsSync(filePath)) {
|
||||
return JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
||||
}
|
||||
throw new Error(`缺少 JSON: ${filePath}`);
|
||||
}
|
||||
|
||||
function bundleNamesFromCatalog(catalogPath) {
|
||||
if (!fs.existsSync(catalogPath)) return [];
|
||||
const catalog = JSON.parse(fs.readFileSync(catalogPath, 'utf8'));
|
||||
@@ -67,32 +79,32 @@ function assertRuntimePack(packDir, opts) {
|
||||
if (!fs.existsSync(loader)) {
|
||||
throw new Error(`缺少运行时包: ${loader}`);
|
||||
}
|
||||
if (!fs.existsSync(catalog)) {
|
||||
throw new Error(`缺少运行时包: ${catalog}`);
|
||||
if (!existsPlainOrBr(catalog)) {
|
||||
throw new Error(`缺少运行时包: ${catalog}(.br)`);
|
||||
}
|
||||
if (!fs.existsSync(path.join(packDir, 'levels-db-index.json'))) {
|
||||
throw new Error(`缺少运行时包: ${path.join(packDir, 'levels-db-index.json')}`);
|
||||
if (!existsPlainOrBr(path.join(packDir, 'levels-db-index.json'))) {
|
||||
throw new Error(`缺少运行时包: ${path.join(packDir, 'levels-db-index.json')}(.br)`);
|
||||
}
|
||||
if (!fs.existsSync(path.join(packDir, 'levels-database.json'))) {
|
||||
throw new Error(`缺少运行时包: ${path.join(packDir, 'levels-database.json')}`);
|
||||
}
|
||||
const names = bundleNamesFromCatalog(catalog);
|
||||
const names = fs.existsSync(catalog) ? bundleNamesFromCatalog(catalog) : [];
|
||||
if (opts.requireLevelsBundle && !names.some((n) => n.includes('levels_all'))) {
|
||||
throw new Error('catalog 缺少 levels_all 分包');
|
||||
}
|
||||
if (opts.requireLevelsManifest && !fs.existsSync(levelsManifest)) {
|
||||
throw new Error(`缺少运行时包: ${levelsManifest}`);
|
||||
if (opts.requireLevelsManifest && !existsPlainOrBr(levelsManifest)) {
|
||||
throw new Error(`缺少运行时包: ${levelsManifest}(.br)`);
|
||||
}
|
||||
if (opts.requireLevelsManifest) {
|
||||
const manifest = JSON.parse(fs.readFileSync(levelsManifest, 'utf8'));
|
||||
if (opts.requireLevelsManifest && fs.existsSync(levelsManifest)) {
|
||||
const manifest = readJsonPlainOrBr(levelsManifest);
|
||||
const count = Object.keys(manifest.levels || {}).length;
|
||||
if (count < 1) throw new Error('levels-manifest.json 无关卡条目');
|
||||
}
|
||||
for (const name of names) {
|
||||
const p = path.join(packDir, 'StreamingAssets/aa/WebGL', name);
|
||||
if (!fs.existsSync(p) || fs.statSync(p).size < 100) {
|
||||
throw new Error(`bundle 无效: ${p}`);
|
||||
if (!existsPlainOrBr(p)) {
|
||||
throw new Error(`bundle 无效: ${p}(.br)`);
|
||||
}
|
||||
const br = `${p}.br`;
|
||||
const sz = fs.existsSync(p) ? fs.statSync(p).size : fs.statSync(br).size;
|
||||
if (sz < 50) throw new Error(`bundle 过小: ${p}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,6 +113,7 @@ module.exports = {
|
||||
RUNTIME_DIRS,
|
||||
walkFiles,
|
||||
listRuntimeFiles,
|
||||
existsPlainOrBr,
|
||||
bundleNamesFromCatalog,
|
||||
assertRuntimePack,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user