diff --git a/script-json_data.js b/script-json_data.js index e7135935..56ca2d86 100644 --- a/script-json_data.js +++ b/script-json_data.js @@ -3001,12 +3001,13 @@ const specialSearchFunctions = (function() { function:cards=>cards.filter(card=>{ function is3x3(sk) { + const lineNum = 0b111; for (let si=0;si<3;si++) { if (sk[si] === sk[si+1] && sk[si] === sk[si+2] && //3行连续相等 (si>0?(sk[si-1] & sk[si]) ===0:true) && //如果上一行存在,并且无交集(and为0) (si+2<4?(sk[si+3] & sk[si]) ===0:true) && //如果下一行存在,并且无交集(and为0) - (sk[si] === 7 || sk[si] === 7<<1 || sk[si] === 7<<2 || sk[si] === 7<<3) //如果这一行满足任意2珠并联(二进制111=十进制7) + (sk[si] >= lineNum && Math.isPowerOfTwo(sk[si] / lineNum)) //如果这一行满足大于等于0b111并且除以0b111的倍数为2的幂(因为<<1等于乘以2) ) return true; } @@ -3027,6 +3028,37 @@ const specialSearchFunctions = (function() { return fragment; } }, + /*{name:"Create L shape",otLangName:{chs:"生成L字",cht:"生成L字"}, + function:cards=>cards.filter(card=>{ + function isL(sk) + { + const lineNum = 0b111; + for (let si=0;si<3;si++) + { + if (sk[si] === sk[si+1] && sk[si] === sk[si+2] && //3行连续相等 + (si>0?(sk[si-1] & sk[si]) ===0:true) && //如果上一行存在,并且无交集(and为0) + (si+2<4?(sk[si+3] & sk[si]) ===0:true) && //如果下一行存在,并且无交集(and为0) + (sk[si] >= lineNum && Math.isPowerOfTwo(sk[si] / lineNum)) //如果这一行满足大于等于0b111并且除以0b111的倍数为2的幂(因为<<1等于乘以2) + ) + return true; + } + return false; + } + const searchTypeArray = [176]; + const skill = getCardActiveSkill(card, searchTypeArray); + return skill && is3x3(skill.params); + }), + addition:card=>{ + const searchTypeArray = [176]; + const skill = getCardActiveSkill(card, searchTypeArray); + if (!skill) return; + const sk = skill.params; + const fragment = document.createDocumentFragment(); + fragment.appendChild(document.createTextNode(`3×3`)); + fragment.appendChild(createOrbsList(sk[5])); + return fragment; + } + },*/ {name:"Create a vertical",otLangName:{chs:"产竖",cht:"產豎"}, function:cards=>cards.filter(card=>{ const searchTypeArray = [127]; @@ -3091,17 +3123,14 @@ const specialSearchFunctions = (function() { function isRow(skill) { const sk = skill.params; - if (skill.type === 128) //普通横 - {return true;} - else if (skill.type === 71) //花火 - {return sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined).length === 1} - else if (skill.type === 176) //特殊形状 - { - for (let si=0;si<5;si++) - { - if ((sk[si] & 63) === 63) - return true; - } + if (skill.type === 128) {//普通横 + return true; + } + else if (skill.type === 71) {//花火 + return sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined).length === 1 + } + else if (skill.type === 176) {//特殊形状 + return sk.some(n=>(n & 0b111111) === 0b111111) } return false; } diff --git a/script-universal_function.js b/script-universal_function.js index 3bfb35eb..6e957a08 100644 --- a/script-universal_function.js +++ b/script-universal_function.js @@ -265,7 +265,16 @@ Array.prototype.nodeJoin = function(separator) Math.randomInteger = function(max, min = 0) { return this.floor(this.random() * (max - min + 1) + min); } - +Math.isPowerOfTwo = function(n) { + if (Number.isInteger(0) && n > 0) + return (n & (n - 1)) === 0; + else + return false; +} +Number.prototype.notNeighbour = function() { + const num = this.valueOf(); + return ~num & (num << 1 | num >> 1); +} //将二进制flag转为数组 function flags(num) { const arr = [];