diff --git a/.eslintrc.json b/.eslintrc.json index f0d2bdc86..fde84ce4b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -2,16 +2,19 @@ "extends": "eslint:recommended", "env": { "browser": true, - "node": true, "es6": true, + "node": true, + "serviceworker": true, "worker": true }, "rules": { "no-console": 0, - "no-unused-vars": 0, - "no-undef": 0, - "no-redeclare": 0, - "require-yield": 0, + "no-constant-condition": [ + "error", + { + "checkLoops": false + } + ], "no-irregular-whitespace": [ "error", { @@ -19,13 +22,13 @@ "skipTemplates": true } ], - "no-constant-condition": [ - "error", - { - "checkLoops": false - } - ] /* , - "comma-dangle": ["error", "only-multiline"], - "complexity": ["error",100] */ + "no-redeclare": 0, + "no-undef": 0, + "no-unused-vars": 0, + "require-yield": 0 + }, + "parserOptions": { + "ecmaVersion": 13, + "sourceType": "module" } } \ No newline at end of file diff --git a/.gitignore b/.gitignore index 576ce9437..41a5761d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,25 @@ +!extension/boss +!extension/cardpile +!extension/coin +!extension/wuxing +!node_modules/options +!node_modules/ultron +!node_modules/ws +._* .DS_Store .DS_Store? -._* +.idea .Spotlight-V100 .Trashes -ehthumbs.db -Thumbs.db -localStorage.json .vscode -.idea +app +app.html +ehthumbs.db +extension +jsconfig.json +localStorage.json +main.js +node_modules +noname.ico +package.json +Thumbs.db diff --git a/audio/die/ol_feiyi.mp3 b/audio/die/ol_feiyi.mp3 new file mode 100644 index 000000000..93227b424 Binary files /dev/null and b/audio/die/ol_feiyi.mp3 differ diff --git a/audio/die/ol_sb_jiangwei.mp3 b/audio/die/ol_sb_jiangwei.mp3 new file mode 100644 index 000000000..8407cfc61 Binary files /dev/null and b/audio/die/ol_sb_jiangwei.mp3 differ diff --git a/audio/die/star_dongzhuo.mp3 b/audio/die/star_dongzhuo.mp3 new file mode 100644 index 000000000..a56900c84 Binary files /dev/null and b/audio/die/star_dongzhuo.mp3 differ diff --git a/audio/skill/hezhong1.mp3 b/audio/skill/hezhong1.mp3 new file mode 100644 index 000000000..710c0982f Binary files /dev/null and b/audio/skill/hezhong1.mp3 differ diff --git a/audio/skill/hezhong2.mp3 b/audio/skill/hezhong2.mp3 new file mode 100644 index 000000000..54cc0c2e3 Binary files /dev/null and b/audio/skill/hezhong2.mp3 differ diff --git a/audio/skill/olsbranji1.mp3 b/audio/skill/olsbranji1.mp3 new file mode 100644 index 000000000..18b6dd4b5 Binary files /dev/null and b/audio/skill/olsbranji1.mp3 differ diff --git a/audio/skill/olsbranji2.mp3 b/audio/skill/olsbranji2.mp3 new file mode 100644 index 000000000..2cc0ff36c Binary files /dev/null and b/audio/skill/olsbranji2.mp3 differ diff --git a/audio/skill/olsbzhuri1.mp3 b/audio/skill/olsbzhuri1.mp3 new file mode 100644 index 000000000..488f5c119 Binary files /dev/null and b/audio/skill/olsbzhuri1.mp3 differ diff --git a/audio/skill/olsbzhuri2.mp3 b/audio/skill/olsbzhuri2.mp3 new file mode 100644 index 000000000..64441d6c4 Binary files /dev/null and b/audio/skill/olsbzhuri2.mp3 differ diff --git a/audio/skill/sbhuoji1.mp3 b/audio/skill/sbhuoji1.mp3 index 4cf18052b..eea153d81 100644 Binary files a/audio/skill/sbhuoji1.mp3 and b/audio/skill/sbhuoji1.mp3 differ diff --git a/audio/skill/sbhuoji2.mp3 b/audio/skill/sbhuoji2.mp3 index 24f5fffc9..4cb6db759 100644 Binary files a/audio/skill/sbhuoji2.mp3 and b/audio/skill/sbhuoji2.mp3 differ diff --git a/audio/skill/sbhuoji3.mp3 b/audio/skill/sbhuoji3.mp3 new file mode 100644 index 000000000..1f0c2d810 Binary files /dev/null and b/audio/skill/sbhuoji3.mp3 differ diff --git a/audio/skill/sbkanpo1.mp3 b/audio/skill/sbkanpo1.mp3 index c97d9b0be..cc255635a 100644 Binary files a/audio/skill/sbkanpo1.mp3 and b/audio/skill/sbkanpo1.mp3 differ diff --git a/audio/skill/sbkanpo2.mp3 b/audio/skill/sbkanpo2.mp3 index fffb63014..5510c649d 100644 Binary files a/audio/skill/sbkanpo2.mp3 and b/audio/skill/sbkanpo2.mp3 differ diff --git a/audio/skill/starhaoshou1.mp3 b/audio/skill/starhaoshou1.mp3 new file mode 100644 index 000000000..24e2cfd80 Binary files /dev/null and b/audio/skill/starhaoshou1.mp3 differ diff --git a/audio/skill/starhaoshou2.mp3 b/audio/skill/starhaoshou2.mp3 new file mode 100644 index 000000000..0d114e95d Binary files /dev/null and b/audio/skill/starhaoshou2.mp3 differ diff --git a/audio/skill/starweilin1.mp3 b/audio/skill/starweilin1.mp3 new file mode 100644 index 000000000..c9045c9db Binary files /dev/null and b/audio/skill/starweilin1.mp3 differ diff --git a/audio/skill/starweilin2.mp3 b/audio/skill/starweilin2.mp3 new file mode 100644 index 000000000..364df44cb Binary files /dev/null and b/audio/skill/starweilin2.mp3 differ diff --git a/audio/skill/starzhangrong1.mp3 b/audio/skill/starzhangrong1.mp3 new file mode 100644 index 000000000..320dbeb92 Binary files /dev/null and b/audio/skill/starzhangrong1.mp3 differ diff --git a/audio/skill/starzhangrong2.mp3 b/audio/skill/starzhangrong2.mp3 new file mode 100644 index 000000000..a09ec8977 Binary files /dev/null and b/audio/skill/starzhangrong2.mp3 differ diff --git a/audio/skill/yanru1.mp3 b/audio/skill/yanru1.mp3 new file mode 100644 index 000000000..69dcddba8 Binary files /dev/null and b/audio/skill/yanru1.mp3 differ diff --git a/audio/skill/yanru2.mp3 b/audio/skill/yanru2.mp3 new file mode 100644 index 000000000..d51ad31c7 Binary files /dev/null and b/audio/skill/yanru2.mp3 differ diff --git a/card/extra.js b/card/extra.js index 5fdfcdf0b..e76e02cd1 100644 --- a/card/extra.js +++ b/card/extra.js @@ -123,31 +123,43 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return 0; }, result:{ - target:(player,target)=>{ + target:(player,target,card)=>{ if(target&&target.isDying()) return 2; if(!target || target._jiu_temp || !target.isPhaseUsing()) return 0; - if(!target.getCardUsable('sha') || lib.config.mode==='stone'&&!player.isMin()&&player.getActCount()+1>=player.actcount) return 0; - let shas = player.getCards('hs',card=>get.name(card)==='sha'&&!ui.selected.cards.includes(card)), card; - if(!shas.length || !target.hasSha() || shas.length>1&&(target.getCardUsable('sha')>1 || target.countCards('hs','zhuge'))) return 0; - target._jiu_temp = true; - shas.sort((a,b)=>get.order(b)-get.order(a)); - for(let i=0; i{ - return get.attitude(target,current)<0&&target.canUse(shas[i],current,null,true)&&!current.hasSkillTag('filterDamage',null,{ + let usable=target.getCardUsable('sha'); + if(!usable || lib.config.mode==='stone'&&!player.isMin()&&player.getActCount()+1>=player.actcount || !target.mayHaveSha(player,'use',card)) return 0; + let effs={order:0},temp; + target.getCards('hs',i=>{ + if(get.name(i)!=='sha' || ui.selected.cards.includes(i)) return false; + temp=get.order(i,target); + if(tempeffs.order) effs={order:temp}; + effs[i.cardid]={ + card:i, + target:null, + eff:0 + }; + }); + delete effs.order; + for(let i in effs){ + if(!lib.filter.filterCard(effs[i].card,target)) continue; + game.filterPlayer(current=>{ + if(get.attitude(target,current)>=0 || !target.canUse(effs[i].card,current,null,true) || current.hasSkillTag('filterDamage',null,{ player:target, - card:shas[i], + card:effs[i].card, jiu:true - })&&get.effect(current,shas[i],target)>0; + })) return false; + temp=get.effect(current,effs[i].card,target,player); + if(temp<=effs[i].eff) return false; + effs[i].target=current; + effs[i].eff=temp; + return false; }); - if(!tars.length) continue; - tars.sort((a,b)=>{ - return get.effect(b,shas[i],target)-get.effect(a,shas[i],target); - }); - if(!tars[0].mayHaveShan(player,'use') || target.hasSkillTag('directHit_ai',true,{ - target:tars[0], - card:shas[i] - },true) || target.needsToDiscard()>Math.max(0,3-target.hp)){ + if(!effs[i].target) continue; + if(target.hasSkillTag('directHit_ai',true,{ + target:effs[i].target, + card:i + },true) || usable===1&&(target.needsToDiscard()>Math.max(0,3-target.hp) || !effs[i].target.mayHaveShan(player,'use'))){ delete target._jiu_temp; return 1; } @@ -192,6 +204,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ game.addVideo('cardDialog',null,[get.translation(target)+'展示的手牌',get.cardsInfo(result.cards),event.videoId]); event.card2=result.cards[0]; game.log(target,'展示了',event.card2); + game.addCardKnower(result.cards, 'everyone'); event._result={}; player.chooseToDiscard({suit:get.suit(event.card2)},function(card){ var evt=_status.event.getParent(); @@ -218,10 +231,10 @@ game.import('card',function(lib,game,ui,get,ai,_status){ value:[3,1], useful:1, }, - wuxie:function(target,card,player,viewer,state){ - let att=get.attitude(viewer,target), eff=get.effect(target,card,player,target); - if(status*get.attitude(viewer,player)>0&&!player.isMad() || status*eff*att>=0) return 0; - if(get.attitude(viewer,player)>=0 || _status.event.getRand('huogong_wuxie')*4>player.countCards('h')) return 0; + wuxie:function(target,card,player,viewer,status){ + if(get.attitude(viewer,player._trueMe||player)>0) return 0; + if(status*get.attitude(viewer,target)*get.effect(target,card,player,target)>=0) return 0; + if(_status.event.getRand('huogong_wuxie')*4>player.countCards('h')) return 0; }, result:{ player:function(player){ @@ -290,7 +303,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ recastable:true, ai:{ wuxie:(target,card,player,viewer, status)=>{ - if(status*get.attitude(viewer,player)>0&&!player.isMad() || target.hasSkillTag('nodamage') || target.hasSkillTag('nofire') || target.hasSkillTag('nothunder') || get.attitude(viewer,player)>0 || (1+target.countCards('hs'))*_status.event.getRand()>1.57) return 0; + if(status*get.attitude(viewer,player._trueMe||player)>0 || target.hasSkillTag('nodamage') || target.hasSkillTag('nofire') || target.hasSkillTag('nothunder') || get.attitude(viewer,player)>0 || (1+target.countCards('hs'))*_status.event.getRand()>1.57) return 0; }, basic:{ order:(item,player)=>{ diff --git a/card/gujian.js b/card/gujian.js index e4127e0b5..f6a37b985 100644 --- a/card/gujian.js +++ b/card/gujian.js @@ -1793,88 +1793,88 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, translate:{ jinlianzhu:'金莲珠', - jinlianzhu_info:'对一名即将受到伤害的角色使用,防止此伤害,并令伤害来源摸一张牌', + jinlianzhu_info:'对一名即将受到伤害的角色使用,防止此伤害,并令伤害来源摸一张牌。', shihuifen:'石灰粉', - shihuifen_info:'在一名其他角色的出牌阶段开始时对其使用,目标需打出一张闪,否则此阶段使用卡牌无法指定其他角色为目标', + shihuifen_info:'在一名其他角色的出牌阶段开始时对其使用,目标需打出一张闪,否则此阶段使用卡牌无法指定其他角色为目标。', liufengsan:'流风散', - liufengsan_info:'出牌阶段对一名角色使用,目标获得两张闪', + liufengsan_info:'出牌阶段对一名角色使用,目标获得两张闪。', liutouge:'六骰格', - liutouge_info:'出牌阶段对一名角色使用,若目标是敌人,对目标施加一个随机的负面效果;否则对目标施加一个随机的正面效果', + liutouge_info:'出牌阶段对一名角色使用,若目标是敌人,对目标施加一个随机的负面效果;否则对目标施加一个随机的正面效果。', longxugou:'龙须钩', - longxugou_info:'出牌阶段对一名装备区内有牌的其他角色使用,获得其装备区内的一张牌并装备之', + longxugou_info:'出牌阶段对一名装备区内有牌的其他角色使用,获得其装备区内的一张牌并装备之。', mianlijinzhen:'棉里针', - mianlijinzhen_info:'出牌阶段对一名体力值不小于你的角色使用,目标摸一张牌然后失去1点体力', + mianlijinzhen_info:'出牌阶段对一名体力值不小于你的角色使用,目标摸一张牌然后失去1点体力。', shenhuofeiya:'神火飞鸦', - shenhuofeiya_info:'出牌阶段对一名其他角色和其相邻角色使用,目标需打出一张闪,否则受到1点火属性伤害', + shenhuofeiya_info:'出牌阶段对一名其他角色和其相邻角色使用,目标需打出一张闪,否则受到1点火属性伤害。', // tuhunsha:'土魂砂', // tuhunsha_info:'土魂砂', // wenhuangsan:'瘟癀伞', // wenhuangsan_info:'瘟癀伞', qiankunbiao:'乾坤镖', - qiankunbiao_info:'随机弃置一名其他角色和其相邻角色的一张牌', + qiankunbiao_info:'随机弃置一名其他角色和其相邻角色的一张牌。', bingpotong:'天女散花', bingpotong_ab:'散花', - bingpotong_info:'出牌阶段对至多3名角色使用,你与每个目标依次同时展示一张手牌,若颜色相同,你弃置展示的手牌,目标失去1点体力并终止结算', + bingpotong_info:'出牌阶段对至多3名角色使用,你与每个目标依次同时展示一张手牌,若颜色相同,你弃置展示的手牌,目标失去1点体力并终止结算。', feibiao:'飞镖', - feibiao_info:'出牌阶段,对一名距离1以外的角色使用,令其弃置一张黑色手牌或失去1点体力', + feibiao_info:'出牌阶段,对一名距离1以外的角色使用,令其弃置一张黑色手牌或失去1点体力。', dinvxuanshuang:'帝女玄霜', dinvxuanshuang_skill:'帝女玄霜', - dinvxuanshuang_info:'对一名濒死状态的角色使用,目标回复1点体力,然后可以弃置任意张牌并摸等量的牌', + dinvxuanshuang_info:'对一名濒死状态的角色使用,目标回复1点体力,然后可以弃置任意张牌并摸等量的牌。', yunvyuanshen:'玉女元参', yunvyuanshen_skill:'玉女元参', - yunvyuanshen_info:'出牌阶段对一名角色使用,目标在下一次进入濒死状态时回复1点体力', + yunvyuanshen_info:'出牌阶段对一名角色使用,目标在下一次进入濒死状态时回复1点体力。', ziyangdan:'紫阳丹', - ziyangdan_info:'出牌阶段对一名角色使用,目标获得3点护甲,此后每个准备阶段失去1点护甲,直到首次失去所有护甲或累计以此法失去3点护甲', + ziyangdan_info:'出牌阶段对一名角色使用,目标获得3点护甲,此后每个准备阶段失去1点护甲,直到首次失去所有护甲或累计以此法失去3点护甲。', gjyuheng:'玉衡', gjyuheng_plus:'玉衡', gjyuheng_pro:'玉衡', gjyuheng_skill:'玉衡', gjyuheng_plus_skill:'玉衡', gjyuheng_pro_skill:'玉衡', - gjyuheng_info:'出牌阶段限一次,若敌方角色有黑桃手牌,你可以弃置一张黑桃手牌,然后获得一名随机敌方角色的一张随机黑桃手牌(此牌在本局游戏中第三次和第七次发动效果后,分别自动获得一次强化)', - gjyuheng_plus_info:'由普通玉衡强化得到,将玉衡技能描述中的“弃置一张黑桃手牌”改为“弃置一张黑色手牌”', - gjyuheng_pro_info:'由普通玉衡二次强化得到,将玉横技能描述中的“弃置一张黑桃手牌”改为“弃置一张黑色手牌”,并去掉使用次数限制', - gjyuheng_skill_info:'出牌阶段限一次,若敌方角色有黑桃手牌,你可以弃置一张黑桃手牌,然后获得一名随机敌方角色的一张随机黑桃手牌', - gjyuheng_plus_skill_info:'出牌阶段限一次,若敌方角色有黑桃手牌,你可以弃置一张黑色手牌,然后获得一名随机敌方角色的一张随机黑桃手牌', - gjyuheng_pro_skill_info:'出牌阶段限,若敌方角色有黑桃手牌,你可以弃置一张黑色手牌,然后获得一名随机敌方角色的一张随机黑桃手牌', + gjyuheng_info:'出牌阶段限一次,若敌方角色有黑桃手牌,你可以弃置一张黑桃手牌,然后获得一名随机敌方角色的一张随机黑桃手牌(此牌在本局游戏中第三次和第七次发动效果后,分别自动获得一次强化)。', + gjyuheng_plus_info:'由普通玉衡强化得到,将玉衡技能描述中的“弃置一张黑桃手牌”改为“弃置一张黑色手牌”。', + gjyuheng_pro_info:'由普通玉衡二次强化得到,将玉横技能描述中的“弃置一张黑桃手牌”改为“弃置一张黑色手牌”,并去掉使用次数限制。', + gjyuheng_skill_info:'出牌阶段限一次,若敌方角色有黑桃手牌,你可以弃置一张黑桃手牌,然后获得一名随机敌方角色的一张随机黑桃手牌。', + gjyuheng_plus_skill_info:'出牌阶段限一次,若敌方角色有黑桃手牌,你可以弃置一张黑色手牌,然后获得一名随机敌方角色的一张随机黑桃手牌。', + gjyuheng_pro_skill_info:'出牌阶段限,若敌方角色有黑桃手牌,你可以弃置一张黑色手牌,然后获得一名随机敌方角色的一张随机黑桃手牌。', shujinsan:'舒筋散', - shujinsan_info:'出牌阶段对任意角色使用,目标可弃置任意张牌,并摸等量的牌', + shujinsan_info:'出牌阶段对任意角色使用,目标可弃置任意张牌,并摸等量的牌。', mutoumianju:'木头面具', - mutoumianju_info:'出牌阶段限一次,你可以将一张手牌当作杀使用', + mutoumianju_info:'出牌阶段限一次,你可以将一张手牌当作杀使用。', mutoumianju_skill:'木杀', - mutoumianju_skill_info:'出牌阶段限一次,你可以将一张手牌当作杀使用', + mutoumianju_skill_info:'出牌阶段限一次,你可以将一张手牌当作杀使用。', heilonglinpian:'黑龙鳞片', - heilonglinpian_info:'出牌阶段对自己使用,获得1点护甲,直到下一回合开始,你的防御距离+1', + heilonglinpian_info:'出牌阶段对自己使用,获得1点护甲,直到下一回合开始,你的防御距离+1。', shatang:'沙棠', - shatang_info:'出牌阶段对一名角色使用,对目标造成1点火焰伤害,然后目标获得1点护甲', + shatang_info:'出牌阶段对一名角色使用,对目标造成1点火焰伤害,然后目标获得1点护甲。', food:'食物', chunbing:'春饼', - chunbing_info:'你的手牌上限+1,持续五回合', + chunbing_info:'你的手牌上限+1,持续五回合。', gudonggeng:'骨董羹', - gudonggeng_info:'当你下一次受到杀造成的伤害时,令伤害-1,持续三回合', + gudonggeng_info:'当你下一次受到杀造成的伤害时,令伤害-1,持续三回合。', yougeng:'酉羹', - yougeng_info:'准备阶段,若你的体力值为全场最少或之一,你回复1点体力,持续两回合', + yougeng_info:'准备阶段,若你的体力值为全场最少或之一,你回复1点体力,持续两回合。', liyutang:'鲤鱼汤', - liyutang_info:'结束阶段,若你的体力值为全场最少或之一,你获得1点护甲,持续两回合', + liyutang_info:'结束阶段,若你的体力值为全场最少或之一,你获得1点护甲,持续两回合。', mizhilianou:'蜜汁藕', - mizhilianou_info:'你可以将一张红桃牌当作桃使用,持续四回合', + mizhilianou_info:'你可以将一张红桃牌当作桃使用,持续四回合。', xiajiao:'虾饺', - xiajiao_info:'你在摸牌阶段额外摸一张牌,然后弃置一张牌,持续三回合', + xiajiao_info:'你在摸牌阶段额外摸一张牌,然后弃置一张牌,持续三回合。', tanhuadong:'昙花冻', - tanhuadong_info:'出牌阶段结束时,你摸一张牌,持续三回合', + tanhuadong_info:'出牌阶段结束时,你摸一张牌,持续三回合。', qingtuan:'青团', - qingtuan_info:'你在回合内使用首张杀时摸一张牌,持续两回合', + qingtuan_info:'你在回合内使用首张杀时摸一张牌,持续两回合。', luyugeng:'鲈鱼羹', - luyugeng_info:'出牌阶段限一次,你可以弃置一张基本牌并发现一张牌,持续三回合', + luyugeng_info:'出牌阶段限一次,你可以弃置一张基本牌并发现一张牌,持续三回合。', yuanbaorou:'元宝肉', - yuanbaorou_info:'你在出牌阶段可以额外使用一张杀,持续四回合', + yuanbaorou_info:'你在出牌阶段可以额外使用一张杀,持续四回合。', molicha:'茉莉茶', - molicha_info:'你不能成为其他角色的黑色牌的目标,持续四回合', + molicha_info:'你不能成为其他角色的黑色牌的目标,持续四回合。', mapodoufu:'麻婆豆腐', - mapodoufu_info:'结束阶段,你弃置一名随机敌人的一张随机牌,持续两回合', + mapodoufu_info:'结束阶段,你弃置一名随机敌人的一张随机牌,持续两回合。', }, list:[ ['spade',2,'tanhuadong'], diff --git a/card/guozhan.js b/card/guozhan.js index a3ef0eda2..2566cb6f7 100644 --- a/card/guozhan.js +++ b/card/guozhan.js @@ -225,7 +225,20 @@ game.import('card',function(lib,game,ui,get,ai,_status){ player.chooseControl().set('prompt','文和乱武:请选择一项').set('choiceList',[ '令'+str+'弃置两张类型不同的手牌', '弃置'+str+'的一张手牌', - ]); + ]).set('ai',()=>{ + let target=_status.event.getParent().target,hs=target.getCards('h'),type=[],att=get.attitude(_status.event.player,target); + if(hs.length<2) return att>0?1:0; + hs.forEach(i=>{ + type.add(get.type2(i,target)); + }); + if(target.identity!=='qun'){ + if(Boolean(att>0)===Boolean(type.length>1)) return 1; + return 0; + } + if(type.length<2||target.hp<3) return att>0?1:0; + if(hs.length===2) return att>0?0:1; + return att>0?1:0; + }); 'step 2' if(result.index==0){ var list=[],hs=target.getCards('h'); @@ -1331,6 +1344,19 @@ game.import('card',function(lib,game,ui,get,ai,_status){ })){ return [0,0,0,0]; } + }, + target:(card,player,target)=>{ + if(target._g_taipingyaoshu_temp) return; + if(get.subtype(card)==='equip2'&&target.getEquip('taipingyaoshu')&&!target.countEmpty(2)){ + target._g_taipingyaoshu_temp=true; + let lose=get.effect(target,{name:'losehp'},target,target), + draw=2*get.effect(target,{name:'draw'},target,target); + delete target._g_taipingyaoshu_temp; + if(lose<0&&target.hp<=1&&!target.hasCard(i=>{ + return get.name(i)==='tao'&&lib.filter.cardEnabled(i,target,'forceEnable'); + })) draw=0; + return [1,(lose+draw)/get.attitude(target,target)]; + } } } } diff --git a/card/gwent.js b/card/gwent.js index adf9094c2..6d62deca4 100644 --- a/card/gwent.js +++ b/card/gwent.js @@ -1401,10 +1401,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ result:{ target:function(player,current){ if(current.hasSkill('gw_qinpendayu')) return 0; - if(current.needsToDiscard()) return -1; - if(current.needsToDiscard(1)) return -0.7; - if(current.needsToDiscard(2)) return -0.4; - return -0.1; + return Math.max(-1,-0.1-0.3*current.needsToDiscard(2)); } }, order:1.2, @@ -2204,22 +2201,22 @@ game.import('card',function(lib,game,ui,get,ai,_status){ gw_youlanzhimeng:'幽蓝之梦', gw_guaiwuchaoxue:'怪物巢穴', - gw_guaiwuchaoxue_info:'出牌阶段限用一次,随机获得一个卖血技能直到下一回合开始;令一名随机敌方角色对你造成1点伤害,然后你回复1点体力', + gw_guaiwuchaoxue_info:'出牌阶段限用一次,随机获得一个卖血技能直到下一回合开始;令一名随机敌方角色对你造成1点伤害,然后你回复1点体力。', gw_baobaoshu:'雹暴术', - gw_baobaoshu_info:'天气牌,出牌阶段对至多两名角色使用,目标每使用一张基本牌或锦囊牌,需弃置一张牌,直到下一回合结束', + gw_baobaoshu_info:'天气牌,出牌阶段对至多两名角色使用,目标每使用一张基本牌或锦囊牌,需弃置一张牌,直到下一回合结束。', gw_baishuang:'白霜', - gw_baishuang_info:'天气牌,出牌阶段对至多三名角色使用,目标下个摸牌阶段摸牌数-1', + gw_baishuang_info:'天气牌,出牌阶段对至多三名角色使用,目标下个摸牌阶段摸牌数-1。', gw_nuhaifengbao:'怒海风暴', gw_nuhaifengbao_bg:'海', - gw_nuhaifengbao_info:'天气牌,出牌阶段对一名角色使用,目标在结束阶段随机弃置一张牌,持续2回合', + gw_nuhaifengbao_info:'天气牌,出牌阶段对一名角色使用,目标在结束阶段随机弃置一张牌,持续2回合。', gw_ganhan:'干旱', - gw_ganhan_info:'所有角色减少1点体力上限(不触发技能),然后结束出牌阶段', + gw_ganhan_info:'所有角色减少1点体力上限(不触发技能),然后结束出牌阶段。', gw_huangjiashenpan:'皇家审判', - gw_huangjiashenpan_info:'获得任意一张金卡法术(皇家审判除外),然后结束出牌阶段', + gw_huangjiashenpan_info:'获得任意一张金卡法术(皇家审判除外),然后结束出牌阶段。', gw_chongci:'冲刺', - gw_chongci_info:'弃置所有牌并随机获得一张非金法术牌,每弃置一张手牌,便随机获得一张类别相同的牌;每弃置一张装备区内的牌,随机装备一件类别相同的装备;获得潜行直到下一回合开始,然后结束出牌阶段', + gw_chongci_info:'弃置所有牌并随机获得一张非金法术牌,每弃置一张手牌,便随机获得一张类别相同的牌;每弃置一张装备区内的牌,随机装备一件类别相同的装备;获得潜行直到下一回合开始,然后结束出牌阶段。', gw_tunshi:'吞噬', - gw_tunshi_info:'随机移除一名敌方角色的一个随机技能,你获得此技能并减少1点体力和体力上限,被移除技能的角色增加1点体力和体力上限,然后结束出牌阶段', + gw_tunshi_info:'随机移除一名敌方角色的一个随机技能,你获得此技能并减少1点体力和体力上限,被移除技能的角色增加1点体力和体力上限,然后结束出牌阶段。', gw_dieyi:'蝶翼', gw_dieyi_equip1:'蝶翼·器', gw_dieyi_equip2:'蝶翼·衣', @@ -2227,73 +2224,73 @@ game.import('card',function(lib,game,ui,get,ai,_status){ gw_dieyi_equip4:'蝶翼·防', gw_dieyi_equip5:'蝶翼·宝', gw_dieyi_judge:'蝶翼·判', - gw_dieyi_equip1_info:'在你从装备区中失去此牌后,你获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌', - gw_dieyi_equip2_info:'在你从装备区中失去此牌后,你获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌', - gw_dieyi_equip3_info:'在你从装备区中失去此牌后,你获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌', - gw_dieyi_equip4_info:'在你从装备区中失去此牌后,你获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌', - gw_dieyi_equip5_info:'在你从装备区中失去此牌后,你获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌', - gw_dieyi_judge_info:'你在判定阶段移去此牌,并获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌', + gw_dieyi_equip1_info:'在你从装备区中失去此牌后,你获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌。', + gw_dieyi_equip2_info:'在你从装备区中失去此牌后,你获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌。', + gw_dieyi_equip3_info:'在你从装备区中失去此牌后,你获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌。', + gw_dieyi_equip4_info:'在你从装备区中失去此牌后,你获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌。', + gw_dieyi_equip5_info:'在你从装备区中失去此牌后,你获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌。', + gw_dieyi_judge_info:'你在判定阶段移去此牌,并获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌。', gw_hudiewu:'蝴蝶舞', - gw_hudiewu_info:'将其他角色在场上的所有牌替换为蝶翼(每当你失去一张蝶翼,你获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌),然后结束出牌阶段', + gw_hudiewu_info:'将其他角色在场上的所有牌替换为蝶翼(每当你失去一张蝶翼,你获得一枚“蝶翼”标记;在任意角色的结束阶段,你移去所有“蝶翼”标记,并随机弃置等量的牌),然后结束出牌阶段。', gw_yigeniyin:'伊格尼印', - gw_yigeniyin_info:'对敌方角色中体力值最高的一名随机角色造成1点火焰伤害,然后对场上体力值最高的所有角色各造成1点火焰伤害,然后结束出牌阶段', + gw_yigeniyin_info:'对敌方角色中体力值最高的一名随机角色造成1点火焰伤害,然后对场上体力值最高的所有角色各造成1点火焰伤害,然后结束出牌阶段。', gw_leizhoushu:'雷咒术', - gw_leizhoushu_info:'获得技能雷咒术(在每个准备阶段令全场牌数最多的所有其他角色各随机弃置一张牌,若目标不包含敌方角色,将一名随机敌方角色追加为额外目标,结算X次,X为本局获得此技能的次数),然后结束出牌阶段', + gw_leizhoushu_info:'获得技能雷咒术(在每个准备阶段令全场牌数最多的所有其他角色各随机弃置一张牌,若目标不包含敌方角色,将一名随机敌方角色追加为额外目标,结算X次,X为本局获得此技能的次数),然后结束出牌阶段。', gw_aerdeyin:'阿尔德印', gw_aerdeyin_bg:'印', - gw_aerdeyin_info:'对一名随机敌方角色造成1点伤害,若目标武将牌正面朝上,则将其翻面;新的一轮开始时,若目标武将牌正面朝上,则在当前回合结束后进行一个额外回合,否则将武将牌翻回正面', + gw_aerdeyin_info:'对一名随机敌方角色造成1点伤害,若目标武将牌正面朝上,则将其翻面;新的一轮开始时,若目标武将牌正面朝上,则在当前回合结束后进行一个额外回合,否则将武将牌翻回正面。', gw_xinsheng:'新生', - gw_xinsheng_info:'选择一名角色,随机观看12张武将牌,选择一张替代其武将牌,并令其增加1点体力,然后结束出牌阶段', + gw_xinsheng_info:'选择一名角色,随机观看12张武将牌,选择一张替代其武将牌,并令其增加1点体力,然后结束出牌阶段。', gw_zhongmozhizhan:'终末之战', - gw_zhongmozhizhan_info:'将所有角色区域内的所有牌置入弃牌堆(不触发技能),然后结束出牌阶段', + gw_zhongmozhizhan_info:'将所有角色区域内的所有牌置入弃牌堆(不触发技能),然后结束出牌阶段。', gw_butianshu:'卜天术', - gw_butianshu_info:'出牌阶段对任意角色使用,将任意一张延时锦囊牌置入其判定区', + gw_butianshu_info:'出牌阶段对任意角色使用,将任意一张延时锦囊牌置入其判定区。', gw_zhihuanjun:'致幻菌', - gw_zhihuanjun_info:'出牌阶段对一名已受伤角色使用,令其减少1点体力上限;若该角色仍处于受伤状态且手牌数小于体力上限,则重复此结算', + gw_zhihuanjun_info:'出牌阶段对一名已受伤角色使用,令其减少1点体力上限;若该角色仍处于受伤状态且手牌数小于体力上限,则重复此结算。', gw_niuquzhijing:'纽曲之镜', - gw_niuquzhijing_info:'令全场体力最多的角色减少1点体力和体力上限,体力最少的角色增加1点体力和体力上限(不触发技能),然后结束出牌阶段', + gw_niuquzhijing_info:'令全场体力最多的角色减少1点体力和体力上限,体力最少的角色增加1点体力和体力上限(不触发技能),然后结束出牌阶段。', gw_ansha:'暗杀', - gw_ansha_info:'令一名体力为1的随机敌方角立即死亡,然后结束出牌阶段', + gw_ansha_info:'令一名体力为1的随机敌方角立即死亡,然后结束出牌阶段。', gw_shizizhaohuan:'十字召唤', - gw_shizizhaohuan_info:'从牌堆中获得一张杀以及决斗、火攻、火烧连营、南蛮入侵四张牌中的随机一张', + gw_shizizhaohuan_info:'从牌堆中获得一张杀以及决斗、火攻、火烧连营、南蛮入侵四张牌中的随机一张。', gw_zuihouyuanwang:'最后愿望', - gw_zuihouyuanwang_info:'摸X张牌并弃置X张牌,X为存活角色数', + gw_zuihouyuanwang_info:'摸X张牌并弃置X张牌,X为存活角色数。', gw_zirankuizeng:'自然馈赠', - gw_zirankuizeng_info:'选择任意一张铜卡法术使用', + gw_zirankuizeng_info:'选择任意一张铜卡法术使用。', gw_poxiao:'破晓', - gw_poxiao_info:'选择一项:解除任意名角色的天气效果并移除其判定区内的牌,或随机获得一张铜卡法术(破晓除外)并展示之', + gw_poxiao_info:'选择一项:解除任意名角色的天气效果并移除其判定区内的牌,或随机获得一张铜卡法术(破晓除外)并展示之。', gw_zumoshoukao:'阻魔手铐', - gw_zumoshoukao_info:'令一名角色非锁定技失效直到下一回合结束', + gw_zumoshoukao_info:'令一名角色非锁定技失效直到下一回合结束。', gw_aozuzhilei:'奥祖之雷', - gw_aozuzhilei_info:'对一名体力值不小于你的角色造成1点雷属性伤害,然后该角色摸一张牌', + gw_aozuzhilei_info:'对一名体力值不小于你的角色造成1点雷属性伤害,然后该角色摸一张牌。', gw_zhuoshao:'灼烧', - gw_zhuoshao_info:'对任意名体力值为全场最高的角色使用,造成1点火属性伤害', + gw_zhuoshao_info:'对任意名体力值为全场最高的角色使用,造成1点火属性伤害。', gw_fuyuan:'复原', - gw_fuyuan_info:'对一名濒死状态角色使用,目标回复1点体力并摸一张牌', + gw_fuyuan_info:'对一名濒死状态角色使用,目标回复1点体力并摸一张牌。', gw_youer:'诱饵', gw_youer_bg:'饵', - gw_youer_info:'将一名其他角色的所有手牌移出游戏,然后摸一张牌,当前回合结束后该角色将以此法失去的牌收回手牌', + gw_youer_info:'将一名其他角色的所有手牌移出游戏,然后摸一张牌,当前回合结束后该角色将以此法失去的牌收回手牌。', gw_tongdi:'通敌', - gw_tongdi_info:'观看一名其他角色的手牌并获得其中一张,然后令目标获得一张杀', + gw_tongdi_info:'观看一名其他角色的手牌并获得其中一张,然后令目标获得一张杀。', gw_baoxueyaoshui:'暴雪药水', - gw_baoxueyaoshui_info:'令一名角色弃置两张手牌并摸一张牌', + gw_baoxueyaoshui_info:'令一名角色弃置两张手牌并摸一张牌。', gw_birinongwu:'蔽日浓雾', gw_birinongwu_bg:'雾', - gw_birinongwu_info:'天气牌,出牌阶段对一名角色及其相邻角色使用,目标不能使用杀直到下一个出牌阶段结束', + gw_birinongwu_info:'天气牌,出牌阶段对一名角色及其相邻角色使用,目标不能使用杀直到下一个出牌阶段结束。', gw_qinpendayu:'倾盆大雨', gw_qinpendayu_bg:'雨', - gw_qinpendayu_info:'天气牌,出牌阶段对一名角色及其相邻角色使用,目标手牌上限-1直到下一个弃牌阶段结束', + gw_qinpendayu_info:'天气牌,出牌阶段对一名角色及其相邻角色使用,目标手牌上限-1直到下一个弃牌阶段结束。', gw_ciguhanshuang:'刺骨寒霜', gw_ciguhanshuang_bg:'霜', - gw_ciguhanshuang_info:'天气牌,出牌阶段对一名角色及其相邻角色使用,目标下个摸牌阶段摸牌数-1', + gw_ciguhanshuang_info:'天气牌,出牌阶段对一名角色及其相邻角色使用,目标下个摸牌阶段摸牌数-1。', gw_wenyi:'瘟疫', - gw_wenyi_info:'令所有体力值为全场最少的角色随机弃置一张手牌;若没有手牌,改为失去1点体力', + gw_wenyi_info:'令所有体力值为全场最少的角色随机弃置一张手牌;若没有手牌,改为失去1点体力。', gw_yanziyaoshui:'燕子药水', - gw_yanziyaoshui_info:'令一名角色摸一张牌,若其手牌数为全场最少或之一,改为摸两张', + gw_yanziyaoshui_info:'令一名角色摸一张牌,若其手牌数为全场最少或之一,改为摸两张。', gw_shanbengshu:'山崩术', - gw_shanbengshu_info:'出牌阶段对自己使用,随机弃置两件敌方角色场上的装备', + gw_shanbengshu_info:'出牌阶段对自己使用,随机弃置两件敌方角色场上的装备。', gw_kunenfayin:'昆恩法印', - gw_kunenfayin_info:'出牌阶段对一名角色使用,目标防止所有非属性伤害,持续X个角色的回合(X为存活角色数且最多为5)', + gw_kunenfayin_info:'出牌阶段对一名角色使用,目标防止所有非属性伤害,持续X个角色的回合(X为存活角色数且最多为5)。', }, cardType:{ spell:0.5, diff --git a/card/hearth.js b/card/hearth.js index 997d38e8a..82600260f 100644 --- a/card/hearth.js +++ b/card/hearth.js @@ -690,33 +690,33 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, translate:{ linghunzhihuo:'灵魂之火', - linghunzhihuo_info:'对一名角色造成1点火焰伤害,然后随机弃置一张手牌', + linghunzhihuo_info:'对一名角色造成1点火焰伤害,然后随机弃置一张手牌。', shenenshu:'神恩术', - shenenshu_info:'出牌阶段对自己使用,将所有手牌(含此张)替换为基本牌', + shenenshu_info:'出牌阶段对自己使用,将所有手牌(含此张)替换为基本牌。', zhiliaobo:'治疗波', - zhiliaobo_info:'出牌阶段对一名受伤角色使用,目标进行一次判定,若结果为红色,则回复1点体力,否则获得1点护甲', + zhiliaobo_info:'出牌阶段对一名受伤角色使用,目标进行一次判定,若结果为红色,则回复1点体力,否则获得1点护甲。', yuansuhuimie:'元素毁灭', - yuansuhuimie_info:'对所有角色使用,令目标弃置0~2张牌,并受到2-X点雷电伤害,X为其弃置的手牌数', + yuansuhuimie_info:'对所有角色使用,令目标弃置0~2张牌,并受到2-X点雷电伤害,X为其弃置的手牌数。', xingjiegoutong:'星界沟通', - xingjiegoutong_info:'增加1点体力上限并回复1点体力,弃置你的所有手牌', + xingjiegoutong_info:'增加1点体力上限并回复1点体力,弃置你的所有手牌。', tanshezhiren:'弹射之刃', - tanshezhiren_info:'出牌阶段对自己使用,依次按敌方-友方-敌方-的顺序随机弃置阵营内一名随机角色的一张牌(目标不包含你),共结算X次,X为存活角色数,若X为偶数,改为X-1', + tanshezhiren_info:'出牌阶段对自己使用,依次按敌方-友方-敌方-的顺序随机弃置阵营内一名随机角色的一张牌(目标不包含你),共结算X次,X为存活角色数,若X为偶数,改为X-1。', chuansongmen:'传送门', - chuansongmen_info:'摸一张牌并展示,若发生在出牌阶段,你可以立即使用摸到的牌,若如此做,你将传送门收回手牌(每阶段最多收回2张传送门)', + chuansongmen_info:'摸一张牌并展示,若发生在出牌阶段,你可以立即使用摸到的牌,若如此做,你将传送门收回手牌(每阶段最多收回2张传送门)。', dunpaigedang:'盾牌格挡', - dunpaigedang_info:'获得1点护甲值,摸一张牌,然后弃置一张牌', + dunpaigedang_info:'获得1点护甲值,摸一张牌,然后弃置一张牌。', siwangchanrao:'死亡缠绕', - siwangchanrao_infox:'弃置一名其他角色的一张手牌,若其此时没有手牌,则你摸一张牌', + siwangchanrao_infox:'弃置一名其他角色的一张手牌,若其此时没有手牌,则你摸一张牌。', shihuawuqi:'石化武器', - shihuawuqi_infox:'本回合内攻击范围+1;若你手牌中没有杀,则从牌堆中获得一张杀', + shihuawuqi_infox:'本回合内攻击范围+1;若你手牌中没有杀,则从牌堆中获得一张杀。', shandianjian:'闪电箭', shandianjian_info:'目标角色展示一张手牌,然后若你能弃掉一张与所展示牌相同花色的手牌,则对该角色造成1点雷电伤害。', shijieshu:'视界术', - shijieshu_info:'目标从牌堆或弃牌堆中随机装备两张类别不同的装备牌,然后弃置一张牌', + shijieshu_info:'目标从牌堆或弃牌堆中随机装备两张类别不同的装备牌,然后弃置一张牌。', zhaomingdan:'照明弹', - zhaomingdan_info:'观看一名其他角色的手牌,并弃置其区域内的一张牌,然后其与你各摸一张牌', + zhaomingdan_info:'观看一名其他角色的手牌,并弃置其区域内的一张牌,然后其与你各摸一张牌。', jihuocard:'激活', - jihuocard_info:'摸一张牌,本回合手牌上限+2', + jihuocard_info:'摸一张牌,本回合手牌上限+2。', }, list:[ ['heart',2,'shenenshu'], diff --git a/card/sp.js b/card/sp.js index 2a00dc468..396e64816 100644 --- a/card/sp.js +++ b/card/sp.js @@ -197,6 +197,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return lib.card.shandian.ai.result.target(player,target); } }, + tag:{ + damage:0.25, + natureDamage:0.25, + thunderDamage:0.25, + } } }, qibaodao:{ diff --git a/card/standard.js b/card/standard.js index be39d7805..0039ce3b4 100644 --- a/card/standard.js +++ b/card/standard.js @@ -14,6 +14,16 @@ game.import('card',function(lib,game,ui,get,ai,_status){ } } }, + draw:{ + ai:{ + result:{ + target:1 + }, + tag:{ + draw:1 + } + } + }, losehp:{ ai:{ result:{ @@ -138,25 +148,18 @@ game.import('card',function(lib,game,ui,get,ai,_status){ next.set('prompt2','(在此之后仍需弃置一张手牌)'); } next.set('ai1',function(card){ - var target=_status.event.player; - var evt=_status.event.getParent(); - var bool=true; - if(_status.event.shanRequired>1&&!get.is.object(card)&&target.countCards('h','shan')<_status.event.shanRequired-(_status.event.shanIgnored||0)){ - bool=false; - } - else if(target.hasSkillTag('useShan')){ - bool=true; - } - else if(target.hasSkillTag('noShan')){ - bool=false; - } - else if(get.damageEffect(target,evt.player,target,evt.card.nature)>=0) bool=false; - if(bool){ - return get.order(card); - } + if(_status.event.useShan) return get.order(card); return 0; }).set('shanRequired',event.shanRequired); next.set('respondTo',[player,card]); + next.set('useShan',(()=>{ + if(target.hasSkillTag('noShan',null,event)) return false; + if(target.hasSkillTag('useShan',null,event)) return true; + if(event.baseDamage+event.extraDamage<=0 || get.attitude(target,player._trueMe||player)>0) bool=false; + if(event.shanRequired>1&&target.countCards('h','shan')=0) return false; + return true; + })()); //next.autochoose=lib.filter.autoRespondShan; } "step 2" @@ -228,7 +231,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(get.cardtag(card,'yingbian_hit')){ hit=true; if(targets.some(target=>{ - return target.mayHaveShan(viewer)&&get.attitude(viewer,target)<0&&get.damageEffect(target,player,viewer,get.natureList(card))>0; + return target.mayHaveShan(viewer,'use')&&get.attitude(viewer,target)<0&&get.damageEffect(target,player,viewer,get.natureList(card))>0; })) base+=5; } if(get.cardtag(card,'yingbian_add')){ @@ -238,7 +241,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ } if(get.cardtag(card,'yingbian_damage')){ if(targets.some(target=>{ - return get.attitude(player,target)<0&&(hit||!target.mayHaveShan(viewer)||player.hasSkillTag('directHit_ai',true,{ + return get.attitude(player,target)<0&&(hit||!target.mayHaveShan(viewer,'use')||player.hasSkillTag('directHit_ai',true,{ target:target, card:card, },true))&&!target.hasSkillTag('filterDamage',null,{ @@ -252,10 +255,6 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, canLink:function(player,target,card){ if(!target.isLinked()&&!player.hasSkill('wutiesuolian_skill')) return false; - if(target.mayHaveShan()&&!player.hasSkillTag('directHit_ai',true,{ - target:target, - card:card, - },true)) return false; if(player.hasSkill('jueqing')||player.hasSkill('gangzhi')||target.hasSkill('gangzhi')) return false; return true; }, @@ -265,7 +264,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(game.hasNature(item,'linked')){ + if(typeof item==='object'&&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){ @@ -295,7 +294,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ } return -1.5; }(); - if(!isLink&&target.mayHaveShan()&&!player.hasSkillTag('directHit_ai',true,{ + if(!isLink&&target.mayHaveShan(player,'use')&&!player.hasSkillTag('directHit_ai',true,{ target:target, card:card, },true)) return eff/1.2; @@ -457,7 +456,9 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(target.hp>0){ if(!player.isPhaseUsing()) return 0; let min = 7.2-4*player.hp/player.maxHp, - nd = player.needsToDiscard(-player.countCards('h',i=>!taos.includes(i)&&get.value(i){ + return !player.canIgnoreHandcard(i)&&(taos.includes(i)||get.value(i)>=min); + }), keep = nd?0:2; if(nd>2 || taos.length>1&&(nd>1||nd&&player.hp<1+taos.length) || target.identity==='zhu'&&(nd||target.hp<3)&&(mode==='identity'||mode==='versus'||mode==='chess') || !player.hasFriend()) return 2; if(game.hasPlayer(current=>{ @@ -1232,10 +1233,9 @@ game.import('card',function(lib,game,ui,get,ai,_status){ event._result={}; }, ai:{ - wuxie:function(target,card,player,viewer){ - if(player==game.me&&get.attitude(viewer,player)>0){ - return 0; - } + wuxie:function(target,card,player,viewer,status){ + if(player===game.me&&get.attitude(viewer,player._trueMe||player)>0) return 0; + if(status*get.attitude(viewer,target)*get.effect(target,card,player,target)>=0) return 0; }, basic:{ order:5, @@ -1299,9 +1299,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, ai:{ wuxie:function(target,card,player,viewer){ - if(get.attitude(viewer,player)>0&&get.attitude(viewer,target)>0){ - return 0; - } + if(get.attitude(viewer,player._trueMe||player)>0) return 0; }, basic:{ order:7.5, @@ -1578,7 +1576,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, ai:{ wuxie:(target,card,player,viewer,status)=>{ - if(status*get.attitude(viewer,player)>0&&!player.isMad() || target.hp>2&&!target.hasCard(i=>{ + if(status*get.attitude(viewer,player._trueMe||player)>0 || target.hp>2&&!target.hasCard(i=>{ let val=get.value(i,target),subtypes=get.subtypes(i); if(val<8&&target.hp<2&&!subtypes.includes('equip2')&&!subtypes.includes('equip5')) return false; return val>3+Math.min(5,target.hp); @@ -1828,9 +1826,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, ai:{ wuxie:function(target,card,player,viewer){ - if(player==game.me&&get.attitude(viewer,player)>0){ - return 0; - } + if(player==game.me&&get.attitude(viewer,player._trueMe||player)>0) return 0; }, basic:{ order:8, @@ -1844,12 +1840,12 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return num+get.value(i,player); },0); }, - target:(player,target)=>{ + target:(player,target,card)=>{ let targets=get.copy(ui.selected.targets); if(_status.event.preTarget) targets.add(_status.event.preTarget); if(targets.length){ - let preTarget=targets.lastItem,pre=_status.event.getTempCache('jiedao_result',preTarget); - if(pre&&pre.target.isIn()) return target===pre.target?pre.eff:0; + let preTarget=targets.lastItem,pre=_status.event.getTempCache('jiedao_result',preTarget.playerid); + if(pre&&pre.card===card&&pre.target.isIn()) return target===pre.target?pre.eff:0; return get.effect(target,{name:'sha'},preTarget,player)/get.attitude(player,target); } let arms=(target.hasSkillTag('noe')?0.32:-0.15)*target.getEquips(1).reduce((num,i)=>{ @@ -1865,7 +1861,8 @@ game.import('card',function(lib,game,ui,get,ai,_status){ },-100); if(!addTar) return arms; sha/=get.attitude(player,target); - _status.event.putTempCache('jiedao_result',target,{ + _status.event.putTempCache('jiedao_result',target.playerid,{ + card:card, target:addTar, eff:sha }); @@ -2040,7 +2037,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ result:{ target:function(player,target){ var num=game.countPlayer(function(current){ - var skills=current.getSkills(); + //var skills=current.getSkills(); for(var j=0;j0&&!player.isMad()) return 0; + if(get.attitude(viewer,player._trueMe||player)>0) return 0; if(!card.yingbian_all&&get.distance(player,target)>1&&!target.hasCard(i=>{ let val=get.value(i,target),subtypes=get.subtypes(i); if(val<8&&target.hp<2&&!subtypes.includes('equip2')&&!subtypes.includes('equip5')) return false; diff --git a/card/yongjian.js b/card/yongjian.js index c01819e63..b199e2ada 100644 --- a/card/yongjian.js +++ b/card/yongjian.js @@ -162,11 +162,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){ ai:{ order:9, value:function(card,player){ - if(player.getEquips(1).contains(card)) return 0; + if(player.getEquips(1).contains(card)) return 0.4; return 4; }, equipValue:function(card,player){ - if(player.getCards('e').contains(card)) return 0; + if(player.getCards('e').contains(card)) return 0.4; return -get.value(player.getCards('e')); }, basic:{ @@ -226,11 +226,17 @@ game.import('card',function(lib,game,ui,get,ai,_status){ ai:{ order:9, equipValue:function(card,player){ - if(get.position(card)=='e') return -2; + if(get.position(card)=='e'){ + if(player.hasSex('male')) return -7; + return 0; + } return 2; }, value:function(card,player){ - if(player.getEquips(2).contains(card)) return -3; + if(player.getEquips(2).contains(card)){ + if(player.hasSex('male')) return -8; + return 0; + } return 3; }, basic:{ @@ -260,11 +266,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){ ai:{ order:9, equipValue:function(card,player){ - if(get.position(card)=='e') return -1; + if(get.position(card)=='e') return -8; return 1; }, value:function(card,player){ - if(player.getEquips(2).contains(card)) return -2.5; + if(player.getEquips(2).contains(card)) return -10; return 2.5; }, basic:{ diff --git a/card/zhulu.js b/card/zhulu.js index 5b76a4d35..b86e02e1e 100644 --- a/card/zhulu.js +++ b/card/zhulu.js @@ -397,7 +397,10 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return 2; }, value:function(card,player){ - if(player.getEquips(1).contains(card)) return -1.5; + if(player.getEquips(1).contains(card)){ + if(player.hasSkillTag('noh')) return 0; + return -3.5; + } return 1.5; }, basic:{ @@ -436,7 +439,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return 2; }, value:function(card,player){ - if(player.getEquips(1).contains(card)) return -3; + if(player.getEquips(1).contains(card)) return -3.5; return 3; }, basic:{ @@ -471,11 +474,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){ ai:{ order:9, equipValue:function(card,player){ - if(get.position(card)=='e') return -1; + if(get.position(card)=='e') return -7; return 1; }, value:function(card,player){ - if(player.getEquips(2).contains(card)) return -2.5; + if(player.getEquips(2).contains(card)) return -9; return 2.5; }, basic:{ diff --git a/character/clan.js b/character/clan.js index 706833aee..f6f58f610 100644 --- a/character/clan.js +++ b/character/clan.js @@ -272,6 +272,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return get.cardNameLength(event.card)==player.getHistory('useCard').indexOf(event.getParent())+1; }, direct:true, + locked:false, content:function(){ 'step 0' var num=get.cardNameLength(trigger.card); @@ -1397,9 +1398,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.classList.remove('linked2'); var eff=cards[0][1]; if(eff>0) return eff; - return Math.max((get.effect(target,{name:'wuzhong'},player,player)+get.effect(player,{name:'wuzhong'},player,player)/3),get.recoverEffect(target,player,player)); + return Math.max((2*get.effect(target,{name:'draw'},player,player)+0.6*get.effect(player,{name:'draw'},player,player)),get.recoverEffect(target,player,player)); } - return Math.max((get.effect(target,{name:'wuzhong'},player,player)+get.effect(player,{name:'wuzhong'},player,player)/3),get.recoverEffect(target,player,player)); + return Math.max((2*get.effect(target,{name:'draw'},player,player)+0.6*get.effect(player,{name:'draw'},player,player)),get.recoverEffect(target,player,player)); }).set('goon',player.countCards('hs',card=>{ return get.name(card)=='jiu'&&player.hasUseTarget(card); })&&player.countCards('hs',card=>{ @@ -1424,7 +1425,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var player=_status.event.player,target=_status.event.getParent().target; if(!target.isDamaged()) return 0; if(get.attitude(player,target)<=0&&player.countCards('he',card=>get.value(card)<0)>=2) return 0; - return (get.effect(target,{name:'wuzhong'},player,player)+get.effect(player,{name:'wuzhong'},player,player)/3)>get.recoverEffect(target,player,player)?0:1; + return (2*get.effect(target,{name:'draw'},player,player)+0.6*get.effect(player,{name:'draw'},player,player))>get.recoverEffect(target,player,player)?0:1; }); } else event.finish(); diff --git a/character/collab.js b/character/collab.js index cc55af7b4..a434637d9 100644 --- a/character/collab.js +++ b/character/collab.js @@ -95,34 +95,33 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player._dcsantou_temp) return; if(get.tag(card,'damage')){ const hp=target.getHp(); + player._dcsantou_temp=true; + const losehp=get.effect(target,{name:'losehp'},target,target)/get.attitude(target,target); + delete player._dcsantou_temp; if(hp>=3){ - if(target.hasHistory('useSkill',evt=>evt.skill=='dcsantou'&&evt.event.getTrigger().source==player)) return [1,-2]; + if(target.hasHistory('useSkill',evt=>evt.skill=='dcsantou'&&evt.event.getTrigger().source==player)) return [0,losehp,0,0]; else if(get.attitude(player,target)<0){ - if(card.name=='sha') return; - let sha=false; - player._dcsantou_temp=true; - let num=player.countCards('h',card=>{ - if(card.name=='sha'){ - if(sha) return false; - else sha=true; + let hs=player.getCards('hs',i=>{ + return i!==card&&(!card.cards||!card.cards.includes(i)); + }),num=player.getCardUsable('sha'); + if(card.name==='sha') num--; + hs=hs.filter(i=>{ + if(!player.canUse(i,target)) return false; + if(get.tag(card,'damage')&&get.name(i,player)!=='sha') return true; + if(num){ + num--; + return true; } - return get.tag(card,'damage')&&player.canUse(card,target)&&get.effect(target,card,player,player)>0; - }); - delete player._dcsantou_temp; - if(player.hasSkillTag('damage')){ - num++; - } - if(num<2){ - var enemies=player.getEnemies(); - if(enemies.length==1&&enemies[0]==target&&player.needsToDiscard()){ - return; - } - return 0; - } + return false; + }).length; + if(player.hasSkillTag('damage',null,{target:target})) hs++; + if(!hs) return 'zeroplayertarget'; + num=1-2/3/hs; + return [num,0,num,0]; } } - else if(hp==2&&get.tag(card,'natureDamage')||hp==1&&get.color(card)=='red'&&get.itemtype(card)=='card') return [1,-2]; - else return 0; + if(hp==2&&get.tag(card,'natureDamage')||hp==1&&typeof card=='object'&&get.color(card)=='red') return [0,losehp,0,0]; + return 'zeroplayertarget'; } } } @@ -160,6 +159,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } else event.finish(); + }, + ai:{ + reverseEquip:true } }, //隅泣曹操 @@ -254,9 +256,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var player=_status.event.player; var card={name:button.link[2],nature:button.link[3],isCard:true}; if(card.name=='tao'){ - if(player.hp==1||(player.hp==2&&!player.hasShan())||player.needsToDiscard()){ - return 5; - } + if(player.hp==1||(player.hp==2&&!player.hasShan())||player.needsToDiscard()) return 5; return 1; } if(card.name=='sha'){ @@ -372,10 +372,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, ai:{ - order:1, + order:function(item,player){ + if(player.hasCard((i)=>{ + return get.value(i)>Math.max(6,9-player.hp); + },'he')) return 1; + return 10; + }, result:{ player:1 }, + nokeep:true, + skillTagFilter:function(player,tag,arg){ + if(tag==='nokeep') return (!arg||arg&&arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&player.countSkill('dczhiheng')<1+player.getStorage('dczhiheng_hit').length&&player.hasCard((card)=>{ + return get.name(card)!=='tao'; + },'h'); + }, threaten:1.55 }, }, diff --git a/character/ddd.js b/character/ddd.js index cbbdf2f66..c011ba90d 100644 --- a/character/ddd.js +++ b/character/ddd.js @@ -794,7 +794,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return get.color(card)==color; },'h')){ if(color=='red') return get.recoverEffect(player,player,player)+2/Math.max(2,get.value(button.link)); - if(color=='black') return get.effect(target,{name:'wuzhong'},target,player)+2/Math.max(2,get.value(button.link)); + if(color=='black') return 2*get.effect(target,{name:'draw'},target,player)+2/Math.max(2,get.value(button.link)); } return get.value(button.link)/3; }) @@ -828,7 +828,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var prompt2='用'+get.translation(event.card1)+'交换对方的'+get.translation(event.card2); if(color=='black'){ prompt2+=',然后对方摸两张牌'; - next.set('goon',get.effect(target,{name:'wuzhong'},target,player)>0); + next.set('goon',2*get.effect(target,{name:'draw'},target,player)>0); } else if(color=='red'&&player.isDamaged()){ prompt2+=',然后你回复1点体力'; @@ -1105,7 +1105,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' player.chooseTarget('是否令一名其他角色摸等量的牌?',lib.filter.notMe).set('ai',target=>{ var player=get.player(); - return get.effect(target,{name:'wuzhong'},player,player); + return get.effect(target,{name:'draw'},player,player); }); 'step 2' if(result.bool){ @@ -1676,7 +1676,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return player.countCards('h')==target.countCards('h')&&player!=target; }).set('ai',target=>{ var player=get.player(); - return Math.max(get.effect(target,{name:'wuzhong'},player,player),get.effect(target,{name:'guohe'},player,player)/2); + return Math.max(get.effect(target,{name:'draw'},player,player),get.effect(target,{name:'guohe'},player,player)/2); }); if(result.bool){ var target=result.targets[0]; @@ -1729,7 +1729,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ })){ player.chooseTarget('整军:是否令一名角色摸一张牌?').set('ai',function(target){ var player=_status.event.player; - return get.effect(target,{name:'wuzhong'},player,player); + return get.effect(target,{name:'draw'},player,player); }); } else event.goto(2); @@ -5078,12 +5078,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!target.hasFriend()) return; var num=1; if(get.attitude(player,target)>0){ - if(player.needsToDiscard()){ - num=0.7; - } - else{ - num=0.5; - } + if(player.needsToDiscard()) num=0.7; + else num=0.5; } if(target.hp>=4) return [1,num*2.5]; if(target.hp==3) return [1,num*1.5]; diff --git a/character/diy.js b/character/diy.js index 01eecb361..f64456b46 100755 --- a/character/diy.js +++ b/character/diy.js @@ -1414,7 +1414,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var player=_status.event.player,target=_status.event.getParent().target; switch(button.link){ case 'damage':return get.damageEffect(target,player,player); - case 'draw':return get.effect(player,{name:'wuzhong'},player,player) + case 'draw':return 2*get.effect(player,{name:'draw'},player,player) case 'discard':return get.effect(target,{name:'guohe_copy2'},player,player)*Math.min(1.6,target.countCards('he')); case 'use':return _status.event.getRand('minagi_peiquan')*4; } @@ -1447,7 +1447,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return baseEffect+Math.max(...choices.map(choice=>{ switch(choice){ case 'damage':return get.damageEffect(target,player,player); - case 'draw':return get.effect(player,{name:'wuzhong'},player,player); + case 'draw':return 2*get.effect(player,{name:'draw'},player,player); case 'discard':return get.effect(target,{name:'guohe_copy2'},player,player)*Math.min(1.6,target.countCards('he')); case 'use':return _status.event.getRand('minagi_peiquan')*4; } @@ -2643,7 +2643,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseTarget('退论:是否令一名角色摸一张牌或弃置一张牌?').set('ai',function(target){ var player=_status.event.player; var att=get.attitude(player,target); - if(att>0||target.countCards('he')==0) return get.effect(target,{name:'wuzhong'},player,player)/2; + if(att>0||target.countCards('he')==0) return get.effect(target,{name:'draw'},player,player); return get.effect(target,{name:'guohe_copy2'},target,player); }); } @@ -3513,7 +3513,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ list.remove(player.storage.kyou_zhidian); player.chooseControl(list).set('prompt','掷典:请为'+get.translation(trigger.card)+'选择一种效果').set('choice',function(){ if(list.contains('不计入次数')&&player.hasSha()) return '不计入次数'; - if(list.contains('不可被响应')&&trigger.target.mayHaveShan()) return '不可被响应'; + if(list.contains('不可被响应')&&trigger.target.mayHaveShan(_status.event.player,'use')) return '不可被响应'; if(list.contains('伤害+1')) return '伤害+1'; return list.randomGet(); }()).set('ai',()=>_status.event.choice); @@ -7778,7 +7778,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mod:{ globalFrom:function(from,to,num){ return num-game.countPlayer(function(current){ - return current!=from&¤t.isFriendOf(from)&¤t.hasSkill('yuzuru_bujin'); + return current!=from&¤t.hasSkill('yuzuru_bujin')&¤t.isFriendOf(from); }); }, }, @@ -11916,6 +11916,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, nslongyue:{ + init:()=>{ + game.addGlobalSkill('nslongyue_ai'); + }, + onremove:()=>{ + if(!game.hasPlayer(i=>i.hasSkill('nslongyue'),true)) game.removeGlobalSkill('nslongyue_ai'); + }, trigger:{global:'useCard'}, filter:function(event,player){ return get.type(event.card,'trick')=='trick'&&event.player.getHistory('useCard').indexOf(event)==0; @@ -11929,8 +11935,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ expose:0.2, - }, - global:'nslongyue_ai', + } }, nslongyue_ai:{ mod:{ @@ -11940,6 +11945,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ })) return num+6; }, }, + trigger:{player:'dieAfter'}, + filter:()=>{ + return !game.hasPlayer(i=>i.hasSkill('nslongyue'),true); + }, + silent:true, + forceDie:true, + content:()=>{ + game.removeGlobalSkill('nslongyue_ai'); + } }, nszhenyin:{ trigger:{global:'judge'}, @@ -12458,7 +12472,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ choicex=choices.slice(0); var getx=function(a){ switch(a){ - case 'draw':return get.effect(player,{name:'wuzhong'},player,player); + case 'draw':return 2*get.effect(player,{name:'draw'},player,player); case 'damage':return get.damageEffect(_status.event.getParent().target,player,player); default:return 0; } @@ -12637,10 +12651,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.getStorage('junktaoluan2').includes(get.suit(card))) return false; if(player.getStorage('junktaoluan').includes(name)) return false; if(get.type(name)!='basic'&&get.type(name)!='trick') return false; - if(event.filterCard({name:name,isCard:true,cards:[card]})) return true; + if(event.filterCard({name:name,isCard:true,cards:[card]},player,event)) return true; if(name=='sha'){ for(var nature of lib.inpile_nature){ - if(event.filterCard({name:name,nature:nature,isCard:true,cards:[card]})) return true; + if(event.filterCard({name:name,nature:nature,isCard:true,cards:[card]},player,event)) return true; } } return false; @@ -18139,7 +18153,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ umi_qihuan:'七幻', umi_qihuan_info:'限定技,当你处于濒死状态时,你可以移去此武将牌。若如此做,你回复X点体力(X为场上势力数)。然后,你可获得场上已死亡角色武将牌上的至多两个技能。', komari_tiankou:'甜口', - komari_tiankou_info:'锁定技,当你使用红色的非伤害性基本牌/锦囊牌选择目标时,或成为其他角色使用的这些牌的目标时,你选择一项:1.摸一张牌;2.为此牌增加一个目标', + komari_tiankou_info:'锁定技,当你使用红色的非伤害性基本牌/锦囊牌选择目标时,或成为其他角色使用的这些牌的目标时,你选择一项:1.摸一张牌;2.为此牌增加一个目标。', komari_xueshang:'血殇', komari_xueshang_info:'锁定技,蓄能技,当有角色死亡时,你对自己造成1点伤害,然后对所有其他角色依次造成1点伤害。当有角色因此法进入濒死状态时,你加1点体力上限并回复1点体力,然后失去此技能并终止此技能的所有后续结算。', yukine_wenzhou:'问咒', @@ -18224,7 +18238,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rin_baoqiu:'暴球', rin_baoqiu_info:'锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。', sasami_miaobian:'喵变', - sasami_miaobian_info:'当你的体力值变为:3以下时,你获得技能〖公清〗,2以下时,你获得技能〖复难〗,1以下时,你获得技能〖暴球〗', + sasami_miaobian_info:'当你的体力值变为:3以下时,你获得技能〖公清〗,2以下时,你获得技能〖复难〗,1以下时,你获得技能〖暴球〗。', sasami_gongqing:"公清", sasami_gongqing_info:"锁定技。当你受到伤害时,若伤害来源的攻击范围:<3,则你令此伤害的数值减为1。>3,你令此伤害+1。", sasami_funan:'复难', @@ -18232,7 +18246,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sasami_baoqiu:'暴球', sasami_baoqiu_info:'锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。', akane_jugu:'巨贾', - akane_jugu_info:'锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)', + akane_jugu_info:'锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)。', akane_quanqing:'权倾', akane_quanqing_info:'出牌阶段,你可选择:1.弃置一张点数大于10的牌并对攻击范围内的一名其他角色造成1点伤害;2.弃置一张点数大于6的牌并弃置攻击范围内的一名其他角色区域内的一张牌。3.弃置一张牌并令攻击范围内的一名其他角色摸一张牌。', akane_yifu:'蚁附', @@ -18381,7 +18395,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ kotori_skill_wu:'吴耀', kotori_skill_wu_info:'回合结束时,若你的手牌数不等于你的体力值,则你摸一张牌。', kotori_skill_qun:'群心', - kotori_skill_qun_info:'锁定技,弃牌阶段开始时,若你的手牌数比体力值多2或更多,你本回合手牌上限+1;若你已损失体力值大于1,你手牌上限+1', + kotori_skill_qun_info:'锁定技,弃牌阶段开始时,若你的手牌数比体力值多2或更多,你本回合手牌上限+1;若你已损失体力值大于1,你手牌上限+1。', kotori_skill_key:'键魂', kotori_skill_key_info:'出牌阶段限一次,你可以摸一张牌并获得1点护甲。若如此做,你于当前回合结束时失去1点体力。', kotori_skill_jin:'晋势', @@ -18395,7 +18409,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ kotori_huazhan:'花绽', kotori_huazhan_info:'每回合每种魔物限一次,你可将一个蓝色/红色/绿色/黄色/紫色/灰色魔物当做【树上开花】使用。', jojiro_shensu:'神速', - jojiro_shensu_info:'你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】', + jojiro_shensu_info:'你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】。', jojiro_shensu1:'神速', jojiro_shensu2:'神速', jojiro_shensu4:'神速', @@ -18591,7 +18605,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ minagi_peiquan:'配券', minagi_peiquan_info:'锁定技。①游戏开始时,你将你所有的手牌记录为“米券”。②出牌阶段,你可以赠予一张“米券”,然后执行一项本回合内未被选择过的效果:⒈对其造成1点伤害;⒉摸两张牌;⒊弃置其的两张牌;⒋亮出牌堆顶的一张牌,然后你可以使用之。', minagi_huanliu:'幻流', - minagi_huanliu_info:'准备阶段开始时,你可与一名其他角色进行协力,并获得“远野小满”的所有技能直到目标角色的结束阶段开始。若“协力”成功,则你可以将所有手牌记录为“米券”', + minagi_huanliu_info:'准备阶段开始时,你可与一名其他角色进行协力,并获得“远野小满”的所有技能直到目标角色的结束阶段开始。若“协力”成功,则你可以将所有手牌记录为“米券”。', key_michiru:'远野小满', michiru_sheyuan:'舍愿', michiru_sheyuan_info:'每轮限一次。若你没有“米券”,则你可以将所有手牌当做任意基本牌或普通锦囊牌使用,然后摸等量的牌。', @@ -18710,111 +18724,111 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nsjuanli:'狷戾', nsjuanli_info:'出牌阶段限一次,你可以和一名有手牌的其他角色进行赌牌,若你赢,目标角色失去1点体力且该角色与你距离-1直到与你下次赌牌,若你没赢,目标角色回复1点体力,且该角色与你距离+1直到与你的下次赌牌。(赌牌:赌牌的两名角色分别亮开一张手牌,若花色相同则赌牌平局,若花色不同,则依次展示牌堆顶的牌直到翻开的牌与其中一人亮出牌的花色相同,则该角色获得赌牌的胜利)', nsyuanchou:'远筹', - nsyuanchou_info:'锁定技,当你成为锦囊牌的目标时,若来源角色与你的距离大于1,则取消之', + nsyuanchou_info:'锁定技,当你成为锦囊牌的目标时,若来源角色与你的距离大于1,则取消之。', nsguhuo:'蛊惑', - nsguhuo_info:'锁定技,你在一个回合中使用前两张牌时,你对一名随机角色从牌堆(牌堆无则从弃牌堆)随机使用一张同类别卡牌', + nsguhuo_info:'锁定技,你在一个回合中使用前两张牌时,你对一名随机角色从牌堆(牌堆无则从弃牌堆)随机使用一张同类别卡牌。', nsqinxue:'勤学', - nsqinxue_info:'每个效果每回合只能使用一次。①当你使用一张基本牌时,你从牌堆随机获得一张锦囊牌;②当你使用一张锦囊牌时,你从牌堆随机获得一张装备牌;③当你使用一张装备牌时,你从牌堆随机获得一张基本牌', + nsqinxue_info:'每个效果每回合只能使用一次。①当你使用一张基本牌时,你从牌堆随机获得一张锦囊牌;②当你使用一张锦囊牌时,你从牌堆随机获得一张装备牌;③当你使用一张装备牌时,你从牌堆随机获得一张基本牌。', nsbaiyi:'白衣', - nsbaiyi_info:'锁定技,若你本回合发动过勤学,你跳过弃牌阶段,改为弃置X张牌(X为本回合发动勤学次数);若你弃置了3张类别不同的牌,你获得一个额外回合(不可连续获得回合),否则你观看牌堆顶的X张牌并获得其中一张', + nsbaiyi_info:'锁定技,若你本回合发动过勤学,你跳过弃牌阶段,改为弃置X张牌(X为本回合发动勤学次数);若你弃置了3张类别不同的牌,你获得一个额外回合(不可连续获得回合),否则你观看牌堆顶的X张牌并获得其中一张。', nsbaiming:'百鸣', - nsbaiming_info:'当你使用【杀】时,你可以获得一项未获得过且与杀或伤害相关的技能,此【杀】结算完毕后,你失去以此法获得的技能', + nsbaiming_info:'当你使用【杀】时,你可以获得一项未获得过且与杀或伤害相关的技能,此【杀】结算完毕后,你失去以此法获得的技能。', nsfuge:'覆戈', - nsfuge_info:'你的回合结束后,你可以执行一个额外的回合,此回合的摸牌阶段,你于摸牌阶段额外摸X张牌(X为你已损失的体力值);若如此做,直到洗牌前,你不能再发动此技能', + nsfuge_info:'你的回合结束后,你可以执行一个额外的回合,此回合的摸牌阶段,你于摸牌阶段额外摸X张牌(X为你已损失的体力值);若如此做,直到洗牌前,你不能再发动此技能。', nstanbing:'谈兵', - nstanbing_info:'摸牌阶段开始时,你可弃置一张手牌,然后摸X张牌(X为你弃置牌的名称字数),若如此做,本回合你不可使用或打出【杀】', + nstanbing_info:'摸牌阶段开始时,你可弃置一张手牌,然后摸X张牌(X为你弃置牌的名称字数),若如此做,本回合你不可使用或打出【杀】。', nsxinzhan:'心战', - nsxinzhan_info:'出牌阶段限一次,你可将任意张手牌交给一名其他角色,若如此做,该角色失去X点体力(X为你交给其的牌张数的一半,向下取整),若你给的牌达到六张,则改为该角色失去1点体力上限', + nsxinzhan_info:'出牌阶段限一次,你可将任意张手牌交给一名其他角色,若如此做,该角色失去X点体力(X为你交给其的牌张数的一半,向下取整),若你给的牌达到六张,则改为该角色失去1点体力上限。', nsfuhuo:'符火', nsfuhuo2:'符火', - nsfuhuo_info:'出牌阶段限一次,你可将一张手牌置于一名武将牌上没有“符”的角色的武将牌上,称为“符”,若如此做,其回合外使用或打出【闪】时,你可令其判定,若结果为:红桃,你对其造成2点火焰伤害;方块,你弃置其一张手牌,然后对其造成1点火焰伤害。你的下个回合开始时,你获得其武将牌上的“符”', + nsfuhuo_info:'出牌阶段限一次,你可将一张手牌置于一名武将牌上没有“符”的角色的武将牌上,称为“符”,若如此做,其回合外使用或打出【闪】时,你可令其判定,若结果为:红桃,你对其造成2点火焰伤害;方块,你弃置其一张手牌,然后对其造成1点火焰伤害。你的下个回合开始时,你获得其武将牌上的“符”。', nswangfeng:'望风', - nswangfeng_info:'在判定牌生效前,你可以打出一张红色牌替换之', + nswangfeng_info:'在判定牌生效前,你可以打出一张红色牌替换之。', nshunji:'混击', - nshunji_info:'出牌阶段限一次,你可以摸一张牌,视为使用一张【万箭齐发】。此【万箭齐发】造成伤害时,受伤害角色选择一项:①弃置你一张牌;②摸一张牌', + nshunji_info:'出牌阶段限一次,你可以摸一张牌,视为使用一张【万箭齐发】。此【万箭齐发】造成伤害时,受伤害角色选择一项:①弃置你一张牌;②摸一张牌。', nscuanquan:'篡权', - nscuanquan_info:'锁定技,如果你的身份为忠臣,则在受伤三次后与主公,互换身份和体力上限', + nscuanquan_info:'锁定技,如果你的身份为忠臣,则在受伤三次后与主公,互换身份和体力上限。', nsjianning:'奸佞', - nsjianning_info:'出牌阶段限一次,如果你的身份为内奸,你可以与一名手牌数比你少的角色交换手牌,并对其造成1点伤害', + nsjianning_info:'出牌阶段限一次,如果你的身份为内奸,你可以与一名手牌数比你少的角色交换手牌,并对其造成1点伤害。', nschangshi:'常仕', - nschangshi_info:'出牌阶段限一次,如果你的身份为反贼,你可以指定两名其他角色互换体力;如果两名角色体力之差等于1,你失去1点体力', + nschangshi_info:'出牌阶段限一次,如果你的身份为反贼,你可以指定两名其他角色互换体力;如果两名角色体力之差等于1,你失去1点体力。', nsbaquan:'霸权', - nsbaquan_info:'回合结束时,你可以弃置所有手牌,并获得相应点数的护甲,你的新一回合开始时清除所有护甲', + nsbaquan_info:'回合结束时,你可以弃置所有手牌,并获得相应点数的护甲,你的新一回合开始时清除所有护甲。', nsbugua:'卜卦', - nsbugua_use_info:'弃置一张牌,并将牌堆顶的六张牌反面朝上逐张按先后顺序排放,然后抛骰子,展示牌序号与骰子显示的点数一致的牌,然后你根据这张牌的花色、点数随机获得牌堆中相应的一张牌', + nsbugua_use_info:'弃置一张牌,并将牌堆顶的六张牌反面朝上逐张按先后顺序排放,然后抛骰子,展示牌序号与骰子显示的点数一致的牌,然后你根据这张牌的花色、点数随机获得牌堆中相应的一张牌。', nsbugua_info:'出牌阶段限一次,你可以弃置一张牌,并将牌堆顶的六张牌反面朝上逐张按先后顺序排放,然后抛骰子,展示牌序号与骰子显示的点数一致的牌,然后你根据这张牌的花色、点数按以下规则随机获得牌堆中相应的一张牌:乾(红桃偶数):无中生有;坤(黑桃奇数):决斗;震(黑桃偶数):南蛮入侵;巽(红桃奇数):万箭齐发;坎(梅花偶数):过河拆桥、兑(梅花奇数):借刀杀人、艮(方片偶数):顺手牵羊、离(方片奇数):火攻。若牌堆中无此牌则摸一张牌,然后你观看未展示的另外五张牌并按任意顺序将其置于牌堆顶。', nstuiyan:'推演', - nstuiyan_info:'出牌阶段,若你使用的牌点数比上一张使用的牌点数大,你可以摸一张牌,反之你本回合不能再以此法摸牌;当你使用的牌点数首次达到8的倍数时,你可以在结算后立即发动一次【卜卦】', + nstuiyan_info:'出牌阶段,若你使用的牌点数比上一张使用的牌点数大,你可以摸一张牌,反之你本回合不能再以此法摸牌;当你使用的牌点数首次达到8的倍数时,你可以在结算后立即发动一次【卜卦】。', nstianji:'天机', - nstianji_info:'限定技,当一名其他角色进入濒死状态,你可自减1点体力上限,令其回复体力至1并增加1点体力上限', + nstianji_info:'限定技,当一名其他角色进入濒死状态,你可自减1点体力上限,令其回复体力至1并增加1点体力上限。', nszhaoxin:'昭心', - nszhaoxin_info:'锁定技,你始终展示手牌', + nszhaoxin_info:'锁定技,你始终展示手牌。', nsxiuxin:'修穆', - nsxiuxin_info:'锁定技,若你没有某种花色的手牌,你不能成为这种花色的牌的目标', + nsxiuxin_info:'锁定技,若你没有某种花色的手牌,你不能成为这种花色的牌的目标。', nsshijun:'弑君', - nsshijun_info:'锁定技,你造成伤害时,你令此伤害+1,并在结算后失去1点体力', + nsshijun_info:'锁定技,你造成伤害时,你令此伤害+1,并在结算后失去1点体力。', nshunyou:'魂佑', - nshunyou_info:'出阶段限一次,你可以弃置一张基本牌,获得弃牌堆底的一张装备牌和一张锦囊牌,然后你可以将那张装备牌装备给一名角色(允许替换)。如果弃牌堆没有装备以及锦囊牌,则改为摸X张牌,X为损失的体力加一(最多3张)', + nshunyou_info:'出阶段限一次,你可以弃置一张基本牌,获得弃牌堆底的一张装备牌和一张锦囊牌,然后你可以将那张装备牌装备给一名角色(允许替换)。如果弃牌堆没有装备以及锦囊牌,则改为摸X张牌,X为损失的体力加一(最多3张)。', nswulie:'武烈', - nswulie_info:'限定技,准备阶段,你可以失去1点体力上限,从弃牌堆选择最多三张牌以任意顺序放置于牌堆顶。若如此做,此回合的结束阶段,你可以重复此操作', + nswulie_info:'限定技,准备阶段,你可以失去1点体力上限,从弃牌堆选择最多三张牌以任意顺序放置于牌堆顶。若如此做,此回合的结束阶段,你可以重复此操作。', nscangxi:'藏玺', nscangxi2:'藏玺', - nscangxi_info:'主公技,其他吴势力角色的弃牌阶段结束时,若其弃置了至少两张牌,则可以选择判定,若是黑色,则其选择一项,1,令主公摸一张并且展示;2,主公手牌上限永久加一;3,额外弃置一张牌,令主公获得本回合进入弃牌堆的一张牌', + nscangxi_info:'主公技,其他吴势力角色的弃牌阶段结束时,若其弃置了至少两张牌,则可以选择判定,若是黑色,则其选择一项,1,令主公摸一张并且展示;2,主公手牌上限永久加一;3,额外弃置一张牌,令主公获得本回合进入弃牌堆的一张牌。', nsdongcha:'洞察', - nsdongcha_info:'锁定技,单体锦囊牌无法对你造成伤害。其它角色于其回合内第二次使用锦囊牌指定你为目标时,取消之', + nsdongcha_info:'锁定技,单体锦囊牌无法对你造成伤害。其它角色于其回合内第二次使用锦囊牌指定你为目标时,取消之。', nscaijian:'才鉴', - nscaijian_info:'出牌阶段限一次,若你的手牌数不大于你的体力上限,则你可以展示你的手牌,观看牌堆顶相同数量的牌并以任意方式交换之', + nscaijian_info:'出牌阶段限一次,若你的手牌数不大于你的体力上限,则你可以展示你的手牌,观看牌堆顶相同数量的牌并以任意方式交换之。', nsgongjian:'恭俭', - nsgongjian_info:'锁定技,弃牌阶段,你须将弃牌交给一名体力值大于你的其它角色', + nsgongjian_info:'锁定技,弃牌阶段,你须将弃牌交给一名体力值大于你的其它角色。', nsjianxiong:'奸雄', - nsjianxiong_info:'当你成为一名角色牌的目标后你可以对该角色使用一张牌,若此牌对其造成伤害,则该角色的牌失效。若失效的为黑色牌,则你摸一张牌', + nsjianxiong_info:'当你成为一名角色牌的目标后你可以对该角色使用一张牌,若此牌对其造成伤害,则该角色的牌失效。若失效的为黑色牌,则你摸一张牌。', nsxionglue:'雄略', - nsxionglue_info:'出牌阶段限一次,你可以弃置一张黑色手牌,然后发现一张锦囊牌', + nsxionglue_info:'出牌阶段限一次,你可以弃置一张黑色手牌,然后发现一张锦囊牌。', nsyaowang:'妖妄', - nsyaowang_info:'回合开始阶段你可以选择一名角色然后获得其其中一项技能直到回合结束,然后该角色随机获得一项未上场武将的其中一项技能直到其回合结束', + nsyaowang_info:'回合开始阶段你可以选择一名角色然后获得其其中一项技能直到回合结束,然后该角色随机获得一项未上场武将的其中一项技能直到其回合结束。', nshuanhuo:'幻惑', - nshuanhuo_info:'每当你失去1点体力或受到一次大于2的伤害时,你可以交换除你之外的两名角色的武将牌(体力及体力上限不变)', + nshuanhuo_info:'每当你失去1点体力或受到一次大于2的伤害时,你可以交换除你之外的两名角色的武将牌(体力及体力上限不变)。', nsjianshu:'剑术', - nsjianshu_info:'锁定技:每当你的装备区有武器时,你使用【杀】指定一个目标后,该角色需要依次使用两张【闪】才能抵消此【杀】', + nsjianshu_info:'锁定技:每当你的装备区有武器时,你使用【杀】指定一个目标后,该角色需要依次使用两张【闪】才能抵消此【杀】。', nscangjian:'藏剑', - nscangjian_info:'每当你对一名角色造成伤害,你可以获得其装备区一张牌', + nscangjian_info:'每当你对一名角色造成伤害,你可以获得其装备区一张牌。', nsyunxing:'陨星', - nsyunxing_info:'锁定技,当场上一名角色死亡,若为蜀,你失去1点体力;若为吴,你回复1点体力;若为魏,你摸一张牌并弃置一名角色的手牌;若为群,你强制结束当前回合;若为你,你可以使一名角色翻面', + nsyunxing_info:'锁定技,当场上一名角色死亡,若为蜀,你失去1点体力;若为吴,你回复1点体力;若为魏,你摸一张牌并弃置一名角色的手牌;若为群,你强制结束当前回合;若为你,你可以使一名角色翻面。', nsguanxing:'观星', - nsguanxing_info:'锁定技,准备阶段,你观看牌堆的X张牌(X为场上存活人数)并且任意移动Y张牌(Y为你当前体力值)', + nsguanxing_info:'锁定技,准备阶段,你观看牌堆的X张牌(X为场上存活人数)并且任意移动Y张牌(Y为你当前体力值)。', nscaiyi:'猜疑', - nscaiyi_info:'其他角色摸牌后,你可以观看其摸到的牌,若其中有【杀】,则视为你对其使用一张【杀】,若其中没有【杀】,则视为其对你使用一张【杀】(计入出杀次数)', + nscaiyi_info:'其他角色摸牌后,你可以观看其摸到的牌,若其中有【杀】,则视为你对其使用一张【杀】,若其中没有【杀】,则视为其对你使用一张【杀】(计入出杀次数)。', nsgefa:'割发', - nsgefa_info:'当你的体力值等于0或更低时,你可以将任意一张♣牌当【桃】使用', + nsgefa_info:'当你的体力值等于0或更低时,你可以将任意一张♣牌当【桃】使用。', nshaoling:'号令', - nshaoling_info:'限定技,出牌阶段,你可以指定一名其他角色,令另外所有其他角色角色选择一项:1、对该角色使用一张【杀】;2、交给你一张牌,然后视为你对其使用一张【杀】', + nshaoling_info:'限定技,出牌阶段,你可以指定一名其他角色,令另外所有其他角色角色选择一项:1、对该角色使用一张【杀】;2、交给你一张牌,然后视为你对其使用一张【杀】。', nspinmin:'拼命', - nspinmin_info:'锁定技,当你于回合内死亡时,你不死亡并增加1点体力上限(每回合最多增加1点且不能超过4);当你于回合外死亡时,你不死亡并减少1点体力上限(体力上限为0会导致你死亡)', + nspinmin_info:'锁定技,当你于回合内死亡时,你不死亡并增加1点体力上限(每回合最多增加1点且不能超过4);当你于回合外死亡时,你不死亡并减少1点体力上限(体力上限为0会导致你死亡)。', nsshishou:'失手', - nsshishou_info:'锁定技,当你于回合内失去手牌时,你失去1点体力并摸一张牌;你回合内使用的牌数不能超过4', + nsshishou_info:'锁定技,当你于回合内失去手牌时,你失去1点体力并摸一张牌;你回合内使用的牌数不能超过4。', nsduijue:'对决', - nsduijue_info:'出牌阶段开始时,你可以弃置一张手牌,若如此做,此阶段你可以将一张与此牌颜色不同的手牌当作[决斗]使用(限2次)', + nsduijue_info:'出牌阶段开始时,你可以弃置一张手牌,若如此做,此阶段你可以将一张与此牌颜色不同的手牌当作【决斗】使用(限2次)。', nsshuangxiong:'双雄', - nsshuangxiong_info:'当你使用[决斗]或被使用[决斗]时,你可以将武将牌翻面', - nsshuangxiong_append:'背面武将:文丑,2体力,你可以将一张牌当[杀]打出', + nsshuangxiong_info:'当你使用【决斗】或被使用【决斗】时,你可以将武将牌翻面。', + nsshuangxiong_append:'背面武将:文丑,2体力,你可以将一张牌当【杀】打出。', nsguanyong:'冠勇', - nsguanyong_info:'你可以将一张手牌当[杀]打出', + nsguanyong_info:'你可以将一张手牌当【杀】打出。', nsjihui:'急恚', - nsjihui_info:'锁定技,每当一名角色一次弃置了三张或更多的牌,你获得一个额外回合;你的额外回合内,你使用牌只能指定你与上一回合角色为目标', + nsjihui_info:'锁定技,每当一名角色一次弃置了三张或更多的牌,你获得一个额外回合;你的额外回合内,你使用牌只能指定你与上一回合角色为目标。', nsmouyun:'谋运', nsmouyun_info:'每两轮限一次,你可以弃置场上体力值最少的一名其他角色区域内的X张牌。(X为其损失的体力值)', nscongjun:'从军', - nscongjun_info:'锁定技,游戏开始时,你变身为一名随机男性角色;当一名敌方角色使用无懈可击时,你有小概率亮出此武将并变回花木兰,然后对该角色造成2点伤害', + nscongjun_info:'锁定技,游戏开始时,你变身为一名随机男性角色;当一名敌方角色使用无懈可击时,你有小概率亮出此武将并变回花木兰,然后对该角色造成2点伤害。', nshuanxian:'幻仙', - nshuanxian_info:'锁定技,游戏开始时,你获得随从“幻身·右”,当你首次受到伤害时,你获得随从“幻身·左”(体力上限2,初始手牌2);你与幻身在摸牌阶段均少摸一张牌;在你的回合中(如果有对应幻身),你以【幻身·左-本体-幻身·右】的顺序进行3个连续回合', + nshuanxian_info:'锁定技,游戏开始时,你获得随从“幻身·右”,当你首次受到伤害时,你获得随从“幻身·左”(体力上限2,初始手牌2);你与幻身在摸牌阶段均少摸一张牌;在你的回合中(如果有对应幻身),你以【幻身·左-本体-幻身·右】的顺序进行3个连续回合。', nstaiping_nh:'太平', nstaiping_nh_info:'当你受到1点伤害后(首次伤害除外),你可以选择一项: ①令一个“幻身”增加1点体力上限。②令一个“幻身”回复1点体力。', nsshoudao:'授道', nsshoudao_info:'当左右“幻身”全部死亡时,你获得技能“雷击”和“鬼道”。当你死亡时,若此时有两个“幻身”,你可以令一名其他角色获得技能“雷击”和“鬼道”。若有一个“幻身”,你可以令一名其他角色获得技能“雷击”或“鬼道”。(杀死你的角色除外)', nsnongquan:'弄权', - nsnongquan_info:'出牌阶段,你可以将最后一张手牌当作【无中生有】使用', + nsnongquan_info:'出牌阶段,你可以将最后一张手牌当作【无中生有】使用。', nsdufu:'毒妇', - nsdufu_info:'每当你即将造成一次伤害时,你可以为此伤害重新指定伤害来源', + nsdufu_info:'每当你即将造成一次伤害时,你可以为此伤害重新指定伤害来源。', yiesheng:'回雪', yiesheng_info:'出牌阶段,你可以弃置任意数量的黑色手牌,然后摸等量的牌。', liangji:'环计', @@ -18824,36 +18838,36 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jugong:'居功', jugong_info:'回合外每名角色的回合限一次,每当场上有角色因受到【杀】或【决斗】造成的伤害,你可以摸一张牌并且将一张手牌置于你的武将牌上,称之为“功”。在你即将受到伤害时,你可以弃置两张“功”,防止此伤害。', nsxinsheng:'新生', - nsxinsheng_info:'每当你对其他角色造成伤害后,若你未受伤,则你可以增加X点体力上限并摸X张牌,X为伤害点数', + nsxinsheng_info:'每当你对其他角色造成伤害后,若你未受伤,则你可以增加X点体力上限并摸X张牌,X为伤害点数。', nsdunxing:'遁形', - nsdunxing_info:'每当你即将受到其他角色造成的伤害时,若你已受伤,则你可以防止此伤害,改为失去X点体力上限并摸X张牌,X为伤害点数', + nsdunxing_info:'每当你即将受到其他角色造成的伤害时,若你已受伤,则你可以防止此伤害,改为失去X点体力上限并摸X张牌,X为伤害点数。', liangce:'粮策', - liangce_info:'①出牌阶段限一次,你可以将一张基本牌当【五谷丰登】使用。②当因执行【五谷丰登】的效果而亮出的牌因效果执行完毕而置入弃牌堆后,你可以选择一名角色,令该角色获取之', + liangce_info:'①出牌阶段限一次,你可以将一张基本牌当【五谷丰登】使用。②当因执行【五谷丰登】的效果而亮出的牌因效果执行完毕而置入弃牌堆后,你可以选择一名角色,令该角色获取之。', jianbi:'坚壁', - jianbi_info:'当你成为锦囊牌的目标时,若此牌的目标包括其他角色,你可以令此牌对1个目标无效', + jianbi_info:'当你成为锦囊牌的目标时,若此牌的目标包括其他角色,你可以令此牌对1个目标无效。', diyjuntun:'军屯', - diyjuntun_info:'出牌阶段,你可以重铸装备牌', + diyjuntun_info:'出牌阶段,你可以重铸装备牌。', choudu:'筹度', - choudu_info:'出牌阶段限一次,你可以弃置一张牌,并指定一名角色视为其使用一张调兵遣将', + choudu_info:'出牌阶段限一次,你可以弃置一张牌,并指定一名角色视为其使用一张调兵遣将。', liduan:'立断', - liduan_info:'当一名其他角色于其回合外得到牌后,若其此次得到的牌数为1且为装备牌(无论是否可见),你可以令该角色选择一项:1.使用此牌;2.将一张手牌交给你', + liduan_info:'当一名其他角色于其回合外得到牌后,若其此次得到的牌数为1且为装备牌(无论是否可见),你可以令该角色选择一项:1.使用此牌;2.将一张手牌交给你。', fuchou:'负仇', fuchou2:'负仇', - fuchou_info:'当你成为【杀】的目标时,你可以将一张牌交给此【杀】的使用者,令此【杀】对你无效且你到其的距离于当前回合内视为1,若如此做,此回合的结束阶段开始时,其令你摸一张牌,然后你需对其使用【杀】,否则失去1点体力', + fuchou_info:'当你成为【杀】的目标时,你可以将一张牌交给此【杀】的使用者,令此【杀】对你无效且你到其的距离于当前回合内视为1,若如此做,此回合的结束阶段开始时,其令你摸一张牌,然后你需对其使用【杀】,否则失去1点体力。', jinyan:'噤言', - jinyan_info:'锁定技。若你的体力值不大于2,你的黑色锦囊牌视为【杀】', + jinyan_info:'锁定技。若你的体力值不大于2,你的黑色锦囊牌视为【杀】。', chezhen:'车阵', - chezhen_info:'锁定技。若你的装备区里:没有牌,你的防御距离+1;有牌,你的进攻距离+1', + chezhen_info:'锁定技。若你的装备区里:没有牌,你的防御距离+1;有牌,你的进攻距离+1。', youzhan:'诱战', - youzhan_info:'当以你距离不大于1的角色为目标的【杀】的使用结算开始时,你可以弃置一张装备牌,令该角色视为使用【诱敌深入】', + youzhan_info:'当以你距离不大于1的角色为目标的【杀】的使用结算开始时,你可以弃置一张装备牌,令该角色视为使用【诱敌深入】。', kangyin:'亢音', kangyin2:'亢音', kangyin_info:'出牌阶段限一次,你可以失去1点体力并选择一名其他角色,弃置该角色的一张牌。若此牌:为基本牌,你可以令一至X名角色各摸一张牌;不为基本牌,于此回合内:你的进攻距离+X,且你使用【杀】的额外目标数上限+X。(X为你已损失的体力值)', zhucheng:'筑城', zhucheng2:'筑城', - zhucheng_info:'①结束阶段开始时,若没有“筑”,你可以将牌堆顶的X张牌置于你的武将牌上〔称为“筑”〕(X为你已损失的体力值与1中的较大值),否则你可以获取所有“筑”。②当你成为【杀】的目标时,若有“筑”,你可以令此杀的使用者弃置X张牌(X为“筑”的数量),否则杀对你无效', + zhucheng_info:'①结束阶段开始时,若没有“筑”,你可以将牌堆顶的X张牌置于你的武将牌上〔称为“筑”〕(X为你已损失的体力值与1中的较大值),否则你可以获取所有“筑”。②当你成为【杀】的目标时,若有“筑”,你可以令此杀的使用者弃置X张牌(X为“筑”的数量),否则杀对你无效。', duoqi:'夺气', - duoqi_info:'当一名角色于除你之外的角色的出牌阶段内因弃置而失去牌后,你可以移去一张“筑”,并结束此出牌阶段', + duoqi_info:'当一名角色于除你之外的角色的出牌阶段内因弃置而失去牌后,你可以移去一张“筑”,并结束此出牌阶段。', siji:'伺机', ciqiu:'刺酋', @@ -18881,30 +18895,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ diy_jiaoxia:'皎霞', yaliang:'雅量', yaliang_info:'每当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可与该角色各摸一张牌。', - diy_jiaoxia_info:'每当你成为红色牌的目标,你可以摸一张牌', + diy_jiaoxia_info:'每当你成为红色牌的目标,你可以摸一张牌。', zaiqix_info:'摸牌阶段,若你已受伤,你可以改为展示牌堆顶的X+1张牌,X为你已损失的体力值,其中每有一张♥牌,你回复1点体力,然后弃掉这些♥牌,将其余的牌收入手牌。', - batu_info:'结束阶段,你可以将手牌数补至X,X为现存的势力数', - diyzaiqi_info:'锁定技,你摸牌阶段额外摸X张牌,X为你已损失的体力值', - diykuanggu_info:'锁定技,每当你造成1点伤害,你在其攻击范围内,你回复1点体力,否则你摸一张牌', + batu_info:'结束阶段,你可以将手牌数补至X,X为现存的势力数。', + diyzaiqi_info:'锁定技,你摸牌阶段额外摸X张牌,X为你已损失的体力值。', + diykuanggu_info:'锁定技,每当你造成1点伤害,你在其攻击范围内,你回复1点体力,否则你摸一张牌。', diyqiangxi_info:'出牌阶段,你可以自减1点体力或弃一张武器牌,然后你对你攻击范围内的一名角色造成1点伤害并弃置其一张牌,每回合限一次。', - diyduanliang_info:'出牌阶段限一次,你可以将一张黑色的基本牌当兵粮寸断对一名角色使用,然后摸一张牌。你的兵粮寸断可以指定距离2以内的角色作为目标', - guihan_info:'限定技,当你进入濒死状态时,可以指定一名男性角色与其各回复1点体力并摸两张牌', - luweiyan_info:'出牌阶段限一次,你可以将一张非基本牌当作水攻使用;结算后你可以视为对其中一个目标使用一张不计入出杀次数的杀', - xiongzi_info:'锁定技,你于摸牌阶段额外摸X+1张牌,X为你装备区牌数的一半,向下取整', - honglian_info:'每当你受到来自其他角色的伤害,可以弃置伤害来源的所有红色牌', - jieyan_info:'出牌阶段限一次,你可以弃置一张红色手牌令场上所有角色受到1点火焰伤害', - diyguhuo_info:'锁定技,准备阶段,你摸两张牌,然后弃置区域内的两张牌', - diychanyuan_info:'锁定技,杀死你的角色失去1点体力上限', - zonghuo_info:'你可弃置一张牌将你即将造成的伤害变为火焰伤害', - shaoying_info:'每当你造成一次火焰伤害,可指定距离受伤害角色1以内的另一名角色,并展示牌堆顶的一张牌,若此牌为红色,该角色受到1点火焰伤害', + diyduanliang_info:'出牌阶段限一次,你可以将一张黑色的基本牌当兵粮寸断对一名角色使用,然后摸一张牌。你的兵粮寸断可以指定距离2以内的角色作为目标。', + guihan_info:'限定技,当你进入濒死状态时,可以指定一名男性角色与其各回复1点体力并摸两张牌。', + luweiyan_info:'出牌阶段限一次,你可以将一张非基本牌当作水攻使用;结算后你可以视为对其中一个目标使用一张不计入出杀次数的【杀】。', + xiongzi_info:'锁定技,你于摸牌阶段额外摸X+1张牌,X为你装备区牌数的一半,向下取整。', + honglian_info:'每当你受到来自其他角色的伤害,可以弃置伤害来源的所有红色牌。', + jieyan_info:'出牌阶段限一次,你可以弃置一张红色手牌令场上所有角色受到1点火焰伤害。', + diyguhuo_info:'锁定技,准备阶段,你摸两张牌,然后弃置区域内的两张牌。', + diychanyuan_info:'锁定技,杀死你的角色失去1点体力上限。', + zonghuo_info:'你可弃置一张牌将你即将造成的伤害变为火焰伤害。', + shaoying_info:'每当你造成一次火焰伤害,可指定距离受伤害角色1以内的另一名角色,并展示牌堆顶的一张牌,若此牌为红色,该角色受到1点火焰伤害。', juedao_info:'出牌阶段,你可以弃置一张手牌,横置你的武将牌;锁定技,若你的武将牌横置,则你计算至其他角色的距离和其他角色计算至你的距离均+1。', geju_info:'准备阶段开始时,你可以摸X张牌(X为攻击范围内不含有你的势力数)。', siji_info:'弃牌阶段结束后,你可以摸2X张牌(X为你于此阶段内弃置的【杀】的数量)。', - ciqiu_info:'锁定技,每当你使用【杀】对目标角色造成伤害时,若该角色未受伤,你令此伤害+1;若其因此进入濒死状态,你令其死亡,然后你失去“刺酋”。 ', + ciqiu_info:'锁定技,每当你使用【杀】对目标角色造成伤害时,若该角色未受伤,你令此伤害+1;若其因此进入濒死状态,你令其死亡,然后你失去“刺酋”。', nsshuaiyan_info:'每当其他角色于你的回合外回复体力后,你可以令该角色选择一项:1.令你摸一张牌;2.令你弃置其一张牌。', moshou_info:'锁定技,你不能成为乐不思蜀和兵粮寸断的目标。', - xicai_info:'你可以立即获得对你造成伤害的牌', - diyjianxiong_info:'锁定技,在身份局中,在你回合内死亡的角色均视为反贼,国战中,在你回合内死亡的角色若与你势力相同则随机改为另一个势力', + xicai_info:'你可以立即获得对你造成伤害的牌。', + diyjianxiong_info:'锁定技,在身份局中,在你回合内死亡的角色均视为反贼,国战中,在你回合内死亡的角色若与你势力相同则随机改为另一个势力。', ns_zanghong:'臧洪', nsshimeng:'誓盟', diff --git a/character/extra.js b/character/extra.js index 0c82308e6..a2cf46bbd 100755 --- a/character/extra.js +++ b/character/extra.js @@ -100,7 +100,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterTarget:function(card,player,target){ return !target.hasSkill('wuling_wuqinxi'); }, - usable:1, + usable:2, prompt:'选择一名角色,向其传授“五禽戏”', group:'wuling_die', content:function(){ @@ -154,9 +154,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ wuqinxiMap:[ '虎:当你使用指定唯一目标的牌对目标角色造成伤害时,此伤害+1。', '鹿:①当你获得此效果时,你回复1点体力并弃置判定区的所有牌。②你不能成为延时锦囊牌的目标。', - '熊:当你受到伤害时,此伤害-1。', + '熊:每回合限一次,当你受到伤害时,此伤害-1。', '猿:出牌阶段开始时,你选择一名角色,随机获得其装备区里的一张牌。', - '鹤:出牌阶段开始时,你摸两张牌。', + '鹤:出牌阶段开始时,你摸三张牌。', ], updateMark:function(player){ var wuqinxi=player.storage.wuling_wuqinxi; @@ -226,7 +226,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var evt=event.getParent('useCard'); return evt.targets&&evt.targets.length==1&&evt.targets.includes(event.player); case 'damageBegin4': - return wuqinxi=='熊'; + return wuqinxi=='熊'&&!player.hasSkill('wuling_xiong'); default: if(wuqinxi=='鹤') return true; if(wuqinxi!='猿') return false; @@ -251,12 +251,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.finish(); break; case 'damageBegin4': + player.addTempSkill('wuling_xiong'); trigger.num--; event.finish(); break; default: if(wuqinxi=='鹤'){ - player.draw(2); + player.draw(3); event.finish(); } else{ @@ -290,7 +291,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ const curWuqinxi=wuqinxi[0]; const nextWuqinxi=wuqinxi[1]; if(nextWuqinxi=='鹿'&&get.type(card)=='delay') return 'zerotarget'; - if(curWuqinxi!='熊') return; + if(curWuqinxi!='熊'||player.hasSkill('wuling_xiong')) return; if(player.hasSkillTag('jueqing',false,target)) return; var num=get.tag(card,'damage'); if(num){ @@ -301,6 +302,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, }, + xiong:{charlotte:true}, die:{ trigger:{player:'die'}, filter:function(event,player){ @@ -374,6 +376,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //神贾诩 jxlianpo:{ audio:2, + init:()=>{ + game.addGlobalSkill('jxlianpo_global'); + }, + onremove:()=>{ + if(!game.hasPlayer(i=>i.hasSkill('jxlianpo'),true)) game.removeGlobalSkill('jxlianpo_global'); + }, trigger:{global:'dieAfter'}, filter:function(event,player){ if(lib.skill.jxlianpo.getMax().length<=1) return false; @@ -381,7 +389,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, forced:true, logTarget:'source', - global:'jxlianpo_global', getMax:()=>{ const map={ zhu:game.countPlayer(current=>{ @@ -521,20 +528,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); }, cardSavable:function(card,player,target){ - if(card.name=='tao'){ + if(card.name=='tao'&&!player.hasSkill('jxlianpo')){ if(!lib.skill.jxlianpo.getMax().includes('zhu')) return; if(player==target) return; return false; } }, playerEnabled:function(card,player,target){ - if(card.name=='tao'){ + if(card.name=='tao'&&!player.hasSkill('jxlianpo')){ if(!lib.skill.jxlianpo.getMax().includes('zhu')) return; if(player==target) return; return false; } } }, + trigger:{player:'dieAfter'}, + filter:()=>{ + return !game.hasPlayer(i=>i.hasSkill('jxlianpo'),true); + }, + silent:true, + forceDie:true, + content:()=>{ + game.removeGlobalSkill('jxlianpo_global'); + } }, }, }, @@ -996,7 +1012,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } var hasRuanshizi=game.hasPlayer(function(target){ - return target!=player&&player.canUse('sha',target,null,true)&&!target.mayHaveShan()&&get.attitude(player,target)<0&&get.effect(target,{name:'sha'},player,player)>0; + return target!=player&&player.canUse('sha',target,null,true)&&!target.mayHaveShan(player,'use')&&get.attitude(player,target)<0&&get.effect(target,{name:'sha'},player,player)>0; }) for(var card of hs){ var name=get.name(card); @@ -1992,6 +2008,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, + ai:{ + notemp:true, + maixie_defend:true, + effect:{ + target:(card,player,target)=>{ + if(!get.tag(card,'damage')||!target.hasFriend()) return; + let die=[],extra=[null,0],temp; + game.filterPlayer(i=>{ + if(!i.hasMark('twwuhun')) return false; + temp=get.attitude(target,i); + if(temp<0) die.push(i); + else{ + temp=Math.sqrt(att)*i.countMark('twwuhun'); + if(!extra[0]||temp1&&(!die.length||get.attitude(player,target)<=0)) die.add(player); + if(die.length) return [1,0,1,die.reduce((num,i)=>{ + return num-=2*get.sgnAttitude(player,i); + },0)]; + } + } + } }, shouli:{ audio:2, @@ -2169,6 +2209,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ intro:{ content:'受到的伤害+1且改为雷属性', }, + ai:{ + effect:{ + target:(card,player,target)=>{ + if(!get.tag(card,'damage')) return; + if(target.hasSkillTag('nodamage')||target.hasSkillTag('nothunder')) return 'zeroplayertarget'; + if(target.hasSkillTag('filterDamage',null,{ + player:player, + card:new lib.element.VCard({ + name:card.name, + nature:'thunder' + },[card]) + })) return; + return 2; + } + } + } }, init:{ audio:'shouli', @@ -2249,6 +2305,32 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); })); }, + ai:{ + effect:{ + player:(card,player,target)=>{ + if(typeof card!=='object') return; + let suit=get.suit(card); + if(!lib.suit.contains(suit)||player.hasCard(function(i){ + return get.suit(i,player)==suit; + },'h')) return; + return [1,0.8*game.countPlayer(current=>{ + return current.countCards('e',card=>{ + return get.suit(card,current)==suit; + }); + })]; + }, + target:(card,player,target)=>{ + if(card.name==='sha'&&!player.hasSkillTag('directHit_ai',true,{ + target:target, + card:card + },true)&&game.hasPlayer(current=>{ + return current.hasCard(cardx=>{ + return get.subtype(cardx)==='equip3'; + },'e'); + })) return [0, -0.5]; + } + } + } }, changandajian_equip5:{ equipSkill:true, @@ -3214,7 +3296,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ target:function(card,player,target){ - if(card&&card.name=='qizhengxiangsheng') return 'zerotarget'; + if(card&&card.name=='qizhengxiangsheng') return 'zeroplayertarget'; }, } }, @@ -3293,18 +3375,42 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!map[id]) map[id]={}; map[id].qizheng_name=result.control; map[id].qizheng_aibuff=get.attitude(player,target)>0; - }, + } }, }, }, lingce:{ audio:2, + init:(player)=>{ + game.addGlobalSkill('lingce_global'); + }, trigger:{global:'useCard'}, forced:true, filter:function(event,player){ return (event.card.name=='qizhengxiangsheng'||get.zhinangs().contains(event.card.name)||player.getStorage('dinghan').contains(event.card.name))&&event.card.isCard&&event.cards.length==1; }, - content:function(){player.draw()}, + content:function(){ + player.draw(); + }, + subSkill:{ + global:{ + ai:{ + effect:{ + player:(card,player,target)=>{ + let num=0,nohave=true; + game.countPlayer(i=>{ + if(i.hasSkill('lingce')){ + nohave=false; + if(i.isIn()&&lib.skill.lingce.filter({card:card},i)) num+=get.sgnAttitude(player,i); + } + },true); + if(nohave) game.removeGlobalSkill('lingce_global'); + else return [1,0.8*num]; + } + } + } + } + } }, dinghan:{ audio:2, @@ -4710,8 +4816,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, group:'new_wuhun_die', ai:{ - threaten:0.01, notemp:true, + effect:{ + target:(card,player,target)=>{ + if(!get.tag(card,'damage')||!target.hasFriend()) return; + if(player.hasSkillTag('jueqing',null,target)) return 1.7; + let die=[null,1],temp; + game.filterPlayer(i=>{ + temp=i.countMark('new_wuhun'); + if(i===player&&target.hp+target.hujia>1) temp++; + if(temp>=die[1]){ + if(!die[0]) die=[i,temp]; + else{ + let att=get.attitude(player,i); + if(att{ - if(player.hasSkill('rewansha')&&target.hp<=1&&get.tag(card,'damage')) return [1,0,1.5,-1.5]; + if(target&&player.hasSkill('rewansha')&&target.hp<=1&&get.tag(card,'damage')) return [1,0,1.5,-1.5]; } } } @@ -7875,14 +7999,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shen_huatuo:'神华佗', shen_huatuo_prefix:'神', wuling:'五灵', - wuling_info:'①出牌阶段限一次。你可以选择一名没有“五禽戏”的角色,按照你选择的顺序向其传授“五禽戏”,且其获得如下效果:其获得你选择的第一种“五禽戏”的效果,并在其每个准备阶段移除当前“五禽戏”的效果并切换为下一种。②当你死亡时,你令场上的角色失去你传授的“五禽戏”。', + wuling_info:'①出牌阶段限两次。你可以选择一名没有“五禽戏”的角色,按照你选择的顺序向其传授“五禽戏”,且其获得如下效果:其获得你选择的第一种“五禽戏”的效果,并在其每个准备阶段移除当前“五禽戏”的效果并切换为下一种。②当你死亡时,你令场上的角色失去你传授的“五禽戏”。', wuling_wuqinxi:'五禽戏', wuling_wuqinxi_info:'
  • “五禽戏”分为“虎、鹿、熊、猿、鹤”五个不同的效果:'+ '
  • 虎:当你使用指定唯一目标的牌对目标角色造成伤害时,此伤害+1。'+ '
  • 鹿:①当你获得此效果时,你回复1点体力并弃置判定区的所有牌。②你不能成为延时锦囊牌的目标。'+ - '
  • 熊:当你受到伤害时,此伤害-1。'+ + '
  • 熊:每回合限一次,当你受到伤害时,此伤害-1。'+ '
  • 猿:出牌阶段开始时,你选择一名角色,随机获得其装备区里的一张牌。'+ - '
  • 鹤:出牌阶段开始时,你摸两张牌。', + '
  • 鹤:出牌阶段开始时,你摸三张牌。', youyi:'游医', youyi_info:'①弃牌阶段结束时,你可以将所有于此阶段弃置的牌置入仁区。②出牌阶段限一次。你可以将仁区的所有牌置入弃牌堆,令所有角色各回复1点体力。', diff --git a/character/gujian.js b/character/gujian.js index 311284c64..fdd4eb722 100644 --- a/character/gujian.js +++ b/character/gujian.js @@ -1638,11 +1638,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, meiying:{ - global:'meiying2', globalSilent:true, trigger:{global:'phaseEnd'}, filter:function(event,player){ - return event.player!=player&&!event.player.tempSkills.meiying3&&event.player.isAlive()&&player.countCards('he',{color:'red'})>0; + return event.player!=player&&event.player.isAlive()&&player.countCards('he',{color:'red'})&&event.player.getHistory('useCard',evt=>{ + return evt.targets&&evt.targets.some(i=>i!==event.player); + }).length===0; }, direct:true, content:function(){ @@ -1665,18 +1666,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ expose:0.1 } }, - meiying2:{ - trigger:{player:'useCard'}, - filter:function(event,player){ - return _status.currentPhase==player&&event.targets&&(event.targets.length>1||event.targets[0]!=player); - }, - forced:true, - popup:false, - content:function(){ - player.addTempSkill('meiying3'); - } - }, - meiying3:{}, jianwu:{ trigger:{player:'shaBegin'}, forced:true, @@ -2644,120 +2633,120 @@ game.import('character',function(lib,game,ui,get,ai,_status){ gjqt_cenying:'岑缨', yunyou:'云游', - yunyou_info:'每两轮限一次,出牌阶段,你可以发现一张地图牌本局未使用过的地图牌并使用之', + yunyou_info:'每两轮限一次,出牌阶段,你可以发现一张地图牌本局未使用过的地图牌并使用之。', xuanzhen:'玄阵', // xuanzhen_bg:'阵', - xuanzhen_info:'每轮限一次,当你成为一名其他角色的卡牌惟一目标时,你可以发现一张牌代替此牌', + xuanzhen_info:'每轮限一次,当你成为一名其他角色的卡牌惟一目标时,你可以发现一张牌代替此牌。', qingshu:'青书', - qingshu_info:'结束阶段,你可以令一名角色永久获得一个你使用过且不是当前地图的地图牌效果(每个地图最多发动一次)', + qingshu_info:'结束阶段,你可以令一名角色永久获得一个你使用过且不是当前地图的地图牌效果(每个地图最多发动一次)。', yanjiadan_heart:'偃甲蛋', - yanjiadan_heart_info:'可以当作紫阳丹、玉女元参或沙棠使用', + yanjiadan_heart_info:'可以当作紫阳丹、玉女元参或沙棠使用。', yanjiadan_diamond:'偃甲蛋', - yanjiadan_diamond_info:'可以当作流风散、舒筋散或神火飞鸦使用', + yanjiadan_diamond_info:'可以当作流风散、舒筋散或神火飞鸦使用。', yanjiadan_club:'偃甲蛋', - yanjiadan_club_info:'可以当作天女散花、六骰格或锦里针使用', + yanjiadan_club_info:'可以当作天女散花、六骰格或锦里针使用。', yanjiadan_spade:'偃甲蛋', - yanjiadan_spade_info:'可以当作飞镖、乾坤镖或龙须钩使用', + yanjiadan_spade_info:'可以当作飞镖、乾坤镖或龙须钩使用。', lingyan:'灵偃', lingyan_bg:'偃', - lingyan_info:'出牌阶段限一次,你可以将一张点数与武将牌上的牌均不同的手牌置于武将牌上,然后获得与其花色对应的一枚偃甲蛋', + lingyan_info:'出牌阶段限一次,你可以将一张点数与武将牌上的牌均不同的手牌置于武将牌上,然后获得与其花色对应的一枚偃甲蛋。', xunjian:'寻剑', - xunjian_info:'锁定技,每当你使用或打出一张牌,若牌堆中有同名牌,你有X的机率获得之,X为你的“灵偃”牌数/13', - xunjian_old_info:'觉醒技,结束阶段,若你武将牌上有十三张牌,你失去技能灵偃并获得技能通天', + xunjian_info:'锁定技,每当你使用或打出一张牌,若牌堆中有同名牌,你有X的机率获得之,X为你的“灵偃”牌数/13。', + xunjian_old_info:'觉醒技,结束阶段,若你武将牌上有十三张牌,你失去技能灵偃并获得技能通天。', tongtian:'通天', - tongtian_info:'锁定技,在你使用或打出一张牌后,若敌方角色手中有同名牌,你随机获得其中一张', + tongtian_info:'锁定技,在你使用或打出一张牌后,若敌方角色手中有同名牌,你随机获得其中一张。', xianju:'仙居', - xianju_info:'锁定技,奇数游戏轮次开始时,你获得潜行直到下一轮开始;偶数游戏轮次开始时,你随机获得一张机关牌', + xianju_info:'锁定技,奇数游戏轮次开始时,你获得潜行直到下一轮开始;偶数游戏轮次开始时,你随机获得一张机关牌。', xuanci:'旋刺', - xuanci_info:'出牌阶段限一次,你可以将一张梅花牌当作飞镖使用;锁定技,你使用飞镖无距离限制,你使用飞镖后对目标结算后视为对目标使用一张杀', + xuanci_info:'出牌阶段限一次,你可以将一张梅花牌当作飞镖使用;锁定技,你使用飞镖无距离限制,你使用飞镖后对目标结算后视为对目标使用一张杀。', humeng:'湖梦', humeng_sub:'偃甲谢衣', - humeng_info:'觉醒技,当你使用过4种不同的偃甲蛋后,你获得替身偃甲谢衣;觉醒技,当你进入濒死状态时,你弃置所有牌,摸四张牌,变身为初七并激活偃甲谢衣', + humeng_info:'觉醒技,当你使用过4种不同的偃甲蛋后,你获得替身偃甲谢衣;觉醒技,当你进入濒死状态时,你弃置所有牌,摸四张牌,变身为初七并激活偃甲谢衣。', yange:'魇歌', - yange_info:'游戏开始时,你获得数量等于敌方角色数的“魇”标记;准备阶段开始时,你可以移去一枚“魇”标记并变为一名其他存活角色的复制,此回合结束后你变回原角色', + yange_info:'游戏开始时,你获得数量等于敌方角色数的“魇”标记;准备阶段开始时,你可以移去一枚“魇”标记并变为一名其他存活角色的复制,此回合结束后你变回原角色。', woxue:'卧雪', - woxue_info:'每当你于回合外使用或打出一张牌,你可以视为对当前回合角色使用【白霜】', + woxue_info:'每当你于回合外使用或打出一张牌,你可以视为对当前回合角色使用【白霜】。', lingnu:'灵怒', - lingnu_info:'锁定技,每当你造成1点伤害,你随机获得一个与杀相关的技能,技能在你行动3回合后消失(同一时间最多拥有3个以此法获得的技能)', + lingnu_info:'锁定技,每当你造成1点伤害,你随机获得一个与杀相关的技能,技能在你行动3回合后消失(同一时间最多拥有3个以此法获得的技能)。', zhenying:'振影', - zhenying_info:'每当你使用或打出一张非转化的黑色牌(装备或延时锦囊牌除外),你可以获得一张此牌的“替身”;你使用或打出“替身”牌后需弃置一张牌(没有则不弃);当前回合结束后,“替身”牌消失', + zhenying_info:'每当你使用或打出一张非转化的黑色牌(装备或延时锦囊牌除外),你可以获得一张此牌的“替身”;你使用或打出“替身”牌后需弃置一张牌(没有则不弃);当前回合结束后,“替身”牌消失。', cihong:'刺鸿', cihong_bg:'鸿', - cihong_info:'每三轮限一次,结束阶段,你可以指定一名其他角色并可以依次选择:1. 弃置一张红色牌;2. 失去1点体力;3. 将武将牌翻至背面;每选择一项,视为对目标使用一张杀', + cihong_info:'每三轮限一次,结束阶段,你可以指定一名其他角色并可以依次选择:1. 弃置一张红色牌;2. 失去1点体力;3. 将武将牌翻至背面;每选择一项,视为对目标使用一张杀。', lianjing:'莲境', - lianjing_info:'每两轮限一次,回合结束后,你可以选择至多2名其他角色,将其他角色移出游戏,然后你与所选的角色依次进行一个回合', + lianjing_info:'每两轮限一次,回合结束后,你可以选择至多2名其他角色,将其他角色移出游戏,然后你与所选的角色依次进行一个回合。', zuiji:'醉饮', - zuiji_info:'出牌阶段,你可以将一张手牌或装备牌当作酒使用', + zuiji_info:'出牌阶段,你可以将一张手牌或装备牌当作酒使用。', manwu:'曼舞', - manwu_info:'在一名角色的结束阶段,若其手牌数为全场最少或之一,你可以令其摸一张牌', + manwu_info:'在一名角色的结束阶段,若其手牌数为全场最少或之一,你可以令其摸一张牌。', xfanghua:'芳华', - xfanghua_info:'在你成为红色牌的目标后,你可以回复1点体力', + xfanghua_info:'在你成为红色牌的目标后,你可以回复1点体力。', yunyin:'云音', - yunyin_info:'结束阶段,你可以弃置一张与本回合使用过的卡牌花色均不相同的手牌,视为使用一张基本牌或普通锦囊牌', + yunyin_info:'结束阶段,你可以弃置一张与本回合使用过的卡牌花色均不相同的手牌,视为使用一张基本牌或普通锦囊牌。', shishui:'逝水', - shishui_info:'锁定技,每当你使用一张红色牌,你令目标失去1点体力', + shishui_info:'锁定技,每当你使用一张红色牌,你令目标失去1点体力。', duhun:'渡魂', - duhun_info:'濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去1点体力上限并与该角色交换体力值;若你没赢,你立即死亡', - duhun_info_alter:'濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去1点体力上限并将体力值回复至与该角色相同;若你没赢,你立即死亡', + duhun_info:'濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去1点体力上限并与该角色交换体力值;若你没赢,你立即死亡。', + duhun_info_alter:'濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去1点体力上限并将体力值回复至与该角色相同;若你没赢,你立即死亡。', chizhen:'驰阵', - chizhen_info:'出牌阶段开始时,你可以摸X张牌并弃置X张牌,若你弃置了杀,可以视为使用一张决斗(X为你已损失的体力值且至少为1)', + chizhen_info:'出牌阶段开始时,你可以摸X张牌并弃置X张牌,若你弃置了杀,可以视为使用一张决斗(X为你已损失的体力值且至少为1)。', xidie:'戏蝶', xidie2:'戏蝶', - xidie_info:'准备阶段,若你的手牌数大于体力值,可以弃置至多X张牌,并于结束阶段摸等量的牌,X为你的体力值与手牌数之差且不超过3', + xidie_info:'准备阶段,若你的手牌数大于体力值,可以弃置至多X张牌,并于结束阶段摸等量的牌,X为你的体力值与手牌数之差且不超过3。', meihu:'魅狐', meihu2:'魅狐', - meihu_info:'当你受到伤害后,可令伤害来源交给你一张手牌', + meihu_info:'当你受到伤害后,可令伤害来源交给你一张手牌。', jianwu:'剑舞', - jianwu_info:'锁定技,攻击范围不含你的角色无法闪避你的杀', + jianwu_info:'锁定技,攻击范围不含你的角色无法闪避你的杀。', meiying:'魅影', - meiying_info:'一名其他角色的回合结束时,若其未于此回合内使用过指定另一名角色为目标的牌,你可以弃置一张红色牌视为对其使用一张杀', + meiying_info:'一名其他角色的回合结束时,若其未于此回合内使用过指定另一名角色为目标的牌,你可以弃置一张红色牌视为对其使用一张杀。', zuizhan:'乱斩', - zuizhan_info:'每当你使用一张杀,可以摸一张牌,然后此杀随机增加一个额外目标', + zuizhan_info:'每当你使用一张杀,可以摸一张牌,然后此杀随机增加一个额外目标。', xlqianhuan:'千幻', - xlqianhuan_info:'回合结束后,若你已受伤,你可以回复1点体力并将武将牌翻面。若你的武将牌背面朝上,你不能使用卡牌,也不能成为卡牌的目标', + xlqianhuan_info:'回合结束后,若你已受伤,你可以回复1点体力并将武将牌翻面。若你的武将牌背面朝上,你不能使用卡牌,也不能成为卡牌的目标。', fumo:'伏魔', - fumo_info:'每当你受到一次伤害,可以弃置两张颜色相同的手牌并对伤害来源造成1点雷电伤害', + fumo_info:'每当你受到一次伤害,可以弃置两张颜色相同的手牌并对伤害来源造成1点雷电伤害。', fanyin:'梵音', - fanyin_info:'结束阶段,你可以令一名角色复原武将牌并移除判定区内的牌;若其体力值是全场最少的之一,其回复1点体力', + fanyin_info:'结束阶段,你可以令一名角色复原武将牌并移除判定区内的牌;若其体力值是全场最少的之一,其回复1点体力。', mingkong:'明空', - mingkong_info:'锁定技,若你没有手牌,你受到的伤害-1,然后伤害来源摸一张牌', + mingkong_info:'锁定技,若你没有手牌,你受到的伤害-1,然后伤害来源摸一张牌。', qinglan:'晴岚', - qinglan_info:'每当有一名角色即将受到属性伤害,你可以弃置一张牌令其防止此伤害,然后伤害来源摸一张牌并回复1点体力', + qinglan_info:'每当有一名角色即将受到属性伤害,你可以弃置一张牌令其防止此伤害,然后伤害来源摸一张牌并回复1点体力。', yuehua:'月华', - yuehua_info:'每当你于回合外使用、打出或弃置红色牌,你可以摸一张牌', + yuehua_info:'每当你于回合外使用、打出或弃置红色牌,你可以摸一张牌。', xuelu:'血戮', - xuelu_info:'结束阶段,若你已受伤,你可以弃置一张红色牌并对一名其他角色造成1点火焰伤害;若你已损失体力值不少于3,改为造成2点火焰伤害', - xuelu_info_alter:'结束阶段,若你已受伤,你可以弃置一张红色牌并对一名其他角色造成1点火焰伤害', + xuelu_info:'结束阶段,若你已受伤,你可以弃置一张红色牌并对一名其他角色造成1点火焰伤害;若你已损失体力值不少于3,改为造成2点火焰伤害。', + xuelu_info_alter:'结束阶段,若你已受伤,你可以弃置一张红色牌并对一名其他角色造成1点火焰伤害。', fanshi:'反噬', - fanshi_info:'锁定技,弃牌阶段结束时,若你本回合内造成过伤害,你失去1点体力并摸一张牌', + fanshi_info:'锁定技,弃牌阶段结束时,若你本回合内造成过伤害,你失去1点体力并摸一张牌。', shahun:'煞魂', shahun2:'煞魂', - shahun_info:'限定技,濒死阶段,你可以复原武将牌,弃置所有牌并摸三张牌,然后将体力回复至1;若如此做,你失去技能〖反噬〗,获得技能〖绝境〗,并于两回合后立即死亡', - shahun_info_alter:'限定技,濒死阶段,你可以复原武将牌,弃置所有牌并摸三张牌,然后将体力回复至1;若如此做,你失去技能〖反噬〗,获得技能〖绝境〗,并于两回合后立即死亡', + shahun_info:'限定技,濒死阶段,你可以复原武将牌,弃置所有牌并摸三张牌,然后将体力回复至1;若如此做,你失去技能〖反噬〗,获得技能〖绝境〗,并于两回合后立即死亡。', + shahun_info_alter:'限定技,濒死阶段,你可以复原武将牌,弃置所有牌并摸三张牌,然后将体力回复至1;若如此做,你失去技能〖反噬〗,获得技能〖绝境〗,并于两回合后立即死亡。', yanjia:'偃甲', - yanjia_info:'出牌阶段,你可以将两张非特殊装备牌合成为一张强化装备', + yanjia_info:'出牌阶段,你可以将两张非特殊装备牌合成为一张强化装备。', xiuhua:'袖花', - xiuhua_info:'每当一件其他角色的装备因被替换或弃置进入弃牌堆,你可以获得之', + xiuhua_info:'每当一件其他角色的装备因被替换或弃置进入弃牌堆,你可以获得之。', liuying:'流影', - liuying_info:'每当你使用一张杀结算完毕后,你可以指定一名本回合未成为过你的杀的目标的角色,并亮出牌堆顶的一张牌,若为黑色,你对该角色使用一张杀', + liuying_info:'每当你使用一张杀结算完毕后,你可以指定一名本回合未成为过你的杀的目标的角色,并亮出牌堆顶的一张牌,若为黑色,你对该角色使用一张杀。', boyun:'拨云', boyun1:'拨云', boyun2:'拨云', - boyun_info:'在你的回合内,你可以弃置一张装备牌,并展示牌堆顶的一张牌,若其为装备牌,你须将其交给任意一张角色并对其造成1点伤害,否则你摸一张牌', + boyun_info:'在你的回合内,你可以弃置一张装备牌,并展示牌堆顶的一张牌,若其为装备牌,你须将其交给任意一张角色并对其造成1点伤害,否则你摸一张牌。', jizhan:'疾战', - jizhan_info:'出牌阶段限一次,你可以将移动到任意一名角色的前一位,视为对其使用了一张不计入出杀次数的杀', + jizhan_info:'出牌阶段限一次,你可以将移动到任意一名角色的前一位,视为对其使用了一张不计入出杀次数的杀。', qianjun:'千军', - qianjun_info:'每当你使用一张杀,你可以弃置一张牌,令距离目标1以内的所有角色成为额外目标', + qianjun_info:'每当你使用一张杀,你可以弃置一张牌,令距离目标1以内的所有角色成为额外目标。', xuanning:'玄凝', xuanning1:'玄凝', xuanning2:'玄凝', liuguang:'流光', yangming:'养命', yangming2:'养命', - xuanning_info:'出牌阶段,你可以弃置一基本牌,获得至多3个玄凝标记。当你受到伤害时,你失去一枚玄凝标记,伤害来源随机弃置一张牌', - liuguang_info:'准备阶段,若你有玄凝标记,你可以弃置一枚玄凝标记,选择至多三名角色依次令其选择一项:弃置一张牌,或受到1点伤害,并终止流光结算', - yangming_info:'出牌阶段,你可以弃置一张红色牌,并在下个出牌阶段结束时令距离1以内的任意名角色回复1点体力,在此之前不可再次发动', + xuanning_info:'出牌阶段,你可以弃置一基本牌,获得至多3个玄凝标记。当你受到伤害时,你失去一枚玄凝标记,伤害来源随机弃置一张牌。', + liuguang_info:'准备阶段,若你有玄凝标记,你可以弃置一枚玄凝标记,选择至多三名角色依次令其选择一项:弃置一张牌,或受到1点伤害,并终止流光结算。', + yangming_info:'出牌阶段,你可以弃置一张红色牌,并在下个出牌阶段结束时令距离1以内的任意名角色回复1点体力,在此之前不可再次发动。', zhaolu:'朝露', jiehuo:'劫火', yuling:'御灵', @@ -2765,10 +2754,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yuling2:'御灵', yuling3:'御灵', yuling4:'御灵', - zhaolu_info:'锁定技,每隔X回合,你失去1点体力上限,每当你受到1点伤害或有人死亡,视为减少两个回合,X为现存角色数且至多为5', - jiehuo_info:'限定技,出牌阶段,你可以对一名其他角色造成2点火焰伤害,然后死亡', - yuling_info:'锁定技,你没有摸牌和弃牌阶段,你的手牌数始终为5,你在一个出牌阶段最多使用X+2张牌,X为你的体力上限', - yuling_info_alter:'锁定技,你没有摸牌和弃牌阶段,你的手牌数始终为5,你在一个出牌阶段最多使用X+1张牌,X为你的体力上限', + zhaolu_info:'锁定技,每隔X回合,你失去1点体力上限,每当你受到1点伤害或有人死亡,视为减少两个回合,X为现存角色数且至多为5。', + jiehuo_info:'限定技,出牌阶段,你可以对一名其他角色造成2点火焰伤害,然后死亡。', + yuling_info:'锁定技,你没有摸牌和弃牌阶段,你的手牌数始终为5,你在一个出牌阶段最多使用X+2张牌,X为你的体力上限。', + yuling_info_alter:'锁定技,你没有摸牌和弃牌阶段,你的手牌数始终为5,你在一个出牌阶段最多使用X+1张牌,X为你的体力上限。', }, }; }); diff --git a/character/gwent.js b/character/gwent.js index 2768393e2..c7ff328d2 100644 --- a/character/gwent.js +++ b/character/gwent.js @@ -4519,186 +4519,186 @@ game.import('character',function(lib,game,ui,get,ai,_status){ // sqlongyin:'龙影', // sqlongyin_info:'', sqlongnu:'龙怒', - sqlongnu_info:'准备阶段,你可以发现一张牌堆中的牌,若你手牌中有同名牌,你可以改为造成1点火属性伤害锁定技。准备阶段开始时,你随机切换至一种形态', + sqlongnu_info:'准备阶段,你可以发现一张牌堆中的牌,若你手牌中有同名牌,你可以改为造成1点火属性伤害锁定技。准备阶段开始时,你随机切换至一种形态。', sqlonghuo:'龙火', - sqlonghuo_info:'出牌阶段限一次,你可以弃置所有手牌并摸等量的牌,若敌方角色手牌中与你弃置的牌同名的牌,则随机弃置其中一张。准备阶段开始时,你随机切换至一种形态', + sqlonghuo_info:'出牌阶段限一次,你可以弃置所有手牌并摸等量的牌,若敌方角色手牌中与你弃置的牌同名的牌,则随机弃置其中一张。准备阶段开始时,你随机切换至一种形态。', sqlongwu:'龙舞', - sqlongwu_info:'结束阶段,你可以摸X张牌,然后可以使用一张牌,X为手牌中同名牌数最多的牌的数量。准备阶段开始时,你随机切换至一种形态', + sqlongwu_info:'结束阶段,你可以摸X张牌,然后可以使用一张牌,X为手牌中同名牌数最多的牌的数量。准备阶段开始时,你随机切换至一种形态。', kuanglie:'狂猎', - kuanglie_info:'锁定技,每当你使用黑色牌指定其他角色为目标后,目标随机弃置一张牌;每当你以此法累计弃置两张牌后,你摸一张牌', - // kuanglie_info:'锁定技,每当一名敌方角色成为你的黑色牌的目标,你视为对其使用【刺骨寒霜】;在一名角色受到【刺骨寒霜】的影响后,你随机获得一张【狂猎】牌', + kuanglie_info:'锁定技,每当你使用黑色牌指定其他角色为目标后,目标随机弃置一张牌;每当你以此法累计弃置两张牌后,你摸一张牌。', + // kuanglie_info:'锁定技,每当一名敌方角色成为你的黑色牌的目标,你视为对其使用【刺骨寒霜】;在一名角色受到【刺骨寒霜】的影响后,你随机获得一张【狂猎】牌。', lingshuang:'凛霜', - lingshuang_info:'每当你失去最后一张基本牌,你可以视为对距离2以内的所有敌方角色使用【刺骨寒霜】;在一名角色受到【刺骨寒霜】影响时,你可以弃置一张手牌将其效果改为“摸牌数-2”', + lingshuang_info:'每当你失去最后一张基本牌,你可以视为对距离2以内的所有敌方角色使用【刺骨寒霜】;在一名角色受到【刺骨寒霜】影响时,你可以弃置一张手牌将其效果改为“摸牌数-2”。', gwshuangwu:'霜舞', - gwshuangwu_info:'锁定技,每当你造成一次伤害,你视为对目标使用刺骨寒霜;你对处于刺骨寒霜的角色造成的伤害+1', + gwshuangwu_info:'锁定技,每当你造成一次伤害,你视为对目标使用刺骨寒霜;你对处于刺骨寒霜的角色造成的伤害+1。', gwhuanshuang:'幻霜', - gwhuanshuang_info:'准备或结束阶段,你可以发现一张铜卡法术并使用之,此牌结算两次', + gwhuanshuang_info:'准备或结束阶段,你可以发现一张铜卡法术并使用之,此牌结算两次。', gwjinli:'金醴', gwjinli_jiu:'先祖麦酒', - gwjinli_info:'出牌阶段限一次,你可以弃置一张手牌,并将一张先祖麦酒置于一名角色的武将牌上', + gwjinli_info:'出牌阶段限一次,你可以弃置一张手牌,并将一张先祖麦酒置于一名角色的武将牌上。', gw_xianzumaijiu:'先祖麦酒', - gw_xianzumaijiu_info:'出牌阶段对自己使用,你使用下一张杀造成伤害后,令所有友方角色摸一张牌;濒死阶段,对自己使用,回复1点体力', + gw_xianzumaijiu_info:'出牌阶段对自己使用,你使用下一张杀造成伤害后,令所有友方角色摸一张牌;濒死阶段,对自己使用,回复1点体力。', gwliaotian:'燎天', - gwliaotian_info:'出牌阶段限2次,若你有至少两张手牌且颜色均相同,你可以重铸你的全部手牌,并视为对一名随机敌方角色使用一张不计入出杀次数的杀', + gwliaotian_info:'出牌阶段限2次,若你有至少两张手牌且颜色均相同,你可以重铸你的全部手牌,并视为对一名随机敌方角色使用一张不计入出杀次数的杀。', gwmaoxian_yioufeisi:'伊欧菲斯', - gwmaoxian_yioufeisi_info:'选择两名角色,令目标依次视为对对方使用一张杀,然后结束出牌阶段', + gwmaoxian_yioufeisi_info:'选择两名角色,令目标依次视为对对方使用一张杀,然后结束出牌阶段。', gwmaoxian_luoqi:'罗契', - gwmaoxian_luoqi_info:'选择一名角色视为对其使用一张不计入出杀次数的杀,然后所有其他角色可以对目标使用一张杀,然后结束出牌阶段', + gwmaoxian_luoqi_info:'选择一名角色视为对其使用一张不计入出杀次数的杀,然后所有其他角色可以对目标使用一张杀,然后结束出牌阶段。', gwmaoxian_jieluote:'杰洛特', - gwmaoxian_jieluote_info:'对一名角色造成1点伤害,若目标体力值大于2且为全场最多,改为造成2点伤害,然后结束出牌阶段', + gwmaoxian_jieluote_info:'对一名角色造成1点伤害,若目标体力值大于2且为全场最多,改为造成2点伤害,然后结束出牌阶段。', gwmaoxian_yenaifa:'叶奈法', - gwmaoxian_yenaifa_info:'对至多3名随机敌方角色施加一个随机负面效果,然后结束出牌阶段', + gwmaoxian_yenaifa_info:'对至多3名随机敌方角色施加一个随机负面效果,然后结束出牌阶段。', gwmaoxian_telisi:'特丽斯', - gwmaoxian_telisi_info:'对至多3名随机友方角色施加一个随机正面效果,然后结束出牌阶段', + gwmaoxian_telisi_info:'对至多3名随机友方角色施加一个随机正面效果,然后结束出牌阶段。', gwmaoxian_hengsaite:'亨赛特', - gwmaoxian_hengsaite_info:'视为使用一张万箭齐发,每当有一名角色因此受到伤害,你获得一张杀,然后结束出牌阶段', + gwmaoxian_hengsaite_info:'视为使用一张万箭齐发,每当有一名角色因此受到伤害,你获得一张杀,然后结束出牌阶段。', gwmaoxian_fuertaisite:'弗尔泰斯特', - gwmaoxian_fuertaisite_info:'令至多两名角色各获得1点护甲,然后结束出牌阶段', + gwmaoxian_fuertaisite_info:'令至多两名角色各获得1点护甲,然后结束出牌阶段。', gwmaoxian_laduoweide:'拉多维德', - gwmaoxian_laduoweide_info:'令一名角色的非锁定技失效直到其下一回合结束,并对其造成1点伤害,然后结束出牌阶段', + gwmaoxian_laduoweide_info:'令一名角色的非锁定技失效直到其下一回合结束,并对其造成1点伤害,然后结束出牌阶段。', gwmaoxian_enxier:'恩希尔', - gwmaoxian_enxier_info:'与一名手牌并不超过1的其他角色交换手牌,然后结束出牌阶段', + gwmaoxian_enxier_info:'与一名手牌并不超过1的其他角色交换手牌,然后结束出牌阶段。', gwmaoxian_fulisi:'符里斯', - gwmaoxian_fulisi_info:'选择至多三名角色,观看目标的手牌并可以弃置其中1~2张,然后结束出牌阶段', + gwmaoxian_fulisi_info:'选择至多三名角色,观看目标的手牌并可以弃置其中1~2张,然后结束出牌阶段。', gwmaoxian_kaerweite:'卡尔维特', - gwmaoxian_kaerweite_info:'获得至多两名角色各一张手牌,然后结束出牌阶段', + gwmaoxian_kaerweite_info:'获得至多两名角色各一张手牌,然后结束出牌阶段。', gwmaoxian_bulanwang:'布兰王', - gwmaoxian_bulanwang_info:'弃置至多两张牌并摸数量等于弃牌数2倍的牌,跳过弃牌阶段,然后结束出牌阶段', + gwmaoxian_bulanwang_info:'弃置至多两张牌并摸数量等于弃牌数2倍的牌,跳过弃牌阶段,然后结束出牌阶段。', gwmaoxian_kuite:'奎特', - gwmaoxian_kuite_info:'视为对一名手牌数不小于你的角色连续使用2张决斗,然后结束出牌阶段', + gwmaoxian_kuite_info:'视为对一名手牌数不小于你的角色连续使用2张决斗,然后结束出牌阶段。', gwmaoxian_haluo:'哈洛', - gwmaoxian_haluo_info:'对所有体力值全场最少的角色造成1点伤害,然后结束出牌阶段', + gwmaoxian_haluo_info:'对所有体力值全场最少的角色造成1点伤害,然后结束出牌阶段。', gwmaoxian_dagong:'达贡', - gwmaoxian_dagong_info:'视为同时使用刺骨寒霜、蔽日浓雾和倾盆大雨,然后结束出牌阶段', + gwmaoxian_dagong_info:'视为同时使用刺骨寒霜、蔽日浓雾和倾盆大雨,然后结束出牌阶段。', gwmaoxian_gaier:'盖尔', - gwmaoxian_gaier_info:'令一名角色增加或减少1点体力和体力上限,然后结束出牌阶段', + gwmaoxian_gaier_info:'令一名角色增加或减少1点体力和体力上限,然后结束出牌阶段。', gwmaoxian_airuiting:'艾瑞汀', - gwmaoxian_airuiting_info:'令所有其他角色选择一项:使用一张杀,或失去1点体力,然后结束出牌阶段', + gwmaoxian_airuiting_info:'令所有其他角色选择一项:使用一张杀,或失去1点体力,然后结束出牌阶段。', gwmaoxian_aisinie:'埃丝涅', - gwmaoxian_aisinie_info:'回复1点体力并获得任意一张银卡法术,然后结束出牌阶段', + gwmaoxian_aisinie_info:'回复1点体力并获得任意一张银卡法术,然后结束出牌阶段。', gwmaoxian_falanxisika:'法兰茜斯卡', - gwmaoxian_falanxisika_info:'随机观看3张金卡法术并使用其中一张,然后结束出牌阶段', + gwmaoxian_falanxisika_info:'随机观看3张金卡法术并使用其中一张,然后结束出牌阶段。', gwmaoxian_huoge:'霍格', - gwmaoxian_huoge_info:'观看牌堆顶的六张牌,使用至多两张,然后弃掉其余的牌,然后结束出牌阶段', + gwmaoxian_huoge_info:'观看牌堆顶的六张牌,使用至多两张,然后弃掉其余的牌,然后结束出牌阶段。', gwmaoxian:'冒险', gwhuanbi:'幻笔', - gwhuanbi_info:'出牌阶段限一次,你可以弃置一张牌,并创造一张冒险牌,然后随机选择一名有手牌的角色,被选中的角色可以交给你一张手牌并获得一张该牌的复制', + gwhuanbi_info:'出牌阶段限一次,你可以弃置一张牌,并创造一张冒险牌,然后随机选择一名有手牌的角色,被选中的角色可以交给你一张手牌并获得一张该牌的复制。', gwminxiang:'冥想', - gwminxiang_old_info:'结束阶段,你可以选择一张本回合使用过的基本牌或普通锦囊牌并选择两名其他角色,令目标分别视为对对方使用一张此牌的复制', - gwminxiang_info:'出牌阶段限一次,你可以弃置一张基本牌或普通锦囊牌并摸一张牌,然后选择其他两名角色,令目标分别视为对对方使用一张你弃置的牌的同名牌', + gwminxiang_old_info:'结束阶段,你可以选择一张本回合使用过的基本牌或普通锦囊牌并选择两名其他角色,令目标分别视为对对方使用一张此牌的复制。', + gwminxiang_info:'出牌阶段限一次,你可以弃置一张基本牌或普通锦囊牌并摸一张牌,然后选择其他两名角色,令目标分别视为对对方使用一张你弃置的牌的同名牌。', gwlangshi:'狼噬', - gwlangshi_info:'每当你造成一次伤害,你可以对一名体力值不小于受伤害角色的其他角色造1点伤害', + gwlangshi_info:'每当你造成一次伤害,你可以对一名体力值不小于受伤害角色的其他角色造1点伤害。', gwjingshi:'血契', - gwjingshi_info:'出牌阶段限一次,你可以猜测手牌中黑色牌最多的角色是谁,若猜对,你可以观看所有其他角色的手牌并获得任意一张', + gwjingshi_info:'出牌阶段限一次,你可以猜测手牌中黑色牌最多的角色是谁,若猜对,你可以观看所有其他角色的手牌并获得任意一张。', gwjingtian:'经天', - gwjingtian_info:'锁定技,牌堆顶的九张牌对你始终可见;你始终跳过摸牌阶段,改为获得3枚“经天”标记;每名角色的回合限一次,你可以在任意时间点移去一枚“经天”标记,然后获得牌堆顶的一张牌', + gwjingtian_info:'锁定技,牌堆顶的九张牌对你始终可见;你始终跳过摸牌阶段,改为获得3枚“经天”标记;每名角色的回合限一次,你可以在任意时间点移去一枚“经天”标记,然后获得牌堆顶的一张牌。', gwweitu:'卫土', - gwweitu_info:'锁定技,每当你弃置牌,若你的护甲数小于3,你获得1点护甲;每当你的护甲为你累计抵消3次伤害,你获得一张随机银卡法术', + gwweitu_info:'锁定技,每当你弃置牌,若你的护甲数小于3,你获得1点护甲;每当你的护甲为你累计抵消3次伤害,你获得一张随机银卡法术。', gwzhongmo:'终末', - gwzhongmo_info:'锁定技,你跳过摸牌阶段,改为获得两张随机的稀有度不同的法术牌', + gwzhongmo_info:'锁定技,你跳过摸牌阶段,改为获得两张随机的稀有度不同的法术牌。', gwfutian:'覆天', - gwfutian_info:'锁定技,你防止一切伤害;准备阶段,你须弃置一名其他角色的一张手牌;若你以此法累计弃置弃置的总点数达到了24,你变身为汉姆多尔', + gwfutian_info:'锁定技,你防止一切伤害;准备阶段,你须弃置一名其他角色的一张手牌;若你以此法累计弃置弃置的总点数达到了24,你变身为汉姆多尔。', gwgouhun:'勾魂', - gwgouhun_info:'出牌阶段限一次,你可以交给一名有手牌的其他角色一张手牌,然后令其选择一项:1. 将手牌中与此牌花色相同的牌(至少一张)交给你;2. 弃置手牌中与此牌花色不同的牌(至少一张);3. 进入混乱状态直到下一回合结束', + gwgouhun_info:'出牌阶段限一次,你可以交给一名有手牌的其他角色一张手牌,然后令其选择一项:1. 将手牌中与此牌花色相同的牌(至少一张)交给你;2. 弃置手牌中与此牌花色不同的牌(至少一张);3. 进入混乱状态直到下一回合结束。', gw_wuyao:'雾妖', - gw_wuyao_info:'在你行动时可当作杀使用;回合结束后,从手牌中消失', + gw_wuyao_info:'在你行动时可当作杀使用;回合结束后,从手牌中消失。', gw_lang:'狼', - gw_lang_info:'在你行动时可当作酒使用;回合结束后,从手牌中消失', + gw_lang_info:'在你行动时可当作酒使用;回合结束后,从手牌中消失。', gwyewu:'叶舞', - gwyewu_info:'出牌阶段限一次,你可以弃置一张手牌,并弃置一名随机敌人的一张随机牌;若目标弃置的牌与你弃置的牌颜色相同,则重复发动;每以此法弃置一张敌方角色的手牌,你获得一张【雾妖】;每以此法弃置一张敌方角色的手牌,你获得一张【狼】', + gwyewu_info:'出牌阶段限一次,你可以弃置一张手牌,并弃置一名随机敌人的一张随机牌;若目标弃置的牌与你弃置的牌颜色相同,则重复发动;每以此法弃置一张敌方角色的手牌,你获得一张【雾妖】;每以此法弃置一张敌方角色的手牌,你获得一张【狼】。', shuangxi:'霜袭', - shuangxi_info:'每两轮限一次,出牌阶段,你可以视为使用一张【刺骨寒霜】;若你在本回合造成过伤害,改为使用【白霜】', + shuangxi_info:'每两轮限一次,出牌阶段,你可以视为使用一张【刺骨寒霜】;若你在本回合造成过伤害,改为使用【白霜】。', gwfengshi:'风蚀', - gwfengshi_info:'结束阶段,你可以选择一项:1. 为自己施加一个随机负面效果,并对两名随机敌人施加一个随机负面效果;2. 为自己施加两个随机正面效果,并对一名随机敌人施加一个随机正面效果', + gwfengshi_info:'结束阶段,你可以选择一项:1. 为自己施加一个随机负面效果,并对两名随机敌人施加一个随机负面效果;2. 为自己施加两个随机正面效果,并对一名随机敌人施加一个随机正面效果。', yangfan:'扬帆', - yangfan_info:'锁定技,每当你使用一张非装备牌,你随机重铸一张与其花色相同的手牌;若没有花色相同的手牌,改为随机重铸一张与其颜色相同的手牌', + yangfan_info:'锁定技,每当你使用一张非装备牌,你随机重铸一张与其花色相同的手牌;若没有花色相同的手牌,改为随机重铸一张与其颜色相同的手牌。', gwchenshui:'沉睡', gwchenshui_bg:'睡', - gwchenshui_info:'锁定技,你防止即将造成或受到的伤害,改为令伤害来随机源获得对方一张牌;结束阶段,若你自上次沉睡起累计发动了至少3次沉睡效果,你解除沉睡状态,对所有敌方角色造成1点伤害,然后切换至觉醒状态', + gwchenshui_info:'锁定技,你防止即将造成或受到的伤害,改为令伤害来随机源获得对方一张牌;结束阶段,若你自上次沉睡起累计发动了至少3次沉睡效果,你解除沉睡状态,对所有敌方角色造成1点伤害,然后切换至觉醒状态。', gwliedi:'裂地', - gwliedi_info:'锁定技,你造成的伤害+X,X为你到该角色距离的一半,向下取整;结束阶段,若你连续两轮未造成伤害,你切换至沉睡状态', + gwliedi_info:'锁定技,你造成的伤害+X,X为你到该角色距离的一半,向下取整;结束阶段,若你连续两轮未造成伤害,你切换至沉睡状态。', julian:'巨敛', - julian_info:'出牌阶段开始时,你可以摸若干张牌直到你的手牌数为全场最多或之一', + julian_info:'出牌阶段开始时,你可以摸若干张牌直到你的手牌数为全场最多或之一。', gwfusheng:'复生', - gwfusheng_info:'当一名未翻面的角色进入濒死状态时,你可以令其翻面并回复1点体力,然后你与其各摸一张牌', + gwfusheng_info:'当一名未翻面的角色进入濒死状态时,你可以令其翻面并回复1点体力,然后你与其各摸一张牌。', gwqinwu:'琴舞', gwqinwu2:'琴舞', - gwqinwu_info:'出牌阶段限一次,每当你使用一张基本牌,你可以令一名角色摸一张牌并获得技能〖琴舞〗直到其下一回合结束', + gwqinwu_info:'出牌阶段限一次,每当你使用一张基本牌,你可以令一名角色摸一张牌并获得技能〖琴舞〗直到其下一回合结束。', huanshu:'幻术', huanshu2:'幻术', huanshu3:'幻术', - huanshu_info:'结束阶段,你可以将一张手牌背面朝上置于你的武将牌上;当一名敌方角色使用一张与之颜色相同的锦囊牌时,你展示并移去此牌,取消锦囊的效果,然后摸两张牌;准备阶段,你移去武将牌上的“幻术”牌', + huanshu_info:'结束阶段,你可以将一张手牌背面朝上置于你的武将牌上;当一名敌方角色使用一张与之颜色相同的锦囊牌时,你展示并移去此牌,取消锦囊的效果,然后摸两张牌;准备阶段,你移去武将牌上的“幻术”牌。', gwjieyin:'结印', - gwjieyin_info:'出牌阶段,你可以视为使用瘟疫、燕子药水或昆恩法印(不能重复使用同一法术),技能两轮重置一次', + gwjieyin_info:'出牌阶段,你可以视为使用瘟疫、燕子药水或昆恩法印(不能重复使用同一法术),技能两轮重置一次。', zhengjun:'整军', - zhengjun_info:'锁定技,每当你使用或打出一张卡牌,若这是你在本局游戏中使用或打出的第二张与之同名的牌,你增加1点体力和体力上限;结束阶段,你可以观看牌堆顶的X张牌并获得其中一张,X为你以此法增加的体力上限数', + zhengjun_info:'锁定技,每当你使用或打出一张卡牌,若这是你在本局游戏中使用或打出的第二张与之同名的牌,你增加1点体力和体力上限;结束阶段,你可以观看牌堆顶的X张牌并获得其中一张,X为你以此法增加的体力上限数。', gwxuezhan:'血战', - gwxuezhan_info:'准备阶段,若你的手牌数为全场最少或之一,你可以获得一张十字召唤', + gwxuezhan_info:'准备阶段,若你的手牌数为全场最少或之一,你可以获得一张十字召唤。', jielue:'劫掠', - jielue_info:'锁定技,出牌阶段开始时,你从两个随机队友处各获得一张可使用的牌并依次使用之,然后被拿牌的队友摸一张牌', - jielue_old_info:'当你于回合内首次使用基本牌时,你可以获得两张该牌的复制(使用复制的牌时不触发此技能)', + jielue_info:'锁定技,出牌阶段开始时,你从两个随机队友处各获得一张可使用的牌并依次使用之,然后被拿牌的队友摸一张牌。', + jielue_old_info:'当你于回合内首次使用基本牌时,你可以获得两张该牌的复制(使用复制的牌时不触发此技能)。', gwfengchi:'风驰', - gwfengchi_info:'锁定技,出牌阶段开始时,你随机观看3个可以在出牌阶段使用的技能,并获得其中一个技能直到此阶段结束', + gwfengchi_info:'锁定技,出牌阶段开始时,你随机观看3个可以在出牌阶段使用的技能,并获得其中一个技能直到此阶段结束。', gwjushi:'巨噬', gwjushi2:'巨噬', - gwjushi_info:'出牌阶段限一次,你可以将一名距离1以内的其他角色的一张随机牌置于你的武将牌上;当你受到伤害后,令“巨噬”牌回到原来的位置;准备阶段,你获得武将牌上的“巨噬”牌', + gwjushi_info:'出牌阶段限一次,你可以将一名距离1以内的其他角色的一张随机牌置于你的武将牌上;当你受到伤害后,令“巨噬”牌回到原来的位置;准备阶段,你获得武将牌上的“巨噬”牌。', bolang:'搏浪', - bolang_info:'准备阶段,你可以观看牌堆顶的六张牌,然后将其中至多3张移入弃牌堆;每当你造成一次伤害,你可以从弃牌堆中获得一张以此法移入弃牌堆的牌(每回合限发动一次)', + bolang_info:'准备阶段,你可以观看牌堆顶的六张牌,然后将其中至多3张移入弃牌堆;每当你造成一次伤害,你可以从弃牌堆中获得一张以此法移入弃牌堆的牌(每回合限发动一次)。', lingji:'灵计', - lingji_info:'出牌阶段限一次,你可以摸两张牌并弃置两张牌,若弃置的牌花色相同,你获得一张随机铜卡并展示;若弃置的牌点数相同,你获得一张随机银卡并展示', + lingji_info:'出牌阶段限一次,你可以摸两张牌并弃置两张牌,若弃置的牌花色相同,你获得一张随机铜卡并展示;若弃置的牌点数相同,你获得一张随机银卡并展示。', gwjinyan:'金焰', - gwjinyan_info:'锁定技,准备阶段,若游戏轮数为3的倍数,你获得一张随机金卡;当游戏轮数不是3的倍数时,你防止所有伤害', + gwjinyan_info:'锁定技,准备阶段,若游戏轮数为3的倍数,你获得一张随机金卡;当游戏轮数不是3的倍数时,你防止所有伤害。', gwshenyu:'神愈', - gwshenyu_info:'准备阶段,你可以令一名角色选择一项:回复1点体力,或从弃牌堆中获得一张非金法术牌(直到洗牌入牌堆前该牌不能再以此法获得)', + gwshenyu_info:'准备阶段,你可以令一名角色选择一项:回复1点体力,或从弃牌堆中获得一张非金法术牌(直到洗牌入牌堆前该牌不能再以此法获得)。', junchi:'骏驰', - junchi_info:'每当一名其他角色使用一张杀,若目标不是你,你可以对杀的目标使用一张牌,并摸一张牌,每回合限一次', - junchi_old_info:'当一名其他角色使用杀对一个目标结算后,该角色可以交给你一张牌,然后你可以对杀的目标使用一张牌,若如此做,你回复1点体力,杀的使用者摸一张牌', + junchi_info:'每当一名其他角色使用一张杀,若目标不是你,你可以对杀的目标使用一张牌,并摸一张牌,每回合限一次。', + junchi_old_info:'当一名其他角色使用杀对一个目标结算后,该角色可以交给你一张牌,然后你可以对杀的目标使用一张牌,若如此做,你回复1点体力,杀的使用者摸一张牌。', gw_dudayuanshuai1:'杜达元帅', - gw_dudayuanshuai1_info:'当你成为其他角色使用牌的目标时,你可以使用此牌取消之,然后获得对你使用的牌', + gw_dudayuanshuai1_info:'当你成为其他角色使用牌的目标时,你可以使用此牌取消之,然后获得对你使用的牌。', gw_dudayuanshuai2:'杜达元帅', - gw_dudayuanshuai2_info:'你不能使用、打出或弃置此牌;结束阶段,若此牌在你手牌中,你弃置之并随机弃置一张手牌', + gw_dudayuanshuai2_info:'你不能使用、打出或弃置此牌;结束阶段,若此牌在你手牌中,你弃置之并随机弃置一张手牌。', hupeng:'呼朋', - hupeng_info:'出牌阶段限一次,你可以弃置一张牌并将一张杜达元帅置入一名角色的手牌', + hupeng_info:'出牌阶段限一次,你可以弃置一张牌并将一张杜达元帅置入一名角色的手牌。', shuijian:'水箭', - shuijian_info:'准备阶段,你可以弃置一张手牌视为对所有敌方角色使用一张万箭齐发', + shuijian_info:'准备阶段,你可以弃置一张手牌视为对所有敌方角色使用一张万箭齐发。', yunhuo:'陨火', - yunhuo_info:'锁定技,准备阶段,若游戏轮数为4的倍数,你令所有敌方角色随机弃置一张手牌(若没有手牌改为受到1点火焰伤害),然后在此回合结束后获得一个额外回合', + yunhuo_info:'锁定技,准备阶段,若游戏轮数为4的倍数,你令所有敌方角色随机弃置一张手牌(若没有手牌改为受到1点火焰伤害),然后在此回合结束后获得一个额外回合。', yinzhang:'银杖', - yinzhang_info:'出牌阶段限一次,你可以弃置一张牌,然后发现一张银卡法术', + yinzhang_info:'出牌阶段限一次,你可以弃置一张牌,然后发现一张银卡法术。', gwtianbian:'天变', - gwtianbian_info:'出牌阶段开始时,你可以选择一项:随机使用一张对全场有正面效果的牌;或随机使用一张对全场有负面效果的牌', + gwtianbian_info:'出牌阶段开始时,你可以选择一项:随机使用一张对全场有正面效果的牌;或随机使用一张对全场有负面效果的牌。', gwxiaoshou:'枭首', - gwxiaoshou_info:'出牌阶段限两次,你可以弃置一张牌对场上体力值最高(或之一)的一名角色造成1点伤害', + gwxiaoshou_info:'出牌阶段限两次,你可以弃置一张牌对场上体力值最高(或之一)的一名角色造成1点伤害。', gwjiquan:'集权', - gwjiquan_info:'出牌阶段限一次,你可以从任意名角色处各获得一张牌,每拿一张牌,被拿牌的角色视为对你使用一张杀', + gwjiquan_info:'出牌阶段限一次,你可以从任意名角色处各获得一张牌,每拿一张牌,被拿牌的角色视为对你使用一张杀。', nuhou:'怒吼', - nuhou_info:'每当你受到一次伤害,你可以弃置一张牌,然后对一名随机敌人造成1点伤害并随机弃置其一张牌', + nuhou_info:'每当你受到一次伤害,你可以弃置一张牌,然后对一名随机敌人造成1点伤害并随机弃置其一张牌。', shewu:'蛇舞', - shewu_info:'出牌阶段限一次,你可以弃置至多三张牌然后摸三张牌;若你弃置了至少两张牌,你本回合使用牌无视距离;若你弃置了三张牌,你回复1点体力', + shewu_info:'出牌阶段限一次,你可以弃置至多三张牌然后摸三张牌;若你弃置了至少两张牌,你本回合使用牌无视距离;若你弃置了三张牌,你回复1点体力。', gwzhanjiang:'斩将', - gwzhanjiang_info:'每轮限一次,在一名角色的准备阶段,你可以弃置一张牌,然后所有角色可以对该角色使用一张杀,出杀的角色在响应时摸一张牌,当有至少两名角色响应后终止结算', + gwzhanjiang_info:'每轮限一次,在一名角色的准备阶段,你可以弃置一张牌,然后所有角色可以对该角色使用一张杀,出杀的角色在响应时摸一张牌,当有至少两名角色响应后终止结算。', gwchuanxin:'穿心', - gwchuanxin_info:'你的攻击范围基数为你当前体力值;每当你对一名角色使用杀结算完毕后,你可以亮出牌堆顶的一张牌,若为黑色,视为对目标再使用一张杀', + gwchuanxin_info:'你的攻击范围基数为你当前体力值;每当你对一名角色使用杀结算完毕后,你可以亮出牌堆顶的一张牌,若为黑色,视为对目标再使用一张杀。', fengjian:'风剑', - fengjian_info:'每当你使用一张锦囊牌,你可以视为对一名不是此牌目标的角色使用一张雷杀,若如此做,你获得潜行直到下一回合开始', + fengjian_info:'每当你使用一张锦囊牌,你可以视为对一名不是此牌目标的角色使用一张雷杀,若如此做,你获得潜行直到下一回合开始。', huandie:'幻蝶', - huandie_info:'准备阶段,你可以摸一张牌,并令任意名其他角色摸两张牌,若如此做,此回合结束时,所有手牌数大于体力值的角色需弃置两张手牌', + huandie_info:'准备阶段,你可以摸一张牌,并令任意名其他角色摸两张牌,若如此做,此回合结束时,所有手牌数大于体力值的角色需弃置两张手牌。', xuezhou:'血咒', - xuezhou_info:'准备阶段,你可以选择一项效果直到下一回合开始:1. 每当一名其他角色在一个回合中首次受到伤害,该角色失去1点体力,你回复1点体力;2. 每当一名其他角色在一个回合中首次造成伤害,该角色失去1点体力,你(若不是受伤害角色)回复1点体力', + xuezhou_info:'准备阶段,你可以选择一项效果直到下一回合开始:1. 每当一名其他角色在一个回合中首次受到伤害,该角色失去1点体力,你回复1点体力;2. 每当一名其他角色在一个回合中首次造成伤害,该角色失去1点体力,你(若不是受伤害角色)回复1点体力。', fayin:'法印', - fayin_info:'每当你使用一张杀,你可以弃置一张牌并获得一个随机法印效果:1. 目标随机弃置两张牌;2. 目标进入混乱状态直到下一回合开始;3. 对目标造成1点火属性伤害;4. 获得1点护甲;5. 令目标翻面并摸一张牌', + fayin_info:'每当你使用一张杀,你可以弃置一张牌并获得一个随机法印效果:1. 目标随机弃置两张牌;2. 目标进入混乱状态直到下一回合开始;3. 对目标造成1点火属性伤害;4. 获得1点护甲;5. 令目标翻面并摸一张牌。', gwbaquan:'霸权', - gwbaquan_info:'出牌阶段限一次,你可以获得一名其他角色的所有牌,然后还给其等量的牌,若你归还的牌均为你得到的牌且该角色体力值不小于你,你对其造成1点伤害', + gwbaquan_info:'出牌阶段限一次,你可以获得一名其他角色的所有牌,然后还给其等量的牌,若你归还的牌均为你得到的牌且该角色体力值不小于你,你对其造成1点伤害。', hunmo:'魂墨', - hunmo_info:'出牌阶段,若你手牌数少于2,你可以选择一名手牌数小于2的其他角色,观看牌堆顶的两张牌,你获得一张并交给其另一张;若你手牌数不少2,你可以选择一名手牌数不少于2的其他角色,你弃置一张手牌,然后观看并弃置其一张手牌。每回合对同一名角色最多发动一次', + hunmo_info:'出牌阶段,若你手牌数少于2,你可以选择一名手牌数小于2的其他角色,观看牌堆顶的两张牌,你获得一张并交给其另一张;若你手牌数不少2,你可以选择一名手牌数不少于2的其他角色,你弃置一张手牌,然后观看并弃置其一张手牌。每回合对同一名角色最多发动一次。', huihun:'回魂', - huihun_info:'结束阶段,你可以从弃牌堆中获得本回合使用的前两张红色牌', + huihun_info:'结束阶段,你可以从弃牌堆中获得本回合使用的前两张红色牌。', lanquan:'远略', lanquan_backup:'远略', - lanquan_info:'出牌阶段限一次,你可以观看牌堆顶的六张牌,并选择一张使用', + lanquan_info:'出牌阶段限一次,你可以观看牌堆顶的六张牌,并选择一张使用。', chaoyong:'潮涌', - chaoyong_info:'准备阶段,你可以弃置一张牌,视为对所有敌方角色使用一张南蛮入侵或万箭齐发', + chaoyong_info:'准备阶段,你可以弃置一张牌,视为对所有敌方角色使用一张南蛮入侵或万箭齐发。', } }; }); diff --git a/character/hearth.js b/character/hearth.js index 442b1ca0e..6dbc3332f 100644 --- a/character/hearth.js +++ b/character/hearth.js @@ -804,7 +804,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return trigger.targets.contains(target); }, ai1:function(card){ - if(!player.needsToDiscard(ui.selected.cards.length)) return 0; + if(!player.needsToDiscard(0,(i,player)=>{ + return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); + })) return 0; if(ui.selected.cards.length>=num2) return 0; return Math.max(5,get.value(trigger.card))-get.value(card)-1; }, @@ -9635,64 +9637,64 @@ game.import('character',function(lib,game,ui,get,ai,_status){ hs_duyaxinshi:'渡鸦信使', hshuanyu:'幻羽', - hshuanyu_info:'每当你受到一次伤害,你获得发现一张炉石衍生牌', + hshuanyu_info:'每当你受到一次伤害,你获得发现一张炉石衍生牌。', hsfashu:'法术', hsfashu_anyingjingxiang:'暗影镜像', - hsfashu_anyingjingxiang_info:'当你使用或打出一张牌后,暗影镜像变为该牌的复制', + hsfashu_anyingjingxiang_info:'当你使用或打出一张牌后,暗影镜像变为该牌的复制。', hsfashu_buwendingyibian:'不稳定异变', - hsfashu_buwendingyibian_info:'出牌阶段对一名角色使用,目标将一张手牌重铸为同类别的牌,本回合可重复使用此牌,最多使用X次,X为当前体力值', + hsfashu_buwendingyibian_info:'出牌阶段对一名角色使用,目标将一张手牌重铸为同类别的牌,本回合可重复使用此牌,最多使用X次,X为当前体力值。', hualing:'化灵', - hualing_info:'每三轮限一次,你可以选择一名其他角色,获得其一项技能,然后将其随机变形为一名强度高一级的武将', + hualing_info:'每三轮限一次,你可以选择一名其他角色,获得其一项技能,然后将其随机变形为一名强度高一级的武将。', yibian:'异变', - yibian_info:'锁定技,出牌阶段开始时,若你没有不稳定异变,则将一张不稳定异变置于你的手牌', + yibian_info:'锁定技,出牌阶段开始时,若你没有不稳定异变,则将一张不稳定异变置于你的手牌。', wxuying:'虚影', - wxuying_info:'锁定技,准备阶段,你移去手牌中的暗影镜像,然后获得一张暗影镜像(当你使用或打出一张牌后,暗影镜像变为该牌的复制);当你回合内使用暗影镜像时,你摸一张牌;当你回合外使用暗影镜像时,你获得潜行直到下一回合开始', + wxuying_info:'锁定技,准备阶段,你移去手牌中的暗影镜像,然后获得一张暗影镜像(当你使用或打出一张牌后,暗影镜像变为该牌的复制);当你回合内使用暗影镜像时,你摸一张牌;当你回合外使用暗影镜像时,你获得潜行直到下一回合开始。', zhoujiang:'咒降', - zhoujiang_info:'锁定技,每当你使用一张普通锦囊牌,你将一张随机“诅咒”牌置于你的手牌', + zhoujiang_info:'锁定技,每当你使用一张普通锦囊牌,你将一张随机“诅咒”牌置于你的手牌。', muyin:'暮隐', - muyin_info:'锁定技,每当你失去最后一张手牌,你获得潜行直到下一回合开始', + muyin_info:'锁定技,每当你失去最后一张手牌,你获得潜行直到下一回合开始。', tqchuanyue:'穿越', - tqchuanyue_info:'锁定技,准备阶段开始时,你随机选择一个被削弱过的炉石技能,获得其未削弱的版本,替换上一个以此法获得的技能', + tqchuanyue_info:'锁定技,准备阶段开始时,你随机选择一个被削弱过的炉石技能,获得其未削弱的版本,替换上一个以此法获得的技能。', // hsxiujian:'袖箭', - // hsxiujian_info:'锁定技,在你对一名敌方角色使用一张锦囊牌后,你视为对其使用一张杀', + // hsxiujian_info:'锁定技,在你对一名敌方角色使用一张锦囊牌后,你视为对其使用一张杀。', // hsyingzong:'影踪', // hsyingzong_info:'', hsxingyi:'星移', - hsxingyi_info:'锁定技,每当一名敌方角色于回合内使用主动技能,你获得此技能直到下一回合结束', + hsxingyi_info:'锁定技,每当一名敌方角色于回合内使用主动技能,你获得此技能直到下一回合结束。', hshuanling:'幻灵', hshuanling_bg:'灵', - hshuanling_info:'结束阶段,你可以弃置至多X张牌(X为你装备区内的牌数且至少为1)并摸等量的牌,每弃置一张牌,你随机使用一张本局敌方角色使用过的单目标非转化普通锦囊牌,随机指定一个具有正收益的角色为目标', - // hshuanling_info:'锁定技,当你于回合内使用首张指定其他角色为惟一目标的锦囊牌后,你视为对其随机使用一张锦囊牌(此牌对你有正面效果)', - // hshuanling_info:'每当你使用一张基本牌或普通锦囊牌,你可以弃置任意张牌令其增加或减少等量的目标', + hshuanling_info:'结束阶段,你可以弃置至多X张牌(X为你装备区内的牌数且至少为1)并摸等量的牌,每弃置一张牌,你随机使用一张本局敌方角色使用过的单目标非转化普通锦囊牌,随机指定一个具有正收益的角色为目标。', + // hshuanling_info:'锁定技,当你于回合内使用首张指定其他角色为惟一目标的锦囊牌后,你视为对其随机使用一张锦囊牌(此牌对你有正面效果)。', + // hshuanling_info:'每当你使用一张基本牌或普通锦囊牌,你可以弃置任意张牌令其增加或减少等量的目标。', huanfeng:'唤风', - huanfeng_info:'锁定技,准备阶段,若你有4个图腾,你失去所有图腾,然后获得并召唤随从奥拉基尔', + huanfeng_info:'锁定技,准备阶段,若你有4个图腾,你失去所有图腾,然后获得并召唤随从奥拉基尔。', asyouzhang:'幽瘴', - asyouzhang_info:'结束阶段,若你的手牌中没有基本牌/锦囊牌/装备牌,你可以获得牌堆顶的一张基本牌/锦囊牌/装备牌,并可以立即使用', + asyouzhang_info:'结束阶段,若你的手牌中没有基本牌/锦囊牌/装备牌,你可以获得牌堆顶的一张基本牌/锦囊牌/装备牌,并可以立即使用。', ylyuchu:'育雏', - ylyuchu_info:'锁定技,每当你回复1点体力,你获得一只雏龙随从(不超过3只);结束阶段,你每有一只雏龙,便随机选择一名其他角色,在该角色的下个回合开始前你切换至该雏龙,然后在此回合结束后进行一个额外回合并切换回本体', + ylyuchu_info:'锁定技,每当你回复1点体力,你获得一只雏龙随从(不超过3只);结束阶段,你每有一只雏龙,便随机选择一名其他角色,在该角色的下个回合开始前你切换至该雏龙,然后在此回合结束后进行一个额外回合并切换回本体。', nsaiqi:'哀泣', - nsaiqi_info:'锁定技,每当你使用一张牌,你移除牌堆顶的三张牌;你的手牌上限始终+1', + nsaiqi_info:'锁定技,每当你使用一张牌,你移除牌堆顶的三张牌;你的手牌上限始终+1。', nsbeiming:'悲鸣', - nsbeiming_info:'锁定技,当你移除的牌不少于9张时,你摸一张牌,然后将移除的牌以任意顺序置于牌堆顶;当被移除过的牌在牌堆顶时(洗牌后重置),你的不能发动【哀泣】移除牌', + nsbeiming_info:'锁定技,当你移除的牌不少于9张时,你摸一张牌,然后将移除的牌以任意顺序置于牌堆顶;当被移除过的牌在牌堆顶时(洗牌后重置),你的不能发动【哀泣】移除牌。', hstianqi_dalian:'达里安', - hstianqi_dalian_info:'每当你造成一次伤害,你回复等量的体力', + hstianqi_dalian_info:'每当你造成一次伤害,你回复等量的体力。', hstianqi_shali:'莎莉', - hstianqi_shali_info:'每当你回复体力,你获得等量的护甲', + hstianqi_shali_info:'每当你回复体力,你获得等量的护甲。', hstianqi_nazigelin:'纳兹戈林', - hstianqi_nazigelin_info:'当你装备此牌时,你获得1点护甲', + hstianqi_nazigelin_info:'当你装备此牌时,你获得1点护甲。', hstianqi_suolasi:'索拉斯', - hstianqi_suolasi_info:'当你失去此牌时,你回复1点体力', + hstianqi_suolasi_info:'当你失去此牌时,你回复1点体力。', hschaoxi:'潮袭', - hschaoxi_info:'锁定技,每当你造成一次伤害,你获得两张随机鱼人牌', + hschaoxi_info:'锁定技,每当你造成一次伤害,你获得两张随机鱼人牌。', hsnitai:'拟态', - hsnitai_info:'锁定技,出牌阶段开始时,你获得一张随机炉石角色的技能牌', + hsnitai_info:'锁定技,出牌阶段开始时,你获得一张随机炉石角色的技能牌。', hstianqi:'天启', - hstianqi_info:'出牌阶段限一次,你可以选择一项:弃置一张手牌并随机装备一件天启骑士(不能替换现有装备),或弃置一张装备区内的牌并摸两张牌;当你以此法弃置天启骑士时,若你武将牌上没有对应的天启骑士,你将其置于你的武将牌上;准备阶段,若你的武将牌上有4张天启骑士,你获得游戏胜利', + hstianqi_info:'出牌阶段限一次,你可以选择一项:弃置一张手牌并随机装备一件天启骑士(不能替换现有装备),或弃置一张装备区内的牌并摸两张牌;当你以此法弃置天启骑士时,若你武将牌上没有对应的天启骑士,你将其置于你的武将牌上;准备阶段,若你的武将牌上有4张天启骑士,你获得游戏胜利。', hspuzhao:'普照', - hspuzhao_info:'出牌阶段限一次,你可以弃置一张红桃牌,然后令至多三名随机友方角色各摸一张牌(若你无其他队友,改为摸两张牌)', + hspuzhao_info:'出牌阶段限一次,你可以弃置一张红桃牌,然后令至多三名随机友方角色各摸一张牌(若你无其他队友,改为摸两张牌)。', hsyanxin:'炎心', - hsyanxin_info:'锁定技,在你摸牌时,若牌堆中有红色牌,你摸到的首张牌必为红色', + hsyanxin_info:'锁定技,在你摸牌时,若牌堆中有红色牌,你摸到的首张牌必为红色。', ysjqisha:'七煞', ysjqisha_ju:'惧之煞', ysjqisha_kuang:'狂之煞', @@ -9701,457 +9703,457 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ysjqisha_wang:'惘之煞', ysjqisha_hen:'恨之煞', ysjqisha_ao:'傲之煞', - ysjqisha_info:'锁定技,每当你造成或受到伤害,你令对方随机获得一种消极状态直到下一回合结束', + ysjqisha_info:'锁定技,每当你造成或受到伤害,你令对方随机获得一种消极状态直到下一回合结束。', zhaochao:'招潮', - zhaochao_info:'锁定技,结束阶段,你视为对一名随机敌人使用一张杀;若此杀被闪避,你视为对另一名随机敌人使用一张杀', + zhaochao_info:'锁定技,结束阶段,你视为对一名随机敌人使用一张杀;若此杀被闪避,你视为对另一名随机敌人使用一张杀。', hllingxi:'灵息', - hllingxi_info:'出牌阶段,你可以令一名已受伤的其他角色弃置两张牌并回复1点体力(同阶段对一名角色限用一次);结束阶段,你可以回复1点体力', + hllingxi_info:'出牌阶段,你可以令一名已受伤的其他角色弃置两张牌并回复1点体力(同阶段对一名角色限用一次);结束阶段,你可以回复1点体力。', xiyong:'汐涌', - xiyong_info:'结束阶段,你可以摸一张牌并可以使用之,若你使用了此牌,你再摸一张牌', + xiyong_info:'结束阶段,你可以摸一张牌并可以使用之,若你使用了此牌,你再摸一张牌。', hsjixie:'机械', hsjixie_zhadan:'炸弹机器人', hsjixie_zhadan_pop:'炸弹', - hsjixie_zhadan_info:'出牌阶段对自己使用,对一名随机敌人造成1点火属性伤害', + hsjixie_zhadan_info:'出牌阶段对自己使用,对一名随机敌人造成1点火属性伤害。', yindan:'引弹', - yindan_info:'出牌阶段限一次,你可以弃置一张黑桃牌并失去1点体力,然后获得两张炸弹机器人', + yindan_info:'出牌阶段限一次,你可以弃置一张黑桃牌并失去1点体力,然后获得两张炸弹机器人。', huanjue:'幻觉', - huanjue_info:'每当你使用一张牌,若此牌指定了惟一目标,你可以发现一张牌,然后可以代替此牌结算', + huanjue_info:'每当你使用一张牌,若此牌指定了惟一目标,你可以发现一张牌,然后可以代替此牌结算。', oldhuanjue:'幻觉', - oldhuanjue_info:'每回合限一次,当你成为一名其他角色的卡牌惟一目标时,你可以发现一张牌代替此牌', + oldhuanjue_info:'每回合限一次,当你成为一名其他角色的卡牌惟一目标时,你可以发现一张牌代替此牌。', zhziwu:'紫雾', - zhziwu_info:'每当你于回合外失去牌,你可以令当前回合角色不能使用杀直到回合结束', - huanjue_info_old:'每名角色的回合限一次,当你使用卡牌指定其他角色为惟一目标,或当其他角色使用卡牌指定你为惟一目标时,你可以发现一张牌代替此牌,然后该牌的使用者在结算后摸一张牌', + zhziwu_info:'每当你于回合外失去牌,你可以令当前回合角色不能使用杀直到回合结束。', + huanjue_info_old:'每名角色的回合限一次,当你使用卡牌指定其他角色为惟一目标,或当其他角色使用卡牌指定你为惟一目标时,你可以发现一张牌代替此牌,然后该牌的使用者在结算后摸一张牌。', yinzong:'影踪', - yinzong_info:'锁定技,每当你失去装备区内的牌,你获得一张闪', + yinzong_info:'锁定技,每当你失去装备区内的牌,你获得一张闪。', tansuo:'探索', - tansuo_info:'出牌阶段限一次,你可以弃置一张牌,然后发现一张炉石衍生牌', + tansuo_info:'出牌阶段限一次,你可以弃置一张牌,然后发现一张炉石衍生牌。', srjici:'棘刺', - srjici_info:'锁定技,每当你造成一次伤害,你摸一张牌,受伤害角色随机弃置一张牌', + srjici_info:'锁定技,每当你造成一次伤害,你摸一张牌,受伤害角色随机弃置一张牌。', lieqi:'猎奇', - lieqi_info:'准备和结束阶段,你可以指定一名角色,从一张该角色手牌与另外两张随机牌中猜测哪张为该角色手牌,若猜中,你获得一张该牌的复制(同一回合不能指定相同角色)', + lieqi_info:'准备和结束阶段,你可以指定一名角色,从一张该角色手牌与另外两张随机牌中猜测哪张为该角色手牌,若猜中,你获得一张该牌的复制(同一回合不能指定相同角色)。', azaowu:'造物', azaowu_backup:'造物', - azaowu_info:'出牌阶段限一次,你可以将一张基本牌当作任意一张基本牌使用', + azaowu_info:'出牌阶段限一次,你可以将一张基本牌当作任意一张基本牌使用。', shouwang:'守望', shouwang2:'守望', - shouwang_info:'每名角色每局限一次,当一名角色进入濒死状态时,你可以令其回复1点体力并获得1点护甲', - shouwang_info_alter:'每名角色每局限一次,当一名角色进入濒死状态时,你可以令其回复1点体力', + shouwang_info:'每名角色每局限一次,当一名角色进入濒死状态时,你可以令其回复1点体力并获得1点护甲。', + shouwang_info_alter:'每名角色每局限一次,当一名角色进入濒死状态时,你可以令其回复1点体力。', qingtian:'擎天', - qingtian_info:'锁定技,若你的体力值为全场最多,你受到的伤害始终+1', + qingtian_info:'锁定技,若你的体力值为全场最多,你受到的伤害始终+1。', qianfu:'潜伏', qianfu2:'潜伏', qianfu2_bg:'伏', - qianfu_info:'锁定技,在你死亡前,若你没有进入潜伏状态,你弃置所有牌并进入潜伏状态;当你体力值回复到3(或体力上限)时,你解除潜伏状态并摸三张牌', + qianfu_info:'锁定技,在你死亡前,若你没有进入潜伏状态,你弃置所有牌并进入潜伏状态;当你体力值回复到3(或体力上限)时,你解除潜伏状态并摸三张牌。', shimo:'尸魔', - shimo_info:'锁定技,距离你为1的角色受到伤害时,你回复1点体力,若你没受伤,改为摸一张牌', + shimo_info:'锁定技,距离你为1的角色受到伤害时,你回复1点体力,若你没受伤,改为摸一张牌。', lieyang:'裂阳', - lieyang_info:'锁定技,每当你于回合内使用一张锦囊牌,你获得一张随机锦囊牌;当你发动三次此技能后,你本回合不能再使用锦囊牌', + lieyang_info:'锁定技,每当你于回合内使用一张锦囊牌,你获得一张随机锦囊牌;当你发动三次此技能后,你本回合不能再使用锦囊牌。', zhuilie:'追猎', - zhuilie_info:'准备阶段,你可以弃置一张牌,然后将牌堆顶六张牌中的基本牌移至弃牌堆;若移入弃牌堆的牌超过三张,你摸一张牌', + zhuilie_info:'准备阶段,你可以弃置一张牌,然后将牌堆顶六张牌中的基本牌移至弃牌堆;若移入弃牌堆的牌超过三张,你摸一张牌。', szbianshen:'变身', - szbianshen_info:'限定技,回合开始时,若游戏轮数不少于3,你可以随机观看5张体力上限不小于5的武将牌,将武将牌替换为其中一张', + szbianshen_info:'限定技,回合开始时,若游戏轮数不少于3,你可以随机观看5张体力上限不小于5的武将牌,将武将牌替换为其中一张。', kekao:'科考', - kekao_info:'结束阶段,你可以发现一张延时锦囊牌', + kekao_info:'结束阶段,你可以发现一张延时锦囊牌。', jinhua:'进化', - jinhua_info:'锁定技,每当你以自己为目标使用一张非转化的锦囊牌,你发现一个技能并获得之', + jinhua_info:'锁定技,每当你以自己为目标使用一张非转化的锦囊牌,你发现一个技能并获得之。', hsqizhou:'祈咒', hsqizhou_feng:'风之祈咒', - hsqizhou_feng_info:'出牌阶段对自己使用,令所有目标的敌人打出一张杀或受到1点雷属性伤害', + hsqizhou_feng_info:'出牌阶段对自己使用,令所有目标的敌人打出一张杀或受到1点雷属性伤害。', hsqizhou_shui:'水之祈咒', - hsqizhou_shui_info:'出牌阶段对自己使用,回复2点体力', + hsqizhou_shui_info:'出牌阶段对自己使用,回复2点体力。', hsqizhou_huo:'火之祈咒', - hsqizhou_huo_info:'出牌阶段对任意角色使用,令目标受到1点火属性伤害', + hsqizhou_huo_info:'出牌阶段对任意角色使用,令目标受到1点火属性伤害。', hsqizhou_tu:'土之祈咒', - hsqizhou_tu_info:'出牌阶段对任意其他角色使用,令目标获得1点护甲', + hsqizhou_tu_info:'出牌阶段对任意其他角色使用,令目标获得1点护甲。', kqizhou:'祈咒', - kqizhou_info:'准备阶段,若你于上回合使用过锦囊牌,则可以获得一张元素祈咒', + kqizhou_info:'准备阶段,若你于上回合使用过锦囊牌,则可以获得一张元素祈咒。', jingcu:'晶簇', - jingcu_info:'出牌阶段,你可以减少1点体力上限并摸两张牌', + jingcu_info:'出牌阶段,你可以减少1点体力上限并摸两张牌。', shengzhang:'生长', - shengzhang_info:'锁定技,若你于弃牌阶段弃置了牌,你增加1点体力上限', + shengzhang_info:'锁定技,若你于弃牌阶段弃置了牌,你增加1点体力上限。', pyuhuo:'浴火', - pyuhuo_info:'锁定技,在你首次进入濒死状态时,你弃置所有牌、重置武将牌、将体力和体力上限变为4并摸四张牌;在你第二次进入濒死状态时,你弃置所有牌、重置武将牌、将体力和体力上限变为6并摸六张牌', + pyuhuo_info:'锁定技,在你首次进入濒死状态时,你弃置所有牌、重置武将牌、将体力和体力上限变为4并摸四张牌;在你第二次进入濒死状态时,你弃置所有牌、重置武将牌、将体力和体力上限变为6并摸六张牌。', mengye:'梦魇', - mengye_info:'结束阶段,你可以选择一名有手牌的角色将其一张随机的非毒手牌转化为毒,然后令其获得1点护甲', + mengye_info:'结束阶段,你可以选择一名有手牌的角色将其一张随机的非毒手牌转化为毒,然后令其获得1点护甲。', mengye_old:'梦魇', mengye_old2:'梦魇', - mengye_old_info:'回合结束后,你可以翻面并指定一名的非主公角色,由你控制其进行一个额外的回合。在此回合中,你的本体不参与游戏', + mengye_old_info:'回合结束后,你可以翻面并指定一名的非主公角色,由你控制其进行一个额外的回合。在此回合中,你的本体不参与游戏。', fuhua:'腐化', fuhua2:'腐化', - fuhua_info:'出牌阶段,你可以将一张毒交给一名没有魔血技能的其他角色,该角色选择一项:1. 获得技能魔血,此后每个结束阶段需交给你一张手牌;2. 视为你对其使用一张决斗', + fuhua_info:'出牌阶段,你可以将一张毒交给一名没有魔血技能的其他角色,该角色选择一项:1. 获得技能魔血,此后每个结束阶段需交给你一张手牌;2. 视为你对其使用一张决斗。', moxie:'魔血', moxie_info:'锁定技,当你因【毒】失去体力时,你改为摸两张牌;结束阶段,你将一张随机手牌转化为毒。', gfuhun:'附魂', - gfuhun_info:'结束阶段,若你未翻面,你可以和一名其他角色拼点,若你赢,你将武将牌翻至背面,该角色进入混乱状态直到下一回合结束', + gfuhun_info:'结束阶段,若你未翻面,你可以和一名其他角色拼点,若你赢,你将武将牌翻至背面,该角色进入混乱状态直到下一回合结束。', hlongyi:'龙裔', - hlongyi_info:'锁定技,你的黑色牌不占用手牌上限', + hlongyi_info:'锁定技,你的黑色牌不占用手牌上限。', zhongji:'重击', - zhongji_info:'每当你即将造成伤害,可弃置一张黑色手牌令伤害+1', + zhongji_info:'每当你即将造成伤害,可弃置一张黑色手牌令伤害+1。', fuwen:'符文', - fuwen_info:'若你弃牌阶段弃置了锦囊牌,你可以获得1点护甲', + fuwen_info:'若你弃牌阶段弃置了锦囊牌,你可以获得1点护甲。', jinzhou:'禁咒', - jinzhou_info:'结束阶段,若你手牌中有黑桃牌,你可以令一名其他角色的非锁定技失效直到其下一回合结束', + jinzhou_info:'结束阶段,若你手牌中有黑桃牌,你可以令一名其他角色的非锁定技失效直到其下一回合结束。', midian:'秘典', - midian_info:'出牌阶段限一次,你可以弃置一张锦囊牌,然后随机获得三张锦囊牌', + midian_info:'出牌阶段限一次,你可以弃置一张锦囊牌,然后随机获得三张锦囊牌。', yuelu:'月露', - yuelu_info:'在一名角色的濒死阶段,你可以弃置一张黑色牌令其回复1点体力并获得1点护甲', - yuelu_info_alter:'在一名角色的濒死阶段,你可以弃置一张黑色牌令其回复1点体力', + yuelu_info:'在一名角色的濒死阶段,你可以弃置一张黑色牌令其回复1点体力并获得1点护甲。', + yuelu_info_alter:'在一名角色的濒死阶段,你可以弃置一张黑色牌令其回复1点体力。', xingluo:'星落', - xingluo_info:'准备阶段,你可以令任意名手牌数多于你的角色各弃置一张手牌,然后你可以从弃置的牌中选择一张加入手牌', + xingluo_info:'准备阶段,你可以令任意名手牌数多于你的角色各弃置一张手牌,然后你可以从弃置的牌中选择一张加入手牌。', yushou:'御兽', - yushou_info:'出牌阶段,你可以弃置一张牌并召唤一个随机的野兽宠物,回合开始阶段,你随机失去一个宠物', + yushou_info:'出牌阶段,你可以弃置一张牌并召唤一个随机的野兽宠物,回合开始阶段,你随机失去一个宠物。', yushou_misha:'米莎', - yushou_misha_info:'每当你受到一次伤害,你获得1点护甲', + yushou_misha_info:'每当你受到一次伤害,你获得1点护甲。', yushou_huofu:'霍弗', - yushou_huofu_info:'你可以将一张黑色牌当作决斗使用', + yushou_huofu_info:'你可以将一张黑色牌当作决斗使用。', yushou_leiouke:'雷欧克', - yushou_leiouke_info:'你每回合造成的首次伤害+1', + yushou_leiouke_info:'你每回合造成的首次伤害+1。', hsqingyu_hufu:'青玉护符', - hsqingyu_hufu_info:'令一名角色获得1点护甲', + hsqingyu_hufu_info:'令一名角色获得1点护甲。', hsqingyu_zhao:'青玉之爪', - hsqingyu_zhao_info:'当你装备此装备时,摸一张牌', + hsqingyu_zhao_info:'当你装备此装备时,摸一张牌。', hsqingyu_feibiao:'青玉飞镖', - hsqingyu_feibiao_info:'弃置一名角色的一张随机手牌和一张随机装备牌', + hsqingyu_feibiao_info:'弃置一名角色的一张随机手牌和一张随机装备牌。', hsqingyu_shandian:'青玉闪电', - hsqingyu_shandian_info:'对一名角色造成1点雷电伤害', + hsqingyu_shandian_info:'对一名角色造成1点雷电伤害。', hsqingyu_zhanfang:'青玉绽放', - hsqingyu_zhanfang_info:'令一名角色增加1点体力上限并摸一张牌', + hsqingyu_zhanfang_info:'令一名角色增加1点体力上限并摸一张牌。', ayuling:'玉灵', - ayuling_info:'每当你受到一次伤害,你可以获得一张随机青玉牌', + ayuling_info:'每当你受到一次伤害,你可以获得一张随机青玉牌。', qingzun:'青樽', - qingzun_info:'本局对战中,每当你使用一张青玉牌,你的手牌上限+1;当你累计使用两张青玉牌后,你可以于准备阶段摸一张牌;当你累计使用六张青玉牌后,你可以于结束阶段摸一张牌', - qingzun_info_alter:'本局对战中,每当你使用一张青玉牌,你的手牌上限+1;当你累计使用三张青玉牌后,你可以于准备阶段摸一张牌;当你累计使用九张青玉牌后,你可以于结束阶段摸一张牌', + qingzun_info:'本局对战中,每当你使用一张青玉牌,你的手牌上限+1;当你累计使用两张青玉牌后,你可以于准备阶段摸一张牌;当你累计使用六张青玉牌后,你可以于结束阶段摸一张牌。', + qingzun_info_alter:'本局对战中,每当你使用一张青玉牌,你的手牌上限+1;当你累计使用三张青玉牌后,你可以于准备阶段摸一张牌;当你累计使用九张青玉牌后,你可以于结束阶段摸一张牌。', lianjin:'炼金', - lianjin_info:'出牌阶段限一次,你可以弃置一张牌并获得一张由三张随机牌组成的药水;当你因弃置而失去药水牌时,你随机获得药水的组成卡牌之一', + lianjin_info:'出牌阶段限一次,你可以弃置一张牌并获得一张由三张随机牌组成的药水;当你因弃置而失去药水牌时,你随机获得药水的组成卡牌之一。', shouji:'收集', - shouji_info:'每当你使用一张杀,你可以获得一张目标随机手牌的复制;每当你的杀被闪避,你可以获得一张目标随机非特殊装备牌的复制;每回合限各限一次', + shouji_info:'每当你使用一张杀,你可以获得一张目标随机手牌的复制;每当你的杀被闪避,你可以获得一张目标随机非特殊装备牌的复制;每回合限各限一次。', guimou:'鬼谋', - guimou_info:'每当你受到一次伤害,你可以获得伤害来源的一张手牌,若此牌是黑色,你展示此牌并重复此过程', + guimou_info:'每当你受到一次伤害,你可以获得伤害来源的一张手牌,若此牌是黑色,你展示此牌并重复此过程。', yingxi:'影袭', - yingxi_info:'结束阶段,若你本回合未造成伤害,你可以将一张黑色牌当作杀对任意一名角色使用,若目标未受到伤害,此杀不可闪避', + yingxi_info:'结束阶段,若你本回合未造成伤害,你可以将一张黑色牌当作杀对任意一名角色使用,若目标未受到伤害,此杀不可闪避。', peiyu:'培育', - peiyu_info:'准备阶段,你可以令一名没有图腾的角色获得一个随机图腾直到其首次受到伤害', - peiyu_old_info:'出牌阶段,你可以弃置一张牌令一名没有图腾的角色获得一个随机图腾,或令一名有图腾的角色替换一个图腾;你死亡时,其他角色失去以此法获得的图腾', + peiyu_info:'准备阶段,你可以令一名没有图腾的角色获得一个随机图腾直到其首次受到伤害。', + peiyu_old_info:'出牌阶段,你可以弃置一张牌令一名没有图腾的角色获得一个随机图腾,或令一名有图腾的角色替换一个图腾;你死亡时,其他角色失去以此法获得的图腾。', wzhanyi:'战意', - wzhanyi_info:'你可以跳过出牌阶段,改为摸三张牌并展示之,将摸到的装备牌置于装备区,然后可以使用手牌中的杀', + wzhanyi_info:'你可以跳过出牌阶段,改为摸三张牌并展示之,将摸到的装备牌置于装备区,然后可以使用手牌中的杀。', shengteng:'升腾', - shengteng_info:'锁定技,每当你使用锦囊牌造成伤害,你增加1点体力上限并回复1点体力', + shengteng_info:'锁定技,每当你使用锦囊牌造成伤害,你增加1点体力上限并回复1点体力。', yuansu:'寂灭', - yuansu_info:'出牌阶段限一次,若你已损失的体力值不少于3,你可以将体力上限降至与体力值相同,视为使用一张元素毁灭', + yuansu_info:'出牌阶段限一次,若你已损失的体力值不少于3,你可以将体力上限降至与体力值相同,视为使用一张元素毁灭。', nuyan:'怒焰', nuyan2:'怒焰', nuyan_backup:'怒焰', - nuyan_info:'出牌阶段限一次,你可以将一张红色牌当作任意一张能造成伤害的牌使用(不得是你本局以此法使用过的牌)', - nuyan2_info:'出牌阶段限三次,你可以失去1点体力,视为使用任意一张能造成伤害的牌”', + nuyan_info:'出牌阶段限一次,你可以将一张红色牌当作任意一张能造成伤害的牌使用(不得是你本局以此法使用过的牌)。', + nuyan2_info:'出牌阶段限三次,你可以失去1点体力,视为使用任意一张能造成伤害的牌”。', chouhuo:'仇火', - chouhuo_info:'觉醒技,出牌阶段开始时,若你的怒焰技能已将可用的牌用完,你失去1点体力上限,获得2点护甲,然后将怒焰的描述改为“出牌阶段限三次,你可以失去1点体力,视为使用任意一张能造成伤害的牌”', + chouhuo_info:'觉醒技,出牌阶段开始时,若你的怒焰技能已将可用的牌用完,你失去1点体力上限,获得2点护甲,然后将怒焰的描述改为“出牌阶段限三次,你可以失去1点体力,视为使用任意一张能造成伤害的牌”。', hsdusu:'毒素', hsdusu_xueji:'血蓟', - hsdusu_xueji_info:'随机弃置一名角色的2张装备牌', + hsdusu_xueji_info:'随机弃置一名角色的2张装备牌。', hsdusu_shinancao:'石楠草', - hsdusu_shinancao_info:'令一名角色下一次造成的伤害+1', + hsdusu_shinancao_info:'令一名角色下一次造成的伤害+1。', hsdusu_kuyecao:'枯叶草', - hsdusu_kuyecao_info:'令一名角色获得技能潜行,直到其下一回合开始', + hsdusu_kuyecao_info:'令一名角色获得技能潜行,直到其下一回合开始。', hsdusu_huoyanhua:'火焰花', - hsdusu_huoyanhua_info:'对攻击范围内的一名角色造成1点火焰伤害', + hsdusu_huoyanhua_info:'对攻击范围内的一名角色造成1点火焰伤害。', hsdusu_huangxuecao:'皇血草', - hsdusu_huangxuecao_info:'摸两张牌', + hsdusu_huangxuecao_info:'摸两张牌。', duxin:'毒心', - duxin_info:'准备阶段和结束阶段,若你的手中没有毒素牌,你可以获得一张随机毒素牌', + duxin_info:'准备阶段和结束阶段,若你的手中没有毒素牌,你可以获得一张随机毒素牌。', oldduxin:'毒心', - oldduxin_info:'准备阶段和结束阶段,你可以获得一张随机毒素牌', + oldduxin_info:'准备阶段和结束阶段,你可以获得一张随机毒素牌。', hstuteng:'图腾', kuangluan:'狂乱', kuangluan2:'狂乱', - // kuangluan_info:'锁定技,每当你于回合内使用一张普通锦囊牌,便于出牌阶段结束时随机使用一张普通锦囊牌(随机指定目标)', - kuangluan_info:'锁定技,每当一名其他角色对你造成伤害,该角色进入混乱状态直到当前回合结束', + // kuangluan_info:'锁定技,每当你于回合内使用一张普通锦囊牌,便于出牌阶段结束时随机使用一张普通锦囊牌(随机指定目标)。', + kuangluan_info:'锁定技,每当一名其他角色对你造成伤害,该角色进入混乱状态直到当前回合结束。', zengli:'赠礼', - zengli_info:'出牌阶段限一次,你指定一名其他角色与你各装备一把武器', + zengli_info:'出牌阶段限一次,你指定一名其他角色与你各装备一把武器。', xiubu:'修补', - xiubu_info:'每当你装备一把未强化的武器,你可以获得数量等同于武器攻击范围的随机零件', + xiubu_info:'每当你装备一把未强化的武器,你可以获得数量等同于武器攻击范围的随机零件。', mobao:'魔爆', - mobao_info:'出牌阶段限一次,你可以弃置至多三张黑色牌,然后对所有于上轮对你造成过伤害的角色造成等同于你弃牌数的雷电伤害', + mobao_info:'出牌阶段限一次,你可以弃置至多三张黑色牌,然后对所有于上轮对你造成过伤害的角色造成等同于你弃牌数的雷电伤害。', xianji:'献祭', xianji2:'献祭', xianji3:'献祭', - xianji_info:'其他角色可以在其结束阶段弃置1~2张手牌并令你摸等量的牌,若如此做,直到其下一回合结束,每当你使用卡牌指定其为目标时,其摸一张牌', + xianji_info:'其他角色可以在其结束阶段弃置1~2张手牌并令你摸等量的牌,若如此做,直到其下一回合结束,每当你使用卡牌指定其为目标时,其摸一张牌。', xueren:'血刃', - xueren_info:'每当你使用杀造成伤害,你可以令受伤害角色与你各失去1点体力,然后你摸两张牌', + xueren_info:'每当你使用杀造成伤害,你可以令受伤害角色与你各失去1点体力,然后你摸两张牌。', maoxian:'奇旅', maoxian2:'奇旅', - maoxian_info:'出牌阶段限两次,你可以发现一个技能并获得之(替换此前发现的技能)', + maoxian_info:'出牌阶段限两次,你可以发现一个技能并获得之(替换此前发现的技能)。', tanmi:'探秘', - tanmi_info:'在一名其他角色的结束阶段,若你没有手牌,你可以摸两张牌并可以使用两张牌', + tanmi_info:'在一名其他角色的结束阶段,若你没有手牌,你可以摸两张牌并可以使用两张牌。', yiwen:'轶闻', - yiwen_info:'锁定技,每当其他角色于回合内首次使用非特殊卡牌指定你为惟一目标,你获得一张此牌的复制', + yiwen_info:'锁定技,每当其他角色于回合内首次使用非特殊卡牌指定你为惟一目标,你获得一张此牌的复制。', tanbao_old:'探宝', - tanbao_old_info:'出牌阶段限一次,你可以弃置三张牌,然后展示牌堆顶的三张牌,然后获得其中任意张类别不同的牌;若三张牌类别均不相同,你回复全部体力值', + tanbao_old_info:'出牌阶段限一次,你可以弃置三张牌,然后展示牌堆顶的三张牌,然后获得其中任意张类别不同的牌;若三张牌类别均不相同,你回复全部体力值。', qianghuax:'强化', - qianghuax_info:'出牌阶段限一次,你可以弃置任意张不同类别的牌,然后展示并获得与弃置的牌类别相同且价值更高的牌', + qianghuax_info:'出牌阶段限一次,你可以弃置任意张不同类别的牌,然后展示并获得与弃置的牌类别相同且价值更高的牌。', zhuizong:'追踪', - zhuizong_info:'出牌阶段限一次,你可以弃置任意张牌,观看牌堆顶的等同于弃牌数四倍的牌,然后获得其中的一张牌', + zhuizong_info:'出牌阶段限一次,你可以弃置任意张牌,观看牌堆顶的等同于弃牌数四倍的牌,然后获得其中的一张牌。', xunbao:'寻宝', xunbao2:'寻宝', - xunbao_info:'准备阶段,若你的武将牌上没有藏宝图,你可以将一张藏宝图置于你的武将牌上;若你的武将牌上有藏宝图,你可以弃置一张与藏宝图点数相同的牌并获得此藏宝图', + xunbao_info:'准备阶段,若你的武将牌上没有藏宝图,你可以将一张藏宝图置于你的武将牌上;若你的武将牌上有藏宝图,你可以弃置一张与藏宝图点数相同的牌并获得此藏宝图。', xieneng:'邪能', - xieneng_info:'结束阶段,你可以选择一张神器牌并获得之', + xieneng_info:'结束阶段,你可以选择一张神器牌并获得之。', fbeifa:'北伐', - fbeifa_info:'每当你失去最后一张手牌,你可以视为使用一张无视距离的杀,若此杀造成伤害,你摸一张牌,每回合最多发动3次', + fbeifa_info:'每当你失去最后一张手牌,你可以视为使用一张无视距离的杀,若此杀造成伤害,你摸一张牌,每回合最多发动3次。', oldfbeifa:'北伐', - oldfbeifa_info:'每当你失去最后一张手牌,你可以视为使用一张无视距离的杀,若此杀造成伤害,你摸一张牌', + oldfbeifa_info:'每当你失去最后一张手牌,你可以视为使用一张无视距离的杀,若此杀造成伤害,你摸一张牌。', yufa:'驭法', - yufa_info:'在任意一名其他角色的结束阶段,若你于此回合内受过其伤害,你可以将一张传送门交给除此角色外的任意一名角色', + yufa_info:'在任意一名其他角色的结束阶段,若你于此回合内受过其伤害,你可以将一张传送门交给除此角色外的任意一名角色。', bingyan:'冰焰', - bingyan_info:'出牌阶段限一次,你可以将一张红色牌当作炽羽袭,或将一张黑色牌当作惊雷闪使用', + bingyan_info:'出牌阶段限一次,你可以将一张红色牌当作炽羽袭,或将一张黑色牌当作惊雷闪使用。', hsshenqi:'神器', hsshenqi_morijingxiang:'末日镜像', - hsshenqi_morijingxiang_info:'限武将牌正面朝上时使用,从所有其他角色的区域内各获得一张牌;使用后将武将牌翻至背面', + hsshenqi_morijingxiang_info:'限武将牌正面朝上时使用,从所有其他角色的区域内各获得一张牌;使用后将武将牌翻至背面。', hsshenqi_kongbusangzhong:'恐怖丧钟', - hsshenqi_kongbusangzhong_info:'限武将牌正面朝上时使用,对所有其他角色各造成1点伤害;使用后将武将牌翻至背面', + hsshenqi_kongbusangzhong_info:'限武将牌正面朝上时使用,对所有其他角色各造成1点伤害;使用后将武将牌翻至背面。', hsshenqi_nengliangzhiguang:'能量之光', - hsshenqi_nengliangzhiguang_info:'限武将牌正面朝上时使用,令一名角色增加1点体力上限,回复1点体力,并摸四张牌;使用后将武将牌翻至背面', + hsshenqi_nengliangzhiguang_info:'限武将牌正面朝上时使用,令一名角色增加1点体力上限,回复1点体力,并摸四张牌;使用后将武将牌翻至背面。', hsbaowu:'宝物', hsbaowu_huangjinyuanhou:'黄金猿猴', - hsbaowu_huangjinyuanhou_info:'将你的手牌(含此张)替换为随机炉石衍生牌,并获得潜行直到下一回合开始', + hsbaowu_huangjinyuanhou_info:'将你的手牌(含此张)替换为随机炉石衍生牌,并获得潜行直到下一回合开始。', hsbaowu_cangbaotu:'藏宝图', - hsbaowu_cangbaotu_info:'结束阶段,将一张黄金猿猴置入你的手牌;摸一张牌', + hsbaowu_cangbaotu_info:'结束阶段,将一张黄金猿猴置入你的手牌;摸一张牌。', hsyaoshui:'药水', hsqingyu:'青玉', lianzhan:'连斩', - lianzhan_info:'每当你造成一次伤害,若此伤害是你本回合第一次造成伤害,你摸两张牌;否则你增加1点体力上限并回复1点体力', + lianzhan_info:'每当你造成一次伤害,若此伤害是你本回合第一次造成伤害,你摸两张牌;否则你增加1点体力上限并回复1点体力。', shifa:'魔瘾', - shifa_info:'锁定技,每当你于回合内使用一张非转化的普通锦囊牌,你摸一张牌(每回合最多发动3次);出牌阶段开始时,你令你与一名随机敌人各获得一张随机普通锦囊牌', + shifa_info:'锁定技,每当你于回合内使用一张非转化的普通锦囊牌,你摸一张牌(每回合最多发动3次);出牌阶段开始时,你令你与一名随机敌人各获得一张随机普通锦囊牌。', oldshifa:'魔瘾', - oldshifa_info:'锁定技,每当你于回合内使用一张非转化的普通锦囊牌,你摸一张牌;出牌阶段开始时,你令你与一名随机敌人各获得一张随机普通锦囊牌', + oldshifa_info:'锁定技,每当你于回合内使用一张非转化的普通锦囊牌,你摸一张牌;出牌阶段开始时,你令你与一名随机敌人各获得一张随机普通锦囊牌。', yuanzheng:'远征', - yuanzheng_info:'每当你对距离1以外的角色使用一张牌,你可以弃置目标区域内的一张牌', + yuanzheng_info:'每当你对距离1以外的角色使用一张牌,你可以弃置目标区域内的一张牌。', bzhuiji:'追击', - bzhuiji_info:'每当一名角色死亡,你可以摸两张牌,并视为对杀死该角色的人使用一张决斗', + bzhuiji_info:'每当一名角色死亡,你可以摸两张牌,并视为对杀死该角色的人使用一张决斗。', byuhuo:'浴火', byuhuo2:'浴火', - byuhuo_info:'觉醒技,当你进入濒死状态时,你须将体力和体力上限变为2,并将武将牌翻至背面;在你的下一准备阶段,你对所有其他角色造成2点火焰伤害,在此之前,你不能成为其他角色的卡牌的目标', + byuhuo_info:'觉醒技,当你进入濒死状态时,你须将体力和体力上限变为2,并将武将牌翻至背面;在你的下一准备阶段,你对所有其他角色造成2点火焰伤害,在此之前,你不能成为其他角色的卡牌的目标。', yulu:'雨露', - yulu_info:'出牌阶段限一次,你可以指定任意名角色各摸一张牌,然后各弃置区域内的一张牌', + yulu_info:'出牌阶段限一次,你可以指定任意名角色各摸一张牌,然后各弃置区域内的一张牌。', oldyulu:'雨露', - oldyulu_info:'出牌阶段限一次,你可以指定任意名角色各摸两张牌,然后各弃置区域内的两张牌', + oldyulu_info:'出牌阶段限一次,你可以指定任意名角色各摸两张牌,然后各弃置区域内的两张牌。', duzhang:'毒瘴', duzhang2:'毒瘴', - duzhang_info:'结束阶段,若你于本回合内未使用过锦囊牌,你可以指定一名其他角色令其下个回合无法使用锦囊牌', + duzhang_info:'结束阶段,若你于本回合内未使用过锦囊牌,你可以指定一名其他角色令其下个回合无法使用锦囊牌。', hannu:'寒怒', - hannu_info:'锁定技,每当你受到一次伤害,你将手牌数翻倍;若你的手牌数因此超过10张,你随机弃置若干张手牌直到手牌数等于你当前的体力值', + hannu_info:'锁定技,每当你受到一次伤害,你将手牌数翻倍;若你的手牌数因此超过10张,你随机弃置若干张手牌直到手牌数等于你当前的体力值。', chuidiao:'垂钓', - chuidiao_info:'锁定技,结束阶段,你随机摸0~2张牌', + chuidiao_info:'锁定技,结束阶段,你随机摸0~2张牌。', fushi:'缚誓', - fushi_info:'出牌阶段限一次,你可以令一名已受伤角色失去1点体力上限并回复1点体力', + fushi_info:'出牌阶段限一次,你可以令一名已受伤角色失去1点体力上限并回复1点体力。', oldfushi:'缚誓', - oldfushi_info:'出牌阶段,你可以令一名已受伤角色失去1点体力上限并回复1点体力', + oldfushi_info:'出牌阶段,你可以令一名已受伤角色失去1点体力上限并回复1点体力。', hhudun:'护盾', - hhudun_info:'锁定技,在每名角色的准备阶段,若你没有护甲,你获得1点护甲;每当你的护甲抵消一次伤害,你摸一张牌', + hhudun_info:'锁定技,在每名角色的准备阶段,若你没有护甲,你获得1点护甲;每当你的护甲抵消一次伤害,你摸一张牌。', fenlie:'分裂', - fenlie_info:'锁定技,每当你于摸牌阶段外获得非特殊卡牌,你获得一张此牌的复制,每回合最多发动两次', + fenlie_info:'锁定技,每当你于摸牌阶段外获得非特殊卡牌,你获得一张此牌的复制,每回合最多发动两次。', oldfenlie:'分裂', - oldfenlie_info:'锁定技,每当你于摸牌阶段外获得非特殊卡牌,你获得一张此牌的复制', + oldfenlie_info:'锁定技,每当你于摸牌阶段外获得非特殊卡牌,你获得一张此牌的复制。', nianfu:'粘附', - nianfu_info:'锁定技,每当你造成或受到伤害,你随机获得对方装备区内的一张牌', + nianfu_info:'锁定技,每当你造成或受到伤害,你随机获得对方装备区内的一张牌。', xiaorong:'消融', - xiaorong_info:'锁定技,你的装备牌不占用手牌上限;结束阶段,你将手牌中的每张装备牌转化为两张随机基本牌,每转化一张装备牌便回复1点体力', + xiaorong_info:'锁定技,你的装备牌不占用手牌上限;结束阶段,你将手牌中的每张装备牌转化为两张随机基本牌,每转化一张装备牌便回复1点体力。', shixu:'时序', - shixu_info:'锁定技,所有角色于出牌阶段每消耗3秒,便须于结束阶段弃置一张牌', + shixu_info:'锁定技,所有角色于出牌阶段每消耗3秒,便须于结束阶段弃置一张牌。', qianghua:'绝手', - qianghua_info:'出牌阶段内,你可以令一张你使用的基本牌或普通锦囊牌额外结算一次,每回合限一次', + qianghua_info:'出牌阶段内,你可以令一张你使用的基本牌或普通锦囊牌额外结算一次,每回合限一次。', jixuan:'疾旋', - jixuan_info:'锁定技,回合结束后,你摸一张牌进行一个额外的回合', + jixuan_info:'锁定技,回合结束后,你摸一张牌进行一个额外的回合。', biri:'蔽日', - biri_info:'每当距离你1以内的一名其他角色成为杀的惟一目标时,若杀的使用者不是你,你可以弃置一张闪取消之', + biri_info:'每当距离你1以内的一名其他角色成为杀的惟一目标时,若杀的使用者不是你,你可以弃置一张闪取消之。', stuxi:'吐息', stuxi2:'吐息', stuxi2_bg:'息', - stuxi_info:'锁定技,结束阶段,你令一名随机敌人下一个摸牌阶段摸牌数-1', + stuxi_info:'锁定技,结束阶段,你令一名随机敌人下一个摸牌阶段摸牌数-1。', bingdong:'冰冻', - bingdong_info:'锁定技,你在一个回合内首次造成伤害后,获得一个冰冻零件', + bingdong_info:'锁定技,你在一个回合内首次造成伤害后,获得一个冰冻零件。', ronghuo:'熔火', - ronghuo_info:'锁定技,你的普通杀均视为火杀', + ronghuo_info:'锁定技,你的普通杀均视为火杀。', luoshi:'落石', - luoshi_info:'锁定技,每当你受到一次伤害,你与伤害来源各随机弃置一张牌', + luoshi_info:'锁定技,每当你受到一次伤害,你与伤害来源各随机弃置一张牌。', moyao:'魔曜', - moyao_info:'锁定技,你不能成为其他角色的锦囊牌的目标', + moyao_info:'锁定技,你不能成为其他角色的锦囊牌的目标。', jiaohui:'教诲', - jiaohui_info:'结束阶段,若你没有于本回合内造成伤害,你可以令一名角色摸一张牌或回复1点体力', + jiaohui_info:'结束阶段,若你没有于本回合内造成伤害,你可以令一名角色摸一张牌或回复1点体力。', bimeng:'碧梦', - bimeng_info:'结束阶段,你可以将一张随机梦境牌加入你的手牌', + bimeng_info:'结束阶段,你可以将一张随机梦境牌加入你的手牌。', hsmengjing:'梦境', hsmengjing_card_config:'梦境', hsmengjing_feicuiyoulong:'翡翠幼龙', - hsmengjing_feicuiyoulong_info:'出牌阶段对任意一名角色使用,对目标造成1点伤害', + hsmengjing_feicuiyoulong_info:'出牌阶段对任意一名角色使用,对目标造成1点伤害。', hsmengjing_huanxiaojiemei:'欢笑姐妹', - hsmengjing_huanxiaojiemei_info:'出牌阶段对一名已受伤角色使用,令目标恢复1点体力', + hsmengjing_huanxiaojiemei_info:'出牌阶段对一名已受伤角色使用,令目标恢复1点体力。', hsmengjing_suxing:'苏醒', - hsmengjing_suxing_info:'令所有其他角色失去1点体力并随机弃置两张牌', + hsmengjing_suxing_info:'令所有其他角色失去1点体力并随机弃置两张牌。', hsmengjing_mengye:'梦魇', - hsmengjing_mengye_info:'令一名角色摸一张牌,并在其下一个结束阶段弃置其所有牌', + hsmengjing_mengye_info:'令一名角色摸一张牌,并在其下一个结束阶段弃置其所有牌。', hsmengjing_mengjing:'梦境', - hsmengjing_mengjing_info:'令一名角色将装备区内的所有牌收入手牌,并将一张乐不思蜀置于其判定区', + hsmengjing_mengjing_info:'令一名角色将装备区内的所有牌收入手牌,并将一张乐不思蜀置于其判定区。', hszuzhou:'诅咒', hszuzhou_nvwudeganguo:'女巫的钳锅', - hszuzhou_nvwudeganguo_info:'出牌阶段对一名角色使用,目标弃置一张牌,然后随机获得一张炉石衍生牌', + hszuzhou_nvwudeganguo_info:'出牌阶段对一名角色使用,目标弃置一张牌,然后随机获得一张炉石衍生牌。', hszuzhou_nvwudepingguo:'女巫的苹果', - hszuzhou_nvwudepingguo_info:'出牌阶段对一名角色使用,目标获得两张杀', + hszuzhou_nvwudepingguo_info:'出牌阶段对一名角色使用,目标获得两张杀。', hszuzhou_nvwudexuetu:'女巫的学徒', - hszuzhou_nvwudexuetu_info:'出牌阶段对没有咒降技能的角色使用,令目标非锁定技失效,并获得技能咒降直到下一回合结束', + hszuzhou_nvwudexuetu_info:'出牌阶段对没有咒降技能的角色使用,令目标非锁定技失效,并获得技能咒降直到下一回合结束。', hszuzhou_wushushike:'巫术时刻', - hszuzhou_wushushike_info:'出牌阶段对所有角色使用,将手牌中的闪替换为杀', + hszuzhou_wushushike_info:'出牌阶段对所有角色使用,将手牌中的闪替换为杀。', hszuzhou_guhuo:'蛊惑', - hszuzhou_guhuo_info:'出牌阶段对一名其他角色使用,令其交给你一张牌', + hszuzhou_guhuo_info:'出牌阶段对一名其他角色使用,令其交给你一张牌。', xjumo:'聚魔', - xjumo_info:'锁定技,你的手牌上限+3;若你已受伤,改为+5', + xjumo_info:'锁定技,你的手牌上限+3;若你已受伤,改为+5。', liehun:'裂魂', - liehun_info:'锁定技,结束阶段,你获得手牌中所有非基本、非特殊牌的复制', + liehun_info:'锁定技,结束阶段,你获得手牌中所有非基本、非特殊牌的复制。', malymowang:'魔网', - malymowang_info:'锁定技,你的锦囊牌在每回合中造成的首次伤害+1;出牌阶段开始时,你发现一张普通锦囊牌', + malymowang_info:'锁定技,你的锦囊牌在每回合中造成的首次伤害+1;出牌阶段开始时,你发现一张普通锦囊牌。', oldmalymowang:'魔网', - oldmalymowang_info:'锁定技,你的锦囊牌造成的伤害+1;出牌阶段开始时,你发现一张普通锦囊牌', + oldmalymowang_info:'锁定技,你的锦囊牌造成的伤害+1;出牌阶段开始时,你发现一张普通锦囊牌。', lingzhou:'灵咒', - lingzhou_info:'每当你使用一张非转化的锦囊牌,可令一名角色摸一张牌或回复1点体力', + lingzhou_info:'每当你使用一张非转化的锦囊牌,可令一名角色摸一张牌或回复1点体力。', mieshi:'灭世', - mieshi_info:'锁定技,结束阶段,你失去1点体力,并对一名随机的其他角色造成1点火焰伤害', + mieshi_info:'锁定技,结束阶段,你失去1点体力,并对一名随机的其他角色造成1点火焰伤害。', xshixin:'蚀心', - xshixin_info:'锁定技,每当你对一名其他角色造成一次伤害,受伤害角色与你各失去1点体力', - xshixin_info_alter:'锁定技,每当你对一名其他角色造成一次伤害,若受伤害角色体力值不小于你,其与你各失去1点体力', + xshixin_info:'锁定技,每当你对一名其他角色造成一次伤害,受伤害角色与你各失去1点体力。', + xshixin_info_alter:'锁定技,每当你对一名其他角色造成一次伤害,若受伤害角色体力值不小于你,其与你各失去1点体力。', xmojian:'魔箭', - xmojian_info:'每当你的武将牌翻至正面时,你可以指定一名角色视为对其使用了一张杀', + xmojian_info:'每当你的武将牌翻至正面时,你可以指定一名角色视为对其使用了一张杀。', enze:'恩泽', - enze_info:'出牌阶段限一次,你可以指定一名角色令其手牌数与你相等(最多摸或弃三张牌)', + enze_info:'出牌阶段限一次,你可以指定一名角色令其手牌数与你相等(最多摸或弃三张牌)。', oldenze:'恩泽', - oldenze_info:'出牌阶段限一次,你可以指定一名角色令其手牌数与你相等', - enze_info_alter:'出牌阶段限一次,你可以指定一名角色令其手牌数与你相等(最多摸或弃两张牌)', + oldenze_info:'出牌阶段限一次,你可以指定一名角色令其手牌数与你相等。', + enze_info_alter:'出牌阶段限一次,你可以指定一名角色令其手牌数与你相等(最多摸或弃两张牌)。', chongsheng:'重生', chongsheng_bg:'生', - chongsheng_info:'濒死阶段,你可弃置所有牌,将体力回复至2-X,并摸2-X张牌,X为你本局发动此技能的次数。每局最多发动2次', + chongsheng_info:'濒死阶段,你可弃置所有牌,将体力回复至2-X,并摸2-X张牌,X为你本局发动此技能的次数。每局最多发动2次。', s_tuteng:'神谕', - s_tuteng_info:'锁定技,准备阶段,你随机获得一个图腾,若你已有至少3个图腾,则改为随机替换一个图腾', + s_tuteng_info:'锁定技,准备阶段,你随机获得一个图腾,若你已有至少3个图腾,则改为随机替换一个图腾。', guozai:'过载', guozai2:'过载', guozai2_bg:'载', - guozai_info:'出牌阶段限一次,你可将手牌补至四张,并于此阶段结束时弃置等量的牌', - guozai_info_alter:'出牌阶段限一次,你可将手牌补至三张,并于此阶段结束时弃置等量的牌', + guozai_info:'出牌阶段限一次,你可将手牌补至四张,并于此阶段结束时弃置等量的牌。', + guozai_info_alter:'出牌阶段限一次,你可将手牌补至三张,并于此阶段结束时弃置等量的牌。', guozaix:'过载', guozaix2:'过载', guozaix2_bg:'载', - guozaix_info:'出牌阶段限两次,你可将手牌补至四张,并于此阶段结束时弃置等量的牌', + guozaix_info:'出牌阶段限两次,你可将手牌补至四张,并于此阶段结束时弃置等量的牌。', oldhanshuang:'寒霜', - oldhanshuang_info:'锁定技,你使用黑色牌对一名未翻面角色造成伤害后,你令受伤害角色翻面', + oldhanshuang_info:'锁定技,你使用黑色牌对一名未翻面角色造成伤害后,你令受伤害角色翻面。', hanshuang:'寒霜', - hanshuang_info:'锁定技,你使用黑色牌对一名未翻面角色造成伤害后,你令受伤害角色翻面,然后你失去1点体力', - hanshuang_info_alter:'锁定技,你使用黑色牌对一名未翻面角色造成伤害后,你令受伤害角色翻面并摸一张牌,然后你失去1点体力', + hanshuang_info:'锁定技,你使用黑色牌对一名未翻面角色造成伤害后,你令受伤害角色翻面,然后你失去1点体力。', + hanshuang_info_alter:'锁定技,你使用黑色牌对一名未翻面角色造成伤害后,你令受伤害角色翻面并摸一张牌,然后你失去1点体力。', bingshi:'冰噬', - bingshi_info:'锁定技,你死亡时,对所有其他角色造成1点伤害', + bingshi_info:'锁定技,你死亡时,对所有其他角色造成1点伤害。', huanwu:'唤雾', - huanwu_info:'出牌阶段限一次,你可以令一名角色增加1点体力上限,回复1点体力,并摸两张牌(每名角色限发动一次)', + huanwu_info:'出牌阶段限一次,你可以令一名角色增加1点体力上限,回复1点体力,并摸两张牌(每名角色限发动一次)。', fengnu:'风怒', - fengnu_info:'锁定技,你使用的任何卡牌无数量及距离限制;当你于回合内重复使用同名卡牌时,你摸一张牌(每回合最多以此法摸三张牌)', - fengnu_info_alter:'锁定技,你使用的任何卡牌无数量限制;当你于回合内重复使用同名卡牌时,你摸一张牌(每回合最多以此法摸三张牌)', + fengnu_info:'锁定技,你使用的任何卡牌无数量及距离限制;当你于回合内重复使用同名卡牌时,你摸一张牌(每回合最多以此法摸三张牌)。', + fengnu_info_alter:'锁定技,你使用的任何卡牌无数量限制;当你于回合内重复使用同名卡牌时,你摸一张牌(每回合最多以此法摸三张牌)。', shengdun:'圣盾', shengdun2:'圣盾', - shengdun_info:'锁定技,准备阶段,若你没有护甲,你获得1点护甲', + shengdun_info:'锁定技,准备阶段,若你没有护甲,你获得1点护甲。', jingmeng:'镜梦', - jingmeng_info:'每当你于回合内使用第一张牌时,你可以从牌堆中随机获得一张与之类型相同的牌', + jingmeng_info:'每当你于回合内使用第一张牌时,你可以从牌堆中随机获得一张与之类型相同的牌。', kuixin:'窥心', - kuixin_info:'结束阶段,你可以获得一名手牌数不少于你的角色的一张手牌', + kuixin_info:'结束阶段,你可以获得一名手牌数不少于你的角色的一张手牌。', hswuji:'无羁', - hswuji_info:'出牌阶段结束时,你可以摸X张牌,X为你本回合使用的卡牌数', + hswuji_info:'出牌阶段结束时,你可以摸X张牌,X为你本回合使用的卡牌数。', yanshu:'炎舞', - yanshu_info:'每回合限一次,当你弃置非基本牌后,你可以获得一张流星火雨', + yanshu_info:'每回合限一次,当你弃置非基本牌后,你可以获得一张流星火雨。', oldyanshu:'炎舞', - oldyanshu_info:'当你弃置非基本牌后,你可以获得一张流星火雨', + oldyanshu_info:'当你弃置非基本牌后,你可以获得一张流星火雨。', bingshuang:'冰枪', - bingshuang_info:'你使用锦囊牌造成伤害后,可令目标摸两张牌并翻面', + bingshuang_info:'你使用锦囊牌造成伤害后,可令目标摸两张牌并翻面。', shengyan:'圣言', - shengyan_info:'任意一名角色回复体力后,你可以令其额外回复1点体力,每回合限发动一次', + shengyan_info:'任意一名角色回复体力后,你可以令其额外回复1点体力,每回合限发动一次。', qingliu:'清流', - qingliu_info:'锁定技,你防止即将受到的火焰伤害', + qingliu_info:'锁定技,你防止即将受到的火焰伤害。', liechao:'猎潮', - liechao_info:'出牌阶阶段限一次,若你的武将牌正面朝上且手牌数不大于当前体力值,你可以翻面并摸四张牌,若如此做,你跳过本回合的弃牌阶段', - liechao_info_alter:'出牌阶阶段限一次,若你的武将牌正面朝上且手牌数不大于当前体力值,你可以翻面并摸三张牌,若如此做,你跳过本回合的弃牌阶段', + liechao_info:'出牌阶阶段限一次,若你的武将牌正面朝上且手牌数不大于当前体力值,你可以翻面并摸四张牌,若如此做,你跳过本回合的弃牌阶段。', + liechao_info_alter:'出牌阶阶段限一次,若你的武将牌正面朝上且手牌数不大于当前体力值,你可以翻面并摸三张牌,若如此做,你跳过本回合的弃牌阶段。', aoshu:'奥术', - aoshu_info:'出牌阶段限一次,你可以将一张黑桃牌当作无中生有使用', + aoshu_info:'出牌阶段限一次,你可以将一张黑桃牌当作无中生有使用。', qianhou:'千喉', - qianhou_info:'锁定技,准备阶段,你视为使用一张随机普通锦囊牌(随机指定目标);若目标只有1人且不是你,你可以弃置一张手牌并获得此锦囊', + qianhou_info:'锁定技,准备阶段,你视为使用一张随机普通锦囊牌(随机指定目标);若目标只有1人且不是你,你可以弃置一张手牌并获得此锦囊。', fengxing:'风行', - fengxing_info:'每当你于回合外首次失去牌,你可以弃置一张牌并摸两张牌', + fengxing_info:'每当你于回合外首次失去牌,你可以弃置一张牌并摸两张牌。', xinci:'心刺', xinci_bg:'暗', - xinci_info:'出牌阶段限一次,你可以弃置一张黑色牌令一名角色失去1点体力', + xinci_info:'出牌阶段限一次,你可以弃置一张黑色牌令一名角色失去1点体力。', zhongjia:'战甲', - zhongjia_info:'锁定技,每当你受到一次伤害,你获得1点护甲;当你的体力值大于1且大于手牌数时,你的护甲不为你抵挡伤害', + zhongjia_info:'锁定技,每当你受到一次伤害,你获得1点护甲;当你的体力值大于1且大于手牌数时,你的护甲不为你抵挡伤害。', dunji:'盾击', - dunji_info:'出牌阶段限一次,你可以对攻击范围内的至多X名其他角色各造成1点伤害,并失去等量的护甲,X为你的护甲数', + dunji_info:'出牌阶段限一次,你可以对攻击范围内的至多X名其他角色各造成1点伤害,并失去等量的护甲,X为你的护甲数。', qiaodong:'巧动', - qiaodong_info:'你可以将一张装备牌当作闪使用或打出', + qiaodong_info:'你可以将一张装备牌当作闪使用或打出。', fengxian:'奉献', - fengxian_info:'出牌阶段限一次,你可以令场上所有角色各弃置一张手牌', + fengxian_info:'出牌阶段限一次,你可以令场上所有角色各弃置一张手牌。', zhanhou:'战吼', - zhanhou_info:'出牌阶段限一次,你可以弃置一张防具牌并获得1点护甲', + zhanhou_info:'出牌阶段限一次,你可以弃置一张防具牌并获得1点护甲。', oldzhanhou:'战吼', - oldzhanhou_info:'出牌阶段,你可以弃置一张防具牌并获得1点护甲', + oldzhanhou_info:'出牌阶段,你可以弃置一张防具牌并获得1点护甲。', anying:'暗影', - anying_info:'限定技,出牌阶段,你可以弃置一张黑色牌,失去技能圣光,并获得技能心刺', + anying_info:'限定技,出牌阶段,你可以弃置一张黑色牌,失去技能圣光,并获得技能心刺。', shijie:'视界', - shijie_info:'结束阶段,你可以获得一名其他角色的一张手牌,然后该角色摸一张牌', + shijie_info:'结束阶段,你可以获得一名其他角色的一张手牌,然后该角色摸一张牌。', shengguang:'圣光', - shengguang_info:'出牌阶段限一次,你可以弃置一张红色牌令一名角色回复1点体力', + shengguang_info:'出牌阶段限一次,你可以弃置一张红色牌令一名角色回复1点体力。', bingjia:'冰甲', bingjia2:'冰甲', - bingjia_info:'出牌阶段,若你武将牌上没有牌,你可以将一张手牌背面朝上置于你的武将牌上,当你成为其他角色的与此牌花色相同的牌的目标时,你移去此牌,获得1点护甲,并且本回合内防止一切伤害', + bingjia_info:'出牌阶段,若你武将牌上没有牌,你可以将一张手牌背面朝上置于你的武将牌上,当你成为其他角色的与此牌花色相同的牌的目标时,你移去此牌,获得1点护甲,并且本回合内防止一切伤害。', bianxing:'变形', - bianxing_info:'当一其他角色于回合内使用卡牌指定了惟一的其他目标后,你可以用一张合理的基本牌替代此牌,每名角色的回合限一次', + bianxing_info:'当一其他角色于回合内使用卡牌指定了惟一的其他目标后,你可以用一张合理的基本牌替代此牌,每名角色的回合限一次。', xianzhi:'先知', - xianzhi_info:'任意一名角色进行判定前,你可以观看牌堆顶的两张牌,并可以将其调换顺序', + xianzhi_info:'任意一名角色进行判定前,你可以观看牌堆顶的两张牌,并可以将其调换顺序。', mdzhoufu:'缚魂', mdzhoufu2:'缚魂', - mdzhoufu_info:'出牌阶段,你可以将一张黑色手牌置于一名其他角色的武将牌上,在其判定时以此牌作为判定结果,然后你获得亮出的判定牌', + mdzhoufu_info:'出牌阶段,你可以将一张黑色手牌置于一名其他角色的武将牌上,在其判定时以此牌作为判定结果,然后你获得亮出的判定牌。', zuzhou:'诅咒', - zuzhou_info:'锁定技,准备阶段,若场上没有浮雷且你手牌中有黑桃牌,你将牌堆中的一张浮雷置于你的判定区;当一名角色受到浮雷伤害时,你移去此浮雷', - zuzhou_old_info:'每当你造成或受到一次伤害,你可以令伤害目标或来源进行一次判定,若结果为黑色,其失去1点体力', + zuzhou_info:'锁定技,准备阶段,若场上没有浮雷且你手牌中有黑桃牌,你将牌堆中的一张浮雷置于你的判定区;当一名角色受到浮雷伤害时,你移去此浮雷。', + zuzhou_old_info:'每当你造成或受到一次伤害,你可以令伤害目标或来源进行一次判定,若结果为黑色,其失去1点体力。', jingxiang:'镜像', - jingxiang_info:'每回合限一次,当你需要打出卡牌时,你可以观看一名角色的手牌并将其视为你的手牌打出', - jingxiang_info_alter:'每回合限一次,当你需要打出卡牌时,你可以观看一名手牌数不多于你的角色的手牌并将其视为你的手牌打出', + jingxiang_info:'每回合限一次,当你需要打出卡牌时,你可以观看一名角色的手牌并将其视为你的手牌打出。', + jingxiang_info_alter:'每回合限一次,当你需要打出卡牌时,你可以观看一名手牌数不多于你的角色的手牌并将其视为你的手牌打出。', tuteng:'图腾', - tuteng_info:'出牌阶段,你可以获得一个随机基础图腾;每当你受到一次伤害,你随机失去一个图腾', + tuteng_info:'出牌阶段,你可以获得一个随机基础图腾;每当你受到一次伤害,你随机失去一个图腾。', zuling:'祖灵', - zuling_info:'觉醒技,准备阶段,若你拥有至少3个图腾,你失去1点体力上限,并将图腾描述中的“获得一个随机基础图腾”改为“获得任意一个图腾(若有4个图腾则改为替换一个图腾)”', + zuling_info:'觉醒技,准备阶段,若你拥有至少3个图腾,你失去1点体力上限,并将图腾描述中的“获得一个随机基础图腾”改为“获得任意一个图腾(若有4个图腾则改为替换一个图腾)”。', tuteng1:'治疗图腾', - tuteng1_info:'结束阶段,你回复1点体力', + tuteng1_info:'结束阶段,你回复1点体力。', tuteng2:'灼热图腾', - tuteng2_info:'每当你造成一次伤害,你摸一张牌', + tuteng2_info:'每当你造成一次伤害,你摸一张牌。', tuteng3:'石爪图腾', - tuteng3_info:'你受到下一次伤害时,令伤害-1,然后失去此图腾', + tuteng3_info:'你受到下一次伤害时,令伤害-1,然后失去此图腾。', tuteng4:'空气图腾', - tuteng4_info:'在你的回合内,你的锦囊牌造成的首次伤害+1', + tuteng4_info:'在你的回合内,你的锦囊牌造成的首次伤害+1。', tuteng5:'法潮图腾', - tuteng5_info:'结束阶段,你摸一张牌', + tuteng5_info:'结束阶段,你摸一张牌。', tuteng6:'火舌图腾', - tuteng6_info:'在你的回合内,你的杀造成的首次伤害+1', + tuteng6_info:'在你的回合内,你的杀造成的首次伤害+1。', tuteng7:'活力图腾', - tuteng7_info:'结束阶段,你令一名其他角色回复1点体力', + tuteng7_info:'结束阶段,你令一名其他角色回复1点体力。', tuteng8:'图腾魔像', - tuteng8_info:'你的进攻距离+1', + tuteng8_info:'你的进攻距离+1。', tzhenji:'震击', - tzhenji_info:'每当你因弃置而失去黑色牌,可对一名角色造成1点雷电伤害,并随机弃置其一张牌,每回合限发动一次', + tzhenji_info:'每当你因弃置而失去黑色牌,可对一名角色造成1点雷电伤害,并随机弃置其一张牌,每回合限发动一次。', fenliu:'分流', - fenliu_info:'出牌阶段限一次,你可以失去1点体力并获得三张牌', + fenliu_info:'出牌阶段限一次,你可以失去1点体力并获得三张牌。', hongxi:'虹吸', - hongxi_info:'锁定技,每当有一名角色死亡,你将体力回复至体力上限', + hongxi_info:'锁定技,每当有一名角色死亡,你将体力回复至体力上限。', jihuo:'激活', - jihuo_info:'在你的回合结束后,你可以弃置一张手牌并进行一个额外的回合', + jihuo_info:'在你的回合结束后,你可以弃置一张手牌并进行一个额外的回合。', jianren:'刃舞', - jianren_info:'出牌阶段限一次,你可以弃置装备区内的武器牌,对所有其他角色造成1点伤害', + jianren_info:'出牌阶段限一次,你可以弃置装备区内的武器牌,对所有其他角色造成1点伤害。', mengun:'闷棍', mengun2:'闷棍', - mengun_info:'每当一名其他角色于回合内使用基本牌,你可以弃置一张与之花色相同的牌令其收回此牌,且在本回合内不能再次使用,每回合限一次', + mengun_info:'每当一名其他角色于回合内使用基本牌,你可以弃置一张与之花色相同的牌令其收回此牌,且在本回合内不能再次使用,每回合限一次。', wlianji:'连击', - wlianji_info:'结束阶段,若你本回合使用的卡牌数大于你当前的体力值,你可以摸两张牌', + wlianji_info:'结束阶段,若你本回合使用的卡牌数大于你当前的体力值,你可以摸两张牌。', }, }; }); diff --git a/character/huicui.js b/character/huicui.js index 68eff99f8..1e6ad60c2 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -71,7 +71,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhanghu:['male','wei',4,['cuijian','zhtongyuan']], luyusheng:['female','wu',3,['zhente','zhiwei']], huaxin:['male','wei',3,['spwanggui','xibing']], - mengyou:['male','qun',5,['hmmanyi','dcmanzhi']], + mengyou:['male','qun',5,['manyi','dcmanzhi']], liuyong:['male','shu',3,['zhuning','fengxiang']], dc_sunru:['female','wu',3,['xiecui','youxu']], xiahoulingnv:['female','wei',4,['fuping','weilie']], @@ -1850,6 +1850,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //裴元绍 dcmoyu:{ audio:2, + init:()=>{ + game.addGlobalSkill('dcmoyu_ai'); + }, + onremove:()=>{ + if(!game.hasPlayer(i=>i.hasSkill('dcmoyu'),true)) game.removeGlobalSkill('dcmoyu_ai'); + }, enable:'phaseUse', filter:function(event,player){ return !player.hasSkill('dcmoyu_ban')&&game.hasPlayer(current=>lib.skill.dcmoyu.filterTarget(null,player,current)); @@ -1857,7 +1863,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterTarget:function(card,player,target){ return player!=target&&!player.getStorage('dcmoyu_clear').contains(target)&&target.countGainableCards(player,'hej'); }, - global:'dcmoyu_ai', content:function(){ 'step 0' player.addTempSkill('dcmoyu_clear'); @@ -1893,6 +1898,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ intro:{content:'偷马贼被反打了!'}, }, ai:{ + trigger:{player:'dieAfter'}, + filter:()=>{ + return !game.hasPlayer(i=>i.hasSkill('dcmoyu'),true); + }, + silent:true, + forceDie:true, + content:()=>{ + game.removeGlobalSkill('dcmoyu_ai'); + }, ai:{ effect:{ target:function(card,player,target,current){ @@ -4568,7 +4582,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var d1=true; if(trigger.player.hasSkill('jueqing')||trigger.player.hasSkill('gangzhi')) d1=false for(var target of trigger.targets){ - if(!target.mayHaveShan()||trigger.player.hasSkillTag('directHit_ai',true,{ + if(!target.mayHaveShan(player,'use')||trigger.player.hasSkillTag('directHit_ai',true,{ target:target, card:trigger.card, },true)){ @@ -6164,7 +6178,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, logTarget:'player', check:function(event,player){ - var eff=get.effect(player,{name:'wuzhong'},player,player)/2; + var eff=get.effect(player,{name:'draw'},player,player); if(player.countCards('h')+1<=event.player.countCards('h')&&event.player.countCards('he')>0) eff+=get.effect(event.player,{name:'guohe_copy2'},player,player); return eff; }, @@ -7513,7 +7527,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ result:{ player:function(player,target){ var eff=get.recoverEffect(target,player,player); - if(target.getDamagedHp()>1) eff+=get.effect(target,{name:'wuzhong'},player,player)/2; + if(target.getDamagedHp()>1) eff+=get.effect(target,{name:'draw'},player,player); return eff; }, }, @@ -7974,9 +7988,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ init:function(player){ game.addGlobalSkill('huguan_all'); }, - onremove:function(player){ - game.removeGlobalSkill('huguan_all'); - }, trigger:{global:'useCard'}, direct:true, filter:function(event,player){ @@ -8052,7 +8063,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ let num = -157; game.countPlayer(function (current){ if(current.hasSkill('huguan')) num = Math.max(num, get.attitude(_status.event.player, current)); - }); + }, true); if(num === -157) game.removeGlobalSkill('huguan_all'); else if(num === 0) player.storage.huguan_all = 6; else if(num > 0) player.storage.huguan_all = 9; @@ -9168,7 +9179,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('fengxiang_use'); }, onremove:function(player){ - game.removeGlobalSkill('fengxiang_use'); + if(!game.hasPlayer(current=>current.hasSkill('fengxiang'),true)) game.removeGlobalSkill('fengxiang_use'); }, trigger:{player:'damageEnd'}, forced:true, @@ -9210,10 +9221,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, trigger:{player:'dieAfter'}, filter:function(event,player){ - for(let i of game.players){ - if(i.hasSkill('fengxiang')) return false; - } - return true; + return !game.hasPlayer(current=>current.hasSkill('fengxiang'),true); }, silent:true, forceDie:true, @@ -10830,10 +10838,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(val0&&min<=0) return target.hasSkillTag('noe')?3:1; - if(att<0&&max>0){ + if(att<=0&&max>0){ if(target.hasSkillTag('noe')) return max>6?(-max/3):0; return -max; } + if(player===target&&!player.hasSha()){ + let ph=player.countCards('h'); + if(game.hasPlayer(i=>{ + if(!player.canUse('sha',i,true,true)||get.effect(i,{name:'sha'},player,player)<=0) return false; + return !ph||!i.mayHaveShan(player,'use'); + })) return 1; + } return 0; }, }, diff --git a/character/jsrg.js b/character/jsrg.js index 628d6cc20..51de1d0c9 100644 --- a/character/jsrg.js +++ b/character/jsrg.js @@ -678,13 +678,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, jsrgninghan:{ audio:2, + init:(player)=>{ + game.addGlobalSkill('jsrgninghan_frozen'); + }, + onremove:(player)=>{ + if(!game.hasPlayer(current=>current.hasSkill('jsrgninghan'),true)) game.removeGlobalSkill('jsrgninghan_frozen'); + }, trigger:{global:'damageEnd'}, filter:function(event,player){ if(!event.hasNature('ice')) return false; return event.cards&&event.cards.filterInD().length; }, forced:true, - global:'jsrgninghan_frozen', content:function(){ var cards=trigger.cards.filterInD(); player.addToExpansion(cards,'gain2').gaintag.add('jsrgshacheng'); @@ -701,6 +706,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(lg) return num+0.15*Math.sign(get.attitude(player,lg)); } } + }, + trigger:{player:'dieAfter'}, + filter:(event,player)=>{ + return !game.hasPlayer(current=>!current.hasSkill('jsrgninghan'),true); + }, + silent:true, + forceDie:true, + content:()=>{ + game.removeGlobalSkill('jsrgninghan_frozen'); } }, }, @@ -941,6 +955,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ limited:true, skillAnimation:true, animationColor:'orange', + locked:false, chooseButton:{ dialog:function(event,player){ var list=[]; @@ -1320,6 +1335,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return (player.countCards('h')==0)^player.hasSkill('jsrgmanjuan_in'); }, forced:true, + locked:false, firstDo:true, silent:true, content:function(){ @@ -1561,10 +1577,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ prompt2:`${undamaged.length?'选择一张牌弃置并选择一名未对你造成过伤害的角色,你对其造成1点伤害':''}${undamaged.length&&damaged.length?';
    或':''}${damaged.length?'仅选择一名对你造成过伤害的角色,你令其摸两张牌':''}。`, damaged:damaged, aiTarget:(()=>{ + if(!undamaged.some(i=>{ + if(get.attitude(player,i)>0) return true; + if(i.getHp(true)+i.hujia<2) return true; + return false; + })&&(player.hp>2||get.damageEffect(player,player,player)>=0)) return player; var info=game.filterPlayer().map(current=>{ - var damage=undamaged.includes(current); - var card={name:damage?'damage':'wuzhong'}; - return [current,get.effect(current,card,player,player)/(damage?1.5:1)]; + let damage=undamaged.includes(current),card={name:damage?'damage':'draw'}; + return [current,get.effect(current,card,player,player)*(damage?0.7:2)]; }).sort((a,b)=>b[1]-a[1])[0]; if(info[1]>0) return info[0]; return null; @@ -1624,12 +1644,46 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ trigger.num++; }, + ai:{ + damageBonus:true, + skillTagFilter:(player,tag,arg)=>{ + if(tag==='damageBonus'&&arg&&arg.target){ + const history=_status.globalHistory; + for(let i=history.length-1;i>=0;i--){ + let evts=history[i]['useCard']; + for(let j=evts.length-1;j>=0;j--){ + var evt=evts[j]; + let card=evt.card,targets=evt.targets; + if(!get.tag(card,'damage')||!targets.includes(player)) continue; + return arg.target===evt.player; + } + } + return false; + } + }, + effect:{ + player:(card,player,target)=>{ + if(get.tag(card,'damage')&&target&&lib.skill.jsrghuchou.ai.skillTagFilter(player,'damageBonus',{ + card:card, + target:target + })&&!target.hasSkillTag('filterDamage',null,{ + player:player, + card:card + })) return [1,0,2,0]; + } + } + } }, jsrgjiemeng:{ audio:2, zhuSkill:true, forced:true, - global:'jsrgjiemeng_effect', + init:()=>{ + game.addGlobalSkill('jsrgjiemeng_effect'); + }, + onremove:()=>{ + if(!game.hasPlayer(i=>i.hasSkill('jsrgjiemeng'),true)) game.removeGlobalSkill('jsrgjiemeng_effect'); + }, subSkill:{ effect:{ mod:{ @@ -1639,6 +1693,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return distance-game.countPlayer(current=>current.group=='qun'); }, }, + trigger:{player:'dieAfter'}, + filter:()=>{ + return !game.hasPlayer(i=>i.hasSkill('jsrgjiemeng'),true); + }, + silent:true, + forceDie:true, + content:()=>{ + game.removeGlobalSkill('jsrgjiemeng_effect'); + } }, }, }, @@ -1710,6 +1773,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, jsrgrihui:{ audio:'dcrihui', + locked:false, trigger:{source:'damageSource'}, filter:function(event,player){ return event.getParent().type=='card'&&event.card&&event.card.name=='sha'&&game.hasPlayer(current=>{ @@ -2304,7 +2368,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ result:{ target:function(player,target){ var eff=get.effect(target,{name:'sha',nature:'fire'},player,target)/30; - if(!target.mayHaveShan()) eff*=2; + if(!target.mayHaveShan(player,'use')) eff*=2; var del=target.countCards('h')-player.countCards('h')+1.5; eff*=Math.sqrt(del); return eff; @@ -2444,6 +2508,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{player:'useCard'}, forced:true, + locked:false, filter:function(event,player){ if(player.group!='shu') return false; return game.hasPlayer(current=>{ @@ -3792,6 +3857,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sbpingjian:{ trigger:{player:['useSkill','logSkillBegin']}, forced:true, + locked:false, filter:function(event,player){ var skill=event.sourceSkill||event.skill; return player.invisibleSkills.contains(skill)&&lib.skill.sbyingmen.getSkills(player.getStorage('sbyingmen'),player).contains(skill); @@ -3987,8 +4053,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' player.chooseToDiscard('h',2,get.prompt('jsrgfeiyang'),'弃置两张手牌并弃置判定区里的一张牌').set('logSkill','jsrgfeiyang').set('ai',function(card){ - return 6-get.value(card); - }); + if(_status.event.goon) return 6-get.value(card); + return 0; + }).set('goon',(()=>{ + if(player.hasSkillTag('rejudge')&&player.countCards('j')<2) return false; + return player.hasCard(function(card){ + if(get.tag(card,'damage')&&get.damageEffect(player,player,_status.event.player,get.natureList(card))>=0) return false; + return get.effect(player,{ + name:card.viewAs||card.name, + cards:[card], + },player,player)<0; + },'j'); + })()); 'step 1' if(result.bool){ player.discardPlayerCard(player,'j',true); @@ -4217,7 +4293,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ 'step 0' - player.chooseToDiscard(get.prompt('jsrgjuelie',trigger.target),'当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌,然后若你的手牌数或体力值最小,此【杀】对其的伤害基数+1。',[1,Infinity],'he').set('ai',card=>{ + player.chooseToDiscard(get.prompt('jsrgjuelie',trigger.target),'当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌',[1,Infinity],'he').set('ai',card=>{ if(ui.selected.cards.length>=_status.event.max) return 0; if(_status.event.goon) return 4.5-get.value(card); return 0; @@ -4227,6 +4303,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=result.cards.length; if(trigger.target.countDiscardableCards(player,'he')) player.discardPlayerCard('平讨:弃置'+get.translation(trigger.target)+get.cnNumber(num)+'张牌',num,'he',trigger.target,true); } + /* else event.finish(); 'step 2' if(player.isMinHandcard()||player.isMinHp()){ @@ -4238,6 +4315,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } map[id].extraDamage++; } + */ }, shaRelated:true, ai:{ @@ -4251,6 +4329,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); }, }, + group:'jsrgjuelie_pojun', + subSkill:{ + pojun:{ + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + if(!player.isMinHandcard()&&!player.isMinHp()) return false; + return event.getParent().name=='sha'; + }, + forced:true, + locked:false, + logTarget:'player', + content:function(){ + trigger.num++; + }, + }, + }, }, //皇甫嵩 jsrgguanhuo:{ @@ -4966,12 +5060,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!moveCard||!target.hasFriend()) return; var num=1; if(get.attitude(player,target)>0){ - if(player.needsToDiscard()){ - num=0.5; - } - else{ - num=0.3; - } + if(player.needsToDiscard()) num=0.5; + else num=0.3; } if(target.hp>=4) return [1,num*2]; if(target.hp==3) return [1,num*1.5]; @@ -5130,7 +5220,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(_status.event.all) return 1; if(ui.selected.buttons.length) return 0; return Math.random(); - }).set('all',!target.mayHaveShan()&&Math.random()<0.75).set('forceAuto',true); + }).set('all',!target.mayHaveShan(player,'use')&&Math.random()<0.75).set('forceAuto',true); 'step 1' if(result.bool){ var cards=result.cards; @@ -5312,7 +5402,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ onremove:true, prompt2:'失去1点体力并防止此伤害,然后你与其各摸一张牌', check:function(event,player){ - return get.damageEffect(event.player,event.source,player,event.nature)*Math.sqrt(event.num)<=get.effect(player,{name:'losehp'},player,player); + return get.damageEffect(event.player,event.source,_status.event.player,event.nature)*event.num < + get.effect(player,{name:'losehp'},player,_status.event.player)+get.effect(player,{name:'draw'},player,_status.event.player)+get.effect(event.player,{name:'draw'},player,_status.event.player)/2; }, group:'jsrgjishan_recover', content:function(){ @@ -5372,23 +5463,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ // trigger.getParent().triggeredTargets4=trigger.getParent().triggeredTargets4.concat(trigger.targets); trigger.getParent().effectCount++; }, - ai:{ - effect:{ - target:function(card,player,target){ - if(player._jsrgzhenqiao_aiChecking) return; - if(target==player&&get.subtype(card)=='equip1'&&!player.getEquip(1)){ - player._jsrgzhenqiao_aiChecking=true; - var eff=get.effect(target,card,player,player); - delete player._jsrgzhenqiao_aiChecking; - if(eff<3) return 'zerotarget'; - } - } - } - }, mod:{ attackRange:function(player,num){ return num+1; }, + aiOrder:(player,card,num)=>{ + if(num>0&&get.itemtype(card)==='card'&&get.subtype(card)==='equip1'&&!player.getEquip(1)){ + if(card.name!=='zhuge'||player.getCardUsable('sha')||!player.needsToDiscard()||player.countCards('hs',i=>{ + return get.name(i)==='sha'&&lib.filter.cardEnabled(i,target); + })<2) return 0; + } + }, + aiValue:(player,card,num)=>{ + if(num>0&&get.itemtype(card)==='card'&&card.name!=='zhuge'&&get.subtype(card)==='equip1'&&!player.getEquip(1)) return 0.01*num; + }, + aiUseful:()=>{ + return lib.skill.jsrgzhenqiao.mod.aiValue.apply(this,arguments); + } } }, //王允 @@ -5709,14 +5800,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, forced:true, trigger:{ - player:'enterGame', - global:'phaseBefore', + //player:'enterGame', + //global:'phaseBefore', + global:'roundStart', }, filter:function(event,player){ if(game.hasPlayer(function(current){ return current.countCards('hej','taipingyaoshu'); })) return false; - return event.name!='phase'||game.phaseNumber==0; + return true; + //return event.name!='phase'||game.phaseNumber==0; }, direct:true, group:'jsrgshoushu_destroy', @@ -5968,7 +6061,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jsrgpingtao:'平讨', jsrgpingtao_info:'出牌阶段限一次。你可以令一名其他角色选择一项:1.交给你一张牌,然后你于此回合使用【杀】的次数上限+1;2.令你视为对其使用一张【杀】。', jsrgjuelie:'绝烈', - jsrgjuelie_info:'当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌并弃置其等量的牌,然后若你的手牌数或体力值最小,此【杀】对其的伤害基数+1。', + jsrgjuelie_info:'①当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌并弃置其等量的牌。②若你的手牌数或体力值为全场最小,则你使用【杀】造成的伤害+1。', jsrg_huangfusong:'起皇甫嵩', jsrg_huangfusong_prefix:'起', jsrgguanhuo:'观火', @@ -6043,7 +6136,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jsrg_nanhualaoxian:'起南华老仙', jsrg_nanhualaoxian_prefix:'起', jsrgshoushu:'授术', - jsrgshoushu_info:'锁定技。①游戏开始时,若场上没有【太平要术】,你可以从游戏外将【太平要术】置于一名角色的装备区内。②当【太平要术】离开一名角色的装备区后,你令此牌销毁。', + jsrgshoushu_info:'锁定技。①一轮游戏开始时,若场上没有【太平要术】,你可以从游戏外将【太平要术】置于一名角色的装备区内。②当【太平要术】离开一名角色的装备区后,你令此牌销毁。', jsrgxundao:'寻道', jsrgxundao_info:'当你的判定牌生效前,你可以令至多两名角色依次弃置一张牌,然后你选择一张以此法弃置且位于弃牌堆中的牌代替此判定牌。', jsrglinghua:'灵化', diff --git a/character/mobile.js b/character/mobile.js index cf0588a74..5d4fdb48f 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -742,7 +742,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else{ target.line(event.togive); - event.togive.damage(Math.min(3,event.togive.countCards('h',{name:'sha'})),target); + event.togive.damage(Math.min(2,event.togive.countCards('h',{name:'sha'})),target); } }, intro:{ @@ -816,30 +816,28 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - var num=Math.min(Math.max(1,player.getStorage('twjichou').length),5); - event.num=num; var choices=['选项一']; var choiceList=[ - '摸'+get.cnNumber(num)+'张牌', + '摸两张牌', '获得一个“机论”标记', ]; if(!player.getStorage('twjichou').length||!player.getStorage('twjichou').filter(function(name){ - return !player.getStorage('jilun').contains(name)&&player.hasUseTarget({name:name}); + return !player.getStorage('jilun').includes(name)&&player.hasUseTarget({name:name}); }).length) choiceList[1]=''+choiceList[1]+''; else choices.push('选项二'); player.chooseControl(choices,'cancel2').set('choiceList',choiceList).set('prompt',get.prompt('jilun')).set('ai',()=>{ if(_status.event.choiceList.length==1||!player.getStorage('twjichou').length) return 0; - var val=_status.event.num>3?Math.min(1.5,1+(_status.event.num-3)*0.1):1; + var val=player.getUseValue({name:'wuzhong'}); for(var name of player.getStorage('twjichou')){ - if(player.getStorage('jilun').contains(name)) continue; - if(player.getUseValue({name:name})>4*val) return 1; + if(player.getStorage('jilun').includes(name)) continue; + if(player.getUseValue({name:name})>val) return 1; } return 0; - }).set('num',num); + }); 'step 1' if(result.control!='cancel2'){ player.logSkill('jilun'); - if(result.control=='选项一') player.draw(num); + if(result.control=='选项一') player.draw(2); else player.addMark('jilun_mark',1); } }, @@ -858,7 +856,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' if(!player.getStorage('twjichou').length||!player.getStorage('twjichou').filter(function(name){ - return !player.getStorage('jilun').contains(name)&&player.hasUseTarget({name:name}); + return !player.getStorage('jilun').includes(name)&&player.hasUseTarget({name:name}); }).length){ if(player.hasMark('jilun_mark')) player.removeMark('jilun_mark',player.countMark('jilun_mark')); event.finish(); @@ -866,7 +864,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } var list=[]; for(var name of player.getStorage('twjichou')){ - if(!player.getStorage('jilun').contains(name)){ + if(!player.getStorage('jilun').includes(name)){ list.push(['锦囊','',name]); } } @@ -1195,7 +1193,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ]).set('prompt','雀颂:请选择一项').set('ai',()=>{ var player=_status.event.player; var len=_status.event.len; - return get.effect(player,{name:'wuzhong'},player,player)*len/2>=get.recoverEffect(player,player,player)?0:1; + return get.effect(player,{name:'draw'},player,player)*len>=get.recoverEffect(player,player,player)?0:1; }).set('len',len); } } @@ -2718,7 +2716,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' var trigger=event.getParent().getTrigger(); if(trigger.name=='useCard'){ - var target=lib.skill.chongzhen1.logTarget(trigger,player); + var target=lib.skill.chongzhen.logTarget(trigger,player); } else{ var target=trigger.source; @@ -3590,7 +3588,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ for(var card of cards){ var num=i+1; if(cards2.slice(0,num).contains(card)) continue; - if(get.tag(card,'damage')&&i>0) count+=get.effect(player,{name:'wuzhong'},player)/2; + if(get.tag(card,'damage')&&i>0) count+=get.effect(player,{name:'draw'},player); var targets2=targets.filter(current=>{ return player.canUse(card,current,false)&&get.distance(player,current)<=num&&get.effect(current,card,player,player)>0; }); @@ -3829,7 +3827,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ getValue:function(player,mark,target){ let dis=Math.sqrt(get.distance(player,target,'absolute')); if(target.isTurnedOver()) dis++; - let draw=get.effect(target,{name:'wuzhong'},target,target)/2; + let draw=get.effect(target,{name:'draw'},target,target); switch(mark.slice(6)){ case 'wushi': if(target.hasJudge('bingliang')) return 12/(1+target.getCardUsable('sha',true)); @@ -4308,7 +4306,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ selectCard:(player.getStat('skill').buxu||0)+1, ai1:function(card){ var player=_status.event.player; - if(player.needsToDiscard()>ui.selected.cards.length) return 10/Math.max(0.1,get.value(card)); + if(player.needsToDiscard(0,(i,player)=>{ + return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); + })) return 10/Math.max(0.1,get.value(card)); return 5-(player.getStat('skill').buxu||0)-get.value(card); }, ai2:()=>1, @@ -4488,7 +4488,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var att=get.attitude(player,target),eff=[0,0]; var hs=player.countCards('h'),ht=target.countCards('h'); if(hs>=ht){ - eff[0]=get.effect(target,{name:'wuzhong'},player,player)/2; + eff[0]=get.effect(target,{name:'draw'},player,player); if(player.storage.sbyaoming_status==0) eff[0]*=1.2; } if(hs<=ht){ @@ -8445,7 +8445,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ]).set('ai',function(){ var target=_status.event.getTrigger().target; var player=_status.event.player; - var num=target.mayHaveShan()?0:1; + var num=target.mayHaveShan(player,'use')?0:1; if(get.attitude(player,target)>0) num=1-num; return num; }); @@ -9690,7 +9690,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{source:'damage'}, forced:true, popup:false, - //locked:false, + locked:false, audio:'jiuchi', filter:function(event,player){ return event.card&&event.card.name=='sha'&&event.getParent(2).jiu==true&&!player.hasSkill('rejiuchi_air'); @@ -11318,12 +11318,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!target.hasFriend()) return; var num=1; if(get.attitude(player,target)>0){ - if(player.needsToDiscard()){ - num=0.7; - } - else{ - num=0.5; - } + if(player.needsToDiscard()) num=0.7; + else num=0.5; } if(target.hp>=4) return [1,num*2]; if(target.hp==3) return [1,num*1.5]; @@ -14166,7 +14162,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return !event.numFixed; }, content:function(){ - trigger.num+=1+Math.floor(player.countCards('e')/2); + trigger.num+=1+Math.ceil(player.countCards('e')/2); } }, yingjian:{ @@ -14991,7 +14987,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ fenyin_info:'你的回合内,当你使用牌时,若此牌与你于此回合内使用的上一张牌的颜色不同,则你可以摸一张牌。', yingjian_info:'准备阶段开始时,你可以视为使用一张无距离限制的【杀】。', dujin:'独进', - dujin_info:'摸牌阶段,你可以多摸X+1张牌。(X为你装备区里牌数的一半且向下取整)', + dujin_info:'摸牌阶段,你可以多摸X+1张牌(X为你装备区里牌数的一半且向上取整)。', shixin:'释衅', shixin_info:'锁定技,当你受到火属性伤害时,你防止此伤害。', zhaohuo:'招祸', @@ -15288,7 +15284,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_dongzhuo:'手杀界董卓', re_dongzhuo_prefix:'手杀界', rejiuchi:'酒池', - rejiuchi_info:'你可以将一张黑桃手牌当做【酒】使用。锁定技,当你于回合内使用带有【酒】效果的【杀】造成伤害时,你令你的【崩坏】失效直到回合结束。', + rejiuchi_info:'你可以将一张黑桃手牌当做【酒】使用。当你于回合内使用带有【酒】效果的【杀】造成伤害时,你令你的〖崩坏〗失效直到回合结束。', furong:'手杀傅肜', furong_prefix:'手杀', xuewei:'血卫', @@ -15760,12 +15756,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ old_yuanshu_prefix:'手杀', baoxin:'鲍信', mutao:'募讨', - mutao_info:'出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】置于武将牌上,然后将这些牌依次随机交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为3)。', + mutao_info:'出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】置于武将牌上,然后将这些牌依次随机交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为2)。', yimou:'毅谋', yimou_info:'当一名角色受到伤害后,若其存活且你至其的距离不大于1,你可以选择一项:1.令其从牌堆中获得一张【杀】;2.令其将一张手牌交给另一名角色,然后摸一张牌。', jiangji:'蒋济', jilun:'机论', - jilun_info:'①当你受到伤害后,若你拥有技能〖急筹〗,则你可以一项:1.摸X张牌(X为〖急筹①〗记录数,且X且至少为1,至多为5)。2.获得1枚“机论”标记。②一名角色的结束阶段,若你拥有“机论”,则重复选择执行以下项直到你没有“机论”标记:1.失去1枚“机论”标记,视为使用一张〖急筹①〗记录过且未被〖机论②〗记录过的普通锦囊牌并记录此牌牌名。2.失去所有“机论”标记。', + jilun_info:'①当你受到伤害后,若你拥有技能〖急筹〗,则你可以一项:1.摸两张牌。2.获得1枚“机论”标记。②一名角色的结束阶段,若你拥有“机论”,则重复选择执行以下项直到你没有“机论”标记:1.失去1枚“机论”标记,视为使用一张〖急筹①〗记录过且未被〖机论②〗记录过的普通锦囊牌并记录此牌牌名。2.失去所有“机论”标记。', liwei:'李遗', jiaohua:'教化', jiaohua_backup:'教化', diff --git a/character/offline.js b/character/offline.js index bb48350bc..7e4c073c7 100644 --- a/character/offline.js +++ b/character/offline.js @@ -170,7 +170,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ d1=true; if(trigger.player.hasSkill('jueqing')||trigger.player.hasSkill('gangzhi')) d1=false; for(var target of trigger.targets){ - if(!target.mayHaveShan()||trigger.player.hasSkillTag('directHit_ai',true,{ + if(!target.mayHaveShan(player,'use')||trigger.player.hasSkillTag('directHit_ai',true,{ target:target, card:trigger.card, },true)){ @@ -299,7 +299,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var effect=0; for(var target of trigger.targets){ var eff=get.effect(target,trigger.card,trigger.player,player); - if(!target.mayHaveShan()||trigger.player.hasSkillTag('directHit_ai',true,{ + if(!target.mayHaveShan(player,'use')||trigger.player.hasSkillTag('directHit_ai',true,{ target:target, card:trigger.card, },true)){ @@ -758,6 +758,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ intro:{ content:'受到的伤害+1且改为雷属性', }, + ai:{ + effect:{ + target:(card,player,target)=>{ + if(!get.tag(card,'damage')) return; + if(target.hasSkillTag('nodamage')||target.hasSkillTag('nothunder')) return 'zeroplayertarget'; + if(target.hasSkillTag('filterDamage',null,{ + player:player, + card:new lib.element.VCard({ + name:card.name, + nature:'thunder' + },[card]) + })) return; + return 2; + } + } + } }, init:{ audio:'psshouli', @@ -900,6 +916,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ threaten:100, reverseEquip:true, + effect:{ + player:(card,player,target)=>{ + if(typeof card!=='object') return; + let suit=get.suit(card); + if(!lib.suit.contains(suit)||player.hasCard(function(i){ + return get.suit(i,player)==suit; + },'h')) return; + return [1,game.countPlayer(current=>{ + return current.countCards('e',card=>{ + return get.suit(card,current)==suit; + }); + })]; + }, + target:(card,player,target)=>{ + if(card.name==='sha'&&!player.hasSkillTag('directHit_ai',true,{ + target:target, + card:card + },true)&&game.hasPlayer(current=>{ + return current.hasCard(cardx=>{ + return get.subtype(cardx)==='equip3'; + },'e'); + })) return [0, -0.5]; + } + } } }, //战役篇田丰 @@ -3046,7 +3086,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseTarget(get.prompt('zylianji'),'令一名角色摸一张牌').set('ai',target=>{ var player=_status.event.player; if(target==player&&player.needsToDiscard(1)) return 1; - return get.effect(target,{name:'wuzhong'},player,player); + return get.effect(target,{name:'draw'},player,player); }); 'step 1' if(result.bool){ @@ -3689,7 +3729,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yjdumou:{ audio:2, forced:true, - global:'yjdumou_du', mod:{ cardname:function(card,player,name){ if(player==_status.currentPhase&&card.name=='du') return 'guohe'; @@ -3698,6 +3737,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(card.name=='du') return get.value({name:'guohe'}); }, }, + init:()=>{ + game.addGlobalSkill('yjdumou_du'); + }, + onremove:()=>{ + if(!game.hasPlayer(i=>i.hasSkill('yjdumou'),true)) game.removeGlobalSkill('yjdumou_du'); + }, subSkill:{ du:{ mod:{ @@ -3707,6 +3752,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ aiValue:function(player,card,num){ if(get.name(card)=='du'&&card.name!='du') return get.value({name:card.name}); }, + }, + trigger:{player:'dieAfter'}, + filter:()=>{ + return !game.hasPlayer(i=>i.hasSkill('yjdumou'),true); + }, + silent:true, + forceDie:true, + content:()=>{ + game.removeGlobalSkill('yjdumou_du'); } } }, @@ -4852,7 +4906,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } //护驾 else if(!player.hasShan()&&game.hasPlayer(function(current){ - return current!=player&¤t.group=='wei'&¤t.mayHaveShan()&&get.attitude(player,current)>0&&get.attitude(current,player)>0; + return current!=player&¤t.group=='wei'&¤t.mayHaveShan(player,'respond')&&get.attitude(player,current)>0&&get.attitude(current,player)>0; })) return 1; return -1; }); @@ -4886,7 +4940,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } //护驾 else if(!player.hasShan()&&game.hasPlayer(function(current){ - return current!=player&¤t.group=='wei'&¤t.mayHaveShan()&&get.attitude(player,current)>0&&get.attitude(current,player)>0; + return current!=player&¤t.group=='wei'&¤t.mayHaveShan(player,'respond')&&get.attitude(player,current)>0&&get.attitude(current,player)>0; })) return 'hujia'; }); } diff --git a/character/onlyOL.js b/character/onlyOL.js new file mode 100644 index 000000000..e6efb8eef --- /dev/null +++ b/character/onlyOL.js @@ -0,0 +1,361 @@ +'use strict'; +game.import('character',function(lib,game,ui,get,ai,_status){ + return { + name:'onlyOL', + connect:true, + character:{ + ol_sb_jiangwei:['male','shu',4,['olsbzhuri','olsbranji']], + ol_caozhang:['male','wei',4,['oljiangchi']], + ol_jianyong:['male','shu',3,['olqiaoshui','jyzongshi'],['tempname:re_jianyong','die_audio:re_jianyong']], + ol_lingtong:['male','wu',4,['olxuanfeng'],['die_audio:re_lingtong']], + }, + characterSort:{ + onlyOL:{ + onlyOL_yijiang1:['ol_caozhang','ol_jianyong','ol_lingtong'], + onlyOL_sb:['ol_sb_jiangwei'], + }, + }, + characterIntro:{ + }, + characterReplace:{ + }, + skill:{ + //OL谋姜维 + olsbzhuri:{ + audio:2, + trigger:{player:['phaseZhunbeiEnd','phaseJudgeEnd','phaseDrawEnd','phaseUseEnd','phaseDiscardEnd','phaseJieshuEnd']}, + filter:function(event,player){ + if(player.hasSkill('olsbzhuri_block')) return false; + if(!game.hasPlayer(target=>player.canCompare(target))) return false; + return player.getHistory('gain',evt=>evt.getParent(event.name)==event).length+player.getHistory('lose',evt=>evt.getParent(event.name)==event&&evt.hs.length).length; + }, + direct:true, + content:function*(event,map){ + var player=map.player; + var trigger=map.trigger; + var result=yield player.chooseTarget(get.prompt('olsbzhuri'),'与一名角色进行拼点,若你赢,你可以使用其中的一张拼点牌;若你没赢,你失去1点体力或令此技能于本回合失效',(card,player,target)=>{ + return player.canCompare(target); + }).set('ai',target=>{ + var player=_status.event.player; + var ts=target.getCards('h').sort((a,b)=>get.number(a)-get.number(b)); + if(get.attitude(player,target)<0){ + var hs=player.getCards('h').sort((a,b)=>get.number(b)-get.number(a)); + var ts=target.getCards('h').sort((a,b)=>get.number(b)-get.number(a)); + if(get.number(hs[0])>get.number(ts[0])) return 1; + if(get.effect(player,{name:'losehp'},player,player)>0) return Math.random()+0.2; + if(player.getHp()>2) return Math.random()-0.5; + return 0; + } + return 0; + }); + if(result.bool){ + var target=result.targets[0]; + player.logSkill('olsbzhuri',target); + var result2=yield player.chooseToCompare(target); + if(result2.bool){ + var cards=[result2.player,result2.target].filterInD('d'); + cards=cards.filter(card=>player.hasUseTarget(card)); + if(cards.length){ + var result3=yield player.chooseButton(['是否使用其中的牌?',cards]).set('ai',button=>_status.event.player.getUseValue(button.link)); + if(result3.bool){ + var card=result3.links[0]; + player.$gain2(card,false); + game.delayx(); + player.chooseUseTarget(true,card,false); + } + } + } + else{ + var list=lib.skill.olsbranji.getList(trigger); + var result3=yield player.chooseControl('失去体力','技能失效').set('prompt','逐日:失去1点体力,或令此技能于本回合失效').set('ai',()=>{ + var player=_status.event.player; + if(player.getHp()>2){ + var list=_status.event.list; + list.removeArray(player.skipList); + if(list.includes('phaseDraw')||list.includes('phaseUse')) return '失去体力'; + } + if(get.effect(player,{name:'losehp'},player,player)>0) return '失去体力'; + return '技能失效'; + }).set('list',list.slice(trigger.getParent().num,list.length)); + player[result3.control=='失去体力'?'loseHp':'addTempSkill'](result3.control=='失去体力'?1:'olsbzhuri_block'); + } + } + }, + subSkill:{ + block:{ + charlotte:true, + mark:true, + marktext:'', + intro:{content:'追不动太阳了'}, + }, + }, + }, + olsbranji:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + prompt2:function(event,player){ + var str='获得技能'; + var num=lib.skill.olsbranji.getNum(event,player); + if(num>=player.getHp()) str+='【困奋】'; + if(num==player.getHp()) str+='和'; + if(num<=player.getHp()) str+='【诈降】'; + str+=',然后'; + var num1=(player.countCards('h')-player.getHandcardLimit()); + if(num1||player.isDamaged()){ + if(num1) str+=(num1<0?'摸'+get.cnNumber(-num1)+'张牌':'弃置'+get.cnNumber(num1)+'张牌'); + if(num1&&player.isDamaged()) str+='或'; + if(player.isDamaged()) str+=('回复'+player.getDamagedHp()+'点体力'); + str+=',最后'; + } + str+='你不能回复体力直到你杀死角色。'; + return str; + }, + check:function(event,player){ + var num=lib.skill.olsbranji.getNum(event,player); + if(num==player.getHp()) return true; + return player.getHandcardLimit()-player.countCards('h')>=3||player.getDamagedHp()>=2; + }, + limited:true, + skillAnimation:true, + animationColor:'fire', + content:function*(event,map){ + var player=map.player; + var trigger=map.trigger; + player.awakenSkill('olsbranji'); + var num=lib.skill.olsbranji.getNum(trigger,player); + if(num>=player.getHp()){ + player.addSkillLog('kunfen'); + player.storage.kunfen=true; + } + if(num<=player.getHp()) player.addSkillLog('zhaxiang'); + if(player.countCards('h')!=player.getHandcardLimit()||player.isDamaged()){ + var result,num1=player.countCards('h')-player.getHandcardLimit(); + if(!num1) result={index:1}; + else if(player.isHealthy()) result={index:0}; + else{ + result=yield player.chooseControl('手牌数','体力值').set('choiceList',[ + num1<0?'摸'+get.cnNumber(-num1)+'张牌':'弃置'+get.cnNumber(num1)+'张牌', + '回复'+(player.getDamagedHp())+'点体力', + ]).set('ai',()=>{ + var player=_status.event.player; + var list=_status.event.list; + var num1=get.effect(player,{name:'draw'},player,player); + var num2=get.recoverEffect(player,player,player); + return num1*list[0]>num2*list[1]?0:1; + }).set('list',[-num1,player.getDamagedHp()]); + } + if(result.index==0){ + if(num1<0) player.drawTo(player.getHandcardLimit()); + else player.chooseToDiscard(num1,'h',true); + } + else{ + player.recover(player.maxHp-player.hp); + } + } + player.when('olsbranjiAfter').then(()=>player.addSkill('olsbranji_norecover')); + player.when({source:'dieAfter'}).then(()=>player.removeSkill('olsbranji_norecover')); + }, + derivation:['kunfenx','zhaxiang'], + getList:function(event){ + return event.getParent().phaseList.map(list=>list.split('|')[0]); + }, + getNum:function(event,player){ + return lib.skill.olsbranji.getList(event).slice(0,event.getParent().num).filter(name=>player.getHistory('useCard',evt=>evt.getParent(name).name==name).length).length; + }, + subSkill:{ + norecover:{ + charlotte:true, + mark:true, + intro:{content:'不能回复体力'}, + trigger:{player:'recoverBefore'}, + forced:true, + firstDo:true, + content:function(){ + trigger.cancel(); + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(get.tag(card,'recover')) return 'zeroplayertarget'; + }, + }, + }, + }, + }, + }, + //界曹彰 + oljiangchi:{ + audio:2, + trigger:{player:'phaseDrawEnd'}, + direct:true, + content:function*(event,map){ + var player=map.player; + var choiceList=[ + '摸一张牌,本回合使用【杀】的次数上限-1,且【杀】不计入手牌上限。', + '重铸一张牌,本回合使用【杀】无距离限制,且使用【杀】的次数上限+1。', + ],list=['cancel2']; + if(player.countCards('he',card=>player.canRecast(card))) list.unshift('重铸,+1'); + else choiceList[1]=''+choiceList[1]+''; + list.unshift('摸牌,-1'); + var result=yield player.chooseControl(list).set('ai',()=>{ + var player=_status.event.player; + var controls=_status.event.controls.slice(); + if(controls.includes('重铸,+1')&&player.countCards('hs',card=>get.name(card)=='sha'&&player.hasValueTarget(card))>=2) return '重铸,+1'; + return '摸牌,-1'; + }).set('choiceList',choiceList).set('prompt',get.prompt('oljiangchi')); + if(result.control!='cancel2'){ + player.logSkill('oljiangchi'); + if(result.control=='摸牌,-1'){ + player.draw(); + player.addTempSkill('oljiangchi_less'); + player.addMark('oljiangchi_less',1,false); + } + else{ + var result2=yield player.chooseCard('he','将驰:请重铸一张牌',true,(card,player)=>player.canRecast(card)); + if(result2.bool){ + player.recast(result2.cards); + player.addTempSkill('oljiangchi_more'); + player.addMark('oljiangchi_more',1,false); + } + } + } + }, + subSkill:{ + less:{ + charlotte:true, + onremove:true, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num-player.countMark('oljiangchi_less'); + }, + ignoredHandcard:function(card,player){ + if(card.name=='sha') return true; + }, + cardDiscardable:function(card,player,name){ + if(name=='phaseDiscard'&&card.name=='sha') return false; + }, + }, + }, + more:{ + charlotte:true, + onremove:true, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.countMark('oljiangchi_more'); + }, + targetInRange:function (card,player){ + if(card.name=='sha') return true; + }, + }, + }, + }, + }, + //界简雍 + olqiaoshui:{ + audio:'reqiaoshui', + inherit:'reqiaoshui', + filter:function(event,player){ + return player.countCards('h')>0&&!player.hasSkill('olqiaoshui_used'); + }, + content:function(){ + 'step 0' + player.chooseToCompare(target); + 'step 1' + if(result.bool) player.addTempSkill('qiaoshui3',{player:'phaseUseAfter'}); + else{ + player.addTempSkill('qiaoshui2'); + player.addTempSkill('olqiaoshui_used'); + } + }, + subSkill:{ + used:{ + charlotte:true, + mark:true, + marktext:'', + intro:{content:'被迫闭嘴'}, + }, + }, + }, + //界凌统 + olxuanfeng:{ + audio:'xuanfeng', + audioname:['boss_lvbu3'], + audioname2:{ + lingtong:'xuanfeng', + ol_lingtong:'xuanfeng_re_lingtong', + }, + trigger:{ + player:['loseAfter'], + global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + }, + filter:function(event,player){ + var evt=event.getl(player); + return evt&&(evt.es.length||evt.cards2.length>1); + }, + direct:true, + content:function(){ + 'step 0' + event.count=2; + event.logged=false; + 'step 1' + player.chooseTarget(get.prompt('olxuanfeng'),'弃置一名其他角色的一张牌',function(card,player,target){ + if(player==target) return false; + return target.countDiscardableCards(player,'he'); + }).set('ai',function(target){ + return -get.attitude(_status.event.player,target); + }); + 'step 2' + if(result.bool){ + if(!event.logged){ + player.logSkill('olxuanfeng',result.targets); + event.logged=true; + } + else player.line(result.targets[0],'green'); + player.discardPlayerCard(result.targets[0],'he',true); + event.count--; + } + else event.finish(); + 'step 3' + if(event.count) event.goto(1); + }, + ai:{ + reverseEquip:true, + noe:true, + effect:{ + target:function(card,player,target,current){ + if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,3]; + }, + }, + }, + }, + xuanfeng_re_lingtong:{audio:2}, + }, + dynamicTranslate:{ + }, + translate:{ + ol_lingtong:'OL界凌统', + ol_lingtong_prefix:'OL界', + olxuanfeng:'旋风', + olxuanfeng_info:'当你一次性失去至少两张牌后,或失去装备区的牌后,你可以依次弃置一至两名其他角色的共计两张牌。', + ol_jianyong:'OL界简雍', + ol_jianyong_prefix:'OL界', + olqiaoshui:'巧说', + olqiaoshui_info:'出牌阶段,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,此技能于本回合失效且本回合你不能使用锦囊牌。', + ol_caozhang:'OL界曹彰', + ol_caozhang_prefix:'OL界', + oljiangchi:'将驰', + oljiangchi_info:'摸牌阶段结束时,你可以选择一项:①摸一张牌,本回合使用【杀】的次数上限-1,且【杀】不计入手牌上限。②重铸一张牌,本回合使用【杀】无距离限制,且使用【杀】的次数上限+1。', + ol_sb_jiangwei:'OL谋姜维', + ol_sb_jiangwei_prefix:'OL谋', + olsbzhuri:'逐日', + olsbzhuri_info:'你的阶段结束时,若你本阶段失去过手牌或得到过牌,则你可以与一名角色拼点。若你赢,你可以使用其中一张拼点牌;若你没赢,你失去1点体力或令此技能于本回合无效。', + olsbranji:'燃己', + olsbranji_info:'限定技,结束阶段。若你本回合使用过牌的阶段数大于等于/小于等于体力值,你可以获得技能〖困奋〗/〖诈降〗(同时满足则都获得,以此法获得的〖困奋〗直接修改为非锁定技)。若如此做,你将手牌数调整至手牌上限或将体力值回复至体力上限,然后你不能回复体力直到你杀死角色。', + kunfenx:'困奋', + kunfenx_info:'结束阶段开始时,你可以失去1点体力,然后摸两张牌。', + + onlyOL_yijiang1:'OL专属·将1', + onlyOL_sb:'OL专属·上兵伐谋', + }, + }; +}); diff --git a/character/ow.js b/character/ow.js index 63077e350..6bf7c7667 100644 --- a/character/ow.js +++ b/character/ow.js @@ -3464,99 +3464,99 @@ game.import('character',function(lib,game,ui,get,ai,_status){ translate:{ woliu:'涡流', woliu2:'涡流', - woliu_info:'结束阶段,你可以选择至多两名角色,当你或目标中的任意一名角色成为杀的目标时,其余角色也将被追加为目标,直到你死亡或下一回合开始', + woliu_info:'结束阶段,你可以选择至多两名角色,当你或目标中的任意一名角色成为杀的目标时,其余角色也将被追加为目标,直到你死亡或下一回合开始。', qianggu:'强固', - qianggu_info:'出牌阶段限一次,你可以弃置两张牌并获得2点护甲,若如此做,直到你的下个回合开始,其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效', + qianggu_info:'出牌阶段限一次,你可以弃置两张牌并获得2点护甲,若如此做,直到你的下个回合开始,其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效。', qianggu2:'强固', qianggu2_bg:'固', - qianggu2_info:'其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效', + qianggu2_info:'其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效。', pingzhang:'屏障', - pingzhang_info:'每轮各限一次,当你受到伤害时,你可以弃置一张红桃牌令伤害-1;当一名其他角色受到伤害时,你可以弃置一张黑桃牌令伤害-1', - pingzhang_info_alter:'每轮各限一次,当你受到伤害时,你可以弃置一张红桃手牌令伤害-1;当一名其他角色受到伤害时,你可以弃置一张黑桃手牌令伤害-1', + pingzhang_info:'每轮各限一次,当你受到伤害时,你可以弃置一张红桃牌令伤害-1;当一名其他角色受到伤害时,你可以弃置一张黑桃牌令伤害-1。', + pingzhang_info_alter:'每轮各限一次,当你受到伤害时,你可以弃置一张红桃手牌令伤害-1;当一名其他角色受到伤害时,你可以弃置一张黑桃手牌令伤害-1。', owliyong:'力涌', - owliyong_info:'锁定技,你摸牌阶段摸牌数+X,X为你上一轮发动屏障的次数', + owliyong_info:'锁定技,你摸牌阶段摸牌数+X,X为你上一轮发动屏障的次数。', dianji:'电击', - dianji_info:'出牌阶段限一次,你可以将一张手牌当作惊雷闪对距离2以内的角色使用', + dianji_info:'出牌阶段限一次,你可以将一张手牌当作惊雷闪对距离2以内的角色使用。', feitiao:'飞跳', feitiao2:'飞跳', - feitiao_info:'出牌阶段开始时,你可以弃置一张牌并指定一名角色,你与该角色的距离视为1直到回合结束,然后该角色随机弃置一张牌', + feitiao_info:'出牌阶段开始时,你可以弃置一张牌并指定一名角色,你与该角色的距离视为1直到回合结束,然后该角色随机弃置一张牌。', bshaowei:'哨卫', - bshaowei_info:'结束阶段,你可以切换至哨卫模式。当处于此模式时,你的杀无视距离和防具、无数量限制且不可闪避;你不能闪避杀', + bshaowei_info:'结束阶段,你可以切换至哨卫模式。当处于此模式时,你的杀无视距离和防具、无数量限制且不可闪避;你不能闪避杀。', zhencha:'侦查', - zhencha_info:'结束阶段,你可以切换至侦查模式。当处于此模式时,每当你使用一张杀,你摸一张牌或回复1点体力', + zhencha_info:'结束阶段,你可以切换至侦查模式。当处于此模式时,每当你使用一张杀,你摸一张牌或回复1点体力。', liangou:'链钩', - liangou_info:'出牌阶段限一次,你可以弃置一张牌,指定一名其他角色并进行一次判定,若结果不为红桃,该角色与你距离为1且受到的首次伤害+1直到回合结束', + liangou_info:'出牌阶段限一次,你可以弃置一张牌,指定一名其他角色并进行一次判定,若结果不为红桃,该角色与你距离为1且受到的首次伤害+1直到回合结束。', xiyang:'吸氧', - xiyang_info:'结束阶段,若你武将牌正面朝上,你可以翻面并回复2点体力', + xiyang_info:'结束阶段,若你武将牌正面朝上,你可以翻面并回复2点体力。', qinru:'侵入', - qinru_info:'每当你使用杀指定目标时,你可以令其进行一次判定,若结果不为红桃,该角色的非锁定技失效直到其下一回合结束', + qinru_info:'每当你使用杀指定目标时,你可以令其进行一次判定,若结果不为红桃,该角色的非锁定技失效直到其下一回合结束。', yinshen:'隐身', - yinshen_info:'锁定技,每当你失去最后一张基本牌,你获得潜行直到下一回合开始', - yinshen_info_old:'结束阶段,你可以弃置一张装备牌并获得潜行直到下一回合开始', + yinshen_info:'锁定技,每当你失去最后一张基本牌,你获得潜行直到下一回合开始。', + yinshen_info_old:'结束阶段,你可以弃置一张装备牌并获得潜行直到下一回合开始。', maichong:'脉冲', - maichong_info:'锁定技,每当你使用一张普通锦囊牌,你令最近三回合内被你侵入过的角色各随机弃置一张牌', - maichong_info_alter:'准备阶段,你可以令最近两名被你侵入的角色各随机弃置一张牌', + maichong_info:'锁定技,每当你使用一张普通锦囊牌,你令最近三回合内被你侵入过的角色各随机弃置一张牌。', + maichong_info_alter:'准备阶段,你可以令最近两名被你侵入的角色各随机弃置一张牌。', lichang:'力场', lichang2:'力场', - lichang_info:'结束阶段,你可以弃置一张红色牌,若如此做,你可以在下个准备阶段令一名距离1以内的角色回复1点体力或摸两张牌', + lichang_info:'结束阶段,你可以弃置一张红色牌,若如此做,你可以在下个准备阶段令一名距离1以内的角色回复1点体力或摸两张牌。', mengji:'猛击', - mengji_info:'锁定技,若你已发动重盾,当你没有护甲时,你的杀造成的伤害+1', + mengji_info:'锁定技,若你已发动重盾,当你没有护甲时,你的杀造成的伤害+1。', zhongdun:'重盾', - zhongdun_info:'游戏开始时,你获得8点护甲;出牌阶段限一次,你可以弃置一张牌并将1点护甲分给一名没有护甲的其他角色', - zhongdun_info_alter:'游戏开始时,你获得6点护甲;出牌阶段限一次,你可以弃置一张牌并将1点护甲分给一名没有护甲的其他角色', + zhongdun_info:'游戏开始时,你获得8点护甲;出牌阶段限一次,你可以弃置一张牌并将1点护甲分给一名没有护甲的其他角色。', + zhongdun_info_alter:'游戏开始时,你获得6点护甲;出牌阶段限一次,你可以弃置一张牌并将1点护甲分给一名没有护甲的其他角色。', paotai:'炮台', paotai2:'炮台', - paotai_info:'出牌阶段,你可以弃置一张杀布置或升级一个炮台(最高3级);结束阶段,炮台有一定机率对一名随机敌人造成1点火焰伤害;每当你受到1点伤害,炮台降低一级', + paotai_info:'出牌阶段,你可以弃置一张杀布置或升级一个炮台(最高3级);结束阶段,炮台有一定机率对一名随机敌人造成1点火焰伤害;每当你受到1点伤害,炮台降低一级。', maoding:'铆钉', maoding2:'铆钉', - maoding_info:'每当你造成或受到一次伤害,你可以获得一个零件;出牌阶段,你可以弃置两张零件牌令一名没有护甲的角色获得1点护甲', - maoding_info_alter:'每当你造成一次伤害,你可以获得一个零件;出牌阶段,你可以弃置两张零件牌令一名没有护甲的角色获得1点护甲', + maoding_info:'每当你造成或受到一次伤害,你可以获得一个零件;出牌阶段,你可以弃置两张零件牌令一名没有护甲的角色获得1点护甲。', + maoding_info_alter:'每当你造成一次伤害,你可以获得一个零件;出牌阶段,你可以弃置两张零件牌令一名没有护甲的角色获得1点护甲。', bfengshi:'风矢', bfengshi2:'风矢', - bfengshi_info:'锁定技,在一合内每当你使用一张牌,你的攻击范围+1;你的首张杀增加20%的概率强制命中;你的首张杀造成伤害后增加20%的概率令伤害+1', - bfengshi_info_alter:'锁定技,在一合内每当你使用一张牌,你的攻击范围+1;你的首张杀增加15%的概率强制命中;你的首张杀造成伤害后增加15%的概率令伤害+1', + bfengshi_info:'锁定技,在一合内每当你使用一张牌,你的攻击范围+1;你的首张杀增加20%的概率强制命中;你的首张杀造成伤害后增加20%的概率令伤害+1。', + bfengshi_info_alter:'锁定技,在一合内每当你使用一张牌,你的攻击范围+1;你的首张杀增加15%的概率强制命中;你的首张杀造成伤害后增加15%的概率令伤害+1。', yinbo:'音波', - yinbo_info:'出牌阶段限一次,你可以弃置一张黑桃牌,然后随机弃置三名敌人各一张牌', + yinbo_info:'出牌阶段限一次,你可以弃置一张黑桃牌,然后随机弃置三名敌人各一张牌。', liudan:'榴弹', - liudan_info:'每当你使用一张杀,你可以令所有不是此杀目标的其他角色有50%概率成为此杀的额外目标', + liudan_info:'每当你使用一张杀,你可以令所有不是此杀目标的其他角色有50%概率成为此杀的额外目标。', shoujia:'兽夹', shoujia2:'兽夹', shoujia3:'兽夹', - shoujia_info:'出牌阶段限一次,你可以将一张牌背面朝上置于一名其他角色的武将牌上,当该角色使用一张与此牌花色相同的牌指定其他角色为目标时,移去此牌,该角色将武将牌翻至背面;当你受到伤害时,移去此牌', + shoujia_info:'出牌阶段限一次,你可以将一张牌背面朝上置于一名其他角色的武将牌上,当该角色使用一张与此牌花色相同的牌指定其他角色为目标时,移去此牌,该角色将武将牌翻至背面;当你受到伤害时,移去此牌。', shihuo:'嗜火', - shihuo_info:'锁定技,每当一名角色受到火焰伤害,你摸一张牌', + shihuo_info:'锁定技,每当一名角色受到火焰伤害,你摸一张牌。', shanguang:'闪光', - shanguang_info:'出牌阶段限一次,你可以弃置一张方片牌令攻击范围内的一名其他角色本回合内不能使用或打出卡牌', + shanguang_info:'出牌阶段限一次,你可以弃置一张方片牌令攻击范围内的一名其他角色本回合内不能使用或打出卡牌。', tiandan:'填弹', - tiandan_info:'摸牌阶段开始时,你可以跳过出牌和弃牌阶段,然后获得若干张杀直到你的手牌数等于你的体值(最多为5)', + tiandan_info:'摸牌阶段开始时,你可以跳过出牌和弃牌阶段,然后获得若干张杀直到你的手牌数等于你的体值(最多为5)。', shenqiang:'神枪', - shenqiang_info:'锁定技,每当你在出牌阶段使用杀造成伤害,本阶段内出杀次数上限+1', + shenqiang_info:'锁定技,每当你在出牌阶段使用杀造成伤害,本阶段内出杀次数上限+1。', mianzhen:'眠针', mianzhen2:'眠针', - mianzhen_info:'出牌阶段限一次,你可以弃置一张牌并令一名其他角色打出一张闪,否则该角色不能使用或打出卡牌直到其受到伤害或下一回合结束', + mianzhen_info:'出牌阶段限一次,你可以弃置一张牌并令一名其他角色打出一张闪,否则该角色不能使用或打出卡牌直到其受到伤害或下一回合结束。', aqianghua:'强化', aqianghua2:'强化', - aqianghua_info:'出牌阶段限一次,你可以将你的全部手牌(至少一张)交给一名其他角色,该角色获得1点护甲且下一次造成的伤害+1', - aqianghua_info_alter:'出牌阶段限一次,你可以将你的全部手牌(至少一张)交给一名其他角色,该角色下一次造成的伤害+1', + aqianghua_info:'出牌阶段限一次,你可以将你的全部手牌(至少一张)交给一名其他角色,该角色获得1点护甲且下一次造成的伤害+1。', + aqianghua_info_alter:'出牌阶段限一次,你可以将你的全部手牌(至少一张)交给一名其他角色,该角色下一次造成的伤害+1。', zhiyuan:'支援', - zhiyuan_info:'每当你即将造成伤害,你可以防止此伤害,改为令目标回复等量的体力', + zhiyuan_info:'每当你即将造成伤害,你可以防止此伤害,改为令目标回复等量的体力。', juji:'狙击', juji2:'狙击', juji3:'狙击', - juji_info:'出牌阶段限一次,你可以弃置任意张花色不同的牌并指定一名有手牌的其他角色,若该角色的手牌中含有与你弃置的牌花色相同的牌,则本回合内你与其距离为1且该角色不能闪避你的杀', + juji_info:'出牌阶段限一次,你可以弃置任意张花色不同的牌并指定一名有手牌的其他角色,若该角色的手牌中含有与你弃置的牌花色相同的牌,则本回合内你与其距离为1且该角色不能闪避你的杀。', duwen:'毒吻', duwen2:'毒吻', - duwen_info:'锁定技,当你造成伤害时,若你的手牌数与受伤害角色相等,此伤害+1', + duwen_info:'锁定技,当你造成伤害时,若你的手牌数与受伤害角色相等,此伤害+1。', zhuagou:'抓钩', - zhuagou_info:'出牌阶段限一次,你可以弃置一张手牌并将你的座位移到任意位置', + zhuagou_info:'出牌阶段限一次,你可以弃置一张手牌并将你的座位移到任意位置。', dulei:'诡雷', dulei2:'诡雷', - dulei_info:'出牌阶段,若你武将牌上没有牌,你可以将一张牌背面朝上置于你的武将牌上,当一名角色使用与该牌花色相同的牌指定你为目标时,你展示并移去此牌,然后该角色失去1点体力并随机弃置一张牌', + dulei_info:'出牌阶段,若你武将牌上没有牌,你可以将一张牌背面朝上置于你的武将牌上,当一名角色使用与该牌花色相同的牌指定你为目标时,你展示并移去此牌,然后该角色失去1点体力并随机弃置一张牌。', shuangqiang:'霜枪', - shuangqiang_info:'每当你对一名未翻面的角色造成伤害,你可以令伤害-1,然后令受伤害角色翻面', + shuangqiang_info:'每当你对一名未翻面的角色造成伤害,你可以令伤害-1,然后令受伤害角色翻面。', baoxue:'暴雪', - baoxue_info:'限定技,出牌阶段,若你未翻面,你可以展示并弃置你的所有黑色牌,然后令至多X名其他角色随机弃置一张牌并将武将牌翻至背面,X为你的弃牌数;结算后你将武将牌翻至背面', - baoxue_info_alter:'限定技,出牌阶段,你可以展示并弃置你的所有黑色牌,并选择等量其他角色将武将牌翻至背面,结算后你将武将牌翻至背面', + baoxue_info:'限定技,出牌阶段,若你未翻面,你可以展示并弃置你的所有黑色牌,然后令至多X名其他角色随机弃置一张牌并将武将牌翻至背面,X为你的弃牌数;结算后你将武将牌翻至背面。', + baoxue_info_alter:'限定技,出牌阶段,你可以展示并弃置你的所有黑色牌,并选择等量其他角色将武将牌翻至背面,结算后你将武将牌翻至背面。', bingqiang:'冰墙', bingqiang2:'冰墙', bingqiang2_bg:'墙', @@ -3566,74 +3566,74 @@ game.import('character',function(lib,game,ui,get,ai,_status){ bingqiang4_bg:'墙', bingqiang5:'冰墙', bingqiang5_bg:'障', - bingqiang_info:'出牌阶段,你可以弃置X张红色牌令一名角色和其相邻角色的防御离+X,或弃置X张黑色牌令一名角色和其相邻角色的进攻离-X,效果持续到你的下个回合开始', + bingqiang_info:'出牌阶段,你可以弃置X张红色牌令一名角色和其相邻角色的防御离+X,或弃置X张黑色牌令一名角色和其相邻角色的进攻离-X,效果持续到你的下个回合开始。', jidong:'急冻', - jidong_info:'在一名角色的结束阶段,若你的体力值为1且未翻面,你可以翻面并回复2点体力,在你的武将牌翻至正面前,你防止所有伤害,也不能成为其他角色卡牌的目标', - jidong_info_alter:'在一名角色的结束阶段,若你的体力值为1,你可以翻面并回复2点体力', + jidong_info:'在一名角色的结束阶段,若你的体力值为1且未翻面,你可以翻面并回复2点体力,在你的武将牌翻至正面前,你防止所有伤害,也不能成为其他角色卡牌的目标。', + jidong_info_alter:'在一名角色的结束阶段,若你的体力值为1,你可以翻面并回复2点体力。', jijia:'机甲', - jijia_info:'锁定技,游戏开始时,你获得一个体力为4的机甲;你的手牌上限为你和机甲的体力之和;你受到的伤害由机甲承担', + jijia_info:'锁定技,游戏开始时,你获得一个体力为4的机甲;你的手牌上限为你和机甲的体力之和;你受到的伤害由机甲承担。', zihui:'自毁', - zihui_info:'出牌阶段,你可以令距离2以内的所有其他角色选择一项:弃置数量等同你机甲体力值的牌,或受到2点火焰伤害,并在结算完毕后摧毁你的机甲', - zihui_info_alter:'出牌阶段,你可以令距离2以内的所有其他角色选择一项:1. 弃置数量等同你机甲体力值的牌(不足则全弃,至少弃1张);2. 或受到2点火焰伤害,并在结算完毕后摧毁你的机甲', + zihui_info:'出牌阶段,你可以令距离2以内的所有其他角色选择一项:弃置数量等同你机甲体力值的牌,或受到2点火焰伤害,并在结算完毕后摧毁你的机甲。', + zihui_info_alter:'出牌阶段,你可以令距离2以内的所有其他角色选择一项:1. 弃置数量等同你机甲体力值的牌(不足则全弃,至少弃1张);2. 或受到2点火焰伤害,并在结算完毕后摧毁你的机甲。', tuijin:'推进', tuijin2:'推进', - tuijin_info:'出牌阶段限一次,若你有机甲,你可以指定一名角色,本回合内视为与其距离为1', + tuijin_info:'出牌阶段限一次,若你有机甲,你可以指定一名角色,本回合内视为与其距离为1。', chongzhuang:'重装', - chongzhuang_info:'在你失去机甲后,当你累计造成了4点伤害时,你重新获得机甲', + chongzhuang_info:'在你失去机甲后,当你累计造成了4点伤害时,你重新获得机甲。', shouge:'收割', - shouge_info:'每当你杀死一名角色,你可以获得一张治疗波', + shouge_info:'每当你杀死一名角色,你可以获得一张治疗波。', tuji:'突击', - tuji_info:'锁定技,在你的回合内,每当你使用一张牌,你的进攻距离+1', + tuji_info:'锁定技,在你的回合内,每当你使用一张牌,你的进攻距离+1。', mujing:'目镜', mujing2:'目镜', - mujing_info:'你可以将一张黑色牌当作杀使用或打出;当你的杀被闪避后,此杀不计入出杀次数', - mujing_old_info:'每当你对攻击范围不含你的角色使用一张牌,你可以弃置目标一张牌;若你的手牌数不多于目标,你摸一张牌', + mujing_info:'你可以将一张黑色牌当作杀使用或打出;当你的杀被闪避后,此杀不计入出杀次数。', + mujing_old_info:'每当你对攻击范围不含你的角色使用一张牌,你可以弃置目标一张牌;若你的手牌数不多于目标,你摸一张牌。', feiren:'飞刃', feiren2:'飞刃', - feiren_info:'你的杀无视距离;你的黑桃杀造成的伤害+1,梅花杀可以额外指定一个目标', - feiren_info_alter:'你的杀无视距离;你的梅花杀可以额外指定一个目标', + feiren_info:'你的杀无视距离;你的黑桃杀造成的伤害+1,梅花杀可以额外指定一个目标。', + feiren_info_alter:'你的杀无视距离;你的梅花杀可以额外指定一个目标。', zhanlong:'斩龙', - zhanlong_info:'限定技,准备阶段,若你体力值为1,你可以弃置所有牌(至少一张),然后将三张杀置入你的手牌,若如此做,你本回合使用杀无次数限制', + zhanlong_info:'限定技,准备阶段,若你体力值为1,你可以弃置所有牌(至少一张),然后将三张杀置入你的手牌,若如此做,你本回合使用杀无次数限制。', xie:'谐', xie2:'谐', - xie_info:'出牌阶段,你可以弃置一张红桃手牌并指定一名角色,该角色自其下一回合开始每隔六回合回复1点体力,直到你死亡。同一时间只能对一人发动', + xie_info:'出牌阶段,你可以弃置一张红桃手牌并指定一名角色,该角色自其下一回合开始每隔六回合回复1点体力,直到你死亡。同一时间只能对一人发动。', luan:'乱', luan2:'乱', - luan_old_info:'出牌阶段,你可以弃置一张黑桃手牌并指定一名角色,该角色自其下一回合开始每隔六回合失去1点体力,直到你死亡。同一时间只能对一人发动', - luan_info:'出牌阶段,你可以弃置一张黑桃手牌并指定一名角色,该角色受到伤害后失去1点体力,直到你死亡或其首次进入濒死状态。同一时间只能对一人发动', + luan_old_info:'出牌阶段,你可以弃置一张黑桃手牌并指定一名角色,该角色自其下一回合开始每隔六回合失去1点体力,直到你死亡。同一时间只能对一人发动。', + luan_info:'出牌阶段,你可以弃置一张黑桃手牌并指定一名角色,该角色受到伤害后失去1点体力,直到你死亡或其首次进入濒死状态。同一时间只能对一人发动。', sheng:'圣', - sheng_info:'限定技,出牌阶段,你可以将你的武将牌翻面,然后令任意名角色回复1点体力,若如此做,你不能成为其他角色的卡牌目标直到下一回合开始', + sheng_info:'限定技,出牌阶段,你可以将你的武将牌翻面,然后令任意名角色回复1点体力,若如此做,你不能成为其他角色的卡牌目标直到下一回合开始。', xiandan:'霰弹', - xiandan_info:'每当你使用一张杀,你可以弃置一张红色牌令此杀不可闪避,或弃置一张黑色牌令此杀伤害+1', + xiandan_info:'每当你使用一张杀,你可以弃置一张红色牌令此杀不可闪避,或弃置一张黑色牌令此杀伤害+1。', yihun:'移魂', - yihun_info:'结束阶段,你可以弃置一张黑色牌并指定一名其他角色,你在该角色下一准备阶段视为对其使用一张杀;在此之前,你不能使用卡牌,也不能成为卡牌的目标', + yihun_info:'结束阶段,你可以弃置一张黑色牌并指定一名其他角色,你在该角色下一准备阶段视为对其使用一张杀;在此之前,你不能使用卡牌,也不能成为卡牌的目标。', feidan:'飞弹', - feidan_info:'你的杀只能对距离1以外的角色使用;每当你使用杀造成伤害后,你可以弃置一张牌对距离目标1以内的其他角色各造成1点伤害', + feidan_info:'你的杀只能对距离1以外的角色使用;每当你使用杀造成伤害后,你可以弃置一张牌对距离目标1以内的其他角色各造成1点伤害。', huoyu:'火雨', - huoyu_info:'限定技,出牌阶段,你可以弃置两张红色牌,视为使用两张炽羽袭', + huoyu_info:'限定技,出牌阶段,你可以弃置两张红色牌,视为使用两张炽羽袭。', yuedong:'乐动', - yuedong_info:'出牌阶段结束时,你可以令一名角色摸一张牌', + yuedong_info:'出牌阶段结束时,你可以令一名角色摸一张牌。', kuoyin:'扩音', - kuoyin_info:'出牌阶段,你可以弃置一张牌令本回合乐动的目标数改为3,或弃置两张牌令本回合乐动的摸牌量改为2', - kuoyin_info_alter:'出牌阶段,你可以弃置一张牌令本回合乐动的目标数改为3', + kuoyin_info:'出牌阶段,你可以弃置一张牌令本回合乐动的目标数改为3,或弃置两张牌令本回合乐动的摸牌量改为2。', + kuoyin_info_alter:'出牌阶段,你可以弃置一张牌令本回合乐动的目标数改为3。', huhuan:'互换', - huhuan_info:'出牌阶段,你可以弃置两张牌令本回合乐动的摸牌效果改为回复等量体力', + huhuan_info:'出牌阶段,你可以弃置两张牌令本回合乐动的摸牌效果改为回复等量体力。', guangshu:'光枢', guangshu_heart:'光盾', guangshu_spade:'光塔', guangshu_club:'光井', guangshu_diamond:'光流', - guangshu_info:'出牌阶段,你可以弃置一张牌,并指定一名角色,根据弃置牌的花色执行如下效果:♥该角色下次受到伤害时回复1点体力;♦︎该角色下次造成伤害时摸两张牌;♣该角色无法使用杀直到下一回合结束;♠该角色于下个结束阶段受到1点无来源的雷电伤害', + guangshu_info:'出牌阶段,你可以弃置一张牌,并指定一名角色,根据弃置牌的花色执行如下效果:♥该角色下次受到伤害时回复1点体力;♦︎该角色下次造成伤害时摸两张牌;♣该角色无法使用杀直到下一回合结束;♠该角色于下个结束阶段受到1点无来源的雷电伤害。', ziyu:'自愈', - ziyu_info:'在一名角色的结束阶段,你可以回复1点体力或摸一张牌,每隔四回合发动一次', - ziyu_info_alter:'在一名角色的结束阶段,你可以回复1点体力或摸一张牌,每隔六回合发动一次', + ziyu_info:'在一名角色的结束阶段,你可以回复1点体力或摸一张牌,每隔四回合发动一次。', + ziyu_info_alter:'在一名角色的结束阶段,你可以回复1点体力或摸一张牌,每隔六回合发动一次。', shouhu:'守护', - shouhu_info:'你不能使用杀;出牌阶段,你可以弃置一张杀令一名其他角色回复1点体力', + shouhu_info:'你不能使用杀;出牌阶段,你可以弃置一张杀令一名其他角色回复1点体力。', shanxian:'闪现', shanxian_info:'在一名其他角色的回合开始前,若你的武将牌正面朝上,你可以摸一张牌并进行一个额外回合,并在回合结束后将武将牌翻至背面。若如此做,你对其使用卡牌无视距离直到回合结束。', shanxian_info_alter:'在一名其他角色的回合开始前,若你的武将牌正面朝上,你可以进行一个额外回合,并在回合结束后将武将牌翻至背面。若如此做,你对其使用卡牌无视距离直到回合结束。', shanhui:'闪回', - shanhui_info:'当你造成或受到伤害后,你可以将你的牌重置为上次发动闪现时的状态,若你的牌数因此而减少,你回复1点体力', + shanhui_info:'当你造成或受到伤害后,你可以将你的牌重置为上次发动闪现时的状态,若你的牌数因此而减少,你回复1点体力。', ow_liekong:'猎空', ow_sishen:'死神', ow_tianshi:'天使', diff --git a/character/rank.js b/character/rank.js index d6b6dc98d..5389604ef 100644 --- a/character/rank.js +++ b/character/rank.js @@ -348,6 +348,9 @@ window.noname_character_rank={ 'caoyi', 'sb_sp_zhugeliang', 'sb_zhugeliang', + 'ol_jianyong', + 'ol_sb_jiangwei', + 'dc_sb_zhouyu', ], am:[ 'diy_caiwenji', @@ -640,6 +643,7 @@ window.noname_character_rank={ 'dc_guansuo', 'dc_dongzhao', 'zhugeruoxue', + 'dc_sb_lusu', ], bp:[ 'chess_diaochan', @@ -1321,6 +1325,8 @@ window.noname_character_rank={ 'baoxin', 'mb_xianglang', 'lvboshe', + 'ol_caozhang', + 'ol_lingtong', ], bm:[ 'diy_xizhenxihong', @@ -2070,8 +2076,13 @@ window.noname_character_rank={ 'clan_xunyou', 'lvboshe', 'yj_zhoubuyi', + 'ol_jianyong', + 'ol_sb_jiangwei', + 'dc_sb_zhouyu', ], rare:[ + 'ol_caozhang', + 'ol_lingtong', 'luoxian', 'ol_mengda', 'tw_menghuo', @@ -2535,6 +2546,7 @@ window.noname_character_rank={ 'yue_zhoufei', 'ol_dingshangwan', 'ol_liwan', + 'dc_sb_lusu', ], junk:[ 'sunshao', diff --git a/character/refresh.js b/character/refresh.js index 98cb6c6ad..cc636cbe9 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -20,8 +20,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, connect:true, character:{ - ol_jianyong:['male','shu',3,['olqiaoshui','jyzongshi'],['unseen']], - ol_lingtong:['male','wu',4,['olxuanfeng'],['die_audio:re_lingtong','unseen']], re_xushu:['male','shu',4,['zhuhai','qianxin']], re_lidian:['male','wei',3,['xunxun','xinwangxi']], re_zhongyao:['male','wei',3,['rehuomo','zuoding'],['clan:颍川钟氏']], @@ -171,85 +169,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_guohuai:['xiahouyuan','zhanghe'], }, skill:{ - //界简雍 - olqiaoshui:{ - audio:2, - inherit:'reqiaoshui', - filter:function(event,player){ - return player.countCards('h')>0&&!player.hasSkill('olqiaoshui_used'); - }, - content:function(){ - 'step 0' - player.chooseToCompare(target); - 'step 1' - if(result.bool) player.addTempSkill('qiaoshui3',{player:'phaseUseAfter'}); - else{ - player.addTempSkill('qiaoshui2'); - player.addTempSkill('olqiaoshui_used'); - } - }, - subSkill:{ - used:{ - charlotte:true, - mark:true, - marktext:'', - intro:{content:'被迫闭嘴'}, - }, - }, - }, - //界凌统 - olxuanfeng:{ - audio:'xuanfeng', - audioname:['boss_lvbu3'], - audioname2:{ - lingtong:'xuanfeng', - ol_lingtong:'xuanfeng_re_lingtong', - }, - trigger:{ - player:['loseAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], - }, - filter:function(event,player){ - var evt=event.getl(player); - return evt&&(evt.es.length||evt.cards2.length>1); - }, - direct:true, - content:function(){ - 'step 0' - event.count=2; - event.logged=false; - 'step 1' - player.chooseTarget(get.prompt('olxuanfeng'),'弃置一名其他角色的一张牌',function(card,player,target){ - if(player==target) return false; - return target.countDiscardableCards(player,'he'); - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }); - 'step 2' - if(result.bool){ - if(!event.logged){ - player.logSkill('olxuanfeng',result.targets); - event.logged=true; - } - else player.line(result.targets[0],'green'); - player.discardPlayerCard(result.targets[0],'he',true); - event.count--; - } - else event.finish(); - 'step 3' - if(event.count) event.goto(1); - }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,3]; - } - }, - reverseEquip:true, - noe:true - }, - }, - xuanfeng_re_lingtong:{audio:2}, ollianhuan:{ audio:'xinlianhuan', audioname:['ol_pangtong'], @@ -3534,8 +3453,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return event.card&&event.card.name=='sha'&&event.player.isIn()&&player.countCards('he')>0; }, check:function(event,player){ - if(event.player.hasSkill('xinleiji')) return get.attitude(player,event.player)>0; - return true; + let att=get.attitude(player,event.player); + if(event.player.hasSkill('xinleiji')) return att>0; + if(att>0||event.player.isHealthy()) return true; + if(!event.source) return true; + att=get.attitude(player,event.source); + return att<=0||event.source.isTurnedOver(); }, prompt2:'令其进行判定,然后你可根据判定结果,弃置一张牌并令其执行对应效果。', content:function(){ @@ -3556,7 +3479,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ case 'diamond': if(target.isIn()){ str+=(',令'+strt+'摸两张牌'); - goon=get.effect(target,{name:'wuzhong'},player,player); + goon=2*get.effect(target,{name:'draw'},player,player); } break; case 'spade': @@ -5909,7 +5832,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('relongyin_order'); }, onremove:(player)=>{ - game.removeGlobalSkill('relongyin_order'); + if(!game.hasPlayer(current=>current.hasSkill('relongyin'),true)) game.removeGlobalSkill('relongyin_order'); }, trigger:{global:'useCard'}, direct:true, @@ -5998,7 +5921,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, trigger:{player:'dieAfter'}, filter:(event,player)=>{ - return !game.hasPlayer(current=>current.hasSkill('relongyin')); + return !game.hasPlayer(current=>current.hasSkill('relongyin'),true); }, silent:true, forceDie:true, @@ -6587,7 +6510,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, true )) return 6.5 - get.value(card, player); - if (Math.random() * target.countCards('hs') < 1 || player.needsToDiscard(-ui.selected.cards.length)) return 6 - get.value(card, player); + if (Math.random() * target.countCards('hs') < 1 || player.needsToDiscard(0,(i,player)=>{ + return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); + })) return 6 - get.value(card, player); return 0; } return 6.3 - get.value(card); @@ -8680,6 +8605,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.getEquips(3).length>0||player.getEquips(4).length>0) return Infinity; }, }, + locked:false, enable:'phaseUse', usable:1, position:'he', @@ -10195,7 +10121,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ "step 0" - var fang=player.countMark('olfangquan2')==0&&player.hp>=2&&player.countCards('h')<=player.hp+1; + var fang=player.countMark('olfangquan2')==0&&player.hp>=2&&player.countCards('h')<=player.hp+2; player.chooseBool(get.prompt2('olfangquan')).set('ai',function(){ if(!_status.event.fang) return false; return game.hasPlayer(function(target){ @@ -11198,7 +11124,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ useShan:true, effect:{ target:function(card,player,target,current){ - let name='sha'; + let name; if(typeof card=='object'){ if(card.viewAs) name=card.viewAs; else name=get.name(card); @@ -11664,45 +11590,40 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function (){ 'step 0' - player.gainPlayerCard(get.prompt('new_liyu',trigger.player),trigger.player,'hej','visibleMove').set('ai',function(card){ - var player=_status.event.player; - var evt=_status.event.target; - if(get.attitude(player,evt)>0&&get.position(card)=='j') return 4+get.value(card); - if(get.type(card)=='equip'){ - if(get.attitude(player,evt)>0&&game.hasPlayer(function(current){ - return (player.canUse({name:'juedou'},current)&¤t!=evt.target&&get.effect(current,{name:'juedou'},player,player)>2); - })){ - return 5; - } - else if(game.hasPlayer(function(current){ - return (player.canUse({name:'juedou'},current)&¤t!=evt&¤t!=player&&get.effect(current,{name:'juedou'},player,player)<0); - })){ - return 1; - } - else return 4; - } + player.gainPlayerCard(get.prompt('new_liyu',trigger.player),trigger.player,'hej','visibleMove').set('ai',function(button){ + var player=_status.event.player,target=_status.event.target; + if(get.attitude(player,target)>0&&get.position(button.link)==='j') return 4+get.value(button.link); + if(get.type(button.link)==='equip') return _status.event.juedou; return 3; - }).set('logSkill',['new_liyu',trigger.player]); + }).set('juedou',(()=>{ + if(get.attitude(player,trigger.player)>0&&game.hasPlayer(function(current){ + return (player.canUse({name:'juedou'},current)&¤t!=trigger.player&¤t!=player&&get.effect(current,{name:'juedou'},player,_status.event.player)>2); + })) return 5; + if(game.hasPlayer(function(current){ + return (player.canUse({name:'juedou'},current)&¤t!=trigger.player&¤t!=player&&get.effect(current,{name:'juedou'},player,_status.event.player)<0); + })) return 1; + return 4; + })()).set('logSkill',['new_liyu',trigger.player]); 'step 1' if(result.bool){ if(get.type(result.cards[0])!='equip'){ trigger.player.draw(); event.finish(); } - else{ - if(!game.hasPlayer(function(current){ - return current!=player&¤t!=trigger.player&&player.canUse('juedou',current); - })){ - event.finish(); - return; - } - trigger.player.chooseTarget(true,function(card,player,target){ - var evt=_status.event.getParent(); - return evt.player.canUse({name:'juedou'},target)&&target!=_status.event.player; - },'请选择一名角色,视为'+get.translation(player)+'对其使用【决斗】').set('ai',function(target){ - var evt=_status.event.getParent(); - return get.effect(target,{name:'juedou'},evt.player,_status.event.player)-2; - }); + else{ + if(!game.hasPlayer(function(current){ + return current!=player&¤t!=trigger.player&&player.canUse('juedou',current); + })){ + event.finish(); + return; + } + trigger.player.chooseTarget(true,function(card,player,target){ + var evt=_status.event.getParent(); + return evt.player.canUse({name:'juedou'},target)&&target!=_status.event.player; + },'请选择一名角色,视为'+get.translation(player)+'对其使用【决斗】').set('ai',function(target){ + var evt=_status.event.getParent(); + return get.effect(target,{name:'juedou'},evt.player,_status.event.player)-2; + }); } } else event.finish(); @@ -11847,12 +11768,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!target.hasFriend()) return; var num=1; if(get.attitude(player,target)>0){ - if(player.needsToDiscard()){ - num=0.7; - } - else{ - num=0.5; - } + if(player.needsToDiscard()) num=0.7; + else num=0.5; } if(player.hp>=4) return [1,num*2]; if(target.hp==3) return [1,num*1.5]; @@ -12189,7 +12106,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return player!=target; }, ai1:function(card){ - if(get.attitude(_status.event.player,_status.currentPhase)<0&&_status.currentPhase.needsToDiscard()&&card.name!='du') return -1; + if(card.name!='du'&&get.attitude(_status.event.player,_status.currentPhase)<0&&_status.currentPhase.needsToDiscard()) return -1; for(var i=0;iget.attitude(target,i)>0)); if(type=='trick'){ if(!get.tag(card,'multitarget')||get.info(card).singleCard){ - if(get.tag(card,'damage')){ - if(nh<3||target.hp<=2) return 0.8; - } + if(get.tag(card,'damage')) return [1.5,nh-1]; return [1,nh]; } } - else if(type=='delay'){ - return [0.5,0.5]; - } + else if(type=='delay') return [0.5,0.5]; }, } }, @@ -13751,12 +13663,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!target.hasFriend()) return; var num=1; if(get.attitude(player,target)>0){ - if(player.needsToDiscard()){ - num=0.7; - } - else{ - num=0.5; - } + if(player.needsToDiscard()) num=0.7; + else num=0.5; } if(player.hp>=4) return [1,num*2]; if(target.hp==3) return [1,num*1.5]; @@ -13998,19 +13906,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, zhaxiang:{ + audio:2, + audioname:['ol_sb_jiangwei'], trigger:{player:'loseHpEnd'}, forced:true, - audio:2, content:function(){ - var num=trigger.num; - player.draw(3*num); - if(_status.currentPhase==player){ - if(!player.storage.zhaxiang2) player.storage.zhaxiang2=0; - player.storage.zhaxiang2+=num; - player.addTempSkill('zhaxiang2',{player:'phaseAfter'}); + 'step 0' + event.count=trigger.num; + 'step 1' + event.count--; + player.draw(3); + if(player.isPhaseUsing()){ + player.addTempSkill('zhaxiang2'); + player.addMark('zhaxiang2',1,false); } - else{ - game.trySkillAudio('zhaxiang',player); + 'step 2' + if(event.count>0&&player.hasSkill('zhaxiang')&&!get.is.blocked('zhaxiang',player)){ + player.logSkill('zhaxiang'); + event.goto(1); } }, ai:{ @@ -14041,15 +13954,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(card.name=='sha') return num+player.storage.zhaxiang2; } }, + charlotte:true, onremove:true, + audio:'zhaxiang', + audioname:['ol_sb_jiangwei'], trigger:{player:'useCard'}, - forced:true, filter:function(event,player){ return event.card&&event.card.name=='sha'&&get.color(event.card)=='red'; }, + forced:true, content:function(){ trigger.directHit.addArray(game.players); }, + intro:{content:'
  • 使用【杀】的次数上限+#
  • 使用红色【杀】无距离限制且不能被【闪】响应'}, ai:{ directHit_ai:true, skillTagFilter:function(player,tag,arg){ @@ -14369,7 +14286,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ "step 0" - var fang=player.countMark('fangquan2')==0&&player.hp>=2&&player.countCards('h')<=player.hp+1; + var fang=player.countMark('fangquan2')==0&&player.hp>=2&&player.countCards('h')<=player.maxHp+1; player.chooseBool(get.prompt2('refangquan')).set('ai',function(){ if(!_status.event.fang) return false; return game.hasPlayer(function(target){ @@ -14728,7 +14645,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ threaten:1.5, }, trigger:{source:'damageEnd'}, - locked:true, + locked:false, forced:true, filter:function(event,player){ if(event.name=='chooseToUse') return player.hasCard(card=>get.suit(card)=='spade','hs'); @@ -15030,7 +14947,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qianxin_info:'觉醒技,当你造成一次伤害后,若你已受伤,你须减1点体力上限,并获得技能“荐言”。', jianyan_info:'出牌阶段限一次,你可以声明一种牌的类别或颜色,并亮出牌库中第一张符合你声明的牌,然后你令一名男性角色获得此牌。', rekurou_info:'出牌阶段限一次,你可以弃置一张牌,然后失去1点体力。', - zhaxiang_info:'锁定技,每当你失去1点体力后,你摸三张牌。然后若此时是你的出牌阶段,则直到回合结束,你使用红色【杀】无距离限制且不能被【闪】响应,你可以额外使用一张【杀】。', + zhaxiang_info:'锁定技。当你失去1点体力后,你摸三张牌。然后若此时是你的出牌阶段,则你本回合获得此下效果:使用【杀】的次数上限+1,使用红色【杀】无距离限制且不能被【闪】响应。', qiaomeng_info:'当你使用黑色【杀】对一名角色造成伤害后,你可以弃置该角色装备区里的一张牌,若此牌是坐骑牌,你于此牌置入弃牌堆后获得之。', reyicong_info:'锁定技,你计算与其他角色的距离时-1。若你的体力值不大于2,则其他角色计算与你的距离时+1。', refankui_info:'每当你受到1点伤害后,你可以获得伤害来源的一张牌。', @@ -15078,7 +14995,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_caopi:'界曹丕', re_caopi_prefix:'界', oljiuchi:'酒池', - oljiuchi_info:'你可以将一张黑桃手牌当做【酒】使用。锁定技,你使用【酒】无次数限制,且当你于回合内使用带有【酒】效果的【杀】造成伤害后,你令你的〖崩坏〗失效直到回合结束。', + oljiuchi_info:'你可以将一张黑桃手牌当做【酒】使用。你使用【酒】无次数限制,且当你于回合内使用带有【酒】效果的【杀】造成伤害后,你令你的〖崩坏〗失效直到回合结束。', repolu:'破虏', repolu_info:'当你杀死一名角色/死亡时,你可以令任意名角色摸X+1张牌。(X为你此前发动过〖破虏〗的次数)', rexingshang:'行殇', @@ -15634,19 +15551,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ caoren_prefix:'界', ollianhuan:'连环', ollianhuan_info:'你可以将一张♣牌当【铁索连环】使用或重铸。你使用【铁索连环】选择目标后,可以给此牌增加一个目标。', - ol_lingtong:'OL界凌统', - ol_lingtong_prefix:'OL界', - olxuanfeng:'旋风', - olxuanfeng_info:'当你一次性失去至少两张牌后,或失去装备区的牌后,你可以依次弃置一至两名其他角色的共计两张牌。', re_lidian:'界李典', gz_re_lidian:'李典', re_lidian_prefix:'界', re_xushu:'界徐庶', re_xushu_prefix:'界', - ol_jianyong:'OL界简雍', - ol_jianyong_prefix:'OL界', - olqiaoshui:'巧说', - olqiaoshui_info:'出牌阶段,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,此技能于本回合失效且本回合你不能使用锦囊牌。', refresh_standard:'界限突破·标', refresh_feng:'界限突破·风', diff --git a/character/sb.js b/character/sb.js index a44b548af..4c72a4ced 100644 --- a/character/sb.js +++ b/character/sb.js @@ -7,7 +7,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ character:{ sb_huangyueying:['female','shu',3,['sbjizhi','sbqicai']], sb_sp_zhugeliang:['male','shu',3,['sbhuoji','sbkanpo']], - sb_zhugeliang:['male','shu',3,['sbguanxing','sbkongcheng'],['unseen']], + sb_zhugeliang:['male','shu',3,['sbguanxing','sbkongcheng']], sb_zhanghe:['male','wei',4,['sbqiaobian']], sb_yujin:['male','wei',4,['sbxiayuan','sbjieyue']], sb_huaxiong:['male','qun','3/4/1',['new_reyaowu','sbyangwei']], @@ -46,7 +46,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, characterSort:{ sb:{ - sb_zhi:['sb_sunquan','sb_zhouyu','sb_zhangjiao','sb_caocao','sb_zhenji','sb_liubei','sb_daqiao','sb_liubiao','sb_sp_zhugeliang'], + sb_zhi:['sb_sunquan','sb_zhouyu','sb_zhangjiao','sb_caocao','sb_zhenji','sb_liubei','sb_daqiao','sb_liubiao','sb_sp_zhugeliang','sb_zhugeliang'], sb_shi:['sb_xuhuang','sb_machao','sb_fazheng','sb_chengong','sb_diaochan','sb_pangtong','sb_zhanghe'], sb_tong:['liucheng','sp_yangwan','sb_xiahoushi','sb_zhangfei','sb_zhaoyun','sb_sunce','sb_zhurong','sb_xiaoqiao'], sb_yu:['sb_yujin','sb_lvmeng','sb_huangzhong','sb_huanggai','sb_zhouyu','sb_caoren','sb_ganning','sb_yl_luzhi','sb_huangyueying'], @@ -61,6 +61,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(get.type2(card)=='trick') return true; }, }, + locked:false, getLimit:3, audio:2, enable:'phaseUse', @@ -273,44 +274,48 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, //诸葛亮 sbhuoji:{ - audio:2, - enable:'phaseUse', - filterTarget:lib.filter.notMe, - prompt:'选择一名其他角色,对其与其势力相同的所有其他角色各造成1点火属性伤害', - usable:1, - line:'fire', - content:function(){ - 'step 0' - target.damage('fire'); - 'step 1' - var targets=game.filterPlayer(current=>{ - if(current==player||current==target) return false; - return current.group==target.group; - }); - if(targets.length){ - game.delayx(); - player.line(targets,'fire'); - targets.forEach(i=>i.damage('fire')); - } - }, - ai:{ - order:7, - fireAttack:true, - result:{ - target:function(player,target){ - var att=get.attitude(player,target); - return get.sgn(att)*game.filterPlayer(current=>{ - if(current==player) return false; + audio:3, + dutySkill:true, + derivation:['sbguanxing','sbkongcheng'], + group:['sbhuoji_fire','sbhuoji_achieve','sbhuoji_fail','sbhuoji_mark'], + subSkill:{ + fire:{ + audio:'sbhuoji1', + enable:'phaseUse', + filterTarget:lib.filter.notMe, + prompt:'选择一名其他角色,对其与其势力相同的所有其他角色各造成1点火属性伤害', + usable:1, + line:'fire', + content:function(){ + 'step 0' + target.damage('fire'); + 'step 1' + var targets=game.filterPlayer(current=>{ + if(current==player||current==target) return false; return current.group==target.group; - }).reduce((num,current)=>num+get.damageEffect(current,player,player,'fire'),0); + }); + if(targets.length){ + game.delayx(); + player.line(targets,'fire'); + targets.forEach(i=>i.damage('fire')); + } + }, + ai:{ + order:7, + fireAttack:true, + result:{ + target:function(player,target){ + var att=get.attitude(player,target); + return get.sgn(att)*game.filterPlayer(current=>{ + if(current==player) return false; + return current.group==target.group; + }).reduce((num,current)=>num+get.damageEffect(current,player,player,'fire'),0); + }, + }, }, }, - }, - derivation:['sbguanxing','sbkongcheng'], - group:['sbhuoji_achieve','sbhuoji_fail','sbhuoji_mark'], - subSkill:{ achieve:{ - audio:'sbhuoji', + audio:'sbhuoji2', trigger:{player:'phaseZhunbeiBegin'}, filter:function(event,player){ return player.getAllHistory('sourceDamage',evt=>evt.hasNature('fire')).reduce((num,evt)=>num+evt.num,0)>=game.players.length+game.dead.length; @@ -334,7 +339,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, fail:{ - audio:'sbhuoji', + audio:'sbhuoji3', trigger:{player:'dying'}, forced:true, locked:false, @@ -364,20 +369,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, + sbhuoji1:{audio:true}, + sbhuoji2:{audio:true}, + sbhuoji3:{audio:true}, sbkanpo:{ + init:function(player){ + if(!player.storage.sbkanpo){ + player.storage.sbkanpo=[10,[],[]]; + player.markSkill('sbkanpo'); + } + }, audio:2, trigger:{global:'roundStart'}, + filter:function(event,player){ + var storage=player.storage.sbkanpo; + return storage[0]||storage[1].length; + }, forced:true, locked:false, - get getNumber(){ - return 3; - }, content:function*(event,map){ - var player=map.player; - var storage=player.getStorage('sbkanpo').slice(); - if(storage.length){ - player.unmarkAuto('sbkanpo',storage); - } + var player=map.player,storage=player.storage.sbkanpo; + var sum=storage[0]; + storage[1]=[]; + player.markSkill('sbkanpo'); + if(!sum) return; const list=get.inpileVCardList(info=>{ if(info[2]=='sha'&&info[3]) return false; return info[0]!='equip'; @@ -410,7 +425,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }; if(event.isMine()) func(); else if(event.isOnline()) event.player.send(func); - var result=yield player.chooseButton(['看破:是否记录三个牌名?',[list,'vcard']],[1,3],true).set('ai',function(button){ + var result=yield player.chooseButton(['看破:是否记录至多'+get.cnNumber(sum)+'个牌名?',[list,'vcard']],[1,sum],true).set('ai',function(button){ + if(ui.selected.buttons.length>=Math.max(3,game.countPlayer()/2)) return 0; switch(button.link[2]){ case 'wuxie':return 5+Math.random(); case 'sha':return 5+Math.random(); @@ -426,7 +442,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }).set('filterButton',button=>{ return !_status.event.names.includes(button.link[2]); - }).set('names',storage).set('custom',{ + }).set('names',storage[2]).set('custom',{ add:{ confirm:function(bool){ if(bool!=true) return; @@ -480,24 +496,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); if(result.bool){ var names=result.links.map(link=>link[2]); - player.setStorage('sbkanpo',names); - player.markSkill('sbkanpo'); + storage[0]-=names.length; + storage[1]=names; + storage[2]=names; } + else storage[2]=[]; + player.markSkill('sbkanpo'); }, marktext:'破', intro:{ markcount:function(storage,player){ - if(player.isUnderControl(true)) return storage.length; + if(player.isUnderControl(true)) return storage[1].length; return '?'; }, mark:function(dialog,content,player){ if(player.isUnderControl(true)){ const storage=player.getStorage('sbkanpo'); - dialog.addText('已记录牌名:'); - dialog.addSmall([storage,'vcard']); - } - else{ - return `${get.translation(player)}记录了一些牌名`; + const sum=storage[0]; + const names=storage[1]; + dialog.addText('剩余可记录'+sum+'次牌名'); + if(names.length){ + dialog.addText('已记录牌名:'); + dialog.addSmall([names,'vcard']); + } } }, }, @@ -534,9 +555,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, logTarget:'player', content:function(){ - player.unmarkAuto('sbkanpo',[trigger.card.name]); + player.storage.sbkanpo[1].remove(trigger.card.name); + player.markSkill('sbkanpo'); trigger.targets.length=0; trigger.all_excluded=true; + player.draw(); }, }, }, @@ -545,7 +568,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, filter:function(event,player){ - return event.name=='phaseZhunbei'||(player.hasSkill('sbguanxing_on')&&player.countCards('s',card=>card.hasGaintag('sbguanxing'))); + var bool=player.hasCards(card=>card.hasGaintag('sbguanxing'),'s'); + if(event.name=='phaseZhunbei'){ + var num=player.countMark('sbguanxingx'); + return bool||num<=3; + } + return bool&&player.hasSkill('sbguanxing_on'); }, forced:true, locked:false, @@ -555,16 +583,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.goto(2); return; } + player.addMark('sbguanxingx',1,false); var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing')); if(cards.length) player.loseToDiscardpile(cards); - var bool=player.getAllHistory('useSkill',evt=>evt.skill=='sbguanxing').length>1; - event.num=Math.min(7,bool?cards.length+1:7); + var num=player.countMark('sbguanxingx')-1; + event.num=Math.max(0,7-2*num); 'step 1' - var cards2=get.cards(num); - player.$gain2(cards2,false); - game.log(player,'将',cards2,'置于了武将牌上'); - player.loseToSpecial(cards2,'sbguanxing').visible=true; - player.markSkill('sbguanxing'); + if(num){ + var cards2=get.cards(num); + player.$gain2(cards2,false); + game.log(player,'将',cards2,'置于了武将牌上'); + player.loseToSpecial(cards2,'sbguanxing').visible=true; + player.markSkill('sbguanxing'); + } 'step 2' var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing')); if(cards.length){ @@ -675,7 +706,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ marktext:'☯', intro:{ content:function(storage,player){ - if(storage) return '你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸一张牌。'; + if(storage) return '你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。'; return '出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。'; }, }, @@ -705,7 +736,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ check:function(card){ return 6.5-get.value(card); }, - prompt:'弃置与攻击范围内的一名角色体力值之差(至少为1)张与“任”颜色相同的牌,对其造成1点伤害。', + prompt:'弃置与攻击范围内的一名角色体力值之差(至少为1)张与“任”颜色相同的牌,对其造成1点伤害', content:function(){ player.changeZhuanhuanji('sbzhenliang'); target.damage('nocard'); @@ -731,7 +762,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ 'step 0' - player.chooseTarget(get.prompt('sbzhenliang'),'令一名角色摸一张牌').set('ai',function(target){ + player.chooseTarget(get.prompt('sbzhenliang'),'令一名角色摸两张牌').set('ai',function(target){ if(target.hasSkillTag('nogain')) return 0.1; var att=get.attitude(player,target); return att*(Math.max(5-target.countCards('h'),2)+3); @@ -741,7 +772,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var target=result.targets[0]; player.changeZhuanhuanji('sbzhenliang'); player.logSkill('sbzhenliang',target); - target.draw(); + target.draw(2); } }, }, @@ -1096,7 +1127,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{player:'useCardToPlayered'}, filter:function(event,player){ - return event.targets.length==1&&event.card.name=='sha'&&!player.hasSkillTag('noCompareSource')&&event.target.countCards('h')>0&&!event.target.hasSkillTag('noCompareTarget'); + return event.targets.length==1&&event.card.name=='sha'&&player.canCompare(event.target,true); }, check:function(event,player){ return get.attitude(player,event.target)<=0||game.hasPlayer(current=>get.damageEffect(current,player,player)>0); @@ -3963,7 +3994,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' trigger.source.chooseBool('樵拾:是否令'+get.translation(player)+'回复'+trigger.num+'点体力,然后你摸两张牌?').set('ai',()=>{ return _status.event.bool; - }).set('bool',get.recoverEffect(player,trigger.source,trigger.source)+get.effect(trigger.source,{name:'wuzhong'},trigger.source)>5); + }).set('bool',get.recoverEffect(player,trigger.source,trigger.source)+2*get.effect(trigger.source,{name:'draw'},trigger.source)>5); 'step 1' if(result.bool){ player.logSkill('sbqiaoshi'); @@ -4018,7 +4049,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).length; player.chooseTarget(get.prompt('sbyanyu'),'令一名其他角色摸'+get.cnNumber(event.num)+'张牌',lib.filter.notMe).set('ai',target=>{ var player=_status.event.player; - return get.effect(target,{name:'wuzhong'},player,player); + return get.effect(target,{name:'draw'},player,player); }); 'step 1' if(result.bool){ @@ -4446,6 +4477,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sbzhiheng:{ audio:2, audioname:['shen_caopi'], + locked:false, mod:{ aiOrder:function(player,card,num){ if(num<=0||get.itemtype(card)!=='card'||get.type(card)!=='equip') return num; @@ -4812,7 +4844,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player:function(player){ var num=0,targets=game.filterPlayer(current=>current.hasMark('sbjieyin_mark')); for(var current of targets){ - num+=get.effect(current,{name:'wuzhong'},player,player); + num+=2*get.effect(current,{name:'draw'},player,player); } if(num>0) return 3; return 1; @@ -5500,7 +5532,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.countMark('sbjiang')) str+='X次。你可以将所有手牌当【决斗】使用(X为场上其他吴势力角色数+1)。'; else str+='一次。你可以将所有手牌当【决斗】使用。'; return str; - } + }, + sbzhenliang:function(player){ + var storage=player.storage.sbzhenliang; + var str='转换技。'; + if(!storage) str+=''; + str+='阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。'; + if(!storage) str+=''; + if(storage) str+=''; + str+='阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。'; + if(storage) str+=''; + return str; + }, }, translate:{ sb_zhanghe_prefix:'谋', @@ -5712,24 +5755,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sb_yl_luzhi:'谋卢植', sb_yl_luzhi_prefix:'谋', sbzhenliang:'贞良', - sbzhenliang_info:'转换技。阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸一张牌。', + sbzhenliang_info:'转换技。阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。', sb_xiaoqiao:'谋小乔', sb_xiaoqiao_prefix:'谋', sbtianxiang:'天香', sbtianxiang_info:'①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸等量的牌。', sbtianxiang_info_versus_two:'①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸X张牌(X为移去的“天香”标记数+2)。', - sb_sp_zhugeliang:'谋诸葛亮', + sb_sp_zhugeliang:'谋卧龙', sb_sp_zhugeliang_prefix:'谋', sb_zhugeliang:'谋诸葛亮', sb_zhugeliang_prefix:'谋', sbhuoji:'火计', sbhuoji_info:'使命技。①使命:出牌阶段限一次。你可以对一名其他角色造成1点火焰伤害,然后你对所有与其势力相同的不为其的其他角色各造成1点火焰伤害。②成功:准备阶段,若你本局游戏已造成的火焰伤害不小于本局游戏总角色数,则你失去〖火计〗和〖看破〗,然后获得〖观星〗和〖空城〗。③失败:使命成功前进入濒死状态。', sbkanpo:'看破', - sbkanpo_info:'①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录共计三个未于本次清除过的非装备牌牌名(对其他角色不可见)。②当其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录,令此牌无效。', + sbkanpo_info:'①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录10个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。', sbguanxing:'观星', - sbguanxing_info:'①准备阶段,你将所有“星”置入弃牌堆,将牌堆顶的X张牌置于你的武将牌上,称为“星”。然后你可以将任意张“星”置于牌堆顶(X为你此次移去的“星”数+1且至多为7,若你此前未发动过〖观星①〗则X为7)。②结束阶段,若你未于本回合的准备阶段将“星”置于过牌堆顶,你可以将任意张“星”置于牌堆顶。③你可以如手牌般使用或打出“星”。', + sbguanxing_info:'①准备阶段,你将所有“星”置入弃牌堆,将牌堆顶的X张牌置于你的武将牌上,称为“星”(X为7-此前发动〖观星①〗次数的两倍,且X至少为0)。然后你可以将任意张“星”置于牌堆顶。②结束阶段,若你未于本回合的准备阶段将“星”置于过牌堆顶,你可以将任意张“星”置于牌堆顶。③你可以如手牌般使用或打出“星”。', sbkongcheng:'空城', - sbkongcheng_info:'锁定技。当你受到伤害时,若你有〖观星〗,且若你:有“星”,你判定,若结果点数不大于你的“星”数,此伤害-1;没有“星”,此伤害+1。', + sbkongcheng_info:'锁定技。当你受到伤害时,若你拥有技能〖观星〗,且若你:有“星”,你判定,若结果点数不大于你的“星”数,此伤害-1;没有“星”,此伤害+1。', sb_huangyueying:'谋黄月英', sb_huangyueying_prefix:'谋', sbqicai:'奇才', diff --git a/character/shenhua.js b/character/shenhua.js index 4113463b9..67081054b 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -3439,11 +3439,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "step 2" if(result.bool){ player.chooseTarget(true,'请选择进行额外回合的目标角色',lib.filter.notMe).ai=function(target){ - if(target.hasJudge('lebu')) return -1; - if(get.attitude(player,target)>4){ - return get.threaten(target)/Math.sqrt(target.hp+1)/Math.sqrt(target.countCards('h')+1); - } - return -1; + if(target.hasJudge('lebu')||get.attitude(player,target)<=0) return -1; + if(target.isTurnedOver()) return 0.18; + return get.threaten(target)/Math.sqrt(target.hp+1)/Math.sqrt(target.countCards('h')+1); }; } else event.finish(); @@ -3538,7 +3536,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.countCards('h')>player.hp+1){ check=false; } - else if(player.countCards('h',{name:['wuzhong']})){ + else if(player.countCards('h',{name:'wuzhong'})){ check=false; } else{ @@ -3665,6 +3663,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ target:function(card,player,target,current){ + if(typeof card==='object'&&get.name(card)==='sha'&&target.mayHaveShan(player,'use')) return [0.6,0.75]; if(!target.hasFriend()&&!player.hasUnknown()) return; if(_status.currentPhase==target) return; if(card.name!='shuiyanqijunx'&&get.tag(card,'loseCard')&&target.countCards('he')){ @@ -3952,8 +3951,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(target.isMin()) return false; return player!=target&&target.canEquip(card); }, - content:function(){ - target.equip(cards[0]); + async content(event, trigger, player){ + event.target.equip(event.cards[0]); player.draw(); }, discard:false, @@ -4147,6 +4146,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, logTarget:'source', ai:{ + maixie_defend:true, threaten:function(player,target){ if(target.hp==1) return 0.2; return 1.5; @@ -4154,7 +4154,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ effect:{ target:function(card,player,target,current){ if(!target.hasFriend()) return; - if(target.hp<=1&&get.tag(card,'damage')) return [1,0,0,-2]; + if(target.hp<=1&&get.tag(card,'damage')){ + if(player.hasSkillTag('jueqing',false,target)) return 3; + return [1,0,0,-3*get.threaten(player)]; + } } } } @@ -4823,12 +4826,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ threaten:2, - ai:{ - noh:true, - skillTagFilter:function(player,tag){ - if(tag=='noh'){ - if(player.countCards('h')!=2) return false; - } + noh:true, + skillTagFilter:function(player,tag){ + if(tag=='noh'){ + if(player.countCards('h')!=2) return false; } } } @@ -5351,15 +5352,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ wansha2:{ mod:{ cardSavable:function(card,player){ - if(!_status.currentPhase) return; - if(_status.currentPhase.isIn()&&_status.currentPhase.hasSkill('wansha')&&_status.currentPhase!=player){ - if(card.name=='tao'&&!player.isDying()) return false; + if(card.name=='tao'&&_status.currentPhase&&_status.currentPhase.isIn()&&_status.currentPhase.hasSkill('wansha')&&_status.currentPhase!=player){ + if(!player.isDying()) return false; } }, cardEnabled:function(card,player){ - if(!_status.currentPhase) return; - if(_status.currentPhase.isIn()&&_status.currentPhase.hasSkill('wansha')&&_status.currentPhase!=player){ - if(card.name=='tao'&&!player.isDying()) return false; + if(card.name=='tao'&&_status.currentPhase&&_status.currentPhase.isIn()&&_status.currentPhase.hasSkill('wansha')&&_status.currentPhase!=player){ + if(!player.isDying()) return false; } } } diff --git a/character/shiji.js b/character/shiji.js index 7845bbdbc..239376ddf 100644 --- a/character/shiji.js +++ b/character/shiji.js @@ -364,7 +364,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.list=list; var num1=0,num2=0,num3=0; for(var target of list){ - num1+=get.effect(target,{name:'wuzhong'},player,player); + num1+=2*get.effect(target,{name:'draw'},player,player); num2+=get.recoverEffect(target,player,player); } trigger.player.chooseControl('摸两张牌','回复体力','cancel2').set('prompt','整肃奖励:请选择'+get.translation(list)+'的整肃奖励').set('ai',function(){ @@ -437,13 +437,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.control=='cancel2'){event.finish();return;} player.chooseTarget('整军:是否令一名其他角色也回复1点体力或摸两张牌?',lib.filter.notMe).set('ai',function(target){ var player=_status.event.player; - return Math.max(get.effect(target,{name:'wuzhong'},target,player),get.recoverEffect(target,target,player)); + return Math.max(2*get.effect(target,{name:'draw'},target,player),get.recoverEffect(target,target,player)); }); 'step 2' if(result.bool){ var target=result.targets[0]; event.target=target; - var num1=get.effect(target,{name:'wuzhong'},target,player); + var num1=2*get.effect(target,{name:'draw'},target,player); var num2=get.recoverEffect(target,target,player); player.line(target); if(target.isHealthy()) result.index=0; @@ -1260,7 +1260,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spxizhan:{ audio:4, group:'spxizhan_effect', - locked:true, + locked:false, subSkill:{ spfangzong:{charlotte:true}, effect:{ @@ -2134,7 +2134,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rechuhai:{ audio:'chuhai', dutySkill:true, - locked:true, + locked:false, group:['rechuhai_add','rechuhai_achieve','rechuhai_fail','rechuhai_chuhai'], derivation:'zhangming', subSkill:{ @@ -2276,11 +2276,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'phaseUse', usable:1, filter:function(event,player){ - return !player.hasSkillTag('noCompareSource'); + return game.hasPlayer(target=>player.canCompare(target,true)); }, filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0&& - !target.hasSkillTag('noCompareTarget'); + return player.canCompare(target,true); }, content:function(){ 'step 0' @@ -2715,6 +2714,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'useCardAfter'}, dutySkill:true, forced:true, + locked:false, direct:true, filter:function(event,player){ if(!player.storage.xingqi||!player.storage.xingqi.length) return false; @@ -3151,7 +3151,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qingyu:{ audio:3, dutySkill:true, - locked:true, + locked:false, group:['qingyu_achieve','qingyu_fail','qingyu_defend'], subSkill:{ defend:{ @@ -5994,7 +5994,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('spshanxi_bj'); }, onremove:function(player){ - game.removeGlobalSkill('spshanxi_bj'); + if(!game.hasPlayer(current=>current.hasSkill('spshanxi'),true)) game.removeGlobalSkill('spshanxi_bj'); }, trigger:{player:'phaseUseBegin'}, direct:true, diff --git a/character/sp.js b/character/sp.js index f9224f2e3..0c5443ad1 100755 --- a/character/sp.js +++ b/character/sp.js @@ -13,12 +13,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_huben:['duanjiong','ol_mengda',"caohong","xiahouba","zhugeke","zumao","wenpin","litong","mazhong","heqi","quyi","luzhi","zangba","yuejin","dingfeng","wuyan","ol_zhuling","tianyu","huojun",'zhaoyǎn','dengzhong','ol_furong','macheng','ol_zhangyì','ol_zhujun','maxiumatie','luoxian','ol_huban','haopu','ol_qianzhao'], sp_liesi:['mizhu','weizi','ol_liuba','zhangshiping'], sp_default:["sp_diaochan","sp_zhaoyun","sp_sunshangxiang","sp_caoren","sp_jiangwei","sp_machao","sp_caiwenji","jsp_guanyu","jsp_huangyueying","sp_pangde","sp_jiaxu","yuanshu",'sp_zhangliao','sp_ol_zhanghe','sp_menghuo'], - sp_qifu:["caoying",'panshu',"caochun","yuantanyuanshang",'caoshuang','wolongfengchu','guansuo','baosanniang','fengfangnv','jin_zhouchu'], + sp_qifu:['ol_feiyi',"caoying",'panshu',"caochun","yuantanyuanshang",'caoshuang','wolongfengchu','guansuo','baosanniang','fengfangnv','jin_zhouchu'], sp_wanglang:['ol_wanglang','ol_puyuan','ol_zhouqun'], sp_zhongdan:["cuiyan","huangfusong"], sp_guozhan2:["sp_dongzhuo","liqueguosi","zhangren"], sp_others:["hanba","caiyang"], - sp_waitforsort:['ol_luyusheng','ol_pengyang','ol_tw_zhangji','ol_feiyi','ol_dingshangwan','ol_liwan','ol_liuyan'], + sp_waitforsort:['ol_luyusheng','ol_pengyang','ol_tw_zhangji','ol_dingshangwan','ol_liwan','ol_liuyan'], }, }, characterFilter:{ @@ -1584,7 +1584,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return str+parseFloat(num); },''); }, - content:'使用点数大于$的普通锦囊牌额外结算一次', + content:'使用的下一张点数大于$的普通锦囊牌额外结算一次', }, audio:'hezhong', trigger:{player:'useCard'}, @@ -1594,14 +1594,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return typeof num=='number'&&player.getStorage('hezhong_0').some(numx=>num>numx); }, forced:true, + usable:1, content:function(){ + player.unmarkSkill('hezhong_0'); trigger.effectCount++; game.log(trigger.card,'额外结算一次'); }, ai:{ effect:{ player:function(card,player,target){ - if(card.name=='tiesuo') return 'zerotarget'; + if(card.name=='tiesuo'&&(!player.storage.counttrigger||!player.storage.counttrigger.hezhong_0)) return 'zerotarget'; }, }, }, @@ -1618,7 +1620,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return str+parseFloat(num); },''); }, - content:'使用点数小于$的普通锦囊牌额外结算一次', + content:'使用的下一张点数小于$的普通锦囊牌额外结算一次', }, audio:'hezhong', trigger:{player:'useCard'}, @@ -1628,14 +1630,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return typeof num=='number'&&player.getStorage('hezhong_1').some(numx=>num0&&!game.hasGlobalHistory('useCard',evt=>{ + return evt.targets&&evt.targets.includes(target); + })) return 6+eff; return eff; }).set('card',trigger.card); } @@ -3394,9 +3401,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return _status.event.bool; }).set('bool',function(){ var att=get.attitude(trigger.player,player); - var eff=get.effect(player,trigger.card,trigger.player,trigger.player); - if(player.countCards('h')%2==0&&att>0) return true; - if(eff>0) return true; + if(player.countCards('h')%2==0){ + if(att>0) return true; + return false; + } + if(get.effect(player,trigger.card,trigger.player,trigger.player)>0) return true; return false; }()); } @@ -3839,7 +3848,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var fn=function(control){ switch(control){ case '选项一': - return player.getUseValue({name:'wuzhong'})/2; + return player.getUseValue({name:'draw'}); case '选项二': return Math.max.apply(Math,game.filterPlayer().map(current=>{ if(current.hasSkillTag('noh')) return -1; @@ -4958,12 +4967,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, olkangrui:{ audio:2, + init:()=>{ + game.addGlobalSkill('olkangrui_ai'); + }, + onremove:()=>{ + if(!game.hasPlayer(i=>i.hasSkill('olkangrui'),true)) game.removeGlobalSkill('olkangrui_ai'); + }, trigger:{global:'damageEnd'}, filter:function(event,player){ return event.player==_status.currentPhase&&event.player.getHistory('damage').indexOf(event)==0; }, direct:true, - global:'olkangrui_ai', content:function(){ 'step 0' player.chooseControl('cancel2').set('choiceList',[ @@ -5049,15 +5063,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, ai:{ - effect:{ - target:function(card,player,target){ - if(target!=player||!get.tag(card,'damage')) return; - var list=game.filterPlayer(current=>current.hasSkill('olkangrui')&&get.attitude(current,player)>0); - var history=player.getHistory('damage'); - if(!list.length||history.length!=0) return; - return [1,2]; - } + trigger:{player:'dieAfter'}, + filter:()=>{ + return !game.hasPlayer(i=>i.hasSkill('olkangrui'),true); }, + silent:true, + forceDie:true, + content:()=>{ + game.removeGlobalSkill('olkangrui_ai'); + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(target!=player||!get.tag(card,'damage')) return; + var list=game.filterPlayer(current=>current.hasSkill('olkangrui')&&get.attitude(current,player)>0); + var history=player.getHistory('damage'); + if(!list.length||history.length!=0) return; + return [1,2]; + } + } + } } } }, @@ -5137,10 +5162,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } return -1.5; }(); - if(!isLink && target.mayHaveShan() && !player.hasSkillTag('directHit_ai', true, { + if(!isLink && target.mayHaveShan(player,'use') && !player.hasSkillTag('directHit_ai', true, { target: target, card: card - }, true)) return eff / 1.2; + }, true)) return eff * 0.6; return eff; } }, @@ -5418,7 +5443,41 @@ game.import('character',function(lib,game,ui,get,ai,_status){ effect:{ player:function(card,player,target){ if((!card.isCard||!card.cards)&&get.itemtype(card)!='card') return; - if(target&&player!=target&&player.countCards('h')>player.getHandcardLimit()) return [0,0,0,0.5]; + let cs=0; + if(target&&player!=target&&player.countCards('h',i=>{ + if(card===i||card.cards&&card.cards.includes(i)){ + cs++; + return false; + } + return true; + })>player.getHandcardLimit()){ + let targets=[],evt=_status.event.getParent('useCard'); + targets.addArray(ui.selected.targets); + if(evt&&evt.card==card) targets.addArray(evt.targets); + if(targets.length){ + if(targets.length>1||!targets.includes(target)) return 'zeroplayertarget'; + return; + } + let info=get.info(card); + if(!info||info.notarget||!info.filterTarget) return; + let range,select=get.copy(info.selectTarget),filter; + if(select===undefined) range=[1,1]; + else if(typeof select==='number') range=[select,select]; + else if(get.itemtype(select)==='select') range=select; + else if(typeof select==='function') range=select(card,player); + if(info.singleCard) range=[1,1]; + game.checkMod(card,player,range,'selectTarget',player); + if(range[1]<-1) range=[1, 1]; + else if(range[0]<0){ + if(info.filterTarget===true) filter=game.players.length; + else filter=game.countPlayer(current=>{ + return info.filterTarget(card,player,current); + }); + range=[filter,filter]; + } + if(range&&range[0]>1&&range[1]>1) return 'zeroplayertarget'; + return [0,0,0,1]; + } }, }, }, @@ -6895,7 +6954,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else{ var target=trigger.target; - if(trigger.targets.length>1||target.mayHaveShan()) return 0; + if(trigger.targets.length>1||target.mayHaveShan(player,'use')) return 0; } var num=trigger.getParent().baseDamage; var map=trigger.getParent().customArgs,id=target.playerid; @@ -9209,7 +9268,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var player=_status.event.player,target=_status.event.getTrigger().player; if(target.hasCard(function(card){ return lib.filter.canBeDiscarded(card,player,target); - },'he')&&get.effect(target,{name:'guohe_copy2'},player,player)>get.effect(player,{name:'wuzhong'},player,player)/2) return 1; + },'he')&&get.effect(target,{name:'guohe_copy2'},player,player)>get.effect(player,{name:'draw'},player,player)) return 1; return 0; }); 'step 1' @@ -9597,7 +9656,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(num>0) max=Math.max(max,Math.sqrt(Math.min(2,num))*get.effect(target,{name:'guohe_copy2'},player,player)); }, 选项四:function(target){ - max=Math.max(max,get.effect(target,{name:'wuzhong'},player,player)); + max=Math.max(max,2*get.effect(target,{name:'draw'},player,player)); }, }[choice]; game.countPlayer(function(current){ @@ -9628,7 +9687,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }], ['选择一名角色,令其摸两张牌',function(target){ var player=_status.event.player; - return get.effect(target,{name:'wuzhong'},player,player); + return 2*get.effect(target,{name:'draw'},player,player); }] ][index]; var targets=game.filterPlayer(function(current){ @@ -13082,6 +13141,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, spweiwu:{ audio:2, + locked:false, enable:'phaseUse', usable:1, viewAs:{ @@ -14400,12 +14460,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(num>=delta) return 'zeroplayertarget'; } else if(get.tag(card,'respondShan')>0){ - if(current<0&&used==target.getAttackRange()-1&&target.mayHaveShan()){ + if(current<0&&used==target.getAttackRange()-1&&target.mayHaveShan(player)){ return 0.6; } } else if(get.tag(card,'respondSha')>0){ - if(current<0&&used==target.getAttackRange()-1&&target.mayHaveSha()){ + if(current<0&&used==target.getAttackRange()-1&&target.mayHaveSha(player)){ return 0.6; } } @@ -15144,17 +15204,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return target!=player; }).set('ai',function(target){ if(target.hasJudge('lebu')) return 0; - var att=get.attitude(_status.event.player,target); + let att=get.attitude(_status.event.player,target),name=_status.event.cards[0].name; if(att<3) return 0; if(target.hasSkillTag('nogain')) att/=10; - if(target.hasSha()&&_status.event.sha){ - att/=5; - } - if(event.wuxie&&target.needsToDiscard(1)){ - att/=5; - } + if(name==='sha'&&target.hasSha()) att/=5; + if(name==='wuxie'&&target.needsToDiscard(_status.event.cards)) att/=5; return att/(1+get.distance(player,target,'absolute')); - }).set('sha',trigger.cards[0].name=='sha').set('wuxie',trigger.cards[0].name=='wuxie'); + }).set('cards',trigger.cards); 'step 1' if(result.bool){ player.logSkill('yingyuan',result.targets[0]); @@ -15228,19 +15284,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(_status.event.du) return -get.value(card,player,'raw'); else if(_status.event.shuimeng){ if(cardname=='wuzhong'){ - if(player.needsToDiscard(2-ui.selected.cards.length)){ - return 10-get.value(card,player,'raw'); - } + if(player.needsToDiscard(2,(i,player)=>{ + return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); + })) return 10-get.value(card,player,'raw'); } else if(cardname=='guohe'){ - if(player.needsToDiscard(-1-ui.selected.cards.length)){ - return 10-get.value(card,player,'raw'); - } + if(player.needsToDiscard(-1,(i,player)=>{ + return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); + })) return 10-get.value(card,player,'raw'); } return 0; } else if(cardname=='lebu'){ - if(player.needsToDiscard(1-ui.selected.cards.length)){ + if(player.needsToDiscard(1,(i,player)=>{ + return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); + })){ return 8-get.value(card,player,'raw'); } else{ @@ -17420,9 +17478,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 20-num; } else{ - if(_status.event.player.needsToDiscard()){ - return 7-num; - } + if(_status.event.player.needsToDiscard()) return 7-num; } return 0; }, @@ -19976,7 +20032,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } 'step 1' if(result.bool){ - var ideitity=result.links[0]; + var identity=result.links[0]; player.addSkill(identity); player.markSkill('fenxin'); } @@ -21110,6 +21166,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, kunfen:{ audio:2, + audioname:['ol_sb_jiangwei'], trigger:{player:'phaseJieshuBegin'}, locked:function(skill,player){ if(!player||!player.storage.kunfen) return true; @@ -24326,102 +24383,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, }, - "xinfu_xionghuo":{ - group:["xinfu_xionghuo_damage","xinfu_xionghuo_begin","xinfu_xionghuo_init"], - subSkill:{ - begin:{ - audio:'xinfu_xionghuo', - logTarget:'player', - line:false, - forced:true, - trigger:{ - global:"phaseUseBegin", - }, - filter:function (event,player){ - return event.player.countMark('xionghuo')>0&&event.player!=player; - }, - content:function (){ - 'step 0' - trigger.player.removeMark('xionghuo',trigger.player.countMark('xionghuo')); - var list=[1,2,3]; - var num=list.randomGet(); - event.goto(num); - 'step 1' - player.line(trigger.player,'fire'); - trigger.player.damage('fire'); - if(!trigger.player.storage.xionghuo_disable) trigger.player.storage.xionghuo_disable=[]; - trigger.player.storage.xionghuo_disable.push(player); - trigger.player.addTempSkill('xionghuo_disable','phaseAfter'); - event.goto(4); - 'step 2' - player.line(trigger.player,'water'); - trigger.player.loseHp(); - trigger.player.addMark('xionghuo_low',1,false); - trigger.player.addTempSkill('xionghuo_low','phaseAfter'); - event.goto(4); - 'step 3' - player.line(trigger.player,'green'); - var card1=trigger.player.getCards('h').randomGet(); - var card2=trigger.player.getCards('e').randomGet(); - var list=[]; - if(card1) list.push(card1); - if(card2) list.push(card2); - if(list.length>0){ - player.gain(list,trigger.player,'giveAuto','bySelf'); - } - 'step 4' - game.delay(); - }, - }, - damage:{ - audio:"xinfu_xionghuo", - sub:true, - forced:true, - trigger:{ - source:"damageBegin1", - }, - filter:function (event,player){ - return event.player.countMark('xionghuo')>0&&event.player!=player; - }, - content:function (){ - trigger.num++; - }, - }, - init:{ - audio:'xinfu_xionghuo', - trigger:{ - global:"phaseBefore", - player:"enterGame", - }, - forced:true, - locked:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); - }, - content:function(){ - player.addMark("xionghuo",3); - }, - }, - }, + xinfu_xionghuo:{ audio:2, - enable:"phaseUse", + enable:'phaseUse', filter:function(event,player){ - return player.countMark('xionghuo')>0; + return player.countMark('xinfu_xionghuo')>0; }, - filterTarget:function (card,player,target){ - if(target.hasMark('xionghuo')) return false; - return player!=target>0; + filterTarget:function(card,player,target){ + return player!=target&&!target.hasMark('xinfu_xionghuo'); }, - content:function (){ - player.removeMark('xionghuo',1); - target.addMark('xionghuo',1); + content:function(){ + player.removeMark('xinfu_xionghuo',1); + target.addMark('xinfu_xionghuo',1); }, ai:{ order:11, result:{ target:function(player,target){ - if((player.countMark('xionghuo')>=2||!game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)<0&¤t.hasMark('xionghuo'); + if((player.countMark('xinfu_xionghuo')>=2||!game.hasPlayer(function(current){ + return current!=player&&get.attitude(player,current)<0&¤t.hasMark('xinfu_xionghuo'); }))&&player.countCards('h',function(card){ return get.tag(card,'damage')&&player.canUse(card,target,null,true) &&player.getUseValue(card)>0&&get.effect_use(target,card,player)>0 @@ -24432,7 +24412,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ })) return 3/Math.max(1,target.hp); if((!player.hasUnknown()&&game.countPlayer(function(current){ return get.attitude(player,current)<0; - })<=1)||player.countMark('xionghuo')>=2){ + })<=1)||player.countMark('xinfu_xionghuo')>=2){ return -1; } return 0; @@ -24440,7 +24420,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, effect:{ player:function(card,player,target){ - if(player!=target&&get.tag(card,'damage')&&target&&target.hasMark('xionghuo')&&!target.hasSkillTag('filterDamage',null,{ + if(player!=target&&get.tag(card,'damage')&&target&&target.hasMark('xinfu_xionghuo')&&!target.hasSkillTag('filterDamage',null,{ player:player, card:card, })) return [1,0,1,-2]; @@ -24448,63 +24428,124 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, threaten:1.6, }, - }, - xionghuo:{ - marktext:"戾", + marktext:'戾', intro:{ name:'暴戾', - content:"mark", + content:'mark', }, - locked:true, - }, - "xionghuo_disable":{ - mod:{ - playerEnabled:function (card,player,target){ - if(card.name=='sha'&&(player.storage.xionghuo_disable&&player.storage.xionghuo_disable.contains(target))) return false; + group:['xinfu_xionghuo_init','xinfu_xionghuo_damage','xinfu_xionghuo_effect'], + subSkill:{ + init:{ + audio:'xinfu_xionghuo', + trigger:{ + global:"phaseBefore", + player:'enterGame', + }, + filter:function(event,player){ + return event.name!='phase'||game.phaseNumber==0; + }, + forced:true, + locked:false, + content:function(){ + player.addMark('xinfu_xionghuo',3); + }, + }, + damage:{ + audio:"xinfu_xionghuo", + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + return event.player.countMark('xinfu_xionghuo')>0&&event.player!=player; + }, + forced:true, + locked:false, + logTarget:'player', + content:function(){ + trigger.num++; + }, + }, + effect:{ + audio:'xinfu_xionghuo', + trigger:{global:'phaseUseBegin'}, + filter:function(event,player){ + return event.player.countMark('xinfu_xionghuo')>0&&event.player!=player; + }, + line:false, + forced:true, + locked:false, + logTarget:'player', + content:function(){ + 'step 0' + trigger.player.removeMark('xinfu_xionghuo',trigger.player.countMark('xinfu_xionghuo')); + 'step 1' + var num=get.rand(0,2); + switch(num){ + case 0: + player.line(trigger.player,'fire'); + trigger.player.damage('fire'); + trigger.player.addTempSkill('xinfu_xionghuo_disable'); + trigger.player.markAuto('xinfu_xionghuo_disable',[player]); + break; + case 1: + player.line(trigger.player,'water'); + trigger.player.loseHp(); + trigger.player.addMark('xinfu_xionghuo_low',1,false); + trigger.player.addTempSkill('xinfu_xionghuo_low'); + break; + case 2: + player.line(trigger.player,'green'); + var card1=trigger.player.getCards('h').randomGet(); + var card2=trigger.player.getCards('e').randomGet(); + var list=[]; + if(card1) list.push(card1); + if(card2) list.push(card2); + if(list.length) player.gain(list,trigger.player,'giveAuto','bySelf'); + break; + } + 'step 2' + game.delay(); + }, + }, + disable:{ + mod:{ + playerEnabled:function (card,player,target){ + if(card.name=='sha'&&player.getStorage('xinfu_xionghuo_disable').includes(target)) return false; + }, + }, + charlotte:true, + onremove:true, + mark:true, + marktext:'禁', + intro:{content:'不能对$使用【杀】'}, + }, + low:{ + mod:{ + maxHandcard:function (player,num){ + return num-player.countMark('xinfu_xionghuo_low'); + }, + }, + charlotte:true, + onremove:true, + mark:true, + marktext:'减', + intro:{content:'手牌上限-#'}, }, }, - onremove:true, - charlotte:true, - mark:true, - marktext:"禁", - intro:{ - content:"本回合内不能对$使用【杀】", - }, }, - "xionghuo_low":{ - mod:{ - maxHandcard:function (player,num){ - return num-player.countMark('xionghuo_low'); - }, - }, - marktext:"减", - mark:true, - onremove:true, - charlotte:true, - intro:{ - content:"本回合内手牌上限-#", - }, - }, - "xinfu_shajue":{ + xinfu_shajue:{ audio:2, - trigger:{ - global:"dying", - }, - filter:function (event,player){ - return event.player.hp<0&&event.player!=player; + trigger:{global:'dying'}, + filter:function(event,player){ + return event.player!=player; }, forced:true, - //priority:7, - content:function (){ - if(trigger.parent.name=='damage'&&get.itemtype(trigger.parent.cards)=='cards'&&get.position(trigger.parent.cards[0],true)=='o'){ - player.gain(trigger.parent.cards,"gain2"); + content:function(){ + player.addMark('xinfu_xionghuo',1); + if(trigger.player.hp<0&&get.itemtype(trigger.parent.cards)=='cards'&&get.position(trigger.parent.cards[0],true)=='o'){ + player.gain(trigger.parent.cards,'gain2'); } - player.addMark('xionghuo',1); }, }, - xinfu_jianjie:{ - audio:3, - }, + xinfu_jianjie:{audio:3}, jianjie:{ group:["jianjie_use","jianjie_die"], derivation:['jianjie_huoji','jianjie_lianhuan','jianjie_yeyan'], @@ -24550,6 +24591,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.delayx(); } }, + ai:{ + threaten:3, + }, hasMark:(mark,player,target)=>{ if(!target) return player.getStorage('jianjie_'+mark).length>0; return target.getStorage('jianjie_'+mark).contains(player); @@ -24623,17 +24667,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, expose:0.4, - threaten:3, }, }, die:{ audio:'xinfu_jianjie', trigger:{global:'die'}, - forced:true, filter:function(event,player){ const skill=lib.skill.jianjie; return skill.hasMark('huoji',player,event.player)||skill.hasMark('lianhuan',player,event.player); }, + forced:true, + logTarget:'player', content:function(){ 'step 0' if(lib.skill.jianjie.hasMark('huoji',player,trigger.player)){ @@ -24641,7 +24685,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return get.attitude(get.player(),target); }); } - else event.goto(3); + else event.goto(2); 'step 1' if(result.bool){ var target=result.targets[0]; @@ -24666,7 +24710,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.delayx(); } }, - logTarget:'player', }, huoji:{ marktext:'龙', @@ -25477,16 +25520,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "lingren_xingshang_info":"当有角色死亡后,你可以选择一项:1.回复1点体力。2.获得该角色的所有牌。", "xinfu_fujian":"伏间", "xinfu_fujian_info":"锁定技,结束阶段开始时,你观看一名随机的其他角色的随机X张手牌。(X为场上手牌最少的角色的手牌数)", - "xinfu_xionghuo":"凶镬", - "xinfu_xionghuo_info":"游戏开始时,你获得3个“暴戾”标记。出牌阶段,你可以交给一名其他角色一个“暴戾”标记,你对有“暴戾”标记的其他角色造成伤害时,此伤害+1。有“暴戾”的其他角色的出牌阶段开始时,其移去所有“暴戾”标记并随机执行一项:1.受到1点火焰伤害且本回合不能对你使用【杀】;2.失去1点体力且本回合手牌上限-1;3.你随机获得其一张手牌和一张装备区的牌。", - xionghuo:"凶镬", - "xionghuo_info":"", - "xionghuo_disable":"凶镬", - "xionghuo_disable_info":"", - "xionghuo_low":"凶镬", - "xionghuo_low_info":"", - "xinfu_shajue":"杀绝", - "xinfu_shajue_info":"锁定技,其他角色进入濒死状态时,若其体力值小于0,则你获得一个“暴戾”标记,并获得使其进入濒死状态的牌。", + xinfu_xionghuo:'凶镬', + xinfu_xionghuo_info:'游戏开始时,你获得3个“暴戾”标记。出牌阶段,你可以交给一名其他角色一个“暴戾”标记。当你对有“暴戾”标记的其他角色造成伤害时,此伤害+1。有“暴戾”标记的其他角色的出牌阶段开始时,其移去所有“暴戾”标记并随机执行一项:1.受到1点火焰伤害且本回合不能对你使用【杀】;2.失去1点体力且本回合手牌上限-1;3.你随机获得其一张手牌和一张装备区的牌。', + xinfu_shajue:'杀绝', + xinfu_shajue_info:'锁定技,其他角色进入濒死状态时,你获得一个“暴戾”标记。然后若其体力值小于0,你获得使其进入濒死状态的牌。', xinfu_jianjie:"荐杰", jianjie:'荐杰', jianjie_info:'①你的第一个准备阶段开始时,你令一名其他角色获得“龙印”,然后令另一名其他角色获得“凤印”。②出牌阶段限一次。若当前回合不是你的第一个回合,则你可以移动场上的“龙印”或“凤印”。③拥有“龙印”或“凤印”的其他角色死亡时,你转移该角色的“龙印”和“凤印”。④拥有“龙印”/“凤印”的角色视为拥有〖火计〗/〖连环〗,且同时拥有这两种标记的角色视为拥有〖业炎〗。', @@ -26649,7 +26686,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yanru:'宴如', yanru_info:'出牌阶段各限一次,若你的手牌数为:①奇数,你可以摸三张牌,然后弃置至少一半手牌(向下取整);②偶数,你可以弃置至少一半手牌,然后摸三张牌。', hezhong:'和衷', - hezhong_info:'每回合每项限一次,当你的手牌数变为1后,你可以展示此唯一手牌A并摸一张牌,然后你选择一项:①本回合使用点数大于A的点数的普通锦囊牌额外结算一次;②本回合使用点数小于A的点数的普通锦囊牌额外结算一次。', + hezhong_info:'每回合每项限一次,当你的手牌数变为1后,你可以展示唯一手牌并摸一张牌,然后你选择一项:①本回合使用的下一张点数大于此牌的点数的普通锦囊牌额外结算一次;②本回合使用的下一张点数小于此牌的点数的普通锦囊牌额外结算一次。', lvboshe:'吕伯奢', olfushi:'缚豕', olfushi_info:'①一名角色使用【杀】结算结束后,若你至其的距离不大于1,你将此【杀】对应的所有实体牌置于武将牌上。②当你需要使用一张【杀】时,你可以将任意张“缚豕”牌置入弃牌堆并摸等量的牌,视为使用一张【杀】并选择X项(X为你以此法重铸的牌数且至多为3):1.你为此【杀】额外指定一个目标;2.你选择此【杀】的一个目标角色,此牌对其造成的伤害-1;3.你选择此【杀】的一个目标角色,此【杀】对其造成的伤害+1。当此【杀】指定最后一个目标后,若此牌被选择的效果选项相邻且此牌的目标角色座位连续,则此【杀】不计入次数限制。', diff --git a/character/sp2.js b/character/sp2.js index fd190e554..dd52c95c5 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -4,6 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'sp2', connect:true, character:{ + star_dongzhuo:['male','qun',5,['starweilin','starzhangrong','starhaoshou'],['zhu']], star_yuanshu:['male','qun',4,['starcanxi','starpizhi','starzhonggu'],['zhu']], star_caoren:['male','wei',4,['starsujun','starlifeng']], mp_liuling:['male','jin',3,['mpjiusong','mpmaotao','mpbishi'],['doublegroup:wei:qun:jin']], @@ -109,12 +110,180 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_xuzhou:['re_taoqian','caosong','zhangmiao','qiuliju'], sp_zhongyuan:['re_hucheer','re_zoushi','caoanmin','re_dongcheng'], sp_xiaohu:['haomeng','yanfuren','yanrou','dc_zhuling'], - sp_star:['star_caoren','star_yuanshu'], + sp_star:['star_caoren','star_yuanshu','star_dongzhuo'], mini_qixian:['mp_liuling'], sp_decade:['caobuxing','re_maliang','dc_jikang'], } }, skill:{ + //星董卓 + starweilin:{ + audio:2, + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + return !event.player.getHistory('damage').length&&player.getHistory('useCard').length>=event.player.getHp(); + }, + forced:true, + logTarget:'player', + content:function(){ + trigger.num++; + }, + }, + starzhangrong:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + return player.getHp()>0; + }, + direct:true, + content:function*(event,map){ + var player=map.player; + var str=get.cnNumber(player.getHp()); + var choiceList=[ + '令至多'+str+'名体力值大于等于你的角色各失去1点体力', + '令至多'+str+'名手牌数大于等于你的角色各弃置一张手牌', + ],list=['cancel2']; + if(game.hasPlayer(target=>{ + if(target==player) return player.countCards('h',card=>lib.filter.cardDiscardable(card,player)); + return target.countCards('h')>=Math.max(1,player.countCards('h')); + })) list.unshift('弃牌'); + else choiceList[1]=''+choiceList[1]+''; + list.unshift('扣血'); + var result=yield player.chooseControl(list).set('prompt','###'+get.prompt('starzhangrong')+'###选择其中一项令任意名符合条件的角色执行,然后你摸等量的牌,回合结束时,若这些角色中有本回合未受到过伤害的角色,则你失去1点体力').set('ai',()=>{ + var player=_status.event.player; + var controls=_status.event.controls.slice(); + /* + var cards=player.getCards('hes',card=>get.tag(card,'damage')&&player.hasValueTarget(card)); + var cardx=cards.filter(card=>get.name(card)=='sha'); + cardx.sort((a,b)=>player.getUseValue(b)-player.getUseValue(a)); + cardx=cardx.slice(Math.min(cardx.length,player.getCardUsable('sha')),cardx.length); + cards.removeArray(cardx); + */ + var targets1=game.filterPlayer(target=>get.attitude(player,target)<0&&target.getHp()>=player.getHp()&&get.effect(target,{name:'losehp'},player,player)>0/*&&cards.some(card=>player.canUse(card,target))*/); + _status.starzhangrong_check=true; + var targets2=game.filterPlayer(target=>get.attitude(player,target)<0&&target.countCards('h')>=Math.max(1,player.countCards('h'))&&get.effect(target,{name:'guohe_copy2'},player,player)>0/*&&cards.some(card=>player.canUse(card,target))*/); + delete _status.starzhangrong_check; + [targets1,targets2].forEach(list=>{ + list.sort((a,b)=>get.damageEffect(b)-get.damageEffect(a)); + list=list.slice(0,Math.min(player.getHp()/*,cards.length*/)); + }); + if(!controls.includes('弃牌')) return 1-get.sgn(targets1.length); + return Math.max(0,get.sgn(targets2.length-targets1.length)); + }).set('choiceList',choiceList); + if(result.control!='cancel2'){ + var choice=result.index; + var result2=yield player.chooseTarget([1,player.getHp()],'请选择【掌戎】的目标','令至多'+str+'名'+(choice?'手牌数':'体力值')+'大于你的角色各'+(choice?'弃置一张手牌':'失去1点体力'),(card,player,target)=>{ + var name=_status.event.card.name; + if(name=='guohe_copy2'){ + if(target==player) return player.countCards('h',card=>lib.filter.cardDiscardable(card,player)); + return target.countCards('h')>=Math.max(1,player.countCards('h')); + } + return target.getHp()>=player.getHp(); + }).set('ai',target=>{ + var player=_status.event.player; + if(get.attitude(player,target)>=0) return 0; + return get.effect(target,_status.event.card,player,player); + }).set('card',{name:choice?'guohe_copy2':'losehp'}); + if(result2.bool){ + var targets=result2.targets.sortBySeat(); + player.logSkill('starzhangrong',targets); + targets.forEach(target=>{ + target.addTempSkill('starzhangrong_threaten'); + if(choice) target.chooseToDiscard('h',true); + else target.loseHp(); + }); + player.draw(targets.length); + player.when('phaseEnd').then(()=>{ + targets.forEach(target=>target.removeSkill('starzhangrong_threaten')); + var targetx=targets.filter(target=>!target.getHistory('damage').length); + if(targetx.length){ + targetx.forEach(target=>target.chat('乐')); + player.popup('杯具'); + player.loseHp(); + return; + } + player.popup('洗具'); + }).vars({targets:targets}); + } + } + }, + global:'starzhangrong_check', + subSkill:{ + check:{ + mod:{ + canBeDiscarded:function(card,player,target){ + if(!_status.starzhangrong_check) return; + if(player.hasSkill('starzhangrong')&&get.position(card)!='h') return false; + }, + }, + }, + threaten:{ + charlotte:true, + trigger:{player:'damageEnd'}, + firstDo:true, + forced:true, + popup:false, + content:function(){ + player.removeSkill('starzhangrong_threaten'); + }, + ai:{threaten:114514+1919810}, + mark:true, + markimage:'image/card/sha.png', + intro:{content:'我还没受到伤害哟!'}, + }, + }, + }, + starhaoshou:{ + unique:true, + audio:2, + trigger:{global:'useCardAfter'}, + filter:function(event,player){ + return event.player!=player&&event.card.name=='jiu'&&player.isDamaged()&&event.player.group=='qun'; + }, + direct:true, + zhuSkill:true, + content:function*(event,map){ + var player=map.player,target=map.trigger.player; + var result=yield target.chooseBool(get.prompt('starhaoshou',player),'令'+get.translation(player)+'回复1点体力').set('choice',get.recoverEffect(player,target,target)>0); + if(result.bool){ + target.line(player); + player.logSkill('starhaoshou'); + player.recover(); + } + }, + //global:'starhaoshou_global', + subSkill:{ + global:{ + audio:'starhaoshou', + forceaudio:true, + filter:function(event,player){ + if(!player.countCards('hes',card=>{ + if(get.position(card)=='h'&&_status.connectMode) return true; + return get.name(card)=='jiu'; + })) return false; + return event.type=='dying'&&event.dying&&event.dying!=player&&event.dying.hp<=0&&event.dying.hasZhuSkill('starhaoshou')&&player.group=='qun'; + }, + filterCard:function(card,player){ + return get.name(card)=='jiu'; + }, + check:()=>1, + viewAs:{name:'tao'}, + position:'hes', + prompt:function(){ + return '将一张【酒】当作【桃】对'+get.translation(_status.event.dying)+'使用'; + }, + ai:{ + save:true, + skillTagFilter:function(player,arg,target){ + if(!player.countCards('hes',card=>{ + if(get.position(card)=='h'&&_status.connectMode) return true; + return get.name(card)=='jiu'; + })||player==target||!target.hasSkill('starhaoshou')||player.group!='qun') return false; + }, + }, + }, + }, + }, //星袁术 starcanxi:{ audio:2, @@ -531,6 +700,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio: 'juexiang', trigger: { player: 'die' }, forced: true, + locked:false, forceDie: true, skillAnimation: true, animationColor: 'water', @@ -627,6 +797,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, audio:2, + locked:false, trigger:{player:'phaseUseBegin'}, filter:function(event,player){ return player.countCards('h'); @@ -752,7 +923,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).set('ai',function(button){ var target=_status.event.target; return [ - get.effect(target,{name:'wuzhong'},player,player)/2, + get.effect(target,{name:'draw'},player,player), get.effect(target,{name:'shunshou_copy2'},player,player), get.recoverEffect(target,player,player), ][button.link]; @@ -2191,6 +2362,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //胡班 dcchongyi:{ audio:2, + init:()=>{ + game.addGlobalSkill('dcchongyi_ai'); + }, + onremove:()=>{ + if(!game.hasPlayer(i=>i.hasSkill('dcchongyi'),true)) game.removeGlobalSkill('dcchongyi_ai'); + }, trigger:{global:'useCard'}, logTarget:'player', filter:function(event,player){ @@ -2216,7 +2393,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.addTempSkill('dcchongyi_sha'); }, group:'dcchongyi_end', - global:'dcchongyi_ai', subSkill:{ ai:{ mod:{ @@ -2232,6 +2408,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ })) return num+10; }, }, + trigger:{player:'dieAfter'}, + filter:()=>{ + return !game.hasPlayer(i=>i.hasSkill('dcchongyi'),true); + }, + silent:true, + forceDie:true, + content:()=>{ + game.removeGlobalSkill('dcchongyi_ai'); + } }, end:{ audio:'dcchongyi', @@ -4830,7 +5015,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ })) return 3; return Math.sqrt(target.countCards('he')); } - if(target.mayHaveShan()&&player.countCards('hs',function(card){ + if(target.mayHaveShan(player,'use')&&player.countCards('hs',function(card){ return !ui.selected.cards.contains(card)&&get.name(card)=='sha'&&player.canUse(card,target)&&get.effect(target,card,player,player)!=0; })) return -Math.sqrt(Math.abs(get.attitude(player,target)))/2; return 0.1; @@ -5162,7 +5347,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addSkill('mouni2'); player.chooseTarget(get.prompt2('mouni'),lib.filter.notMe).set('ai',function(target){ var player=_status.event.player,cards=player.getCards('h','sha'); - if(get.attitude(player,target)>=0||!player.canUse(cards[0],target,false)||(!player.hasJudge('lebu')&&target.mayHaveShan()&&!player.hasSkillTag('directHit_ai',true,{ + if(get.attitude(player,target)>=0||!player.canUse(cards[0],target,false)||(!player.hasJudge('lebu')&&target.mayHaveShan(player,'use')&&!player.hasSkillTag('directHit_ai',true,{ target:target, card:cards[0], },true))) return 0; @@ -8067,8 +8252,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseTarget(get.prompt2('yechou'),function(card,player,target){ return player!=target&&target.getDamagedHp()>1 }).set('forceDie',true).set('ai',function(target){ - var num=get.attitude(_status.event.player,target); - return -num; + let att=get.attitude(_status.event.player,target); + if(att>0) return 0; + att=Math.sqrt(0.01-att); + return att*(get.distance(_status.currentPhase,target,'absolute')||game.players.length); }); "step 1" if(result.bool){ @@ -8080,6 +8267,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ expose:0.5, + maixie_defend:true }, }, "yechou2":{ @@ -10989,6 +11177,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ starpizhi_info:'锁定技。①一名角色死亡后,若你拥有该角色对应的“玺角”标记,你失去之并摸X张牌。②结束阶段,你摸X张牌。(X为你本局游戏失去的“玺角”标记数)', starzhonggu:'冢骨', starzhonggu_info:'主公技,锁定技。摸牌阶段,若游戏轮数大于等于场上的群势力角色数,则你额外摸两张牌,否则你少摸一张牌。', + star_dongzhuo:'星董卓', + star_dongzhuo_prefix:'星', + starweilin:'威临', + starweilin_info:'锁定技。当你于回合内对一名其他角色造成伤害时,若其本回合未受到过伤害,且你本回合使用的牌数大于等于其体力值,则此伤害+1。', + starzhangrong:'掌戎', + starzhangrong_info:'准备阶段,你可以选择令至多X名体力值大于等于你的角色各失去1点体力或令至多X名手牌数大于等于你的角色各弃置一张手牌。若如此做,你摸等同于选择角色数的牌,且本回合结束时,若这些角色中存在本回合未受到过伤害的角色,则你失去1点体力。', + starhaoshou:'豪首', + //starhaoshou_info:'主公技。①其他群势力角色使用【酒】结算完毕后,其可以令你回复1点体力。②当你处于濒死状态时,其他群势力角色可以将【酒】当作【桃】对你使用。', + starhaoshou_info:'主公技。其他群势力角色使用【酒】结算完毕后,其可以令你回复1点体力。。', sp_whlw:"文和乱武", sp_zlzy:"逐鹿中原", diff --git a/character/standard.js b/character/standard.js index afbce7932..1064d154a 100755 --- a/character/standard.js +++ b/character/standard.js @@ -99,23 +99,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'shushen', trigger:{player:'recoverEnd'}, direct:true, - content:function(){ - 'step 0' + async content(event,trigger,player){ event.num=trigger.num||1; - 'step 1' - player.chooseTarget(get.prompt2('stdshushen'),lib.filter.notMe).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; + do { + const {result:{bool,targets}}=await player.chooseTarget(get.prompt2('stdshushen'),lib.filter.notMe) + .set('ai',target=>get.attitude(_status.event.player,target)); + if(!bool) return; + const target=targets[0]; player.logSkill('stdshushen',target); target.draw(target.countCards('h')?1:2); - if(event.num>1&&player.hasSkill('stdshushen')){ - event.num--; - event.goto(1); - } - } + }while(--event.num>0&&player.hasSkill('stdshushen')); }, ai:{threaten:0.8,expose:0.1}, }, @@ -124,10 +117,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{source:'damageSource'}, forced:true, usable:1, - filter:function(event,player){ + filter(event,player){ return player.isPhaseUsing()&&event.card&&event.card.name=='sha'&&event.player!=player&&event.player.isIn(); }, - content:function(){ + async content(event,trigger,player){ if(trigger.player.hpplayer.hp; }, logTarget:'player', - content:function(){ + async content(event,trigger,player){ player.draw(); - var zhu=false; - var target=trigger.player; + let zhu=false; + const target=trigger.player; switch(get.mode()){ case 'identity':{ zhu=target.isZhu; @@ -175,7 +168,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rewangzun2:{ onremove:true, mod:{ - maxHandcard:function(player,num){ + maxHandcard(player,num){ return num-player.countMark('rewangzun2'); }, }, @@ -186,16 +179,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ logTarget:'target', audio:'tongji', direct:true, - filter:function(event,player){ + filter(event,player){ return event.card.name=='sha'&&event.player!=player&&!event.targets.contains(player)&& event.target.inRange(player)&&event.target.countCards('he')>0; }, - content:function(){ - 'step 0' - trigger.target.chooseCard('he','是否对'+get.translation(player)+'发动【同疾】?','弃置一张牌,将'+get.translation(trigger.card)+'转移给'+get.translation(player)).set('ai',function(card){ + async content(event,trigger,player){ + const {result:{bool,cards}}=await trigger.target.chooseCard('he','是否对'+get.translation(player)+'发动【同疾】?','弃置一张牌,将'+get.translation(trigger.card)+'转移给'+get.translation(player)) + .set('ai',card=>{ if(!_status.event.check) return -1; return get.unuseful(card)+9; - }).set('check',function(){ + }) + .set('check',(()=>{ if(trigger.target.countCards('h','shan')){ return -get.attitude(trigger.target,player); } @@ -209,12 +203,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 8-get.attitude(trigger.target,player); } return -1; - }()>0); - 'step 1' - if(result.bool){ + })()>0); + if(bool){ player.logSkill('retongji',trigger.target); - trigger.target.discard(result.cards); - var evt=trigger.getParent(); + trigger.target.discard(cards); + const evt=trigger.getParent(); evt.triggeredTargets2.remove(trigger.target); evt.targets.remove(trigger.target); evt.targets.push(player); @@ -227,65 +220,60 @@ game.import('character',function(lib,game,ui,get,ai,_status){ unique:true, zhuSkill:true, trigger:{player:['chooseToRespondBefore','chooseToUseBefore']}, - filter:function(event,player){ + filter(event,player){ if(event.responded) return false; if(player.storage.hujiaing) return false; if(!player.hasZhuSkill('hujia')) return false; if(!event.filterCard({name:'shan'},player,event)) return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.group=='wei'; - }); + return game.hasPlayer(current=>current!=player&¤t.group=='wei'); }, - check:function(event,player){ + check(event,player){ if(get.damageEffect(player,event.player,player)>=0) return false; return true; }, - content:function(){ - "step 0" - if(event.current==undefined) event.current=player.next; - if(event.current==player){ - event.finish(); - } - else if(event.current.group=='wei'){ - if((event.current==game.me&&!_status.auto)||( - get.attitude(event.current,player)>2)|| - event.current.isOnline()){ - player.storage.hujiaing=true; - var next=event.current.chooseToRespond('是否替'+get.translation(player)+'打出一张闪?',{name:'shan'}); - next.set('ai',function(){ - var event=_status.event; - return (get.attitude(event.player,event.source)-2); - }); - next.set('skillwarn','替'+get.translation(player)+'打出一张闪'); - next.autochoose=lib.filter.autoRespondShan; - next.set('source',player); + async content(event,trigger,player){ + while(true){ + let bool; + if(!event.current) event.current=player.next; + if(event.current==player) return; + else if(event.current.group=='wei'){ + if((event.current==game.me&&!_status.auto)||( + get.attitude(event.current,player)>2)|| + event.current.isOnline()){ + player.storage.hujiaing=true; + const next=event.current.chooseToRespond('是否替'+get.translation(player)+'打出一张闪?',{name:'shan'}); + next.set('ai',()=>{ + const event=_status.event; + return (get.attitude(event.player,event.source)-2); + }); + next.set('skillwarn','替'+get.translation(player)+'打出一张闪'); + next.autochoose=lib.filter.autoRespondShan; + next.set('source',player); + bool=(await next).result.bool; + } } - } - "step 1" - player.storage.hujiaing=false; - if(result.bool){ - event.finish(); - trigger.result={bool:true,card:{name:'shan',isCard:true}}; - trigger.responded=true; - trigger.animate=false; - if(typeof event.current.ai.shown=='number'&&event.current.ai.shown<0.95){ - event.current.ai.shown+=0.3; - if(event.current.ai.shown>0.95) event.current.ai.shown=0.95; + player.storage.hujiaing=false; + if(bool){ + trigger.result={bool:true,card:{name:'shan',isCard:true}}; + trigger.responded=true; + trigger.animate=false; + if(typeof event.current.ai.shown=='number'&&event.current.ai.shown<0.95){ + event.current.ai.shown+=0.3; + if(event.current.ai.shown>0.95) event.current.ai.shown=0.95; + } + return; + } + else{ + event.current=event.current.next; } - } - else{ - event.current=event.current.next; - event.goto(0); } }, ai:{ respondShan:true, - skillTagFilter:function(player){ + skillTagFilter(player){ if(player.storage.hujiaing) return false; if(!player.hasZhuSkill('hujia')) return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.group=='wei'; - }); + return game.hasPlayer(current=>current!=player&¤t.group=='wei'); }, }, }, @@ -293,17 +281,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, preHidden:true, trigger:{player:'damageEnd'}, - filter:function(event,player){ + filter(event,player){ return get.itemtype(event.cards)=='cards'&&get.position(event.cards[0],true)=='o'; }, - content:function(){ + async content(event,trigger,player){ player.gain(trigger.cards,'gain2'); }, ai:{ maixie:true, maixie_hp:true, effect:{ - target:function(card,player,target){ + target(card,player,target){ if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; if(get.tag(card,'damage')) return [1,0.55]; } @@ -315,16 +303,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'damageEnd'}, logTarget:'source', preHidden:true, - filter:function(event,player){ + filter(event,player){ return (event.source&&event.source.countGainableCards(player,event.source!=player?'he':'e')&&event.num>0); }, - content:function(){ + async content(event,trigger,player){ player.gainPlayerCard(true,trigger.source,trigger.source!=player?'he':'e'); }, ai:{ maixie_defend:true, effect:{ - target:function(card,player,target){ + target(card,player,target){ if(player.countCards('he')>1&&get.tag(card,'damage')){ if(player.hasSkillTag('jueqing',false,target)) return [1,-1.5]; if(get.attitude(target,player)<0) return [1,1]; @@ -338,25 +326,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{global:'judge'}, direct:true, preHidden:true, - filter:function(event,player){ + filter(event,player){ return player.countCards(get.mode()=='guozhan'?'hes':'hs')>0; }, - content:function(){ - "step 0" - player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+','+get.prompt('guicai'),get.mode()=='guozhan'?'hes':'hs',function(card){ - var player=_status.event.player; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); + async content(event,trigger,player){ + const {result:{bool:chooseCardResultBool,cards:chooseCardResultCards}}=await player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ + get.translation(trigger.player.judging[0])+','+get.prompt('guicai'),get.mode()=='guozhan'?'hes':'hs',card=>{ + const player=_status.event.player; + const mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); + const mod=game.checkMod(card,player,'unchanged','cardRespondable',player); if(mod!='unchanged') return mod; return true; - }).set('ai',function(card){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); + }).set('ai',card=>{ + const trigger=_status.event.getTrigger(); + const player=_status.event.player; + const judging=_status.event.judging; + const result=trigger.judge(card)-trigger.judge(judging); + const attitude=get.attitude(player,trigger.player); if(attitude==0||result==0) return 0; if(attitude>0){ return result-get.value(card)/2; @@ -365,30 +352,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return -result-get.value(card)/2; } }).set('judging',trigger.player.judging[0]).setHiddenSkill('guicai'); - "step 1" - if(result.bool){ - player.respond(result.cards,'guicai','highlight','noOrdering'); - } - else{ - event.finish(); - } - "step 2" - if(result.bool){ - if(trigger.player.judging[0].clone){ - trigger.player.judging[0].clone.classList.remove('thrownhighlight'); - game.broadcast(function(card){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); - } - },trigger.player.judging[0]); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); - } - game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0]=result.cards[0]; - trigger.orderingCards.addArray(result.cards); - game.log(trigger.player,'的判定牌改为',result.cards[0]); - game.delay(2); + if(!chooseCardResultBool) return; + player.respond(chooseCardResultCards,'guicai','highlight','noOrdering'); + if(trigger.player.judging[0].clone){ + trigger.player.judging[0].clone.classList.remove('thrownhighlight'); + game.broadcast(function(card){ + if(card.clone){ + card.clone.classList.remove('thrownhighlight'); + } + },trigger.player.judging[0]); + game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0]=chooseCardResultCards[0]; + trigger.orderingCards.addArray(chooseCardResultCards); + game.log(trigger.player,'的判定牌改为',chooseCardResultCards[0]); + game.asyncDelay(2); }, ai:{ rejudge:true, @@ -400,39 +379,35 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ganglie:{ audio:2, trigger:{player:'damageEnd'}, - filter:function(event,player){ + filter(event,player){ return (event.source!=undefined); }, - check:function(event,player){ + check(event,player){ return (get.attitude(player,event.source)<=0); }, logTarget:'source', - content:function(){ - "step 0" - player.judge(function(card){ + async content(event,trigger,player){ + const judgeEvent=player.judge(card=>{ if(get.suit(card)=='heart') return -2; return 2; - }).judge2=function(result){ - return result.bool; - }; - "step 1" - if(result.judge<2){ - event.finish();return; - } - trigger.source.chooseToDiscard(2).set('ai',function(card){ + }); + judgeEvent.judge2=result=>result.bool; + const {result:{judge}}=await judgeEvent; + if(judge<2) return; + const {result:{bool}}=await trigger.source.chooseToDiscard(2) + .set('ai',card=>{ if(card.name=='tao') return -10; if(card.name=='jiu'&&_status.event.player.hp==1) return -10; return get.unuseful(card)+2.5*(5-get.owner(card).hp); }); - "step 2" - if(result.bool==false){ + if(bool==false){ trigger.source.damage(); } }, ai:{ maixie_defend:true, effect:{ - target:function(card,player,target){ + target(card,player,target){ if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; return 0.8; // if(get.tag(card,'damage')&&get.damageEffect(target,player,player)>0) return [1,0,0,-1.5]; @@ -444,44 +419,35 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'ganglie', trigger:{player:'damageEnd'}, direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('ganglie_three'),function(card,player,target){ + async content(event,trigger,player){ + const {result:{bool:chooseTargetResultBool,targets:chooseTargetResultTargets}}=await player.chooseTarget(get.prompt2('ganglie_three'),(card,player,target)=>{ return target.isEnemyOf(player); - }).set('ai',function(target){ + }).set('ai',target=>{ return -get.attitude(_status.event.player,target)/(1+target.countCards('h')); }); - "step 1" - if(result.bool){ - event.target=result.targets[0]; - player.logSkill('ganglie_three',target); - } - else event.finish(); - "step 2" - player.judge(function(card){ + if(!chooseTargetResultBool) return; + event.target=chooseTargetResultTargets[0]; + player.logSkill('ganglie_three',event.target); + const judgeEvent=player.judge(card=>{ if(get.suit(card)=='heart') return -2; return 2; - }).judge2=function(result){ - return result.bool; - }; - "step 3" - if(result.judge<2){ - event.finish();return; - } - target.chooseToDiscard(2).set('ai',function(card){ + }); + judgeEvent.judge2=result=>result.bool; + const {result:{judge}}=await judgeEvent; + if(judge<2) return; + const {result:{bool:chooseToDiscardResultBool}}=await player.chooseToDiscard(2).set('ai',card=>{ if(card.name=='tao') return -10; if(card.name=='jiu'&&_status.event.player.hp==1) return -10; return get.unuseful(card)+2.5*(5-get.owner(card).hp); }); - "step 4" - if(result.bool==false){ - target.damage(); + if(chooseToDiscardResultBool==false){ + event.target.damage(); } }, ai:{ maixie_defend:true, effect:{ - target:function(card,player,target){ + target(card,player,target){ if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; return 0.8; // if(get.tag(card,'damage')&&get.damageEffect(target,player,player)>0) return [1,0,0,-1.5]; @@ -493,35 +459,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{player:'phaseDrawBegin1'}, direct:true, - filter:function(event,player){ + filter(event,player){ return !event.numFixed; }, - content:function(){ - "step 0" - var check; - var i,num=game.countPlayer(function(current){ - return current!=player&¤t.countCards('h')&&get.attitude(player,current)<=0; - }); - check=(num>=2); - player.chooseTarget(get.prompt('tuxi'),'获得其他一至两名角色的各一张手牌',[1,2],function(card,player,target){ + async content(event,trigger,player){ + let num=game.countPlayer(current=>current!=player&¤t.countCards('h')&&get.attitude(player,current)<=0); + let check=num>=2; + const {result:{bool,targets}}=await player.chooseTarget(get.prompt('tuxi'),'获得其他一至两名角色的各一张手牌',[1,2],(card,player,target)=>{ return target.countCards('h')>0&&player!=target; - },function(target){ + },target=>{ if(!_status.event.aicheck) return 0; - var att=get.attitude(_status.event.player,target); + const att=get.attitude(_status.event.player,target); if(target.hasSkill('tuntian')) return att/10; return 1-att; }).set('aicheck',check); - "step 1" - if(result.bool){ - player.logSkill('tuxi',result.targets); - player.gainMultiple(result.targets); - trigger.changeToZero(); - } - else{ - event.finish(); - } - "step 2" - game.delay(); + if(!bool) return; + player.logSkill('tuxi',targets); + player.gainMultiple(targets); + trigger.changeToZero(); + game.asyncDelay(); }, ai:{ threaten:2, @@ -531,29 +487,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){ luoyi:{ audio:2, trigger:{player:'phaseDrawBegin2'}, - check:function(event,player){ + check(event,player){ if(player.skipList.includes('phaseUse')||player.countCards('h')<3) return false; if(!player.hasSha()) return false; - return game.hasPlayer(function(current){ - return get.attitude(player,current)<0&&player.canUse('sha',current); - }); + return game.hasPlayer(current=>get.attitude(player,current)<0&&player.canUse('sha',current)); }, preHidden:true, - filter:function(event,player){ + filter(event,player){ return !event.numFixed&&event.num>0; }, - content:function(){ + async content(event,trigger,player){ player.addTempSkill('luoyi2','phaseJieshuBegin'); trigger.num--; } }, luoyi2:{ trigger:{source:'damageBegin1'}, - filter:function(event){ + filter(event){ return event.card&&(event.card.name=='sha'||event.card.name=='juedou')&&event.notLink(); }, forced:true, - content:function(){ + async content(event,trigger,player){ trigger.num++; }, ai:{ @@ -565,19 +519,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audioname:['re_guojia','xizhicai','gz_nagisa'], trigger:{player:'judgeEnd'}, preHidden:true, - frequent:function(event){ - if(event.result.card.name=='du') return false; + frequent(event){ //if(get.mode()=='guozhan') return false; - return true; + return event.result.card.name!=='du'; }, - check:function(event){ - if(event.result.card.name=='du') return false; - return true; + check(event){ + return event.result.card.name!=='du'; }, - filter:function(event,player){ + filter(event,player){ return get.position(event.result.card,true)=='o'; }, - content:function(){ + async content(event,trigger,player){ player.gain(trigger.result.card,'gain2'); } }, @@ -585,96 +537,86 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{player:'damageEnd'}, frequent:true, - filter:function(event){ - return (event.num>0) + filter(event){ + return event.num>0; }, - content:function(){ - 'step 0' + async content(event,trigger,player){ event.count=trigger.num; - 'step 1' - event.count--; - event.cards=game.cardsGotoOrdering(get.cards(2)).cards; - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - event.given_map={}; - 'step 2' - if(event.cards.length>1){ - player.chooseCardButton('遗计:请选择要分配的牌',true,event.cards,[1,event.cards.length]).set('ai',function(button){ - if(ui.selected.buttons.length==0) return 1; - return 0; - }); - } - else if(event.cards.length==1){ - event._result={links:event.cards.slice(0),bool:true}; - } - else{ - event.finish(); - } - 'step 3' - if(result.bool){ - event.cards.removeArray(result.links); - event.togive=result.links.slice(0); - player.chooseTarget('选择一名角色获得'+get.translation(result.links),true).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(_status.event.enemy){ - return -att; + // event.goto -> while + while(true){ + event.count--; + const {cards}=await game.cardsGotoOrdering(get.cards(2)); + if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); + event.given_map={}; + if(!cards.length) return; + // event.goto -> do while + do{ + const {result:{bool,links}} = + cards.length==1? + {result:{links:cards.slice(0),bool: true}}: + await player.chooseCardButton('遗计:请选择要分配的牌',true,cards,[1,cards.length]) + .set('ai',()=>{ + if(ui.selected.buttons.length==0) return 1; + return 0; + }); + if(!bool) return; + cards.removeArray(links); + event.togive=links.slice(0); + const {result:{targets}}=await player.chooseTarget('选择一名角色获得'+get.translation(links),true) + .set('ai',target=>{ + const att=get.attitude(_status.event.player,target); + if(_status.event.enemy){ + return -att; + } + else if(att>0){ + return att/(1+target.countCards('h')); + } + else{ + return att/100; + } + }) + .set('enemy',get.value(event.togive[0],player,'raw')<0); + if(targets.length){ + const id=targets[0].playerid, + map=event.given_map; + if(!map[id]) map[id]=[]; + map[id].addArray(event.togive); } - else if(att>0){ - return att/(1+target.countCards('h')); - } - else{ - return att/100; - } - }).set('enemy',get.value(event.togive[0],player,'raw')<0); - } - 'step 4' - if(result.targets.length){ - var id=result.targets[0].playerid,map=event.given_map; - if(!map[id]) map[id]=[]; - map[id].addArray(event.togive); - } - if(cards.length>0) event.goto(2); - 'step 5' - if(_status.connectMode){ - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); - } - var list=[]; - for(var i in event.given_map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - player.line(source,'green'); - list.push([source,event.given_map[i]]); - } - game.loseAsync({ - gain_list:list, - giver:player, - animate:'draw', - }).setContent('gaincardMultiple'); - 'step 6' - if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ - player.chooseBool(get.prompt2(event.name)).set('frequentSkill',event.name); - } - else event.finish(); - 'step 7' - if(result.bool){ - player.logSkill(event.name); - event.goto(1); + }while(cards.length>0); + if(_status.connectMode){ + game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); + } + const list=[]; + for(const i in event.given_map){ + const source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; + player.line(source,'green'); + list.push([source, event.given_map[i]]); + } + game.loseAsync({ + gain_list:list, + giver:player, + animate:'draw', + }).setContent('gaincardMultiple'); + if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name, player)){ + const {result:{bool:chooseBoolResultBool}}=await player.chooseBool(get.prompt2(event.name)).set('frequentSkill',event.name); + if(chooseBoolResultBool) player.logSkill(event.name); + else return; + } + else return; } }, ai:{ maixie:true, maixie_hp:true, effect:{ - target:function(card,player,target){ + target(card,player,target){ if(get.tag(card,'damage')){ if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; if(!target.hasFriend()) return; - var num=1; + let num=1; if(get.attitude(player,target)>0){ - if(player.needsToDiscard()){ - num=0.7; - } - else{ - num=0.5; - } + if(player.needsToDiscard()) num=0.7; + else num=0.5; } if(target.hp>=4) return [1,num*2]; if(target.hp==3) return [1,num*1.5]; @@ -689,45 +631,42 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'phaseZhunbeiBegin'}, frequent:true, preHidden:true, - content:function(){ - "step 0" - if(event.cards==undefined) event.cards=[]; - var next=player.judge(function(card){ - if(get.color(card)=='black') return 1.5; - return -1.5; - }); - next.judge2=function(result){ - return result.bool; - }; - if(get.mode()!='guozhan'&&!player.hasSkillTag('rejudge')) next.set('callback',function(){ - if(event.judgeResult.color=='black'&&get.position(card,true)=='o') player.gain(card,'gain2'); - }); - else next.set('callback',function(){ - if(event.judgeResult.color=='black') event.getParent().orderingCards.remove(card); - }); - "step 1" - if(result.judge>0){ - event.cards.push(result.card); - player.chooseBool('是否再次发动【洛神】?').set('frequentSkill','luoshen'); - } - else{ - for(var i=0;i{ + if(get.color(card)=='black') return 1.5; + return -1.5; + }); + judgeEvent.judge2=result=>result.bool; + if(get.mode()!='guozhan'&&!player.hasSkillTag('rejudge')) judgeEvent.set('callback',async event=>{ + if(event.judgeResult.color=='black'&&get.position(event.card,true)=='o') await player.gain(event.card,'gain2'); + }); + else judgeEvent.set('callback',async event=>{ + if(event.judgeResult.color=='black') event.getParent().orderingCards.remove(event.card); + }); + const {result:{judge,card}}=await judgeEvent; + let bool; + if(judge>0){ + event.cards.push(card); + bool=(await player.chooseBool('是否再次发动【洛神】?').set('frequentSkill','luoshen')).result.bool; + } + else{ + for(let i=0;i0){ - event.cards.push(result.card); - if(lib.config.autoskilllist.contains('luoshen')){ - player.chooseBool('是否再次发动【洛神】?'); + async content(event,trigger,player){ + while(true){ + if(event.cards==undefined) event.cards=[]; + const judgeEvent=player.judge(card=>{ + if(get.color(card)=='black') return 1.5; + return -1.5; + },ui.special); + judgeEvent.judge2=result=>result.bool; + const {result:{judge,card}}=await judgeEvent; + let bool; + if(judge>0){ + event.cards.push(card); + bool=lib.config.autoskilllist.contains('luoshen')?(await player.chooseBool('是否再次发动【洛神】?')).result.bool:true; } else{ - event._result={bool:true}; - } - } - else{ - for(var i=0;iget.name(card)=='shan'||get.color(card)=='black'); + cards.sort((a,b)=>{ return (get.name(b)=='shan'?1:2)-(get.name(a)=='shan'?1:2); }); - var geti=function(){ - if(cards.contains(card)){ - return cards.indexOf(card); - } + const geti=()=>{ + if(cards.includes(card)) cards.indexOf(card); return cards.length; }; if(get.name(card)=='shan') return Math.min(num,[6,4,3][Math.min(geti(),2)])*0.6; return Math.max(num,[6.5,4,3][Math.min(geti(),2)]); }, - aiUseful:function(){ + aiUseful(){ return lib.skill.qingguo.mod.aiValue.apply(this,arguments); }, }, @@ -822,24 +751,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, audioname:['sb_zhenji'], enable:['chooseToRespond','chooseToUse'], - filterCard:function(card){ + filterCard(card){ return get.color(card)=='black'; }, viewAs:{name:'shan'}, - viewAsFilter:function(player){ + viewAsFilter(player){ if(!player.countCards('hs',{color:'black'})) return false; }, position:'hs', prompt:'将一张黑色手牌当闪使用或打出', - check:function(){return 1}, + check(){return 1}, ai:{ order:3, respondShan:true, - skillTagFilter:function(player){ + skillTagFilter(player){ if(!player.countCards('hs',{color:'black'})) return false; }, effect:{ - target:function(card,player,target,current){ + target(card,player,target,current){ if(get.tag(card,'respondShan')&¤t<0) return 0.6 } } @@ -853,26 +782,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ discard:false, lose:false, delay:0, - filterTarget:function(card,player,target){ + filterTarget(card,player,target){ return player!=target; }, - check:function(card){ + check(card){ if(ui.selected.cards.length>1) return 0; if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; if(!ui.selected.cards.length&&card.name=='du') return 20; - var player=get.owner(card); - var num=0; - var evt2=_status.event.getParent(); - var num=0; - player.getHistory('lose',function(evt){ + const player=get.owner(card); + let num=0; + const evt2=_status.event.getParent(); + player.getHistory('lose',evt=>{ if(evt.getParent().skill=='rende'&&evt.getParent(3)==evt2) num+=evt.cards.length; }); if(player.hp==player.maxHp||num>1||player.countCards('h')<=1){ if(ui.selected.cards.length){ return -1; } - var players=game.filterPlayer(); - for(var i=0;i{ if(evt.getParent(2).name=='rende'&&evt.getParent(5)==evt2) num+=evt.cards.length; }); - if(num<2&&num+cards.length>1) player.recover(); + player.give(event.cards,event.target); + if(num<2&&num+event.cards.length>1) player.recover(); }, ai:{ - order:function(skill,player){ + order(skill,player){ if(player.hp1){ return 10; } return 1; }, result:{ - target:function(player,target){ + target(player,target){ if(target.hasSkillTag('nogain')) return 0; if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ - if(target.hasSkillTag('nodu')) return 0; - return -10; + return target.hasSkillTag('nodu')?0:-10; } if(target.hasJudge('lebu')) return 0; - var nh=target.countCards('h'); - var np=player.countCards('h'); + const nh=target.countCards('h'); + const np=player.countCards('h'); if(player.hp==player.maxHp||player.storage.rende<0||player.countCards('h')<=1){ if(nh>=np-1&&np<=player.hp&&!target.hasSkill('haoshi')) return 0; } @@ -920,11 +847,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, effect:{ - target:function(card,player,target){ + target(card,player,target){ if(player==target&&get.type(card)=='equip'){ if(player.countCards('e',{subtype:get.subtype(card)})){ - var players=game.filterPlayer(); - for(var i=0;i0){ return 0; } @@ -939,7 +866,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rende1:{ trigger:{player:'phaseUseBegin'}, silent:true, - content:function(){ + async content(event,trigger,player){ player.storage.rende=0; } }, @@ -949,25 +876,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ unique:true, group:['jijiang1'], zhuSkill:true, - filter:function(event,player){ - if(!player.hasZhuSkill('jijiang')||!game.hasPlayer(function(current){ - return current!=player&¤t.group=='shu'; - })) return false; + filter(event,player){ + if(!player.hasZhuSkill('jijiang')||!game.hasPlayer(current=>current!=player&¤t.group=='shu')) return false; return !event.jijiang&&(event.type!='phase'||!player.hasSkill('jijiang3')); }, enable:['chooseToUse','chooseToRespond'], viewAs:{name:'sha'}, - filterCard:function(){return false}, + filterCard(){return false}, selectCard:-1, ai:{ - order:function(){ + order(){ return get.order({name:'sha'})+0.3; }, respondSha:true, - skillTagFilter:function(player){ - if(!player.hasZhuSkill('jijiang')||!game.hasPlayer(function(current){ - return current!=player&¤t.group=='shu'; - })) return false; + skillTagFilter(player){ + if(!player.hasZhuSkill('jijiang')||!game.hasPlayer(current=>current!=player&¤t.group=='shu')) return false; }, }, }, @@ -976,52 +899,46 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audioname:['liushan','re_liubei','re_liushan','ol_liushan'], trigger:{player:['useCardBegin','respondBegin']}, logTarget:'targets', - filter:function(event,player){ + filter(event,player){ return event.skill=='jijiang'; }, forced:true, - content:function(){ - "step 0" + async content(event,trigger,player){ delete trigger.skill; trigger.getParent().set('jijiang',true); - "step 1" - if(event.current==undefined) event.current=player.next; - if(event.current==player){ - player.addTempSkill('jijiang3'); - event.finish(); - trigger.cancel(); - trigger.getParent().goto(0); - } - else if(event.current.group=='shu'){ - var next=event.current.chooseToRespond('是否替'+get.translation(player)+'打出一张杀?',{name:'sha'}); - next.set('ai',function(){ - var event=_status.event; - return (get.attitude(event.player,event.source)-2); - }); - next.set('source',player); - next.set('jijiang',true); - next.set('skillwarn','替'+get.translation(player)+'打出一张杀'); - next.noOrdering=true; - next.autochoose=lib.filter.autoRespondSha; - } - else{ - event.current=event.current.next; - event.redo(); - } - "step 2" - if(result.bool){ - event.finish(); - trigger.card=result.card; - trigger.cards=result.cards; - trigger.throw=false; - if(typeof event.current.ai.shown=='number'&&event.current.ai.shown<0.95){ - event.current.ai.shown+=0.3; - if(event.current.ai.shown>0.95) event.current.ai.shown=0.95; + while(true){ + if(event.current==undefined) event.current=player.next; + if(event.current==player){ + player.addTempSkill('jijiang3'); + trigger.cancel(); + trigger.getParent().goto(0); + return; } - } - else{ - event.current=event.current.next; - event.goto(1); + else if(event.current.group=='shu'){ + const chooseToRespondEvent=event.current.chooseToRespond('是否替'+get.translation(player)+'打出一张杀?',{name:'sha'}); + chooseToRespondEvent.set('ai',()=>{ + const event=_status.event; + return (get.attitude(event.player,event.source)-2); + }); + chooseToRespondEvent.set('source',player); + chooseToRespondEvent.set('jijiang',true); + chooseToRespondEvent.set('skillwarn','替'+get.translation(player)+'打出一张杀'); + chooseToRespondEvent.noOrdering=true; + chooseToRespondEvent.autochoose=lib.filter.autoRespondSha; + const {bool,card,cards}=(await chooseToRespondEvent).result; + if(bool){ + trigger.card=card; + trigger.cards=cards; + trigger.throw=false; + if(typeof event.current.ai.shown=='number'&&event.current.ai.shown<0.95){ + event.current.ai.shown+=0.3; + if(event.current.ai.shown>0.95) event.current.ai.shown=0.95; + } + return; + } + else event.current=event.current.next; + } + else event.current=event.current.next; } } }, @@ -1029,10 +946,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{global:['useCardAfter','useSkillAfter','phaseAfter']}, silent:true, charlotte:true, - filter:function(event){ + filter(event){ return event.skill!='jijiang'&&event.skill!='qinwang'; }, - content:function(){ + async content(event,trigger,player){ player.removeSkill('jijiang3'); } }, @@ -1044,13 +961,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, audioname:['re_guanyu','guanzhang','jsp_guanyu','guansuo','re_guanzhang','dc_jsp_guanyu'], enable:['chooseToRespond','chooseToUse'], - filterCard:function(card,player){ + filterCard(card,player){ if(get.zhu(player,'shouyue')) return true; return get.color(card)=='red'; }, position:'hes', viewAs:{name:'sha'}, - viewAsFilter:function(player){ + viewAsFilter(player){ if(get.zhu(player,'shouyue')){ if(!player.countCards('hes')) return false; } @@ -1059,13 +976,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, prompt:'将一张红色牌当杀使用或打出', - check:function(card){ - var val=get.value(card); + check(card){ + const val=get.value(card); if(_status.event.name=='chooseToRespond') return 1/Math.max(0.1,val); return 5-val; }, ai:{ - skillTagFilter:function(player){ + skillTagFilter(player){ if(get.zhu(player,'shouyue')){ if(!player.countCards('hes')) return false; } @@ -1085,15 +1002,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ animationColor:'orange', filterCard:true, position:'he', - filter:function(event,player){ + filter(event,player){ return player.countCards('he')>0; }, discard:false, lose:false, - content:function(){ + async content(event,trigger,player){ player.awakenSkill('zhongyi'); player.addTempSkill('zhongyi2','roundStart'); - player.addToExpansion(player,'give',cards).gaintag.add('zhongyi2'); + player.addToExpansion(player,'give',event.cards).gaintag.add('zhongyi2'); }, }, zhongyi2:{ @@ -1101,13 +1018,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, popup:false, logTarget:'source', - filter:function(event,player){ + filter(event,player){ return event.getParent().name=='sha'&&event.source&&event.source.isFriendOf(player); }, - content:function(){trigger.num++}, + async content(event,trigger,player){trigger.num++}, intro:{content:'expansion',markcount:'expansion'}, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); + onremove(player,skill){ + const cards=player.getExpansions(skill); if(cards.length) player.loseToDiscardpile(cards); }, }, @@ -1121,20 +1038,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, trigger:{player:'useCard1'}, forced:true, - filter:function(event,player){ + filter(event,player){ return !event.audioed&&event.card.name=='sha'&&player.countUsed('sha',true)>1&&event.getParent().type=='phase'; }, - content:function(){ + async content(event,trigger,player){ trigger.audioed=true; }, mod:{ - cardUsable:function(card,player,num){ + cardUsable(card,player,num){ if(card.name=='sha') return Infinity; } }, ai:{ unequip:true, - skillTagFilter:function(player,tag,arg){ + skillTagFilter(player,tag,arg){ if(!get.zhu(player,'shouyue')) return false; if(arg&&arg.name=='sha') return true; return false; @@ -1149,31 +1066,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'phaseZhunbeiBegin'}, frequent:true, preHidden:true, - content:function(){ - "step 0" - var num=Math.min(5,game.countPlayer()); - if(player.hasSkill('yizhi')&&player.hasSkill('guanxing')){ - num=5; - } - var cards=get.cards(num); + async content(event,trigger,player){ + const num=player.hasSkill('yizhi')&&player.hasSkill('guanxing')?5:Math.min(5,game.countPlayer()); + const cards=get.cards(num); game.cardsGotoOrdering(cards); - var next=player.chooseToMove(); + const next=player.chooseToMove(); next.set('list',[ ['牌堆顶',cards], ['牌堆底'], ]); next.set('prompt','观星:点击将牌移动到牌堆顶或牌堆底'); - next.processAI=function(list){ - var cards=list[0][1],player=_status.event.player; - var top=[]; - var judges=player.getCards('j'); - var stopped=false; + next.processAI=list=>{ + const cards=list[0][1],player=_status.event.player; + const top=[]; + const judges=player.getCards('j'); + let stopped=false; if(!player.hasWuxie()){ - for(var i=0;ijudge(b)-judge(a)); if(judge(cards[0])<0){ stopped=true;break; } @@ -1182,11 +1093,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } } - var bottom; + let bottom; if(!stopped){ - cards.sort(function(a,b){ - return get.value(b,player)-get.value(a,player); - }); + cards.sort((a,b)=>get.value(b,player)-get.value(a,player)); while(cards.length){ if(get.value(cards[0],player)<=5) break; top.unshift(cards.shift()); @@ -1195,22 +1104,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ bottom=cards; return [top,bottom]; } - "step 1" - var top=result.moved[0]; - var bottom=result.moved[1]; + const {result:{moved}}=await next; + const top=moved[0]; + const bottom=moved[1]; top.reverse(); game.cardsGotoPile( top.concat(bottom), ['top_cards',top], - function(event,card){ + (event,card)=>{ if(event.top_cards.includes(card)) return ui.cardPile.firstChild; return null; } - ) + ); player.popup(get.cnNumber(top.length)+'上'+get.cnNumber(bottom.length)+'下'); game.log(player,'将'+get.cnNumber(top.length)+'张牌置于牌堆顶'); - "step 2" - game.delayx(); + game.asyncDelayx(); }, ai:{ threaten:1.2 @@ -1218,7 +1126,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, kongcheng:{ mod:{ - targetEnabled:function(card,player,target,now){ + targetEnabled(card,player,target,now){ if(target.countCards('h')==0){ if(card.name=='sha'||card.name=='juedou') return false; } @@ -1229,7 +1137,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audioname:['re_zhugeliang'], ai:{ noh:true, - skillTagFilter:function(player,tag){ + skillTagFilter(player,tag){ if(tag=='noh'){ if(player.countCards('h')!=1) return false; } @@ -1242,14 +1150,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, firstDo:true, audioname:['re_zhugeliang'], - filter:function(event,player){ + filter(event,player){ if(player.countCards('h')) return false; - for(var i=0;i{ if(get.zhu(_status.event.player,'shouyue')){ if(get.suit(card)!='spade') return 2; } @@ -1370,17 +1277,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(get.color(card)=='red') return 2; } return -0.5; - }).judge2=function(result){ - return result.bool; - }; - "step 1" - if(result.bool){ + }); + judgeEvent.judge2=result=>result.bool; + const {result:{bool}}=await judgeEvent; + if(bool){ trigger.getParent().directHit.add(trigger.target); } }, ai:{ directHit_ai:true, - skillTagFilter:function(player,tag,arg){ + skillTagFilter(player,tag,arg){ if(get.attitude(player,arg.target)>0||arg.card.name!='sha'||!ui.cardPile.firstChild||get.color(ui.cardPile.firstChild,player)!='red') return false; }, }, @@ -1391,10 +1297,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'useCard'}, frequent:true, preHidden:true, - filter:function(event){ + filter(event){ return (get.type(event.card)=='trick'&&event.card.isCard); }, - content:function(){ + async content(event,trigger,player){ player.draw(); }, ai:{ @@ -1407,89 +1313,37 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'useCard'}, frequent:true, // alter:true, - filter:function(event){ - if(!get.is.altered('xinjizhi')&&get.type(event.card)=='delay') return false; + filter(event){ + if(get.type(event.card)=='delay') return false; return (get.type(event.card,'trick')=='trick'&&event.cards[0]&&event.cards[0]==event.card); }, - init:function(player){ - player.storage.xinjizhi=0; - }, - content:function(){ - 'step 0' + async content(event, trigger, player){ player.draw(); - 'step 1' - if(get.is.altered('xinjizhi')&&get.type(result[0])=='basic'){ - event.card=result[0]; - player.chooseBool('是否弃置'+get.translation(event.card)+'并令本回合手牌上限+1?').set('ai',function(evt,player){ - return _status.currentPhase==player&&player.needsToDiscard(-3)&&_status.event.value<6; - }).set('value',get.value(event.card,player)); - } - else{ - event.finish(); - } - 'step 2' - if(result.bool){ - player.discard(event.card); - player.storage.xinjizhi++; - if(_status.currentPhase==player){ - player.markSkill('xinjizhi'); - } - } }, ai:{ threaten:1.4, noautowuxie:true, }, - mod:{ - maxHandcard:function(player,num){ - if(get.is.altered('xinjizhi')&&_status.currentPhase==player){ - return num+player.storage.xinjizhi; - } - return num; - } - }, - intro:{ - content:'本回合手牌上限+#' - }, - group:'xinjizhi_clear', - subSkill:{ - clear:{ - trigger:{global:'phaseAfter'}, - silent:true, - content:function(){ - player.storage.xinjizhi=0; - player.unmarkSkill('xinjizhi'); - } - } - } }, qicai:{ mod:{ - targetInRange:function(card,player,target,now){ - var type=get.type(card); - if(type=='trick'||type=='delay') return true; + targetInRange(card,player,target,now){ + if(['trick','delay'].includes(get.type(card))) return true; } }, }, xinqicai:{ // alter:true, mod:{ - targetInRange:function(card,player,target,now){ - var type=get.type(card); - if(type=='trick'||type=='delay') return true; - }, - canBeDiscarded:function(card){ - if(get.is.altered('xinqicai')&&get.position(card)=='e') return false; - }, - cardDiscardable:function(card){ - if(get.is.altered('xinqicai')&&get.position(card)=='e') return false; + targetInRange(card,player,target,now){ + if(['trick','delay'].includes(get.type(card))) return true; } }, }, xinzhiheng:{ audio:'zhiheng', mod:{ - aiOrder:function(player,card,num){ + aiOrder(player,card,num){ if(num<=0||get.itemtype(card)!=='card'||get.type(card)!=='equip') return num; let eq=player.getEquip(get.subtype(card)); if(eq&&get.equipValue(card)-get.equipValue(eq)=8; - })){ + check(card){ + const player=_status.event.player; + if(get.is.altered('xinzhiheng')&&get.position(card)=='h'&&!player.countCards('h',card=>get.value(card)>=8)){ return 8-get.value(card); } return 6-get.value(card) }, delay:0, - content:function(){ - 'step 0' - if(!player.hasSkill('xinzhiheng_delay')) game.delayx(); - 'step 1' - player.draw(cards.length); + async content(event,trigger,player){ + if(!player.hasSkill('xinzhiheng_delay')) game.asyncDelayx(); + player.draw(event.cards.length); }, group:'xinzhiheng_draw', subSkill:{ draw:{ trigger:{player:'loseEnd'}, silent:true, - filter:function(event,player){ + filter(event,player){ if(event.getParent(2).skill!='xinzhiheng') return false; if(!get.is.altered('xinzhiheng')) return false; if(player.countCards('h')) return false; - for(var i=0;iget.value(i)>Math.max(6,9-player.hp),'he')) return 1; return 10; }, @@ -1548,7 +1398,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player:1 }, nokeep:true, - skillTagFilter:function(player,tag,arg){ + skillTagFilter(player,tag,arg){ if(tag==='nokeep') return (!arg||arg&&arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&!player.getStat().skill.xinzhiheng&&player.hasCard((card)=>get.name(card)!=='tao','h'); }, threaten:1.55 @@ -1558,7 +1408,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, audioname:['gz_jun_sunquan'], mod:{ - aiOrder:function(player,card,num){ + aiOrder(player,card,num){ if(num<=0||get.itemtype(card)!=='card'||get.type(card)!=='equip') return num; let eq=player.getEquip(get.subtype(card)); if(eq&&get.equipValue(card)-get.equipValue(eq){ return player!=target&&target.isDamaged()&&target.hpplayer!=target&&target.isDamaged()&&target.hp0){ + const current=event.list.shift(); event.current=current; - player.chooseBool(get.prompt('xinjiuyuan',current)).set('choice',get.attitude(player,current)>0); + const {result:{bool}}=await player.chooseBool(get.prompt('xinjiuyuan',current)).set('choice',get.attitude(player,current)>0); + if(bool){ + player.logSkill('xinjiuyuan',event.current); + event.current.recover(); + player.draw(); + } } - else{ - event.finish(); - } - 'step 2' - if(result.bool){ - player.logSkill('xinjiuyuan',event.current); - event.current.recover(); - player.draw(); - } - event.goto(1); } }, qixi:{ audio:2, audioname:['re_ganning','re_heqi'], enable:'chooseToUse', - filterCard:function(card){ + filterCard(card){ return get.color(card)=='black'; }, position:'hes', viewAs:{name:'guohe'}, - viewAsFilter:function(player){ + viewAsFilter(player){ if(!player.countCards('hes',{color:'black'})) return false; }, prompt:'将一张黑色牌当过河拆桥使用', - check:function(card){return 4-get.value(card)} + check(card){return 4-get.value(card)} }, keji:{ audio:2, audioname:['re_lvmeng','sp_lvmeng'], trigger:{player:'phaseDiscardBefore'}, - frequent:function(event,player){ + frequent(event,player){ return player.needsToDiscard(); }, - filter:function(event,player){ + filter(event,player){ if(player.getHistory('skipped').contains('phaseUse')) return true; - var history=player.getHistory('useCard').concat(player.getHistory('respond')); - for(var i=0;i=player.hp-1) return -1; if(player.hp<3) return -1; return 1; @@ -1720,10 +1557,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audioname:['sp_lvmeng'], trigger:{player:'phaseDrawBegin2'}, frequent:true, - filter:function(event,player){ + filter(event,player){ return !event.numFixed; }, - content:function(){ + async content(event,trigger,player){ trigger.num++; }, ai:{ @@ -1734,15 +1571,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'phaseUse', usable:1, - filter:function(event,player){ + filter(event,player){ return player.countCards('h')>0; }, - filterTarget:function(card,player,target){ + filterTarget(card,player,target){ return player!=target; }, - content:function(){ - "step 0" - target.chooseControl('heart2','diamond2','club2','spade2').set('ai',function(event){ + async content(event,trigger,player){ + const target=event.target; + const {result:{control}}=await target.chooseControl('heart2','diamond2','club2','spade2').set('ai',event=>{ switch(Math.floor(Math.random()*6)){ case 0:return 'heart2'; case 1:case 4:case 5:return 'diamond2'; @@ -1750,25 +1587,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ case 3:return 'spade2'; } }); - "step 1" - game.log(target,'选择了'+get.translation(result.control)); - event.choice=result.control; + game.log(target,'选择了'+get.translation(control)); + event.choice=control; target.chat('我选'+get.translation(event.choice)); - target.gainPlayerCard(player,true,'h'); - "step 2" - if(result.bool&&get.suit(result.cards[0],player)+'2'!=event.choice) target.damage('nocard'); + const {result:{bool,cards}}=await target.gainPlayerCard(player,true,'h'); + if(bool&&get.suit(cards[0],player)+'2'!=event.choice) target.damage('nocard'); }, ai:{ order:1, result:{ - target:function(player,target){ - var eff=get.damageEffect(target,player); + target(player,target){ + const eff=get.damageEffect(target,player); if(eff>=0) return 1+eff; - var value=0,i; - var cards=player.getCards('h'); - for(i=0;i0; }, enable:'chooseToUse', - filterCard:function(card){ + filterCard(card){ return get.suit(card)=='diamond'; }, position:'hes', viewAs:{name:'lebu'}, prompt:'将一张方片牌当乐不思蜀使用', - check:function(card){return 6-get.value(card)}, + check(card){return 6-get.value(card)}, ai:{ threaten:1.5 } @@ -1799,30 +1632,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{target:'useCardToTarget'}, direct:true, preHidden:true, - filter:function(event,player){ + filter(event,player){ if(event.card.name!='sha') return false; if(player.countCards('he')==0) return false; - return game.hasPlayer(function(current){ + return game.hasPlayer(current=>{ return player.inRange(current)&¤t!=event.player&& current!=player&&lib.filter.targetEnabled(event.card,event.player,current); }); }, - content:function(){ - "step 0" - var next=player.chooseCardTarget({ + async content(event,trigger,player){ + const {result:{bool,targets,cards}}=await player.chooseCardTarget({ position:'he', filterCard:lib.filter.cardDiscardable, - filterTarget:function(card,player,target){ - var trigger=_status.event; + filterTarget:(card,player,target)=>{ + const trigger=_status.event; if(player.inRange(target)&&target!=trigger.source){ if(lib.filter.targetEnabled(trigger.card,trigger.source,target)) return true; } return false; }, - ai1:function(card){ - return get.unuseful(card)+9; - }, - ai2:function(target){ + ai1:card=>get.unuseful(card)+9, + ai2:target=>{ if(_status.event.player.countCards('h','shan')){ return -get.attitude(_status.event.player,target); } @@ -1842,12 +1672,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ source:trigger.player, card:trigger.card, }).setHiddenSkill(event.name); - "step 1" - if(result.bool){ - var target=result.targets[0]; + if(bool){ + const target=targets[0]; player.logSkill(event.name,target); - player.discard(result.cards); - var evt=trigger.getParent(); + player.discard(cards); + const evt=trigger.getParent(); evt.triggeredTargets2.remove(player); evt.targets.remove(player); evt.targets.push(target); @@ -1855,14 +1684,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ effect:{ - target:function(card,player,target){ + target(card,player,target){ if(target.countCards('he')==0) return; if(card.name!='sha') return; - var min=1; - var friend=get.attitude(player,target)>0; - var vcard={name:'shacopy',nature:card.nature,suit:card.suit}; - var players=game.filterPlayer(); - for(var i=0;i0; + const vcard={name:'shacopy',nature:card.nature,suit:card.suit}; + const players=game.filterPlayer(); + for(let i=0;i0; }, - content:function(){ + async content(event,trigger,player){ player.draw(); }, ai:{ threaten:0.8, effect:{ - target:function(card){ + target(card){ if(card.name=='guohe'||card.name=='liuxinghuoyu') return 0.5; } }, noh:true, - skillTagFilter:function(player,tag){ + skillTagFilter(player,tag){ if(tag=='noh'){ if(player.countCards('h')!=1) return false; } @@ -1926,31 +1755,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){ global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], }, frequent:true, - filter:function(event,player){ - var evt=event.getl(player); + filter(event,player){ + const evt=event.getl(player); return evt&&evt.player==player&&evt.es&&evt.es.length>0; }, - content:function(){ - "step 0" + async content(event,trigger,player){ event.count=trigger.getl(player).es.length; - "step 1" - event.count--; - player.draw(2); - "step 2" - if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ - player.chooseBool(get.prompt2('xiaoji')).set('frequentSkill','xiaoji').ai=lib.filter.all; - } - "step 3" - if(result.bool){ - player.logSkill('xiaoji'); - event.goto(1); - } + do { + player.draw(2); + if(!player.hasSkill(event.name)) break; + if(!get.is.blocked(event.name,player)){ + const chooseBoolEvent=player.chooseBool(get.prompt2('xiaoji')).set('frequentSkill','xiaoji'); + chooseBoolEvent.ai=lib.filter.all; + const {result:{bool}}=await chooseBoolEvent; + if(bool) player.logSkill('xiaoji'); + else break; + } + }while(event.count-->0); }, ai:{ noe:true, reverseEquip:true, effect:{ - target:function(card,player,target,current){ + target(card,player,target,current){ if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,3]; } } @@ -1962,28 +1789,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterCard:true, usable:1, selectCard:2, - check:function(card){ - var player=get.owner(card); - if(player.countCards('h')>player.hp) - return 8-get.value(card) - if(player.hpplayer.hp) return 8-get.value(card); + if(player.hp=target.maxHp) return false; if(target==player) return false; return true; }, - content:function(){ + async content(event,trigger,player){ player.recover(); - target.recover(); + event.target.recover(); }, ai:{ order:5.5, result:{ - player:function(player){ + player(player){ if(player.hpplayer.hp) return 0 return -1; @@ -2003,20 +1828,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterCard:true, usable:1, position:'he', - filter:function(event,player){ + filter(event,player){ if(!get.is.altered('xinjieyin')) return false; return player.countCards('he')>0; }, - check:function(card){ - var player=_status.event.player; + check(card){ + const player=_status.event.player; if(get.position(card)=='e'){ - var subtype=get.subtype(card); - if(!game.hasPlayer(function(current){ - return current!=player&¤t.hp!=player.hp&&get.attitude(player,current)>0&&!current.countCards('e',{subtype:subtype}); + const subtype=get.subtype(card); + if(!game.hasPlayer(current=>{ + return current!=player&¤t.hp!=player.hp&&get.attitude(player,current)>0&&!current.countCards('e',{subtype}); })){ return 0; } - if(player.countCards('h',{subtype:subtype})) return 20-get.value(card); + // 你还想我兼容{subtype:subtype}?不可能! + if(player.countCards('h',{subtype})) return 20-get.value(card); return 10-get.value(card); } else{ @@ -2025,9 +1851,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 8-get.value(card); } }, - filterTarget:function(card,player,target){ + filterTarget(card,player,target){ if(!target.hasSex('male')) return false; - var card=ui.selected.cards[0]; + card=ui.selected.cards[0]; if(!card) return false; if(get.position(card)=='e'&&target.countCards('e',{subtype:get.subtype(card)})) return false; return true; @@ -2035,8 +1861,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ discard:false, delay:0, lose:false, - content:function(){ - 'step 0' + async content(event,trigger,player){ + const {cards,target}=event; if(get.position(cards[0])=='e'){ player.$give(cards,target); target.equip(cards[0]); @@ -2044,30 +1870,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else{ player.discard(cards); } - 'step 1' if(player.hp>target.hp){ player.draw(); if(target.isDamaged()) target.recover(); } else if(player.hp{ + const es=player.getCards('e'); + for(let i=0;i=2; }, - check:function(card){ - var player=get.owner(card); - if(player.countCards('h')>player.hp) - return 8-get.value(card) - if(player.hpplayer.hp) return 8-get.value(card); + if(player.hp=target.maxHp) return false; if(target==player) return false; return true; }, - content:function(){ + async content(event,trigger,player){ player.recover(); - target.recover(); + event.target.recover(); }, ai:{ order:5.5, result:{ - player:function(player){ + player(player){ if(player.hpplayer.hp) return 0 return -1; @@ -2141,20 +1964,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'phaseUse', filterCard:true, usable:1, - check:function(card){ - return 9-get.value(card) + check(card){ + return 9-get.value(card); }, - filterTarget:function(card,player,target){ + filterTarget(card,player,target){ if(target.hp>=target.maxHp) return false; return true; }, - content:function(){ - target.recover(); + async content(event,trigger,player){ + event.target.recover(); }, ai:{ order:9, result:{ - target:function(player,target){ + target(player,target){ if(target.hp==1) return 5; if(player==target&&player.countCards('h')>player.hp) return 5; return 2; @@ -2165,23 +1988,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, jijiu:{ mod:{ - aiValue:function(player,card,num){ + aiValue(player,card,num){ if(get.name(card)!='tao'&&get.color(card)!='red') return; - var cards=player.getCards('hs',function(card){ - return get.name(card)=='tao'||get.color(card)=='red'; - }); - cards.sort(function(a,b){ - return (get.name(a)=='tao'?1:2)-(get.name(b)=='tao'?1:2); - }); - var geti=function(){ - if(cards.contains(card)){ - return cards.indexOf(card); - } + const cards=player.getCards('hs',card=>get.name(card)=='tao'||get.color(card)=='red'); + cards.sort((a,b)=>(get.name(a)=='tao'?1:2)-(get.name(b)=='tao'?1:2)); + var geti=()=>{ + if(cards.includes(card)) cards.indexOf(card); return cards.length; }; return Math.max(num,[6.5,4,3,2][Math.min(geti(),2)]); }, - aiUseful:function(){ + aiUseful(){ return lib.skill.kanpo.mod.aiValue.apply(this,arguments); }, }, @@ -2189,16 +2006,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, audioname:['re_huatuo'], enable:'chooseToUse', - viewAsFilter:function(player){ + viewAsFilter(player){ return player!=_status.currentPhase&&player.countCards('hes',{color:'red'})>0; }, - filterCard:function(card){ + filterCard(card){ return get.color(card)=='red'; }, position:'hes', viewAs:{name:'tao'}, prompt:'将一张红色牌当桃使用', - check:function(card){return 15-get.value(card)}, + check(card){return 15-get.value(card)}, ai:{ threaten:1.5, } @@ -2217,14 +2034,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audioname:['re_lvbu','shen_lvbu','lvlingqi'], trigger:{player:'useCardToPlayered'}, forced:true, - filter:function(event,player){ - return event.card.name=='sha'&&!event.getParent().directHit.contains(event.target); + filter(event,player){ + return event.card.name=='sha'&&!event.getParent().directHit.includes(event.target); }, //priority:-1, logTarget:'target', - content:function(){ - var id=trigger.target.playerid; - var map=trigger.getParent().customArgs; + async content(event,trigger,player){ + const id=trigger.target.playerid; + const map=trigger.getParent().customArgs; if(!map[id]) map[id]={}; if(typeof map[id].shanRequired=='number'){ map[id].shanRequired++; @@ -2235,7 +2052,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ directHit_ai:true, - skillTagFilter:function(player,tag,arg){ + skillTagFilter(player,tag,arg){ if(arg.card.name!='sha'||arg.target.countCards('h','shan')>1) return false; }, }, @@ -2245,17 +2062,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audioname:['re_lvbu','shen_lvbu','lvlingqi'], trigger:{player:'useCardToPlayered',target:'useCardToTargeted'}, forced:true, - logTarget:function(trigger,player){ + logTarget(trigger,player){ return player==trigger.player?trigger.target:trigger.player }, - filter:function(event,player){ + filter(event,player){ return event.card.name=='juedou'; }, //priority:-1, - content:function(){ - var id=(player==trigger.player?trigger.target:trigger.player)['playerid']; - var idt=trigger.target.playerid; - var map=trigger.getParent().customArgs; + async content(event,trigger,player){ + const id=(player==trigger.player?trigger.target:trigger.player)['playerid']; + const idt=trigger.target.playerid; + const map=trigger.getParent().customArgs; if(!map[idt]) map[idt]={}; if(!map[idt].shaReq) map[idt].shaReq={}; if(!map[idt].shaReq[id]) map[idt].shaReq[id]=1; @@ -2263,7 +2080,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ directHit_ai:true, - skillTagFilter:function(player,tag,arg){ + skillTagFilter(player,tag,arg){ if(arg.card.name!='juedou'||Math.floor(arg.target.countCards('h','sha')/2)>player.countCards('h','sha')) return false; } } @@ -2274,15 +2091,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, skillAnimation:true, animationColor:'gray', - filter:function(event,player){ - return player.isDamaged()&&game.dead.filter(function(target){ - return target.isFriendOf(player); - }).length>0 + filter(event,player){ + return player.isDamaged()&&game.dead.filter(target=>target.isFriendOf(player)).length>0 }, - content:function(){ + async content(event,trigger,player){ player.awakenSkill('zhanshen'); - var card=player.getEquips(1); - if(cards.length) player.discard(card); + const cards=player.getEquips(1); + if(cards.length) player.discard(cards); player.loseMaxHp(); player.addSkill('mashu'); player.addSkill('shenji'); @@ -2291,11 +2106,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, shenji:{ mod:{ - selectTarget:function(card,player,range){ + selectTarget(card,player,range){ if(range[1]==-1) return; if(card.name=='sha') range[1]+=2; }, - cardUsable:function(card,player,num){ + cardUsable(card,player,num){ if(card.name=='sha') return num+1; } }, @@ -2305,15 +2120,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audioname:['re_diaochan'], enable:'phaseUse', usable:1, - filter:function(event,player){ - return game.countPlayer(function(current){ - return current!=player&¤t.hasSex('male'); - })>1; + filter(event,player){ + return game.countPlayer(current=>current!=player&¤t.hasSex('male'))>1; }, - check:function(card){return 10-get.value(card)}, + check(card){return 10-get.value(card)}, filterCard:true, position:'he', - filterTarget:function(card,player,target){ + filterTarget(card,player,target){ if(player==target) return false; if(!target.hasSex('male')) return false; if(ui.selected.targets.length==1){ @@ -2324,14 +2137,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ targetprompt:['先出杀','后出杀'], selectTarget:2, multitarget:true, - content:function(){ - targets[1].useCard({name:'juedou',isCard:true},'nowuxie',targets[0],'noai').animate=false; - game.delay(0.5); + async content(event,trigger,player){ + const useCardEvent=event.targets[1].useCard({name:'juedou',isCard:true},'nowuxie',event.targets[0],'noai'); + useCardEvent.animate=false; + game.asyncDelay(0.5); }, ai:{ order:8, result:{ - target:function(player,target){ + target(player,target){ if(ui.selected.targets.length==0){ return -3; } @@ -2349,7 +2163,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'phaseJieshuBegin'}, frequent:true, preHidden:true, - content:function(){ + async content(event,trigger,player){ player.draw(); }, }, @@ -2358,34 +2172,28 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'phaseJieshuBegin'}, frequent:true, // alter:true, - content:function(){ - var num=1; - if(get.is.altered('xinbiyue')&&!player.countCards('h')){ - num=2; - } - player.draw(num); + async content(event,trigger,player){ + player.draw(); }, }, yaowu:{ trigger:{player:'damageBegin3'}, //priority:1, audio:2, - filter:function(event){ + filter(event){ if(event.card&&(event.card.name=='sha')){ if(get.color(event.card)=='red') return true; } return false; }, forced:true, - check:function(){ - return false; - }, - content:function(){ + check(){return false;}, + async content(event,trigger,player){ trigger.source.chooseDrawRecover(true); }, ai:{ effect:{ - target:function(card,player,target,current){ + target(card,player,target,current){ if(card.name=='sha'&&(get.color(card)=='red')){ return [1,-2]; } @@ -2399,13 +2207,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player:"phaseDrawEnd", }, direct:true, - content:function (){ - "step 0" - var list=['弃牌','摸牌','取消']; + async content(event,trigger,player){ + const list=['弃牌','摸牌','取消']; if(!player.countCards('he')) list.remove('弃牌'); - player.chooseControl(list,function(){ - var player=_status.event.player; - if(list.contains('弃牌')){ + const {result:{control}}=await player.chooseControl(list,()=>{ + const player=_status.event.player; + if(list.includes('弃牌')){ if(player.countCards('h')>3&&player.countCards('h','sha')>1){ return '弃牌'; } @@ -2418,13 +2225,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } return 'cancel2'; }).set('prompt',get.prompt2('new_jiangchi')); - "step 1" - if(result.control=='弃牌'){ + if(control=='弃牌'){ player.chooseToDiscard(true,'he'); player.addTempSkill('jiangchi2','phaseUseEnd'); player.logSkill('new_jiangchi'); } - else if(result.control=='摸牌'){ + else if(control=='摸牌'){ player.draw(); player.addTempSkill('new_jiangchi3','phaseEnd'); player.logSkill('new_jiangchi'); @@ -2433,21 +2239,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, new_jiangchi3:{ mod:{ - cardEnabled:function(card){ + cardEnabled(card){ if(card.name=='sha') return false; }, - cardRespondable:function(card){ + cardRespondable(card){ if(card.name=='sha') return false; }, - ignoredHandcard:function(card,player){ - if(get.name(card)=='sha'){ - return true; - } + ignoredHandcard(card,player){ + if(get.name(card)=='sha') return true; }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&get.name(card)=='sha'){ - return false; - } + cardDiscardable(card,player,name){ + if(name=='phaseDiscard'&&get.name(card)=='sha') return false; }, }, }, @@ -2455,13 +2257,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:"phaseUse", usable:1, audio:2, - content:function(){ - 'step 0' - var card=get.bottomCards()[0]; + async content(event,trigger,player){ + const card=get.bottomCards()[0]; game.cardsGotoOrdering(card); event.card=card; - player.chooseTarget(true).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); + const {result:{bool,targets}}=await player.chooseTarget(true).set('ai',target=>{ + let att=get.attitude(_status.event.player,target); if(_status.event.du){ if(target.hasSkillTag('nodu')) return 0.5; return -att; @@ -2475,12 +2276,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ '机捷:选择一名角色获得此牌', [card] ]); - 'step 1' - if(result.bool){ - var target=result.targets[0]; + if(bool){ + const target=targets[0]; player.line(target,'green'); - var next=target.gain(card,'draw'); - next.giver=player; + const gainEvent=target.gain(card,'draw'); + gainEvent.giver=player; } }, ai:{ @@ -2495,36 +2295,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ global:['dying','gainAfter','loseAsyncAfter'], }, audio:2, - filter:function(event,player){ + filter(event,player){ if(event.name=='dying') return true; if(event.giver!=player) return false; if(event.name=='gain'){ return event.player!=player&&event.getg(event.player).length>0; } - return game.hasPlayer(function(current){ - return current!=player&&event.getg(current).length>0; - }); + return game.hasPlayer(current=>current!=player&&event.getg(current).length>0); }, direct:true, - content:function(){ - 'step 0' + async content(event,trigger,player){ if(trigger.name!='loseAsync') event.targets=[trigger.player]; - else event.targets=game.filterPlayer(function(current){ - return current!=player&&trigger.getg(current).length>0; - }); - 'step 1' - var target=event.targets.shift(); - event.target=target; - player.chooseBool(get.prompt2('xinfu_jiyuan',target)).set('ai',function(){ - var evt=_status.event; - return get.attitude(player,evt.getParent().target)>0; - }); - 'step 2' - if(result.bool){ - player.logSkill('xinfu_jiyuan',target); - target.draw(); - } - if(targets.length>0) event.goto(1); + else event.targets=game.filterPlayer(current=>current!=player&&trigger.getg(current).length>0); + do{ + const target=event.targets.shift(); + event.target=target; + const {result:{bool}}=await player.chooseBool(get.prompt2('xinfu_jiyuan',target)).set('ai',()=>{ + const evt=_status.event; + return get.attitude(player,evt.getParent().target)>0; + }); + if(bool){ + player.logSkill('xinfu_jiyuan',target); + target.draw(); + } + }while(event.targets.length>0); }, }, }, diff --git a/character/swd.js b/character/swd.js index f4447266a..20dc6119f 100644 --- a/character/swd.js +++ b/character/swd.js @@ -9766,292 +9766,291 @@ game.import('character',function(lib,game,ui,get,ai,_status){ swd_xiaohuanglong:'小黄龙', cyshuiyun:'水云', - cyshuiyun_info:'准备阶段,你可以弃置一名其他角色的一张牌;每当你失去此技能,你可以弃置一名其他角色的一张牌', + cyshuiyun_info:'准备阶段,你可以弃置一名其他角色的一张牌;每当你失去此技能,你可以弃置一名其他角色的一张牌。', cyliuzi:'流紫', - cyliuzi_info:'摸牌阶段,你可以额外摸一张牌;每当你失去此技能,你可以摸一张牌', + cyliuzi_info:'摸牌阶段,你可以额外摸一张牌;每当你失去此技能,你可以摸一张牌。', cyyijin:'异金', - cyyijin_info:'出牌阶段,你可以对一名体力值为全场最多的角色造成1点伤害;每当你失去此技能,你可以对一名体力值为全场最多的角色造成1点伤害', + cyyijin_info:'出牌阶段,你可以对一名体力值为全场最多的角色造成1点伤害;每当你失去此技能,你可以对一名体力值为全场最多的角色造成1点伤害。', cyqingling:'青凌', - cyqingling_info:'弃牌阶段,若你弃置了至少一张牌,你可以获得1点护甲;每当你失去此技能,你可以获得1点护甲', + cyqingling_info:'弃牌阶段,若你弃置了至少一张牌,你可以获得1点护甲;每当你失去此技能,你可以获得1点护甲。', cyqiandian:'千靛', - cyqiandian_info:'结束阶段,你可以视为使用一张惊雷闪;每当你失去此技能,你可以视为使用一张惊雷闪', + cyqiandian_info:'结束阶段,你可以视为使用一张惊雷闪;每当你失去此技能,你可以视为使用一张惊雷闪。', gxianyin:'仙音', - gxianyin_info:'出牌阶段限一次,你可以选择一种花色,将你的手牌中该花色的牌移至弃牌堆,然后选择另一种花色,从牌堆中获得等量的该花色的牌', + gxianyin_info:'出牌阶段限一次,你可以选择一种花色,将你的手牌中该花色的牌移至弃牌堆,然后选择另一种花色,从牌堆中获得等量的该花色的牌。', // gxianyin_info_alter:'', cyxianjiang:'仙匠', - cyxianjiang_info:'每当你使用一张牌指定惟一目标时,你可以复制对方装备区内的一张你没有的牌,并置入你的装备区,每回合对一名角色最多发动一次', + cyxianjiang_info:'每当你使用一张牌指定惟一目标时,你可以复制对方装备区内的一张你没有的牌,并置入你的装备区,每回合对一名角色最多发动一次。', cyqiaoxie:'巧械', - cyqiaoxie_info:'每当你失去一张装备牌(使用除外),你可以随机观看三张机关牌,并使用其中一张', - cyqiaoxie_info_alter:'每当你装备一件装备,若你的手牌数不大于体力值,你可以摸一张牌;每当你失去一件装备牌,你可以随机观看2张机关牌,并使用其中一张', + cyqiaoxie_info:'每当你失去一张装备牌(使用除外),你可以随机观看三张机关牌,并使用其中一张。', + cyqiaoxie_info_alter:'每当你装备一件装备,若你的手牌数不大于体力值,你可以摸一张牌;每当你失去一件装备牌,你可以随机观看2张机关牌,并使用其中一张。', cyzhencha:'侦察', - cyzhencha_info:'出牌阶段限一次,若你的装备区内的可强化装备,你可以弃置一张基本牌并观看一名其他角色的手牌,若其中有与你弃置的牌颜色相同的牌,你随机升级装备区内的一件装备,否则你摸一张牌;你根据装备区内升级的装备数获得额外技能', + cyzhencha_info:'出牌阶段限一次,若你的装备区内的可强化装备,你可以弃置一张基本牌并观看一名其他角色的手牌,若其中有与你弃置的牌颜色相同的牌,你随机升级装备区内的一件装备,否则你摸一张牌;你根据装备区内升级的装备数获得额外技能。', cylingjia:'灵甲', - cylingjia_info:'出牌阶段限一次,你可以弃置一张装备牌,然后令云狐随机装备一件装备(不替换现有装备)并将其强化', + cylingjia_info:'出牌阶段限一次,你可以弃置一张装备牌,然后令云狐随机装备一件装备(不替换现有装备)并将其强化。', cyqiaobo:'巧补', - cyqiaobo_info:'出牌阶段限一次,你可以弃置一张锦囊牌,然后令云狐回复1点体力', + cyqiaobo_info:'出牌阶段限一次,你可以弃置一张锦囊牌,然后令云狐回复1点体力。', cqiaoxie:'巧械', - cqiaoxie_info:'出牌阶段限一次,你可以将一张锦囊牌当作零件袋使用;每当你使用一张零件牌,你获得1点技能点数', + cqiaoxie_info:'出牌阶段限一次,你可以将一张锦囊牌当作零件袋使用;每当你使用一张零件牌,你获得1点技能点数。', xiufu:'修复', - xiufu_info:'出牌阶段,你可以弃置一张装备牌或机关牌,令云狐回复1点体力', + xiufu_info:'出牌阶段,你可以弃置一张装备牌或机关牌,令云狐回复1点体力。', yhshengong:'神工', - yhshengong_info:'游戏开始时,你获得3点技能点数;每当你造成1点伤害,你获得1点技能点数;出牌阶段,你可以通过消耗技能点令云狐获得新的技能(云狐体力为0时无法学习或发动技能)', + yhshengong_info:'游戏开始时,你获得3点技能点数;每当你造成1点伤害,你获得1点技能点数;出牌阶段,你可以通过消耗技能点令云狐获得新的技能(云狐体力为0时无法学习或发动技能)。', juxi:'聚息', - juxi_info:'锁定技,每当一名角色于其回合外弃置牌,你获得一枚聚息标记;出牌阶段限一次,你可以移去X枚聚息标记,然后选择一项:对一名角造成1点伤害,或令一名角色回复1点体力,X为存活角色数', + juxi_info:'锁定技,每当一名角色于其回合外弃置牌,你获得一枚聚息标记;出牌阶段限一次,你可以移去X枚聚息标记,然后选择一项:对一名角造成1点伤害,或令一名角色回复1点体力,X为存活角色数。', yeying:'曳影', - yeying_info:'出牌阶段限一次,你可以将一张黑色牌当作乾坤镖使用', + yeying_info:'出牌阶段限一次,你可以将一张黑色牌当作乾坤镖使用。', jiefen:'解纷', - jiefen_info:'出牌阶段限一次,你可以令一名手牌数多于你的角色交给你一张牌,然后你交给一名手牌数少于你的角色一张牌', + jiefen_info:'出牌阶段限一次,你可以令一名手牌数多于你的角色交给你一张牌,然后你交给一名手牌数少于你的角色一张牌。', datong:'大同', - datong_info:'任意一名角色的结束阶段,若全场手牌数最多和最少的角色手牌数之差不超过1,你摸两张牌', + datong_info:'任意一名角色的结束阶段,若全场手牌数最多和最少的角色手牌数之差不超过1,你摸两张牌。', huodan:'火丹', - huodan_info:'出牌阶段限一次,你可以弃置一张红色牌并失去1点体力,然后将2点火属性伤害分配给1~2名角色', - huodan_info_alter:'出牌阶段限一次,你可以弃置一张红色牌并失去1点体力,然后将2点火属性伤害分配给1~2名角色;若你只分配了一名角色,该角色在结算后摸一张牌', + huodan_info:'出牌阶段限一次,你可以弃置一张红色牌并失去1点体力,然后将2点火属性伤害分配给1~2名角色。', + huodan_info_alter:'出牌阶段限一次,你可以弃置一张红色牌并失去1点体力,然后将2点火属性伤害分配给1~2名角色;若你只分配了一名角色,该角色在结算后摸一张牌。', sxianjing:'陷阱', sxianjing_bg:'阱', - sxianjing_info:'出牌阶段,你可以将一张手牌背面朝上置于你的武将牌上(不能与已有花色相同)。当一名其他角色使用与一张“陷阱”牌花色相同的牌指定你为目标时,你移去对应的“陷阱”牌,然后随机获得该角色的一张牌。每当你受到一次伤害,你随机将一张“陷阱”牌返回手牌', + sxianjing_info:'出牌阶段,你可以将一张手牌背面朝上置于你的武将牌上(不能与已有花色相同)。当一名其他角色使用与一张“陷阱”牌花色相同的牌指定你为目标时,你移去对应的“陷阱”牌,然后随机获得该角色的一张牌。每当你受到一次伤害,你随机将一张“陷阱”牌返回手牌。', zhanxing:'占星', - zhanxing_info:'出牌阶段限一次,你可以弃置任意张牌,并亮出牌堆顶的等量的牌,并根据亮出的牌包含的花色执行以下效果:♦︎摸两张牌;♥回复1点体力(若未损失体力改为获得1点护甲);♣令所有敌人随机弃置一张牌;♠令一名角色受到1点无来源的雷属性伤害', + zhanxing_info:'出牌阶段限一次,你可以弃置任意张牌,并亮出牌堆顶的等量的牌,并根据亮出的牌包含的花色执行以下效果:♦︎摸两张牌;♥回复1点体力(若未损失体力改为获得1点护甲);♣令所有敌人随机弃置一张牌;♠令一名角色受到1点无来源的雷属性伤害。', kbolan:'博览', - kbolan_info:'每当你摸牌时,你可以额外摸一张牌,然后摸牌结束时将一张手牌置于牌堆顶', + kbolan_info:'每当你摸牌时,你可以额外摸一张牌,然后摸牌结束时将一张手牌置于牌堆顶。', gaizao:'改造', - gaizao_info:'每当你即将装备一张牌(特殊类装备除外),若你的装备区内对应位置已有牌,你可以永久改变此牌的装备类型使其装备在装备区内的空余位置', + gaizao_info:'每当你即将装备一张牌(特殊类装备除外),若你的装备区内对应位置已有牌,你可以永久改变此牌的装备类型使其装备在装备区内的空余位置。', lingshi:'灵矢', - lingshi_info:'你的装备区内每有一张牌,你的攻击范围+2;当你的装备区内有武器牌或防具牌时,你的杀不可闪避;当你的装备区内有马时,你摸牌阶段额外摸一张牌;当你的装备内的宝物牌时,你回合内可以额外使用一张杀', + lingshi_info:'你的装备区内每有一张牌,你的攻击范围+2;当你的装备区内有武器牌或防具牌时,你的杀不可闪避;当你的装备区内有马时,你摸牌阶段额外摸一张牌;当你的装备内的宝物牌时,你回合内可以额外使用一张杀。', tiebi:'铁壁', - tiebi_info:'当距离你1以内的一名角色成为杀的目标时,若其没有护甲,你可以弃置一张黑色手牌使其获得1点护甲', + tiebi_info:'当距离你1以内的一名角色成为杀的目标时,若其没有护甲,你可以弃置一张黑色手牌使其获得1点护甲。', shenyan:'神炎', shenyan_bg:'炎', - shenyan_info:'限定技,当你即将造成火焰伤害时,你可以令此伤害+1,并对目标距离1以内的所有其他角色各造成1点火焰伤害', + shenyan_info:'限定技,当你即将造成火焰伤害时,你可以令此伤害+1,并对目标距离1以内的所有其他角色各造成1点火焰伤害。', xuanying:'旋影', - xuanying_info:'你可以横置你的武将牌,视为使用一张无视距离的杀;每当你于回合外失去牌,你可以竖置你的武将牌,视为使用一张无视距离的杀', + xuanying_info:'你可以横置你的武将牌,视为使用一张无视距离的杀;每当你于回合外失去牌,你可以竖置你的武将牌,视为使用一张无视距离的杀。', hwendao:'问道', - hwendao_info:'每当你于回合外使用或打出一张牌,你可以令当前回合角色弃置一张与之花色相同的牌,否则你获得其一张牌', + hwendao_info:'每当你于回合外使用或打出一张牌,你可以令当前回合角色弃置一张与之花色相同的牌,否则你获得其一张牌。', lingfeng:'凌锋', - lingfeng_info:'结束阶段,若你本回合内使用了至少X张牌,你可以选择一项:获得1点护甲,或对攻击范围内的一名角色造成1点伤害(X为你当前的体力值且最多为3)', + lingfeng_info:'结束阶段,若你本回合内使用了至少X张牌,你可以选择一项:获得1点护甲,或对攻击范围内的一名角色造成1点伤害(X为你当前的体力值且最多为3)。', hxunzhi:'殉志', - hxunzhi_info:'限定技,出牌阶段,你可以视为使用一张万箭齐发并获得技能武圣、咆哮,若如此做,你在此阶段结束时死亡', - hxunzhi_info_alter:'限定技,出牌阶段,你可以获得技能武圣、咆哮,若如此做,你在此阶段结束时死亡', + hxunzhi_info:'限定技,出牌阶段,你可以视为使用一张万箭齐发并获得技能武圣、咆哮,若如此做,你在此阶段结束时死亡。', + hxunzhi_info_alter:'限定技,出牌阶段,你可以获得技能武圣、咆哮,若如此做,你在此阶段结束时死亡。', lmazui:'麻醉', lmazui2:'麻醉', - lmazui_info:'出牌阶段限一次,你可以将一张黑色手牌置于一名角色的武将牌上,该角色造成的下一次伤害-1,然后获得此牌', + lmazui_info:'出牌阶段限一次,你可以将一张黑色手牌置于一名角色的武将牌上,该角色造成的下一次伤害-1,然后获得此牌。', hyunshen:'云身', hyunshen2:'云身', - hyunshen_info:'每当你打出一张闪,你可以令你的防御距离+1;准备阶段,你将累计的防御距离清零,然后摸等量的牌', + hyunshen_info:'每当你打出一张闪,你可以令你的防御距离+1;准备阶段,你将累计的防御距离清零,然后摸等量的牌。', hlingbo:'凌波', - hlingbo_info:'每当你使用或打出一张闪,你可以摸两张牌', + hlingbo_info:'每当你使用或打出一张闪,你可以摸两张牌。', gtiandao:'天道', - gtiandao_info:'任意一名角色的判定生效前,你可以打出一张牌替换之', + gtiandao_info:'任意一名角色的判定生效前,你可以打出一张牌替换之。', nlianji:'连计', nlianji_info:'出牌阶段限一次,你可以选择一张手牌并指定两名角色进行拼点。若拼点结果不为平局,拼点赢的角色获得此牌,并对没赢的角色造成1点伤害。', fengze:'风泽', - fengze_info:'出牌阶段限一次,你可以将一张黑色牌当作桃园结义使用', + fengze_info:'出牌阶段限一次,你可以将一张黑色牌当作桃园结义使用。', lingyue:'凌月', - lingyue_info:'每当你使用一张杀,你可以令目标弃置一张牌', + lingyue_info:'每当你使用一张杀,你可以令目标弃置一张牌。', jinlin:'金鳞', - jinlin_info:'限定技,出牌阶段,你可以令任意名角色各获得3点护甲,获得护甲的角色于每个准备阶段失去1点护甲,直到首次失去所有护甲或累计以此法失去3点护甲', + jinlin_info:'限定技,出牌阶段,你可以令任意名角色各获得3点护甲,获得护甲的角色于每个准备阶段失去1点护甲,直到首次失去所有护甲或累计以此法失去3点护甲。', huanxia:'幻霞', - huanxia_info:'你可以将一张红色牌当作杀使用,若此杀未造成伤害,你在结束阶段收回此牌', + huanxia_info:'你可以将一张红色牌当作杀使用,若此杀未造成伤害,你在结束阶段收回此牌。', jingjie:'幻镜', - jingjie_info:'准备阶段,你可以失去1点体力,并', - jingjie_old_info:'限定技,出牌阶段,你可以令所有角色弃置所有牌,然后摸两张牌(不触发任何技能)', + jingjie_info:'限定技,出牌阶段,你可以令所有角色弃置所有牌,然后摸两张牌(不触发任何技能)。', kongmo:'恐魔', - kongmo_info:'锁定技,你使用基本牌或普通锦囊牌后将额外结算一次卡牌效果', + kongmo_info:'锁定技,你使用基本牌或普通锦囊牌后将额外结算一次卡牌效果。', jufu:'巨斧', - jufu_info:'锁定技,当你有武器牌时,杀造成的伤害+1', + jufu_info:'锁定技,当你有武器牌时,杀造成的伤害+1。', huajing:'化精', - huajing_info:'每当你使用锦囊牌造成伤害,可以回复1点体力并摸一张牌', + huajing_info:'每当你使用锦囊牌造成伤害,可以回复1点体力并摸一张牌。', pingxu:'冯虚', - pingxu_info:'锁定技,当你没有武器牌时,你的进攻距离+1;当你没有防具牌时,你的防御距离+1', + pingxu_info:'锁定技,当你没有武器牌时,你的进攻距离+1;当你没有防具牌时,你的防御距离+1。', yudun:'愚钝', - yudun_info:'锁定技,你无法使用锦囊牌;你可以将两张锦囊牌当作一张不计入出杀次数的杀使用', + yudun_info:'锁定技,你无法使用锦囊牌;你可以将两张锦囊牌当作一张不计入出杀次数的杀使用。', bingfeng:'冰封', bingfeng2:'冰封', - bingfeng2_info:'不能使用或打出手牌', - bingfeng_info:'限定技,出牌阶段,你可以指定至多三个目标与其一同翻面,且处于翻面状态时不能使用或打出手牌;若如此做,你失去技能玄咒并减少1点体力上限', + bingfeng2_info:'不能使用或打出手牌。', + bingfeng_info:'限定技,出牌阶段,你可以指定至多三个目标与其一同翻面,且处于翻面状态时不能使用或打出手牌;若如此做,你失去技能玄咒并减少1点体力上限。', guozao:'聒噪', - guozao_info:'锁定技,每当距离你1以内的角色受到一次伤害,若伤害来源不你,你须观看牌堆顶的三张牌,然后指定距离2以内的一名有手牌角色将手牌与这些牌交换', - guozao_info_alter:'锁定技,每当距离你1以内的角色受到一次伤害,若伤害来源不你,你须观看牌堆顶的三张牌,然后指定距离1以内的一名有手牌角色将手牌与这些牌交换', + guozao_info:'锁定技,每当距离你1以内的角色受到一次伤害,若伤害来源不你,你须观看牌堆顶的三张牌,然后指定距离2以内的一名有手牌角色将手牌与这些牌交换。', + guozao_info_alter:'锁定技,每当距离你1以内的角色受到一次伤害,若伤害来源不你,你须观看牌堆顶的三张牌,然后指定距离1以内的一名有手牌角色将手牌与这些牌交换。', heihuo:'黑火', - heihuo_info:'出牌阶段,你可以弃置一张装备牌,令你的手牌数加倍;若你的手牌因此达到8张或更多,你立即受到3点火焰伤害且本回合内不能再次发动黑火', + heihuo_info:'出牌阶段,你可以弃置一张装备牌,令你的手牌数加倍;若你的手牌因此达到8张或更多,你立即受到3点火焰伤害且本回合内不能再次发动黑火。', yaotong:'妖瞳', yaotong1:'妖瞳', yaotong2:'妖瞳', yaotong3:'妖瞳', yaotong4:'妖瞳', - yaotong_info:'当你的手牌数为奇数时,你可以将一张手牌当作杀或闪使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用', - yaotong_info_alter:'当你的手牌数为奇数时,你可以将一张手牌当作杀使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用', + yaotong_info:'当你的手牌数为奇数时,你可以将一张手牌当作杀或闪使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。', + yaotong_info_alter:'当你的手牌数为奇数时,你可以将一张手牌当作杀使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。', pojian:'破茧', - pojian_info:'每当你失去最后一张手牌,可以从牌堆中获得一张装备牌并装备之', + pojian_info:'每当你失去最后一张手牌,可以从牌堆中获得一张装备牌并装备之。', huajin:'化金', huajin2:'化金', - huajin_info:'出牌阶段限一次,你可以弃置一张牌令你造成的伤害+1,直到你的下一回合开始', + huajin_info:'出牌阶段限一次,你可以弃置一张牌令你造成的伤害+1,直到你的下一回合开始。', poxiao:'破霄', - poxiao_info:'你可以将一张装备牌当杀使用;当你没有武器牌时,你的攻击范围+1,杀可以额外指定一个目标', + poxiao_info:'你可以将一张装备牌当杀使用;当你没有武器牌时,你的攻击范围+1,杀可以额外指定一个目标。', jianji:'箭疾', - jianji_info:'你可以将一张装备牌当杀使用,然后摸一张牌,此杀无视距离和防具,且不计入回合内出杀限制', + jianji_info:'你可以将一张装备牌当杀使用,然后摸一张牌,此杀无视距离和防具,且不计入回合内出杀限制。', yuchen:'浴尘', - yuchen_info:'每当你于回合外使用或打出一张黑色牌,你可以弃置一名角色的一张牌', + yuchen_info:'每当你于回合外使用或打出一张黑色牌,你可以弃置一名角色的一张牌。', huangyu:'凰羽', - huangyu_info:'出牌阶段限一次,你可以将两张红色牌当炽羽袭使用', + huangyu_info:'出牌阶段限一次,你可以将两张红色牌当炽羽袭使用。', bingjian:'冰箭', - bingjian_info:'出牌阶段限一次,你可以弃置一张黑色的杀,令一名有手牌的其他角色展示手牌并弃置其中的所有闪,若其没有闪则受到1点雷电伤害', + bingjian_info:'出牌阶段限一次,你可以弃置一张黑色的杀,令一名有手牌的其他角色展示手牌并弃置其中的所有闪,若其没有闪则受到1点雷电伤害。', rumeng:'入梦', - rumeng_info:'其他角色的出牌阶段前,你可以弃置一张非基本牌,并令其选择一项:弃置一张基本牌,或跳过出牌及弃牌阶段', + rumeng_info:'其他角色的出牌阶段前,你可以弃置一张非基本牌,并令其选择一项:弃置一张基本牌,或跳过出牌及弃牌阶段。', lianda:'连打', - lianda_info:'当你使用一杀结算完毕后,可以弃置一张牌视为对目标再使用一张杀', + lianda_info:'当你使用一杀结算完毕后,可以弃置一张牌视为对目标再使用一张杀。', xianghui:'祥晖', - xianghui_info:'出牌阶段限一次,你可以弃置一张红色手牌,然后令场上体力值最少的角色各回复1点体力', + xianghui_info:'出牌阶段限一次,你可以弃置一张红色手牌,然后令场上体力值最少的角色各回复1点体力。', huiqi:'回气', - huiqi_info:'每当你受到一次伤害,可令一名其他角色摸X张牌,X为你已损失的体力值', + huiqi_info:'每当你受到一次伤害,可令一名其他角色摸X张牌,X为你已损失的体力值。', toudan:'投弹', - toudan_info:'出牌阶段限一次,你可以弃置一张黑桃牌对一名其他角色造成1点火焰伤害,然后你与距离该角色1以内的所有角色各弃置一张牌', + toudan_info:'出牌阶段限一次,你可以弃置一张黑桃牌对一名其他角色造成1点火焰伤害,然后你与距离该角色1以内的所有角色各弃置一张牌。', shending:'神丁', - shending_info:'锁定技,若你没有宝物牌,视为装备了蓝格怪衣', + shending_info:'锁定技,若你没有宝物牌,视为装备了蓝格怪衣。', hzhenwei:'镇卫', - hzhenwei_info:'当一名其他角色成为杀的目标后,若你在杀的使用者的攻击范围内,你可以弃置一张牌将此杀转移给自己,并在杀结算完毕后摸一张牌', + hzhenwei_info:'当一名其他角色成为杀的目标后,若你在杀的使用者的攻击范围内,你可以弃置一张牌将此杀转移给自己,并在杀结算完毕后摸一张牌。', shoulie:'狩猎', - shoulie_info:'当你使用一张杀指定目标后,可以弃置一张手牌令此杀不可闪避', + shoulie_info:'当你使用一张杀指定目标后,可以弃置一张手牌令此杀不可闪避。', hudun:'盾甲', hudun_bg:'盾', hudun2:'盾甲', - hudun_info:'锁定技,当你对其他角色造成伤害后,若你没有护甲,你获得1点护甲值', + hudun_info:'锁定技,当你对其他角色造成伤害后,若你没有护甲,你获得1点护甲值。', zhenjiu:'针灸', zhenjiu2:'针灸', - zhenjiu_info:'出牌阶段限一次,你可以将一张红色手牌置于一名角色的武将牌上,该角色于下一个准备阶段回复1点体力,然后获得此牌', + zhenjiu_info:'出牌阶段限一次,你可以将一张红色手牌置于一名角色的武将牌上,该角色于下一个准备阶段回复1点体力,然后获得此牌。', ljifeng:'疾风', - ljifeng_info:'锁定技,你的攻击范围+X,杀可以额外指定X个目标,X为你已损失的体力值', + ljifeng_info:'锁定技,你的攻击范围+X,杀可以额外指定X个目标,X为你已损失的体力值。', lxianglong:'翔龙', - lxianglong_info:'每当你闪避一张杀,你可以视为使用一张杀', + lxianglong_info:'每当你闪避一张杀,你可以视为使用一张杀。', shangxi:'伤袭', - shangxi_info:'准备阶段,你可以弃置一张牌,并对攻击范围内一名体力值不小于你的其他角色造成1点伤害', + shangxi_info:'准备阶段,你可以弃置一张牌,并对攻击范围内一名体力值不小于你的其他角色造成1点伤害。', fzhenwei:'镇威', - fzhenwei_info:'在你的回合内,你可以将其他角色打出的卡牌交给除该角色外的任意一名角色', + fzhenwei_info:'在你的回合内,你可以将其他角色打出的卡牌交给除该角色外的任意一名角色。', fuyan:'覆岩', fuyan2:'覆岩', - fuyan_info:'每当你受到一次伤害,可以令一名没有护甲的角色获得1点护甲值', + fuyan_info:'每当你受到一次伤害,可以令一名没有护甲的角色获得1点护甲值。', guaili:'怪力', - guaili_info:'锁定技,你的杀造成的伤害+1,造成伤害后需弃置两张手牌', + guaili_info:'锁定技,你的杀造成的伤害+1,造成伤害后需弃置两张手牌。', pingshen:'凭神', pingshen2:'凭神', - pingshen_info:'锁定技,受到过你的伤害的角色可在回合内对你发动一次【离魂】(每局限发动一次)', + pingshen_info:'锁定技,受到过你的伤害的角色可在回合内对你发动一次【离魂】(每局限发动一次)。', xingzhui:'星坠', - xingzhui_info:'出牌阶段限一次,你可以弃置一张牌,并令一名有牌的其他角色弃置一张类别相同的牌,若则受到1点伤害', + xingzhui_info:'出牌阶段限一次,你可以弃置一张牌,并令一名有牌的其他角色弃置一张类别相同的牌,若则受到1点伤害。', lingxian:'凌仙', - lingxian_info:'每当你于回合外使用或打出一张手牌,你可以选择攻击范围外的一名其他角色与你各摸一张牌', + lingxian_info:'每当你于回合外使用或打出一张手牌,你可以选择攻击范围外的一名其他角色与你各摸一张牌。', shouyin:'守印', - shouyin_info:'限定技,当任意一名角色处于濒死状态时,若你的武将牌正朝上,可以将武将牌翻面,然后令场上所有存活角色将体力回复至体力上限', - shouyin_info_alter:'限定技,当任意一名角色处于濒死状态时,若你的武将牌正朝上,可以将武将牌翻面,然后令场上所有存活角色回复2点体力', + shouyin_info:'限定技,当任意一名角色处于濒死状态时,若你的武将牌正朝上,可以将武将牌翻面,然后令场上所有存活角色将体力回复至体力上限。', + shouyin_info_alter:'限定技,当任意一名角色处于濒死状态时,若你的武将牌正朝上,可以将武将牌翻面,然后令场上所有存活角色回复2点体力。', bofeng:'搏风', - bofeng_info:'锁定技,体力值不大于你的角色视为在你的攻击范围;当你使用杀指定目标时,可令目标额外打出一张闪,否则此杀不可闪避且造成的伤害+1', + bofeng_info:'锁定技,体力值不大于你的角色视为在你的攻击范围;当你使用杀指定目标时,可令目标额外打出一张闪,否则此杀不可闪避且造成的伤害+1。', hutian:'护天', hutian2:'护天', hutian3:'护天', - hutian_info:'结束阶段,你可以将任意张牌置于一名角色的武将牌上,则该角色的体力值始终不能小于“护天”牌数;在你的下一个结束阶段,该角色获得武将牌上的“护天”牌(在此回合不能再次发动)', + hutian_info:'结束阶段,你可以将任意张牌置于一名角色的武将牌上,则该角色的体力值始终不能小于“护天”牌数;在你的下一个结束阶段,该角色获得武将牌上的“护天”牌(在此回合不能再次发动)。', linyun:'凌云', - linyun_info:'你可以将两张牌当作杀使用,此杀需要额外一张闪才能闪避', + linyun_info:'你可以将两张牌当作杀使用,此杀需要额外一张闪才能闪避。', sliufeng:'流风', - sliufeng_info:'锁定技,体力值不大于你的角色视为在你的攻击范围', + sliufeng_info:'锁定技,体力值不大于你的角色视为在你的攻击范围。', chengjian:'承剑', - chengjian_info:'每当其他角色使用杀造成一次伤害,你可以令其摸一张牌', + chengjian_info:'每当其他角色使用杀造成一次伤害,你可以令其摸一张牌。', huanling:'幻灵', huanling2:'幻灵', - huanling_info:'结束阶段,你可以选择一名角色与你同时翻面;翻面状态下,你防止一切伤害', + huanling_info:'结束阶段,你可以选择一名角色与你同时翻面;翻面状态下,你防止一切伤害。', xiaozhan:'消战', - xiaozhan_info:'其他角色使用杀时,若你不是杀的目标,可以弃置一张杀取消之', + xiaozhan_info:'其他角色使用杀时,若你不是杀的目标,可以弃置一张杀取消之。', xielei:'挟雷', - xielei_info:'每当你使用或打出一张杀,可以弃置一张牌并对目标以外的一名角色造成1点雷电伤害', + xielei_info:'每当你使用或打出一张杀,可以弃置一张牌并对目标以外的一名角色造成1点雷电伤害。', dangping:'荡平', - dangping_info:'每当你造成一次伤害,可以弃置一张手牌对其距离1以内的另一名角色造成1点伤害,每回合限一次', + dangping_info:'每当你造成一次伤害,可以弃置一张手牌对其距离1以内的另一名角色造成1点伤害,每回合限一次。', guisi:'归思', - guisi_info:'每当你成为杀的目标,你可以交给对方一张手牌并取消之', + guisi_info:'每当你成为杀的目标,你可以交给对方一张手牌并取消之。', duishi:'对诗', - duishi_info:'出牌阶段,你可以弃置一张手牌,并指定一名有手牌的角色选择一项:1)弃置一张与之花色相同的手牌,本回合内对诗不能再次指定其为目标,2)令你获得其一张牌,对诗失效直到回合结束', + duishi_info:'出牌阶段,你可以弃置一张手牌,并指定一名有手牌的角色选择一项:1)弃置一张与之花色相同的手牌,本回合内对诗不能再次指定其为目标,2)令你获得其一张牌,对诗失效直到回合结束。', anlianying:'连营', - anlianying_info:'每当你失去最后一张手牌,可摸两张牌', + anlianying_info:'每当你失去最后一张手牌,可摸两张牌。', lianwu:'连舞', - lianwu_info:'锁定技,你的杀可以额外指定一个目标,你的红杀不可被闪避', + lianwu_info:'锁定技,你的杀可以额外指定一个目标,你的红杀不可被闪避。', jiying:'疾鹰', - jiying_info:'锁定技,你使用杀无视距离', + jiying_info:'锁定技,你使用杀无视距离。', daofa:'道法', - daofa_info:'每当有一名其他角色造成伤害,你可以令其弃置一张牌', + daofa_info:'每当有一名其他角色造成伤害,你可以令其弃置一张牌。', xiaomoyu:'魔愈', - xiaomoyu_info:'锁定技,每当你于一个回合内首次造成伤害,你回复1点体力,若你没有受伤,则改为摸一张牌', + xiaomoyu_info:'锁定技,每当你于一个回合内首次造成伤害,你回复1点体力,若你没有受伤,则改为摸一张牌。', yihua:'移花', - yihua_info:'每当你成为其他角色的某张卡牌的惟一目标时,你可以弃置两张手牌,将使用者与目标对调', + yihua_info:'每当你成为其他角色的某张卡牌的惟一目标时,你可以弃置两张手牌,将使用者与目标对调。', youyin:'游吟', - youyin_info:'每当有其他角色弃置卡牌时,若其中有非基本牌且你的手牌数不超过5,你可以摸一张牌', + youyin_info:'每当有其他角色弃置卡牌时,若其中有非基本牌且你的手牌数不超过5,你可以摸一张牌。', rexue:'热血', - rexue_info:'任意一名角色的准备阶段,你可以对其使用一张杀,并摸一张牌', + rexue_info:'任意一名角色的准备阶段,你可以对其使用一张杀,并摸一张牌。', huopu:'火瀑', - huopu_info:'出牌阶段限一次,你可以将一张红桃牌当作流星火羽使用', + huopu_info:'出牌阶段限一次,你可以将一张红桃牌当作流星火羽使用。', benlei:'奔雷', benlei2:'奔雷', - benlei_info:'你可以将三张牌当惊雷闪使用;每当你造成一次雷属性伤害,你回复1点体力', + benlei_info:'你可以将三张牌当惊雷闪使用;每当你造成一次雷属性伤害,你回复1点体力。', lingwu:'灵舞', - lingwu_info:'回合结束后,若你在本回合内使用的牌数不少于当前体力值,你可以进行一个额外的回合(不可重复发动)', + lingwu_info:'回合结束后,若你在本回合内使用的牌数不少于当前体力值,你可以进行一个额外的回合(不可重复发动)。', miejing:'灭境', - miejing_info:'限制技,你可以弃置所有黑色牌,然后令所有其他角色受到1点雷电伤害', + miejing_info:'限制技,你可以弃置所有黑色牌,然后令所有其他角色受到1点雷电伤害。', lingxin:'灵心', - lingxin_info:'结束阶段,你可以亮出牌堆顶的三张牌,然后获得其中的红桃牌', + lingxin_info:'结束阶段,你可以亮出牌堆顶的三张牌,然后获得其中的红桃牌。', fushen:'附身', - fushen_info:'回合开始前,你可以将自己移出游戏,并代替另一名角色进行一回合,然后失去1点体力', + fushen_info:'回合开始前,你可以将自己移出游戏,并代替另一名角色进行一回合,然后失去1点体力。', fushen2:'附身', wangchen:'忘尘', - wangchen_info:'弃牌阶段结束时,若你于此阶段弃置了基本牌,你可以令一名角色翻面', - wangchen_info_alter:'弃牌阶段结束时,若你于此阶段弃置了基本牌,你可以令一名角色翻面并获得1点护甲', - // wangchen_info:'若你于弃牌阶段弃置了基本牌,可令一名角色翻面', - // wangchen_info:'弃牌阶段结束时,若你于此阶段弃置了基本牌,可将一名其他角色移出游戏直到你死亡或下一回合开始', + wangchen_info:'弃牌阶段结束时,若你于此阶段弃置了基本牌,你可以令一名角色翻面。', + wangchen_info_alter:'弃牌阶段结束时,若你于此阶段弃置了基本牌,你可以令一名角色翻面并获得1点护甲。', + // wangchen_info:'若你于弃牌阶段弃置了基本牌,可令一名角色翻面。', + // wangchen_info:'弃牌阶段结束时,若你于此阶段弃置了基本牌,可将一名其他角色移出游戏直到你死亡或下一回合开始。', guiyin:'归隐', - guiyin_info:'若你于弃牌阶段弃置了至少两张牌,你可以摸两张牌', + guiyin_info:'若你于弃牌阶段弃置了至少两张牌,你可以摸两张牌。', shejie:'设界', shejie2:'设界', - shejie_info:'每当你受到一次伤害,可以令伤害来源不能使用或打出其手牌,直到其下一回合开始', - shejie2_info:'不能使用或打出手牌,直到下一回合开始', + shejie_info:'每当你受到一次伤害,可以令伤害来源不能使用或打出其手牌,直到其下一回合开始。', + shejie2_info:'不能使用或打出手牌,直到下一回合开始。', yinyue:'引月', yinyue_info:'每当有一名角色回复一次体力,你可以令其摸一张牌,若该角色不是你且你的手牌数不大于该角色,你也摸一张牌。', - yinyue_info_alter:'每当有一名角色回复一次体力,你可以令其摸一张牌', + yinyue_info_alter:'每当有一名角色回复一次体力,你可以令其摸一张牌。', mohua2:'魔化', - mohua2_info:'锁定技,当你进入濒死状态时,你立即变身为撒旦,将体力回复至2,然后摸两张牌', + mohua2_info:'锁定技,当你进入濒死状态时,你立即变身为撒旦,将体力回复至2,然后摸两张牌。', liexin:'裂心', - liexin_info:'每当你即将造成伤害,你可以弃置一张牌令伤害+1', + liexin_info:'每当你即将造成伤害,你可以弃置一张牌令伤害+1。', swdxueyi:'血裔', - swdxueyi_info:'锁定技,你摸牌阶段额外摸X张牌,X为你已损失的体力值', + swdxueyi_info:'锁定技,你摸牌阶段额外摸X张牌,X为你已损失的体力值。', moyan:'血焰', - moyan_info:'出牌阶段,你可以弃置X张红色手牌,然后对至多X名角色各造成1点火焰伤害,X为你已损失的体力值。每阶段限一次', + moyan_info:'出牌阶段,你可以弃置X张红色手牌,然后对至多X名角色各造成1点火焰伤害,X为你已损失的体力值。每阶段限一次。', aojian:'傲剑', - aojian_info:'出牌阶段,你可以弃置X张手牌,然后对攻击范围内至多X名角色各造成1点伤害,X为你已损失的体力值。每阶段限一次', + aojian_info:'出牌阶段,你可以弃置X张手牌,然后对攻击范围内至多X名角色各造成1点伤害,X为你已损失的体力值。每阶段限一次。', milesxiehun:'邪魂', - milesxiehun_info:'锁定技,出牌阶段结束后,你令随机X名角色各弃置一张牌,X为你已损失的体力值且至少为1 ', + milesxiehun_info:'锁定技,出牌阶段结束后,你令随机X名角色各弃置一张牌,X为你已损失的体力值且至少为1。', liaochen:'撩尘', - liaochen_info:'锁定技,出牌阶段结束后,所有角色需弃置一张牌', + liaochen_info:'锁定技,出牌阶段结束后,所有角色需弃置一张牌。', yinmo:'引魔', - yinmo_info:'锁定技,当你对场上所有角色发动「连计」后,你立即变身为魔化宁珂,然后对所有其他角色造成1点雷电伤害', + yinmo_info:'锁定技,当你对场上所有角色发动〖连计〗后,你立即变身为魔化宁珂,然后对所有其他角色造成1点雷电伤害。', huanxing:'幻形', huanxing2:'幻形', - huanxing_info:'准备阶段,你可以弃置一张牌并选择一名男性角色,获得其所有技能,直到你首次受到伤害', + huanxing_info:'准备阶段,你可以弃置一张牌并选择一名男性角色,获得其所有技能,直到你首次受到伤害。', meihuo:'魅惑', - meihuo_info:'每当你失去最后一张装备牌,你可以获得一名其他角色的一张牌,若此牌来自装备区,你立即装备之', + meihuo_info:'每当你失去最后一张装备牌,你可以获得一名其他角色的一张牌,若此牌来自装备区,你立即装备之。', touxi:'偷袭', - touxi_info:'在其他角色的结束阶段,你可以进行一次判定,若结果为黑色,你对其造成1点雷电伤害,且直到下一回合开始不能再次发动偷袭;若结果为红色,对方可以弃置你的一张牌', - touxi_info_alter:'在其他角色的结束阶段,你可以进行一次判定,若结果为黑色,你对其造成1点雷电伤害,且直到下一回合开始不能再次发动偷袭;若结果为红色,对方可以获得你的一张牌', + touxi_info:'在其他角色的结束阶段,你可以进行一次判定,若结果为黑色,你对其造成1点雷电伤害,且直到下一回合开始不能再次发动偷袭;若结果为红色,对方可以弃置你的一张牌。', + touxi_info_alter:'在其他角色的结束阶段,你可以进行一次判定,若结果为黑色,你对其造成1点雷电伤害,且直到下一回合开始不能再次发动偷袭;若结果为红色,对方可以获得你的一张牌。', minjing:'明镜', - minjing_info:'若你没有防具牌,你视为装备了光纱天衣', + minjing_info:'若你没有防具牌,你视为装备了光纱天衣。', jqimou:'奇谋', - jqimou_info:'每当你于回合外受到一次伤害,你可以摸一张牌,并可以使用一张牌', + jqimou_info:'每当你于回合外受到一次伤害,你可以摸一张牌,并可以使用一张牌。', mufeng:'沐风', - mufeng_info:'结束阶段,若你本回合使用过基本牌,则可发现一张牌', - mufeng_info_alter:'结束阶段,你可以将手牌数补至当前体力值', - mufeng_old2_info:'在一名角色的结束阶段,若你的手牌数比其少,你可以将手牌补至与该角色相同(最多补至5),每轮限一次', + mufeng_info:'结束阶段,若你本回合使用过基本牌,则可发现一张牌。', + mufeng_info_alter:'结束阶段,你可以将手牌数补至当前体力值。', + mufeng_old2_info:'在一名角色的结束阶段,若你的手牌数比其少,你可以将手牌补至与该角色相同(最多补至5),每轮限一次。', hjifeng:'祭风', - hjifeng_info:'出牌阶段限一次,若你手牌中没有祭器牌,你可以将一张手牌置于牌堆顶,并根据其花色获得对应祭器:黑桃-青龙之圭;梅花-白兽之琥;方片-朱雀之璋;红桃-玄武之璜', - mufeng_old_info:'锁定技,每当你于回合外失去牌,你的防御距离+1;若防御距离的变化值超过了存活角色数的一半,则降至0', + hjifeng_info:'出牌阶段限一次,若你手牌中没有祭器牌,你可以将一张手牌置于牌堆顶,并根据其花色获得对应祭器:黑桃-青龙之圭;梅花-白兽之琥;方片-朱雀之璋;红桃-玄武之璜。', + mufeng_old_info:'锁定技,每当你于回合外失去牌,你的防御距离+1;若防御距离的变化值超过了存活角色数的一半,则降至0。', lexue:'乐学', - lexue_info:'回合内,你随机获得制衡、集智、缔盟、驱虎中的一个技能;回合外,你随机获得遗计、急救、鬼道、反馈中的一个技能', + lexue_info:'回合内,你随机获得制衡、集智、缔盟、驱虎中的一个技能;回合外,你随机获得遗计、急救、鬼道、反馈中的一个技能。', mingfu:'冥缚', - mingfu_info:'出牌阶段限一次,你可以将一张梅花牌当鬼幽结使用', + mingfu_info:'出牌阶段限一次,你可以将一张梅花牌当鬼幽结使用。', chuanyue:'穿月', - chuanyue_info:'出牌阶段限一次,你可以将两张手牌当决斗使用', + chuanyue_info:'出牌阶段限一次,你可以将两张手牌当决斗使用。', miedao:'灭道', miedao1:'灭道', @@ -10059,67 +10058,67 @@ game.import('character',function(lib,game,ui,get,ai,_status){ miedao_info:'锁定技,摸牌阶段,你额外摸X张牌;弃牌阶段,你至少须弃X张牌(不足则全弃),X为你已损失的体力值。', senluo:'森罗', - senluo_info:'出牌阶段限一次,若你的手牌数为全场最少或之一,你可以令所有有手牌的其他角色弃置两张手牌然后摸一张牌', + senluo_info:'出牌阶段限一次,若你的手牌数为全场最少或之一,你可以令所有有手牌的其他角色弃置两张手牌然后摸一张牌。', polang:'破浪', - polang_info:'每当你造成一次伤害,可以一张对方的装备牌', + polang_info:'每当你造成一次伤害,可以一张对方的装备牌。', jikong:'亟空', jikong2:'亟空', - jikong_info:'准备阶段,你可以指定一名角色视为对其使用一张雷杀;每当你失去最后一张手牌,你可以指定一名角色视为对其使用一张雷杀(每回合限发动一次)', - jikong_info_alter:'准备阶段,你可以指定一名角色视为对其使用一张雷杀', + jikong_info:'准备阶段,你可以指定一名角色视为对其使用一张雷杀;每当你失去最后一张手牌,你可以指定一名角色视为对其使用一张雷杀(每回合限发动一次)。', + jikong_info_alter:'准备阶段,你可以指定一名角色视为对其使用一张雷杀。', xiangu:'仙骨', xiangu_info:'锁定技,你的手牌上限不会因体力值的减少而减少。', hujing:'壶境', - hujing_info:'锁定技,准备阶段,若弃牌堆中有炼妖壶,你装备之;当你的装备区内有炼妖壶时,你的手牌上限+2', + hujing_info:'锁定技,准备阶段,若弃牌堆中有炼妖壶,你装备之;当你的装备区内有炼妖壶时,你的手牌上限+2。', huajian:'化剑', - huajian_info:'出牌阶段结束时,你可以将一张牌当作杀对任意一名角色使用', + huajian_info:'出牌阶段结束时,你可以将一张牌当作杀对任意一名角色使用。', xuanyuan:'轩辕', - xuanyuan_info:'锁定技,你无视【轩辕剑】的装备条件及失去体力的效果;结束阶段,你可以弃置一张黑桃牌从弃牌堆中获得【轩辕剑】并装备之', + xuanyuan_info:'锁定技,你无视【轩辕剑】的装备条件及失去体力的效果;结束阶段,你可以弃置一张黑桃牌从弃牌堆中获得【轩辕剑】并装备之。', jilve:'极略', jilve_backup:'极略', jilve2:'极略', - jilve_info:'出牌阶段,你可以观看牌堆顶的三张牌,然后使用其中的非装备牌。每回合最多发动三次', - jilve_info_alter:'出牌阶段,你可以观看牌堆顶的两张牌,然后使用其中的非装备牌。每回合最多发动三次', + jilve_info:'出牌阶段,你可以观看牌堆顶的三张牌,然后使用其中的非装备牌。每回合最多发动三次。', + jilve_info_alter:'出牌阶段,你可以观看牌堆顶的两张牌,然后使用其中的非装备牌。每回合最多发动三次。', gongshen:'工神', - gongshen_info:'任意一名其他角色使用一张基本牌或锦囊牌指定目标后,你可以弃置一张装备牌令其失效', + gongshen_info:'任意一名其他角色使用一张基本牌或锦囊牌指定目标后,你可以弃置一张装备牌令其失效。', swdliuhong:'流虹', - swdliuhong_info:'每当你使用一张杀,可以摸一张牌', + swdliuhong_info:'每当你使用一张杀,可以摸一张牌。', poyue:'破月', - poyue_info:'锁定技,你的黑杀无视距离,红色杀不计入回合内的出杀限制且不可闪避', - poyue_info_alter:'锁定技,你的黑杀无视距离,红色杀不可闪避', + poyue_info:'锁定技,你的黑杀无视距离,红色杀不计入回合内的出杀限制且不可闪避。', + poyue_info_alter:'锁定技,你的黑杀无视距离,红色杀不可闪避。', mojian:'墨剑', - mojian_info:'每当你使用杀并指定目标后,你可以令其摸一张牌,然后你回复1点体力', + mojian_info:'每当你使用杀并指定目标后,你可以令其摸一张牌,然后你回复1点体力。', duanyue:'断月', - duanyue_info:'出牌阶段限一次,你可以弃置一张装备牌,对一名其他角色造成1点伤害', + duanyue_info:'出牌阶段限一次,你可以弃置一张装备牌,对一名其他角色造成1点伤害。', tuzhen:'突阵', - tuzhen_info:'当你造成一次伤害后,你可以弃置对方手牌中的非基本牌', - tuzhen_info_alter:'当你造成一次伤害后,你可以弃置对方手牌中的一张非基本牌', + tuzhen_info:'当你造成一次伤害后,你可以弃置对方手牌中的非基本牌。', + tuzhen_info_alter:'当你造成一次伤害后,你可以弃置对方手牌中的一张非基本牌。', fengmo:'封魔', - fengmo_info:'出牌阶段限一次,你可以弃置场所有武器牌(至少两张),然后令一名未翻面的角色摸等量的牌并翻面', + fengmo_info:'出牌阶段限一次,你可以弃置场所有武器牌(至少两张),然后令一名未翻面的角色摸等量的牌并翻面。', pozhou:'破咒', pozhou_bg:'破', pozhou2:'破咒', - pozhou_info:'每当你受到一次伤害,你获得一枚破咒标记。出牌阶段,你可以指定任意名其他角色并弃置等量的破咒标记,令目标的非锁定技失效直到其下一回合结束', + pozhou_info:'每当你受到一次伤害,你获得一枚破咒标记。出牌阶段,你可以指定任意名其他角色并弃置等量的破咒标记,令目标的非锁定技失效直到其下一回合结束。', xuanzhou:'玄咒', - xuanzhou_info:'出牌阶段限一次,你可以将一张普通锦囊牌当作任意一张延时锦囊,对任意一名角色使用(无视锦囊使用范围限制)', + xuanzhou_info:'出牌阶段限一次,你可以将一张普通锦囊牌当作任意一张延时锦囊,对任意一名角色使用(无视锦囊使用范围限制)。', ningxian:'凝霰', - ningxian_info:'每当你受到一次伤害,你可以弃置任意张黑色牌并选择等量其他角色对其各造成1点伤害', + ningxian_info:'每当你受到一次伤害,你可以弃置任意张黑色牌并选择等量其他角色对其各造成1点伤害。', guanhu:'贯鹄', - guanhu_info:'每当你使用杀造成伤害,你可以弃置对方一张手牌和一张装备牌', + guanhu_info:'每当你使用杀造成伤害,你可以弃置对方一张手牌和一张装备牌。', chuanyang:'穿杨', - chuanyang_info:'每当你使用一张杀,若你不在目标的攻击范围,你可以令此杀不可闪避', + chuanyang_info:'每当你使用一张杀,若你不在目标的攻击范围,你可以令此杀不可闪避。', fengming:'凤鸣', - fengming_info:'出牌阶段限一次,你可以弃置一张装备牌,令一名角色恢复1点体力并摸一张牌', + fengming_info:'出牌阶段限一次,你可以弃置一张装备牌,令一名角色恢复1点体力并摸一张牌。', duanxing:'锻星', - duanxing_info:'每当你装备一张未强化的装备牌,可以视为一名角色使用一张杀', + duanxing_info:'每当你装备一张未强化的装备牌,可以视为一名角色使用一张杀。', wanjun:'万钧', - wanjun_info:'你可以将一张装备牌当作南蛮入侵使用', + wanjun_info:'你可以将一张装备牌当作南蛮入侵使用。', dunxing:'遁形', - dunxing_info:'当你成为其他角色卡牌的目标时,你可以弃置一张牌并进行一次判定,若不为红桃,则取消之', + dunxing_info:'当你成为其他角色卡牌的目标时,你可以弃置一张牌并进行一次判定,若不为红桃,则取消之。', guiying:'鬼影', - guiying_info:'你可以将一张黑色牌当偷梁换柱使用', + guiying_info:'你可以将一张黑色牌当偷梁换柱使用。', shehun:'摄魂', - shehun_info:'出牌阶段限一次,你可以弃置任意张花色不同的牌,另一名其他角色弃置等量的牌,若其弃置的牌中有牌的花色与你弃置的牌相同,你对其造成1点伤害', + shehun_info:'出牌阶段限一次,你可以弃置任意张花色不同的牌,另一名其他角色弃置等量的牌,若其弃置的牌中有牌的花色与你弃置的牌相同,你对其造成1点伤害。', zhanlu:'沾露', @@ -10187,7 +10186,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ guiyan2:'鬼眼', swd_xiuluo:'修罗', suiyan:'碎岩', - suiyan_info:'每当你造成一次伤害,可以弃置一张牌并弃置对方的全部装备牌', + suiyan_info:'每当你造成一次伤害,可以弃置一张牌并弃置对方的全部装备牌。', xianyin:'散结', qiaoxie:'巧械', qiaoxie2:'巧械', @@ -10204,74 +10203,74 @@ game.import('character',function(lib,game,ui,get,ai,_status){ susheng:'苏生', shengshou:'圣手', huanjian:'幻箭', - huanjian_info:'出牌阶段,你可以将一张黑色牌当作冰魄针使用', - shengshou_info:'你可以将一张黑色手牌当作草药使用', - susheng_info:'在任意一名角色即将死亡时,你可以弃置一张手牌防止其死亡,并将其体力回复至1,每回合限发动一次', - susheng_info_alter:'在任意一名角色即将死亡时,你可以弃置一张红色手牌防止其死亡,并将其体力回复至1,每回合限发动一次', - zhanlu_info:'出牌阶段限一次,你可以弃置一张黑桃牌令至多3名角色各回复1点体力', - kunlunjing_info:'准备阶段,若你的体力值小于上回合结束时的体力值,你可以将场上所有牌还原到你上一回合结束时的位置', - kunlunjing_info_alter:'准备阶段,若你的体力值小于上回合结束时的体力值,你可以将场上所有牌还原到你上一回合结束时的位置,然后失去1点体力', - swd_xiuluo_info:'准备阶段,你可以弃一张手牌来弃置你判断区里的一张延时类锦囊(必须花色相同)', - xianyin_info:'出牌阶段,你可以令所有判定区内有牌的角色弃置判定区内的牌,然后交给你一张手牌', - qiaoxie_info:'每当你装备一张牌,可摸一张牌;每当你失去一张装备牌(不含替换),你可以弃置其他角色的一张牌', - mailun_info:'准备阶段,你可以选择一个脉轮效果直到下一回合开始', - guiyan_info:'出牌阶段,你可以观看一名角色的手牌,并获得其中一张梅花牌,每阶段限一次。当你首次进入濒死状态时,你须回复1点体力并失去技能鬼眼', - busi_info:'锁定技,当你进入濒死状态时,你进行一次判定,若结果不为黑桃,你将体力回复至1并将武将牌翻至背面', - xuying_info:'锁定技,每当你即将受到伤害,你防止此伤害,若你此时有手牌,你失去1点体力', - yinguo_info:'除你之外的任意一名角色即将受到受到伤害时,若有伤害来源,你可以弃置一张牌将伤害来源和目标对调', - yueren_info:'每当你使用一张杀,可以进行一次判定,若结果为黑色,你弃置目标一张牌,若结果为红色,你将此杀收回,每回合限发动一次', - duijue_info:'限定技,出牌阶段,你可以指定一名体力值大于1的其他角色,你结束出牌阶段,并在回合结束后将所有其他角色移出游戏,然后该角色与你轮流进行回合,直到有一方死亡或一共进行六个回合为止', - wuying_info:'锁定技,你的杀和单体x锦囊目标锁定为范围内的所有角色', - xiehun_info:'锁定技,受到来自你伤害的角色进入混乱状态,行为不受控制,且会攻击队友,直到你的下一回合开始', - jumo_info:'锁定技,结束阶段,你摸X-1张牌,X为未进入混乱状态的角色数与进入混乱状态的角色数之差(若为双将则改为X)', - jifeng_info:'你的杀和单体锦囊可以额外指定任意个目标,若如此做,此卡牌有一定机率失效,指定的目标越多失效的概率越大', - mohua_info:'锁定技,在身份局中,当你进入濒死状态时,你立即变身为撒旦,体力上限变为现存角色数(至少为4),并成为其他所有角色的共同敌人', - miles_xueyi_info:'锁定技,你防止即将受到的伤害,然后失去1点体力', - duanyi_info:'出牌阶段限一次,你可以弃置两张杀,对一名角色造成1点伤害,然后其随机弃置X张牌,X为其已损失的体力值', - duanyi_info_alter:'出牌阶段限一次,你可以弃置两张杀,并对一名角色造成1点伤害', + huanjian_info:'出牌阶段,你可以将一张黑色牌当作冰魄针使用。', + shengshou_info:'你可以将一张黑色手牌当作草药使用。', + susheng_info:'在任意一名角色即将死亡时,你可以弃置一张手牌防止其死亡,并将其体力回复至1,每回合限发动一次。', + susheng_info_alter:'在任意一名角色即将死亡时,你可以弃置一张红色手牌防止其死亡,并将其体力回复至1,每回合限发动一次。', + zhanlu_info:'出牌阶段限一次,你可以弃置一张黑桃牌令至多3名角色各回复1点体力。', + kunlunjing_info:'准备阶段,若你的体力值小于上回合结束时的体力值,你可以将场上所有牌还原到你上一回合结束时的位置。', + kunlunjing_info_alter:'准备阶段,若你的体力值小于上回合结束时的体力值,你可以将场上所有牌还原到你上一回合结束时的位置,然后失去1点体力。', + swd_xiuluo_info:'准备阶段,你可以弃一张手牌来弃置你判断区里的一张延时类锦囊(必须花色相同)。', + xianyin_info:'出牌阶段,你可以令所有判定区内有牌的角色弃置判定区内的牌,然后交给你一张手牌。', + qiaoxie_info:'每当你装备一张牌,可摸一张牌;每当你失去一张装备牌(不含替换),你可以弃置其他角色的一张牌。', + mailun_info:'准备阶段,你可以选择一个脉轮效果直到下一回合开始。', + guiyan_info:'出牌阶段,你可以观看一名角色的手牌,并获得其中一张梅花牌,每阶段限一次。当你首次进入濒死状态时,你须回复1点体力并失去技能鬼眼。', + busi_info:'锁定技,当你进入濒死状态时,你进行一次判定,若结果不为黑桃,你将体力回复至1并将武将牌翻至背面。', + xuying_info:'锁定技,每当你即将受到伤害,你防止此伤害,若你此时有手牌,你失去1点体力。', + yinguo_info:'除你之外的任意一名角色即将受到受到伤害时,若有伤害来源,你可以弃置一张牌将伤害来源和目标对调。', + yueren_info:'每当你使用一张杀,可以进行一次判定,若结果为黑色,你弃置目标一张牌,若结果为红色,你将此杀收回,每回合限发动一次。', + duijue_info:'限定技,出牌阶段,你可以指定一名体力值大于1的其他角色,你结束出牌阶段,并在回合结束后将所有其他角色移出游戏,然后该角色与你轮流进行回合,直到有一方死亡或一共进行六个回合为止。', + wuying_info:'锁定技,你的杀和单体x锦囊目标锁定为范围内的所有角色。', + xiehun_info:'锁定技,受到来自你伤害的角色进入混乱状态,行为不受控制,且会攻击队友,直到你的下一回合开始。', + jumo_info:'锁定技,结束阶段,你摸X-1张牌,X为未进入混乱状态的角色数与进入混乱状态的角色数之差(若为双将则改为X)。', + jifeng_info:'你的杀和单体锦囊可以额外指定任意个目标,若如此做,此卡牌有一定机率失效,指定的目标越多失效的概率越大。', + mohua_info:'锁定技,在身份局中,当你进入濒死状态时,你立即变身为撒旦,体力上限变为现存角色数(至少为4),并成为其他所有角色的共同敌人。', + miles_xueyi_info:'锁定技,你防止即将受到的伤害,然后失去1点体力。', + duanyi_info:'出牌阶段限一次,你可以弃置两张杀,对一名角色造成1点伤害,然后其随机弃置X张牌,X为其已损失的体力值。', + duanyi_info_alter:'出牌阶段限一次,你可以弃置两张杀,并对一名角色造成1点伤害。', guxing_info:'出牌阶段,你可以将最后至多X张手牌当杀使用,此杀无视距离且可以指定至多3个目标,每造成一次伤害,你摸一张牌,X为你已损失的体力值且至少为1。', - tianlun_info:'任意一名角色的判定牌生效前,你可以弃置一张场上角色的判定牌代替之', - hlongyin_info:'出牌阶段,你可以弃置任意张颜色相同且点数不同的牌,并获得逆时针座位距离与卡牌点数相同的角色区域内的一张牌。每阶段限一次', - lanzhi_info:'每当你使用一张梅花牌,你可以令所有体力值不大于你的角色回复1点体力', + tianlun_info:'任意一名角色的判定牌生效前,你可以弃置一张场上角色的判定牌代替之。', + hlongyin_info:'出牌阶段,你可以弃置任意张颜色相同且点数不同的牌,并获得逆时针座位距离与卡牌点数相同的角色区域内的一张牌。每阶段限一次。', + lanzhi_info:'每当你使用一张梅花牌,你可以令所有体力值不大于你的角色回复1点体力。', lanzhi_old_info:'每当你即将造成伤害,可以防止此伤害,然后摸两张牌。每回合限发动一次。', - tianhuo_info:'出牌阶段,你可以令所有角色弃置其判定区域内的牌,并受到没有来源的等量火焰伤害,每阶段限一次', - huanyin_info:'锁定技,每当你成为其他角色的卡牌的目标时,你进行一次判定,若为黑桃则取消之,若为红桃你摸一张牌', - luomu_info:'锁定技,每当你造成伤害时,受伤害角色随机弃置一张牌', - poxing_info:'锁定技,每当你即将造成伤害,若目标的体力值大于你,你令伤害+1', - liaoyuan_info:'每当你使用一张杀指定目标后,你可以弃置任意张与此杀花色相同的牌,若如此做,目标需额外打出等量的闪,每少打出一张闪,此杀的伤害+1', - liaoyuan_info_alter:'每当你使用一张杀指定目标后,你可以弃置一张与此杀花色相同的牌,若如此做,目标需额外打出一张闪,若目标没打出闪,此杀的伤害+1', - yishan_info:'每当你受到一次伤害,你可以重新获得最近失去的两张牌', - huanhun_info:'当一名角色进入濒死状态时,你可以弃置一张牌并令其进行一次判定,若结果为红色,其回复1点体力,否则其获得你弃置的牌', - huanhun_info_alter:'当一名角色进入濒死状态时,你可以弃置一张红色手牌并令其进行一次判定,若结果为红色,其回复1点体力,否则其获得你弃置的牌', - daixing_info:'结束阶段,你可以弃置任意张牌并获得等量的护甲;这些护甲将在你的下个准备阶段消失', - swd_wuxie_info:'锁定技,你不能成为其他角色的延时锦囊的目标', - lqingcheng_info:'结束阶段,你可以进行判定,若为红色则可以继续判定,最多判定3次,判定结束后将判定成功的牌收入手牌', - xianjiang_old_info:'出牌阶段,你可以将一张装备牌永久转化为任意一张其它装备牌,一张牌在一个阶段只能转化一次', - xianjiang_info:'出牌阶段限一次,你可以弃置一张锦囊牌并随机装备一件装备', - xianjiang_info_alter:'出牌阶段限一次,若你装备内没有牌,你可以弃置一张锦囊牌并随机装备一件装备', - shengong_info:'每当你需要打出一张杀或闪时,你可以弃置一名其他角色装备区内的一张武器牌或防具牌,视为打出一张杀或闪,然后该角色摸一张牌,你弃一张牌', - ningjian_info:'你可以将一张红色牌当闪、黑色牌当杀使用或打出', - taixu_info:'限定技,你可以弃置你的所有牌(至少1张),并对一名体力值大于1为其他角色造成X点火焰伤害,X为你已损失的体力值且至少为1', - duoren_info:'每当你闪避一张杀,你可以立即获得来源的武器牌', + tianhuo_info:'出牌阶段,你可以令所有角色弃置其判定区域内的牌,并受到没有来源的等量火焰伤害,每阶段限一次。', + huanyin_info:'锁定技,每当你成为其他角色的卡牌的目标时,你进行一次判定,若为黑桃则取消之,若为红桃你摸一张牌。', + luomu_info:'锁定技,每当你造成伤害时,受伤害角色随机弃置一张牌。', + poxing_info:'锁定技,每当你即将造成伤害,若目标的体力值大于你,你令伤害+1。', + liaoyuan_info:'每当你使用一张杀指定目标后,你可以弃置任意张与此杀花色相同的牌,若如此做,目标需额外打出等量的闪,每少打出一张闪,此杀的伤害+1。', + liaoyuan_info_alter:'每当你使用一张杀指定目标后,你可以弃置一张与此杀花色相同的牌,若如此做,目标需额外打出一张闪,若目标没打出闪,此杀的伤害+1。', + yishan_info:'每当你受到一次伤害,你可以重新获得最近失去的两张牌。', + huanhun_info:'当一名角色进入濒死状态时,你可以弃置一张牌并令其进行一次判定,若结果为红色,其回复1点体力,否则其获得你弃置的牌。', + huanhun_info_alter:'当一名角色进入濒死状态时,你可以弃置一张红色手牌并令其进行一次判定,若结果为红色,其回复1点体力,否则其获得你弃置的牌。', + daixing_info:'结束阶段,你可以弃置任意张牌并获得等量的护甲;这些护甲将在你的下个准备阶段消失。', + swd_wuxie_info:'锁定技,你不能成为其他角色的延时锦囊的目标。', + lqingcheng_info:'结束阶段,你可以进行判定,若为红色则可以继续判定,最多判定3次,判定结束后将判定成功的牌收入手牌。', + xianjiang_old_info:'出牌阶段,你可以将一张装备牌永久转化为任意一张其它装备牌,一张牌在一个阶段只能转化一次。', + xianjiang_info:'出牌阶段限一次,你可以弃置一张锦囊牌并随机装备一件装备。', + xianjiang_info_alter:'出牌阶段限一次,若你装备内没有牌,你可以弃置一张锦囊牌并随机装备一件装备。', + shengong_info:'每当你需要打出一张杀或闪时,你可以弃置一名其他角色装备区内的一张武器牌或防具牌,视为打出一张杀或闪,然后该角色摸一张牌,你弃一张牌。', + ningjian_info:'你可以将一张红色牌当闪、黑色牌当杀使用或打出。', + taixu_info:'限定技,你可以弃置你的所有牌(至少1张),并对一名体力值大于1为其他角色造成X点火焰伤害,X为你已损失的体力值且至少为1。', + duoren_info:'每当你闪避一张杀,你可以立即获得来源的武器牌。', tanlin_info:'出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得双方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张杀直到回合结束,若你没赢,你受到该角色的1点伤害。', tanlin_info_alter:'出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得对方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张杀直到回合结束,若你没赢,你受到该角色的1点伤害。', pozhen_info:'每当你受到一次伤害,若你的手牌数大于伤害来源,你可以弃置X张手牌对其造成1点伤害;若你的手牌数小于伤害来源,你可以弃置其X张手牌。X为你与伤害来源的手牌数之差。', pozhen_info_alter:'每当你受到一次伤害,若你的手牌数小于伤害来源,你可以弃置其X张手牌。X为你与伤害来源的手牌数之差。', - yunchou_info:'出牌阶段限一次,你可以弃置一张手牌,并弃置一名其他角色的一张手牌,若两张牌颜色相同,你摸一张牌,否则对方摸一张牌', - yunchou_info_alter:'出牌阶段限一次,你可以弃置一张非基本手牌,并弃置一名其他角色的一张手牌,若两张牌颜色相同,你摸一张牌,否则对方摸一张牌', - swdtianshu_old_info:'结束阶段,你可以弃置一张牌并从三名随机武将中选择一个,在2X回合后你将其所有技能加入你的天书列表,X为其技能数;在技能加入天书列表时,或于出牌阶段,你可以装备一项天书列表中的技能', - swdtianshu_info:'出牌阶段,你可以弃置一张锦囊牌,然后获得一名其他角色的一项技能直到该角色死亡(替换以此法获得的前一个技能)', - zaowu_info:'出牌阶段限一次,你可以将一张黑桃或红桃手牌当作封印之蛋使用', - luomei_info:'每当你使用或打出一张梅花花色的牌,你可以摸一张牌', - xingdian_info:'出牌阶段限一次,你可以弃置一张手牌,然后随机弃置两名敌人各一张牌', - yulin_info:'每当你即将受到伤害,你可以弃置一张装备牌抵消此伤害', - funiao_info:'出牌阶段限一次,你可以将一张手牌交给一名其他角色,然后摸一张牌并观看其手牌', - funiao_old_info:'出牌阶段,你可以交给一名角色一张手牌,然后观看其手牌,每个阶段对一名角色只能发动一次', - xuehuang_info:'限定技,出牌阶段,若你没有黑色手牌,你可以展示并弃置所有手牌,每弃置一张牌视为使用一张火杀,随机指定两名敌人为目标', - zhuyu_info:'每当一名横置的角色即将受到伤害时,你可以弃置一张红色牌令此伤害+1并变为火属性', - ningshuang_info:'每当你成为黑色牌的目标,你可以弃置一张黑色牌将其横置,并摸一张牌,若其已经模置则改为将其翻面', - zaowu_old_info:'出牌阶段,你可以弃置三张不同类型的牌,创造任意两张牌并获得之', - xielv_info:'弃牌阶段结束后,若你的所有手牌(至少两张)颜色均相同,你可以展示所有手牌,然后回复1点体力并弃置场上的所有判定牌', + yunchou_info:'出牌阶段限一次,你可以弃置一张手牌,并弃置一名其他角色的一张手牌,若两张牌颜色相同,你摸一张牌,否则对方摸一张牌。', + yunchou_info_alter:'出牌阶段限一次,你可以弃置一张非基本手牌,并弃置一名其他角色的一张手牌,若两张牌颜色相同,你摸一张牌,否则对方摸一张牌。', + swdtianshu_old_info:'结束阶段,你可以弃置一张牌并从三名随机武将中选择一个,在2X回合后你将其所有技能加入你的天书列表,X为其技能数;在技能加入天书列表时,或于出牌阶段,你可以装备一项天书列表中的技能。', + swdtianshu_info:'出牌阶段,你可以弃置一张锦囊牌,然后获得一名其他角色的一项技能直到该角色死亡(替换以此法获得的前一个技能)。', + zaowu_info:'出牌阶段限一次,你可以将一张黑桃或红桃手牌当作封印之蛋使用。', + luomei_info:'每当你使用或打出一张梅花花色的牌,你可以摸一张牌。', + xingdian_info:'出牌阶段限一次,你可以弃置一张手牌,然后随机弃置两名敌人各一张牌。', + yulin_info:'每当你即将受到伤害,你可以弃置一张装备牌抵消此伤害。', + funiao_info:'出牌阶段限一次,你可以将一张手牌交给一名其他角色,然后摸一张牌并观看其手牌。', + funiao_old_info:'出牌阶段,你可以交给一名角色一张手牌,然后观看其手牌,每个阶段对一名角色只能发动一次。', + xuehuang_info:'限定技,出牌阶段,若你没有黑色手牌,你可以展示并弃置所有手牌,每弃置一张牌视为使用一张火杀,随机指定两名敌人为目标。', + zhuyu_info:'每当一名横置的角色即将受到伤害时,你可以弃置一张红色牌令此伤害+1并变为火属性。', + ningshuang_info:'每当你成为黑色牌的目标,你可以弃置一张黑色牌将其横置,并摸一张牌,若其已经模置则改为将其翻面。', + zaowu_old_info:'出牌阶段,你可以弃置三张不同类型的牌,创造任意两张牌并获得之。', + xielv_info:'弃牌阶段结束后,若你的所有手牌(至少两张)颜色均相同,你可以展示所有手牌,然后回复1点体力并弃置场上的所有判定牌。', }, }; }); diff --git a/character/tw.js b/character/tw.js index 9c7ac9621..51be0f39a 100644 --- a/character/tw.js +++ b/character/tw.js @@ -384,7 +384,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).set('goon',function(){ var d1=true; if(player.hasSkill('jueqing')||player.hasSkill('gangzhi')) d1=false; - if(!target.mayHaveShan()||player.hasSkillTag('directHit_ai',true,{ + if(!target.mayHaveShan(player,'use')||player.hasSkillTag('directHit_ai',true,{ target:target, card:trigger.card, },true)){ @@ -457,6 +457,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return event.hasNature(); }, forced:true, + locked:false, content:function(){ 'step 0' if(event.triggername=='damageBegin2'){ @@ -1380,6 +1381,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if (get.tag(card, 'damage') > 0 && target.storage.twchongwangx.contains(player)) return false; }, }, + locked:false, unique: true, onremove: true, global: 'twchongwang_global', @@ -2983,7 +2985,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ expose:0.2, result:{ target:function(player,target){ - if(target.countCards('h')<=target.hp&&!target.mayHaveShan()&&get.effect(target,{name:'sha',isCard:true},player,player)>0) return -1; + if(target.countCards('h')<=target.hp&&!target.mayHaveShan(player,'use')&&get.effect(target,{name:'sha',isCard:true},player,player)>0) return -1; else if(target.countCards('h')>target.hp&&target.hp>2&&target.hasShan()) return 1; return 0; }, @@ -3149,7 +3151,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var eff=list.map(target=>{ if(target==player) return 0; return get.effect(target,{name:'sha'},player,player); - }).reduce((p,c)=>p+c,0),eff2=list2.map(target=>get.effect(target,{name:'wuzhong'},player,player)).reduce((p,c)=>p+c,0); + }).reduce((p,c)=>p+c,0),eff2=list2.map(target=>2*get.effect(target,{name:'draw'},player,player)).reduce((p,c)=>p+c,0); if(_status.event.controls.contains('选项二')&&eff2>eff) return '选项二'; if(eff>0) return 0; return 'cancel2'; @@ -3171,7 +3173,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return _status.event.getParent().list.contains(target); }).set('ai',function(target){ var player=_status.event.player; - return get.effect(target,{name:'wuzhong'},player,player); + return get.effect(target,{name:'draw'},player,player); }); else event.finish(); } @@ -3558,6 +3560,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'useCardAfter'}, group:['twmibei_mark','twmibei_fail'], forced:true, + locked:false, direct:true, dutySkill:true, derivation:'twmouli', @@ -6569,7 +6572,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var player=_status.event.player; if(player.hp+player.countCards('hs',{name:['tao','jiu']})<=1) return -1; var num=1; - if((!target.mayHaveShan()||player.hasSkillTag('directHit_ai',true,{ + if((!target.mayHaveShan(player,'use')||player.hasSkillTag('directHit_ai',true,{ target:target, card:{name:'sha'}, },true))&&!target.hasSkillTag('filterDamage',null,{ @@ -7659,6 +7662,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return targets.length>=2; }, forced:true, + locked:false, dutySkill:true, skillAnimation:true, animationColor:'wood', @@ -8586,14 +8590,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ if(!event.isFirstTarget||!get.tag(event.card,'damage')) return false; return !player.hasSkillTag('noCompareSource')&&game.hasPlayer(target=>{ - return target!=player&&target.countCards('h')>0&&!target.hasSkillTag('noCompareTarget'); + return player.canCompare(target,true); }); }, direct:true, content:function(){ 'step 0' player.chooseTarget(get.prompt2('twzhenhu'),[1,3],function(card,player,target){ - return target!=player&&target.countCards('h')>0&&!target.hasSkillTag('noCompareTarget'); + return player.canCompare(target,true); }).set('ai',function(target){ var player=_status.event.player,targets=_status.event.getTrigger().targets; var num=0; @@ -8658,10 +8662,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ trigger.player.addMark('twlvren',1); }, - effect:{ - player:function(card,player,target){ - if(target.hasMark('twlvren')) return 0.33; - }, + ai:{ + effect:{ + player:function(card,player,target){ + if(target.hasMark('twlvren')) return 0.33; + } + } }, marktext:'刃', intro:{name2:'刃',content:'mark'}, @@ -11084,7 +11090,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var d1=true; if(trigger.player.hasSkill('jueqing')||trigger.player.hasSkill('gangzhi')) d1=false; for(var target of trigger.targets){ - if(!target.mayHaveShan()||trigger.player.hasSkillTag('directHit_ai',true,{ + if(!target.mayHaveShan(player,'use')||trigger.player.hasSkillTag('directHit_ai',true,{ target:target, card:trigger.card, },true)){ @@ -11905,7 +11911,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('twzhian_ai'); }, onremove:function(player){ - game.removeGlobalSkill('twzhian_ai'); + if(!game.hasPlayer((current)=>current.hasSkill('twzhian'),true)) game.removeGlobalSkill('twzhian_ai'); }, usable:1, trigger:{global:'useCardAfter'}, @@ -12664,7 +12670,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!ui.selected.cards.length) return 0; var sub=get.subtype(ui.selected.cards[0],false); var eff=get.effect(target,ui.selected.cards[0],player,target); - if(sub=='equip2') eff+=(get.effect(target,{name:'wuzhong'},target,target)/2); + if(sub=='equip2') eff+=(get.effect(target,{name:'draw'},target,target)); if(target.isDamaged()&&(sub=='equip3'||sub=='equip4'||sub=='equip5')) eff+=get.recoverEffect(target,player,player); return eff; }, @@ -13284,7 +13290,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var d1=true; if(trigger.player.hasSkill('jueqing')||trigger.player.hasSkill('gangzhi')) d1=false for(var target of trigger.targets){ - if(!target.mayHaveShan()||trigger.player.hasSkillTag('directHit_ai',true,{ + if(!target.mayHaveShan(player,'use')||trigger.player.hasSkillTag('directHit_ai',true,{ target:target, card:trigger.card, },true)){ @@ -14584,7 +14590,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, dynamicTranslate:{ twfeifu:function(player){ - var str='转换技。'; + var str='锁定技,转换技。'; if(!player.storage.twfeifu) str+=''; str+='阴:当你成为【杀】的唯一目标后;'; if(!player.storage.twfeifu) str+=''; diff --git a/character/xianding.js b/character/xianding.js index 284da0d6f..6f79143c1 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -4,6 +4,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'xianding', connect:true, character:{ + dc_sb_zhouyu:['male','wu',4,['dcsbronghuo','dcsbyingmou']], + dc_sb_lusu:['male','wu',3,['dcsbmingshi','dcsbmengmou']], + zhangjian:['male','qun',105,['dc_zj_a','dc_zj_b'],['unseen']], zhugeruoxue:['female','wei',3,['dcqiongying','dcnuanhui']], caoyi:['female','wei',4,['dcmiyi','dcyinjun']], malingli:['female','shu',3,['dclima','dcxiaoyin','dchuahuo']], @@ -79,7 +82,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_liuzan:['male','wu',4,['refenyin','liji']], wenyang:['male','wei',5,['xinlvli','choujue']], wangshuang:['male','wei',8,['spzhuilie']], - huaman:['female','shu',3,['hmmanyi','mansi','souying','zhanyuan']], + huaman:['female','shu',3,['manyi','mansi','souying','zhanyuan']], puyuan:['male','shu',4,['pytianjiang','pyzhuren']], guanlu:['male','wei',3,['tuiyan','busuan','mingjie']], gexuan:['male','wu',3,['gxlianhua','zhafu']], @@ -100,11 +103,359 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp2_jichu:['zhaoang','dc_liuye','dc_wangyun','yanghong','huanfan','xizheng'], sp2_yuxiu:['dongguiren','dc_tengfanglan','zhangjinyun','zhoubuyi','dc_xujing'], sp2_qifu:['dc_guansuo','xin_baosanniang','dc_zhaoxiang'], - sp2_gaoshan:['wanglang','liuhui'], + sp2_gaoshan:['wanglang','liuhui','zhangjian'], sp2_wumiao:['wu_zhugeliang','wu_luxun'], + sp2_mouding:['dc_sb_lusu','dc_sb_zhouyu'], } }, skill:{ + //周瑜 + //无 双 万 军 取 首 + dcsbronghuo:{ + audio:2, + trigger:{player:'useCard'}, + filter:function(event,player){ + return (event.card.name=='sha'&&game.hasNature(event.card,'fire'))||event.card.name=='huogong'; + }, + forced:true, + content:function(){ + trigger.baseDamage=game.countGroup(); + }, + ai:{threaten:3.5}, + }, + dcsbyingmou:{ + mark:true, + marktext:'☯', + zhuanhuanji:true, + intro:{ + content:function(storage){ + if(!storage) return '每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】。' + return '每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。'; + }, + }, + audio:2, + trigger:{player:'useCardToPlayered'}, + filter:function(event,player){ + return event.isFirstTarget; + }, + usable:1, + direct:true, + content:function*(event,map){ + var result,player=map.player,targets=map.trigger.targets; + var storage=player.storage.dcsbyingmou; + if(storage){ + result=yield player.chooseCardTarget({ + prompt:get.prompt('dcsbyingmou'), + prompt2:'选择一名目标角色,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)', + filterTarget:function(card,player,target){ + if(!ui.selected.targets.length) return _status.event.targets.includes(target); + return target.isMaxHandcard(); + }, + selectTarget:2, + complexSelect:true, + complexTarget:true, + multitarget:true, + targetprompt:['目标角色','使用角色'], + filterCard:()=>false, + selectCard:-1, + ai2:function(target){ + var player=_status.event.player; + var getNum=function(player,target,source){ + return player.getCards('h',card=>{ + if(get.name(card)!='sha'&&(get.type(card)!='trick'||!get.tag(card,'damage'))) return false; + return player.canUse(card,target,false); + }).reduce((sum,card)=>sum+get.effect(target,card,player,source),0); + }; + if(!ui.selected.targets.length){ + var targets=game.filterPlayer(target=>target.isMaxHandcard()); + targets.sort((a,b)=>getNum(b,target,player)-getNum(a,target,player)); + return getNum(targets[0],target,player)+1; + } + return getNum(target,ui.selected.targets[0],player)+1; + }, + }).set('targets',targets); + } + else result=yield player.chooseTarget(get.prompt('dcsbyingmou'),'选择一名目标角色,将手牌数摸至与其相同,然后视为对其使用一张【火攻】',(card,player,target)=>_status.event.targets.includes(target)).set('ai',target=>{ + var player=_status.event.player; + return Math.max(0,Math.min(5,target.countCards('h')-player.countCards('h')))*2+get.effect(target,{name:'huogong'},player,player); + }).set('targets',targets); + if(result.bool){ + var target=result.targets[0]; + if(storage){ + player.logSkill('dcsbyingmou',result.targets,false); + player.line2(result.targets); + player.changeZhuanhuanji('dcsbyingmou'); + var source=result.targets[1],discard=true; + while(true){ + var cards=source.getCards('h',card=>{ + if(get.name(card)!='sha'&&(get.type(card)!='trick'||!get.tag(card,'damage'))) return false; + return source.canUse(card,target,false); + }); + if(cards.length){ + if(discard) discard=false; + yield source.useCard(cards.randomGet(),target,false); + } + else break; + } + if(discard&&player.countCards('h')evt==trigger&&player.countCards('h')).then(()=>{ + var str='明势:请展示三张牌并令一名其他角色选择获得其中的一张牌'; + if(player.countCards('h')<=3) str='明势:展示手牌并令一名其他角色选择获得其中的一张牌'; + player.chooseCardTarget({ + prompt:str, + filterTarget:lib.filter.notMe, + filterCard:true, + selectCard:function(){ + var player=_status.event.player; + if(player.countCards('h')<=3) return -1; + return 3; + }, + position:'h', + forced:true, + ai1:function(card){ + return -get.value(card); + }, + ai2:function(target){ + var player=_status.event.player; + if(player.hasSkill('dcsbmengmou')&&!get.is.blocked('dcsbmengmou',player)&&player.storage.dcsbmengmou&&get.attitude(player,target)<0) return get.effect(target,{name:'losehp'},player,player); + return get.attitude(player,target); + }, + }); + }).then(()=>{ + if(result.bool){ + var target=result.targets[0]; + event.target=target; + var cards=result.cards; + player.showCards(cards,get.translation(player)+'发动了【明势】'); + target.chooseButton(['明势:请获得其中一张牌',cards],true).set('filterButton',button=>{ + return lib.filter.canBeGained(button.link,_status.event.source,_status.event.player); + }).set('ai',button=>get.value(button.link)).set('source',player); + } + else event.finish(); + }).then(()=>{ + if(result.bool){ + var card=result.links[0]; + if(lib.filter.canBeGained(card,player,target)) target.gain(card,player,'giveAuto'); + else game.log('但',card,'不能被',player,'获得!'); + } + }); + }, + }, + dcsbmengmou:{ + mark:true, + marktext:'☯', + zhuanhuanji:true, + intro:{ + content:function(storage){ + if(!storage) return '每回合限一次,当你得到其他角色的牌后,或其他角色得到你的牌后,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力。(X为你的体力值)' + return '每回合限一次,当你得到其他角色的牌后,或其他角色得到你的牌后,你可令该角色打出至多X张【杀】,然后其失去Y点体力。(X为你的体力值,Y为X-其打出【杀】数)'; + }, + }, + audio:2, + trigger:{global:['gainAfter','loseAsyncAfter']}, + filter:function(event,player){ + if(!player.getHp()) return false; + if(event.name=='loseAsync'&&event.type!='gain') return false; + var cards1=event.getl(player).cards2,cards2=event.getg(player); + return (!player.hasSkill('dcsbmengmou_true')&&game.hasPlayer(function(current){ + if(current==player) return false; + var cardsx=event.getg(current); + return cardsx.some(i=>cards1.includes(i)); + }))||(!player.hasSkill('dcsbmengmou_false')&&game.hasPlayer(function(current){ + if(current==player) return false; + var cardsx=event.getl(current).cards2; + return cards2.some(i=>cardsx.includes(i)); + })); + }, + direct:true, + content:function*(event,map){ + var player=map.player,trigger=map.trigger; + var storage=player.storage.dcsbmengmou; + player.addTempSkill('dcsbmengmou_effect','dcsbmengmouAfter'); + var targets=[],num=player.getHp(); + var cards1=trigger.getl(player).cards2; + var cards2=trigger.getg(player); + if(!player.hasSkill('dcsbmengmou_true')) targets.addArray(game.filterPlayer(function(current){ + if(current==player) return false; + var cardsx=trigger.getg(current); + return cardsx.some(i=>cards1.includes(i)); + })); + if(!player.hasSkill('dcsbmengmou_false')) targets.addArray(game.filterPlayer(function(current){ + if(current==player) return false; + var cardsx=trigger.getl(current).cards2; + return cards2.some(i=>cardsx.includes(i)); + })); + targets.sortBySeat(); + var check_true=function(player,target){ + if(get.attitude(player,target)>0){ + if(target.countCards('hs',card=>{ + if(get.name(card)!='sha') return false; + return target.hasValueTarget(card); + })) return 4; + return 0.5; + } + if(get.attitude(player,target)<0){ + if(!target.countCards('hs',card=>{ + if(get.name(card)!='sha') return false; + return target.hasValueTarget(card); + })){ + if(target.countCards('hs',card=>{ + if(get.name(card)!='sha') return false; + return target.hasUseTarget(card); + })) return -3; + return -1; + } + return 0; + } + return 0; + }; + var check_false=function(player,target){ + if(get.attitude(player,target)<0) return get.effect(target,{name:'losehp'},player,player); + return 0; + }; + var result,target; + if(targets.length==1){ + target=targets[0]; + var str; + if(storage) str='令'+get.translation(target)+'打出至多'+get.cnNumber(num)+'张【杀】,然后其失去Y点体力。(Y为'+num+'-其打出【杀】数)'; + else str='令'+get.translation(target)+'使用至多'+get.cnNumber(num)+'张【杀】,其每以此法造成1点伤害,其回复1点体力'; + result=yield player.chooseBool(get.prompt('dcsbmengmou',target),str).set('choice',(storage?check_true(player,target):check_false(player,target))>0); + } + else{ + result=yield player.chooseTarget(get.prompt('dcsbmengmou'),lib.skill.dcsbmengmou.intro.content(storage),(card,player,target)=>_status.event.targets.includes(target)).set('ai',target=>{ + return _status.event.check(_status.event.player,target); + }).set('targets',targets).set('check',storage?check_true:check_false).set('ainmate',false); + } + if(result.bool){ + if(!target) target=result.targets[0]; + player.logSkill('dcsbmengmou',target); + player.addTempSkill('dcsbmengmou_'+(storage||false)); + player.changeZhuanhuanji('dcsbmengmou'); + while(num>0){ + num--; + var result2; + if(storage){ + result2=yield target.chooseToRespond((card,player)=>{ + return get.name(card)=='sha'; + }).set('ai',card=>{ + return 1+Math.random(); + }).set('prompt','盟谋:是否打出一张【杀】?').set('prompt2','当前进度:'+(3-num)+'/3'); + } + else result2=yield target.chooseToUse(card=>{ + if(!lib.filter.cardEnabled(card,_status.event.player,_status.event)) return false; + return get.name(card)=='sha'; + }).set('prompt','盟谋:是否使用一张【杀】?').set('prompt2','当前进度:'+(3-num)+'/3'); + if(!result2.bool){ + if(storage){ + target.popup('杯具'); + target.loseHp(num+1); + } + break; + } + } + } + }, + subSkill:{ + effect:{ + charlotte:true, + trigger:{global:'damageSource'}, + filter:function(event,player){ + if(event.getParent().type!='card') return false; + if(event.source.isHealthy()||event.card.name!='sha') return false; + return event.getParent(4).name=='dcsbmengmou'&&event.getParent(4).player==player; + }, + forced:true, + popup:false, + firstDo:true, + content:function(){ + trigger.source.recover(trigger.num); + }, + }, + true:{charlotte:true}, + false:{charlotte:false}, + }, + }, + //张臶 + dc_zj_a:{ + audio:2, + trigger:{player:'damageBegin2'}, + filter:function(event,player){ + return event.getParent().type=='card'; + }, + forced:true, + content:function(){ + var num=get.number(trigger.card); + if(typeof num=='number'&&num>0) trigger.num=num; + else trigger.cancel(); + }, + ai:{ + effect:{ + target:function(card,player,target,current){ + if(get.tag(card,'damage')&&typeof get.number(card)!='number') return 'zeroplayertarget'; + }, + }, + }, + }, + dc_zj_b:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + filter:function(event,player){ + return player.countDiscardableCards(player,'he'); + }, + direct:true, + content:function*(event,map){ + var player=map.player; + var result=yield player.chooseTarget(get.prompt2('dc_zj_b'),lib.filter.notMe).set('ai',target=>{ + var player=_status.event.player; + if(!player.hasFriend()) return 0; + return -game.countPlayer(current=>current.inRange(target)&&get.attitude(current,target)<0&&get.damageEffect(target,current,current)>0); + }); + if(result.bool){ + var target=result.targets[0]; + player.logSkill('dc_zj_b',target); + player.discard(player.getCards('he')).discarder=player; + target.addSkill('dc_zj_a'); + target.addSkill('dc_zj_b_threaten'); + player.when('phaseBegin').then(()=>{ + if(target.isIn()){ + target.removeSkill('dc_zj_a'); + target.removeSkill('dc_zj_b_threaten'); + } + }).vars({target:target}); + } + }, + subSkill:{ + //定要将你赶尽杀绝 + threaten:{ + charlotte:true, + mark:true, + marktext:'噩', + intro:{content:'已经开始汗流浃背了'}, + ai:{threaten:114514*1919810}, + }, + }, + }, //诸葛若雪 dcqiongying:{ audio:2, @@ -924,6 +1275,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return !player.hasMark('dccaixia_clear'); }, direct:true, + locked:false, content:function(){ 'step 0' var choices=Array.from({length:Math.min(5,game.players.length+game.dead.length)}).map((_,i)=>get.cnNumber(i+1,true)); @@ -2168,6 +2520,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); }, direct:true, + locked:false, content:function(){ 'step 0' var targets=trigger.targets.filter(target=>{ @@ -2981,10 +3334,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(num>0&&!player._dczhizhe_mod&&get.itemtype(card)==='card'&&card.hasGaintag('dczhizhe')){ if(player.canIgnoreHandcard(card)) return Infinity; player._dczhizhe_mod=true; - if(player.hp<3&&player.needsToDiscard(player.countCards('h',(cardx)=>{ - if(player.canIgnoreHandcard(cardx)||get.useful(cardx)>6) return true; - return false; - }))) return num*1.5; + if(player.hp<3&&player.needsToDiscard(0,(i,player)=>{ + return !player.canIgnoreHandcard(i)&&get.useful(i)>6; + })) return num*1.5; return num*10; } } @@ -3172,12 +3524,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!target.hasFriend()) return; var num=1; if(get.attitude(player,target)>0){ - if(player.needsToDiscard()){ - num=0.5; - } - else{ - num=0.3; - } + if(player.needsToDiscard()) num=0.5; + else num=0.3; } if(target.hp>=4) return [1,num*2]; if(target.hp==3) return [1,num*1.5]; @@ -3491,12 +3839,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!target.hasFriend()) return; var num=1; if(get.attitude(player,target)>0){ - if(player.needsToDiscard()){ - num=0.7; - } - else{ - num=0.5; - } + if(player.needsToDiscard()) num=0.7; + else num=0.5; } if(target.hp==2&&target.hasFriend()) return [1,num*1.5]; if(target.hp>=2) return [1,num]; @@ -4126,6 +4470,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //谢灵毓 dcyuandi:{ audio:2, + init:()=>{ + game.addGlobalSkill('dcyuandi_ai'); + }, + onremove:()=>{ + if(!game.hasPlayer(i=>i.hasSkill('dcyuandi'),true)) game.removeGlobalSkill('dcyuandi_ai'); + }, trigger:{global:'useCard'}, filter:function(event,player){ var evt=event.getParent('phaseUse'); @@ -4136,7 +4486,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).indexOf(event)==0; }, direct:true, - global:'dcyuandi_ai', content:function(){ 'step 0' var target=trigger.player; @@ -4180,6 +4529,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return num/3; }, }, + trigger:{player:'dieAfter'}, + filter:()=>{ + return !game.hasPlayer(i=>i.hasSkill('dcyuandi'),true); + }, + silent:true, + forceDie:true, + content:()=>{ + game.removeGlobalSkill('dcyuandi_ai'); + } }, } }, @@ -4361,16 +4719,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseButton([1,num]).set('createDialog',dialog).set('filterButton',button=>{ return lib.filter.canBeDiscarded(button.link,_status.event.player,get.owner(button.link)); }).set('ai',button=>{ - var card=button.link; - var player=_status.event.player,target=get.owner(card); - if(target==player&&ui.cardPile.childNodes.length>80){ - if(ui.selected.buttons.some(i=>get.owner(i.link)==player)) return 0; - if(get.value(card,player)<6) return 60-get.value(card,player); + var player=_status.event.player, + target=get.owner(button.link), + num=ui.selected.buttons.filter(i=>get.owner(i.link)==target).length; + if(num>1&&player.hp+player.hujia>2) return 0; + if(target==player){ + if(num) return -get.value(button.link,target); + if(ui.cardPile.childNodes.length>80) return 6-get.value(card,player); return 0; } - var num=ui.selected.buttons.filter(i=>get.owner(i.link)==target).length; var val=get.buttonValue(button); - if(num>2) val/=Math.sqrt(num); + if(num===2) val/=4; if(get.attitude(player,target)>0) return -val; return val; //return -(get.position(card)!='h'?get.value(card,target):(4.5+Math.random()-0.2*(num>2?1:0)))*get.attitude(player,target); @@ -4419,7 +4778,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('dcaichen_hit'); }, onremove:function(player){ - game.removeGlobalSkill('dcaichen_hit'); + if(!game.hasPlayer(current=>current.hasSkill('dcaichen'),true)) game.removeGlobalSkill('dcaichen_hit'); }, trigger:{ player:['loseAfter','phaseDiscardBefore'], @@ -4449,7 +4808,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ hit:{ trigger:{player:'dieAfter'}, filter:function(event,player){ - return !game.hasPlayer(current=>current.hasSkill('dcaichen')); + return !game.hasPlayer(current=>current.hasSkill('dcaichen'),true); }, silent:true, forceDie:true, @@ -4735,7 +5094,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ targetsx.removeArray(targets); return targetsx.reduce((p,c)=>{ return p+Math.max(0,get.effect(c,{name:'shunshou_copy2'},player,player)); - },0)>get.effect(player,{name:'wuzhong'},player,player)/1.5?'选项一':'选项二'; + },0)>get.effect(player,{name:'draw'},player,player)*1.3?'选项一':'选项二'; }()); 'step 1' if(result.control=='cancel2'){ @@ -5162,7 +5521,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ all:{ trigger:{player:'dieAfter'}, filter:function(event,player){ - return !game.hasPlayer(current=>current.hasSkill('dcwumei_wake')); + return !game.hasPlayer(current=>current.hasSkill('dcwumei_wake'),true); }, silent:true, forceDie:true, @@ -7900,7 +8259,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(current==player||current.countCards('he')==0) return false; return get.effect(current,{name:'guohe_copy2'},player,player)+get.effect(current,{name:'sha'},player,player)>0; })){ - if(get.position(card)=='h'&&player.needsToDiscard()>ui.selected.cards.length) return 7+1/Math.max(1,get.value(card)); + if(get.position(card)=='h'&&player.needsToDiscard(0,(i,player)=>{ + return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); + })) return 7+1/Math.max(1,get.value(card)); return 7-get.value(card); } return 0; @@ -8167,7 +8528,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ max=get.recoverEffect(current,player,player)*Math.min(evt.getParent().num,player.getDamagedHp()); }, 选项二:function(target){ - max=get.effect(target,{name:'wuzhong'},player,player)/2*evt.getParent().num; + max=get.effect(target,{name:'draw'},player,player)*evt.getParent().num; }, 选项三:function(target){ if(player.isTurnedOver()) max+=25; @@ -8820,7 +9181,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' player.chooseTarget(get.prompt2('juetao'),lib.filter.notMe).set('ai',function(target){ - return -get.attitude(_status.event.player,target); + let att=-get.attitude(_status.event.player,target); + if(att<=0) return -att; + if(target.hasSkillTag('nodamage')) return 0.01*att; + if(target.getEquip('tengjia')||target.getEquip('renwang')) return 0.2*att; + if(target.getEquip('bugua')) return 0.3*att; + if(target.getEquip(2)) return att/2; + return 1.2*att; }); 'step 1' if(result.bool){ @@ -11550,19 +11917,38 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //花鬘 manyi:{ audio:2, - audioname:['mengyou'], - }, - hmmanyi:{ + audioname:['mengyou','menghuo','zhurong'], trigger:{target:'useCardToBefore'}, - forced:true, - audio:'manyi', - audioname:['mengyou'], filter:function(event,player){ return event.card.name=='nanman'; }, + forced:true, content:function(){ trigger.cancel(); }, + ai:{ + effect:{ + target:function(card){ + if(card.name=='nanman') return 'zerotarget'; + }, + }, + }, + group:'manyi_single', + subSkill:{ + single:{ + trigger:{ + player:'enterGame', + global:'gameDrawAfter', + }, + filter:function(event,player){ + return get.mode()=='single'&&_status.mode=='normal'; + }, + direct:true, + content:function(){ + player.chooseUseTarget('nanman',get.prompt('manyi'),'视为使用一张【南蛮入侵】').logSkill='manyi'; + }, + }, + }, }, mansi:{ audio:2, @@ -12691,6 +13077,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, characterIntro:{ + zhangjian:'张臶(136年-240年),字子明,钜鹿人。汉末三国时期隐士、音乐家,精通谶纬之学。张臶生活的年代从东汉一直到曹魏齐王时期,受到朝廷多次征召,一直回避,不愿做官。他活了一百零五岁,是三国时期有可靠记载的最长寿的人之一。', puyuan:'蒲元是三国时蜀汉杰出的工匠。为诸葛亮造刀三千口,并且制作木牛流马。后来姜维为他写过两部传记《蒲元传》《蒲元别传》。', guanlu:"管辂(209年-256年),字公明,平原(今山东德州平原县)人。三国时期曹魏术士。年八九岁,便喜仰观星辰。成人后,精通《周易》,善于卜筮、相术,习鸟语,相传每言辄中,出神入化。体性宽大,常以德报怨。正元初,为少府丞。北宋时被追封为平原子。管辂是历史上著名的术士,被后世奉为卜卦观相的祖师。", gexuan:"葛玄(164年-244年),汉族,吴丹阳郡句容县都乡吉阳里人(今句容市),祖籍山东琅琊,三国著名高道,道教灵宝派祖师。字孝先,号仙翁,被尊称为“葛天师”。道教尊为葛仙翁,又称太极仙翁,与张道陵、许逊、萨守坚共为四大天师。为汉下邳僮侯葛艾后裔,祖葛矩,安平太守,黄门郎;从祖葛弥,豫章第五郡太守。父葛焉,字德儒,州主簿,山阴令,散骑常侍,大尚书。随左慈学道,得《太清丹经》、《黄帝九鼎神丹经》、《金液丹经》等道经。曾采药海山,吴嘉禾二年(233年),在閤皂山修道建庵,筑坛立炉,修炼九转金丹。喜好遨游山川,去过括苍山、南岳山、罗浮山。编撰《灵宝经诰》,精研上清、灵宝等道家真经,并嘱弟子世世箓传。", @@ -12812,6 +13199,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dczhangcai:function(player){ return '当你使用或打出'+(player.hasSkill('dczhangcai_all')?'':'点数为8的')+'牌时,你可以摸X张牌(X为你手牌区里'+(player.hasSkill('dczhangcai_all')?'与此牌点数相同':'点数为8')+'的牌数且至少为1)。'; }, + dcsbmengmou:function(player){ + var storage=player.storage.dcsbmengmou; + var str='转换技,每回合每项各限一次,当你得到其他角色的牌后,或其他角色得到你的牌后:'; + if(!storage) str+=''; + str+='阴,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力;'; + if(!storage) str+=''; + if(storage) str+=''; + str+='阳,你可令该角色打出至多X张【杀】,然后其失去Y点体力。'; + if(storage) str+=''; + str+='(X为你的体力值,Y为X-其打出【杀】数)'; + return str; + }, + dcsbyingmou:function(player){ + var storage=player.storage.dcsbyingmou; + var str='转换技,每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色:'; + if(!storage) str+=''; + str+='阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;'; + if(!storage) str+=''; + if(storage) str+=''; + str+='阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。'; + if(storage) str+=''; + return str; + }, }, characterReplace:{ wenyang:['wenyang','db_wenyang','diy_wenyang'], @@ -12867,8 +13277,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ wlcuorui_info_identity:'出牌阶段开始时,你可以弃置一名你至其的距离不大于1的角色区域里的一张牌,然后你选择一项:1.弃置另一名其他角色装备区里至多两张与此牌颜色相同的牌;2.展示另一名其他角色的至多两张手牌,然后获得其中与此牌颜色相同的牌。', wlcuorui_info_guozhan:'出牌阶段开始时,你可以弃置一名你至其的距离不大于1的角色区域里的一张牌,然后你选择一项:1.弃置另一名其他角色装备区里至多两张与此牌颜色相同的牌;2.展示另一名其他角色的至多两张手牌,然后获得其中与此牌颜色相同的牌。', huaman:'花鬘', - hmmanyi:'蛮裔', - hmmanyi_info:'锁定技,【南蛮入侵】对你无效。', + manyi:'蛮裔', + manyi_info:'锁定技,【南蛮入侵】对你无效。', + manyi_info_single_normal:'锁定技,【南蛮入侵】对你无效。当你登场时,你可以视为使用一张【南蛮入侵】。', mansi_viewas:'蛮嗣', mansi:'蛮嗣', mansi_info:'出牌阶段限一次,你可以将所有手牌当做【南蛮入侵】使用;当有角色受到【南蛮入侵】的伤害后,你摸一张牌。', @@ -13317,6 +13728,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcqiongying_info:'出牌阶段限一次。你可以移动场上的一张牌,然后你弃置一张与此牌花色相同的手牌(若没有该花色的手牌则改为展示所有手牌)。', dcnuanhui:'暖惠', dcnuanhui_info:'结束阶段,你可以选择一名装备区有牌的角色,其可以视为依次使用X张基本牌(X为其装备区牌数)。若其以此法使用了至少两张牌,其弃置装备区里的所有牌。', + zhangjian:'张臶', + dc_zj_a:'技能', + dc_zj_a_info:'锁定技。当你受到牌造成的伤害时,若此牌有点数,则你将此伤害值改为此牌点数,否则你防止此伤害。', + dc_zj_b:'技能', + dc_zj_b_info:'结束阶段,你可以弃置所有牌并令一名其他角色获得〖技能〗直到你的下个回合开始。', + dc_sb_lusu:'新杀谋鲁肃', + dc_sb_lusu_prefix:'新杀谋', + dcsbmingshi:'明势', + dcsbmingshi_info:'摸牌阶段,你可以多摸两张牌,然后令展示三张牌并令一名其他角色选择获得其中的一张牌。', + dcsbmengmou:'盟谋', + dcsbmengmou_info:'转换技,每回合每项各限一次,当你得到其他角色的牌后,或其他角色得到你的牌后:阴,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力;阳,你可令该角色打出至多X张【杀】,然后其失去Y点体力。(X为你的体力值,Y为X-其打出【杀】数)', + dc_sb_zhouyu:'新杀谋周瑜', + dc_sb_zhouyu_prefix:'新杀谋', + dcsbronghuo:'融火', + dcsbronghuo_info:'锁定技,当你使用火【杀】或【火攻】时,此牌伤害基值改为场上势力数。', + dcsbyingmou:'英谋', + dcsbyingmou_info:'转换技,每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色:阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。', sp2_yinyu:'隐山之玉', sp2_huben:'百战虎贲', @@ -13332,6 +13760,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp2_wumiao:'武庙', sp2_gaoshan:'高山仰止', sp2_qifu:'祈福', + sp2_mouding:'谋定天下', }, }; }); diff --git a/character/xianjian.js b/character/xianjian.js index b3d6a1a44..e09d4a26d 100644 --- a/character/xianjian.js +++ b/character/xianjian.js @@ -653,9 +653,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseTarget('将'+get.translation(result.links)+'交给一名角色',true).ai=function(target){ var att=get.attitude(player,target)/Math.sqrt(target.countCards('h')+1); if(result.links.length>1){ - if(target==player&&target.needsToDiscard(result.links.length)>1){ - return att/5; - } + if(target==player&&target.needsToDiscard(result.links)>1) return att/5; return att; } else{ @@ -1241,7 +1239,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } return false; }).ai=function(target){ - var num=0,eff=0,damaged=false; + var use=[],eff=0,damaged=false; for(var i=0;i0){ - num++; + use.push(hs[i]); if(get.attitude(player,target)>0){ hef/=1.5; if(get.tag(hs[i],'damage')){ @@ -1262,9 +1260,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ eff+=hef; } } - if(!player.needsToDiscard(-num)){ - return eff; - } + if(!player.needsToDiscard(0,(i,player)=>{ + return !use.includes(i)&&!player.canIgnoreHandcard(i); + })) return eff; return 0; }; 'step 1' @@ -4158,223 +4156,223 @@ game.import('character',function(lib,game,ui,get,ai,_status){ pal_jushifang:'居十方', xyufeng:'御蜂', - xyufeng_info:'出牌阶段限一次,可以将一张黑桃牌当作机关蜂使用', + xyufeng_info:'出牌阶段限一次,可以将一张黑桃牌当作机关蜂使用。', lingquan:'灵泉', - lingquan_info:'觉醒技,结束阶段,若游戏轮数不小于3且你本回合使用的牌数大于你的体力值,你摸三张牌,然后获得技能【水蕴】', + lingquan_info:'觉醒技,结束阶段,若游戏轮数不小于3且你本回合使用的牌数大于你的体力值,你摸三张牌,然后获得技能【水蕴】。', shenwu:'神舞', - shenwu_info:'觉醒技,在一名角色的结束阶段,若你本局至少发动过3次【水蕴】,你增加1点体力和体力上限并获得2点护甲,然后获得技能【回梦】', + shenwu_info:'觉醒技,在一名角色的结束阶段,若你本局至少发动过3次【水蕴】,你增加1点体力和体力上限并获得2点护甲,然后获得技能【回梦】。', txianqu:'仙音', - txianqu_info:'出牌阶段限一次,当你即将造成伤害时,你可以防止之,然后摸两张牌并回复1点体力', + txianqu_info:'出牌阶段限一次,当你即将造成伤害时,你可以防止之,然后摸两张牌并回复1点体力。', qiongguang:'穹光', - qiongguang_info:'弃牌阶段结束时,若你弃置了至少两张牌,你可以对所有敌方角色施加一个随机的负面效果', + qiongguang_info:'弃牌阶段结束时,若你弃置了至少两张牌,你可以对所有敌方角色施加一个随机的负面效果。', xunying:'迅影', - xunying_info:'每当你使用杀对一名目标结算完毕后,你可以继续对目标使用杀', + xunying_info:'每当你使用杀对一名目标结算完毕后,你可以继续对目标使用杀。', liefeng:'冽风', - liefeng_info:'锁定技,当你在回合内使用第二张牌时,你本回合获得【炎斩】;当你在回合内使用第三张牌时,你本回合获得【天剑】;当你在回合内使用第四张牌时,你本回合获得【御风】', + liefeng_info:'锁定技,当你在回合内使用第二张牌时,你本回合获得【炎斩】;当你在回合内使用第三张牌时,你本回合获得【天剑】;当你在回合内使用第四张牌时,你本回合获得【御风】。', yuexing:'越行', yuexing2:'越行', - yuexing_info:'出牌阶段限一次,你可以指定一名角色,本阶段内将你与该角色到其他角色的距离基数互换', + yuexing_info:'出牌阶段限一次,你可以指定一名角色,本阶段内将你与该角色到其他角色的距离基数互换。', lingdi:'灵笛', - lingdi_info:'出牌阶段,你可以弃置一张本回合与此法弃置的牌花色均不同的手牌,然后选择一名与你距离为X的角色与其各摸一张牌,X为本回合发动灵笛的次数(含此次)', + lingdi_info:'出牌阶段,你可以弃置一张本回合与此法弃置的牌花色均不同的手牌,然后选择一名与你距离为X的角色与其各摸一张牌,X为本回合发动灵笛的次数(含此次)。', xiaoyue:'啸月', - xiaoyue_info:'锁定技,每轮开始时,若你手牌中有杀,你将手牌中的一张随机杀对一名随机敌方角色使用,然后获得1点护甲', + xiaoyue_info:'锁定技,每轮开始时,若你手牌中有杀,你将手牌中的一张随机杀对一名随机敌方角色使用,然后获得1点护甲。', minsha:'冥煞', - minsha_info:'出牌阶段限一次,你可以弃置两张牌,对一名体力值大于1的其他角色造成1点雷属性伤害,然后距离目标1以内的所有其他角色随机弃置一张牌', + minsha_info:'出牌阶段限一次,你可以弃置两张牌,对一名体力值大于1的其他角色造成1点雷属性伤害,然后距离目标1以内的所有其他角色随机弃置一张牌。', xhuanlei:'唤雷', - xhuanlei_info:'每当你受到一次伤害,若伤害来源体力值大于你,你可以对其造成1点雷属性伤害,然后其摸一张牌', + xhuanlei_info:'每当你受到一次伤害,若伤害来源体力值大于你,你可以对其造成1点雷属性伤害,然后其摸一张牌。', anwugu:'巫蛊', anwugu2:'蛊', - anwugu_info:'每当你对其他角色造成一次伤害,你可以令目标获得三枚蛊标记;拥有蛊标记的角色手牌上限-1,每回合最多使用X张牌(X为蛊标记数),每个结束阶段失去一枚蛊标记', + anwugu_info:'每当你对其他角色造成一次伤害,你可以令目标获得三枚蛊标记;拥有蛊标记的角色手牌上限-1,每回合最多使用X张牌(X为蛊标记数),每个结束阶段失去一枚蛊标记。', xtanxi:'探息', - xtanxi_info:'出牌阶段限一次,你可以弃置一张手牌,然后随机选择一名手牌中有与之同名的牌的敌方角色,观看其手牌并获得任意一张', + xtanxi_info:'出牌阶段限一次,你可以弃置一张手牌,然后随机选择一名手牌中有与之同名的牌的敌方角色,观看其手牌并获得任意一张。', linghuo:'灵火', - linghuo_info:'每两轮限一次,在一名其他角色的结束阶段,若其本回合内造成过伤害,你可以对其造成1点火属性伤害', + linghuo_info:'每两轮限一次,在一名其他角色的结束阶段,若其本回合内造成过伤害,你可以对其造成1点火属性伤害。', guijin:'归烬', guijin2:'归烬', guijin2_bg:'烬', - guijin_info:'每三轮限一次,出牌阶段,你可以观看牌堆顶的四张牌,然后可以将其中任意张牌分配给任意角色,被分到牌的角色跳过下一摸牌阶段,然后将剩余牌以原顺序放回牌堆顶', + guijin_info:'每三轮限一次,出牌阶段,你可以观看牌堆顶的四张牌,然后可以将其中任意张牌分配给任意角色,被分到牌的角色跳过下一摸牌阶段,然后将剩余牌以原顺序放回牌堆顶。', chengxin:'澄心', chengxin2:'澄心', chengxin2_bg:'心', - chengxin_info:'每四轮限一次,当一名角色进入濒死状态时,你可以令其将体力值回复至1,然后该角色防止一切伤害直到下一回合结束', + chengxin_info:'每四轮限一次,当一名角色进入濒死状态时,你可以令其将体力值回复至1,然后该角色防止一切伤害直到下一回合结束。', tianwu:'天舞', - tianwu_info:'每当你使用卡牌指定一名敌方角色为惟一目标,你可以对其施加一个随机的负面效果', - tianwu_info_alter:'每当你使用卡牌指定一名敌方角色为惟一目标,你可以对其施加一个随机的负面效果,每回合限发动一次', + tianwu_info:'每当你使用卡牌指定一名敌方角色为惟一目标,你可以对其施加一个随机的负面效果。', + tianwu_info_alter:'每当你使用卡牌指定一名敌方角色为惟一目标,你可以对其施加一个随机的负面效果,每回合限发动一次。', liguang:'离光', - liguang_info:'结束阶段,你可以弃置一张手牌并将场上的一张牌移动到另一个合理的位置', + liguang_info:'结束阶段,你可以弃置一张手牌并将场上的一张牌移动到另一个合理的位置。', shiying:'逝影', shiying_info:'限定技,在一名其他角色死亡前,你可以防止其死亡,然后你与该角色失去全部技能、将体力和体力上限变为3、移去所有牌并摸三张牌。', yujia:'御甲', - yujia_info:'每当你使用一张未强化的装备牌,你可以随机观看X张机关牌,并选择一张获得之,X为你本局使用过的机关牌数且至少为1', + yujia_info:'每当你使用一张未强化的装备牌,你可以随机观看X张机关牌,并选择一张获得之,X为你本局使用过的机关牌数且至少为1。', xiepan:'械磐', - xiepan_info:'每当你失去最后一张基本牌,你可以弃置一张手牌,然后获得一张随机装备牌', + xiepan_info:'每当你失去最后一张基本牌,你可以弃置一张手牌,然后获得一张随机装备牌。', yanshi:'偃师', - yanshi_info:'觉醒技,结束阶段,若你累计有4个回合使用过机关牌,你增加1点体力和体力上限,然后用随机装备填满你的装备区', + yanshi_info:'觉醒技,结束阶段,若你累计有4个回合使用过机关牌,你增加1点体力和体力上限,然后用随机装备填满你的装备区。', ywuhun:'雾魂', ywuhun_bg:'魂', - ywuhun_info:'锁定技,回合开始前,你获得一个额外的回合,并在此回合结束后复原场上及牌堆中的所有牌;当你在此回合中造成伤害后,终止所有结算并结束此回合', - // ywuhun_info_alter:'锁定技,回合开始前,你获得一个额外的回合,并在此回合结束后复原场上及牌堆中的所有牌;当你在此回合中造成伤害后,终止所有结算并结束此回合', + ywuhun_info:'锁定技,回合开始前,你获得一个额外的回合,并在此回合结束后复原场上及牌堆中的所有牌;当你在此回合中造成伤害后,终止所有结算并结束此回合。', + // ywuhun_info_alter:'锁定技,回合开始前,你获得一个额外的回合,并在此回合结束后复原场上及牌堆中的所有牌;当你在此回合中造成伤害后,终止所有结算并结束此回合。', feichen:'飞尘', feichen_info:'', tanhua:'昙华', - tanhua_info:'锁定技,你回复体力的效果改为摸两张牌;当你进入濒死状态时,你回复1点体力并失去此技能', + tanhua_info:'锁定技,你回复体力的效果改为摸两张牌;当你进入濒死状态时,你回复1点体力并失去此技能。', xjyingfeng:'影锋', - xjyingfeng_info:'锁定技,每当你使用一张杀结算完毕后,你随机对一名不是此杀目标的敌方角色使用一张杀', + xjyingfeng_info:'锁定技,每当你使用一张杀结算完毕后,你随机对一名不是此杀目标的敌方角色使用一张杀。', fenglue:'风掠', - fenglue_info:'你可以放弃出牌阶段,改为指定一名其他角色并选择任意张手牌,依次对该角色使用,若如此做,此阶段内该角色每受到1点伤害,你在结算后摸一张牌', + fenglue_info:'你可以放弃出牌阶段,改为指定一名其他角色并选择任意张手牌,依次对该角色使用,若如此做,此阶段内该角色每受到1点伤害,你在结算后摸一张牌。', xjzongyu:'纵雨', - xjzongyu_info:'出牌阶段限一次,你可以弃置一张黑色手牌,视为使用一张飞镖,随机指定两名敌方角色为目标', + xjzongyu_info:'出牌阶段限一次,你可以弃置一张黑色手牌,视为使用一张飞镖,随机指定两名敌方角色为目标。', fanling:'返灵', - fanling_info:'锁定技,每当一名角色失去体力,你回复1点体力,每回合只能发动一次', + fanling_info:'锁定技,每当一名角色失去体力,你回复1点体力,每回合只能发动一次。', huahu:'化狐', huahu_bg:'狐', - huahu_info:'限定技,你可以失去所有技能和1点体力上限,然后令任意名其他角色回复1点体力、获得1点护甲并摸一张牌', + huahu_info:'限定技,你可以失去所有技能和1点体力上限,然后令任意名其他角色回复1点体力、获得1点护甲并摸一张牌。', sheying:'蛇影', - sheying_info:'每回合限一次,当你使用卡牌造成一次伤害后,你可以进行一次判定,若结果为黑色,你收回此牌', + sheying_info:'每回合限一次,当你使用卡牌造成一次伤害后,你可以进行一次判定,若结果为黑色,你收回此牌。', dujiang:'毒降', - dujiang_info:'出牌阶段限一次,你可以弃置一张黑色牌令一名随机敌人获得一张毒', + dujiang_info:'出牌阶段限一次,你可以弃置一张黑色牌令一名随机敌人获得一张毒。', binxin:'冰心', - binxin_info:'在一名角色的结束阶段,若其体力值为1,你可以令其获得1点护甲', + binxin_info:'在一名角色的结束阶段,若其体力值为1,你可以令其获得1点护甲。', qixia:'绮霞', - qixia_info:'锁定技,当你累计使用或打出了4种不同花色的牌后,你于本回合结束后获得一个额外回合', + qixia_info:'锁定技,当你累计使用或打出了4种不同花色的牌后,你于本回合结束后获得一个额外回合。', jianzhen:'剑阵', - jianzhen_info:'锁定技,当你使用杀对目标结算完毕后,其他角色可以对该目标使用一张杀,当有人选择出杀后终止此结算', + jianzhen_info:'锁定技,当你使用杀对目标结算完毕后,其他角色可以对该目标使用一张杀,当有人选择出杀后终止此结算。', husha:'虎煞', husha_bg:'煞', - husha_info:'每当你于出牌阶段造成1点伤害,你获得一枚虎煞标记(标记数不超过3);结束阶段,你可以选择一项:1. 移去一枚虎煞标记,视为对任意角色使用一张杀;2. 移去两枚虎煞标记,视为使用一张南蛮入侵;3. 移去三枚虎煞标记,视为对除你之外的角色使用一张元素毁灭', + husha_info:'每当你于出牌阶段造成1点伤害,你获得一枚虎煞标记(标记数不超过3);结束阶段,你可以选择一项:1. 移去一枚虎煞标记,视为对任意角色使用一张杀;2. 移去两枚虎煞标记,视为使用一张南蛮入侵;3. 移去三枚虎煞标记,视为对除你之外的角色使用一张元素毁灭。', longhuo:'龙火', - longhuo_info:'结束阶段,你可以对所有角色各造成1点火焰伤害', + longhuo_info:'结束阶段,你可以对所有角色各造成1点火焰伤害。', fenshi:'焚世', - fenshi_info:'觉醒技,当你解除濒死状态时,你获得2点护甲,摸两张牌,然后获得技能龙火', + fenshi_info:'觉醒技,当你解除濒死状态时,你获得2点护甲,摸两张牌,然后获得技能龙火。', yanzhan:'炎斩', - yanzhan_info:'出牌阶段限一次,你可以将一张红色牌当作火杀使用,此杀只能用与之花色相同的闪响应;若此杀造成了伤害,你本回合可以额外使用一张杀', + yanzhan_info:'出牌阶段限一次,你可以将一张红色牌当作火杀使用,此杀只能用与之花色相同的闪响应;若此杀造成了伤害,你本回合可以额外使用一张杀。', feixia:'飞霞', - feixia_info:'出牌阶段限一次,你可以弃置一张红色牌视为对一名随机敌人使用一张不计入出杀次数的杀', + feixia_info:'出牌阶段限一次,你可以弃置一张红色牌视为对一名随机敌人使用一张不计入出杀次数的杀。', lueying:'掠影', - lueying_info:'每当你使用一张杀,你可以随机获得目标的一张牌,然后目标可以指定一名其他角色,你弃置该角色一张牌(每回合限发动一次,没有弃牌目标时无法发动)', + lueying_info:'每当你使用一张杀,你可以随机获得目标的一张牌,然后目标可以指定一名其他角色,你弃置该角色一张牌(每回合限发动一次,没有弃牌目标时无法发动)。', feng:'风', - feng_info:'锁定技,当你累计摸2次牌后,你下一次摸牌时摸牌数+1', + feng_info:'锁定技,当你累计摸2次牌后,你下一次摸牌时摸牌数+1。', ya:'雅', - ya_info:'锁定技,当你累计受到2次伤害后,你下一次受到的伤害-1', + ya_info:'锁定技,当你累计受到2次伤害后,你下一次受到的伤害-1。', song:'颂', - song_info:'锁定技,当你累计造成2次伤害后,你下一次造成的伤害+1', + song_info:'锁定技,当你累计造成2次伤害后,你下一次造成的伤害+1。', longxiang:'龙翔', - longxiang_info:'当你使用杀指定目标后,你可以弃置目标若干张手牌直到其手牌数与你相同', + longxiang_info:'当你使用杀指定目标后,你可以弃置目标若干张手牌直到其手牌数与你相同。', huxi:'虎袭', - huxi_info:'你可以失去1点体力并获得1点护甲,视为使用一张杀', + huxi_info:'你可以失去1点体力并获得1点护甲,视为使用一张杀。', xuanmo:'玄墨', - xuanmo_info:'出牌阶段限一次,你可以将一张手牌置于牌堆顶并随机获得两张与之类别相同的牌', + xuanmo_info:'出牌阶段限一次,你可以将一张手牌置于牌堆顶并随机获得两张与之类别相同的牌。', danqing:'丹青', - danqing_info:'结束阶段,若你累计使用了4张花色不同的牌,你可以选择至多4名角色随机获得一个正面效果', - danqing_info_alter:'结束阶段,若你累计使用了4张花色不同的牌,你可以选择至多2名角色随机获得一个正面效果', + danqing_info:'结束阶段,若你累计使用了4张花色不同的牌,你可以选择至多4名角色随机获得一个正面效果。', + danqing_info_alter:'结束阶段,若你累计使用了4张花色不同的牌,你可以选择至多2名角色随机获得一个正面效果。', zhangmu:'障目', - zhangmu_info:'每回合限一次,当你需要使用或打出一张闪时,你可以展示一张闪,视为使用或打出了此闪', + zhangmu_info:'每回合限一次,当你需要使用或打出一张闪时,你可以展示一张闪,视为使用或打出了此闪。', feizhua:'飞爪', - feizhua_info:'当你使用一张杀时,你可以将与目标相邻的角色追加为额外目标', + feizhua_info:'当你使用一张杀时,你可以将与目标相邻的角色追加为额外目标。', leiyu:'雷狱', - leiyu_info:'结束阶段,你可以弃置一张黑色手牌,视为对本回合内所有成为过你的卡牌目标的角色使用一张惊雷闪', + leiyu_info:'结束阶段,你可以弃置一张黑色手牌,视为对本回合内所有成为过你的卡牌目标的角色使用一张惊雷闪。', lingxue:'灵血', - lingxue_info:'锁定技,每当你回复1点体力,你获得1点护甲', + lingxue_info:'锁定技,每当你回复1点体力,你获得1点护甲。', zhaoyao:'招摇', - zhaoyao_info:'其他角色的摸牌阶段开始时,你可以与其拼点,若你赢,你摸两张牌,然后将两张牌置于牌堆顶', + zhaoyao_info:'其他角色的摸牌阶段开始时,你可以与其拼点,若你赢,你摸两张牌,然后将两张牌置于牌堆顶。', sheling:'摄灵', - sheling_info:'其他角色于你的回合内因使用、打出或弃置而失去牌时,你可以获得之(每回合最多发动三次)', + sheling_info:'其他角色于你的回合内因使用、打出或弃置而失去牌时,你可以获得之(每回合最多发动三次)。', fenxing:'分形', - fenxing_info:'锁定技,准备阶段,你有50%概率变身为另一形态', + fenxing_info:'锁定技,准备阶段,你有50%概率变身为另一形态。', guijiang:'鬼降', guijiang2:'鬼降', - guijiang_info:'出牌阶段限一次,你可以弃置一张黑色牌,令一名其他角色无法成为回复牌的目标直到你下一回合开始', + guijiang_info:'出牌阶段限一次,你可以弃置一张黑色牌,令一名其他角色无法成为回复牌的目标直到你下一回合开始。', diesha:'叠杀', - diesha_info:'锁定技,每当你使用杀造成伤害,受伤害角色失去1点体力,你回复1点体力', + diesha_info:'锁定技,每当你使用杀造成伤害,受伤害角色失去1点体力,你回复1点体力。', lingyu:'灵愈', - lingyu_info:'结束阶段,你可以令一名其他角色回复1点体力', + lingyu_info:'结束阶段,你可以令一名其他角色回复1点体力。', diewu:'蝶舞', - diewu_info:'出牌阶段,你可以将一张【杀】交给一名角色,若你于此阶段内首次如此做,你摸一张牌', + diewu_info:'出牌阶段,你可以将一张【杀】交给一名角色,若你于此阶段内首次如此做,你摸一张牌。', duxinshu:'读心', - duxinshu_info:'出牌阶段限一次,你可以观看一名其他角色的手牌,然后可以用一张手牌替换其中的一张', + duxinshu_info:'出牌阶段限一次,你可以观看一名其他角色的手牌,然后可以用一张手牌替换其中的一张。', feixu:'飞絮', - feixu_info:'每当一名角色使用或打出一张闪,你可以令其摸一张牌', + feixu_info:'每当一名角色使用或打出一张闪,你可以令其摸一张牌。', xuanyan:'玄炎', xuanyan2:'玄炎', - xuanyan_info:'锁定技,你的火属性伤害+1;你造成火属性伤害后失去1点体力', + xuanyan_info:'锁定技,你的火属性伤害+1;你造成火属性伤害后失去1点体力。', ningbin:'凝冰', - ningbin_info:'锁定技,每当你受到1次雷属性伤害,你回复1点体力', + ningbin_info:'锁定技,每当你受到1次雷属性伤害,你回复1点体力。', xfenxin:'焚心', xfenxin2:'焚心', - xfenxin_info:'锁定技,每当你的体力值发生改变,你摸等量的牌;每当你杀死一名角色,你增加1点体力上限并回复1点体力', - xfenxin_info_alter:'锁定技,每当你的体力值发生改变,你摸一张牌', + xfenxin_info:'锁定技,每当你的体力值发生改变,你摸等量的牌;每当你杀死一名角色,你增加1点体力上限并回复1点体力。', + xfenxin_info_alter:'锁定技,每当你的体力值发生改变,你摸一张牌。', luanjian:'乱剑', - luanjian_info:'出牌阶段,你可以将两张杀当杀使用,此杀无视距离,可以指定任意名目标且有50%的机率伤害+1', + luanjian_info:'出牌阶段,你可以将两张杀当杀使用,此杀无视距离,可以指定任意名目标且有50%的机率伤害+1。', ctianfu:'天符', ctianfu2:'天符', ctianfu3:'天符', - ctianfu_info:'出牌阶段,你可以将一张闪置于一名其他角色的武将牌上,该角色在下一次造成伤害时受到来自你的1点雷属性伤害并随机弃置一张牌,然后移去此牌', + ctianfu_info:'出牌阶段,你可以将一张闪置于一名其他角色的武将牌上,该角色在下一次造成伤害时受到来自你的1点雷属性伤害并随机弃置一张牌,然后移去此牌。', shuiyun:'水蕴', shuiyun_bg:'蕴', shuiyun2:'水蕴', shuiyun5:'水蕴', shuiyun3:'水蕴', - shuiyun_info:'结束阶段,你可以将一张与武将牌上的牌类别均不相同的手牌置于武将牌上称为“蕴”;任意一名角色处于濒死状态时,你可以弃置一张“蕴”令其回复1点体力', - shuiyun_info_alter:'结束阶段,你可以将一张与武将牌上的牌类别均不相同的手牌置于武将牌上称为“蕴”(不能超过2张);任意一名角色处于濒死状态时,你可以弃置一张“蕴”令其回复1点体力', + shuiyun_info:'结束阶段,你可以将一张与武将牌上的牌类别均不相同的手牌置于武将牌上称为“蕴”;任意一名角色处于濒死状态时,你可以弃置一张“蕴”令其回复1点体力。', + shuiyun_info_alter:'结束阶段,你可以将一张与武将牌上的牌类别均不相同的手牌置于武将牌上称为“蕴”(不能超过2张);任意一名角色处于濒死状态时,你可以弃置一张“蕴”令其回复1点体力。', wangyou:'忘忧', - wangyou_info:'其他角色的结束阶段,你可以弃置一张牌,令此回合内受过伤害的所有角色各摸一张牌', + wangyou_info:'其他角色的结束阶段,你可以弃置一张牌,令此回合内受过伤害的所有角色各摸一张牌。', changnian:'长念', changnian2:'追思', - changnian2_info:'锁定技,结束阶段,你摸一张牌', - changnian_info:'你死亡时,可以将所有牌交给一名其他角色,令其获得技能【追思】', + changnian2_info:'锁定技,结束阶段,你摸一张牌。', + changnian_info:'你死亡时,可以将所有牌交给一名其他角色,令其获得技能〖追思〗。', sajin:'洒金', - sajin_info:'出牌阶段限一次,你可以弃置一张手牌并指定任意名角色进行判定,若判定颜色与你弃置的牌相同,该角色回复1点体力', + sajin_info:'出牌阶段限一次,你可以弃置一张手牌并指定任意名角色进行判定,若判定颜色与你弃置的牌相同,该角色回复1点体力。', jtjubao:'聚宝', - jtjubao_info:'当其他角色于你的回合外首次弃置非基本牌时,你可以获得其中的随机一张', + jtjubao_info:'当其他角色于你的回合外首次弃置非基本牌时,你可以获得其中的随机一张。', guiyuan:'归元', - guiyuan_info:'出牌阶段限一次,你可以弃置一张杀,然后回复1点体力并摸一张牌', + guiyuan_info:'出牌阶段限一次,你可以弃置一张杀,然后回复1点体力并摸一张牌。', xshuangren:'双刃', - xshuangren_info:'当你的武器牌被替换时,你可以将其置于你的武将牌上,并获得此装备的武器效果(不含距离)', + xshuangren_info:'当你的武器牌被替换时,你可以将其置于你的武将牌上,并获得此装备的武器效果(不含距离)。', duci:'毒刺', - duci_info:'每当你失去一次装备牌,可以对距离1以内的一名其他角色造成1点伤害', + duci_info:'每当你失去一次装备牌,可以对距离1以内的一名其他角色造成1点伤害。', shenmu:'神木', - shenmu_info:'任意一名角色濒死时,你可以展示你的手牌并弃置其中的所有红色牌(至少一张),若如此做,该角色回复1点体力,然后摸X张牌,X为你弃置的手牌数', + shenmu_info:'任意一名角色濒死时,你可以展示你的手牌并弃置其中的所有红色牌(至少一张),若如此做,该角色回复1点体力,然后摸X张牌,X为你弃置的手牌数。', qijian:'气剑', - qijian_info:'弃牌阶段结束时,你可以指定至多X名目标视为使用一张杀,X为你于此阶段弃置的卡牌数', + qijian_info:'弃牌阶段结束时,你可以指定至多X名目标视为使用一张杀,X为你于此阶段弃置的卡牌数。', poyun:'破云', - poyun_info:'每当你造成一次伤害,你可以弃置一枚玄凝标记,然后弃置对方两张牌', - poyun_info_alter:'每当你造成一次伤害,你可以弃置一枚玄凝标记,然后弃置对方一张牌', + poyun_info:'每当你造成一次伤害,你可以弃置一枚玄凝标记,然后弃置对方两张牌。', + poyun_info_alter:'每当你造成一次伤害,你可以弃置一枚玄凝标记,然后弃置对方一张牌。', qianfang:'千方', - qianfang_info:'准备阶段,若你有玄凝标记,你可以弃置3-X张牌和所有玄凝标记,视为使用了一张【万箭齐发】,每当一名敌方角色因此牌受到伤害,你摸一张牌。X为你的玄凝标记数', - qianfang_info_alter:'准备阶段,若你有玄凝标记,可以弃置3-X张牌和所有玄凝标记,视为使用了一张【万箭齐发】,X为你的玄凝标记数', + qianfang_info:'准备阶段,若你有玄凝标记,你可以弃置3-X张牌和所有玄凝标记,视为使用了一张【万箭齐发】,每当一名敌方角色因此牌受到伤害,你摸一张牌。X为你的玄凝标记数。', + qianfang_info_alter:'准备阶段,若你有玄凝标记,可以弃置3-X张牌和所有玄凝标记,视为使用了一张【万箭齐发】,X为你的玄凝标记数。', longxi:'龙息', longxi2:'龙息', - longxi_info:'锁定技,在回合外每当你需要使用或打出一张卡牌时,若牌堆顶的前两张中有可使用或打出的牌,你立即获得之', + longxi_info:'锁定技,在回合外每当你需要使用或打出一张卡牌时,若牌堆顶的前两张中有可使用或打出的牌,你立即获得之。', zhuyue:'逐月', - zhuyue_info:'出牌阶段限一次,你可以弃置一张非基本牌并指定至多两个目标各随机弃置一张牌,若如此做,你本回使用的杀须指定选中角色为目标', - zhuyue_info_alter:'出牌阶段限一次,你可以弃置一张黑色非基本牌并指定至多两个目标各随机弃置一张牌,若如此做,你本回使用的杀须指定选中角色为目标', + zhuyue_info:'出牌阶段限一次,你可以弃置一张非基本牌并指定至多两个目标各随机弃置一张牌,若如此做,你本回使用的杀须指定选中角色为目标。', + zhuyue_info_alter:'出牌阶段限一次,你可以弃置一张黑色非基本牌并指定至多两个目标各随机弃置一张牌,若如此做,你本回使用的杀须指定选中角色为目标。', guanri:'贯日', - guanri_info:'限制技,你可以弃置两张红色手牌并失去1点体力,然后对一名体力值不少于你的其他角色造成2点火焰伤害并弃置其所有装备牌', + guanri_info:'限制技,你可以弃置两张红色手牌并失去1点体力,然后对一名体力值不少于你的其他角色造成2点火焰伤害并弃置其所有装备牌。', tianxian:'天弦', - tianxian_info:'锁定技,你的杀无视距离且可指定任意多个目标,目标须进行一次判定,若结果为黑色则取消之', + tianxian_info:'锁定技,你的杀无视距离且可指定任意多个目标,目标须进行一次判定,若结果为黑色则取消之。', zhimeng:'织梦', zhimeng2:'织梦', zhimeng3:'织梦', - zhimeng_info:'结束阶段,你可以选择一名其他角色将牌堆顶的一张牌置于该角色的武将牌上,直到你的下个准备阶段将其收入手牌。当一名角色武将牌上有织梦牌时,每当其成为与此牌类型相同的卡牌的目标,可以摸一张牌', - zhimeng_info_alter:'结束阶段,你可以令一名其他角色摸一张牌', + zhimeng_info:'结束阶段,你可以选择一名其他角色将牌堆顶的一张牌置于该角色的武将牌上,直到你的下个准备阶段将其收入手牌。当一名角色武将牌上有织梦牌时,每当其成为与此牌类型相同的卡牌的目标,可以摸一张牌。', + zhimeng_info_alter:'结束阶段,你可以令一名其他角色摸一张牌。', runxin:'润心', - runxin_info:'每当你使用或打出一张红桃牌,你可以令一名角色回复1点体力', + runxin_info:'每当你使用或打出一张红桃牌,你可以令一名角色回复1点体力。', tannang:'探囊', - tannang_info:'出牌阶段限一次,你可以将一张梅花手牌当顺手牵羊使用;你的顺手牵羊无距离限制', + tannang_info:'出牌阶段限一次,你可以将一张梅花手牌当顺手牵羊使用;你的顺手牵羊无距离限制。', tuoqiao:'烟瘴', - tuoqiao_info:'你可以将一张黑色牌当作石灰粉使用', + tuoqiao_info:'你可以将一张黑色牌当作石灰粉使用。', xiaoyao:'逍遥', - xiaoyao_info:'每当你成为其他角色的卡牌目标,你可以弃置一张与之花色相同的手牌取消之', + xiaoyao_info:'每当你成为其他角色的卡牌目标,你可以弃置一张与之花色相同的手牌取消之。', tianjian:'天剑', - tianjian_info:'出牌阶段限一次,你可以将一张杀当作万箭齐发使用,受到伤害的角色随机弃置一张牌', - tianjian_info_alter:'出牌阶段限一次,你可以将一张杀当作万箭齐发使用', + tianjian_info:'出牌阶段限一次,你可以将一张杀当作万箭齐发使用,受到伤害的角色随机弃置一张牌。', + tianjian_info_alter:'出牌阶段限一次,你可以将一张杀当作万箭齐发使用。', xjyufeng:'御风', - xjyufeng_info:'锁定技,当你失去手牌后,若手牌数少于2,你将手牌数补至2(每回合最多发动两次)', + xjyufeng_info:'锁定技,当你失去手牌后,若手牌数少于2,你将手牌数补至2(每回合最多发动两次)。', huimeng:'回梦', - huimeng_info:'每当你回复1点体力,可以摸两张牌', + huimeng_info:'每当你回复1点体力,可以摸两张牌。', tianshe:'天蛇', tianshe2:'天蛇', - tianshe_info:'锁定技,你防止即将受到的属性伤害,每当你造成一次属性伤害,你回复1点体力', + tianshe_info:'锁定技,你防止即将受到的属性伤害,每当你造成一次属性伤害,你回复1点体力。', }, }; }); diff --git a/character/xinghuoliaoyuan.js b/character/xinghuoliaoyuan.js index 2f881f09f..520c40e6d 100755 --- a/character/xinghuoliaoyuan.js +++ b/character/xinghuoliaoyuan.js @@ -881,6 +881,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinfu_guanwei:{ audio:2, usable:1, + init:()=>{ + game.addGlobalSkill('xinfu_guanwei_ai'); + }, + onremove:()=>{ + if(!game.hasPlayer(i=>i.hasSkill('xinfu_guanwei'),true)) game.removeGlobalSkill('xinfu_guanwei_ai'); + }, trigger:{ global:"phaseUseEnd", }, @@ -898,7 +904,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return num>1; }, direct:true, - global:'xinfu_guanwei_ai', content:function (){ 'step 0' var target=trigger.player; @@ -925,6 +930,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, subSkill:{ ai:{ + trigger:{player:'dieAfter'}, + filter:()=>{ + return !game.hasPlayer(i=>i.hasSkill('xinfu_guanwei'),true); + }, + silent:true, + forceDie:true, + content:()=>{ + game.removeGlobalSkill('xinfu_guanwei_ai'); + }, ai:{ effect:{ player_use:function(card,player,target){ @@ -1357,19 +1371,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(target==player) return false; return target.countCards('h')>player.countCards('h')||Math.max(0,target.hp)>Math.max(0,player.hp); }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); + let att=get.attitude(_status.event.player,target),name=_status.event.cards[0].name; if(att<3) return 0; - if(target.hasJudge('lebu')){ - att/=5; - } - if(target.hasSha()&&_status.event.sha){ - att/=5; - } - if(_status.event.wuxie&&target.needsToDiscard(1)){ - att/=5; - } + if(target.hasJudge('lebu')) att/=5; + if(name==='sha'&&target.hasSha()) att/=5; + if(name==='wuxie'&&target.needsToDiscard(_status.event.cards)) att/=5; return att/(1+get.distance(player,target,'absolute')); - }).set('sha',trigger.cards[0].name=='sha').set('wuxie',trigger.cards[0].name=='wuxie'); + }).set('cards',trigger.cards); 'step 1' if(result.bool){ var list=[]; diff --git a/character/yijiang.js b/character/yijiang.js index e890f60a6..36746b68c 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -44,7 +44,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhuran:['male','wu',4,['danshou']], xusheng:['male','wu',4,['xinpojun']], wuguotai:['female','wu',3,['ganlu','buyi']], - lingtong:['male','wu',4,['olxuanfeng']], + lingtong:['male','wu',4,['xuanfeng']], liubiao:['male','qun',3,['rezishou','zongshi']], yufan:['male','wu',3,['zhiyan','zongxuan']], chengong:['male','qun',3,['mingce','zhichi']], @@ -995,7 +995,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var user=trigger.player,target=previous; event.user=user;event.target=target; if(user){ - user.chooseBool('是否对'+get.translation(target)+'发动【联对】?','令'+get.translation(target)+'摸两张牌').set('ai',()=>_status.event.bool).set('bool',get.effect(target,{name:'wuzhong'},user,user)>0); + user.chooseBool('是否对'+get.translation(target)+'发动【联对】?','令'+get.translation(target)+'摸两张牌').set('ai',()=>_status.event.bool).set('bool',get.effect(target,{name:'draw'},user,user)>0); } 'step 1' if(result.bool){ @@ -2101,7 +2101,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(num>2) return true; var card=trigger.card; if(get.tag(card,'damage')&&player.hp<=trigger.getParent().baseDamage&&(!get.tag(card,'respondShan')||!player.hasShan())&&(!get.tag(card,'respondSha')||!player.hasSha())) return true; - var source=_status.currentPhase,todis=(source.countCards('h')-Math.max(0,source.needsToDiscard())); + var source=_status.currentPhase,todis=source.countCards('h')-source.needsToDiscard(); if(todis<=Math.max(Math.min(2+(source.hp<=1?1:0),player.countCards('he',function(card){ return get.value(card,player)0&&!storage.contains('摸牌')&&target!=player) return get.effect(target,{name:'wuzhong'},player,player)/2; + if(get.attitude(player,target)>0&&!storage.contains('摸牌')&&target!=player) return get.effect(target,{name:'draw'},player,player); if(get.attitude(player,target)<0&&!storage.contains('弃牌')&&target!=player&&target.countCards('h')) return get.effect(target,{name:'guohe_copy2'},player,player); if(get.attitude(player,target)>0&&!storage.contains('制衡')) return get.effect(target,{name:'kaihua'},player,player); return 0; @@ -2424,7 +2424,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var target=_status.event.target; var controls=_status.event.controls.slice(); var map={ - '摸牌':get.effect(target,{name:'wuzhong'},player,player)/2, + '摸牌':get.effect(target,{name:'draw'},player,player), '弃牌':get.effect(target,{name:'guohe_copy2'},player,player), '制衡':get.effect(target,{name:'kaihua'},player,player), }; @@ -2681,10 +2681,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return !player.hasSkill('xintaoluan3')&&player.countCards('hes',card=>lib.inpile.some(name=>{ if(player.getStorage('xintaoluan').includes(name)) return false; if(get.type(name)!='basic'&&get.type(name)!='trick') return false; - if(event.filterCard({name:name,isCard:true,cards:[card]})) return true; + if(event.filterCard({name:name,isCard:true,cards:[card]},player,event)) return true; if(name=='sha'){ for(var nature of lib.inpile_nature){ - if(event.filterCard({name:name,nature:nature,isCard:true,cards:[card]})) return true; + if(event.filterCard({name:name,nature:nature,isCard:true,cards:[card]},player,event)) return true; } } return false; @@ -5114,7 +5114,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, jyzongshi:{ audio:2, - audioname:['re_jianyong','ol_jianyong'], + audioname:['re_jianyong'], trigger:{player:['chooseToCompareAfter','compareMultipleAfter'],target:['chooseToCompareAfter','compareMultipleAfter']}, filter:function(event,player){ if(event.preserve) return false; @@ -5263,10 +5263,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return !player.hasSkill('taoluan3')&&player.countCards('hes',card=>lib.inpile.some(name=>{ if(player.getStorage('taoluan').includes(name)) return false; if(get.type(name)!='basic'&&get.type(name)!='trick') return false; - if(event.filterCard({name:name,isCard:true,cards:[card]})) return true; + if(event.filterCard({name:name,isCard:true,cards:[card]},player,event)) return true; if(name=='sha'){ for(var nature of lib.inpile_nature){ - if(event.filterCard({name:name,nature:nature,isCard:true,cards:[card]})) return true; + if(event.filterCard({name:name,nature:nature,isCard:true,cards:[card]},player,event)) return true; } } return false; @@ -6980,8 +6980,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ effect:{ player:function(card,player,target){ if(_status.currentPhase!=player) return; - if(card.name=='sha'&&!player.needsToDiscard()&& - !player.getExpansions('chunlao').length&&target.hp>1){ + if(card.name=='sha'&&!player.needsToDiscard()&&!player.getExpansions('chunlao').length&&target.hp>1){ return 'zeroplayertarget'; } } @@ -7558,7 +7557,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('longyin_order'); }, onremove:(player)=>{ - game.removeGlobalSkill('longyin_order'); + if(!game.hasPlayer(current=>current.hasSkill('longyin'),true)) game.removeGlobalSkill('longyin_order'); }, trigger:{global:'useCard'}, direct:true, @@ -7647,7 +7646,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, trigger:{player:'dieAfter'}, filter:(event,player)=>{ - return !game.hasPlayer(current=>current.hasSkill('longyin')); + return !game.hasPlayer(current=>current.hasSkill('longyin'),true); }, silent:true, forceDie:true, @@ -11807,6 +11806,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ miji:{ audio:2, audioname:['re_wangyi'], + locked:false, mod:{ aiOrder:function(player,card,num){ if(num>0&&_status.event&&_status.event.type==='phase'&&get.tag(card,'recover')){ @@ -11906,16 +11906,28 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{target:'useCardToTargeted'}, content:function(){ "step 0" + if(get.attitude(player,trigger.player)<0&&trigger.player.countDiscardableCards(player,'he')) player.addTempSkill('zhenlie_lose'); player.loseHp(); "step 1" + player.removeSkill('zhenlie_lose'); trigger.getParent().excluded.add(player); "step 2" if(trigger.player.countCards('he')){ + if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.12); player.discardPlayerCard(trigger.player,'he',true); } }, + subSkill:{ + lose:{ + charlotte:true + } + }, ai:{ - expose:0.3 + effect:{ + target:(card,player,target)=>{ + if(target.hp<=0&&target.hasSkill('zhenlie_lose')&&get.tag(card,'recover')) return [1,1.2]; + } + } } }, //吾彦... @@ -13915,7 +13927,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ gaoshun:['gaoshun','xin_gaoshun','re_gaoshun','old_gaoshun'], zhonghui:['zhonghui','xin_zhonghui','re_zhonghui','old_zhonghui','pe_zhonghui'], wangyi:['wangyi','re_wangyi','old_wangyi'], - caozhang:['caozhang','re_caozhang','xin_caozhang'], + caozhang:['caozhang','ol_caozhang','re_caozhang','xin_caozhang'], guanzhang:['guanzhang','re_guanzhang','old_guanzhang'], madai:['old_madai','re_madai','tw_madai','madai'], liaohua:['liaohua','re_liaohua','xin_liaohua'], diff --git a/character/yingbian.js b/character/yingbian.js index 0d9bfa30c..7c5d6795d 100644 --- a/character/yingbian.js +++ b/character/yingbian.js @@ -2401,6 +2401,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, ciwei:{ + init:()=>{ + game.addGlobalSkill('ciwei_ai'); + }, + onremove:()=>{ + if(!game.hasPlayer(i=>i.hasSkill('ciwei'),true)) game.removeGlobalSkill('ciwei_ai'); + }, trigger:{global:'useCard'}, direct:true, preHidden:true, @@ -2426,8 +2432,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.targets.length=0; trigger.all_excluded=true; } - }, - global:'ciwei_ai', + } }, ciwei_ai:{ mod:{ @@ -2448,6 +2453,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return num; }, }, + trigger:{player:'dieAfter'}, + filter:()=>{ + return !game.hasPlayer(i=>i.hasSkill('ciwei'),true); + }, + silent:true, + forceDie:true, + content:()=>{ + game.removeGlobalSkill('ciwei_ai'); + } }, caiyuan:{ trigger:{player:'phaseEnd'}, diff --git a/game/asset.js b/game/asset.js index b5ccda02d..028643283 100644 --- a/game/asset.js +++ b/game/asset.js @@ -8701,7 +8701,7 @@ window.noname_asset_list=[ 'image/mode/boss/card/shanrangzhaoshu.png', 'image/mode/boss/card/xingtianpojunfu.png', 'image/mode/boss/card/niaobaidaowenha.png', - + 'image/mode/boss/character/boss_baihu.jpg', 'image/mode/boss/character/boss_baimangshilian.jpg', 'image/mode/boss/character/boss_baiwuchang.jpg', diff --git a/game/core-js-bundle.js b/game/core-js-bundle.js index aa0e34730..429f57284 100644 --- a/game/core-js-bundle.js +++ b/game/core-js-bundle.js @@ -1,7 +1,7 @@ /** - * core-js 3.33.2 + * core-js 3.34.0 * © 2014-2023 Denis Pushkarev (zloirock.ru) - * license: https://github.com/zloirock/core-js/blob/v3.33.2/LICENSE + * license: https://github.com/zloirock/core-js/blob/v3.34.0/LICENSE * source: https://github.com/zloirock/core-js */ !function (undefined) { 'use strict'; /******/ (function(modules) { // webpackBootstrap @@ -173,53 +173,52 @@ __webpack_require__(242); __webpack_require__(243); __webpack_require__(251); __webpack_require__(253); -__webpack_require__(254); __webpack_require__(255); __webpack_require__(256); __webpack_require__(257); +__webpack_require__(258); __webpack_require__(259); -__webpack_require__(260); __webpack_require__(261); __webpack_require__(262); __webpack_require__(263); +__webpack_require__(264); __webpack_require__(265); -__webpack_require__(266); __webpack_require__(267); __webpack_require__(268); __webpack_require__(269); __webpack_require__(270); __webpack_require__(271); __webpack_require__(272); -__webpack_require__(276); -__webpack_require__(277); +__webpack_require__(273); +__webpack_require__(274); +__webpack_require__(278); __webpack_require__(279); __webpack_require__(281); -__webpack_require__(282); __webpack_require__(283); __webpack_require__(284); __webpack_require__(285); +__webpack_require__(286); __webpack_require__(287); __webpack_require__(289); -__webpack_require__(290); __webpack_require__(291); __webpack_require__(292); +__webpack_require__(293); __webpack_require__(294); -__webpack_require__(295); +__webpack_require__(296); __webpack_require__(297); -__webpack_require__(298); __webpack_require__(299); __webpack_require__(300); +__webpack_require__(301); __webpack_require__(302); -__webpack_require__(303); __webpack_require__(304); __webpack_require__(305); __webpack_require__(306); __webpack_require__(307); __webpack_require__(308); __webpack_require__(309); +__webpack_require__(310); __webpack_require__(311); __webpack_require__(312); -__webpack_require__(313); __webpack_require__(314); __webpack_require__(315); __webpack_require__(316); @@ -228,63 +227,63 @@ __webpack_require__(318); __webpack_require__(319); __webpack_require__(320); __webpack_require__(321); +__webpack_require__(322); __webpack_require__(323); __webpack_require__(324); -__webpack_require__(325); __webpack_require__(326); -__webpack_require__(349); -__webpack_require__(350); -__webpack_require__(351); +__webpack_require__(327); +__webpack_require__(328); +__webpack_require__(329); __webpack_require__(352); __webpack_require__(353); __webpack_require__(354); __webpack_require__(355); __webpack_require__(356); +__webpack_require__(357); __webpack_require__(358); __webpack_require__(359); __webpack_require__(360); -__webpack_require__(361); __webpack_require__(362); __webpack_require__(363); __webpack_require__(364); __webpack_require__(365); __webpack_require__(366); __webpack_require__(367); -__webpack_require__(374); -__webpack_require__(375); -__webpack_require__(377); +__webpack_require__(368); +__webpack_require__(369); +__webpack_require__(370); +__webpack_require__(371); __webpack_require__(378); __webpack_require__(379); -__webpack_require__(380); __webpack_require__(381); +__webpack_require__(382); __webpack_require__(383); __webpack_require__(384); -__webpack_require__(386); -__webpack_require__(389); +__webpack_require__(385); +__webpack_require__(387); +__webpack_require__(388); __webpack_require__(390); -__webpack_require__(391); -__webpack_require__(392); __webpack_require__(393); +__webpack_require__(394); +__webpack_require__(395); +__webpack_require__(396); __webpack_require__(397); -__webpack_require__(398); -__webpack_require__(400); __webpack_require__(401); __webpack_require__(402); -__webpack_require__(403); +__webpack_require__(404); __webpack_require__(405); __webpack_require__(406); __webpack_require__(407); -__webpack_require__(408); __webpack_require__(409); __webpack_require__(410); __webpack_require__(411); +__webpack_require__(412); __webpack_require__(413); -__webpack_require__(416); -__webpack_require__(419); -__webpack_require__(422); +__webpack_require__(414); +__webpack_require__(415); +__webpack_require__(417); +__webpack_require__(420); __webpack_require__(423); -__webpack_require__(424); -__webpack_require__(425); __webpack_require__(426); __webpack_require__(427); __webpack_require__(428); @@ -294,10 +293,10 @@ __webpack_require__(431); __webpack_require__(432); __webpack_require__(433); __webpack_require__(434); -__webpack_require__(443); -__webpack_require__(444); -__webpack_require__(445); -__webpack_require__(446); +__webpack_require__(435); +__webpack_require__(436); +__webpack_require__(437); +__webpack_require__(438); __webpack_require__(447); __webpack_require__(448); __webpack_require__(449); @@ -307,10 +306,10 @@ __webpack_require__(452); __webpack_require__(453); __webpack_require__(454); __webpack_require__(455); +__webpack_require__(456); +__webpack_require__(457); __webpack_require__(458); __webpack_require__(459); -__webpack_require__(460); -__webpack_require__(461); __webpack_require__(462); __webpack_require__(463); __webpack_require__(464); @@ -335,63 +334,64 @@ __webpack_require__(482); __webpack_require__(483); __webpack_require__(484); __webpack_require__(485); +__webpack_require__(486); +__webpack_require__(487); __webpack_require__(488); -__webpack_require__(490); -__webpack_require__(491); -__webpack_require__(499); -__webpack_require__(500); -__webpack_require__(501); +__webpack_require__(489); +__webpack_require__(492); +__webpack_require__(494); +__webpack_require__(495); __webpack_require__(503); __webpack_require__(504); +__webpack_require__(505); __webpack_require__(507); __webpack_require__(508); -__webpack_require__(509); __webpack_require__(510); __webpack_require__(511); -__webpack_require__(515); +__webpack_require__(512); +__webpack_require__(513); +__webpack_require__(514); __webpack_require__(518); -__webpack_require__(523); -__webpack_require__(524); +__webpack_require__(521); __webpack_require__(526); __webpack_require__(527); -__webpack_require__(531); -__webpack_require__(532); +__webpack_require__(529); +__webpack_require__(530); __webpack_require__(534); __webpack_require__(535); -__webpack_require__(536); __webpack_require__(537); +__webpack_require__(538); __webpack_require__(539); __webpack_require__(540); __webpack_require__(542); __webpack_require__(543); -__webpack_require__(544); __webpack_require__(545); __webpack_require__(546); __webpack_require__(547); __webpack_require__(548); +__webpack_require__(549); __webpack_require__(550); -__webpack_require__(552); +__webpack_require__(551); __webpack_require__(553); -__webpack_require__(554); __webpack_require__(555); +__webpack_require__(556); __webpack_require__(557); __webpack_require__(558); -__webpack_require__(559); +__webpack_require__(560); __webpack_require__(561); __webpack_require__(562); -__webpack_require__(563); __webpack_require__(564); __webpack_require__(565); __webpack_require__(566); -__webpack_require__(570); -__webpack_require__(571); -__webpack_require__(572); +__webpack_require__(567); +__webpack_require__(568); +__webpack_require__(569); __webpack_require__(573); __webpack_require__(574); __webpack_require__(575); +__webpack_require__(576); __webpack_require__(577); __webpack_require__(578); -__webpack_require__(579); __webpack_require__(580); __webpack_require__(581); __webpack_require__(582); @@ -400,34 +400,34 @@ __webpack_require__(584); __webpack_require__(585); __webpack_require__(586); __webpack_require__(587); +__webpack_require__(588); +__webpack_require__(589); __webpack_require__(590); -__webpack_require__(592); __webpack_require__(593); __webpack_require__(595); __webpack_require__(596); -__webpack_require__(597); __webpack_require__(598); __webpack_require__(599); __webpack_require__(600); +__webpack_require__(601); __webpack_require__(602); __webpack_require__(603); __webpack_require__(605); -__webpack_require__(606); __webpack_require__(607); __webpack_require__(608); __webpack_require__(609); __webpack_require__(610); +__webpack_require__(611); __webpack_require__(612); -__webpack_require__(613); __webpack_require__(614); __webpack_require__(615); +__webpack_require__(616); __webpack_require__(617); -__webpack_require__(618); __webpack_require__(619); __webpack_require__(620); __webpack_require__(621); +__webpack_require__(622); __webpack_require__(623); -__webpack_require__(624); __webpack_require__(625); __webpack_require__(626); __webpack_require__(627); @@ -439,11 +439,11 @@ __webpack_require__(632); __webpack_require__(633); __webpack_require__(634); __webpack_require__(635); +__webpack_require__(636); __webpack_require__(637); -__webpack_require__(638); __webpack_require__(639); __webpack_require__(640); -__webpack_require__(644); +__webpack_require__(641); __webpack_require__(645); __webpack_require__(646); __webpack_require__(648); @@ -484,12 +484,11 @@ __webpack_require__(698); __webpack_require__(699); __webpack_require__(701); __webpack_require__(702); -__webpack_require__(704); __webpack_require__(705); __webpack_require__(706); -__webpack_require__(708); +__webpack_require__(707); __webpack_require__(709); -__webpack_require__(711); +__webpack_require__(710); __webpack_require__(712); __webpack_require__(713); __webpack_require__(714); @@ -503,33 +502,38 @@ __webpack_require__(721); __webpack_require__(722); __webpack_require__(723); __webpack_require__(724); -__webpack_require__(727); -__webpack_require__(728); -__webpack_require__(729); +__webpack_require__(725); __webpack_require__(730); __webpack_require__(731); +__webpack_require__(733); __webpack_require__(734); -__webpack_require__(735); __webpack_require__(736); __webpack_require__(737); +__webpack_require__(738); __webpack_require__(739); __webpack_require__(740); __webpack_require__(743); __webpack_require__(744); +__webpack_require__(745); __webpack_require__(746); __webpack_require__(747); __webpack_require__(748); -__webpack_require__(753); +__webpack_require__(751); +__webpack_require__(752); __webpack_require__(754); __webpack_require__(755); __webpack_require__(756); -__webpack_require__(759); +__webpack_require__(761); +__webpack_require__(762); +__webpack_require__(763); __webpack_require__(764); -__webpack_require__(765); -__webpack_require__(766); __webpack_require__(767); -__webpack_require__(768); -module.exports = __webpack_require__(769); +__webpack_require__(772); +__webpack_require__(773); +__webpack_require__(774); +__webpack_require__(775); +__webpack_require__(776); +module.exports = __webpack_require__(777); /***/ }), @@ -896,8 +900,9 @@ module.exports = // eslint-disable-next-line no-restricted-globals -- safe check(typeof self == 'object' && self) || check(typeof global == 'object' && global) || + check(typeof this == 'object' && this) || // eslint-disable-next-line no-new-func -- fallback - (function () { return this; })() || this || Function('return this')(); + (function () { return this; })() || Function('return this')(); /***/ }), @@ -1484,10 +1489,10 @@ var store = __webpack_require__(37); (module.exports = function (key, value) { return store[key] || (store[key] = value !== undefined ? value : {}); })('versions', []).push({ - version: '3.33.2', + version: '3.34.0', mode: IS_PURE ? 'pure' : 'global', copyright: '© 2014-2023 Denis Pushkarev (zloirock.ru)', - license: 'https://github.com/zloirock/core-js/blob/v3.33.2/LICENSE', + license: 'https://github.com/zloirock/core-js/blob/v3.34.0/LICENSE', source: 'https://github.com/zloirock/core-js' }); @@ -2693,8 +2698,8 @@ var createMethod = function (TYPE) { return function ($this, callbackfn, that, specificCreate) { var O = toObject($this); var self = IndexedObject(O); - var boundFunction = bind(callbackfn, that); var length = lengthOfArrayLike(self); + var boundFunction = bind(callbackfn, that); var index = 0; var create = specificCreate || arraySpeciesCreate; var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined; @@ -4540,8 +4545,8 @@ var createMethod = function (TYPE) { return function ($this, callbackfn, that) { var O = toObject($this); var self = IndexedObject(O); - var boundFunction = bind(callbackfn, that); var index = lengthOfArrayLike(self); + var boundFunction = bind(callbackfn, that); var value, result; while (index-- > 0) { value = self[index]; @@ -5464,10 +5469,10 @@ var $TypeError = TypeError; // `Array.prototype.{ reduce, reduceRight }` methods implementation var createMethod = function (IS_RIGHT) { return function (that, callbackfn, argumentsLength, memo) { - aCallable(callbackfn); var O = toObject(that); var self = IndexedObject(O); var length = lengthOfArrayLike(O); + aCallable(callbackfn); var index = IS_RIGHT ? length - 1 : 0; var i = IS_RIGHT ? -1 : 1; if (argumentsLength < 2) while (true) { @@ -6035,9 +6040,9 @@ addToUnscopables('toSorted'); var lengthOfArrayLike = __webpack_require__(64); -module.exports = function (Constructor, list) { +module.exports = function (Constructor, list, $length) { var index = 0; - var length = lengthOfArrayLike(list); + var length = arguments.length > 2 ? $length : lengthOfArrayLike(list); var result = new Constructor(length); while (length > index) result[index] = list[index++]; return result; @@ -8137,7 +8142,67 @@ module.exports = { "use strict"; var $ = __webpack_require__(3); -var log1p = __webpack_require__(252); +var uncurryThis = __webpack_require__(14); +var aCallable = __webpack_require__(31); +var requireObjectCoercible = __webpack_require__(16); +var iterate = __webpack_require__(132); +var MapHelpers = __webpack_require__(252); +var IS_PURE = __webpack_require__(36); + +var Map = MapHelpers.Map; +var has = MapHelpers.has; +var get = MapHelpers.get; +var set = MapHelpers.set; +var push = uncurryThis([].push); + +// `Map.groupBy` method +// https://github.com/tc39/proposal-array-grouping +$({ target: 'Map', stat: true, forced: IS_PURE }, { + groupBy: function groupBy(items, callbackfn) { + requireObjectCoercible(items); + aCallable(callbackfn); + var map = new Map(); + var k = 0; + iterate(items, function (value) { + var key = callbackfn(value, k++); + if (!has(map, key)) set(map, key, [value]); + else push(get(map, key), value); + }); + return map; + } +}); + + +/***/ }), +/* 252 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var uncurryThis = __webpack_require__(14); + +// eslint-disable-next-line es/no-map -- safe +var MapPrototype = Map.prototype; + +module.exports = { + // eslint-disable-next-line es/no-map -- safe + Map: Map, + set: uncurryThis(MapPrototype.set), + get: uncurryThis(MapPrototype.get), + has: uncurryThis(MapPrototype.has), + remove: uncurryThis(MapPrototype['delete']), + proto: MapPrototype +}; + + +/***/ }), +/* 253 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(3); +var log1p = __webpack_require__(254); // eslint-disable-next-line es/no-math-acosh -- required for testing var $acosh = Math.acosh; @@ -8164,7 +8229,7 @@ $({ target: 'Math', stat: true, forced: FORCED }, { /***/ }), -/* 252 */ +/* 254 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8181,7 +8246,7 @@ module.exports = Math.log1p || function log1p(x) { /***/ }), -/* 253 */ +/* 255 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8209,7 +8274,7 @@ $({ target: 'Math', stat: true, forced: FORCED }, { /***/ }), -/* 254 */ +/* 256 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8234,7 +8299,7 @@ $({ target: 'Math', stat: true, forced: FORCED }, { /***/ }), -/* 255 */ +/* 257 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8256,7 +8321,7 @@ $({ target: 'Math', stat: true }, { /***/ }), -/* 256 */ +/* 258 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8278,13 +8343,13 @@ $({ target: 'Math', stat: true }, { /***/ }), -/* 257 */ +/* 259 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var expm1 = __webpack_require__(258); +var expm1 = __webpack_require__(260); // eslint-disable-next-line es/no-math-cosh -- required for testing var $cosh = Math.cosh; @@ -8304,7 +8369,7 @@ $({ target: 'Math', stat: true, forced: FORCED }, { /***/ }), -/* 258 */ +/* 260 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8328,13 +8393,13 @@ module.exports = (!$expm1 /***/ }), -/* 259 */ +/* 261 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var expm1 = __webpack_require__(258); +var expm1 = __webpack_require__(260); // `Math.expm1` method // https://tc39.es/ecma262/#sec-math.expm1 @@ -8343,7 +8408,7 @@ $({ target: 'Math', stat: true, forced: expm1 !== Math.expm1 }, { expm1: expm1 } /***/ }), -/* 260 */ +/* 262 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8357,7 +8422,7 @@ $({ target: 'Math', stat: true }, { fround: fround }); /***/ }), -/* 261 */ +/* 263 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8400,7 +8465,7 @@ $({ target: 'Math', stat: true, arity: 2, forced: FORCED }, { /***/ }), -/* 262 */ +/* 264 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8431,13 +8496,13 @@ $({ target: 'Math', stat: true, forced: FORCED }, { /***/ }), -/* 263 */ +/* 265 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var log10 = __webpack_require__(264); +var log10 = __webpack_require__(266); // `Math.log10` method // https://tc39.es/ecma262/#sec-math.log10 @@ -8447,7 +8512,7 @@ $({ target: 'Math', stat: true }, { /***/ }), -/* 264 */ +/* 266 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8462,13 +8527,13 @@ module.exports = Math.log10 || function log10(x) { /***/ }), -/* 265 */ +/* 267 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var log1p = __webpack_require__(252); +var log1p = __webpack_require__(254); // `Math.log1p` method // https://tc39.es/ecma262/#sec-math.log1p @@ -8476,7 +8541,7 @@ $({ target: 'Math', stat: true }, { log1p: log1p }); /***/ }), -/* 266 */ +/* 268 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8496,7 +8561,7 @@ $({ target: 'Math', stat: true }, { /***/ }), -/* 267 */ +/* 269 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8512,14 +8577,14 @@ $({ target: 'Math', stat: true }, { /***/ }), -/* 268 */ +/* 270 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var fails = __webpack_require__(7); -var expm1 = __webpack_require__(258); +var expm1 = __webpack_require__(260); var abs = Math.abs; var exp = Math.exp; @@ -8542,13 +8607,13 @@ $({ target: 'Math', stat: true, forced: FORCED }, { /***/ }), -/* 269 */ +/* 271 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var expm1 = __webpack_require__(258); +var expm1 = __webpack_require__(260); var exp = Math.exp; @@ -8565,7 +8630,7 @@ $({ target: 'Math', stat: true }, { /***/ }), -/* 270 */ +/* 272 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8578,7 +8643,7 @@ setToStringTag(Math, 'Math', true); /***/ }), -/* 271 */ +/* 273 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8594,7 +8659,7 @@ $({ target: 'Math', stat: true }, { /***/ }), -/* 272 */ +/* 274 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8615,8 +8680,8 @@ var fails = __webpack_require__(7); var getOwnPropertyNames = __webpack_require__(58).f; var getOwnPropertyDescriptor = __webpack_require__(5).f; var defineProperty = __webpack_require__(45).f; -var thisNumberValue = __webpack_require__(273); -var trim = __webpack_require__(274).trim; +var thisNumberValue = __webpack_require__(275); +var trim = __webpack_require__(276).trim; var NUMBER = 'Number'; var NativeNumber = global[NUMBER]; @@ -8716,7 +8781,7 @@ if (FORCED || IS_PURE) copyConstructorProperties(path[NUMBER], NativeNumber); /***/ }), -/* 273 */ +/* 275 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8729,7 +8794,7 @@ module.exports = uncurryThis(1.0.valueOf); /***/ }), -/* 274 */ +/* 276 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8737,7 +8802,7 @@ module.exports = uncurryThis(1.0.valueOf); var uncurryThis = __webpack_require__(14); var requireObjectCoercible = __webpack_require__(16); var toString = __webpack_require__(69); -var whitespaces = __webpack_require__(275); +var whitespaces = __webpack_require__(277); var replace = uncurryThis(''.replace); var ltrim = RegExp('^[' + whitespaces + ']+'); @@ -8767,7 +8832,7 @@ module.exports = { /***/ }), -/* 275 */ +/* 277 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8778,7 +8843,7 @@ module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u /***/ }), -/* 276 */ +/* 278 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8793,13 +8858,13 @@ $({ target: 'Number', stat: true, nonConfigurable: true, nonWritable: true }, { /***/ }), -/* 277 */ +/* 279 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var numberIsFinite = __webpack_require__(278); +var numberIsFinite = __webpack_require__(280); // `Number.isFinite` method // https://tc39.es/ecma262/#sec-number.isfinite @@ -8807,7 +8872,7 @@ $({ target: 'Number', stat: true }, { isFinite: numberIsFinite }); /***/ }), -/* 278 */ +/* 280 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8825,13 +8890,13 @@ module.exports = Number.isFinite || function isFinite(it) { /***/ }), -/* 279 */ +/* 281 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var isIntegralNumber = __webpack_require__(280); +var isIntegralNumber = __webpack_require__(282); // `Number.isInteger` method // https://tc39.es/ecma262/#sec-number.isinteger @@ -8841,7 +8906,7 @@ $({ target: 'Number', stat: true }, { /***/ }), -/* 280 */ +/* 282 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8859,7 +8924,7 @@ module.exports = Number.isInteger || function isInteger(it) { /***/ }), -/* 281 */ +/* 283 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8877,13 +8942,13 @@ $({ target: 'Number', stat: true }, { /***/ }), -/* 282 */ +/* 284 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var isIntegralNumber = __webpack_require__(280); +var isIntegralNumber = __webpack_require__(282); var abs = Math.abs; @@ -8897,7 +8962,7 @@ $({ target: 'Number', stat: true }, { /***/ }), -/* 283 */ +/* 285 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8912,7 +8977,7 @@ $({ target: 'Number', stat: true, nonConfigurable: true, nonWritable: true }, { /***/ }), -/* 284 */ +/* 286 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8927,13 +8992,13 @@ $({ target: 'Number', stat: true, nonConfigurable: true, nonWritable: true }, { /***/ }), -/* 285 */ +/* 287 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var parseFloat = __webpack_require__(286); +var parseFloat = __webpack_require__(288); // `Number.parseFloat` method // https://tc39.es/ecma262/#sec-number.parseFloat @@ -8944,7 +9009,7 @@ $({ target: 'Number', stat: true, forced: Number.parseFloat !== parseFloat }, { /***/ }), -/* 286 */ +/* 288 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8953,8 +9018,8 @@ var global = __webpack_require__(4); var fails = __webpack_require__(7); var uncurryThis = __webpack_require__(14); var toString = __webpack_require__(69); -var trim = __webpack_require__(274).trim; -var whitespaces = __webpack_require__(275); +var trim = __webpack_require__(276).trim; +var whitespaces = __webpack_require__(277); var charAt = uncurryThis(''.charAt); var $parseFloat = global.parseFloat; @@ -8974,13 +9039,13 @@ module.exports = FORCED ? function parseFloat(string) { /***/ }), -/* 287 */ +/* 289 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var parseInt = __webpack_require__(288); +var parseInt = __webpack_require__(290); // `Number.parseInt` method // https://tc39.es/ecma262/#sec-number.parseint @@ -8991,7 +9056,7 @@ $({ target: 'Number', stat: true, forced: Number.parseInt !== parseInt }, { /***/ }), -/* 288 */ +/* 290 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9000,8 +9065,8 @@ var global = __webpack_require__(4); var fails = __webpack_require__(7); var uncurryThis = __webpack_require__(14); var toString = __webpack_require__(69); -var trim = __webpack_require__(274).trim; -var whitespaces = __webpack_require__(275); +var trim = __webpack_require__(276).trim; +var whitespaces = __webpack_require__(277); var $parseInt = global.parseInt; var Symbol = global.Symbol; @@ -9021,7 +9086,7 @@ module.exports = FORCED ? function parseInt(string, radix) { /***/ }), -/* 289 */ +/* 291 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9029,9 +9094,9 @@ module.exports = FORCED ? function parseInt(string, radix) { var $ = __webpack_require__(3); var uncurryThis = __webpack_require__(14); var toIntegerOrInfinity = __webpack_require__(62); -var thisNumberValue = __webpack_require__(273); +var thisNumberValue = __webpack_require__(275); var $repeat = __webpack_require__(231); -var log10 = __webpack_require__(264); +var log10 = __webpack_require__(266); var fails = __webpack_require__(7); var $RangeError = RangeError; @@ -9130,7 +9195,7 @@ $({ target: 'Number', proto: true, forced: FORCED }, { /***/ }), -/* 290 */ +/* 292 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9138,7 +9203,7 @@ $({ target: 'Number', proto: true, forced: FORCED }, { var $ = __webpack_require__(3); var uncurryThis = __webpack_require__(14); var toIntegerOrInfinity = __webpack_require__(62); -var thisNumberValue = __webpack_require__(273); +var thisNumberValue = __webpack_require__(275); var $repeat = __webpack_require__(231); var fails = __webpack_require__(7); @@ -9268,7 +9333,7 @@ $({ target: 'Number', proto: true, forced: FORCED }, { /***/ }), -/* 291 */ +/* 293 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9276,7 +9341,7 @@ $({ target: 'Number', proto: true, forced: FORCED }, { var $ = __webpack_require__(3); var uncurryThis = __webpack_require__(14); var fails = __webpack_require__(7); -var thisNumberValue = __webpack_require__(273); +var thisNumberValue = __webpack_require__(275); var nativeToPrecision = uncurryThis(1.0.toPrecision); @@ -9300,13 +9365,13 @@ $({ target: 'Number', proto: true, forced: FORCED }, { /***/ }), -/* 292 */ +/* 294 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var assign = __webpack_require__(293); +var assign = __webpack_require__(295); // `Object.assign` method // https://tc39.es/ecma262/#sec-object.assign @@ -9317,7 +9382,7 @@ $({ target: 'Object', stat: true, arity: 2, forced: Object.assign !== assign }, /***/ }), -/* 293 */ +/* 295 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9381,7 +9446,7 @@ module.exports = !$assign || fails(function () { /***/ }), -/* 294 */ +/* 296 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9399,14 +9464,14 @@ $({ target: 'Object', stat: true, sham: !DESCRIPTORS }, { /***/ }), -/* 295 */ +/* 297 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var DESCRIPTORS = __webpack_require__(6); -var FORCED = __webpack_require__(296); +var FORCED = __webpack_require__(298); var aCallable = __webpack_require__(31); var toObject = __webpack_require__(40); var definePropertyModule = __webpack_require__(45); @@ -9423,7 +9488,7 @@ if (DESCRIPTORS) { /***/ }), -/* 296 */ +/* 298 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9447,7 +9512,7 @@ module.exports = IS_PURE || !fails(function () { /***/ }), -/* 297 */ +/* 299 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9465,7 +9530,7 @@ $({ target: 'Object', stat: true, forced: Object.defineProperties !== defineProp /***/ }), -/* 298 */ +/* 300 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9483,14 +9548,14 @@ $({ target: 'Object', stat: true, forced: Object.defineProperty !== defineProper /***/ }), -/* 299 */ +/* 301 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var DESCRIPTORS = __webpack_require__(6); -var FORCED = __webpack_require__(296); +var FORCED = __webpack_require__(298); var aCallable = __webpack_require__(31); var toObject = __webpack_require__(40); var definePropertyModule = __webpack_require__(45); @@ -9507,13 +9572,13 @@ if (DESCRIPTORS) { /***/ }), -/* 300 */ +/* 302 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var $entries = __webpack_require__(301).entries; +var $entries = __webpack_require__(303).entries; // `Object.entries` method // https://tc39.es/ecma262/#sec-object.entries @@ -9525,7 +9590,7 @@ $({ target: 'Object', stat: true }, { /***/ }), -/* 301 */ +/* 303 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9581,7 +9646,7 @@ module.exports = { /***/ }), -/* 302 */ +/* 304 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9606,7 +9671,7 @@ $({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING } /***/ }), -/* 303 */ +/* 305 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9629,7 +9694,7 @@ $({ target: 'Object', stat: true }, { /***/ }), -/* 304 */ +/* 306 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9652,7 +9717,7 @@ $({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, { /***/ }), -/* 305 */ +/* 307 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9684,7 +9749,7 @@ $({ target: 'Object', stat: true, sham: !DESCRIPTORS }, { /***/ }), -/* 306 */ +/* 308 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9704,7 +9769,7 @@ $({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, { /***/ }), -/* 307 */ +/* 309 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9728,7 +9793,44 @@ $({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !CORRECT_PR /***/ }), -/* 308 */ +/* 310 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(3); +var getBuiltIn = __webpack_require__(24); +var uncurryThis = __webpack_require__(14); +var aCallable = __webpack_require__(31); +var requireObjectCoercible = __webpack_require__(16); +var toPropertyKey = __webpack_require__(18); +var iterate = __webpack_require__(132); + +var create = getBuiltIn('Object', 'create'); +var push = uncurryThis([].push); + +// `Object.groupBy` method +// https://github.com/tc39/proposal-array-grouping +$({ target: 'Object', stat: true }, { + groupBy: function groupBy(items, callbackfn) { + requireObjectCoercible(items); + aCallable(callbackfn); + var obj = create(null); + var k = 0; + iterate(items, function (value) { + var key = toPropertyKey(callbackfn(value, k++)); + // in some IE versions, `hasOwnProperty` returns incorrect result on integer keys + // but since it's a `null` prototype object, we can safely use `in` + if (key in obj) push(obj[key], value); + else obj[key] = [value]; + }); + return obj; + } +}); + + +/***/ }), +/* 311 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9744,13 +9846,13 @@ $({ target: 'Object', stat: true }, { /***/ }), -/* 309 */ +/* 312 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var is = __webpack_require__(310); +var is = __webpack_require__(313); // `Object.is` method // https://tc39.es/ecma262/#sec-object.is @@ -9760,7 +9862,7 @@ $({ target: 'Object', stat: true }, { /***/ }), -/* 310 */ +/* 313 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9775,7 +9877,7 @@ module.exports = Object.is || function is(x, y) { /***/ }), -/* 311 */ +/* 314 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9792,7 +9894,7 @@ $({ target: 'Object', stat: true, forced: Object.isExtensible !== $isExtensible /***/ }), -/* 312 */ +/* 315 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9820,7 +9922,7 @@ $({ target: 'Object', stat: true, forced: FORCED }, { /***/ }), -/* 313 */ +/* 316 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9848,7 +9950,7 @@ $({ target: 'Object', stat: true, forced: FORCED }, { /***/ }), -/* 314 */ +/* 317 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9870,14 +9972,14 @@ $({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, { /***/ }), -/* 315 */ +/* 318 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var DESCRIPTORS = __webpack_require__(6); -var FORCED = __webpack_require__(296); +var FORCED = __webpack_require__(298); var toObject = __webpack_require__(40); var toPropertyKey = __webpack_require__(18); var getPrototypeOf = __webpack_require__(130); @@ -9900,14 +10002,14 @@ if (DESCRIPTORS) { /***/ }), -/* 316 */ +/* 319 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var DESCRIPTORS = __webpack_require__(6); -var FORCED = __webpack_require__(296); +var FORCED = __webpack_require__(298); var toObject = __webpack_require__(40); var toPropertyKey = __webpack_require__(18); var getPrototypeOf = __webpack_require__(130); @@ -9930,7 +10032,7 @@ if (DESCRIPTORS) { /***/ }), -/* 317 */ +/* 320 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9955,7 +10057,7 @@ $({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING } /***/ }), -/* 318 */ +/* 321 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9991,7 +10093,7 @@ if (DESCRIPTORS && getPrototypeOf && setPrototypeOf && !(PROTO in ObjectPrototyp /***/ }), -/* 319 */ +/* 322 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10016,7 +10118,7 @@ $({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING } /***/ }), -/* 320 */ +/* 323 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10032,14 +10134,14 @@ $({ target: 'Object', stat: true }, { /***/ }), -/* 321 */ +/* 324 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var TO_STRING_TAG_SUPPORT = __webpack_require__(71); var defineBuiltIn = __webpack_require__(48); -var toString = __webpack_require__(322); +var toString = __webpack_require__(325); // `Object.prototype.toString` method // https://tc39.es/ecma262/#sec-object.prototype.tostring @@ -10049,7 +10151,7 @@ if (!TO_STRING_TAG_SUPPORT) { /***/ }), -/* 322 */ +/* 325 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10065,13 +10167,13 @@ module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() { /***/ }), -/* 323 */ +/* 326 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var $values = __webpack_require__(301).values; +var $values = __webpack_require__(303).values; // `Object.values` method // https://tc39.es/ecma262/#sec-object.values @@ -10083,13 +10185,13 @@ $({ target: 'Object', stat: true }, { /***/ }), -/* 324 */ +/* 327 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var $parseFloat = __webpack_require__(286); +var $parseFloat = __webpack_require__(288); // `parseFloat` method // https://tc39.es/ecma262/#sec-parsefloat-string @@ -10099,13 +10201,13 @@ $({ global: true, forced: parseFloat !== $parseFloat }, { /***/ }), -/* 325 */ +/* 328 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var $parseInt = __webpack_require__(288); +var $parseInt = __webpack_require__(290); // `parseInt` method // https://tc39.es/ecma262/#sec-parseint-string-radix @@ -10115,22 +10217,22 @@ $({ global: true, forced: parseInt !== $parseInt }, { /***/ }), -/* 326 */ +/* 329 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove this module from `core-js@4` since it's split to modules listed below -__webpack_require__(327); -__webpack_require__(342); -__webpack_require__(344); +__webpack_require__(330); __webpack_require__(345); -__webpack_require__(346); __webpack_require__(347); +__webpack_require__(348); +__webpack_require__(349); +__webpack_require__(350); /***/ }), -/* 327 */ +/* 330 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10149,15 +10251,15 @@ var isCallable = __webpack_require__(21); var isObject = __webpack_require__(20); var anInstance = __webpack_require__(211); var speciesConstructor = __webpack_require__(220); -var task = __webpack_require__(328).set; -var microtask = __webpack_require__(331); -var hostReportErrors = __webpack_require__(335); -var perform = __webpack_require__(336); -var Queue = __webpack_require__(332); +var task = __webpack_require__(331).set; +var microtask = __webpack_require__(334); +var hostReportErrors = __webpack_require__(338); +var perform = __webpack_require__(339); +var Queue = __webpack_require__(335); var InternalStateModule = __webpack_require__(52); -var NativePromiseConstructor = __webpack_require__(337); -var PromiseConstructorDetection = __webpack_require__(338); -var newPromiseCapabilityModule = __webpack_require__(341); +var NativePromiseConstructor = __webpack_require__(340); +var PromiseConstructorDetection = __webpack_require__(341); +var newPromiseCapabilityModule = __webpack_require__(344); var PROMISE = 'Promise'; var FORCED_PROMISE_CONSTRUCTOR = PromiseConstructorDetection.CONSTRUCTOR; @@ -10425,7 +10527,7 @@ setSpecies(PROMISE); /***/ }), -/* 328 */ +/* 331 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10439,8 +10541,8 @@ var fails = __webpack_require__(7); var html = __webpack_require__(75); var arraySlice = __webpack_require__(97); var createElement = __webpack_require__(43); -var validateArgumentsLength = __webpack_require__(329); -var IS_IOS = __webpack_require__(330); +var validateArgumentsLength = __webpack_require__(332); +var IS_IOS = __webpack_require__(333); var IS_NODE = __webpack_require__(183); var set = global.setImmediate; @@ -10549,7 +10651,7 @@ module.exports = { /***/ }), -/* 329 */ +/* 332 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10563,7 +10665,7 @@ module.exports = function (passed, required) { /***/ }), -/* 330 */ +/* 333 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10575,7 +10677,7 @@ module.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent); /***/ }), -/* 331 */ +/* 334 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10583,11 +10685,11 @@ module.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent); var global = __webpack_require__(4); var bind = __webpack_require__(86); var getOwnPropertyDescriptor = __webpack_require__(5).f; -var macrotask = __webpack_require__(328).set; -var Queue = __webpack_require__(332); -var IS_IOS = __webpack_require__(330); -var IS_IOS_PEBBLE = __webpack_require__(333); -var IS_WEBOS_WEBKIT = __webpack_require__(334); +var macrotask = __webpack_require__(331).set; +var Queue = __webpack_require__(335); +var IS_IOS = __webpack_require__(333); +var IS_IOS_PEBBLE = __webpack_require__(336); +var IS_WEBOS_WEBKIT = __webpack_require__(337); var IS_NODE = __webpack_require__(183); var MutationObserver = global.MutationObserver || global.WebKitMutationObserver; @@ -10663,7 +10765,7 @@ module.exports = microtask; /***/ }), -/* 332 */ +/* 335 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10695,7 +10797,7 @@ module.exports = Queue; /***/ }), -/* 333 */ +/* 336 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10706,7 +10808,7 @@ module.exports = /ipad|iphone|ipod/i.test(userAgent) && typeof Pebble != 'undefi /***/ }), -/* 334 */ +/* 337 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10717,7 +10819,7 @@ module.exports = /web0s(?!.*chrome)/i.test(userAgent); /***/ }), -/* 335 */ +/* 338 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10731,7 +10833,7 @@ module.exports = function (a, b) { /***/ }), -/* 336 */ +/* 339 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10746,7 +10848,7 @@ module.exports = function (exec) { /***/ }), -/* 337 */ +/* 340 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10757,19 +10859,19 @@ module.exports = global.Promise; /***/ }), -/* 338 */ +/* 341 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var global = __webpack_require__(4); -var NativePromiseConstructor = __webpack_require__(337); +var NativePromiseConstructor = __webpack_require__(340); var isCallable = __webpack_require__(21); var isForced = __webpack_require__(68); var inspectSource = __webpack_require__(51); var wellKnownSymbol = __webpack_require__(34); -var IS_BROWSER = __webpack_require__(339); -var IS_DENO = __webpack_require__(340); +var IS_BROWSER = __webpack_require__(342); +var IS_DENO = __webpack_require__(343); var IS_PURE = __webpack_require__(36); var V8_VERSION = __webpack_require__(28); @@ -10812,12 +10914,12 @@ module.exports = { /***/ }), -/* 339 */ +/* 342 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var IS_DENO = __webpack_require__(340); +var IS_DENO = __webpack_require__(343); var IS_NODE = __webpack_require__(183); module.exports = !IS_DENO && !IS_NODE @@ -10826,7 +10928,7 @@ module.exports = !IS_DENO && !IS_NODE /***/ }), -/* 340 */ +/* 343 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10836,7 +10938,7 @@ module.exports = typeof Deno == 'object' && Deno && typeof Deno.version == 'obje /***/ }), -/* 341 */ +/* 344 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10864,7 +10966,7 @@ module.exports.f = function (C) { /***/ }), -/* 342 */ +/* 345 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10872,10 +10974,10 @@ module.exports.f = function (C) { var $ = __webpack_require__(3); var call = __webpack_require__(8); var aCallable = __webpack_require__(31); -var newPromiseCapabilityModule = __webpack_require__(341); -var perform = __webpack_require__(336); +var newPromiseCapabilityModule = __webpack_require__(344); +var perform = __webpack_require__(339); var iterate = __webpack_require__(132); -var PROMISE_STATICS_INCORRECT_ITERATION = __webpack_require__(343); +var PROMISE_STATICS_INCORRECT_ITERATION = __webpack_require__(346); // `Promise.all` method // https://tc39.es/ecma262/#sec-promise.all @@ -10910,14 +11012,14 @@ $({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION } /***/ }), -/* 343 */ +/* 346 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var NativePromiseConstructor = __webpack_require__(337); +var NativePromiseConstructor = __webpack_require__(340); var checkCorrectnessOfIteration = __webpack_require__(165); -var FORCED_PROMISE_CONSTRUCTOR = __webpack_require__(338).CONSTRUCTOR; +var FORCED_PROMISE_CONSTRUCTOR = __webpack_require__(341).CONSTRUCTOR; module.exports = FORCED_PROMISE_CONSTRUCTOR || !checkCorrectnessOfIteration(function (iterable) { NativePromiseConstructor.all(iterable).then(undefined, function () { /* empty */ }); @@ -10925,15 +11027,15 @@ module.exports = FORCED_PROMISE_CONSTRUCTOR || !checkCorrectnessOfIteration(func /***/ }), -/* 344 */ +/* 347 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var IS_PURE = __webpack_require__(36); -var FORCED_PROMISE_CONSTRUCTOR = __webpack_require__(338).CONSTRUCTOR; -var NativePromiseConstructor = __webpack_require__(337); +var FORCED_PROMISE_CONSTRUCTOR = __webpack_require__(341).CONSTRUCTOR; +var NativePromiseConstructor = __webpack_require__(340); var getBuiltIn = __webpack_require__(24); var isCallable = __webpack_require__(21); var defineBuiltIn = __webpack_require__(48); @@ -10958,7 +11060,7 @@ if (!IS_PURE && isCallable(NativePromiseConstructor)) { /***/ }), -/* 345 */ +/* 348 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10966,10 +11068,10 @@ if (!IS_PURE && isCallable(NativePromiseConstructor)) { var $ = __webpack_require__(3); var call = __webpack_require__(8); var aCallable = __webpack_require__(31); -var newPromiseCapabilityModule = __webpack_require__(341); -var perform = __webpack_require__(336); +var newPromiseCapabilityModule = __webpack_require__(344); +var perform = __webpack_require__(339); var iterate = __webpack_require__(132); -var PROMISE_STATICS_INCORRECT_ITERATION = __webpack_require__(343); +var PROMISE_STATICS_INCORRECT_ITERATION = __webpack_require__(346); // `Promise.race` method // https://tc39.es/ecma262/#sec-promise.race @@ -10991,15 +11093,15 @@ $({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION } /***/ }), -/* 346 */ +/* 349 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var call = __webpack_require__(8); -var newPromiseCapabilityModule = __webpack_require__(341); -var FORCED_PROMISE_CONSTRUCTOR = __webpack_require__(338).CONSTRUCTOR; +var newPromiseCapabilityModule = __webpack_require__(344); +var FORCED_PROMISE_CONSTRUCTOR = __webpack_require__(341).CONSTRUCTOR; // `Promise.reject` method // https://tc39.es/ecma262/#sec-promise.reject @@ -11013,7 +11115,7 @@ $({ target: 'Promise', stat: true, forced: FORCED_PROMISE_CONSTRUCTOR }, { /***/ }), -/* 347 */ +/* 350 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11021,9 +11123,9 @@ $({ target: 'Promise', stat: true, forced: FORCED_PROMISE_CONSTRUCTOR }, { var $ = __webpack_require__(3); var getBuiltIn = __webpack_require__(24); var IS_PURE = __webpack_require__(36); -var NativePromiseConstructor = __webpack_require__(337); -var FORCED_PROMISE_CONSTRUCTOR = __webpack_require__(338).CONSTRUCTOR; -var promiseResolve = __webpack_require__(348); +var NativePromiseConstructor = __webpack_require__(340); +var FORCED_PROMISE_CONSTRUCTOR = __webpack_require__(341).CONSTRUCTOR; +var promiseResolve = __webpack_require__(351); var PromiseConstructorWrapper = getBuiltIn('Promise'); var CHECK_WRAPPER = IS_PURE && !FORCED_PROMISE_CONSTRUCTOR; @@ -11038,14 +11140,14 @@ $({ target: 'Promise', stat: true, forced: IS_PURE || FORCED_PROMISE_CONSTRUCTOR /***/ }), -/* 348 */ +/* 351 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var anObject = __webpack_require__(47); var isObject = __webpack_require__(20); -var newPromiseCapability = __webpack_require__(341); +var newPromiseCapability = __webpack_require__(344); module.exports = function (C, x) { anObject(C); @@ -11058,7 +11160,7 @@ module.exports = function (C, x) { /***/ }), -/* 349 */ +/* 352 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11066,10 +11168,10 @@ module.exports = function (C, x) { var $ = __webpack_require__(3); var call = __webpack_require__(8); var aCallable = __webpack_require__(31); -var newPromiseCapabilityModule = __webpack_require__(341); -var perform = __webpack_require__(336); +var newPromiseCapabilityModule = __webpack_require__(344); +var perform = __webpack_require__(339); var iterate = __webpack_require__(132); -var PROMISE_STATICS_INCORRECT_ITERATION = __webpack_require__(343); +var PROMISE_STATICS_INCORRECT_ITERATION = __webpack_require__(346); // `Promise.allSettled` method // https://tc39.es/ecma262/#sec-promise.allsettled @@ -11109,7 +11211,7 @@ $({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION } /***/ }), -/* 350 */ +/* 353 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11118,10 +11220,10 @@ var $ = __webpack_require__(3); var call = __webpack_require__(8); var aCallable = __webpack_require__(31); var getBuiltIn = __webpack_require__(24); -var newPromiseCapabilityModule = __webpack_require__(341); -var perform = __webpack_require__(336); +var newPromiseCapabilityModule = __webpack_require__(344); +var perform = __webpack_require__(339); var iterate = __webpack_require__(132); -var PROMISE_STATICS_INCORRECT_ITERATION = __webpack_require__(343); +var PROMISE_STATICS_INCORRECT_ITERATION = __webpack_require__(346); var PROMISE_ANY_ERROR = 'No one promise resolved'; @@ -11164,19 +11266,19 @@ $({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION } /***/ }), -/* 351 */ +/* 354 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var IS_PURE = __webpack_require__(36); -var NativePromiseConstructor = __webpack_require__(337); +var NativePromiseConstructor = __webpack_require__(340); var fails = __webpack_require__(7); var getBuiltIn = __webpack_require__(24); var isCallable = __webpack_require__(21); var speciesConstructor = __webpack_require__(220); -var promiseResolve = __webpack_require__(348); +var promiseResolve = __webpack_require__(351); var defineBuiltIn = __webpack_require__(48); var NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype; @@ -11214,7 +11316,30 @@ if (!IS_PURE && isCallable(NativePromiseConstructor)) { /***/ }), -/* 352 */ +/* 355 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(3); +var newPromiseCapabilityModule = __webpack_require__(344); + +// `Promise.withResolvers` method +// https://github.com/tc39/proposal-promise-with-resolvers +$({ target: 'Promise', stat: true }, { + withResolvers: function withResolvers() { + var promiseCapability = newPromiseCapabilityModule.f(this); + return { + promise: promiseCapability.promise, + resolve: promiseCapability.resolve, + reject: promiseCapability.reject + }; + } +}); + + +/***/ }), +/* 356 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11241,7 +11366,7 @@ $({ target: 'Reflect', stat: true, forced: OPTIONAL_ARGUMENTS_LIST }, { /***/ }), -/* 353 */ +/* 357 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11305,7 +11430,7 @@ $({ target: 'Reflect', stat: true, forced: FORCED, sham: FORCED }, { /***/ }), -/* 354 */ +/* 358 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11341,7 +11466,7 @@ $({ target: 'Reflect', stat: true, forced: ERROR_INSTEAD_OF_FALSE, sham: !DESCRI /***/ }), -/* 355 */ +/* 359 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11361,7 +11486,7 @@ $({ target: 'Reflect', stat: true }, { /***/ }), -/* 356 */ +/* 360 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11370,7 +11495,7 @@ var $ = __webpack_require__(3); var call = __webpack_require__(8); var isObject = __webpack_require__(20); var anObject = __webpack_require__(47); -var isDataDescriptor = __webpack_require__(357); +var isDataDescriptor = __webpack_require__(361); var getOwnPropertyDescriptorModule = __webpack_require__(5); var getPrototypeOf = __webpack_require__(130); @@ -11393,7 +11518,7 @@ $({ target: 'Reflect', stat: true }, { /***/ }), -/* 357 */ +/* 361 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11406,7 +11531,7 @@ module.exports = function (descriptor) { /***/ }), -/* 358 */ +/* 362 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11426,7 +11551,7 @@ $({ target: 'Reflect', stat: true, sham: !DESCRIPTORS }, { /***/ }), -/* 359 */ +/* 363 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11446,7 +11571,7 @@ $({ target: 'Reflect', stat: true, sham: !CORRECT_PROTOTYPE_GETTER }, { /***/ }), -/* 360 */ +/* 364 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11463,7 +11588,7 @@ $({ target: 'Reflect', stat: true }, { /***/ }), -/* 361 */ +/* 365 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11483,7 +11608,7 @@ $({ target: 'Reflect', stat: true }, { /***/ }), -/* 362 */ +/* 366 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11499,7 +11624,7 @@ $({ target: 'Reflect', stat: true }, { /***/ }), -/* 363 */ +/* 367 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11526,7 +11651,7 @@ $({ target: 'Reflect', stat: true, sham: !FREEZING }, { /***/ }), -/* 364 */ +/* 368 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11535,7 +11660,7 @@ var $ = __webpack_require__(3); var call = __webpack_require__(8); var anObject = __webpack_require__(47); var isObject = __webpack_require__(20); -var isDataDescriptor = __webpack_require__(357); +var isDataDescriptor = __webpack_require__(361); var fails = __webpack_require__(7); var definePropertyModule = __webpack_require__(45); var getOwnPropertyDescriptorModule = __webpack_require__(5); @@ -11583,7 +11708,7 @@ $({ target: 'Reflect', stat: true, forced: MS_EDGE_BUG }, { /***/ }), -/* 365 */ +/* 369 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11610,7 +11735,7 @@ if (objectSetPrototypeOf) $({ target: 'Reflect', stat: true }, { /***/ }), -/* 366 */ +/* 370 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11627,7 +11752,7 @@ setToStringTag(global.Reflect, 'Reflect', true); /***/ }), -/* 367 */ +/* 371 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11638,12 +11763,13 @@ var uncurryThis = __webpack_require__(14); var isForced = __webpack_require__(68); var inheritIfRequired = __webpack_require__(120); var createNonEnumerableProperty = __webpack_require__(44); +var create = __webpack_require__(72); var getOwnPropertyNames = __webpack_require__(58).f; var isPrototypeOf = __webpack_require__(25); -var isRegExp = __webpack_require__(368); +var isRegExp = __webpack_require__(372); var toString = __webpack_require__(69); -var getRegExpFlags = __webpack_require__(369); -var stickyHelpers = __webpack_require__(371); +var getRegExpFlags = __webpack_require__(373); +var stickyHelpers = __webpack_require__(375); var proxyAccessor = __webpack_require__(119); var defineBuiltIn = __webpack_require__(48); var fails = __webpack_require__(7); @@ -11651,8 +11777,8 @@ var hasOwn = __webpack_require__(39); var enforceInternalState = __webpack_require__(52).enforce; var setSpecies = __webpack_require__(194); var wellKnownSymbol = __webpack_require__(34); -var UNSUPPORTED_DOT_ALL = __webpack_require__(372); -var UNSUPPORTED_NCG = __webpack_require__(373); +var UNSUPPORTED_DOT_ALL = __webpack_require__(376); +var UNSUPPORTED_NCG = __webpack_require__(377); var MATCH = wellKnownSymbol('match'); var NativeRegExp = global.RegExp; @@ -11710,7 +11836,7 @@ var handleNCG = function (string) { var index = 0; var result = ''; var named = []; - var names = {}; + var names = create(null); var brackets = false; var ncg = false; var groupid = 0; @@ -11825,7 +11951,7 @@ setSpecies('RegExp'); /***/ }), -/* 368 */ +/* 372 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11845,7 +11971,7 @@ module.exports = function (it) { /***/ }), -/* 369 */ +/* 373 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11853,7 +11979,7 @@ module.exports = function (it) { var call = __webpack_require__(8); var hasOwn = __webpack_require__(39); var isPrototypeOf = __webpack_require__(25); -var regExpFlags = __webpack_require__(370); +var regExpFlags = __webpack_require__(374); var RegExpPrototype = RegExp.prototype; @@ -11865,7 +11991,7 @@ module.exports = function (R) { /***/ }), -/* 370 */ +/* 374 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11890,7 +12016,7 @@ module.exports = function () { /***/ }), -/* 371 */ +/* 375 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11928,7 +12054,7 @@ module.exports = { /***/ }), -/* 372 */ +/* 376 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11946,7 +12072,7 @@ module.exports = fails(function () { /***/ }), -/* 373 */ +/* 377 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11965,13 +12091,13 @@ module.exports = fails(function () { /***/ }), -/* 374 */ +/* 378 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var DESCRIPTORS = __webpack_require__(6); -var UNSUPPORTED_DOT_ALL = __webpack_require__(372); +var UNSUPPORTED_DOT_ALL = __webpack_require__(376); var classof = __webpack_require__(15); var defineBuiltInAccessor = __webpack_require__(79); var getInternalState = __webpack_require__(52).get; @@ -11998,13 +12124,13 @@ if (DESCRIPTORS && UNSUPPORTED_DOT_ALL) { /***/ }), -/* 375 */ +/* 379 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var exec = __webpack_require__(376); +var exec = __webpack_require__(380); // `RegExp.prototype.exec` method // https://tc39.es/ecma262/#sec-regexp.prototype.exec @@ -12014,7 +12140,7 @@ $({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, { /***/ }), -/* 376 */ +/* 380 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12024,13 +12150,13 @@ $({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, { var call = __webpack_require__(8); var uncurryThis = __webpack_require__(14); var toString = __webpack_require__(69); -var regexpFlags = __webpack_require__(370); -var stickyHelpers = __webpack_require__(371); +var regexpFlags = __webpack_require__(374); +var stickyHelpers = __webpack_require__(375); var shared = __webpack_require__(35); var create = __webpack_require__(72); var getInternalState = __webpack_require__(52).get; -var UNSUPPORTED_DOT_ALL = __webpack_require__(372); -var UNSUPPORTED_NCG = __webpack_require__(373); +var UNSUPPORTED_DOT_ALL = __webpack_require__(376); +var UNSUPPORTED_NCG = __webpack_require__(377); var nativeReplace = shared('native-string-replace', String.prototype.replace); var nativeExec = RegExp.prototype.exec; @@ -12138,7 +12264,7 @@ module.exports = patchedExec; /***/ }), -/* 377 */ +/* 381 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12146,7 +12272,7 @@ module.exports = patchedExec; var global = __webpack_require__(4); var DESCRIPTORS = __webpack_require__(6); var defineBuiltInAccessor = __webpack_require__(79); -var regExpFlags = __webpack_require__(370); +var regExpFlags = __webpack_require__(374); var fails = __webpack_require__(7); // babel-minify and Closure Compiler transpiles RegExp('.', 'd') -> /./d and it causes SyntaxError @@ -12201,13 +12327,13 @@ if (FORCED) defineBuiltInAccessor(RegExpPrototype, 'flags', { /***/ }), -/* 378 */ +/* 382 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var DESCRIPTORS = __webpack_require__(6); -var MISSED_STICKY = __webpack_require__(371).MISSED_STICKY; +var MISSED_STICKY = __webpack_require__(375).MISSED_STICKY; var classof = __webpack_require__(15); var defineBuiltInAccessor = __webpack_require__(79); var getInternalState = __webpack_require__(52).get; @@ -12234,13 +12360,13 @@ if (DESCRIPTORS && MISSED_STICKY) { /***/ }), -/* 379 */ +/* 383 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove from `core-js@4` since it's moved to entry points -__webpack_require__(375); +__webpack_require__(379); var $ = __webpack_require__(3); var call = __webpack_require__(8); var isCallable = __webpack_require__(21); @@ -12276,7 +12402,7 @@ $({ target: 'RegExp', proto: true, forced: !DELEGATES_TO_EXEC }, { /***/ }), -/* 380 */ +/* 384 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12286,7 +12412,7 @@ var defineBuiltIn = __webpack_require__(48); var anObject = __webpack_require__(47); var $toString = __webpack_require__(69); var fails = __webpack_require__(7); -var getRegExpFlags = __webpack_require__(369); +var getRegExpFlags = __webpack_require__(373); var TO_STRING = 'toString'; var RegExpPrototype = RegExp.prototype; @@ -12309,17 +12435,17 @@ if (NOT_GENERIC || INCORRECT_NAME) { /***/ }), -/* 381 */ +/* 385 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove this module from `core-js@4` since it's replaced to module below -__webpack_require__(382); +__webpack_require__(386); /***/ }), -/* 382 */ +/* 386 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12335,7 +12461,7 @@ collection('Set', function (init) { /***/ }), -/* 383 */ +/* 387 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12368,13 +12494,13 @@ $({ target: 'String', proto: true, forced: FORCED }, { /***/ }), -/* 384 */ +/* 388 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var codeAt = __webpack_require__(385).codeAt; +var codeAt = __webpack_require__(389).codeAt; // `String.prototype.codePointAt` method // https://tc39.es/ecma262/#sec-string.prototype.codepointat @@ -12386,7 +12512,7 @@ $({ target: 'String', proto: true }, { /***/ }), -/* 385 */ +/* 389 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12430,7 +12556,7 @@ module.exports = { /***/ }), -/* 386 */ +/* 390 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12440,9 +12566,9 @@ var uncurryThis = __webpack_require__(87); var getOwnPropertyDescriptor = __webpack_require__(5).f; var toLength = __webpack_require__(65); var toString = __webpack_require__(69); -var notARegExp = __webpack_require__(387); +var notARegExp = __webpack_require__(391); var requireObjectCoercible = __webpack_require__(16); -var correctIsRegExpLogic = __webpack_require__(388); +var correctIsRegExpLogic = __webpack_require__(392); var IS_PURE = __webpack_require__(36); // eslint-disable-next-line es/no-string-prototype-endswith -- safe @@ -12475,12 +12601,12 @@ $({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGE /***/ }), -/* 387 */ +/* 391 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isRegExp = __webpack_require__(368); +var isRegExp = __webpack_require__(372); var $TypeError = TypeError; @@ -12492,7 +12618,7 @@ module.exports = function (it) { /***/ }), -/* 388 */ +/* 392 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12515,7 +12641,7 @@ module.exports = function (METHOD_NAME) { /***/ }), -/* 389 */ +/* 393 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12554,17 +12680,17 @@ $({ target: 'String', stat: true, arity: 1, forced: INCORRECT_LENGTH }, { /***/ }), -/* 390 */ +/* 394 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var uncurryThis = __webpack_require__(14); -var notARegExp = __webpack_require__(387); +var notARegExp = __webpack_require__(391); var requireObjectCoercible = __webpack_require__(16); var toString = __webpack_require__(69); -var correctIsRegExpLogic = __webpack_require__(388); +var correctIsRegExpLogic = __webpack_require__(392); var stringIndexOf = uncurryThis(''.indexOf); @@ -12582,7 +12708,7 @@ $({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, /***/ }), -/* 391 */ +/* 395 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12612,12 +12738,12 @@ $({ target: 'String', proto: true }, { /***/ }), -/* 392 */ +/* 396 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var charAt = __webpack_require__(385).charAt; +var charAt = __webpack_require__(389).charAt; var toString = __webpack_require__(69); var InternalStateModule = __webpack_require__(52); var defineIterator = __webpack_require__(170); @@ -12650,21 +12776,21 @@ defineIterator(String, 'String', function (iterated) { /***/ }), -/* 393 */ +/* 397 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var call = __webpack_require__(8); -var fixRegExpWellKnownSymbolLogic = __webpack_require__(394); +var fixRegExpWellKnownSymbolLogic = __webpack_require__(398); var anObject = __webpack_require__(47); var isNullOrUndefined = __webpack_require__(17); var toLength = __webpack_require__(65); var toString = __webpack_require__(69); var requireObjectCoercible = __webpack_require__(16); var getMethod = __webpack_require__(30); -var advanceStringIndex = __webpack_require__(395); -var regExpExec = __webpack_require__(396); +var advanceStringIndex = __webpack_require__(399); +var regExpExec = __webpack_require__(400); // @@match logic fixRegExpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNative) { @@ -12705,16 +12831,16 @@ fixRegExpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNa /***/ }), -/* 394 */ +/* 398 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove from `core-js@4` since it's moved to entry points -__webpack_require__(375); +__webpack_require__(379); var uncurryThis = __webpack_require__(87); var defineBuiltIn = __webpack_require__(48); -var regexpExec = __webpack_require__(376); +var regexpExec = __webpack_require__(380); var fails = __webpack_require__(7); var wellKnownSymbol = __webpack_require__(34); var createNonEnumerableProperty = __webpack_require__(44); @@ -12789,12 +12915,12 @@ module.exports = function (KEY, exec, FORCED, SHAM) { /***/ }), -/* 395 */ +/* 399 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var charAt = __webpack_require__(385).charAt; +var charAt = __webpack_require__(389).charAt; // `AdvanceStringIndex` abstract operation // https://tc39.es/ecma262/#sec-advancestringindex @@ -12804,7 +12930,7 @@ module.exports = function (S, index, unicode) { /***/ }), -/* 396 */ +/* 400 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12813,7 +12939,7 @@ var call = __webpack_require__(8); var anObject = __webpack_require__(47); var isCallable = __webpack_require__(21); var classof = __webpack_require__(15); -var regexpExec = __webpack_require__(376); +var regexpExec = __webpack_require__(380); var $TypeError = TypeError; @@ -12832,7 +12958,7 @@ module.exports = function (R, S) { /***/ }), -/* 397 */ +/* 401 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12849,15 +12975,15 @@ var toString = __webpack_require__(69); var anObject = __webpack_require__(47); var isNullOrUndefined = __webpack_require__(17); var classof = __webpack_require__(15); -var isRegExp = __webpack_require__(368); -var getRegExpFlags = __webpack_require__(369); +var isRegExp = __webpack_require__(372); +var getRegExpFlags = __webpack_require__(373); var getMethod = __webpack_require__(30); var defineBuiltIn = __webpack_require__(48); var fails = __webpack_require__(7); var wellKnownSymbol = __webpack_require__(34); var speciesConstructor = __webpack_require__(220); -var advanceStringIndex = __webpack_require__(395); -var regExpExec = __webpack_require__(396); +var advanceStringIndex = __webpack_require__(399); +var regExpExec = __webpack_require__(400); var InternalStateModule = __webpack_require__(52); var IS_PURE = __webpack_require__(36); @@ -12941,14 +13067,14 @@ IS_PURE || MATCH_ALL in RegExpPrototype || defineBuiltIn(RegExpPrototype, MATCH_ /***/ }), -/* 398 */ +/* 402 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var $padEnd = __webpack_require__(230).end; -var WEBKIT_BUG = __webpack_require__(399); +var WEBKIT_BUG = __webpack_require__(403); // `String.prototype.padEnd` method // https://tc39.es/ecma262/#sec-string.prototype.padend @@ -12960,7 +13086,7 @@ $({ target: 'String', proto: true, forced: WEBKIT_BUG }, { /***/ }), -/* 399 */ +/* 403 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12972,14 +13098,14 @@ module.exports = /Version\/10(?:\.\d+){1,2}(?: [\w./]+)?(?: Mobile\/\w+)? Safari /***/ }), -/* 400 */ +/* 404 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var $padStart = __webpack_require__(230).start; -var WEBKIT_BUG = __webpack_require__(399); +var WEBKIT_BUG = __webpack_require__(403); // `String.prototype.padStart` method // https://tc39.es/ecma262/#sec-string.prototype.padstart @@ -12991,7 +13117,7 @@ $({ target: 'String', proto: true, forced: WEBKIT_BUG }, { /***/ }), -/* 401 */ +/* 405 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13026,7 +13152,7 @@ $({ target: 'String', stat: true }, { /***/ }), -/* 402 */ +/* 406 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13042,7 +13168,7 @@ $({ target: 'String', proto: true }, { /***/ }), -/* 403 */ +/* 407 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13050,7 +13176,7 @@ $({ target: 'String', proto: true }, { var apply = __webpack_require__(96); var call = __webpack_require__(8); var uncurryThis = __webpack_require__(14); -var fixRegExpWellKnownSymbolLogic = __webpack_require__(394); +var fixRegExpWellKnownSymbolLogic = __webpack_require__(398); var fails = __webpack_require__(7); var anObject = __webpack_require__(47); var isCallable = __webpack_require__(21); @@ -13059,10 +13185,10 @@ var toIntegerOrInfinity = __webpack_require__(62); var toLength = __webpack_require__(65); var toString = __webpack_require__(69); var requireObjectCoercible = __webpack_require__(16); -var advanceStringIndex = __webpack_require__(395); +var advanceStringIndex = __webpack_require__(399); var getMethod = __webpack_require__(30); -var getSubstitution = __webpack_require__(404); -var regExpExec = __webpack_require__(396); +var getSubstitution = __webpack_require__(408); +var regExpExec = __webpack_require__(400); var wellKnownSymbol = __webpack_require__(34); var REPLACE = wellKnownSymbol('replace'); @@ -13191,7 +13317,7 @@ fixRegExpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNa /***/ }), -/* 404 */ +/* 408 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13244,7 +13370,7 @@ module.exports = function (matched, str, position, captures, namedCaptures, repl /***/ }), -/* 405 */ +/* 409 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13255,11 +13381,11 @@ var uncurryThis = __webpack_require__(14); var requireObjectCoercible = __webpack_require__(16); var isCallable = __webpack_require__(21); var isNullOrUndefined = __webpack_require__(17); -var isRegExp = __webpack_require__(368); +var isRegExp = __webpack_require__(372); var toString = __webpack_require__(69); var getMethod = __webpack_require__(30); -var getRegExpFlags = __webpack_require__(369); -var getSubstitution = __webpack_require__(404); +var getRegExpFlags = __webpack_require__(373); +var getSubstitution = __webpack_require__(408); var wellKnownSymbol = __webpack_require__(34); var IS_PURE = __webpack_require__(36); @@ -13322,20 +13448,20 @@ $({ target: 'String', proto: true }, { /***/ }), -/* 406 */ +/* 410 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var call = __webpack_require__(8); -var fixRegExpWellKnownSymbolLogic = __webpack_require__(394); +var fixRegExpWellKnownSymbolLogic = __webpack_require__(398); var anObject = __webpack_require__(47); var isNullOrUndefined = __webpack_require__(17); var requireObjectCoercible = __webpack_require__(16); -var sameValue = __webpack_require__(310); +var sameValue = __webpack_require__(313); var toString = __webpack_require__(69); var getMethod = __webpack_require__(30); -var regExpExec = __webpack_require__(396); +var regExpExec = __webpack_require__(400); // @@search logic fixRegExpWellKnownSymbolLogic('search', function (SEARCH, nativeSearch, maybeCallNative) { @@ -13367,7 +13493,7 @@ fixRegExpWellKnownSymbolLogic('search', function (SEARCH, nativeSearch, maybeCal /***/ }), -/* 407 */ +/* 411 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13375,20 +13501,20 @@ fixRegExpWellKnownSymbolLogic('search', function (SEARCH, nativeSearch, maybeCal var apply = __webpack_require__(96); var call = __webpack_require__(8); var uncurryThis = __webpack_require__(14); -var fixRegExpWellKnownSymbolLogic = __webpack_require__(394); +var fixRegExpWellKnownSymbolLogic = __webpack_require__(398); var anObject = __webpack_require__(47); var isNullOrUndefined = __webpack_require__(17); -var isRegExp = __webpack_require__(368); +var isRegExp = __webpack_require__(372); var requireObjectCoercible = __webpack_require__(16); var speciesConstructor = __webpack_require__(220); -var advanceStringIndex = __webpack_require__(395); +var advanceStringIndex = __webpack_require__(399); var toLength = __webpack_require__(65); var toString = __webpack_require__(69); var getMethod = __webpack_require__(30); var arraySlice = __webpack_require__(77); -var callRegExpExec = __webpack_require__(396); -var regexpExec = __webpack_require__(376); -var stickyHelpers = __webpack_require__(371); +var callRegExpExec = __webpack_require__(400); +var regexpExec = __webpack_require__(380); +var stickyHelpers = __webpack_require__(375); var fails = __webpack_require__(7); var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y; @@ -13531,7 +13657,7 @@ fixRegExpWellKnownSymbolLogic('split', function (SPLIT, nativeSplit, maybeCallNa /***/ }), -/* 408 */ +/* 412 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13541,9 +13667,9 @@ var uncurryThis = __webpack_require__(87); var getOwnPropertyDescriptor = __webpack_require__(5).f; var toLength = __webpack_require__(65); var toString = __webpack_require__(69); -var notARegExp = __webpack_require__(387); +var notARegExp = __webpack_require__(391); var requireObjectCoercible = __webpack_require__(16); -var correctIsRegExpLogic = __webpack_require__(388); +var correctIsRegExpLogic = __webpack_require__(392); var IS_PURE = __webpack_require__(36); // eslint-disable-next-line es/no-string-prototype-startswith -- safe @@ -13574,7 +13700,7 @@ $({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGE /***/ }), -/* 409 */ +/* 413 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13611,7 +13737,7 @@ $({ target: 'String', proto: true, forced: FORCED }, { /***/ }), -/* 410 */ +/* 414 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13661,14 +13787,14 @@ $({ target: 'String', proto: true, forced: TO_STRING_CONVERSION_BUG }, { /***/ }), -/* 411 */ +/* 415 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var $trim = __webpack_require__(274).trim; -var forcedStringTrimMethod = __webpack_require__(412); +var $trim = __webpack_require__(276).trim; +var forcedStringTrimMethod = __webpack_require__(416); // `String.prototype.trim` method // https://tc39.es/ecma262/#sec-string.prototype.trim @@ -13680,14 +13806,14 @@ $({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, { /***/ }), -/* 412 */ +/* 416 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var PROPER_FUNCTION_NAME = __webpack_require__(50).PROPER; var fails = __webpack_require__(7); -var whitespaces = __webpack_require__(275); +var whitespaces = __webpack_require__(277); var non = '\u200B\u0085\u180E'; @@ -13703,15 +13829,15 @@ module.exports = function (METHOD_NAME) { /***/ }), -/* 413 */ +/* 417 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove this line from `core-js@4` -__webpack_require__(414); +__webpack_require__(418); var $ = __webpack_require__(3); -var trimEnd = __webpack_require__(415); +var trimEnd = __webpack_require__(419); // `String.prototype.trimEnd` method // https://tc39.es/ecma262/#sec-string.prototype.trimend @@ -13722,13 +13848,13 @@ $({ target: 'String', proto: true, name: 'trimEnd', forced: ''.trimEnd !== trimE /***/ }), -/* 414 */ +/* 418 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var trimEnd = __webpack_require__(415); +var trimEnd = __webpack_require__(419); // `String.prototype.trimRight` method // https://tc39.es/ecma262/#sec-string.prototype.trimend @@ -13739,13 +13865,13 @@ $({ target: 'String', proto: true, name: 'trimEnd', forced: ''.trimRight !== tri /***/ }), -/* 415 */ +/* 419 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var $trimEnd = __webpack_require__(274).end; -var forcedStringTrimMethod = __webpack_require__(412); +var $trimEnd = __webpack_require__(276).end; +var forcedStringTrimMethod = __webpack_require__(416); // `String.prototype.{ trimEnd, trimRight }` method // https://tc39.es/ecma262/#sec-string.prototype.trimend @@ -13757,15 +13883,15 @@ module.exports = forcedStringTrimMethod('trimEnd') ? function trimEnd() { /***/ }), -/* 416 */ +/* 420 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove this line from `core-js@4` -__webpack_require__(417); +__webpack_require__(421); var $ = __webpack_require__(3); -var trimStart = __webpack_require__(418); +var trimStart = __webpack_require__(422); // `String.prototype.trimStart` method // https://tc39.es/ecma262/#sec-string.prototype.trimstart @@ -13776,13 +13902,13 @@ $({ target: 'String', proto: true, name: 'trimStart', forced: ''.trimStart !== t /***/ }), -/* 417 */ +/* 421 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var trimStart = __webpack_require__(418); +var trimStart = __webpack_require__(422); // `String.prototype.trimLeft` method // https://tc39.es/ecma262/#sec-string.prototype.trimleft @@ -13793,13 +13919,13 @@ $({ target: 'String', proto: true, name: 'trimStart', forced: ''.trimLeft !== tr /***/ }), -/* 418 */ +/* 422 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var $trimStart = __webpack_require__(274).start; -var forcedStringTrimMethod = __webpack_require__(412); +var $trimStart = __webpack_require__(276).start; +var forcedStringTrimMethod = __webpack_require__(416); // `String.prototype.{ trimStart, trimLeft }` method // https://tc39.es/ecma262/#sec-string.prototype.trimstart @@ -13811,14 +13937,14 @@ module.exports = forcedStringTrimMethod('trimStart') ? function trimStart() { /***/ }), -/* 419 */ +/* 423 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var createHTML = __webpack_require__(420); -var forcedStringHTMLMethod = __webpack_require__(421); +var createHTML = __webpack_require__(424); +var forcedStringHTMLMethod = __webpack_require__(425); // `String.prototype.anchor` method // https://tc39.es/ecma262/#sec-string.prototype.anchor @@ -13830,7 +13956,7 @@ $({ target: 'String', proto: true, forced: forcedStringHTMLMethod('anchor') }, { /***/ }), -/* 420 */ +/* 424 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13853,7 +13979,7 @@ module.exports = function (string, tag, attribute, value) { /***/ }), -/* 421 */ +/* 425 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13871,14 +13997,14 @@ module.exports = function (METHOD_NAME) { /***/ }), -/* 422 */ +/* 426 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var createHTML = __webpack_require__(420); -var forcedStringHTMLMethod = __webpack_require__(421); +var createHTML = __webpack_require__(424); +var forcedStringHTMLMethod = __webpack_require__(425); // `String.prototype.big` method // https://tc39.es/ecma262/#sec-string.prototype.big @@ -13890,14 +14016,14 @@ $({ target: 'String', proto: true, forced: forcedStringHTMLMethod('big') }, { /***/ }), -/* 423 */ +/* 427 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var createHTML = __webpack_require__(420); -var forcedStringHTMLMethod = __webpack_require__(421); +var createHTML = __webpack_require__(424); +var forcedStringHTMLMethod = __webpack_require__(425); // `String.prototype.blink` method // https://tc39.es/ecma262/#sec-string.prototype.blink @@ -13909,14 +14035,14 @@ $({ target: 'String', proto: true, forced: forcedStringHTMLMethod('blink') }, { /***/ }), -/* 424 */ +/* 428 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var createHTML = __webpack_require__(420); -var forcedStringHTMLMethod = __webpack_require__(421); +var createHTML = __webpack_require__(424); +var forcedStringHTMLMethod = __webpack_require__(425); // `String.prototype.bold` method // https://tc39.es/ecma262/#sec-string.prototype.bold @@ -13928,14 +14054,14 @@ $({ target: 'String', proto: true, forced: forcedStringHTMLMethod('bold') }, { /***/ }), -/* 425 */ +/* 429 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var createHTML = __webpack_require__(420); -var forcedStringHTMLMethod = __webpack_require__(421); +var createHTML = __webpack_require__(424); +var forcedStringHTMLMethod = __webpack_require__(425); // `String.prototype.fixed` method // https://tc39.es/ecma262/#sec-string.prototype.fixed @@ -13947,14 +14073,14 @@ $({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fixed') }, { /***/ }), -/* 426 */ +/* 430 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var createHTML = __webpack_require__(420); -var forcedStringHTMLMethod = __webpack_require__(421); +var createHTML = __webpack_require__(424); +var forcedStringHTMLMethod = __webpack_require__(425); // `String.prototype.fontcolor` method // https://tc39.es/ecma262/#sec-string.prototype.fontcolor @@ -13966,14 +14092,14 @@ $({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fontcolor') } /***/ }), -/* 427 */ +/* 431 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var createHTML = __webpack_require__(420); -var forcedStringHTMLMethod = __webpack_require__(421); +var createHTML = __webpack_require__(424); +var forcedStringHTMLMethod = __webpack_require__(425); // `String.prototype.fontsize` method // https://tc39.es/ecma262/#sec-string.prototype.fontsize @@ -13985,14 +14111,14 @@ $({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fontsize') }, /***/ }), -/* 428 */ +/* 432 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var createHTML = __webpack_require__(420); -var forcedStringHTMLMethod = __webpack_require__(421); +var createHTML = __webpack_require__(424); +var forcedStringHTMLMethod = __webpack_require__(425); // `String.prototype.italics` method // https://tc39.es/ecma262/#sec-string.prototype.italics @@ -14004,14 +14130,14 @@ $({ target: 'String', proto: true, forced: forcedStringHTMLMethod('italics') }, /***/ }), -/* 429 */ +/* 433 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var createHTML = __webpack_require__(420); -var forcedStringHTMLMethod = __webpack_require__(421); +var createHTML = __webpack_require__(424); +var forcedStringHTMLMethod = __webpack_require__(425); // `String.prototype.link` method // https://tc39.es/ecma262/#sec-string.prototype.link @@ -14023,14 +14149,14 @@ $({ target: 'String', proto: true, forced: forcedStringHTMLMethod('link') }, { /***/ }), -/* 430 */ +/* 434 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var createHTML = __webpack_require__(420); -var forcedStringHTMLMethod = __webpack_require__(421); +var createHTML = __webpack_require__(424); +var forcedStringHTMLMethod = __webpack_require__(425); // `String.prototype.small` method // https://tc39.es/ecma262/#sec-string.prototype.small @@ -14042,14 +14168,14 @@ $({ target: 'String', proto: true, forced: forcedStringHTMLMethod('small') }, { /***/ }), -/* 431 */ +/* 435 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var createHTML = __webpack_require__(420); -var forcedStringHTMLMethod = __webpack_require__(421); +var createHTML = __webpack_require__(424); +var forcedStringHTMLMethod = __webpack_require__(425); // `String.prototype.strike` method // https://tc39.es/ecma262/#sec-string.prototype.strike @@ -14061,14 +14187,14 @@ $({ target: 'String', proto: true, forced: forcedStringHTMLMethod('strike') }, { /***/ }), -/* 432 */ +/* 436 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var createHTML = __webpack_require__(420); -var forcedStringHTMLMethod = __webpack_require__(421); +var createHTML = __webpack_require__(424); +var forcedStringHTMLMethod = __webpack_require__(425); // `String.prototype.sub` method // https://tc39.es/ecma262/#sec-string.prototype.sub @@ -14080,14 +14206,14 @@ $({ target: 'String', proto: true, forced: forcedStringHTMLMethod('sub') }, { /***/ }), -/* 433 */ +/* 437 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var createHTML = __webpack_require__(420); -var forcedStringHTMLMethod = __webpack_require__(421); +var createHTML = __webpack_require__(424); +var forcedStringHTMLMethod = __webpack_require__(425); // `String.prototype.sup` method // https://tc39.es/ecma262/#sec-string.prototype.sup @@ -14099,12 +14225,12 @@ $({ target: 'String', proto: true, forced: forcedStringHTMLMethod('sup') }, { /***/ }), -/* 434 */ +/* 438 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var createTypedArrayConstructor = __webpack_require__(435); +var createTypedArrayConstructor = __webpack_require__(439); // `Float32Array` constructor // https://tc39.es/ecma262/#sec-typedarray-objects @@ -14116,7 +14242,7 @@ createTypedArrayConstructor('Float32', function (init) { /***/ }), -/* 435 */ +/* 439 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14125,17 +14251,17 @@ var $ = __webpack_require__(3); var global = __webpack_require__(4); var call = __webpack_require__(8); var DESCRIPTORS = __webpack_require__(6); -var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = __webpack_require__(436); +var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = __webpack_require__(440); var ArrayBufferViewCore = __webpack_require__(218); var ArrayBufferModule = __webpack_require__(208); var anInstance = __webpack_require__(211); var createPropertyDescriptor = __webpack_require__(11); var createNonEnumerableProperty = __webpack_require__(44); -var isIntegralNumber = __webpack_require__(280); +var isIntegralNumber = __webpack_require__(282); var toLength = __webpack_require__(65); var toIndex = __webpack_require__(212); -var toOffset = __webpack_require__(437); -var toUint8Clamped = __webpack_require__(439); +var toOffset = __webpack_require__(441); +var toUint8Clamped = __webpack_require__(443); var toPropertyKey = __webpack_require__(18); var hasOwn = __webpack_require__(39); var classof = __webpack_require__(70); @@ -14145,7 +14271,7 @@ var create = __webpack_require__(72); var isPrototypeOf = __webpack_require__(25); var setPrototypeOf = __webpack_require__(116); var getOwnPropertyNames = __webpack_require__(58).f; -var typedArrayFrom = __webpack_require__(440); +var typedArrayFrom = __webpack_require__(444); var forEach = __webpack_require__(85).forEach; var setSpecies = __webpack_require__(194); var defineBuiltInAccessor = __webpack_require__(79); @@ -14368,7 +14494,7 @@ if (DESCRIPTORS) { /***/ }), -/* 436 */ +/* 440 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14398,12 +14524,12 @@ module.exports = !NATIVE_ARRAY_BUFFER_VIEWS || !fails(function () { /***/ }), -/* 437 */ +/* 441 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var toPositiveInteger = __webpack_require__(438); +var toPositiveInteger = __webpack_require__(442); var $RangeError = RangeError; @@ -14415,7 +14541,7 @@ module.exports = function (it, BYTES) { /***/ }), -/* 438 */ +/* 442 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14432,7 +14558,7 @@ module.exports = function (it) { /***/ }), -/* 439 */ +/* 443 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14446,7 +14572,7 @@ module.exports = function (it) { /***/ }), -/* 440 */ +/* 444 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14459,9 +14585,9 @@ var lengthOfArrayLike = __webpack_require__(64); var getIterator = __webpack_require__(135); var getIteratorMethod = __webpack_require__(136); var isArrayIteratorMethod = __webpack_require__(133); -var isBigIntArray = __webpack_require__(441); +var isBigIntArray = __webpack_require__(445); var aTypedArrayConstructor = __webpack_require__(218).aTypedArrayConstructor; -var toBigInt = __webpack_require__(442); +var toBigInt = __webpack_require__(446); module.exports = function from(source /* , mapfn, thisArg */) { var C = aConstructor(this); @@ -14495,7 +14621,7 @@ module.exports = function from(source /* , mapfn, thisArg */) { /***/ }), -/* 441 */ +/* 445 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14509,7 +14635,7 @@ module.exports = function (it) { /***/ }), -/* 442 */ +/* 446 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14529,12 +14655,12 @@ module.exports = function (argument) { /***/ }), -/* 443 */ +/* 447 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var createTypedArrayConstructor = __webpack_require__(435); +var createTypedArrayConstructor = __webpack_require__(439); // `Float64Array` constructor // https://tc39.es/ecma262/#sec-typedarray-objects @@ -14546,12 +14672,12 @@ createTypedArrayConstructor('Float64', function (init) { /***/ }), -/* 444 */ +/* 448 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var createTypedArrayConstructor = __webpack_require__(435); +var createTypedArrayConstructor = __webpack_require__(439); // `Int8Array` constructor // https://tc39.es/ecma262/#sec-typedarray-objects @@ -14563,12 +14689,12 @@ createTypedArrayConstructor('Int8', function (init) { /***/ }), -/* 445 */ +/* 449 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var createTypedArrayConstructor = __webpack_require__(435); +var createTypedArrayConstructor = __webpack_require__(439); // `Int16Array` constructor // https://tc39.es/ecma262/#sec-typedarray-objects @@ -14580,12 +14706,12 @@ createTypedArrayConstructor('Int16', function (init) { /***/ }), -/* 446 */ +/* 450 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var createTypedArrayConstructor = __webpack_require__(435); +var createTypedArrayConstructor = __webpack_require__(439); // `Int32Array` constructor // https://tc39.es/ecma262/#sec-typedarray-objects @@ -14597,12 +14723,12 @@ createTypedArrayConstructor('Int32', function (init) { /***/ }), -/* 447 */ +/* 451 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var createTypedArrayConstructor = __webpack_require__(435); +var createTypedArrayConstructor = __webpack_require__(439); // `Uint8Array` constructor // https://tc39.es/ecma262/#sec-typedarray-objects @@ -14614,12 +14740,12 @@ createTypedArrayConstructor('Uint8', function (init) { /***/ }), -/* 448 */ +/* 452 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var createTypedArrayConstructor = __webpack_require__(435); +var createTypedArrayConstructor = __webpack_require__(439); // `Uint8ClampedArray` constructor // https://tc39.es/ecma262/#sec-typedarray-objects @@ -14631,12 +14757,12 @@ createTypedArrayConstructor('Uint8', function (init) { /***/ }), -/* 449 */ +/* 453 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var createTypedArrayConstructor = __webpack_require__(435); +var createTypedArrayConstructor = __webpack_require__(439); // `Uint16Array` constructor // https://tc39.es/ecma262/#sec-typedarray-objects @@ -14648,12 +14774,12 @@ createTypedArrayConstructor('Uint16', function (init) { /***/ }), -/* 450 */ +/* 454 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var createTypedArrayConstructor = __webpack_require__(435); +var createTypedArrayConstructor = __webpack_require__(439); // `Uint32Array` constructor // https://tc39.es/ecma262/#sec-typedarray-objects @@ -14665,7 +14791,7 @@ createTypedArrayConstructor('Uint32', function (init) { /***/ }), -/* 451 */ +/* 455 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14689,7 +14815,7 @@ exportTypedArrayMethod('at', function at(index) { /***/ }), -/* 452 */ +/* 456 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14710,7 +14836,7 @@ exportTypedArrayMethod('copyWithin', function copyWithin(target, start /* , end /***/ }), -/* 453 */ +/* 457 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14729,14 +14855,14 @@ exportTypedArrayMethod('every', function every(callbackfn /* , thisArg */) { /***/ }), -/* 454 */ +/* 458 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var ArrayBufferViewCore = __webpack_require__(218); var $fill = __webpack_require__(150); -var toBigInt = __webpack_require__(442); +var toBigInt = __webpack_require__(446); var classof = __webpack_require__(70); var call = __webpack_require__(8); var uncurryThis = __webpack_require__(14); @@ -14765,14 +14891,14 @@ exportTypedArrayMethod('fill', function fill(value /* , start, end */) { /***/ }), -/* 455 */ +/* 459 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var ArrayBufferViewCore = __webpack_require__(218); var $filter = __webpack_require__(85).filter; -var fromSpeciesAndList = __webpack_require__(456); +var fromSpeciesAndList = __webpack_require__(460); var aTypedArray = ArrayBufferViewCore.aTypedArray; var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; @@ -14786,13 +14912,13 @@ exportTypedArrayMethod('filter', function filter(callbackfn /* , thisArg */) { /***/ }), -/* 456 */ +/* 460 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var arrayFromConstructorAndList = __webpack_require__(199); -var typedArraySpeciesConstructor = __webpack_require__(457); +var typedArraySpeciesConstructor = __webpack_require__(461); module.exports = function (instance, list) { return arrayFromConstructorAndList(typedArraySpeciesConstructor(instance), list); @@ -14800,7 +14926,7 @@ module.exports = function (instance, list) { /***/ }), -/* 457 */ +/* 461 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14819,7 +14945,7 @@ module.exports = function (originalArray) { /***/ }), -/* 458 */ +/* 462 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14838,7 +14964,7 @@ exportTypedArrayMethod('find', function find(predicate /* , thisArg */) { /***/ }), -/* 459 */ +/* 463 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14857,7 +14983,7 @@ exportTypedArrayMethod('findIndex', function findIndex(predicate /* , thisArg */ /***/ }), -/* 460 */ +/* 464 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14876,7 +15002,7 @@ exportTypedArrayMethod('findLast', function findLast(predicate /* , thisArg */) /***/ }), -/* 461 */ +/* 465 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14895,7 +15021,7 @@ exportTypedArrayMethod('findLastIndex', function findLastIndex(predicate /* , th /***/ }), -/* 462 */ +/* 466 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14914,14 +15040,14 @@ exportTypedArrayMethod('forEach', function forEach(callbackfn /* , thisArg */) { /***/ }), -/* 463 */ +/* 467 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = __webpack_require__(436); +var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = __webpack_require__(440); var exportTypedArrayStaticMethod = __webpack_require__(218).exportTypedArrayStaticMethod; -var typedArrayFrom = __webpack_require__(440); +var typedArrayFrom = __webpack_require__(444); // `%TypedArray%.from` method // https://tc39.es/ecma262/#sec-%typedarray%.from @@ -14929,7 +15055,7 @@ exportTypedArrayStaticMethod('from', typedArrayFrom, TYPED_ARRAYS_CONSTRUCTORS_R /***/ }), -/* 464 */ +/* 468 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14948,7 +15074,7 @@ exportTypedArrayMethod('includes', function includes(searchElement /* , fromInde /***/ }), -/* 465 */ +/* 469 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14967,7 +15093,7 @@ exportTypedArrayMethod('indexOf', function indexOf(searchElement /* , fromIndex /***/ }), -/* 466 */ +/* 470 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15020,7 +15146,7 @@ exportTypedArrayMethod(ITERATOR, typedArrayValues, GENERIC || !ITERATOR_IS_VALUE /***/ }), -/* 467 */ +/* 471 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15040,7 +15166,7 @@ exportTypedArrayMethod('join', function join(separator) { /***/ }), -/* 468 */ +/* 472 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15061,14 +15187,14 @@ exportTypedArrayMethod('lastIndexOf', function lastIndexOf(searchElement /* , fr /***/ }), -/* 469 */ +/* 473 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var ArrayBufferViewCore = __webpack_require__(218); var $map = __webpack_require__(85).map; -var typedArraySpeciesConstructor = __webpack_require__(457); +var typedArraySpeciesConstructor = __webpack_require__(461); var aTypedArray = ArrayBufferViewCore.aTypedArray; var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; @@ -15083,13 +15209,13 @@ exportTypedArrayMethod('map', function map(mapfn /* , thisArg */) { /***/ }), -/* 470 */ +/* 474 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var ArrayBufferViewCore = __webpack_require__(218); -var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = __webpack_require__(436); +var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = __webpack_require__(440); var aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor; var exportTypedArrayStaticMethod = ArrayBufferViewCore.exportTypedArrayStaticMethod; @@ -15106,7 +15232,7 @@ exportTypedArrayStaticMethod('of', function of(/* ...items */) { /***/ }), -/* 471 */ +/* 475 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15126,7 +15252,7 @@ exportTypedArrayMethod('reduce', function reduce(callbackfn /* , initialValue */ /***/ }), -/* 472 */ +/* 476 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15146,7 +15272,7 @@ exportTypedArrayMethod('reduceRight', function reduceRight(callbackfn /* , initi /***/ }), -/* 473 */ +/* 477 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15174,7 +15300,7 @@ exportTypedArrayMethod('reverse', function reverse() { /***/ }), -/* 474 */ +/* 478 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15183,7 +15309,7 @@ var global = __webpack_require__(4); var call = __webpack_require__(8); var ArrayBufferViewCore = __webpack_require__(218); var lengthOfArrayLike = __webpack_require__(64); -var toOffset = __webpack_require__(437); +var toOffset = __webpack_require__(441); var toIndexedObject = __webpack_require__(40); var fails = __webpack_require__(7); @@ -15225,13 +15351,13 @@ exportTypedArrayMethod('set', function set(arrayLike /* , offset */) { /***/ }), -/* 475 */ +/* 479 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var ArrayBufferViewCore = __webpack_require__(218); -var typedArraySpeciesConstructor = __webpack_require__(457); +var typedArraySpeciesConstructor = __webpack_require__(461); var fails = __webpack_require__(7); var arraySlice = __webpack_require__(97); @@ -15257,7 +15383,7 @@ exportTypedArrayMethod('slice', function slice(start, end) { /***/ }), -/* 476 */ +/* 480 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15276,7 +15402,7 @@ exportTypedArrayMethod('some', function some(callbackfn /* , thisArg */) { /***/ }), -/* 477 */ +/* 481 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15353,7 +15479,7 @@ exportTypedArrayMethod('sort', function sort(comparefn) { /***/ }), -/* 478 */ +/* 482 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15361,7 +15487,7 @@ exportTypedArrayMethod('sort', function sort(comparefn) { var ArrayBufferViewCore = __webpack_require__(218); var toLength = __webpack_require__(65); var toAbsoluteIndex = __webpack_require__(61); -var typedArraySpeciesConstructor = __webpack_require__(457); +var typedArraySpeciesConstructor = __webpack_require__(461); var aTypedArray = ArrayBufferViewCore.aTypedArray; var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; @@ -15382,7 +15508,7 @@ exportTypedArrayMethod('subarray', function subarray(begin, end) { /***/ }), -/* 479 */ +/* 483 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15421,7 +15547,7 @@ exportTypedArrayMethod('toLocaleString', function toLocaleString() { /***/ }), -/* 480 */ +/* 484 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15441,7 +15567,7 @@ exportTypedArrayMethod('toReversed', function toReversed() { /***/ }), -/* 481 */ +/* 485 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15467,7 +15593,7 @@ exportTypedArrayMethod('toSorted', function toSorted(compareFn) { /***/ }), -/* 482 */ +/* 486 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15496,16 +15622,16 @@ exportTypedArrayMethod('toString', arrayToString, IS_NOT_ARRAY_METHOD); /***/ }), -/* 483 */ +/* 487 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var arrayWith = __webpack_require__(206); var ArrayBufferViewCore = __webpack_require__(218); -var isBigIntArray = __webpack_require__(441); +var isBigIntArray = __webpack_require__(445); var toIntegerOrInfinity = __webpack_require__(62); -var toBigInt = __webpack_require__(442); +var toBigInt = __webpack_require__(446); var aTypedArray = ArrayBufferViewCore.aTypedArray; var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; @@ -15533,7 +15659,7 @@ exportTypedArrayMethod('with', { 'with': function (index, value) { /***/ }), -/* 484 */ +/* 488 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15585,17 +15711,17 @@ $({ global: true }, { /***/ }), -/* 485 */ +/* 489 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove this module from `core-js@4` since it's replaced to module below -__webpack_require__(486); +__webpack_require__(490); /***/ }), -/* 486 */ +/* 490 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15606,7 +15732,7 @@ var uncurryThis = __webpack_require__(14); var defineBuiltIns = __webpack_require__(210); var InternalMetadataModule = __webpack_require__(246); var collection = __webpack_require__(245); -var collectionWeak = __webpack_require__(487); +var collectionWeak = __webpack_require__(491); var isObject = __webpack_require__(20); var enforceInternalState = __webpack_require__(52).enforce; var fails = __webpack_require__(7); @@ -15711,7 +15837,7 @@ if (NATIVE_WEAK_MAP) if (IS_IE11) { /***/ }), -/* 487 */ +/* 491 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15849,23 +15975,23 @@ module.exports = { /***/ }), -/* 488 */ +/* 492 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove this module from `core-js@4` since it's replaced to module below -__webpack_require__(489); +__webpack_require__(493); /***/ }), -/* 489 */ +/* 493 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var collection = __webpack_require__(245); -var collectionWeak = __webpack_require__(487); +var collectionWeak = __webpack_require__(491); // `WeakSet` constructor // https://tc39.es/ecma262/#sec-weakset-constructor @@ -15875,7 +16001,7 @@ collection('WeakSet', function (init) { /***/ }), -/* 490 */ +/* 494 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15928,13 +16054,13 @@ $({ global: true, constructor: true, arity: 3 }, { /***/ }), -/* 491 */ +/* 495 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var fromAsync = __webpack_require__(492); +var fromAsync = __webpack_require__(496); // `Array.fromAsync` method // https://github.com/tc39/proposal-array-from-async @@ -15944,7 +16070,7 @@ $({ target: 'Array', stat: true }, { /***/ }), -/* 492 */ +/* 496 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15953,16 +16079,16 @@ var bind = __webpack_require__(86); var uncurryThis = __webpack_require__(14); var toObject = __webpack_require__(40); var isConstructor = __webpack_require__(91); -var getAsyncIterator = __webpack_require__(493); +var getAsyncIterator = __webpack_require__(497); var getIterator = __webpack_require__(135); -var getIteratorDirect = __webpack_require__(496); +var getIteratorDirect = __webpack_require__(500); var getIteratorMethod = __webpack_require__(136); var getMethod = __webpack_require__(30); var getBuiltIn = __webpack_require__(24); var getBuiltInPrototypeMethod = __webpack_require__(200); var wellKnownSymbol = __webpack_require__(34); -var AsyncFromSyncIterator = __webpack_require__(494); -var toArray = __webpack_require__(497).toArray; +var AsyncFromSyncIterator = __webpack_require__(498); +var toArray = __webpack_require__(501).toArray; var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator'); var arrayIterator = uncurryThis(getBuiltInPrototypeMethod('Array', 'values')); @@ -16002,16 +16128,16 @@ module.exports = function fromAsync(asyncItems /* , mapfn = undefined, thisArg = /***/ }), -/* 493 */ +/* 497 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var call = __webpack_require__(8); -var AsyncFromSyncIterator = __webpack_require__(494); +var AsyncFromSyncIterator = __webpack_require__(498); var anObject = __webpack_require__(47); var getIterator = __webpack_require__(135); -var getIteratorDirect = __webpack_require__(496); +var getIteratorDirect = __webpack_require__(500); var getMethod = __webpack_require__(30); var wellKnownSymbol = __webpack_require__(34); @@ -16024,7 +16150,7 @@ module.exports = function (it, usingIterator) { /***/ }), -/* 494 */ +/* 498 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16036,7 +16162,7 @@ var getMethod = __webpack_require__(30); var defineBuiltIns = __webpack_require__(210); var InternalStateModule = __webpack_require__(52); var getBuiltIn = __webpack_require__(24); -var AsyncIteratorPrototype = __webpack_require__(495); +var AsyncIteratorPrototype = __webpack_require__(499); var createIterResultObject = __webpack_require__(173); var Promise = getBuiltIn('Promise'); @@ -16080,7 +16206,7 @@ module.exports = AsyncFromSyncIterator; /***/ }), -/* 495 */ +/* 499 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16125,7 +16251,7 @@ module.exports = AsyncIteratorPrototype; /***/ }), -/* 496 */ +/* 500 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16142,7 +16268,7 @@ module.exports = function (obj) { /***/ }), -/* 497 */ +/* 501 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16155,8 +16281,8 @@ var anObject = __webpack_require__(47); var isObject = __webpack_require__(20); var doesNotExceedSafeInteger = __webpack_require__(142); var getBuiltIn = __webpack_require__(24); -var getIteratorDirect = __webpack_require__(496); -var closeAsyncIteration = __webpack_require__(498); +var getIteratorDirect = __webpack_require__(500); +var closeAsyncIteration = __webpack_require__(502); var createMethod = function (TYPE) { var IS_TO_ARRAY = TYPE === 0; @@ -16239,7 +16365,7 @@ module.exports = { /***/ }), -/* 498 */ +/* 502 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16265,7 +16391,7 @@ module.exports = function (iterator, method, argument, reject) { /***/ }), -/* 499 */ +/* 503 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16287,7 +16413,7 @@ addToUnscopables('filterOut'); /***/ }), -/* 500 */ +/* 504 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16308,13 +16434,13 @@ addToUnscopables('filterReject'); /***/ }), -/* 501 */ +/* 505 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var $group = __webpack_require__(502); +var $group = __webpack_require__(506); var addToUnscopables = __webpack_require__(140); // `Array.prototype.group` method @@ -16330,7 +16456,7 @@ addToUnscopables('group'); /***/ }), -/* 502 */ +/* 506 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16374,14 +16500,14 @@ module.exports = function ($this, callbackfn, that, specificConstructor) { /***/ }), -/* 503 */ +/* 507 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove from `core-js@4` var $ = __webpack_require__(3); -var $group = __webpack_require__(502); +var $group = __webpack_require__(506); var arrayMethodIsStrict = __webpack_require__(148); var addToUnscopables = __webpack_require__(140); @@ -16399,7 +16525,7 @@ addToUnscopables('groupBy'); /***/ }), -/* 504 */ +/* 508 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16408,7 +16534,7 @@ addToUnscopables('groupBy'); var $ = __webpack_require__(3); var arrayMethodIsStrict = __webpack_require__(148); var addToUnscopables = __webpack_require__(140); -var $groupToMap = __webpack_require__(505); +var $groupToMap = __webpack_require__(509); var IS_PURE = __webpack_require__(36); // `Array.prototype.groupByToMap` method @@ -16422,7 +16548,7 @@ addToUnscopables('groupByToMap'); /***/ }), -/* 505 */ +/* 509 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16432,7 +16558,7 @@ var uncurryThis = __webpack_require__(14); var IndexedObject = __webpack_require__(13); var toObject = __webpack_require__(40); var lengthOfArrayLike = __webpack_require__(64); -var MapHelpers = __webpack_require__(506); +var MapHelpers = __webpack_require__(252); var Map = MapHelpers.Map; var mapGet = MapHelpers.get; @@ -16460,36 +16586,14 @@ module.exports = function groupToMap(callbackfn /* , thisArg */) { /***/ }), -/* 506 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var uncurryThis = __webpack_require__(14); - -// eslint-disable-next-line es/no-map -- safe -var MapPrototype = Map.prototype; - -module.exports = { - // eslint-disable-next-line es/no-map -- safe - Map: Map, - set: uncurryThis(MapPrototype.set), - get: uncurryThis(MapPrototype.get), - has: uncurryThis(MapPrototype.has), - remove: uncurryThis(MapPrototype['delete']), - proto: MapPrototype -}; - - -/***/ }), -/* 507 */ +/* 510 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var addToUnscopables = __webpack_require__(140); -var $groupToMap = __webpack_require__(505); +var $groupToMap = __webpack_require__(509); var IS_PURE = __webpack_require__(36); // `Array.prototype.groupToMap` method @@ -16502,7 +16606,7 @@ addToUnscopables('groupToMap'); /***/ }), -/* 508 */ +/* 511 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16538,7 +16642,7 @@ $({ target: 'Array', stat: true, sham: true, forced: true }, { /***/ }), -/* 509 */ +/* 512 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16567,7 +16671,7 @@ if (DESCRIPTORS) { /***/ }), -/* 510 */ +/* 513 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16601,14 +16705,14 @@ if (DESCRIPTORS) { /***/ }), -/* 511 */ +/* 514 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var addToUnscopables = __webpack_require__(140); -var uniqueBy = __webpack_require__(512); +var uniqueBy = __webpack_require__(515); // `Array.prototype.uniqueBy` method // https://github.com/tc39/proposal-array-unique @@ -16620,7 +16724,7 @@ addToUnscopables('uniqueBy'); /***/ }), -/* 512 */ +/* 515 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16630,8 +16734,8 @@ var aCallable = __webpack_require__(31); var isNullOrUndefined = __webpack_require__(17); var lengthOfArrayLike = __webpack_require__(64); var toObject = __webpack_require__(40); -var MapHelpers = __webpack_require__(506); -var iterate = __webpack_require__(513); +var MapHelpers = __webpack_require__(252); +var iterate = __webpack_require__(516); var Map = MapHelpers.Map; var mapHas = MapHelpers.has; @@ -16662,14 +16766,14 @@ module.exports = function uniqueBy(resolver) { /***/ }), -/* 513 */ +/* 516 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var uncurryThis = __webpack_require__(14); -var iterateSimple = __webpack_require__(514); -var MapHelpers = __webpack_require__(506); +var iterateSimple = __webpack_require__(517); +var MapHelpers = __webpack_require__(252); var Map = MapHelpers.Map; var MapPrototype = MapHelpers.proto; @@ -16685,7 +16789,7 @@ module.exports = function (map, fn, interruptible) { /***/ }), -/* 514 */ +/* 517 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16704,14 +16808,14 @@ module.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) { /***/ }), -/* 515 */ +/* 518 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var DESCRIPTORS = __webpack_require__(6); var defineBuiltInAccessor = __webpack_require__(79); -var isDetached = __webpack_require__(516); +var isDetached = __webpack_require__(519); var ArrayBufferPrototype = ArrayBuffer.prototype; @@ -16726,13 +16830,13 @@ if (DESCRIPTORS && !('detached' in ArrayBufferPrototype)) { /***/ }), -/* 516 */ +/* 519 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var uncurryThis = __webpack_require__(14); -var arrayBufferByteLength = __webpack_require__(517); +var arrayBufferByteLength = __webpack_require__(520); var slice = uncurryThis(ArrayBuffer.prototype.slice); @@ -16748,7 +16852,7 @@ module.exports = function (O) { /***/ }), -/* 517 */ +/* 520 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16768,13 +16872,13 @@ module.exports = uncurryThisAccessor(ArrayBuffer.prototype, 'byteLength', 'get') /***/ }), -/* 518 */ +/* 521 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var $transfer = __webpack_require__(519); +var $transfer = __webpack_require__(522); // `ArrayBuffer.prototype.transfer` method // https://tc39.es/proposal-arraybuffer-transfer/#sec-arraybuffer.prototype.transfer @@ -16786,7 +16890,7 @@ if ($transfer) $({ target: 'ArrayBuffer', proto: true }, { /***/ }), -/* 519 */ +/* 522 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16795,10 +16899,10 @@ var global = __webpack_require__(4); var uncurryThis = __webpack_require__(14); var uncurryThisAccessor = __webpack_require__(117); var toIndex = __webpack_require__(212); -var isDetached = __webpack_require__(516); -var arrayBufferByteLength = __webpack_require__(517); -var detachTransferable = __webpack_require__(520); -var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(522); +var isDetached = __webpack_require__(519); +var arrayBufferByteLength = __webpack_require__(520); +var detachTransferable = __webpack_require__(523); +var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(525); var structuredClone = global.structuredClone; var ArrayBuffer = global.ArrayBuffer; @@ -16839,14 +16943,14 @@ module.exports = (PROPER_STRUCTURED_CLONE_TRANSFER || detachTransferable) && fun /***/ }), -/* 520 */ +/* 523 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var global = __webpack_require__(4); -var tryNodeRequire = __webpack_require__(521); -var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(522); +var tryNodeRequire = __webpack_require__(524); +var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(525); var structuredClone = global.structuredClone; var $ArrayBuffer = global.ArrayBuffer; @@ -16883,7 +16987,7 @@ module.exports = detach; /***/ }), -/* 521 */ +/* 524 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16899,7 +17003,7 @@ module.exports = function (name) { /***/ }), -/* 522 */ +/* 525 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16907,8 +17011,8 @@ module.exports = function (name) { var global = __webpack_require__(4); var fails = __webpack_require__(7); var V8 = __webpack_require__(28); -var IS_BROWSER = __webpack_require__(339); -var IS_DENO = __webpack_require__(340); +var IS_BROWSER = __webpack_require__(342); +var IS_DENO = __webpack_require__(343); var IS_NODE = __webpack_require__(183); var structuredClone = global.structuredClone; @@ -16924,13 +17028,13 @@ module.exports = !!structuredClone && !fails(function () { /***/ }), -/* 523 */ +/* 526 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var $transfer = __webpack_require__(519); +var $transfer = __webpack_require__(522); // `ArrayBuffer.prototype.transferToFixedLength` method // https://tc39.es/proposal-arraybuffer-transfer/#sec-arraybuffer.prototype.transfertofixedlength @@ -16942,7 +17046,7 @@ if ($transfer) $({ target: 'ArrayBuffer', proto: true }, { /***/ }), -/* 524 */ +/* 527 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16958,7 +17062,7 @@ var defineBuiltIns = __webpack_require__(210); var defineBuiltInAccessor = __webpack_require__(79); var wellKnownSymbol = __webpack_require__(34); var InternalStateModule = __webpack_require__(52); -var addDisposableResource = __webpack_require__(525); +var addDisposableResource = __webpack_require__(528); var Promise = getBuiltIn('Promise'); var SuppressedError = getBuiltIn('SuppressedError'); @@ -17079,7 +17183,7 @@ $({ global: true, constructor: true }, { /***/ }), -/* 525 */ +/* 528 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17141,7 +17245,7 @@ module.exports = function (disposable, V, hint, method) { /***/ }), -/* 526 */ +/* 529 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17152,7 +17256,7 @@ var getPrototypeOf = __webpack_require__(130); var createNonEnumerableProperty = __webpack_require__(44); var hasOwn = __webpack_require__(39); var wellKnownSymbol = __webpack_require__(34); -var AsyncIteratorPrototype = __webpack_require__(495); +var AsyncIteratorPrototype = __webpack_require__(499); var IS_PURE = __webpack_require__(36); var TO_STRING_TAG = wellKnownSymbol('toStringTag'); @@ -17182,14 +17286,14 @@ $({ global: true, constructor: true, forced: IS_PURE }, { /***/ }), -/* 527 */ +/* 530 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove from `core-js@4` var $ = __webpack_require__(3); -var indexed = __webpack_require__(528); +var indexed = __webpack_require__(531); // `AsyncIterator.prototype.asIndexedPairs` method // https://github.com/tc39/proposal-iterator-helpers @@ -17199,13 +17303,13 @@ $({ target: 'AsyncIterator', name: 'indexed', proto: true, real: true, forced: t /***/ }), -/* 528 */ +/* 531 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var call = __webpack_require__(8); -var map = __webpack_require__(529); +var map = __webpack_require__(532); var callback = function (value, counter) { return [counter, value]; @@ -17219,7 +17323,7 @@ module.exports = function indexed() { /***/ }), -/* 529 */ +/* 532 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17228,10 +17332,10 @@ var call = __webpack_require__(8); var aCallable = __webpack_require__(31); var anObject = __webpack_require__(47); var isObject = __webpack_require__(20); -var getIteratorDirect = __webpack_require__(496); -var createAsyncIteratorProxy = __webpack_require__(530); +var getIteratorDirect = __webpack_require__(500); +var createAsyncIteratorProxy = __webpack_require__(533); var createIterResultObject = __webpack_require__(173); -var closeAsyncIteration = __webpack_require__(498); +var closeAsyncIteration = __webpack_require__(502); var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var state = this; @@ -17283,13 +17387,13 @@ module.exports = function map(mapper) { /***/ }), -/* 530 */ +/* 533 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var call = __webpack_require__(8); -var perform = __webpack_require__(336); +var perform = __webpack_require__(339); var anObject = __webpack_require__(47); var create = __webpack_require__(72); var createNonEnumerableProperty = __webpack_require__(44); @@ -17298,7 +17402,7 @@ var wellKnownSymbol = __webpack_require__(34); var InternalStateModule = __webpack_require__(52); var getBuiltIn = __webpack_require__(24); var getMethod = __webpack_require__(30); -var AsyncIteratorPrototype = __webpack_require__(495); +var AsyncIteratorPrototype = __webpack_require__(499); var createIterResultObject = __webpack_require__(173); var iteratorClose = __webpack_require__(137); @@ -17395,7 +17499,7 @@ module.exports = function (nextHandler, IS_ITERATOR) { /***/ }), -/* 531 */ +/* 534 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17407,7 +17511,7 @@ var getBuiltIn = __webpack_require__(24); var getMethod = __webpack_require__(30); var hasOwn = __webpack_require__(39); var wellKnownSymbol = __webpack_require__(34); -var AsyncIteratorPrototype = __webpack_require__(495); +var AsyncIteratorPrototype = __webpack_require__(499); var ASYNC_DISPOSE = wellKnownSymbol('asyncDispose'); var Promise = getBuiltIn('Promise'); @@ -17428,7 +17532,7 @@ if (!hasOwn(AsyncIteratorPrototype, ASYNC_DISPOSE)) { /***/ }), -/* 532 */ +/* 535 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17436,10 +17540,10 @@ if (!hasOwn(AsyncIteratorPrototype, ASYNC_DISPOSE)) { var $ = __webpack_require__(3); var call = __webpack_require__(8); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); -var notANaN = __webpack_require__(533); -var toPositiveInteger = __webpack_require__(438); -var createAsyncIteratorProxy = __webpack_require__(530); +var getIteratorDirect = __webpack_require__(500); +var notANaN = __webpack_require__(536); +var toPositiveInteger = __webpack_require__(442); +var createAsyncIteratorProxy = __webpack_require__(533); var createIterResultObject = __webpack_require__(173); var IS_PURE = __webpack_require__(36); @@ -17486,7 +17590,7 @@ $({ target: 'AsyncIterator', proto: true, real: true, forced: IS_PURE }, { /***/ }), -/* 533 */ +/* 536 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17501,13 +17605,13 @@ module.exports = function (it) { /***/ }), -/* 534 */ +/* 537 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var $every = __webpack_require__(497).every; +var $every = __webpack_require__(501).every; // `AsyncIterator.prototype.every` method // https://github.com/tc39/proposal-async-iterator-helpers @@ -17519,7 +17623,7 @@ $({ target: 'AsyncIterator', proto: true, real: true }, { /***/ }), -/* 535 */ +/* 538 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17529,10 +17633,10 @@ var call = __webpack_require__(8); var aCallable = __webpack_require__(31); var anObject = __webpack_require__(47); var isObject = __webpack_require__(20); -var getIteratorDirect = __webpack_require__(496); -var createAsyncIteratorProxy = __webpack_require__(530); +var getIteratorDirect = __webpack_require__(500); +var createAsyncIteratorProxy = __webpack_require__(533); var createIterResultObject = __webpack_require__(173); -var closeAsyncIteration = __webpack_require__(498); +var closeAsyncIteration = __webpack_require__(502); var IS_PURE = __webpack_require__(36); var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { @@ -17593,13 +17697,13 @@ $({ target: 'AsyncIterator', proto: true, real: true, forced: IS_PURE }, { /***/ }), -/* 536 */ +/* 539 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var $find = __webpack_require__(497).find; +var $find = __webpack_require__(501).find; // `AsyncIterator.prototype.find` method // https://github.com/tc39/proposal-async-iterator-helpers @@ -17611,7 +17715,7 @@ $({ target: 'AsyncIterator', proto: true, real: true }, { /***/ }), -/* 537 */ +/* 540 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17621,11 +17725,11 @@ var call = __webpack_require__(8); var aCallable = __webpack_require__(31); var anObject = __webpack_require__(47); var isObject = __webpack_require__(20); -var getIteratorDirect = __webpack_require__(496); -var createAsyncIteratorProxy = __webpack_require__(530); +var getIteratorDirect = __webpack_require__(500); +var createAsyncIteratorProxy = __webpack_require__(533); var createIterResultObject = __webpack_require__(173); -var getAsyncIteratorFlattenable = __webpack_require__(538); -var closeAsyncIteration = __webpack_require__(498); +var getAsyncIteratorFlattenable = __webpack_require__(541); +var closeAsyncIteration = __webpack_require__(502); var IS_PURE = __webpack_require__(36); var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { @@ -17706,7 +17810,7 @@ $({ target: 'AsyncIterator', proto: true, real: true, forced: IS_PURE }, { /***/ }), -/* 538 */ +/* 541 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17714,11 +17818,11 @@ $({ target: 'AsyncIterator', proto: true, real: true, forced: IS_PURE }, { var call = __webpack_require__(8); var isCallable = __webpack_require__(21); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); +var getIteratorDirect = __webpack_require__(500); var getIteratorMethod = __webpack_require__(136); var getMethod = __webpack_require__(30); var wellKnownSymbol = __webpack_require__(34); -var AsyncFromSyncIterator = __webpack_require__(494); +var AsyncFromSyncIterator = __webpack_require__(498); var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator'); @@ -17743,13 +17847,13 @@ module.exports = function (obj) { /***/ }), -/* 539 */ +/* 542 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var $forEach = __webpack_require__(497).forEach; +var $forEach = __webpack_require__(501).forEach; // `AsyncIterator.prototype.forEach` method // https://github.com/tc39/proposal-async-iterator-helpers @@ -17761,7 +17865,7 @@ $({ target: 'AsyncIterator', proto: true, real: true }, { /***/ }), -/* 540 */ +/* 543 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17769,9 +17873,9 @@ $({ target: 'AsyncIterator', proto: true, real: true }, { var $ = __webpack_require__(3); var toObject = __webpack_require__(40); var isPrototypeOf = __webpack_require__(25); -var getAsyncIteratorFlattenable = __webpack_require__(538); -var AsyncIteratorPrototype = __webpack_require__(495); -var WrapAsyncIterator = __webpack_require__(541); +var getAsyncIteratorFlattenable = __webpack_require__(541); +var AsyncIteratorPrototype = __webpack_require__(499); +var WrapAsyncIterator = __webpack_require__(544); var IS_PURE = __webpack_require__(36); // `AsyncIterator.from` method @@ -17787,13 +17891,13 @@ $({ target: 'AsyncIterator', stat: true, forced: IS_PURE }, { /***/ }), -/* 541 */ +/* 544 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var call = __webpack_require__(8); -var createAsyncIteratorProxy = __webpack_require__(530); +var createAsyncIteratorProxy = __webpack_require__(533); module.exports = createAsyncIteratorProxy(function () { return call(this.next, this.iterator); @@ -17801,14 +17905,14 @@ module.exports = createAsyncIteratorProxy(function () { /***/ }), -/* 542 */ +/* 545 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove from `core-js@4` var $ = __webpack_require__(3); -var indexed = __webpack_require__(528); +var indexed = __webpack_require__(531); // `AsyncIterator.prototype.indexed` method // https://github.com/tc39/proposal-iterator-helpers @@ -17818,13 +17922,13 @@ $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, { /***/ }), -/* 543 */ +/* 546 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var map = __webpack_require__(529); +var map = __webpack_require__(532); var IS_PURE = __webpack_require__(36); // `AsyncIterator.prototype.map` method @@ -17836,7 +17940,7 @@ $({ target: 'AsyncIterator', proto: true, real: true, forced: IS_PURE }, { /***/ }), -/* 544 */ +/* 547 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17847,8 +17951,8 @@ var aCallable = __webpack_require__(31); var anObject = __webpack_require__(47); var isObject = __webpack_require__(20); var getBuiltIn = __webpack_require__(24); -var getIteratorDirect = __webpack_require__(496); -var closeAsyncIteration = __webpack_require__(498); +var getIteratorDirect = __webpack_require__(500); +var closeAsyncIteration = __webpack_require__(502); var Promise = getBuiltIn('Promise'); var $TypeError = TypeError; @@ -17908,13 +18012,13 @@ $({ target: 'AsyncIterator', proto: true, real: true }, { /***/ }), -/* 545 */ +/* 548 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var $some = __webpack_require__(497).some; +var $some = __webpack_require__(501).some; // `AsyncIterator.prototype.some` method // https://github.com/tc39/proposal-async-iterator-helpers @@ -17926,7 +18030,7 @@ $({ target: 'AsyncIterator', proto: true, real: true }, { /***/ }), -/* 546 */ +/* 549 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17934,10 +18038,10 @@ $({ target: 'AsyncIterator', proto: true, real: true }, { var $ = __webpack_require__(3); var call = __webpack_require__(8); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); -var notANaN = __webpack_require__(533); -var toPositiveInteger = __webpack_require__(438); -var createAsyncIteratorProxy = __webpack_require__(530); +var getIteratorDirect = __webpack_require__(500); +var notANaN = __webpack_require__(536); +var toPositiveInteger = __webpack_require__(442); +var createAsyncIteratorProxy = __webpack_require__(533); var createIterResultObject = __webpack_require__(173); var IS_PURE = __webpack_require__(36); @@ -17981,13 +18085,13 @@ $({ target: 'AsyncIterator', proto: true, real: true, forced: IS_PURE }, { /***/ }), -/* 547 */ +/* 550 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var $toArray = __webpack_require__(497).toArray; +var $toArray = __webpack_require__(501).toArray; // `AsyncIterator.prototype.toArray` method // https://github.com/tc39/proposal-async-iterator-helpers @@ -17999,14 +18103,14 @@ $({ target: 'AsyncIterator', proto: true, real: true }, { /***/ }), -/* 548 */ +/* 551 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* eslint-disable es/no-bigint -- safe */ var $ = __webpack_require__(3); -var NumericRangeIterator = __webpack_require__(549); +var NumericRangeIterator = __webpack_require__(552); // `BigInt.range` method // https://github.com/tc39/proposal-Number.range @@ -18021,7 +18125,7 @@ if (typeof BigInt == 'function') { /***/ }), -/* 549 */ +/* 552 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18134,14 +18238,14 @@ module.exports = $RangeIterator; /***/ }), -/* 550 */ +/* 553 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var apply = __webpack_require__(96); -var getCompositeKeyNode = __webpack_require__(551); +var getCompositeKeyNode = __webpack_require__(554); var getBuiltIn = __webpack_require__(24); var create = __webpack_require__(72); @@ -18161,14 +18265,14 @@ $({ global: true, forced: true }, { /***/ }), -/* 551 */ +/* 554 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env` __webpack_require__(243); -__webpack_require__(485); +__webpack_require__(489); var getBuiltIn = __webpack_require__(24); var create = __webpack_require__(72); var isObject = __webpack_require__(20); @@ -18218,13 +18322,13 @@ module.exports = function () { /***/ }), -/* 552 */ +/* 555 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var getCompositeKeyNode = __webpack_require__(551); +var getCompositeKeyNode = __webpack_require__(554); var getBuiltIn = __webpack_require__(24); var apply = __webpack_require__(96); @@ -18238,7 +18342,7 @@ $({ global: true, forced: true }, { /***/ }), -/* 553 */ +/* 556 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18261,7 +18365,7 @@ $({ target: 'DataView', proto: true }, { /***/ }), -/* 554 */ +/* 557 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18282,7 +18386,7 @@ $({ target: 'DataView', proto: true, forced: true }, { /***/ }), -/* 555 */ +/* 558 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18292,7 +18396,7 @@ var uncurryThis = __webpack_require__(14); var classof = __webpack_require__(70); var toIndex = __webpack_require__(212); var packIEEE754 = __webpack_require__(216).pack; -var f16round = __webpack_require__(556); +var f16round = __webpack_require__(559); var $TypeError = TypeError; // eslint-disable-next-line es/no-typed-arrays -- safe @@ -18311,7 +18415,7 @@ $({ target: 'DataView', proto: true }, { /***/ }), -/* 556 */ +/* 559 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18330,7 +18434,7 @@ module.exports = Math.f16round || function f16round(x) { /***/ }), -/* 557 */ +/* 560 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18339,7 +18443,7 @@ var $ = __webpack_require__(3); var uncurryThis = __webpack_require__(14); var classof = __webpack_require__(70); var toIndex = __webpack_require__(212); -var toUint8Clamped = __webpack_require__(439); +var toUint8Clamped = __webpack_require__(443); var $TypeError = TypeError; // eslint-disable-next-line es/no-typed-arrays -- safe @@ -18357,7 +18461,7 @@ $({ target: 'DataView', proto: true, forced: true }, { /***/ }), -/* 558 */ +/* 561 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18373,7 +18477,7 @@ var defineBuiltIns = __webpack_require__(210); var defineBuiltInAccessor = __webpack_require__(79); var wellKnownSymbol = __webpack_require__(34); var InternalStateModule = __webpack_require__(52); -var addDisposableResource = __webpack_require__(525); +var addDisposableResource = __webpack_require__(528); var SuppressedError = getBuiltIn('SuppressedError'); var $ReferenceError = ReferenceError; @@ -18478,13 +18582,13 @@ $({ global: true, constructor: true }, { /***/ }), -/* 559 */ +/* 562 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var demethodize = __webpack_require__(560); +var demethodize = __webpack_require__(563); // `Function.prototype.demethodize` method // https://github.com/js-choi/proposal-function-demethodize @@ -18494,7 +18598,7 @@ $({ target: 'Function', proto: true, forced: true }, { /***/ }), -/* 560 */ +/* 563 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18508,7 +18612,7 @@ module.exports = function demethodize() { /***/ }), -/* 561 */ +/* 564 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18545,7 +18649,7 @@ $({ target: 'Function', stat: true, sham: true, forced: true }, { /***/ }), -/* 562 */ +/* 565 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18561,7 +18665,7 @@ $({ target: 'Function', stat: true, forced: true }, { /***/ }), -/* 563 */ +/* 566 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18582,13 +18686,13 @@ if (FunctionPrototype[METADATA] === undefined) { /***/ }), -/* 564 */ +/* 567 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var demethodize = __webpack_require__(560); +var demethodize = __webpack_require__(563); // `Function.prototype.unThis` method // https://github.com/js-choi/proposal-function-demethodize @@ -18599,7 +18703,7 @@ $({ target: 'Function', proto: true, forced: true, name: 'demethodize' }, { /***/ }), -/* 565 */ +/* 568 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18607,19 +18711,24 @@ $({ target: 'Function', proto: true, forced: true, name: 'demethodize' }, { var $ = __webpack_require__(3); var global = __webpack_require__(4); var anInstance = __webpack_require__(211); +var anObject = __webpack_require__(47); var isCallable = __webpack_require__(21); var getPrototypeOf = __webpack_require__(130); -var createNonEnumerableProperty = __webpack_require__(44); +var defineBuiltInAccessor = __webpack_require__(79); +var createProperty = __webpack_require__(78); var fails = __webpack_require__(7); var hasOwn = __webpack_require__(39); var wellKnownSymbol = __webpack_require__(34); var IteratorPrototype = __webpack_require__(172).IteratorPrototype; +var DESCRIPTORS = __webpack_require__(6); var IS_PURE = __webpack_require__(36); +var CONSTRUCTOR = 'constructor'; +var ITERATOR = 'Iterator'; var TO_STRING_TAG = wellKnownSymbol('toStringTag'); var $TypeError = TypeError; -var NativeIterator = global.Iterator; +var NativeIterator = global[ITERATOR]; // FF56- have non-standard global helper `Iterator` var FORCED = IS_PURE @@ -18633,12 +18742,27 @@ var IteratorConstructor = function Iterator() { if (getPrototypeOf(this) === IteratorPrototype) throw new $TypeError('Abstract class Iterator not directly constructable'); }; -if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) { - createNonEnumerableProperty(IteratorPrototype, TO_STRING_TAG, 'Iterator'); -} +var defineIteratorPrototypeAccessor = function (key, value) { + if (DESCRIPTORS) { + defineBuiltInAccessor(IteratorPrototype, key, { + configurable: true, + get: function () { + return value; + }, + set: function (replacement) { + anObject(this); + if (this === IteratorPrototype) throw new $TypeError("You can't redefine this property"); + if (hasOwn(this, key)) this[key] = replacement; + else createProperty(this, key, replacement); + } + }); + } else IteratorPrototype[key] = value; +}; -if (FORCED || !hasOwn(IteratorPrototype, 'constructor') || IteratorPrototype.constructor === Object) { - createNonEnumerableProperty(IteratorPrototype, 'constructor', IteratorConstructor); +if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR); + +if (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) { + defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor); } IteratorConstructor.prototype = IteratorPrototype; @@ -18651,14 +18775,14 @@ $({ global: true, constructor: true, forced: FORCED }, { /***/ }), -/* 566 */ +/* 569 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove from `core-js@4` var $ = __webpack_require__(3); -var indexed = __webpack_require__(567); +var indexed = __webpack_require__(570); // `Iterator.prototype.asIndexedPairs` method // https://github.com/tc39/proposal-iterator-helpers @@ -18668,13 +18792,13 @@ $({ target: 'Iterator', name: 'indexed', proto: true, real: true, forced: true } /***/ }), -/* 567 */ +/* 570 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var call = __webpack_require__(8); -var map = __webpack_require__(568); +var map = __webpack_require__(571); var callback = function (value, counter) { return [counter, value]; @@ -18688,7 +18812,7 @@ module.exports = function indexed() { /***/ }), -/* 568 */ +/* 571 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18696,8 +18820,8 @@ module.exports = function indexed() { var call = __webpack_require__(8); var aCallable = __webpack_require__(31); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); -var createIteratorProxy = __webpack_require__(569); +var getIteratorDirect = __webpack_require__(500); +var createIteratorProxy = __webpack_require__(572); var callWithSafeIterationClosing = __webpack_require__(164); var IteratorProxy = createIteratorProxy(function () { @@ -18719,7 +18843,7 @@ module.exports = function map(mapper) { /***/ }), -/* 569 */ +/* 572 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18802,7 +18926,7 @@ module.exports = function (nextHandler, IS_ITERATOR) { /***/ }), -/* 570 */ +/* 573 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18826,7 +18950,7 @@ if (!hasOwn(IteratorPrototype, DISPOSE)) { /***/ }), -/* 571 */ +/* 574 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18834,10 +18958,10 @@ if (!hasOwn(IteratorPrototype, DISPOSE)) { var $ = __webpack_require__(3); var call = __webpack_require__(8); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); -var notANaN = __webpack_require__(533); -var toPositiveInteger = __webpack_require__(438); -var createIteratorProxy = __webpack_require__(569); +var getIteratorDirect = __webpack_require__(500); +var notANaN = __webpack_require__(536); +var toPositiveInteger = __webpack_require__(442); +var createIteratorProxy = __webpack_require__(572); var IS_PURE = __webpack_require__(36); var IteratorProxy = createIteratorProxy(function () { @@ -18869,7 +18993,7 @@ $({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { /***/ }), -/* 572 */ +/* 575 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18878,7 +19002,7 @@ var $ = __webpack_require__(3); var iterate = __webpack_require__(132); var aCallable = __webpack_require__(31); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); +var getIteratorDirect = __webpack_require__(500); // `Iterator.prototype.every` method // https://github.com/tc39/proposal-iterator-helpers @@ -18896,7 +19020,7 @@ $({ target: 'Iterator', proto: true, real: true }, { /***/ }), -/* 573 */ +/* 576 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18905,8 +19029,8 @@ var $ = __webpack_require__(3); var call = __webpack_require__(8); var aCallable = __webpack_require__(31); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); -var createIteratorProxy = __webpack_require__(569); +var getIteratorDirect = __webpack_require__(500); +var createIteratorProxy = __webpack_require__(572); var callWithSafeIterationClosing = __webpack_require__(164); var IS_PURE = __webpack_require__(36); @@ -18938,7 +19062,7 @@ $({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { /***/ }), -/* 574 */ +/* 577 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18947,7 +19071,7 @@ var $ = __webpack_require__(3); var iterate = __webpack_require__(132); var aCallable = __webpack_require__(31); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); +var getIteratorDirect = __webpack_require__(500); // `Iterator.prototype.find` method // https://github.com/tc39/proposal-iterator-helpers @@ -18965,7 +19089,7 @@ $({ target: 'Iterator', proto: true, real: true }, { /***/ }), -/* 575 */ +/* 578 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18974,9 +19098,9 @@ var $ = __webpack_require__(3); var call = __webpack_require__(8); var aCallable = __webpack_require__(31); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); -var getIteratorFlattenable = __webpack_require__(576); -var createIteratorProxy = __webpack_require__(569); +var getIteratorDirect = __webpack_require__(500); +var getIteratorFlattenable = __webpack_require__(579); +var createIteratorProxy = __webpack_require__(572); var iteratorClose = __webpack_require__(137); var IS_PURE = __webpack_require__(36); @@ -19017,14 +19141,14 @@ $({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { /***/ }), -/* 576 */ +/* 579 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var call = __webpack_require__(8); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); +var getIteratorDirect = __webpack_require__(500); var getIteratorMethod = __webpack_require__(136); module.exports = function (obj, stringHandling) { @@ -19035,7 +19159,7 @@ module.exports = function (obj, stringHandling) { /***/ }), -/* 577 */ +/* 580 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19044,7 +19168,7 @@ var $ = __webpack_require__(3); var iterate = __webpack_require__(132); var aCallable = __webpack_require__(31); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); +var getIteratorDirect = __webpack_require__(500); // `Iterator.prototype.forEach` method // https://github.com/tc39/proposal-iterator-helpers @@ -19062,7 +19186,7 @@ $({ target: 'Iterator', proto: true, real: true }, { /***/ }), -/* 578 */ +/* 581 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19072,8 +19196,8 @@ var call = __webpack_require__(8); var toObject = __webpack_require__(40); var isPrototypeOf = __webpack_require__(25); var IteratorPrototype = __webpack_require__(172).IteratorPrototype; -var createIteratorProxy = __webpack_require__(569); -var getIteratorFlattenable = __webpack_require__(576); +var createIteratorProxy = __webpack_require__(572); +var getIteratorFlattenable = __webpack_require__(579); var IS_PURE = __webpack_require__(36); var IteratorProxy = createIteratorProxy(function () { @@ -19093,14 +19217,14 @@ $({ target: 'Iterator', stat: true, forced: IS_PURE }, { /***/ }), -/* 579 */ +/* 582 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove from `core-js@4` var $ = __webpack_require__(3); -var indexed = __webpack_require__(567); +var indexed = __webpack_require__(570); // `Iterator.prototype.indexed` method // https://github.com/tc39/proposal-iterator-helpers @@ -19110,13 +19234,13 @@ $({ target: 'Iterator', proto: true, real: true, forced: true }, { /***/ }), -/* 580 */ +/* 583 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var map = __webpack_require__(568); +var map = __webpack_require__(571); var IS_PURE = __webpack_require__(36); // `Iterator.prototype.map` method @@ -19127,14 +19251,14 @@ $({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { /***/ }), -/* 581 */ +/* 584 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* eslint-disable es/no-bigint -- safe */ var $ = __webpack_require__(3); -var NumericRangeIterator = __webpack_require__(549); +var NumericRangeIterator = __webpack_require__(552); var $TypeError = TypeError; @@ -19150,7 +19274,7 @@ $({ target: 'Iterator', stat: true, forced: true }, { /***/ }), -/* 582 */ +/* 585 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19159,7 +19283,7 @@ var $ = __webpack_require__(3); var iterate = __webpack_require__(132); var aCallable = __webpack_require__(31); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); +var getIteratorDirect = __webpack_require__(500); var $TypeError = TypeError; @@ -19189,7 +19313,7 @@ $({ target: 'Iterator', proto: true, real: true }, { /***/ }), -/* 583 */ +/* 586 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19198,7 +19322,7 @@ var $ = __webpack_require__(3); var iterate = __webpack_require__(132); var aCallable = __webpack_require__(31); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); +var getIteratorDirect = __webpack_require__(500); // `Iterator.prototype.some` method // https://github.com/tc39/proposal-iterator-helpers @@ -19216,7 +19340,7 @@ $({ target: 'Iterator', proto: true, real: true }, { /***/ }), -/* 584 */ +/* 587 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19224,10 +19348,10 @@ $({ target: 'Iterator', proto: true, real: true }, { var $ = __webpack_require__(3); var call = __webpack_require__(8); var anObject = __webpack_require__(47); -var getIteratorDirect = __webpack_require__(496); -var notANaN = __webpack_require__(533); -var toPositiveInteger = __webpack_require__(438); -var createIteratorProxy = __webpack_require__(569); +var getIteratorDirect = __webpack_require__(500); +var notANaN = __webpack_require__(536); +var toPositiveInteger = __webpack_require__(442); +var createIteratorProxy = __webpack_require__(572); var iteratorClose = __webpack_require__(137); var IS_PURE = __webpack_require__(36); @@ -19256,7 +19380,7 @@ $({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { /***/ }), -/* 585 */ +/* 588 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19264,7 +19388,7 @@ $({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { var $ = __webpack_require__(3); var anObject = __webpack_require__(47); var iterate = __webpack_require__(132); -var getIteratorDirect = __webpack_require__(496); +var getIteratorDirect = __webpack_require__(500); var push = [].push; @@ -19280,16 +19404,16 @@ $({ target: 'Iterator', proto: true, real: true }, { /***/ }), -/* 586 */ +/* 589 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var anObject = __webpack_require__(47); -var AsyncFromSyncIterator = __webpack_require__(494); -var WrapAsyncIterator = __webpack_require__(541); -var getIteratorDirect = __webpack_require__(496); +var AsyncFromSyncIterator = __webpack_require__(498); +var WrapAsyncIterator = __webpack_require__(544); +var getIteratorDirect = __webpack_require__(500); var IS_PURE = __webpack_require__(36); // `Iterator.prototype.toAsync` method @@ -19302,14 +19426,14 @@ $({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { /***/ }), -/* 587 */ +/* 590 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var NATIVE_RAW_JSON = __webpack_require__(588); -var isRawJSON = __webpack_require__(589); +var NATIVE_RAW_JSON = __webpack_require__(591); +var isRawJSON = __webpack_require__(592); // `JSON.parse` method // https://tc39.es/proposal-json-parse-with-source/#sec-json.israwjson @@ -19320,7 +19444,7 @@ $({ target: 'JSON', stat: true, forced: !NATIVE_RAW_JSON }, { /***/ }), -/* 588 */ +/* 591 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19336,7 +19460,7 @@ module.exports = !fails(function () { /***/ }), -/* 589 */ +/* 592 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19352,7 +19476,7 @@ module.exports = function isRawJSON(O) { /***/ }), -/* 590 */ +/* 593 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19371,7 +19495,7 @@ var toString = __webpack_require__(69); var lengthOfArrayLike = __webpack_require__(64); var createProperty = __webpack_require__(78); var fails = __webpack_require__(7); -var parseJSONString = __webpack_require__(591); +var parseJSONString = __webpack_require__(594); var NATIVE_SYMBOL = __webpack_require__(27); var JSON = global.JSON; @@ -19610,7 +19734,7 @@ $({ target: 'JSON', stat: true, forced: NO_SOURCE_SUPPORT }, { /***/ }), -/* 591 */ +/* 594 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19673,22 +19797,22 @@ module.exports = function (source, i) { /***/ }), -/* 592 */ +/* 595 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var FREEZING = __webpack_require__(249); -var NATIVE_RAW_JSON = __webpack_require__(588); +var NATIVE_RAW_JSON = __webpack_require__(591); var getBuiltIn = __webpack_require__(24); var call = __webpack_require__(8); var uncurryThis = __webpack_require__(14); var isCallable = __webpack_require__(21); -var isRawJSON = __webpack_require__(589); +var isRawJSON = __webpack_require__(592); var toString = __webpack_require__(69); var createProperty = __webpack_require__(78); -var parseJSONString = __webpack_require__(591); +var parseJSONString = __webpack_require__(594); var getReplacerFunction = __webpack_require__(98); var uid = __webpack_require__(41); var setInternalState = __webpack_require__(52).set; @@ -19764,14 +19888,14 @@ if ($stringify) $({ target: 'JSON', stat: true, arity: 3, forced: !NATIVE_RAW_JS /***/ }), -/* 593 */ +/* 596 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var aMap = __webpack_require__(594); -var remove = __webpack_require__(506).remove; +var aMap = __webpack_require__(597); +var remove = __webpack_require__(252).remove; // `Map.prototype.deleteAll` method // https://github.com/tc39/proposal-collection-methods @@ -19789,12 +19913,12 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 594 */ +/* 597 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var has = __webpack_require__(506).has; +var has = __webpack_require__(252).has; // Perform ? RequireInternalSlot(M, [[MapData]]) module.exports = function (it) { @@ -19804,14 +19928,14 @@ module.exports = function (it) { /***/ }), -/* 595 */ +/* 598 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var aMap = __webpack_require__(594); -var MapHelpers = __webpack_require__(506); +var aMap = __webpack_require__(597); +var MapHelpers = __webpack_require__(252); var get = MapHelpers.get; var has = MapHelpers.has; @@ -19838,15 +19962,15 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 596 */ +/* 599 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var bind = __webpack_require__(86); -var aMap = __webpack_require__(594); -var iterate = __webpack_require__(513); +var aMap = __webpack_require__(597); +var iterate = __webpack_require__(516); // `Map.prototype.every` method // https://github.com/tc39/proposal-collection-methods @@ -19862,16 +19986,16 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 597 */ +/* 600 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var bind = __webpack_require__(86); -var aMap = __webpack_require__(594); -var MapHelpers = __webpack_require__(506); -var iterate = __webpack_require__(513); +var aMap = __webpack_require__(597); +var MapHelpers = __webpack_require__(252); +var iterate = __webpack_require__(516); var Map = MapHelpers.Map; var set = MapHelpers.set; @@ -19892,15 +20016,15 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 598 */ +/* 601 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var bind = __webpack_require__(86); -var aMap = __webpack_require__(594); -var iterate = __webpack_require__(513); +var aMap = __webpack_require__(597); +var iterate = __webpack_require__(516); // `Map.prototype.find` method // https://github.com/tc39/proposal-collection-methods @@ -19917,15 +20041,15 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 599 */ +/* 602 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var bind = __webpack_require__(86); -var aMap = __webpack_require__(594); -var iterate = __webpack_require__(513); +var aMap = __webpack_require__(597); +var iterate = __webpack_require__(516); // `Map.prototype.findKey` method // https://github.com/tc39/proposal-collection-methods @@ -19942,13 +20066,13 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 600 */ +/* 603 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var from = __webpack_require__(601); +var from = __webpack_require__(604); // `Map.from` method // https://tc39.github.io/proposal-setmap-offrom/#sec-map.from @@ -19958,7 +20082,7 @@ $({ target: 'Map', stat: true, forced: true }, { /***/ }), -/* 601 */ +/* 604 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19996,53 +20120,15 @@ module.exports = function from(source /* , mapFn, thisArg */) { /***/ }), -/* 602 */ +/* 605 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var uncurryThis = __webpack_require__(14); -var aCallable = __webpack_require__(31); -var requireObjectCoercible = __webpack_require__(16); -var iterate = __webpack_require__(132); -var MapHelpers = __webpack_require__(506); -var IS_PURE = __webpack_require__(36); - -var Map = MapHelpers.Map; -var has = MapHelpers.has; -var get = MapHelpers.get; -var set = MapHelpers.set; -var push = uncurryThis([].push); - -// `Map.groupBy` method -// https://github.com/tc39/proposal-array-grouping -$({ target: 'Map', stat: true, forced: IS_PURE }, { - groupBy: function groupBy(items, callbackfn) { - requireObjectCoercible(items); - aCallable(callbackfn); - var map = new Map(); - var k = 0; - iterate(items, function (value) { - var key = callbackfn(value, k++); - if (!has(map, key)) set(map, key, [value]); - else push(get(map, key), value); - }); - return map; - } -}); - - -/***/ }), -/* 603 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $ = __webpack_require__(3); -var sameValueZero = __webpack_require__(604); -var aMap = __webpack_require__(594); -var iterate = __webpack_require__(513); +var sameValueZero = __webpack_require__(606); +var aMap = __webpack_require__(597); +var iterate = __webpack_require__(516); // `Map.prototype.includes` method // https://github.com/tc39/proposal-collection-methods @@ -20056,7 +20142,7 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 604 */ +/* 606 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20070,7 +20156,7 @@ module.exports = function (x, y) { /***/ }), -/* 605 */ +/* 607 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20080,7 +20166,7 @@ var call = __webpack_require__(8); var iterate = __webpack_require__(132); var isCallable = __webpack_require__(21); var aCallable = __webpack_require__(31); -var Map = __webpack_require__(506).Map; +var Map = __webpack_require__(252).Map; // `Map.keyBy` method // https://github.com/tc39/proposal-collection-methods @@ -20099,14 +20185,14 @@ $({ target: 'Map', stat: true, forced: true }, { /***/ }), -/* 606 */ +/* 608 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var aMap = __webpack_require__(594); -var iterate = __webpack_require__(513); +var aMap = __webpack_require__(597); +var iterate = __webpack_require__(516); // `Map.prototype.keyOf` method // https://github.com/tc39/proposal-collection-methods @@ -20121,16 +20207,16 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 607 */ +/* 609 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var bind = __webpack_require__(86); -var aMap = __webpack_require__(594); -var MapHelpers = __webpack_require__(506); -var iterate = __webpack_require__(513); +var aMap = __webpack_require__(597); +var MapHelpers = __webpack_require__(252); +var iterate = __webpack_require__(516); var Map = MapHelpers.Map; var set = MapHelpers.set; @@ -20151,16 +20237,16 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 608 */ +/* 610 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var bind = __webpack_require__(86); -var aMap = __webpack_require__(594); -var MapHelpers = __webpack_require__(506); -var iterate = __webpack_require__(513); +var aMap = __webpack_require__(597); +var MapHelpers = __webpack_require__(252); +var iterate = __webpack_require__(516); var Map = MapHelpers.Map; var set = MapHelpers.set; @@ -20181,15 +20267,15 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 609 */ +/* 611 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var aMap = __webpack_require__(594); +var aMap = __webpack_require__(597); var iterate = __webpack_require__(132); -var set = __webpack_require__(506).set; +var set = __webpack_require__(252).set; // `Map.prototype.merge` method // https://github.com/tc39/proposal-collection-methods @@ -20210,13 +20296,13 @@ $({ target: 'Map', proto: true, real: true, arity: 1, forced: true }, { /***/ }), -/* 610 */ +/* 612 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var of = __webpack_require__(611); +var of = __webpack_require__(613); // `Map.of` method // https://tc39.github.io/proposal-setmap-offrom/#sec-map.of @@ -20226,7 +20312,7 @@ $({ target: 'Map', stat: true, forced: true }, { /***/ }), -/* 611 */ +/* 613 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20240,15 +20326,15 @@ module.exports = function of() { /***/ }), -/* 612 */ +/* 614 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var aCallable = __webpack_require__(31); -var aMap = __webpack_require__(594); -var iterate = __webpack_require__(513); +var aMap = __webpack_require__(597); +var iterate = __webpack_require__(516); var $TypeError = TypeError; @@ -20275,15 +20361,15 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 613 */ +/* 615 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var bind = __webpack_require__(86); -var aMap = __webpack_require__(594); -var iterate = __webpack_require__(513); +var aMap = __webpack_require__(597); +var iterate = __webpack_require__(516); // `Map.prototype.some` method // https://github.com/tc39/proposal-collection-methods @@ -20299,15 +20385,15 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 614 */ +/* 616 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var aCallable = __webpack_require__(31); -var aMap = __webpack_require__(594); -var MapHelpers = __webpack_require__(506); +var aMap = __webpack_require__(597); +var MapHelpers = __webpack_require__(252); var $TypeError = TypeError; var get = MapHelpers.get; @@ -20333,14 +20419,14 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 615 */ +/* 617 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: remove from `core-js@4` var $ = __webpack_require__(3); -var upsert = __webpack_require__(616); +var upsert = __webpack_require__(618); // `Map.prototype.updateOrInsert` method (replaced by `Map.prototype.emplace`) // https://github.com/thumbsupep/proposal-upsert @@ -20350,7 +20436,7 @@ $({ target: 'Map', proto: true, real: true, name: 'upsert', forced: true }, { /***/ }), -/* 616 */ +/* 618 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20388,14 +20474,14 @@ module.exports = function upsert(key, updateFn /* , insertFn */) { /***/ }), -/* 617 */ +/* 619 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: remove from `core-js@4` var $ = __webpack_require__(3); -var upsert = __webpack_require__(616); +var upsert = __webpack_require__(618); // `Map.prototype.upsert` method (replaced by `Map.prototype.emplace`) // https://github.com/thumbsupep/proposal-upsert @@ -20405,7 +20491,7 @@ $({ target: 'Map', proto: true, real: true, forced: true }, { /***/ }), -/* 618 */ +/* 620 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20425,7 +20511,7 @@ $({ target: 'Math', stat: true, forced: true }, { /***/ }), -/* 619 */ +/* 621 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20440,7 +20526,7 @@ $({ target: 'Math', stat: true, nonConfigurable: true, nonWritable: true }, { /***/ }), -/* 620 */ +/* 622 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20459,14 +20545,14 @@ $({ target: 'Math', stat: true, forced: true }, { /***/ }), -/* 621 */ +/* 623 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var scale = __webpack_require__(622); +var scale = __webpack_require__(624); var fround = __webpack_require__(213); // `Math.fscale` method @@ -20479,7 +20565,7 @@ $({ target: 'Math', stat: true, forced: true }, { /***/ }), -/* 622 */ +/* 624 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20500,13 +20586,13 @@ module.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) /***/ }), -/* 623 */ +/* 625 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var f16round = __webpack_require__(556); +var f16round = __webpack_require__(559); // `Math.f16round` method // https://github.com/tc39/proposal-float16array @@ -20514,7 +20600,7 @@ $({ target: 'Math', stat: true }, { f16round: f16round }); /***/ }), -/* 624 */ +/* 626 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20535,7 +20621,7 @@ $({ target: 'Math', stat: true, forced: true }, { /***/ }), -/* 625 */ +/* 627 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20561,7 +20647,7 @@ $({ target: 'Math', stat: true, forced: true }, { /***/ }), -/* 626 */ +/* 628 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20582,7 +20668,7 @@ $({ target: 'Math', stat: true, forced: true }, { /***/ }), -/* 627 */ +/* 629 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20597,7 +20683,7 @@ $({ target: 'Math', stat: true, nonConfigurable: true, nonWritable: true }, { /***/ }), -/* 628 */ +/* 630 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20616,13 +20702,13 @@ $({ target: 'Math', stat: true, forced: true }, { /***/ }), -/* 629 */ +/* 631 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var scale = __webpack_require__(622); +var scale = __webpack_require__(624); // `Math.scale` method // https://rwaldron.github.io/proposal-math-extensions/ @@ -20632,14 +20718,14 @@ $({ target: 'Math', stat: true, forced: true }, { /***/ }), -/* 630 */ +/* 632 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var anObject = __webpack_require__(47); -var numberIsFinite = __webpack_require__(278); +var numberIsFinite = __webpack_require__(280); var createIteratorConstructor = __webpack_require__(171); var createIterResultObject = __webpack_require__(173); var InternalStateModule = __webpack_require__(52); @@ -20675,7 +20761,7 @@ $({ target: 'Math', stat: true, forced: true }, { /***/ }), -/* 631 */ +/* 633 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20694,7 +20780,7 @@ $({ target: 'Math', stat: true, forced: true }, { /***/ }), -/* 632 */ +/* 634 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20720,7 +20806,7 @@ $({ target: 'Math', stat: true, forced: true }, { /***/ }), -/* 633 */ +/* 635 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20728,13 +20814,13 @@ $({ target: 'Math', stat: true, forced: true }, { var $ = __webpack_require__(3); var uncurryThis = __webpack_require__(14); var toIntegerOrInfinity = __webpack_require__(62); -var parseInt = __webpack_require__(288); var INVALID_NUMBER_REPRESENTATION = 'Invalid number representation'; var INVALID_RADIX = 'Invalid radix'; var $RangeError = RangeError; var $SyntaxError = SyntaxError; var $TypeError = TypeError; +var $parseInt = parseInt; var pow = Math.pow; var valid = /^[\d.a-z]+$/; var charAt = uncurryThis(''.charAt); @@ -20759,22 +20845,22 @@ $({ target: 'Number', stat: true, forced: true }, { if (R < 2 || R > 36) throw new $RangeError(INVALID_RADIX); if (!exec(valid, string)) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION); var parts = split(string, '.'); - var mathNum = parseInt(parts[0], R); - if (parts.length > 1) mathNum += parseInt(parts[1], R) / pow(R, parts[1].length); - if (numberToString(mathNum, R) !== string) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION); + var mathNum = $parseInt(parts[0], R); + if (parts.length > 1) mathNum += $parseInt(parts[1], R) / pow(R, parts[1].length); + if (R === 10 && numberToString(mathNum, R) !== string) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION); return sign * mathNum; } }); /***/ }), -/* 634 */ +/* 636 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var NumericRangeIterator = __webpack_require__(549); +var NumericRangeIterator = __webpack_require__(552); // `Number.range` method // https://github.com/tc39/proposal-Number.range @@ -20787,14 +20873,14 @@ $({ target: 'Number', stat: true, forced: true }, { /***/ }), -/* 635 */ +/* 637 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove from `core-js@4` var $ = __webpack_require__(3); -var ObjectIterator = __webpack_require__(636); +var ObjectIterator = __webpack_require__(638); // `Object.iterateEntries` method // https://github.com/tc39/proposal-object-iteration @@ -20806,7 +20892,7 @@ $({ target: 'Object', stat: true, forced: true }, { /***/ }), -/* 636 */ +/* 638 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20851,14 +20937,14 @@ module.exports = createIteratorConstructor(function ObjectIterator(source, mode) /***/ }), -/* 637 */ +/* 639 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove from `core-js@4` var $ = __webpack_require__(3); -var ObjectIterator = __webpack_require__(636); +var ObjectIterator = __webpack_require__(638); // `Object.iterateKeys` method // https://github.com/tc39/proposal-object-iteration @@ -20870,14 +20956,14 @@ $({ target: 'Object', stat: true, forced: true }, { /***/ }), -/* 638 */ +/* 640 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove from `core-js@4` var $ = __webpack_require__(3); -var ObjectIterator = __webpack_require__(636); +var ObjectIterator = __webpack_require__(638); // `Object.iterateValues` method // https://github.com/tc39/proposal-object-iteration @@ -20889,56 +20975,19 @@ $({ target: 'Object', stat: true, forced: true }, { /***/ }), -/* 639 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $ = __webpack_require__(3); -var getBuiltIn = __webpack_require__(24); -var uncurryThis = __webpack_require__(14); -var aCallable = __webpack_require__(31); -var requireObjectCoercible = __webpack_require__(16); -var toPropertyKey = __webpack_require__(18); -var iterate = __webpack_require__(132); - -var create = getBuiltIn('Object', 'create'); -var push = uncurryThis([].push); - -// `Object.groupBy` method -// https://github.com/tc39/proposal-array-grouping -$({ target: 'Object', stat: true }, { - groupBy: function groupBy(items, callbackfn) { - requireObjectCoercible(items); - aCallable(callbackfn); - var obj = create(null); - var k = 0; - iterate(items, function (value) { - var key = toPropertyKey(callbackfn(value, k++)); - // in some IE versions, `hasOwnProperty` returns incorrect result on integer keys - // but since it's a `null` prototype object, we can safely use `in` - if (key in obj) push(obj[key], value); - else obj[key] = [value]; - }); - return obj; - } -}); - - -/***/ }), -/* 640 */ +/* 641 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove this module from `core-js@4` since it's split to modules listed below -__webpack_require__(641); __webpack_require__(642); __webpack_require__(643); +__webpack_require__(644); /***/ }), -/* 641 */ +/* 642 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20958,7 +21007,7 @@ var getMethod = __webpack_require__(30); var defineBuiltIn = __webpack_require__(48); var defineBuiltIns = __webpack_require__(210); var defineBuiltInAccessor = __webpack_require__(79); -var hostReportErrors = __webpack_require__(335); +var hostReportErrors = __webpack_require__(338); var wellKnownSymbol = __webpack_require__(34); var InternalStateModule = __webpack_require__(52); @@ -21132,7 +21181,7 @@ setSpecies(OBSERVABLE); /***/ }), -/* 642 */ +/* 643 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -21174,7 +21223,7 @@ $({ target: 'Observable', stat: true, forced: true }, { /***/ }), -/* 643 */ +/* 644 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -21205,15 +21254,15 @@ $({ target: 'Observable', stat: true, forced: true }, { /***/ }), -/* 644 */ +/* 645 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove from `core-js@4` var $ = __webpack_require__(3); -var newPromiseCapabilityModule = __webpack_require__(341); -var perform = __webpack_require__(336); +var newPromiseCapabilityModule = __webpack_require__(344); +var perform = __webpack_require__(339); // `Promise.try` method // https://github.com/tc39/proposal-promise-try @@ -21227,29 +21276,6 @@ $({ target: 'Promise', stat: true, forced: true }, { }); -/***/ }), -/* 645 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $ = __webpack_require__(3); -var newPromiseCapabilityModule = __webpack_require__(341); - -// `Promise.withResolvers` method -// https://github.com/tc39/proposal-promise-with-resolvers -$({ target: 'Promise', stat: true }, { - withResolvers: function withResolvers() { - var promiseCapability = newPromiseCapabilityModule.f(this); - return { - promise: promiseCapability.promise, - resolve: promiseCapability.resolve, - reject: promiseCapability.reject - }; - } -}); - - /***/ }), /* 646 */ /***/ (function(module, exports, __webpack_require__) { @@ -21282,7 +21308,7 @@ $({ target: 'Reflect', stat: true }, { // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env` __webpack_require__(243); -__webpack_require__(485); +__webpack_require__(489); var getBuiltIn = __webpack_require__(24); var uncurryThis = __webpack_require__(14); var shared = __webpack_require__(35); @@ -21417,7 +21443,7 @@ var uncurryThis = __webpack_require__(14); var ReflectMetadataModule = __webpack_require__(647); var anObject = __webpack_require__(47); var getPrototypeOf = __webpack_require__(130); -var $arrayUniqueBy = __webpack_require__(512); +var $arrayUniqueBy = __webpack_require__(515); var arrayUniqueBy = uncurryThis($arrayUniqueBy); var concat = uncurryThis([].concat); @@ -21579,7 +21605,7 @@ $({ target: 'Reflect', stat: true }, { var $ = __webpack_require__(3); var uncurryThis = __webpack_require__(14); var toString = __webpack_require__(69); -var WHITESPACES = __webpack_require__(275); +var WHITESPACES = __webpack_require__(277); var charCodeAt = uncurryThis(''.charCodeAt); var replace = uncurryThis(''.replace); @@ -21709,7 +21735,7 @@ var clone = __webpack_require__(663); var size = __webpack_require__(665); var getSetRecord = __webpack_require__(666); var iterateSet = __webpack_require__(664); -var iterateSimple = __webpack_require__(514); +var iterateSimple = __webpack_require__(517); var has = SetHelpers.has; var remove = SetHelpers.remove; @@ -21758,7 +21784,7 @@ module.exports = function (set) { "use strict"; var uncurryThis = __webpack_require__(14); -var iterateSimple = __webpack_require__(514); +var iterateSimple = __webpack_require__(517); var SetHelpers = __webpack_require__(659); var Set = SetHelpers.Set; @@ -21796,7 +21822,7 @@ var aCallable = __webpack_require__(31); var anObject = __webpack_require__(47); var call = __webpack_require__(8); var toIntegerOrInfinity = __webpack_require__(62); -var getIteratorDirect = __webpack_require__(496); +var getIteratorDirect = __webpack_require__(500); var INVALID_SIZE = 'Invalid size'; var $RangeError = RangeError; @@ -22038,7 +22064,7 @@ $({ target: 'Set', proto: true, real: true, forced: true }, { "use strict"; var $ = __webpack_require__(3); -var from = __webpack_require__(601); +var from = __webpack_require__(604); // `Set.from` method // https://tc39.github.io/proposal-setmap-offrom/#sec-set.from @@ -22081,7 +22107,7 @@ var SetHelpers = __webpack_require__(659); var size = __webpack_require__(665); var getSetRecord = __webpack_require__(666); var iterateSet = __webpack_require__(664); -var iterateSimple = __webpack_require__(514); +var iterateSimple = __webpack_require__(517); var Set = SetHelpers.Set; var add = SetHelpers.add; @@ -22157,7 +22183,7 @@ var has = __webpack_require__(659).has; var size = __webpack_require__(665); var getSetRecord = __webpack_require__(666); var iterateSet = __webpack_require__(664); -var iterateSimple = __webpack_require__(514); +var iterateSimple = __webpack_require__(517); var iteratorClose = __webpack_require__(137); // `Set.prototype.isDisjointFrom` method @@ -22284,7 +22310,7 @@ var aSet = __webpack_require__(658); var has = __webpack_require__(659).has; var size = __webpack_require__(665); var getSetRecord = __webpack_require__(666); -var iterateSimple = __webpack_require__(514); +var iterateSimple = __webpack_require__(517); var iteratorClose = __webpack_require__(137); // `Set.prototype.isSupersetOf` method @@ -22388,7 +22414,7 @@ $({ target: 'Set', proto: true, real: true, forced: true }, { "use strict"; var $ = __webpack_require__(3); -var of = __webpack_require__(611); +var of = __webpack_require__(613); // `Set.of` method // https://tc39.github.io/proposal-setmap-offrom/#sec-set.of @@ -22483,7 +22509,7 @@ var aSet = __webpack_require__(658); var SetHelpers = __webpack_require__(659); var clone = __webpack_require__(663); var getSetRecord = __webpack_require__(666); -var iterateSimple = __webpack_require__(514); +var iterateSimple = __webpack_require__(517); var add = SetHelpers.add; var has = SetHelpers.has; @@ -22551,7 +22577,7 @@ var aSet = __webpack_require__(658); var add = __webpack_require__(659).add; var clone = __webpack_require__(663); var getSetRecord = __webpack_require__(666); -var iterateSimple = __webpack_require__(514); +var iterateSimple = __webpack_require__(517); // `Set.prototype.union` method // https://github.com/tc39/proposal-set-methods @@ -22595,7 +22621,7 @@ $({ target: 'Set', proto: true, real: true, forced: true }, { // TODO: Remove from `core-js@4` var $ = __webpack_require__(3); -var charAt = __webpack_require__(385).charAt; +var charAt = __webpack_require__(389).charAt; var requireObjectCoercible = __webpack_require__(16); var toIntegerOrInfinity = __webpack_require__(62); var toString = __webpack_require__(69); @@ -22675,7 +22701,7 @@ var createIterResultObject = __webpack_require__(173); var requireObjectCoercible = __webpack_require__(16); var toString = __webpack_require__(69); var InternalStateModule = __webpack_require__(52); -var StringMultibyteModule = __webpack_require__(385); +var StringMultibyteModule = __webpack_require__(389); var codeAt = StringMultibyteModule.codeAt; var charAt = StringMultibyteModule.charAt; @@ -22718,8 +22744,6 @@ $({ target: 'String', proto: true, forced: true }, { var FREEZING = __webpack_require__(249); var $ = __webpack_require__(3); -var shared = __webpack_require__(35); -var getBuiltIn = __webpack_require__(24); var makeBuiltIn = __webpack_require__(49); var uncurryThis = __webpack_require__(14); var apply = __webpack_require__(96); @@ -22729,18 +22753,15 @@ var isCallable = __webpack_require__(21); var lengthOfArrayLike = __webpack_require__(64); var defineProperty = __webpack_require__(45).f; var createArrayFromList = __webpack_require__(77); +var WeakMapHelpers = __webpack_require__(703); var cooked = __webpack_require__(700); -var parse = __webpack_require__(703); -var whitespaces = __webpack_require__(275); +var parse = __webpack_require__(704); +var whitespaces = __webpack_require__(277); -var WeakMap = getBuiltIn('WeakMap'); -var globalDedentRegistry = shared('GlobalDedentRegistry', new WeakMap()); - -/* eslint-disable no-self-assign -- prototype methods protection */ -globalDedentRegistry.has = globalDedentRegistry.has; -globalDedentRegistry.get = globalDedentRegistry.get; -globalDedentRegistry.set = globalDedentRegistry.set; -/* eslint-enable no-self-assign -- prototype methods protection */ +var DedentMap = new WeakMapHelpers.WeakMap(); +var weakMapGet = WeakMapHelpers.get; +var weakMapHas = WeakMapHelpers.has; +var weakMapSet = WeakMapHelpers.set; var $Array = Array; var $TypeError = TypeError; @@ -22765,14 +22786,14 @@ var dedentTemplateStringsArray = function (template) { var rawInput = template.raw; // https://github.com/tc39/proposal-string-dedent/issues/75 if (FREEZING && !isFrozen(rawInput)) throw new $TypeError('Raw template should be frozen'); - if (globalDedentRegistry.has(rawInput)) return globalDedentRegistry.get(rawInput); + if (weakMapHas(DedentMap, rawInput)) return weakMapGet(DedentMap, rawInput); var raw = dedentStringsArray(rawInput); var cookedArr = cookStrings(raw); defineProperty(cookedArr, 'raw', { value: freeze(raw) }); freeze(cookedArr); - globalDedentRegistry.set(rawInput, cookedArr); + weakMapSet(DedentMap, rawInput, cookedArr); return cookedArr; }; @@ -22880,6 +22901,27 @@ $({ target: 'String', stat: true, forced: true }, { "use strict"; +var uncurryThis = __webpack_require__(14); + +// eslint-disable-next-line es/no-weak-map -- safe +var WeakMapPrototype = WeakMap.prototype; + +module.exports = { + // eslint-disable-next-line es/no-weak-map -- safe + WeakMap: WeakMap, + set: uncurryThis(WeakMapPrototype.set), + get: uncurryThis(WeakMapPrototype.get), + has: uncurryThis(WeakMapPrototype.has), + remove: uncurryThis(WeakMapPrototype['delete']) +}; + + +/***/ }), +/* 704 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + // adapted from https://github.com/jridgewell/string-dedent var getBuiltIn = __webpack_require__(24); var uncurryThis = __webpack_require__(14); @@ -23001,7 +23043,7 @@ module.exports = function (raw) { /***/ }), -/* 704 */ +/* 705 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23029,7 +23071,7 @@ if (Symbol) { /***/ }), -/* 705 */ +/* 706 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23057,13 +23099,13 @@ if (Symbol) { /***/ }), -/* 706 */ +/* 707 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var isRegisteredSymbol = __webpack_require__(707); +var isRegisteredSymbol = __webpack_require__(708); // `Symbol.isRegisteredSymbol` method // https://tc39.es/proposal-symbol-predicates/#sec-symbol-isregisteredsymbol @@ -23073,7 +23115,7 @@ $({ target: 'Symbol', stat: true }, { /***/ }), -/* 707 */ +/* 708 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23097,13 +23139,13 @@ module.exports = Symbol.isRegisteredSymbol || function isRegisteredSymbol(value) /***/ }), -/* 708 */ +/* 709 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var isRegisteredSymbol = __webpack_require__(707); +var isRegisteredSymbol = __webpack_require__(708); // `Symbol.isRegistered` method // obsolete version of https://tc39.es/proposal-symbol-predicates/#sec-symbol-isregisteredsymbol @@ -23113,13 +23155,13 @@ $({ target: 'Symbol', stat: true, name: 'isRegisteredSymbol' }, { /***/ }), -/* 709 */ +/* 710 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var isWellKnownSymbol = __webpack_require__(710); +var isWellKnownSymbol = __webpack_require__(711); // `Symbol.isWellKnownSymbol` method // https://tc39.es/proposal-symbol-predicates/#sec-symbol-iswellknownsymbol @@ -23130,7 +23172,7 @@ $({ target: 'Symbol', stat: true, forced: true }, { /***/ }), -/* 710 */ +/* 711 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23172,13 +23214,13 @@ module.exports = function isWellKnownSymbol(value) { /***/ }), -/* 711 */ +/* 712 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var isWellKnownSymbol = __webpack_require__(710); +var isWellKnownSymbol = __webpack_require__(711); // `Symbol.isWellKnown` method // obsolete version of https://tc39.es/proposal-symbol-predicates/#sec-symbol-iswellknownsymbol @@ -23189,7 +23231,7 @@ $({ target: 'Symbol', stat: true, name: 'isWellKnownSymbol', forced: true }, { /***/ }), -/* 712 */ +/* 713 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23202,7 +23244,7 @@ defineWellKnownSymbol('matcher'); /***/ }), -/* 713 */ +/* 714 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23215,7 +23257,7 @@ defineWellKnownSymbol('metadata'); /***/ }), -/* 714 */ +/* 715 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23229,7 +23271,7 @@ defineWellKnownSymbol('metadataKey'); /***/ }), -/* 715 */ +/* 716 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23242,7 +23284,7 @@ defineWellKnownSymbol('observable'); /***/ }), -/* 716 */ +/* 717 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23256,7 +23298,7 @@ defineWellKnownSymbol('patternMatch'); /***/ }), -/* 717 */ +/* 718 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23268,7 +23310,7 @@ defineWellKnownSymbol('replaceAll'); /***/ }), -/* 718 */ +/* 719 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23276,7 +23318,7 @@ defineWellKnownSymbol('replaceAll'); // TODO: Remove from `core-js@4` var getBuiltIn = __webpack_require__(24); var aConstructor = __webpack_require__(221); -var arrayFromAsync = __webpack_require__(492); +var arrayFromAsync = __webpack_require__(496); var ArrayBufferViewCore = __webpack_require__(218); var arrayFromConstructorAndList = __webpack_require__(199); @@ -23300,7 +23342,7 @@ exportTypedArrayStaticMethod('fromAsync', function fromAsync(asyncItems /* , map /***/ }), -/* 719 */ +/* 720 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23308,7 +23350,7 @@ exportTypedArrayStaticMethod('fromAsync', function fromAsync(asyncItems /* , map // TODO: Remove from `core-js@4` var ArrayBufferViewCore = __webpack_require__(218); var $filterReject = __webpack_require__(85).filterReject; -var fromSpeciesAndList = __webpack_require__(456); +var fromSpeciesAndList = __webpack_require__(460); var aTypedArray = ArrayBufferViewCore.aTypedArray; var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; @@ -23322,14 +23364,14 @@ exportTypedArrayMethod('filterOut', function filterOut(callbackfn /* , thisArg * /***/ }), -/* 720 */ +/* 721 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var ArrayBufferViewCore = __webpack_require__(218); var $filterReject = __webpack_require__(85).filterReject; -var fromSpeciesAndList = __webpack_require__(456); +var fromSpeciesAndList = __webpack_require__(460); var aTypedArray = ArrayBufferViewCore.aTypedArray; var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; @@ -23343,15 +23385,15 @@ exportTypedArrayMethod('filterReject', function filterReject(callbackfn /* , thi /***/ }), -/* 721 */ +/* 722 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove from `core-js@4` var ArrayBufferViewCore = __webpack_require__(218); -var $group = __webpack_require__(502); -var typedArraySpeciesConstructor = __webpack_require__(457); +var $group = __webpack_require__(506); +var typedArraySpeciesConstructor = __webpack_require__(461); var aTypedArray = ArrayBufferViewCore.aTypedArray; var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; @@ -23365,7 +23407,7 @@ exportTypedArrayMethod('groupBy', function groupBy(callbackfn /* , thisArg */) { /***/ }), -/* 722 */ +/* 723 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23373,9 +23415,9 @@ exportTypedArrayMethod('groupBy', function groupBy(callbackfn /* , thisArg */) { // TODO: Remove from `core-js@4` var ArrayBufferViewCore = __webpack_require__(218); var lengthOfArrayLike = __webpack_require__(64); -var isBigIntArray = __webpack_require__(441); +var isBigIntArray = __webpack_require__(445); var toAbsoluteIndex = __webpack_require__(61); -var toBigInt = __webpack_require__(442); +var toBigInt = __webpack_require__(446); var toIntegerOrInfinity = __webpack_require__(62); var fails = __webpack_require__(7); @@ -23440,7 +23482,7 @@ exportTypedArrayMethod('toSpliced', function toSpliced(start, deleteCount /* , . /***/ }), -/* 723 */ +/* 724 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23448,7 +23490,7 @@ exportTypedArrayMethod('toSpliced', function toSpliced(start, deleteCount /* , . var uncurryThis = __webpack_require__(14); var ArrayBufferViewCore = __webpack_require__(218); var arrayFromConstructorAndList = __webpack_require__(199); -var $arrayUniqueBy = __webpack_require__(512); +var $arrayUniqueBy = __webpack_require__(515); var aTypedArray = ArrayBufferViewCore.aTypedArray; var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; @@ -23464,14 +23506,304 @@ exportTypedArrayMethod('uniqueBy', function uniqueBy(resolver) { /***/ }), -/* 724 */ +/* 725 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var aWeakMap = __webpack_require__(725); -var remove = __webpack_require__(726).remove; +var global = __webpack_require__(4); +var uncurryThis = __webpack_require__(14); +var anObjectOrUndefined = __webpack_require__(726); +var aString = __webpack_require__(727); +var hasOwn = __webpack_require__(39); +var arrayFromConstructorAndList = __webpack_require__(199); +var base64Map = __webpack_require__(728); +var getAlphabetOption = __webpack_require__(729); + +var base64Alphabet = base64Map.c2i; +var base64UrlAlphabet = base64Map.c2iUrl; + +var Uint8Array = global.Uint8Array; +var SyntaxError = global.SyntaxError; +var charAt = uncurryThis(''.charAt); +var replace = uncurryThis(''.replace); +var stringSlice = uncurryThis(''.slice); +var push = uncurryThis([].push); +var SPACES = /[\t\n\f\r ]/g; +var EXTRA_BITS = 'Extra bits'; + +// `Uint8Array.fromBase64` method +// https://github.com/tc39/proposal-arraybuffer-base64 +if (Uint8Array) $({ target: 'Uint8Array', stat: true, forced: true }, { + fromBase64: function fromBase64(string /* , options */) { + aString(string); + var options = arguments.length > 1 ? anObjectOrUndefined(arguments[1]) : undefined; + var alphabet = getAlphabetOption(options) === 'base64' ? base64Alphabet : base64UrlAlphabet; + var strict = options ? !!options.strict : false; + + var input = strict ? string : replace(string, SPACES, ''); + + if (input.length % 4 === 0) { + if (stringSlice(input, -2) === '==') input = stringSlice(input, 0, -2); + else if (stringSlice(input, -1) === '=') input = stringSlice(input, 0, -1); + } else if (strict) throw new SyntaxError('Input is not correctly padded'); + + var lastChunkSize = input.length % 4; + + switch (lastChunkSize) { + case 1: throw new SyntaxError('Bad input length'); + case 2: input += 'AA'; break; + case 3: input += 'A'; + } + + var bytes = []; + var i = 0; + var inputLength = input.length; + + var at = function (shift) { + var chr = charAt(input, i + shift); + if (!hasOwn(alphabet, chr)) throw new SyntaxError('Bad char in input: "' + chr + '"'); + return alphabet[chr] << (18 - 6 * shift); + }; + + for (; i < inputLength; i += 4) { + var triplet = at(0) + at(1) + at(2) + at(3); + push(bytes, (triplet >> 16) & 255, (triplet >> 8) & 255, triplet & 255); + } + + var byteLength = bytes.length; + + if (lastChunkSize === 2) { + if (strict && bytes[byteLength - 2] !== 0) throw new SyntaxError(EXTRA_BITS); + byteLength -= 2; + } else if (lastChunkSize === 3) { + if (strict && bytes[byteLength - 1] !== 0) throw new SyntaxError(EXTRA_BITS); + byteLength--; + } + + return arrayFromConstructorAndList(Uint8Array, bytes, byteLength); + } +}); + + +/***/ }), +/* 726 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var isObject = __webpack_require__(20); + +var $String = String; +var $TypeError = TypeError; + +module.exports = function (argument) { + if (argument === undefined || isObject(argument)) return argument; + throw new $TypeError($String(argument) + ' is not an object or undefined'); +}; + + +/***/ }), +/* 727 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $TypeError = TypeError; + +module.exports = function (argument) { + if (typeof argument == 'string') return argument; + throw new $TypeError('Argument is not a string'); +}; + + +/***/ }), +/* 728 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var commonAlphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; +var base64Alphabet = commonAlphabet + '+/'; +var base64UrlAlphabet = commonAlphabet + '-_'; + +var inverse = function (characters) { + // TODO: use `Object.create(null)` in `core-js@4` + var result = {}; + var index = 0; + for (; index < 64; index++) result[characters.charAt(index)] = index; + return result; +}; + +module.exports = { + i2c: base64Alphabet, + c2i: inverse(base64Alphabet), + i2cUrl: base64UrlAlphabet, + c2iUrl: inverse(base64UrlAlphabet) +}; + + +/***/ }), +/* 729 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $TypeError = TypeError; + +module.exports = function (options) { + var alphabet = options && options.alphabet; + if (alphabet === undefined || alphabet === 'base64' || alphabet === 'base64url') return alphabet || 'base64'; + throw new $TypeError('Incorrect `alphabet` option'); +}; + + +/***/ }), +/* 730 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(3); +var global = __webpack_require__(4); +var uncurryThis = __webpack_require__(14); +var aString = __webpack_require__(727); + +var Uint8Array = global.Uint8Array; +var SyntaxError = global.SyntaxError; +var parseInt = global.parseInt; +var NOT_HEX = /[^\da-f]/i; +var exec = uncurryThis(NOT_HEX.exec); +var stringSlice = uncurryThis(''.slice); + +// `Uint8Array.fromHex` method +// https://github.com/tc39/proposal-arraybuffer-base64 +if (Uint8Array) $({ target: 'Uint8Array', stat: true, forced: true }, { + fromHex: function fromHex(string) { + aString(string); + var stringLength = string.length; + if (stringLength % 2) throw new SyntaxError('String should have an even number of characters'); + if (exec(NOT_HEX, string)) throw new SyntaxError('String should only contain hex characters'); + var result = new Uint8Array(stringLength / 2); + for (var i = 0; i < stringLength; i += 2) { + result[i / 2] = parseInt(stringSlice(string, i, i + 2), 16); + } + return result; + } +}); + + +/***/ }), +/* 731 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(3); +var global = __webpack_require__(4); +var uncurryThis = __webpack_require__(14); +var anObjectOrUndefined = __webpack_require__(726); +var anUint8Array = __webpack_require__(732); +var base64Map = __webpack_require__(728); +var getAlphabetOption = __webpack_require__(729); + +var base64Alphabet = base64Map.i2c; +var base64UrlAlphabet = base64Map.i2cUrl; + +var Uint8Array = global.Uint8Array; +var charAt = uncurryThis(''.charAt); + +// `Uint8Array.prototype.toBase64` method +// https://github.com/tc39/proposal-arraybuffer-base64 +if (Uint8Array) $({ target: 'Uint8Array', proto: true, forced: true }, { + toBase64: function toBase64(/* options */) { + var array = anUint8Array(this); + var options = arguments.length ? anObjectOrUndefined(arguments[0]) : undefined; + var alphabet = getAlphabetOption(options) === 'base64' ? base64Alphabet : base64UrlAlphabet; + + var result = ''; + var i = 0; + var length = array.length; + var triplet; + + var at = function (shift) { + return charAt(alphabet, (triplet >> (6 * shift)) & 63); + }; + + for (; i + 2 < length; i += 3) { + triplet = (array[i] << 16) + (array[i + 1] << 8) + array[i + 2]; + result += at(3) + at(2) + at(1) + at(0); + } + if (i + 2 === length) { + triplet = (array[i] << 16) + (array[i + 1] << 8); + result += at(3) + at(2) + at(1) + '='; + } else if (i + 1 === length) { + triplet = array[i] << 16; + result += at(3) + at(2) + '=='; + } + + return result; + } +}); + + +/***/ }), +/* 732 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var classof = __webpack_require__(70); + +var $TypeError = TypeError; + +// Perform ? RequireInternalSlot(argument, [[TypedArrayName]]) +// If argument.[[TypedArrayName]] is not "Uint8Array", throw a TypeError exception +module.exports = function (argument) { + if (classof(argument) === 'Uint8Array') return argument; + throw new $TypeError('Argument is not an Uint8Array'); +}; + + +/***/ }), +/* 733 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(3); +var global = __webpack_require__(4); +var uncurryThis = __webpack_require__(14); +var anUint8Array = __webpack_require__(732); + +var Uint8Array = global.Uint8Array; +var numberToString = uncurryThis(1.0.toString); + +// `Uint8Array.prototype.toHex` method +// https://github.com/tc39/proposal-arraybuffer-base64 +if (Uint8Array) $({ target: 'Uint8Array', proto: true, forced: true }, { + toHex: function toHex() { + anUint8Array(this); + var result = ''; + for (var i = 0, length = this.length; i < length; i++) { + var hex = numberToString(this[i], 16); + result += hex.length === 1 ? '0' + hex : hex; + } + return result; + } +}); + + +/***/ }), +/* 734 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(3); +var aWeakMap = __webpack_require__(735); +var remove = __webpack_require__(703).remove; // `WeakMap.prototype.deleteAll` method // https://github.com/tc39/proposal-collection-methods @@ -23489,12 +23821,12 @@ $({ target: 'WeakMap', proto: true, real: true, forced: true }, { /***/ }), -/* 725 */ +/* 735 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var has = __webpack_require__(726).has; +var has = __webpack_require__(703).has; // Perform ? RequireInternalSlot(M, [[WeakMapData]]) module.exports = function (it) { @@ -23504,34 +23836,13 @@ module.exports = function (it) { /***/ }), -/* 726 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var uncurryThis = __webpack_require__(14); - -// eslint-disable-next-line es/no-weak-map -- safe -var WeakMapPrototype = WeakMap.prototype; - -module.exports = { - // eslint-disable-next-line es/no-weak-map -- safe - WeakMap: WeakMap, - set: uncurryThis(WeakMapPrototype.set), - get: uncurryThis(WeakMapPrototype.get), - has: uncurryThis(WeakMapPrototype.has), - remove: uncurryThis(WeakMapPrototype['delete']) -}; - - -/***/ }), -/* 727 */ +/* 736 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var from = __webpack_require__(601); +var from = __webpack_require__(604); // `WeakMap.from` method // https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from @@ -23541,13 +23852,13 @@ $({ target: 'WeakMap', stat: true, forced: true }, { /***/ }), -/* 728 */ +/* 737 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var of = __webpack_require__(611); +var of = __webpack_require__(613); // `WeakMap.of` method // https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of @@ -23557,14 +23868,14 @@ $({ target: 'WeakMap', stat: true, forced: true }, { /***/ }), -/* 729 */ +/* 738 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var aWeakMap = __webpack_require__(725); -var WeakMapHelpers = __webpack_require__(726); +var aWeakMap = __webpack_require__(735); +var WeakMapHelpers = __webpack_require__(703); var get = WeakMapHelpers.get; var has = WeakMapHelpers.has; @@ -23591,14 +23902,14 @@ $({ target: 'WeakMap', proto: true, real: true, forced: true }, { /***/ }), -/* 730 */ +/* 739 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: remove from `core-js@4` var $ = __webpack_require__(3); -var upsert = __webpack_require__(616); +var upsert = __webpack_require__(618); // `WeakMap.prototype.upsert` method (replaced by `WeakMap.prototype.emplace`) // https://github.com/tc39/proposal-upsert @@ -23608,14 +23919,14 @@ $({ target: 'WeakMap', proto: true, real: true, forced: true }, { /***/ }), -/* 731 */ +/* 740 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var aWeakSet = __webpack_require__(732); -var add = __webpack_require__(733).add; +var aWeakSet = __webpack_require__(741); +var add = __webpack_require__(742).add; // `WeakSet.prototype.addAll` method // https://github.com/tc39/proposal-collection-methods @@ -23630,12 +23941,12 @@ $({ target: 'WeakSet', proto: true, real: true, forced: true }, { /***/ }), -/* 732 */ +/* 741 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var has = __webpack_require__(733).has; +var has = __webpack_require__(742).has; // Perform ? RequireInternalSlot(M, [[WeakSetData]]) module.exports = function (it) { @@ -23645,7 +23956,7 @@ module.exports = function (it) { /***/ }), -/* 733 */ +/* 742 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23665,14 +23976,14 @@ module.exports = { /***/ }), -/* 734 */ +/* 743 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var aWeakSet = __webpack_require__(732); -var remove = __webpack_require__(733).remove; +var aWeakSet = __webpack_require__(741); +var remove = __webpack_require__(742).remove; // `WeakSet.prototype.deleteAll` method // https://github.com/tc39/proposal-collection-methods @@ -23690,13 +24001,13 @@ $({ target: 'WeakSet', proto: true, real: true, forced: true }, { /***/ }), -/* 735 */ +/* 744 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var from = __webpack_require__(601); +var from = __webpack_require__(604); // `WeakSet.from` method // https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from @@ -23706,13 +24017,13 @@ $({ target: 'WeakSet', stat: true, forced: true }, { /***/ }), -/* 736 */ +/* 745 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var of = __webpack_require__(611); +var of = __webpack_require__(613); // `WeakSet.of` method // https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of @@ -23722,7 +24033,7 @@ $({ target: 'WeakSet', stat: true, forced: true }, { /***/ }), -/* 737 */ +/* 746 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23734,9 +24045,8 @@ var uncurryThis = __webpack_require__(14); var call = __webpack_require__(8); var fails = __webpack_require__(7); var toString = __webpack_require__(69); -var hasOwn = __webpack_require__(39); -var validateArgumentsLength = __webpack_require__(329); -var ctoi = __webpack_require__(738).ctoi; +var validateArgumentsLength = __webpack_require__(332); +var c2i = __webpack_require__(728).c2i; var disallowed = /[^\d+/a-z]/i; var whitespaces = /[\t\n\f\r ]+/g; @@ -23748,67 +24058,56 @@ var charAt = uncurryThis(''.charAt); var replace = uncurryThis(''.replace); var exec = uncurryThis(disallowed.exec); -var NO_SPACES_IGNORE = fails(function () { +var BASIC = !!$atob && !fails(function () { + return $atob('aGk=') !== 'hi'; +}); + +var NO_SPACES_IGNORE = BASIC && fails(function () { return $atob(' ') !== ''; }); -var NO_ENCODING_CHECK = !fails(function () { +var NO_ENCODING_CHECK = BASIC && !fails(function () { $atob('a'); }); -var NO_ARG_RECEIVING_CHECK = !NO_SPACES_IGNORE && !NO_ENCODING_CHECK && !fails(function () { +var NO_ARG_RECEIVING_CHECK = BASIC && !fails(function () { $atob(); }); -var WRONG_ARITY = !NO_SPACES_IGNORE && !NO_ENCODING_CHECK && $atob.length !== 1; +var WRONG_ARITY = BASIC && $atob.length !== 1; + +var FORCED = !BASIC || NO_SPACES_IGNORE || NO_ENCODING_CHECK || NO_ARG_RECEIVING_CHECK || WRONG_ARITY; // `atob` method // https://html.spec.whatwg.org/multipage/webappapis.html#dom-atob -$({ global: true, bind: true, enumerable: true, forced: NO_SPACES_IGNORE || NO_ENCODING_CHECK || NO_ARG_RECEIVING_CHECK || WRONG_ARITY }, { +$({ global: true, bind: true, enumerable: true, forced: FORCED }, { atob: function atob(data) { validateArgumentsLength(arguments.length, 1); // `webpack` dev server bug on IE global methods - use call(fn, global, ...) - if (NO_ARG_RECEIVING_CHECK || WRONG_ARITY) return call($atob, global, data); + if (BASIC && !NO_SPACES_IGNORE && !NO_ENCODING_CHECK) return call($atob, global, data); var string = replace(toString(data), whitespaces, ''); var output = ''; var position = 0; var bc = 0; - var chr, bs; + var length, chr, bs; if (string.length % 4 === 0) { string = replace(string, finalEq, ''); } - if (string.length % 4 === 1 || exec(disallowed, string)) { + length = string.length; + if (length % 4 === 1 || exec(disallowed, string)) { throw new (getBuiltIn('DOMException'))('The string is not correctly encoded', 'InvalidCharacterError'); } - while (chr = charAt(string, position++)) { - if (hasOwn(ctoi, chr)) { - bs = bc % 4 ? bs * 64 + ctoi[chr] : ctoi[chr]; - if (bc++ % 4) output += fromCharCode(255 & bs >> (-2 * bc & 6)); - } + while (position < length) { + chr = charAt(string, position++); + bs = bc % 4 ? bs * 64 + c2i[chr] : c2i[chr]; + if (bc++ % 4) output += fromCharCode(255 & bs >> (-2 * bc & 6)); } return output; } }); /***/ }), -/* 738 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var itoc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; -var ctoi = {}; - -for (var index = 0; index < 66; index++) ctoi[itoc.charAt(index)] = index; - -module.exports = { - itoc: itoc, - ctoi: ctoi -}; - - -/***/ }), -/* 739 */ +/* 747 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23820,34 +24119,38 @@ var uncurryThis = __webpack_require__(14); var call = __webpack_require__(8); var fails = __webpack_require__(7); var toString = __webpack_require__(69); -var validateArgumentsLength = __webpack_require__(329); -var itoc = __webpack_require__(738).itoc; +var validateArgumentsLength = __webpack_require__(332); +var i2c = __webpack_require__(728).i2c; var $btoa = getBuiltIn('btoa'); var charAt = uncurryThis(''.charAt); var charCodeAt = uncurryThis(''.charCodeAt); -var NO_ARG_RECEIVING_CHECK = !!$btoa && !fails(function () { +var BASIC = !!$btoa && !fails(function () { + return $btoa('hi') !== 'aGk='; +}); + +var NO_ARG_RECEIVING_CHECK = BASIC && !fails(function () { $btoa(); }); -var WRONG_ARG_CONVERSION = !!$btoa && fails(function () { +var WRONG_ARG_CONVERSION = BASIC && fails(function () { return $btoa(null) !== 'bnVsbA=='; }); -var WRONG_ARITY = !!$btoa && $btoa.length !== 1; +var WRONG_ARITY = BASIC && $btoa.length !== 1; // `btoa` method // https://html.spec.whatwg.org/multipage/webappapis.html#dom-btoa -$({ global: true, bind: true, enumerable: true, forced: NO_ARG_RECEIVING_CHECK || WRONG_ARG_CONVERSION || WRONG_ARITY }, { +$({ global: true, bind: true, enumerable: true, forced: !BASIC || NO_ARG_RECEIVING_CHECK || WRONG_ARG_CONVERSION || WRONG_ARITY }, { btoa: function btoa(data) { validateArgumentsLength(arguments.length, 1); // `webpack` dev server bug on IE global methods - use call(fn, global, ...) - if (NO_ARG_RECEIVING_CHECK || WRONG_ARG_CONVERSION || WRONG_ARITY) return call($btoa, global, toString(data)); + if (BASIC) return call($btoa, global, toString(data)); var string = toString(data); var output = ''; var position = 0; - var map = itoc; + var map = i2c; var block, charCode; while (charAt(string, position) || (map = '=', position % 1)) { charCode = charCodeAt(string, position += 3 / 4); @@ -23862,14 +24165,14 @@ $({ global: true, bind: true, enumerable: true, forced: NO_ARG_RECEIVING_CHECK | /***/ }), -/* 740 */ +/* 748 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var global = __webpack_require__(4); -var DOMIterables = __webpack_require__(741); -var DOMTokenListPrototype = __webpack_require__(742); +var DOMIterables = __webpack_require__(749); +var DOMTokenListPrototype = __webpack_require__(750); var forEach = __webpack_require__(161); var createNonEnumerableProperty = __webpack_require__(44); @@ -23892,7 +24195,7 @@ handlePrototype(DOMTokenListPrototype); /***/ }), -/* 741 */ +/* 749 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23935,7 +24238,7 @@ module.exports = { /***/ }), -/* 742 */ +/* 750 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -23950,20 +24253,20 @@ module.exports = DOMTokenListPrototype === Object.prototype ? undefined : DOMTok /***/ }), -/* 743 */ +/* 751 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var global = __webpack_require__(4); -var DOMIterables = __webpack_require__(741); -var DOMTokenListPrototype = __webpack_require__(742); +var DOMIterables = __webpack_require__(749); +var DOMTokenListPrototype = __webpack_require__(750); var ArrayIteratorMethods = __webpack_require__(169); var createNonEnumerableProperty = __webpack_require__(44); +var setToStringTag = __webpack_require__(84); var wellKnownSymbol = __webpack_require__(34); var ITERATOR = wellKnownSymbol('iterator'); -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); var ArrayValues = ArrayIteratorMethods.values; var handlePrototype = function (CollectionPrototype, COLLECTION_NAME) { @@ -23974,9 +24277,7 @@ var handlePrototype = function (CollectionPrototype, COLLECTION_NAME) { } catch (error) { CollectionPrototype[ITERATOR] = ArrayValues; } - if (!CollectionPrototype[TO_STRING_TAG]) { - createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME); - } + setToStringTag(CollectionPrototype, COLLECTION_NAME, true); if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) { // some Chrome versions have non-configurable methods on DOMTokenList if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try { @@ -23996,13 +24297,13 @@ handlePrototype(DOMTokenListPrototype, 'DOMTokenList'); /***/ }), -/* 744 */ +/* 752 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); -var tryNodeRequire = __webpack_require__(521); +var tryNodeRequire = __webpack_require__(524); var getBuiltIn = __webpack_require__(24); var fails = __webpack_require__(7); var create = __webpack_require__(72); @@ -24015,7 +24316,7 @@ var anInstance = __webpack_require__(211); var anObject = __webpack_require__(47); var errorToString = __webpack_require__(127); var normalizeStringArgument = __webpack_require__(121); -var DOMExceptionConstants = __webpack_require__(745); +var DOMExceptionConstants = __webpack_require__(753); var clearErrorStack = __webpack_require__(124); var InternalStateModule = __webpack_require__(52); var DESCRIPTORS = __webpack_require__(6); @@ -24148,7 +24449,7 @@ for (var key in DOMExceptionConstants) if (hasOwn(DOMExceptionConstants, key)) { /***/ }), -/* 745 */ +/* 753 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24183,7 +24484,7 @@ module.exports = { /***/ }), -/* 746 */ +/* 754 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24197,7 +24498,7 @@ var hasOwn = __webpack_require__(39); var anInstance = __webpack_require__(211); var inheritIfRequired = __webpack_require__(120); var normalizeStringArgument = __webpack_require__(121); -var DOMExceptionConstants = __webpack_require__(745); +var DOMExceptionConstants = __webpack_require__(753); var clearErrorStack = __webpack_require__(124); var DESCRIPTORS = __webpack_require__(6); var IS_PURE = __webpack_require__(36); @@ -24258,7 +24559,7 @@ if (PolyfilledDOMExceptionPrototype.constructor !== PolyfilledDOMException) { /***/ }), -/* 747 */ +/* 755 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24273,25 +24574,25 @@ setToStringTag(getBuiltIn(DOM_EXCEPTION), DOM_EXCEPTION); /***/ }), -/* 748 */ +/* 756 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove this module from `core-js@4` since it's split to modules listed below -__webpack_require__(749); -__webpack_require__(750); +__webpack_require__(757); +__webpack_require__(758); /***/ }), -/* 749 */ +/* 757 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var global = __webpack_require__(4); -var clearImmediate = __webpack_require__(328).clear; +var clearImmediate = __webpack_require__(331).clear; // `clearImmediate` method // http://w3c.github.io/setImmediate/#si-clearImmediate @@ -24301,15 +24602,15 @@ $({ global: true, bind: true, enumerable: true, forced: global.clearImmediate != /***/ }), -/* 750 */ +/* 758 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var global = __webpack_require__(4); -var setTask = __webpack_require__(328).set; -var schedulersFix = __webpack_require__(751); +var setTask = __webpack_require__(331).set; +var schedulersFix = __webpack_require__(759); // https://github.com/oven-sh/bun/issues/1633 var setImmediate = global.setImmediate ? schedulersFix(setTask, false) : setTask; @@ -24322,7 +24623,7 @@ $({ global: true, bind: true, enumerable: true, forced: global.setImmediate !== /***/ }), -/* 751 */ +/* 759 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24330,10 +24631,10 @@ $({ global: true, bind: true, enumerable: true, forced: global.setImmediate !== var global = __webpack_require__(4); var apply = __webpack_require__(96); var isCallable = __webpack_require__(21); -var ENGINE_IS_BUN = __webpack_require__(752); +var ENGINE_IS_BUN = __webpack_require__(760); var USER_AGENT = __webpack_require__(29); var arraySlice = __webpack_require__(97); -var validateArgumentsLength = __webpack_require__(329); +var validateArgumentsLength = __webpack_require__(332); var Function = global.Function; // dirty IE9- and Bun 0.3.0- checks @@ -24360,26 +24661,26 @@ module.exports = function (scheduler, hasTimeArg) { /***/ }), -/* 752 */ +/* 760 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* global Bun -- Deno case */ +/* global Bun -- Bun case */ module.exports = typeof Bun == 'function' && Bun && typeof Bun.version == 'string'; /***/ }), -/* 753 */ +/* 761 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var global = __webpack_require__(4); -var microtask = __webpack_require__(331); +var microtask = __webpack_require__(334); var aCallable = __webpack_require__(31); -var validateArgumentsLength = __webpack_require__(329); +var validateArgumentsLength = __webpack_require__(332); var IS_NODE = __webpack_require__(183); var process = global.process; @@ -24397,7 +24698,7 @@ $({ global: true, enumerable: true, dontCallGetSet: true }, { /***/ }), -/* 754 */ +/* 762 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24445,7 +24746,7 @@ try { /***/ }), -/* 755 */ +/* 763 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24469,14 +24770,14 @@ var hasOwn = __webpack_require__(39); var createProperty = __webpack_require__(78); var createNonEnumerableProperty = __webpack_require__(44); var lengthOfArrayLike = __webpack_require__(64); -var validateArgumentsLength = __webpack_require__(329); -var getRegExpFlags = __webpack_require__(369); -var MapHelpers = __webpack_require__(506); +var validateArgumentsLength = __webpack_require__(332); +var getRegExpFlags = __webpack_require__(373); +var MapHelpers = __webpack_require__(252); var SetHelpers = __webpack_require__(659); var setIterate = __webpack_require__(664); -var detachTransferable = __webpack_require__(520); +var detachTransferable = __webpack_require__(523); var ERROR_STACK_INSTALLABLE = __webpack_require__(125); -var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(522); +var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(525); var Object = global.Object; var Array = global.Array; @@ -24611,6 +24912,7 @@ var cloneBuffer = function (value, map, $type) { } else { length = value.byteLength; options = 'maxByteLength' in value ? { maxByteLength: value.maxByteLength } : undefined; + // eslint-disable-next-line es/no-resizable-and-growable-arraybuffers -- safe clone = new ArrayBuffer(length, options); source = new DataView(value); target = new DataView(clone); @@ -24982,25 +25284,25 @@ $({ global: true, enumerable: true, sham: !PROPER_STRUCTURED_CLONE_TRANSFER, for /***/ }), -/* 756 */ +/* 764 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove this module from `core-js@4` since it's split to modules listed below -__webpack_require__(757); -__webpack_require__(758); +__webpack_require__(765); +__webpack_require__(766); /***/ }), -/* 757 */ +/* 765 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var global = __webpack_require__(4); -var schedulersFix = __webpack_require__(751); +var schedulersFix = __webpack_require__(759); var setInterval = schedulersFix(global.setInterval, true); @@ -25012,14 +25314,14 @@ $({ global: true, bind: true, forced: global.setInterval !== setInterval }, { /***/ }), -/* 758 */ +/* 766 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(3); var global = __webpack_require__(4); -var schedulersFix = __webpack_require__(751); +var schedulersFix = __webpack_require__(759); var setTimeout = schedulersFix(global.setTimeout, true); @@ -25031,26 +25333,26 @@ $({ global: true, bind: true, forced: global.setTimeout !== setTimeout }, { /***/ }), -/* 759 */ +/* 767 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove this module from `core-js@4` since it's replaced to module below -__webpack_require__(760); +__webpack_require__(768); /***/ }), -/* 760 */ +/* 768 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env` -__webpack_require__(392); +__webpack_require__(396); var $ = __webpack_require__(3); var DESCRIPTORS = __webpack_require__(6); -var USE_NATIVE_URL = __webpack_require__(761); +var USE_NATIVE_URL = __webpack_require__(769); var global = __webpack_require__(4); var bind = __webpack_require__(86); var uncurryThis = __webpack_require__(14); @@ -25058,15 +25360,15 @@ var defineBuiltIn = __webpack_require__(48); var defineBuiltInAccessor = __webpack_require__(79); var anInstance = __webpack_require__(211); var hasOwn = __webpack_require__(39); -var assign = __webpack_require__(293); +var assign = __webpack_require__(295); var arrayFrom = __webpack_require__(163); var arraySlice = __webpack_require__(77); -var codeAt = __webpack_require__(385).codeAt; -var toASCII = __webpack_require__(762); +var codeAt = __webpack_require__(389).codeAt; +var toASCII = __webpack_require__(770); var $toString = __webpack_require__(69); var setToStringTag = __webpack_require__(84); -var validateArgumentsLength = __webpack_require__(329); -var URLSearchParamsModule = __webpack_require__(763); +var validateArgumentsLength = __webpack_require__(332); +var URLSearchParamsModule = __webpack_require__(771); var InternalStateModule = __webpack_require__(52); var setInternalState = InternalStateModule.set; @@ -26096,7 +26398,7 @@ $({ global: true, constructor: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS /***/ }), -/* 761 */ +/* 769 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26145,7 +26447,7 @@ module.exports = !fails(function () { /***/ }), -/* 762 */ +/* 770 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26333,7 +26635,7 @@ module.exports = function (input) { /***/ }), -/* 763 */ +/* 771 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26345,7 +26647,7 @@ var global = __webpack_require__(4); var call = __webpack_require__(8); var uncurryThis = __webpack_require__(14); var DESCRIPTORS = __webpack_require__(6); -var USE_NATIVE_URL = __webpack_require__(761); +var USE_NATIVE_URL = __webpack_require__(769); var defineBuiltIn = __webpack_require__(48); var defineBuiltInAccessor = __webpack_require__(79); var defineBuiltIns = __webpack_require__(210); @@ -26365,7 +26667,7 @@ var createPropertyDescriptor = __webpack_require__(11); var getIterator = __webpack_require__(135); var getIteratorMethod = __webpack_require__(136); var createIterResultObject = __webpack_require__(173); -var validateArgumentsLength = __webpack_require__(329); +var validateArgumentsLength = __webpack_require__(332); var wellKnownSymbol = __webpack_require__(34); var arraySort = __webpack_require__(189); @@ -26764,7 +27066,7 @@ module.exports = { /***/ }), -/* 764 */ +/* 772 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26772,9 +27074,9 @@ module.exports = { var $ = __webpack_require__(3); var getBuiltIn = __webpack_require__(24); var fails = __webpack_require__(7); -var validateArgumentsLength = __webpack_require__(329); +var validateArgumentsLength = __webpack_require__(332); var toString = __webpack_require__(69); -var USE_NATIVE_URL = __webpack_require__(761); +var USE_NATIVE_URL = __webpack_require__(769); var URL = getBuiltIn('URL'); @@ -26801,7 +27103,7 @@ $({ target: 'URL', stat: true, forced: !THROWS_WITHOUT_ARGUMENTS }, { /***/ }), -/* 765 */ +/* 773 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26819,17 +27121,17 @@ $({ target: 'URL', proto: true, enumerable: true }, { /***/ }), -/* 766 */ +/* 774 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // TODO: Remove this module from `core-js@4` since it's replaced to module below -__webpack_require__(763); +__webpack_require__(771); /***/ }), -/* 767 */ +/* 775 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26837,7 +27139,7 @@ __webpack_require__(763); var defineBuiltIn = __webpack_require__(48); var uncurryThis = __webpack_require__(14); var toString = __webpack_require__(69); -var validateArgumentsLength = __webpack_require__(329); +var validateArgumentsLength = __webpack_require__(332); var $URLSearchParams = URLSearchParams; var URLSearchParamsPrototype = $URLSearchParams.prototype; @@ -26885,7 +27187,7 @@ if (params + '' !== 'a=2') { /***/ }), -/* 768 */ +/* 776 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26893,7 +27195,7 @@ if (params + '' !== 'a=2') { var defineBuiltIn = __webpack_require__(48); var uncurryThis = __webpack_require__(14); var toString = __webpack_require__(69); -var validateArgumentsLength = __webpack_require__(329); +var validateArgumentsLength = __webpack_require__(332); var $URLSearchParams = URLSearchParams; var URLSearchParamsPrototype = $URLSearchParams.prototype; @@ -26920,7 +27222,7 @@ if (params.has('a', 2) || !params.has('a', undefined)) { /***/ }), -/* 769 */ +/* 777 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; diff --git a/game/game.js b/game/game.js index e7840298e..2b8ff9543 100644 --- a/game/game.js +++ b/game/game.js @@ -1,63660 +1,70 @@ "use strict"; -const nonameInitialized=localStorage.getItem('noname_inited'); -const assetURL=typeof nonameInitialized!='string'||nonameInitialized=='nodejs'?'':nonameInitialized; -new Promise(resolve=>{ - if('__core-js_shared__' in window) resolve(); - else{ - const coreJSBundle=document.createElement('script'); - coreJSBundle.onerror=coreJSBundle.onload=resolve; - coreJSBundle.src=`${assetURL}game/core-js-bundle.js`; +new Promise(resolve => { + // 客户端自带core.js的请注意跟进 + if ('__core-js_shared__' in window) resolve(null); + else { + const nonameInitialized = localStorage.getItem('noname_inited'); + const assetURL = typeof nonameInitialized != 'string' || nonameInitialized == 'nodejs' ? '' : nonameInitialized; + const coreJSBundle = document.createElement('script'); + coreJSBundle.onerror = coreJSBundle.onload = resolve; + coreJSBundle.src = `${assetURL}game/core-js-bundle.js`; document.head.appendChild(coreJSBundle); } -}).then(()=>{ - /** - * @typedef {InstanceType} Player - * @typedef {InstanceType} Card - * @typedef {InstanceType} VCard - * @typedef {InstanceType} GameEvent - * @typedef {InstanceType} NodeWS - */ - const userAgent=navigator.userAgent.toLowerCase(); - if(!localStorage.getItem('gplv3_noname_alerted')){ - if(confirm('①无名杀是一款基于GPLv3协议的开源软件!\n你可以在遵守GPLv3协议的基础上任意使用,修改并转发《无名杀》,以及所有基于《无名杀》开发的拓展。\n点击“确定”即代表您认可并接受GPLv3协议↓️\nhttps://www.gnu.org/licenses/gpl-3.0.html\n②无名杀官方发布地址仅有GitHub仓库!\n其他所有的所谓“无名杀”社群(包括但不限于绝大多数“官方”QQ群、QQ频道等)均为玩家自发组织,与无名杀官方无关!')){ - localStorage.setItem('gplv3_noname_alerted',true); +}).then(() => { + const userAgent = navigator.userAgent.toLowerCase(); + + const exit = () => { + const ios = userAgent.includes('iphone') || userAgent.includes('ipad') || userAgent.includes('macintosh'); + //electron + if (typeof window.process == 'object' && typeof window.require == 'function') { + const versions = window.process.versions; + // @ts-ignore + const electronVersion = parseFloat(versions.electron); + let remote; + if (electronVersion >= 14) { + // @ts-ignore + remote = require('@electron/remote'); + } else { + // @ts-ignore + remote = require('electron').remote; + } + const thisWindow = remote.getCurrentWindow(); + thisWindow.destroy(); + window.process.exit(); } - else{ - const ios=userAgent.includes('iphone')||userAgent.includes('ipad')||userAgent.includes('macintosh'); - //electron - if(typeof window.process=='object'&&typeof window.require=='function'){ - const versions=window.process.versions; - const electronVersion=parseFloat(versions.electron); - let remote; - if(electronVersion>=14){ - remote=require('@electron/remote'); - }else{ - remote=require('electron').remote; - } - const thisWindow=remote.getCurrentWindow(); - thisWindow.destroy(); - window.process.exit(); - } - //android-cordova环境 - //ios-cordova环境或ios浏览器环境 - //非ios的网页版 - else if(!ios){ - window.close(); - } + //android-cordova环境 + //ios-cordova环境或ios浏览器环境 + //非ios的网页版 + else if (!ios) { + window.close(); + } + }; + + if (!localStorage.getItem('gplv3_noname_alerted')) { + if (confirm('①无名杀是一款基于GPLv3协议的开源软件!\n你可以在遵守GPLv3协议的基础上任意使用,修改并转发《无名杀》,以及所有基于《无名杀》开发的拓展。\n点击“确定”即代表您认可并接受GPLv3协议↓️\nhttps://www.gnu.org/licenses/gpl-3.0.html\n②无名杀官方发布地址仅有GitHub仓库!\n其他所有的所谓“无名杀”社群(包括但不限于绝大多数“官方”QQ群、QQ频道等)均为玩家自发组织,与无名杀官方无关!')) { + // @ts-ignore + localStorage.setItem('gplv3_noname_alerted', true); + } + else { + exit(); } } - const GeneratorFunction=(function*(){}).constructor; - // gnc: GeNCoroutine - const gnc={ - of:fn=>gnc.is.generatorFunc(fn)?function genCoroutine(){ - let gen=fn.apply(this,arguments); - gen.status="next"; - gen.state=undefined; - const callback=(resolve,reject)=>{ - let result, - nexts=resolve, - throws=reject; - try{ - result=gen[gen.status](gen.state); - }catch(error){ - reject(error); - return; - } - if(!result.done){ - nexts=(item)=>{ - gen.state=item; - gen.status="next"; - callback(resolve,reject); - } - throws=(err)=>{ - gen.state=err; - gen.status="throw"; - callback(resolve,reject); - } - } - result=result.value; - Promise.resolve(result).then(nexts,throws); + window['b' + 'ann' + 'e' + 'dE' + 'x' + 'ten' + 's' + 'i' + 'o' + 'ns'] = ['\u4fa0\u4e49', '\u5168\u6559\u7a0b']; + + const module = import('../noname.js'); + + module.then(({ ai, game, get, lib, _status, ui, boot }) => { + const coreAndVersion = get.coreInfo(); + const core = coreAndVersion[0], version = coreAndVersion[1]; + if (core == 'chrome' && !isNaN(version) && version < 77) { + const tip = '检测到您的浏览器内核版本小于77,请及时升级浏览器或手机webview内核!'; + console.warn(tip); + game.print(tip); + const redirect_tip = '您使用的浏览器或无名杀客户端内核版本过低,将在未来的版本被废弃!\n点击“确认”以前往GitHub下载最新版无名杀客户端(可能需要科学上网)。'; + if (confirm(redirect_tip)) { + window.open('https://github.com/libccy/noname/releases/tag/chromium77-client'); } - return new Promise(callback); - }:(()=>{throw new TypeError("gnc.of needs a GeneratorFunction.")})(), - is:{ - coroutine:item=>typeof item=="function"&&item.name=="genCoroutine", - generatorFunc:item=>item instanceof GeneratorFunction, - generator:item=>(typeof item=="object")&&("constructor" in item)&&item.constructor&&("constructor" in item.constructor)&&item.constructor.constructor===GeneratorFunction } - }; - const _status={ - paused:false, - paused2:false, - paused3:false, - over:false, - clicked:false, - auto:false, - /** - * @type {GameEvent} - */ - event:null, - ai:{}, - lastdragchange:[], - skillaudio:[], - dieClose:[], - dragline:[], - dying:[], - globalHistory:[{ - cardMove:[], - custom:[], - useCard:[], - changeHp:[], - everything:[], - }], - cardtag:{ - yingbian_zhuzhan:[], - yingbian_kongchao:[], - yingbian_fujia:[], - yingbian_canqu:[], - yingbian_force:[] - }, - renku:[], - prehidden_skills:[], - postReconnect:{}, - }; - const lib={ - configprefix:'noname_0.9_', - versionOL:27, - updateURLS:{ - coding:'https://gitcode.net/sinat_33405273/noname/-/raw/', - github:'https://raw.githubusercontent.com/libccy/noname', - }, - updateURL:'https://raw.githubusercontent.com/libccy/noname', - mirrorURL:'https://gitcode.net/sinat_33405273/noname/-/raw/', - hallURL:'47.99.105.222', - assetURL:assetURL, - userAgent:userAgent, - compatibleEdition:Boolean(typeof nonameInitialized=='string'&&nonameInitialized.match(/\/(?:com\.widget|yuri\.nakamura)\.noname\//)), - changeLog:[], - updates:[], - canvasUpdates:[], - video:[], - skilllist:[], - connectBanned:[], - characterIntro:{}, - characterTitle:{}, - characterPack:{}, - characterFilter:{}, - characterSort:{}, - characterReplace:{}, - characterGuozhanFilter:["mode_guozhan"], - dynamicTranslate:{}, - cardPack:{}, - skin:{}, - onresize:[], - onphase:[], - onwash:[], - onover:[], - ondb:[], - ondb2:[], - chatHistory:[], - emotionList:{ - xiaowu_emotion:14, - xiaokuo_emotion:8, - shibing_emotion:15, - guojia_emotion:20, - zhenji_emotion:20, - xiaosha_emotion:20, - xiaotao_emotion:20, - xiaojiu_emotion:20, - }, - animate:{ - skill:{}, - card:{}, - }, - onload:[], - onload2:[], - onprepare:[], - arenaReady:[], - onfree:[], - inpile:[], - inpile_nature:[], - extensions:[], - extensionPack:{}, - cardType:{}, - hook:{globalskill:{}}, - //函数钩子 - hooks:{ - // 本体势力的颜色 - addGroup:[(id,_short,_name,config)=>{ - if("color" in config&&config.color!=null){ - let color1,color2,color3,color4; - if (typeof config.color=="string"&&/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(config.color)){ - let c1=parseInt(`0x${config.color.slice(1, 3)}`); - let c2=parseInt(`0x${config.color.slice(3, 5)}`); - let c3=parseInt(`0x${config.color.slice(5, 7)}`); - color1=color2=color3=color4=[c1,c2,c3,1]; - } - else if(Array.isArray(config.color)&&config.color.length==4){ - if(config.color.every(item=>Array.isArray(item))){ - color1=config.color[0]; - color2=config.color[1]; - color3=config.color[2]; - color4=config.color[3]; - } - else color1=color2=color3=color4=config.color; - } - if(color1&&color2&&color3&&color4){ - const cs=lib.linq.cselector; - const g1=cs.group( - cs.of( - cs.class("player","identity"), - cs.isAttr("data-color",`"${id}"`) - ), - cs.of( - "div", - cs.isAttr("data-nature",`"${id}"`) - ), - cs.of( - "span", - cs.isAttr("data-nature",`"${id}"`) - ) - ); - const g2=cs.group( - cs.of( - "div", - cs.isAttr("data-nature",`"${id}m"`) - ), - cs.of( - "span", - cs.isAttr("data-nature",`"${id}m"`) - ) - ); - const g3=cs.group( - cs.of( - "div", - cs.isAttr("data-nature",`"${id}mm"`) - ), - cs.of( - "span", - cs.isAttr("data-nature",`"${id}mm"`) - ) - ); - let result={}; - result[g1]={ - textShadow:cs.group( - "black 0 0 1px", - `rgba(${color1.join()}) 0 0 2px`, - `rgba(${color2.join()}) 0 0 5px`, - `rgba(${color3.join()}) 0 0 10px`, - `rgba(${color4.join()}) 0 0 10px` - ) - }; - result[g2]={ - textShadow:cs.group( - "black 0 0 1px", - `rgba(${color1.join()}) 0 0 2px`, - `rgba(${color2.join()}) 0 0 5px`, - `rgba(${color3.join()}) 0 0 5px`, - `rgba(${color4.join()}) 0 0 5px`, - "black 0 0 1px" - ) - }; - result[g3]={ - textShadow:cs.group( - "black 0 0 1px", - `rgba(${color1.join()}) 0 0 2px`, - `rgba(${color2.join()}) 0 0 2px`, - `rgba(${color3.join()}) 0 0 2px`, - `rgba(${color4.join()}) 0 0 2px`, - "black 0 0 1px" - ) - }; - game.dynamicStyle.addObject(result); - lib.groupnature[id]=id; - } - } - if(typeof config.image=='string') Object.defineProperty(lib.card,`group_${id}`,{ - configurable:true, - enumerable:false, - writable:true, - value:{ - fullskin:true, - image:config.image - } - }); - }], - //增加新属性杀 - addNature:[(nature,_translation,config)=>{ - if(typeof config!='object') config={}; - let linked=config.linked,order=config.order,background=config.background,lineColor=config.lineColor; - if(typeof linked!='boolean') linked=true; - if(typeof order!='number') order=0; - if(typeof background!='string') background=''; - if(!Array.isArray(lineColor)||lineColor.length!=3) lineColor=[]; - else if(background.startsWith('ext:')){ - background=background.replace(/^ext:/,'extension/'); - } - if(linked) lib.linked.add(nature); - if(lineColor.length) lib.lineColor.set(nature,lineColor); - lib.nature.set(nature,order); - if(background.length>0) lib.natureBg.set(nature,background); - if(config.audio){ - for(let key in config.audio){ - if(!lib.natureAudio[key]){ - lib.natureAudio[key] = config.audio[key]; - }else{ - for(let key2 in config.audio[key]){ - lib.natureAudio[key][key2] = config.audio[key][key2]; - } - } - } - } - - let color1,color2; - if (typeof config.color=="string"&&/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(config.color)){ - let c1=parseInt(`0x${item[1].slice(1, 3)}`); - let c2=parseInt(`0x${item[1].slice(3, 5)}`); - let c3=parseInt(`0x${item[1].slice(5, 7)}`); - color1=color2=[c1,c2,c3,1]; - } - else if(Array.isArray(config.color)&&config.color.length>=2&&config.color.length<=4){ - if(config.color.every(item=>Array.isArray(item))){ - color1=config.color[0]; - color2=config.color[1]; - } - else{ - let color=config.color.slice(); - if(color.length==3) color.push(1); - color1=color2=color; - } - } - if(color1&&color2){ - const cs=lib.linq.cselector; - const g1=cs.group( - cs.of( - cs.class("card","fullskin",`${nature}`), - '>', - cs.class("name") - ) - ); - let result={}; - result[g1]={ - color:`rgba(${color1.join()})`, - border:cs.merge( - '1px', - 'solid', - `rgba(${color2.join()})` - ), - }; - game.dynamicStyle.addObject(result); - - const g2=cs.group( - cs.of( - cs.class("tempname",`${nature}`), - ':not([data-nature])>', - cs.class("span") - ) - ) - let result2={}; - result2[g2]={ - color:`rgba(${color1.join()})`, - }; - game.dynamicStyle.addObject(result2); - } - }], - }, - /** - * **无名杀频道推送机制** - * - * 鉴于`Javascript`的特性及自身对所需功能的思考,这是一个参考`Golang`的`channel`设计的、完全和`go channel`不一样的异步消息传递对象 - * - * 当且仅当接收方和发送方均存在时进行消息传递,完全保证信息传递的单一性(发送方/接收方一旦确定则无法更改)和准确性(发送方必然将消息发送给接收方) - * - * 若存在发送方/接收方时调用`send`/`receive`,将报错 - * - * 若需要异步/不报错发送信息,请等待`lib.actor` - * - * @template T - * @example - * // 创建一个频道 - * const channel = new lib.channel(); - * - * // 从某个角落接收channel发出的消息,若无消息则等待 - * const message = await channel.receive(); - * - * // 从某个角落向channel发消息,若无消息接收则等待 - * await channel.send(item); - */ - channel: class { - /** - * @template TValue - * @callback PromiseResolve - * @param {TValue} value - * @returns {void} - */ - constructor() { - /** - * @type {"active" | "receiving" | "sending"} - */ - this.status = "active"; - - /** - * @type {PromiseResolve | [T, PromiseResolve] | null} - */ - this._buffer = null; - } - - /** - * 向该频道发送消息,在消息未被接受前将等待 - * - * @param {T} value - 要发送的消息 - * @returns {Promise} - */ - send(value) { - return new Promise((resolve, reject) => { - switch (this.status) { - case "sending": - // TODO: handle the error. - reject(new Error()); - break; - case "receiving":{ - /** - * @type {PromiseResolve} - */ - const buffer = this._buffer; - this._buffer = null; - buffer(value); - this.status = "active"; - resolve(); - break ; - } - case "active": - this.status = "sending"; - this._buffer = [value, resolve]; - break; - } - }); - } - - /** - * 接收频道所发送的消息,若无消息发送则等待 - * - * @returns {Promise} 接收到的消息 - */ - receive() { - return new Promise((resolve, reject) => { - switch (this.status) { - case "receiving": - // TODO: handle the error. - reject(new Error()); - break; - case "sending":{ - /** - * @type {[T, PromiseResolve]} - */ - const buffer = this._buffer; - this._buffer = null; - resolve(buffer[0]); - this.status = "active"; - buffer[1](); - break ; - } - case "active": - this.status = "receiving"; - this._buffer = resolve; - break; - } - }); - } - }, - /** - * **无名杀消息推送库** - * - * 通过`EventTarget`机制,实现消息推送和接收的解耦, - * 从而使消息接收方无需依赖发布方,发布方也无需考虑接收方 - * - * > `lib.announce`不是`actor`模型,若不存在订阅者,则消息发送将无意义 - * - * @example - * // 甲扩展(如《千幻聆音》)在角色皮肤切换后,调用: - * lib.announce.publish("skinChange", { - * player, - * playerName: "zhangfei", - * originSkin: "image/xxx.jpg", - * currentSkin: "image/yyy.jpg" - * }); - * - * // 乙扩展监听此`skinChange`事件,并修改自己扩展相关界面的图片: - * const method = lib.announce.subscribe("skinChange", (e) => { - * div.setBackgroundImage(e.currentSkin); - * }); - * - * // 若此时乙扩展不想继续订阅`skinChange`事件,可以通过`unsubscribe`解除订阅 - * lib.announce.unsubscribe("skinChange", method); - */ - announce:new class{ - constructor(){ - /** - * @type {HTMLElement} - */ - this._announce=document.createElement("Announce"); - /** - * @type {Map} - */ - this._announce_cache=new Map(); - } - - /** - * 推送任意数据给所有监听了指定事件的订阅者,并返回给定的数据 - * - * 若不存在订阅指定事件的订阅者,则推送的数据将无意义 - * - * @template T - * @param {string} name - 要推送事件的名称 - * @param {T} values - 要推送的数据 - * @returns {T} - */ - publish(name,values){ - if(this._announce) this._announce.dispatchEvent(new CustomEvent(name,{ - detail:values - })); - return values; - } - - /** - * 订阅给定名字的事件,并返回给定的函数 - * - * 在事件触发时执行给定的函数 - * - * 给定的函数将被存储至当前实例中,用于取消订阅时获取 - * - * @template T - * @param {string} name - 要订阅事件的名称 - * @param {(values: T) => void} method - 事件触发时执行的函数 - * @returns {(values: T) => void} - */ - subscribe(name,method){ - if(this._announce&&this._announce_cache) { - let subscribeFunction; - if(this._announce_cache.has(method)){ - let records=this._announce_cache.get(method); - subscribeFunction=records.get("Listener"); - records.get("EventTargets").add(name); - } - else{ - subscribeFunction=event=>method(event.detail); - let records=new Map(); - records.set("Listener",subscribeFunction); - records.set("EventTargets",[name]); - this._announce_cache.set(method,records); - } - this._announce.addEventListener(name,subscribeFunction); - } - return method; - } - - /** - * 取消指定事件某一函数的订阅,并返回该函数 - * - * 给定的函数将不再于事件触发时执行,其余同事件需触发的函数不受限制 - * - * @template T - * @param {string} name - 要取消订阅事件的名称 - * @param {(values: T) => void} method - 订阅指定事件的函数 - * @returns {(values: T) => void} - */ - unsubscribe(name,method){ - if(this._announce&&this._announce_cache&&this._announce_cache.has(method)){ - let records=this._announce_cache.get(method); - const listener=records.get("Listener"); - let eventTargets=records.get("EventTargets"); - eventTargets.remove(name); - if(eventTargets.length<=0) this._announce_cache.remove(method); - this._announce.removeEventListener(name,listener); - } - return method; - } - }, - objectURL:new Map(), - hookmap:{}, - imported:{}, - layoutfixed:['chess','tafang','stone'], - pinyins:{ - _metadata:{ - shengmu:['zh','ch','sh','b','p','m','f','d','t','l','n','g','k','h','j','q','x','r','z','c','s','y','w'], - special_shengmu:['j','q','x','y'], - feijiemu:{ - i:['ing','iu','ie','in'], - u:['ui','un'], - ü:['üe','ün'], - }, - zhengtirendu:['zhi','chi','shi','ri','zi','ci','si'], - yunjiao:{ - '一麻':['a','ia','ua'], - '二波':['o','e','uo'], - '三皆':['ie','üe'], - '四开':['ai','uai'], - '五微':['ei','ui'], - '六豪':['ao','iao'], - '七尤':['ou','iu'], - '八寒':['an','ian','uan','üan'], - '九文':['en','in','un','ün'], - '十唐':['ang','iang','uang'], - '十一庚':['eng','ing','ong','ung'], - '十二齐':['i','er','ü'], - '十三支':['-i'], - '十四姑':['u'], - }, - } - }, - /** - * Yingbian - * - * 应变 - */ - yingbian:{ - condition:{ - color:new Map([ - ['zhuzhan','wood'], - ['kongchao','soil'], - ['fujia','orange'], - ['canqu','fire'], - ['force','metal'] - ]), - complex:new Map([ - ['zhuzhan',function(event){ - const yingbianZhuzhan=game.createEvent('yingbianZhuzhan'); - yingbianZhuzhan.player=event.player; - yingbianZhuzhan.card=event.card; - yingbianZhuzhan._trigger=event; - yingbianZhuzhan.yingbianZhuzhanAI=event.yingbianZhuzhanAI; - yingbianZhuzhan.afterYingbianZhuzhan=event.afterYingbianZhuzhan; - yingbianZhuzhan.setContent(()=>{ - 'step 0' - event._global_waiting=true; - event.send=(player,card,source,targets,id,id2,yingbianZhuzhanAI,skillState)=>{ - if(skillState) player.applySkills(skillState); - var type=get.type2(card),str=get.translation(source); - if(targets&&targets.length) str+=`对${get.translation(targets)}`; - str+=`使用了${get.translation(card)},是否弃置一张${get.translation(type)}为其助战?`; - player.chooseCard({ - filterCard:(card,player)=>get.type2(card)==type&&lib.filter.cardDiscardable(card,player), - prompt:str, - position:'h', - _global_waiting:true, - id:id, - id2:id2, - ai:typeof yingbianZhuzhanAI=='function'?yingbianZhuzhanAI(player,card,source,targets):cardx=>{ - var info=get.info(card); - if(info&&info.ai&&info.ai.yingbian){ - var ai=info.ai.yingbian(card,source,targets,player); - if(!ai) return 0; - return ai-get.value(cardx); - } - else if(get.attitude(player,source)<=0) return 0; - return 5-get.value(cardx); - } - }); - if(!game.online) return; - _status.event._resultid=id; - game.resume(); - }; - 'step 1' - var type=get.type2(card); - event.list=game.filterPlayer(current=>current!=player&¤t.countCards('h')&&(_status.connectMode||current.hasCard(cardx=>get.type2(cardx)==type,'h'))).sortBySeat(_status.currentPhase||player); - event.id=get.id(); - 'step 2' - if(!event.list.length) event.finish(); - else if(_status.connectMode&&(event.list[0].isOnline()||event.list[0]==game.me)) event.goto(4); - else event.send(event.current=event.list.shift(),event.card,player,trigger.targets,event.id,trigger.parent.id,trigger.yingbianZhuzhanAI); - 'step 3' - if(result.bool){ - event.zhuzhanresult=event.current; - event.zhuzhanresult2=result; - if(event.current!=game.me) game.delayx(); - event.goto(8); - } - else event.goto(2); - 'step 4' - var id=event.id,sendback=(result,player)=>{ - if(result&&result.id==id&&!event.zhuzhanresult&&result.bool){ - event.zhuzhanresult=player; - event.zhuzhanresult2=result; - game.broadcast('cancel',id); - if(_status.event.id==id&&_status.event.name=='chooseCard'&&_status.paused) return ()=>{ - event.resultOL=_status.event.resultOL; - ui.click.cancel(); - if(ui.confirm) ui.confirm.close(); - }; - } - else if(_status.event.id==id&&_status.event.name=='chooseCard'&&_status.paused) return ()=>event.resultOL=_status.event.resultOL; - },withme=false,withol=false,list=event.list; - for(var i=0;i{ - if(value!=player) value.showTimer(); - }); - event.withol=withol; - 'step 5' - if(!result||!result.bool||event.zhuzhanresult) return; - game.broadcast('cancel',event.id); - event.zhuzhanresult=game.me; - event.zhuzhanresult2=result; - 'step 6' - if(event.withol&&!event.resultOL) game.pause(); - 'step 7' - game.players.forEach(value=>value.hideTimer()); - 'step 8' - if(event.zhuzhanresult){ - var target=event.zhuzhanresult; - target.line(player,'green'); - target.discard(event.zhuzhanresult2.cards).discarder=target; - if(typeof event.afterYingbianZhuzhan=='function') event.afterYingbianZhuzhan(event,trigger); - var yingbianCondition=event.name.slice(8).toLowerCase(),yingbianConditionTag=`yingbian_${yingbianCondition}_tag`; - target.popup(yingbianConditionTag,lib.yingbian.condition.color.get(yingbianCondition)); - game.log(target,'响应了',player,'发起的',yingbianConditionTag); - target.addExpose(0.2); - event.result={ - bool:true - } - } - else event.result={ - bool:false - }; - }); - yingbianZhuzhan._args=Array.from(arguments); - return yingbianZhuzhan; - }] - ]), - simple:new Map([ - ['kongchao',event=>!event.player.countCards('h')], - ['fujia',event=>event.player.isMaxHandcard()], - ['canqu',event=>event.player.getHp()==1] - ]) - }, - effect:new Map([ - ['add',()=>{ - trigger.yingbian_addTarget=true; - }], - ['remove',()=>{ - trigger.yingbian_removeTarget=true; - }], - ['damage',()=>{ - if(typeof trigger.baseDamage!='number') trigger.baseDamage=1; - trigger.baseDamage++; - game.log(card,'的伤害值基数+1'); - }], - ['draw',()=>{ - player.draw(); - }], - ['gain',()=>{ - const cardx=trigger.respondTo; - if(cardx&&cardx[1]&&cardx[1].cards&&cardx[1].cards.filterInD('od').length) player.gain(cardx[1].cards.filterInD('od'),'gain2'); - }], - ['hit',()=>{ - trigger.directHit.addArray(game.players).addArray(game.dead); - game.log(card,'不可被响应'); - }], - ['all',()=>{ - card.yingbian_all=true; - game.log(card,'执行所有选项'); - }] - ]), - prompt:new Map([ - ['add','目标+1'], - ['remove','目标-1'], - ['damage','伤害+1'], - ['draw','摸一张牌'], - ['gain','获得响应的牌'], - ['hit','此牌不可被响应'], - ['all','无视条件执行所有选项'] - ]) - }, - /** - * Stratagem buff - * - * 谋攻强化 - */ - stratagemBuff:{ - cost:new Map([ - ['sha',1], - ['shan',1], - ['juedou',2], - ['huogong',2], - ['tao',3] - ]), - effect:new Map([ - ['sha',(event,option)=>{ - if(event.step!=0||option.state!='end') return; - game.log(event.player,'触发了强化效果'); - game.log(event.card,'抵消所需要的',new lib.element.VCard({ - name:'shan' - }),'数+1'); - const map=event.customArgs; - game.players.concat(game.dead).forEach(current=>{ - const id=current.playerid; - if(!map[id]) map[id]={}; - if(typeof map[id].shanRequired=='number') map[id].shanRequired++; - else map[id].shanRequired=2; - }); - }], - ['shan',(event,option)=>{ - if(event.step!=0||option.state!='end') return; - game.log(event.player,'触发了强化效果'); - game.log('使用',event.card,'时视为两张',new lib.element.VCard({ - name:'shan' - }),'的效果'); - event.player.when('useCard').filter(evt=>evt==event).then(()=>{ - trigger.getParent(2).decrease('shanRequired',1); - }); - }], - ['juedou',(event,option)=>{ - if(event.step!=0||option.state!='end') return; - game.log(event.player,'触发了强化效果'); - game.log('对',event.card,'的目标造成伤害时,伤害+1'); - event.player.when({ - source:'damageBegin1' - }).filter(evt=>evt.getParent(2)==event&&event.targets.includes(evt.player)).then(()=>{ - trigger.increase('num'); - }); - }], - ['huogong',(event,option)=>{ - if(event.step!=0||option.state!='end') return; - game.log(event.player,'触发了强化效果'); - game.log(event.card,'造成的伤害+1'); - event.increase('baseDamage',1); - }], - ['tao',(event,option)=>{ - if(event.step!=0||option.state!='end') return; - game.log(event.player,'触发了强化效果'); - game.log(event.card,'回复的体力+1'); - event.increase('baseDamage',1); - }] - ]), - prompt:new Map([ - [ - 'sha', - /** - * @type {() => string} - */ - ()=>`抵消所需要的【${get.translation('shan')}】数+1。` - ], - [ - 'shan', - /** - * @type {() => string} - */ - ()=>`使用时视为两张【${get.translation('shan')}】的效果。` - ], - [ - 'juedou', - ()=>'对此牌的目标造成伤害时,伤害+1。' - ], - [ - 'huogong', - ()=>'造成的伤害+1。' - ], - [ - 'tao', - ()=>'回复的体力+1。' - ] - ]) - }, - /** - * The actual card name - * - * 实际的卡牌名称 - */ - actualCardName:new Map([ - ['挟令','挟天子以令诸侯'], - ['霹雳投石车','霹雳车'] - ]), - characterDialogGroup:{ - '收藏':function(name,capt){ - return lib.config.favouriteCharacter.includes(name)?capt:null; - }, - '最近':function(name,capt){ - var list=get.config('recentCharacter')||[]; - return list.includes(name)?capt:null; - } - }, - listenEnd:function(node){ - if(!node._listeningEnd){ - node._listeningEnd=true; - node.listenTransition(function(){ - delete node._listeningEnd; - if(node._onEndMoveDelete){ - node.moveDelete(node._onEndMoveDelete); - } - else if(node._onEndDelete){ - node.delete(); - } - node._transitionEnded=true; - }); - } - }, - configMenu:{ - general:{ - name:'通用', - config:{ - mount_combine:{ - name:'合并坐骑栏', - init:false, - intro:'
  • 将进攻坐骑栏和防御坐骑栏合并为同一个位置(重启后生效)。', - restart:true, - }, - low_performance:{ - name:'流畅模式', - init:false, - intro:'减少部分游戏特效,提高游戏速度', - onclick:function(bool){ - game.saveConfig('low_performance',bool); - if(bool){ - ui.window.classList.add('low_performance'); - } - else{ - ui.window.classList.remove('low_performance'); - } - } - }, - compatiblemode:{ - name:'兼容模式', - init:false, - intro:'开启兼容模式可防止扩展使游戏卡死并提高对旧扩展的兼容性,但对游戏速度有一定影响,若无不稳定或不兼容的扩展建议关闭', - onclick:function(bool){ - game.saveConfig('compatiblemode',bool); - if(bool){ - ui.window.classList.add('compatiblemode'); - } - else{ - ui.window.classList.remove('compatiblemode'); - } - } - }, - confirm_exit:{ - name:'确认退出', - init:false, - unfrequent:true, - intro:'离开游戏前弹出确认对话框', - }, - keep_awake:{ - name:'屏幕常亮', - init:false, - unfrequent:true, - intro:'防止屏幕自动关闭
    注:旧版本通过NoSleep.js实现的屏幕常亮可能会影响外置音频的音量', - onclick:function(bool){ - game.saveConfig('keep_awake',bool); - if(bool){ - if(window.plugins&&window.plugins.insomnia) window.plugins.insomnia.keepAwake(); - else if(window.noSleep){ - document.addEventListener(lib.config.touchscreen?'touchend':'click', function enableNoSleepX() { - document.removeEventListener(lib.config.touchscreen?'touchend':'click', enableNoSleepX, false); - window.noSleep.enable(); - }, false); - } - } - else{ - if(window.plugins&&window.plugins.insomnia) window.plugins.insomnia.allowSleepAgain(); - else if(window.noSleep) window.noSleep.disable(); - } - } - }, - auto_confirm:{ - name:'自动确认', - init:true, - unfrequent:true, - intro:'当候选目标只有1个时,点击目标后无需再点击确认', - }, - skip_shan:{ - name:'无闪自动取消', - init:false, - unfrequent:true, - intro:'当自己需要使用或打出【闪】时,若自己没有【闪】,则跳过该步骤', - }, - unauto_choose:{ - name:'拆顺手牌选择', - init:false, - unfrequent:true, - intro:'拆牌或者顺牌时,就算只能选择对方的手牌依然手动选择', - }, - wuxie_self:{ - name:'不无懈自己', - init:true, - unfrequent:true, - intro:'自己使用的单目标普通锦囊即将生效时,不询问无懈', - }, - tao_enemy:{ - name:'不对敌方出桃', - init:false, - intro:'双方阵营明确的模式中(如对决),敌方角色濒死时不询问出桃', - unfrequent:true, - }, - enable_drag:{ - name:'启用拖拽', - init:true, - intro:'按住卡牌后可将卡牌拖至目标', - unfrequent:true, - }, - enable_dragline:{ - name:'拖拽指示线', - init:true, - unfrequent:true, - intro:'拖拽时显示虚线,可能降低游戏速度', - }, - enable_touchdragline:{ - name:'拖拽指示线', - init:false, - unfrequent:true, - intro:'拖拽时显示虚线,可能降低游戏速度', - }, - // enable_pressure:{ - // name:'启用压感', - // init:false, - // intro:'开启后可通过按压执行操作', - // unfrequent:true, - // }, - // pressure_taptic:{ - // name:'触觉反馈', - // init:false, - // intro:'开启后按压操作执行时将产生震动', - // unfrequent:true, - // }, - // pressure_click:{ - // name:'按压操作', - // init:'pause', - // intro:'在空白区域按压时的操作', - // unfrequent:true, - // item:{ - // pause:'暂停', - // config:'选项', - // auto:'托管', - // } - // }, - touchscreen:{ - name:'触屏模式', - init:false, - restart:true, - unfrequent:true, - intro:'开启后可使触屏设备反应更快,但无法使用鼠标操作', - onclick:function(bool){ - if(get.is.nomenu('touchscreen',bool)) return false; - game.saveConfig('touchscreen',bool); - } - }, - swipe:{ - name:'滑动手势', - init:true, - unfrequent:true, - intro:'在非滚动区域向四个方向滑动可执行对应操作', - }, - swipe_down:{ - name:'下划操作', - init:'menu', - unfrequent:true, - intro:'向下滑动时执行的操作', - item:{ - system:'显示按钮', - menu:'打开菜单', - pause:'切换暂停', - auto:'切换托管', - chat:'显示聊天', - off:'关闭', - }, - onclick:function(item){ - if(get.is.nomenu('swipe_down',item)) return false; - game.saveConfig('swipe_down',item); - } - }, - swipe_up:{ - name:'上划操作', - intro:'向上滑动时执行的操作', - init:'auto', - unfrequent:true, - item:{ - system:'显示按钮', - menu:'打开菜单', - pause:'切换暂停', - auto:'切换托管', - chat:'显示聊天', - off:'关闭', - }, - onclick:function(item){ - if(get.is.nomenu('swipe_up',item)) return false; - game.saveConfig('swipe_up',item); - } - }, - swipe_left:{ - name:'左划操作', - intro:'向左滑动时执行的操作', - init:'system', - unfrequent:true, - item:{ - system:'显示按钮', - menu:'打开菜单', - pause:'切换暂停', - auto:'切换托管', - chat:'显示聊天', - off:'关闭', - }, - onclick:function(item){ - if(get.is.nomenu('swipe_left',item)) return false; - game.saveConfig('swipe_left',item); - } - }, - swipe_right:{ - name:'右划操作', - intro:'向右滑动时执行的操作', - init:'system', - unfrequent:true, - item:{ - system:'显示按钮', - menu:'打开菜单', - pause:'切换暂停', - auto:'切换托管', - chat:'显示聊天', - off:'关闭', - }, - onclick:function(item){ - if(get.is.nomenu('swipe_right',item)) return false; - game.saveConfig('swipe_right',item); - } - }, - round_menu_func:{ - name:'触屏按钮操作', - intro:'点击屏幕中圆形按钮时执行的操作', - init:'system', - unfrequent:true, - item:{ - system:'显示按钮', - menu:'打开菜单', - pause:'切换暂停', - auto:'切换托管' - }, - onclick:function(item){ - if(get.is.nomenu('round_menu_func',item)) return false; - game.saveConfig('round_menu_func',item); - }, - }, - show_splash:{ - name:'显示开始界面', - intro:'游戏开始前进入模式选择画面', - init:'init', - item:{ - off:'关闭', - init:'首次启动', - always:'保持开启', - } - }, - game_speed:{ - name:'游戏速度', - init:'mid', - item:{ - vslow:'慢', - slow:'较慢', - mid:'中', - fast:'较快', - vfast:'快', - vvfast:'很快', - }, - intro:'设置不同游戏操作间的时间间隔' - }, - sync_speed:{ - name:'限制结算速度', - intro:'在动画结算完成前不执行下一步操作,开启后游戏操作的间隔更长但画面更浏畅,在游戏较卡时建议开启', - init:true - }, - enable_vibrate:{ - name:'开启震动', - intro:'回合开始时使手机震动', - init:false - }, - right_click:{ - name:'右键操作', - init:'pause', - intro:'在空白区域点击右键时的操作', - unfrequent:true, - item:{ - pause:'暂停', - shortcut:'工具', - config:'选项', - auto:'托管', - }, - onclick:function(item){ - if(get.is.nomenu('right_click',item)) return false; - game.saveConfig('right_click',item); - } - }, - longpress_info:{ - name:'长按显示信息', - init:true, - unfrequent:true, - restart:true, - intro:'长按后弹出菜单', - }, - right_info:{ - name:'右键显示信息', - init:true, - unfrequent:true, - restart:true, - intro:'右键点击后弹出菜单', - }, - hover_all:{ - name:'悬停显示信息', - init:true, - unfrequent:true, - restart:true, - intro:'悬停后弹出菜单', - }, - hover_handcard:{ - name:'悬停手牌显示信息', - init:true, - unfrequent:true, - intro:'悬停手牌后弹出菜单', - }, - hoveration:{ - name:'悬停菜单弹出时间', - unfrequent:true, - intro:'鼠标移至目标到弹出菜单的时间间隔', - init:'1000', - item:{ - '500':'0.5秒', - '700':'0.7秒', - '1000':'1秒', - '1500':'1.5秒', - '2500':'2.5秒', - } - }, - doubleclick_intro:{ - name:'双击显示武将资料', - init:true, - unfrequent:true, - intro:'双击武将头像后显示其资料卡', - }, - video:{ - name:'保存录像', - init:'20', - intro:'游戏结束后保存录像在最大条数,超过后将从最早的录像开始删除(已收藏的录像不计入条数)', - item:{ - '0':'关闭', - '5':'五局', - '10':'十局', - '20':'二十局', - '50':'五十局', - '10000':'无限', - }, - unfrequent:true, - }, - max_loadtime:{ - name:'最长载入时间', - intro:'设置游戏从启动到完成载入所需的最长时间,超过此时间未完成载入会报错,若设备较慢或安装了较多扩展可适当延长此时间', - init:'5000', - unfrequent:true, - item:{ - 5000:'5秒', - 10000:'10秒', - 20000:'20秒', - 60000:'60秒' - }, - onclick:function(item){ - game.saveConfig('max_loadtime',item); - if(item=='5000'){ - localStorage.removeItem(lib.configprefix+'loadtime'); - } - else{ - localStorage.setItem(lib.configprefix+'loadtime',item); - } - } - }, - mousewheel:{ - name:'滚轮控制手牌', - init:true, - unfrequent:true, - intro:'开启后滚轮可使手牌横向滚动,在mac等可横向滚动的设备上建议关闭', - onclick:function(bool){ - game.saveConfig('mousewheel',bool); - if(lib.config.touchscreen) return; - if(lib.config.mousewheel){ - ui.handcards1Container.onmousewheel=ui.click.mousewheel; - ui.handcards2Container.onmousewheel=ui.click.mousewheel; - } - else{ - ui.handcards1Container.onmousewheel=null; - ui.handcards2Container.onmousewheel=null; - } - } - }, - auto_check_update:{ - name:'自动检查游戏更新', - intro:'进入游戏时检查更新', - init:false, - unfrequent:true - }, - lucky_star:{ - name:'幸运星模式', - intro:'在涉及随机数等的技能中,必定得到效果最好的结果。(联机模式无效)', - init:false, - unfrequent:true - }, - dev:{ - name:'开发者模式', - intro:'开启后可使用浏览器控制台控制游戏,同时可更新到开发版', - init:false, - onclick:function(bool){ - game.saveConfig('dev',bool); - if(_status.connectMode) return; - if(bool){ - lib.cheat.i(); - } - else{ - delete window.cheat; - delete window.game; - delete window.ui; - delete window.get; - delete window.ai; - delete window.lib; - delete window._status; - } - }, - unfrequent:true, - }, - fuck_sojson:{ - name:'检测加密扩展', - init:false, - }, - errstop:{ - name:'出错时停止游戏', - init:false, - unfrequent:true - }, - update_link:{ - name:'更新地址', - init:'coding', - unfrequent:true, - item:{ - coding:'CSDN', - github:'GitHub', - }, - onclick:function(item){ - game.saveConfig('update_link',item); - lib.updateURL=lib.updateURLS[item]||lib.updateURLS.coding; - }, - }, - extension_source:{ - name:'获取扩展地址', - init:'GitHub Proxy', - unfrequent:true, - item:{}, - intro:()=>`获取在线扩展时的地址。当前地址:${document.createElement('br').outerHTML}${lib.config.extension_sources[lib.config.extension_source]}` - }, - extension_create:{ - name:'添加获取扩展地址', - clear:true, - unfrequent:true, - onclick:function(){ - game.prompt('请输入地址名称',function(str){ - if(str){ - var map=lib.config.extension_sources; - game.prompt('请输入'+str+'的地址',function(str2){ - if(str2){ - delete map[str]; - map[str]=str2; - game.saveConfig('extension_sources',map); - game.saveConfig('extension_source',str); - var nodexx=ui.extension_source; - nodexx.updateInner(); - var nodeyy=nodexx._link.menu; - var nodezz=nodexx._link.config; - for(var i=0;i
    '); - } - }, - onclick:gnc.of(function*(theme){ - game.saveConfig('theme',theme); - ui.arena.hide(); - lib.init.background(); - if(lib.config.autostyle){ - if(theme === "simple"){ - lib.configMenu.appearence.config.player_border.onclick("slim"); - } - else{ - lib.configMenu.appearence.config.player_border.onclick("normal"); - } - } - lib.announce.publish("Noname.Apperaence.Theme.onChanging", theme); - yield new Promise(resolve => setTimeout(resolve, 500)); - - const deletingTheme = ui.css.theme; - ui.css.theme=lib.init.css(lib.assetURL+'theme/'+lib.config.theme,'style'); - deletingTheme.remove(); - lib.announce.publish("Noname.Apperaence.Theme.onChanged", theme); - yield new Promise(resolve => setTimeout(resolve, 100)); - - ui.arena.show(); - lib.announce.publish("Noname.Apperaence.Theme.onChangeFinished", theme); - }) - }, - layout:{ - name:'布局', - init:'mobile', - item:{ - //default:'旧版', - newlayout:'对称', - mobile:'默认', - long:'宽屏', - long2:'手杀', - nova:'新版' - }, - visualMenu:function(node,link){ - node.className='button character themebutton '+lib.config.theme; - if(!node.created){ - node.created=true; - node.style.overflow='hidden'; - node.firstChild.style.display='none'; - // node.firstChild.classList.add('shadowed'); - // node.firstChild.style.width='16px'; - // node.firstChild.style.height='auto'; - // node.firstChild.style.padding='2px'; - // node.firstChild.style.textAlign='center'; - var me=ui.create.div(node); - me.style.top='auto'; - if(link=='default'||link=='newlayout'){ - me.style.width='calc(100% - 6px)'; - me.style.left='3px'; - me.style.bottom='3px'; - me.style.height='25px'; - if(link=='newlayout'){ - me.style.height='23px'; - me.style.bottom='4px'; - } - } - else if(link=='long2'||link=='nova'){ - me.style.display='none'; - } - else{ - me.style.width='120%'; - me.style.left='-10%'; - me.style.bottom='0'; - me.style.height='22px'; - } - me.style.borderRadius='2px'; - var list=['re_caocao','re_liubei','sp_zhangjiao','sunquan']; - for(var i=0;i<4;i++){ - var player=ui.create.div('.fakeplayer',node); - ui.create.div('.avatar',player).setBackground(list.randomRemove(),'character'); - player.style.borderRadius='2px'; - if(i!=3){ - player.style.top='auto'; - } - if(link=='default'){ - player.style.height='19px'; - player.style.width='38px'; - player.classList.add('oldlayout') - } - else if(link=='mobile'||link=='newlayout'){ - player.style.width='24px'; - player.style.height='29px'; - } - else if(link=='nova') { - player.style.width='20px'; - player.style.height='24px'; - } - else{ - player.style.width='20px'; - player.style.height='34px'; - } - if(i==1){ - player.style.left='3px'; - } - if(i==2){ - player.style.left='auto'; - player.style.right='3px'; - } - if(i==3){ - player.style.top='3px'; - } - if(link=='default'){ - if(i==0){ - player.style.bottom='6px'; - } - if(i==0||i==3){ - player.style.left='calc(50% - 18px)'; - } - if(i==1||i==2){ - player.style.bottom='36px'; - } - } - else if(link=='newlayout'){ - if(i==0){ - player.style.bottom='1px'; - } - if(i==0||i==3){ - player.style.left='calc(50% - 12px)'; - } - if(i==1||i==2){ - player.style.bottom='32px'; - } - } - else if(link=='mobile'){ - if(i==0||i==3){ - player.style.left='calc(50% - 12px)'; - } - if(i==1||i==2){ - player.style.bottom='30px'; - } - } - else if(link=='long'){ - if(i==0||i==3){ - player.style.left='calc(50% - 10px)'; - } - if(i==1||i==2){ - player.style.bottom='45px'; - } - } - else if(link=='long2'){ - if(i==0){ - player.style.bottom='2px'; - player.style.left='3px'; - } - if(i==3){ - player.style.left='calc(50% - 10px)'; - } - if(i==1||i==2){ - player.style.bottom='45px'; - } - } - else if(link=='nova'){ - if(i==0){ - player.style.bottom='2px'; - player.style.left='3px'; - } - if(i==3){ - player.style.left='calc(50% - 10px)'; - } - if(i==1||i==2){ - player.style.left='3px'; - player.style.bottom=(i*30)+'px'; - } - } - - if(i==0&&(link=='mobile'||link=='long')){ - player.classList.add('me'); - player.style.borderRadius='0px'; - player.style.width='25px'; - player.style.height='25px'; - player.style.bottom='-3px'; - player.style.left='-3px'; - } - } - } - }, - onclick:function(layout){ - if(lib.layoutfixed.contains(lib.config.mode)){ - game.saveConfig('layout',layout); - } - else{ - lib.init.layout(layout); - } - } - }, - splash_style:{ - name:'启动页', - item:{ - style1:'样式一', - style2:'样式二', - }, - visualMenu:(node,link)=>{ - node.className='button character'; - node.style.width='200px'; - node.style.height=`${node.offsetWidth*1080/2400}px`; - node.style.display='flex'; - node.style.flexDirection='column'; - node.style.alignItems='center'; - node.style.backgroundSize='100% 100%'; - node.setBackgroundImage(`image/splash/${link}.jpg`); - } - }, - // fewplayer:{ - // name:'启用人数', - // intro:'设置启用新版布局的最小人数(不足时切换至默认布局)', - // init:'3', - // // unfrequent:true, - // item:{ - // '2':'两人', - // '3':'三人', - // '4':'四人', - // '5':'五人', - // '6':'六人', - // '7':'七人', - // '8':'八人', - // }, - // onclick:function(item){ - // game.saveConfig('fewplayer',item); - // if(ui.arena) ui.arena.setNumber(ui.arena.dataset.number); - // } - // }, - player_height:{ - name:'角色高度', - init:'long', - // unfrequent:true, - item:{ - short:'矮', - default:'中', - long:'高', - }, - onclick:function(item){ - game.saveConfig('player_height',item); - ui.arena.dataset.player_height=item; - } - }, - player_height_nova:{ - name:'角色高度', - init:'short', - item:{ - // auto:'自动', - short:'矮', - default:'中', - long:'高', - }, - onclick:function(item){ - game.saveConfig('player_height_nova',item); - // if(item=='auto'){ - // if(parseInt(ui.arena.dataset.number)>=7){ - // ui.arena.dataset.player_height_nova='short'; - // } - // else{ - // ui.arena.dataset.player_height_nova='default'; - // } - // } - // else{ - ui.arena.dataset.player_height_nova=item; - // } - } - }, - // background_color_music:{ - // name:'背景色', - // init:'black', - // item:{ - // blue:'蓝色', - // black:'黑色', - // }, - // onclick:function(color){ - // game.saveConfig('background_color_music',color); - // document.body.dataset.background_color_music=color; - // } - // }, - // background_color_wood:{ - // name:'背景色', - // init:'blue', - // item:{ - // blue:'蓝色', - // black:'黑色', - // }, - // onclick:function(color){ - // game.saveConfig('background_color_wood',color); - // document.body.dataset.background_color_wood=color; - // } - // }, - // theme_color_music:{ - // name:'主题色', - // init:'black', - // item:{ - // blue:'蓝色', - // black:'黑色', - // }, - // onclick:function(color){ - // game.saveConfig('theme_color_music',color); - // document.body.dataset.theme_color_music=color; - // } - // }, - ui_zoom:{ - name:'界面缩放', - unfrequent:true, - init:'normal', - item:{ - esmall:'80%', - vsmall:'90%', - small:'95%', - normal:'100%', - big:'105%', - vbig:'110%', - ebig:'120%', - eebig:'150%', - eeebig:'180%', - eeeebig:'200%', - }, - onclick:function(zoom){ - game.saveConfig('ui_zoom',zoom); - switch(zoom){ - case 'esmall':zoom=0.8;break; - case 'vsmall':zoom=0.9;break; - case 'small':zoom=0.93;break; - case 'big':zoom=1.05;break; - case 'vbig':zoom=1.1;break; - case 'ebig':zoom=1.2;break; - case 'eebig':zoom=1.5;break; - case 'eeebig':zoom=1.8;break; - case 'eeeebig':zoom=2;break; - default:zoom=1; - } - game.documentZoom=game.deviceZoom*zoom; - ui.updatez(); - if (Array.isArray(lib.onresize)) { - lib.onresize.forEach(fun => { - if (typeof fun == 'function') fun(); - }); - } - } - }, - image_background:{ - name:'游戏背景', - init:'default', - item:{}, - visualBar:function(node,item,create){ - if(node.created){ - node.lastChild.classList.remove('active'); - return; - } - node.created=true; - ui.create.filediv('.menubutton','添加背景',node,function(file){ - if(file){ - var name=file.name; - if(name.includes('.')){ - name=name.slice(0,name.indexOf('.')); - } - var link=(game.writeFile?'cdv_':'custom_')+name; - if(item[link]){ - for(var i=1;i<1000;i++){ - if(!item[link+'_'+i]){ - link=link+'_'+i;break; - } - } - } - item[link]=name; - var callback=function(){ - create(link,node.parentNode.defaultNode); - node.parentNode.updateBr(); - lib.config.customBackgroundPack.add(link); - game.saveConfig('customBackgroundPack',lib.config.customBackgroundPack); - }; - if(game.writeFile){ - game.writeFile(file,'image/background',link+'.jpg',callback); - } - else{ - game.putDB('image',link,file,callback); - } - if(node.lastChild.classList.contains('active')){ - editbg.call(node.lastChild); - } - } - }).inputNode.accept='image/*'; - var editbg=function(){ - this.classList.toggle('active'); - var page=this.parentNode.parentNode; - for(var i=0;i4){ - node.classList.add('hideadd'); - button.classList.remove('transparent'); - delete node.currentDB; - } - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - }); - } - }).inputNode.accept='image/*'; - deletepic=ui.create.div('.menubutton.deletebutton','删除图片',node,function(){ - if(confirm('确定删除自定义图片?(此操作不可撤销)')){ - game.deleteDB('image','hp_style1'); - game.deleteDB('image','hp_style2'); - game.deleteDB('image','hp_style3'); - game.deleteDB('image','hp_style4'); - for(var i=0;idiv:not(.lost){background-image:url('+fileLoadedEvent.target.result+')}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - game.getDB('image','hp_style2',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.hp_stylesheet2){ - ui.css.hp_stylesheet2.remove(); - } - ui.css.hp_stylesheet2=lib.init.sheet('.hp:not(.text):not(.actcount)[data-condition="mid"]>div:not(.lost){background-image:url('+fileLoadedEvent.target.result+')}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - game.getDB('image','hp_style3',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.hp_stylesheet3){ - ui.css.hp_stylesheet3.remove(); - } - ui.css.hp_stylesheet3=lib.init.sheet('.hp:not(.text):not(.actcount)[data-condition="low"]>div:not(.lost){background-image:url('+fileLoadedEvent.target.result+')}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - game.getDB('image','hp_style4',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.hp_stylesheet4){ - ui.css.hp_stylesheet4.remove(); - } - ui.css.hp_stylesheet4=lib.init.sheet('.hp:not(.text):not(.actcount)>.lost{background-image:url('+fileLoadedEvent.target.result+')}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - } - }, - unfrequent:true, - }, - player_style:{ - name:'角色背景', - init:'default', - intro:'设置角色的背景图片', - item:{ - wood:'木纹', - music:'音乐', - simple:'简约', - custom:'自定', - default:'默认', - }, - visualBar:function(node,item,create,switcher){ - if(node.created){ - return; - } - var button; - for(var i=0;i.framebg{display:block;background-image:url("'+fileLoadedEvent.target.result+'")}',0); - ui.css.border_stylesheet.sheet.insertRule('.player>.count{z-index: 3 !important;border-radius: 2px !important;text-align: center !important;}',0); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - } - else if(layout!='default'&&layout!='auto'){ - ui.css.border_stylesheet=lib.init.sheet(); - if(layout.startsWith('dragon_')){ - layout=layout.slice(7); - ui.arena.dataset.framedecoration=layout; - } - else{ - ui.arena.dataset.framedecoration=''; - } - ui.css.border_stylesheet.sheet.insertRule('#window .player>.framebg,#window #arena.long.mobile:not(.fewplayer) .player[data-position="0"]>.framebg{display:block;background-image:url("'+lib.assetURL+'theme/style/player/'+layout+'1.png")}',0); - ui.css.border_stylesheet.sheet.insertRule('#window #arena.long:not(.fewplayer) .player>.framebg, #arena.oldlayout .player>.framebg{background-image:url("'+lib.assetURL+'theme/style/player/'+layout+'3.png")}',0); - ui.css.border_stylesheet.sheet.insertRule('.player>.count{z-index: 3 !important;border-radius: 2px !important;text-align: center !important;}',0); - } - }, - unfrequent:true, - }, - autoborder_count:{ - name:'边框升级方式', - intro:'击杀 每击杀一人,边框提升两级
    伤害 每造成两点伤害,边框提升一级
    混合 击杀量决定边框颜色,伤害量决定边框装饰', - init:'kill', - item:{ - kill:'击杀', - damage:'伤害', - mix:'混合', - }, - unfrequent:true, - }, - autoborder_start:{ - name:'基础边框颜色', - init:'bronze', - item:{ - bronze:'铜', - silver:'银', - gold:'金' - }, - unfrequent:true - }, - player_border:{ - name:'边框宽度', - init:'normal', - intro:'设置角色的边框宽度', - unfrequent:true, - item:{ - slim:'细', - narrow:'窄', - normal:'中', - wide:'宽' - }, - onclick:function(item){ - game.saveConfig('player_border',item); - if(item!='wide'||game.layout=='long'||game.layout=='long2'){ - ui.arena.classList.add('slim_player'); - } - else{ - ui.arena.classList.remove('slim_player'); - } - if(item=='slim'){ - ui.arena.classList.add('uslim_player'); - } - else{ - ui.arena.classList.remove('uslim_player'); - } - if(item=='narrow'){ - ui.arena.classList.add('mslim_player'); - } - else{ - ui.arena.classList.remove('mslim_player'); - } - if(item=='normal'&&lib.config.mode!='brawl'&&(game.layout=='long'||game.layout=='long2')){ - ui.arena.classList.add('lslim_player'); - } - else{ - ui.arena.classList.remove('lslim_player'); - } - ui.window.dataset.player_border=item; - } - }, - menu_style:{ - name:'菜单背景', - init:'default', - item:{ - wood:'木纹', - music:'音乐', - simple:'简约', - custom:'自定', - default:'默认', - }, - visualBar:function(node,item,create,switcher){ - if(node.created){ - return; - } - var button; - for(var i=0;i.dialog.popped,html .menu,html .menubg{background-image:url("'+fileLoadedEvent.target.result+'");background-size:cover}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - } - else if(layout!='default'){ - var str=''; - switch(layout){ - case 'wood':str='url("'+lib.assetURL+'theme/woodden/wood2.png")';break; - case 'music':str='linear-gradient(#4b4b4b, #464646);color:white;text-shadow:black 0 0 2px';break; - case 'simple':str='linear-gradient(rgba(0,0,0,0.4), rgba(0,0,0,0.4));color:white;text-shadow:black 0 0 2px';break; - } - ui.css.menu_stylesheet=lib.init.sheet('html #window>.dialog.popped,html .menu,html .menubg{background-image:'+str+'}'); - } - }, - unfrequent:true, - }, - control_style:{ - name:'按钮背景', - init:'default', - item:{ - wood:'木纹', - music:'音乐', - simple:'简约', - custom:'自定', - default:'默认', - }, - visualBar:function(node,item,create,switcher){ - if(node.created){ - return; - } - var button; - for(var i=0;idiv>div{background-image:url("'+fileLoadedEvent.target.result+'")}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - } - else if(layout!='default'){ - var str=''; - switch(layout){ - case 'wood':str='url("'+lib.assetURL+'theme/woodden/wood.jpg")';break; - case 'music':str='linear-gradient(#4b4b4b, #464646);color:white;text-shadow:black 0 0 2px';break; - case 'simple':str='linear-gradient(rgba(0,0,0,0.4), rgba(0,0,0,0.4));color:white;text-shadow:black 0 0 2px';break; - } - if(layout=='wood'){ - ui.css.control_stylesheet=lib.init.sheet('#window .control,#window .menubutton,#window #system>div>div,#window #system>div>.pressdown2{background-image:'+str+'}'); - } - else{ - ui.css.control_stylesheet=lib.init.sheet('#window .control,.menubutton:not(.active):not(.highlight):not(.red):not(.blue),#window #system>div>div{background-image:'+str+'}'); - } - } - }, - unfrequent:true, - }, - custom_button:{ - name:'自定义按钮高度', - init:false, - unfrequent:true, - onclick:function(bool){ - if(bool!=='skip'){ - game.saveConfig('custom_button',bool); - } - if(ui.css.buttonsheet){ - ui.css.buttonsheet.remove(); - } - if(lib.config.custom_button){ - var cbnum1=6+(parseInt(lib.config.custom_button_system_top)||0); - var cbnum2=6+(parseInt(lib.config.custom_button_system_bottom)||0); - var cbnum3=3+(parseInt(lib.config.custom_button_control_top)||0); - var cbnum4=3+(parseInt(lib.config.custom_button_control_bottom)||0); - var cbnum5=2; - var cbnum6=2; - if(cbnum3<0){ - cbnum5+=cbnum3; - cbnum3=0; - } - if(cbnum4<0){ - cbnum6+=cbnum4; - cbnum4=0; - } - ui.css.buttonsheet=lib.init.sheet( - '#system>div>div, .caption>div>.tdnode{padding-top:'+cbnum1+'px !important;padding-bottom:'+cbnum2+'px !important}', - '#control>.control>div{padding-top:'+cbnum3+'px;padding-bottom:'+cbnum4+'px}', - '#control>.control{padding-top:'+cbnum5+'px;padding-bottom:'+cbnum6+'px}' - ); - } - } - }, - custom_button_system_top:{ - name:'菜单上部高度', - init:'0x', - item:{ - '-5x':'-5px', - '-4x':'-4px', - '-3x':'-3px', - '-2x':'-2px', - '-1x':'-1px', - '0x':'默认', - '1x':'1px', - '2x':'2px', - '3x':'3px', - '4x':'4px', - '5x':'5px', - }, - unfrequent:true, - onclick:function(item){ - game.saveConfig('custom_button_system_top',item); - lib.configMenu.appearence.config.custom_button.onclick('skip'); - } - }, - custom_button_system_bottom:{ - name:'菜单下部高度', - init:'0x', - item:{ - '-5x':'-5px', - '-4x':'-4px', - '-3x':'-3px', - '-2x':'-2px', - '-1x':'-1px', - '0x':'默认', - '1x':'1px', - '2x':'2px', - '3x':'3px', - '4x':'4px', - '5x':'5px', - }, - unfrequent:true, - onclick:function(item){ - game.saveConfig('custom_button_system_bottom',item); - lib.configMenu.appearence.config.custom_button.onclick('skip'); - } - }, - custom_button_control_top:{ - name:'技能上部高度', - init:'0x', - item:{ - '-5x':'-5px', - '-4x':'-4px', - '-3x':'-3px', - '-2x':'-2px', - '-1x':'-1px', - '0x':'默认', - '1x':'1px', - '2x':'2px', - '3x':'3px', - '4x':'4px', - '5x':'5px', - }, - unfrequent:true, - onclick:function(item){ - game.saveConfig('custom_button_control_top',item); - lib.configMenu.appearence.config.custom_button.onclick('skip'); - } - }, - custom_button_control_bottom:{ - name:'技能下部高度', - init:'0x', - item:{ - '-5x':'-5px', - '-4x':'-4px', - '-3x':'-3px', - '-2x':'-2px', - '-1x':'-1px', - '0x':'默认', - '1x':'1px', - '2x':'2px', - '3x':'3px', - '4x':'4px', - '5x':'5px', - }, - unfrequent:true, - onclick:function(item){ - game.saveConfig('custom_button_control_bottom',item); - lib.configMenu.appearence.config.custom_button.onclick('skip'); - } - }, - radius_size:{ - name:'圆角大小', - init:'default', - item:{ - off:'关闭', - reduce:'减小', - default:'默认', - increase:'增大', - }, - unfrequent:true, - onclick:function(item){ - game.saveConfig('radius_size',item); - ui.window.dataset.radius_size=item; - } - }, - glow_phase:{ - name:'当前回合角色高亮', - unfrequent:true, - init:'yellow', - intro:'设置当前回合角色的边框颜色', - item:{ - none:'无', - yellow:'黄色', - green:'绿色', - purple:'紫色', - }, - onclick:function(bool){ - game.saveConfig('glow_phase',bool); - lib.init.cssstyles(); - } - }, - fold_card:{ - name:'折叠手牌', - init:true, - unfrequent:true, - }, - fold_mode:{ - name:'折叠模式菜单', - intro:'关闭后模式菜单中“更多”内的项目将直接展开', - init:true, - unfrequent:true, - }, - seperate_control:{ - name:'分离选项条', - init:true, - unfrequent:true, - intro:'开启后玩家在进行选择时不同的选项将分开,而不是连在一起', - }, - blur_ui:{ - name:'模糊效果', - intro:'在暂停或打开菜单时开启模糊效果', - init:false, - unfrequent:true, - onclick:function(bool){ - game.saveConfig('blur_ui',bool); - if(bool){ - ui.window.classList.add('blur_ui'); - } - else{ - ui.window.classList.remove('blur_ui'); - } - } - }, - glass_ui:{ - name:'玻璃主题', - intro:'为游戏主题打开玻璃效果(手机暂不支持)', - init:false, - unfrequent:true, - onclick:function(bool){ - game.saveConfig('glass_ui',bool); - if(bool){ - ui.window.classList.add('glass_ui'); - } - else{ - ui.window.classList.remove('glass_ui'); - } - } - }, - damage_shake:{ - name:'伤害抖动', - intro:'角色受到伤害时的抖动效果', - init:true, - unfrequent:true, - }, - button_press:{ - name:'按钮效果', - intro:'选项条被按下时将有按下效果', - init:true, - unfrequent:true, - }, - jiu_effect:{ - name:'喝酒效果', - init:true, - unfrequent:true, - }, - animation:{ - name:'游戏特效', - intro:'开启后出现属性伤害、回复体力等情况时会显示动画', - init:false, - unfrequent:true, - }, - skill_animation_type:{ - name:'技能特效', - intro:'开启后觉醒技、限定技将显示全屏文字', - init:'default', - unfrequent:true, - item:{ - default:'默认', - old:'旧版', - off:'关闭' - } - }, - die_move:{ - name:'阵亡效果', - intro:'阵亡后武将的显示效果', - init:'flip', - unfrequent:true, - item:{ - off:'关闭', - move:'移动', - flip:'翻面', - } - }, - target_shake:{ - name:'目标效果', - intro:'一名玩家成为卡牌或技能的目标时的显示效果', - init:'off', - item:{ - off:'关闭', - zoom:'缩放', - shake:'抖动', - }, - unfrequent:true, - onclick:function(bool){ - game.saveConfig('target_shake',bool); - ui.arena.dataset.target_shake=bool; - } - }, - turned_style:{ - name:'翻面文字', - intro:'角色被翻面时显示“翻面”', - init:true, - unfrequent:true, - onclick:function(bool){ - game.saveConfig('turned_style',bool); - if(bool){ - ui.arena.classList.remove('hide_turned'); - } - else{ - ui.arena.classList.add('hide_turned'); - } - } - }, - link_style2:{ - name:'横置样式', - intro:'设置角色被横置时的样式', - init:'chain', - unfrequent:true, - item:{ - chain:'铁索', - rotate:'横置', - mark:'标记' - }, - onclick:function(style){ - var list=[]; - for(var i=0;i{ - node.classList.add('button','character'); - const style=node.style; - style.alignItems='center'; - style.animation='background-position-left-center-right-center-left-center 15s ease infinite'; - style.background='linear-gradient(-45deg, #EE7752, #E73C7E, #23A6D5, #23D5AB)'; - style.backgroundSize='400% 400%'; - style.display='flex'; - style.height='60px'; - style.justifyContent='center'; - style.width='180px'; - const firstChild=node.firstChild; - firstChild.removeAttribute('class'); - firstChild.style.position='initial'; - if(link=='doNotShow') return; - const ruby=document.createElement('ruby'); - ruby.textContent=name; - const rt=document.createElement('rt'); - rt.style.fontSize='smaller'; - if(link=='showPinyin2'||link=='showCodeIdentifier2'){ - rt.textContent=link=='showCodeIdentifier2'?'['+link+']':'['+get.pinyin(name)+']'; - ruby.appendChild(rt); - }else{ - const leftParenthesisRP=document.createElement('rp'); - leftParenthesisRP.textContent='('; - ruby.appendChild(leftParenthesisRP); - rt.textContent=link=='showCodeIdentifier'?link:get.pinyin(name).join(' '); - ruby.appendChild(rt); - const rightParenthesisRP=document.createElement('rp'); - rightParenthesisRP.textContent=')'; - ruby.appendChild(rightParenthesisRP); - } - firstChild.innerHTML=ruby.outerHTML; - } - }, - show_skillnamepinyin:{ - name:'显示技能名注解', - intro:'在武将资料卡显示技能名注解', - get init(){ - return lib.configMenu.view.config.show_characternamepinyin.init; - }, - get unfrequent(){ - return lib.configMenu.view.config.show_characternamepinyin.unfrequent; - }, - get item(){ - return lib.configMenu.view.config.show_characternamepinyin.item; - }, - get visualMenu(){ - return lib.configMenu.view.config.show_characternamepinyin.visualMenu; - } - } - } - }, - audio:{ - name:'音效', - config:{ - update:function(config,map){ - if(lib.config.background_music=='music_custom'&&(lib.device||lib.node)){ - map.import_music.show(); - } - else{ - map.import_music.hide(); - } - map.clear_background_music[get.is.object(lib.config.customBackgroundMusic)?'show':'hide'](); - ui.background_music_setting=map.background_music; - map.background_music._link.config.updatex.call(map.background_music,[]); - }, - background_music:{ - updatex:function(){ - this.lastChild.innerHTML=this._link.config.item[lib.config.background_music]; - var menu=this._link.menu; - for(var i=0;i'+ - ''+ - '', - clear:true, - }, - background_audio:{ - name:'游戏音效', - init:true, - }, - background_speak:{ - name:'人物配音', - init:true, - }, - equip_audio:{ - name:'装备配音', - init:false, - }, - repeat_audio:{ - name:'播放重复语音', - init:false, - }, - volumn_audio:{ - name:'音效音量', - init:8, - item:{ - '0':'〇', - '1':'一', - '2':'二', - '3':'三', - '4':'四', - '5':'五', - '6':'六', - '7':'七', - '8':'八', - }, - onclick:function(volume){ - game.saveConfig('volumn_audio',parseInt(volume)); - } - }, - volumn_background:{ - name:'音乐音量', - init:8, - item:{ - '0':'〇', - '1':'一', - '2':'二', - '3':'三', - '4':'四', - '5':'五', - '6':'六', - '7':'七', - '8':'八', - }, - onclick:function(volume){ - game.saveConfig('volumn_background',parseInt(volume)); - ui.backgroundMusic.volume=volume/8; - } - }, - clear_background_music:{ - name:'清除自定义背景音乐', - clear:true, - onclick:function(){ - if(confirm('是否清除已导入的所有自定义背景音乐?(该操作不可撤销!)')){ - for(var i in lib.config.customBackgroundMusic){ - lib.config.all.background_music.remove(i); - if(i.startsWith('cdv_')){ - game.removeFile('audio/background/'+i+'.mp3'); - } - else{ - game.deleteDB('audio',i); - } - } - lib.config.customBackgroundMusic=null; - game.saveConfig('customBackgroundMusic',null); - game.saveConfig('background_music','music_off'); - if(!_status._aozhan) game.playBackgroundMusic(); - } - }, - }, - } - }, - skill:{ - name:'技能', - config:{ - update:function(config,map){ - for(var i in map){ - if(map[i]._link.config.type=='autoskill'){ - if(!lib.config.autoskilllist.contains(i)){ - map[i].classList.add('on'); - } - else{ - map[i].classList.remove('on'); - } - } - else if(map[i]._link.config.type=='banskill'){ - if(!lib.config.forbidlist.contains(i)){ - map[i].classList.add('on'); - } - else{ - map[i].classList.remove('on'); - } - } - } - } - } - }, - others:{ - name:'其它', - config:{ - // reset_database:{ - // name:'重置游戏', - // onclick:function(){ - // var node=this; - // if(node._clearing){ - // if(indexedDB) indexedDB.deleteDatabase(lib.configprefix+'data'); - // game.reload(); - // return; - // } - // node._clearing=true; - // node.innerHTML='单击以确认 (3)'; - // setTimeout(function(){ - // node.innerHTML='单击以确认 (2)'; - // setTimeout(function(){ - // node.innerHTML='单击以确认 (1)'; - // setTimeout(function(){ - // node.innerHTML='重置游戏录像'; - // delete node._clearing; - // },1000); - // },1000); - // },1000); - // }, - // clear:true - // }, - reset_game:{ - name:'重置游戏设置', - onclick:function(){ - var node=this; - if(node._clearing){ - var noname_inited=localStorage.getItem('noname_inited'); - var onlineKey=localStorage.getItem(lib.configprefix+'key'); - localStorage.clear(); - if(noname_inited){ - localStorage.setItem('noname_inited',noname_inited); - } - if(onlineKey){ - localStorage.setItem(lib.configprefix+'key',onlineKey); - } - game.deleteDB('config'); - game.deleteDB('data'); - game.reload(); - return; - } - node._clearing=true; - node.firstChild.innerHTML='单击以确认 (3)'; - setTimeout(function(){ - node.firstChild.innerHTML='单击以确认 (2)'; - setTimeout(function(){ - node.firstChild.innerHTML='单击以确认 (1)'; - setTimeout(function(){ - node.firstChild.innerHTML='重置游戏设置'; - delete node._clearing; - },1000); - },1000); - },1000); - }, - clear:true - }, - reset_hiddenpack:{ - name:'重置隐藏内容', - onclick:function(){ - if(this.firstChild.innerHTML!='已重置'){ - this.firstChild.innerHTML='已重置' - game.saveConfig('hiddenModePack',[]); - game.saveConfig('hiddenCharacterPack',[]); - game.saveConfig('hiddenCardPack',[]); - game.saveConfig('hiddenPlayPack',[]); - game.saveConfig('hiddenBackgroundPack',[]); - var that=this; - setTimeout(function(){ - that.firstChild.innerHTML='重置隐藏内容'; - setTimeout(function(){ - if(confirm('是否重新启动使改变生效?')){ - game.reload(); - } - }); - },500); - } - }, - clear:true - }, - reset_tutorial:{ - name:'重置新手向导', - onclick:function(){ - if(this.firstChild.innerHTML!='已重置'){ - this.firstChild.innerHTML='已重置' - game.saveConfig('new_tutorial',false); - game.saveConfig('prompt_hidebg'); - game.saveConfig('prompt_hidepack'); - var that=this; - setTimeout(function(){ - that.firstChild.innerHTML='重置新手向导'; - },500); - } - }, - clear:true - }, - import_data:{ - name:'导入游戏设置', - onclick:function(){ - ui.import_data_button.classList.toggle('hidden'); - }, - clear:true - }, - import_data_button:{ - name:'
    '+ - ''+ - '
    ', - clear:true, - }, - export_data:{ - name:'导出游戏设置', - onclick:function(){ - var data; - var export_data=function(data){ - game.export(lib.init.encode(JSON.stringify(data)),'无名杀 - 数据 - '+(new Date()).toLocaleString()); - } - if(!lib.db){ - data={}; - for(var i in localStorage){ - if(i.startsWith(lib.configprefix)){ - data[i]=localStorage[i]; - } - } - export_data(data); - } - else{ - game.getDB('config',null,function(data1){ - game.getDB('data',null,function(data2){ - export_data({ - config:data1, - data:data2 - }); - }); - }); - } - - }, - clear:true - }, - redownload_game:{ - name:'重新下载游戏', - onclick:function(){ - var node=this; - if(node._clearing){ - localStorage.removeItem('noname_inited'); - game.reload(); - return; - } - node._clearing=true; - node.firstChild.innerHTML='单击以确认 (3)'; - setTimeout(function(){ - node.firstChild.innerHTML='单击以确认 (2)'; - setTimeout(function(){ - node.firstChild.innerHTML='单击以确认 (1)'; - setTimeout(function(){ - node.firstChild.innerHTML='重新下载游戏'; - delete node._clearing; - },1000); - },1000); - },1000); - }, - clear:true - }, - update:function(config,map){ - if(lib.device||lib.node){ - map.redownload_game.show(); - } - else{ - map.redownload_game.hide(); - } - } - // trim_game:{ - // name:'隐藏非官方扩展包', - // onclick:function(){ - // if(this.innerHTML!='已隐藏'){ - // this.innerHTML='已隐藏'; - // var pack=lib.config.all.cards.slice(0); - // if(Array.isArray(lib.config.hiddenCardPack)){ - // for(var i=0;igame.players.length*num&&game.showIdentity){ - _status.identityShown=true; - game.showIdentity(false); - } - }, - intro:'游戏进行若干轮将自动显示所有角色的身份', - }, - auto_mark_identity:{ - name:'自动标记身份', - init:true, - intro:'根据角色的出牌行为自动标记可能的身份', - }, - // ban_weak:{ - // name:'屏蔽弱将', - // init:true, - // restart:true, - // }, - // ban_strong:{ - // name:'屏蔽强将', - // init:false, - // restart:true, - // }, - enhance_zhu:{ - name:'加强主公', - init:false, - restart:true, - intro:'为主公增加一个额外技能' - }, - free_choose:{ - name:'自由选将', - init:true, - onclick:function(bool){ - game.saveConfig('free_choose',bool,this._link.config.mode); - if(get.mode()!=this._link.config.mode||!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(!ui.cheat2&&get.config('free_choose')) ui.create.cheat2(); - else if(ui.cheat2&&!get.config('free_choose')){ - ui.cheat2.close(); - delete ui.cheat2; - } - } - }, - change_identity:{ - name:'自由选择身份和座位', - init:true, - onclick:function(bool){ - game.saveConfig('change_identity',bool,this._link.config.mode); - if(get.mode()!='identity'||!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - var dialog; - if(ui.cheat2&&ui.cheat2.backup) dialog=ui.cheat2.backup; - else dialog=_status.event.dialog; - if(!_status.brawl||!_status.brawl.noAddSetting){ - if(!dialog.querySelector('table')&&get.config('change_identity')) _status.event.getParent().addSetting(dialog); - else _status.event.getParent().removeSetting(dialog); - } - ui.update(); - } - }, - change_choice:{ - name:'开启换将卡', - init:true, - onclick:function(bool){ - game.saveConfig('change_choice',bool,this._link.config.mode); - if(get.mode()!='identity'||!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(!ui.cheat&&get.config('change_choice')) ui.create.cheat(); - else if(ui.cheat&&!get.config('change_choice')){ - ui.cheat.close(); - delete ui.cheat; - } - } - }, - change_card:{ - name:'开启手气卡', - init:'disabled', - item:{ - disabled:'禁用', - once:'一次', - twice:'两次', - unlimited:'无限', - }, - }, - round_one_use_fury:{ - name:'开启首轮强化卡牌', - init:false, - frequent:false, - restart:true, - intro:'谋攻篇规则为第二轮开始才可使用怒气强化卡牌,开启此选项从游戏开始即可强化卡牌。' - }, - nei_auto_mark_camouflage:{ - name:'内奸自动标记伪装反贼', - intro:'玩家内奸在游戏开始洞察结束后,自动将被洞察角色标记为反贼。', - init:false, - unfrequent:true, - }, - continue_game:{ - name:'显示再战', - init:false, - onclick:function(bool){ - game.saveConfig('continue_game',bool,this._link.config.mode); - if(get.config('continue_game')&&get.mode()=='identity'){ - if(!ui.continue_game&&_status.over&&!_status.brawl&&!game.no_continue_game){ - ui.continue_game=ui.create.control('再战',game.reloadCurrent); - } - } - else if(ui.continue_game){ - ui.continue_game.close(); - delete ui.continue_game; - } - }, - intro:'游戏结束后可选择用相同的武将再进行一局游戏' - }, - dierestart:{ - name:'死亡后显示重来', - init:true, - onclick:function(bool){ - game.saveConfig('dierestart',bool,this._link.config.mode); - if(get.config('dierestart')&&get.mode()=='identity'){ - if(!ui.restart&&game.me.isDead()&&!_status.connectMode){ - ui.restart=ui.create.control('restart',game.reload); - } - } - else if(ui.restart){ - ui.restart.close(); - delete ui.restart; - } - } - }, - revive:{ - name:'死亡后显示复活', - init:false, - onclick:function(bool){ - game.saveConfig('revive',bool,this._link.config.mode); - if(get.config('revive')&&get.mode()=='identity'){ - if(!ui.revive&&game.me.isDead()){ - ui.revive=ui.create.control('revive',ui.click.dierevive); - } - } - else if(ui.revive){ - ui.revive.close(); - delete ui.revive; - } - } - }, - ban_identity:{ - name:'屏蔽身份', - init:'off', - item:{ - off:'关闭', - zhu:'主公', - zhong:'忠臣', - nei:'内奸', - fan:'反贼', - }, - }, - ban_identity2:{ - name:'屏蔽身份2', - init:'off', - item:{ - off:'关闭', - zhu:'主公', - zhong:'忠臣', - nei:'内奸', - fan:'反贼', - }, - }, - ban_identity3:{ - name:'屏蔽身份3', - init:'off', - item:{ - off:'关闭', - zhu:'主公', - zhong:'忠臣', - nei:'内奸', - fan:'反贼', - }, - }, - ai_strategy:{ - name:'内奸策略', - init:'ai_strategy_1', - item:{ - ai_strategy_1:'均衡', - ai_strategy_2:'偏反', - ai_strategy_3:'偏忠', - ai_strategy_4:'酱油', - ai_strategy_5:'天使', - ai_strategy_6:'仇主', - }, - intro:'设置内奸对主忠反的态度' - }, - difficulty:{ - name:'AI对人类态度', - init:'normal', - item:{ - easy:'友好', - normal:'一般', - hard:'仇视', - }, - }, - choice_zhu:{ - name:'主公候选武将数', - init:'3', - restart:true, - item:{ - '3':'三', - '4':'四', - '5':'五', - '6':'六', - '8':'八', - '10':'十', - }, - }, - limit_zhu:{ - name:'常备主候选武将数', - init:'group', - restart:true, - item:{ - off:'不限制', - group:'按势力筛选', - '4':'四', - '6':'六', - '8':'八', - }, - }, - choice_zhong:{ - name:'忠臣候选武将数', - init:'4', - restart:true, - item:{ - '3':'三', - '4':'四', - '5':'五', - '6':'六', - '8':'八', - '10':'十', - }, - }, - choice_nei:{ - name:'内奸候选武将数', - init:'5', - restart:true, - item:{ - '3':'三', - '4':'四', - '5':'五', - '6':'六', - '8':'八', - '10':'十', - }, - }, - choice_fan:{ - name:'反贼候选武将数', - init:'3', - restart:true, - item:{ - '3':'三', - '4':'四', - '5':'五', - '6':'六', - '8':'八', - '10':'十', - }, - }, - enable_commoner:{ - name:'启用平民', - init:false, - restart:true, - frequent:false, - intro:'开启后游戏中将有一个平民(身份)加入游戏。
    具体规则请查看帮助。', - }, - choice_commoner:{ - name:'平民候选武将数', - init:'4', - restart:true, - item:{ - '3':'三', - '4':'四', - '5':'五', - '6':'六', - '8':'八', - '10':'十', - }, - }, - enable_year_limit:{ - name:'启用年机制', - init:false, - restart:true, - frequent:false, - intro:'开启后将会加入年机制。
    年机制的具体规则请查看帮助。', - }, - } - }, - guozhan:{ - name:'国战', - connect:{ - connect_guozhan_mode:{ - name:'游戏模式', - init:'normal', - item:{ - normal:'势备', - yingbian:'应变', - old:'怀旧', - }, - frequent:true, - restart:true, - intro:'
  • 势备:默认模式,使用线下《君临天下·势备篇》的牌堆进行游戏。
  • 应变:使用OL的应变国战牌堆进行游戏。
  • 怀旧:使用传统国战的牌堆进行游戏。', - }, - connect_player_number:{ - name:'游戏人数', - init:'8', - get item(){ - return lib.mode.guozhan.config.player_number.item; - }, - frequent:true, - restart:true, - }, - connect_aozhan:{ - name:'鏖战模式', - init:true, - intro:'若开启此选项,则将在游戏中引入“鏖战模式”的规则:
    当游戏中仅剩四名或更少角色时(七人以下游戏时改为三名或更少),若此时全场没有超过一名势力相同的角色,则从一个新的回合开始,游戏进入鏖战模式直至游戏结束。
    ◇在鏖战模式下,【桃】只能当做【杀】或【闪】使用或打出,不能用来回复体力。
    注:进入鏖战模式后,即使之后有两名或者更多势力相同的角色出现,仍然不会取消鏖战模式。', - frequent:true, - restart:true, - }, - get connect_separatism(){ - return lib.mode.guozhan.config.separatism; - }, - connect_initshow_draw:{ - name:'首亮奖励', - item:{ - 'off':'关闭', - 'draw':'摸牌', - 'mark':'标记', - }, - init:'mark', - frequent:true, - intro:'第一个明置武将牌的角色可获得首亮奖励' - }, - connect_viewnext:{ - name:'观看下家副将', - init:false, - intro:'若开启此选项,所有的玩家将在挑选武将后,分发起始手牌之前,分别观看自己下家的副将。', - }, - connect_zhulian:{ - name:'珠联璧合', - init:true, - // frequent:true, - intro:'主将和副将都明置后,若为特定组合,可获得【珠联璧合】标记' - }, - connect_junzhu:{ - name:'替换君主', - init:true, - // frequent:true, - restart:true, - intro:'若开启此选项,玩家的第一个回合开始时,若其主武将牌有对应的君主武将牌,则其可以将此武将牌替换为对应的君主武将牌,然后重新调整体力上限。若玩家的体力上限因此增大,则玩家回复等量的体力。' - }, - connect_change_card:{ - name:'启用手气卡', - init:false, - frequent:true, - restart:true, - }, - // connect_ban_weak:{ - // name:'屏蔽弱将', - // init:false, - // restart:true, - // }, - // connect_ban_strong:{ - // name:'屏蔽强将', - // init:false, - // restart:true, - // }, - }, - config:{ - update:function(config,map){ - if(config.onlyguozhan){ - map.junzhu.show(); - } - else{ - map.junzhu.hide(); - } - ui.aozhan_bgm=map.aozhan_bgm; - map.aozhan_bgm._link.config.updatex.call(map.aozhan_bgm,[]); - }, - guozhan_mode:{ - name:'游戏模式', - init:'normal', - item:{ - normal:'势备', - yingbian:'应变', - old:'怀旧', - free:'自由', - }, - frequent:true, - restart:true, - intro:'
  • 势备:默认模式,使用线下《君临天下·势备篇》的牌堆进行游戏。
  • 应变:使用OL的应变国战牌堆进行游戏。
  • 怀旧:使用传统国战的牌堆进行游戏。
  • 自由:使用玩家的自定义牌堆进行游戏。', - }, - player_number:{ - name:'游戏人数', - init:'8', - get item(){ - const minimumNumberOfPlayers=2,maximumNumberOfPlayers=Math.max(_status.maximumNumberOfPlayers||12,minimumNumberOfPlayers),item={}; - for(let playerNumber=minimumNumberOfPlayers;playerNumber<=maximumNumberOfPlayers;playerNumber++){ - item[playerNumber]=`${get.cnNumber(playerNumber)}人`; - } - return item; - }, - frequent:true, - restart:true, - }, - aozhan:{ - name:'鏖战模式', - init:true, - frequent:true, - restart:true, - intro:'若开启此选项,则将在游戏中引入“鏖战模式”的规则:
    当游戏中仅剩四名或更少角色时(七人以下游戏时改为三名或更少),若此时全场没有超过一名势力相同的角色,则从一个新的回合开始,游戏进入鏖战模式直至游戏结束。
    ◇在鏖战模式下,【桃】只能当做【杀】或【闪】使用或打出,不能用来回复体力。
    注:进入鏖战模式后,即使之后有两名或者更多势力相同的角色出现,仍然不会取消鏖战模式。', - }, - separatism:{ - name:'群雄割据', - init:false, - frequent:true, - restart:true, - intro:'开放不同势力组合,以优先亮出的武将牌作为自己的势力,双势力武将则使用列表的第一个势力' - }, - initshow_draw:{ - name:'首亮奖励', - item:{ - 'off':'关闭', - 'draw':'摸牌', - 'mark':'标记', - }, - init:'mark', - frequent:true, - intro:'第一个明置身份牌的角色可获得摸牌奖励' - }, - viewnext:{ - name:'观看下家副将', - init:false, - intro:'若开启此选项,所有的玩家将在挑选武将后,分发起始手牌之前,分别观看自己下家的副将。', - }, - aozhan_bgm:{ - updatex:function(){ - this.lastChild.innerHTML=this._link.config.item[lib.config.mode_config.guozhan.aozhan_bgm]; - if(!Array.isArray(_status.aozhanBGMToRemove)) return; - const menu=this._link.menu; - for(let i=0;i1v1', - }, - restart:true, - frequent:true, - }, - ladder:{ - name:'天梯模式', - init:true, - frequent:true, - restart:true - }, - ladder_monthly:{ - name:'每月重置天梯', - init:true, - frequent:true, - }, - enable_all:{ - name:'启用全部武将', - init:false, - frequent:true, - restart:true, - }, - enable_all_cards_four:{ - name:'启用全部卡牌', - init:false, - frequent:true, - restart:true, - }, - enable_all_three:{ - name:'启用全部武将', - init:false, - frequent:true, - restart:true, - }, - enable_all_cards:{ - name:'启用全部卡牌', - init:false, - frequent:true, - restart:true, - }, - four_assign:{ - name:'代替队友选将', - init:false, - restart:true, - }, - four_phaseswap:{ - name:'代替队友行动', - init:false, - restart:true, - }, - two_assign:{ - name:'代替队友选将', - init:false, - restart:true, - }, - two_phaseswap:{ - name:'代替队友行动', - init:false, - restart:true, - }, - free_choose:{ - name:'自由选将', - init:true, - frequent:true, - onclick:function(bool){ - game.saveConfig('free_choose',bool,this._link.config.mode); - if(!ui.create.cheat2) return; - if(get.mode()!=this._link.config.mode||!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(!ui.cheat2&&get.config('free_choose')) ui.create.cheat2(); - else if(ui.cheat2&&!get.config('free_choose')){ - ui.cheat2.close(); - delete ui.cheat2; - } - } - }, - fouralign:{ - name:'自由选择阵型', - init:false - }, - change_identity:{ - name:'自由选择座位', - init:true, - onclick:function(bool){ - game.saveConfig('change_identity',bool,this._link.config.mode); - if(!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(_status.mode=='four'){ - if(get.config('four_assign')||get.config('four_phaseswap')) return; - if(bool){ - if(_status.event.parent.addSetting){ - _status.event.parent.addSetting(); - } - } - else{ - var seats=_status.event.parent.seatsbutton; - if(seats){ - while(seats.length){ - seats.shift().remove(); - } - delete _status.event.parent.seatsbutton; - } - } - } - else{ - var dialog; - if(ui.cheat2&&ui.cheat2.backup) dialog=ui.cheat2.backup; - else dialog=_status.event.dialog; - if(!_status.brawl||!_status.brawl.noAddSetting){ - if(!dialog.querySelector('table')&&get.config('change_identity')) _status.event.getParent().addSetting(dialog); - else _status.event.getParent().removeSetting(dialog); - } - ui.update(); - } - } - }, - change_choice:{ - name:'开启换将卡', - init:true, - onclick:function(bool){ - game.saveConfig('change_choice',bool,this._link.config.mode); - if(!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(!ui.cheat&&get.config('change_choice')) ui.create.cheat(); - else if(ui.cheat&&!get.config('change_choice')){ - ui.cheat.close(); - delete ui.cheat; - } - }, - frequent:true, - }, - double_character_jiange:{ - name:'双将模式', - init:false, - frequent:true, - }, - replace_handcard_two:{ - name:'四号位保护', - init:true, - frequent:true, - intro:'最后行动的角色起始手牌+1' - }, - olfeiyang_four:{ - name:'四号位获得【飞扬】', - init:true, - frequent:true, - intro:'最后行动的角色获得技能【飞扬】(准备阶段,你可以弃置三张牌,然后弃置判定区的一张牌)', - }, - replace_character_two:{ - name:'替补模式', - init:false, - frequent:true, - intro:'每个额外选择一名武将,死亡后用该武将代替重新上场,替补武将用完时失败' - }, - expand_dialog:{ - name:'默认展开选将框', - intro:'选将框打开时直接显示全部武将(可能使游戏在开始时卡顿)', - init:false, - }, - siguo_character:{ - name:'专属武将出场率', - init:'increase', - item:{ - increase:'大概率', - normal:'默认概率', - off:'不出现', - }, - frequent:true - }, - // ban_weak:{ - // name:'屏蔽弱将', - // init:true, - // restart:true, - // }, - // ban_strong:{ - // name:'屏蔽强将', - // init:false, - // restart:true - // }, - ladder_reset:{ - name:'重置天梯数据', - onclick:function(){ - var node=this; - if(node._clearing){ - game.save('ladder',{ - current:900, - top:900, - month:(new Date()).getMonth() - }); - ui.ladder.innerHTML='卫士五'; - clearTimeout(node._clearing); - node.firstChild.innerHTML='重置天梯数据'; - delete node._clearing; - return; - } - node.firstChild.innerHTML='单击以确认 (3)'; - node._clearing=setTimeout(function(){ - node.firstChild.innerHTML='单击以确认 (2)'; - node._clearing=setTimeout(function(){ - node.firstChild.innerHTML='单击以确认 (1)'; - node._clearing=setTimeout(function(){ - node.firstChild.innerHTML='重置天梯数据'; - delete node._clearing; - },1000); - },1000); - },1000); - }, - clear:true, - }, - edit_character_three:{ - name:'编辑统率将池', - clear:true, - onclick:function(){ - if(get.mode()!='versus'){ - alert('请进入对决模式,然后再编辑将池'); - return; - } - var container=ui.create.div('.popup-container.editor'); - var node=container; - var map=get.config('character_three')||lib.choiceThree; - var str='character=[\n '; - for(var i=0;ilib.codeMirrorReady(node,editor)); - lib.init.css(lib.assetURL+'layout/default','codemirror'); - } - else{ - lib.codeMirrorReady(node,editor); - } - } - }, - }, - reset_character_three:{ - name:'重置统率将池', - intro:'将统率三军模式下的将池重置为默认将池', - clear:true, - onclick:function(){ - if(confirm('该操作不可撤销!是否清除统率三军模式的自定义将池,并将其重置为默认将池?')){ - game.saveConfig('character_three',null,'versus'); - alert('将池已重置'); - } - }, - }, - edit_character_four:{ - name:'编辑4v4将池', - clear:true, - onclick:function(){ - if(get.mode()!='versus'){ - alert('请进入对决模式,然后再编辑将池'); - return; - } - var container=ui.create.div('.popup-container.editor'); - var node=container; - var map=get.config('character_four')||lib.choiceFour; - var str='character=[\n '; - for(var i=0;ilib.codeMirrorReady(node,editor)); - lib.init.css(lib.assetURL+'layout/default','codemirror'); - } - else{ - lib.codeMirrorReady(node,editor); - } - } - }, - }, - reset_character_four:{ - name:'重置4v4将池', - intro:'将4v4模式下的将池重置为默认将池', - clear:true, - onclick:function(){ - if(confirm('该操作不可撤销!是否清除4v4模式的自定义将池,并将其重置为默认将池?')){ - game.saveConfig('character_four',null,'versus'); - alert('将池已重置'); - } - }, - }, - } - }, - connect:{ - name:'联机', - config:{ - connect_nickname:{ - name:'联机昵称', - input:true, - frequent:true, - }, - connect_avatar:{ - name:'联机头像', - init:'caocao', - item:{}, - frequent:true, - onclick:function(item){ - game.saveConfig('connect_avatar',item); - game.saveConfig('connect_avatar',item,'connect'); - } - }, - hall_ip:{ - name:'联机大厅', - input:true, - frequent:true, - }, - hall_button:{ - name:'联机大厅按钮', - init:true, - frequent:true, - onclick:function(bool){ - game.saveConfig('hall_button',bool,'connect'); - if(ui.hall_button){ - if(bool){ - ui.hall_button.style.display=''; - } - else{ - ui.hall_button.style.display='none'; - } - } - } - }, - wss_mode:{ - name:'使用WSS协议', - init:false, - frequent:true, - intro:'在用户填写的IP地址没有直接指定使用WS/WSS协议的情况下,默认使用WSS协议,而非WS协议来连接到联机服务器。
    请不要轻易勾选此项!', - }, - read_clipboard:{ - name:'读取邀请链接', - init:false, - frequent:true, - intro:'读取剪贴板以解析邀请链接自动加入联机房间', - } - } - }, - boss:{ - name:'挑战', - config:{ - free_choose:{ - name:'自由选将', - init:true, - frequent:true, - onclick:function(bool){ - game.saveConfig('free_choose',bool,this._link.config.mode); - if(get.mode()!=this._link.config.mode||!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(!ui.cheat2&&get.config('free_choose')) ui.create.cheat2(); - else if(ui.cheat2&&!get.config('free_choose')){ - ui.cheat2.close(); - delete ui.cheat2; - } - } - }, - change_choice:{ - name:'开启换将卡', - init:true, - onclick:function(bool){ - game.saveConfig('change_choice',bool,this._link.config.mode); - if(!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(!ui.cheat&&get.config('change_choice')) ui.create.cheat(); - else if(ui.cheat&&!get.config('change_choice')){ - ui.cheat.close(); - delete ui.cheat; - } - }, - frequent:true, - }, - single_control:{ - name:'单人控制', - init:true, - frequent:true, - onclick:function(bool){ - game.saveConfig('single_control',bool,this._link.config.mode); - if(ui.single_swap&&game.me!=game.boss){ - if(bool){ - ui.single_swap.style.display='none'; - } - else{ - ui.single_swap.style.display=''; - } - } - }, - intro:'只控制一名角色,其他角色由AI控制' - }, - // ban_weak:{ - // name:'屏蔽弱将', - // init:true, - // restart:true, - // }, - // ban_strong:{ - // name:'屏蔽强将', - // init:false, - // restart:true, - // }, - } - }, - doudizhu:{ - name:'斗地主', - connect:{ - update:function(config,map){ - if(config.connect_doudizhu_mode=='online'){ - map.connect_change_card.hide(); - } - else{ - map.connect_change_card.show(); - } - if(config.connect_doudizhu_mode!='normal'){ - map.connect_double_character.hide(); - } - else{ - map.connect_double_character.show(); - } - }, - connect_doudizhu_mode:{ - name:'游戏模式', - init:'normal', - item:{ - normal:'休闲', - kaihei:'开黑', - huanle:'欢乐', - binglin:'兵临', - online:'智斗', - }, - restart:true, - frequent:true, - }, - connect_double_character:{ - name:'双将模式', - init:false, - frequent:true, - restart:true, - }, - connect_change_card:{ - name:'启用手气卡', - init:false, - frequent:true, - restart:true, - }, - }, - config:{ - update:function(config,map){ - if(config.doudizhu_mode=='online'){ - map.change_card.hide(); - map.edit_character.show(); - map.reset_character.show(); - } - else{ - map.change_card.show(); - map.edit_character.hide(); - map.reset_character.hide(); - } - if(config.doudizhu_mode!='normal'){ - map.double_character.hide(); - map.free_choose.hide(); - map.change_identity.hide(); - map.change_choice.hide(); - map.continue_game.hide(); - map.dierestart.hide(); - map.choice_zhu.hide(); - map.choice_fan.hide(); - map.revive.hide(); - } - else{ - map.double_character.show(); - map.free_choose.show(); - map.change_identity.show(); - map.change_choice.show(); - map.continue_game.show(); - map.dierestart.show(); - map.choice_zhu.show(); - map.choice_fan.show(); - map.revive.show(); - } - if(config.double_character&&config.doudizhu_mode=='normal'){ - map.double_hp.show(); - } - else{ - map.double_hp.hide(); - } - }, - doudizhu_mode:{ - name:'游戏模式', - init:'normal', - item:{ - normal:'休闲', - kaihei:'开黑', - huanle:'欢乐', - binglin:'兵临', - online:'智斗', - }, - restart:true, - frequent:true, - }, - double_character:{ - name:'双将模式', - init:false, - frequent:true, - restart:true, - }, - double_hp:{ - name:'双将体力上限', - init:'pingjun', - item:{ - hejiansan:'和减三', - pingjun:'平均值', - zuidazhi:'最大值', - zuixiaozhi:'最小值', - zonghe:'相加', - }, - restart:true, - }, - free_choose:{ - name:'自由选将', - init:true, - onclick:function(bool){ - game.saveConfig('free_choose',bool,this._link.config.mode); - if(get.mode()!=this._link.config.mode||!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(!ui.cheat2&&get.config('free_choose')) ui.create.cheat2(); - else if(ui.cheat2&&!get.config('free_choose')){ - ui.cheat2.close(); - delete ui.cheat2; - } - } - }, - change_identity:{ - name:'自由选择身份和座位', - init:true, - onclick:function(bool){ - game.saveConfig('change_identity',bool,this._link.config.mode); - if(!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - var dialog; - if(ui.cheat2&&ui.cheat2.backup) dialog=ui.cheat2.backup; - else dialog=_status.event.dialog; - if(!_status.brawl||!_status.brawl.noAddSetting){ - if(!dialog.querySelector('table')&&get.config('change_identity')) _status.event.getParent().addSetting(dialog); - else _status.event.getParent().removeSetting(dialog); - } - ui.update(); - } - }, - change_choice:{ - name:'开启换将卡', - init:true, - onclick:function(bool){ - game.saveConfig('change_choice',bool,this._link.config.mode); - if(!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(!ui.cheat&&get.config('change_choice')) ui.create.cheat(); - else if(ui.cheat&&!get.config('change_choice')){ - ui.cheat.close(); - delete ui.cheat; - } - } - }, - change_card:{ - name:'开启手气卡', - init:'disabled', - item:{ - disabled:'禁用', - once:'一次', - twice:'两次', - unlimited:'无限', - }, - }, - continue_game:{ - name:'显示再战', - init:false, - onclick:function(bool){ - game.saveConfig('continue_game',bool,this._link.config.mode); - if(get.config('continue_game')){ - if(!ui.continue_game&&_status.over&&!_status.brawl&&!game.no_continue_game){ - ui.continue_game=ui.create.control('再战',game.reloadCurrent); - } - } - else if(ui.continue_game){ - ui.continue_game.close(); - delete ui.continue_game; - } - }, - intro:'游戏结束后可选择用相同的武将再进行一局游戏' - }, - dierestart:{ - name:'死亡后显示重来', - init:true, - onclick:function(bool){ - game.saveConfig('dierestart',bool,this._link.config.mode); - if(get.config('dierestart')){ - if(!ui.restart&&game.me.isDead()&&!_status.connectMode){ - ui.restart=ui.create.control('restart',game.reload); - } - } - else if(ui.restart){ - ui.restart.close(); - delete ui.restart; - } - } - }, - revive:{ - name:'死亡后显示复活', - init:false, - onclick:function(bool){ - game.saveConfig('revive',bool,this._link.config.mode); - if(get.config('revive')){ - if(!ui.revive&&game.me.isDead()){ - ui.revive=ui.create.control('revive',ui.click.dierevive); - } - } - else if(ui.revive){ - ui.revive.close(); - delete ui.revive; - } - } - }, - choice_zhu:{ - name:'地主候选武将数', - init:'3', - restart:true, - item:{ - '3':'三', - '4':'四', - '5':'五', - '6':'六', - '8':'八', - '10':'十', - }, - }, - choice_fan:{ - name:'农民候选武将数', - init:'3', - restart:true, - item:{ - '3':'三', - '4':'四', - '5':'五', - '6':'六', - '8':'八', - '10':'十', - }, - }, - edit_character:{ - name:'编辑将池', - clear:true, - onclick:function(){ - if(get.mode()!='doudizhu'){ - alert('请进入斗地主模式,然后再编辑将池'); - return; - } - var container=ui.create.div('.popup-container.editor'); - var node=container; - var map=get.config('character_online')||lib.characterOnline; - node.code='character='+get.stringify(map)+'\n/*\n 这里是智斗三国模式的武将将池。\n 您可以在这里编辑对武将将池进行编辑,然后点击“保存”按钮即可保存。\n 将池中的Key势力武将,仅同时在没有被禁用的情况下,才会出现在选将框中。\n 而非Key势力的武将,只要所在的武将包没有被隐藏,即可出现在选将框中。\n 该将池为单机模式/联机模式通用将池。在这里编辑后,即使进入联机模式,也依然会生效。\n 但联机模式本身禁用的武将(如神貂蝉)不会出现在联机模式的选将框中。\n*/'; - ui.window.classList.add('shortcutpaused'); - ui.window.classList.add('systempaused'); - var saveInput=function(){ - var code; - if(container.editor){ - code=container.editor.getValue(); - } - else if(container.textarea){ - code=container.textarea.value; - } - try{ - var character=null; - eval(code); - if(!get.is.object(character)){ - throw('err'); - } - var groups=[]; - for(var i in character){ - if(!Array.isArray(character[i])) throw('type'); - if(character[i].length>=3) groups.push(i); - } - if(groups.length<3) throw('enough'); - } - catch(e){ - if(e=='type'){ - alert('请严格按照格式填写,不要写入不为数组的数据'); - } - else if(e=='enough'){ - alert('请保证至少写入了3个势力,且每个势力至少有3个武将'); - } - else if(e=='err'){ - alert('代码格式有错误,请对比示例代码仔细检查'); - } - else{ - var tip=lib.getErrorTip(e)||''; - alert('代码语法有错误,请仔细检查('+e+')'+tip); - } - window.focus(); - if(container.editor){ - container.editor.focus(); - } - else if(container.textarea){ - container.textarea.focus(); - } - return; - } - game.saveConfig('character_online',character,'doudizhu'); - ui.window.classList.remove('shortcutpaused'); - ui.window.classList.remove('systempaused'); - container.delete(); - container.code=code; - delete window.saveNonameInput; - }; - window.saveNonameInput=saveInput; - var editor=ui.create.editor(container,saveInput); - if(node.aced){ - ui.window.appendChild(node); - node.editor.setValue(node.code,1); - } - else if(lib.device=='ios'){ - ui.window.appendChild(node); - if(!node.textarea){ - var textarea=document.createElement('textarea'); - editor.appendChild(textarea); - node.textarea=textarea; - lib.setScroll(textarea); - } - node.textarea.value=node.code; - } - else{ - if(!window.CodeMirror){ - lib.init.js(lib.assetURL+'game','codemirror',()=>lib.codeMirrorReady(node,editor)); - lib.init.css(lib.assetURL+'layout/default','codemirror'); - } - else{ - lib.codeMirrorReady(node,editor); - } - } - }, - }, - reset_character:{ - name:'重置将池', - intro:'将智斗三国模式下的将池重置为默认将池', - clear:true, - onclick:function(){ - if(confirm('该操作不可撤销!是否清除智斗三国模式的自定义将池,并将其重置为默认将池?')){ - game.saveConfig('character_online',null,'doudizhu'); - alert('将池已重置'); - } - }, - }, - } - }, - single:{ - name:'单挑', - connect:{ - connect_single_mode:{ - name:'游戏模式', - init:'normal', - item:{ - normal:'新1v1', - dianjiang:'点将单挑', - changban:'血战长坂坡', - }, - restart:true, - frequent:true, - }, - connect_enable_jin:{ - name:'启用晋势力武将', - init:false, - restart:true, - frequent:true, - }, - update:function(config,map){ - if(config.connect_single_mode!='normal'){ - map.connect_enable_jin.hide(); - } - else{ - map.connect_enable_jin.show(); - } - }, - }, - config:{ - single_mode:{ - name:'游戏模式', - init:'normal', - item:{ - normal:'新1v1', - dianjiang:'点将单挑', - changban:'血战长坂坡', - }, - restart:true, - frequent:true, - }, - enable_jin:{ - name:'启用晋势力武将', - init:false, - restart:true, - frequent:true, - }, - update:function(config,map){ - if(config.single_mode!='normal'){ - map.enable_jin.hide(); - } - else{ - map.enable_jin.show(); - } - }, - } - }, - chess:{ - name:'战棋', - config:{ - chess_mode:{ - name:'游戏模式', - init:'combat', - item:{ - combat:'自由', - three:'统率', - leader:'君主', - }, - restart:true, - frequent:true, - }, - update:function(config,map){ - if(config.chess_mode=='leader'){ - map.chess_leader_save.show(); - map.chess_leader_clear.show(); - map.chess_leader_allcharacter.show(); - map.chess_character.hide(); - } - else{ - map.chess_leader_save.hide(); - map.chess_leader_clear.hide(); - map.chess_leader_allcharacter.hide(); - map.chess_character.show(); - } - if(config.chess_mode=='combat'){ - // map.battle_number.show(); - // map.chess_ordered.show(); - map.free_choose.show(); - map.change_choice.show(); - } - else{ - // map.battle_number.hide(); - // map.chess_ordered.hide(); - map.free_choose.hide(); - map.change_choice.hide(); - } - // if(config.chess_mode!='leader'){ - // map.ban_weak.show(); - // map.ban_strong.show(); - // } - // else{ - // map.ban_weak.hide(); - // map.ban_strong.hide(); - // } - }, - chess_leader_save:{ - name:'选择历程', - init:'save1', - item:{ - save1:'一', - save2:'二', - save3:'三', - save4:'四', - save5:'五', - }, - restart:true, - frequent:true, - }, - chess_leader_allcharacter:{ - name:'启用全部角色', - init:true, - onclick:function(bool){ - if(confirm('调整该设置将清除所有进度,是否继续?')){ - for(var i=1;i<6;i++) game.save('save'+i,null,'chess'); - game.saveConfig('chess_leader_allcharacter',bool,'chess') - if(get.mode()=='chess') game.reload(); - return; - } - else this.classList.toggle('on'); - }, - }, - chess_leader_clear:{ - name:'清除进度', - onclick:function(){ - var node=this; - if(node._clearing){ - for(var i=1;i<6;i++) game.save('save'+i,null,'chess'); - game.reload(); - return; - } - node._clearing=true; - node.firstChild.innerHTML='单击以确认 (3)'; - setTimeout(function(){ - node.firstChild.innerHTML='单击以确认 (2)'; - setTimeout(function(){ - node.firstChild.innerHTML='单击以确认 (1)'; - setTimeout(function(){ - node.firstChild.innerHTML='清除进度'; - delete node._clearing; - },1000); - },1000); - },1000); - }, - clear:true, - frequent:true, - }, - // chess_treasure:{ - // name:'战场机关', - // init:'0', - // frequent:true, - // item:{ - // '0':'关闭', - // '0.1':'较少出现', - // '0.2':'偶尔出现', - // '0.333':'时常出现', - // '0.5':'频繁出现', - // } - // }, - chess_obstacle:{ - name:'随机路障', - init:'0.2', - item:{ - '0':'关闭', - '0.2':'少量', - '0.333':'中量', - '0.5':'大量', - }, - frequent:true, - }, - show_range:{ - name:'显示卡牌范围', - init:true, - }, - show_distance:{ - name:'显示距离', - init:true, - }, - chess_character:{ - name:'战棋武将', - init:true, - frequent:true, - }, - chess_card:{ - name:'战棋卡牌', - init:true, - frequent:true, - }, - free_choose:{ - name:'自由选将', - init:true, - onclick:function(bool){ - game.saveConfig('free_choose',bool,this._link.config.mode); - if(get.mode()!=this._link.config.mode||!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(!ui.cheat2&&get.config('free_choose')) ui.create.cheat2(); - else if(ui.cheat2&&!get.config('free_choose')){ - ui.cheat2.close(); - delete ui.cheat2; - } - }, - }, - change_choice:{ - name:'开启换将卡', - init:true, - onclick:function(bool){ - game.saveConfig('change_choice',bool,this._link.config.mode); - if(!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(!ui.cheat&&get.config('change_choice')) ui.create.cheat(); - else if(ui.cheat&&!get.config('change_choice')){ - ui.cheat.close(); - delete ui.cheat; - } - }, - }, - // ban_weak:{ - // name:'屏蔽弱将', - // init:true, - // restart:true, - // }, - // ban_strong:{ - // name:'屏蔽强将', - // init:false, - // restart:true, - // }, - chessscroll_speed:{ - name:'边缘滚动速度', - init:'20', - intro:'鼠标移至屏幕边缘时自动滚屏', - item:{ - '0':'不滚动', - '10':'10格/秒', - '20':'20格/秒', - '30':'30格/秒', - } - }, - } - }, - tafang:{ - name:'塔防', - config:{ - tafang_turn:{ - name:'游戏胜利', - init:'10', - frequent:true, - item:{ - '10':'十回合', - '20':'二十回合', - '30':'三十回合', - '1000':'无限', - } - }, - // tafang_size:{ - // name:'战场大小', - // init:'9', - // frequent:true, - // item:{ - // '6':'小', - // '9':'中', - // '12':'大', - // } - // }, - tafang_difficulty:{ - name:'战斗难度', - init:'2', - frequent:true, - item:{ - '1':'简单', - '2':'普通', - '3':'困难', - } - }, - show_range:{ - name:'显示卡牌范围', - init:true, - }, - show_distance:{ - name:'显示距离', - init:true, - }, - // ban_weak:{ - // name:'屏蔽弱将', - // init:true, - // restart:true, - // }, - // ban_strong:{ - // name:'屏蔽强将', - // init:false, - // restart:true, - // }, - chessscroll_speed:{ - name:'边缘滚动速度', - intro:'鼠标移至屏幕边缘时自动滚屏', - init:'20', - item:{ - '0':'不滚动', - '10':'10格/秒', - '20':'20格/秒', - '30':'30格/秒', - } - }, - } - }, - brawl:{ - name:'乱斗', - config:{ - huanhuazhizhan:{ - name:'幻化之战', - init:true, - frequent:true - }, - duzhansanguo:{ - name:'毒战三国', - init:true, - frequent:true - }, - daozhiyueying:{ - name:'导师月英', - init:true, - frequent:true - }, - weiwoduzun:{ - name:'唯我独尊', - init:true, - frequent:true - }, - tongxingzhizheng:{ - name:'同姓之争', - init:true, - frequent:true - }, - jiazuzhizheng:{ - name:'家族之争', - init:true, - frequent:true - }, - tongqueduopao:{ - name:'铜雀夺袍', - init:true, - frequent:true - }, - tongjiangmoshi:{ - name:'同将模式', - init:true, - frequent:true - }, - baiyidujiang:{ - name:'白衣渡江', - init:true, - frequent:true - }, - qianlidanji:{ - name:'千里单骑', - init:true, - frequent:true - }, - liangjunduilei:{ - name:'两军对垒', - init:true, - frequent:true - }, - scene:{ - name:'创建场景', - init:true, - frequent:true - } - } - }, - stone:{ - name:'炉石', - config:{ - // update:function(config,map){ - // if(config.stone_mode=='deck'){ - // // map.deck_length.show(); - // // map.deck_repeat.show(); - // map.random_length.hide(); - // map.skill_bar.show(); - // } - // else{ - // // map.deck_length.hide(); - // // map.deck_repeat.hide(); - // map.random_length.show(); - // map.skill_bar.hide(); - // } - // }, - // stone_mode:{ - // name:'游戏模式', - // init:'deck', - // item:{ - // deck:'构筑', - // random:'随机' - // }, - // restart:true, - // frequent:true, - // }, - // deck_length:{ - // name:'卡组长度', - // init:'30', - // item:{ - // '30':'30张', - // '50':'50张', - // '80':'80张', - // }, - // frequent:true, - // }, - // deck_repeat:{ - // name:'重复卡牌', - // init:'2', - // item:{ - // '2':'2张', - // '3':'3张', - // '5':'5张', - // '80':'无限', - // }, - // frequent:true, - // }, - // random_length:{ - // name:'随从牌数量', - // init:'1/80', - // item:{ - // '1/120':'少', - // '1/80':'中', - // '1/50':'多', - // }, - // frequent:true, - // }, - battle_number:{ - name:'出场人数', - init:'1', - frequent:true, - item:{ - '1':'一人', - '2':'两人', - '3':'三人', - '4':'四人', - '6':'六人', - '8':'八人', - '10':'十人', - }, - onclick:function(num){ - game.saveConfig('battle_number',num,this._link.config.mode); - if(_status.connectMode) return; - if(!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(_status.event.getParent().changeDialog){ - _status.event.getParent().changeDialog(); - } - }, - }, - mana_mode:{ - name:'行动值变化', - init:'inc', - item:{ - inf:'涨落', - inc:'递增' - }, - frequent:true - }, - skill_bar:{ - name:'怒气值', - init:true, - frequent:true, - restart:true, - }, - double_character:{ - name:'双将模式', - init:false, - frequent:true, - restart:function(){ - return _status.event.getParent().name!='chooseCharacter'||_status.event.name!='chooseButton'; - } - }, - free_choose:{ - name:'自由选将', - init:true, - onclick:function(bool){ - game.saveConfig('free_choose',bool,this._link.config.mode); - if(_status.connectMode) return; - if(get.mode()!=this._link.config.mode||!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(!ui.cheat2&&get.config('free_choose')) ui.create.cheat2(); - else if(ui.cheat2&&!get.config('free_choose')){ - ui.cheat2.close(); - delete ui.cheat2; - } - }, - }, - change_choice:{ - name:'开启换将卡', - init:true, - onclick:function(bool){ - game.saveConfig('change_choice',bool,this._link.config.mode); - if(_status.connectMode) return; - if(!_status.event.getParent().showConfig&&!_status.event.showConfig) return; - if(!ui.cheat&&get.config('change_choice')) ui.create.cheat(); - else if(ui.cheat&&!get.config('change_choice')){ - ui.cheat.close(); - delete ui.cheat; - } - }, - }, - // ban_weak:{ - // name:'屏蔽弱将', - // init:true, - // restart:true, - // }, - // ban_strong:{ - // name:'屏蔽强将', - // init:false, - // restart:true, - // }, - } - }, - }, - status:{ - running:false, - canvas:false, - time:0, - reload:0, - delayed:0, - frameId:0, - videoId:0, - globalId:0, - }, - help:{ - '关于游戏':'
    关于无名杀
    • 无名杀官方发布地址仅有GitHub仓库!
      点击前往Github仓库
    • 无名杀基于GPLv3开源协议。
      点击查看GPLv3协议
    • 其他所有的所谓“无名杀”社群(包括但不限于绝大多数“官方”QQ群、QQ频道等)均为玩家自发组织,与无名杀官方无关!', - '游戏操作':'
      • 长按/鼠标悬停/右键单击显示信息。
      • 触屏模式中,双指点击切换暂停;下划显示菜单,上划切换托管。
      • 键盘快捷键
        '+ - '
        A切换托管
        W切换不询问无懈
        空格暂停
      • 编辑牌堆
        在卡牌包中修改牌堆后,将自动创建一个临时牌堆,在所有模式中共用,当保存当前牌堆后,临时牌堆被清除。每个模式可设置不同的已保存牌堆,设置的牌堆优先级大于临时牌堆。
      ', - '游戏命令':'
      变量名
      • 场上角色
        game.players
      • 阵亡角色
        game.dead'+ - '
      • 玩家
        game.me
      • 玩家的上/下家
        game.me.previous/next'+ - '
      • 玩家的上/下家(含阵亡)
        game.me.previousSeat/
        nextSeat'+ - '
      • 牌堆
        ui.cardPile
      • 弃牌堆
        ui.discardPile
      '+ - '
      角色属性
      • 体力值
        player.hp'+ - '
      • 体力上限
        player.maxHp
      • 身份
        player.identity
      • 手牌
        player.getCards("h")
      • 装备牌
        player.getCards("e")
      • 判定牌
        player.getCards("j")'+ - '
      • 是否存活/横置/翻面
        player.isAlive()/
        isLinked()/
        isTurnedOver()
      '+ - '
      角色操作
      • 受到伤害
        player.damage(source,
        num)'+ - '
      • 回复体力
        player.recover(num)
      • 摸牌
        player.draw(num)
      • 获得牌
        player.gain(cards)
      • 弃牌
        player.discard(cards)'+ - '
      • 使用卡牌
        player.useCard(card,
        targets)
      • 死亡
        player.die()
      • 复活
        player.revive(hp)
      '+ - '
      游戏操作
      • 在命令框中输出结果
        game.print(str)
      • 清除命令框中的内容
        cls
      • 上一条/下一条输入的内容
        up/down
      • 游戏结束
        game.over(bool)'+ - '
      • 角色资料
        lib.character
      • 卡牌资料
        lib.card
      ', - '游戏名词':'
      • 智囊:无名杀默认为过河拆桥/无懈可击/无中生有/洞烛先机。牌堆中没有的智囊牌会被过滤。可在卡牌设置中自行增减。若没有可用的智囊,则改为随机选取的三种锦囊牌的牌名。'+ - '
      • 仁库:部分武将使用的游戏外共通区域。至多包含六张牌。当有新牌注入后,若牌数超过上限,则将最早进入仁库的溢出牌置入弃牌堆。'+ - '
      • 护甲:和体力类似,每点护甲可抵挡1点伤害,但不影响手牌上限。'+ - '
      • 随从:通过技能获得,拥有独立的技能、手牌区和装备区(共享判定区),出场时替代主武将的位置;随从死亡时自动切换回主武将。'+ - '
      • 发现:从三张随机亮出的牌中选择一张,若无特殊说明,则获得此牌。'+ - '
      • 蓄能技:发动时可以增大黄色的数字。若如此做,红色数字于技能的结算过程中改为原来的两倍。'+ - '
      • 施法:若技能的拥有者未拥有等待执行的同名“施法”效果,则其可以发动“施法”技能。其须选择声明一个数字X(X∈[1, 3]),在此之后的第X个回合结束时,其执行“施法”效果,且效果中的数字X视为与技能发动者声明的X相同。'+ - '
      • 共同拼点:一种特殊的拼点结算。发起者与被指定的拼点目标同时亮出拼点牌,进行一次决算:其中拼点牌点数唯一最大的角色赢,其他角色均没赢;若没有点数唯一最大的拼点牌,则所有角色拼点均没赢。'+ - '
      • 强令:若一名角色拥有带有“强令”的技能,则该技能的发动时机为“出牌阶段开始时”。若技能拥有者发动该技能,其须发布“强令”给一名其他角色,并在对应技能的时间节点加以判断目标角色是否成功完成该强令所要求的任务条件。成功或失败则会根据技能效果执行不同结算流程。'+ - '
      • 摧坚:若一名角色拥有带有“摧坚”的技能,则该技能的发动时机为“当你使用伤害牌指定第一个目标后”。你可以对其中一个目标发动“摧坚”技能,然后执行后续效果。其中,后续效果里的X等于该目标的非charlotte技能的数量。'+ - '
      • 妄行:一种特殊的选项。若一名角色拥有带有“妄行”的技能,则该技能触发时,你须选择声明一个数字X(X∈{1,2,3,4}),技能后续中的X即为你选择的数字。选择完毕后,你获得如下效果:回合结束时,你选择一项:1.弃置X张牌;2.减1点体力上限。'+ - '
      • 搏击:若一名角色拥有带有“搏击”的技能,则当该搏击技能触发时,若本次技能的目标角色在你攻击范围内,且你在其攻击范围内,则你执行技能主体效果时,同时额外执行“搏击”后的额外效果。'+ - '
      • 游击:若一名角色拥有带有“游击”的技能,则当该游击技能执行至“游击”处时,若本次技能的目标角色在你的攻击范围内,且你不在其攻击范围内,则你可以执行“游击”后的额外效果。'+ - '
      • 激昂:一名角色发动“昂扬技”标签技能后,此技能失效,直至从此刻至满足此技能“激昂”条件后。'+ - '' - }, - /** - * @type {import('path')} - */ - // @ts-ignore - path:{}, - getErrorTip:msg=>{ - if(typeof msg!='string'){ - try{ - msg=msg.toString(); - if(typeof msg!='string') throw 'err'; - }catch(_){ - throw '传参错误:'+msg; - } - } - if (msg.startsWith('Uncaught ')) msg=msg.slice(9); - let newMessage=msg; - if (/RangeError/.test(newMessage)){ - if(newMessage.includes("Maximum call stack size exceeded")){ - newMessage="堆栈溢出"; - }else if(/argument must be between 0 and 20/.test(newMessage)){ - let funName=newMessage.slice(newMessage.indexOf('RangeError: ')+12,newMessage.indexOf(')')+1); - newMessage=funName+"参数必须在0和20之间"; - } else { - newMessage="传递错误值到数值计算方法"; - } - }else if(/ReferenceError/.test(newMessage)){ - let messageName; - if (newMessage.includes("is not defined")){ - messageName=newMessage.replace('ReferenceError: ', '').replace(' is not defined', ''); - newMessage="引用了一个未定义的变量:"+messageName; - }else if(newMessage.includes("invalid assignment left-hand side")){ - newMessage = "赋值运算符或比较运算符不匹配"; - }else if(newMessage.includes("Octal literals are not allowed in strict mode")){ - newMessage = "八进制字面量与八进制转义序列语法已经被废弃"; - }else if(newMessage.includes("Illegal 'use strict' directive in function with non-simple parameter list")){ - newMessage = "'use strict'指令不能使用在带有‘非简单参数’列表的函数"; - }else if(newMessage.includes("Invalid left-hand side in assignment")){ - newMessage = "赋值中的左侧无效,即number,string等不可赋值的非变量数据"; - } - }else if(/SyntaxError/.test(newMessage)){ - let messageName; - if(newMessage.includes("Unexpected token ")){ - messageName=newMessage.replace('SyntaxError: Unexpected token ',''); - newMessage="使用了未定义或错误的语法 : ("+messageName+")"; - }else if(newMessage.includes( - "Block-scoped declarations (let, const, function, class) not yet supported outside strict mode")){ - newMessage="请在严格模式下运行let,const,class"; - }else if(newMessage.includes("for-of loop variable declaration may not have an initializer.")){ - newMessage="for...of 循环的头部包含有初始化表达式"; - }else if(newMessage.includes("for-in loop variable declaration may not have an initializer.")){ - newMessage="for...in 循环的头部包含有初始化表达式"; - }else if(newMessage.includes("Delete of an unqualified identifier in strict mode.")){ - newMessage="普通变量不能通过 delete 操作符来删除"; - }else if(newMessage.includes("Unexpected identifier")){ - newMessage="不合法的标识符或错误的语法"; - }else if(newMessage.includes("Invalid or unexpected token")){ - newMessage="非法的或者不期望出现的标记符号出现在不该出现的位置"; - }else if(newMessage.includes("Invalid regular expression flags")){ - newMessage="无效的正则表达式的标记"; - }else if(newMessage.includes("missing ) after argument list")){ - newMessage="参数列表后面缺少 ')' (丢失运算符或者转义字符等)"; - }else if(newMessage.includes("Invalid shorthand property initializer")){ - newMessage="在定义一个{}对象时,应该使用':'而不是'='"; - }else if(newMessage.includes("Missing initializer in const declaration")){ - newMessage="在使用const定义一个对象时,必须指定初始值"; - }else if(newMessage.includes("Unexpected number")||newMessage.includes("Unexpected string")){ - newMessage="在定义函数时,函数参数必须为合法标记符"; - }else if(newMessage.includes("Unexpected end of input")){ - newMessage="遗漏了符号或符号顺序不对(小括号,花括号等)"; - }else if(newMessage.includes("has already been declared")){ - messageName=newMessage.replace('SyntaxError: Identifier ', '').replace(' has already been declared', ''); - newMessage=messageName +"变量已经被声明过,不能被重新声明"; - }else if(newMessage.includes("Duplicate parameter name not allowed in this context")) { - newMessage="参数名不允许重复"; - }else if(newMessage.includes("Unexpected reserved word")||newMessage.includes( - "Unexpected strict mode reserved word")){ - newMessage = "保留字被用作标记符"; - } - }else if(/TypeError/.test(newMessage)){ - let messageName; - if(newMessage.includes(" is not a function")){ - messageName=newMessage.replace('TypeError: ', '').replace(' is not a function', ''); - newMessage=messageName+"不是一个函数"; - }else if(newMessage.includes(" is not a constructor")){ - messageName=newMessage.replace('TypeError: ', '').replace(' is not a constructor', ''); - newMessage=messageName+"不是一个构造函数"; - }else if(newMessage.includes("Cannot read property")){ - messageName=newMessage.replace('TypeError: Cannot read property ', '').replace(' of null', '').replace(' of undefined', ''); - let ofName=newMessage.slice(newMessage.indexOf(" of ")+4); - newMessage="无法读取'"+ofName+"'的属性值"+messageName; - }else if(newMessage.includes("Cannot read properties")){ - messageName=newMessage.slice(newMessage.indexOf("reading '")+9,-2); - let ofName=newMessage.slice(newMessage.indexOf(" of ")+4,newMessage.indexOf("(")-1); - newMessage="无法读取'"+ofName+"'的属性值"+messageName; - }else if(newMessage.includes("Property description must be an object")){ - messageName=newMessage.replace('TypeError: Property description must be an object: ', ''); - newMessage=messageName+"是非对象类型的值"; - }else if(newMessage.includes("Cannot assign to read only property ")){ - messageName=newMessage.slice(47,newMessage.lastIndexOf(' of ')+1); - newMessage=messageName+"属性禁止写入"; - }else if(newMessage.includes("Object prototype may only be an Object or null")){ - newMessage=messageName+"对象原型只能是对象或null"; - }else if(newMessage.includes("Cannot create property")){ - messageName=newMessage.slice(newMessage.indexOf('\'')+1); - messageName=messageName.slice(0,messageName.indexOf('\'')); - let obj=newMessage.slice(newMessage.indexOf(messageName)+16); - newMessage=obj+"不能添加或修改'"+messageName+"'属性,任何 Primitive 值都不允许有property"; - }else if(newMessage.includes("Can't add property")&&newMessage.includes("is not extensible")){ - newMessage="对象不可添加属性(不可扩展)"; - }else if(newMessage.includes("Cannot redefine property")){ - messageName=newMessage.slice(37); - newMessage=messageName+"不可配置"; - }else if(newMessage.includes("Converting circular structure to JSON")){ - messageName=newMessage.slice(37); - newMessage="JSON.stringify() 方法处理循环引用结构的JSON会失败"; - }else if(newMessage.includes("Cannot use 'in' operator to search for ")){ - newMessage="in不能用来在字符串、数字或者其他基本类型的数据中进行检索"; - }else if(newMessage.includes("Right-hand side of 'instanceof' is not an object")){ - newMessage="instanceof 操作符 希望右边的操作数为一个构造对象,即一个有 prototype 属性且可以调用的对象"; - }else if(newMessage.includes("Assignment to constant variable")){ - newMessage="const定义的变量不可修改"; - }else if(newMessage.includes("Cannot delete property")){ - newMessage="不可配置的属性不能删除"; - }else if(newMessage.includes("which has only a getter")){ - newMessage="仅设置了getter特性的属性不可被赋值"; - }else if(newMessage.includes("called on incompatible receiver undefined")){ - newMessage="this提供的绑定对象与预期的不匹配"; - } - }else if(/URIError/.test(newMessage)){ - newMessage="一个不合法的URI"; - }else if(/EvalError/.test(newMessage)){ - newMessage="非法调用 eval()"; - }else if(/InternalError/.test(newMessage)){ - if(newMessage.includes("too many switch cases")){ - newMessage="过多case子句"; - }else if(newMessage.includes("too many parentheses in regular expression")){ - newMessage="正则表达式中括号过多"; - }else if(newMessage.includes("array initializer too large")){ - newMessage="超出数组大小的限制"; - }else if(newMessage.includes("too much recursion")){ - newMessage="递归过深"; - } - } - if(newMessage!=msg){ - return newMessage; - } - }, - codeMirrorReady:(node,editor)=>{ - ui.window.appendChild(node); - node.style.fontSize=20/game.documentZoom+'px'; - const mirror=window.CodeMirror(editor,{ - value:node.code, - mode:"javascript", - lineWrapping:!lib.config.touchscreen&&lib.config.mousewheel, - lineNumbers:true, - indentUnit:4, - autoCloseBrackets:true, - fixedGutter:false, - hintOptions:{completeSingle:false}, - theme:lib.config.codeMirror_theme||'mdn-like', - extraKeys:{ - "Ctrl-Z":"undo",//撤销 - "Ctrl-Y":"redo",//恢复撤销 - //"Ctrl-A":"selectAll",//全选 - }, - }); - lib.setScroll(editor.querySelector('.CodeMirror-scroll')); - node.aced=true; - node.editor=mirror; - setTimeout(()=>mirror.refresh(),0); - node.editor.on('change',(e,change)=>{ - let code; - if(node.editor){ - code=node.editor.getValue(); - }else if(node.textarea){ - code=node.textarea.value; - } - //动态绑定文本 - if(code.length&&change.origin=="+input" && - /{|}|\s|=|;|:|,|,|。|?|!|!|\?|&|#|%|@|‘|’|;/.test(change.text[0])==false&& - change.text.length==1) { - //输入了代码,并且不包括空格,{},=, ; , : , 逗号等,才可以自动提示 - node.editor.showHint(); - } - }); - //防止每次输出字符都创建以下元素 - const event=_status.event; - const trigger=_status.event; - const player=ui.create.player().init('sunce'); - const target=player; - const targets=[player]; - const source=player; - const card=game.createCard(); - const cards=[card]; - const result={bool:true}; - function forEach(arr,f) { - Array.from(arr).forEach(v=>f(v)); - } - function forAllProps(obj,callback){ - if(!Object.getOwnPropertyNames||!Object.getPrototypeOf){ - for(let name in obj) callback(name); - }else{ - for(let o=obj;o;o=Object.getPrototypeOf(o)) Object.getOwnPropertyNames(o).forEach(callback); - } - } - function scriptHint(editor,keywords,getToken,options){ - //Find the token at the cursor - let cur=editor.getCursor(),token=editor.getTokenAt(cur); - if(/\b(?:string|comment)\b/.test(token.type)) return; - const innerMode=CodeMirror.innerMode(editor.getMode(),token.state); - if (innerMode.mode.helperType==="json") return; - token.state=innerMode.state; - //If it's not a 'word-style' token, ignore the token. - if (!/^[\w$_]*$/.test(token.string)){ - token={ - start:cur.ch, - end:cur.ch, - string:"", - state:token.state, - type:token.string=="."?"property":null - }; - }else if(token.end>cur.ch){ - token.end=cur.ch; - token.string=token.string.slice(0,cur.ch-token.start); - } - let tprop=token,context; - //If it is a property, find out what it is a property of. - while (tprop.type=="property"){ - tprop=editor.getTokenAt(CodeMirror.Pos(cur.line,tprop.start)); - if(tprop.string!=".") return; - tprop=editor.getTokenAt(CodeMirror.Pos(cur.line,tprop.start)); - if(!context) context=[]; - context.push(tprop); - } - const list=[]; - let obj; - if(Array.isArray(context)){ - try { - const code=context.length==1?context[0].string:context.reduceRight((pre,cur)=>(pre.string||pre)+'.'+cur.string); - obj=eval(code); - if(![null,undefined].includes(obj)){ - const keys=Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertyNames(Object.getPrototypeOf(obj))).filter(key=>key.startsWith(token.string)); - list.addArray(keys); - } - }catch(_){ return;} - }else if(token&&typeof token.string=='string'){ - //非开发者模式下,提示这些单词 - list.addArray(['player','card','cards','result','trigger','source','target','targets','lib','game','ui','get','ai','_status']); - } - return { - list:[...new Set(getCompletions(token,context,keywords,options).concat(list))] - .filter(key=>key.startsWith(token.string)) - .sort((a,b)=>(a+'').localeCompare(b+'')) - .map(text=>{ - return { - render(elt,data,cur) { - var icon=document.createElement("span"); - var className="cm-completionIcon cm-completionIcon-"; - if(obj){ - const type=typeof obj[text]; - if(type== 'function') { - className+='function'; - } - else if(type== 'string') { - className+='text'; - } - else if(type== 'boolean') { - className+='variable'; - } - else{ - className+='namespace'; - } - }else{ - if(javascriptKeywords.includes(text)){ - className+='keyword'; - } - else if(window[text]) { - const type=typeof window[text]; - if(type=='function'){ - className+='function'; - } - else if(type=='string'){ - className+='text'; - } - else if(text=='window'||type=='boolean'){ - className+='variable'; - } - else{ - className+='namespace'; - } - }else{ - className+='namespace'; - } - } - icon.className=className; - elt.appendChild(icon); - elt.appendChild(document.createTextNode(text)); - }, - displayText: text, - text: text, - } - }), - from:CodeMirror.Pos(cur.line,token.start), - to:CodeMirror.Pos(cur.line,token.end) - }; - } - function javascriptHint(editor,options){ - return scriptHint(editor,javascriptKeywords,function(e,cur){return e.getTokenAt(cur);},options); - } - //覆盖原本的javascript提示 - CodeMirror.registerHelper("hint","javascript",javascriptHint); - const stringProps=Object.getOwnPropertyNames(String.prototype); - const arrayProps=Object.getOwnPropertyNames(Array.prototype); - const funcProps=Object.getOwnPropertyNames(Array.prototype); - const javascriptKeywords=("break case catch class const continue debugger default delete do else export extends from false finally for function " + - "if in import instanceof let new null return super switch this throw true try typeof var void while with yield").split(" "); - function getCompletions(token,context,keywords,options){ - let found=[],start=token.string,global=options&&options.globalScope||window; - function maybeAdd(str){ - if(str.lastIndexOf(start,0)==0&&!found.includes(str)) found.push(str); - } - function gatherCompletions(obj){ - if(typeof obj=="string") forEach(stringProps,maybeAdd); - else if(obj instanceof Array) forEach(arrayProps,maybeAdd); - else if(obj instanceof Function) forEach(funcProps,maybeAdd); - forAllProps(obj, maybeAdd); - } - if(context&&context.length){ - //If this is a property, see if it belongs to some object we can - //find in the current environment. - let obj=context.pop(),base; - if (obj.type&&obj.type.indexOf("variable")=== 0){ - if(options&&options.additionalContext) - base=options.additionalContext[obj.string]; - if(!options||options.useGlobalScope!==false) - base=base||global[obj.string]; - }else if(obj.type=="string"){ - base=""; - }else if(obj.type == "atom"){ - base=1; - }else if(obj.type == "function"){ - if(global.jQuery!=null&&(obj.string=='$'||obj.string=='jQuery')&&(typeof global.jQuery=='function')) - base=global.jQuery(); - else if(global._!=null&&(obj.string=='_')&&(typeof global._=='function')) - base=global._(); - } - while(base!=null&&context.length) - base=base[context.pop().string]; - if (base!=null) gatherCompletions(base); - }else{ - //If not, just look in the global object, any local scope, and optional additional-context - //(reading into JS mode internals to get at the local and global variables) - for(let v=token.state.localVars;v;v=v.next) maybeAdd(v.name); - for(let c=token.state.context;c;c=c.prev) for(let v=c.vars;v;v=v.next) maybeAdd(v.name) - for(let v=token.state.globalVars;v;v=v.next) maybeAdd(v.name); - if(options&&options.additionalContext!=null) for(let key in options.additionalContext) maybeAdd(key); - if(!options||options.useGlobalScope!==false) gatherCompletions(global); - forEach(keywords,maybeAdd); - } - return found.sort((a,b)=>(a+'').localeCompare(b+'')); - } - }, - setIntro:function(node,func,left){ - if(lib.config.touchscreen){ - if(left){ - node.listen(ui.click.touchintro); - } - else{ - lib.setLongPress(node,ui.click.intro); - } - } - else{ - if(left){ - node.listen(ui.click.intro); - } - if(lib.config.hover_all&&!lib.device){ - lib.setHover(node,ui.click.hoverplayer); - } - if(lib.config.right_info){ - node.oncontextmenu=ui.click.rightplayer; - } - } - // if(!left){ - // lib.setPressure(node,ui.click.rightpressure); - // } - if(func){ - node._customintro=func; - } - }, - // setPressure:function(node,func){ - // if(window.Pressure){ - // window.Pressure.set(node,{change: func}, {polyfill: false}); - // } - // }, - setPopped:function(node,func,width,height,forceclick,paused2){ - node._poppedfunc=func; - node._poppedwidth=width; - node._poppedheight=height; - if(forceclick){ - node.forceclick=true; - } - if(lib.config.touchscreen||forceclick){ - node.listen(ui.click.hoverpopped); - } - else{ - node.addEventListener('mouseenter',ui.click.hoverpopped); - // node.addEventListener('mouseleave',ui.click.hoverpopped_leave); - } - if(paused2){ - node._paused2=true; - } - }, - placePoppedDialog:function(dialog,e){ - if(dialog._place_text){ - if(dialog._place_text.firstChild.offsetWidth>=190||dialog._place_text.firstChild.offsetHeight>=30){ - dialog._place_text.style.marginLeft='14px'; - dialog._place_text.style.marginRight='14px'; - dialog._place_text.style.textAlign='left'; - dialog._place_text.style.width='calc(100% - 28px)'; - } - } - if(e.touches&&e.touches[0]){ - e=e.touches[0]; - } - var height=Math.min(ui.window.offsetHeight-20,dialog.content.scrollHeight); - if(dialog._mod_height){ - height+=dialog._mod_height; - } - dialog.style.height=height+'px'; - if(e.clientX/game.documentZoomui.window.offsetHeight){ - idealtop=ui.window.offsetHeight-10-dialog.offsetHeight; - } - dialog.style.top=idealtop+'px'; - }, - setHover:function(node,func,hoveration,width){ - node._hoverfunc=func; - if(typeof hoveration=='number'){ - node._hoveration=hoveration; - } - if(typeof width=='number'){ - node._hoverwidth=width - } - node.addEventListener('mouseenter',ui.click.mouseenter); - node.addEventListener('mouseleave',ui.click.mouseleave); - node.addEventListener('mousedown',ui.click.mousedown); - node.addEventListener('mousemove',ui.click.mousemove); - return node; - }, - setScroll:function(node){ - node.ontouchstart=ui.click.touchStart; - node.ontouchmove=ui.click.touchScroll; - node.style.webkitOverflowScrolling='touch'; - return node; - }, - setMousewheel:function(node){ - if(lib.config.mousewheel) node.onmousewheel=ui.click.mousewheel; - }, - setLongPress:function(node,func){ - node.addEventListener('touchstart',ui.click.longpressdown); - node.addEventListener('touchend',ui.click.longpresscancel); - node._longpresscallback=func; - return node; - }, - updateCanvas:function(time){ - if(lib.canvasUpdates.length===0){ - lib.status.canvas=false; - return false; - } - ui.canvas.width=ui.arena.offsetWidth; - ui.canvas.height=ui.arena.offsetHeight; - var ctx=ui.ctx; - ctx.shadowBlur=5; - ctx.shadowColor='rgba(0,0,0,0.3)'; - ctx.strokeStyle='white'; - // ctx.lineCap='round'; - ctx.lineWidth=3; - ctx.save(); - for(var i=0;ignc.of(fn), - genAwait:item=>gnc.is.generator(item)?gnc.of(function*(){for(const content of item){yield content;}})():Promise.resolve(item), - gnc:{ - of:fn=>gnc.of(fn), - is:{ - coroutine:item=>gnc.is.coroutine(item), - generatorFunc:item=>gnc.is.generatorFunc(item), - generator:item=>gnc.is.generator(item) - } - }, - comparator:{ - equals:function(){ - if(arguments.length==0) return false; - if(arguments.length==1) return true; - for(let i=1;i`[${name}]`, - isAttr:(name,item)=>`[${name}=${item}]`, - inAttr:(name,item)=>`[${name}~=${item}]`, - conAttr:(name,item)=>`[${name}*=${item}]`, - onAttr:(name,item)=>`[${name}|=${item}]`, - bgnAttr:(name,item)=>`[${name}^=${item}]`, - endAttr:(name,item)=>`[${name}^=${item}]`, - merge:function(){return Array.from(arguments).join(" ");}, - of:function(){return Array.from(arguments).join("");}, - class:function(){return `.${Array.from(arguments).join(".")}`;}, - group:function(){return Array.from(arguments).join(",");}, - media:type=>`@media ${type}` - }, - dom:{ - attributes:{ - style(name,value){ - return { - _type:"style", - name:name, - value:value - } - } - }, - inject(element,options){ - //处理id和class - if(options.identity){ - for(const item of options.identity){ - if (item.startsWith("#")) element.id = item.slice(1); - else element.classList.add(item); - } - } - //处理属性 - if(options.attributes){ - for(const item in options.attributes) element.setAttribute(item,options.attributes[item]); - } - //处理样式 - if(options.style){ - for(const item in options.style) element.style[item] = options.style[item]; - } - //处理内容 - if(options.content){ - element.innerHTML=options.content; - } - //处理子元素 - if(options.childs){ - for(const item of options.childs){ - element.appendChild(item); - } - } - return element; - }, - generate(){ - let result=lib.creation.nullObject; - const args=Array.from(arguments); - for(const item of args) { - switch(typeof item) { - case "object": - switch (item.constructor) { - case Object: - case null: - if("_type" in item){ - const type=item["_type"]; - if(!(type in result)) result[type]=lib.creation.nullObject; - result[type][item.name]=item.value; - } - else{ - if(!("style" in result)) result.style=lib.creation.nullObject; - for(const name in item){ - result.style[name]=item[name]; - } - } - break; - default: - if(!("childs" in result)) result.childs=lib.creation.array; - result.childs.add(item); - break; - } - break; - case "string": - if(/^\.|#/.test(item)){ - if(!("identity" in result)) result.identity=lib.creation.array; - const identities=item.split(".").filter(Boolean); - for(const item of identities) result.identity.add(item); - } - else result.content = item; - break; - } - } - return result; - }, - attribute(name,value){ - return { - _type:"attributes", - name:name, - value:value - } - }, - div(){ - const dom=lib.linq.dom; - return dom.inject(document.createElement("div"),dom.generate(...arguments)); - } - } - }, - init:{ - /** - * 部分函数的Promise版本 - */ - promises:{ - /** - * Promise版的`lib.init.js` - * - * @param {string} path - 文件路径 - * @param {string | string[]} [file] - 文件名或文件名组,忽略则直接读取`path`的内容 - * @returns {Promise} - */ - js:(path,file)=>new Promise((resolve,reject)=>lib.init.js(path,file,resolve,reject)), - - /** - * Promise版的`lib.init.css` - * - * @param {string} path - 文件路径 - * @param {string | string[]} [file] - 文件名或文件名组,忽略则直接读取`path`的内容 - * @param {Element} [before] 新样式dom的位置 - * @returns {Promise} - */ - css:(path,file,before)=>new Promise((resolve,reject)=>{ - const style=lib.init.css(path,file,before); - style.addEventListener("load",()=>resolve(style)); - style.addEventListener("error",reject); - }), - - /** - * Promise版的`lib.init.req` - * - * @param {string} str - 要读取的地址 - * @param {string} [master] - * @returns {Promise} - */ - req:(str,master)=>new Promise((resolve,reject)=>lib.init.req(str,resolve,reject,master)), - - /** - * Promise版的`lib.init.json` - * - * @param {string} url - 要读取的地址 - * @returns {Promise} - */ - json:(url)=>new Promise((resolve,reject)=>lib.init.json(url,resolve,reject)), - - /** - * Promise版的`lib.init.sheet` - * - * @returns {Promise} - */ - sheet(){ - return new Promise((resolve,reject)=>{ - const style=lib.init.sheet.apply(lib.init,arguments); - style.addEventListener("load",()=>resolve(style)); - style.addEventListener("error",reject); - }) - } - }, - init:function(){ - if(typeof __dirname==='string'&&__dirname.length){ - var dirsplit=__dirname.split('/'); - for(var i=0;i{ - const image=new Image(); - image.src=`${lib.assetURL}${src}`; - image.onerror=reject; - }).catch(()=>new Promise((_,reject)=>{ - const nameinfo=get.character(name); - if(!nameinfo) reject('noinfo'); - const sex=nameinfo[0]; - src=`image/character/default_silhouette_${sex}${ext}`; - const image=new Image(); - image.src=`${lib.assetURL}${src}`; - image.onload=()=>this.setBackgroundImage(src); - image.onerror=()=>reject(`sex:${sex}`); - })).catch(reason=>{ - let sex; - if(reason=='noinfo') sex='male'; - else sex=reason.slice(4); - src=`image/character/default_silhouette_${sex=='female'?'female':'male'}${ext}`; - const image=new Image(); - image.src=`${lib.assetURL}${src}`; - image.onload=()=>this.setBackgroundImage(src); - }); - } - return this; - } - }); - HTMLDivElement.prototype.setBackgroundDB=function(img){ - return game.getDB('image',img).then(src=>{ - this.style.backgroundImage=`url('${src}')`; - this.style.backgroundSize="cover"; - return this; - }); - }; - HTMLDivElement.prototype.setBackgroundImage=function(img){ - this.style.backgroundImage=`url("${lib.assetURL}${img}")`; - return this; - }, - HTMLDivElement.prototype.listen=function(func){ - if(lib.config.touchscreen){ - this.addEventListener('touchend',function(e){ - if(!_status.dragged){ - func.call(this,e); - } - }); - var fallback=function(e){ - if(!_status.touchconfirmed){ - func.call(this,e); - } - else{ - this.removeEventListener('click',fallback); - } - } - this.addEventListener('click',fallback); - } - else{ - this.addEventListener('click',func); - } - return this; - }; - HTMLDivElement.prototype.listenTransition=function(func,time){ - let done=false; - const callback=()=>{ - if(!done){ - done=true; - func.call(this); - } - clearTimeout(timer); - this.removeEventListener('webkitTransitionEnd',callback); - }; - const timer=setTimeout(callback,time||1000); - this.addEventListener('webkitTransitionEnd',callback); - return timer; - }; - HTMLDivElement.prototype.setPosition=function(){ - var position; - if(arguments.length==4){ - position=[]; - for(var i=0;i0) top+='+ '+position[1]+'px)'; - else top+='- '+Math.abs(position[1])+'px)'; - var left='calc('+position[2]+'% '; - if(position[3]>0) left+='+ '+position[3]+'px)'; - else left+='- '+Math.abs(position[3])+'px)'; - this.style.top=top; - this.style.left=left; - return this; - }; - HTMLDivElement.prototype.css=function(style){ - for(var i in style){ - if(i=='innerHTML'){ - this.innerHTML=style[i]; - } - else{ - this.style[i]=style[i]; - } - } - return this; - }; - HTMLTableElement.prototype.get=function(row,col){ - if(rowpos.includes(get.position(card,true))); - } - }); - Object.defineProperty(Array.prototype,"someInD",{ - configurable:true, - enumerable:false, - writable:true, - value:function(pos){ - if(typeof pos!='string') pos='o'; - return this.some(card=>pos.includes(get.position(card,true))); - } - }); - Object.defineProperty(Array.prototype,"everyInD",{ - configurable:true, - enumerable:false, - writable:true, - value:function(pos){ - if(typeof pos!='string') pos='o'; - return this.every(card=>pos.includes(get.position(card,true))); - } - }); - /** - *@legacy Use {@link Array#includes} instead. - */ - Object.defineProperty(Array.prototype,"contains",{ - configurable:true, - enumerable:false, - writable:true, - value:Array.prototype.includes - }); - Object.defineProperty(Array.prototype,"containsSome",{ - configurable:true, - enumerable:false, - writable:true, - value:function(){ - return Array.from(arguments).some(i=>this.includes(i)); - } - }); - Object.defineProperty(Array.prototype,"containsAll",{ - configurable:true, - enumerable:false, - writable:true, - value:function(){ - return Array.from(arguments).every(i=>this.includes(i)); - } - }); - - Object.defineProperty(Array.prototype,"add",{ - configurable:true, - enumerable:false, - writable:true, - value:function(){ - for(const arg of arguments){ - if(this.contains(arg)) continue; - this.push(arg); - } - return this; - } - }); - Object.defineProperty(Array.prototype,"addArray",{ - configurable:true, - enumerable:false, - writable:true, - value:function(){ - for(const arr of arguments){ - for(const item of arr) this.add(item); - } - return this; - } - }); - Object.defineProperty(Array.prototype,"remove",{ - configurable:true, - enumerable:false, - writable:true, - value:function(){ - for(const item of arguments){ - let pos=-1; - if (typeof item=='number'&&isNaN(item)){ - pos=this.findIndex(v=>isNaN(v)) - }else{ - pos=this.indexOf(item); - } - if(pos==-1) continue; - this.splice(pos,1); - } - return this; - } - }); - Object.defineProperty(Array.prototype,"removeArray",{ - configurable:true, - enumerable:false, - writable:true, - value:function(){ - for(const i of Array.from(arguments)) this.remove(...i); - return this; - } - }); - Object.defineProperty(Array.prototype,"unique",{ - configurable:true, - enumerable:false, - writable:true, - value:function(){ - let uniqueArray=[...new Set(this)]; - this.length=uniqueArray.length; - for(let i=0;ithis.length) num=this.length; - let arr=this.slice(0); - let list=[]; - for(let i=0;itrue)); - if(sortBy&&typeof sortBy=='function') list.sort((a,b)=>sortBy(a)-sortBy(b)); - else list.sort(); - return list[list.length-1]; - } - }); - Object.defineProperty(Array.prototype,"minBy",{ - configurable:true, - enumerable:false, - writable:true, - value:function(sortBy,filter){ - let list=this.filter(filter||(()=>true)); - if(sortBy&&typeof sortBy=='function') list.sort((a,b)=>sortBy(a)-sortBy(b)); - else list.sort(); - return list[0]; - } - }); - window.onkeydown=function(e){ - if(!ui.menuContainer||!ui.menuContainer.classList.contains('hidden')){ - if(e.keyCode==116||((e.ctrlKey||e.metaKey)&&e.keyCode==82)){ - if(e.shiftKey){ - if(confirm('是否重置游戏?')){ - var noname_inited=localStorage.getItem('noname_inited'); - var onlineKey=localStorage.getItem(lib.configprefix+'key'); - localStorage.clear(); - if(noname_inited){ - localStorage.setItem('noname_inited',noname_inited); - } - if(onlineKey){ - localStorage.setItem(lib.configprefix+'key',onlineKey); - } - if(indexedDB) indexedDB.deleteDatabase(lib.configprefix+'data'); - game.reload(); - return; - } - } - else{ - game.reload(); - } - } - else if(e.keyCode==83&&(e.ctrlKey||e.metaKey)){ - if(window.saveNonameInput){ - window.saveNonameInput(); - } - e.preventDefault(); - e.stopPropagation(); - return false; - } - else if(e.keyCode==74&&(e.ctrlKey||e.metaKey)&&lib.node){ - lib.node.debug(); - } - } - else{ - game.closePopped(); - var dialogs=document.querySelectorAll('#window>.dialog.popped:not(.static)'); - for(var i=0;i=10){ - if(line>4){ - for(let i=line-5;i`${i+1}| ${line==i+1?'⚠️':''}${_line}\n`).toString(); - } - return showCode; - } - //协议名须和html一致(网页端防跨域),且文件是js - if (typeof src=='string'&&src.startsWith(location.protocol)&&src.endsWith('.js')){ - //获取代码 - const codes=lib.init.reqSync('local:'+decodeURI(src).replace(lib.assetURL,'').replace(winPath,'')); - const lines=codes.split("\n"); - str+='\n'+createShowCode(lines); - str+='\n-------------'; - } - //解析parsex里的content fun内容(通常是技能content) - else if(err&&err.stack&&err.stack.split('\n')[1].trim().startsWith('at Object.eval [as content]')){ - const codes=_status.event.content; - if(typeof codes=='function'){ - const lines=codes.toString().split("\n"); - str+='\n'+createShowCode(lines); - str+='\n-------------'; - } - } - } - if(err&&err.stack) str+='\n'+decodeURI(err.stack).replace(new RegExp(lib.assetURL,'g'),'').replace(new RegExp(winPath,'g'),''); - alert(str); - window.ea=Array.from(arguments); - window.em=msg; - window.el=line; - window.ec=column; - window.eo=err; - game.print(str); - if(!lib.config.errstop){ - _status.withError=true; - game.loop(); - } - }; - - if(window.noname_update){ - lib.version=window.noname_update.version; - lib.changeLog=window.noname_update.changeLog; - if(window.noname_update.players){ - lib.changeLog.push('players://'+JSON.stringify(window.noname_update.players)); - } - if(window.noname_update.cards){ - lib.changeLog.push('cards://'+JSON.stringify(window.noname_update.cards)); - } - delete window.noname_update; - } - var noname_inited=localStorage.getItem('noname_inited'); - if(noname_inited&&noname_inited!=='nodejs'){ - var ua=userAgent; - if(ua.includes('android')){ - lib.device='android'; - } - else if(ua.includes('iphone')||ua.includes('ipad')||ua.includes('macintosh')){ - lib.device='ios'; - } - } - - if(lib.assetURL.includes('com.widget.noname.qingyao')||lib.assetURL.includes('online.nonamekill.android')){ - alert('您正在一个不受信任的闭源客户端上运行《无名杀》。建议您更换为其他开源的无名杀客户端,避免给您带来不必要的损失。'); - } - - var config3=null; - var proceed=function(config2){ - if(config3===null){ - config3=config2; - return; - } - if(config2.mode) lib.config.mode=config2.mode; - if(lib.config.mode_config[lib.config.mode]==undefined) lib.config.mode_config[lib.config.mode]={}; - for(var i in lib.config.mode_config.global){ - if(lib.config.mode_config[lib.config.mode][i]==undefined){ - lib.config.mode_config[lib.config.mode][i]=lib.config.mode_config.global[i]; - } - } - if(lib.config.characters){ - lib.config.defaultcharacters=lib.config.characters.slice(0); - } - if(lib.config.cards){ - lib.config.defaultcards=lib.config.cards.slice(0); - } - for(var i in config2){ - 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]={}; - } - lib.config.mode_config[thismode][i.substr(0,i.indexOf('_mode_config'))]=config2[i]; - } - else{ - lib.config[i]=config2[i]; - } - } - for(var i in lib.config.translate){ - lib.translate[i]=lib.config.translate[i]; - } - - lib.config.all.characters=[]; - lib.config.all.cards=[]; - lib.config.all.plays=[]; - lib.config.all.mode=[]; - - if(lib.config.debug){ - lib.init.js(lib.assetURL+'game','asset',function(){ - lib.skin=window.noname_skin_list; - delete window.noname_skin_list; - delete window.noname_asset_list; - }); - } - - if(window.isNonameServer){ - lib.config.mode='connect'; - } - var pack=window.noname_package; - delete window.noname_package; - for(i in pack.character){ - if(lib.config.all.sgscharacters.contains(i)||lib.config.hiddenCharacterPack.indexOf(i)==-1){ - lib.config.all.characters.push(i); - lib.translate[i+'_character_config']=pack.character[i]; - } - } - for(i in pack.card){ - if(lib.config.all.sgscards.contains(i)||lib.config.hiddenCardPack.indexOf(i)==-1){ - lib.config.all.cards.push(i); - lib.translate[i+'_card_config']=pack.card[i]; - } - } - for(i in pack.play){ - lib.config.all.plays.push(i); - lib.translate[i+'_play_config']=pack.play[i]; - } - for(i in pack.submode){ - for(var j in pack.submode[i]){ - lib.translate[i+'|'+j]=pack.submode[i][j]; - } - } - - if(!lib.config.gameRecord){ - lib.config.gameRecord={}; - } - for(i in pack.mode){ - if(lib.config.hiddenModePack.indexOf(i)==-1){ - lib.config.all.mode.push(i); - lib.translate[i]=pack.mode[i]; - if(!lib.config.gameRecord[i]){ - lib.config.gameRecord[i]={data:{}}; - } - } - } - if(lib.config.all.mode.length==0){ - lib.config.all.mode.push('identity'); - lib.translate.identity='身份'; - if(!lib.config.gameRecord.identity){ - lib.config.gameRecord.identity={data:{}}; - } - } - if(pack.background){ - for(i in pack.background){ - if(lib.config.hiddenBackgroundPack.contains(i)) continue; - lib.configMenu.appearence.config.image_background.item[i]=pack.background[i]; - } - for(var i=0;i{ - const font=pack.font[value]; - appearenceConfig.name_font.item[value]=font; - appearenceConfig.identity_font.item[value]=font; - appearenceConfig.cardtext_font.item[value]=font; - appearenceConfig.global_font.item[value]=font; - fontSheet.insertRule(`@font-face {font-family: '${value}'; src: local('${font}'), url('${lib.assetURL}font/${value}.woff2');}`,0); - if(suitsFont) fontSheet.insertRule(`@font-face {font-family: '${value}'; src: local('${font}'), url('${lib.assetURL}font/suits.woff2');}`,0); - }); - if(suitsFont) fontSheet.insertRule(`@font-face {font-family: 'Suits'; src: url('${lib.assetURL}font/suits.woff2');}`,0); - fontSheet.insertRule(`@font-face {font-family: 'NonameSuits'; src: url('${lib.assetURL}font/suits.woff2');}`,0); - fontSheet.insertRule(`@font-face {font-family: 'MotoyaLMaru'; src: url('${lib.assetURL}font/motoyamaru.woff2');}`,0) - appearenceConfig.cardtext_font.item.default='默认'; - appearenceConfig.global_font.item.default='默认'; - } - - var ua=userAgent; - if('ontouchstart' in document){ - if(!lib.config.totouched){ - game.saveConfig('totouched',true); - if(lib.device){ - game.saveConfig('low_performance',true); - game.saveConfig('confirm_exit',true); - game.saveConfig('touchscreen',true); - game.saveConfig('fold_mode',false); - if(ua.indexOf('ipad')==-1){ - game.saveConfig('phonelayout',true); - } - else if(lib.device=='ios'){ - game.saveConfig('show_statusbar_ios','overlay'); - } - } - else if(confirm('是否切换到触屏模式?(触屏模式可提高触屏设备的响应速度,但无法使用鼠标)')){ - game.saveConfig('touchscreen',true); - if(ua.includes('iphone')||ua.includes('android')){ - game.saveConfig('phonelayout',true); - } - game.reload(); - } - } - } - else if(lib.config.touchscreen){ - game.saveConfig('touchscreen',false); - } - if(!lib.config.toscrolled&&ua.includes('macintosh')){ - game.saveConfig('toscrolled',true); - game.saveConfig('mousewheel',false); - } - - var show_splash=lib.config.show_splash; - if(show_splash=='off'){ - show_splash=false; - } - else if(show_splash=='init'){ - if(localStorage.getItem('show_splash_off')){ - show_splash=false; - } - } - localStorage.removeItem('show_splash_off'); - var extensionlist=[]; - if(!localStorage.getItem(lib.configprefix+'disable_extension')){ - if(lib.config.extensions&&lib.config.extensions.length){ - window.resetExtension=function(){ - for(var i=0;i{ - const isArray=Array.isArray; - if (isArray(lib.onprepare)&&lib.onprepare.length){ - _status.onprepare=Object.freeze(lib.onprepare.map(fn=>{ - if(typeof fn!="function") return; - return (gnc.is.generatorFunc(fn)?gnc.of(fn):fn)(); - })); - } - let toLoad=lib.config.all.cards.length+lib.config.all.characters.length+1; - if(_status.javaScriptExtensions) toLoad+=_status.javaScriptExtensions.reduce((constructingToLoad,javaScriptExtension)=>{ - const lengths=Object.values(javaScriptExtension).reduce((constructingLengths,value)=>{ - if(isArray(value)) constructingLengths.push(value.length); - return constructingLengths; - },[]); - if(!lengths.length) return constructingToLoad+1; - return constructingToLoad+Math.min(...lengths); - },0); - const packLoaded=gnc.of(function*(){ - toLoad--; - if(toLoad) return; - if(_status.importing){ - let promises=lib.creation.array; - for(const type in _status.importing){ - promises.addArray(_status.importing[type]) - } - yield Promise.allSettled(promises); - delete _status.importing; - } - if(_status.windowLoaded){ - delete _status.windowLoaded; - lib.init.onload(); - } - else _status.packLoaded=true; - }); - if(localStorage.getItem(`${lib.configprefix}playback`)){ - toLoad++; - lib.init.js(`${lib.assetURL}mode`,lib.config.mode,packLoaded,packLoaded); - } - else if((localStorage.getItem(`${lib.configprefix}directstart`)||!show_splash)&&lib.config.all.mode.includes(lib.config.mode)){ - toLoad++; - lib.init.js(`${lib.assetURL}mode`,lib.config.mode,packLoaded,packLoaded); - } - lib.init.js(`${lib.assetURL}card`,lib.config.all.cards,packLoaded,packLoaded); - lib.init.js(`${lib.assetURL}character`,lib.config.all.characters,packLoaded,packLoaded); - lib.init.js(`${lib.assetURL}character`,'rank',packLoaded,packLoaded); - if(!_status.javaScriptExtensions) return; - const loadJavaScriptExtension=(javaScriptExtension,pathArray,fileArray,onLoadArray,onErrorArray,index)=>{ - if(!pathArray&&!fileArray&&!onLoadArray&&!onErrorArray){ - lib.init.js(javaScriptExtension.path,javaScriptExtension.file,()=>{ - if(typeof javaScriptExtension.onload=='function') javaScriptExtension.onload(); - packLoaded(); - },()=>{ - if(typeof javaScriptExtension.onerror=='function') javaScriptExtension.onerror(); - packLoaded(); - }); - return; - } - if(typeof index!='number') index=0; - if(pathArray&&index>=javaScriptExtension.path.length) return; - if(fileArray&&index>=javaScriptExtension.file.length) return; - if(onLoadArray&&index>=javaScriptExtension.onload.length) return; - if(onErrorArray&&index>=javaScriptExtension.onerror.length) return; - const path=pathArray?javaScriptExtension.path[index]:javaScriptExtension.path; - const file=fileArray?javaScriptExtension.file[index]:javaScriptExtension.file; - const onLoad=onLoadArray?javaScriptExtension.onload[index]:javaScriptExtension.onload; - const onError=onErrorArray?javaScriptExtension.onerror[index]:javaScriptExtension.onerror; - const javaScriptExtensionOnLoad=()=>{ - if(typeof onLoad=='function') onLoad(); - loadJavaScriptExtension(javaScriptExtension,pathArray,fileArray,onLoadArray,onErrorArray,index+1); - packLoaded(); - },jsExtOnError=()=>{ - if(typeof onError=='function') onError(); - loadJavaScriptExtension(javaScriptExtension,pathArray,fileArray,onLoadArray,onErrorArray,index+1); - packLoaded(); - }; - lib.init.js(path,file,javaScriptExtensionOnLoad,jsExtOnError); - }; - _status.javaScriptExtensions.forEach(javaScriptExtension=>{ - const pathArray=isArray(javaScriptExtension.path); - const fileArray=isArray(javaScriptExtension.file); - const onLoadArray=isArray(javaScriptExtension.onLoad); - const onErrorArray=isArray(javaScriptExtension.onError); - loadJavaScriptExtension(javaScriptExtension,pathArray,fileArray,onLoadArray,onErrorArray); - }); - }; - - var layout=lib.config.layout; - if(layout=='default'||lib.layoutfixed.indexOf(lib.config.mode)!==-1){ - layout='mobile'; - } - if(layout=='phone'){ - layout='mobile'; - game.saveConfig('layout','mobile'); - game.saveConfig('phonelayout',true); - } - game.layout=layout; - if(lib.config.image_background_random){ - if(_status.htmlbg){ - game.saveConfig('image_background',_status.htmlbg); - } - else{ - var list=[]; - for(var i in lib.configMenu.appearence.config.image_background.item){ - if(i=='default') continue; - list.push(i); - } - game.saveConfig('image_background',list.randomGet(lib.config.image_background)); - } - lib.init.background(); - } - delete _status.htmlbg; - - window.game=game; - // node:path library alternative - if (typeof module!="object"||typeof module.exports!="object") lib.init.js(`${lib.assetURL}game`,"path",()=>{ - lib.path=window._noname_path; - delete window._noname_path; - },e=>{ - console.log(e); - }); - var styleToLoad=6; - var styleLoaded=gnc.of(function*(){ - --styleToLoad; - if(styleToLoad==0){ - if(extensionlist.length&&(lib.config.mode!='connect'||show_splash)){ - _status.extensionLoading=[]; - let extToLoad=extensionlist.length; - const extLoaded=gnc.of(function*(){ - --extToLoad; - if(extToLoad==0){ - yield Promise.allSettled(_status.extensionLoading); - _status.extensionLoaded.filter(Boolean).forEach(name => { - lib.announce.publish("Noname.Init.Extension.onLoad", name); - lib.announce.publish(`Noname.Init.Extension.${name}.onLoad`, void 0); - }); - delete _status.extensionLoading; - loadPack(); - } - }); - //读取扩展 - var alerted=false; - 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); - ui.css.border_stylesheet.sheet.insertRule('#window #arena.long:not(.fewplayer) .player>.framebg, #arena.oldlayout .player>.framebg{background-image:url("'+lib.assetURL+'theme/style/player/'+bstyle+'3.png")}',0); - ui.css.border_stylesheet.sheet.insertRule('.player>.count{z-index: 3 !important;border-radius: 2px !important;text-align: center !important;}',0); - } - if(lib.config.control_style&&lib.config.control_style!='default'&&lib.config.control_style!='custom'){ - var str=''; - switch(lib.config.control_style){ - case 'wood':str='url("'+lib.assetURL+'theme/woodden/wood.jpg")';break; - case 'music':str='linear-gradient(#4b4b4b, #464646);color:white;text-shadow:black 0 0 2px';break; - case 'simple':str='linear-gradient(rgba(0,0,0,0.4), rgba(0,0,0,0.4));color:white;text-shadow:black 0 0 2px';break; - } - if(lib.config.control_style=='wood'){ - ui.css.control_stylesheet=lib.init.sheet('#window .control,#window .menubutton,#window #system>div>div,#window #system>div>.pressdown2{background-image:'+str+'}'); - } - else{ - ui.css.control_stylesheet=lib.init.sheet('#window .control,.menubutton:not(.active):not(.highlight):not(.red):not(.blue),#window #system>div>div{background-image:'+str+'}'); - } - } - if(lib.config.menu_style&&lib.config.menu_style!='default'&&lib.config.menu_style!='custom'){ - var str=''; - switch(lib.config.menu_style){ - case 'wood':str='url("'+lib.assetURL+'theme/woodden/wood2.png")';break; - case 'music':str='linear-gradient(#4b4b4b, #464646);color:white;text-shadow:black 0 0 2px';break; - case 'simple':str='linear-gradient(rgba(0,0,0,0.4), rgba(0,0,0,0.4));color:white;text-shadow:black 0 0 2px';break; - } - ui.css.menu_stylesheet=lib.init.sheet('html #window>.dialog.popped,html .menu,html .menubg{background-image:'+str+'}'); - } - - lib.config.duration=500; - - if(!lib.config.touchscreen){ - document.addEventListener('mousewheel',ui.click.windowmousewheel,{passive:true}); - document.addEventListener('mousemove',ui.click.windowmousemove); - document.addEventListener('mousedown',ui.click.windowmousedown); - document.addEventListener('mouseup',ui.click.windowmouseup); - document.addEventListener('contextmenu',ui.click.right); - } - else{ - document.addEventListener('touchstart',ui.click.touchconfirm); - document.addEventListener('touchstart',ui.click.windowtouchstart); - document.addEventListener('touchend',ui.click.windowtouchend); - document.addEventListener('touchmove',ui.click.windowtouchmove); - } - }; - var proceed2=()=>{ - if(config3){ - proceed(config3); - } - else{ - config3=true; - } - }; - - ui.css={menu:lib.init.css(lib.assetURL+'layout/default','menu',function(){ - ui.css.default=lib.init.css(lib.assetURL+'layout/default','layout'); - proceed2(); - })}; - - if(lib.device){ - lib.init.cordovaReady=function(){ - if(lib.device=='android'){ - document.addEventListener("pause", function(){ - if(!_status.paused2&&(typeof _status.event.isMine=='function'&&!_status.event.isMine())){ - ui.click.pause(); - } - if(ui.backgroundMusic){ - ui.backgroundMusic.pause(); - } - }); - document.addEventListener("resume", ()=>{ - if(ui.backgroundMusic) ui.backgroundMusic.play(); - }); - document.addEventListener("backbutton", function(){ - if(ui.arena&&ui.arena.classList.contains('menupaused')){ - if(window.saveNonameInput){ - window.saveNonameInput(); - } - else{ - ui.click.configMenu(); - } - } - else if(lib.config.confirm_exit){ - navigator.notification.confirm( - '是否退出游戏?', - function(index){ - switch(index){ - case 2:game.reload();break; - case 3:navigator.app.exitApp();break; - } - }, - '确认退出', - ['取消','重新开始','退出'] - ); - } - else{ - navigator.app.exitApp(); - } - }); - if ("cordova" in window && "plugins" in window.cordova && "permissions" in window.cordova.plugins) { - const permissions = cordova.plugins.permissions; - const requests = ["WRITE_EXTERNAL_STORAGE", "READ_EXTERNAL_STORAGE"] - requests.forEach(request => { - permissions.checkPermission(permissions[request], status => { - if (!status.hasPermission) { - permissions.requestPermission(permissions[request], lib.other.ignore, lib.other.ignore); - } - }, lib.other.ignore); - }); - } - } - game.download=function(url,folder,onsuccess,onerror,dev,onprogress){ - if(!url.startsWith('http')){ - url=get.url(dev)+url; - } - var fileTransfer=new FileTransfer(); - folder=lib.assetURL+folder; - if(onprogress){ - fileTransfer.onprogress=function(progressEvent){ - onprogress(progressEvent.loaded,progressEvent.total); - }; - } - lib.config.brokenFile.add(folder); - game.saveConfigValue('brokenFile'); - fileTransfer.download(encodeURI(url),encodeURI(folder),function(){ - lib.config.brokenFile.remove(folder); - game.saveConfigValue('brokenFile'); - if(onsuccess){ - onsuccess(); - } - },onerror); - }; - game.readFile=function(filename,callback,onerror){ - window.resolveLocalFileSystemURL(lib.assetURL,function(entry){ - entry.getFile(filename,{},function(fileEntry){ - fileEntry.file(function(fileToLoad){ - var fileReader=new FileReader(); - fileReader.onload=function(e){ - callback(e.target.result); - }; - fileReader.readAsArrayBuffer(fileToLoad, "UTF-8"); - },onerror); - },onerror); - },onerror); - }; - game.readFileAsText=function(filename,callback,onerror){ - window.resolveLocalFileSystemURL(lib.assetURL,function(entry){ - entry.getFile(filename,{},function(fileEntry){ - fileEntry.file(function(fileToLoad){ - var fileReader=new FileReader(); - fileReader.onload=function(e){ - callback(e.target.result); - }; - fileReader.readAsText(fileToLoad, "UTF-8"); - },onerror); - },onerror); - },onerror); - }; - game.writeFile=function(data,path,name,callback){ - game.ensureDirectory(path,function(){ - if(Object.prototype.toString.call(data)=='[object File]'){ - var fileReader=new FileReader(); - fileReader.onload=function(e){ - game.writeFile(e.target.result,path,name,callback); - }; - fileReader.readAsArrayBuffer(data,"UTF-8"); - } - else{ - window.resolveLocalFileSystemURL(lib.assetURL+path,function(entry){ - entry.getFile(name,{create:true},function(fileEntry){ - fileEntry.createWriter(function(fileWriter){ - fileWriter.onwriteend=callback; - fileWriter.write(data); - },callback); - },callback); - },callback); - } - }); - }; - game.removeFile=function(dir,callback){ - window.resolveLocalFileSystemURL(lib.assetURL,function(entry){ - entry.getFile(dir,{},function(fileEntry){ - fileEntry.remove(); - if(callback) callback(); - },callback||function(){}); - },callback||function(){}); - }; - game.getFileList=(dir,success,failure)=>{ - var files=[],folders=[]; - window.resolveLocalFileSystemURL(lib.assetURL+dir,entry=>{ - var dirReader=entry.createReader(); - var entries=[]; - var readEntries=()=>{ - dirReader.readEntries(results=>{ - if(!results.length){ - entries.sort(); - for(var i=0;i{ - const directoryList=typeof list=='string'?[list]:list.slice().reverse(),num=file?1:0,access=(entry,directory,createDirectory)=>{ - if(directory.length<=num){ - createDirectory(); - return; - } - const str=directory.pop(); - return new Promise((resolve,reject)=>entry.getDirectory(str,{ - create:false - },resolve,reject)).catch(()=>new Promise(resolve=>entry.getDirectory(str,{ - create:true - },resolve))).then(directoryEntry=>access(directoryEntry,directory,createDirectory)); - }; - return new Promise((resolve,reject)=>window.resolveLocalFileSystemURL(lib.assetURL,rootEntry=>{ - const createDirectory=()=>{ - if(directoryList.length) access(rootEntry,directoryList.pop().split('/').reverse(),createDirectory); - if(typeof callback=='function') callback(); - resolve(); - }; - createDirectory(); - },reject)); - }; - if(ui.updateUpdate){ - ui.updateUpdate(); - } - var showbar=function(){ - if(window.StatusBar){ - if(lib.device=='android'){ - if(lib.config.show_statusbar_android){ - window.StatusBar.overlaysWebView(false); - window.StatusBar.backgroundColorByName('black'); - window.StatusBar.show(); - } - } - else if(lib.device=='ios'){ - if(lib.config.show_statusbar_ios!='off'&&lib.config.show_statusbar_ios!='auto'){ - if(lib.config.show_statusbar_ios=='default'){ - window.StatusBar.overlaysWebView(false); - } - else{ - window.StatusBar.overlaysWebView(true); - } - window.StatusBar.backgroundColorByName('black'); - window.StatusBar.show(); - } - } - } - } - if(lib.arenaReady){ - lib.arenaReady.push(showbar); - } - else{ - showbar(); - } - }; - } - else if(typeof window.require=='function'){ - lib.node={ - fs:require('fs'), - path:require("path"), - debug:function(){ - require('electron').remote.getCurrentWindow().toggleDevTools(); - } - }; - lib.path=lib.node.path; - game.download=function(url,folder,onsuccess,onerror,dev,onprogress){ - if(!url.startsWith('http')){ - url=get.url(dev)+url; - } - game.ensureDirectory(folder,function(){ - try{ - var file = lib.node.fs.createWriteStream(__dirname+'/'+folder); - } - catch(e){ - onerror(); - } - lib.config.brokenFile.add(folder); - game.saveConfigValue('brokenFile'); - if(!lib.node.http) lib.node.http=require('http'); - if(!lib.node.https) lib.node.https=require('https'); - var opts = require('url').parse(encodeURI(url)); - opts.headers={'User-Agent': 'AppleWebkit'}; - (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); - game.saveConfigValue('brokenFile'); - if(onsuccess){ - onsuccess(); - } - }); - stream.on('error',onerror); - if(onprogress){ - var streamInterval=setInterval(function(){ - if(stream.closed){ - clearInterval(streamInterval); - } - else{ - onprogress(stream.bytesWritten); - } - },200); - } - }); - },true); - }; - game.readFile=function(filename,callback,onerror){ - lib.node.fs.readFile(__dirname+'/'+filename,function(err,data){ - if(err){ - onerror(err); - } - else{ - callback(data); - } - }); - }; - game.readFileAsText=function(filename,callback,onerror){ - lib.node.fs.readFile(__dirname+'/'+filename,'utf-8',function(err,data){ - if(err){ - onerror(err); - } - else{ - callback(data); - } - }); - }; - game.writeFile=function(data,path,name,callback){ - game.ensureDirectory(path,function(){ - if(Object.prototype.toString.call(data)=='[object File]'){ - var fileReader = new FileReader(); - fileReader.onload = function(e){ - game.writeFile(e.target.result,path,name,callback); - }; - fileReader.readAsArrayBuffer(data, "UTF-8"); - } - else{ - get.zip(function(zip){ - zip.file('i',data); - lib.node.fs.writeFile(__dirname+'/'+path+'/'+name,zip.files.i.asNodeBuffer(),null,callback); - }); - } - }); - }; - game.removeFile=function(filename,callback){ - lib.node.fs.unlink(__dirname+'/'+filename,callback||function(){}); - }; - game.getFileList=(dir,success,failure)=>{ - var files=[],folders=[]; - dir=__dirname+'/'+dir; - if(typeof failure=="undefined"){ - failure=err=>{ - throw err; - }; - } - else if(failure == null){ - failure=()=>{}; - } - try{ - lib.node.fs.readdir(dir,(err,filelist)=>{ - if(err){ - failure(err); - return; - } - for(var i=0;i{ - const directoryList=typeof list=='string'?[list]:list.slice().reverse(),number=file?1:0,access=(path,directory,createDirectory)=>{ - if(directory.length<=number){ - createDirectory(); - return; - } - path+=`/${directory.pop()}`; - const fullPath=`${__dirname}${path}`; - return new Promise((resolve,reject)=>lib.node.fs.access(fullPath,errnoException=>{ - if(errnoException) reject(); - else resolve(); - })).catch(()=>new Promise((resolve,reject)=>lib.node.fs.mkdir(fullPath,errnoException=>{ - if(errnoException) reject(errnoException); - else resolve(); - }))).then(()=>access(path,directory,createDirectory),console.log); - }; - return new Promise(resolve=>{ - const createDirectory=()=>{ - if(directoryList.length) access('',directoryList.pop().split('/').reverse(),createDirectory); - else{ - if(typeof callback=='function') callback(); - resolve(); - } - }; - createDirectory(); - }); - }; - if(ui.updateUpdate){ - ui.updateUpdate(); - } - } - else{ - //为其他自定义平台提供文件读写函数赋值的一种方式。 - //但这种方式只能修改game的文件读写函数。 - if(window.initReadWriteFunction){ - const g={}; - const ReadWriteFunctionName=['download','readFile','readFileAsText','writeFile','removeFile','getFileList','ensureDirectory','createDir']; - ReadWriteFunctionName.forEach(prop=>{ - Object.defineProperty(g,prop,{ - configurable:true, - get(){ return undefined; }, - set(newValue) { - if(typeof newValue=='function'){ - delete g[prop]; - g[prop]=game[prop]=newValue; - } - } - }) - }); - window.initReadWriteFunction(g); - } - window.onbeforeunload = function () { - if (lib.config.confirm_exit && !_status.reloading) { - return '是否离开游戏?' - } - else { - return null; - } - }; - } - - lib.config=window.config; - lib.configOL={}; - delete window.config; - let config2; - if(localStorage.getItem(`${lib.configprefix}nodb`)) window.nodb=true; - if(window.indexedDB&&!window.nodb) new Promise((resolve,reject)=>{ - const idbOpenDBRequest=window.indexedDB.open(`${lib.configprefix}data`,4); - idbOpenDBRequest.onerror=reject; - idbOpenDBRequest.onsuccess=resolve; - idbOpenDBRequest.onupgradeneeded=idbVersionChangeEvent=>{ - const idbDatabase=idbVersionChangeEvent.target.result; - if(!idbDatabase.objectStoreNames.contains('video')) idbDatabase.createObjectStore('video',{ - keyPath:'time' - }); - if(!idbDatabase.objectStoreNames.contains('image')) idbDatabase.createObjectStore('image'); - if(!idbDatabase.objectStoreNames.contains('audio')) idbDatabase.createObjectStore('audio'); - if(!idbDatabase.objectStoreNames.contains('config')) idbDatabase.createObjectStore('config'); - if(!idbDatabase.objectStoreNames.contains('data')) idbDatabase.createObjectStore('data'); - }; - }).then(event=>{ - lib.db=event.target.result; - return game.getDB('config'); - }).then(object=>{ - if(!object.storageImported){ - try{ - config2=JSON.parse(localStorage.getItem(`${lib.configprefix}config`)); - if(!config2||typeof config2!='object') throw 'err'; - } - catch(err){ - config2={}; - } - Object.keys(config2).forEach(key=>game.saveConfig(key,config2[key])); - Object.keys(lib.mode).forEach(key=>{ - try{ - config2=JSON.parse(localStorage.getItem(`${lib.configprefix}${key}`)); - if(!config2||typeof config2!='object'||get.is.empty(config2)) throw 'err'; - } - catch(err){ - config2=false; - } - localStorage.removeItem(`${lib.configprefix}${key}`); - if(config2) game.putDB('data',key,config2); - }); - game.saveConfig('storageImported',true); - lib.init.background(); - localStorage.removeItem(`${lib.configprefix}config`); - } - else config2=object; - proceed(config2); - }); - else{ - try{ - config2=JSON.parse(localStorage.getItem(lib.configprefix+'config')); - if(!config2||typeof config2!='object') throw 'err' - } - catch(err){ - config2={}; - localStorage.setItem(lib.configprefix+'config',JSON.stringify({})); - } - proceed(config2); - } - }, - reset:function(){ - if(window.inSplash) return; - if(window.resetExtension){ - if(confirm('游戏似乎未正常载入,有可能因为部分扩展未正常载入,或者因为部分扩展未载入完毕。\n是否禁用扩展并重新打开?')){ - window.resetExtension(); - window.location.reload(); - } - } - else{ - if(lib.device){ - if(navigator.notification){ - navigator.notification.confirm( - '游戏似乎未正常载入,是否重置游戏?', - function(index){ - if(index==2){ - localStorage.removeItem('noname_inited'); - window.location.reload(); - } - else if(index==3){ - var noname_inited=localStorage.getItem('noname_inited'); - var onlineKey=localStorage.getItem(lib.configprefix+'key'); - localStorage.clear(); - if(noname_inited){ - localStorage.setItem('noname_inited',noname_inited); - } - if(onlineKey){ - localStorage.setItem(lib.configprefix+'key',onlineKey); - } - if(indexedDB) indexedDB.deleteDatabase(lib.configprefix+'data'); - setTimeout(function(){ - window.location.reload(); - },200); - } - }, - '确认退出', - ['取消','重新下载','重置设置'] - ); - } - else{ - if(confirm('游戏似乎未正常载入,是否重置游戏?')){ - localStorage.removeItem('noname_inited'); - window.location.reload(); - } - } - } - else{ - if(confirm('游戏似乎未正常载入,是否重置游戏?')){ - var onlineKey=localStorage.getItem(lib.configprefix+'key'); - localStorage.clear(); - if(onlineKey){ - localStorage.setItem(lib.configprefix+'key',onlineKey); - } - if(indexedDB) indexedDB.deleteDatabase(lib.configprefix+'data'); - setTimeout(function(){ - window.location.reload(); - },200); - } - } - } - }, - //lib.onload支持传入GeneratorFunction以解决异步函数的问题 by诗笺 - onload:gnc.of(function*(){ - const libOnload=lib.onload; - delete lib.onload; - while(Array.isArray(libOnload)&&libOnload.length){ - const fun=libOnload.shift(); - if(typeof fun!="function") continue; - yield (gnc.is.generatorFunc(fun)?gnc.of(fun):fun)(); - } - ui.updated(); - game.documentZoom=game.deviceZoom; - if(game.documentZoom!=1){ - ui.updatez(); - } - 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.startsWith('custom_')){ - ui.background.setBackgroundImage('image/background/'+lib.config.image_background+'.jpg'); - if(lib.config.image_background_blur){ - ui.background.style.filter='blur(8px)'; - ui.background.style.webkitFilter='blur(8px)'; - ui.background.style.transform='scale(1.05)'; - } - } - document.documentElement.style.backgroundImage=''; - document.documentElement.style.backgroundSize=''; - document.documentElement.style.backgroundPosition=''; - document.body.insertBefore(ui.background,document.body.firstChild); - document.body.onresize=ui.updatexr; - if(lib.config.touchscreen){ - document.body.addEventListener('touchstart',function(e){ - this.startX=e.touches[0].clientX/game.documentZoom; - this.startY=e.touches[0].clientY/game.documentZoom; - _status.dragged=false; - }); - document.body.addEventListener('touchmove',function(e){ - if(_status.dragged) return; - if (Math.abs(e.touches[0].clientX/game.documentZoom - this.startX) > 10 || - Math.abs(e.touches[0].clientY/game.documentZoom - this.startY) > 10) { - _status.dragged=true; - } - }); - } - - if(lib.config.image_background.startsWith('custom_')){ - ui.background.style.backgroundImage="none"; - game.getDB('image',lib.config.image_background,function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent) - { - var data = fileLoadedEvent.target.result; - ui.background.style.backgroundImage='url('+data+')'; - if(lib.config.image_background_blur){ - ui.background.style.filter='blur(8px)'; - ui.background.style.webkitFilter='blur(8px)'; - ui.background.style.transform='scale(1.05)'; - } - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - } - if(lib.config.card_style=='custom'){ - game.getDB('image','card_style',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.card_stylesheet){ - ui.css.card_stylesheet.remove(); - } - ui.css.card_stylesheet=lib.init.sheet('.card:not(*:empty){background-image:url('+fileLoadedEvent.target.result+')}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - } - if(lib.config.cardback_style=='custom'){ - game.getDB('image','cardback_style',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.cardback_stylesheet){ - ui.css.cardback_stylesheet.remove(); - } - ui.css.cardback_stylesheet=lib.init.sheet('.card:empty,.card.infohidden{background-image:url('+fileLoadedEvent.target.result+')}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - game.getDB('image','cardback_style2',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.cardback_stylesheet2){ - ui.css.cardback_stylesheet2.remove(); - } - ui.css.cardback_stylesheet2=lib.init.sheet('.card.infohidden:not(.infoflip){background-image:url('+fileLoadedEvent.target.result+')}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - } - if(lib.config.hp_style=='custom'){ - game.getDB('image','hp_style1',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.hp_stylesheet1){ - ui.css.hp_stylesheet1.remove(); - } - ui.css.hp_stylesheet1=lib.init.sheet('.hp:not(.text):not(.actcount)[data-condition="high"]>div:not(.lost){background-image:url('+fileLoadedEvent.target.result+')}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - game.getDB('image','hp_style2',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.hp_stylesheet2){ - ui.css.hp_stylesheet2.remove(); - } - ui.css.hp_stylesheet2=lib.init.sheet('.hp:not(.text):not(.actcount)[data-condition="mid"]>div:not(.lost){background-image:url('+fileLoadedEvent.target.result+')}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - game.getDB('image','hp_style3',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.hp_stylesheet3){ - ui.css.hp_stylesheet3.remove(); - } - ui.css.hp_stylesheet3=lib.init.sheet('.hp:not(.text):not(.actcount)[data-condition="low"]>div:not(.lost){background-image:url('+fileLoadedEvent.target.result+')}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - game.getDB('image','hp_style4',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.hp_stylesheet4){ - ui.css.hp_stylesheet4.remove(); - } - ui.css.hp_stylesheet4=lib.init.sheet('.hp:not(.text):not(.actcount)>.lost{background-image:url('+fileLoadedEvent.target.result+')}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - } - if(lib.config.player_style=='custom'){ - ui.css.player_stylesheet=lib.init.sheet('#window .player{background-image:none;background-size:100% 100%;}'); - game.getDB('image','player_style',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.player_stylesheet){ - ui.css.player_stylesheet.remove(); - } - ui.css.player_stylesheet=lib.init.sheet('#window .player{background-image:url("'+fileLoadedEvent.target.result+'");background-size:100% 100%;}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - } - if(lib.config.border_style=='custom'){ - game.getDB('image','border_style',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.border_stylesheet){ - ui.css.border_stylesheet.remove(); - } - ui.css.border_stylesheet=lib.init.sheet(); - ui.css.border_stylesheet.sheet.insertRule('#window .player>.framebg{display:block;background-image:url("'+fileLoadedEvent.target.result+'")}',0); - ui.css.border_stylesheet.sheet.insertRule('.player>.count{z-index: 3 !important;border-radius: 2px !important;text-align: center !important;}',0); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - } - if(lib.config.control_style=='custom'){ - game.getDB('image','control_style',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.control_stylesheet){ - ui.css.control_stylesheet.remove(); - } - ui.css.control_stylesheet=lib.init.sheet('#window .control,.menubutton:not(.active):not(.highlight):not(.red):not(.blue),#window #system>div>div{background-image:url("'+fileLoadedEvent.target.result+'")}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - } - if(lib.config.menu_style=='custom'){ - game.getDB('image','menu_style',function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent){ - if(ui.css.menu_stylesheet){ - ui.css.menu_stylesheet.remove(); - } - ui.css.menu_stylesheet=lib.init.sheet('html #window>.dialog.popped,html .menu,html .menubg{background-image:url("'+fileLoadedEvent.target.result+'");background-size:cover}'); - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - } - - var proceed2=gnc.of(function*(){ - var mode=lib.imported.mode; - var card=lib.imported.card; - var character=lib.imported.character; - var play=lib.imported.play; - delete window.game; - var i,j,k; - for(i in mode[lib.config.mode].element){ - if(!lib.element[i]) lib.element[i]=[]; - for(j in mode[lib.config.mode].element[i]){ - if(j=='init'){ - if(!lib.element[i].inits) lib.element[i].inits=[]; - lib.element[i].inits.push(mode[lib.config.mode].element[i][j]); - } - else{ - lib.element[i][j]=mode[lib.config.mode].element[i][j]; - } - } - } - for(i in mode[lib.config.mode].ai){ - if(typeof mode[lib.config.mode].ai[i]=='object'){ - if(ai[i]==undefined) ai[i]={}; - for(j in mode[lib.config.mode].ai[i]){ - ai[i][j]=mode[lib.config.mode].ai[i][j]; - } - } - else{ - ai[i]=mode[lib.config.mode].ai[i]; - } - } - for(i in mode[lib.config.mode].ui){ - if(typeof mode[lib.config.mode].ui[i]=='object'){ - if(ui[i]==undefined) ui[i]={}; - for(j in mode[lib.config.mode].ui[i]){ - ui[i][j]=mode[lib.config.mode].ui[i][j]; - } - } - else{ - ui[i]=mode[lib.config.mode].ui[i]; - } - } - for(i in mode[lib.config.mode].game){ - game[i]=mode[lib.config.mode].game[i]; - } - for(i in mode[lib.config.mode].get){ - get[i]=mode[lib.config.mode].get[i]; - } - lib.init.start=mode[lib.config.mode].start; - lib.init.startBefore=mode[lib.config.mode].startBefore; - if(game.onwash){ - lib.onwash.push(game.onwash); - delete game.onwash; - } - if(game.onover){ - lib.onover.push(game.onover); - delete game.onover; - } - lib.config.banned=lib.config[lib.config.mode+'_banned']||[]; - lib.config.bannedcards=lib.config[lib.config.mode+'_bannedcards']||[]; - - lib.rank=window.noname_character_rank; - delete window.noname_character_rank; - for(i in mode[lib.config.mode]){ - if(i=='element') continue; - if(i=='game') continue; - if(i=='ai') continue; - if(i=='ui') continue; - if(i=='get') continue; - if(i=='config') continue; - if(i=='onreinit') continue; - if(i=='start') continue; - if(i=='startBefore') continue; - if(lib[i]==undefined) lib[i]=(Array.isArray(mode[lib.config.mode][i]))?[]:{}; - for(j in mode[lib.config.mode][i]){ - lib[i][j]=mode[lib.config.mode][i][j]; - } - } - if(typeof mode[lib.config.mode].init=='function'){ - mode[lib.config.mode].init(); - } - - var connectCharacterPack=[]; - var connectCardPack=[]; - for(i in character){ - if(character[i].character){ - const characterPack=lib.characterPack[i]; - if(characterPack) Object.assign(characterPack,character[i].character); - else lib.characterPack[i]=character[i].character; - } - for(j in character[i]){ - if(j=='mode'||j=='forbid') continue; - if(j=='connect'){ - connectCharacterPack.push(i); - continue; - } - if(j=='character'&&!lib.config.characters.contains(i)&&lib.config.mode!='connect'){ - if(lib.config.mode=='chess'&&get.config('chess_mode')=='leader'&&get.config('chess_leader_allcharacter')){ - for(k in character[i][j]){ - lib.hiddenCharacters.push(k); - } - } - else if(lib.config.mode!='boss'||i!='boss'){ - continue; - } - } - if(Array.isArray(lib[j])&&Array.isArray(character[i][j])){ - lib[j].addArray(character[i][j]); - continue; - } - for(k in character[i][j]){ - if(j=='character'){ - if(!character[i][j][k][4]){ - character[i][j][k][4]=[]; - } - if(character[i][j][k][4].contains('boss')|| - character[i][j][k][4].contains('hiddenboss')){ - lib.config.forbidai.add(k); - } - if(lib.config.forbidai_user&&lib.config.forbidai_user.contains(k)){ - lib.config.forbidai.add(k); - } - for(var l=0;l{ - const style=document.createElement("link"); - style.rel="stylesheet"; - 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.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); - document.head.appendChild(style); - } - else if(before) document.head.insertBefore(style,before); - else document.head.appendChild(style); - }); - } - return style; - }, - //在扩展的precontent中调用,用于加载扩展必需的JS文件。 - //If any of the parameters is an Array, corresponding files will be loaded in order - //如果任意参数为数组,则按顺序加载加载相应的文件 - jsForExtension:(path,file,onLoad,onError)=>{ - if(!_status.javaScriptExtensions) _status.javaScriptExtensions=[]; - _status.javaScriptExtensions.push({ - path:path, - file:file, - onLoad:onLoad, - onError:onError - }); - }, - js:(path,file,onLoad,onError)=>{ - if(path[path.length-1]=='/') path=path.slice(0,path.length-1); - if(path==`${lib.assetURL}mode`&&lib.config.all.stockmode.indexOf(file)==-1){ - lib.genAwait(lib.init[`setMode_${file}`]()).then(onLoad); - return; - } - if(Array.isArray(file)){ - file.forEach(value=>lib.init.js(path,value,onLoad,onError)); - return; - } - let scriptSource=file?`${path}${/^db:extension-[^:]*$/.test(path)?':':'/'}${file}.js`:path; - 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=>{ - if(result.includes('sojson')||result.includes('jsjiami')||result.includes('var _0x')) alert(alertMessage); - },()=>void 0); - else if(location.origin!='file://') lib.init.reqSync(pathToRead,function(){ - const result = this.responseText; - if(result.includes('sojson')||result.includes('jsjiami')||result.includes('var _0x')) alert(alertMessage); - },()=>void 0); - } - const script=document.createElement('script'); - (scriptSource.startsWith('db:')?game.getDB('image',scriptSource.slice(3)).then(get.objectURL):new Promise(resolve=>resolve(scriptSource))).then(resolvedScriptSource=>{ - script.src=resolvedScriptSource; - 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); - }); - return script; - }, - /** - * 同步lib.init.js - * @returns { void } - */ - jsSync:(path,file,onLoad,onError)=>{ - if(lib.assetURL.length==0&&location.origin=='file://'&&typeof game.readFile=='undefined'){ - const e=new Error('浏览器file协议下无法使用此api,请在http/https协议下使用此api'); - if(typeof onError=='function') onError(e); - else throw e; - return; - } - if(path[path.length-1]=='/') path=path.slice(0,path.length-1); - if(path==`${lib.assetURL}mode`&&lib.config.all.stockmode.indexOf(file)==-1){ - lib.genAwait(lib.init[`setMode_${file}`]()).then(onLoad); - return; - } - if(Array.isArray(file)){ - return file.forEach(value=>lib.init.jsSync(path,value,onLoad,onError)); - } - let scriptSource; - if(!file) scriptSource=path; - else scriptSource=`${path}/${file}.js`; - if(path.startsWith('http')) scriptSource+=`?rand=${get.id()}`; - const xmlHttpRequest=new XMLHttpRequest(); - let data; - xmlHttpRequest.addEventListener("load",()=>{ - data=xmlHttpRequest.responseText; - if(!data) { - if(typeof onError=='function') onError(new Error(`${scriptSource}加载失败!`)); - return; - } - 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}`); - } - try{ - window.eval(data); - if(typeof onLoad=='function') onLoad(); - } - catch(error){ - if(typeof onError=='function') onError(error); - } - }); - if(typeof onError=='function') xmlHttpRequest.addEventListener("error",onError); - xmlHttpRequest.open("GET",scriptSource,false); - xmlHttpRequest.send(); - }, - req:(str,onload,onerror,master)=>{ - let sScriptURL; - 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'); - if(typeof onerror=='function') onerror(e); - else throw e; - return; - } - sScriptURL=lib.assetURL+str.slice(6); - } - else{ - let url=get.url(master); - if(url[url.length-1]!='/') url+='/'; - sScriptURL=url+str; - } - const oReq=new XMLHttpRequest(); - if(typeof onload=='function') oReq.addEventListener("load",onload); - if(typeof onerror=='function') oReq.addEventListener("error",onerror); - oReq.open("GET",sScriptURL); - oReq.send(); - }, - /** - * 同步lib.init.req - */ - reqSync:(str,onload,onerror,master)=>{ - let sScriptURL; - 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'); - if(typeof onerror=='function') onerror(e); - else throw e; - return; - } - sScriptURL=lib.assetURL+str.slice(6); - } - else{ - let url=get.url(master); - if(url[url.length-1]!='/')url+='/'; - sScriptURL=url+str; - } - const oReq=new XMLHttpRequest(); - if(typeof onload=='function') oReq.addEventListener("load",onload); - if(typeof onerror=='function') oReq.addEventListener("error",onerror); - oReq.open("GET",sScriptURL,false); - oReq.send(); - if(typeof onload!=='function') return oReq.responseText; - }, - json:(url,onload,onerror)=>{ - const oReq=new XMLHttpRequest(); - if(typeof onload=='function') oReq.addEventListener("load",()=>{ - let result; - try{ - result=JSON.parse(oReq.responseText); - if(!result) throw('err'); - } - catch(e){ - if(typeof onerror=='function') onerror(e); - return; - } - onload(result); - }); - if(typeof onerror=='function') oReq.addEventListener("error",onerror); - oReq.open("GET",url); - oReq.send(); - }, - /** - * 同步lib.init.json - */ - jsonSync:(url,onload,onerror)=>{ - if(lib.assetURL.length==0&&location.origin=='file://'&&typeof game.readFile=='undefined'){ - const e=new Error('浏览器file协议下无法使用此api,请在http/https协议下使用此api'); - if(typeof onerror=='function') onerror(e); - else throw e; - return; - } - const oReq=new XMLHttpRequest(); - if(typeof onload=='function') oReq.addEventListener("load",()=>{ - let result; - try{ - result=JSON.parse(oReq.responseText); - if(!result) throw('err'); - } - catch(e){ - if(typeof onerror=='function') onerror(e); - return; - } - onload(result); - }); - if(typeof onerror=='function') oReq.addEventListener("error",onerror); - oReq.open("GET",url,false); - oReq.send(); - }, - cssstyles:function(){ - if(ui.css.styles){ - ui.css.styles.remove(); - } - ui.css.styles=lib.init.sheet(); - ui.css.styles.sheet.insertRule('#arena .player>.name,#arena .button.character>.name {font-family: '+(lib.config.name_font||'xinwei')+',xinwei}',0); - ui.css.styles.sheet.insertRule('#arena .player>.name,.button.character>.name {font-family: '+(lib.config.name_font||'xinwei')+',xinwei}',0); - ui.css.styles.sheet.insertRule('#arena .player .identity>div {font-family: '+(lib.config.identity_font||'huangcao')+',xinwei}',0); - ui.css.styles.sheet.insertRule('.button.character.newstyle>.identity {font-family: '+(lib.config.identity_font||'huangcao')+',xinwei}',0); - if(lib.config.cardtext_font&&lib.config.cardtext_font!='default'){ - ui.css.styles.sheet.insertRule('.card div:not(.info):not(.background) {font-family: '+lib.config.cardtext_font+';}',0); - } - if(lib.config.global_font&&lib.config.global_font!='default'){ - ui.css.styles.sheet.insertRule('#window {font-family: '+lib.config.global_font+',xinwei}',0); - ui.css.styles.sheet.insertRule('#window #control{font-family: STHeiti,SimHei,Microsoft JhengHei,Microsoft YaHei,WenQuanYi Micro Hei,Suits,Helvetica,Arial,sans-serif}',0); - } - switch(lib.config.glow_phase){ - case 'yellow':ui.css.styles.sheet.insertRule('#arena .player:not(.selectable):not(.selected).glow_phase {box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgb(217, 152, 62) 0 0 15px, rgb(217, 152, 62) 0 0 15px !important;}',0);break; - case 'green':ui.css.styles.sheet.insertRule('#arena .player:not(.selectable):not(.selected).glow_phase {box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(10, 155, 67, 1) 0 0 15px, rgba(10, 155, 67, 1) 0 0 15px !important;}',0);break; - case 'purple':ui.css.styles.sheet.insertRule('#arena .player:not(.selectable):not(.selected).glow_phase {box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgb(189, 62, 170) 0 0 15px, rgb(189, 62, 170) 0 0 15px !important;}',0);break; - } - }, - layout:function(layout,nosave){ - const loadingScreen=ui.create.div('.loading-screen',document.body),loadingScreenStyle=loadingScreen.style; - loadingScreenStyle.animationDuration='1s'; - loadingScreenStyle.animationFillMode='forwards'; - loadingScreenStyle.animationName='opacity-0-1'; - if(layout=='default') layout='mobile'; - if(!nosave) game.saveConfig('layout',layout); - game.layout=layout; - ui.arena.hide(); - new Promise(resolve=>setTimeout(resolve,500)).then(()=>{ - if(game.layout=='default'){ - ui.css.layout.href=''; - } - else{ - ui.css.layout.href=lib.assetURL+'layout/'+game.layout+'/layout.css'; - } - if(game.layout=='mobile'||game.layout=='long'){ - ui.arena.classList.add('mobile'); - } - else{ - ui.arena.classList.remove('mobile'); - } - if(game.layout=='mobile'||game.layout=='long'||game.layout=='long2'||game.layout=='nova'){ - if(game.me&&game.me.node.handcards2.childNodes.length){ - while(game.me.node.handcards2.childNodes.length){ - game.me.node.handcards1.appendChild(game.me.node.handcards2.firstChild); - } - } - } - if(game.layout=='default'){ - ui.arena.classList.add('oldlayout'); - } - else{ - ui.arena.classList.remove('oldlayout'); - } - if(lib.config.cardshape=='oblong'&&(game.layout=='long'||game.layout=='mobile'||game.layout=='long2'||game.layout=='nova')){ - ui.arena.classList.add('oblongcard'); - ui.window.classList.add('oblongcard'); - } - else{ - ui.arena.classList.remove('oblongcard'); - ui.window.classList.remove('oblongcard'); - } - //if(lib.config.textequip=='text'&&(game.layout=='long'||game.layout=='mobile')){ - if(game.layout=='long'||game.layout=='mobile'){ - ui.arena.classList.add('textequip'); - } - else{ - ui.arena.classList.remove('textequip'); - } - if(get.is.phoneLayout()){ - ui.css.phone.href=lib.assetURL+'layout/default/phone.css'; - ui.arena.classList.add('phone'); - } - else{ - ui.css.phone.href=''; - ui.arena.classList.remove('phone'); - } - for(var i=0;isetTimeout(resolve,100)); - }).then(()=>{ - ui.arena.show(); - if(game.me) game.me.update(); - return new Promise(resolve=>setTimeout(resolve,500)); - }).then(()=>{ - ui.updatex(); - ui.updatePlayerPositions(); - return new Promise(resolve=>setTimeout(resolve,500)); - }).then(()=>{ - ui.updatec(); - loadingScreenStyle.animationName='opacity-1-0'; - loadingScreen.addEventListener('animationend',animationEvent=>animationEvent.target.remove()); - }); - }, - background:function(){ - if(lib.config.image_background_random){ - var list=[]; - for(var i in lib.configMenu.appearence.config.image_background.item){ - if(i=='default') continue; - list.push(i); - } - 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.startsWith('custom_')){ - localStorage.setItem(lib.configprefix+'background',lib.config.image_background); - } - else if(lib.config.image_background=='default'&&lib.config.theme=='simple'){ - localStorage.setItem(lib.configprefix+'background','ol_bg'); - } - else{ - localStorage.removeItem(lib.configprefix+'background'); - } - }, - /** - * - * @param {*} item - * @param {Function} [scope] 作用域 - * @returns - */ - parsex:function(item,scope){ - //by 诗笺、Tipx-L - /** - * @param {Function} func - */ - function Legacy(func){ - //Remove all comments - //移除所有注释 - let str=func.toString().replace(/((?:(?:^[ \t]*)?(?:\/\*[^*]*\*+(?:[^/*][^*]*\*+)*\/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/)))?|\/\/(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/))|(?=\r?\n))))+)|("(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\])*'|(?:\r?\n|[\s\S])[^/"'\\\s]*)/mg,'$2').trim(); - //获取第一个 { 后的所有字符 - str=str.slice(str.indexOf('{')+1); - //判断代码中是否有debugger - let regex=/event\.debugger\(\)/; - let hasDebugger=false; - let insertDebugger=`yield code=>eval(code);`; - let debuggerSkip=0; - let debuggerResult; - while((debuggerResult=str.slice(debuggerSkip).match(regex))!=null){ - let debuggerCopy=str; - debuggerCopy=debuggerCopy.slice(0,debuggerSkip+debuggerResult.index)+insertDebugger+debuggerCopy.slice(debuggerSkip+debuggerResult.index+debuggerResult[0].length,-1); - //测试是否有错误 - try { - new GeneratorFunction(debuggerCopy); - str=debuggerCopy+'}'; - debuggerSkip+=debuggerResult.index+insertDebugger.length; - hasDebugger=true; - }catch(error){ - debuggerSkip+=debuggerResult.index+debuggerResult[0].length; - } - } - //func中要写步骤的话,必须要写step 0 - if(str.indexOf('step 0')==-1){ - str='{if(event.step==1) {event.finish();return;}\n'+str; - }else{ - let skip=0; - let k=0; - let result; - //去除99个step的限制 - while((result=str.slice(skip).match(new RegExp(`['"]step ${k}['"]`)))!=null){ - let insertStr; - if(k==0){ - insertStr=`switch(step){case 0:`; - }else{ - insertStr=`break;case ${k}:`; - } - let copy=str; - copy=copy.slice(0,skip+result.index)+insertStr+copy.slice(skip+result.index+result[0].length); - //测试是否有错误 - try{ - new (hasDebugger?GeneratorFunction:Function)(copy); - str=copy; - skip+=result.index+insertStr.length; - }catch(error){ - k--; - skip+=result.index+result[0].length; - } - k++; - } - str=`if(event.step==${k}){event.finish();return;}`+str; - } - if(!scope){ - return (new (hasDebugger?GeneratorFunction:Function)('event','step','source','player','target','targets', - 'card','cards','skill','forced','num','trigger','result', - '_status','lib','game','ui','get','ai',str)); - }else{ - return scope(`function${hasDebugger?'*':''} anonymous(event,step,source,player,target,targets, - card,cards,skill,forced,num,trigger,result, - _status,lib,game,ui,get,ai){${str}}; anonymous;`); - } - } - switch(typeof item){ - case "object": - if(Array.isArray(item)){ - let lastEvent=null; - return function*(event,step,source,player,target,targets,card,cards,skill,forced,num,trigger,result,_status,lib,game,ui,get,ai){ - if(step>=item.length) return event.finish(); - var current=item[step]; - if(typeof current!="function") throw new Error(`content ${step} of ${event.name} is not vaild: ${current}`); - var currentResult=current(event,{ - event:event, - step:step, - source:source, - player:player, - target:target, - targets:targets, - card:card, - cards:cards, - skill:skill, - forced:forced, - num:num, - trigger:trigger, - result:result - },(lastEvent&&("result" in lastEvent))?lastEvent.result:null); - // TODO: use `event.debugger` to replace source - if(gnc.is.generator(currentResult)) lastEvent=yield* currentResult; - else lastEvent=currentResult; - } - } - else{ - if(Symbol.iterator in item) return lib.init.parsex(Array.from(item)); - if(item.toString !== Object.prototype.toString) return lib.init.parsex(item.toString()); - if("render" in item) { - // TODO: Object Render Parse - throw new Error("NYI: Object Render Parse"); - } - // TODO: Object Other Parse - throw new Error("NYI: Object Other Parse"); - } - case "function": - if (gnc.is.generatorFunc(item)) { - let gen,lastEvent; - return function*(event,step,source,player,target,targets,card,cards,skill,forced,num,trigger,result,_status,lib,game,ui,get,ai){ - event.step=NaN; - if(!gen)gen=item(event,{ - event:event, - step:step, - source:source, - player:player, - target:target, - targets:targets, - card:card, - cards:cards, - skill:skill, - forced:forced, - num:num, - trigger:trigger, - result:result - }); - var res=gen.next((lastEvent&&("result" in lastEvent))?lastEvent.result:null); - if(res.done) return event.finish(); - var currentResult=res.value; - // TODO: use `event.debugger` to replace source - if(typeof currentResult=="function") yield currentResult; - else{ - if(Array.isArray(currentResult)){ - event.step=currentResult[1]; - currentResult=currentResult[0]; - } - lastEvent=currentResult; - } - } - }else if(item._parsed) return item; - // falls through - default: - return Legacy(item); - } - }, - eval:function(func){ - if(typeof func=='function'){ - return eval('('+func.toString()+')'); - } - else if(typeof func=='object'){ - for(var i in func){ - if(Object.prototype.hasOwnProperty.call(func, i)){ - func[i]=lib.init.eval(func[i]); - } - } - } - return func; - }, - encode:function(strUni){ - var strUtf = strUni.replace( - /[\u0080-\u07ff]/g,function(c){ - var cc = c.charCodeAt(0); - return String.fromCharCode(0xc0 | cc>>6, 0x80 | cc&0x3f); - }); - strUtf = strUtf.replace( - /[\u0800-\uffff]/g,function(c) { - var cc = c.charCodeAt(0); - return String.fromCharCode(0xe0 | cc>>12, 0x80 | cc>>6&0x3F, 0x80 | cc&0x3f); - }); - return btoa(strUtf); - }, - decode:function(str){ - var strUtf=atob(str); - var strUni = strUtf.replace( - /[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g,function(c) { - var cc = ((c.charCodeAt(0)&0x0f)<<12) | ((c.charCodeAt(1)&0x3f)<<6) | ( c.charCodeAt(2)&0x3f); - return String.fromCharCode(cc); - }); - strUni = strUni.replace( - /[\u00c0-\u00df][\u0080-\u00bf]/g,function(c){ - var cc = (c.charCodeAt(0)&0x1f)<<6 | c.charCodeAt(1)&0x3f; - return String.fromCharCode(cc); - }); - return strUni; - }, - stringify:function(obj){ - var str='{' - for(var i in obj){ - str+='"'+i+'":' - if(Object.prototype.toString.call(obj[i])=='[object Object]'){ - str+=lib.init.stringify(obj[i]); - } - else if(typeof obj[i]=='function'){ - str+=obj[i].toString(); - } - else{ - str+=JSON.stringify(obj[i]); - } - str+=',' - } - str+='}'; - return str; - }, - stringifySkill:function(obj){ - var str=''; - for(var i in obj){ - str+=i+':' - if(Object.prototype.toString.call(obj[i])=='[object Object]'){ - str+='{\n'+lib.init.stringifySkill(obj[i])+'}'; - } - else if(typeof obj[i]=='function'){ - str+=obj[i].toString().replace(/\t/g,''); - } - else{ - str+=JSON.stringify(obj[i]); - } - str+=',\n' - } - return str; - } - }, - cheat:{ - i:function(){ - window.cheat=lib.cheat; - window.game=game; - window.ui=ui; - window.get=get; - window.ai=ai; - window.lib=lib; - window._status=_status; - }, - dy:function(){ - var next=game.me.next; - for(var i=0;i<10;i++){ - if(next.identity!='zhu'){ - break; - } - next=next.next; - } - next.die(); - }, - x:function(){ - var gl=function(dir,callback){ - var files=[],folders=[]; - dir='/Users/widget/Documents/extension/'+dir; - lib.node.fs.readdir(dir,function(err,filelist){ - for(var i=0;i1){ - 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'))); - }, - g:function(){ - for(var i=0;i0&&typeof arguments[i]=='number'){ - for(var j=0;j{ - 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:()=>{ - 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); - }); - 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 - //执行延时锦囊牌效果 - executeDelayCardEffect:()=>{ - 'step 0' - target.$phaseJudge(card); - event.cancelled=false; - event.trigger('executeDelayCardEffect'); - event.cardName=card.viewAs||card.name; - target.popup(event.cardName,'thunder'); - if(!lib.card[event.cardName].effect){ - game.delay(); - event.finish(); - } - else if(!lib.card[event.cardName].judge){ - game.delay(); - event.nojudge=true; - } - 'step 1' - if(event.cancelled||event.nojudge) return; - var next=player.judge(card),judge=event.judge; - if(typeof judge=='function') next.judge=judge; - var judge2=event.judge2; - if(typeof judge2=='function') next.judge2=judge2; - 'step 2' - if(event.excluded) delete event.excluded; - else{ - var cardName=event.cardName; - if(event.cancelled&&!event.direct){ - var cardCancel=lib.card[cardName].cancel; - if(cardCancel){ - var next=game.createEvent(`${cardName}Cancel`); - next.setContent(cardCancel); - next.cards=[card]; - if(!card.viewAs){ - var autoViewAs=next.card=get.autoViewAs(card); - autoViewAs.expired=card.expired; - } - else{ - var autoViewAs=next.card=get.autoViewAs({ - name:cardName - },next.cards); - autoViewAs.expired=card.expired; - } - next.player=player; - } - } - else{ - var next=game.createEvent(cardName); - next.setContent(lib.card[cardName].effect); - next._result=result; - next.cards=[card]; - if(!card.viewAs){ - var autoViewAs=next.card=get.autoViewAs(card); - autoViewAs.expired=card.expired; - } - else{ - var autoViewAs=next.card=get.autoViewAs({ - name:cardName - },next.cards); - autoViewAs.expired=card.expired; - } - next.player=player; - } - } - ui.clear(); - card.delete(); - }, - //Gift - //赠予 - gift:()=>{ - 'step 0' - event.num=0; - 'step 1' - if(num{ - 'step 0' - game.log(player,'重铸了',cards); - if(typeof event.recastingLose!='function') return; - event.trigger('recastingLose'); - event.recastingLose(player,cards); - event.trigger('recastingLost'); - event.recastingLosingEvents.push(...event.next.filter(value=>value.name!='arrangeTrigger')); - 'step 1' - event.trigger('recast'); - 'step 2' - if(typeof event.recastingGain!='function') return; - event.trigger('recastingGain'); - event.recastingGain(player,cards); - event.trigger('recastingGained'); - event.recastingGainingEvents.push(...event.next.filter(value=>value.name!='arrangeTrigger')); - }, - //装备栏相关 - disableEquip:function(){ - 'step 0' - event.cards=[]; - event.num=0; - event.slotsx=[]; - if(get.is.mountCombined()){ - event.slots.forEach(type=>{ - if(type=='equip3'||type=='equip4') event.slotsx.add('equip3_4'); - else event.slotsx.add(type) - }); - } - else{ - event.slotsx.addArray(event.slots); - } - event.slotsx.sort(); - if(!event.slots.length) event.finish(); - 'step 1' - var slot=event.slotsx[event.num]; - var slot_key=slot; - var left=player.countEnabledSlot(slot),lose; - if(slot=='equip3_4'){ - lose=Math.min(left,Math.max(get.numOf(event.slots,'equip3'),get.numOf(event.slots,'equip4'))); - slot_key='equip3'; - } - else lose=Math.min(left,get.numOf(event.slots,slot)); - if(lose<=0) event.goto(3); - else{ - game.log(player,'废除了'+get.cnNumber(lose)+'个','#g'+get.translation(slot)+'栏'); - if(!player.disabledSlots) player.disabledSlots={}; - if(!player.disabledSlots[slot_key]) player.disabledSlots[slot_key]=0; - player.disabledSlots[slot_key]+=lose; - var cards=player.getEquips(slot).filter(card=>!event.cards.contains(card)); - if(cards.length>0){ - if(lose>=left){ - event._result={bool:true,links:cards}; - } - else if(cards.length>(left-lose)){ - var source=event.source,num=(cards.length-(left-lose)); - if(!source||!source.isIn()) source=player; - source.chooseButton([ - '选择'+(player==source?'你':get.translation(player))+'的'+get.cnNumber(num)+'张'+get.translation(slot)+'牌置入弃牌堆', - cards, - ],true,[1,num]).set('filterOk',function(){ - var evt=_status.event; - return ui.selected.buttons.reduce(function(num,button){ - if(evt.slot=='equip3_4') return num+Math.max(get.numOf(get.subtypes(button.link,false),'equip3'),get.numOf(get.subtypes(button.link,false),'equip4')); - return num+get.numOf(get.subtypes(button.link,false),evt.slot) - },0)==evt.required; - }).set('required',num).set('slot',slot) - } - else event.goto(3); - } - else event.goto(3) - } - 'step 2' - if(result.bool) event.cards.addArray(result.links); - 'step 3' - event.num++; - if(event.num0) player.loseToDiscardpile(cards); - } - }, - enableEquip:function(){ - if(!event.slots.length) return; - var slotsx=[...new Set(event.slots)].sort(); - for(var slot of slotsx){ - var lost=player.countDisabledSlot(slot),gain=Math.min(lost,get.numOf(event.slots,slot)); - if(lost<=0) continue; - else{ - game.log(player,'恢复了'+get.cnNumber(gain)+'个','#g'+get.translation(slot)+'栏'); - if(!player.disabledSlots) player.disabledSlots={}; - if(!player.disabledSlots[slot]) player.disabledSlots[slot]=0; - player.disabledSlots[slot]-=gain; - } - } - player.$syncDisable(); - }, - expandEquip:function(){ - if(!event.slots.length) return; - var slotsx=[]; - if(get.is.mountCombined()){ - event.slots.forEach(type=>{ - if(type=='equip3'||type=='equip4') slotsx.add('equip3_4'); - else slotsx.add(type) - }); - } - else{ - slotsx.addArray(event.slots); - } - slotsx.sort(); - for(var slot of slotsx){ - var expand=get.numOf(event.slots,slot),slot_key=slot; - if(slot=='equip3_4'){ - expand=Math.max(get.numOf(event.slots,'equip3'),get.numOf(event.slots,'equip4')); - slot_key='equip3'; - } - game.log(player,'获得了'+get.cnNumber(expand)+'个额外的','#g'+get.translation(slot)+'栏'); - if(!player.expandedSlots) player.expandedSlots={}; - if(!player.expandedSlots[slot_key]) player.expandedSlots[slot_key]=0; - player.expandedSlots[slot_key]+=expand; - } - player.$syncExpand(); - }, - //选择顶装备要顶的牌 - replaceEquip:function(){ - 'step 0' - event.cards=[]; - var types=get.subtypes(card,false); - if(types.length){ - var info=get.info(card,false); - if(info.customSwap){ - event.cards.addArray(player.getCards('e',function(card){ - return info.customSwap(card); - })); - event.goto(4); - } - else{ - event.num=0; - event.slots=types; - event.slotsx=[]; - if(get.is.mountCombined()){ - event.slots.forEach(type=>{ - if(type=='equip3'||type=='equip4') event.slotsx.add('equip3_4'); - else event.slotsx.add(type) - }); - } - else{ - event.slotsx.addArray(event.slots); - } - event.slotsx.sort(); - } - } - else event.goto(4); - 'step 1' - var slot=event.slotsx[event.num]; - var left=player.countEquipableSlot(slot),lose; - if(slot=='equip3_4') lose=Math.min(left,Math.max(get.numOf(event.slots,'equip3'),get.numOf(event.slots,'equip4'))); - else lose=Math.min(left,get.numOf(event.slots,slot)); - if(lose<=0) event.goto(3); - else{ - var cards=player.getEquips(slot).filter(card=>{ - return !event.cards.contains(card)&&lib.filter.canBeReplaced(card,player); - }); - if(cards.length>0){ - if(lose>=left){ - event._result={bool:true,links:cards}; - } - else if(cards.length>(left-lose)){ - var source=event.source,num=(cards.length-(left-lose)); - if(!source||!source.isIn()) source=player; - source.chooseButton([ - '选择替换掉'+get.cnNumber(num)+'张'+get.translation(slot)+'牌', - cards, - ],true,[1,num]).set('filterOk',function(){ - var evt=_status.event; - return ui.selected.buttons.reduce(function(num,button){ - if(evt.slot=='equip3_4') return num+Math.max(get.numOf(get.subtypes(button.link,false),'equip3'),get.numOf(get.subtypes(button.link,false),'equip4')); - return num+get.numOf(get.subtypes(button.link,false),evt.slot) - },0)==evt.required; - }).set('required',num).set('slot',slot) - } - else event.goto(3); - } - else event.goto(3) - } - 'step 2' - if(result.bool) event.cards.addArray(result.links); - 'step 3' - event.num++; - if(event.num0; - }); - if(!event.targets.length) event.result={bool:false}; - else{ - var next=player.chooseCardOL(event.targets,get.translation(player)+'发起了议事,请选择展示的手牌',true).set('type','debate').set('source',player).set('ai',event.ai||function(card){ - return Math.random(); - }).set('aiCard',event.aiCard||function(target){ - var hs=target.getCards('h'); - return {bool:true,cards:[hs.randomGet()]}; - }); - next._args.remove('glow_result'); - } - 'step 1' - var red=[],black=[]; - event.videoId=lib.status.videoId++; - for(var i=0;i红色,展示了',red.map(function(i){ - return i[1]; - })); - } - else game.log('#b无人','意见为红色'); - if(black.length){ - game.log(black.map(function(i){ - return i[0]; - }),'意见为','#g黑色',',展示了',black.map(function(i){ - return i[1]; - })); - } - else game.log('#b无人','意见为','#g黑色'); - game.broadcastAll(function(name,id,redArgs,blackArgs){ - var dialog=ui.create.dialog(name+'发起了议事','hidden','forcebutton'); - dialog.videoId=id; - dialog.classList.add('scroll1'); - dialog.classList.add('scroll2'); - dialog.classList.add('fullwidth'); - dialog.classList.add('fullheight'); - dialog.buttonss=[]; - - var list=['意见为红色的角色','意见为黑色的角色'] - for(var i=0;i'+list[i]+''); - var buttons=ui.create.div('.buttons',dialog.content); - dialog.buttonss.push(buttons); - buttons.classList.add('popup'); - buttons.classList.add('guanxing'); - } - var func=function(target){ - if(target._tempTranslate) return target._tempTranslate; - var name=target.name; - if(lib.translate[name+'_ab']) return lib.translate[name+'_ab']; - return get.translation(name); - }; - for(var i=0;ievent.black.length) opinion='red'; - else if(event.red.length红色':'#g黑色'); - else game.log(player,'本次发起的议事无结果'); - event.result={ - bool:true, - opinion:opinion, - red:event.red, - black:event.black, - targets:event.targets - } - 'step 3' - if(event.callback){ - var next=game.createEvent('debateCallback',false); - next.player=player; - next.debateResult=get.copy(event.result); - next.setContent(event.callback); - } - }, - delay:function(){ - game[event.name].apply(game,event._args) - }, - chooseCooperationFor:function(){ - 'step 0' - var next=player.chooseButton([ - '选择和'+get.translation(target)+'的协力方式', - [event.cardlist,'vcard'], - ],true); - next.set('ai',event.ai||function(){ - return Math.random(); - }); - 'step 1' - if(result.bool){ - player.cooperationWith(target,result.links[0][2].slice(12),event.reason); - } - }, - chooseToPlayBeatmap:function(){ - 'step 0' - if(game.online) return; - if(_status.connectMode) event.time=lib.configOL.choose_timeout; - event.videoId=lib.status.videoId++; - //给其他角色看的演奏框 - game.broadcastAll(function(player,id,beatmap){ - if(_status.connectMode) lib.configOL.choose_timeout=(Math.ceil((beatmap.timeleap[beatmap.timeleap.length-1]+beatmap.speed*100+(beatmap.current||0))/1000)+5).toString(); - if(player==game.me) return; - var str=get.translation(player)+'正在演奏《'+beatmap.name+'》...'; - if(!_status.connectMode) str+='
        (点击屏幕可以跳过等待AI操作)'; - ui.create.dialog(str).videoId=id; - if(ui.backgroundMusic) ui.backgroundMusic.pause(); - if(lib.config.background_audio){ - if(beatmap.filename.startsWith('ext:')) game.playAudio(beatmap.filename); - else game.playAudio('effect',beatmap.filename); - } - },player,event.videoId,event.beatmap); - 'step 1' - var beatmap=event.beatmap; - if(event.isMine()){ - var timeleap=beatmap.timeleap.slice(0); - var current=beatmap.current; - //获取两个音符的时间间隔 - var getTimeout=function(){ - var time=timeleap.shift(); - var out=time-current; - current=time; - return out; - }; - //初始化一堆变量 - var score=0; - var added=timeleap.length; - var number_of_tracks=beatmap.number_of_tracks||6; - var custom_mapping=Array.isArray(beatmap.mapping); - var mapping=custom_mapping?beatmap.mapping.slice():beatmap.mapping; - var hitsound=beatmap.hitsound||'hitsound.wav'; - 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; - var abs=1; - var node_pos=0; - if(custom_mapping){ - node_pos=mapping.shift(); - } - else if(mapping=='random'){ - abs=get.rand(number_of_tracks); - node_pos=abs; - } - var combo=0; - var max_combo=0; - var nodes=[]; - var roundmenu=false; - //隐藏菜单按钮 - if(ui.roundmenu&&ui.roundmenu.display!='none'){ - roundmenu=true; - ui.roundmenu.style.display='none'; - } - if(ui.backgroundMusic) ui.backgroundMusic.pause(); - var event=_status.event; - event.settleed=false; - //建个框框 - var dialog=ui.create.dialog('forcebutton','hidden'); - event.dialog=dialog; - event.dialog.textPrompt=event.dialog.add('
        '+(beatmap.prompt||'在音符滑条和底部判定区重合时点击屏幕!')+'
        '); - event.switchToAuto=function(){}; - event.dialog.classList.add('fixed'); - event.dialog.classList.add('scroll1'); - event.dialog.classList.add('scroll2'); - event.dialog.classList.add('fullwidth'); - event.dialog.classList.add('fullheight'); - event.dialog.classList.add('noupdate'); - event.dialog.style.overflow='hidden'; - //结束后操作 - event.settle=function(){ - if(event.settleed) return; - event.settleed=true; - //评分 - var acc=Math.floor(score/(added*5)*100); - if(!Array.isArray(lib.config.choose_to_play_beatmap_accuracies)) lib.config.choose_to_play_beatmap_accuracies=[]; - lib.config.choose_to_play_beatmap_accuracies.push(acc); - if(lib.config.choose_to_play_beatmap_accuracies.length>5) lib.config.choose_to_play_beatmap_accuracies.shift(); - game.saveConfigValue("choose_to_play_beatmap_accuracies"); - var rank; - if(acc==100) rank=['SS','metal']; - else if(acc>=94) rank=['S','orange']; - else if(acc>=87) rank=['A','wood']; - else if(acc>=80) rank=['B','water']; - else if(acc>=65) rank=['C','thunder']; - else rank=['D','fire']; - event.dialog.textPrompt.innerHTML='
        演奏结束!
        最大连击数:'+max_combo+' 精准度:'+acc+'%
        '; - game.me.$fullscreenpop('演奏评级:'+rank[0]+'',null,null,false); - //返回结果并继续游戏 - setTimeout(function(){ - event._result={ - bool:true, - accuracy:acc, - rank:rank, - }; - event.dialog.close(); - game.resume(); - _status.imchoosing=false; - if(roundmenu) ui.roundmenu.style.display=''; - if(ui.backgroundMusic) ui.backgroundMusic.play(); - hitsound_audio.remove(); - },1000); - }; - event.dialog.open(); - //操作容差 - var height=event.dialog.offsetHeight; - var width=event.dialog.offsetWidth; - var range1=(beatmap.range1||[90,110]); - var range2=(beatmap.range2||[93,107]); - var range3=(beatmap.range3||[96,104]); - var speed=(beatmap.speed||25); - //初始化底部的条子 - var judger=ui.create.div(''); - judger.style["background-image"]=(beatmap.judgebar_color||'linear-gradient(rgba(240, 235, 3, 1), rgba(230, 225, 5, 1))'); - judger.style["border-radius"]='3px'; - judger.style.position='absolute'; - judger.style.opacity='0.3'; - var heightj=Math.ceil(height*(beatmap.judgebar_height||0.1)); - judger.style.height=heightj+'px'; - judger.style.width=width+'px'; - judger.style.left='0px'; - judger.style.top=(height-heightj)+'px'; - event.dialog.appendChild(judger); - //生成每个音符 - var addNode=function(){ - var node=ui.create.div(''); - nodes.push(node); - node.style["background-image"]=(beatmap.node_color||'linear-gradient(rgba(120, 120, 240, 1), rgba(100, 100, 230, 1))'); - node.style["border-radius"]='3px'; - node.style.position='absolute'; - node.style.height=Math.ceil(height/10)+'px'; - node.style.width=Math.ceil(width/number_of_tracks)-10+'px'; - node._position=get.utc(); - event.dialog.appendChild(node); - - node.style.left=Math.ceil(width*node_pos/number_of_tracks+5)+'px'; - node.style.top='-'+(Math.ceil(height/10))+'px'; - ui.refresh(node); - node.style.transition='all '+speed*110+'ms linear'; - node.style.transform='translateY('+Math.ceil(height*1.1)+'px)'; - node.timeout=setTimeout(function(){ - if(nodes.contains(node)){ - nodes.remove(node); - player.popup('Miss','fire',false); - if(player.damagepopups.length) player.$damagepop(); - combo=0; - } - },speed*110); - - if(custom_mapping){ - node_pos=mapping.shift(); - } - else if(mapping=='random'){ - while(node_pos==abs){ - node_pos=get.rand(number_of_tracks); - } - abs=node_pos; - } - else{ - node_pos+=abs; - if(node_pos>number_of_tracks-1){ - abs=-1; - node_pos=number_of_tracks-2; - } - else if(node_pos<0){ - abs=1; - node_pos=1; - } - } - if(timeleap.length){ - setTimeout(function(){ - addNode(); - },getTimeout()); - } - else{ - setTimeout(function(){ - event.settle(); - },speed*110+100) - } - } - //点击时的判断操作 - var click=function(){ - if(!nodes.length) return; - for(var node of nodes){ - //用生成到点击的时间差来判断距离 - var time=get.utc(); - var top=(time-node._position)/speed; - if(top>range1[1]) continue; - else if(top=range3[0]&&top=range2[0]&&topvoid 0); - break; - } - }; - document.addEventListener(lib.config.touchscreen?'touchstart':'mousedown',click); - - game.pause(); - game.countChoose(); - setTimeout(()=>{ - if(!lib.config.background_audio) return; - 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(){ - addNode(); - },getTimeout()); - } - else if(event.isOnline()){ - event.send(); - } - else{ - game.pause(); - game.countChoose(); - var settle=function(){ - _status.imchoosing=false; - //Algorithm: Generate the random number range using the mean and the half standard deviation of accuracies of the player's last 5 plays - //算法:用玩家的上5次游玩的准确率的平均数和半标准差生成随机数范围 - var choose_to_play_beatmap_accuracies=(lib.config.choose_to_play_beatmap_accuracies||[]).concat(Array.from({ - length:6-(lib.config.choose_to_play_beatmap_accuracies||[]).length - },()=>get.rand(70,100))); - var mean=Math.round(choose_to_play_beatmap_accuracies.reduce((previousValue,currentValue)=>previousValue+currentValue)/choose_to_play_beatmap_accuracies.length); - var half_standard_deviation=Math.round(Math.sqrt(choose_to_play_beatmap_accuracies.reduce((previousValue,currentValue)=>previousValue+Math.pow(currentValue-mean,2),0))/2); - var acc=Math.min(Math.max(get.rand.apply(get,beatmap.aiAcc||[mean-half_standard_deviation-get.rand(0,half_standard_deviation),mean+half_standard_deviation+get.rand(0,half_standard_deviation)]),0),100); - var rank; - if(acc==100) rank=['SS','metal']; - else if(acc>=94) rank=['S','orange']; - else if(acc>=87) rank=['A','green']; - else if(acc>=80) rank=['B','water']; - else if(acc>=65) rank=['C','thunder']; - else rank=['D','fire']; - event._result={ - bool:true, - accuracy:acc, - rank:rank, - }; - if(event.dialog) event.dialog.close(); - if(event.control) event.control.close(); - game.resume(); - }; - var song_duration=beatmap.timeleap[beatmap.timeleap.length-1]+beatmap.speed*100+1000+(beatmap.current||0); - var settle_timeout=setTimeout(settle,song_duration); - if(!_status.connectMode) { - var skip_timeout; - var skip=()=>{ - settle(); - 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); - clearTimeout(skip_timeout); - }; - document.addEventListener(lib.config.touchscreen?'touchend':'click',skip); - skip_timeout=setTimeout(()=>document.removeEventListener(lib.config.touchscreen?'touchend':'click',skip),song_duration); - } - } - 'step 2' - game.broadcastAll(function(id,time){ - if(_status.connectMode) lib.configOL.choose_timeout=time; - var dialog=get.idDialog(id); - if(dialog){ - dialog.close(); - } - if(ui.backgroundMusic) ui.backgroundMusic.play(); - },event.videoId,event.time); - var result=event.result||result; - event.result=result; - }, - chooseToMove:function(){ - 'step 0' - if(event.chooseTime&&_status.connectMode&&!game.online){ - event.time=lib.configOL.choose_timeout; - game.broadcastAll(function(time){ - lib.configOL.choose_timeout=time; - },event.chooseTime); - } - if(event.isMine()){ - delete ui.selected.guanxing_button; - var list=event.list,filterMove=event.filterMove,filterOk=event.filterOk; - _status.imchoosing=true; - var event=_status.event; - event.settleed=false; - event.dialog=ui.create.dialog(event.prompt||'请选择要操作的牌','hidden','forcebutton'); - event.switchToAuto=function(){ - if(!filterOk(event.moved)){ - if(!event.forced) event._result={bool:false}; - else event._result='ai'; - } - else{ - event._result={ - bool:true, - moved:event.moved, - }; - } - event.dialog.close(); - if(ui.confirm) ui.confirm.close(); - game.resume(); - _status.imchoosing=false; - setTimeout(function(){ - ui.arena.classList.remove('choose-to-move'); - },500); - }; - event.dialog.classList.add('scroll1'); - event.dialog.classList.add('scroll2'); - event.dialog.classList.add('fullwidth'); - if(list.length>1){ - ui.arena.classList.add('choose-to-move'); - event.dialog.classList.add('fullheight'); - } - - event.moved=[]; - var buttonss=[]; - event.buttonss=buttonss; - var updateButtons=function(){ - for(var i of buttonss){ - event.moved[i._link]=get.links(Array.from(i.childNodes)); - if(i.textPrompt) i.previousSibling.innerHTML=('
        '+i.textPrompt(event.moved[i._link])+'
        '); - } - if(filterOk(event.moved)){ - ui.create.confirm('o'); - } - else{ - if(!event.forced) ui.create.confirm('c'); - else if(ui.confirm) ui.confirm.close(); - } - }; - var clickButtons=function(){ - if(!ui.selected.guanxing_button) return; - if(ui.selected.guanxing_button.parentNode==this) return; - if(!filterMove(ui.selected.guanxing_button,this._link,event.moved)) return; - ui.selected.guanxing_button.classList.remove('glow2'); - this.appendChild(ui.selected.guanxing_button); - delete ui.selected.guanxing_button; - updateButtons(); - }; - - for(var i=0;i'+list[i][0]+''); - tex.classList.add('choosetomove'); - var buttons=ui.create.div('.buttons',event.dialog.content,clickButtons); - buttonss.push(buttons); - buttons.classList.add('popup'); - buttons.classList.add('guanxing'); - buttons._link=i; - if(list[i][1]){ - if(get.itemtype(list[i][1])=='cards'){ - var cardsb=ui.create.buttons(list[i][1],'card',buttons); - if(list[i][2]&&typeof list[i][2]=='string'){ - for(var ij of cardsb) ij.node.gaintag.innerHTML=get.translation(list[i][2]); - } - } - else if(list[i][1].length==2){ - ui.create.buttons(list[i][1][0],list[i][1][1],buttons); - } - } - if(list[i][2]&&typeof list[i][2]=='function') buttons.textPrompt=list[i][2]; - } - var tex=event.dialog.add('
        点击两张牌以交换位置;点击一张牌并点击其他区域以移动卡牌
        '); - tex.classList.add('choosetomove'); - - event.dialog.open(); - updateButtons(); - - event.custom.replace.button=function(button){ - var node=button.parentNode; - if(!buttonss.contains(node)) return; - if(!ui.selected.guanxing_button){ - ui.selected.guanxing_button=button; - button.classList.add('glow2'); - return; - } - if(ui.selected.guanxing_button==button){ - button.classList.remove('glow2'); - delete ui.selected.guanxing_button; - return; - } - if(!filterMove(button,ui.selected.guanxing_button,event.moved)) return; - var par1=ui.selected.guanxing_button.parentNode,ind1=ui.selected.guanxing_button.nextSibling,par2=button.parentNode,ind2=button.nextSibling; - ui.selected.guanxing_button.classList.remove('glow2'); - par1.insertBefore(button,ind1); - par2.insertBefore(ui.selected.guanxing_button,ind2); - delete ui.selected.guanxing_button; - updateButtons(); - } - event.custom.replace.confirm=function(bool){ - if(bool) event._result={ - bool:true, - moved:event.moved, - }; - else event._result={bool:false}; - event.dialog.close(); - if(ui.confirm) ui.confirm.close(); - game.resume(); - _status.imchoosing=false; - setTimeout(function(){ - ui.arena.classList.remove('choose-to-move'); - },500); - }; - - game.pause(); - game.countChoose(); - event.choosing=true; - } - else if(event.isOnline()){ - event.send(); - } - else{ - event.result='ai'; - } - "step 1" - if(event.time) game.broadcastAll(function(time){ - lib.configOL.choose_timeout=time; - },event.time); - var result=event.result||result; - if((!result||result=='ai'||(event.forced&&!result.bool))&&event.processAI){ - var moved=event.processAI(event.list); - if(moved) result={ - bool:true, - moved:moved, - } - else result={bool:false}; - } - event.result=result; - }, - showCharacter:function(){ - 'step 0' - event.trigger('showCharacterEnd'); - 'step 1' - event.trigger('showCharacterAfter'); - if(get.mode()=='identity'&&player.isZhu) event.trigger('zhuUpdate'); - }, - removeCharacter:function(){ - player.$removeCharacter(event.num); - }, - chooseUseTarget:function(){ - 'step 0' - if(get.is.object(card)&&!event.viewAs) card.isCard=true; - if(cards&&get.itemtype(card)!='card'){ - card=get.copy(card); - card.cards=cards.slice(0); - event.card=card; - } - if(!lib.filter.cardEnabled(card,player)||(event.addCount!==false&&!lib.filter.cardUsable(card,player))){ - event.result={bool:false}; - event.finish(); - return; - } - var info=get.info(card); - var range; - if(!info.notarget){ - var select=get.copy(info.selectTarget); - range=get.select(select); - if(event.selectTarget) range=get.select(event.selectTarget); - game.checkMod(card,player,range,'selectTarget',player); - } - if(info.notarget||range[1]<=-1){ - if(!info.notarget&&range[1]<=-1){ - for(var i=0;i0; - }; - } - } - else{ - if(event.filterTarget){ - var targets=game.filterPlayer(function(current){ - return event.filterTarget(card,player,current); - }); - if(targets.length6){ - var cards=_status.renku.splice(0,_status.renku.length-6); - game.log(cards,'从仁库进入了弃牌堆'); - game.cardsDiscard(cards).set('outRange',true).fromRenku=true; - } - game.updateRenku(); - } - }, - cardsGotoPile:function(){ - if(event.washCard){ - event.trigger('washCard') - for(var i=0;igame.players.length*num&&game.showIdentity){ - if(!_status.video) player.popup('显示身份'); - _status.identityShown=true; - game.showIdentity(false); - } - } - player.ai.tempIgnore=[]; - if(ui.land&&ui.land.player==player){ - game.addVideo('destroyLand'); - ui.land.destroy(); - } - 'step 1' - event.trigger('phaseBeginStart'); - }, - toggleSubPlayer:function(){ - 'step 0' - var list=event.list||player.storage.subplayer.skills.slice(0); - list.remove(player.storage.subplayer.name2); - event.list=list; - if(!event.directresult){ - if(list.length>1){ - var dialog=ui.create.dialog('更换一个随从','hidden'); - dialog.add([list,'character']); - player.chooseButton(dialog,true); - } - else if(list.length==1){ - event.directresult=list[0]; - } - else{ - event.finish(); - } - } - else{ - if(!list.contains(event.directresult)){ - event.finish(); - } - } - 'step 1' - if(!event.directresult){ - if(result&&result.bool&&result.links[0]){ - event.directresult=result.links[0]; - } - else{ - event.finish(); - return; - } - } - if(player.storage.subplayer){ - var current=player.storage.subplayer.name2; - if(event.directresult==current){ - event.finish(); - return; - } - player.storage[current].hp=player.hp; - player.storage[current].maxHp=player.maxHp; - player.storage[current].hs=player.getCards('h'); - player.storage[current].es=player.getCards('e'); - player.lose(player.getCards('he'),ui.special)._triggered=null; - - var cfg=player.storage[event.directresult]; - player.storage.subplayer.name2=event.directresult; - player.reinit(current,event.directresult,[ - cfg.hp, - cfg.maxHp - ]); - if(cfg.hs.length) player.directgain(cfg.hs); - if(cfg.es.length) player.directequip(cfg.es); - } - }, - exitSubPlayer:function(){ - 'step 0' - if(player.storage.subplayer){ - var current=player.storage.subplayer.name2; - if(event.remove){ - player.lose(player.getCards('he'),ui.discardPile)._triggered=null; - } - else{ - player.storage[current].hp=player.hp; - player.storage[current].maxHp=player.maxHp; - player.storage[current].hs=player.getCards('h'); - player.storage[current].es=player.getCards('e'); - player.lose(player.getCards('he'),ui.special)._triggered=null; - } - player.reinit(current,player.storage.subplayer.name,[ - player.storage.subplayer.hp, - player.storage.subplayer.maxHp - ]); - player.update(); - if(event.remove){ - if(player.storage[current].onremove){ - player.storage[current].onremove(player); - } - delete player.storage[current]; - player.storage.subplayer.skills.remove(current); - game.log(player,'牺牲了随从','#g'+current); - } - else{ - game.log(player,'收回了随从','#g'+current); - } - player.addSkill(player.storage.subplayer.skills); - } - 'step 1' - if(player.storage.subplayer){ - player.directgain(player.storage.subplayer.hs); - player.directequip(player.storage.subplayer.es); - } - player.removeSkill('subplayer'); - 'step 2' - if(event.remove){ - event.trigger('subPlayerDie'); - } - }, - callSubPlayer:function(){ - 'step 0' - var list=player.getSubPlayers(event.tag); - event.list=list; - if(!event.directresult){ - if(list.length>1){ - var dialog=ui.create.dialog('调遣一个随从','hidden'); - dialog.add([list,'character']); - player.chooseButton(dialog,true); - } - else if(list.length==1){ - event.directresult=list[0]; - } - else{ - event.finish(); - } - } - else{ - if(!list.contains(event.directresult)){ - event.finish(); - } - } - 'step 1' - if(!event.directresult){ - if(result&&result.bool&&result.links[0]){ - event.directresult=result.links[0]; - } - else{ - event.finish(); - return; - } - } - if(event.directresult){ - var cfg=player.storage[event.directresult]; - var source=cfg.source||player.name; - var name=event.directresult; - game.log(player,'调遣了随从','#g'+name); - player.storage.subplayer={ - name:source, - name2:event.directresult, - hp:player.hp, - maxHp:player.maxHp, - skills:event.list.slice(0), - hs:player.getCards('h'), - es:player.getCards('e'), - intro2:cfg.intro2 - } - player.removeSkill(event.list); - player.reinit(source,name,[cfg.hp,cfg.maxHp]); - player.addSkill('subplayer'); - player.lose(player.getCards('he'),ui.special)._triggered=null; - if(cfg.hs.length) player.directgain(cfg.hs); - if(cfg.es.length) player.directequip(cfg.es); - } - 'step 2' - game.delay(); - }, - addExtraTarget:function(){ - "step 0" - event.num=0; - "step 1" - var target=targets[num],info=get.info(card); - if(target==event.target&&event.addedTarget){ - event.addedTargets[num]=event.addedTarget; - event._result={bool:false}; - } - else if(game.hasPlayer(function(current){ - return info.filterAddedTarget(card,player,current,target) - })){ - var next=player.chooseTarget(get.translation(event.card)+':选择'+get.translation(targets[num])+'对应的指向目标',function(card,player,target){ - var card=get.card(),info=get.info(card); - return info.filterAddedTarget(card,player,target,_status.event.preTarget) - },true); - next.set('_get_card',card); - next.set('preTarget',targets[num]); - next.set('ai',target=>get.effect(target,get.card(),player,_status.event.player)); - } - else{ - event.addedTargets[num]=false; - event._result={bool:false}; - } - "step 2" - if(result.bool){ - event.addedTargets[num]=result.targets[0]; - player.line2([targets[num],result.targets[0]]); - } - event.num++; - if(event.num!lib.skill[info.skill].silent&&lib.translate[info.skill];//是否触发同顺序选择 - 'step 1' - if(event.doing&&event.doing.todoList.length) return; - if(event.doingList.length) return event.doing=event.doingList.shift(); - event.finish(); - 'step 2' - if(trigger.filterStop&&trigger.filterStop()) return event.finish(); - const current=event.doing.todoList.find(info=>lib.filter.filterTrigger(trigger,info.player,event.triggername,info.skill)); - if(!current){ - event.doing.todoList=[]; - return event.goto(1); - } - event.doing.todoList=event.doing.todoList.filter(i=>i.priority<=current.priority); - event.num=event.doing.todoList.indexOf(current); - if(!event.noDirectUse(current)) return event.goto(5); - event.choice=event.doing.todoList.filter(info=>{ - if(!lib.filter.filterTrigger(trigger,info.player,event.triggername,info.skill)) return false; - if(!event.noDirectUse(info)) return false; - if(current.skill!=info.skill) return false; - if(current.player!=info.player) return false; - return lib.skill.global.includes(info.skill)||current.player.hasSkill(info.skill,true); - }); - if(event.choice.length<2) event.goto(5); - 'step 3' - const next=event.choice[0].player.chooseControl(event.choice.map(i=>i.skill)); - next.set('prompt','选择下一个触发的技能'); - next.set('forceDie',true); - next.set('arrangeSkill',true); - next.set('includeOut',true); - 'step 4' - if(result.control) event.num=event.doing.todoList.findIndex(info=>info.skill==result.control&&info.player==event.choice[0].player); - 'step 5' - const info=event.doing.todoList[event.num]; - if(!info) return; - event.doing.doneList.push(info); - event.doing.todoList.splice(event.num,1); - game.createTrigger(event.triggername,info.skill,info.player,trigger); - event.goto(1); - }, - createTrigger:function(){ - "step 0" - // console.log('triggering: ' + player.name+ ' \'s skill: ' + event.skill+' in ' + event.triggername) - if(game.expandSkills(player.getSkills().concat(lib.skill.global)).includes(event.skill)) return; - var info=get.info(event.skill); - let hidden=player.hiddenSkills.slice(0); - let invisible=player.invisibleSkills.slice(0); - game.expandSkills(hidden); - game.expandSkills(invisible); - if(hidden.includes(event.skill)){ - if(!info.silent&&player.hasSkillTag('nomingzhi',false,null,true)) event.finish(); - else if(!info.direct) event.trigger('triggerHidden'); - else event.skillHidden=true; - } - else if(invisible.includes(event.skill)) event.trigger('triggerInvisible'); - else if(Object.keys(player.additionalSkills).every(i=>{ - if(i.startsWith('hidden:')) return true; - return !game.expandSkills(player.additionalSkills[i]).includes(event.skill); - })) event.finish(); - "step 1" - if(event.cancelled) return event.finish(); - var info=get.info(event.skill); - if(event.revealed||info.forced) return; - const checkFrequent=function(info){ - if(player.hasSkillTag('nofrequent',false,event.skill)) return false; - if(typeof info.frequent=='boolean') return info.frequent; - if(typeof info.frequent=='function') return info.frequent(trigger,player); - if(info.frequent=='check'&&typeof info.check=='function') return info.check(trigger,player); - return false; - } - if(info.direct){ - if(player.isUnderControl()) game.swapPlayerAuto(player); - if(player.isOnline()) void 0; - event._result={bool:true}; - event._direct=true; - } - else{ - if(checkFrequent(info)) event.frequentSkill=true; - var str; - var check=info.check; - if(info.prompt) str=info.prompt; - else if(typeof info.logTarget=='string') str=get.prompt(event.skill,trigger[info.logTarget],player); - else if(typeof info.logTarget=='function'){ - const logTarget=info.logTarget(trigger,player); - if(get.itemtype(logTarget).startsWith('player')) str=get.prompt(event.skill,logTarget,player); - } - else str=get.prompt(event.skill,null,player); - if(typeof str=='function') str=str(trigger,player); - - var next=player.chooseBool(str); - if(event.frequentSkill) next.set('frequentSkill',event.skill); - next.set('forceDie',true); - next.set('includeOut',true); - next.ai=()=>!check||check(trigger,player); - - if(typeof info.prompt2=='function') next.set('prompt2',info.prompt2(trigger,player)); - else if(typeof info.prompt2=='string') next.set('prompt2',info.prompt2); - else if(info.prompt2!=false){ - if(lib.dynamicTranslate[event.skill]) next.set('prompt2',lib.dynamicTranslate[event.skill](player,event.skill)); - else if(lib.translate[event.skill+'_info']) next.set('prompt2',lib.translate[event.skill+'_info']); - } - - if(trigger.skillwarn){ - if(next.prompt2) next.set('prompt2',''+trigger.skillwarn+'。'+next.prompt2); - else next.set('prompt2',trigger.skillwarn); - } - } - "step 2" - var info=get.info(event.skill); - if(!result||!result.bool) return; - var autodelay=info.autodelay; - if(typeof autodelay=='function') autodelay=autodelay(trigger,player); - if(autodelay&&(info.forced||!event.isMine())){ - if(typeof autodelay=='number') game.delayx(autodelay); - else game.delayx(); - } - "step 3" - var info=get.info(event.skill); - if(result&&result.bool==false){ - if(info.oncancel) info.oncancel(trigger,player); - return event.finish(); - } - if(info.popup!=false&&!info.direct){ - if(info.popup){ - player.popup(info.popup); - game.log(player,'发动了','【'+get.skillTranslation(event.skill,player)+'】'); - } - else if(!info.logTarget||info.logLine===false) player.logSkill(event.skill,false,info.line); - else if(typeof info.logTarget=='string') player.logSkill(event.skill,trigger[info.logTarget],info.line); - else if(typeof info.logTarget=='function') player.logSkill(event.skill,info.logTarget(trigger,player),info.line); - } - var next=game.createEvent(event.skill); - if(typeof info.usable=='number'){ - player.addSkill('counttrigger'); - if(!player.storage.counttrigger) player.storage.counttrigger={}; - if(!player.storage.counttrigger[event.skill]) player.storage.counttrigger[event.skill]=1; - else player.storage.counttrigger[event.skill]++; - } - next.player=player; - next._trigger=trigger; - next.triggername=event.triggername; - next.setContent(info.content); - next.skillHidden=event.skillHidden; - if(info.forceDie) next.forceDie=true; - if(info.forceOut) next.includeOut=true; - "step 4" - if(!player._hookTrigger) return; - if(player._hookTrigger.some(i=>{ - const info=lib.skill[i].hookTrigger; - return info&&info.after&&info.after(event,player,event.triggername); - })) event.trigger('triggerAfter'); - }, - playVideoContent:function(){ - 'step 0' - game.delay(0,500); - 'step 1' - if(!game.chess){ - ui.control.innerHTML=''; - var nodes=[]; - for(var i=0;i1){ - slow.classList.add('glow'); - } - else{ - slow.classList.remove('glow'); - } - if(_status.videoDuration<1){ - fast.classList.add('glow'); - } - else{ - fast.classList.remove('glow'); - } - } - ui.system.style.display=''; - ui.refresh(ui.system); - ui.system.show(); - ui.window.show(); - if(lib.config.mode!='versus'&&lib.config.mode!='boss'){ - ui.arena.style.display=''; - ui.refresh(ui.arena); - ui.arena.show(); - } - if(!game.chess){ - game.playerMap={}; - } - game.finishCards(); - 'step 2' - if(event.video.length){ - var content=event.video.shift(); - // console.log(content); - if(content.type=='delay'){ - game.delay(content.content); - } - else if(content.type=='play'){ - window.play={}; - if(!event.playtoload){ - event.playtoload=1; - } - else{ - event.playtoload++; - } - var script=lib.init.js(lib.assetURL+'play',content.name); - script.addEventListener('load',function(){ - var play=window.play[content.name] - if(play&&play.video){ - play.video(content.init); - } - event.playtoload--; - if(event.playtoload==0){ - delete window.play; - } - }); - } - else if(typeof content.player=='string'&&game.playerMap[content.player]&& - game.playerMap[content.player].classList&& - !game.playerMap[content.player].classList.contains('obstacle')){ - game.videoContent[content.type](game.playerMap[content.player],content.content); - } - else{ - game.videoContent[content.type](content.content); - } - if(event.video.length){ - game.delay(0,_status.videoDuration*Math.min(2000,event.video[0].delay)); - } - event.redo(); - } - else{ - _status.over=true; - ui.system.lastChild.hide(); - setTimeout(function(){ - ui.system.lastChild.innerHTML=''; - },500); - } - }, - waitForPlayer:function(){ - 'step 0' - ui.auto.hide(); - ui.pause.hide(); - - game.createServer(); - if(!lib.translate.zhu){ - lib.translate.zhu='主'; - } - if(event.func){ - event.func(); - } - if(!lib.configOL.number){ - lib.configOL.number=parseInt(lib.configOL.player_number); - } - if(game.onlineroom){ - game.send('server','config',lib.configOL); - } - - ui.create.connectPlayers(game.ip); - if(!window.isNonameServer){ - var me=game.connectPlayers[0]; - me.setIdentity('zhu'); - me.initOL(get.connectNickname(),lib.config.connect_avatar); - me.playerid='1'; - game.onlinezhu='1'; - } - _status.waitingForPlayer=true; - if(window.isNonameServer){ - document.querySelector('#server_status').innerHTML='等待中'; - } - game.pause(); - 'step 1' - _status.waitingForPlayer=false; - lib.configOL.gameStarted=true; - if(window.isNonameServer){ - document.querySelector('#server_status').innerHTML='游戏中'; - } - if(game.onlineroom){ - game.send('server','config',lib.configOL); - } - for(var i=0;i0){ - game.players[i].outCount--; - if(game.players[i].outCount==0&&!game.players[i].outSkills){ - game.players[i].in(); - } - } - } - event.trigger('roundStart'); - } - } - _status.globalHistory.push({ - cardMove:[], - custom:[], - useCard:[], - changeHp:[], - everything:[], - }); - var players=game.players.slice(0).concat(game.dead); - for(var i=0;igame.players.length*num&&game.showIdentity){ - if(!_status.video) player.popup('显示身份'); - _status.identityShown=true; - game.showIdentity(false); - } - } - player.ai.tempIgnore=[]; - if(ui.land&&ui.land.player==player){ - game.addVideo('destroyLand'); - ui.land.destroy(); - } - 'step 6' - //规则集中的“回合开始后⑦”,国战武将明置武将牌 - event.trigger('phaseBeginStart'); - 'step 7' - //规则集中的“回合开始后⑨”,进行当先,化身等操作 - //没有⑧ 因为⑧用不到 - event.trigger('phaseBegin'); - //阶段部分 - 'step 8' - if(num1){ - next._extraPhaseReason=phase[1]; - } - if(event.currentPhase=='phaseDraw'||event.currentPhase=='phaseDiscard'){ - if(!player.noPhaseDelay){ - if(player==game.me){ - game.delay(); - } - else{ - game.delayx(); - } - } - } - } - 'step 10' - if(event.currentPhase=='phaseUse'){ - game.broadcastAll(function(){ - if(ui.tempnowuxie){ - ui.tempnowuxie.close(); - delete ui.tempnowuxie; - } - }); - delete player._noSkill; - } - event.num++; - 'step 11' - if(event.num0){ - var num=event.num; - if(event.attachDraw){ - for(var i=0;itrue)); - if(event.id) next._parent_id=event.id; - next.type='chooseToUse_button'; - } - event.buttoned=event.result.skill; - } - else if(info&&info.precontent&&!game.online&&!event.nouse){ - var next=game.createEvent('pre_'+event.result.skill); - next.setContent(info.precontent); - next.set('result',event.result); - next.set('player',player); - } - } - } - "step 3" - if(event.buttoned){ - if(result.bool||result.control&&result.control!='cancel2'){ - var info=get.info(event.buttoned).chooseButton; - lib.skill[event.buttoned+'_backup']=info.backup(info.chooseControl?result:result.links,player); - lib.skill[event.buttoned+'_backup'].sourceSkill=event.buttoned; - if(game.online){ - event._sendskill=[event.buttoned+'_backup',lib.skill[event.buttoned+'_backup']]; - } - else{ - game.broadcast((skill,audio)=>{ - if(!lib.skill[skill]) lib.skill[skill]={}; - lib.skill[skill].audio=audio; - },event.buttoned+'_backup',lib.skill[event.buttoned+'_backup'].audio); - } - event.backup(event.buttoned+'_backup'); - if(info.prompt){ - event.openskilldialog=info.prompt(info.chooseControl?result:result.links,player); - } - } - else{ - ui.control.animate('nozoom',100); - event._aiexclude.add(event.buttoned); - } - event.goto(0); - delete event.buttoned; - } - "step 4" - if(event._aiexcludeclear){ - delete event._aiexcludeclear; - event._aiexclude.length=0; - } - delete _status.noclearcountdown; - if(event.skillDialog&&get.objtype(event.skillDialog)=='div'){ - event.skillDialog.close(); - } - if(event.result&&event.result.bool&&!game.online&&!event.nouse){ - player.useResult(event.result,event); - } - else if(event._sendskill){ - event.result._sendskill=event._sendskill; - } - if((!event.result||!event.result.bool||event.result._noHidingTimer)&&(event.result.skill||event.logSkill)){ - var info=get.info(event.result.skill||event.logSkill); - if(info.direct&&!info.clearTime){ - _status.noclearcountdown='direct'; - } - } - if(event.dialog&&typeof event.dialog=='object') event.dialog.close(); - if(!_status.noclearcountdown){ - game.stopCountChoose(); - } - "step 5" - if(event._result&&event.result){ - event.result.result=event._result; - } - }, - chooseToRespond:function(){ - "step 0" - if(event.responded){ - delete event.dialog; - return; - } - var skills=player.getSkills('invisible').concat(lib.skill.global); - game.expandSkills(skills); - for(var i=0;itrue)); - } - event.buttoned=event.result.skill; - } - else if(info&&info.precontent&&!game.online){ - var next=game.createEvent('pre_'+event.result.skill); - next.setContent(info.precontent); - next.set('result',event.result); - next.set('player',player); - } - } - } - "step 3" - if(event.buttoned){ - if(result.bool||result.control&&result.control!='cancel2'){ - var info=get.info(event.buttoned).chooseButton; - lib.skill[event.buttoned+'_backup']=info.backup(info.chooseControl?result:result.links,player); - lib.skill[event.buttoned+'_backup'].sourceSkill=event.buttoned; - if(game.online){ - event._sendskill=[event.buttoned+'_backup',lib.skill[event.buttoned+'_backup']]; - } - else{ - game.broadcast((skill,audio)=>{ - if(!lib.skill[skill]) lib.skill[skill]={}; - lib.skill[skill].audio=audio; - },event.buttoned+'_backup',lib.skill[event.buttoned+'_backup'].audio); - } - event.backup(event.buttoned+'_backup'); - if(info.prompt){ - event.openskilldialog=info.prompt(info.chooseControl?result:result.links,player); - } - } - else{ - ui.control.animate('nozoom',100); - event._aiexclude.add(event.buttoned); - } - event.goto(0); - delete event.buttoned; - } - "step 4" - delete _status.noclearcountdown; - if(event.skillDialog&&get.objtype(event.skillDialog)=='div'){ - event.skillDialog.close(); - } - if(event.result.bool&&!game.online){ - if(event.result._sendskill){ - lib.skill[event.result._sendskill[0]]=event.result._sendskill[1]; - } - var info=get.info(event.result.skill); - if(event.onresult){ - event.onresult(event.result); - } - if((!event.result||!event.result.bool||event.result._noHidingTimer)&&(event.result.skill||event.logSkill)){ - if(info.direct&&!info.clearTime){ - _status.noclearcountdown='direct'; - } - } - if(event.logSkill){ - if(typeof event.logSkill=='string'){ - player.logSkill(event.logSkill); - } - else if(Array.isArray(event.logSkill)){ - player.logSkill.apply(player,event.logSkill); - } - } - if(!event.result.card&&event.result.skill){ - event.result.used=event.result.skill; - player.useSkill(event.result.skill,event.result.cards,event.result.targets); - } - else{ - if(info&&info.prerespond){ - info.prerespond(event.result,player); - } - var next=player.respond(event.result.cards,event.result.card,event.animate,event.result.skill,event.source); - if(event.result.noanimate) next.animate=false; - if(event.parent.card&&event.parent.type=='card'){ - next.set('respondTo',[event.parent.player,event.parent.card]); - } - if(event.noOrdering) next.noOrdering=true; - } - } - else if(event._sendskill){ - event.result._sendskill=event._sendskill; - } - if(event.dialog&&event.dialog.close) event.dialog.close(); - if(!_status.noclearcountdown){ - game.stopCountChoose(); - } - }, - chooseToDiscard:function(){ - "step 0" - if(event.autochoose()){ - event.result={ - bool:true, - autochoose:true, - cards:player.getCards(event.position), - rawcards:player.getCards(event.position), - } - for(var i=0;i1&&typeof event.selectCard!='function'){ - event.promptdiscard=ui.create.control('AI代选',function(){ - ai.basic.chooseCard(event.ai); - if(_status.event.custom&&_status.event.custom.add.card){ - _status.event.custom.add.card(); - } - for(var i=0;i{ - return !cards.contains(card)||!player.getCards('hejsx').contains(card); - }) - } - if(i[1].length>0) i[0].$draw(i[1].length); - } - break; - case 'gain': - game.delay(0,get.delayx(700,700)); - for(var i of event.gain_list){ - if(get.itemtype(i[1])=='card') i[1]=[i[1]]; - if(event._lose){ - i[1]=i[1].filter(card=>{ - return !cards.contains(card)||!player.getCards('hejsx').contains(card); - }) - } - if(i[1].length>0) i[0].$gain(i[1].length); - } - break; - case 'gain2': case 'draw2': - game.delay(0,get.delayx(500,500)); - for(var i of event.gain_list){ - if(get.itemtype(i[1])=='card') i[1]=[i[1]]; - if(event._lose){ - i[1]=i[1].filter(card=>{ - return !cards.contains(card)||!player.getCards('hejsx').contains(card); - }) - } - if(i[1].length>0) i[0].$gain2(i[1]); - } - break; - case 'give': case 'giveAuto': - if(!player) break; - var evt=event.getl(player); - game.delay(0,get.delayx(500,500)); - for(var i of event.gain_list){ - if(get.itemtype(i[1])=='card') i[1]=[i[1]]; - if(event._lose){ - i[1]=i[1].filter(card=>{ - return !cards.contains(card)||!player.getCards('hejsx').contains(card); - }) - } - var shown=i[1].slice(0),hidden=[]; - if(event.animate=='giveAuto'){ - for(var card of i[1]){ - if(evt.hs.contains(card)){ - shown.remove(card); - hidden.push(card); - } - } - } - if(shown.length>0) player.$give(shown,i[0]); - if(hidden.length>0) player.$giveAuto(hidden,i[0]); - } - break; - default: - event.finish(); - } - for(var i of event.gain_list){ - if(i[1].length>0){ - var next=i[0].gain(i[1]); - next.getlx=false; - if(event.visible) next.visible=true; - if(event.giver) next.giver=event.giver; - if(event.gaintag) next.gaintag.addArray(event.gaintag); - } - } - 'step 2' - game.delayx(); - }, - discardMultiple:function(){ - 'step 0' - event.type='discard'; - event.visible=true; - if(!event.position) event.position=ui.discardPile; - var cards=[]; - event.cards=cards; - for(var i=0;i{ - game.log(targets[index],'的拼点牌为',card); - }); - player.animate('target'); - game.delay(0,1000); - 'step 5' - event.target=null; - event.trigger('compare'); - 'step 6' - if(event.iwhileevent.maxNum){ - event.maxNum=i[1]; - event.winner=i[0]; - } - else if(event.winner&&i[1]==event.maxNum&&i[0]!=event.winner){ - event.winner=null; - } - } - 'step 8' - event.iwhile++; - event.goto(6); - 'step 9' - var player=event.tempplayer; - event.player=player; - delete event.tempplayer; - var str='无人拼点成功'; - if(event.winner){ - event.result.winner=event.winner; - str=get.translation(event.winner)+'拼点成功'; - game.log(event.winner,'拼点成功'); - event.winner.popup('胜'); - } else game.log('#b无人','拼点成功'); - var list=[player].addArray(targets); - list.remove(event.winner); - for(var i of list){ - i.popup('负'); - } - if(str){ - game.broadcastAll(function(str){ - var dialog=ui.create.dialog(str); - dialog.classList.add('center'); - setTimeout(function(){ - dialog.close(); - },1000); - },str); - } - game.delay(3); - 'step 10' - game.broadcastAll(ui.clear); - 'step 11' - event.cards.add(event.card1); - }, - chooseToCompareMultiple:function(){ - "step 0" - if(player.countCards('h')==0){ - event.result={cancelled:true,bool:false} - event.finish(); - return; - } - for(var i=0;ievent.num2){ - str=get.translation(player)+'拼点成功'; - player.popup('胜'); - target.popup('负'); - } - else{ - str=get.translation(player)+'拼点失败'; - if(event.num1==event.num2){ - player.popup('平'); - target.popup('平'); - } - else{ - player.popup('负'); - target.popup('胜'); - } - } - game.broadcastAll(function(str){ - var dialog=ui.create.dialog(str); - dialog.classList.add('center'); - setTimeout(function(){ - dialog.close(); - },1000); - },str); - game.delay(2); - "step 7" - if(event.callback){ - game.broadcastAll(function(card1,card2){ - if(card1.clone) card1.clone.style.opacity=0.5; - if(card2.clone) card2.clone.style.opacity=0.5; - },event.card1,event.card2); - var next=game.createEvent('compareMultiple'); - next.player=player; - next.target=event.target; - next.card1=event.card1; - next.card2=event.card2; - next.num1=event.num1; - next.num2=event.num2; - next.setContent(event.callback); - event.compareMultiple=true; - } - "step 8" - game.broadcastAll(ui.clear); - event.iwhile++; - event.goto(5); - "step 9" - event.cards.add(event.card1); - }, - chooseToCompare:function(){ - "step 0" - if(((!event.fixedResult||!event.fixedResult[player.playerid])&&player.countCards('h')==0)||((!event.fixedResult||!event.fixedResult[target.playerid])&&target.countCards('h')==0)){ - event.result={cancelled:true,bool:false} - event.finish(); - return; - } - game.log(player,'对',target,'发起拼点'); - event.lose_list=[]; - "step 1" - var sendback=function(){ - if(_status.event!=event){ - return function(){ - event.resultOL=_status.event.resultOL; - }; - } - }; - if(event.fixedResult&&event.fixedResult[player.playerid]){ - event.card1=event.fixedResult[player.playerid]; - event.lose_list.push([player,event.card1]); - } - else if(player.isOnline()){ - player.wait(sendback); - event.ol=true; - player.send(function(ai){ - game.me.chooseCard('请选择拼点牌',true).set('type','compare').set('glow_result',true).ai=ai; - game.resume(); - },event.ai); - } - else{ - event.localPlayer=true; - player.chooseCard('请选择拼点牌',true).set('type','compare').set('glow_result',true).ai=event.ai; - } - if(event.fixedResult&&event.fixedResult[target.playerid]){ - event.card2=event.fixedResult[target.playerid]; - event.lose_list.push([target,event.card2]); - } - else if(target.isOnline()){ - target.wait(sendback); - event.ol=true; - target.send(function(ai){ - game.me.chooseCard('请选择拼点牌',true).set('type','compare').set('glow_result',true).ai=ai; - game.resume(); - },event.ai); - } - else{ - event.localTarget=true; - } - "step 2" - if(event.localPlayer){ - if(result.skill&&lib.skill[result.skill]&&lib.skill[result.skill].onCompare){ - result.cards=lib.skill[result.skill].onCompare(player); - player.logSkill(result.skill); - } - else event.lose_list.push([player,result.cards[0]]); - event.card1=result.cards[0]; - } - if(event.localTarget){ - target.chooseCard('请选择拼点牌',true).set('type','compare').set('glow_result',true).ai=event.ai; - } - "step 3" - if(event.localTarget){ - if(result.skill&&lib.skill[result.skill]&&lib.skill[result.skill].onCompare){ - target.logSkill(result.skill); - result.cards=lib.skill[result.skill].onCompare(target); - } - else event.lose_list.push([target,result.cards[0]]); - event.card2=result.cards[0]; - } - if(!event.resultOL&&event.ol){ - game.pause(); - } - "step 4" - try{ - if(!event.card1){ - if(event.resultOL[player.playerid].skill&&lib.skill[event.resultOL[player.playerid].skill]&&lib.skill[event.resultOL[player.playerid].skill].onCompare){ - player.logSkill(event.resultOL[player.playerid].skill); - event.resultOL[player.playerid].cards=lib.skill[event.resultOL[player.playerid].skill].onCompare(player); - } - else event.lose_list.push([player,event.resultOL[player.playerid].cards[0]]); - event.card1=event.resultOL[player.playerid].cards[0]; - } - if(!event.card2){ - if(event.resultOL[target.playerid].skill&&lib.skill[event.resultOL[target.playerid].skill]&&lib.skill[event.resultOL[target.playerid].skill].onCompare){ - target.logSkill(event.resultOL[target.playerid].skill); - event.resultOL[target.playerid].cards=lib.skill[event.resultOL[target.playerid].skill].onCompare(player); - } - else event.lose_list.push([target,event.resultOL[target.playerid].cards[0]]); - event.card2=event.resultOL[target.playerid].cards[0]; - } - if(!event.card1||!event.card2){ - throw('err'); - } - } - catch(e){ - console.log(e); - game.print(e); - event.finish(); - return; - } - if(event.card2.number>=10||event.card2.number<=4){ - if(target.countCards('h')>2){ - event.addToAI=true; - } - } - if(event.lose_list.length){ - game.loseAsync({ - lose_list:event.lose_list, - }).setContent('chooseToCompareLose'); - } - "step 5" - event.trigger('compareCardShowBefore'); - "step 6" - game.broadcast(function(){ - ui.arena.classList.add('thrownhighlight'); - }); - ui.arena.classList.add('thrownhighlight'); - game.addVideo('thrownhighlight1'); - player.$compare(event.card1,target,event.card2); - game.log(player,'的拼点牌为',event.card1); - game.log(target,'的拼点牌为',event.card2); - var getNum=function(card){ - for(var i of event.lose_list){ - if(i[1]==card) return get.number(card,i[0]); - } - return get.number(card,false); - } - event.num1=getNum(event.card1); - event.num2=getNum(event.card2); - event.trigger('compare'); - game.delay(0,1500); - "step 7" - event.result={ - player:event.card1, - target:event.card2, - num1:event.num1, - num2:event.num2 - } - var str; - if(event.num1>event.num2){ - event.result.bool=true; - event.result.winner=player; - str=get.translation(player)+'拼点成功'; - player.popup('胜'); - target.popup('负'); - } - else{ - event.result.bool=false; - str=get.translation(player)+'拼点失败'; - if(event.num1==event.num2){ - event.result.tie=true; - player.popup('平'); - target.popup('平'); - } - else{ - event.result.winner=target; - player.popup('负'); - target.popup('胜'); - } - } - game.broadcastAll(function(str){ - var dialog=ui.create.dialog(str); - dialog.classList.add('center'); - setTimeout(function(){ - dialog.close(); - },1000); - },str); - game.delay(2); - "step 8" - if(typeof event.target.ai.shown=='number'&&event.target.ai.shown<=0.85&&event.addToAI){ - event.target.ai.shown+=0.1; - } - game.broadcastAll(function(){ - ui.arena.classList.remove('thrownhighlight'); - }); - game.addVideo('thrownhighlight2'); - if(event.clear!==false){ - game.broadcastAll(ui.clear); - } - if(typeof event.preserve=='function'){ - event.preserve=event.preserve(event.result); - } - else if(event.preserve=='win'){ - event.preserve=event.result.bool; - } - else if(event.preserve=='lose'){ - event.preserve=!event.result.bool; - } - }, - chooseSkill:function(){ - 'step 0' - var list; - if(typeof event.target=='string'){ - list=get.gainableSkillsName(event.target,event.func); - } - else{ - list=event.target.getGainableSkills(event.func); - } - if(!list.length){ - event.finish(); - event.result={bool:false}; - return; - } - event.skillai=function(list){ - return get.max(list,get.skillRank,'item'); - }; - if(event.isMine()){ - var dialog=ui.create.dialog('forcebutton'); - dialog.add(event.prompt||'选择获得一项技能'); - _status.event.list=list; - var clickItem=function(){ - _status.event._result=this.link; - game.resume(); - }; - for(i=0;i
        【'+ - translation+'】
        '+lib.translate[list[i]+'_info']+'
        '); - item.firstChild.addEventListener('click',clickItem); - item.firstChild.link=list[i]; - } - } - dialog.add(ui.create.div('.placeholder')); - event.dialog=dialog; - event.switchToAuto=function(){ - event._result=event.skillai(event.list); - game.resume(); - }; - _status.imchoosing=true; - game.pause(); - } - else{ - event._result=event.skillai(list); - } - 'step 1' - _status.imchoosing=false; - if(event.dialog){ - event.dialog.close(); - } - event.result={bool:true,skill:result}; - }, - discoverCard:function(){ - 'step 0' - var num=event.num||3; - var choice; - if(typeof event.list=='string'||typeof event.list=='function'){ - choice=get.inpile(event.list).randomGets(num); - } - else if(Array.isArray(event.list)){ - choice=event.list.randomGets(num); - } - else{ - choice=Array.from(event.list).randomGets(num); - } - if(choice.length){ - var prompt=event.prompt; - if(!prompt){ - prompt='选择一张牌'; - if(event.use){ - prompt+='使用之'; - } - else if(!event.nogain){ - prompt+='获得之'; - } - } - if(typeof choice[0]==='string'){ - var next=player.chooseVCardButton(choice,prompt,event.forced); - if(event.ai){ - next.set('ai',event.ai); - } - } - else if(get.itemtype(choice[0])=='card'){ - var next=player.chooseCardButton(choice,prompt,event.forced); - if(event.ai){ - next.set('ai',event.ai); - } - } - else{ - event.finish(); - } - } - else{ - event.finish(); - } - 'step 1' - event.result={ - bool:result.bool, - card:null, - choice:null - }; - if(result.bool&&result.links.length){ - var link=result.links[0]; - var togain=null; - if(get.itemtype(link)=='card'){ - event.result.card=link; - togain=link; - } - else if(Array.isArray(link)){ - event.result.choice=link[2]; - togain=game.createCard(link[2]); - } - if(togain){ - if(event.use){ - player.chooseUseTarget(togain); - } - else if(!event.nogain){ - player.gain(togain,'draw'); - game.log(player,'获得了一张牌'); - } - } - } - }, - chooseButton:function(){ - "step 0" - if(typeof event.dialog=='number'){ - event.dialog=get.idDialog(event.dialog); - } - if(event.createDialog&&!event.dialog){ - if(Array.isArray(event.createDialog)){ - event.createDialog.add('hidden'); - event.dialog=ui.create.dialog.apply(this,event.createDialog); - } - event.closeDialog=true; - } - if(event.dialog==undefined) event.dialog=ui.dialog; - if(event.isMine()||event.dialogdisplay){ - event.dialog.style.display=''; - event.dialog.open(); - } - var filterButton=event.filterButton||function(){return true}; - var selectButton=get.select(event.selectButton); - var buttons=event.dialog.buttons; - var buttonsx=[]; - var num=0; - for(var i=0;i