From ad5cd13d1031eb4f8f992102a53c17ad69da429a Mon Sep 17 00:00:00 2001 From: copcap Date: Tue, 3 Oct 2023 15:10:29 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=B0=86=E5=88=A4=E6=96=AD=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E7=9A=84=E6=96=B9=E6=B3=95=E6=94=B9=E4=B8=BAgame.hasN?= =?UTF-8?q?ature?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- card/extra.js | 8 ++++---- card/guozhan.js | 4 ++-- card/standard.js | 26 +++++++++++++------------- card/yingbian.js | 2 +- character/clan.js | 4 ++-- character/ddd.js | 2 +- character/extra.js | 2 +- character/huicui.js | 4 ++-- character/mobile.js | 4 ++-- character/offline.js | 4 ++-- character/refresh.js | 10 +++++----- character/sp.js | 4 ++-- character/sp2.js | 4 ++-- character/tw.js | 6 +++--- character/yijiang.js | 4 ++-- game/game.js | 14 ++++++++++---- mode/boss.js | 8 ++++---- 17 files changed, 58 insertions(+), 52 deletions(-) diff --git a/card/extra.js b/card/extra.js index c7743a1b2..80ad18299 100644 --- a/card/extra.js +++ b/card/extra.js @@ -781,7 +781,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(card.name=='sha'){ var equip1=player.getEquip('zhuque'); if(equip1&&equip1.name=='zhuque') return 1.9; - if(!card.hasNature()) return 'zerotarget'; + if(!game.hasNature(card)) return 'zerotarget'; } } } @@ -810,7 +810,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ effect:{ target:function(card,player,target,current){ if(card.name=='sha'){ - if(card.hasNature('fire')) return 2; + if(game.hasNature(card,'fire')) return 2; if(player.hasSkill('zhuque_skill')) return 1.9; } if(get.tag(card,'fireDamage')&¤t<0) return 2; @@ -830,7 +830,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ target:player, card:event.card })) return false; - if(event.card.name=='sha'&&!event.card.hasNature()) return true; + if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; return false; }, content:function(){ @@ -906,7 +906,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ trigger:{player:'useCard1'}, //priority:7, filter:function(event,player){ - if(event.card.name=='sha'&&!event.card.hasNature()) return true; + if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; }, audio:true, check:function(event,player){ diff --git a/card/guozhan.js b/card/guozhan.js index 409bb4e95..51588f330 100644 --- a/card/guozhan.js +++ b/card/guozhan.js @@ -1211,7 +1211,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, filter:function(event,player){ if(['huoshaolianying','huogong'].contains(event.card.name)) return true; - if(event.card.name=='sha') return event.card.hasNature('fire'); + if(event.card.name=='sha') return game.hasNature(event.card,'fire'); return false; }, content:function(){ @@ -1220,7 +1220,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ target:function(card,player,target,current){ - if(['huoshaolianying','huogong'].contains(card.name)||(card.name=='sha'&&card.hasNature('fire'))){ + if(['huoshaolianying','huogong'].contains(card.name)||(card.name=='sha'&&game.hasNature(card,'fire'))){ return 'zeroplayertarget'; } }, diff --git a/card/standard.js b/card/standard.js index c451c7651..f59f3c784 100644 --- a/card/standard.js +++ b/card/standard.js @@ -134,7 +134,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(event.shanRequired>1){ next.set('prompt2','(共需使用'+event.shanRequired+'张闪)'); } - else if(event.card.hasNature('stab')){ + else if(game.hasNature(event.card,'stab')){ next.set('prompt2','(在此之后仍需弃置一张手牌)'); } next.set('ai1',function(card){ @@ -168,7 +168,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(event.shanRequired>0){ event.goto(1); } - else if(event.card.hasNature('stab')&&target.countCards('h')>0){ + else if(game.hasNature(event.card,'stab')&&target.countCards('h')>0){ event.responded=result; event.goto(4); } @@ -265,7 +265,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, order:function(item,player){ if(player.hasSkillTag('presha',true,null,true)) return 10; - if(item.hasNature('linked')){ + if(game.hasNature(item,'linked')){ if(game.hasPlayer(function(current){ return current!=player&¤t.isLinked()&&player.canUse(item,current,null,true)&&get.effect(current,item,player,player)>0&&lib.card.sha.ai.canLink(player,current,item); })&&game.countPlayer(function(current){ @@ -306,20 +306,20 @@ game.import('card',function(lib,game,ui,get,ai,_status){ respond:1, respondShan:1, damage:function(card){ - if(card.hasNature('poison')) return; + if(game.hasNature(card,'poison')) return; return 1; }, natureDamage:function(card){ - if(card.hasNature()) return 1; + if(game.hasNature(card)) return 1; }, fireDamage:function(card,nature){ - if(card.hasNature('fire')) return 1; + if(game.hasNature(card,'fire')) return 1; }, thunderDamage:function(card,nature){ - if(card.hasNature('thunder')) return 1; + if(game.hasNature(card,'thunder')) return 1; }, poisonDamage:function(card,nature){ - if(card.hasNature('poison')) return 1; + if(game.hasNature(card,'poison')) return 1; } } } @@ -338,20 +338,20 @@ game.import('card',function(lib,game,ui,get,ai,_status){ respond:1, respondShan:1, damage:function(card){ - if(card.hasNature('poison')) return; + if(game.hasNature(card,'poison')) return; return 1; }, natureDamage:function(card){ - if(card.hasNature()) return 1; + if(game.hasNature(card)) return 1; }, fireDamage:function(card,nature){ - if(card.hasNature('fire')) return 1; + if(game.hasNature(card,'fire')) return 1; }, thunderDamage:function(card,nature){ - if(card.hasNature('thunder')) return 1; + if(game.hasNature(card,'thunder')) return 1; }, poisonDamage:function(card,nature){ - if(card.hasNature('poison')) return 1; + if(game.hasNature(card,'poison')) return 1; } } } diff --git a/card/yingbian.js b/card/yingbian.js index 79eb64103..288f64211 100644 --- a/card/yingbian.js +++ b/card/yingbian.js @@ -307,7 +307,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ equipSkill:true, trigger:{player:'useCard1'}, filter:function(event,player){ - return (event.card.name=='sha'&&lib.linked.some(n=>n!='kami'&&event.card.hasNature(n))); + return (event.card.name=='sha'&&lib.linked.some(n=>n!='kami'&&game.hasNature(event.card,n))); }, audio:true, direct:true, diff --git a/character/clan.js b/character/clan.js index 77cf6a5d1..7fe0b4bf3 100644 --- a/character/clan.js +++ b/character/clan.js @@ -1076,7 +1076,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ try{ var cards=player.getCards('hs',cardx=>{ if(get.name(cardx)!='sha') return false; - return cardx.hasNature('linked'); + return game.hasNature(cardx,'linked'); }); cards.map(i=>[i,get.effect(target,i,player,player)]); cards.sort((a,b)=>b[1]-a[1]); @@ -1096,7 +1096,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return get.name(card)=='jiu'&&player.hasUseTarget(card); })&&player.countCards('hs',card=>{ if(get.name(card)!='sha') return false; - return card.hasNature('linked'); + return game.hasNature(card,'linked'); })); 'step 1' if(result.bool){ diff --git a/character/ddd.js b/character/ddd.js index cb698cca3..53dbc276e 100644 --- a/character/ddd.js +++ b/character/ddd.js @@ -875,7 +875,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var player=_status.event.player,target=_status.event.getParent().target; if(get.attitude(player,target)<0) return false; if(!_status.event.colors.contains(get.color(card,player))) return 0; - if(card.hasNature()) return 1.2; + if(game.hasNature(card)) return 1.2; return 1; }) 'step 3' diff --git a/character/extra.js b/character/extra.js index 10adfb6d4..86560fa03 100755 --- a/character/extra.js +++ b/character/extra.js @@ -6177,7 +6177,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(['trick','delay'].contains(lib.card[card.name].type)) return 'thunder'; }, cardUsable:function(card,player){ - if(card.name=='sha'&&card.hasNature('thunder')) return Infinity; + if(card.name=='sha'&&game.hasNature(card,'thunder')) return Infinity; }, }, ai:{ diff --git a/character/huicui.js b/character/huicui.js index c4e944b6a..fccc2bdf1 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -6437,7 +6437,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ prompt2:function(event,player){ var str=('令'+get.translation(event.player)+'即将受到的'); str+=(''+event.num+'点'); - if(lib.linked.some(n=>event.hasNature(n))){ + if(event.hasNature('linked')){ str+=(get.translation(event.nature)+'属性'); } str+='伤害+1'; @@ -7061,7 +7061,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).length; //var str='视为额外使用'+get.cnNumber(num)+'张' var str='额外结算'+get.cnNumber(num)+'次' - if(event.card.name=='sha'&&event.card.hasNature()) str+=get.translation(event.card.nature); + if(event.card.name=='sha'&&game.hasNature(event.card)) str+=get.translation(event.card.nature); return (str+'【'+get.translation(event.card.name)+'】'); }, check:function(event,player){ diff --git a/character/mobile.js b/character/mobile.js index e84260180..3ce2cc289 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -9624,7 +9624,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ group:['relihuo_baigei','relihuo_damage'], trigger:{player:'useCard1'}, filter:function(event,player){ - if(event.card.name=='sha'&&!event.card.hasNature()) return true; + if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; }, check:function(event,player){ return false; @@ -9650,7 +9650,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, audio:'relihuo', filter:function(event,player){ - if(event.card.name!='sha'||!event.card.hasNature('fire')) return false; + if(event.card.name!='sha'||!game.hasNature(event.card,'fire')) return false; var num=0; player.getHistory('sourceDamage',function(evt){ if(evt.card==event.card) num+=evt.num; diff --git a/character/offline.js b/character/offline.js index 36559222d..c9005b9ac 100644 --- a/character/offline.js +++ b/character/offline.js @@ -940,7 +940,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ if(!player.hasEmptySlot(2)) return false; if(event.card.name!='sha') return false; - return event.card.hasNature(); + return game.hasNature(event.card); }, content:function(){ trigger.cancel(); @@ -6234,7 +6234,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ fulu:{ trigger:{player:'useCard1'}, filter:function(event,player){ - if(event.card.name=='sha'&&!event.card.hasNature()) return true; + if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; }, audio:true, check:function(event,player){ diff --git a/character/refresh.js b/character/refresh.js index 9d806cf4f..b46bce1e2 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -6111,7 +6111,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, trigger:{player:'useCard1'}, filter:function(event,player){ - if(event.card.name=='sha'&&!event.card.hasNature()) return true; + if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; return false; }, audio:'lihuo', @@ -6139,7 +6139,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ollihuo2:{ trigger:{player:'useCard2'}, filter:function(event,player){ - if(event.card.name!='sha'||!event.card.hasNature('fire')) return false; + if(event.card.name!='sha'||!game.hasNature(event.card,'fire')) return false; return game.hasPlayer(function(current){ return !event.targets.contains(current)&&lib.filter.targetEnabled(event.card,player,current)&&lib.filter.targetInRange(event.card,player,current); }); @@ -7604,7 +7604,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ decadelihuo:{ trigger:{player:'useCard1'}, filter:function(event,player){ - if(event.card.name=='sha'&&!event.card.hasNature()) return true; + if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; return false; }, audio:'lihuo', @@ -7630,7 +7630,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ decadelihuo2:{ trigger:{player:'useCard2'}, filter:function(event,player){ - if(event.card.name!='sha'||!event.card.hasNature('fire')) return false; + if(event.card.name!='sha'||!game.hasNature(event.card,'fire')) return false; return game.hasPlayer(function(current){ return !event.targets.contains(current)&&player.canUse(event.card,current); }); @@ -7660,7 +7660,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ decadelihuo3:{ trigger:{player:'useCardAfter'}, filter:function(event,player){ - return event.card.name=='sha'&&event.card.hasNature('fire')&&event.targets.length>1&&player.getHistory('sourceDamage',function(evt){ + return event.card.name=='sha'&&game.hasNature(event.card,'fire')&&event.targets.length>1&&player.getHistory('sourceDamage',function(evt){ return evt.card==event.card; }).length>0; }, diff --git a/character/sp.js b/character/sp.js index 25c9b9b4b..3d8b17a5c 100755 --- a/character/sp.js +++ b/character/sp.js @@ -19389,7 +19389,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ effect:{ target:function(card,player,target,current){ if(card.name=='sha'){ - if(card.hasNature('fire')||player.hasSkill('zhuque_skill')) return 2; + if(game.hasNature(card,'fire')||player.hasSkill('zhuque_skill')) return 2; } if(get.tag(card,'fireDamage')&¤t<0) return 2; } @@ -19415,7 +19415,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ hanyong:{ trigger:{player:'useCard'}, filter:function(event,player){ - return event.card&&(event.card.name=='nanman'||event.card.name=='wanjian'||(event.card.name=='sha'&&!event.card.hasNature()&&get.suit(event.card)=='spade'))&&player.isDamaged(); + return event.card&&(event.card.name=='nanman'||event.card.name=='wanjian'||(event.card.name=='sha'&&!game.hasNature(event.card)&&get.suit(event.card)=='spade'))&&player.isDamaged(); }, content:function(){ trigger.baseDamage++; diff --git a/character/sp2.js b/character/sp2.js index e10796a8a..1a02647e6 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -6560,7 +6560,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else{ var vcard=[get.type(trigger.card),'',trigger.card.name]; - if(trigger.card.hasNature()) vcard.push(get.nature(trigger.card)); + if(game.hasNature(trigger.card)) vcard.push(get.nature(trigger.card)); player.storage.juanhui3.push(vcard); player.markSkill('juanhui2'); } @@ -7361,7 +7361,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target:function(card,player,target,current){ if(target.hasMark('cangchu')){ if(card.name=='sha'){ - if(lib.skill.global.contains('huoshaowuchao')||card.hasNature('fire')||player.hasSkill('zhuque_skill')) return 2; + if(lib.skill.global.contains('huoshaowuchao')||game.hasNature(card,'fire')||player.hasSkill('zhuque_skill')) return 2; } if(get.tag(card,'fireDamage')&¤t<0) return 2; } diff --git a/character/tw.js b/character/tw.js index 8d9384385..590b5e409 100644 --- a/character/tw.js +++ b/character/tw.js @@ -6039,7 +6039,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var list=[]; player.getHistory('useCard',function(evt){ if(get.type(evt.card)!='basic') return; - var name=evt.card.name,nature=evt.card.hasNature()?get.nature(evt.card):''; + var name=evt.card.name,nature=game.hasNature(evt.card)?get.nature(evt.card):''; if(!list.contains(name+nature)) list.push(name+nature); }); event.addDamage=list.length>1; @@ -10450,7 +10450,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twlihuo:{ trigger:{player:'useCard1'}, filter:function(event,player){ - if(event.card.name=='sha'&&!event.card.hasNature()) return true; + if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; return false; }, audio:'lihuo', @@ -10475,7 +10475,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twlihuo2:{ trigger:{player:'useCard2'}, filter:function(event,player){ - if(event.card.name!='sha'||!event.card.hasNature('fire')) return false; + if(event.card.name!='sha'||!game.hasNature(event.card,'fire')) return false; return game.hasPlayer(function(current){ return !event.targets.contains(current)&&player.canUse(event.card,current); }); diff --git a/character/yijiang.js b/character/yijiang.js index f15ea53cc..3890712cb 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -7010,7 +7010,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ lihuo:{ trigger:{player:'useCard1'}, filter:function(event,player){ - if(event.card.name=='sha'&&!event.card.hasNature()) return true; + if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; return false; }, audio:2, @@ -7038,7 +7038,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ lihuo2:{ trigger:{player:'useCard2'}, filter:function(event,player){ - if(event.card.name!='sha'||!event.card.hasNature('fire')) return false; + if(event.card.name!='sha'||!game.hasNature(event.card,'fire')) return false; return game.hasPlayer(function(current){ return !event.targets.contains(current)&&player.canUse(event.card,current); }); diff --git a/game/game.js b/game/game.js index 0901cc9c7..a55afc617 100644 --- a/game/game.js +++ b/game/game.js @@ -8518,6 +8518,8 @@ return this; } }); + //!!!WARNING!!! + //Will be deprecated in next verision Object.defineProperty(Object.prototype,'hasNature',{ configurable:true, enumerable:false, @@ -29093,10 +29095,7 @@ }, card:{ hasNature:function(nature,player){ - var natures=get.natureList(this,player); - if(!nature) return natures.length>0; - if(nature=='linked') return natures.some(n=>lib.linked.includes(n)); - return get.is.sameNature(natures,nature); + return game.hasNature(this,nature,player); }, //只针对【杀】起效果 addNature:function(nature){ @@ -33918,6 +33917,13 @@ game.callHook("addNature",[nature,translation,config]); return nature; }, + //判断卡牌信息/事件是否有某个属性 + hasNature:(item,nature,player)=>{ + var natures=get.natureList(item,player); + if(!nature) return natures.length>0; + if(nature=='linked') return natures.some(n=>lib.linked.includes(n)); + return get.is.sameNature(natures,nature); + }, //设置卡牌信息/事件的属性 setNature:(item,nature,addNature)=>{ if(!nature) nature=[]; diff --git a/mode/boss.js b/mode/boss.js index 8e0f9ff06..1c60a36a5 100644 --- a/mode/boss.js +++ b/mode/boss.js @@ -2659,7 +2659,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ if(!player.hasEmptySlot('equip2')) return false; if(event.card.name=='nanman') return true; if(event.card.name=='wanjian') return true; - return event.card.name=='sha'&&event.card.hasNature(); + return event.card.name=='sha'&&game.hasNature(event.card); }, content:function(){ trigger.cancel(); @@ -2672,7 +2672,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ if(card.name=='sha'){ var equip1=player.getEquip(1); if(equip1&&equip1.name=='zhuque') return 1.9; - if(!card.hasNature()) return 'zerotarget'; + if(!game.hasNature(card)) return 'zerotarget'; } } } @@ -4683,14 +4683,14 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ equipSkill:true, inherit:'cixiong_skill', filter:function(event,player){ - return event.card.hasNature('linked'); + return game.hasNature(event.card,'linked'); }, }, qicaishenlu:{ trigger:{source:'damageBegin1'}, forced:true, filter:function(event,player){ - return event.card.hasNature('linked'); + return game.hasNature(event.card,'linked'); }, content:function(){ trigger.num++; From 8ddf2625939da30fb792d676bc0f2789e2449b58 Mon Sep 17 00:00:00 2001 From: Tipx-L <138244655+Tipx-L@users.noreply.github.com> Date: Fri, 29 Sep 2023 11:33:29 -0700 Subject: [PATCH 2/3] Change update URLs. --- game/config.js | 3 ++- game/game.js | 71 ++++++++++++++++++-------------------------------- 2 files changed, 27 insertions(+), 47 deletions(-) diff --git a/game/config.js b/game/config.js index 6a5fb309e..d33b563fc 100644 --- a/game/config.js +++ b/game/config.js @@ -1,6 +1,7 @@ window.config={ extension_sources:{ - Coding:'https://raw.fgit.cf/libccy/noname-extension/master/', + 'GitHub Proxy':'https://ghproxy.com/https://raw.githubusercontent.com/libccy/noname-extension/master/', + FastGit:'https://raw.fgit.cf/libccy/noname-extension/master/', GitHub:'https://raw.githubusercontent.com/libccy/noname-extension/master/' }, extension_source:'Coding', diff --git a/game/game.js b/game/game.js index 0901cc9c7..0d38919be 100644 --- a/game/game.js +++ b/game/game.js @@ -1000,7 +1000,7 @@ init:'coding', unfrequent:true, item:{ - coding:'Github Proxy', + coding:'FastGit', github:'GitHub', }, onclick:function(item){ @@ -1010,15 +1010,10 @@ }, extension_source:{ name:'获取扩展地址', - init:'Coding', + init:'GitHub Proxy', unfrequent:true, item:{}, - intro:function(){ - return '获取在线扩展时的地址。当前地址:
'+lib.config.extension_sources[lib.config.extension_source]; - }, - onclick:function(item){ - game.saveConfig('extension_source',item); - }, + intro:()=>`获取在线扩展时的地址。当前地址:${document.createElement('br').outerHTML}${lib.config.extension_sources[lib.config.extension_source]}` }, extension_create:{ name:'添加获取扩展地址', @@ -47480,47 +47475,31 @@ var li1=document.createElement('li'); var li2=document.createElement('li'); var li3=document.createElement('li'); - var trimurl=function(str){ - if(str==lib.updateURLS.github){ - return 'GitHub'; + const trimURL=url=>{ + const updateURLS=lib.updateURLS; + for(const key in updateURLS){ + const updateURL=updateURLS[key]; + if(url==updateURL) return lib.configMenu.general.config.update_link.item[key]; } - if(str==lib.updateURLS.coding){ - return 'Coding'; + let index=url.indexOf('://'); + if(index!=-1) url=url.slice(index+3); + index=url.indexOf('/'); + if(index!=-1) url=url.slice(0,index); + if(url.length>15){ + const list=url.split('.'); + if(list.length>1) list.shift(); + url=list.join('.'); } - var index; - index=str.indexOf('://'); - if(index!=-1){ - str=str.slice(index+3); + if(url.length>15){ + const list=url.split('.'); + if(list.length>1) list.pop(); + url=list.join('.'); } - index=str.indexOf('/'); - if(index!=-1){ - str=str.slice(0,index); - } - if(str.length>15){ - var list=str.split('.'); - if(list.length>1){ - list.shift(); - } - str=list[0]; - for(var i=1;i15){ - var list=str.split('.'); - if(list.length>1){ - list.pop(); - } - str=list[0]; - for(var i=1;i

'; li2.innerHTML='素材版本:'+(lib.config.asset_version||'无')+'

'; - li3.innerHTML='更新地址:'+trimurl(lib.config.updateURL||lib.updateURL)+'

'; + li3.innerHTML='更新地址:'+trimURL(lib.config.updateURL||lib.updateURL)+'

'; li3.style.whiteSpace='nowrap'; li3.style.display='none';// coding @@ -47966,7 +47945,7 @@ game.prompt('设置更新地址',function(str){ if(str){ game.saveConfig('updateURL',str); - li3.querySelector('span').innerHTML=trimurl(str); + li3.querySelector('span').innerHTML=trimURL(str); button5.style.display=''; button6.style.display='none'; } @@ -47982,7 +47961,7 @@ game.saveConfig('updateURL',lib.mirrorURL); button5.style.display=''; button6.style.display='none'; - li3.querySelector('span').innerHTML=trimurl(lib.mirrorURL); + li3.querySelector('span').innerHTML=trimURL(lib.mirrorURL); }; li3.lastChild.appendChild(button6); @@ -47993,7 +47972,7 @@ game.saveConfig('updateURL'); button5.style.display='none'; button6.style.display=''; - li3.querySelector('span').innerHTML=trimurl(lib.updateURL); + li3.querySelector('span').innerHTML=trimURL(lib.updateURL); }; li3.lastChild.appendChild(button5); if(!lib.config.updateURL){ From 21f5c683c8dc27c99a1a2ea5f3651250a1e095e3 Mon Sep 17 00:00:00 2001 From: Tipx-L <138244655+Tipx-L@users.noreply.github.com> Date: Tue, 3 Oct 2023 01:10:25 -0700 Subject: [PATCH 3/3] Cache generated object URLs, and use "startsWith" or "includes" instead. --- game/game.js | 672 ++++++++++++++++++++++++--------------------------- 1 file changed, 320 insertions(+), 352 deletions(-) diff --git a/game/game.js b/game/game.js index 0d38919be..1518de717 100644 --- a/game/game.js +++ b/game/game.js @@ -6,7 +6,7 @@ } else{ const ua=navigator.userAgent.toLowerCase(); - const ios=ua.indexOf('iphone')!=-1||ua.indexOf('ipad')!=-1||ua.indexOf('macintosh')!=-1; + const ios=ua.includes('iphone')||ua.includes('ipad')||ua.includes('macintosh'); //electron if(typeof window.process=='object'&&typeof window.require=='function'){ const versions=window.process.versions; @@ -273,7 +273,7 @@ if(typeof order!='number') order=0; if(typeof background!='string') background=''; if(!Array.isArray(lineColor)||lineColor.length!=3) lineColor=[]; - else if(background.indexOf('ext:')==0){ + else if(background.startsWith('ext:')){ background=background.replace(/^ext:/,'extension/'); } if(linked) lib.linked.add(nature); @@ -334,6 +334,7 @@ } }], }, + objectURL:new Map(), hookmap:{}, imported:{}, layoutfixed:['chess','tafang','stone'], @@ -1566,7 +1567,7 @@ ui.create.filediv('.menubutton','添加背景',node,function(file){ if(file){ var name=file.name; - if(name.indexOf('.')!=-1){ + if(name.includes('.')){ name=name.slice(0,name.indexOf('.')); } var link=(game.writeFile?'cdv_':'custom_')+name; @@ -1604,7 +1605,7 @@ if(link&&link!='default'){ var str; if(this.classList.contains('active')){ - if(link.indexOf('custom_')==0||link.indexOf('cdv_')==0){ + if(link.startsWith('custom_')||link.startsWith('cdv_')){ str='删除'; } else{ @@ -1628,10 +1629,10 @@ if(node.firstChild){ node.firstChild.innerHTML=get.verticalStr(name); } - if(link=='default'||link.indexOf('custom_')==0){ + if(link=='default'||link.startsWith('custom_')){ node.style.backgroundImage='none'; node.classList.add('dashedmenubutton'); - if(link.indexOf('custom_')==0){ + if(link.startsWith('custom_')){ game.getDB('image',link,function(fileToLoad){ if(!fileToLoad) return; var fileReader = new FileReader(); @@ -1684,7 +1685,7 @@ menu.updateBr(); lib.config.customBackgroundPack.remove(background); game.saveConfig('customBackgroundPack',lib.config.customBackgroundPack); - if(background.indexOf('cdv_')==0){ + if(background.startsWith('cdv_')){ game.removeFile('image/background/'+background+'.jpg'); } else{ @@ -2423,7 +2424,7 @@ node.className='button character dashedmenubutton'; } else{ - if(link.indexOf('dragon_')==0){ + if(link.startsWith('dragon_')){ link=link.slice(7); node.dataset.decoration=link; } @@ -2471,7 +2472,7 @@ } else if(layout!='default'&&layout!='auto'){ ui.css.border_stylesheet=lib.init.sheet(); - if(layout.indexOf('dragon_')==0){ + if(layout.startsWith('dragon_')){ layout=layout.slice(7); ui.arena.dataset.framedecoration=layout; } @@ -4071,11 +4072,11 @@ style.display='flex'; style.height='60px'; style.justifyContent='center'; - style.width='200px'; + style.width='180px'; const firstChild=node.firstChild; firstChild.removeAttribute('class'); firstChild.style.position='initial'; - if(link=='false') return; + if(link=='doNotShow') return; const ruby=document.createElement('ruby'); ruby.textContent=name; const rt=document.createElement('rt'); @@ -4212,7 +4213,7 @@ if(confirm('是否清除已导入的所有自定义背景音乐?(该操作不可撤销!)')){ for(var i in lib.config.customBackgroundMusic){ lib.config.all.background_music.remove(i); - if(i.indexOf('cdv_')==0){ + if(i.startsWith('cdv_')){ game.removeFile('audio/background/'+i+'.mp3'); } else{ @@ -4376,7 +4377,7 @@ if(!lib.db){ data={}; for(var i in localStorage){ - if(i.indexOf(lib.configprefix)==0){ + if(i.startsWith(lib.configprefix)){ data[i]=localStorage[i]; } } @@ -7939,7 +7940,7 @@ //处理id和class if(options.identity){ for(const item of options.identity){ - if (item.indexOf("#")==0) element.id = item.slice(1); + if (item.startsWith("#")) element.id = item.slice(1); else element.classList.add(item); } } @@ -8034,7 +8035,7 @@ } var links=document.head.querySelectorAll('link'); for(var i=0;ipos.includes(get.position(card,true))); } }); + /** + * @legacy Use `Array.prototype.includes(searchElement)` instead. + */ Object.defineProperty(Array.prototype, "contains", { configurable:true, enumerable:false, writable:true, - value:function(item){ - return this.indexOf(item)!=-1; - } + value:Array.prototype.includes }); Object.defineProperty(Array.prototype, "add", { configurable:true, @@ -8857,16 +8859,16 @@ var noname_inited=localStorage.getItem('noname_inited'); if(noname_inited&&noname_inited!=='nodejs'){ var ua=navigator.userAgent.toLowerCase(); - if(ua.indexOf('android')!=-1){ + if(ua.includes('android')){ lib.device='android'; } - else if(ua.indexOf('iphone')!=-1||ua.indexOf('ipad')!=-1||ua.indexOf('macintosh')!=-1){ + else if(ua.includes('iphone')||ua.includes('ipad')||ua.includes('macintosh')){ lib.device='ios'; } lib.assetURL=noname_inited; } - if(lib.assetURL.indexOf('com.widget.noname.qingyao')!='-1'){ + if(lib.assetURL.includes('com.widget.noname.qingyao')){ alert('您正在一个不受信任的闭源客户端上运行《无名杀》。建议您更换为其他开源的无名杀客户端,避免给您带来不必要的损失。'); } @@ -8890,7 +8892,7 @@ lib.config.defaultcards=lib.config.cards.slice(0); } for(var i in config2){ - if(i.indexOf('_mode_config')!=-1){ + if(i.includes('_mode_config')){ var thismode=i.substr(i.indexOf('_mode_config')+13); if(!lib.config.mode_config[thismode]){ lib.config.mode_config[thismode]={}; @@ -9041,7 +9043,7 @@ } else if(confirm('是否切换到触屏模式?(触屏模式可提高触屏设备的响应速度,但无法使用鼠标)')){ game.saveConfig('touchscreen',true); - if(ua.indexOf('iphone')!=-1||ua.indexOf('android')!=-1){ + if(ua.includes('iphone')||ua.includes('android')){ game.saveConfig('phonelayout',true); } game.reload(); @@ -9051,7 +9053,7 @@ else if(lib.config.touchscreen){ game.saveConfig('touchscreen',false); } - if(!lib.config.toscrolled&&ua.indexOf('macintosh')!=-1){ + if(!lib.config.toscrolled&&ua.includes('macintosh')){ game.saveConfig('toscrolled',true); game.saveConfig('mousewheel',false); } @@ -9077,7 +9079,7 @@ } } for(var i=0;i.framebg,#window #arena.long.mobile:not(.fewplayer) .player[data-position="0"]>.framebg{display:block;background-image:url("'+lib.assetURL+'theme/style/player/'+bstyle+'1.png")}',0); @@ -9417,7 +9419,7 @@ }); } game.download=function(url,folder,onsuccess,onerror,dev,onprogress){ - if(url.indexOf('http')!=0){ + if(!url.startsWith('http')){ url=get.url(dev)+url; } var fileTransfer = new FileTransfer(); @@ -9588,7 +9590,7 @@ }; lib.path=lib.node.path; game.download=function(url,folder,onsuccess,onerror,dev,onprogress){ - if(url.indexOf('http')!=0){ + if(!url.startsWith('http')){ url=get.url(dev)+url; } game.ensureDirectory(folder,function(){ @@ -9604,7 +9606,7 @@ if(!lib.node.https) lib.node.https=require('https'); var opts = require('url').parse(encodeURI(url)); opts.headers={'User-Agent': 'AppleWebkit'}; - var request = (url.indexOf('https')==0?lib.node.https:lib.node.http).get(opts, function(response) { + (url.startsWith('https')?lib.node.https:lib.node.http).get(opts, function(response) { var stream=response.pipe(file); stream.on('finish',function(){ lib.config.brokenFile.remove(folder); @@ -9882,7 +9884,7 @@ ui.background=ui.create.div('.background'); ui.background.style.backgroundSize="cover"; ui.background.style.backgroundPosition='50% 50%'; - if(lib.config.image_background&&lib.config.image_background!='default'&&lib.config.image_background.indexOf('custom_')!=0){ + if(lib.config.image_background&&lib.config.image_background!='default'&&!lib.config.image_background.startsWith('custom_')){ ui.background.setBackgroundImage('image/background/'+lib.config.image_background+'.jpg'); if(lib.config.image_background_blur){ ui.background.style.filter='blur(8px)'; @@ -9910,7 +9912,7 @@ }); } - if(lib.config.image_background.indexOf('custom_')==0){ + if(lib.config.image_background.startsWith('custom_')){ ui.background.style.backgroundImage="none"; game.getDB('image',lib.config.image_background,function(fileToLoad){ if(!fileToLoad) return; @@ -10472,7 +10474,7 @@ delete lib.imported.mode; delete lib.imported.play; for(var i in lib.init){ - if(i.indexOf('setMode_')==0){ + if(i.startsWith('setMode_')){ delete lib.init[i]; } } @@ -10611,7 +10613,7 @@ var node=ui.create.div('.hidden',splash,clickNode); node.link=lib.config.all.mode[i]; ui.create.div(node,'.splashtext',get.verticalStr(get.translation(lib.config.all.mode[i]))); - if(lib.config.all.stockmode.indexOf(lib.config.all.mode[i])!=-1){ + if(lib.config.all.stockmode.includes(lib.config.all.mode[i])){ // 初始启动页设置 if(lib.config.splash_style==undefined) game.saveConfig('splash_style','style1'); splash.dataset.splash_style=lib.config.splash_style; @@ -10626,7 +10628,7 @@ else{ var avatarnode=ui.create.div(node,'.avatar'); var avatarbg=lib.mode[lib.config.all.mode[i]].splash; - if(avatarbg.indexOf('ext:')==0){ + if(avatarbg.startsWith('ext:')){ avatarnode.setBackgroundImage(avatarbg.replace(/^ext:/,'extension/')); } else{ @@ -10756,7 +10758,7 @@ if(path){ if(path[path.length-1]=='/') path=path.slice(0,path.length-1); if(file) path=`${path}${/^db:extension-[^:]*$/.test(path)?':':'/'}${file}.css`; - (path.indexOf('db:')==0?game.getDB('image',path.slice(3)).then(get.objectURL):new Promise(resolve=>resolve(path))).then(resolvedPath=>{ + (path.startsWith('db:')?game.getDB('image',path.slice(3)).then(get.objectURL):new Promise(resolve=>resolve(path))).then(resolvedPath=>{ style.href=resolvedPath; if(typeof before=='function'){ style.addEventListener('load',before); @@ -10791,8 +10793,8 @@ return; } let scriptSource=file?`${path}${/^db:extension-[^:]*$/.test(path)?':':'/'}${file}.js`:path; - if(path.indexOf('http')==0) scriptSource+=`?rand=${get.id()}`; - else if(lib.config.fuck_sojson&&scriptSource.includes('extension')!=-1&&scriptSource.indexOf(lib.assetURL)==0){ + if(path.startsWith('http')) scriptSource+=`?rand=${get.id()}`; + else if(lib.config.fuck_sojson&&scriptSource.includes('extension')!=-1&&scriptSource.startsWith(lib.assetURL)){ const pathToRead=scriptSource.slice(lib.assetURL.length); const alertMessage=`检测到您安装了使用免费版sojson进行加密的扩展。请谨慎使用这些扩展,避免游戏数据遭到破坏。\n扩展文件:${pathToRead}`; if(typeof game.readFileAsText=='function') game.readFileAsText(pathToRead,result=>{ @@ -10804,9 +10806,9 @@ },()=>void 0); } const script=document.createElement('script'); - (scriptSource.indexOf('db:')==0?game.getDB('image',scriptSource.slice(3)).then(get.objectURL):new Promise(resolve=>resolve(scriptSource))).then(resolvedScriptSource=>{ + (scriptSource.startsWith('db:')?game.getDB('image',scriptSource.slice(3)).then(get.objectURL):new Promise(resolve=>resolve(scriptSource))).then(resolvedScriptSource=>{ script.src=resolvedScriptSource; - if(path.indexOf('http')==0) script.addEventListener('load',()=>script.remove()); + if(path.startsWith('http')) script.addEventListener('load',()=>script.remove()); document.head.appendChild(script); if(typeof onLoad=='function') script.addEventListener('load',onLoad); if(typeof onError=='function') script.addEventListener('error',onError); @@ -10835,7 +10837,7 @@ let scriptSource; if(!file) scriptSource=path; else scriptSource=`${path}/${file}.js`; - if(path.indexOf('http')==0) scriptSource+=`?rand=${get.id()}`; + if(path.startsWith('http')) scriptSource+=`?rand=${get.id()}`; const xmlHttpRequest=new XMLHttpRequest(); let data; xmlHttpRequest.addEventListener("load",()=>{ @@ -10844,7 +10846,7 @@ if(typeof onError=='function') onError(new Error(`${scriptSource}加载失败!`)); return; } - if(lib.config.fuck_sojson&&scriptSource.includes('extension')!=-1&&scriptSource.indexOf(lib.assetURL)==0){ + if(lib.config.fuck_sojson&&scriptSource.includes('extension')!=-1&&scriptSource.startsWith(lib.assetURL)){ const pathToRead=scriptSource.slice(lib.assetURL.length); if(data.includes('sojson')||data.includes('jsjiami')||data.includes('var _0x')) alert(`检测到您安装了使用免费版sojson进行加密的扩展。请谨慎使用这些扩展,避免游戏数据遭到破坏。\n扩展文件:${pathToRead}`); } @@ -10862,7 +10864,7 @@ }, req:(str,onload,onerror,master)=>{ let sScriptURL; - if(str.indexOf('http')==0) sScriptURL=str; + if(str.startsWith('http')) sScriptURL=str; else if(str.startsWith('local:')){ if(lib.assetURL.length==0&&location.origin=='file://'&&typeof game.readFile=='undefined'){ const e=new Error('浏览器file协议下无法使用此api,请在http/https协议下使用此api'); @@ -10888,7 +10890,7 @@ */ reqSync:(str,onload,onerror,master)=>{ let sScriptURL; - if(str.indexOf('http')==0) sScriptURL=str; + if(str.startsWith('http')) sScriptURL=str; else if(str.startsWith('local:')){ if(lib.assetURL.length==0&&location.origin=='file://'&&typeof game.readFile=='undefined'){ const e=new Error('浏览器file协议下无法使用此api,请在http/https协议下使用此api'); @@ -11099,7 +11101,7 @@ list.remove(lib.config.image_background); localStorage.setItem(lib.configprefix+'background',JSON.stringify(list)); } - else if(lib.config.image_background&&lib.config.image_background!='default'&&lib.config.image_background.indexOf('custom_')!=0){ + else if(lib.config.image_background&&lib.config.image_background!='default'&&!lib.config.image_background.startsWith('custom_')){ localStorage.setItem(lib.configprefix+'background',lib.config.image_background); } else if(lib.config.image_background=='default'&&lib.config.theme=='simple'){ @@ -11346,7 +11348,7 @@ gl(str,function(folders,files){ if(files.length>1){ for(var i=0;i{ + if(!lib.config.forbidai.includes(key)&&!key.startsWith('boss_')&&!key.startsWith('tafang_')&&!list.includes(key)) console.log(get.translation(key),key); + }); }, h:function(player){ console.log(get.translation(player.getCards('h'))); @@ -11804,17 +11805,17 @@ var suit=null; var suits=['club','spade','diamond','heart']; for(var i=0;ihs.includes(card)); - var shown=player.getShownCards(); - for(var tag of event.gaintag) player.addGaintag(cards,tag); - event.cards=cards.filter(card=>!shown.includes(card)); - if(event.cards.length>0){ - game.log(player,'明置了',event.cards); - event.trigger('addShownCardsAfter') - } + addShownCards:()=>{ + var hs=player.getCards('h'),showingCards=event._cards.filter(showingCard=>hs.includes(showingCard)),shown=player.getShownCards(); + event.gaintag.forEach(tag=>player.addGaintag(showingCards,tag)); + if(!(event.cards=showingCards.filter(showingCard=>!shown.includes(showingCard))).length) return; + game.log(player,'明置了',event.cards); + if(event.animate!=false) player.$give(event.cards,player,false); + event.trigger('addShownCardsAfter'); }, //隐藏明置手牌 - hideShownCards:function(){ - var shown=player.getShownCards(),cards=event._cards.filter(card=>shown.includes(card)); - if(cards.length>0){ - if(!event.gaintag.length){ - var map={}; - cards.forEach(card=>{ - var tags=card.gaintag.filter(tag=>tag.indexOf('visible_')==0) - if(tags.length){ - tags.forEach(tag=>{ - if(!map[tag]) map[tag]=[]; - map[tag].push(card); - }) - } + hideShownCards:()=>{ + var shown=player.getShownCards(),hidingCards=event._cards.filter(hidingCard=>shown.includes(hidingCard)); + if(!hidingCards.length) return; + if(event.gaintag.length) event.gaintag.forEach(tag=>player.removeGaintag(tag,hidingCards)); + else { + var map=hidingCards.reduce((constructingMap,hidingCard)=>{ + hidingCard.gaintag.forEach(tag=>{ + if(!tag.startsWith('visible_')) return; + if(!constructingMap[tag]) constructingMap[tag]=[]; + constructingMap[tag].push(hidingCard); }); - for(var i in map){ - player.removeGaintag(i,map[i]) - } - } - else{ - event.gaintag.forEach(tag=>{ - player.removeGaintag(tag,cards); - }) - } - cards.removeArray(player.getShownCards()); - if(cards.length>0){ - event.cards=cards; - game.log(player,'取消明置了',cards); - event.trigger('hideShownCardsAfter'); - } + return constructingMap; + },{}); + Object.keys(map).forEach(key=>player.removeGaintag(key,map[key])); } + hidingCards.removeArray(player.getShownCards()); + if(!hidingCards.length) return; + game.log(player,'取消明置了',event.cards=hidingCards); + if(event.animate!=false) player.$give(hidingCards,player,false); + event.trigger('hideShownCardsAfter'); }, //Execute the delay card effect //执行延时锦囊牌效果 @@ -12701,7 +12690,7 @@ ui.create.dialog(str).videoId=id; if(ui.backgroundMusic) ui.backgroundMusic.pause(); if(lib.config.background_audio){ - if(beatmap.filename.indexOf('ext:')==0) game.playAudio(beatmap.filename); + if(beatmap.filename.startsWith('ext:')) game.playAudio(beatmap.filename); else game.playAudio('effect',beatmap.filename); } },player,event.videoId,event.beatmap); @@ -12724,7 +12713,7 @@ var custom_mapping=Array.isArray(beatmap.mapping); var mapping=custom_mapping?beatmap.mapping.slice():beatmap.mapping; var hitsound=beatmap.hitsound||'hitsound.wav'; - if(hitsound.indexOf('ext:')==0) hitsound=lib.assetURL+'extension/'+hitsound.slice(4); + if(hitsound.startsWith('ext:')) hitsound=lib.assetURL+'extension/'+hitsound.slice(4); else hitsound=lib.assetURL+'audio/effect/'+hitsound; var hitsound_audio=new Audio(hitsound); hitsound_audio.volume=0.25; @@ -12916,7 +12905,7 @@ game.countChoose(); setTimeout(()=>{ if(!lib.config.background_audio) return; - if(beatmap.filename.indexOf('ext:')==0) game.playAudio(beatmap.filename); + if(beatmap.filename.startsWith('ext:')) game.playAudio(beatmap.filename); else game.playAudio('effect',beatmap.filename); },Math.floor(speed*100*(0.9+beatmap.judgebar_height))+beatmap.current); setTimeout(function(){ @@ -12961,8 +12950,8 @@ var skip_timeout; var skip=()=>{ settle(); - Array.from(ui.window.getElementsByTagName('audio')).forEach(value=>{ - if(value.currentSrc.indexOf(beatmap.filename.indexOf('ext:')==0?beatmap.name:beatmap.filename)>-1) value.remove(); + Array.from(ui.window.getElementsByTagName('audio')).forEach(audio=>{ + if(audio.currentSrc.includes(beatmap.filename.startsWith('ext:')?beatmap.name:beatmap.filename)) audio.remove(); }); document.removeEventListener(lib.config.touchscreen?'touchend':'click',skip); clearTimeout(settle_timeout); @@ -14229,7 +14218,7 @@ else{ var keep=false; for(var i in player.additionalSkills){ - if(i.indexOf('hidden:')==0&&game.expandSkills(player.additionalSkills[i]).contains(event.skill)){ + if(i.startsWith('hidden:')&&game.expandSkills(player.additionalSkills[i]).contains(event.skill)){ keep=true;break; } } @@ -14282,7 +14271,7 @@ } else if(typeof info.logTarget=='function'){ var logTarget=info.logTarget(trigger,player); - if(get.itemtype(logTarget).indexOf('player')==0) str=get.prompt(event.skill,logTarget,player); + if(get.itemtype(logTarget).startsWith('player')) str=get.prompt(event.skill,logTarget,player); } else{ str=get.prompt(event.skill,null,player); @@ -17797,8 +17786,8 @@ const audio=lib.card[card.name].audio; if(typeof audio=='string'){ const audioInfo=audio.split(':'); - if(audio.indexOf('db:')==0) game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,audioInfo[2],`${card.name}_${sex}.${audioInfo[3]||'mp3'}`); - else if(audio.indexOf('ext:')==0) game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,`${card.name}_${sex}.${audioInfo[2]||'mp3'}`); + if(audio.startsWith('db:')) game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,audioInfo[2],`${card.name}_${sex}.${audioInfo[3]||'mp3'}`); + else if(audio.startsWith('ext:')) game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,`${card.name}_${sex}.${audioInfo[2]||'mp3'}`); else game.playAudio('card',sex,`${audioInfo[0]}.${audioInfo[1]||'mp3'}`); } else game.playAudio('card',sex,card.name); @@ -18615,8 +18604,8 @@ const sex=player.sex=='female'?'female':'male',audio=lib.card[card.name].audio; if(typeof audio=='string'){ const audioInfo=audio.split(':'); - if(audio.indexOf('db:')==0) game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,audioInfo[2],`${card.name}_${sex}.${audioInfo[3]||'mp3'}`); - else if(audio.indexOf('ext:')==0) game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,`${card.name}_${sex}.${audioInfo[2]||'mp3'}`); + if(audio.startsWith('db:')) game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,audioInfo[2],`${card.name}_${sex}.${audioInfo[3]||'mp3'}`); + else if(audio.startsWith('ext:')) game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,`${card.name}_${sex}.${audioInfo[2]||'mp3'}`); else game.playAudio('card',sex,`${audioInfo[0]}.${audioInfo[1]||'mp3'}`); } else game.playAudio('card',sex,card.name); @@ -19757,9 +19746,9 @@ } } if(_status.characterlist){ - if(lib.character[player.name]&&player.name.indexOf('gz_shibing')!=0&&player.name.indexOf('gz_jun_')!=0) _status.characterlist.add(player.name); - if(lib.character[player.name1]&&player.name1.indexOf('gz_shibing')!=0&&player.name1.indexOf('gz_jun_')!=0) _status.characterlist.add(player.name1); - if(lib.character[player.name2]&&player.name2.indexOf('gz_shibing')!=0&&player.name2.indexOf('gz_jun_')!=0) _status.characterlist.add(player.name2); + if(lib.character[player.name]&&!player.name.startsWith('gz_shibing')&&!player.name.startsWith('gz_jun_')) _status.characterlist.add(player.name); + if(lib.character[player.name1]&&!player.name1.startsWith('gz_shibing')&&!player.name1.startsWith('gz_jun_')) _status.characterlist.add(player.name1); + if(lib.character[player.name2]&&!player.name2.startsWith('gz_shibing')&&!player.name2.startsWith('gz_jun_')) _status.characterlist.add(player.name2); } event.cards=player.getCards('hejsx'); if(event.cards.length){ @@ -20274,52 +20263,36 @@ }, //让一名角色明置一些手牌 addShownCards:function(){ - const cards=[]; - const tags=[]; - for(let i=0;i0){ + if(subtype.startsWith('equip')&&parseInt(subtype.slice(5))>0){ break; } else if(lib.card[subtype]){ @@ -20545,7 +20518,7 @@ else if(Array.isArray(arguments[i])){ for(var arg of arguments[i]){ if(typeof arg=='string'){ - if(arg.indexOf('equip')==0&&parseInt(arg.slice(5))>0) next.slots.push(arg); + if(arg.startsWith('equip')&&parseInt(arg.slice(5))>0) next.slots.push(arg); } else if(typeof arg=='number'){ next.slots.push('equip'+arg); @@ -20553,7 +20526,7 @@ } } else if(typeof arguments[i]=='string'){ - if(arguments[i].indexOf('equip')==0&&parseInt(arguments[i].slice(5))>0) next.slots.push(arguments[i]); + if(arguments[i].startsWith('equip')&&parseInt(arguments[i].slice(5))>0) next.slots.push(arguments[i]); } else if(typeof arguments[i]=='number'){ next.slots.push('equip'+arguments[i]); @@ -20577,7 +20550,7 @@ else if(Array.isArray(arguments[i])){ for(var arg of arguments[i]){ if(typeof arg=='string'){ - if(arg.indexOf('equip')==0&&parseInt(arg.slice(5))>0) next.slots.push(arg); + if(arg.startsWith('equip')&&parseInt(arg.slice(5))>0) next.slots.push(arg); } else if(typeof arg=='number'){ next.slots.push('equip'+arg); @@ -20585,7 +20558,7 @@ } } else if(typeof arguments[i]=='string'){ - if(arguments[i].indexOf('equip')==0&&parseInt(arguments[i].slice(5))>0) next.slots.push(arguments[i]); + if(arguments[i].startsWith('equip')&&parseInt(arguments[i].slice(5))>0) next.slots.push(arguments[i]); } else if(typeof arguments[i]=='number'){ next.slots.push('equip'+arguments[i]); @@ -20609,7 +20582,7 @@ else if(Array.isArray(arguments[i])){ for(var arg of arguments[i]){ if(typeof arg=='string'){ - if(arg.indexOf('equip')==0&&parseInt(arg.slice(5))>0) next.slots.push(arg); + if(arg.startsWith('equip')&&parseInt(arg.slice(5))>0) next.slots.push(arg); } else if(typeof arg=='number'){ next.slots.push('equip'+arg); @@ -20617,7 +20590,7 @@ } } else if(typeof arguments[i]=='string'){ - if(arguments[i].indexOf('equip')==0&&parseInt(arguments[i].slice(5))>0) next.slots.push(arguments[i]); + if(arguments[i].startsWith('equip')&&parseInt(arguments[i].slice(5))>0) next.slots.push(arguments[i]); } else if(typeof arguments[i]=='number'){ next.slots.push('equip'+arguments[i]); @@ -20662,14 +20635,14 @@ var map2=get.copy(map); var cards=Array.from(player.node.equips.childNodes); for(var card of cards){ - if(card.name.indexOf('feichu_')==0){ + if(card.name.startsWith('feichu_')){ var index=card.name.slice(7); if(!map2[index]) map2[index]=0; map2[index]--; } } for(var index in map2){ - if(index.indexOf('equip')!=0||!(parseInt(index.slice(5))>0)) continue; + if(!index.startsWith('equip')||!(parseInt(index.slice(5))>0)) continue; var num=map2[index]; if(num>0){ for(var i=0;i'+str+''); } @@ -31251,10 +31224,10 @@ const del=groupSort(a)-groupSort(b); if(del!=0) return del; let aa=a,bb=b; - if(a.indexOf('_')!=-1){ + if(a.includes('_')){ a=a.slice(a.indexOf('_')+1); } - if(b.indexOf('_')!=-1){ + if(b.includes('_')){ b=b.slice(b.indexOf('_')+1); } if(a!=b){ @@ -31279,10 +31252,10 @@ var del=typeSort(a)-typeSort(b); if(del!=0) return del; var aa=a,bb=b; - if(a.indexOf('_')!=-1){ + if(a.includes('_')){ a=a.slice(a.indexOf('_')+1); } - if(b.indexOf('_')!=-1){ + if(b.includes('_')){ b=b.slice(b.indexOf('_')+1); } if(a!=b){ @@ -31324,10 +31297,10 @@ }, capt:function(a,b){ var aa=a,bb=b; - if(aa.indexOf('_')!=-1){ + if(aa.includes('_')){ aa=aa.slice(aa.indexOf('_')+1); } - if(bb.indexOf('_')!=-1){ + if(bb.includes('_')){ bb=bb.slice(bb.indexOf('_')+1); } if(aa!=bb){ @@ -32074,7 +32047,7 @@ if(info[3].contains('dualside')&&info[4]){ player.storage.dualside=[list[i],player.hp,player.maxHp]; for(var j=0;j{ var numberOfCardsToDraw=cards.length; cards.forEach(value=>{ - if(lib.config.mode=='stone'&&_status.mode=='deck'&&!player.isMin()&&get.type(value).indexOf('stone')==0){ + if(lib.config.mode=='stone'&&_status.mode=='deck'&&!player.isMin()&&get.type(value).startsWith('stone')){ var stonecard=get.stonecard(1,player.career); if(stonecard.length){ numberOfCardsToDraw-=stonecard.length; @@ -34133,14 +34106,14 @@ } document.body.insertBefore(ui.background,document.body.firstChild); - if(background.indexOf('ext:')==0){ + if(background.startsWith('ext:')){ ui.background.setBackgroundImage('extension/'+background.slice(4)); } else if(background=='default'){ ui.background.animate('start'); ui.background.style.backgroundImage="none"; } - else if(background.indexOf('custom_')==0){ + else if(background.startsWith('custom_')){ ui.background.style.backgroundImage="none"; game.getDB('image',background,function(fileToLoad){ if(!fileToLoad) return; @@ -34806,10 +34779,10 @@ } else{ if(ui.confirm&&ui.confirm.str){ - if(ui.confirm.str.indexOf('c')!=-1){ + if(ui.confirm.str.includes('c')){ ui.click.cancel(); } - else if(ui.confirm.str.indexOf('o')!=-1){ + else if(ui.confirm.str.includes('o')){ ui.click.ok(); } } @@ -34876,7 +34849,7 @@ delete game.ws; } var str=''; - if(ip.indexOf('wss://')!=0&&ip.indexOf('ws://')!=0) str=(get.config('wss_mode','connect')?'wss://':'ws://'); + if(!ip.startsWith('wss://')&&!ip.startsWith('ws://')) str=(get.config('wss_mode','connect')?'wss://':'ws://'); game.ws=new WebSocket(str+ip+''); } catch(e){ @@ -34958,8 +34931,8 @@ else if(typeof argument=='function') onError=argument; if(_status.video) break; } - if(path.indexOf('ext:')==0) path=path.replace(/^ext:/,'extension/'); - else if(path.indexOf('db:')!=0) path=`audio/${path}`; + if(path.startsWith('ext:')) path=path.replace(/^ext:/,'extension/'); + else if(!path.startsWith('db:')) path=`audio/${path}`; if(!lib.config.repeat_audio&&_status.skillaudio.contains(path)) return; _status.skillaudio.add(path); game.addVideo('playAudio',null,path); @@ -34980,7 +34953,7 @@ //Some browsers do not support "autoplay", so "oncanplay" listening has been added audio.oncanplay=()=>Promise.resolve(audio.play()).catch(()=>void 0); new Promise((resolve,reject)=>{ - if(path.indexOf('db:')==0) game.getDB('image',path.slice(3)).then(octetStream=>resolve(get.objectURL(octetStream)),reject); + if(path.startsWith('db:')) game.getDB('image',path.slice(3)).then(octetStream=>resolve(get.objectURL(octetStream)),reject); else if(lib.path.extname(path)) resolve(`${lib.assetURL}${path}`); else resolve(`${lib.assetURL}${path}.mp3`); }).then(resolvedPath=>{ @@ -35039,7 +35012,7 @@ else if(info.audioname.includes(player.name2)&&(!info.audioname2||!info.audioname2[player.name2])) audioName+='_'+player.name2; } if(typeof audioInfo=='string'){ - if(audioInfo.indexOf('db:')==0){ + if(audioInfo.startsWith('db:')){ audioInfo=audioInfo.split(':'); if(audioInfo.length<4) return; if(audioInfo[3]=='true') game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,audioInfo[2],`${audioName}.${audioInfo[4]||'mp3'}`); @@ -35049,7 +35022,7 @@ game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,audioInfo[2],`${audioName}${Math.floor(audioInfo[3]*Math.random())+1}.${audioInfo[4]||'mp3'}`); } } - else if(audioInfo.indexOf('ext:')==0){ + else if(audioInfo.startsWith('ext:')){ audioInfo=audioInfo.split(':'); if(audioInfo.length<3) return; if(audioInfo[2]=='true') game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,`${audioName}.${audioInfo[3]||'mp3'}`); @@ -35131,7 +35104,7 @@ aozhan=Object.keys(lib.mode.guozhan.config.aozhan_bgm.item).randomGet('disabled','random',_status.currentAozhan); } _status.currentAozhan=aozhan; - ui.backgroundMusic.src=lib.assetURL+(aozhan.indexOf('ext:')==0?'extension/'+aozhan.slice(4):'audio/background/aozhan_'+aozhan+'.mp3'); + ui.backgroundMusic.src=lib.assetURL+(aozhan.startsWith('ext:')?'extension/'+aozhan.slice(4):'audio/background/aozhan_'+aozhan+'.mp3'); } else{ var music=_status.tempMusic||lib.config.background_music; @@ -35148,7 +35121,7 @@ } } else{ - ui.backgroundMusic.src=lib.assetURL+(music.indexOf('ext:')==0?'extension/'+music.slice(4):'audio/background/'+music+'.mp3'); + ui.backgroundMusic.src=lib.assetURL+(music.startsWith('ext:')?'extension/'+music.slice(4):'audio/background/'+music+'.mp3'); } } }, @@ -35254,7 +35227,7 @@ if(!object||!libConfig[`${extensionName}_enable`]) return; if(!noEval) lib.init.eval(object); const config=Object.keys(libConfig).reduce((constructingConfig,key)=>{ - if(key!=extensionName&&key.indexOf(extensionName)==0) constructingConfig[key.slice(11+name.length)]=libConfig[key]; + if(key!=extensionName&&key.startsWith(extensionName)) constructingConfig[key.slice(11+name.length)]=libConfig[key]; return constructingConfig; },{}); try{ @@ -35510,10 +35483,10 @@ else{ current2=current; } - if(current.indexOf('theme')==0){ + if(current.startsWith('theme')){ game.print(current.slice(6)); } - else if(current.indexOf('image/skin')==0){ + else if(current.startsWith('image/skin')){ game.print(current.slice(11)); } else{ @@ -36957,7 +36930,7 @@ }, exit:function(){ var ua=navigator.userAgent.toLowerCase(); - var ios=ua.indexOf('iphone')!=-1||ua.indexOf('ipad')!=-1||ua.indexOf('macintosh')!=-1; + var ios=ua.includes('iphone')||ua.includes('ipad')||ua.includes('macintosh'); //electron if(typeof window.process=='object'&&typeof window.require=='function'){ var versions=window.process.versions; @@ -37093,7 +37066,7 @@ noinput=true; } else if(typeof arguments[i]=='string'){ - if(arguments[i].indexOf('###')==0){ + if(arguments[i].startsWith('###')){ var list=arguments[i].slice(3).split('###'); str=list[0]; str2=list[1]; @@ -37880,7 +37853,7 @@ removeExtension:(extensionName,keepFile)=>{ const prefix=`extension_${extensionName}`; Object.keys(lib.config).forEach(key=>{ - if(key.indexOf(prefix)==0) game.saveConfig(key); + if(key.startsWith(prefix)) game.saveConfig(key); }); localStorage.removeItem(`${lib.configprefix}${prefix}`); game.deleteDB('data',prefix); @@ -38475,7 +38448,7 @@ if(modecharacters){ if(get.mode()=='guozhan'){ if(modecharacters[newvid.name1]){ - if(newvid.name1.indexOf('gz_shibing')==0){ + if(newvid.name1.startsWith('gz_shibing')){ newvid.name1=newvid.name1.slice(3,11); } else{ @@ -38483,7 +38456,7 @@ } } if(modecharacters[newvid.name2]){ - if(newvid.name2.indexOf('gz_shibing')==0){ + if(newvid.name2.startsWith('gz_shibing')){ newvid.name2=newvid.name2.slice(3,11); } else{ @@ -38500,10 +38473,10 @@ } } } - if(newvid.name1&&newvid.name1.indexOf('subplayer_')==0){ + if(newvid.name1&&newvid.name1.startsWith('subplayer_')){ newvid.name1=newvid.name1.slice(10,newvid.name1.lastIndexOf('_')); } - if(newvid.name2&&newvid.name2.indexOf('subplayer_')==0){ + if(newvid.name2&&newvid.name2.startsWith('subplayer_')){ newvid.name1=newvid.name2.slice(10,newvid.name1.lastIndexOf('_')); } lib.videos.unshift(newvid); @@ -38982,7 +38955,7 @@ } if(lib.config.popequip&&get.is.phoneLayout()&& - typeof event.position=='string'&&event.position.indexOf('e')!=-1&& + typeof event.position=='string'&&event.position.includes('e')&& player.node.equips.querySelector('.card.selectable')){ player.node.equips.classList.add('popequip'); auto_confirm=false; @@ -40997,13 +40970,13 @@ const caption=lib.version==lib.config.version?'扩展更新':`${lib.version}更新内容`; let players=null,cards=null; if(lib.version!=lib.config.version) lib.changeLog.forEach(value=>{ - if(value.indexOf('players://')==0) try{ + if(value.startsWith('players://')) try{ players=JSON.parse(value.slice(10)).filter(value=>lib.character[value]); } catch(e){ players=null; } - else if(value.indexOf('cards://')==0) try{ + else if(value.startsWith('cards://')) try{ cards=JSON.parse(value.slice(8)).filter(value=>lib.card[value]); } catch(e){ @@ -41593,16 +41566,16 @@ node.classList.add('tempimage'); let img=lib.card[cardName].image; if(img){ - if(img.indexOf('db:')==0){ + if(img.startsWith('db:')){ img=img.slice(3); } - else if(img.indexOf('ext:')!=0){ + else if(!img.startsWith('ext:')){ img=null; } } if(lib.card[cardName].fullskin){ if(img){ - if(img.indexOf('ext:')==0){ + if(img.startsWith('ext:')){ bg.setBackgroundImage(img.replace(/^ext:/,'extension/')); } else{ @@ -41625,7 +41598,7 @@ } else if(lib.card[cardName].fullimage){ if(img){ - if(img.indexOf('ext:')==0){ + if(img.startsWith('ext:')){ bg.setBackgroundImage(img.replace(/^ext:/,'extension/')); bg.style.backgroundSize='cover'; } @@ -41634,7 +41607,7 @@ } } else if(lib.card[cardName].image){ - if(lib.card[cardName].image.indexOf('character:')==0){ + if(lib.card[cardName].image.startsWith('character:')){ bg.setBackground(lib.card[cardName].image.slice(10),'character'); } else{ @@ -41657,7 +41630,7 @@ } else if(typeof lib.card[cardName].image=='string'&&!lib.card[cardName].fullskin){ if(img){ - if(img.indexOf('ext:')==0){ + if(img.startsWith('ext:')){ bg.setBackgroundImage(img.replace(/^ext:/,'extension/')); bg.style.backgroundSize='cover'; } @@ -43001,10 +42974,10 @@ list.sort(function(a,b){ a=a[0];b=b[0]; var aa=a,bb=b; - if(aa.indexOf('_')!=-1){ + if(aa.includes('_')){ aa=aa.slice(aa.indexOf('_')+1); } - if(bb.indexOf('_')!=-1){ + if(bb.includes('_')){ bb=bb.slice(bb.indexOf('_')+1); } if(aa!=bb){ @@ -43202,7 +43175,7 @@ if(fileToLoad){ if(!lib.config.customBackgroundMusic) lib.config.customBackgroundMusic={}; var name=fileToLoad.name; - if(name.indexOf('.')!=-1){ + if(name.includes('.')){ name=name.slice(0,name.indexOf('.')); } var link=(game.writeFile?'cdv_':'custom_')+name; @@ -43341,9 +43314,9 @@ var images=[],audios=[],fonts=[],directories={},directoryList=[]; Object.keys(zip.files).forEach(file=>{ const parsedPath=lib.path.parse(file),directory=parsedPath.dir,fileExtension=parsedPath.ext.toLowerCase(); - if(directory.indexOf('audio')==0&&(fileExtension=='.mp3'||fileExtension=='.ogg')) audios.push(file); - else if(directory.indexOf('font')==0&&fileExtension=='.woff2') fonts.push(file); - else if(directory.indexOf('image')==0&&(fileExtension=='.jpg'||fileExtension=='.png')) images.push(file); + if(directory.startsWith('audio')&&(fileExtension=='.mp3'||fileExtension=='.ogg')) audios.push(file); + else if(directory.startsWith('font')&&fileExtension=='.woff2') fonts.push(file); + else if(directory.startsWith('image')&&(fileExtension=='.jpg'||fileExtension=='.png')) images.push(file); else return; if(!directories[directory]){ directories[directory]=[]; @@ -43886,7 +43859,7 @@ for(var i=0;i该武将包不可被隐藏',page); } - else if(mode.indexOf('mode_')!=0){ + else if(!mode.startsWith('mode_')){ ui.create.div('.config.pointerspan','隐藏武将包',page,function(){ if(this.firstChild.innerHTML=='隐藏武将包'){ if(confirm('真的要隐藏“'+get.translation(mode+'_character_config')+'”武将包吗?\n建议使用“关闭”而不是“隐藏”功能,否则将会影响其他相关武将包的正常运行!')){ @@ -44248,13 +44221,9 @@ for(var i=0;i{ + if(key.startsWith('mode_')) createModeConfig(key,start.firstChild); + }); var active=start.firstChild.querySelector('.active'); if(!active){ active=start.firstChild.firstChild; @@ -44334,7 +44303,7 @@ for(var i=0;i隐藏卡牌包',page,function(){ if(this.firstChild.innerHTML=='隐藏卡牌包'){ this.firstChild.innerHTML='卡牌包将在重启后隐藏'; @@ -44524,7 +44493,7 @@ game.saveConfig('hiddenCardPack',lib.config.hiddenCardPack); }); } - if(mode.indexOf('mode_')!=0&&lib.cardPile[mode]){ + if(!mode.startsWith('mode_')&lib.cardPile[mode]){ var cardpileNodes=[]; var cardpileexpanded=false; if(!lib.config.bannedpile[mode]){ @@ -44699,13 +44668,9 @@ if(connectMenu&&!lib.connectCardPack.contains(lib.config.all.cards[i])) continue; createModeConfig(lib.config.all.cards[i],start.firstChild); } - if(!connectMenu){ - for(var i in lib.cardPack){ - if(i.indexOf('mode_')==0){ - createModeConfig(i,start.firstChild); - } - } - } + if(!connectMenu) Object.keys(lib.cardPack).forEach(key=>{ + if(key.startsWith('mode_')) createModeConfig(key,start.firstChild); + }); var active=start.firstChild.querySelector('.active'); if(!active){ active=start.firstChild.firstChild; @@ -44896,7 +44861,7 @@ var node=start.firstChild.childNodes[i]; if(node.mode=='get') continue; if(node.mode=='create') continue; - if(node.mode&&node.mode.indexOf('extension_')==0){ + if(node.mode&&node.mode.startsWith('extension_')){ if(lib.config[node.mode+'_enable']){ node.classList.remove('off'); if(node.link) node.link.firstChild.classList.add('on'); @@ -44920,7 +44885,7 @@ } var togglePack=function(bool){ var name=this._link.config._name; - if(name.indexOf('extension_')==0){ + if(name.startsWith('extension_')){ if(bool){ game.saveConfig(name,true); } @@ -44948,7 +44913,7 @@ var page=ui.create.div(''); page.style.paddingBottom='10px'; var node; - if(mode.indexOf('extension_')==0){ + if(mode.startsWith('extension_')){ node=ui.create.div('.menubutton.large',mode.slice(10),position,clickMode); } else{ @@ -44964,7 +44929,7 @@ if(i=='game') continue; var cfg=copyObj(lib.extensionMenu[mode][i]); var j; - if(mode.indexOf('extension_')==0){ + if(mode.startsWith('extension_')){ j=mode+'_'+i; } else{ @@ -45483,7 +45448,7 @@ } } for(var i=0;i'; + if(!str.startsWith(''; var next=dialog.add(str); if(!noclick) next.firstChild.addEventListener(lib.config.touchscreen?'touchend':'click',ui.click.button); next.firstChild.link=link; @@ -51881,7 +51846,7 @@ }, skin:function(avatar,name,callback){ var num=1; - if(name.indexOf('gz_')==0){ + if(name.startsWith('gz_')){ name=name.slice(3); } if(lib.config.skin[name]){ @@ -54415,10 +54380,10 @@ var nameskin=name; var nameskin2=name; var gzbool=false; - if(nameskin.indexOf('gz_shibing')==0){ + if(nameskin.startsWith('gz_shibing')){ nameskin=nameskin.slice(3,11); } - else if(nameskin.indexOf('gz_')==0){ + else if(nameskin.startsWith('gz_')){ nameskin=nameskin.slice(3); gzbool=true; } @@ -54671,14 +54636,14 @@ rightParenthesisRP.textContent=')'; ruby.appendChild(rightParenthesisRP); characterIntroTable.appendChild(ruby); - const characterSexDiv=ui.create.div('.character-sex',characterIntroTable),exInfoSex=exInfo&&exInfo.find(value=>value.indexOf('sex:')==0),characterSex=exInfoSex?exInfoSex.split(':').pop():nameInfo[0]; + const characterSexDiv=ui.create.div('.character-sex',characterIntroTable),exInfoSex=exInfo&&exInfo.find(value=>value.startsWith('sex:')),characterSex=exInfoSex?exInfoSex.split(':').pop():nameInfo[0]; new Promise((resolve,reject)=>{ const imageName=`sex_${characterSex}`,information=lib.card[imageName]; if(!information) resolve(`${lib.assetURL}image/card/${imageName}.png`); const image=information.image; if(!image) resolve(`${lib.assetURL}image/card/${imageName}.png`); - else if(image.indexOf('db:')==0) game.getDB('image',image.slice(3)).then(resolve,reject); - else if(image.indexOf('ext:')==0) resolve(`${lib.assetURL}${image.replace(/^ext:/,'extension/')}`); + else if(image.startsWith('db:')) game.getDB('image',image.slice(3)).then(resolve,reject); + else if(image.startsWith('ext:')) resolve(`${lib.assetURL}${image.replace(/^ext:/,'extension/')}`); else resolve(`${lib.assetURL}${image}`); }).then(source=>new Promise((resolve,reject)=>{ const image=new Image(); @@ -54692,8 +54657,8 @@ if(!information) resolve(`${lib.assetURL}image/card/${imageName}.png`); const image=information.image; if(!image) resolve(`${lib.assetURL}image/card/${imageName}.png`); - else if(image.indexOf('db:')==0) game.getDB('image',image.slice(3)).then(resolve,reject); - else if(image.indexOf('ext:')==0) resolve(`${lib.assetURL}${image.replace(/^ext:/,'extension/')}`); + else if(image.startsWith('db:')) game.getDB('image',image.slice(3)).then(resolve,reject); + else if(image.startsWith('ext:')) resolve(`${lib.assetURL}${image.replace(/^ext:/,'extension/')}`); else resolve(`${lib.assetURL}${image}`); }).then(source=>new Promise((resolve,reject)=>{ const image=new Image(); @@ -54712,8 +54677,8 @@ if(!information) resolve(`${lib.assetURL}image/card/${imageName}.png`); const image=information.image; if(!image) resolve(`${lib.assetURL}image/card/${imageName}.png`); - else if(image.indexOf('db:')==0) game.getDB('image',image.slice(3)).then(resolve,reject); - else if(image.indexOf('ext:')==0) resolve(`${lib.assetURL}${image.replace(/^ext:/,'extension/')}`); + else if(image.startsWith('db:')) game.getDB('image',image.slice(3)).then(resolve,reject); + else if(image.startsWith('ext:')) resolve(`${lib.assetURL}${image.replace(/^ext:/,'extension/')}`); else resolve(`${lib.assetURL}${image}`); }).then(source=>new Promise((resolve,reject)=>{ const image=new Image(); @@ -54857,7 +54822,7 @@ if(!get.info(list[i])||get.info(list[i]).nopop) continue; if(!lib.translate[list[i]]||!lib.translate[list[i]+'_info']) continue; var skilltrans=get.translation(list[i]); - if(skilltrans.indexOf(' ')==0){ + if(skilltrans.startsWith(' ')){ skilltrans=skilltrans.slice(6); } var current=ui.create.div('.menubutton.large',skills,clickSkill,skilltrans); @@ -55831,7 +55796,13 @@ const get={ //Generate an object URL from the Base64-encoded octet stream //从Base64编码的八位字节流生成对象URL - objectURL:octetStream=>URL.createObjectURL(new Blob([Uint8Array.from(atob(octetStream.replace(/^data:[\s\S]*\/[\s\S]*;base64,/,'')),v=>v.charCodeAt())])), + objectURL:octetStream=>{ + const objectURLMap=lib.objectURL; + if(objectURLMap.has(octetStream)) return objectURLMap.get(octetStream); + const objectURL=URL.createObjectURL(new Blob([Uint8Array.from(atob(octetStream.replace(/^data:[\s\S]*\/[\s\S]*;base64,/,'')),character=>character.charCodeAt())])); + objectURLMap.set(octetStream,objectURL); + return objectURL; + }, //Get the card name length //获取此牌的字数 cardNameLength:(card,player)=>{ @@ -55912,7 +55883,7 @@ } //排除声母 for(let i of lib.pinyins._metadata.shengmu){ - if(str.indexOf(i)==0){ + if(str.startsWith(i)){ str=str.slice(i.length); if(str[0]=='u'&&lib.pinyins._metadata.special_shengmu.contains(i)) str='ü'+str.slice(1); break; @@ -55924,7 +55895,7 @@ if(str[0]==i){ let goon=false; for(let j of lib.pinyins._metadata.feijiemu[i]){ - if(str.indexOf(j)==0) goon=true; + if(str.startsWith(j)) goon=true; } if(!goon) str=str.slice(1); break; @@ -55941,7 +55912,7 @@ } else{ for(let i of lib.pinyins._metadata.shengmu){ - if(str.indexOf(i)==0){ + if(str.startsWith(i)){ str=str.slice(i.length); if(str[0]=='u'&&lib.pinyins._metadata.special_shengmu.contains(i)) str='ü'+str.slice(1); break; @@ -56011,20 +55982,20 @@ }, infoHp:function(hp){ if(typeof hp=='number') return hp; - else if(typeof hp=='string'&&hp.indexOf('/')!=-1){ + else if(typeof hp=='string'&&hp.includes('/')){ return parseInt(hp.split('/')[0]); } return 0; }, infoMaxHp:function(hp){ if(typeof hp=='number') return hp; - else if(typeof hp=='string'&&hp.indexOf('/')!=-1){ + else if(typeof hp=='string'&&hp.includes('/')){ return parseInt(hp.split('/')[1]); } return 0; }, infoHujia:function(hp){ - if(typeof hp=='string'&&hp.indexOf('/')!=-1){ + if(typeof hp=='string'&&hp.includes('/')){ var splited=hp.split('/'); if(splited.length>2) return parseInt(splited[2]); } @@ -56094,11 +56065,10 @@ }); }, //判断一张牌是否为明置手牌 - shownCard:function(card){ - if(card&&Array.isArray(card.gaintag)){ - return card.gaintag.some(tag=>tag.indexOf('visible_')==0) - } - return false; + shownCard:card=>{ + if(!card) return false; + const gaintag=card.gaintag; + return Array.isArray(gaintag)&&gaintag.some(tag=>tag.startsWith('visible_')); }, //是否是虚拟牌 vituralCard:card=>card.isCard||(!("cards" in card)||!Array.isArray(card.cards)||card.cards.length==0), @@ -56123,13 +56093,11 @@ return false; }, double:(name,array)=>{ - let info=get.character(name,4); - if(!info) return false; - for(let i of info){ - if(i.indexOf('doublegroup:')==0){ - if(!array) return true; - return i.split(':').slice(1); - } + const extraInformations=get.character(name,4); + if(!extraInformations) return false; + for(const extraInformation of extraInformations){ + if(!extraInformation.startsWith('doublegroup:')) continue; + return Boolean(array)&&extraInformation.split(':').slice(1); } return false; }, @@ -56206,7 +56174,7 @@ banWords:function(str){ if(get.is.emoji(str)) return true; for(var i of window.bannedKeyWords){ - if(str.indexOf(i)!=-1) return true; + if(str.includes(i)) return true; } return false; }, @@ -56291,7 +56259,7 @@ if(name.isUnseen&&name.isUnseen(0)) return false; name=name.name1; } - if(typeof name=='string'&&name.indexOf('gz_jun_')==0){ + if(typeof name=='string'&&name.startsWith('gz_jun_')){ return true; } } @@ -56414,7 +56382,7 @@ next.set('prompt2',str); } else{ - if(str.indexOf('###')==0){ + if(str.startsWith('###')){ var prompts=str.slice(3).split('###'); if(prompts[0]) next.set('prompt',prompts[0]); if(prompts[1]) next.set('prompt2',prompts[1]); @@ -56589,12 +56557,12 @@ var tags=get.character(name,4); if(tags){ for(var i=0;i1&&threaten>1){ num+=Math.sqrt(threaten)-1; } } - if(type&&type.indexOf('out')!=-1){ + if(type&&type.includes('out')){ if(threaten<1){ num*=1/Math.sqrt(threaten); } @@ -57231,12 +57199,12 @@ var list=Array.isArray(info.trigger.global)?info.trigger.global:[info.trigger.global]; num+=Math.min(3,list.length)/10; for(var i of list){ - if(i.indexOf('lose')==0||i.indexOf('use')==0) num+=0.3; - if(i.indexOf('cardsDiscard')==0) num+=0.4; + if(i.startsWith('lose')||i.startsWith('use')) num+=0.3; + if(i.startsWith('cardsDiscard')) num+=0.4; } } if(info.trigger.target||(typeof info.trigger.player=='string'&& - (info.trigger.player.indexOf('damage')==0||info.trigger.player.indexOf('lose')==0))) num+=0.1; + (info.trigger.player.startsWith('damage')||info.trigger.player.startsWith('lose')))) num+=0.1; } if(info.ai){ if(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend){ @@ -57476,16 +57444,16 @@ parsedResult:function(item){ if(!item) return item; if(typeof item=='string'){ - if(item.indexOf('_noname_func:')==0){ + if(item.startsWith('_noname_func:')){ return get.infoFuncOL(item); } - else if(item.indexOf('_noname_card:')==0){ + else if(item.startsWith('_noname_card:')){ return get.infoCardOL(item); } - else if(item.indexOf('_noname_player:')==0){ + else if(item.startsWith('_noname_player:')){ return get.infoPlayerOL(item); } - else if(item.indexOf('_noname_event:')==0){ + else if(item.startsWith('_noname_event:')){ return get.infoEventOL(item); } else if(item=='_noname_infinity'){ @@ -57600,7 +57568,7 @@ } if(bool) return 'position'; } - if(obj.indexOf(lib.natureSeparator)!=-1&&obj.split(lib.natureSeparator).every(n=>lib.nature.has(n))) return 'natures'; + if(obj.includes(lib.natureSeparator)&&obj.split(lib.natureSeparator).every(n=>lib.nature.has(n))) return 'natures'; if(lib.nature.has(obj)) return 'nature'; } if(Array.isArray(obj)&&obj.length){ @@ -57675,7 +57643,7 @@ }, equiptype:function(card,player){ var subtype=get.subtype(card,player); - if(subtype.indexOf('equip')==0) return parseInt(subtype[5]); + if(subtype.startsWith('equip')) return parseInt(subtype[5]); return 0; }, name:function(card,player){ @@ -57989,7 +57957,7 @@ }, skillTranslation:function(str,player){ var str2; - if(str.indexOf('re')==0){ + if(str.startsWith('re')){ str2=str.slice(2); if(str2){ if(lib.translate[str]==lib.translate[str2]){ @@ -57999,7 +57967,7 @@ } } } - else if(str.indexOf('xin')==0){ + else if(str.startsWith('xin')){ str2=str.slice(3); if(str2){ if(lib.translate[str]==lib.translate[str2]){ @@ -59060,10 +59028,10 @@ var nameskin=(avatar2?node.name2:node.name1); var nameskin2=nameskin; var gzbool=false; - if(nameskin.indexOf('gz_shibing')==0){ + if(nameskin.startsWith('gz_shibing')){ nameskin=nameskin.slice(3,11); } - else if(nameskin.indexOf('gz_')==0){ + else if(nameskin.startsWith('gz_')){ nameskin=nameskin.slice(3); gzbool=true; } @@ -59124,10 +59092,10 @@ var nameskin=(avatar2?node.name2:node.name1); var nameskin2=nameskin; var gzbool=false; - if(nameskin.indexOf('gz_shibing')==0){ + if(nameskin.startsWith('gz_shibing')){ nameskin=nameskin.slice(3,11); } - else if(nameskin.indexOf('gz_')==0){ + else if(nameskin.startsWith('gz_')){ nameskin=nameskin.slice(3); gzbool=true; } @@ -59145,10 +59113,10 @@ setTimeout(function(){ var nameskin1=node.name1; var nameskin2=node.name2; - if(nameskin1&&nameskin1.indexOf('gz_')==0){ + if(nameskin1&&nameskin1.startsWith('gz_')){ nameskin1=nameskin1.slice(3); } - if(nameskin2&&nameskin2.indexOf('gz_')==0){ + if(nameskin2&&nameskin2.startsWith('gz_')){ nameskin2=nameskin2.slice(3); } if(!node.isUnseen(0)&&lib.skin[nameskin1]){ @@ -59182,7 +59150,7 @@ else if(info.name!==false){ uiintro.add(get.translation(node.skill)); } - if(typeof info.id=='string'&&info.id.indexOf('subplayer')==0&& + if(typeof info.id=='string'&&info.id.startsWith('subplayer')&& player.isUnderControl(true)&&player.storage[info.id]&&!_status.video){ var storage=player.storage[info.id]; uiintro.addText('当前体力:'+storage.hp+'/'+storage.maxHp); @@ -59199,7 +59167,7 @@ var stint=info.mark(uiintro,player.storage[node.skill],player); if(stint){ var placetext=uiintro.add('
'+stint+'
'); - if(stint.indexOf('
'+stint+'
'); - if(stint.indexOf('
'+str+'
'); - if(str.indexOf('
'+lib.translate[name+'_info']+'
'); - if(lib.translate[name+'_info'].indexOf('
已横置
'); var list=[]; for(var i=0;i