Merge branch 'master' into skillParser

This commit is contained in:
枫谷剑仙 2021-07-23 14:59:24 +08:00
commit 85bf5a0e1b
38 changed files with 415 additions and 297 deletions

BIN
document/tips-voice.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -79,11 +79,14 @@ Formation Title and Detail can use the `^[Hex Color Code]^Content^p` to change t
![怪物头像](document/tips-advanced-card.png)
## 其他 | Others
* 点击语音觉醒可以试听技能语音。
Click Voice Awakening to try out skill voice.
![语音觉醒](document/tips-voice.png)
* 2人只显示部分共用的觉醒的统计不包括超觉醒单人和三人则全部显示。
The 2P Multi Games Mode shows only several common awoken statistics (excluding super-awakening), but the Solo and 3P Mode shows all.
* 内建的截图按钮依靠 [html2canvas](https://github.com/niklasvh/html2canvas/),会有一些绘制错误,浏览器的截图扩展能够更加还原显示的真实样子。
Built-in screenshot button relies on [html2canvas](https://github.com/niklasvh/html2canvas/), there will be some drawing errors, browser screenshot extension can be more restore the real appearance of the display.
* 如果你只是希望将本程序当作简单图鉴使用,可以在参数里加上`guide=1`,如`http://mapaler.gitee.io/paddashformation/solo.html?guide=1`。图鉴模式下进入网页时,会直接打开怪物修改界面,并且背景不透明。
* 如果你只是希望将本程序当作简单图鉴使用,可以在参数里加上`guide=1`,如`https://mapaler.gitee.io/paddashformation/solo.html?guide=1`。图鉴模式下进入网页时,会直接打开怪物修改界面,并且背景不透明。
If you just want to use this program as a simple guide, you can add `guide=1` to the parameters, such as `https://mapaler.github.io/PADDashFormation/solo.html?guide=1`. When you enter the page in guide mode, the monster modification interface opens directly and the background is opaque.
## 报告BUG | Report BUG

Binary file not shown.

Before

Width:  |  Height:  |  Size: 820 KiB

After

Width:  |  Height:  |  Size: 882 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 330 KiB

After

Width:  |  Height:  |  Size: 631 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

View File

@ -255,31 +255,32 @@ function parseSkillDescription(skill) {
let mulArr = null;
if (Array.isArray(values)) {
mulArr = [
1,
values[0] / 100,
values[1] / 100,
100,
values[0],
values[1],
];
} else {
mulArr = [
(values.hp || 100) / 100,
(values.atk || 100) / 100,
(values.rcv || 100) / 100
(values.hp || 100),
(values.atk || 100),
(values.rcv || 100)
];
}
const hasMul = mulArr.filter(m => m != 1); //不是1的数值
let hasMul = new Set(mulArr);
hasMul.delete(100);
hasMul = Array.from(hasMul);
let str = "";
if (hasMul.length > 0) {
const hasDiff = hasMul.filter(m => m != hasMul[0]).length > 0; //存在不一样的值
if (hasDiff) {
str += mulArr.map((m, i) => (m > 0 && m != 1) ? (mulName[i] + (scale ? (m >= 1 ? `×${m}` : `变为${m*100}%`) : `增加${m*100}%`)) : null).filter(s => s != null).join("");
if (hasMul.length > 1) { //存在不一样的值
str += mulArr.map((m, i) => (m > 0 && m != 100) ? (mulName[i] + (scale ? (m >= 1 ? `×${m/100}` : `变为${m}%`) : `增加${m}%`)) : null).filter(s => s != null).join("");
} else {
let hasMulName = mulName.filter((n, i) => mulArr[i] != 1);
let hasMulName = mulName.filter((n, i) => mulArr[i] != 100);
if (hasMulName.length >= 3) {
str += hasMulName.slice(0, hasMulName.length - 1).join("、") + "和" + hasMulName[hasMulName.length - 1];
} else {
str += hasMulName.join("和");
}
str += scale ? (hasMul[0] >= 1 ? `×${hasMul[0]}` : `变为${hasMul[0]*100}%`) : `增加${hasMul[0]*100}%`;
str += scale ? (hasMul[0] >= 1 ? `×${hasMul[0]/100}` : `变为${hasMul[0]}%`) : `增加${hasMul[0]}%`;
}
} else {
str += "能力值没有变化";
@ -1550,6 +1551,21 @@ function parseSkillDescription(skill) {
case 224:
str = `${sk[0]}回合内,敌人全体变为${attrN(sk[1])}属性。(不受防护盾的影响)`;
break;
case 225:{
let strArr = [];
if (sk[0]) strArr.push(`大于${sk[0]}%`);
if (sk[1]) strArr.push(`小于${sk[1]}%`);
str = `HP${strArr.join("或")}时才能发动后续效果`;
break;
}
case 226:{
str = `${sk[0]}回合内,${sk[1]}%概率掉落带钉宝珠`;
break;
}
case 227:{
str = `指使当前队长与最后一位队员交换位置,再次使用此技能则换回来(待测试)。`;
break;
}
case 228:
str = `${sk[0]}回合内队伍中每存在1个${getAttrTypeString(flags(sk[1]), flags(sk[2]))}时,${getFixedHpAtkRcvString({atk:sk[3],rcv:sk[4]}, false)}`;
break;
@ -1747,7 +1763,43 @@ function parseSkillDescription(skill) {
return -1;
}
}
function boardChange_ColorTypes(skill)
{
if (!skill) return [];
const sk = skill.params;
const colors = sk.slice(0, sk.includes(-1)?sk.indexOf(-1):undefined);
return colors;
}
function boardChange_Addition(card)
{
const searchTypeArray = [71];
const skill = getCardSkill(card, searchTypeArray);
const colors = boardChange_ColorTypes(skill);
return createOrbsList(colors);
}
function changeOrbs_Addition(card)
{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
const sk = skill.params;
const fragment = document.createDocumentFragment();
fragment.appendChild(createOrbsList(flags(sk[0] || 1)));
fragment.appendChild(document.createTextNode(``));
fragment.appendChild(createOrbsList(flags(sk[1] || 1)));
return fragment;
}
function generateOrbs_Addition(card)
{
const searchTypeArray = [141];
const skill = getCardActiveSkill(card, searchTypeArray);
const sk = skill.params;
const fragment = document.createDocumentFragment();
fragment.appendChild(createOrbsList(flags(sk[1] || 1)));
fragment.appendChild(document.createTextNode(`×${sk[0]}`));
return fragment;
}
//创建1个觉醒图标
function createAwokenIcon(awokenId)
{
@ -1769,6 +1821,8 @@ function parseSkillDescription(skill) {
//产生宝珠列表
function createOrbsList(orbs)
{
if (orbs == undefined) orbs = [0];
else if (!Array.isArray(orbs)) orbs = [orbs];
const ul = document.createElement("ul");
ul.className = "board";
orbs.forEach(orbType => {
@ -2596,7 +2650,7 @@ function parseSkillDescription(skill) {
return document.createTextNode(`${value == 9999 ? "全" : value + "T"}解禁消`);
}
},
{name:"自封技能(能干啥?)",function:cards=>cards.filter(card=>{
{name:"自封技能",function:cards=>cards.filter(card=>{
const searchType = 214;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType)
@ -2606,7 +2660,7 @@ function parseSkillDescription(skill) {
return subskills.some(subskill=>subskill.type == searchType);
}
})},
{name:"自封消珠(能干啥?)",function:cards=>cards.filter(card=>{
{name:"自封消珠",function:cards=>cards.filter(card=>{
const searchType = 215;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType)
@ -2692,189 +2746,6 @@ function parseSkillDescription(skill) {
})},
]},
{group:"-----洗版类-----", functions: [
{name:"普通洗版-含心",function:cards=>cards.filter(card=>{
function includeHeart(sk)
{
const color = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return color.includes(5);
}
const searchType = 71;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType && includeHeart(skill.params))
return true;
else if (skill.type == 116 || skill.type == 118){
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType && includeHeart(subskill.params));
}
})},
{name:"普通洗版-不含心",function:cards=>cards.filter(card=>{
function excludeHeart(sk)
{
const color = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return !color.includes(5);
}
const searchType = 71;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType && excludeHeart(skill.params))
return true;
else if (skill.type == 116 || skill.type == 118){
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType && excludeHeart(subskill.params));
}
})},
{name:"普通洗版-含毒废",function:cards=>cards.filter(card=>{
function includeHeart(sk)
{
const color = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return color.includes(6) || color.includes(7) || color.includes(8) || color.includes(9);
}
const searchType = 71;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType && includeHeart(skill.params))
return true;
else if (skill.type == 116 || skill.type == 118){
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType && includeHeart(subskill.params));
}
})},
{name:"普通洗版1色花火",function:cards=>cards.filter(card=>{
function isOnlyColor(sk, colorTypeCount)
{
const color = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return color.length == colorTypeCount;
}
const searchType = 71;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType && isOnlyColor(skill.params, 1))
return true;
else if (skill.type == 116 || skill.type == 118){
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType && isOnlyColor(subskill.params, 1));
}
}),addition:card=>{
const searchTypeArray = [71];
const skill = getCardSkill(card, searchTypeArray);
const sk = skill.params;
const colors = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return createOrbsList(colors);
}},
{name:"普通洗版2色",function:cards=>cards.filter(card=>{
function isOnlyColor(sk, colorTypeCount)
{
const color = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return color.length == colorTypeCount;
}
const searchType = 71;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType && isOnlyColor(skill.params, 2))
return true;
else if (skill.type == 116 || skill.type == 118){
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType && isOnlyColor(subskill.params, 2));
}
}),addition:card=>{
const searchTypeArray = [71];
const skill = getCardSkill(card, searchTypeArray);
const sk = skill.params;
const colors = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return createOrbsList(colors);
}},
{name:"普通洗版3色",function:cards=>cards.filter(card=>{
function isOnlyColor(sk, colorTypeCount)
{
const color = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return color.length == colorTypeCount;
}
const searchType = 71;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType && isOnlyColor(skill.params, 3))
return true;
else if (skill.type == 116 || skill.type == 118){
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType && isOnlyColor(subskill.params, 3));
}
}),addition:card=>{
const searchTypeArray = [71];
const skill = getCardSkill(card, searchTypeArray);
const sk = skill.params;
const colors = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return createOrbsList(colors);
}},
{name:"普通洗版4色",function:cards=>cards.filter(card=>{
function isOnlyColor(sk, colorTypeCount)
{
const color = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return color.length == colorTypeCount;
}
const searchType = 71;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType && isOnlyColor(skill.params, 4))
return true;
else if (skill.type == 116 || skill.type == 118){
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType && isOnlyColor(subskill.params, 4));
}
}),addition:card=>{
const searchTypeArray = [71];
const skill = getCardSkill(card, searchTypeArray);
const sk = skill.params;
const colors = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return createOrbsList(colors);
}},
{name:"普通洗版5色",function:cards=>cards.filter(card=>{
function isOnlyColor(sk, colorTypeCount)
{
const color = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return color.length == colorTypeCount;
}
const searchType = 71;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType && isOnlyColor(skill.params, 5))
return true;
else if (skill.type == 116 || skill.type == 118){
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType && isOnlyColor(subskill.params, 5));
}
}),addition:card=>{
const searchTypeArray = [71];
const skill = getCardSkill(card, searchTypeArray);
const sk = skill.params;
const colors = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return createOrbsList(colors);
}},
{name:"普通洗版6色以上",function:cards=>cards.filter(card=>{
function isOnlyColor(sk, colorTypeCount)
{
const color = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return color.length >= colorTypeCount;
}
const searchType = 71;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType && isOnlyColor(skill.params, 6))
return true;
else if (skill.type == 116 || skill.type == 118){
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType && isOnlyColor(subskill.params, 6));
}
}),addition:card=>{
const searchTypeArray = [71];
const skill = getCardSkill(card, searchTypeArray);
const sk = skill.params;
const colors = sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined);
return createOrbsList(colors);
}},
{name:"刷版",function:cards=>cards.filter(card=>{
const searchType = 10;
const skill = Skills[card.activeSkillId];
@ -2885,8 +2756,176 @@ function parseSkillDescription(skill) {
return subskills.some(subskill=>subskill.type == searchType);
}
})},
{name:"洗版-1色花火",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).length == 1;
}),addition:boardChange_Addition},
{name:"洗版-2色",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).length == 2;
}),addition:boardChange_Addition},
{name:"洗版-3色",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).length == 3;
}),addition:boardChange_Addition},
{name:"洗版-4色",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).length == 4;
}),addition:boardChange_Addition},
{name:"洗版-5色",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).length == 5;
}),addition:boardChange_Addition},
{name:"洗版-6色以上",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).length >= 6;
}),addition:boardChange_Addition},
{name:"洗版-含火",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).includes(0);
})},
{name:"洗版-含水",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).includes(1);
})},
{name:"洗版-含木",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).includes(2);
})},
{name:"洗版-含光",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).includes(3);
})},
{name:"洗版-含暗",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).includes(4);
})},
{name:"洗版-含心",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).includes(5);
})},
{name:"洗版-含毒废",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
const colors = boardChange_ColorTypes(skill);
return colors.includes(6)
|| colors.includes(7)
|| colors.includes(8)
|| colors.includes(9);
})},
]},
{group:"-----指定色转珠类-----", functions: [
{name:"转珠-变为-火",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[1] || 1).includes(0);
}),addition:changeOrbs_Addition},
{name:"转珠-变为-水",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[1] || 1).includes(1);
}),addition:changeOrbs_Addition},
{name:"转珠-变为-木",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[1] || 1).includes(2);
}),addition:changeOrbs_Addition},
{name:"转珠-变为-光",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[1] || 1).includes(3);
}),addition:changeOrbs_Addition},
{name:"转珠-变为-暗",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[1] || 1).includes(4);
}),addition:changeOrbs_Addition},
{name:"转珠-变为-心",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[1] || 1).includes(5);
}),addition:changeOrbs_Addition},
{name:"转珠-变为-毒废",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return (sk[1] & 960) > 0;
}),addition:changeOrbs_Addition},
{name:"转珠-转走-火",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[0] || 1).includes(0);
})},
{name:"转珠-转走-水",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[0] || 1).includes(1);
})},
{name:"转珠-转走-木",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[0] || 1).includes(2);
})},
{name:"转珠-转走-光",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[0] || 1).includes(3);
})},
{name:"转珠-转走-暗",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[0] || 1).includes(4);
})},
{name:"转珠-转走-心",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[0] || 1).includes(5);
})},
{name:"转珠-转走-毒废",function:cards=>cards.filter(card=>{
const searchTypeArray = [154];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return (sk[0] & 960) > 0;
})},
]},
{group:"~~~转珠类有些复杂我没空做~~~"},
{group:"-----随机产珠类-----", functions: [
{name:"固定30个产珠",function:cards=>cards.filter(card=>{
function is30(sk)
@ -2901,7 +2940,7 @@ function parseSkillDescription(skill) {
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType && is30(subskill.params));
}
})},
}),addition:generateOrbs_Addition},
{name:"固定15×2产珠",function:cards=>cards.filter(card=>{
function is1515(sk)
{
@ -2915,10 +2954,59 @@ function parseSkillDescription(skill) {
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType && is1515(subskill.params));
}
})},
}),addition:generateOrbs_Addition},
{name:"产珠-生成-火",function:cards=>cards.filter(card=>{
const searchTypeArray = [141];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[1] || 1).includes(0);
}),addition:generateOrbs_Addition},
{name:"产珠-生成-水",function:cards=>cards.filter(card=>{
const searchTypeArray = [141];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[1] || 1).includes(1);
}),addition:generateOrbs_Addition},
{name:"产珠-生成-木",function:cards=>cards.filter(card=>{
const searchTypeArray = [141];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[1] || 1).includes(2);
}),addition:generateOrbs_Addition},
{name:"产珠-生成-光",function:cards=>cards.filter(card=>{
const searchTypeArray = [141];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[1] || 1).includes(3);
}),addition:generateOrbs_Addition},
{name:"产珠-生成-暗",function:cards=>cards.filter(card=>{
const searchTypeArray = [141];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[1] || 1).includes(4);
}),addition:generateOrbs_Addition},
{name:"产珠-生成-心",function:cards=>cards.filter(card=>{
const searchTypeArray = [141];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return flags(sk[1] || 1).includes(5);
}),addition:generateOrbs_Addition},
{name:"产珠-生成-毒废",function:cards=>cards.filter(card=>{
const searchTypeArray = [141];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return false;
const sk = skill.params;
return (sk[1] & 960) > 0;
}),addition:generateOrbs_Addition},
]},
{group:"-----固定产珠类-----", functions: [
{name:"生成特殊形状的",function:cards=>cards.filter(card=>{
{group:"-----固定位置产珠类-----", functions: [
{name:"生成指定形状的",function:cards=>cards.filter(card=>{
const searchType = 176;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType)
@ -2927,7 +3015,12 @@ function parseSkillDescription(skill) {
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType);
}
})},
}),addition:card=>{
const searchTypeArray = [176];
const skill = getCardActiveSkill(card, searchTypeArray);
const sk = skill.params;
return createOrbsList(sk[5]);
}},
{name:"生成3x3方块",function:cards=>cards.filter(card=>{
function is3x3(sk)
{
@ -2950,7 +3043,15 @@ function parseSkillDescription(skill) {
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType && is3x3(subskill.params));
}
})},
}),addition:card=>{
const searchTypeArray = [176];
const skill = getCardActiveSkill(card, searchTypeArray);
const sk = skill.params;
const fragment = document.createDocumentFragment();
fragment.appendChild(document.createTextNode(`3×3`));
fragment.appendChild(createOrbsList(sk[5]));
return fragment;
}},
{name:"产竖",function:cards=>cards.filter(card=>{
const searchType = 127;
const skill = Skills[card.activeSkillId];
@ -2968,11 +3069,11 @@ function parseSkillDescription(skill) {
const colors = [];
for (let ai=0;ai<sk.length;ai+=2)
{
colors.push(flags(sk[ai+1])[0]);
colors.push(flags(sk[ai+1]));
}
const fragment = document.createDocumentFragment();
fragment.appendChild(document.createTextNode(``));
fragment.appendChild(createOrbsList(colors));
fragment.appendChild(createOrbsList(colors.flat()));
return fragment;
}},
{name:"产竖(含心)",function:cards=>cards.filter(card=>{
@ -3012,12 +3113,12 @@ function parseSkillDescription(skill) {
const colors = [];
for (let ai=0;ai<sk.length;ai+=2)
{
colors.push(flags(sk[ai+1])[0]);
colors.push(flags(sk[ai+1]));
}
const fragment = document.createDocumentFragment();
fragment.appendChild(document.createTextNode(``));
fragment.appendChild(createOrbsList(colors));
fragment.appendChild(createOrbsList(colors.flat()));
return fragment;
}},
{name:"2横或以上",function:cards=>cards.filter(card=>{
@ -3466,7 +3567,7 @@ function parseSkillDescription(skill) {
})},
]},
{group:"-----对自身队伍生效类-----", functions: [
{name:"减少CD按溜数排序有范围的取小",function:cards=>cards.filter(card=>{
{name:"【溜】减少CD按回合排序",function:cards=>cards.filter(card=>{
const searchType = 146;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType)
@ -3492,7 +3593,7 @@ function parseSkillDescription(skill) {
const sk = skill.params;
return document.createTextNode(`${sk[0]}${sk[0]!=sk[1]?`~${sk[1]}`:""}`);
}},
{name:"增加CD按坐数排序有范围的取小",function:cards=>cards.filter(card=>{
{name:"【坐】增加CD按回合排序",function:cards=>cards.filter(card=>{
const searchType = 218;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType)
@ -3518,15 +3619,10 @@ function parseSkillDescription(skill) {
const sk = skill.params;
return document.createTextNode(`坐下${sk[0]}${sk[0]!=sk[1]?`~${sk[1]}`:""}`);
}},
{name:"将自身换为队长",function:cards=>cards.filter(card=>{
const searchType = 93;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType)
return true;
else if (skill.type == 116 || skill.type == 118){
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType);
}
{name:"更换队长",function:cards=>cards.filter(card=>{
const searchTypeArray = [93, 227];
const skill = getCardSkill(card, searchTypeArray);
return skill != null;
})},
{name:"转换自身属性(按回合数排序)",function:cards=>cards.filter(card=>{
const searchType = 142;
@ -3698,48 +3794,38 @@ function parseSkillDescription(skill) {
})},
]},
{group:"-----对敌直接伤害类-重力-----", functions: [
{name:"重力-敌人当前血量(按比例排序)",function:cards=>cards.filter(card=>{
const searchType = 6;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType)
return true;
else if (skill.type == 116 || skill.type == 118){
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType);
}
}).sort((a,b)=>{
const searchType = 6;
const a_s = Skills[a.activeSkillId], b_s = Skills[b.activeSkillId];
let a_pC = 0,b_pC = 0;
a_pC = (a_s.type == searchType) ?
a_s.params[0] :
a_s.params.map(id=>Skills[id]).find(subskill => subskill.type == searchType).params[0];
b_pC = (b_s.type == searchType) ?
b_s.params[0] :
b_s.params.map(id=>Skills[id]).find(subskill => subskill.type == searchType).params[0];
return a_pC - b_pC;
})},
{name:"重力-敌人最大血量(按比例排序)",function:cards=>cards.filter(card=>{
const searchType = 161;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType)
return true;
else if (skill.type == 116 || skill.type == 118){
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType);
}
}).sort((a,b)=>{
const searchType = 161;
const a_s = Skills[a.activeSkillId], b_s = Skills[b.activeSkillId];
let a_pC = 0,b_pC = 0;
a_pC = (a_s.type == searchType) ?
a_s.params[0] :
a_s.params.map(id=>Skills[id]).find(subskill => subskill.type == searchType).params[0];
b_pC = (b_s.type == searchType) ?
b_s.params[0] :
b_s.params.map(id=>Skills[id]).find(subskill => subskill.type == searchType).params[0];
return a_pC - b_pC;
})},
{name:"重力-敌人当前血量(按比例排序)",function:cards=>{
const searchTypeArray = [6];
return cards.filter(card=>{
const skill = getCardActiveSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>{
const a_s = getCardActiveSkill(a, searchTypeArray), b_s = getCardActiveSkill(b, searchTypeArray);
let a_pC = a_s.params[0],b_pC = b_s.params[0];
return a_pC - b_pC;
})
},addition:card=>{
const searchTypeArray = [6];
const skill = getCardActiveSkill(card, searchTypeArray);
const sk = skill.params;
return `当前${sk[0]}%`;
}},
{name:"重力-敌人最大血量(按比例排序)",function:cards=>{
const searchTypeArray = [161];
return cards.filter(card=>{
const skill = getCardActiveSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>{
const a_s = getCardActiveSkill(a, searchTypeArray), b_s = getCardActiveSkill(b, searchTypeArray);
let a_pC = a_s.params[0],b_pC = b_s.params[0];
return a_pC - b_pC;
})
},addition:card=>{
const searchTypeArray = [161];
const skill = getCardActiveSkill(card, searchTypeArray);
const sk = skill.params;
return `最大${sk[0]}%`;
}},
]},
{group:"-----对敌直接伤害类-无视防御固伤-----", functions: [
{name:"无视防御固伤-单体(按总伤害排序)",function:cards=>cards.filter(card=>{
@ -4031,13 +4117,16 @@ function parseSkillDescription(skill) {
})},
]},
{group:"======进化类型======", functions: [
{name:"8格潜觉",function:cards=>cards.filter(card=>card.is8Latent)},
{name:"非8格潜觉",function:cards=>cards.filter(card=>!card.is8Latent)},
{name:"非变身",function:cards=>cards.filter(card=>!card.henshinFrom && !card.henshinTo)},
{name:"变身前",function:cards=>cards.filter(card=>card.henshinTo)},
{name:"变身后",function:cards=>cards.filter(card=>card.henshinFrom)},
{name:"像素进化",function:cards=>cards.filter(card=>card.evoMaterials.includes(3826))},
{name:"8格潜觉",function:cards=>cards.filter(card=>card.is8Latent)},
//{name:"非8格潜觉",function:cards=>cards.filter(card=>!card.is8Latent)},
{name:"转生、超转生进化",function:cards=>cards.filter(card=>isReincarnated(card))}, //evoBaseId可能为0
{name:"仅超转生进化",function:cards=>cards.filter(card=>isReincarnated(card) && !Cards[card.evoBaseId].isUltEvo)},
//{name:"仅超转生进化",function:cards=>cards.filter(card=>isReincarnated(card) && !Cards[card.evoBaseId].isUltEvo)},
{name:"超究极进化",function:cards=>cards.filter(card=>card.is8Latent && card.isUltEvo && !card.awakenings.includes(49))},
{name:"变身前",function:cards=>cards.filter(card=>{
/*{name:"",function:cards=>cards.filter(card=>{
const searchType = 202;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType)
@ -4047,7 +4136,6 @@ function parseSkillDescription(skill) {
return subskills.some(subskill=>subskill.type == searchType);
}
})},
{name:"变身后",function:cards=>cards.filter(card=>card.henshinFrom)},
{name:"变身前后队长技保持不变",function:cards=>cards.filter(card=>{
const searchType = 202;
const skill = Skills[card.activeSkillId];
@ -4057,31 +4145,28 @@ function parseSkillDescription(skill) {
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType && card.leaderSkillId == Cards[subskill.params[0]].leaderSkillId);
}
})},
{name:"非变身",function:cards=>cards.filter(card=>!card.henshinFrom && !card.henshinTo)},
{name:"用三神面进化",function:cards=>cards.filter(card=>card.evoMaterials.includes(3795))},
{name:"用彩龙果进化",function:cards=>cards.filter(card=>card.evoMaterials.includes(3971))},
})},*/
{name:"由武器进化而来",function:cards=>cards.filter(card=>card.isUltEvo && Cards[card.evoBaseId].awakenings.includes(49))},
]},
{group:"======其他搜索======", functions: [
{name:"攻击型或水属性(炭治郎队员)",function:cards=>cards.filter(card=>card.attrs.includes(1) || card.types.includes(6))},
{name:"火属性或水属性(火车队员)",function:cards=>cards.filter(card=>card.attrs.includes(0) || card.attrs.includes(1))},
{name:"不能等级限制",function:cards=>cards.filter(card=>card.limitBreakIncr===0)},
{name:"不能破等级限制",function:cards=>cards.filter(card=>card.limitBreakIncr===0)},
{name:"110级三维成长100%",function:cards=>cards.filter(card=>card.limitBreakIncr>=100)},
{name:"满级不是1级可强化",function:cards=>cards.filter(card=>card.maxLevel>1)},
{name:"满级只有1级",function:cards=>cards.filter(card=>card.maxLevel==1)},
{name:"低于100mp",function:cards=>cards.filter(card=>card.sellMP<100)},
{name:"有3个type",function:cards=>cards.filter(card=>card.types.filter(t=>t>=0).length>=3)},
{name:"有属性",function:cards=>cards.filter(card=>card.attrs[1]>=0)},
{name:"有副属性且主副属性不一致",function:cards=>cards.filter(card=>card.attrs[0]>=0 && card.attrs[1]>=0 && card.attrs[0] != card.attrs[1])},
{name:"能获得皮肤",function:cards=>cards.filter(card=>card.blockSkinId>0)},
{name:"有两个属性",function:cards=>cards.filter(card=>card.attrs.filter(a=>a>=0 && a<6))},
{name:"主副属性不一致",function:cards=>cards.filter(card=>card.attrs[0]<6 && card.attrs[1]>=0 && card.attrs[0] != card.attrs[1])},
{name:"能获得珠皮肤",function:cards=>cards.filter(card=>card.blockSkinId>0)},
{name:"所有潜觉蛋龙",function:cards=>cards.filter(card=>card.latentAwakeningId>0).sort((a,b)=>a.latentAwakeningId-b.latentAwakeningId)},
{name:"龙契士&龙唤士10001",function:cards=>cards.filter(card=>card.collabId==10001)},
//{name:"龙契士&龙唤士10001",function:cards=>cards.filter(card=>card.collabId==10001)},
]},
{group:"-----觉醒类-----", functions: [
{name:"有9个觉醒",function:cards=>cards.filter(card=>card.awakenings.length>=9)},
{name:"可以做辅助",function:cards=>cards.filter(card=>card.canAssist)},
{name:"不是武器",function:cards=>cards.filter(card=>!card.awakenings.includes(49))},
{name:"有超觉醒",function:cards=>cards.filter(card=>card.superAwakenings.length > 0)},
{name:"能突破等级限制但没有超觉醒",function:cards=>cards.filter(card=>card.limitBreakIncr > 0 && card.superAwakenings.length == 0)},
{name:"有110但没有超觉醒",function:cards=>cards.filter(card=>card.limitBreakIncr>0 && card.superAwakenings.length<1)},
{name:"3个相同杀觉醒或2个杀觉醒并可打相同潜觉",function:cards=>cards.filter(card=>{
const hasAwokenKiller = typekiller_for_type.find(type=>card.awakenings.filter(ak=>ak===type.awoken).length>=2);

View File

@ -1 +1 @@
[{"code":"ja","ckey":{"card":"1662af91b3c6c65dcacd7c5f59e3779c","skill":"fbbceb29e8fa54610addce49e5a4c627"},"updateTime":1626437692992},{"code":"en","ckey":{"card":"f968e7c08d9a708a236e956d7050e05a","skill":"fa1024dd36232eb43c030a2499814960"},"updateTime":1626352490457},{"code":"ko","ckey":{"card":"6b1f4e5b5f428ad3303257ac0b118bf2","skill":"17c7e55b774b6fed3eaea6bc5a0c027d"},"updateTime":1626352490457}]
[{"code":"ja","ckey":{"card":"eecd70bf4f222474f96f94f6c124559f","skill":"88598cd8a7056f5f932eb73bad2c7a82"},"updateTime":1626955227792},{"code":"en","ckey":{"card":"f968e7c08d9a708a236e956d7050e05a","skill":"fa1024dd36232eb43c030a2499814960"},"updateTime":1626352490457},{"code":"ko","ckey":{"card":"6b1f4e5b5f428ad3303257ac0b118bf2","skill":"17c7e55b774b6fed3eaea6bc5a0c027d"},"updateTime":1626352490457}]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -673,7 +673,12 @@ function turnPage(toPage, e = null) {
window.onload = function(event) {
if (!Array.prototype.flat)
{
alert("请更新您的浏览器。\nPlease update your browser.");
alert(`请更新您的浏览器。火狐≥62 或 谷歌≥69
Please update your browser. Firefox62 or Chrome69
你的浏览器:
Your browser:
${navigator.userAgent}`);
}
qrcodeReader = new ZXing.BrowserQRCodeReader(); //二维码读取
@ -1706,26 +1711,36 @@ function initialize() {
const headDom = this.parentNode;
const arr = getMemberArrayIndexFromMonHead(headDom);
const team = formation.teams[arr[0]];
const member = team[arr[1]][arr[2]];
const card = Cards[member.id] || Cards[0];
const skills = getCardActiveSkills(card, [93, 227]); //更换队长的技能
if (skills.length < 1) return;
const skill = skills[0];
if (team[3] > 0) //如果队伍已经换了队长
{
if (team[3] == arr[2]) //点的就是换的队长
if (skill.type == 227 //固定与右侧换队长
|| team[3] == arr[2]) //点的就是换的队长
{
team[3] = 0; //还原
}else
{
team[3] = arr[2]; //改变成任何能点的换队长
}
creatNewUrl(); //刷新URL
refreshAll(formation); //刷新全部
}else //如果队伍没有换队长
{
if(arr[2] > 0) //如果点的不是原队长
if (skill.type == 227) //固定与右侧换队长
{
let myTeam = team.slice(0,5);
team[3] = myTeam.length - 1 - team.slice(0,5).reverse().findIndex(m=>m.id>0);
}
else if(arr[2] > 0) //如果点的不是原队长
{
team[3] = arr[2]; //接换成新队长
creatNewUrl(); //刷新URL
refreshAll(formation); //刷新全部
}
}
creatNewUrl(); //刷新URL
refreshAll(formation); //刷新全部
e.stopPropagation();
e.preventDefault();
@ -2102,7 +2117,12 @@ function initialize() {
options.customAddition.forEach(func=>{
const c_addition = cli.appendChild(document.createElement("div"));
c_addition.className = "custom-addition";
c_addition.appendChild(func(card));
let content = func(card);
if (typeof content == "string" || typeof content == "number")
{
content = document.createTextNode(content);
}
c_addition.appendChild(content);
});
}
@ -3142,7 +3162,7 @@ function changeid(mon, monDom, latentDom) {
const switchLeaderDom = monDom.querySelector(".switch-leader");
if (switchLeaderDom) //如果存在队长交换 DOM
{
const skills = getCardActiveSkills(card, [93]); //更换队长的技能
const skills = getCardActiveSkills(card, [93, 227]); //更换队长的技能
if (skills.length > 0) {
switchLeaderDom.classList.remove(className_displayNone);
@ -3629,8 +3649,18 @@ function refreshAll(formationData) {
//如果换队长技能
if (leaderIdx == 0 && (ti == 0 || ti == 5))
{
member.querySelector(".switch-leader").classList.add(className_displayNone);
assist.querySelector(".switch-leader").classList.add(className_displayNone);
const card_m = Cards[teamData[0][ti].id] || Cards[0];
const card_a = Cards[teamData[1][ti].id] || Cards[0];
const skills_m = getCardActiveSkills(card_m, [93, 227]); //更换队长的技能
const skills_a = getCardActiveSkills(card_a, [93, 227]); //更换队长的技能
if (skills_m.length == 0 || skills_m[0].type != 227)
{
member.querySelector(".switch-leader").classList.add(className_displayNone);
}
if (skills_a.length == 0 || skills_a[0].type != 227)
{
assist.querySelector(".switch-leader").classList.add(className_displayNone);
}
}
refreshMemberSkillCD(teamBox, teamData, ti); //技能CD
refreshAbility(teamAbilityDom, teamData, ti); //本人能力值

BIN
sound/voice/ja/padv295.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv296.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv297.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv298.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv299.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv300.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv301.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv302.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv303.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv304.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv305.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv306.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv307.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv308.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv309.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv310.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv311.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv312.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv313.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv314.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv315.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv316.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv317.wav Normal file

Binary file not shown.

BIN
sound/voice/ja/padv318.wav Normal file

Binary file not shown.