开发到一半,不能用
This commit is contained in:
parent
0ddd9d7492
commit
0d46e88430
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"deno.enable": true,
|
||||
"deno.lint": true,
|
||||
"deno.unstable": true,
|
||||
"deno.suggest.imports.hosts": {
|
||||
"https://deno.land": false
|
||||
}
|
||||
}
|
|
@ -5,27 +5,26 @@ const Skill = require('./official-API/parseSkill');
|
|||
const runDate = new Date();
|
||||
const officialAPI = [ //来源于官方API
|
||||
{
|
||||
code:"ja",
|
||||
customName:["cht","chs"]
|
||||
code: "ja",
|
||||
customName: ["cht", "chs"]
|
||||
},
|
||||
{
|
||||
code:"en",
|
||||
customName:[]
|
||||
code: "en",
|
||||
customName: []
|
||||
},
|
||||
{
|
||||
code:"ko",
|
||||
customName:[]
|
||||
code: "ko",
|
||||
customName: []
|
||||
}
|
||||
];
|
||||
|
||||
//数组去重
|
||||
Array.prototype.distinct = function() {
|
||||
Array.prototype.distinct = function () {
|
||||
let _set = new Set(this);
|
||||
return Array.from(_set)
|
||||
}
|
||||
//比较两只怪物是否是同一只(在不同语言服务器)
|
||||
function sameCard(m1,m2)
|
||||
{
|
||||
function sameCard(m1, m2) {
|
||||
if (m1 == undefined || m2 == undefined) return false; //是否存在
|
||||
if (m1.attrs[0] != m2.attrs[0]) return false; //主属性
|
||||
if (m1.attrs[1] != m2.attrs[1]) return false; //副属性
|
||||
|
@ -42,7 +41,7 @@ function sameCard(m1,m2)
|
|||
function getActuallySkills(skillsDataset, skillid, skillTypes, searchRandom = true) {
|
||||
const skill = skillsDataset[skillid];
|
||||
if (skill) {
|
||||
if (skillTypes.includes(skill.type)){
|
||||
if (skillTypes.includes(skill.type)) {
|
||||
return [skill];
|
||||
} else if (skill.type == 116 || //主动技
|
||||
(searchRandom && skill.type == 118) || //随机主动技
|
||||
|
@ -51,7 +50,7 @@ function getActuallySkills(skillsDataset, skillid, skillTypes, searchRandom = tr
|
|||
skill.type == 233) { //进化技能2,循环
|
||||
//因为可能有多层调用,特别是随机118再调用组合116的,所以需要递归
|
||||
let subSkills = skill.params.flatMap(id => getActuallySkills(skillsDataset, id, skillTypes, searchRandom));
|
||||
subSkills = subSkills.filter(s=>s);
|
||||
subSkills = subSkills.filter(s => s);
|
||||
return subSkills;
|
||||
} else {
|
||||
return [];
|
||||
|
@ -63,9 +62,9 @@ function getActuallySkills(skillsDataset, skillid, skillTypes, searchRandom = tr
|
|||
/*
|
||||
* 正式流程
|
||||
*/
|
||||
officialAPI.forEach(function(lang) {
|
||||
console.log("正在读取官方 %s 信息",lang.code);
|
||||
const cardJson = fs.readFileSync("official-API/" + lang.code +"-card.json", 'utf-8'); //使用同步读取怪物
|
||||
officialAPI.forEach(function (lang) {
|
||||
console.log("正在读取官方 %s 信息", lang.code);
|
||||
const cardJson = fs.readFileSync("official-API/" + lang.code + "-card.json", 'utf-8'); //使用同步读取怪物
|
||||
const cardJsonObj = JSON.parse(cardJson);
|
||||
const oCards = lang.cardOriginal = cardJsonObj.card;//将字符串转换为json对象
|
||||
|
||||
|
@ -83,8 +82,7 @@ officialAPI.forEach(function(lang) {
|
|||
nCard.specialVersion[Math.floor(mid / 100000)] = new Card(oCard);
|
||||
}
|
||||
});*/
|
||||
for (let cardIndex = 0; oCards[cardIndex][0] === cardIndex; cardIndex++)
|
||||
{
|
||||
for (let cardIndex = 0; oCards[cardIndex][0] === cardIndex; cardIndex++) {
|
||||
const card = new Card(oCards[cardIndex]);
|
||||
delete card.enemy;
|
||||
delete card.unk01;
|
||||
|
@ -95,7 +93,7 @@ officialAPI.forEach(function(lang) {
|
|||
delete card.unk06;
|
||||
delete card.unk07;
|
||||
delete card.unk08;
|
||||
if (card.searchFlags.every(num=>isNaN(num)))
|
||||
if (card.searchFlags.every(num => isNaN(num)))
|
||||
delete card.searchFlags;
|
||||
monCards.push(card);
|
||||
}
|
||||
|
@ -115,40 +113,38 @@ officialAPI.forEach(function(lang) {
|
|||
*/
|
||||
|
||||
//加入自定义的语言
|
||||
lang.customName.forEach(function(lcode){
|
||||
lang.customName.forEach(function (lcode) {
|
||||
console.log("正在读取自定义 " + lcode + " 信息");
|
||||
const ljson = fs.readFileSync("custom/" + lcode +".json", 'utf-8'); //使用同步读取
|
||||
const ljson = fs.readFileSync("custom/" + lcode + ".json", 'utf-8'); //使用同步读取
|
||||
const ccard = JSON.parse(ljson);//将字符串转换为json对象
|
||||
ccard.forEach(function(cm){ //每个文件内的名字循环
|
||||
ccard.forEach(function (cm) { //每个文件内的名字循环
|
||||
let m = monCards[cm.id];
|
||||
if (m)
|
||||
{
|
||||
if (m) {
|
||||
if (!m.otLangName) //如果没有其他语言名称属性,则添加一个对象属性
|
||||
m.otLangName = {};
|
||||
m.otLangName[lcode] = cm.name;
|
||||
if (!m.otTags) //如果没有其他语言名称属性,则添加一个对象属性
|
||||
m.otTags = [];
|
||||
|
||||
|
||||
let newTags = Array.from(new Set(cm.tags));
|
||||
newTags = newTags.filter(tag=>!m.altName.includes(tag) && !m.otTags.includes(tag));
|
||||
newTags = newTags.filter(tag => !m.altName.includes(tag) && !m.otTags.includes(tag));
|
||||
m.otTags.push(...newTags);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
const skillJson = fs.readFileSync("official-API/" + lang.code +"-skill.json", 'utf-8'); //使用同步读取技能
|
||||
const skillJson = fs.readFileSync("official-API/" + lang.code + "-skill.json", 'utf-8'); //使用同步读取技能
|
||||
const skillJsonObj = JSON.parse(skillJson);
|
||||
const oSkills = lang.skillOriginal = skillJsonObj.skill;//将字符串转换为json对象
|
||||
lang.skills = oSkills.map((oc,idx)=>new Skill(idx,oc)); //每一项生成分析对象
|
||||
lang.skills = oSkills.map((oc, idx) => new Skill(idx, oc)); //每一项生成分析对象
|
||||
|
||||
lang.cards.forEach((m, idx, cardArr)=>{
|
||||
lang.cards.forEach((m, idx, cardArr) => {
|
||||
let henshinTo = null;
|
||||
const henshinSkill = getActuallySkills(lang.skills, m.activeSkillId, [202, 236]);
|
||||
if (henshinSkill.length) {
|
||||
const skill = henshinSkill[0];
|
||||
henshinTo = skill.params.distinct();
|
||||
if (Array.isArray(henshinTo))
|
||||
{
|
||||
if (Array.isArray(henshinTo)) {
|
||||
m.henshinTo = henshinTo;
|
||||
//变身来源可能有多个,因此将变身来源修改为数组
|
||||
for (let toId of henshinTo) {
|
||||
|
@ -169,57 +165,52 @@ officialAPI.forEach(function(lang) {
|
|||
});
|
||||
|
||||
//加入其他服务器相同角色的名字
|
||||
for (let li = 0;li < officialAPI.length; li++)
|
||||
{
|
||||
for (let li = 0; li < officialAPI.length; li++) {
|
||||
const otherLangs = officialAPI.concat(); //复制一份原始数组,储存其他语言
|
||||
const lang = otherLangs.splice(li,1)[0]; //删掉并取得当前的语言
|
||||
const lang = otherLangs.splice(li, 1)[0]; //删掉并取得当前的语言
|
||||
|
||||
const langCard = lang.cards;
|
||||
const langCardCount = langCard.length;
|
||||
for (let mi=0; mi<langCardCount; mi++)
|
||||
{
|
||||
for (let mi = 0; mi < langCardCount; mi++) {
|
||||
const m = langCard[mi];
|
||||
const name = m.name; //当前语言的名字
|
||||
|
||||
//名字对象
|
||||
otherLangs.forEach((otLang)=>{
|
||||
otherLangs.forEach((otLang) => {
|
||||
let _m = otLang.cards[mi]; //获得这种其他语言的当前这个怪物数据
|
||||
let isSame = sameCard(m,_m); //与原语言怪物是否是同一只
|
||||
let isSame = sameCard(m, _m); //与原语言怪物是否是同一只
|
||||
const l1 = lang.code, l2 = otLang.code;
|
||||
if (!isSame && //如果不同时,判断特殊情况
|
||||
(
|
||||
l1 == 'ja' && (l2 == 'en' || l2 == 'ko') ||
|
||||
l2 == 'ja' && (l1 == 'en' || l1 == 'ko')
|
||||
)
|
||||
)
|
||||
{ //当同id两者不同,日服和英韩服比较时的一些人工确认相同的特殊id差异卡片
|
||||
) { //当同id两者不同,日服和英韩服比较时的一些人工确认相同的特殊id差异卡片
|
||||
const langIsJa = l1 == 'ja' ? true : false; //原始语言是否是日语
|
||||
let diff = 0; //日语和其它语言的id差异
|
||||
switch(true)
|
||||
{
|
||||
case (langIsJa && mi>=671 && mi<= 680) ||
|
||||
(!langIsJa && mi>=1049 && mi<= 1058):
|
||||
switch (true) {
|
||||
case (langIsJa && mi >= 671 && mi <= 680) ||
|
||||
(!langIsJa && mi >= 1049 && mi <= 1058):
|
||||
//神罗 日服 671-680 等于英韩服 1049-1058
|
||||
diff = 378;
|
||||
break;
|
||||
case (langIsJa && mi>=669 && mi<= 670) ||
|
||||
(!langIsJa && mi>=934 && mi<= 935):
|
||||
case (langIsJa && mi >= 669 && mi <= 670) ||
|
||||
(!langIsJa && mi >= 934 && mi <= 935):
|
||||
//神罗 日服 669-670 等于英韩服 934-935
|
||||
diff = 265;
|
||||
break;
|
||||
case (langIsJa && mi>=924 && mi<= 935) ||
|
||||
(!langIsJa && mi>=669 && mi<= 680):
|
||||
case (langIsJa && mi >= 924 && mi <= 935) ||
|
||||
(!langIsJa && mi >= 669 && mi <= 680):
|
||||
//蝙蝠侠 日服 924-935 等于英韩服 669-680
|
||||
diff = -255;
|
||||
break;
|
||||
case (langIsJa && mi>=1049 && mi<= 1058) ||
|
||||
(!langIsJa && mi>=924 && mi<= 933):
|
||||
case (langIsJa && mi >= 1049 && mi <= 1058) ||
|
||||
(!langIsJa && mi >= 924 && mi <= 933):
|
||||
//蝙蝠侠 日服 1049-1058 等于英韩服 924-933
|
||||
diff = -125;
|
||||
break;
|
||||
}
|
||||
if (diff != 0)
|
||||
{
|
||||
if (diff != 0) {
|
||||
_m = langIsJa ? otLang.cards[mi + diff] : otLang.cards[mi - diff];
|
||||
isSame = true;
|
||||
}
|
||||
|
@ -230,16 +221,14 @@ for (let li = 0;li < officialAPI.length; li++)
|
|||
if (/^(?:\?+|\*+|초월\s*\?+)/i.test(otName)) //名字以问号、星号、韩文的问号开头
|
||||
{
|
||||
return; //跳过
|
||||
}else
|
||||
{
|
||||
} else {
|
||||
if (!m.otLangName) //如果没有其他语言名称属性,则添加一个对象属性
|
||||
m.otLangName = {};
|
||||
|
||||
m.otLangName[otLang.code] = otName;
|
||||
|
||||
if (_m.otLangName)
|
||||
{ //增加储存当前语言的全部其他语言
|
||||
Object.entries(_m.otLangName).forEach(entry=>{
|
||||
if (_m.otLangName) { //增加储存当前语言的全部其他语言
|
||||
Object.entries(_m.otLangName).forEach(entry => {
|
||||
const lcode = entry[0];
|
||||
if (lcode != l1 && !Object.keys(m.otLangName).includes(lcode)) //如果不是本来的的语言
|
||||
m.otLangName[lcode] = entry[1];
|
||||
|
@ -251,28 +240,28 @@ for (let li = 0;li < officialAPI.length; li++)
|
|||
m.otTags = [];
|
||||
|
||||
let otTags = Array.from(new Set(_m.otTags ? _m.altName.concat(_m.otTags) : _m.altName));
|
||||
otTags = otTags.filter(tag=>!m.altName.includes(tag) && !m.otTags.includes(tag));
|
||||
otTags = otTags.filter(tag => !m.altName.includes(tag) && !m.otTags.includes(tag));
|
||||
m.otTags.push(...otTags);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var newCkeyObjs = officialAPI.map(lang=>{
|
||||
var newCkeyObjs = officialAPI.map(lang => {
|
||||
const lcode = lang.code;
|
||||
const cardStr = JSON.stringify(lang.cards);
|
||||
const skillStr = JSON.stringify(lang.skills);
|
||||
|
||||
|
||||
//写入Cards
|
||||
fs.writeFile(`./mon_${lcode}.json`,cardStr,function(err){
|
||||
if(err){
|
||||
fs.writeFile(`./mon_${lcode}.json`, cardStr, function (err) {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
}
|
||||
console.log(`mon_${lcode}.json 导出成功`);
|
||||
});
|
||||
//写入Skills
|
||||
fs.writeFile(`./skill_${lcode}.json`,skillStr,function(err){
|
||||
if(err){
|
||||
fs.writeFile(`./skill_${lcode}.json`, skillStr, function (err) {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
}
|
||||
console.log(`skill_${lcode}.json 导出成功`);
|
||||
|
@ -303,25 +292,21 @@ var newCkeyObjs = officialAPI.map(lang=>{
|
|||
});
|
||||
//读取旧的ckeyObj
|
||||
var ckeyObjs;
|
||||
fs.readFile('./ckey.json','utf-8',function(err,data){
|
||||
if(err)
|
||||
{ //如果读取错误,直接使用全新ckey
|
||||
fs.readFile('./ckey.json', 'utf-8', function (err, data) {
|
||||
if (err) { //如果读取错误,直接使用全新ckey
|
||||
ckeyObjs = newCkeyObjs;
|
||||
} else
|
||||
{ //如果读取正确,则读入JSON,并判断是否和旧有的一致
|
||||
} else { //如果读取正确,则读入JSON,并判断是否和旧有的一致
|
||||
ckeyObjs = JSON.parse(data);
|
||||
for (let ci=0;ci<ckeyObjs.length;ci++)
|
||||
{
|
||||
for (let ci = 0; ci < ckeyObjs.length; ci++) {
|
||||
const oldCkey = ckeyObjs[ci];
|
||||
const newCkey = newCkeyObjs.find(nckey=>nckey.code === oldCkey.code);
|
||||
if (newCkey && (oldCkey.ckey.card != newCkey.ckey.card || oldCkey.ckey.skill != newCkey.ckey.skill))
|
||||
{
|
||||
const newCkey = newCkeyObjs.find(nckey => nckey.code === oldCkey.code);
|
||||
if (newCkey && (oldCkey.ckey.card != newCkey.ckey.card || oldCkey.ckey.skill != newCkey.ckey.skill)) {
|
||||
ckeyObjs[ci] = newCkey;
|
||||
}
|
||||
}
|
||||
}
|
||||
fs.writeFile('./ckey.json',JSON.stringify(ckeyObjs),function(err){
|
||||
if(err){
|
||||
fs.writeFile('./ckey.json', JSON.stringify(ckeyObjs), function (err) {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
}
|
||||
console.log('ckey.json 导出成功');
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,66 @@
|
|||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const crypto = require('crypto');
|
||||
|
||||
const servers = [
|
||||
{
|
||||
code:"ja"
|
||||
},
|
||||
{
|
||||
code:"en"
|
||||
},
|
||||
{
|
||||
code:"ko"
|
||||
}
|
||||
];
|
||||
function filesHashArr(dirName, extName) {
|
||||
const dirFiles = fs.readdirSync(dirName);
|
||||
const hashArr = [];
|
||||
for (let fileName of dirFiles) {
|
||||
if (
|
||||
typeof(extName) == "string" && path.extname(fileName) !== extName || //如果扩展名是字符串,不匹配则跳过
|
||||
extName instanceof RegExp && !extName.test(path.extname(fileName)) || //如果扩展名是正则表达式,不匹配则跳过
|
||||
Array.isArray(extName) && extName.every(ext=>path.extname(fileName) !== ext) //如果扩展名是数组,则多次匹配字符串,不匹配则跳过
|
||||
) continue;
|
||||
const fullFileName = path.join(dirName, fileName);
|
||||
const file = fs.readFileSync(fullFileName);
|
||||
const cardHash = crypto.createHash('md5');
|
||||
cardHash.update(file);
|
||||
const md5 = cardHash.digest('hex');
|
||||
//console.log(fullFileName, md5);
|
||||
hashArr.push([fullFileName.replaceAll("\\", "\/"), md5]);
|
||||
}
|
||||
return hashArr;
|
||||
}
|
||||
const cachesArr = [];
|
||||
for (let server of servers) {
|
||||
const cardsHash = filesHashArr(`./images/cards_${server.code}`);
|
||||
const voiceHash = filesHashArr(`./sound/voice/${server.code}`);
|
||||
cachesArr.push([`card-${server.code}`, cardsHash]);
|
||||
cachesArr.push([`voice-${server.code}`, voiceHash]);
|
||||
}
|
||||
//字体
|
||||
const fontsHash = filesHashArr("./fonts", /\.woff2?$/i);
|
||||
cachesArr.push([`fonts`, fontsHash]);
|
||||
//程序
|
||||
const programHash = filesHashArr("./", /\.(js|html|css)$/i);
|
||||
programHash.splice(programHash.findIndex(item=>item[0] === "service-worker.js"), 1); //不要把service-worker自身加入
|
||||
const UiImageHash = filesHashArr("./images", /\.(png|webp|svg)$/i);
|
||||
cachesArr.push([`program`, programHash.concat(UiImageHash)]);
|
||||
//第三方库
|
||||
const libraryHash = filesHashArr("./library", /\.js/i); //第三方库
|
||||
const library_aaaHash = filesHashArr("./library/jy4340132-aaa", /\.(js|wasm)$/i); //播放语音的库
|
||||
cachesArr.push([`library`, libraryHash.concat(library_aaaHash)]);
|
||||
//数据
|
||||
const dataHash = filesHashArr("./monsters-info", /\.json$/i);
|
||||
cachesArr.push([`data`, dataHash]);
|
||||
//文档
|
||||
const docHash = filesHashArr("./doc", /\.html$/i);
|
||||
const docImageHash = filesHashArr("./doc/images", /\.(png|webp|svg)$/i);
|
||||
cachesArr.push([`document`, docHash.concat(docImageHash)]);
|
||||
|
||||
const swJs = fs.readFileSync('./service-worker.js', 'utf-8');
|
||||
let formatterHashes = false;
|
||||
const newSwJs = swJs.replace(/(const\s+cachesArray\s*=\s*)[\s\S]+?;/i, `$1${JSON.stringify(cachesArr, undefined, formatterHashes ? "\t" : undefined)};`);
|
||||
fs.writeFileSync('./service-worker.js', newSwJs, 'utf-8');
|
||||
console.log("更新 service-worker.js 完毕");
|
Loading…
Reference in New Issue