Merge branch 'master' into service-worker

This commit is contained in:
枫谷剑仙 2022-06-21 19:33:05 +08:00
commit 0ddd9d7492
167 changed files with 1741 additions and 1125 deletions

View File

@ -1,14 +1,13 @@
let needUpdateBrowser = (()=>{
try {
return !Boolean(eval("undefined?.undefined ?? true"));
return !Boolean(eval("1n && (undefined?.undefined ?? true)"));
} catch (e) {
if (e.name !== 'SyntaxError') throw e // Throw the error if it is not a SyntaxError
return true;
}
})();
if (needUpdateBrowser)
{
if (needUpdateBrowser) {
let browserVersion = ((UA)=>{
let regRes;
if (regRes = /\b(Firefox|Chrome)\/([\d\.]+)/ig.exec(UA)) {
@ -27,20 +26,55 @@ if (needUpdateBrowser)
您的浏览器版本为:
${browserVersion}
您的浏览器内核不支持本程序使用的 可选链操作符(?.) 空值合并操作符(??)
您的浏览器内核不支持本程序使用的 可选链操作符(?.) 空值合并操作符(??) BigInt 数据类型
请更新您的浏览器内核到 Firefox(火狐) 74 Chrome(谷歌) 80 iOS Safari 13.4`;
请更新您的浏览器内核到 Firefox(火狐) 74 Chrome(谷歌) 80 Safari 14`;
} else {
alertStr =
`🙁Browser kernel is too old
Your browser is:
${browserVersion}
Your browser core 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 (??) or BigInt value used in this program.
Please update your browser core to Firefox 74 or Chrome 80 or iOS Safari 13.4`;
Please update your browser core to Firefox 74 or Chrome 80 or Safari 14`;
}
alert(alertStr);
document.write(alertStr.replace(/\n/g,'<br />'));
}
let denied = ((UA)=>{
return /\b(?:MicroMessenger|WeChat|Weixin|QQ|AliApp)\b/.test(UA);
})(navigator.userAgent);
if (denied) {
const mask = document.createElement("div");
mask.id = "denied-mask";
const css = `
#denied-mask {
position: fixed;
height: 100%;
width: 100%;
top: 0;
left: 0;
background-color: #000A;
}
.alert {
font-size: 2em;
font-weight: bold;
color: white;
text-align: center;
}
`;
const style = mask.appendChild(document.createElement("style"));
style.appendChild(document.createTextNode(css));
const alertDiv = mask.appendChild(document.createElement("div"));
alertDiv.className = "alert"
alertDiv.appendChild(document.createTextNode("请勿使用内置浏览"));
alertDiv.appendChild(document.createElement("br"));
alertDiv.appendChild(document.createTextNode("点击菜单使用正常浏览器打开↗"));
window.addEventListener("load", ()=>{
document.body.appendChild(mask);
});
}

View File

@ -82,8 +82,8 @@
</ol>
<h2 id="editing-tips">编辑技巧 | Editing tips</h2>
<ul>
<li>使用<strong>后退</strong>即可撤销上一次修改,需要重做则使用前进。<br>
Use <strong>Back</strong> to undo the last edit, redo with Forward.<br>
<li>使用<strong>后退</strong><code>Alt + ←</code>即可撤销上一次修改,需要重做则使用<strong>前进</strong><code>Alt + →</code><br>
Use <strong>Back</strong><code>Alt + ←</code> to undo the last edit, redo with <strong>Forward</strong><code>Alt + →</code>.<br>
<img src="images/tips-undo.png" alt="撤銷修改">
</li>
<li><strong>拖拽</strong>卡片头像即可快速交换位置,也支持手机触屏。<br>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 576 KiB

After

Width:  |  Height:  |  Size: 824 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 873 KiB

After

Width:  |  Height:  |  Size: 921 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 931 KiB

After

Width:  |  Height:  |  Size: 970 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 481 KiB

After

Width:  |  Height:  |  Size: 682 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 741 KiB

After

Width:  |  Height:  |  Size: 741 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 806 KiB

After

Width:  |  Height:  |  Size: 1012 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 525 KiB

After

Width:  |  Height:  |  Size: 886 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 595 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 881 KiB

After

Width:  |  Height:  |  Size: 882 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 872 KiB

After

Width:  |  Height:  |  Size: 872 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 878 KiB

After

Width:  |  Height:  |  Size: 925 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 820 KiB

After

Width:  |  Height:  |  Size: 820 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 806 KiB

After

Width:  |  Height:  |  Size: 1012 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 744 KiB

After

Width:  |  Height:  |  Size: 821 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 KiB

After

Width:  |  Height:  |  Size: 829 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 576 KiB

After

Width:  |  Height:  |  Size: 824 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 873 KiB

After

Width:  |  Height:  |  Size: 921 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 931 KiB

After

Width:  |  Height:  |  Size: 964 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 820 KiB

After

Width:  |  Height:  |  Size: 820 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 806 KiB

After

Width:  |  Height:  |  Size: 1012 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 525 KiB

After

Width:  |  Height:  |  Size: 886 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 595 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 399 KiB

After

Width:  |  Height:  |  Size: 456 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 284 KiB

After

Width:  |  Height:  |  Size: 291 KiB

View File

@ -283,6 +283,10 @@ label[for="merge-skill"]::after{
.control-box .change-swap-to-copy-lbl::after{
content:"\"Copy\" when dragging";
}
label[for="default-level"]::after
{
content: "Default Lv.";
}
.tIf-total-move .general::after,
.tIf-total-move .awoken-bind::after
@ -421,6 +425,12 @@ label[for="box-have"]::after
.special-div .special-add::before {
content: "";
}
.special-div .special-star::before {
content: "☆";
}
.special-div .special-star.marked::before {
content: "★";
}
.control-div .search-start::before{
content: "🔍Start Search";
}

View File

@ -276,6 +276,10 @@ label[for="merge-skill"]::after{
.control-box .change-swap-to-copy-lbl::after{
content:"ドラッグ時にコピー";
}
label[for="default-level"]::after
{
content: "デフォルト Lv.";
}
.tIf-total-move .general::after,
.tIf-total-move .awoken-bind::after
@ -414,6 +418,12 @@ label[for="box-have"]::after
.special-div .special-add::before {
content: "";
}
.special-div .special-star::before {
content: "☆";
}
.special-div .special-star.marked::before {
content: "★";
}
.control-div .search-start::before{
content: "🔍検索の開始";
}

View File

@ -273,6 +273,10 @@ label[for="merge-skill"]::after{
.control-box .change-swap-to-copy-lbl::after{
content:"끌 때 복사";
}
label[for="default-level"]::after
{
content: "기본 Lv.";
}
.tIf-total-move .general::after,
.tIf-total-move .awoken-bind::after
@ -411,6 +415,12 @@ label[for="box-have"]::after
.special-div .special-add::before {
content: "";
}
.special-div .special-star::before {
content: "☆";
}
.special-div .special-star.marked::before {
content: "★";
}
.control-div .search-start::before{
content: "🔍검색 시작";
}

View File

@ -280,6 +280,10 @@ label[for="merge-skill"]::after{
.control-box .change-swap-to-copy-lbl::after{
content:"拖拽時使用“複製”";
}
label[for="default-level"]::after
{
content: "默認等級:";
}
.tIf-total-move .general::after,
.tIf-total-move .awoken-bind::after
@ -418,6 +422,12 @@ label[for="box-have"]::after
.special-div .special-add::before {
content: "";
}
.special-div .special-star::before {
content: "☆";
}
.special-div .special-star.marked::before {
content: "★";
}
.control-div .search-start::before{
content: "🔍開始搜索";
}

View File

@ -90,6 +90,7 @@
henshin: tp`變身為${'card'}`,
void_poison: tp`消除${'poison'}時不會受到毒傷害`,
skill_proviso: tp`${'condition'}才能發動後續效果`,
impart_awoken: tp`賦予${'attrs_types'}額外的${'awakenings'}`,
obstruct_opponent: tp`${'target'}施加敵對技能效果:${'skills'}`,
obstruct_opponent_after_me: tp`排名比自身低的對手`,
obstruct_opponent_before_me: tp`排名比自身高的對手`,
@ -167,6 +168,7 @@
enemy_all: tp`敵方全體`,
enemy_one: tp`敵方1體`,
enemy_attr: tp`${'attr'}敵人`,
the_attr: tp`該組寶珠屬性`,
},
stats: {
unknown: tp`[ 未知狀態: ${'type'}]`, //type
@ -332,6 +334,19 @@
[80]: tp`${'icon'}4色`,
[81]: tp`${'icon'}5色`,
[82]: tp`${'icon'}12珠`,
[83]: tp`${'icon'}附加神類型`,
[84]: tp`${'icon'}附加龍類型`,
[85]: tp`${'icon'}附加惡魔類型`,
[86]: tp`${'icon'}附加機械類型`,
[87]: tp`${'icon'}附加平衡類型`,
[88]: tp`${'icon'}附加攻擊類型`,
[89]: tp`${'icon'}附加體力類型`,
[90]: tp`${'icon'}附加回復類型`,
[91]: tp`${'icon'}附加火屬性`,
[92]: tp`${'icon'}附加水屬性`,
[93]: tp`${'icon'}附加木屬性`,
[94]: tp`${'icon'}附加光屬性`,
[95]: tp`${'icon'}附加暗屬性`,
}
},
};

View File

@ -278,6 +278,10 @@ label[for="merge-skill"]::after{
.control-box .change-swap-to-copy-lbl::after{
content:"拖拽时使用“复制”";
}
label[for="default-level"]::after
{
content: "默认等级:";
}
.tIf-total-move .general::after,
.tIf-total-move .awoken-bind::after
@ -416,6 +420,12 @@ label[for="box-have"]::after
.special-div .special-add::before {
content: "";
}
.special-div .special-star::before {
content: "☆";
}
.special-div .special-star.marked::before {
content: "★";
}
.control-div .search-start::before{
content: "🔍开始搜索";
}

View File

@ -91,6 +91,7 @@
random_henshin: tp`随机变身为${'cards'}`,
void_poison: tp`消除${'poison'}时不会受到毒伤害`,
skill_proviso: tp`${'condition'}才能发动后续效果`,
impart_awoken: tp`赋予${'attrs_types'}额外的${'awakenings'}`,
obstruct_opponent: tp`${'target'}施加敌对技能效果:${'skills'}`,
obstruct_opponent_after_me: tp`排名比自身低的对手`,
obstruct_opponent_before_me: tp`排名比自身高的对手`,
@ -170,6 +171,7 @@
enemy_all: tp`敌方全体`,
enemy_one: tp`敌方1体`,
enemy_attr: tp`${'attr'}敌人`,
the_attr: tp`该组宝珠属性`,
},
stats: {
unknown: tp`[ 未知状态: ${'type'}]`, //type
@ -335,6 +337,19 @@
[80]: tp`${'icon'}4色`,
[81]: tp`${'icon'}5色`,
[82]: tp`${'icon'}12珠`,
[83]: tp`${'icon'}附加龙类型`,
[84]: tp`${'icon'}附加神类型`,
[85]: tp`${'icon'}附加恶魔类型`,
[86]: tp`${'icon'}附加机械类型`,
[87]: tp`${'icon'}附加平衡类型`,
[88]: tp`${'icon'}附加攻击类型`,
[89]: tp`${'icon'}附加体力类型`,
[90]: tp`${'icon'}附加回复类型`,
[91]: tp`${'icon'}附加火属性`,
[92]: tp`${'icon'}附加水属性`,
[93]: tp`${'icon'}附加木属性`,
[94]: tp`${'icon'}附加光属性`,
[95]: tp`${'icon'}附加暗属性`,
}
},
};

View File

@ -24,9 +24,9 @@ If your simulator needs Android 7 to play PAD. Take the [Nox Player](https://www
1. 将 Fidder 根证书导出到桌面
Export the Fidder Root Certificate to desktop
1. 在电脑上找一个 **openssl.exe** 程序,或者下载安装 [Win32OpenSSL](http://slproweb.com/products/Win32OpenSSL.html)
1. 在电脑上找一个 **openssl.exe** 程序,或者下载安装 [Win32OpenSSL](http://slproweb.com/products/Win32OpenSSL.html)
Find an **openssl.exe** program on computer, or install [Win32OpenSSL](http://slproweb.com/products/Win32OpenSSL.html)
1. 执行代码获取证书的hash
1. 执行代码获取证书的hash
Execute the code to get the hash of the certificate
`openssl x509 -inform PEM -subject_hash_old -noout -in FiddlerRoot.cer`
1. 执行代码,将证书由 *CER* 转换为 *PEM* 格式

View File

@ -1 +1 @@
[{"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}]
[{"code":"ja","ckey":{"card":"a2e41c3c566eb0649199102d3b307182","skill":"3b124788c18bb26dbf37752021774cde"},"updateTime":1655710195153},{"code":"en","ckey":{"card":"59eb92f688d04fd1a238339fb70b0162","skill":"fa3a9fdb35a0a67e8e0405ab45aa842e"},"updateTime":1655467366519},{"code":"ko","ckey":{"card":"29625b6520ecd9ee393ff00e607f0801","skill":"57f1a15fd61faefe642ab7faa63ec602"},"updateTime":1655467366519}]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -29,10 +29,10 @@ function sameCard(m1,m2)
if (m1 == undefined || m2 == undefined) return false; //是否存在
if (m1.attrs[0] != m2.attrs[0]) return false; //主属性
if (m1.attrs[1] != m2.attrs[1]) return false; //副属性
if (m1.types.length != m2.types.length) return false; //类型长度
if (m1.types.some(function(t1,ti){
return m2.types[ti] == undefined || m2.types[ti] != t1;
})) return false; //全部类型有任意不同的时候也返回false
//全部类型有任意不同的时候也返回false但是考虑到上修不要求总数一致
for (let i = 0; i < Math.min(m1.types.length, m2.types.length); i++) {
if (m1.types[i] != m2.types[i]) return false;
}
if (m1.maxLevel != m2.maxLevel) return false; //最大等级
if (m1.collabId != m2.collabId) return false; //合作ID
return true;
@ -99,6 +99,20 @@ officialAPI.forEach(function(lang) {
delete card.searchFlags;
monCards.push(card);
}
/*
//测试附加属性与类型的武器用
for (let i = 83; i <= 95; i++)
{
let testCard = new Card(oCards[0]);
testCard.id = monCards.length;
testCard.canAssist = true;
if (i >= 83 && i<= 90) testCard.attrs[0] = 6;
if (i >= 91) testCard.attrs = [i - 91, i - 91];
testCard.name = "v20.0 new awoken debug test ID." + i;
testCard.awakenings.push(49, i);
monCards.push(testCard);
}
*/
//加入自定义的语言
lang.customName.forEach(function(lcode){

View File

@ -3,6 +3,8 @@ const path = require('path');
const OpenCC = require('opencc-js');
const converter = OpenCC.Converter({ from: 'hk', to: 'cn' });
const tsConverter = OpenCC.CustomConverter([
['点阵图', '像素画'],
['魔物猎人', '怪物猎人'],
['铁甲奇侠', '钢铁侠'],
['变形侠医', '绿巨人'],
['毒魔', '毒液'],

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -56,19 +56,26 @@ var formation = new Formation(teamsCount,5);
<label class="languages-label"><select class="languages"></select></label>
<label class="datasource-label"><select class="datasource"></select></label>
<button onclick="loadData(true);" class="datasource-updatetime" title="强制刷新数据"></button>
<a class="help-link" target="_blank" href="doc/index.html"></a>
</div>
<div>
<button class="btn-clear-data" onclick="clearData();"></button>
<button class="btn-player-data"></button>
<button class="btn-solo-link" onclick="turnPage(1,arguments[0]);"></button><button class="btn-multi-link" disabled></button><button class="btn-triple-link" onclick="turnPage(3,arguments[0]);"></button>
<button class="btn-swap-AB-team" onclick="swapABCteam();"></button>
<button class="btn-set-dungeon-enchance"></button>
</div>
<div>
<a class="down-capture display-none" target="_blank"></a>
<button class="btn-qrcode"></button>
<button class="btn-capture" onclick="capture();"></button>
<a class="down-capture display-none" target="_blank"></a>
<button class="btn-player-data"></button>
<a class="help-link" target="_blank" href="doc/index.html"></a>
<button class="btn-set-dungeon-enchance"></button>
<label for="default-level"></label><input id="default-level" type="number" min="1" max="120" list="level-list" placeholder="110"/>
<datalist id="level-list">
<option>1</option>
<option>99</option>
<option>110</option>
<option>120</option>
</datalist>
</div>
<div>
<input type="checkbox" class="config-checkbox-ipt" name="show-mon-id" id="show-mon-id"><label class="config-checkbox-lbl show-mon-id-lbl" for="show-mon-id"><div class="config-checkbox-lbl-cicle"></div></label>
@ -118,8 +125,8 @@ var formation = new Formation(teamsCount,5);
--><li><icon class="attr" data-attr-icon="4"><!----></icon></li>
</ul>
<ul class="tIf-types">
<li><icon class="type-icon" data-type-icon="4"><!----></icon></li><!--
--><li><icon class="type-icon" data-type-icon="5"><!----></icon></li><!--
<li><icon class="type-icon" data-type-icon="5"><!----></icon></li><!--
--><li><icon class="type-icon" data-type-icon="4"><!----></icon></li><!--
--><li><icon class="type-icon" data-type-icon="7"><!--惡魔--></icon></li><!--
--><li><icon class="type-icon" data-type-icon="8"><!--机械--></icon></li><!--
--><li><icon class="type-icon" data-type-icon="1"><!--平衡--></icon></li><!--
@ -710,8 +717,8 @@ var formation = new Formation(teamsCount,5);
</div>
<div class="types-div"><!--类型-->
<ul class="type-list">
<li data-type-icon="4"><input type="checkbox" class="type-check" name="types" value="4" id="search-type-4" /><label class="type-icon" data-type-icon="4" for="search-type-4"><!----></label></li>
<li data-type-icon="5"><input type="checkbox" class="type-check" name="types" value="5" id="search-type-5" /><label class="type-icon" data-type-icon="5" for="search-type-5"><!----></label></li>
<li data-type-icon="4"><input type="checkbox" class="type-check" name="types" value="4" id="search-type-4" /><label class="type-icon" data-type-icon="4" for="search-type-4"><!----></label></li>
<li data-type-icon="7"><input type="checkbox" class="type-check" name="types" value="7" id="search-type-7" /><label class="type-icon" data-type-icon="7" for="search-type-7"><!--惡魔--></label></li>
<li data-type-icon="8"><input type="checkbox" class="type-check" name="types" value="8" id="search-type-8" /><label class="type-icon" data-type-icon="8" for="search-type-8"><!--机械--></label></li>
<li data-type-icon="1"><input type="checkbox" class="type-check" name="types" value="1" id="search-type-1" /><label class="type-icon" data-type-icon="1" for="search-type-1"><!--平衡--></label></li>
@ -843,6 +850,19 @@ var formation = new Formation(teamsCount,5);
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="80"></button><!--4色--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="81"></button><!--5色--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="82"></button><!--12珠--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="83" data-max-count="1"></button><!--附加神类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="84" data-max-count="1"></button><!--附加龙类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="85" data-max-count="1"></button><!--附加恶魔类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="86" data-max-count="1"></button><!--附加机械类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="87" data-max-count="1"></button><!--附加平衡类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="88" data-max-count="1"></button><!--附加攻击类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="89" data-max-count="1"></button><!--附加体力类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="90" data-max-count="1"></button><!--附加回复类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="91" data-max-count="1"></button><!--附加火属性--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="92" data-max-count="1"></button><!--附加水属性--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="93" data-max-count="1"></button><!--附加木属性--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="94" data-max-count="1"></button><!--附加光属性--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="95" data-max-count="1"></button><!--附加暗属性--></li>
</ul>
</div>
<div class="sawoken-div"><!--超觉醒-->
@ -865,9 +885,9 @@ var formation = new Formation(teamsCount,5);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="45" id="search-awoken-45" /><label class="awoken-icon" data-awoken-icon="45" for="search-awoken-45"></label><!--心追--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="50" id="search-awoken-50" /><label class="awoken-icon" data-awoken-icon="50" for="search-awoken-50"></label><!--方块心追--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="19" id="search-awoken-19" /><label class="awoken-icon" data-awoken-icon="19" for="search-awoken-19"></label><!--手指--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="1" id="search-awoken-1" /><label class="awoken-icon" data-awoken-icon="1" for="search-awoken-1"></label><!--HP+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="2" id="search-awoken-2" /><label class="awoken-icon" data-awoken-icon="2" for="search-awoken-2"></label><!--攻击+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="3" id="search-awoken-3" /><label class="awoken-icon" data-awoken-icon="3" for="search-awoken-3"></label><!--回复+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="1" id="search-awoken-1" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="1" for="search-awoken-1"></label><!--HP+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="2" id="search-awoken-2" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="2" for="search-awoken-2"></label><!--攻击+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="3" id="search-awoken-3" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="3" for="search-awoken-3"></label><!--回复+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="4" id="search-awoken-4" /><label class="awoken-icon" data-awoken-icon="4" for="search-awoken-4"></label><!--火盾--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="5" id="search-awoken-5" /><label class="awoken-icon" data-awoken-icon="5" for="search-awoken-5"></label><!--水盾--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="6" id="search-awoken-6" /><label class="awoken-icon" data-awoken-icon="6" for="search-awoken-6"></label><!--木盾--></li>
@ -891,7 +911,7 @@ var formation = new Formation(teamsCount,5);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="26" id="search-awoken-26" /><label class="awoken-icon" data-awoken-icon="26" for="search-awoken-26"></label><!--暗横--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="20" id="search-awoken-20" /><label class="awoken-icon" data-awoken-icon="20" for="search-awoken-20"></label><!--心解--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="28" id="search-awoken-28" /><label class="awoken-icon" data-awoken-icon="28" for="search-awoken-28"></label><!--SX--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="30" id="search-awoken-30" /><label class="awoken-icon" data-awoken-icon="30" for="search-awoken-30"></label><!--协力--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="30" id="search-awoken-30" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="30" for="search-awoken-30"></label><!--协力--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="31" id="search-awoken-31" /><label class="awoken-icon" data-awoken-icon="31" for="search-awoken-31"></label><!--龙杀--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="32" id="search-awoken-32" /><label class="awoken-icon" data-awoken-icon="32" for="search-awoken-32"></label><!--神杀--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="33" id="search-awoken-33" /><label class="awoken-icon" data-awoken-icon="33" for="search-awoken-33"></label><!--恶魔杀--></li>
@ -907,17 +927,17 @@ var formation = new Formation(teamsCount,5);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="44" id="search-awoken-44" /><label class="awoken-icon" data-awoken-icon="44" for="search-awoken-44"></label><!--5色破防--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="46" id="search-awoken-46" /><label class="awoken-icon" data-awoken-icon="46" for="search-awoken-46"></label><!--全体HP--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="47" id="search-awoken-47" /><label class="awoken-icon" data-awoken-icon="47" for="search-awoken-47"></label><!--全体回复--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="49" id="search-awoken-49" /><label class="awoken-icon" data-awoken-icon="49" for="search-awoken-49"></label><!--武器觉醒--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="49" id="search-awoken-49" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="49" for="search-awoken-49"></label><!--武器觉醒--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="51" id="search-awoken-51" /><label class="awoken-icon" data-awoken-icon="51" for="search-awoken-51"></label><!--5色溜--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="53" id="search-awoken-53" /><label class="awoken-icon" data-awoken-icon="53" for="search-awoken-53"></label><!--大手指--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="56" id="search-awoken-56" /><label class="awoken-icon" data-awoken-icon="56" for="search-awoken-56"></label><!--大SB--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="59" id="search-awoken-59" /><label class="awoken-icon" data-awoken-icon="59" for="search-awoken-59"></label><!--L盾--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="62" id="search-awoken-62" /><label class="awoken-icon" data-awoken-icon="62" for="search-awoken-62"></label><!--c珠--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="63" id="search-awoken-63" /><label class="awoken-icon" data-awoken-icon="63" for="search-awoken-63"></label><!--语音--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="63" id="search-awoken-63" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="63" for="search-awoken-63"></label><!--语音--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="64" id="search-awoken-64" /><label class="awoken-icon" data-awoken-icon="64" for="search-awoken-64"></label><!--奖励增加--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="65" id="search-awoken-65" /><label class="awoken-icon" data-awoken-icon="65" for="search-awoken-65"></label><!--HP- --></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="66" id="search-awoken-66" /><label class="awoken-icon" data-awoken-icon="66" for="search-awoken-66"></label><!--攻击- --></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="67" id="search-awoken-67" /><label class="awoken-icon" data-awoken-icon="67" for="search-awoken-67"></label><!--回复- --></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="65" id="search-awoken-65" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="65" for="search-awoken-65"></label><!--HP- --></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="66" id="search-awoken-66" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="66" for="search-awoken-66"></label><!--攻击- --></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="67" id="search-awoken-67" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="67" for="search-awoken-67"></label><!--回复- --></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="71" id="search-awoken-71" /><label class="awoken-icon" data-awoken-icon="71" for="search-awoken-71"></label><!--掉废--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="72" id="search-awoken-72" /><label class="awoken-icon" data-awoken-icon="72" for="search-awoken-72"></label><!--掉毒--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="73" id="search-awoken-73" /><label class="awoken-icon" data-awoken-icon="73" for="search-awoken-73"></label><!--2串火--></li>
@ -930,11 +950,25 @@ var formation = new Formation(teamsCount,5);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="80" id="search-awoken-80" /><label class="awoken-icon" data-awoken-icon="80" for="search-awoken-80"></label><!--4色--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="81" id="search-awoken-81" /><label class="awoken-icon" data-awoken-icon="81" for="search-awoken-81"></label><!--5色--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="82" id="search-awoken-82" /><label class="awoken-icon" data-awoken-icon="82" for="search-awoken-82"></label><!--12珠--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="83" id="search-awoken-83" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="83" for="search-awoken-83"></label><!--附加神类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="84" id="search-awoken-84" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="84" for="search-awoken-84"></label><!--附加龙类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="85" id="search-awoken-85" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="85" for="search-awoken-85"></label><!--附加恶魔类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="86" id="search-awoken-86" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="86" for="search-awoken-86"></label><!--附加机械类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="87" id="search-awoken-87" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="87" for="search-awoken-87"></label><!--附加平衡类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="88" id="search-awoken-88" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="88" for="search-awoken-88"></label><!--附加攻击类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="89" id="search-awoken-89" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="89" for="search-awoken-89"></label><!--附加体力类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="90" id="search-awoken-90" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="90" for="search-awoken-90"></label><!--附加回复类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="91" id="search-awoken-91" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="91" for="search-awoken-91"></label><!--附加火属性--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="92" id="search-awoken-92" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="92" for="search-awoken-92"></label><!--附加水属性--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="93" id="search-awoken-93" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="93" for="search-awoken-93"></label><!--附加木属性--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="94" id="search-awoken-94" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="94" for="search-awoken-94"></label><!--附加光属性--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="95" id="search-awoken-95" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="95" for="search-awoken-95"></label><!--附加暗属性--></li>
</ul>
</div>
<div class="special-div">
<button class="special-add brown-button"></button>
<button class="special-clear brown-button"></button>
<button class="special-star brown-button"></button>
<ul class="special-filter-list">
<li><select class="special-filter"></select></li>
</ul>
@ -1126,6 +1160,7 @@ var formation = new Formation(teamsCount,5);
<li class="latent-icon" data-latent-icon="40"></li><!--心横解转转-->
<li class="latent-icon" data-latent-icon="41"></li><!--U解禁消-->
<li class="latent-icon" data-latent-icon="42"></li><!--伤害上限解除-->
<li class="latent-icon" data-latent-icon="46"></li><!--心追解云封-->
</ul>
</div>
<div class="setting-row row-mon-skill">
@ -1173,7 +1208,7 @@ var formation = new Formation(teamsCount,5);
</div>
<template id="template-card-a">
<a class="monster" target="_blank" data-cardid="" data-cards-pic-idx="" data-cards-pic-x="" data-cards-pic-y="" title=""><div class="property" data-property=""></div><div class="subproperty" data-property=""></div><div class="id"></div><div class="awoken-count-num"></div><div class="count-in-box"><span class="same-id"></span><span class="evo-tree"></span></div></a>
<a class="monster" target="_blank" data-cardid="" data-cards-pic-idx="" data-cards-pic-x="" data-cards-pic-y="" title=""><div class="property" data-property=""></div><div class="subproperty" data-property=""></div><div class="id"></div><div class="awoken-count-num"></div><div class="rarity"></div><div class="count-in-box"><span class="same-id"></span><span class="evo-tree"></span></div></a>
</template>
</div>
<svg id="interchange-line" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" height="100%" width="100%" style="display:none;">
@ -1235,8 +1270,8 @@ var formation = new Formation(teamsCount,5);
<li><input type="checkbox" class="attr-check" name="dungeon-attrs" value="4" id="dungeon-attr-4" /><label class="attr" data-attr-icon="4" for="dungeon-attr-4"></label></li><!---->
</ul>
<ul class="type-list">
<li><input type="checkbox" class="type-check" name="dungeon-types" value="4" id="dungeon-type-4" /><label class="type-icon" data-type-icon="4" for="dungeon-type-4"><!----></label></li>
<li><input type="checkbox" class="type-check" name="dungeon-types" value="5" id="dungeon-type-5" /><label class="type-icon" data-type-icon="5" for="dungeon-type-5"><!----></label></li>
<li><input type="checkbox" class="type-check" name="dungeon-types" value="4" id="dungeon-type-4" /><label class="type-icon" data-type-icon="4" for="dungeon-type-4"><!----></label></li>
<li><input type="checkbox" class="type-check" name="dungeon-types" value="7" id="dungeon-type-7" /><label class="type-icon" data-type-icon="7" for="dungeon-type-7"><!--惡魔--></label></li>
<li><input type="checkbox" class="type-check" name="dungeon-types" value="8" id="dungeon-type-8" /><label class="type-icon" data-type-icon="8" for="dungeon-type-8"><!--机械--></label></li>
<li><input type="checkbox" class="type-check" name="dungeon-types" value="1" id="dungeon-type-1" /><label class="type-icon" data-type-icon="1" for="dungeon-type-1"><!--平衡--></label></li>

File diff suppressed because it is too large Load Diff

View File

@ -371,7 +371,9 @@ const SkillKinds = {
Henshin: "henshin",
VoidPoison: "void-poison",
SkillProviso: "skill-proviso",
ImpartAwakenings: "impart-awakenings",
ObstructOpponent: "obstruct-opponent",
}
function skillParser(skillId)
@ -916,6 +918,9 @@ function henshin(id, random = false) {
}
function voidPoison() { return { kind: SkillKinds.VoidPoison }; }
function skillProviso(cond) { return { kind: SkillKinds.SkillProviso, cond: cond }; }
function impartAwakenings(attrs, types, awakenings) {
return { kind: SkillKinds.ImpartAwakenings, attrs: attrs, types: types, awakenings: awakenings };
}
function obstructOpponent(type, pos, ids) {
return { kind: SkillKinds.ObstructOpponent, type: type, pos: pos, enemy_skills: ids };
}
@ -992,7 +997,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, max) { return powerUp(null, null, p.scaleAttrs(flags(attrs), min, max || min, [base, 100], [bonus, 0])); },
[61](attrs, min, base, bonus, max) { return powerUp(null, null, p.scaleAttrs(flags(attrs), min, min + (max || 0), [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 })); },
@ -1154,7 +1159,7 @@ const parsers = {
[148](percent) { return rateMultiply(v.percent(percent), 'exp'); },
[149](mul) { return powerUp(null, null, p.mul({ rcv: mul }), c.exact('match-length', 4, [Attributes.Heart])); },
[150](_, mul) { return powerUp(null, null, p.mul({ atk: mul }), c.exact('match-length', 5, 'enhanced')); },
[150](_, mul) { return powerUp({targets: ['the-attr']}, null, p.mul({ atk: mul }), c.exact('match-length', 5, 'enhanced')); },
[151](mul1, mul2, percent) {
return powerUp(null, null, p.scaleCross([{ single: true, attr: [Attributes.Heart], atk: mul1 || 100, rcv: mul2 || 100 }]), null, v.percent(percent));
},
@ -1215,7 +1220,12 @@ const parsers = {
);
},
[169](min, base, percent, bonus, max) { return powerUp(null, null, p.scaleCombos(min, max ?? min, [base || 100, 100], [bonus, 0]), null, v.percent(percent)); },
[170](attrs, min, base, percent, bonus, stage) { return powerUp(null, null, p.scaleAttrs(flags(attrs), min, min + (stage ? stage - 1 : 0), [base, 100], [bonus ?? 0, 0]), null, v.percent(percent)); },
//stage的真实用法目前不知道缺少样本来判断不知道到底是直接算数(stage-1)还是算二进制个数(flags(stage).length)。 2022年5月23日
//按 瘦鹅 的说法也可能是因为暗牛头限制了5色 所以就算是3级到了6色也只算5色。
[170](attrs, min, base, percent, bonus, stage) {
let attrsArr = flags(attrs);
return powerUp(null, null, p.scaleAttrs(attrsArr, min, Math.min(min + (stage || 0), attrsArr.length), [base, 100], [bonus ?? 0, 0]), null, v.percent(percent));
},
[171](attrs1, attrs2, attrs3, attrs4, min, mul, percent, bonus) {
const attrs = [attrs1, attrs2, attrs3, attrs4].filter(Boolean);
return powerUp(null, null, p.scaleMatchAttrs(attrs.flatMap(flags), min, bonus ? attrs.length : min, [mul, 100], [bonus ?? 0, 0]), null, v.percent(percent));
@ -1369,6 +1379,9 @@ const parsers = {
[210](attrs, reduce, combo) {
return powerUp(null, null, p.scaleCross([{ single: false, attr: flags(attrs), atk: 100, rcv: 100}]), null, v.percent(reduce), combo ? [addCombo(combo)] : null);
},
[213](attrs, types, ...awakenings) { //赋予觉醒的队长技
return impartAwakenings(flags(attrs), flags(types), awakenings);
},
[214](turns) { return activeTurns(turns, bindSkill()); },
[215](turns, attrs) { return activeTurns(turns, setOrbState(flags(attrs), 'bound')); },
@ -1401,7 +1414,7 @@ const parsers = {
);
},
[229](attrs, types, hp, atk, rcv) {
return powerUp(null, null, p.scaleStateKindCount(null, flags(attrs), flags(types), p.mul({hp: hp, atk: atk, rcv: rcv})));
return powerUp(null, null, p.scaleStateKindCount(null, flags(attrs), flags(types), p.mul({hp: hp || 0, atk: atk || 0, rcv: rcv || 0})));
},
[230](turns, target, mul) {
/*const targetType = {
@ -2148,7 +2161,6 @@ function renderSkill(skill, option = {})
}
if (targets != undefined)
{
console.debug(targets)
targetDict.target = targets.map(target=>
tsp?.target[target.replaceAll("-","_")]?.())
.nodeJoin(tsp.word.slight_pause());
@ -2224,6 +2236,31 @@ function renderSkill(skill, option = {})
frg.ap(tsp.skill.skill_proviso(dict));
break;
}
case SkillKinds.ImpartAwakenings: { //赋予队员觉醒
let attrs = skill.attrs, types = skill.types, awakenings = skill.awakenings;
dict = {
awakenings: renderAwakenings(awakenings, {affix: true}),
}
let attrs_types = [];
if (attrs?.length && !isEqual(attrs, Attributes.all()))
{
dict.attrs = renderAttrs(attrs || [], {affix: attrs?.filter(attr=> attr !== 5)?.length});
attrs_types.push(dict.attrs);
}
if (types?.length)
{
dict.types = renderTypes(types || [], {affix: true});
attrs_types.push(dict.types);
}
if (attrs_types.length)
{
dict.attrs_types = attrs_types.nodeJoin(tsp.word.slight_pause());
}
frg.ap(tsp.skill.impart_awoken(dict));
break;
}
case SkillKinds.ObstructOpponent: { //条件限制才能用技能
let type = skill.type, pos = skill.pos, enemy_skills = skill.enemy_skills;
let slight_pause = tsp.word.slight_pause().textContent;

View File

@ -51,38 +51,27 @@ function localStorage_getBoolean(name, defaultValue = false){
else return Boolean(Number(localStorage.getItem(name) ?? defaultValue));
}
//数字补前导0
Number.prototype.prefixInteger = function(length, useGrouping = false) {
return this.toLocaleString(undefined, {
useGrouping: useGrouping,
minimumIntegerDigits: length
});
}
//数字补前导0
String.prototype.prefix = function(length = 2, prefix = '0') {
let needAddLength = Math.max(length - this.length, 0);
return new Array(needAddLength).fill(prefix).join('') + this;
}
// 将字符串转为Base64
String.prototype.toBinary = function() {
const charCodes16Arr = [...this].map(char=>char.charCodeAt(0));
const codeUnits = new Uint16Array(charCodes16Arr);
const charCodes = new Uint8Array(codeUnits.buffer);
// 将字符串转为二进制字符串
String.prototype.toUTF16BinaryString = function() {
const charCodes16Arr = [...this].map(char=>char.charCodeAt(0)); //将每个字符转为数字
const codeUnits = new Uint16Array(charCodes16Arr); //将每个字符存入 2 字节中。警告:仅限 0xFFFF 前的Unicode字符之后的就得换 Uint32Array
const charCodes = new Uint8Array(codeUnits.buffer); //每两个存入中
const result = [...charCodes].map(code=>String.fromCharCode(code)).join('');
return result;
}
String.prototype.toBase64 = function() {
return btoa(this.toBinary());
}
String.fromBinary = function(binary) {
String.fromBinaryString = function(binary) {
const bytes = new Uint8Array([...binary].map(char=>char.charCodeAt(0)));
const charCodes = new Uint16Array(bytes.buffer);
const result = [...charCodes].map(code=>String.fromCharCode(code)).join('');
return result;
}
String.fromBase64 = function(base64) {
return String.fromBinary(atob(base64));
return String.fromBinaryString(atob(base64));
}
//Buffer转16进制字符串
Uint8Array.prototype.toHex = function() {
return [...this].map(n=>n.toString(16).padStart(2,'0')).join('');
}
//大数字缩短长度,默认返回本地定义字符串
@ -131,6 +120,7 @@ Math.randomInteger = function(max, min = 0) {
return this.floor(this.random() * (max - min + 1) + min);
}
//将二进制flag转为数组
function flags(num) {
const arr = [];
@ -356,14 +346,22 @@ function dbDelete (db, tableName, keys) {
function latentUseHole(latentId) {
switch (true) {
case (latentId === 12):
case (latentId >= 16 && latentId <= 36 || latentId >= 43):
case (latentId >= 16 && latentId <= 36):
case (latentId >= 43 && latentId <= 45):
{
return 2;
}
case (latentId >= 13 && latentId <= 15):
case (latentId >= 37 && latentId <= 42):
case (latentId == 46):
{
return 6;
}
case (latentId < 12):
default:
{
return 1;
}
}
}
//获取最大潜觉数量
@ -634,22 +632,27 @@ function searchCards(cards, attr1, attr2, fixMainColor, types, typeAndOr, rares,
if (attr1 != null && attr1 === attr2 || //主副属性一致并不为空
(attr1 === 6 && attr2 === -1)) //主副属性都为“无”
{ //当两个颜色相同时,主副一样颜色的只需判断一次
cardsRange = cardsRange.filter(c => c.attrs[0] === attr1 && c.attrs[1] === attr1);
} else if (fixMainColor) //如果固定了顺序
cardsRange = cardsRange.filter(c => c.attrs[0] === attr1 && c.attrs[1] === attr2);
}
else if (fixMainColor) //如果固定了顺序
{
const a1null = attr1 === null,
a2null = attr2 === null;
cardsRange = cardsRange.filter(c =>
(a1null ? true : c.attrs[0] === attr1) &&
(a2null ? true : c.attrs[1] === attr2)
);
} else //不限定顺序时
const a1IsNull = attr1 === null,
a2IsNull = attr2 === null;
if (!a1IsNull || !a2IsNull) { //当a1、a2任一不为null任意时才需要筛选
cardsRange = cardsRange.filter(c =>
(a2IsNull ? c.attrs[0] === 6 && c.attrs[1] === attr1 : false) || //当2为随机只有属性1时也专门搜只有副属性=属性1的怪物
(a1IsNull ? true : c.attrs[0] === attr1) &&
(a2IsNull ? true : c.attrs[1] === attr2)
);
}
}
else //不限定顺序时
{
const search_attrs = [attr1, attr2].filter(a => a !== null && a >= 0 && a <= 5); //所有非空属性
const anone = attr1 === 6 || attr2 === -1; //是否有“无”属性
const search_attrs = [attr1, attr2].filter(a => a != null && a >= 0 && a <= 5); //所有非空属性
const aNone = attr1 === 6 || attr2 === -1; //是否有“无”属性
cardsRange = cardsRange.filter(c =>
search_attrs.every(a => c.attrs.includes(a)) &&
(anone ? (c.attrs.includes(6) || c.attrs.includes(-1)) : true)
(aNone ? (c.attrs.includes(6) || c.attrs.includes(-1)) : true)
);
}
//类型
@ -917,16 +920,16 @@ function getAllowLatent(card) {
return Array.from(latentSet);
}
//计算队伍中有多少血量
function countTeamHp(memberArr, leader1id, leader2id, solo, noAwoken = false) {
function countTeamHp(team, leader1id, leader2id, solo, noAwoken = false) {
let memberArr = team[0], assistArr = team[1];
const ls1 = Skills[(Cards[leader1id] || Cards[0]).leaderSkillId];
const ls2 = Skills[(Cards[leader2id] || Cards[0]).leaderSkillId];
const mHpArr = memberArr.map(m => {
const ability = noAwoken ? m.abilityNoAwoken : m.ability;
const mHpArr = memberArr.map((member, idx) => {
const ability = noAwoken ? member.abilityNoAwoken : member.ability;
let hp = ability ? ability[0] : 0;
if (!hp) return 0;
const card = Cards[m.id] || Cards[0];
let hp1 = hp = Math.round(hp * memberHpMul(card, ls2, memberArr, solo)); //战友队长技
let hp2 = hp = Math.round(hp * memberHpMul(card, ls1, memberArr, solo)); //我方队长技
let hp1 = hp = Math.round(hp * memberHpMul(member, assistArr[idx], ls2, memberArr, solo)); //战友队长技
let hp2 = hp = Math.round(hp * memberHpMul(member, assistArr[idx], ls1, memberArr, solo)); //我方队长技
//演示用代码
//console.log("%s 第1次倍率血量%s第2次倍率血量%s",Cards[m.id].otLangName["chs"],hp1,hp2);
@ -937,14 +940,15 @@ function countTeamHp(memberArr, leader1id, leader2id, solo, noAwoken = false) {
//console.log('单个队伍血量:',mHpArr,mHpArr.reduce((p,c)=>p+c));
function memberHpMul(card, ls, memberArr, solo) {
function memberHpMul(member, assist, ls, memberArr, solo) {
let memberAttrsTypes = member.getAttrsTypesWithWeapon(assist);
function hpMul(parm, scale) {
if (scale == undefined || scale == 0) return 1;
if (parm.attrs && card.attrs.some(a => parm.attrs.includes(a))) {
if (parm.attrs && memberAttrsTypes.attrs.some(a => parm.attrs.includes(a))) {
return scale / 100;
}
if (parm.types && card.types.some(t => parm.types.includes(t))) {
if (parm.types && memberAttrsTypes.types.some(t => parm.types.includes(t))) {
return scale / 100;
}
return 1;
@ -1014,39 +1018,38 @@ function countTeamHp(memberArr, leader1id, leader2id, solo, noAwoken = false) {
scale = hpMul({ attrs: flags(sk[1]), types: flags(sk[2]) }, sk[3]);
break;
case 203:{ //队员为指定类型不包括双方队长且队员数大于0
let trueMemberCardsArr = memberArr.slice(1, 5).filter(m => m.id > 0).map(m => Cards[m.id]);
let trueMemberCardsArr = memberArr.slice(1, 5).filter(m => m.id > 0).map(m => m.card);
switch (sk[0]) {
case 0: //全是像素进化
scale = (trueMemberCardsArr.length > 0 && trueMemberCardsArr.every(card => card.evoMaterials.includes(3826))) ? sk[1] / 100 : 1;
scale = (trueMemberCardsArr.length > 0 && trueMemberCardsArr.every(memberCard => memberCard.evoMaterials.includes(3826))) ? sk[1] / 100 : 1;
break;
case 2: //全是转生、超转生8格潜觉
scale = (trueMemberCardsArr.length > 0 && trueMemberCardsArr.every(card => isReincarnated(card))) ? sk[1] / 100 : 1;
scale = (trueMemberCardsArr.length > 0 && trueMemberCardsArr.every(memberCard => isReincarnated(memberCard))) ? sk[1] / 100 : 1;
break;
}
break;
}
case 217:{ //限定队伍星级,不包括好友队长
let cardsArr = memberArr.slice(0, 5).filter(m => m.id > 0).map(m => Cards[m.id]); //所有的卡片
const rarityCount = cardsArr.reduce((pre,member)=>{
const card = Cards[member.id] || Cards[0];
return pre + card.rarity;
},0);
let cardsArr = memberArr.slice(0, 5).filter(m => m.id > 0).map(m => m.card); //所有的卡片
const rarityCount = cardsArr.reduce((pre, memberCard)=>{
return pre + memberCard.rarity;
}, 0);
scale = rarityCount <= sk[0] ? sk[1] / 100 : 1;
break;
}
case 229:{ //队员中存在每个属性或Type都算一次
let cardsArr = memberArr.filter(m => m.id > 0).map(m => Cards[m.id]); //所有的卡片
let attrsArr = cardsArr.flatMap(card => card.attr); //所有卡片的属性
let typesArr = cardsArr.flatMap(card => card.types); //所有卡片的类型
let correspondingAttrs = flags(sk[0]); //符合的属性
let correspondingTypes = flags(sk[1]); //符合的类型
let correspondingTimes = attrsArr.filter(a=>correspondingAttrs.includes(a)).length + typesArr.filter(t=>correspondingTypes.includes(t)).length; //符合的次数
scale = sk[2] * correspondingTimes / 100 + 1;
//console.log('属性、类型个数动态倍率当前队长HP倍率为 %s',scale);
const atCount = countTeamTotalAttrsTypes(memberArr, assistArr);
let correAttrs = flags(sk[0]), correTypes = flags(sk[1]); //符合的属性/类型
//符合的次数
let correTimes = correAttrs.reduce((pre,attr)=>pre + (atCount.attrs.get(attr) || 0),0) +
correTypes.reduce((pre,type)=>pre + (atCount.types.get(type) || 0),0);
scale = sk[2] * correTimes / 100 + 1;
console.debug('属性、类型个数动态倍率当前队长HP倍率为 %s (匹配 %d 次)', scale, correTimes);
break;
}
case 138: //调用其他队长技
scale = sk.reduce((pmul, skid) => pmul * memberHpMul(card, Skills[skid], memberArr, solo), 1)
scale = sk.reduce((pmul, skid) => pmul * memberHpMul(member, assist, Skills[skid], memberArr, solo), 1)
break;
default:
}
@ -1055,6 +1058,25 @@ function countTeamHp(memberArr, leader1id, leader2id, solo, noAwoken = false) {
return mHpArr;
}
//由于有了更改属性和类型的武器,所以需要更改计算方法
function countTeamTotalAttrsTypes(memberArr, assistArr) {
let attrsCount = new Map();
let typesCount = new Map();
for (let idx = 0; idx < memberArr.length; idx++) {
const member = memberArr[idx], assist = assistArr[idx];
let memberAttrsTypes = member.getAttrsTypesWithWeapon(assist);
if (memberAttrsTypes) {
for (let attr of memberAttrsTypes.attrs) {
attrsCount.set(attr, (attrsCount.get(attr) || 0) + 1);
}
for (let type of memberAttrsTypes.types) {
typesCount.set(type, (typesCount.get(type) || 0) + 1);
}
}
}
return {attrs: attrsCount, types: typesCount};
}
//返回卡片的队长技能
function getCardLeaderSkills(card, skillTypes) {
if (!card) return [];

344
script.js
View File

@ -4,6 +4,8 @@ let PlayerDatas = []; //玩家数据
let currentLanguage; //当前语言
let currentDataSource; //当前数据
let currentPlayerData; //当前玩家数据
let markedFilter = []; //收藏的特殊搜索
let defaultLevel = 99; //默认等级
const teamBigBoxs = []; //储存全部teamBigBox
const allMembers = []; //储存所有成员,包含辅助
@ -146,6 +148,29 @@ var Member = function() {
this.ability = [0, 0, 0];
this.abilityNoAwoken = [0, 0, 0];
};
//让 Member 能直接获取 card
Object.defineProperty(Member.prototype, "card", {
get() { return Cards[this.id]; }
})
Member.prototype.getAttrsTypesWithWeapon = function(assist) {
let memberCard = this.card, assistCard = assist?.card;
if (this.id <= 0 || !memberCard) return null; //跳过 id 0
let attrs = [...memberCard.attrs]; //属性只有两个,因此用固定的数组
let types = new Set(memberCard.types); //Type 用Set确保不会重复
if (assistCard?.awakenings?.includes(49)) { //如果有武器
//更改副属性
let changeAttr = assistCard.awakenings.find(ak=>ak >= 91 && ak <= 95);
if (changeAttr) attrs[1] = changeAttr - 91;
//添加类型
let appendTypes = assistCard.awakenings.filter(ak=>ak >= 83 && ak <= 90);
appendTypes = appendTypes.map(type=>
typekiller_for_type.find(t=>(type - 52) === t.awoken).type);
for (let appendType of appendTypes) {
types.add(appendType);
}
}
return {attrs: attrs, types: Array.from(types)};
}
Member.prototype.outObj = function() {
const m = this;
if (m.id == 0) return null;
@ -416,7 +441,7 @@ Formation.prototype.getPdcQrStr = function()
const o = new Map();
o.set(0, m.id);
if (m.latent.length)
o.set(2, m.latent.map(pdfLtent=>pdcLatentMap.find(latent=>latent.pdf === pdfLtent).pdc.toString(36).prefix(2)).join('')); //潜觉
o.set(2, m.latent.map(pdfLtent=>pdcLatentMap.find(latent=>latent.pdf === pdfLtent).pdc.toString(36).padStart(2,'0')).join('')); //潜觉
o.set(3, m.level);
o.set(4, m.plus[0]);
o.set(5, m.plus[1]);
@ -465,8 +490,8 @@ Formation.prototype.getPdcQrStr = function()
return null;
}
return [
item[0].toString(36).prefix(2),
item[1].toString(36).prefix(2)
item[0].toString(36).padStart(2,'0'),
item[1].toString(36).padStart(2,'0')
].join('')}).filter(item=>item).join(',');
teamArr.push(pdcMemberStr);
}
@ -801,7 +826,7 @@ class EvoTree
class LeaderSkillType{
constructor(flags1, flags2){
this.matchMode = {
multipleColors: Boolean(flags1 & 1 << 0),
multipleAttr: Boolean(flags1 & 1 << 0),
rowMatch: Boolean(flags1 & 1 << 1),
combo: Boolean(flags1 & 1 << 2),
sameColor: Boolean(flags1 & 1 << 3),
@ -1400,7 +1425,7 @@ function pdcFotmationToPdfFotmation(inputString)
{
let membersStr = teamStr.split('}').filter(Boolean);
const team = {
badge: parseInt(membersStr.shift(),10) //徽章是10进制
badge: parseInt(membersStr.shift(),10) //第一个元素是徽章是10进制。读取并从数组内删掉,剩下的都是队员
}
team.members = membersStr.map(memberStr=>{
let memberArr = memberStr.split(',').map(valueStr=>{
@ -1580,6 +1605,16 @@ function initialize(event) {
btnShowAwokenCount.onclick();
}
//默认等级
const iptDefaultLevel = document.getElementById("default-level");
iptDefaultLevel.value = localStorage.getItem(cfgPrefix + iptDefaultLevel.id);
iptDefaultLevel.onchange = function(e){
let num = Number(this.value || this.placeholder);
defaultLevel = num;
if (e) localStorage.setItem(cfgPrefix + this.id, defaultLevel);
}
iptDefaultLevel.onchange(false);
//触屏使用的切换显示的线条
interchangeSVG = document.body.querySelector("#interchange-line");
interchangeSVG.line = interchangeSVG.querySelector("g line");
@ -2725,8 +2760,8 @@ function initialize(event) {
const searchEvolutionByThis = settingBox.querySelector(".row-mon-id .search-evolution-by-this");
searchEvolutionByThis.onclick = function() {showSearch(Cards.filter(card=>card.evoMaterials.includes(editBox.mid)))};
const s_attr1s = Array.from(searchBox.querySelectorAll(".attrs-div .attr-list-1 .attr-radio"));
const s_attr2s = Array.from(searchBox.querySelectorAll(".attrs-div .attr-list-2 .attr-radio"));
const s_attr1s = Array.from(searchBox.querySelectorAll(".attrs-div .attr-list-1 [name=\"attr-1\"]"));
const s_attr2s = Array.from(searchBox.querySelectorAll(".attrs-div .attr-list-2 [name=\"attr-2\"]"));
const s_fixMainColor = searchBox.querySelector("#fix-main-color");
const s_typesDiv = searchBox.querySelector(".types-div");
const s_typeAndOr = s_typesDiv.querySelector("#type-and-or");
@ -2850,11 +2885,11 @@ function initialize(event) {
}
for (const id of awokenSorting) {
const li = s_awokensLi.find(li=>getIconId(li) === id);
fragmentAwoken.appendChild(li);
if (li) fragmentAwoken.appendChild(li);
}
for (const id of sawokenSorting) {
const li = s_sawokensLi.find(li=>getIconId(li) === id);
fragmentSawoken.appendChild(li);
if (li) fragmentSawoken.appendChild(li);
}
const className = "official-awoken-sorting";
@ -2914,6 +2949,7 @@ function initialize(event) {
const s_specialDiv = searchBox.querySelector(".special-div");
const specialAdd = s_specialDiv.querySelector(".special-add");
const specialClear = s_specialDiv.querySelector(".special-clear");
const specialStar = s_specialDiv.querySelector(".special-star");
const specialFilterUl = s_specialDiv.querySelector(".special-filter-list");
const specialFilterFirstLi = specialFilterUl.querySelector("li");
const specialFirstSelect = specialFilterFirstLi.querySelector(".special-filter");
@ -2921,46 +2957,104 @@ function initialize(event) {
function newSpecialSearchOption(func, idx1, idx2)
{
const funcName = returnMonsterNameArr(func, currentLanguage.searchlist, currentDataSource.code)[0];
return new Option(funcName + (func.addition ? " " + localTranslating.addition_display : ""), idx1 + (idx2 != null ? "|" + idx2 : ""));
return new Option(
funcName + (func.addition ? " " + localTranslating.addition_display : ""), //有附加显示的,名称增加一个附加显示图标
idx1 + (idx2 != null ? "|" + idx2 : "") //值为 组序号|组内序号
);
}
specialSearchFunctions.forEach((sfunc,idx)=>{
if (sfunc.group)
{
const groupName = returnMonsterNameArr(sfunc, currentLanguage.searchlist, currentDataSource.code)[0];
const optgroup = specialFirstSelect.appendChild(document.createElement("optgroup"));
optgroup.label = groupName;
if (sfunc.functions)
{
sfunc.functions.forEach((_sfunc,_idx)=>{
optgroup.appendChild(newSpecialSearchOption(_sfunc, idx, _idx));
});
//读取储存的筛选收藏列表
let strMakedConfig = JSON.parse(localStorage.getItem(cfgPrefix + "marked-filter"));
if (Array.isArray(strMakedConfig)) {
for (let arr of strMakedConfig) {
let idx1 = specialSearchFunctions.findIndex(group=>group.name == arr[0]);
if (idx1 < 0 ) continue;
if (arr.length > 1) {
let idx2 = specialSearchFunctions[idx1].functions.findIndex(func=>func.name == arr[1]);
if (idx2 < 0 ) continue;
markedFilter.push([idx1, idx2]);
} else {
markedFilter.push([idx1]);
}
}else
{
specialFirstSelect.options.add(newSpecialSearchOption(sfunc, idx));
}
});
specialAdd.onclick = function()
{
}
specialFirstSelect.refreshList = function() {
const _this = specialFirstSelect;
function addNewOption(sfunc, idx){
if (sfunc.group)
{
const groupName = returnMonsterNameArr(sfunc, currentLanguage.searchlist, currentDataSource.code)[0];
const optgroup = _this.appendChild(document.createElement("optgroup"));
optgroup.label = groupName;
if (sfunc.functions)
{
sfunc.functions.forEach((_sfunc,_idx)=>{
optgroup.appendChild(newSpecialSearchOption(_sfunc, idx, _idx));
});
}
}else
{
_this.options.add(newSpecialSearchOption(sfunc, idx));
}
}
_this.innerHTML = '';
addNewOption(specialSearchFunctions[0], 0);
if (markedFilter.length > 0) {
const groupName = "=====★=====";
const optgroup = _this.appendChild(document.createElement("optgroup"));
optgroup.label = groupName;
for (let indexs of markedFilter) {
const funcObj = indexs.length > 1 ? specialSearchFunctions[indexs[0]].functions[indexs[1]] : specialSearchFunctions[indexs[0]];
optgroup.appendChild(newSpecialSearchOption(funcObj, indexs[0], indexs[1]));
}
}
for (let idx = 1; idx < specialSearchFunctions.length; idx++) {
addNewOption(specialSearchFunctions[idx], idx);
}
}
specialFirstSelect.onchange = function() {
const indexs = specialFirstSelect.value.split("|").map(Number);
let markIdx = markedFilter.findIndex(arr=>arr[0] === indexs[0] && arr[1] === indexs[1]);
if (markIdx >= 0) {//已经存在的收藏
specialStar.classList.add("marked");
} else {
specialStar.classList.remove("marked");
}
}
//只添加第一个列表,后面的全部通过克隆的方式复现
specialFirstSelect.refreshList();
specialAdd.onclick = function() {
specialFilterUl.appendChild(specialFilterFirstLi.cloneNode(true));
}
specialAdd.onclick(); //先运行一次产生两个
specialClear.onclick = function()
{
/*for (let ci = specialFilterUl.children.length-1; ci>0; ci--)
{
specialFilterUl.children[ci].remove();
}*/
//specialAdd.onclick(); //先运行一次产生两个
specialClear.onclick = function() {
specialFilterUl.innerHTML = "";
specialFilterUl.appendChild(specialFilterFirstLi);
specialFirstSelect.selectedIndex = 0;
}
specialStar.onclick = function() {
const indexs = specialFirstSelect.value.split("|").map(Number);
let markIdx = markedFilter.findIndex(arr=>arr[0] === indexs[0] && arr[1] === indexs[1]);
if (markIdx >= 0) {//已经存在的收藏
markedFilter.splice(markIdx,1);
} else {
markedFilter.push(indexs);
}
specialFirstSelect.refreshList(); //刷新列表
specialStar.classList.remove("marked"); //去掉自身的收藏标记
//储存设置
let strMakedConfig = markedFilter.map(indexs=>{
let arr = [specialSearchFunctions[indexs[0]].name];
if (indexs.length > 1) arr.push(specialSearchFunctions[indexs[0]].functions[indexs[1]].name);
return arr;})
localStorage.setItem(cfgPrefix + "marked-filter", JSON.stringify(strMakedConfig));
}
const s_controlDiv = searchBox.querySelector(".control-div");
const searchStart = s_controlDiv.querySelector(".search-start");
const searchClose = s_controlDiv.querySelector(".search-close");
const searchClear = s_controlDiv.querySelector(".search-clear");
function returnCheckedInput(ipt) {
return ipt.checked;
}
@ -2969,6 +3063,17 @@ function initialize(event) {
return ipt.value;
}
function returnRadiosValue(radioArr) {
let checkedRadio = radioArr.find(returnCheckedInput);
let firstCheckedValue = checkedRadio ? returnInputValue(checkedRadio) : undefined;
return firstCheckedValue;
}
function returnCheckBoxsValues(checkBoxsArr) {
let checkedCheckBoxs = checkBoxsArr.filter(returnCheckedInput);
let checkedValues = checkedCheckBoxs.map(returnInputValue);
return checkedValues;
}
function Str2Int(str) {
return parseInt(str, 10);
}
@ -3040,31 +3145,19 @@ function initialize(event) {
s_add_show_abilities.onchange = reShowSearch;
s_add_show_abilities_with_awoken.onchange = reShowSearch;
const startSearch = function(cards, customAdditionalFunction) {
if (customAdditionalFunction == undefined) customAdditionalFunction = [];
const attr1Filter = s_attr1s.filter(returnCheckedInput).map(returnInputValue);
const attr2Filter = s_attr2s.filter(returnCheckedInput).map(returnInputValue);
const startSearch = function(cards, customAdditionalFunction = []) {
let attr1, attr2;
if (attr1Filter.length > 0) {
if (!isNaN(attr1Filter[0])) {
attr1 = parseInt(attr1Filter[0], 10);
} else {
attr1 = null;
}
}
if (attr2Filter.length > 0) {
if (!isNaN(attr2Filter[0])) {
attr2 = parseInt(attr2Filter[0], 10);
} else {
attr2 = null;
}
}
const typesFilter = s_types.filter(returnCheckedInput).map(returnInputValue).map(Str2Int);
attr1 = returnRadiosValue(s_attr1s); //获取选中单选框的值
attr2 = returnRadiosValue(s_attr2s); //获取选中单选框的值
attr1 = isNaN(attr1) ? null : Str2Int(attr1); //将值转为十进制
attr2 = isNaN(attr2) ? null : Str2Int(attr2); //将值转为十进制
const typesFilter = returnCheckBoxsValues(s_types).map(Str2Int);
const rareFilter = [
s_rareLows.filter(returnCheckedInput).map(returnInputValue).map(Str2Int)[0],
s_rareHighs.filter(returnCheckedInput).map(returnInputValue).map(Str2Int)[0],
returnCheckBoxsValues(s_rareLows).map(Str2Int)[0],
returnCheckBoxsValues(s_rareHighs).map(Str2Int)[0],
];
const sawokensFilter = s_sawokens.filter(returnCheckedInput).map(returnInputValue).map(Str2Int);
const sawokensFilter = returnCheckBoxsValues(s_sawokens).map(Str2Int);
const awokensFilter = s_awokensIcons.filter(btn => parseInt(btn.getAttribute("data-awoken-count"), 10) > 0).map(btn => {
const awokenIndex = parseInt(btn.getAttribute("data-awoken-icon"), 10);
return {
@ -3121,6 +3214,9 @@ function initialize(event) {
sawokenClear.onclick();
specialClear.onclick();
s_canAssist.checked = false;
s_noHenshin.checked = false;
searchMonList.originalHeads = null;
searchResultCount.setAttribute("data-search-result-count", 0);
searchMonList.innerHTML = "";
@ -3242,7 +3338,7 @@ function initialize(event) {
const card = Cards[editBox.mid];
const decoder = new Adpcm(adpcm_wasm, pcmImportObj);
decoder.resetDecodeState(new Adpcm.State(0, 0));
decodeAudio(`sound/voice/${currentDataSource.code}/padv${card.voiceId.prefixInteger(3)}.wav`, decoder.decode.bind(decoder));
decodeAudio(`sound/voice/${currentDataSource.code}/padv${card.voiceId.toString().padStart(2,'0')}.wav`, decoder.decode.bind(decoder));
}
}
monEditAwokensLabel.forEach(akDom => akDom.onclick = playVoiceAwoken);
@ -3260,7 +3356,7 @@ function initialize(event) {
monEditSAwokensRow.swaokenIndex = value;
const plusArr = [monEditAddHp,monEditAddAtk,monEditAddRcv];
//自动打上297
if (plusArr.some(ipt=>parseInt(ipt.value)<99))
if (!monEditSAwokensRow.classList.contains(className_displayNone) && plusArr.some(ipt=>parseInt(ipt.value)<99))
{
console.debug("点亮超觉醒自动设定297");
plusArr.forEach(ipt=>ipt.value=99);
@ -3508,7 +3604,7 @@ function initialize(event) {
teamData[editBox.memberIdx[1]][editBox.memberIdx[2]] = mon;
mon.id = editBox.mid;
const card = Cards[mon.id] || Cards[0];
const card = mon.card || Cards[0];
const skill = Skills[card.activeSkillId];
mon.level = parseInt(monEditLv.value, 10);
@ -3542,12 +3638,17 @@ function initialize(event) {
const teamAbilityDom = teamBigBox.querySelector(".team-ability");
refreshAbility(teamAbilityDom, teamData, editBox.memberIdx[2]); //本人能力值
let changeAttrTypeWeapon = false;
let awokens = card.awakenings;
if (!editBox.isAssist) {//如果改的不是辅助
awokens = teamData[editBox.memberIdx[1] + 1][editBox.memberIdx[2]].card.awakenings;
}
if (awokens.includes(49) && awokens.some(ak => ak >= 83 && ak <= 95)) changeAttrTypeWeapon = true;
//如果是2人协力且修改的是队长的情况为了刷新另一个队伍时间计算直接刷新整个队形
if (teamsCount === 2 && editBox.memberIdx[2] === 0)
{
if (teamsCount === 2 && editBox.memberIdx[2] === 0 || changeAttrTypeWeapon) {
refreshAll(formation);
}else
{
} else {
const teamTotalInfoDom = teamBigBox.querySelector(".team-total-info"); //队伍能力值合计
if (teamTotalInfoDom) refreshTeamTotalHP(teamTotalInfoDom, teamData, editBox.memberIdx[0]);
const formationTotalInfoDom = formationBox.querySelector(".formation-total-info"); //所有队伍能力值合计
@ -3562,7 +3663,7 @@ function initialize(event) {
const formationAwokenDom = formationBox.querySelector(".formation-awoken"); //所有队伍觉醒合计
if (formationAwokenDom) refreshFormationAwokenCount(formationAwokenDom, formation.teams);
//刷新队员的CD
//刷新队员的CD
refreshMemberSkillCD(teamBox, teamData, editBox.memberIdx[2]);
}
@ -3578,15 +3679,19 @@ function initialize(event) {
}
else
{
let selection = window.getSelection(), selectNodes = selection?.focusNode?.childNodes;
//如果正在编辑文本,则不执行快捷键操作
if (selectNodes && Array.from(selectNodes).some(node=>node?.nodeName === "TEXTAREA" || node?.nodeName === "INPUT"))
return;
//如果按Ctrl+左右方向键或者是小键盘上的左右方向键关闭Num快速切换变身
if (event.key === "ArrowLeft"
&& (event.code == "Numpad4" || event.ctrlKey))
{
{ //变身后退
henshinStep(-1);
}
else if (event.key === "ArrowRight"
&& (event.code == "Numpad6" || event.ctrlKey))
{
{ //变身前进
henshinStep(+1);
}
}
@ -3602,23 +3707,8 @@ function initialize(event) {
const teamAbilityDom = teamBigBox.querySelector(".team-ability");
refreshAbility(teamAbilityDom, teamData, editBox.memberIdx[2]); //本人能力值
const teamTotalInfoDom = teamBigBox.querySelector(".team-total-info"); //队伍能力值合计
if (teamTotalInfoDom) refreshTeamTotalHP(teamTotalInfoDom, teamData, editBox.memberIdx[0]);
const formationTotalInfoDom = formationBox.querySelector(".formation-total-info"); //所有队伍能力值合计
if (formationTotalInfoDom) refreshFormationTotalHP(formationTotalInfoDom, formation.teams);
const teamMenberAwokenDom = teamBigBox.querySelector(".team-menber-awoken"); //队员觉醒
const teamAssistAwokenDom = teamBigBox.querySelector(".team-assist-awoken"); //辅助觉醒
if (teamMenberAwokenDom && teamAssistAwokenDom) refreshMenberAwoken(teamMenberAwokenDom, teamAssistAwokenDom, teamData, editBox.memberIdx[2]); //刷新本人觉醒
const teamAwokenDom = teamBigBox.querySelector(".team-awoken"); //队伍觉醒合计
if (teamAwokenDom) refreshTeamAwokenCount(teamAwokenDom, teamData);
const formationAwokenDom = formationBox.querySelector(".formation-awoken"); //所有队伍觉醒合计
if (formationAwokenDom) refreshFormationAwokenCount(formationAwokenDom, formation.teams);
//刷新改队员的CD
refreshMemberSkillCD(teamBigBox, teamData, editBox.memberIdx[2]);
refreshAll(formation);
creatNewUrl();
editBox.hide();
};
@ -3728,7 +3818,7 @@ function buildEvoTreeIdsArray(card, includeHenshin = true) {
}
//改变一个怪物头像
function changeid(mon, monDom, latentDom) {
function changeid(mon, monDom, latentDom, assist) {
let fragment = document.createDocumentFragment(); //创建节点用的临时空间
const parentNode = monDom.parentNode;
fragment.appendChild(monDom);
@ -3764,7 +3854,13 @@ function changeid(mon, monDom, latentDom) {
monDom.setAttribute("data-cards-pic-y", Math.floor(idxInPage / 10)); //添加Y方向序号
monDom.querySelector(".property").setAttribute("data-property", card.attrs[0]); //主属性
monDom.querySelector(".subproperty").setAttribute("data-property", card.attrs[1]); //副属性
let subAttribute = card.attrs[1]; //正常的副属性
let assistCard = Cards[assist?.id];
if (assistCard && assistCard.awakenings.includes(49)) { //如果传入了辅助武器
let changeAttr = assistCard.awakenings.find(ak=>ak >= 91 && ak <= 95); //搜索改副属性的觉醒
if (changeAttr) subAttribute = changeAttr - 91; //更改副属性
}
monDom.querySelector(".subproperty").setAttribute("data-property", subAttribute); //副属性
monDom.title = "No." + monId + " " + (card.otLangName ? (card.otLangName[currentLanguage.searchlist[0]] || card.name) : card.name);
monDom.href = currentLanguage.guideURL(monId, card.name);
@ -4117,8 +4213,8 @@ function editBoxChangeMonId(id) {
//monEditLvMax.textContent = monEditLvMax.value = card.maxLevel;
monEditLvMax.value = card.maxLevel;
const monEditLv = settingBox.querySelector(".m-level");
monEditLv.max = card.limitBreakIncr ? 120 : card.maxLevel; //最大等级为120
monEditLv.value = card.limitBreakIncr ? 110 : card.maxLevel; //默认等级为110
monEditLv.max = card.limitBreakIncr ? 120 : card.maxLevel; //最大可设定等级
monEditLv.value = Math.min(defaultLevel, card.limitBreakIncr ? 120 : card.maxLevel); //默认等级
const monEditLv110 = settingBox.querySelector(".m-level-btn-110");
const monEditLv120 = settingBox.querySelector(".m-level-btn-120");
@ -4320,26 +4416,27 @@ function refreshAll(formationData) {
}
});
//修改显示内容
const member = memberLi.querySelector(`.monster`);
const assist = assistsLi.querySelector(`.monster`);
const latent = latentLi.querySelector(`.latent-ul`);
changeid(teamData[0][ti], member, latent); //队员
changeid(teamData[1][ti], assist); //辅助
const memberDom = memberLi.querySelector(`.monster`);
const assistDom = assistsLi.querySelector(`.monster`);
const latentDom = latentLi.querySelector(`.latent-ul`);
let member = teamData[0][ti], assist = teamData[1][ti];
changeid(member, memberDom, latentDom, assist); //队员
changeid(assist, assistDom); //辅助
//隐藏队长的自身换为换队长的技能
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];
const card_m = Cards[member.id] || Cards[0];
const card_a = Cards[assist.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);
memberDom.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);
assistDom.querySelector(".switch-leader").classList.add(className_displayNone);
}
}
refreshMemberSkillCD(teamBox, teamData, ti); //技能CD
@ -4602,7 +4699,9 @@ function refreshTeamTotalHP(totalDom, team, teamIdx) {
const leader1id = team[0][team[3] || 0].id;
const leader2id = teamsCount===2 ? (teamIdx === 1 ? teams[0][0][teams[0][3] || 0].id : teams[1][0][teams[1][3] || 0].id) : team[0][5].id;
//计算当前队伍2P时则是需要特殊处理
const team_2p = teamsCount===2 ? team[0].concat((teamIdx === 1 ? teams[0][0][0] : teams[1][0][0])) : team[0];
const assistTeam_2p = teamsCount===2 ? team[1].concat((teamIdx === 1 ? teams[0][1][0] : teams[1][1][0])) : team[1];
if (tHpDom) {
const reduceScales1 = getReduceScales(leader1id);
@ -4624,8 +4723,8 @@ function refreshTeamTotalHP(totalDom, team, teamIdx) {
const totalReduce = leastScale.scale;
const teamHPArr = countTeamHp(team[0], leader1id, leader2id, solo);
const teamHPNoAwokenArr = countTeamHp(team[0], leader1id, leader2id, solo, true);
const teamHPArr = countTeamHp(team, leader1id, leader2id, solo);
const teamHPNoAwokenArr = countTeamHp(team, leader1id, leader2id, solo, true);
let tHP = teamHPArr.reduce((pv, v) => pv + v); //队伍计算的总HP
@ -4700,35 +4799,24 @@ function refreshTeamTotalHP(totalDom, team, teamIdx) {
},0);
rarityDoms.setAttribute(dataAttrName, rarityCount);
}
//统计队伍颜色个数
if (tAttrsDom)
//统计队伍属性/类型个数
if (tAttrsDom || tTypesDom)
{
const attrDoms = Array.from(tAttrsDom.querySelectorAll(".attr"));
attrDoms.forEach(attrDom=>{
const attrId = parseInt(attrDom.getAttribute("data-attr-icon"));
const attrCount = team_2p.reduce((pre,member)=>{
if (member.id <= 0) return pre;
const card = Cards[member.id] || Cards[0];
const attrNum = card.attrs.filter(a=>a==attrId).length;
return pre + attrNum;
},0);
attrDom.setAttribute(dataAttrName, attrCount);
});
}
//统计队伍类型个数
if (tTypesDom)
{
const typeDoms = Array.from(tTypesDom.querySelectorAll(".type-icon"));
typeDoms.forEach(typeDom=>{
const typeId = parseInt(typeDom.getAttribute("data-type-icon"));
const typeCount = team_2p.reduce((pre,member)=>{
if (member.id <= 0) return pre;
const card = Cards[member.id] || Cards[0];
const typeNum = card.types.filter(a=>a==typeId).length;
return pre + typeNum;
},0);
typeDom.setAttribute(dataAttrName, typeCount);
});
const atCount = countTeamTotalAttrsTypes(team_2p, assistTeam_2p);
if (tAttrsDom) {
const attrDoms = Array.from(tAttrsDom.querySelectorAll(".attr"));
attrDoms.forEach(attrDom=>{
const attrId = parseInt(attrDom.getAttribute("data-attr-icon"));
attrDom.setAttribute(dataAttrName, atCount.attrs.get(attrId) || 0);
});
}
if (tTypesDom) {
const typeDoms = Array.from(tTypesDom.querySelectorAll(".type-icon"));
typeDoms.forEach(typeDom=>{
const typeId = parseInt(typeDom.getAttribute("data-type-icon"));
typeDom.setAttribute(dataAttrName, atCount.types.get(typeId) || 0);
});
}
}
if (tEffectDom) {
@ -4814,7 +4902,7 @@ function refreshFormationTotalHP(totalDom, teams) {
const totalReduce = leastScale.scale;
const tHPArr = teams.map(function(team) {
const teamHPArr = countTeamHp(team[0], leader1id, leader2id, solo);
const teamHPArr = countTeamHp(team, leader1id, leader2id, solo);
const teamTHP = teamHPArr.reduce((pv, v) => pv + v); //队伍计算的总HP
@ -4823,7 +4911,7 @@ function refreshFormationTotalHP(totalDom, teams) {
return Math.round(teamTHP * (1 + 0.05 * teamHPAwoken));
});
const tHPNoAwokenArr = teams.map(function(team) {
const teamHPArr = countTeamHp(team[0], leader1id, leader2id, solo, true);
const teamHPArr = countTeamHp(team, leader1id, leader2id, solo, true);
const teamTHP = teamHPArr.reduce((pv, v) => pv + v); //队伍计算的总HP
return Math.round(teamTHP);

View File

@ -37,18 +37,25 @@ var formation = new Formation(teamsCount,6);
<label class="languages-label"><select class="languages"></select></label>
<label class="datasource-label"><select class="datasource"></select></label>
<button onclick="loadData(true);" class="datasource-updatetime" title="强制刷新数据"></button>
<a class="help-link" target="_blank" href="doc/index.html"></a>
</div>
<div>
<button class="btn-clear-data" onclick="clearData();"></button>
<button class="btn-player-data"></button>
<button class="btn-solo-link" disabled></button><button class="btn-multi-link" onclick="turnPage(2,arguments[0]);"></button><button class="btn-triple-link" onclick="turnPage(3,arguments[0]);"></button>
<button class="btn-set-dungeon-enchance"></button>
</div>
<div>
<a class="down-capture display-none" target="_blank"></a>
<button class="btn-qrcode"></button>
<button class="btn-capture" onclick="capture();"></button>
<a class="down-capture display-none" target="_blank"></a>
<button class="btn-player-data"></button>
<a class="help-link" target="_blank" href="doc/index.html"></a>
<button class="btn-set-dungeon-enchance"></button>
<label for="default-level"></label><input id="default-level" type="number" min="1" max="120" list="level-list" placeholder="110"/>
<datalist id="level-list">
<option>1</option>
<option>99</option>
<option>110</option>
<option>120</option>
</datalist>
</div>
<div>
<input type="checkbox" class="config-checkbox-ipt" name="show-mon-id" id="show-mon-id"><label class="config-checkbox-lbl show-mon-id-lbl" for="show-mon-id"><div class="config-checkbox-lbl-cicle"></div></label>
@ -103,8 +110,8 @@ var formation = new Formation(teamsCount,6);
--><li><icon class="attr" data-attr-icon="4"><!----></icon></li>
</ul>
<ul class="tIf-types">
<li><icon class="type-icon" data-type-icon="4"><!----></icon></li><!--
--><li><icon class="type-icon" data-type-icon="5"><!----></icon></li><!--
<li><icon class="type-icon" data-type-icon="5"><!----></icon></li><!--
--><li><icon class="type-icon" data-type-icon="4"><!----></icon></li><!--
--><li><icon class="type-icon" data-type-icon="7"><!--惡魔--></icon></li><!--
--><li><icon class="type-icon" data-type-icon="8"><!--机械--></icon></li><!--
--><li><icon class="type-icon" data-type-icon="1"><!--平衡--></icon></li><!--
@ -528,6 +535,19 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="80"></span><span class="count"></span></li><!--4色-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="81"></span><span class="count"></span></li><!--5色-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="82"></span><span class="count"></span></li><!--12珠-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="83"></span><span class="count"></span></li><!--附加神类型-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="84"></span><span class="count"></span></li><!--附加龙类型-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="85"></span><span class="count"></span></li><!--附加恶魔类型-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="86"></span><span class="count"></span></li><!--附加机械类型-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="87"></span><span class="count"></span></li><!--附加平衡类型-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="88"></span><span class="count"></span></li><!--附加攻击类型-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="89"></span><span class="count"></span></li><!--附加体力类型-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="90"></span><span class="count"></span></li><!--附加回复类型-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="91"></span><span class="count"></span></li><!--附加火属性-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="92"></span><span class="count"></span></li><!--附加水属性-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="93"></span><span class="count"></span></li><!--附加木属性-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="94"></span><span class="count"></span></li><!--附加光属性-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="95"></span><span class="count"></span></li><!--附加暗属性-->
</ul>
</div>
</li>
@ -565,8 +585,8 @@ var formation = new Formation(teamsCount,6);
</div>
<div class="types-div"><!--类型-->
<ul class="type-list">
<li data-type-icon="4"><input type="checkbox" class="type-check" name="types" value="4" id="search-type-4" /><label class="type-icon" data-type-icon="4" for="search-type-4"><!----></label></li>
<li data-type-icon="5"><input type="checkbox" class="type-check" name="types" value="5" id="search-type-5" /><label class="type-icon" data-type-icon="5" for="search-type-5"><!----></label></li>
<li data-type-icon="4"><input type="checkbox" class="type-check" name="types" value="4" id="search-type-4" /><label class="type-icon" data-type-icon="4" for="search-type-4"><!----></label></li>
<li data-type-icon="7"><input type="checkbox" class="type-check" name="types" value="7" id="search-type-7" /><label class="type-icon" data-type-icon="7" for="search-type-7"><!--惡魔--></label></li>
<li data-type-icon="8"><input type="checkbox" class="type-check" name="types" value="8" id="search-type-8" /><label class="type-icon" data-type-icon="8" for="search-type-8"><!--机械--></label></li>
<li data-type-icon="1"><input type="checkbox" class="type-check" name="types" value="1" id="search-type-1" /><label class="type-icon" data-type-icon="1" for="search-type-1"><!--平衡--></label></li>
@ -698,6 +718,19 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="80"></button><!--4色--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="81"></button><!--5色--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="82"></button><!--12珠--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="83" data-max-count="1"></button><!--附加神类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="84" data-max-count="1"></button><!--附加龙类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="85" data-max-count="1"></button><!--附加恶魔类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="86" data-max-count="1"></button><!--附加机械类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="87" data-max-count="1"></button><!--附加平衡类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="88" data-max-count="1"></button><!--附加攻击类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="89" data-max-count="1"></button><!--附加体力类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="90" data-max-count="1"></button><!--附加回复类型--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="91" data-max-count="1"></button><!--附加火属性--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="92" data-max-count="1"></button><!--附加水属性--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="93" data-max-count="1"></button><!--附加木属性--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="94" data-max-count="1"></button><!--附加光属性--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="95" data-max-count="1"></button><!--附加暗属性--></li>
</ul>
</div>
<div class="sawoken-div"><!--超觉醒-->
@ -720,9 +753,9 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="45" id="search-awoken-45" /><label class="awoken-icon" data-awoken-icon="45" for="search-awoken-45"></label><!--心追--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="50" id="search-awoken-50" /><label class="awoken-icon" data-awoken-icon="50" for="search-awoken-50"></label><!--方块心追--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="19" id="search-awoken-19" /><label class="awoken-icon" data-awoken-icon="19" for="search-awoken-19"></label><!--手指--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="1" id="search-awoken-1" /><label class="awoken-icon" data-awoken-icon="1" for="search-awoken-1"></label><!--HP+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="2" id="search-awoken-2" /><label class="awoken-icon" data-awoken-icon="2" for="search-awoken-2"></label><!--攻击+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="3" id="search-awoken-3" /><label class="awoken-icon" data-awoken-icon="3" for="search-awoken-3"></label><!--回复+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="1" id="search-awoken-1" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="1" for="search-awoken-1"></label><!--HP+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="2" id="search-awoken-2" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="2" for="search-awoken-2"></label><!--攻击+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="3" id="search-awoken-3" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="3" for="search-awoken-3"></label><!--回复+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="4" id="search-awoken-4" /><label class="awoken-icon" data-awoken-icon="4" for="search-awoken-4"></label><!--火盾--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="5" id="search-awoken-5" /><label class="awoken-icon" data-awoken-icon="5" for="search-awoken-5"></label><!--水盾--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="6" id="search-awoken-6" /><label class="awoken-icon" data-awoken-icon="6" for="search-awoken-6"></label><!--木盾--></li>
@ -746,7 +779,7 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="26" id="search-awoken-26" /><label class="awoken-icon" data-awoken-icon="26" for="search-awoken-26"></label><!--暗横--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="20" id="search-awoken-20" /><label class="awoken-icon" data-awoken-icon="20" for="search-awoken-20"></label><!--心解--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="28" id="search-awoken-28" /><label class="awoken-icon" data-awoken-icon="28" for="search-awoken-28"></label><!--SX--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="30" id="search-awoken-30" /><label class="awoken-icon" data-awoken-icon="30" for="search-awoken-30"></label><!--协力--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="30" id="search-awoken-30" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="30" for="search-awoken-30"></label><!--协力--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="31" id="search-awoken-31" /><label class="awoken-icon" data-awoken-icon="31" for="search-awoken-31"></label><!--龙杀--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="32" id="search-awoken-32" /><label class="awoken-icon" data-awoken-icon="32" for="search-awoken-32"></label><!--神杀--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="33" id="search-awoken-33" /><label class="awoken-icon" data-awoken-icon="33" for="search-awoken-33"></label><!--恶魔杀--></li>
@ -762,17 +795,17 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="44" id="search-awoken-44" /><label class="awoken-icon" data-awoken-icon="44" for="search-awoken-44"></label><!--5色破防--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="46" id="search-awoken-46" /><label class="awoken-icon" data-awoken-icon="46" for="search-awoken-46"></label><!--全体HP--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="47" id="search-awoken-47" /><label class="awoken-icon" data-awoken-icon="47" for="search-awoken-47"></label><!--全体回复--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="49" id="search-awoken-49" /><label class="awoken-icon" data-awoken-icon="49" for="search-awoken-49"></label><!--武器觉醒--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="49" id="search-awoken-49" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="49" for="search-awoken-49"></label><!--武器觉醒--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="51" id="search-awoken-51" /><label class="awoken-icon" data-awoken-icon="51" for="search-awoken-51"></label><!--5色溜--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="53" id="search-awoken-53" /><label class="awoken-icon" data-awoken-icon="53" for="search-awoken-53"></label><!--大手指--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="56" id="search-awoken-56" /><label class="awoken-icon" data-awoken-icon="56" for="search-awoken-56"></label><!--大SB--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="59" id="search-awoken-59" /><label class="awoken-icon" data-awoken-icon="59" for="search-awoken-59"></label><!--L盾--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="62" id="search-awoken-62" /><label class="awoken-icon" data-awoken-icon="62" for="search-awoken-62"></label><!--c珠--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="63" id="search-awoken-63" /><label class="awoken-icon" data-awoken-icon="63" for="search-awoken-63"></label><!--语音--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="63" id="search-awoken-63" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="63" for="search-awoken-63"></label><!--语音--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="64" id="search-awoken-64" /><label class="awoken-icon" data-awoken-icon="64" for="search-awoken-64"></label><!--奖励增加--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="65" id="search-awoken-65" /><label class="awoken-icon" data-awoken-icon="65" for="search-awoken-65"></label><!--HP- --></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="66" id="search-awoken-66" /><label class="awoken-icon" data-awoken-icon="66" for="search-awoken-66"></label><!--攻击- --></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="67" id="search-awoken-67" /><label class="awoken-icon" data-awoken-icon="67" for="search-awoken-67"></label><!--回复- --></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="65" id="search-awoken-65" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="65" for="search-awoken-65"></label><!--HP- --></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="66" id="search-awoken-66" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="66" for="search-awoken-66"></label><!--攻击- --></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="67" id="search-awoken-67" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="67" for="search-awoken-67"></label><!--回复- --></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="71" id="search-awoken-71" /><label class="awoken-icon" data-awoken-icon="71" for="search-awoken-71"></label><!--掉废--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="72" id="search-awoken-72" /><label class="awoken-icon" data-awoken-icon="72" for="search-awoken-72"></label><!--掉毒--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="73" id="search-awoken-73" /><label class="awoken-icon" data-awoken-icon="73" for="search-awoken-73"></label><!--2串火--></li>
@ -785,11 +818,25 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="80" id="search-awoken-80" /><label class="awoken-icon" data-awoken-icon="80" for="search-awoken-80"></label><!--4色--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="81" id="search-awoken-81" /><label class="awoken-icon" data-awoken-icon="81" for="search-awoken-81"></label><!--5色--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="82" id="search-awoken-82" /><label class="awoken-icon" data-awoken-icon="82" for="search-awoken-82"></label><!--12珠--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="83" id="search-awoken-83" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="83" for="search-awoken-83"></label><!--附加神类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="84" id="search-awoken-84" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="84" for="search-awoken-84"></label><!--附加龙类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="85" id="search-awoken-85" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="85" for="search-awoken-85"></label><!--附加恶魔类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="86" id="search-awoken-86" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="86" for="search-awoken-86"></label><!--附加机械类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="87" id="search-awoken-87" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="87" for="search-awoken-87"></label><!--附加平衡类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="88" id="search-awoken-88" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="88" for="search-awoken-88"></label><!--附加攻击类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="89" id="search-awoken-89" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="89" for="search-awoken-89"></label><!--附加体力类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="90" id="search-awoken-90" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="90" for="search-awoken-90"></label><!--附加回复类型--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="91" id="search-awoken-91" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="91" for="search-awoken-91"></label><!--附加火属性--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="92" id="search-awoken-92" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="92" for="search-awoken-92"></label><!--附加水属性--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="93" id="search-awoken-93" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="93" for="search-awoken-93"></label><!--附加木属性--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="94" id="search-awoken-94" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="94" for="search-awoken-94"></label><!--附加光属性--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="95" id="search-awoken-95" /><label class="awoken-icon unallowable-awoken" data-awoken-icon="95" for="search-awoken-95"></label><!--附加暗属性--></li>
</ul>
</div>
<div class="special-div">
<button class="special-add brown-button"></button>
<button class="special-clear brown-button"></button>
<button class="special-star brown-button"></button>
<ul class="special-filter-list">
<li><select class="special-filter"></select></li>
</ul>
@ -981,6 +1028,7 @@ var formation = new Formation(teamsCount,6);
<li class="latent-icon" data-latent-icon="40"></li><!--心横解转转-->
<li class="latent-icon" data-latent-icon="41"></li><!--U解禁消-->
<li class="latent-icon" data-latent-icon="42"></li><!--伤害上限解除-->
<li class="latent-icon" data-latent-icon="46"></li><!--心追解云封-->
</ul>
</div>
<div class="setting-row row-mon-skill">
@ -1090,8 +1138,8 @@ var formation = new Formation(teamsCount,6);
<li><input type="checkbox" class="attr-check" name="dungeon-attrs" value="4" id="dungeon-attr-4" /><label class="attr" data-attr-icon="4" for="dungeon-attr-4"></label></li><!---->
</ul>
<ul class="type-list">
<li><input type="checkbox" class="type-check" name="dungeon-types" value="4" id="dungeon-type-4" /><label class="type-icon" data-type-icon="4" for="dungeon-type-4"><!----></label></li>
<li><input type="checkbox" class="type-check" name="dungeon-types" value="5" id="dungeon-type-5" /><label class="type-icon" data-type-icon="5" for="dungeon-type-5"><!----></label></li>
<li><input type="checkbox" class="type-check" name="dungeon-types" value="4" id="dungeon-type-4" /><label class="type-icon" data-type-icon="4" for="dungeon-type-4"><!----></label></li>
<li><input type="checkbox" class="type-check" name="dungeon-types" value="7" id="dungeon-type-7" /><label class="type-icon" data-type-icon="7" for="dungeon-type-7"><!--惡魔--></label></li>
<li><input type="checkbox" class="type-check" name="dungeon-types" value="8" id="dungeon-type-8" /><label class="type-icon" data-type-icon="8" for="dungeon-type-8"><!--机械--></label></li>
<li><input type="checkbox" class="type-check" name="dungeon-types" value="1" id="dungeon-type-1" /><label class="type-icon" data-type-icon="1" for="dungeon-type-1"><!--平衡--></label></li>

BIN
sound/voice/en/padv367.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv368.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv369.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv370.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv371.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv372.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv373.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv374.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv375.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv376.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv377.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv378.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv379.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv380.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv381.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv382.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv383.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv384.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv385.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv386.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv387.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv388.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv389.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv390.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv391.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv392.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv393.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv394.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv395.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv396.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv397.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv398.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv399.wav Normal file

Binary file not shown.

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