Complete Cocos Creator port with level bundles, themes, and tooling.
Adds level prefabs, theme assets, audio, extensions, and deployment scripts for the Unity WebGL migration. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
109
extensions/level-map-editor/dist/level-id.js
vendored
Normal file
109
extensions/level-map-editor/dist/level-id.js
vendored
Normal file
@@ -0,0 +1,109 @@
|
||||
'use strict';
|
||||
|
||||
/** 与 Unity / 主站 config.js BEGINNING_REAL_LVID、LevelRegistry.LEVEL_ID_BASE 一致 */
|
||||
const LEVEL_ID_BASE = 91601;
|
||||
const PREFAB_DIR = 'level-prefabs';
|
||||
|
||||
/** internalIndex 0 → 91601(首关) */
|
||||
function externalLevelId(internalIndex) {
|
||||
return LEVEL_ID_BASE + internalIndex;
|
||||
}
|
||||
|
||||
function internalLevelIndex(levelId) {
|
||||
return levelId >= LEVEL_ID_BASE ? levelId - LEVEL_ID_BASE : levelId;
|
||||
}
|
||||
|
||||
function isGameLevelId(levelId) {
|
||||
return levelId >= LEVEL_ID_BASE;
|
||||
}
|
||||
|
||||
function isExternalLevelId(levelId) {
|
||||
return isGameLevelId(levelId);
|
||||
}
|
||||
|
||||
function minLevelId() {
|
||||
return LEVEL_ID_BASE;
|
||||
}
|
||||
|
||||
function prefabResourcePath(levelId) {
|
||||
return `${PREFAB_DIR}/Level${levelId}`;
|
||||
}
|
||||
|
||||
function normalizeDb(db) {
|
||||
if (!db.levels) db.levels = {};
|
||||
db.levelIdBase = LEVEL_ID_BASE;
|
||||
return db;
|
||||
}
|
||||
|
||||
function nextAvailableLevelId(db) {
|
||||
const keys = Object.keys(db.levels || {});
|
||||
if (!keys.length) return LEVEL_ID_BASE;
|
||||
const ids = keys.map((k) => parseInt(k, 10)).filter((n) => !Number.isNaN(n));
|
||||
return Math.max(...ids) + 1;
|
||||
}
|
||||
|
||||
function syncLevelEntry(cfg, levelId) {
|
||||
const out = { ...cfg };
|
||||
out.levelID = levelId;
|
||||
out.cocosPrefab = prefabResourcePath(levelId);
|
||||
if (typeof out.unityPrefab === 'string' && out.unityPrefab) {
|
||||
out.unityPrefab = out.unityPrefab.replace(/Level\d+\.prefab$/i, `Level${levelId}.prefab`);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function updateDbStats(db) {
|
||||
const total = Object.keys(db.levels || {}).length;
|
||||
db.stats = { ...(db.stats || {}), total, withPrefabTilemap: total };
|
||||
}
|
||||
|
||||
function touchDatabase(db, levelId) {
|
||||
normalizeDb(db);
|
||||
const key = String(levelId);
|
||||
if (db.levels[key]) {
|
||||
db.levels[key] = syncLevelEntry(db.levels[key], levelId);
|
||||
}
|
||||
updateDbStats(db);
|
||||
db.generatedAt = new Date().toISOString();
|
||||
}
|
||||
|
||||
function sortedLevelIds(db) {
|
||||
return Object.keys(db.levels || {})
|
||||
.map((k) => parseInt(k, 10))
|
||||
.filter((n) => !Number.isNaN(n))
|
||||
.sort((a, b) => a - b);
|
||||
}
|
||||
|
||||
function prevLevelIdInDb(db, cur) {
|
||||
const ids = sortedLevelIds(db);
|
||||
if (!ids.length) return cur;
|
||||
const i = ids.indexOf(cur);
|
||||
if (i < 0) return ids[0];
|
||||
return ids[(i - 1 + ids.length) % ids.length];
|
||||
}
|
||||
|
||||
function nextLevelIdInDb(db, cur) {
|
||||
const ids = sortedLevelIds(db);
|
||||
if (!ids.length) return cur;
|
||||
const i = ids.indexOf(cur);
|
||||
if (i < 0) return ids[0];
|
||||
return ids[(i + 1) % ids.length];
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
LEVEL_ID_BASE,
|
||||
PREFAB_DIR,
|
||||
externalLevelId,
|
||||
internalLevelIndex,
|
||||
isExternalLevelId,
|
||||
minLevelId,
|
||||
prefabResourcePath,
|
||||
normalizeDb,
|
||||
nextAvailableLevelId,
|
||||
syncLevelEntry,
|
||||
updateDbStats,
|
||||
touchDatabase,
|
||||
sortedLevelIds,
|
||||
prevLevelIdInDb,
|
||||
nextLevelIdInDb,
|
||||
};
|
||||
Reference in New Issue
Block a user