pref: divide `get.is`.

This commit is contained in:
Ansolve 2024-01-04 18:14:28 +08:00
parent 903ce71ad7
commit b35662018d
No known key found for this signature in database
GPG Key ID: 2F2873AC9538CC2D
2 changed files with 449 additions and 435 deletions

View File

@ -6,441 +6,7 @@ import { status as _status } from '../status/index.js';
import { UI as ui } from '../ui/index.js';
import { GNC as gnc } from '../gnc/index.js';
export class Is extends Uninstantable {
/**
* 判断是否为进攻坐骑
* @param { Card | VCard } card
* @param { false | Player } [player]
* @returns { boolean }
*/
static attackingMount(card, player) {
const subtype = get.subtype(card, player);
if (subtype == 'equip4') return true;
else if (subtype == 'equip6') {
const info = get.info(card, player), distance = info.distance;
if (!distance) return false;
if (distance.globalFrom && !info.notMount) return true;
}
return false;
}
/**
* 判断是否为防御坐骑
* @param { Card | VCard } card
* @param { false | Player } [player]
* @returns { boolean }
*/
static defendingMount(card, player) {
const subtype = get.subtype(card, player);
if (subtype == 'equip3') return true;
else if (subtype == 'equip6') {
const info = get.info(card, player), distance = info.distance;
if (!distance) return false;
if (distance.globalTo && !info.notMount) return true;
}
return false;
}
/**
* 判断坐骑栏是否被合并
* @returns { boolean }
*/
static mountCombined() {
if (lib.configOL.mount_combine) {
return lib.configOL.mount_combine;
}
else if (typeof _status.mountCombined != 'boolean') {
_status.mountCombined = lib.config.mount_combine;
}
return _status.mountCombined;
}
/**
* 判断传入的参数的属性是否相同参数可以为卡牌卡牌信息属性等
* @param {...} infos 要判断的属性列表
* @param {boolean} every 是否判断每一个传入的属性是否完全相同而不是存在部分相同
*/
static sameNature() {
let processedArguments = [], every = false;
Array.from(arguments).forEach(argument => {
if (typeof argument == 'boolean') every = argument;
else if (argument) processedArguments.push(argument);
});
if (!processedArguments.length) return true;
if (processedArguments.length == 1) {
const argument = processedArguments[0];
if (!Array.isArray(argument)) return false;
if (!argument.length) return true;
if (argument.length == 1) return false;
processedArguments = argument;
}
const naturesList = processedArguments.map(card => {
if (typeof card == 'string') return card.split(lib.natureSeparator);
else if (Array.isArray(card)) return card;
return get.natureList(card || {});
});
const testingNaturesList = naturesList.slice(0, naturesList.length - 1);
if (every) return testingNaturesList.every((natures, index) => naturesList.slice(index + 1).every(testingNatures => testingNatures.length == natures.length && testingNatures.every(nature => natures.includes(nature))));
return testingNaturesList.every((natures, index) => {
const comparingNaturesList = naturesList.slice(index + 1);
if (natures.length) return natures.some(nature => comparingNaturesList.every(testingNatures => testingNatures.includes(nature)));
return comparingNaturesList.every(testingNatures => !testingNatures.length);
});
}
/**
* 判断传入的参数的属性是否不同参数可以为卡牌卡牌信息属性等
* @param ...infos 要判断的属性列表
* @param every {boolean} 是否判断每一个传入的属性是否完全不同而不是存在部分不同
*/
static differentNature() {
let processedArguments = [], every = false;
Array.from(arguments).forEach(argument => {
if (typeof argument == 'boolean') every = argument;
else if (argument) processedArguments.push(argument);
});
if (!processedArguments.length) return false;
if (processedArguments.length == 1) {
const argument = processedArguments[0];
if (!Array.isArray(argument)) return true;
if (!argument.length) return false;
if (argument.length == 1) return true;
processedArguments = argument;
}
const naturesList = processedArguments.map(card => {
if (typeof card == 'string') return card.split(lib.natureSeparator);
else if (Array.isArray(card)) return card;
return get.natureList(card || {});
});
const testingNaturesList = naturesList.slice(0, naturesList.length - 1);
if (every) return testingNaturesList.every((natures, index) => naturesList.slice(index + 1).every(testingNatures => testingNatures.every(nature => !natures.includes(nature))));
return testingNaturesList.every((natures, index) => {
const comparingNaturesList = naturesList.slice(index + 1);
if (natures.length) return natures.some(nature => comparingNaturesList.every(testingNatures => !testingNatures.length || testingNatures.some(testingNature => testingNature != nature)));
return comparingNaturesList.every(testingNatures => testingNatures.length);
});
}
/**
* 判断一张牌是否为明置手牌
* @param { Card } card
*/
static shownCard(card) {
if (!card) return false;
const gaintag = card.gaintag;
return Array.isArray(gaintag) && gaintag.some(tag => tag.startsWith('visible_'));
}
/**
* 是否是虚拟牌
* @param { Card | VCard } card
*/
// @ts-ignore
static vituralCard(card) {
return card.isCard || (!("cards" in card) || !Array.isArray(card.cards) || card.cards.length == 0);
}
/**
* 是否是转化牌
* @param { Card | VCard } card
*/
// @ts-ignore
static convertedCard(card) {
return !card.isCard && ("cards" in card) && Array.isArray(card.cards) && card.cards.length > 0;
}
/**
* 是否是实体牌
* @param { Card | VCard } card
*/
// @ts-ignore
static ordinaryCard(card) { return card.isCard && ("cards" in card) && Array.isArray(card.cards) && card.cards.length == 1 }
/**
* 押韵判断
* @param { string } str1
* @param { string } str2
*/
static yayun(str1, str2) {
if (str1 == str2) return true;
let pinyin1 = get.pinyin(str1, false), pinyin2 = get.pinyin(str2, false);
if (!pinyin1.length || !pinyin2.length) return false;
let pron1 = pinyin1[pinyin1.length - 1], pron2 = pinyin2[pinyin2.length - 1];
if (pron1 == pron2) return true;
return get.yunjiao(pron1) == get.yunjiao(pron2);
}
/**
* @param { string } skill 技能id
* @param { Player } player 玩家
* @returns
*/
static blocked(skill, player) {
if (!player.storage.skill_blocker || !player.storage.skill_blocker.length) return false;
for (let i of player.storage.skill_blocker) {
if (lib.skill[i] && lib.skill[i].skillBlocker && lib.skill[i].skillBlocker(skill, player)) return true;
}
return false;
}
/**
* 是否是双势力武将
* @param { string } name
* @param { string[] } array
* @returns { boolean | string[] }
*/
static double(name, array) {
const extraInformations = get.character(name, 4);
if (!extraInformations) return false;
for (const extraInformation of extraInformations) {
if (!extraInformation.startsWith('doublegroup:')) continue;
return array ? extraInformation.split(':').slice(1) : true;
}
return false;
}
/**
* Check if the card has a Yingbian condition
*
* 检测此牌是否具有应变条件
* @param { Card | VCard } card
*/
static yingbianConditional(card) { return get.is.complexlyYingbianConditional(card) || get.is.simplyYingbianConditional(card) }
/**
* @param { Card | VCard } card
*/
static complexlyYingbianConditional(card) {
for (const key of lib.yingbian.condition.complex.keys()) {
if (get.cardtag(card, `yingbian_${key}`)) return true;
}
return false;
}
/**
* @param { Card | VCard } card
*/
static simplyYingbianConditional(card) {
for (const key of lib.yingbian.condition.simple.keys()) {
if (get.cardtag(card, `yingbian_${key}`)) return true;
}
return false;
}
/**
* Check if the card has a Yingbian effect
*
* 检测此牌是否具有应变效果
*
* @param { Card | VCard } card
*/
static yingbianEffective(card) {
for (const key of lib.yingbian.effect.keys()) {
if (get.cardtag(card, `yingbian_${key}`)) return true;
}
return false;
}
/**
* @param { Card | VCard } card
*/
static yingbian(card) { return get.is.yingbianConditional(card) || get.is.yingbianEffective(card) }
/**
* @param { string } [substring]
*/
static emoji(substring) {
if (substring) {
const reg = new RegExp("[~#^$@%&!?%*]", 'g');
if (substring.match(reg)) {
return true;
}
for (let i = 0; i < substring.length; i++) {
const hs = substring.charCodeAt(i);
if (0xd800 <= hs && hs <= 0xdbff) {
if (substring.length > 1) {
const ls = substring.charCodeAt(i + 1);
const uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f) {
return true;
}
}
}
else if (substring.length > 1) {
const ls = substring.charCodeAt(i + 1);
if (ls == 0x20e3) {
return true;
}
}
else {
if (0x2100 <= hs && hs <= 0x27ff) {
return true;
}
else if (0x2B05 <= hs && hs <= 0x2b07) {
return true;
}
else if (0x2934 <= hs && hs <= 0x2935) {
return true;
}
else if (0x3297 <= hs && hs <= 0x3299) {
return true;
}
else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030
|| hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b
|| hs == 0x2b50) {
return true;
}
}
}
}
return false;
}
/**
* @param { string } str
*/
static banWords(str) { return get.is.emoji(str) || window.bannedKeyWords.some(item => str.includes(item)) }
/**
* @param { GameEventPromise } event
*/
// @ts-ignore
static converted(event) { return !(event.card && event.card.isCard) }
static safari() { return userAgent.indexOf('safari') != -1 && userAgent.indexOf('chrome') == -1 }
/**
* @param { (Card | VCard)[]} cards
*/
// @ts-ignore
static freePosition(cards) { return !cards.some(card => !card.hasPosition || card.hasPosition()) }
/**
* @param { string } name
* @param { boolean } item
*/
static nomenu(name, item) {
const menus = ['system', 'menu'];
const configs = {
show_round_menu: lib.config.show_round_menu,
round_menu_func: lib.config.round_menu_func,
touchscreen: lib.config.touchscreen,
swipe_up: lib.config.swipe_up,
swipe_down: lib.config.swipe_down,
swipe_left: lib.config.swipe_left,
swipe_right: lib.config.swipe_right,
right_click: lib.config.right_click,
phonelayout: lib.config.phonelayout
};
configs[name] = item;
if (!configs.phonelayout) return false;
if (configs.show_round_menu && menus.includes(configs.round_menu_func)) {
return false;
}
if (configs.touchscreen) {
if (menus.includes(configs.swipe_up)) return false;
if (menus.includes(configs.swipe_down)) return false;
if (menus.includes(configs.swipe_left)) return false;
if (menus.includes(configs.swipe_right)) return false;
}
else {
if (configs.right_click == 'config') return false;
}
if (name) {
setTimeout(function () {
alert('请将至少一个操作绑定为显示按钮或打开菜单,否则将永远无法打开菜单');
});
}
return true;
}
static altered() { return false; }
/*
skill=>{
return false;
// if(_status.connectMode) return true;
// return !lib.config.vintageSkills.includes(skill);
},
*/
/**
* @param { any } obj
* @returns { boolean }
*/
static node(obj) {
return Object.prototype.toString.call(obj).startsWith('[object HTML');
}
/**
* @param { any } obj
*/
static div(obj) { return Object.prototype.toString.call(obj) === '[object HTMLDivElement]' }
/**
* @param { any } obj
*/
static map(obj) { return Object.prototype.toString.call(obj) === '[object Map]' }
/**
* @param { any } obj
*/
static set(obj) { return Object.prototype.toString.call(obj) === '[object Set]' }
/**
* @param { any } obj
*/
static object(obj) { return Object.prototype.toString.call(obj) === '[object Object]' }
/**
* @overload
* @param { Function } func
* @returns { false }
*/
/**
* @overload
* @param { number | [number, number] } func
* @returns { boolean }
*/
static singleSelect(func) {
if (typeof func == 'function') return false;
const select = get.select(func);
return select[0] == 1 && select[1] == 1;
}
/**
* @param { string | Player } name
*/
static jun(name) {
if (get.mode() == 'guozhan') {
if (name instanceof lib.element.Player) {
if (name.isUnseen && name.isUnseen(0)) return false;
name = name.name1;
}
if (typeof name == 'string' && name.startsWith('gz_jun_')) {
return true;
}
}
return false;
}
static versus() { return !_status.connectMode && get.mode() == 'versus' && _status.mode == 'three' }
static changban() { return get.mode() == 'single' && _status.mode == 'changban' }
static single() { return get.mode() == 'single' && _status.mode == 'normal' }
/**
* @param { Player } [player]
*/
static mobileMe(player) { return (game.layout == 'mobile' || game.layout == 'long') && !game.chess && player && player.dataset.position == '0' }
static newLayout() { return game.layout != 'default' }
static phoneLayout() {
if (!lib.config.phonelayout) return false;
return (game.layout == 'mobile' || game.layout == 'long' || game.layout == 'long2' || game.layout == 'nova');
}
static singleHandcard() { return game.singleHandcard || game.layout == 'mobile' || game.layout == 'long' || game.layout == 'long2' || game.layout == 'nova' }
/**
* @param { Player } player
*/
static linked2(player) {
if (game.chess) return true;
if (lib.config.link_style2 != 'rotate') return true;
// if(game.chess) return false;
if (game.layout == 'long' || game.layout == 'long2' || game.layout == 'nova') return true;
if (player.dataset.position == '0') {
return ui.arena.classList.contains('oblongcard');
}
return false;
}
/**
* @param { {} } obj
*/
static empty(obj) { return Object.keys(obj).length == 0 }
/**
* @param { string } str
*/
static pos(str) { return str == 'h' || str == 'e' || str == 'j' || str == 'he' || str == 'hj' || str == 'ej' || str == 'hej' }
/**
* @param { string } skill
* @param { Player } player
* @returns
*/
static locked(skill, player) {
const info = lib.skill[skill];
if (typeof info.locked == 'function') return info.locked(skill, player);
if (info.locked == false) return false;
if (info.trigger && info.forced) return true;
if (info.mod) return true;
if (info.locked) return true;
return false;
}
}
import { Is } from "./is.js";
export class Get extends Uninstantable {
static is = Is;
@ -5007,3 +4573,7 @@ export class Get extends Uninstantable {
}
export const get = Get;
export {
Is
}

444
noname/get/is.js Normal file
View File

@ -0,0 +1,444 @@
import { userAgent, Uninstantable, GeneratorFunction, AsyncFunction } from "../util/index.js";
import { AI as ai } from '../ai/index.js';
import { Game as game } from '../game/index.js';
import { Library as lib } from '../library/index.js';
import { status as _status } from '../status/index.js';
import { UI as ui } from '../ui/index.js';
import { GNC as gnc } from '../gnc/index.js';
import { Get as get } from "./index.js";
export class Is extends Uninstantable {
/**
* 判断是否为进攻坐骑
* @param { Card | VCard } card
* @param { false | Player } [player]
* @returns { boolean }
*/
static attackingMount(card, player) {
const subtype = get.subtype(card, player);
if (subtype == 'equip4') return true;
else if (subtype == 'equip6') {
const info = get.info(card, player), distance = info.distance;
if (!distance) return false;
if (distance.globalFrom && !info.notMount) return true;
}
return false;
}
/**
* 判断是否为防御坐骑
* @param { Card | VCard } card
* @param { false | Player } [player]
* @returns { boolean }
*/
static defendingMount(card, player) {
const subtype = get.subtype(card, player);
if (subtype == 'equip3') return true;
else if (subtype == 'equip6') {
const info = get.info(card, player), distance = info.distance;
if (!distance) return false;
if (distance.globalTo && !info.notMount) return true;
}
return false;
}
/**
* 判断坐骑栏是否被合并
* @returns { boolean }
*/
static mountCombined() {
if (lib.configOL.mount_combine) {
return lib.configOL.mount_combine;
}
else if (typeof _status.mountCombined != 'boolean') {
_status.mountCombined = lib.config.mount_combine;
}
return _status.mountCombined;
}
/**
* 判断传入的参数的属性是否相同参数可以为卡牌卡牌信息属性等
* @param {...} infos 要判断的属性列表
* @param {boolean} every 是否判断每一个传入的属性是否完全相同而不是存在部分相同
*/
static sameNature() {
let processedArguments = [], every = false;
Array.from(arguments).forEach(argument => {
if (typeof argument == 'boolean') every = argument;
else if (argument) processedArguments.push(argument);
});
if (!processedArguments.length) return true;
if (processedArguments.length == 1) {
const argument = processedArguments[0];
if (!Array.isArray(argument)) return false;
if (!argument.length) return true;
if (argument.length == 1) return false;
processedArguments = argument;
}
const naturesList = processedArguments.map(card => {
if (typeof card == 'string') return card.split(lib.natureSeparator);
else if (Array.isArray(card)) return card;
return get.natureList(card || {});
});
const testingNaturesList = naturesList.slice(0, naturesList.length - 1);
if (every) return testingNaturesList.every((natures, index) => naturesList.slice(index + 1).every(testingNatures => testingNatures.length == natures.length && testingNatures.every(nature => natures.includes(nature))));
return testingNaturesList.every((natures, index) => {
const comparingNaturesList = naturesList.slice(index + 1);
if (natures.length) return natures.some(nature => comparingNaturesList.every(testingNatures => testingNatures.includes(nature)));
return comparingNaturesList.every(testingNatures => !testingNatures.length);
});
}
/**
* 判断传入的参数的属性是否不同参数可以为卡牌卡牌信息属性等
* @param ...infos 要判断的属性列表
* @param every {boolean} 是否判断每一个传入的属性是否完全不同而不是存在部分不同
*/
static differentNature() {
let processedArguments = [], every = false;
Array.from(arguments).forEach(argument => {
if (typeof argument == 'boolean') every = argument;
else if (argument) processedArguments.push(argument);
});
if (!processedArguments.length) return false;
if (processedArguments.length == 1) {
const argument = processedArguments[0];
if (!Array.isArray(argument)) return true;
if (!argument.length) return false;
if (argument.length == 1) return true;
processedArguments = argument;
}
const naturesList = processedArguments.map(card => {
if (typeof card == 'string') return card.split(lib.natureSeparator);
else if (Array.isArray(card)) return card;
return get.natureList(card || {});
});
const testingNaturesList = naturesList.slice(0, naturesList.length - 1);
if (every) return testingNaturesList.every((natures, index) => naturesList.slice(index + 1).every(testingNatures => testingNatures.every(nature => !natures.includes(nature))));
return testingNaturesList.every((natures, index) => {
const comparingNaturesList = naturesList.slice(index + 1);
if (natures.length) return natures.some(nature => comparingNaturesList.every(testingNatures => !testingNatures.length || testingNatures.some(testingNature => testingNature != nature)));
return comparingNaturesList.every(testingNatures => testingNatures.length);
});
}
/**
* 判断一张牌是否为明置手牌
* @param { Card } card
*/
static shownCard(card) {
if (!card) return false;
const gaintag = card.gaintag;
return Array.isArray(gaintag) && gaintag.some(tag => tag.startsWith('visible_'));
}
/**
* 是否是虚拟牌
* @param { Card | VCard } card
*/
// @ts-ignore
static vituralCard(card) {
return card.isCard || (!("cards" in card) || !Array.isArray(card.cards) || card.cards.length == 0);
}
/**
* 是否是转化牌
* @param { Card | VCard } card
*/
// @ts-ignore
static convertedCard(card) {
return !card.isCard && ("cards" in card) && Array.isArray(card.cards) && card.cards.length > 0;
}
/**
* 是否是实体牌
* @param { Card | VCard } card
*/
// @ts-ignore
static ordinaryCard(card) { return card.isCard && ("cards" in card) && Array.isArray(card.cards) && card.cards.length == 1 }
/**
* 押韵判断
* @param { string } str1
* @param { string } str2
*/
static yayun(str1, str2) {
if (str1 == str2) return true;
let pinyin1 = get.pinyin(str1, false), pinyin2 = get.pinyin(str2, false);
if (!pinyin1.length || !pinyin2.length) return false;
let pron1 = pinyin1[pinyin1.length - 1], pron2 = pinyin2[pinyin2.length - 1];
if (pron1 == pron2) return true;
return get.yunjiao(pron1) == get.yunjiao(pron2);
}
/**
* @param { string } skill 技能id
* @param { Player } player 玩家
* @returns
*/
static blocked(skill, player) {
if (!player.storage.skill_blocker || !player.storage.skill_blocker.length) return false;
for (let i of player.storage.skill_blocker) {
if (lib.skill[i] && lib.skill[i].skillBlocker && lib.skill[i].skillBlocker(skill, player)) return true;
}
return false;
}
/**
* 是否是双势力武将
* @param { string } name
* @param { string[] } array
* @returns { boolean | string[] }
*/
static double(name, array) {
const extraInformations = get.character(name, 4);
if (!extraInformations) return false;
for (const extraInformation of extraInformations) {
if (!extraInformation.startsWith('doublegroup:')) continue;
return array ? extraInformation.split(':').slice(1) : true;
}
return false;
}
/**
* Check if the card has a Yingbian condition
*
* 检测此牌是否具有应变条件
* @param { Card | VCard } card
*/
static yingbianConditional(card) { return get.is.complexlyYingbianConditional(card) || get.is.simplyYingbianConditional(card) }
/**
* @param { Card | VCard } card
*/
static complexlyYingbianConditional(card) {
for (const key of lib.yingbian.condition.complex.keys()) {
if (get.cardtag(card, `yingbian_${key}`)) return true;
}
return false;
}
/**
* @param { Card | VCard } card
*/
static simplyYingbianConditional(card) {
for (const key of lib.yingbian.condition.simple.keys()) {
if (get.cardtag(card, `yingbian_${key}`)) return true;
}
return false;
}
/**
* Check if the card has a Yingbian effect
*
* 检测此牌是否具有应变效果
*
* @param { Card | VCard } card
*/
static yingbianEffective(card) {
for (const key of lib.yingbian.effect.keys()) {
if (get.cardtag(card, `yingbian_${key}`)) return true;
}
return false;
}
/**
* @param { Card | VCard } card
*/
static yingbian(card) { return get.is.yingbianConditional(card) || get.is.yingbianEffective(card) }
/**
* @param { string } [substring]
*/
static emoji(substring) {
if (substring) {
const reg = new RegExp("[~#^$@%&!?%*]", 'g');
if (substring.match(reg)) {
return true;
}
for (let i = 0; i < substring.length; i++) {
const hs = substring.charCodeAt(i);
if (0xd800 <= hs && hs <= 0xdbff) {
if (substring.length > 1) {
const ls = substring.charCodeAt(i + 1);
const uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f) {
return true;
}
}
}
else if (substring.length > 1) {
const ls = substring.charCodeAt(i + 1);
if (ls == 0x20e3) {
return true;
}
}
else {
if (0x2100 <= hs && hs <= 0x27ff) {
return true;
}
else if (0x2B05 <= hs && hs <= 0x2b07) {
return true;
}
else if (0x2934 <= hs && hs <= 0x2935) {
return true;
}
else if (0x3297 <= hs && hs <= 0x3299) {
return true;
}
else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030
|| hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b
|| hs == 0x2b50) {
return true;
}
}
}
}
return false;
}
/**
* @param { string } str
*/
static banWords(str) { return get.is.emoji(str) || window.bannedKeyWords.some(item => str.includes(item)) }
/**
* @param { GameEventPromise } event
*/
// @ts-ignore
static converted(event) { return !(event.card && event.card.isCard) }
static safari() { return userAgent.indexOf('safari') != -1 && userAgent.indexOf('chrome') == -1 }
/**
* @param { (Card | VCard)[]} cards
*/
// @ts-ignore
static freePosition(cards) { return !cards.some(card => !card.hasPosition || card.hasPosition()) }
/**
* @param { string } name
* @param { boolean } item
*/
static nomenu(name, item) {
const menus = ['system', 'menu'];
const configs = {
show_round_menu: lib.config.show_round_menu,
round_menu_func: lib.config.round_menu_func,
touchscreen: lib.config.touchscreen,
swipe_up: lib.config.swipe_up,
swipe_down: lib.config.swipe_down,
swipe_left: lib.config.swipe_left,
swipe_right: lib.config.swipe_right,
right_click: lib.config.right_click,
phonelayout: lib.config.phonelayout
};
configs[name] = item;
if (!configs.phonelayout) return false;
if (configs.show_round_menu && menus.includes(configs.round_menu_func)) {
return false;
}
if (configs.touchscreen) {
if (menus.includes(configs.swipe_up)) return false;
if (menus.includes(configs.swipe_down)) return false;
if (menus.includes(configs.swipe_left)) return false;
if (menus.includes(configs.swipe_right)) return false;
}
else {
if (configs.right_click == 'config') return false;
}
if (name) {
setTimeout(function () {
alert('请将至少一个操作绑定为显示按钮或打开菜单,否则将永远无法打开菜单');
});
}
return true;
}
static altered() { return false; }
/*
skill=>{
return false;
// if(_status.connectMode) return true;
// return !lib.config.vintageSkills.includes(skill);
},
*/
/**
* @param { any } obj
* @returns { boolean }
*/
static node(obj) {
return Object.prototype.toString.call(obj).startsWith('[object HTML');
}
/**
* @param { any } obj
*/
static div(obj) { return Object.prototype.toString.call(obj) === '[object HTMLDivElement]' }
/**
* @param { any } obj
*/
static map(obj) { return Object.prototype.toString.call(obj) === '[object Map]' }
/**
* @param { any } obj
*/
static set(obj) { return Object.prototype.toString.call(obj) === '[object Set]' }
/**
* @param { any } obj
*/
static object(obj) { return Object.prototype.toString.call(obj) === '[object Object]' }
/**
* @overload
* @param { Function } func
* @returns { false }
*/
/**
* @overload
* @param { number | [number, number] } func
* @returns { boolean }
*/
static singleSelect(func) {
if (typeof func == 'function') return false;
const select = get.select(func);
return select[0] == 1 && select[1] == 1;
}
/**
* @param { string | Player } name
*/
static jun(name) {
if (get.mode() == 'guozhan') {
if (name instanceof lib.element.Player) {
if (name.isUnseen && name.isUnseen(0)) return false;
name = name.name1;
}
if (typeof name == 'string' && name.startsWith('gz_jun_')) {
return true;
}
}
return false;
}
static versus() { return !_status.connectMode && get.mode() == 'versus' && _status.mode == 'three' }
static changban() { return get.mode() == 'single' && _status.mode == 'changban' }
static single() { return get.mode() == 'single' && _status.mode == 'normal' }
/**
* @param { Player } [player]
*/
static mobileMe(player) { return (game.layout == 'mobile' || game.layout == 'long') && !game.chess && player && player.dataset.position == '0' }
static newLayout() { return game.layout != 'default' }
static phoneLayout() {
if (!lib.config.phonelayout) return false;
return (game.layout == 'mobile' || game.layout == 'long' || game.layout == 'long2' || game.layout == 'nova');
}
static singleHandcard() { return game.singleHandcard || game.layout == 'mobile' || game.layout == 'long' || game.layout == 'long2' || game.layout == 'nova' }
/**
* @param { Player } player
*/
static linked2(player) {
if (game.chess) return true;
if (lib.config.link_style2 != 'rotate') return true;
// if(game.chess) return false;
if (game.layout == 'long' || game.layout == 'long2' || game.layout == 'nova') return true;
if (player.dataset.position == '0') {
return ui.arena.classList.contains('oblongcard');
}
return false;
}
/**
* @param { {} } obj
*/
static empty(obj) { return Object.keys(obj).length == 0 }
/**
* @param { string } str
*/
static pos(str) { return str == 'h' || str == 'e' || str == 'j' || str == 'he' || str == 'hj' || str == 'ej' || str == 'hej' }
/**
* @param { string } skill
* @param { Player } player
* @returns
*/
static locked(skill, player) {
const info = lib.skill[skill];
if (typeof info.locked == 'function') return info.locked(skill, player);
if (info.locked == false) return false;
if (info.trigger && info.forced) return true;
if (info.mod) return true;
if (info.locked) return true;
return false;
}
}