diff --git a/script-universal_function.js b/script-universal_function.js
index 7d1ffb52..e7e902c0 100644
--- a/script-universal_function.js
+++ b/script-universal_function.js
@@ -886,31 +886,52 @@ function searchCards(cards, {attrs: sAttrs, fixMainColor, types, typeAndOr, rare
!card.stackable); //不可堆叠
//属性
const anyAttrsFlag = 0b1111101;
- const anyAttrs = sAttrs.map(attr=>attr === 0 || (attr & anyAttrsFlag) == anyAttrsFlag);
- if (anyAttrs.some(any=>!any)) { //当任一属性不为任意颜色时才需要筛选属性
- const attrNums = sAttrs.filter(attr=>fixMainColor || attr > 0 && (attr & anyAttrsFlag) !== anyAttrsFlag) //如果固定顺序就全部返回,否则只返回不为任意色的不考虑顺序
+ const isAnyAttrs = sAttrs.map(attr=>attr === 0 || (attr & anyAttrsFlag) == anyAttrsFlag);
+ if (isAnyAttrs.some(any=>!any)) { //当任一属性不为任意颜色时才需要筛选属性,否则跳过属性筛选
+ //如果固定顺序就直接使用当前颜色顺序;否则不考虑顺序时,去除任意色
+ const attrNums = sAttrs.filter(attr=>fixMainColor || attr > 0 && (attr & anyAttrsFlag) !== anyAttrsFlag)
.map(attr=>{
- let attrNum = flags(attr);
+ const attrNum = flags(attr);
if (attrNum.includes(6)) attrNum.push(undefined,-1); //如果是包含6的,就添加-1和undefined的值
return attrNum;
});
if (fixMainColor) {//如果固定了顺序
cardsRange = cardsRange.filter(({attrs:cAttrs}) => {
//默认逻辑为,只要不是any,就判断这个颜色是否包含了对应的颜色
- //只选第一属性的时候,且第一属性为无主属性的时候,也显示副属性等于主属性的
- return (anyAttrs[0] || attrNums[0].includes(cAttrs[0]) || anyAttrs[1] && cAttrs[0] === 6 && attrNums[0].includes(cAttrs[1])) &&
- (anyAttrs[1] || attrNums[1].includes(cAttrs[1])) &&
- (anyAttrs[2] || attrNums[2].includes(cAttrs[2]));
+ return (isAnyAttrs[0] || attrNums[0].includes(cAttrs[0]) ||
+ isAnyAttrs[1] && cAttrs[0] === 6 && attrNums[0].includes(cAttrs[1])) && //只选第一属性的时候,且第一属性为无主属性的时候,也显示副属性等于主属性的
+ (isAnyAttrs[1] || attrNums[1].includes(cAttrs[1])) &&
+ (isAnyAttrs[2] || attrNums[2].includes(cAttrs[2]));
});
}
else {//不限定顺序时
- cardsRange = cardsRange.filter(({attrs:cAttrs}) => {
- let remainAttrNum = cAttrs.reduce((pre, attr)=>{
- let findIndex = pre.findIndex(attrNum=>attrNum.includes(attr)); //每找到一组属性就去掉一个
- if (findIndex >= 0) return pre.slice(0,findIndex).concat(pre.slice(findIndex+1));
- else return pre;
- }, attrNums);
- return remainAttrNum.length === 0;
+ const attrFlags = sAttrs.filter(attr=>attr > 0 && (attr & anyAttrsFlag) !== anyAttrsFlag);
+ const notAnyAttrsCount = isAnyAttrs.filter(b=>!b).length;
+ cardsRange = cardsRange.filter(({attrs:cAttrs_, id}) => {
+ const cAttrs = cAttrs_.concat();
+ if (cAttrs[1] == undefined) cAttrs[1] = 6;
+ if (cAttrs[2] == undefined) cAttrs[2] = 6;
+ /*
+ 我也不知道为什么这个代码可以跑,没学过矩阵运算,乱猜的,好像结果可以用,结果发现矩阵好像根本没用
+ */
+ const matrix3x3 = attrFlags.map(sAttr=>{
+ return cAttrs.map(cAttr=>1 << cAttr & sAttr);
+ });
+ const rowValues = matrix3x3.map(row=>row.reduce((p,v)=>p | v,0)); //每个属性都有 filter 匹配
+ // const columValues = []; //每个 filter 都能匹配属性
+ // for (let i = 0; i < notAnyAttrsCount; i++) {
+ // const columValue = matrix3x3.reduce((p,v)=>p | v[i],0);
+ // columValues.push(columValue);
+ // }
+
+ const crossValue = cAttrs.map((cAttr, idx, arr)=> {
+ return arr.filter(item=>item===cAttr).length <= rowValues.filter(item=>item & 1 << cAttr).length;
+ });
+ const match = rowValues.every(Boolean) && crossValue.every(Boolean);
+ // if (match) {
+ // console.debug("id: %d, matrix3x3: %o, rowValues: %o, columValues: %o, crossValue: %o", id, matrix3x3, rowValues, columValues, crossValue);
+ // }
+ return match;
});
}
}
diff --git a/script.js b/script.js
index 1031f80e..762fb47b 100644
--- a/script.js
+++ b/script.js
@@ -4667,6 +4667,7 @@ function initialize() {
}
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_attr_lists = Array.from(searchBox.querySelectorAll(".attrs-div .attr-list")).map(list=>Array.from(list.querySelectorAll("input[type=\"radio\"]")));
const s_fixMainColor = searchBox.querySelector("#fix-main-color");
const s_typesDiv = searchBox.querySelector(".types-div");
@@ -4675,23 +4676,21 @@ function initialize() {
const s_typesLi = Array.from(s_typesUl.querySelectorAll("li"));
const s_types = s_typesLi.map(li=>li.querySelector(".type-check")); //checkbox集合
const attrPreview = searchBox.querySelector(".attrs-div .monster");
-
- //3种属性选择的预览
const s_attr_preview_attrs = Array.from(attrPreview.querySelectorAll(".attrs .attr"));
- function s_attr_onclick(){
- const attrIdx = parseInt(this.name[this.name.length-1],10) - 1;
- const valueFlag = parseInt(this.value, 2);
- const values = flags(valueFlag);
- let attr = values.length === 1 ? values[0] : 'any';
- if (attrIdx>0 && attr === 6) attr = -1;
- s_attr_preview_attrs[attrIdx].dataset.attr = attr;
+
+ const s_AttrForm = document.getElementById("search-attr");
+ s_AttrForm.onchange = function(event){
+ event?.preventDefault();
+ const formData = new FormData(this);
+ for (let i = 0; i <= 2; i++) {
+ const attr = parseInt(formData.get(`attr-${i+1}`),10);
+ s_attr_preview_attrs[i].dataset.attr = Number.isNaN(attr) ? "any" : attr;
+ }
}
- s_attr_lists.forEach(s_attr_list=>
- s_attr_list.forEach(s_attr=>{
- s_attr.onclick = s_attr_onclick;
- if (s_attr.checked) s_attr.onclick();
- })
- );
+ s_AttrForm.onreset = function(event){
+ s_attr_preview_attrs.forEach(node=>node.dataset.attr = "any");
+ };
+
//可以自行打开图片设定头像的彩蛋
const avatarSelect = attrPreview.querySelector("#avatar-select");
const customAvatar = attrPreview.querySelector(".custom-avatar");
@@ -5133,11 +5132,12 @@ function initialize() {
searchBox.recoverySearchStatus = function({attrs, fixMainColor, types, typeAndOr, rares, awokens, sawokens, equalAk, incSawoken, canAssist, canLv110, is8Latent, notWeapon, specialFilters}) {
//属性这里是用的2进制写
attrs.forEach((attr, ai)=>{
- const attr_list = s_attr_lists[ai];
- let ipt = attr_list.find(opt=>parseInt(opt.value,2) == attr) || attr_list[0];
- ipt.checked = true;
- ipt.onclick();
+ const inputs = Array.from(document.getElementsByName(`attr-${ai+1}`));
+ inputs.forEach(ipt=>{
+ ipt.checked = Boolean(attr & 1 << parseInt(ipt.value, 10));
+ });
});
+ s_AttrForm.onchange();
s_fixMainColor.checked = fixMainColor;
s_types.forEach(opt=>opt.checked = types.includes(parseInt(opt.value,10)));
s_typeAndOr.checked = typeAndOr;
@@ -5178,7 +5178,14 @@ function initialize() {
}
//导出当前的搜索状态
searchBox.getSearchOptions = function(){
- const attrs = s_attr_lists.map(list=>Number(returnRadiosValue(list)) || 0);
+ const attrs = (function(formData){
+ const attrsArr = [];
+ for (let i = 0; i <= 2; i++) {
+ const attrNum = reflags(formData.getAll(`attr-${i+1}`).map(Str2Int));
+ attrsArr.push(attrNum);
+ }
+ return attrsArr;
+ })(new FormData(s_AttrForm));
const types = returnCheckBoxsValues(s_types).map(Str2Int);
const rares = returnCheckBoxsValues(s_rareChecks).map(Str2Int);
const sawokens = returnCheckBoxsValues(s_sawokens).map(Str2Int);
@@ -5248,10 +5255,7 @@ function initialize() {
searchMonList.classList.add(className_displayNone);
};
searchClear.onclick = function() { //清空搜索选项
- s_attr_lists.forEach(list=>{
- list[0].checked = true;
- list[0].onclick();
- });
+ s_AttrForm.reset();
s_types.forEach(t => {
t.checked = false;
});
diff --git a/service-worker.js b/service-worker.js
index dffe644e..2053f4cd 100644
--- a/service-worker.js
+++ b/service-worker.js
@@ -25483,7 +25483,7 @@ const cachesMap = new Map([
],
[
"fonts/fa-solid-900.woff2",
- "6c4eee562650e53cee32496bdfbe534b"
+ "1ec0ba058c021acf7feaa18081445d63"
],
[
"fonts/FOT-KurokaneStd-EB.woff2",
@@ -25503,7 +25503,7 @@ const cachesMap = new Map([
],
[
"multi.html",
- "475bd7b4755f476d625e34082c4a780a"
+ "f30df83eaac9f7df6dbb422b2df2d11f"
],
[
"script-custom_elements.js",
@@ -25519,15 +25519,15 @@ const cachesMap = new Map([
],
[
"script-universal_function.js",
- "9545d2373ad30a645163ee78561c12a9"
+ "d0be9845a7b584b3a5699e39c55c146d"
],
[
"script.js",
- "847e2e54a07c97f5bf0b6df87848b3b4"
+ "c8873f00986bca39236317543a3a3985"
],
[
"solo.html",
- "fd72b47437620ac3d36c1c14c6dca18b"
+ "19ece08cfb767949c4ec60f1621bb456"
],
[
"style-monsterimages.css",
@@ -25535,7 +25535,7 @@ const cachesMap = new Map([
],
[
"style.css",
- "80ff7251f60ab0ba92b9acc76fa8382c"
+ "8d9ff894662f1ab5ea926439d43bc820"
],
[
"temp.js",
@@ -25543,11 +25543,11 @@ const cachesMap = new Map([
],
[
"triple.html",
- "a09e3bf9f4d43be385ec83b772a33ff8"
+ "bcb2e5b2bec153ec15bc97e9f7c0488e"
],
[
"languages/en.css",
- "f8865fcbe06b9a998ffadb31bd491d25"
+ "e5a21ebe0953c072015a9ffc89a32589"
],
[
"languages/en.js",
@@ -25555,7 +25555,7 @@ const cachesMap = new Map([
],
[
"languages/ja.css",
- "2388b1bcb557d2e4e3138ab227697d13"
+ "3f799231dc30a264b17fd0c56963bce7"
],
[
"languages/ja.js",
@@ -25563,7 +25563,7 @@ const cachesMap = new Map([
],
[
"languages/ko.css",
- "e1c95e5707f59ea1889d6b3623cf5ceb"
+ "530f343e7422816a3db9fbeb0b6c64ed"
],
[
"languages/ko.js",
@@ -25575,7 +25575,7 @@ const cachesMap = new Map([
],
[
"languages/zh-hans.css",
- "aeb10819542512dfa75ed2252840fc99"
+ "3ce8d2a490a532f4d5084bbe46c00cbd"
],
[
"languages/zh-hans.js",
@@ -25583,7 +25583,7 @@ const cachesMap = new Map([
],
[
"languages/zh-hant.css",
- "00f2e72323d77860257fce2827216a46"
+ "96920dbb7191e9e32c948165b820a3b7"
],
[
"languages/zh-hant.js",
diff --git a/solo.html b/solo.html
index 3fcea29c..d149c253 100644
--- a/solo.html
+++ b/solo.html
@@ -570,41 +570,38 @@ const teamsCount = 1;
-
+
diff --git a/style.css b/style.css
index cc6376d4..a093fa1d 100644
--- a/style.css
+++ b/style.css
@@ -284,7 +284,7 @@ input[type="checkbox"].switch-ipt+label::before{
width: 2em;
height: 1.1em;
border-radius: 0.5em;
- background-image: radial-gradient(white 50%, transparent 50.1%);
+ background-image: radial-gradient(white 40%, black 50%, transparent 50%);
background-size: 1.1em 1.1em;
background-repeat: no-repeat;
transition: .3s ease-out;
@@ -1671,11 +1671,11 @@ body:not(.solo) .awoken-icon[data-awoken-icon="64"]::after
#search-attr {
display: grid;
grid-auto-rows: min-content;
- grid-template-columns: 100px 400px 30px auto;
+ grid-template-columns: 100px 340px 30px auto;
grid-gap: 3px;
}
#search-attr .options {
- grid-column: 1 / 4;
+ grid-column: 1 / 5;
grid-row: 2 / 3;
}
#search-attr .monster .custom-avatar {
@@ -1708,9 +1708,13 @@ body:not(.solo) .awoken-icon[data-awoken-icon="64"]::after
#search-attr .attr-list>li {
width: 55px;
}
-.search-box .attrs-div .attr-list label {
+#search-attr .attr-list input {
+ display: none;
+}
+#search-attr .attr-list label {
width: 100%;
height: 100%;
+ opacity: unset;
}
.types-div::before,
.awoken-div::before,
@@ -4190,7 +4194,7 @@ body.external-link-support #external-support{
background-repeat: no-repeat;
}
.icon-skill,
-.attrs-div .attr-list .attr,
+#search-attr .attr-list .attr,
.skill-datail-parsed icon:where(.attr,.orb,.type-icon,.awoken-icon)
{
vertical-align: bottom;
diff --git a/triple.html b/triple.html
index 32d15f25..9eb84a36 100644
--- a/triple.html
+++ b/triple.html
@@ -57,23 +57,23 @@ const teamsCount = 3;
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -1503,51 +1503,51 @@ const teamsCount = 3;
-
+