Browse Source

Merge branch 'master' into service-worker

tags/v24.0
枫谷剑仙 4 years ago
parent
commit
f42d11a675
100 changed files with 521 additions and 360 deletions
  1. +8
    -8
      README.md
  2. +7
    -10
      browser-compatibility.js
  3. BIN
      images/cards_en/CARDS_019.PNG
  4. BIN
      images/cards_en/CARDS_075.PNG
  5. BIN
      images/cards_en/CARDS_077.PNG
  6. BIN
      images/cards_en/CARDS_078.PNG
  7. BIN
      images/cards_en/CARDS_081.PNG
  8. BIN
      images/cards_en/CARDS_083.PNG
  9. BIN
      images/cards_en/CARDS_084.PNG
  10. BIN
      images/cards_en/CARDS_085.PNG
  11. BIN
      images/cards_en/CARDS_086.PNG
  12. BIN
      images/cards_en/CARDS_087.PNG
  13. BIN
      images/cards_ja/CARDS_072.PNG
  14. BIN
      images/cards_ja/CARDS_075.PNG
  15. BIN
      images/cards_ja/CARDS_077.PNG
  16. BIN
      images/cards_ja/CARDS_078.PNG
  17. BIN
      images/cards_ja/CARDS_084.PNG
  18. BIN
      images/cards_ja/CARDS_085.PNG
  19. BIN
      images/cards_ja/CARDS_086.PNG
  20. BIN
      images/cards_ja/CARDS_087.PNG
  21. BIN
      images/cards_ja/CARDS_088.PNG
  22. BIN
      images/cards_ko/CARDS_019.PNG
  23. BIN
      images/cards_ko/CARDS_075.PNG
  24. BIN
      images/cards_ko/CARDS_077.PNG
  25. BIN
      images/cards_ko/CARDS_078.PNG
  26. BIN
      images/cards_ko/CARDS_081.PNG
  27. BIN
      images/cards_ko/CARDS_083.PNG
  28. BIN
      images/cards_ko/CARDS_084.PNG
  29. BIN
      images/cards_ko/CARDS_085.PNG
  30. BIN
      images/cards_ko/CARDS_086.PNG
  31. BIN
      images/cards_ko/CARDS_087.PNG
  32. +14
    -0
      languages/en.css
  33. +10
    -0
      languages/ja.css
  34. +5
    -0
      languages/ko.css
  35. +5
    -0
      languages/zh-TW.css
  36. +1
    -0
      languages/zh-TW.js
  37. +5
    -0
      languages/zh.css
  38. +8
    -4
      languages/zh.js
  39. +3
    -3
      library/html2canvas.min.js
  40. +1
    -1
      library/zxing.umd.min.js
  41. +1
    -1
      monsters-info/ckey.json
  42. +1
    -1
      monsters-info/custom/chs.json
  43. +1
    -1
      monsters-info/custom/cht.json
  44. +51
    -17
      monsters-info/extractByNode.js
  45. +1
    -1
      monsters-info/mon_en.json
  46. +1
    -1
      monsters-info/mon_ja.json
  47. +1
    -1
      monsters-info/mon_ko.json
  48. +1
    -1
      monsters-info/official-API/en-card.json
  49. +1
    -1
      monsters-info/official-API/en-skill.json
  50. +1
    -1
      monsters-info/official-API/ja-card.json
  51. +1
    -1
      monsters-info/official-API/ja-skill.json
  52. +1
    -1
      monsters-info/official-API/ko-card.json
  53. +1
    -1
      monsters-info/official-API/ko-skill.json
  54. +9
    -8
      monsters-info/official-API/parseCard.js
  55. +1
    -1
      monsters-info/skill_en.json
  56. +1
    -1
      monsters-info/skill_ja.json
  57. +1
    -1
      monsters-info/skill_ko.json
  58. +2
    -2
      multi.html
  59. +142
    -152
      script-json_data.js
  60. +43
    -42
      script-skill-parser.js
  61. +27
    -15
      script-universal_function.js
  62. +157
    -81
      script.js
  63. +2
    -2
      solo.html
  64. BIN
      sound/voice/ja/padv367.wav
  65. BIN
      sound/voice/ja/padv368.wav
  66. BIN
      sound/voice/ja/padv369.wav
  67. BIN
      sound/voice/ja/padv370.wav
  68. BIN
      sound/voice/ja/padv371.wav
  69. BIN
      sound/voice/ja/padv372.wav
  70. BIN
      sound/voice/ja/padv373.wav
  71. BIN
      sound/voice/ja/padv374.wav
  72. BIN
      sound/voice/ja/padv375.wav
  73. BIN
      sound/voice/ja/padv376.wav
  74. BIN
      sound/voice/ja/padv377.wav
  75. BIN
      sound/voice/ja/padv378.wav
  76. BIN
      sound/voice/ja/padv379.wav
  77. BIN
      sound/voice/ja/padv380.wav
  78. BIN
      sound/voice/ja/padv381.wav
  79. BIN
      sound/voice/ja/padv382.wav
  80. BIN
      sound/voice/ja/padv383.wav
  81. BIN
      sound/voice/ja/padv384.wav
  82. BIN
      sound/voice/ja/padv385.wav
  83. BIN
      sound/voice/ja/padv386.wav
  84. BIN
      sound/voice/ja/padv387.wav
  85. BIN
      sound/voice/ja/padv388.wav
  86. BIN
      sound/voice/ja/padv389.wav
  87. BIN
      sound/voice/ja/padv390.wav
  88. BIN
      sound/voice/ja/padv391.wav
  89. BIN
      sound/voice/ja/padv392.wav
  90. BIN
      sound/voice/ja/padv393.wav
  91. BIN
      sound/voice/ja/padv394.wav
  92. BIN
      sound/voice/ja/padv395.wav
  93. BIN
      sound/voice/ja/padv396.wav
  94. BIN
      sound/voice/ja/padv397.wav
  95. BIN
      sound/voice/ja/padv398.wav
  96. BIN
      sound/voice/ja/padv399.wav
  97. BIN
      sound/voice/ja/padv400.wav
  98. BIN
      sound/voice/ja/padv401.wav
  99. BIN
      sound/voice/ja/padv402.wav
  100. +6
    -0
      style.css

+ 8
- 8
README.md View File

@@ -15,7 +15,7 @@ This tool can help you easily create and share Swipe Formation or Solo Formation
| ![3人协力界面预览](doc/images/preview-capture-3p.png) | ![手机端预览](doc/images/preview-mobile.jpg) |
# 如何使用 | HOW TO USE
推荐[![][firefox]火狐浏览器](https://www.mozilla.org/firefox/new/) | [![][firefox]Firefox](https://www.mozilla.org/firefox/new/) is recommended
推荐[![][firefox]火狐浏览器](//www.mozilla.org/firefox/new/) | [![][firefox]Firefox](//www.mozilla.org/firefox/new/) is recommended
## 快速使用在线版(推荐) | Online Quick Start (Recommended)
* <https://mapaler.github.io/PADDashFormation/> (Github Pages)
* <https://mapaler.com/PADDashFormation/> (我自己的镜像 | my own mirror)
@@ -43,7 +43,7 @@ Chrome browser need start with the additional argument `--allow-file-access-from
1. 中文(繁體)
1. English
1. 日本語 (スキル解析翻訳のヘルプが必要です, by Bing Translator)
1. 한국어 (스킬 구문 분석 번역에 도움이 필요, by Bing Translator)
1. 북한/한국어 (스킬 구문 분석 번역에 도움이 필요, by Bing Translator)
## How to **Pull requests**
1. Click **Fork** In the page top right corner. Fork your own copy of this repository to your account.
@@ -96,16 +96,16 @@ Please refer to existing files.
> 所有图片素材版权与怪物信息归属于GungHo在线娱乐有限公司。
> パズル&ドラゴンズに関する画像及び情報等の権利はGungHo Online Entertainment Inc.に帰属します。
> ### 智龙迷城官网 | Puzzle & Dragons Official Website
> * [パズル&ドラゴンズ](http://pad.gungho.jp)
> * [龍族拼圖](https://pad.gungho.jp/hktw/pad/)
> * [Puzzle & Dragons](https://www.puzzleanddragons.us/)
> * [퍼즐앤드래곤](https://pad.neocyon.com/W/)
> * [パズル&ドラゴンズ](//pad.gungho.jp)
> * [龍族拼圖](//pad.gungho.jp/hktw/pad/)
> * [Puzzle & Dragons](//www.puzzleanddragons.us/)
> * [퍼즐앤드래곤](//pad.neocyon.com/W/)
> © Fontworks Inc. Font Kurokane Right Reserved.
> くろかね字体版权归属于Fontworks有限公司。
> [くろかね書体](https://fontworks.co.jp/fontsearch/kurokanestd-eb/)の権利は フォントワークス株式会社 に帰属します。
> [くろかね書体](//fontworks.co.jp/fontsearch/kurokanestd-eb/)の権利は フォントワークス株式会社 に帰属します。
> 卡片中文名、中文分类来自于[Puzzle & Dragons 戰友系統及資訊網](https://pad.skyozora.com/)
> 卡片中文名、中文分类来自于[Puzzle & Dragons 戰友系統及資訊網](//pad.skyozora.com/)
# 使用开源软件 | Open source software used
* [pad-rikuu](//github.com/kiootic/pad-rikuu) //Data structure and parser


+ 7
- 10
browser-compatibility.js View File

@@ -11,14 +11,11 @@ if (needUpdateBrowser)
{
let browserVersion = ((UA)=>{
let regRes;
if (regRes = /\b(Firefox|Chrome)\/([\d\.]+)/ig.exec(UA))
{
if (regRes = /\b(Firefox|Chrome)\/([\d\.]+)/ig.exec(UA)) {
return `${regRes[1]} ${regRes[2]}`;
}else if (regRes = /\bVersion\/([\d\.]+)\s+.*\b(Safari)\//ig.exec(UA))
{
} else if (regRes = /\bVersion\/([\d\.]+)\s+.*\b(Safari)\//ig.exec(UA)) {
return `${regRes[2]} ${regRes[1]}`;
}else
{
} else {
UA;
}
})(navigator.userAgent);
@@ -30,18 +27,18 @@ if (needUpdateBrowser)
您的浏览器版本为:
${browserVersion}
您的浏览器不支持本程序使用的 可选链操作符(?.) 和 空值合并操作符(??)。
您的浏览器内核不支持本程序使用的 可选链操作符(?.) 和 空值合并操作符(??)。
请更新您的浏览器到 Firefox(火狐) ≥ 74 或 Chrome(谷歌) ≥ 80 或 Safari(苹果) ≥ 14。`;
请更新您的浏览器内核到 Firefox(火狐) ≥ 74 或 Chrome(谷歌) ≥ 80 或 iOS Safari ≥ 13.4。`;
} else {
alertStr =
`🙁Browser kernel is too old
Your browser is:
${browserVersion}
Your browser does not support Optional chaining (?.) and Nullish coalescing operator (??) used in this program.
Your browser core does not support Optional chaining (?.) and Nullish coalescing operator (??) used in this program.
Please update your browser to Firefox ≥ 74 or Chrome ≥ 80 or Safari ≥ 14.`;
Please update your browser core to Firefox ≥ 74 or Chrome ≥ 80 or iOS Safari ≥ 13.4`;
}
alert(alertStr);


BIN
images/cards_en/CARDS_019.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 884 kB Width: 1024  |  Height: 1024  |  Size: 935 kB

BIN
images/cards_en/CARDS_075.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 937 kB Width: 1024  |  Height: 1024  |  Size: 951 kB

BIN
images/cards_en/CARDS_077.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 706 kB Width: 1024  |  Height: 1024  |  Size: 899 kB

BIN
images/cards_en/CARDS_078.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 926 kB Width: 1024  |  Height: 1024  |  Size: 953 kB

BIN
images/cards_en/CARDS_081.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 548 kB Width: 1024  |  Height: 1024  |  Size: 591 kB

BIN
images/cards_en/CARDS_083.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 542 kB Width: 1024  |  Height: 1024  |  Size: 758 kB

BIN
images/cards_en/CARDS_084.PNG View File

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

BIN
images/cards_en/CARDS_085.PNG View File

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

BIN
images/cards_en/CARDS_086.PNG View File

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

BIN
images/cards_en/CARDS_087.PNG View File

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

BIN
images/cards_ja/CARDS_072.PNG View File

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

BIN
images/cards_ja/CARDS_075.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 989 kB Width: 1024  |  Height: 1024  |  Size: 1.0 MB

BIN
images/cards_ja/CARDS_077.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 888 kB Width: 1024  |  Height: 1024  |  Size: 899 kB

BIN
images/cards_ja/CARDS_078.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 949 kB Width: 1024  |  Height: 1024  |  Size: 993 kB

BIN
images/cards_ja/CARDS_084.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 686 kB Width: 1024  |  Height: 1024  |  Size: 781 kB

BIN
images/cards_ja/CARDS_085.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 148 kB Width: 1024  |  Height: 1024  |  Size: 826 kB

BIN
images/cards_ja/CARDS_086.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 65 kB Width: 1024  |  Height: 1024  |  Size: 922 kB

BIN
images/cards_ja/CARDS_087.PNG View File

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

BIN
images/cards_ja/CARDS_088.PNG View File

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

BIN
images/cards_ko/CARDS_019.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 884 kB Width: 1024  |  Height: 1024  |  Size: 935 kB

BIN
images/cards_ko/CARDS_075.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 937 kB Width: 1024  |  Height: 1024  |  Size: 951 kB

BIN
images/cards_ko/CARDS_077.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 706 kB Width: 1024  |  Height: 1024  |  Size: 899 kB

BIN
images/cards_ko/CARDS_078.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 926 kB Width: 1024  |  Height: 1024  |  Size: 953 kB

BIN
images/cards_ko/CARDS_081.PNG View File

Before After
Width: 1024  |  Height: 1024  |  Size: 548 kB Width: 1024  |  Height: 1024  |  Size: 591 kB

BIN
images/cards_ko/CARDS_083.PNG View File

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

BIN
images/cards_ko/CARDS_084.PNG View File

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

BIN
images/cards_ko/CARDS_085.PNG View File

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

BIN
images/cards_ko/CARDS_086.PNG View File

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

BIN
images/cards_ko/CARDS_087.PNG View File

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

+ 14
- 0
languages/en.css View File

@@ -531,6 +531,20 @@ label[for="box-have"]::after
{
content: "Henshin";
}
.random-henshin .evo-type::before,
.random-henshin .evo-type::after
{
content: "Random Henshin";
}
.random-henshin .evo-type-div
{
margin: 0 -10px;
}
.random-henshin .evo-type
{
transform: scaleX(0.50);
margin: calc(-100px * (1 - 0.50) / 2);
}
.henshin-loop .evo-type::before,
.henshin-loop .evo-type::after
{


+ 10
- 0
languages/ja.css View File

@@ -503,6 +503,16 @@ label[for="box-have"]::after
{
content: "変身";
}
.random-henshin .evo-type::before,
.random-henshin .evo-type::after
{
content: "ランダムで変身";
}
.random-henshin .evo-type
{
transform: scaleX(0.70);
margin: calc(-100px * (1 - 0.70) / 2);
}
.henshin-loop .evo-type::before,
.henshin-loop .evo-type::after
{


+ 5
- 0
languages/ko.css View File

@@ -494,6 +494,11 @@ label[for="box-have"]::after
{
content: "변신";
}
.random-henshin .evo-type::before,
.random-henshin .evo-type::after
{
content: "책상 변신";
}
.henshin-loop .evo-type::before,
.henshin-loop .evo-type::after
{


+ 5
- 0
languages/zh-TW.css View File

@@ -497,6 +497,11 @@ label[for="box-have"]::after
{
content: "變身";
}
.random-henshin .evo-type::before,
.random-henshin .evo-type::after
{
content: "隨機変身";
}
.henshin-loop .evo-type::before,
.henshin-loop .evo-type::after
{


+ 1
- 0
languages/zh-TW.js View File

@@ -123,6 +123,7 @@
exact_combo: tp`剛好${'value'}連擊時`,
exact_match_length: tp`相連消除剛好${'value'}${'orbs'}時`,
exact_match_enhanced: tp`並且其中包含至少一個強化寶珠`,
exact_match_length_multiple: tp`每相連消除剛好${'value'}${'orbs'}1次時`,
compo_type_card: tp`隊伍中同時存在 ${'ids'} 時`,
compo_type_series: tp`隊員組成全為 ${'ids'} 合作時`,


+ 5
- 0
languages/zh.css View File

@@ -495,6 +495,11 @@ label[for="box-have"]::after
{
content: "変身";
}
.random-henshin .evo-type::before,
.random-henshin .evo-type::after
{
content: "随机変身";
}
.henshin-loop .evo-type::before,
.henshin-loop .evo-type::after
{


+ 8
- 4
languages/zh.js View File

@@ -87,7 +87,8 @@
reduce_damage: tp`${'condition'}受到的${'attrs'}伤害${'chance'}${'icon'}减少${'value'}`,
power_up: tp`${'condition'}${'targets'}${'target'}${'value'}${'reduceDamage'}${'addCombo'}${'followAttack'}`,
power_up_targets: tp`${'attrs_types'}的 `,
henshin: tp`变身为${'card'}`,
henshin: tp`变身为${'cards'}`,
random_henshin: tp`随机变身为${'cards'}`,
void_poison: tp`消除${'poison'}时不会受到毒伤害`,
skill_proviso: tp`${'condition'}才能发动后续效果`,
obstruct_opponent: tp`对${'target'}施加敌对技能效果:${'skills'}`,
@@ -123,6 +124,7 @@
exact_combo: tp`刚好${'value'}连击时`,
exact_match_length: tp`相连消除刚好${'value'}${'orbs'}时`,
exact_match_enhanced: tp`并且其中包含至少一个强化宝珠`,
exact_match_length_multiple: tp`每相连消除刚好${'value'}${'orbs'}1次时`,
compo_type_card: tp`队伍中同时存在 ${'ids'} 时`,
compo_type_series: tp`队员组成全为 ${'ids'} 合作时`,
@@ -161,7 +163,9 @@
team: tp`队伍`,
team_last: tp`队伍最后一位队员`,
team_leader: tp`队长`,
team_sub: tp`队员`,
sub_members: tp`队员`,
leader_self: tp`左边队长`,
leader_helper: tp`右边队长`,
enemy: tp`敌人`,
enemy_all: tp`敌方全体`,
enemy_one: tp`敌方1体`,
@@ -269,7 +273,7 @@
[18]: tp`${'icon'}暗+`,
[19]: tp`${'icon'}手指`,
[20]: tp`${'icon'}心解`,
[21]: tp`${'icon'}SB`,
[21]: tp`${'icon'} B`,
[22]: tp`${'icon'}火横`,
[23]: tp`${'icon'}水横`,
[24]: tp`${'icon'}木横`,
@@ -313,7 +317,7 @@
[62]: tp`${'icon'}c珠`,
[63]: tp`${'icon'}语音`,
[64]: tp`${'icon'}奖励增加`,
[65]: tp`${'icon'} HP -`,
[65]: tp`${'icon'}HP -`,
[66]: tp`${'icon'}攻击-`,
[67]: tp`${'icon'}回复-`,
[68]: tp`${'icon'}大防暗`,


+ 3
- 3
library/html2canvas.min.js
File diff suppressed because it is too large
View File


+ 1
- 1
library/zxing.umd.min.js
File diff suppressed because it is too large
View File


+ 1
- 1
monsters-info/ckey.json View File

@@ -1 +1 @@
[{"code":"ja","ckey":{"card":"fa25dbb3e64474ee4c67c75b6fb3eadf","skill":"1cfa850f4e751f1af8c82d5617cb7f63"},"updateTime":1644543345815},{"code":"en","ckey":{"card":"ce47727de0a8a4c70bcb057965db64f7","skill":"d11c2d7dabdae13c3a9f62eb2765616d"},"updateTime":1644497282103},{"code":"ko","ckey":{"card":"153ebffcd2fbdcd9c5b49df0340b7f81","skill":"a9101af7cbebe4d543b34f70d6017ab1"},"updateTime":1644497282103}]
[{"code":"ja","ckey":{"card":"7fcd84e9b15daef107106d3bd9bc88fb","skill":"f6325b48a470e0bdf3866e85df053c16"},"updateTime":1650277168198},{"code":"en","ckey":{"card":"46a400abf1aaf7101de9e6608ae8046f","skill":"412e27ec83b66ffe775615ca509203b8"},"updateTime":1650277168198},{"code":"ko","ckey":{"card":"d81734d1081b11cfbc19bf6b56417c9b","skill":"2eaf36d0d87213bf5a29a14cd4f60217"},"updateTime":1650277168198}]

+ 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


+ 51
- 17
monsters-info/extractByNode.js View File

@@ -18,6 +18,11 @@ const officialAPI = [ //来源于官方API
}
];
//数组去重
Array.prototype.distinct = function() {
let _set = new Set(this);
return Array.from(_set)
}
//比较两只怪物是否是同一只(在不同语言服务器)
function sameCard(m1,m2)
{
@@ -32,6 +37,29 @@ function sameCard(m1,m2)
if (m1.collabId != m2.collabId) return false; //合作ID
return true;
}
//查找到真正起作用的那一个技能
function getActuallySkills(skillsDataset, skillid, skillTypes, searchRandom = true) {
const skill = skillsDataset[skillid];
if (skill) {
if (skillTypes.includes(skill.type)){
return [skill];
} else if (skill.type == 116 || //主动技
(searchRandom && skill.type == 118) || //随机主动技
skill.type == 138 || //队长技
skill.type == 232 || //进化技能1,不循环
skill.type == 233) { //进化技能2,循环
//因为可能有多层调用,特别是随机118再调用组合116的,所以需要递归
let subSkills = skill.params.flatMap(id => getActuallySkills(skillsDataset, id, skillTypes, searchRandom));
subSkills = subSkills.filter(s=>s);
return subSkills;
} else {
return [];
}
} else {
return [];
}
}
/*
* 正式流程
*/
@@ -67,6 +95,8 @@ officialAPI.forEach(function(lang) {
delete card.unk06;
delete card.unk07;
delete card.unk08;
if (card.searchFlags.every(num=>isNaN(num)))
delete card.searchFlags;
monCards.push(card);
}
@@ -97,21 +127,25 @@ officialAPI.forEach(function(lang) {
const oSkills = lang.skillOriginal = skillJsonObj.skill;//将字符串转换为json对象
lang.skills = oSkills.map((oc,idx)=>new Skill(idx,oc)); //每一项生成分析对象
lang.cards.forEach((m,idx,arr)=>{
const skill = lang.skills[m.activeSkillId];
lang.cards.forEach((m, idx, cardArr)=>{
let henshinTo = null;
const searchType = 202;
if (skill.type == searchType)
henshinTo = skill.params[0];
else if (skill.type == 116 || skill.type == 118){
const subskill = skill.params.map(id=>lang.skills[id]).find(subskill=>subskill.type == searchType);
if (subskill)
henshinTo = subskill.params[0];
}
if (henshinTo)
{
m.henshinTo = henshinTo;
arr[henshinTo].henshinFrom = idx;
const henshinSkill = getActuallySkills(lang.skills, m.activeSkillId, [202, 236]);
if (henshinSkill.length) {
const skill = henshinSkill[0];
henshinTo = skill.params.distinct();
if (Array.isArray(henshinTo))
{
m.henshinTo = henshinTo;
//变身来源可能有多个,因此将变身来源修改为数组
for (let toId of henshinTo) {
let henshinFrom = cardArr[toId].henshinFrom;
if (Array.isArray(henshinFrom)) {
henshinFrom.push(idx);
} else {
cardArr[toId].henshinFrom = [idx];
}
}
}
}
});
@@ -258,8 +292,8 @@ var ckeyObjs;
fs.readFile('./ckey.json','utf-8',function(err,data){
if(err)
{ //如果读取错误,直接使用全新ckey
ckeyObjs = newCkeyObjs;
} else
ckeyObjs = newCkeyObjs;
} else
{ //如果读取正确,则读入JSON,并判断是否和旧有的一致
ckeyObjs = JSON.parse(data);
for (let ci=0;ci<ckeyObjs.length;ci++)
@@ -271,7 +305,7 @@ fs.readFile('./ckey.json','utf-8',function(err,data){
ckeyObjs[ci] = newCkey;
}
}
}
}
fs.writeFile('./ckey.json',JSON.stringify(ckeyObjs),function(err){
if(err){
console.error(err);


+ 1
- 1
monsters-info/mon_en.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/mon_ko.json
File diff suppressed because it is too large
View File


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


+ 1
- 1
monsters-info/official-API/en-skill.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/official-API/ko-card.json
File diff suppressed because it is too large
View File


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


+ 9
- 8
monsters-info/official-API/parseCard.js View File

@@ -68,19 +68,20 @@ class Card{
card.collabId = data[i++]; //合作ID
const flags = data[i++]; //一个旗子?
card.unk08 = flags; //未知08
card.canAssist = (flags & 1) !== 0; //是否能当二技
card.enabled = (flags & 1<<1) !== 0; //是否已启用
card.overlay = card.types.some(t => { //这步还是猜测,是否能合并
return t == 0 || t == 12 || t == 14; //0進化用;12能力覺醒用;14強化合成用;15販賣用
}) && (flags & 1<<3) === 0; //進化用、能力覺醒用、強化合成用,且flag有1000时
card.is8Latent = (flags & 1<<5) !== 0; //是否支持8个潜觉
card.canAssist = Boolean(flags & 1<<0); //是否能当二技
card.enabled = Boolean(flags & 1<<1); //是否已启用
card.overlay = !Boolean(flags & 1<<3) && //flag有1<<3时,不合并,没有时则判断
card.types.some(t=>[0,12,14,15].includes(t)); //0進化用;12能力覺醒用;14強化合成用;15販賣用默认合并
card.is8Latent = Boolean(flags & 1<<5); //是否支持8个潜觉
card.altName = data[i++].split("|").filter(str=>str.length); //替换名字(分类标签)
card.limitBreakIncr = data[i++]; //110级增长
card.voiceId = data[i++]; //语音觉醒的ID
card.blockSkinId = data[i++]; //珠子皮肤ID
card.specialAttribute = data[i++]; //特别属性,比如黄龙
if (i !== data.length)
console.log(`residue data for #${card.id}: ${i} ${data.length}`);
card.searchFlags = [data[i++], data[i++]]; //队长技搜索类型,解析写在这里会导致文件太大,所以写到前端去了
if ((i + 1) < data.length)
console.log(`有新增数据/residue data for #${card.id}: ${i} ${data.length}`);
}
}
//对于Nodejs输出成模块

+ 1
- 1
monsters-info/skill_en.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


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


+ 2
- 2
multi.html View File

@@ -774,8 +774,8 @@ var formation = new Formation(teamsCount,5);
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="11" data-max-count="5"></button><!--防暗--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="12" data-max-count="5"></button><!--防废--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="13" data-max-count="5"></button><!--防毒--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="54" data-max-count="1"></button><!--防云--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="55" data-max-count="1"></button><!--防封条--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="54" data-max-count="2"></button><!--防云--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="55" data-max-count="2"></button><!--防封条--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="45" data-max-count="1"></button><!--心追--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="50"></button><!--方块心追--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="19"></button><!--手指--></li>


+ 142
- 152
script-json_data.js View File

@@ -104,6 +104,7 @@ let localTranslating = {
power_up: tp`${'condition'}${'targets'}${'value'}${'reduceDamage'}${'addCombo'}${'followAttack'}`,
power_up_targets: tp`[${'attrs_types'}]'s `, //attrs, types, attrs_types
henshin: tp`Transforms into ${'card'}`,
random_henshin: tp`Random transforms into ${'cards'}`,
void_poison: tp`Voids ${'poison'} damage`,
skill_proviso: tp`The follow-up effect can only be activates ${'condition'}`,
obstruct_opponent: tp`Apply obstruct skill effect to ${'target'}: ${'skills'}`,
@@ -137,8 +138,9 @@ let localTranslating = {
multi_player: tp`When in Multiplayer Mode `,
remain_orbs: tp`When ≤ ${'value'} Orbs on the board `,
exact_combo: tp`When exactly ${'value'} combos `,
exact_match_length: tp`When matching exactly ${'value'}${'orbs'} `,
exact_match_length: tp`When matching exactly of ${'value'}${'orbs'} `,
exact_match_enhanced: tp` orbs including enhanced`,
exact_match_length_multiple: tp`When matching each exactly of ${'value'}${'orbs'} `,
compo_type_card: tp`When ${'ids'} are all on team, `,
compo_type_series: tp`When all subs from ${'ids'} collab (Needs at least 1 sub), `,
@@ -177,7 +179,9 @@ let localTranslating = {
team: tp`team`,
team_last: tp`the lastest member`,
team_leader: tp`leader`,
team_sub: tp`sub-monsters`,
sub_members: tp`sub-members`,
leader_self: tp`left leader`,
leader_helper: tp`right leader`,
enemy: tp`Enemy`,
enemy_all: tp`all enemys`,
enemy_one: tp`1 enemy`,
@@ -342,11 +346,11 @@ let localTranslating = {
[75]: tp`${'icon'}Enhanced Wood Combos`,
[76]: tp`${'icon'}Enhanced Light Combos`,
[77]: tp`${'icon'}Enhanced Dark Combos`,
[78]: tp`${'icon'}CrossBoost`,
[79]: tp`${'icon'}Enhanced 3 colors`,
[80]: tp`${'icon'}Enhanced 4 colors`,
[81]: tp`${'icon'}Enhanced 5 colors`,
[82]: tp`${'icon'}Super Connecting Eraser Bonus`,
[78]: tp`${'icon'}Cross Attack`,
[79]: tp`${'icon'}3 Att. Enhanced Attack`,
[80]: tp`${'icon'}4 Att. Enhanced Attack`,
[81]: tp`${'icon'}5 Att. Enhanced Attack`,
[82]: tp`${'icon'}Super Enhanced Matching`,
}
},
};
@@ -701,6 +705,10 @@ const specialSearchFunctions = (function() {
case 210: //十字触发
scale = sk[1]/100;
break;
case 235: { //可多次触发
reduce.scale = (sk[4] || 0) / 100;
break;
}
case 138: //调用其他队长技
scale = sk.reduce((pmul,skid)=> 1 - (1-pmul) * (1-getReduceScale(Skills[skid], allAttr, noHPneed)),0);
@@ -1194,7 +1202,15 @@ const specialSearchFunctions = (function() {
});
},
addition:card=>{
return getSkillFixedDamage(card).bigNumberToString() + "固伤";
const value = getSkillFixedDamage(card);
let nodeArr = [`${value.bigNumberToString()}固伤`];
let skill;
if (skill = getCardLeaderSkill(card, [235])) {
nodeArr.push("/");
nodeArr.push(createOrbsList(flags(skill.params[0])));
nodeArr.push(`×${skill.params[2]}`);
}
return nodeArr.nodeJoin();
}
},
{name:"Adds combo(sort by combo)",otLangName:{chs:"队长技+C(按+C数排序)",cht:"隊長技+C(按+C數排序)"},
@@ -1207,103 +1223,110 @@ const specialSearchFunctions = (function() {
});
},
addition:card=>{
const value = getSkillAddCombo(card);
const searchTypeArray = [210];
const skill = getCardLeaderSkill(card, searchTypeArray);
return `+${value.bigNumberToString()}C${skill?`/十字`:""}`;
const value = getSkillAddCombo(card);
let nodeArr = [`+${value.bigNumberToString()}C`];
let skill;
if (skill = getCardLeaderSkill(card, [210])) {
nodeArr.push("/十字");
} else if (skill = getCardLeaderSkill(card, [235])) {
nodeArr.push("/");
nodeArr.push(createOrbsList(flags(skill.params[0])));
nodeArr.push(`×${skill.params[2]}`);
}
return nodeArr.nodeJoin();
}
},
{name:"[7×6 board]",otLangName:{chs:"【7×6 版面】",cht:"【7×6 版面】"},
function:cards=>cards.filter(card=>{
const searchTypeArray = [162,186];
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
const searchTypeArray = [162,186];
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
})
},
{name:"[No skyfall]",otLangName:{chs:"【无天降版面】",cht:"【無天降版面】"},
function:cards=>cards.filter(card=>{
const searchTypeArray = [163,177];
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
const searchTypeArray = [163,177];
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
})
},
{name:"Move time changes(sort by time)",otLangName:{chs:"队长技加/减秒(按秒数排序)",cht:"隊長技加/減秒(按秒數排序)"},
function:cards=>{
const searchTypeArray = [15,185];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
const searchTypeArray = [15,185];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
},
addition:card=>{
const searchTypeArray = [15,185];
const skill = getCardLeaderSkill(card, searchTypeArray);
const value = skill.params[0];
return `${value > 0 ? "+" : ""}${value/100}s`;
const searchTypeArray = [15,185];
const skill = getCardLeaderSkill(card, searchTypeArray);
const value = skill.params[0];
return `${value > 0 ? "+" : ""}${value/100}s`;
}
},
{name:"Fixed move time(sort by time)",otLangName:{chs:"固定操作时间(按时间排序)",cht:"固定操作時間(按時間排序)"},
function:cards=>{
const searchTypeArray = [178];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
const searchTypeArray = [178];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
},
addition:card=>{
const searchTypeArray = [178];
const skill = getCardLeaderSkill(card, searchTypeArray);
const value = skill.params[0];
return `固定${value}s`;
const searchTypeArray = [178];
const skill = getCardLeaderSkill(card, searchTypeArray);
const value = skill.params[0];
return `固定${value}s`;
}
},
{name:"Bonus attack when matching Orbs(sort by rate)",otLangName:{chs:"消除宝珠时计算防御的追打(按追打比率排序)",cht:"消除寶珠時計算防禦的追打(按追打比率排序)"},
function:cards=>{
const searchTypeArray = [12];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
const searchTypeArray = [12];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
},
addition:card=>{
const searchTypeArray = [12];
const skill = getCardLeaderSkill(card, searchTypeArray);
const value = skill.params[0];
return `攻击×${(value/100).bigNumberToString()}倍`;
const searchTypeArray = [12];
const skill = getCardLeaderSkill(card, searchTypeArray);
const value = skill.params[0];
return `攻击×${(value/100).bigNumberToString()}倍`;
}
},
{name:"Recovers HP when matching Orbs(sort by rate)",otLangName:{chs:"消除宝珠时回血(按回复比率排序)",cht:"消除寶珠時回血(按回複比率排序)"},
function:cards=>{
const searchTypeArray = [13];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
const searchTypeArray = [13];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
},
addition:card=>{
const searchTypeArray = [13];
const skill = getCardLeaderSkill(card, searchTypeArray);
const value = skill.params[0];
return `回复×${(value/100).bigNumberToString()}倍`;
const searchTypeArray = [13];
const skill = getCardLeaderSkill(card, searchTypeArray);
const value = skill.params[0];
return `回复×${(value/100).bigNumberToString()}倍`;
}
},
{name:"Counterattack(sort by rate)",otLangName:{chs:"队长技受伤反击",cht:"隊長技受傷反擊"},
function:cards=>{
const searchTypeArray = [41];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray,1));
const searchTypeArray = [41];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray,1));
},
addition:card=>{
const searchTypeArray = [41];
const skill = getCardLeaderSkill(card, searchTypeArray);
const sk = skill.params;
const fragment = document.createDocumentFragment();
fragment.appendChild(createOrbsList(sk[2] || 0));
fragment.appendChild(document.createTextNode(`×${(sk[1]/100).bigNumberToString()}倍`));
if (sk[0] < 100)fragment.appendChild(document.createTextNode(`(${sk[0]}%)`));
return fragment;
const searchTypeArray = [41];
const skill = getCardLeaderSkill(card, searchTypeArray);
const sk = skill.params;
const fragment = document.createDocumentFragment();
fragment.appendChild(createOrbsList(sk[2] || 0));
fragment.appendChild(document.createTextNode(`×${(sk[1]/100).bigNumberToString()}倍`));
if (sk[0] < 100) fragment.appendChild(document.createTextNode(`(${sk[0]}%)`));
return fragment;
}
},
{name:"Voids Poison dmg",otLangName:{chs:"毒无效",cht:"毒無效"},
@@ -1366,75 +1389,75 @@ const specialSearchFunctions = (function() {
},
{name:"Unable to less match(sort by orbs need)",otLangName:{chs:"要求长串消除(按珠数排序)",cht:"要求長串消除(按珠數排序)"},
function:cards=>{
const searchTypeArray = [158];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
const searchTypeArray = [158];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
},
addition:card=>{
const searchTypeArray = [158];
const skill = getCardLeaderSkill(card, searchTypeArray);
const value = skill.params[0];
return `≥${value}珠`;
const searchTypeArray = [158];
const skill = getCardLeaderSkill(card, searchTypeArray);
const value = skill.params[0];
return `≥${value}珠`;
}
},
{name:"Resolve",otLangName:{chs:"根性",cht:"根性"},
function:cards=>{
const searchTypeArray = [14];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
const searchTypeArray = [14];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
},
addition:card=>{
const searchTypeArray = [14];
const skill = getCardLeaderSkill(card, searchTypeArray);
const value = skill.params[0];
const searchTypeArray = [14];
const skill = getCardLeaderSkill(card, searchTypeArray);
const value = skill.params[0];
return `HP≥${value}%`;
}
},
{name:"Designate member ID",otLangName:{chs:"指定队伍队员编号",cht:"指定隊伍隊員編號"},
function:cards=>cards.filter(card=>{
const searchTypeArray = [125];
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
const searchTypeArray = [125];
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
})
},
{name:"Designate collab ID",otLangName:{chs:"指定队伍队员合作编号",cht:"指定隊伍隊員合作編號"},
function:cards=>cards.filter(card=>{
const searchTypeArray = [175];
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
const searchTypeArray = [175];
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
})
},
{name:"Designate Evo type",otLangName:{chs:"指定队伍队员进化类型",cht:"指定隊伍隊員進化類型"},
function:cards=>cards.filter(card=>{
const searchTypeArray = [203];
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
const searchTypeArray = [203];
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
})
},
{name:"Floating rate based on the number of attrs/types",otLangName:{chs:"根据属性/类型个数浮动倍率",cht:"根據屬性/類型個數浮動倍率"},
function:cards=>cards.filter(card=>{
const searchTypeArray = [229];
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
const searchTypeArray = [229];
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
})
},
{name:"Increase item drop rate(sort by rate)",otLangName:{chs:"增加道具掉落率(按增加倍率排序)",cht:"增加道具掉落率(按增加倍率排序)"},
function:cards=>{
const searchTypeArray = [53];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
const searchTypeArray = [53];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
},
addition:card=>{
const searchTypeArray = [53];
const skill = getCardLeaderSkill(card, searchTypeArray);
const sk = skill.params;
return `掉率x${sk[0]/100}`;
const searchTypeArray = [53];
const skill = getCardLeaderSkill(card, searchTypeArray);
const sk = skill.params;
return `掉率x${sk[0]/100}`;
}
},
{name:"Increase coin rate(sort by rate)",otLangName:{chs:"增加金币掉落倍数(按增加倍率排序)",cht:"增加金幣掉落倍數(按增加倍率排序)"},
@@ -1446,10 +1469,10 @@ const specialSearchFunctions = (function() {
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
},
addition:card=>{
const searchTypeArray = [54];
const skill = getCardLeaderSkill(card, searchTypeArray);
const sk = skill.params;
return `金币x${sk[0]/100}`;
const searchTypeArray = [54];
const skill = getCardLeaderSkill(card, searchTypeArray);
const sk = skill.params;
return `金币x${sk[0]/100}`;
}
},
{name:"Increase Exp rate(sort by rate)",otLangName:{chs:"增加经验获取倍数(按增加倍率排序)",cht:"增加經驗獲取倍數(按增加倍率排序)"},
@@ -1956,21 +1979,9 @@ const specialSearchFunctions = (function() {
const skill = getCardActiveSkill(card, searchTypeArray);
const sk = skill.params;
let str = '';
switch (sk[1]) {
case 1: {
str+="自身";
break;
}
case 2: {
str+="队长";
break;
}
case 8: {
str+="队员";
break;
}
}
str+=`${sk[2] / 100}倍×${sk[0]}T`;
const typeName = ['自身','左队长','右队长','队员'];
str += flags(sk[1]).map(n=>typeName[n]).join(',');
str +=`${sk[2] / 100}倍×${sk[0]}T`;
return str;
}
},
@@ -1994,6 +2005,7 @@ const specialSearchFunctions = (function() {
let str = "👆";
if (sk[1]) str += `${sk[1]>0?`+`:``}${sk[1]/10}S`;
if (sk[2]) str += `x${sk[2]/100}`;
str += `x${sk[0]}T`;
return str;
}
},
@@ -2275,7 +2287,7 @@ const specialSearchFunctions = (function() {
const searchTypeArray = [218];
const skill = getCardActiveSkill(card, searchTypeArray);
const sk = skill.params;
return document.createTextNode(`坐下${sk[0]}${sk[0]!=sk[1]?`~${sk[1]}`:""}`);
return document.createTextNode(`坐下${sk[0]}${sk[1] && sk[0]!=sk[1]?`~${sk[1]}`:""}`);
}
},
{name:"Change Leader",otLangName:{chs:"更换队长",cht:"更換隊長"},
@@ -3205,13 +3217,15 @@ const specialSearchFunctions = (function() {
]},
{group:true,name:"======Evo type======",otLangName:{chs:"======进化类型======",cht:"======進化類型======"}, functions: [
{name:"No Henshin",otLangName:{chs:"非变身",cht:"非變身"},
function:cards=>cards.filter(card=>!card.henshinFrom && !card.henshinTo)
function:cards=>cards.filter(card=>
!Array.isArray(card.henshinFrom) &&
!Array.isArray(card.henshinTo))
},
{name:"Before Henshin",otLangName:{chs:"变身前",cht:"變身前"},
function:cards=>cards.filter(card=>card.henshinTo)
function:cards=>cards.filter(card=>Array.isArray(card.henshinTo))
},
{name:"After Henshin",otLangName:{chs:"变身后",cht:"變身後"},
function:cards=>cards.filter(card=>card.henshinFrom)
function:cards=>cards.filter(card=>Array.isArray(card.henshinFrom))
},
{name:"Pixel Evo",otLangName:{chs:"像素进化",cht:"像素進化"},
function:cards=>cards.filter(card=>card.evoMaterials.includes(3826))
@@ -3227,30 +3241,6 @@ const specialSearchFunctions = (function() {
{name:"Super Ult Evo",otLangName:{chs:"超究极进化",cht:"超究極進化"},
function:cards=>cards.filter(card=>card.is8Latent && card.isUltEvo && !card.awakenings.includes(49))
},
/*{name:"",otLangName:{chs:"变身前",cht:"變身前"},
function:cards=>cards.filter(card=>{
const searchType = 202;
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:"",otLangName:{chs:"变身前后队长技保持不变",cht:"變身前後隊長技保持不變"},
function:cards=>cards.filter(card=>{
const searchType = 202;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType && card.leaderSkillId == Cards[skill.params[0]].leaderSkillId)
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 && card.leaderSkillId == Cards[subskill.params[0]].leaderSkillId);
}
})
},*/
{name:"Evo from Weapon",otLangName:{chs:"由武器进化而来",cht:"由武器進化而來"},
function:cards=>cards.filter(card=>card.isUltEvo && Cards[card.evoBaseId].awakenings.includes(49))
},


+ 43
- 42
script-skill-parser.js View File

@@ -722,9 +722,9 @@ const c = {
hp: function (min, max) {
return { hp: { min: min / 100, max: max / 100 } };
},
exact: function (type, value, attrs) {
exact: function (type, value, attrs, multiple = false) {
if (attrs === void 0) { attrs = Attributes.all(); }
return { exact: { type: type, value: value, attrs: attrs } };
return { exact: { type: type, value: value, attrs: attrs, multiple: multiple} };
},
compo: function (type, ids) {
return { compo: { type: type, ids: ids } };
@@ -845,8 +845,8 @@ function powerUp(attrs, types, value, condition = null, reduceDamageValue = null
if (hp === 1 && atk === 1 && rcv === 1 && !reduceDamage)
return null;
}
if (attrs?.target != undefined) {
return { kind: SkillKinds.PowerUp, target: attrs.target, attrs: null, types: null, condition: condition, value: value, reduceDamage: reduceDamageValue, additional: additional};
if (attrs?.targets != undefined) {
return { kind: SkillKinds.PowerUp, targets: attrs.targets, attrs: null, types: null, condition: condition, value: value, reduceDamage: reduceDamageValue, additional: additional};
}
return { kind: SkillKinds.PowerUp, attrs: attrs, types: types, condition: condition, value: value, reduceDamage: reduceDamageValue, additional: additional};
}
@@ -906,7 +906,14 @@ function autoPath() { return { kind: SkillKinds.AutoPath }; }
function leaderChange(type = 0) { return { kind: SkillKinds.LeaderChange, type: type }; }
function board7x6() { return { kind: SkillKinds.Board7x6 }; }
function noSkyfall() { return { kind: SkillKinds.NoSkyfall }; }
function henshin(id) { return { kind: SkillKinds.Henshin, id: id }; }
function henshin(id, random = false) {
return {
kind: SkillKinds.Henshin,
id: Array.isArray(id) ? id[0] : id, //兼容旧程序
ids: Array.isArray(id) ? id : [id],
random: random
};
}
function voidPoison() { return { kind: SkillKinds.VoidPoison }; }
function skillProviso(cond) { return { kind: SkillKinds.SkillProviso, cond: cond }; }
function obstructOpponent(type, pos, ids) {
@@ -985,7 +992,7 @@ const parsers = {
[58](attr, min, max) { return damageEnemy('all', attr, v.randomATK(min, max)); },
[59](attr, min, max) { return damageEnemy('single', attr, v.randomATK(min, max)); },
[60](turns, mul, attr) { return activeTurns(turns, counterAttack(attr, v.percent(100), v.percent(mul))); },
[61](attrs, min, base, bonus, incr) { return powerUp(null, null, p.scaleAttrs(flags(attrs), min, min + (incr ?? 0), [base, 100], [bonus, 0])); },
[61](attrs, min, base, bonus, max) { return powerUp(null, null, p.scaleAttrs(flags(attrs), min, max || min, [base, 100], [bonus, 0])); },
[62](type, mul) { return powerUp(null, [type], p.mul({ hp: mul, atk: mul })); },
[63](type, mul) { return powerUp(null, [type], p.mul({ hp: mul, rcv: mul })); },
[64](type, mul) { return powerUp(null, [type], p.mul({ atk: mul, rcv: mul })); },
@@ -1402,15 +1409,9 @@ const parsers = {
"leader": Boolean(target & 1<<1),
"sub-monsters": Boolean(target & 1<<3),
}*/
const targetType = (target=>{
switch (target) {
case 1: return "self";
case 2: return "leader";
case 8: return "sub-monsters";
default: return target;
}
})(target);
return activeTurns(turns, powerUp({target: targetType}, null, p.mul({ atk: mul })));
const targetTypes = ["self","leader-self","leader-helper","sub-members"];
const typeArr = flags(target).map(n => targetTypes[n]);
return activeTurns(turns, powerUp({targets: typeArr}, null, p.mul({ atk: mul })));
},
[231](turns, awoken1, awoken2, awoken3, awoken4, awoken5, atk, rcv) {
return activeTurns(turns, powerUp(null, null, p.scaleStateKindCount([awoken1, awoken2, awoken3, awoken4, awoken5].filter(Boolean), null, null, p.mul({atk: atk, hp:0, rcv: rcv}))));
@@ -1418,6 +1419,12 @@ const parsers = {
[232](...ids) { return evolvedSkills(false, ids.map(id => this.parser(id))); },
[233](...ids) { return evolvedSkills(true, ids.map(id => this.parser(id))); },
[234](min, max) { return skillProviso(c.stage(min ?? 0, max ?? 0)); },
[235](attr, _, len, atk, percent, combo, damage) {
return powerUp(null, null, p.mul({ atk: atk || 100}), c.exact('match-length', len, flags(attr), true), v.percent(percent), [combo ? addCombo(combo) : null, damage ? followAttackFixed(damage) : null].filter(Boolean));
},
[236](...ids) { //随机变身
return henshin(ids.distinct(), true);
},
[1000](type, pos, ...ids) {
const posType = (type=>{
switch (type) {
@@ -1711,7 +1718,7 @@ function renderSkill(skill, option = {})
frg.ap(tsp.skill.time_extend(dict));
break;
}
case SkillKinds.FollowAttack: { //队长技追打
case SkillKinds.FollowAttack: { //队长技倍率追打
let dict = {
//icon: createIcon("follow_attack"),
belong_to: tsp.target.self(),
@@ -2122,7 +2129,7 @@ function renderSkill(skill, option = {})
break;
}
case SkillKinds.PowerUp: {
let attrs = skill.attrs, types = skill.types, target = skill.target, condition = skill.condition, value = skill.value, reduceDamage = skill.reduceDamage, additional = skill.additional;
let attrs = skill.attrs, types = skill.types, targets = skill.targets, condition = skill.condition, value = skill.value, reduceDamage = skill.reduceDamage, additional = skill.additional;
dict = {
icon: createIcon(skill.kind),
};
@@ -2139,26 +2146,12 @@ function renderSkill(skill, option = {})
targetDict.types = renderTypes(types || [], {affix: true});
attrs_types.push(targetDict.types);
}
if (target != undefined)
if (targets != undefined)
{
switch (target) {
case "self": {
targetDict.target = tsp.target.self();
break;
}
case "leader": {
targetDict.target = tsp.target.team_leader();
break;
}
case "sub-monsters": {
targetDict.target = tsp.target.team_sub();
break;
}
default: {
targetDict.target = tsp.target.unknown();
break;
}
}
console.debug(targets)
targetDict.target = targets.map(target=>
tsp?.target[target.replaceAll("-","_")]?.())
.nodeJoin(tsp.word.slight_pause());
attrs_types.push(targetDict.target);
}
if (attrs_types.length)
@@ -2202,13 +2195,18 @@ function renderSkill(skill, option = {})
break;
}
case SkillKinds.Henshin: { //变身
let id = skill.id;
const dom = cardN(id);
dom.monDom.onclick = changeToIdInSkillDetail;
let ids = skill.ids, random = skill.random;
let doms = ids.map(id=>{
let dom = cardN(id);
dom.monDom.onclick = changeToIdInSkillDetail;
return dom; })
dict = {
card: dom,
cards: doms.nodeJoin(),
}
frg.ap(tsp.skill.henshin(dict));
frg.ap(random ?
tsp.skill.random_henshin(dict) :
tsp.skill.henshin(dict)
);
break;
}
case SkillKinds.VoidPoison: { //毒无效
@@ -2428,7 +2426,10 @@ function renderCondition(cond) {
value: renderValue(v.constant(cond.exact.value), {unit: tsp.unit.orbs}),
orbs: cond.exact.attrs === 'enhanced' ? tsp.cond.exact_match_enhanced() : renderOrbs(cond.exact.attrs, {affix: true})
};
frg.ap(tsp.cond.exact_match_length(dict));
frg.ap(cond.exact.multiple ?
tsp.cond.exact_match_length_multiple(dict) :
tsp.cond.exact_match_length(dict));
}
} else if (cond.compo) {
let dict = {};


+ 27
- 15
script-universal_function.js View File

@@ -106,6 +106,11 @@ Array.prototype.deleteLatter = function(item = null) {
this.splice(index + 1);
return this;
}
//数组去重
Array.prototype.distinct = function() {
let _set = new Set(this);
return Array.from(_set)
}
Array.prototype.randomShift = function() {
return this.splice(Math.random() * this.length, 1)?.[0];
}
@@ -624,7 +629,7 @@ function calculateAbility_max(id, solo, teamsCount, maxLevel = 110) {
function searchCards(cards, attr1, attr2, fixMainColor, types, typeAndOr, rares, awokens, sawokens, equalAk, incSawoken, canAssist, noHenshin) {
let cardsRange = cards.concat(); //这里需要复制一份原来的数组,不然若无筛选,后面的排序会改变初始Cards
if (canAssist) cardsRange = cardsRange.filter(card=>card.canAssist);
if (noHenshin) cardsRange = cardsRange.filter(card=>!card.henshinFrom || card.limitBreakIncr);
if (noHenshin) cardsRange = cardsRange.filter(card=>!Array.isArray(card.henshinFrom) || card.limitBreakIncr);
//属性
if (attr1 != null && attr1 === attr2 || //主副属性一致并不为空
(attr1 === 6 && attr2 === -1)) //主副属性都为“无”
@@ -1086,9 +1091,9 @@ function tIf_Effect_76board(leader1id, leader2id) {
{
if (firstId == undefined) firstId = cardid;
let card = Cards[cardid];
if (card && card.henshinFrom && card.henshinFrom !== firstId)
if (card && Array.isArray(card.henshinFrom) && card.henshinFrom[0] !== firstId)
{
card = henshinBase(card.henshinFrom, firstId);
card = henshinBase(card.henshinFrom[0], firstId);
}
return card;
}
@@ -1121,46 +1126,49 @@ function tIf_Effect_addCombo(leader1id, leader2id) {
];
}
function getSkillAddCombo(card) {
const searchTypeArray = [192, 194, 206, 209, 210, 219, 220];
const searchTypeArray = [192, 194, 206, 209, 210, 219, 220, 235];
const skill = getCardLeaderSkills(card, searchTypeArray)[0];
if (!skill) return 0;
switch (skill.type) {
case 192:
case 194:
return skill.params[3];
return skill.params[3] ?? 0;
case 206:
return skill.params[6];
return skill.params[6] ?? 0;
case 209:
return skill.params[0];
return skill.params[0] ?? 0;
case 210:
case 219:
return skill.params[2];
return skill.params[2] ?? 0;
case 220:
return skill.params[1];
return skill.params[1] ?? 0;
case 235:
return skill.params[5] ?? 0;
default:
return 0;
}
}
//计算队伍的追打
function tIf_Effect_inflicts(leader1id, leader2id) {
const searchTypeArray = [199, 200, 201, 223];
return [
getSkillFixedDamage(Cards[leader1id]),
getSkillFixedDamage(Cards[leader2id])
];
}
function getSkillFixedDamage(card) {
const searchTypeArray = [199, 200, 201, 223];
const searchTypeArray = [199, 200, 201, 223, 235];
const skill = getCardLeaderSkills(card, searchTypeArray)[0];
if (!skill) return 0;
switch (skill.type) {
case 199:
case 200:
return skill.params[2];
return skill.params[2] ?? 0;
case 201:
return skill.params[5];
return skill.params[5] ?? 0;
case 223:
return skill.params[1];
return skill.params[1] ?? 0;
case 235:
return skill.params[6] ?? 0;
default:
return 0;
}
@@ -1326,7 +1334,7 @@ function getReduceRange(reduceScales)
}
//获取盾减伤比例组
function getReduceScales(leaderid) {
const searchTypeArray = [16, 17, 36, 38, 43, 129, 163, 130, 131, 178, 151, 169, 198, 170, 182, 193, 171, 183];
const searchTypeArray = [16, 17, 36, 38, 43, 129, 163, 130, 131, 178, 151, 169, 198, 170, 182, 193, 171, 183, 235];
const lss = getCardLeaderSkills(Cards[leaderid], searchTypeArray);
function leaderReduceScale(ls) {
@@ -1432,6 +1440,10 @@ function getReduceScales(leaderid) {
case 210: //十字触发
reduce.scale = (sk[1] || 0) / 100;
break;
case 235: { //可多次触发
reduce.scale = (sk[4] || 0) / 100;
break;
}
default:
}
return reduce;


+ 157
- 81
script.js View File

@@ -667,16 +667,15 @@ class EvoTree
{
const _this = this;
this.parent = parent;
if (parent == null)
if (parent == null) //如果没有提供父级,则寻找进化根
{
//mid = Cards[mid].evoRootId;
function returnRootId(mid)
{
mid = Cards[mid].evoRootId;
const m = Cards[mid];
if (m.henshinFrom && m.henshinFrom < m.id)
{ //只有变身来源小于目前id的,才继续找base
mid = returnRootId(m.henshinFrom);
if (Array.isArray(m.henshinFrom) && m.henshinFrom[0] < m.id)
{ //只有变身来源小于目前id的,才继续找base,为了解决黑魔导女孩的问题,将来如果需要要可以改成检测是否能110级
mid = returnRootId(m.henshinFrom[0]);
}
return mid;
}
@@ -685,7 +684,7 @@ class EvoTree
const card = Cards[mid];
this.id = mid;
this.idArr = parent ? parent.idArr : [];
this.idArr = parent ? parent.idArr.concat() : [];
this.card = card;
this.children = [];
this.evoType = null;
@@ -694,9 +693,17 @@ class EvoTree
{
this.evoType = "Base";
}
else if (card.henshinFrom == parent.id)
else if (Array.isArray(card.henshinFrom) && card.henshinFrom.includes(parent.id))
{
this.evoType = "Henshin";
if (parent.card.henshinTo.length > 1) {
this.evoType = "Random Henshin";
//限定最多两层随机变身
if (parent?.parent?.card?.henshinTo?.length > 1) {
return this;
}
}
else
this.evoType = "Henshin";
}
else
{
@@ -717,10 +724,7 @@ class EvoTree
}
}else
{
if (card.henshinFrom == parent.id)
{
this.evoType = "Henshin";
}else if (parent.card.isUltEvo) //转生
if (parent.card.isUltEvo) //转生
{
this.evoType = "Reincarnation";
}else if(parent.evoType == "Reincarnation")
@@ -732,10 +736,10 @@ class EvoTree
}
}
}
if (this.idArr.includes(mid))
{
if (card.henshinFrom == parent.id)
if (Array.isArray(card.henshinFrom) && card.henshinFrom.includes(parent.id))
{
this.evoType = "Henshin Loop";
}
@@ -744,8 +748,11 @@ class EvoTree
{
this.idArr.push(mid);
}
if (card.henshinTo)
this.children.push(new EvoTree(card.henshinTo,_this));
if (Array.isArray(card.henshinTo)) {
for (let toId of card.henshinTo) {
this.children.push(new EvoTree(toId, _this));
}
}
if (this.evoType != "Henshin")
this.children.push(...Cards.filter(scard=>scard.evoBaseId == mid && scard.id != mid).map(scard=>new EvoTree(scard.id,_this)));
//this.children = (card.henshinTo && card.henshinTo != card.evoRootId ? [new EvoTree(card.henshinTo,_this)] : []).concat(Cards.filter(scard=>scard.evoBaseId == mid && scard.id != mid).map(scard=>new EvoTree(scard.id,_this)));
@@ -790,6 +797,51 @@ class EvoTree
};
}

//队长技能类型的翻译
class LeaderSkillType{
constructor(flags1, flags2){
this.matchMode = {
multipleColors: Boolean(flags1 & 1 << 0),
rowMatch: Boolean(flags1 & 1 << 1),
combo: Boolean(flags1 & 1 << 2),
sameColor: Boolean(flags1 & 1 << 3),
LShape: Boolean(flags1 & 1 << 4),
crossMatch: Boolean(flags1 & 1 << 5),
heartCrossMatch: Boolean(flags1 & 1 << 6),
remainOrbs: Boolean(flags1 & 1 << 7),
enhanced5Orbs: Boolean(flags1 & 1 << 8),
};
this.restriction = {
attrEnhance: Boolean(flags1 & 1 << 9),
typeEnhance: Boolean(flags1 & 1 << 10),
board7x6: Boolean(flags1 & 1 << 11),
noSkyfall: Boolean(flags1 & 1 << 12),
HpRange: Boolean(flags1 & 1 << 13),
useSkill: Boolean(flags1 & 1 << 14),
moveTimeDecrease_Fixed: Boolean(flags1 & 1 << 15),
minMatchLen: Boolean(flags1 & 1 << 16),
specialTeam: Boolean(flags1 & 1 << 17),
effectWhenRecover: Boolean(flags1 & 1 << 18),
};
this.appendEffects = {
addCombo: Boolean(flags1 & 1 << 21),
fixedFollowAttack: Boolean(flags1 & 1 << 22),
scaleFollowAttack: Boolean(flags1 & 1 << 23),
reduce49down: Boolean(flags1 & 1 << 24),
reduce50: Boolean(flags1 & 1 << 25),
reduce51up: Boolean(flags1 & 1 << 26),
moveTimeIncrease: Boolean(flags1 & 1 << 20),
rateMultiplyExp_Coin: Boolean(flags1 & 1 << 27),
rateMultiplyDrop: Boolean(flags1 & 1 << 28),
voidPoison: Boolean(flags1 & 1 << 29),
counterAttack: Boolean(flags1 & 1 << 30),
autoHeal: Boolean(flags1 & 1 << 31),
unbindAwokenBind: Boolean(flags1 & 1 << 19),
resolve: Boolean(flags2 & 1 << 0),
};
}
}

//切换通用的切换className显示的函数
function toggleDomClassName(addClass, className, dom = document.body) {
dom.classList[addClass ? "add" : "remove"](className);
@@ -822,13 +874,14 @@ function henshinStep(step)

function gotoHenshin(card, nstep)
{
if (nstep > 0 && card.henshinTo)
{ //是变身的则返回
return gotoHenshin(Cards[card.henshinTo], --nstep);
if (nstep > 0 && Array.isArray(card.henshinTo))
{
let max = Math.randomInteger(card.henshinTo.length - 1);
return gotoHenshin(Cards[card.henshinTo[max]], --nstep);
}
else if (nstep < 0 && card.henshinFrom)
else if (nstep < 0 && Array.isArray(card.henshinFrom))
{
return gotoHenshin(Cards[card.henshinFrom], ++nstep);
return gotoHenshin(Cards[card.henshinFrom[0]], ++nstep);
}
else
{
@@ -839,7 +892,7 @@ function henshinStep(step)
team[0].forEach(member=>{
const mid = member.id;
const card = Cards[mid];
if (step > 0 ? card.henshinTo : (card.henshinFrom && member.level <= 99))
if (step > 0 ? Array.isArray(card.henshinTo) : (Array.isArray(card.henshinFrom) && member.level <= 99))
{ //要变身前的才进行操作
const _card = gotoHenshin(card, step);
member.id = _card.id;
@@ -944,14 +997,13 @@ function loadData(force = false)
console.debug("目前使用的数据区服是 %s。", currentDataSource.code);
currentCkey = newCkeys.find(ckey => ckey.code == currentDataSource.code); //获取当前语言的ckey
lastCkeys = localStorage.getItem(cfgPrefix + "ckey"); //读取本地储存的原来的ckey
try {
lastCkeys = JSON.parse(lastCkeys);
if (lastCkeys == null || !Array.isArray(lastCkeys))
lastCkeys = JSON.parse(localStorage.getItem(cfgPrefix + "ckey")); //读取本地储存的原来的ckey
if (!Boolean(lastCkeys) || !Array.isArray(lastCkeys))
lastCkeys = [];
} catch (e) {
console.error("旧的 Ckey 数据 JSON 解码出错。", e);
return;
lastCkeys = [];
}
lastCurrentCkey = lastCkeys.find(ckey => ckey.code == currentDataSource.code);
if (!lastCurrentCkey) { //如果未找到上个ckey,则添加个新的
@@ -971,7 +1023,8 @@ function loadData(force = false)
const objectStore = transaction.objectStore(`cards`);
const request = objectStore.get(currentDataSource.code);
request.onerror = function(event) {
console.error("Cards 数据库内容读取失败。");
console.error("Cards 数据库内容读取失败,需重新下载。");
downloadCardsData();
};
request.onsuccess = function(event) {
if (Array.isArray(request.result))
@@ -1030,35 +1083,29 @@ function loadData(force = false)
for (let i = splitIdx + 1; i < _cards.length; i++)
{
const card = _cards[i];
if (card.searchFlags) card.leaderSkillTypes = new LeaderSkillType(...card.searchFlags);
/*card.unk01p = flags(card.unk01);
card.unk02p = flags(card.unk02);
card.unk03p = flags(card.unk03);
card.unk04p = flags(card.unk04);
card.unk05p = flags(card.unk05);
card.unk06p = flags(card.unk06);
card.unk07p = flags(card.unk07);
card.unk08p = flags(card.unk08);*/
cards[card?.id] = card;
}
return cards;
}
function dealCardsData()
function dealCardsData(_cards)
{
if (editBox)
{
const monstersList = editBox.querySelector("#monsters-name-list");
let fragment = document.createDocumentFragment();
Cards.forEach(function(card, idx, arr) { //添加下拉框候选
_cards.forEach(function(card, idx, arr) { //添加下拉框候选
const opt = fragment.appendChild(document.createElement("option"));
opt.value = card.id;
opt.label = card.id + " - " + returnMonsterNameArr(card, currentLanguage.searchlist, currentDataSource.code).join(" | ");
/*const linkRes = new RegExp("link:(\\d+)", "ig").exec(m.specialAttribute);
if (linkRes) { //每个有链接的符卡,把它们被链接的符卡的进化根修改到链接前的
const toId = parseInt(linkRes[1], 10);
const _m = Cards[toId];
//if (_m.evoBaseId == 0)
// _m.evoRootId = m.evoRootId;
m.henshinTo = toId;
_m.henshinFrom = m.id;
}*/
/*if (card.evoRootId === card.id)
{
card.evoTree = arr.filter(c=>c.evoRootId === card.evoRootId);
}*/
});
monstersList.appendChild(fragment);
@@ -1126,7 +1173,7 @@ function loadData(force = false)
});
}
function dealSkillData()
function dealSkillData(_skills)
{
//显示数据更新时间
let controlBoxHook = setInterval(checkControlBox, 500); //循环检测controlBox
@@ -3211,6 +3258,14 @@ function initialize(event) {
monEditSAwokens[0].click();
} else {
monEditSAwokensRow.swaokenIndex = value;
const plusArr = [monEditAddHp,monEditAddAtk,monEditAddRcv];
//自动打上297
if (plusArr.some(ipt=>parseInt(ipt.value)<99))
{
console.debug("点亮超觉醒,自动设定297");
plusArr.forEach(ipt=>ipt.value=99);
reCalculateAbility();
}
}
}
monEditSAwokens.forEach(akDom => {
@@ -3466,8 +3521,8 @@ function initialize(event) {
mon.sawoken = mSAwokenChoIpt ? parseInt(mSAwokenChoIpt.value, 10) : -1;
}

if (card.types.some(t => { return t == 0 || t == 12 || t == 14 || t == 15; }) &&
(!card.overlay || mon.level >= card.maxLevel)) { //当4种特殊type的时候是无法297和打觉醒的,但是不能叠加的在未满级时可以
if (card.overlay || card.types.some(t=>[0,12,14,15].includes(t)) &&
mon.level >= card.maxLevel) { //当4种特殊type的时候是无法297和打觉醒的,但是不能叠加的在未满级时可以
mon.plus = [0, 0, 0];
} else {
mon.plus[0] = parseInt(monEditAddHp.value) || 0;
@@ -3625,44 +3680,50 @@ function initialize(event) {
}
}

//搜出一个卡片包含变身的的完整进化树
//搜出一个卡片包含变身的的完整进化树,用于平铺显示
function buildEvoTreeIdsArray(card, includeHenshin = true) {
const evoLinkCardsIdArray = card.evoRootId !== 0 ? Cards.filter(m=>m.evoRootId == card.evoRootId).map(m=>m.id) : []; //筛选出相同进化链的
const evoLinkCardsIdArray = card.evoRootId ? Cards.filter(m=>m.evoRootId == card.evoRootId).map(m=>m.id) : []; //筛选出相同进化链的
function loopAddHenshin(arr,card)
{
const tcard1 = Cards[card.henshinFrom] || null;
const tcard2 = Cards[card.henshinTo] || null;
const evoCards = Cards.filter(m=>m.evoRootId == card.evoRootId && !arr.includes(m.id)).map(m=>m.id);
if (tcard1 && !arr.includes(tcard1.id))
{
arr.push(tcard1.id);
loopAddHenshin(arr,tcard1);
//从本卡片变身到的
const cardIdTo = (card.henshinTo || []).filter(id=>Boolean(Cards[id]) && !arr.includes(id));
if (cardIdTo.length) {
arr.push(...cardIdTo);
for (let id of cardIdTo) {
loopAddHenshin(arr, Cards[id]);
}
}
if (tcard2 && !arr.includes(tcard2.id))
{
arr.push(tcard2.id);
loopAddHenshin(arr,tcard2);
//变身到本卡片的(多个)
const cardsIdFrom = (card.henshinFrom || []).filter(id=>Boolean(Cards[id]) && !arr.includes(id));
if (cardsIdFrom.length) {
arr.push(...cardsIdFrom);
for (let id of cardsIdFrom) {
loopAddHenshin(arr, Cards[id]);
}
}
//本角色进化树上的
const evoCards = Cards.filter(m=>m.evoRootId == card.evoRootId && !arr.includes(m.id));
if (evoCards.length > 0)
{
evoCards.forEach(mid=>{
arr.push(mid);
const m = Cards[mid];
if (m.henshinFrom || m.henshinTo)
{ //添加变身的
loopAddHenshin(arr,m);
for (let card of evoCards) {
arr.push(card.id);
if (includeHenshin && (Array.isArray(card.henshinFrom) || Array.isArray(card.henshinTo)))
{ //添加这个的变身的
loopAddHenshin(arr, card);
}
});
}
}
}
evoLinkCardsIdArray.forEach((mid,idx,arr)=>{
const m = Cards[mid];
if (includeHenshin && (m.henshinFrom || m.henshinTo))
{ //添加变身的
loopAddHenshin(arr,m);
if (includeHenshin) {
for (let id of evoLinkCardsIdArray) {
const card = Cards[id];
if (Array.isArray(card.henshinFrom) || Array.isArray(card.henshinTo))
{ //添加变身的
loopAddHenshin(evoLinkCardsIdArray, card);
}
}
});
evoLinkCardsIdArray.sort((a,b)=>a-b);
}
evoLinkCardsIdArray.sort((a,b)=>a-b); //按ID大小排序
return evoLinkCardsIdArray;
}

@@ -3738,8 +3799,13 @@ function changeid(mon, monDom, latentDom) {
}
}
const sawoken = monDom.querySelector(".super-awoken");
if (sawoken) { //如果存在超觉醒的DOM且提供了超觉醒
if (mon.sawoken != null && mon?.sawoken >= 0 && card.superAwakenings.length && mon.level >= 100 && mon.plus.every(p=>p>=99)) {
if (sawoken) { //如果存在超觉醒的DOM
if (mon.sawoken != null && //怪物设定了超觉醒
mon?.sawoken >= 0 && //怪物超觉醒编号大于0
card.superAwakenings.length && //卡片有超觉醒
mon.level >= 100 && //怪物大于100级
mon.plus.every(p=>p>=99) //怪物297了
) {
sawoken.classList.remove(className_displayNone);
const sawokenIcon = sawoken.querySelector(".awoken-icon");
sawokenIcon.setAttribute("data-awoken-icon", card.superAwakenings[mon.sawoken]);
@@ -4096,7 +4162,7 @@ function editBoxChangeMonId(id) {
skillDetailOriginal.innerHTML = "";
skillDetailOriginal.appendChild(parseSkillDescription(activeskill));

const t_maxLevel = card.overlay || card.types.includes(15) ? 1 : activeskill.maxLevel; //遇到不能升技的,最大等级强制为1
const t_maxLevel = card.overlay ? 1 : activeskill.maxLevel; //遇到不能升技的,最大等级强制为1
skillLevel.max = t_maxLevel;
skillLevel.value = t_maxLevel;
skillLevel_Max.value = t_maxLevel;
@@ -4122,7 +4188,8 @@ function editBoxChangeMonId(id) {
rowSkill.appendChild(frg1);
rowLederSkill.appendChild(frg2);

if (card.overlay || card.types[0] == 15 && card.types[1] == -1) { //当可以叠加时,不能打297和潜觉
if (card.overlay || card.types.some(t=>[0,12,14,15].includes(t)) &&
card.maxLevel <= 1) { //当可以叠加时,不能打297和潜觉
rowPlus.classList.add("disabled");
rowPlus.querySelector(".m-plus-hp").value = 0;
rowPlus.querySelector(".m-plus-atk").value = 0;
@@ -4258,8 +4325,9 @@ function refreshAll(formationData) {
const latent = latentLi.querySelector(`.latent-ul`);
changeid(teamData[0][ti], member, latent); //队员
changeid(teamData[1][ti], assist); //辅助
//如果换队长技能
if (leaderIdx == 0 && (ti == 0 || ti == 5))
//隐藏队长的自身换为换队长的技能
if (ti == 5 || //好友队长永远隐藏
leaderIdx == 0 && ti == 0 ) //当没换队长时,自身队长的欢队长技能隐藏
{
const card_m = Cards[teamData[0][ti].id] || Cards[0];
const card_a = Cards[teamData[1][ti].id] || Cards[0];
@@ -4411,7 +4479,15 @@ function refreshMenberAwoken(menberAwokenDom, assistAwokenDom, team, idx) {
//队员觉醒
let menberAwokens = memberCard.awakenings.slice(0,memberData.awoken);
//单人和三人为队员增加超觉醒
if ((solo || teamsCount === 3) && memberData.sawoken >= 0) menberAwokens.push(memberCard.superAwakenings[memberData.sawoken]);
if ((solo || teamsCount === 3) &&
memberData.sawoken != null && //怪物设定了超觉醒
memberData.sawoken >= 0 && //怪物超觉醒编号大于0
memberCard.superAwakenings.length >= 0 && //卡片有超觉醒
memberData.level >= 100 && //怪物大于100级
memberData.plus.every(p=>p>=99) //怪物297了
) {
menberAwokens.push(memberCard.superAwakenings[memberData.sawoken]);
}
//menberAwokens.sort();
//武器觉醒
let assistAwokens = assistCard.awakenings.slice(0,assistData.awoken);


+ 2
- 2
solo.html View File

@@ -629,8 +629,8 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="11" data-max-count="5"></button><!--防暗--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="12" data-max-count="5"></button><!--防废--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="13" data-max-count="5"></button><!--防毒--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="54" data-max-count="1"></button><!--防云--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="55" data-max-count="1"></button><!--防封条--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="54" data-max-count="2"></button><!--防云--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="55" data-max-count="2"></button><!--防封条--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="45" data-max-count="1"></button><!--心追--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="50"></button><!--方块心追--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="19"></button><!--手指--></li>


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


+ 6
- 0
style.css View File

@@ -3437,12 +3437,18 @@ table .orb-icon
{ /*變身*/
background-image: linear-gradient(#00FFFF 30%, #FF00FF);
}
.evo-panel.random-henshin .evo-type::after
{ /*随机變身*/
background-image: linear-gradient(#00FFFF 30%, #FFF 60%, #FF00FF);
}
.evo-panel.henshin,
.evo-panel.random-henshin,
.evo-panel.henshin-loop
{
background-image: linear-gradient(#BFFFCF,#FFFFBF,#FFBFBF);
}
.evo-panel.henshin .evo-panel-right,
.evo-panel.random-henshin .evo-panel-right,
.evo-panel.henshin-loop .evo-panel-right
{
border-color: #7F00FF;


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save