"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.JsonPackage = void 0; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const ROOM_COUNT = 7; const BASE64_KEYS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; const HEXCHAR = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; const BASE64_VALUES = new Array(123); for (let i = 0; i < 123; ++i) BASE64_VALUES[i] = 64; for (let i = 0; i < 64; ++i) BASE64_VALUES[BASE64_KEYS.charCodeAt(i)] = i; const _t = ['', '', '', '']; const uuidTemplate = _t.concat(_t, '-', _t, '-', _t, '-', _t, '-', _t, _t, _t); const indices = uuidTemplate.map(function (value, index) { return value === '-' ? NaN : index; }).filter(isFinite); class SettingJSDecode { constructor(buildDir) { this.packedAssets = null; const settingDir = path_1.default.join(buildDir, 'src'); const files = fs_1.default.readdirSync(settingDir); for (const file of files) { if (!file.startsWith('settings')) continue; const settingsContent = fs_1.default.readFileSync(path_1.default.join(settingDir, file)).toString(); const ccSetting = this.evalSettings(settingsContent); this.packedAssets = ccSetting === null || ccSetting === void 0 ? void 0 : ccSetting.packedAssets; break; } } evalSettings(content) { content = content.replace('window.', 'settingsContainer.'); const settingsContainer = {}; eval(content); return settingsContainer._CCSettings; } toUUID(base64) { let baselen = base64.length; if (baselen < 22) { return base64; } uuidTemplate[0] = base64[0]; uuidTemplate[1] = base64[1]; for (let i = 2, j = 2; i < 22; i += 2) { let lhs = BASE64_VALUES[base64.charCodeAt(i)]; let rhs = BASE64_VALUES[base64.charCodeAt(i + 1)]; uuidTemplate[indices[j++]] = HEXCHAR[lhs >> 2]; uuidTemplate[indices[j++]] = HEXCHAR[((lhs & 3) << 2) | rhs >> 4]; uuidTemplate[indices[j++]] = HEXCHAR[rhs & 0xF]; } return uuidTemplate.join(''); } pickPackageFiles(uuids) { if (!this.packedAssets) return uuids; for (const fileName in this.packedAssets) { const packageUUIDs = this.packedAssets[fileName]; let match = true; const removedUUIDs = []; for (const packageKey of packageUUIDs) { const packageUUID = this.toUUID(packageKey); const index = uuids.indexOf(packageUUID); match = index >= 0; if (match) { removedUUIDs.push(...uuids.splice(index, 1)); } else { uuids.push(...removedUUIDs); match = false; break; } } match && uuids.push(fileName); } return uuids; } } class JsonPackage { constructor(projectDir, buildDir) { this.assetsDir = path_1.default.join(projectDir, 'assets'); this.buildDir = buildDir; this.resourcesDir = path_1.default.join(buildDir, 'res'); this.outputDir = path_1.default.join(buildDir, 'res_package'); this.settingJSDecode = new SettingJSDecode(buildDir); const buildJson = fs_1.default.readFileSync(path_1.default.join(projectDir, 'build', 'build.json')); const buildData = JSON.parse(buildJson.toString()); this.uuidMap = buildData.uuid; this.fileRoomData = this.decodeRoomData(); } //通过鱼属性表读取相关资源所属的房间 decodeRoomData() { const filesRoomData = {}; const gameConfigPath = path_1.default.join(this.assetsDir, 'resources', 'conf', 'allConf.json'); const gameConfigContent = fs_1.default.readFileSync(gameConfigPath); const gameConfig = JSON.parse(gameConfigContent.toString()); const fishAttribute = this.dataArrayToObjectArray(gameConfig['FishAttribute']); for (const fish of fishAttribute) { //房间数据 const roomData = []; const fishName = fish.name; if (!fishName) continue; for (let roomType = 1; roomType <= ROOM_COUNT; roomType++) { roomData.push(fish[`room${roomType}`]); } //处理鱼资源、鱼技能资源 this.updateRoomData(filesRoomData, `resources/anim/clip/fish/${fishName}`, roomData); //鱼动画 this.updateRoomData(filesRoomData, `res/anim/texture/fish/${fishName}`, roomData); //鱼动画纹理 this.updateRoomData(filesRoomData, `resources/texture/hall/scenePage/${fishName}_rk`, roomData); //Loading图标 this.updateRoomData(filesRoomData, `resources/texture/hall/scenePage/${fishName}_rkdes`, roomData); //Loading文字 //处理背景资源 const backgroundString = fish.Background; if (backgroundString) { const background = backgroundString.split('|'); switch (background[0]) { case '1': this.updateRoomData(filesRoomData, `resources/texture/mainScene/bg/${background[1]}.png`, roomData); //鱼背景静态图 break; case '2': } } //处理音效资源 const audioString = fish.bossBgm; } return filesRoomData; } getUUIDsInPath(filePath, uuids) { uuids = uuids || []; this.uuidMap.forEach(({ db, uuid }) => { db = db.substring(12); //"db://assets/".length if (!db.startsWith(filePath)) return; if (uuids.indexOf(uuid) >= 0) return; uuids.push(uuid); }); return uuids; } dataArrayToObjectArray(data) { const title = data.shift(); const objArray = []; for (const dataItem of data) { const dataObj = {}; for (let i = 0, length = title.length; i < length; i++) { const key = title[i]; if (!key) break; dataObj[key] = dataItem[i]; } objArray.push(dataObj); } return objArray; } updateRoomData(container, key, data) { const exitsData = container[key]; if (!exitsData) { container[key] = data; } else { const result = []; for (let i = 0, length = Math.max(exitsData.length, data.length); i < length; i++) { result.push((exitsData[i] || data[i]) ? 1 : 0); } container[key] = result; } } mkdir(dir) { if (!fs_1.default.existsSync(dir)) { let parentDir = path_1.default.dirname(dir); this.mkdir(parentDir); fs_1.default.mkdirSync(dir); } } pickPackageFile(dir, names, cache) { cache = cache || {}; const files = fs_1.default.readdirSync(dir); for (let i = 0; i < files.length; i++) { const subFileName = files[i]; const subFilePath = path_1.default.join(dir, subFileName); const stat = fs_1.default.statSync(subFilePath); if (stat.isDirectory()) { this.pickPackageFile(subFilePath, names, cache); } else { if (path_1.default.extname(subFileName) !== '.json') continue; const fileName = subFileName.substring(0, subFileName.indexOf('.')); const nameIndex = names.indexOf(fileName); if (nameIndex < 0) { continue; } names.splice(nameIndex, 1); const content = fs_1.default.readFileSync(subFilePath).toString(); cache[fileName] = content; } } return cache; } package() { this.mkdir(this.outputDir); const result = []; for (let roomType = 1; roomType <= ROOM_COUNT; roomType++) { const configName = `config_${roomType}.json`; const uuids = []; for (const filePath in this.fileRoomData) { const fishRoomData = this.fileRoomData[filePath]; if (!fishRoomData[roomType - 1]) continue; this.getUUIDsInPath(filePath, uuids); } this.getUUIDsInPath(`resources/spine/mainScene/nGun`, uuids); this.getUUIDsInPath(`resources/spine/mainScene/yuwang`, uuids); this.getUUIDsInPath(`resources/spine/mainScene/superWeapon`, uuids); this.getUUIDsInPath(`resources/prefab/mainScene/preload`, uuids); this.getUUIDsInPath(`resources/spine/mainScene/preload`, uuids); this.getUUIDsInPath(`resources/prefab/mainScene/init`, uuids); this.getUUIDsInPath(`resources/prefab/mainScene/skill`, uuids); this.settingJSDecode.pickPackageFiles(uuids); const contents = this.pickPackageFile(this.resourcesDir, uuids); // console.log(`RoomUUIDs:\n${uuids.join(', ')}`); // console.log(`RoomErrorUUIDs:\n${uuids.join(', ')}`); for (const uuid in contents) result.push({ uuid, name: configName }); fs_1.default.writeFileSync(path_1.default.join(this.outputDir, configName), JSON.stringify(contents)); } fs_1.default.writeFileSync(path_1.default.join(this.outputDir, 'result.json'), JSON.stringify(result)); fs_1.default.copyFileSync(path_1.default.join(__dirname, 'prj.js'), path_1.default.join(this.buildDir, 'src', 'prj.js')); const indexPath = path_1.default.join(this.buildDir, 'index.html'); let htmlContent = fs_1.default.readFileSync(indexPath).toString(); const bodyEndIndex = htmlContent.indexOf(''); htmlContent = `${htmlContent.substring(0, bodyEndIndex)}${htmlContent.substring(bodyEndIndex)}`; fs_1.default.writeFileSync(indexPath, htmlContent); } } exports.JsonPackage = JsonPackage; const args = process.argv; const projectDir = args[2]; const buildDir = args[3]; new JsonPackage(projectDir, buildDir).package();