关于尘白禁区的spine动画还原

发一发写的.uexp提取.atlas和.json的脚本,本来不想发的。然后一看.uexp的格式,啊,真的操蛋。提出来之后有几个json有小问题,懒得修了,直接手动修正。

import path from 'path'
import fs from "fs"

function scanDirectory(directory) {
    fs.readdirSync(directory).forEach(file => {
        const absolute = path.join(directory, file);
        if (fs.statSync(absolute).isDirectory()) {
            if (path.basename(absolute) !== 'Textures') {
                return scanDirectory(absolute);
            }
        } else if (path.extname(absolute) === '.uexp') {
            processUexpFile(absolute);
        }
    });
}

function processUexpFile(filePath) {
    const originalData = fs.readFileSync(filePath);
    let readPtr = 0, writePtr = 0;
    while (readPtr < originalData.length) {
        if (originalData[readPtr] !== 0x00) {
            originalData[writePtr++] = originalData[readPtr];
        }
        readPtr++;
    }
    let data = originalData.slice(0, writePtr);
    // console.log(dataString_temp);
    // dataString_temp.length = index
    // data = Buffer.from(dataString_temp, 'hex');
    // console.log(data);
    let dataStr = data.toString('utf8');

    let startAtlas = dataStr.search(/\n[a-zA-Z_]/);
    if (startAtlas !== -1) {
        startAtlas++; // Adjust to point to the character after '\n'
    }
    // console.log(startAtlas);
    const endAtlas = data.lastIndexOf(Buffer.from([0x69, 0x6E, 0x64, 0x65, 0x78, 0x3A, 0x20, 0x2D, 0x31])) + 10;
    dataStr = dataStr.slice(endAtlas)
    // const startJson = data.indexOf(Buffer.from([0x7B]), endAtlas);
    let startJson = dataStr.search(/(\{\n)|(\{\")/) + endAtlas
    if(startJson <= endAtlas) {
        startJson = data.indexOf(Buffer.from([0x7B]), endAtlas);
    }
    console.log(startJson);
    const endJson = data.lastIndexOf(Buffer.from([0x7D])) + 1;

    if (startAtlas < endAtlas && startJson < endJson) {
        const atlasData = data.slice(startAtlas, endAtlas);
        const jsonData = data.slice(startJson, endJson);
        
        const baseName = path.basename(filePath, path.extname(filePath));
        const dirName = path.dirname(filePath);

        fs.writeFileSync(path.join(dirName, baseName + '.atlas'), atlasData);
        fs.writeFileSync(path.join(dirName, baseName + '.json'), jsonData);
        console.log(path.join(dirName, baseName + '.atlas') + " 已保存");
        console.log(path.join(dirName, baseName + '.json') + " 已保存");
    }
}

// Replace '<your-directory>' with your directory path
scanDirectory('D:\\demo\\PUBG Dump');
2 个赞