开发到一半,不能用

This commit is contained in:
枫谷剑仙 2022-06-22 18:13:32 +08:00
parent 0ddd9d7492
commit 0d46e88430
4 changed files with 233 additions and 188 deletions

View File

@ -1,8 +0,0 @@
{
"deno.enable": true,
"deno.lint": true,
"deno.unstable": true,
"deno.suggest.imports.hosts": {
"https://deno.land": false
}
}

View File

@ -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

66
update-service-worker.js Normal file
View File

@ -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 完毕");