Browse Source

Merge branch 'master' into skillParser

tags/v19.0
枫谷剑仙 5 years ago
parent
commit
85bf5a0e1b
38 changed files with 409 additions and 291 deletions
  1. BIN
      document/tips-voice.png
  2. +4
    -1
      help.md
  3. BIN
      images/cards_ja/CARDS_075.PNG
  4. BIN
      images/cards_ja/CARDS_076.PNG
  5. BIN
      images/cards_ja/CARDS_077.PNG
  6. +357
    -272
      languages/zh-CN.js
  7. +1
    -1
      monsters-info/ckey.json
  8. +1
    -1
      monsters-info/custom/chs.json
  9. +1
    -1
      monsters-info/custom/cht.json
  10. +1
    -1
      monsters-info/mon_ja.json
  11. +1
    -1
      monsters-info/official-API/ja-card.json
  12. +1
    -1
      monsters-info/official-API/ja-skill.json
  13. +1
    -1
      monsters-info/skill_ja.json
  14. +41
    -11
      script.js
  15. BIN
      sound/voice/ja/padv295.wav
  16. BIN
      sound/voice/ja/padv296.wav
  17. BIN
      sound/voice/ja/padv297.wav
  18. BIN
      sound/voice/ja/padv298.wav
  19. BIN
      sound/voice/ja/padv299.wav
  20. BIN
      sound/voice/ja/padv300.wav
  21. BIN
      sound/voice/ja/padv301.wav
  22. BIN
      sound/voice/ja/padv302.wav
  23. BIN
      sound/voice/ja/padv303.wav
  24. BIN
      sound/voice/ja/padv304.wav
  25. BIN
      sound/voice/ja/padv305.wav
  26. BIN
      sound/voice/ja/padv306.wav
  27. BIN
      sound/voice/ja/padv307.wav
  28. BIN
      sound/voice/ja/padv308.wav
  29. BIN
      sound/voice/ja/padv309.wav
  30. BIN
      sound/voice/ja/padv310.wav
  31. BIN
      sound/voice/ja/padv311.wav
  32. BIN
      sound/voice/ja/padv312.wav
  33. BIN
      sound/voice/ja/padv313.wav
  34. BIN
      sound/voice/ja/padv314.wav
  35. BIN
      sound/voice/ja/padv315.wav
  36. BIN
      sound/voice/ja/padv316.wav
  37. BIN
      sound/voice/ja/padv317.wav
  38. BIN
      sound/voice/ja/padv318.wav

BIN
document/tips-voice.png View File

Before After
Width: 496  |  Height: 444  |  Size: 47 kB

+ 4
- 1
help.md 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


BIN
images/cards_ja/CARDS_075.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 839 kB Width: 1024  |  Height: 1024  |  Size: 903 kB

BIN
images/cards_ja/CARDS_076.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 338 kB Width: 1024  |  Height: 1024  |  Size: 646 kB

BIN
images/cards_ja/CARDS_077.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 131 kB

+ 357
- 272
languages/zh-CN.js 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,201 +2746,186 @@ 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;
{name:"刷版",function:cards=>cards.filter(card=>{
const searchType = 10;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType && includeHeart(skill.params))
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 && includeHeart(subskill.params));
return subskills.some(subskill=>subskill.type == searchType);
}
})},
{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:"洗版-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=>{
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:"洗版-含水",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).includes(1);
})},
{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=>{
{name:"洗版-含木",function:cards=>cards.filter(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 skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).includes(2);
})},
{name:"洗版-含光",function:cards=>cards.filter(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 skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).includes(3);
})},
{name:"洗版-含暗",function:cards=>cards.filter(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 skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).includes(4);
})},
{name:"洗版-含心",function:cards=>cards.filter(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 skill = getCardActiveSkill(card, searchTypeArray);
return boardChange_ColorTypes(skill).includes(5);
})},
{name:"洗版-含毒废",function:cards=>cards.filter(card=>{
const searchTypeArray = [71];
const skill = getCardSkill(card, searchTypeArray);
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;
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);
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;
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];
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);
}
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);


+ 1
- 1
monsters-info/ckey.json 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}]

+ 1
- 1
monsters-info/custom/chs.json
File diff suppressed because it is too large
View File


+ 1
- 1
monsters-info/custom/cht.json
File diff suppressed because it is too large
View File


+ 1
- 1
monsters-info/mon_ja.json
File diff suppressed because it is too large
View File


+ 1
- 1
monsters-info/official-API/ja-card.json
File diff suppressed because it is too large
View File


+ 1
- 1
monsters-info/official-API/ja-skill.json
File diff suppressed because it is too large
View File


+ 1
- 1
monsters-info/skill_ja.json
File diff suppressed because it is too large
View File


+ 41
- 11
script.js 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. Firefox≥62 or Chrome≥69

你的浏览器:
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 View File


BIN
sound/voice/ja/padv296.wav View File


BIN
sound/voice/ja/padv297.wav View File


BIN
sound/voice/ja/padv298.wav View File


BIN
sound/voice/ja/padv299.wav View File


BIN
sound/voice/ja/padv300.wav View File


BIN
sound/voice/ja/padv301.wav View File


BIN
sound/voice/ja/padv302.wav View File


BIN
sound/voice/ja/padv303.wav View File


BIN
sound/voice/ja/padv304.wav View File


BIN
sound/voice/ja/padv305.wav View File


BIN
sound/voice/ja/padv306.wav View File


BIN
sound/voice/ja/padv307.wav View File


BIN
sound/voice/ja/padv308.wav View File


BIN
sound/voice/ja/padv309.wav View File


BIN
sound/voice/ja/padv310.wav View File


BIN
sound/voice/ja/padv311.wav View File


BIN
sound/voice/ja/padv312.wav View File


BIN
sound/voice/ja/padv313.wav View File


BIN
sound/voice/ja/padv314.wav View File


BIN
sound/voice/ja/padv315.wav View File


BIN
sound/voice/ja/padv316.wav View File


BIN
sound/voice/ja/padv317.wav View File


BIN
sound/voice/ja/padv318.wav View File


Loading…
Cancel
Save