同步主站 Cocos 当前工程:关卡资源、运行脚本与打包工具。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-12 14:40:34 +08:00
parent ae75fce80b
commit fac515a669
5609 changed files with 27744634 additions and 5653 deletions

View File

@@ -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,
};