338 lines
11 KiB
TypeScript
338 lines
11 KiB
TypeScript
/**
|
||
* 用于打包全部配置,将配置全部打包成一个文件
|
||
* 服务端版本处理ani.json和pst.json的时候,不会打入帧数据
|
||
*/
|
||
module pakdata
|
||
{
|
||
|
||
let path, fs;
|
||
let require = window["nodeRequire"];
|
||
if (typeof require === "function") { //是Electron环境
|
||
path = require("path");
|
||
fs = require("fs");
|
||
}
|
||
|
||
const cfgsSpiltInfoName = "CfgsSpiltInfo.json";
|
||
|
||
|
||
// 此处地址实际从外部传入解析
|
||
let IP_HOST = `192.168.92.178`;
|
||
let svnRoot = `//${IP_HOST}/web/`;
|
||
let clientDir = `//${IP_HOST}/web/config/zhcn/raw/`;
|
||
let packageRoot = `//${IP_HOST}/web/config/zhcn/`;
|
||
let aniPath = `//${IP_HOST}/web/resource/zhcn/ef/`;
|
||
let pstPath = `//${IP_HOST}/web/resource/zhcn/n/a/`;
|
||
|
||
export function initPathVars(url: string){
|
||
let boo = true;
|
||
let reg = /\/\/(.*?)\/(.*?)\//;
|
||
if (reg.test(url)){
|
||
let arg = reg.exec(url);
|
||
if (arg){
|
||
IP_HOST = arg[0];
|
||
svnRoot = `${IP_HOST}`;
|
||
clientDir = `${IP_HOST}config/zhcn/raw/`;
|
||
packageRoot = `${IP_HOST}config/zhcn/`;
|
||
aniPath = `${IP_HOST}resource/zhcn/ef/`;
|
||
pstPath = `${IP_HOST}resource/zhcn/n/a/`;
|
||
|
||
boo = false;
|
||
}
|
||
}
|
||
if (boo){
|
||
|
||
clientDir = url;
|
||
packageRoot = path.join(url, "..");
|
||
svnRoot = packageRoot;
|
||
|
||
IP_HOST = ``;
|
||
aniPath = ``;
|
||
pstPath = ``;
|
||
|
||
}
|
||
|
||
console.log(`IP_HOST=${IP_HOST}`);
|
||
console.log(`svnRoot=${svnRoot}`);
|
||
console.log(`clientDir=${clientDir}`);
|
||
console.log(`packageRoot=${packageRoot}`);
|
||
console.log(`aniPath=${aniPath}`);
|
||
console.log(`pstPath=${pstPath}`);
|
||
}
|
||
|
||
export var endCallBack;
|
||
export var traceLog;
|
||
export var traceErrorLog;
|
||
export var ifErrorCallBack;
|
||
export var isAutoSvn;
|
||
|
||
export async function packageForClient(){
|
||
|
||
let aniOutFile = path.join(clientDir, "ani.json");
|
||
let pstOutFile = path.join(clientDir, "pst.json");
|
||
let cfgsOutFile = path.join(packageRoot, "cfgs.json");
|
||
let firstOutFile = path.join(packageRoot, "basic.json");
|
||
let runningOutFile = path.join(packageRoot, "running.json");
|
||
|
||
let p = fs.statSync(clientDir);
|
||
if (!p.isDirectory()) {
|
||
console.error("文件夹有误");
|
||
if (ifErrorCallBack ) ifErrorCallBack();
|
||
return;
|
||
}
|
||
// if (isAutoSvn){
|
||
// try{
|
||
// await svncmd.update(svnRoot);
|
||
// } catch (e) {
|
||
// log(`[error svncmdUpdate] @@@ ${svnRoot}`);
|
||
// }
|
||
// }
|
||
// ani文件夹特殊处理
|
||
let cfgsOutData = {};
|
||
let aniData = parseAni(aniPath);
|
||
let pstData = parsePst(pstPath);
|
||
|
||
let cfgsSpiltInfoData = getCfgsSpiltInfo(clientDir);
|
||
console.log("++++++cfgsSpiltInfoData+++++++");
|
||
console.log(cfgsSpiltInfoData);
|
||
console.log("++++++cfgsSpiltInfoData+++++++");
|
||
|
||
let firstData = {};
|
||
let runningData = {};
|
||
let flist = fs.readdirSync(clientDir);
|
||
let basic = cfgsSpiltInfoData.basic || [];
|
||
let firstKeys = basic.length > 0 ? basic : ["Function", "FunctionOpen", "MapLine", "TribeType"];
|
||
let runningKeys = cfgsSpiltInfoData.running || [];
|
||
|
||
if (aniData){
|
||
if (firstKeys.indexOf("ani") != -1){
|
||
firstData["ani"] = aniData;
|
||
} else if (runningKeys.indexOf("ani") != -1){
|
||
runningData["ani"] = aniData;
|
||
} else {
|
||
cfgsOutData["ani"] = aniData;
|
||
}
|
||
}
|
||
if (pstData) {
|
||
if (firstKeys.indexOf("pst") != -1){
|
||
firstData["pst"] = pstData;
|
||
} else if (runningKeys.indexOf("pst") != -1){
|
||
runningData["pst"] = pstData;
|
||
} else {
|
||
cfgsOutData["pst"] = pstData;
|
||
}
|
||
}
|
||
|
||
flist.forEach(file => {
|
||
let re = path.parse(file);
|
||
let fname = re.name;
|
||
if (re.ext != ".json") {
|
||
return;
|
||
}
|
||
if (file == "ani.json" || file == "pst.json") {
|
||
// 此2文件已添加到outData中
|
||
return;
|
||
}
|
||
if (file == cfgsSpiltInfoName) {
|
||
return;// 配置分包信息不计入配置
|
||
}
|
||
let data = getData(path.join(clientDir, file));
|
||
if (data){
|
||
if (firstKeys.indexOf(fname) != -1){
|
||
firstData[fname] = data;
|
||
} else if (runningKeys.indexOf(fname) != -1){
|
||
runningData[fname] = data;
|
||
} else {
|
||
cfgsOutData[fname] = data;
|
||
}
|
||
}
|
||
});
|
||
|
||
|
||
// let t = JSON.stringify(cfgsOutData);
|
||
// let buf = new Buffer(t, "binary");
|
||
// if (buf instanceof Uint8Array){
|
||
// buf = new Buffer(buf);
|
||
// }
|
||
// console.log(buf);buf.toJSON();
|
||
// let tempP = path.join(packageRoot, "cfgs.bin");
|
||
// fs.writeFileSync(tempP, buf);
|
||
|
||
// let t1 = JSON.stringify(runningData);
|
||
// let buf1 = new Buffer(t1, "binary");
|
||
// console.log(buf1);
|
||
// let tempP1 = path.join(packageRoot, "running.bin");
|
||
// fs.writeFileSync(tempP1, buf1);
|
||
|
||
if (cfgsOutData) fs.writeFileSync(cfgsOutFile, JSON.stringify(cfgsOutData));
|
||
if (aniData) fs.writeFileSync(aniOutFile, JSON.stringify(aniData));
|
||
if (pstData) fs.writeFileSync(pstOutFile, JSON.stringify(pstData));
|
||
if (firstData) fs.writeFileSync(firstOutFile, JSON.stringify(firstData));
|
||
if (runningData) fs.writeFileSync(runningOutFile, JSON.stringify(runningData));
|
||
|
||
// if (isAutoSvn){
|
||
// try{
|
||
// await svncmd.add(packageRoot);
|
||
// } catch (e) {
|
||
// errorLog(`[error svncmdAdd]packageRoot:${packageRoot}`, e);
|
||
// }
|
||
|
||
// try{
|
||
// await svncmd.commit(packageRoot, "工具自动提交");
|
||
// } catch (e) {
|
||
// errorLog(`[error svncmdCommit]packageRoot:${packageRoot}`, e);
|
||
// }
|
||
// }
|
||
log("PackageData 脚本执行完成");
|
||
if( endCallBack ){
|
||
endCallBack();
|
||
}
|
||
}
|
||
|
||
function log(msg)
|
||
{
|
||
if (traceLog) traceLog( msg );
|
||
else console.log(msg);
|
||
}
|
||
|
||
function errorLog(msg: string, err?: Error)
|
||
{
|
||
if (traceErrorLog) traceErrorLog(msg, err);
|
||
else if (err) console.error(msg, err.message, err.stack);
|
||
else console.log(msg);
|
||
}
|
||
|
||
function getData(file)
|
||
{
|
||
if (!fs.existsSync(file) || !fs.statSync(file).isFile()) {
|
||
errorLog(`找不到文件${file}`);
|
||
return null;
|
||
}
|
||
log(`getData ${file}`);
|
||
let data;
|
||
try {
|
||
data = JSON.parse(fs.readFileSync(file, "utf8"));
|
||
}
|
||
catch (e) {
|
||
errorLog(`解析${file}数据,${file}时出错`, e);
|
||
}
|
||
return data;
|
||
}
|
||
|
||
function getCfgsSpiltInfo(root)
|
||
{
|
||
let file = path.join(root, cfgsSpiltInfoName);
|
||
let data = getData(file);
|
||
let basic = [];
|
||
let running = [];
|
||
if (data){
|
||
data.forEach(list=>{
|
||
let b = list[0];
|
||
let r = list[1];
|
||
if (b) basic.push(b);
|
||
if (r) running.push(r);
|
||
});
|
||
}
|
||
return { "basic": basic, "running":running };
|
||
}
|
||
/**
|
||
* 处理ani文件夹
|
||
*
|
||
* @param {string} aniPath ani文件处理路径
|
||
*/
|
||
function parseAni(aniPath, saveTexture = true)
|
||
{
|
||
log(`parseAni:${aniPath}`);
|
||
if(!fs.existsSync(aniPath)){
|
||
errorLog(`no aniPath:${aniPath}`);
|
||
return null;
|
||
}
|
||
var data = {};
|
||
let p = fs.statSync(aniPath);
|
||
if (!p.isDirectory()) {
|
||
errorLog("给的ani路径文件夹有误");
|
||
return null;
|
||
}
|
||
// 读取子文件夹
|
||
let flist = fs.readdirSync(aniPath);
|
||
flist.forEach(subDir => {
|
||
//ani文件夹应该为 a0.png和d.json两个文件
|
||
let p = path.join(aniPath, subDir);
|
||
let dp = path.join(p, "d.json");
|
||
//检查子文件夹文件
|
||
if (fs.existsSync(path.join(p, "a0.png")) && fs.existsSync(dp)) {
|
||
//有这两个文件,ani文件夹有效
|
||
let aniDat;
|
||
try {
|
||
aniDat = JSON.parse(fs.readFileSync(dp, "utf8"));
|
||
}
|
||
catch (e) {
|
||
errorLog(`解析ani数据,${dp}时出错`, e);
|
||
return;
|
||
}
|
||
if (!aniDat || !Array.isArray(aniDat)) {
|
||
errorLog(`解析ani数据,${dp}数据有误,不是数组`);
|
||
return;
|
||
}
|
||
if (!saveTexture) {
|
||
aniDat.length = 1;
|
||
}
|
||
data[subDir] = aniDat;
|
||
}
|
||
});
|
||
return data;
|
||
}
|
||
/**
|
||
* 处理pst文件夹
|
||
*
|
||
* @param {string} pstPath pst文件处理路径
|
||
*/
|
||
function parsePst(pstPath)
|
||
{
|
||
log(`parsePst:${pstPath}`);
|
||
if(!fs.existsSync(pstPath)){
|
||
errorLog(`no pstPath:${pstPath}`);
|
||
return null;
|
||
}
|
||
var data = {};
|
||
let p = fs.statSync(pstPath);
|
||
if (!p.isDirectory()) {
|
||
errorLog("给的pst路径文件夹有误");
|
||
return null;
|
||
}
|
||
// 读取子文件夹
|
||
let flist = fs.readdirSync(pstPath);
|
||
flist.forEach(subDir => {
|
||
//pst文件夹应该都包含 pst.json和d.json两个文件
|
||
let p = path.join(pstPath, subDir);
|
||
let dfile = path.join(p, "d.json");
|
||
let pfile = path.join(p, "pst.json");
|
||
//检查子文件夹文件
|
||
if (fs.existsSync(pfile) && fs.existsSync(dfile)) {
|
||
//有这两个文件,pst文件夹有效
|
||
let pstDat;
|
||
try {
|
||
let temp = JSON.parse(fs.readFileSync(pfile, "utf8"));
|
||
for (let key in temp){
|
||
pstDat = temp[key];
|
||
}
|
||
}
|
||
catch (e) {
|
||
errorLog(`解析ani数据,${pfile}时出错`, e);
|
||
return;
|
||
}
|
||
if (!pstDat || !Array.isArray(pstDat)) {
|
||
errorLog(`解析ani数据,${pfile}数据有误,不是数组`);
|
||
return;
|
||
}
|
||
/*
|
||
if (subDir == "A10") subDir = "1_0";
|
||
else if (subDir == "A11") subDir = "1_1";
|
||
*/
|
||
data[subDir] = pstDat;
|
||
}
|
||
});
|
||
return data;
|
||
}
|
||
|
||
|
||
} |