diff --git a/audio/die/dc_jiachong.mp3 b/audio/die/dc_jiachong.mp3 new file mode 100644 index 000000000..aab2c8e92 Binary files /dev/null and b/audio/die/dc_jiachong.mp3 differ diff --git a/audio/die/malingli.mp3 b/audio/die/malingli.mp3 new file mode 100644 index 000000000..1ee310d7d Binary files /dev/null and b/audio/die/malingli.mp3 differ diff --git a/audio/die/nezha.mp3 b/audio/die/nezha.mp3 new file mode 100644 index 000000000..6489f3ed6 Binary files /dev/null and b/audio/die/nezha.mp3 differ diff --git a/audio/die/sunhuan.mp3 b/audio/die/sunhuan.mp3 new file mode 100644 index 000000000..5ef463e4e Binary files /dev/null and b/audio/die/sunhuan.mp3 differ diff --git a/audio/skill/dcbeini1.mp3 b/audio/skill/dcbeini1.mp3 new file mode 100644 index 000000000..f9e5439ae Binary files /dev/null and b/audio/skill/dcbeini1.mp3 differ diff --git a/audio/skill/dcbeini2.mp3 b/audio/skill/dcbeini2.mp3 new file mode 100644 index 000000000..eb9f926fc Binary files /dev/null and b/audio/skill/dcbeini2.mp3 differ diff --git a/audio/skill/dcfaqi1.mp3 b/audio/skill/dcfaqi1.mp3 new file mode 100644 index 000000000..ea548de73 Binary files /dev/null and b/audio/skill/dcfaqi1.mp3 differ diff --git a/audio/skill/dcfaqi2.mp3 b/audio/skill/dcfaqi2.mp3 new file mode 100644 index 000000000..d1c2f19d2 Binary files /dev/null and b/audio/skill/dcfaqi2.mp3 differ diff --git a/audio/skill/dchuahuo1.mp3 b/audio/skill/dchuahuo1.mp3 new file mode 100644 index 000000000..f53325096 Binary files /dev/null and b/audio/skill/dchuahuo1.mp3 differ diff --git a/audio/skill/dchuahuo2.mp3 b/audio/skill/dchuahuo2.mp3 new file mode 100644 index 000000000..046702df3 Binary files /dev/null and b/audio/skill/dchuahuo2.mp3 differ diff --git a/audio/skill/dcniji1.mp3 b/audio/skill/dcniji1.mp3 new file mode 100644 index 000000000..356cefe5c Binary files /dev/null and b/audio/skill/dcniji1.mp3 differ diff --git a/audio/skill/dcniji2.mp3 b/audio/skill/dcniji2.mp3 new file mode 100644 index 000000000..47e3a80ca Binary files /dev/null and b/audio/skill/dcniji2.mp3 differ diff --git a/audio/skill/dcsantou1.mp3 b/audio/skill/dcsantou1.mp3 new file mode 100644 index 000000000..97ee2779e Binary files /dev/null and b/audio/skill/dcsantou1.mp3 differ diff --git a/audio/skill/dcsantou2.mp3 b/audio/skill/dcsantou2.mp3 new file mode 100644 index 000000000..485cb3084 Binary files /dev/null and b/audio/skill/dcsantou2.mp3 differ diff --git a/audio/skill/dcshizong1.mp3 b/audio/skill/dcshizong1.mp3 new file mode 100644 index 000000000..7823f32e8 Binary files /dev/null and b/audio/skill/dcshizong1.mp3 differ diff --git a/audio/skill/dcshizong2.mp3 b/audio/skill/dcshizong2.mp3 new file mode 100644 index 000000000..679d6ee28 Binary files /dev/null and b/audio/skill/dcshizong2.mp3 differ diff --git a/audio/skill/dcxiaoyin1.mp3 b/audio/skill/dcxiaoyin1.mp3 new file mode 100644 index 000000000..161568688 Binary files /dev/null and b/audio/skill/dcxiaoyin1.mp3 differ diff --git a/audio/skill/dcxiaoyin2.mp3 b/audio/skill/dcxiaoyin2.mp3 new file mode 100644 index 000000000..bb97e2009 Binary files /dev/null and b/audio/skill/dcxiaoyin2.mp3 differ diff --git a/card/standard.js b/card/standard.js index ad4eb42bd..d2baa96f4 100644 --- a/card/standard.js +++ b/card/standard.js @@ -310,7 +310,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return 1; }, natureDamage:function(card){ - if(game.hasNature(card)) return 1; + if(game.hasNature(card,'linked')) return 1; }, fireDamage:function(card,nature){ if(game.hasNature(card,'fire')) return 1; diff --git a/character/collab.js b/character/collab.js index d302fd496..cc55af7b4 100644 --- a/character/collab.js +++ b/character/collab.js @@ -4,6 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'collab', connect:true, character:{ + nezha:['male','qun',2,['dcsantou','dcfaqi']], dc_caocao:['male','wei',4,['dcjianxiong']], dc_liubei:['male','shu',4,['dcrende']], dc_sunquan:['male','wu',4,['dczhiheng']], @@ -33,10 +34,134 @@ game.import('character',function(lib,game,ui,get,ai,_status){ collab_tongque:["sp_fuwan","sp_fuhuanghou","sp_jiben","old_lingju",'sp_mushun'], collab_duanwu:['sunwukong','longwang','taoshen'], collab_decade:['libai','xiaoyuehankehan','zhutiexiong','wu_zhutiexiong'], - collab_remake:['dc_caocao','dc_liubei','dc_sunquan'], + collab_remake:['dc_caocao','dc_liubei','dc_sunquan','nezha'], }, }, skill:{ + //哪吒 + dcsantou:{ + audio:2, + trigger:{player:'damageBegin4'}, + forced:true, + group:'dcsantou_gain', + content:function*(event,map){ + var player=map.player,trigger=map.trigger; + var source=trigger.source; + trigger.cancel(); + var hp=player.getHp(); + var lose=false; + if(hp>=3){ + if(player.hasHistory('useSkill',evt=>{ + var evtx=evt.event; + return evt.skill=='dcsantou'&&evtx.getTrigger().source==source&&evtx.getParent(2)!=trigger; + })) lose=true; + } + else if(hp==2){ + if(trigger.hasNature()) lose=true; + } + else if(hp==1){ + if(trigger.card&&get.color(trigger.card)=='red') lose=true; + } + if(lose) player.loseHp(); + }, + subSkill:{ + gain:{ + audio:'dcsantou', + trigger:{ + global:'phaseBefore', + player:'enterGame', + }, + forced:true, + filter:function(event,player){ + if(player.maxHp>=3) return false; + return (event.name!='phase'||game.phaseNumber==0); + }, + content:function*(event,map){ + var player=map.player; + yield player.gainMaxHp(3-player.maxHp); + var num=3-player.getHp(true); + if(num>0) player.recover(num); + } + } + }, + ai:{ + filterDamage:true, + skillTagFilter:function(player,tag,arg){ + if(arg&&arg.player&&arg.player.hasSkillTag('jueqing',false,player)) return false; + }, + effect:{ + target:function(card,player,target){ + if(player.hasSkillTag('jueqing',false,target)) return; + if(player._dcsantou_temp) return; + if(get.tag(card,'damage')){ + const hp=target.getHp(); + if(hp>=3){ + if(target.hasHistory('useSkill',evt=>evt.skill=='dcsantou'&&evt.event.getTrigger().source==player)) return [1,-2]; + 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; + } + 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; + } + } + } + else if(hp==2&&get.tag(card,'natureDamage')||hp==1&&get.color(card)=='red'&&get.itemtype(card)=='card') return [1,-2]; + else return 0; + } + } + } + }, + }, + dcfaqi:{ + audio:2, + trigger:{player:'useCardAfter'}, + filter:function(event,player){ + if(get.type(event.card)!='equip') return false; + if(!player.isPhaseUsing()) return false; + for(const name of lib.inpile){ + if(get.type(name)!='trick') continue; + if(!player.hasStorage('dcfaqi',name)&&player.hasUseTarget({name:name,isCard:true})) return true; + } + return false; + }, + direct:true, + content:function*(event,map){ + var player=map.player; + var list=get.inpileVCardList(info=>{ + if(info[0]!='trick') return false; + var name=info[2]; + return !player.hasStorage('dcfaqi',name)&&player.hasUseTarget({name:name,isCard:true}); + }); + if(list.length){ + var result=yield player.chooseButton(['法器:视为使用一张普通锦囊牌',[list,'vcard']],true).set('ai',button=>{ + return get.player().getUseValue({name:button.link[2]}); + }); + if(result.bool){ + var name=result.links[0][2]; + if(!player.storage.dcfaqi) player.when({global:'phaseAfter'}).then(()=>delete player.storage.dcfaqi); + player.markAuto('dcfaqi',name); + player.chooseUseTarget({name:name,isCard:true},true,false).logSkill='dcfaqi'; + } + } + else event.finish(); + } + }, //隅泣曹操 dcjianxiong:{ audio:'rejianxiong', @@ -1513,6 +1638,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jiben:'吉本(?—218年),东汉末年太医令。建安二十三年春正月,时金祎自以世为汉臣,睹汉祚将移,谓可季兴,乃喟然发愤,遂与太医令本、少府耿纪、司直韦晃、本子邈、邈弟穆等结谋攻许,杀曹公长史王必,南援刘备。后必营,必与典农中郎将严匡讨斩之。在《三国演义》中,吉本在此为吉平或吉太,因字称平,故又唤作吉平。曾参与董承等人刺杀曹操的计划,并企图在为曹操治病时毒死曹操,但被曹操识破而遭处刑。之后其子吉邈和吉穆都参与了由耿纪和韦晃等人所发动的反叛曹操的行动,但都失败被杀。', xiaoyuehankehan:'小约翰可汗,知乎答主,bilibili知识区up主,其视频以介绍冷门国家和名人为主,因其视频极具特色的幽默风格而知名。代表作包括《奇葩小国》系列和《硬核狠人》系列。昵称里的“小约翰”来源于《纸牌屋》里的主角弗朗西斯·厄克特的外号Little John。家乡在内蒙古通辽市,在《奇葩小国》系列视频中,介绍小国面积和人口时,常用通辽市的面积和人口作为计量单位,后简化为T。1T=6万平方公里或287万人(如:阿富汗面积约为64万平方公里,超过10T)。此梗成为该系列视频的特色之一,可汗也因此被称为“通辽可汗”。', zhutiexiong:'朱铁雄,福建莆田人,1994年出生,短视频创作者。中国魔法少年的英雄梦,国风变装的热血与浪漫。抖音年度高光时刻作者,国风变装现象级人物。创玩节期间化身三国杀武将,来一场热血变身!', + nezha:'哪吒是中国神话中的民俗神之一,在古典名著《西游记》《封神演义》等及其衍生作品中也多有登场。传说中,哪吒是托塔天王李靖的第三子。哪吒之母怀胎三年,而哪吒出生之时是一个肉球,李靖惊怒之下,用剑劈开了肉球,而哪吒就在肉球中。哪吒广泛流传于道教以及民间传说中,被称为三坛海会大神、威灵显圣大将军、中坛元帅等,民间俗称“三太子”,又常冠其父姓,称为“李哪吒”。哪吒的原型为佛教护法神“那咤”。在不同作品的设定中,哪吒的师承关系有所不同,比如《封神演义》中,哪吒是太乙真人的弟子、元始天尊的徒孙,而《西游记》之中,哪吒则是释迦牟尼(如来佛祖)的弟子。在传说中,哪吒的形象常被形容为可化作三头六臂(封神之中是三头八臂),使用多种武器战斗。比如,《封神演义》中哪吒使用的武器(法宝)为乾坤圈、混天绫、火尖枪和风火轮等,西游记中是斩妖剑、砍妖刀、缚妖索、降妖杵、绣球儿、火轮儿。而哪吒第一次死后被其师父(太乙真人或如来佛祖)以莲花和莲藕复活。', }, card:{ ruyijingubang:{ @@ -1621,6 +1747,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dc_sunquan_prefix:'经典', dczhiheng:'制衡', dczhiheng_info:'①出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你在发动〖制衡〗时弃置了所有手牌,则你多摸一张牌。②每回合每名角色限一次。当你对其他角色造成伤害后,你令〖制衡①〗于此回合发动次数上限+1。', + nezha:'哪吒', + dcsantou:'三头', + dcsantou_info:'锁定技。①当你受到伤害时,防止之,然后若以下有条件成立,你失去1点体力:1.你于本回合此前以此法防止过该伤害来源的伤害,且你的体力值不小于3;2.本次伤害为属性伤害,且你的体力值为2;3.本次伤害的渠道为红色的牌,且你的体力值为1。②游戏开始时,若你的体力上限小于3,你将体力上限加至3并将体力回复至3。', + dcfaqi:'法器', + dcfaqi_info:'当你于出牌阶段使用装备牌结算结束后,你视为使用一张本回合未以此法使用过的普通锦囊牌。', collab_olympic:'OL·伦敦奥运会', collab_tongque:'OL·铜雀台', diff --git a/character/huicui.js b/character/huicui.js index 3e6569979..864d27caf 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -4,6 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'huicui', connect:true, character:{ + dc_jiachong:['male','wei',3,['dcbeini','dcshizong']], dc_sunchen:['male','wu',4,['dczigu','dczuowei']], dc_zhangmancheng:['male','qun',4,['dclvecheng','dczhongji']], yue_zhoufei:['female','wu',3,['dclingkong','dcxianshu']], @@ -99,12 +100,266 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_taiping:['guanhai','liupi','peiyuanshao','zhangchu','zhangkai','dc_zhangmancheng'], sp_yanhan:['dc_liuba','dc_huangquan','furongfuqian','xianglang','dc_huojun','gaoxiang','dc_wuban'], sp_jishi:['dc_jiben','zhenghun','dc_sunhanhua','liuchongluojun'], - sp_raoting:['dc_huanghao','dc_sunziliufang','dc_sunchen'], + sp_raoting:['dc_huanghao','dc_sunziliufang','dc_sunchen','dc_jiachong'], sp_yijun:['gongsundu','mengyou'], sp_zhengyin:['yue_caiwenji','yue_zhoufei'], } }, skill:{ + //魏贾充 + dcbeini:{ + audio:2, + enable:'phaseUse', + usable:1, + filterCard:function(card,player){ + const delt=player.countCards('h')-player.maxHp; + return delt>0; + }, + selectCard:function(){ + const player=get.player(); + const delt=player.countCards('h')-player.maxHp; + return delt>0?delt:-1; + }, + promptfunc:()=>{ + const player=get.player(); + const delt=player.countCards('h')-player.maxHp; + let str=''; + if(delt>0) str+=`弃置${get.cnNumber(delt)}张牌`; + else if(delt==0) str+=`点击“确定”`; + else str+=`摸${get.cnNumber(-delt)}张牌`; + return `${str},然后选择两名角色,前者视为对后者使用一张【杀】,且这两者的非锁定技失效。`; + }, + content:function*(event,map){ + var player=map.player; + if(player.countCards('h'){ + var sha=new lib.element.VCard({name:'sha',isCard:true}); + if(ui.selected.targets.length){ + var targetx=ui.selected.targets[0]; + return targetx.canUse(sha,target,false); + } + return lib.filter.cardEnabled(sha,target); + }).set('targetprompt',['打人','被打']).set('multitarget',true).set('ai',target=>{ + var aiTargets=get.event('aiTargets'); + if(aiTargets){ + return aiTargets[ui.selected.targets.length]==target?10:0; + } + return 0; + }).set('aiTargets',(()=>{ + var targets=[],eff=0; + var sha=new lib.element.VCard({name:'sha',isCard:true}); + for(var user of game.filterPlayer()){ + for(var target of game.filterPlayer()){ + if(user==target) continue; + var targetsx=[user,target]; + targetsx.forEach(i=>i.addSkill('dcbeini_fengyin')); + var effx=get.effect(target,sha,user,player); + targetsx.forEach(i=>i.removeSkill('dcbeini_fengyin')); + if(user==player) effx+=1; + if(get.attitude(player,user)>0) effx-=0.1; + if(effx>eff){ + eff=effx; + targets=targetsx; + } + } + } + if(targets.length) return targets; + return null; + })()); + if(result.bool){ + var user=result.targets[0],target=result.targets[1]; + result.targets.forEach(i=>i.addTempSkill('dcbeini_fengyin')); + var sha=new lib.element.VCard({name:'sha',isCard:true}); + if(user.canUse(sha,target,false)) user.useCard(sha,target,false,'noai'); + } + }, + ai:{ + order:0.1, + result:{ + player:function(player){ + if(player.countCards('h')-player.maxHp>=3) return 1; + return game.hasPlayer(current=>get.attitude(player,current)<=0)?1:0; + } + }, + }, + subSkill:{ + fengyin:{ + inherit:'fengyin', + }, + } + }, + dcshizong:{ + audio:2, + enable:'chooseToUse', + hiddenCard:function(player,name){ + if(get.type(name)!='basic') return false; + return player.countCards('he')>=player.countMark('dcshizong')+1; + }, + filter:function(event,player){ + if(event.type=='wuxie'||event.dcshizong) return false; + if(player.countCards('he'){ + if(info[0]!='basic') return; + const card={name:info[2],nature:info[3],isCard:true}; + return event.filterCard(card,player,event); + }) + return ui.create.dialog('恃纵',[vcards,'vcard'],'hidden'); + }, + check:function(button){ + if(get.event().getParent().type!='phase') return 1; + const player=get.player(); + const card={name:button.link[2],nature:button.link[3]}; + if(game.hasPlayer(current=>{ + return player.canUse(card,current)&&get.effect(current,card,player,player)>0; + })){ + switch(button.link[2]){ + case 'tao':return 5; + case 'jiu':return 3.01; + case 'sha': + if(button.link[3]=='fire') return 2.95; + else if(button.link[3]=='thunder') return 2.92; + else return 2.9; + } + } + return 0; + }, + backup:function(links,player){ + return { + filterCard:true, + filterTarget:lib.filter.notMe, + selectTarget:1, + selectCard:()=>get.player().countMark('dcshizong')+1, + viewAs:{ + name:links[0][2], + nature:links[0][3], + suit:'none', + number:null, + isCard:true, + }, + position:'he', + popname:true, + ignoreMod:true, + ai1:function(card){ + return 1/(1.1+Math.max(-1,get.value(card))); + }, + ai2:function(target){ + const att=get.attitude(get.player(),target); + const value=ui.selected.cards.map(card=>get.value(card)).reduce((p,c)=>{ + return p+c; + },0); + if(value>0||player.getHp()<=1) return att; + return -att; + }, + precontent:function*(event,map){ + var player=map.player,target=event.result.targets[0]; + player.logSkill('dcshizong',target); + if(!player.countMark('dcshizong')) player.when({global:'phaseAfter'}).then(()=>delete player.storage.dcshizong); + player.addMark('dcshizong',1,false); + yield player.give(event.result.cards.slice(),target); + var viewAs=new lib.element.VCard({name:event.result.card.name,nature:event.result.card.nature,isCard:true}); + var result=yield target.chooseCard('恃纵:是否将一张牌置于牌堆底?',`若如此做,${get.translation(player)}视为使用一张${get.translation(viewAs.nature)}【${get.translation(viewAs.name)}】`,'he').set('ai',card=>{ + if(get.event('goon')) return 7-get.value(card); + return 0; + }).set('goon',get.attitude(target,player)*(player.getUseValue(viewAs)||1)>=1); + var card=event.result.cards[0]; + if(result.bool){ + var card=result.cards[0]; + game.delayex(); + var next=target.loseToDiscardpile(card,ui.cardPile); + next.log=false; + if(get.position(card)=='e'){ + game.log(target,'将',card,'置于了牌堆底'); + } + else{ + next.blank=true; + game.log(target,'将一张牌置于了牌堆底'); + } + result=yield next; + game.broadcastAll(viewAs=>{ + lib.skill.dcshizong_backup2.viewAs=viewAs; + },lib.skill.dcshizong_backup.viewAs); + var evt=event.getParent(); + evt.set('_backupevent','dcshizong_backup2'); + evt.set('openskilldialog',`请选择${get.translation(viewAs.nature)}${get.translation(viewAs.name)}的目标`); + evt.backup('dcshizong_backup2'); + evt.set('norestore',true); + evt.set('custom',{ + add:{}, + replace:{window:function(){}} + }); + evt.goto(0); + } + else{ + target.chat('不放!'); + game.log(target,'选择不将牌置于牌堆底'); + var evt=event.getParent(); + evt.set('dcshizong',true); + evt.goto(0); + } + game.delayx(); + }, + ai:{ + order:10, + }, + } + }, + prompt:function(links,player){ + return `###恃纵:选择要交出的牌和目标角色###将${get.cnNumber(player.countMark('dcshizong')+1)}张牌交给一名其他角色,其可以选择将一张牌置于牌堆底,视为你使用一张${get.translation(links[0][3]||'')}${get.translation(links[0][2])}。`; + } + }, + ai:{ + order:function(){ + const player=get.player(),event=get.event(); + if(event.filterCard({name:'jiu'},player,event)&&get.effect(player,{name:'jiu'})>0){ + return get.order({name:'jiu'})+0.1; + } + return get.order({name:'sha'})+0.1; + }, + respondSha:true, + fireAttack:true, + respondShan:true, + skillTagFilter:function(player,tag,arg){ + if(tag=='fireAttack') return true; + if(player.countCards('he')false, + selectCard:-1, + precontent:function(){ + delete event.result.skill; + } + }, + }, + }, //张曼成 dclvecheng:{ audio:2, @@ -10632,6 +10887,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dclvecheng_info:'出牌阶段限一次。你可以选择一名其他角色,你于本回合对其使用当前手牌中的【杀】无任何次数限制。然后回合结束时,其展示所有手牌,若其中有【杀】,其可以选择对你依次使用其中所有的【杀】。', dczhongji:'螽集', dczhongji_info:'当你使用牌时,若此牌无花色或你手牌区里没有与此牌花色相同的手牌,你可以将手牌摸至体力上限并弃置X张牌(X为本回合发动〖螽集〗的次数)。', + dc_jiachong:'贾充', + dcbeini:'悖逆', + dcbeini_info:'出牌阶段限一次。你可以将手牌调整至体力上限,然后令一名角色视为对另一名角色使用一张【杀】,且这些角色的非锁定技失效直到回合结束。', + dcshizong:'恃纵', + dcshizong_info:'当你需要使用一张基本牌时,你可以交给一名其他角色X张牌,然后其可以将一张牌置于牌堆底,视为你使用之。若其不为当前回合角色,此技能失效直到回合结束(X为你本回合发动〖恃纵〗的次数)。', sp_baigei:'无双上将', sp_caizijiaren:'才子佳人', diff --git a/character/rank.js b/character/rank.js index 9f2ac180d..6781edc49 100644 --- a/character/rank.js +++ b/character/rank.js @@ -344,6 +344,7 @@ window.noname_character_rank={ 'star_yuanshu', 'jiangji', 'tianshangyi', + 'malingli', ], am:[ 'diy_caiwenji', @@ -628,6 +629,8 @@ window.noname_character_rank={ 're_zhugedan', 'tw_yanxiang', 'yanxiang', + 'nezha', + 'dc_jiachong', ], bp:[ 'chess_diaochan', @@ -993,6 +996,7 @@ window.noname_character_rank={ 'liwei', 'xin_wuban', 'ol_liuyan', + 'sunhuan', ], b:[ 'diy_feishi', diff --git a/character/sp2.js b/character/sp2.js index 59fa9b602..0a7247173 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -1312,7 +1312,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ frequent:true, group:'dcniji_discard', content:function(){ - player.draw().gaintag=['dcniji']; + var next=player.draw(); + var evt=trigger.getParent('dcniji_discard'); + if(!evt||evt.player!=player) next.gaintag=['dcniji']; player.addTempSkill('dcniji_clear'); }, subSkill:{ @@ -1326,15 +1328,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'dcniji', trigger:{global:'phaseJieshuBegin'}, filter:function(event,player){ - return player.hasCard(card=>card.hasGaintag('dcniji'),'h'); + return player.hasCard(card=>card.hasGaintag('dcniji')&&lib.filter.cardDiscardable(card,player,'dcniji'),'h'); }, forced:true, - loced:false, + locked:false, content:function(){ 'step 0' - var cards=player.getCards('h',card=>card.hasGaintag('dcniji')); + var cards=player.getCards('h',card=>card.hasGaintag('dcniji')&&lib.filter.cardDiscardable(card,player,'dcniji')); event.cards=cards; - if(cards.length>=player.hp){ + // if(cards.length>=player.hp){ + if(cards.some(card=>player.hasUseTarget(card))){ player.chooseToUse({ prompt:'是否使用一张“逆击”牌?', filterCard:function(card,player){ @@ -1342,12 +1345,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return lib.filter.filterCard.apply(this,arguments); }, ai1:function(card){ - return _status.event.player.getUseValue(card); + return get.player().getUseValue(card); }, }); } + // } 'step 1' - player.discard(cards.filter(card=>get.owner(card)==player&&get.position(card)=='h')); + if(result.bool) game.delayex(); + var cards=cards.filter(card=>get.owner(card)==player&&get.position(card)=='h'&&lib.filter.cardDiscardable(card,player,'dcniji')); + if(cards.length) player.discard(cards); } } } @@ -10867,7 +10873,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcbenshi_info:'锁定技。①你的攻击范围+1。②你的攻击范围基数不受装备区内武器牌的影响。③由你使用的【杀】的牌面信息中的“使用目标”产生的规则改为“攻击范围内的所有角色”。', sunhuan:'孙桓', dcniji:'逆击', - dcniji_info:'①当你成为非装备牌的目标后,你可以摸一张牌,称为“逆击”。②一名角色的结束阶段,若你于本回合获得的“逆击”数不小于你的体力值,你可以使用一张“逆击”。你弃置所有“逆击”。', + dcniji_info:'①当你成为非装备牌的目标后,你可以摸一张牌。②一名角色的结束阶段,你可以使用一张“逆击”牌,然后弃置所有“逆击”牌。', //dc_fuwan:'新杀伏完', //dc_fuwan_prefix:'新杀', //dc_fuwan_ab:'伏完', diff --git a/character/xianding.js b/character/xianding.js index d49cd4745..8a12c92ab 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -4,6 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'xianding', connect:true, character:{ + malingli:['female','shu',3,['dclima','dcxiaoyin','dchuahuo']], wu_luxun:['male','wu',3,['dcxiongmu','dczhangcai','dcruxian']], dc_xujing:['male','shu',3,['dcshangyu','dccaixia']], dc_zhaoxiang:['female','shu',4,['refanghun','refuhan']], @@ -93,7 +94,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp2_jinse:['caojinyu','re_sunyi','re_fengfangnv','caohua','laiyinger','zhangfen'], sp2_yinyu:['zhouyi','luyi','sunlingluan'], sp2_wangzhe:['dc_daxiaoqiao','dc_sp_machao'], - sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji','duanqiaoxiao','tianshangyi'], + sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji','duanqiaoxiao','tianshangyi','malingli'], 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'], @@ -102,6 +103,211 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, skill:{ + //马伶俐 + dclima:{ + audio:2, + mod:{ + globalFrom:function(from,to,distance){ + return distance-Math.max(1,game.countPlayer(current=>{ + return current.countCards('e',card=>{ + return get.is.attackingMount(card)||get.is.defendingMount(card); + }); + })); + } + } + }, + dcxiaoyin:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + return game.hasPlayer(current=>get.distance(player,current)<=1); + }, + group:'dcxiaoyin_damage', + prompt2:function(event,player){ + return `亮出牌堆顶的${get.cnNumber(game.countPlayer(current=>get.distance(player,current)<=1))}张牌,获得其中的红色牌,将其中任意张黑色牌置于等量名座次连续的其他角色的武将牌上。`; + }, + frequent:true, + check:()=>true, + content:function*(event,map){ + var player=map.player; + var count=game.countPlayer(current=>get.distance(player,current)<=1); + var cards=game.cardsGotoOrdering(get.cards(count)).cards; + yield player.showCards(cards,`${get.translation(player)}【硝引】亮出`); + player.gain(cards.filter(i=>get.color(i,false)=='red'),'gain2'); + var blackOnes=cards.filter(i=>get.color(i,false)=='black'); + if(!blackOnes.length) return event.finish(); + event.videoId=lib.status.videoId++; + var func=(cards,id)=>{ + var dialog=ui.create.dialog('硝引:剩余的黑色牌',`
请选择至多${get.cnNumber(cards.length)}名座次连续的其他角色,然后将以下这些牌置于这些角色的武将牌上。
`,cards); + dialog.videoId=id; + return dialog; + }; + if(player==game.me) func(blackOnes,event.videoId); + else if(player.isOnline2()){ + player.send(func,blackOnes,event.videoId); + } + var targets=game.filterPlayer(current=>current!=player); + if(targets.length==1) var result={bool:true,targets:targets}; + else var result=yield player.chooseTarget([1,blackOnes.length],true,(card,player,target)=>{ + if(player==target) return false; + var selected=ui.selected.targets; + if(!selected.length) return true; + for(var i of selected){ + if(i.getNext()==target||i.getPrevious()==target) return true; + } + return false; + }).set('complexSelect',true).set('complexTarget',true).set('multitarget',true).set('multiline',true).set('ai',target=>{ + if(get.event('aiTargets').includes(target)) return 10; + return 0.1; + }).set('aiTargets',(()=>{ + var targets=game.filterPlayer(i=>i!=player).sortBySeat(player); + var maxEff=-Infinity,aiTargets=[]; + for(var i=0;i{ + return get.damageEffect(current,current,player,'fire'); + }).reduce((p,c)=>{ + return p+c; + },0); + if(tmpEff>maxEff){ + maxEff=tmpEff; + aiTargets=targetsx; + } + } + } + return aiTargets; + })()).set('prompt',false); + if(!result.bool){ + event.finish(); + return; + } + var func=(num,id)=>{ + var dialog=get.idDialog(id); + if(dialog) dialog.content.childNodes[1].innerHTML=`
将${get.cnNumber(num)}张黑色牌按照选择的角色的座次顺序置于这些角色武将牌上
`; + }; + var targets=result.targets.slice().sortBySeat(player); + var num=targets.length; + if(player==game.me) func(num,event.videoId); + else if(player.isOnline2()) player.send(func,num,event.videoId); + if(blackOnes.length==1) var result={bool:true,links:blackOnes}; + else var result=yield player.chooseButton(true,num).set('dialog',event.videoId).set('ai',()=>1); + game.broadcastAll('closeDialog',event.videoId); + if(result.bool){ + var cards=result.links; + player.line(targets); + targets.forEach((current,ind)=>{ + current.addToExpansion(cards[ind],'gain2').gaintag.add('dcxiaoyin'); + game.log(current,'将',cards[ind],'当“硝引”置于了武将牌上'); + }); + } + }, + marktext:'硝', + intro:{ + content:'expansion', + markcount:'expansion', + }, + subSkill:{ + damage:{ + audio:'dcxiaoyin', + trigger:{global:'damageBegin3'}, + filter:function(event,player){ + if(!event.source||!event.source.isIn()) return false; + return event.player.getExpansions('dcxiaoyin').length; + }, + direct:true, + content:function*(event,map){ + var player=map.player,trigger=map.trigger; + var source=trigger.source,target=trigger.player; + var cards=target.getExpansions('dcxiaoyin'); + if(trigger.hasNature('fire')){ + var types=cards.map(i=>get.type2(i,false)); + var str=get.translation(types).replace(/(.*)、/, '$1或'); + var result=yield source.chooseCard(`硝引:是否弃置一张${str}牌?`,`若如此做,将${get.translation(target)}的所有“硝引”牌置入弃牌堆,令你对其造成的伤害+1`,'he',function(card,player){ + if(!get.event('types').includes(get.type2(card))) return false; + return lib.filter.cardDiscardable.apply(this,arguments); + }).set('types',types).set('ai',card=>{ + if(get.event('goon')) return 7-get.value(card); + return 0; + }).set('goon',get.damageEffect(target,player,player,'fire')>0&&get.attitude(player,target)<=0); + if(result.bool){ + player.logSkill('dcxiaoyin_damage',source); + source.line(target,'fire'); + source.discard(result.cards).discarder=source; + game.delayex(); + target.loseToDiscardpile(cards); + trigger.addNumber('num',1); + } + } + else{ + var result=yield source.chooseBool(`###是否响应${get.translation(player)}的【硝引】?###获得${get.translation(target)}的“硝引”牌(${get.translation(cards)}),然后将你对其造成的此次伤害改为火焰伤害。`).set('choice',(()=>{ + if(get.damageEffect(target,source,source,'fire')get.value(i)).reduce((p,c)=>p+c,0)>0) return true; + return false; + })()); + if(result.bool){ + player.logSkill('dcxiaoyin_damage',source); + source.line(target,'fire'); + source.gain(cards,target,'give'); + game.setNature(trigger,'fire'); + } + } + }, + }, + }, + ai:{ + threaten:4, + }, + }, + dchuahuo:{ + audio:2, + enable:'phaseUse', + usable:1, + viewAs:{ + name:'sha', + nature:'fire', + storage:{dchuahuo:true}, + }, + filterCard:{color:'red'}, + position:'hs', + filter:function(event,player){ + return player.countCards('hs',{color:'red'}); + }, + check:function(card){ + return 6-get.value(card); + }, + precontent:function(){ + event.getParent().addCount=false; + player.when('useCardToPlayer').filter(evt=>evt.card.storage&&evt.card.storage.dchuahuo).then(()=>{ + if(trigger.target.getExpansions('dcxiaoyin').length){ + var targets=game.filterPlayer(current=>{ + return current.getExpansions('dcxiaoyin').length; + }); + player.chooseBool(`是否更改${get.translation(trigger.card)}的目标?`,`将此牌的目标改为所有有“硝引”的角色(${get.translation(targets)})。`) + .set('choice',targets.map(current=>get.effect(current,trigger.card,player,player)).reduce((p,c)=>p+c,0)>get.effect(trigger.target,trigger.card,player,player)); + } + else event.finish(); + }).then(()=>{ + if(result.bool){ + trigger.targets.length=0; + trigger.getParent().triggeredTargets1.length=0; + trigger.untrigger(); + var targets=game.filterPlayer(current=>{ + return current.getExpansions('dcxiaoyin').length; + }); + player.line(targets,'fire'); + trigger.targets.addArray(targets); + game.log(targets,'成为了',trigger.card,'的新目标'); + game.delayx(); + } + }) + }, + ai:{ + order:()=>get.order({name:'sha'})+0.2, + result:{player:1}, + } + }, //武陆逊 dcxiongmu:{ audio:2, @@ -12264,6 +12470,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sunlingluan:'孙翎鸾,孙坚与妾室丁氏的女儿,孙策的妹妹,孙权、孙尚香的姐姐。孙翎年幼时曾得杜夔点化,窥得音律玄妙,丝竹八音,擅长琵琶,每次弹奏琵琶时,经常引来百鸟,称为奇观。早年孙翎鸾出游,山林巧遇葛玄,葛玄观其面相为吉,特传授修行辟谷之法,可令其身心洗涤,容颜久存。孙翎鸾有恋人名张奋,两人情投意合,可惜造化弄人,张奋病死外域,孙翎鸾倚楼盼归,日复一日、年复一年。后有五彩孔雀自东南而来,绕楼而鸣,其声如慕,孙翎鸾泪染笑靥,与孔雀耳语几句后乘翎而去。', zhoubuyi:'周不疑(192年—208年),字元直(或作“文直”),零陵重安(今湖南衡阳县)人,刘表别驾刘先的外甥,少有异才,聪明敏达,在十七岁时就著有文论四首。曹冲死后,曹操怀疑曹丕无法驾驭周不疑,于是派人杀了周不疑。', tianshangyi:'田尚衣,一作陈尚衣,魏文帝曹丕宫中著名宫人。能歌善舞,一时冠绝于世,私以为比之汉宫飞燕也不遑多让。', + malingli:'马伶俐,游卡桌游原创角色,设定上为,马超之女,其身形虽娇小,却继承了马超英勇略带冲动的个性,活泼阳光,调皮伶俐,爱摆弄爆竹烟花一类的小器具,包包里经常放置用五色彩纸包装的小炸弹球。马伶俐从小跟随马超和马云騄学习战斗技巧,战斗力超强,坚强的意志和勇气也得到了提升,同时擅长马术,有一匹可爱的小白马伴随其身边。后马伶俐成年,嫁与刘备之子刘理,获封梁王妃。两人琴瑟相和,极为恩爱,常结伴出游,被人誉为天作之合。', }, characterTitle:{ // wulan:'#b对决限定武将', @@ -12825,6 +13032,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dczhangcai_info:'当你使用或打出点数为8的牌时,你可以摸X张牌(X为你手牌区里点数为8的牌数且至少为1)。', dcruxian:'儒贤', dcruxian_info:'限定技。出牌阶段,你可以令你〖彰才〗的点数限制取消,且摸牌数改为等同于你手牌区内与此牌点数相同的牌数且至少为1,直到你的下回合开始。', + malingli:'马伶俐', + dclima:'骊马', + dclima_info:'锁定技。你计算至其他角色的距离-X(X为场上的坐骑牌数且至少为1)。', + dcxiaoyin:'硝引', + dcxiaoyin_info:'①准备阶段,你可以亮出牌堆顶的Y张牌(Y为你距离1以内的角色数),获得其中的红色牌,将其中任意张黑色牌置于等量名座次连续的其他角色的武将牌上,称为“硝引”。②当一名有“硝引”牌的角色受到伤害时,若此伤害为:火焰伤害,来源可以弃置一张其“硝引”牌包含的类型的牌,将其“硝引”置入弃牌堆,令此伤害+1;非火焰伤害,来源可以获得其“硝引”牌,将此伤害改为火焰伤害。', + dchuahuo:'花火', + dchuahuo_info:'出牌阶段限一次。你可以将一张红色手牌当不计入次数的火【杀】使用。然后当你使用此牌指定第一个目标后,若目标角色有“硝引”牌,你可以将此【杀】的目标改为所有有“硝引”牌的角色。', sp2_yinyu:'隐山之玉', sp2_huben:'百战虎贲', diff --git a/image/character/dc_jiachong.jpg b/image/character/dc_jiachong.jpg new file mode 100644 index 000000000..b269cd7bd Binary files /dev/null and b/image/character/dc_jiachong.jpg differ diff --git a/image/character/malingli.jpg b/image/character/malingli.jpg new file mode 100644 index 000000000..ec4bcca7f Binary files /dev/null and b/image/character/malingli.jpg differ diff --git a/image/character/nezha.jpg b/image/character/nezha.jpg new file mode 100644 index 000000000..9aef30fd8 Binary files /dev/null and b/image/character/nezha.jpg differ diff --git a/image/character/sunhuan.jpg b/image/character/sunhuan.jpg new file mode 100644 index 000000000..6a1c2abf5 Binary files /dev/null and b/image/character/sunhuan.jpg differ