diff --git a/audio/die/chengjichengcui.mp3 b/audio/die/chengjichengcui.mp3 new file mode 100644 index 000000000..727435bd0 Binary files /dev/null and b/audio/die/chengjichengcui.mp3 differ diff --git a/audio/skill/olchuming1.mp3 b/audio/skill/olchuming1.mp3 new file mode 100644 index 000000000..c0262cf68 Binary files /dev/null and b/audio/skill/olchuming1.mp3 differ diff --git a/audio/skill/olchuming2.mp3 b/audio/skill/olchuming2.mp3 new file mode 100644 index 000000000..f38fba6c8 Binary files /dev/null and b/audio/skill/olchuming2.mp3 differ diff --git a/audio/skill/oltousui1.mp3 b/audio/skill/oltousui1.mp3 new file mode 100644 index 000000000..46af6d9df Binary files /dev/null and b/audio/skill/oltousui1.mp3 differ diff --git a/audio/skill/oltousui2.mp3 b/audio/skill/oltousui2.mp3 new file mode 100644 index 000000000..59b028d21 Binary files /dev/null and b/audio/skill/oltousui2.mp3 differ diff --git a/card/standard.js b/card/standard.js index f83ddd6ca..ad4eb42bd 100644 --- a/card/standard.js +++ b/card/standard.js @@ -1685,10 +1685,22 @@ game.import('card',function(lib,game,ui,get,ai,_status){ useful:1, }, result:{ - target:-1.5, + target:function(player,target){ + if(ui.selected.targets.length){ + const preTarget=ui.selected.targets.lastItem; + const eff=get.effect(target,{name:'sha'},preTarget,player); + return Math.sign(eff)*get.sgnAttitude(player,target); + } + const filter=get.info({name:'jiedao'}).filterAddedTarget; + if(game.hasPlayer(current=>{ + return filter(null,null,current,target)&&get.effect(current,{name:'sha'},target,player)>=0; + })) return -1; + if(target.mayHaveSha(player,'use')) return 0.25; + return -1; + }, player:function(player){ if(player.getCards('he',{subtype:'equip1'}).length) return 0; - return 1.5; + return 1.25; }, }, tag:{ diff --git a/card/yongjian.js b/card/yongjian.js index f37ec87f7..c01819e63 100644 --- a/card/yongjian.js +++ b/card/yongjian.js @@ -561,13 +561,13 @@ game.import('card',function(lib,game,ui,get,ai,_status){ prompt:'是否发动【赠毒】?', prompt2:'将本次获得的【毒】交给其他角色', ai1:function(card){ - var player = _status.event.player; - if(player.hasSkillTag("usedu")||get.effect(player,{name: "losehp"}, player, player)>0) return 0; + var player=get.player(); + if(['usedu','keepdu'].some(tag=>player.hasSkillTag(tag))||get.effect(player,{name:"losehp"},player,player)>0) return 0; if(!ui.selected.cards.length) return 1; return 0; }, ai2:function(target){ - if (target.hasSkillTag("usedu")) return get.attitude(_status.event.player,target)-0.01; + if(['usedu','keepdu'].some(tag=>target.hasSkillTag(tag))) return get.attitude(_status.event.player,target)-0.01; return -get.attitude(_status.event.player,target)+0.01; }, }); diff --git a/character/extra.js b/character/extra.js index f83caf6db..4258e2fb9 100755 --- a/character/extra.js +++ b/character/extra.js @@ -1724,13 +1724,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ if(event.responded||event.shouli||event.type=='wuxie') return false; if(game.hasPlayer(function(current){ - return current.getCards('e',card=>get.subtype(card)=='equip4').length>0; + return current.getCards('e',card=>get.is.attackingMount(card)).length>0; })&&event.filterCard({ name:'sha', storage:{shouli:true}, },player,event)) return true; if(game.hasPlayer(function(current){ - return current.getCards('e',card=>get.subtype(card)=='equip3').length>0; + return current.getCards('e',card=>get.is.defendingMount(card)).length>0; })&&event.filterCard({ name:'shan', storage:{shouli:true}, @@ -1742,8 +1742,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterTarget:function(card,player,target){ var event=_status.event,evt=event; if(event._backup) evt=event._backup; - var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3'); - var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4'); + var equip3=target.getCards('e',card=>get.is.defendingMount(card,false)); + var equip4=target.getCards('e',card=>get.is.attackingMount(card,false)); if(equip3.length&&equip3.some(card=>evt.filterCard(get.autoViewAs({ name:'shan', storage:{shouli:true}, @@ -1767,8 +1767,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var evt=event.getParent(2); evt.set('shouli',true); var list=[]; - var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3'); - var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4'); + var equip3=target.getCards('e',card=>get.is.defendingMount(card,false)); + var equip4=target.getCards('e',card=>get.is.attackingMount(card,false)); var backupx=_status.event; _status.event=evt; try{ @@ -1808,13 +1808,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).set('cards',cards) } else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){ - var type=get.subtype(button.link); - return type=='equip3'||type=='equip4'; + var card=button.link; + return get.is.attackingMount(card)||get.is.defendingMount(card); }); 'step 1' var evt=event.getParent(2); if(result.bool&&result.links&&result.links.length){ - var name=(event.cardName||(get.subtype(result.links[0])=='equip4'?'sha':'shan')); + var name=(event.cardName||(get.is.attackingMount(result.links[0])?'sha':'shan')); if(evt.name=='chooseToUse'){ game.broadcastAll(function(result,name){ lib.skill.shouli_backup.viewAs={ @@ -1856,9 +1856,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ respondSha:true, respondShan:true, skillTagFilter:function(player,tag){ - var subtype=(tag=='respondSha'?'equip4':'equip3'); + var func=get.is[tag=='respondSha'?'attackingMount':'defendingMount']; return game.hasPlayer(function(current){ - return current.hasCard(card=>get.subtype(card,false)==subtype,'e'); + return current.hasCard(card=>func(card,false),'e'); }); }, order:2, diff --git a/character/offline.js b/character/offline.js index 5d176e754..77cc69d8f 100644 --- a/character/offline.js +++ b/character/offline.js @@ -614,8 +614,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterTarget:function(card,player,target){ var event=_status.event,evt=event; if(event._backup) evt=event._backup; - var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3'); - var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4'); + var equip3=target.getCards('e',card=>get.is.defendingMount(card,false)); + var equip4=target.getCards('e',card=>get.is.attackingMount(card,false)); if(equip3.length&&equip3.some(card=>evt.filterCard(get.autoViewAs({ name:'shan', storage:{psshouli:true}, @@ -639,8 +639,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var evt=event.getParent(2); evt.set('psshouli',true); var list=[]; - var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3'); - var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4'); + var equip3=target.getCards('e',card=>get.is.defendingMount(card,false)); + var equip4=target.getCards('e',card=>get.is.attackingMount(card,false)); var backupx=_status.event; _status.event=evt; try{ @@ -680,13 +680,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).set('cards',cards) } else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){ - var type=get.subtype(button.link); - return type=='equip3'||type=='equip4'; + var card=button.link; + return get.is.attackingMount(card)||get.is.defendingMount(card); }); 'step 1' var evt=event.getParent(2); if(result.bool&&result.links&&result.links.length){ - var name=(event.cardName||(get.subtype(result.links[0])=='equip4'?'sha':'shan')); + var name=(event.cardName||(get.is.attackingMount(result.links[0])?'sha':'shan')); if(evt.name=='chooseToUse'){ game.broadcastAll(function(result,name){ lib.skill.psshouli_backup.viewAs={ @@ -728,9 +728,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ respondSha:true, respondShan:true, skillTagFilter:function(player,tag){ - var subtype=(tag=='respondSha'?'equip4':'equip3'); + var func=get.is[tag=='respondSha'?'attackingMount':'defendingMount']; return game.hasPlayer(function(current){ - return current.getEquip(subtype); + return current.hasCard(card=>func(card,false),'e'); }); }, order:2, diff --git a/character/rank.js b/character/rank.js index 565661e96..83041c01b 100644 --- a/character/rank.js +++ b/character/rank.js @@ -621,6 +621,7 @@ window.noname_character_rank={ 'jsrg_xiahourong', 'jsrg_sunshangxiang', 'jsrg_machao', + 'sunyu', ], bp:[ 'chess_diaochan', @@ -981,6 +982,7 @@ window.noname_character_rank={ 'jsrg_zhangchu', 'ol_dingshangwan', 'ol_liwan', + 'chengjichengcui', ], b:[ 'diy_feishi', diff --git a/character/refresh.js b/character/refresh.js index 546e3e01f..340ae47ce 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -9466,7 +9466,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player:function(player){ if(player.hp<3) return false; var mindist=player.hp; - if(player.countCards('hs',card=>player.canSave(card,player))) mindist++; + if(player.countCards('hs',card=>player.canSaveCard(card,player))) mindist++; if(game.hasPlayer(function(current){ return (get.distance(player,current)<=mindist&& player.canUse('sha',current,false)&& diff --git a/character/shiji.js b/character/shiji.js index 0f14ca1cf..f00dad3d3 100644 --- a/character/shiji.js +++ b/character/shiji.js @@ -435,6 +435,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else{ evt.finish(); evt._triggered=null; + if(evt.name.startsWith('pre_')){ + var evtx=evt.getParent(); + evtx.finish(); + evtx._triggered=null; + } var nexts=trigger.next.slice(); for(var next of nexts){ if(next.name=='judgeCallback') trigger.next.remove(next); diff --git a/character/sp.js b/character/sp.js index 19c4985a9..ecaf811c8 100755 --- a/character/sp.js +++ b/character/sp.js @@ -5687,7 +5687,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var cards1=list[0][1].slice(),cards2=list[1][1].slice(); var card1=cards1.sort((a,b)=>get.value(b)-get.value(a))[0]; var card2=cards2.sort((a,b)=>get.value(a)-get.value(b))[0]; - if(get.value(card1)>get.value(card2)){ + if(card1&&card2&&get.value(card1)>get.value(card2)){ cards1.remove(card1); cards2.remove(card2); cards1.push(card2); diff --git a/character/sp2.js b/character/sp2.js index cddb3982f..77763cede 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -6,6 +6,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ character:{ 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']], dc_jikang:['male','wei',3,['new_qingxian','dcjuexiang']], dc_jsp_guanyu:['male','wei',4,['new_rewusheng','dcdanji']], dc_mengda:['male','wei',4,['dclibang','dcwujie']], @@ -56,7 +57,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dongxie:['female','qun',4,['dcjiaoxia','dchumei']], wangrong:['female','qun',3,['minsi','jijing','zhuide']], ol_dingyuan:['male','qun',4,['cixiao','xianshuai']], - xin_baosanniang:['female','shu',3,['decadewuniang','decadexushen']], re_hejin:['male','qun',4,['spmouzhu','spyanhuo']], re_hansui:['male','qun',4,['spniluan','spweiwu']], liuhong:['male','qun',4,['yujue','tuxing']], @@ -110,7 +110,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_zhongyuan:['re_hucheer','re_zoushi','caoanmin','re_dongcheng'], sp_xiaohu:['haomeng','yanfuren','yanrou','dc_zhuling'], sp_star:['star_caoren','star_yuanshu'], - sp_decade:['caobuxing','re_maliang','xin_baosanniang','dc_jikang'], + mini_qixian:['mp_liuling'], + sp_decade:['caobuxing','re_maliang','dc_jikang'], } }, skill:{ @@ -420,6 +421,94 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, + //小程序刘伶 + mpjiusong:{ + audio:2, + trigger:{global:'useCard'}, + filter:function(event,player){ + return event.card.name=='jiu'&&player.countMark('mpjiusong')<3; + }, + forced:true, + locked:false, + content:function(){ + player.addMark('mpjiusong'); + }, + marktext:'醉', + intro:{ + name:'醉(酒颂/酕醄)', + name2:'醉', + content:'mark', + } + }, + mpmaotao:{ + audio:2, + trigger:{global:'useCardToPlayer'}, + filter:function(event,player){ + if(event.targets.length!=1||!event.isFirstTarget) return false; + return event.player!=player&&player.countMark('mpjiusong'); + }, + prompt2:function(event,player){ + let list; + if(get.type(event.card)!='delay') list=game.filterPlayer(current=>{ + return lib.filter.targetEnabled2(event.card,event.player,current); + }); + else list=game.filterPlayer(current=>current.canAddJudge(event.card)); + return `移去1枚“醉”,${list.length>1?`令${get.translation(event.card)}目标改为${get.translation(list)}中的一名随机角色。若新目标与原目标相同,你`:''}获得牌堆中的一张【酒】。` + }, + check:function(event,player){ + const eff=get.effect(event.target,event.card,player,player); + let list; + if(get.type(event.card)!='delay') list=game.filterPlayer(current=>{ + return lib.filter.targetEnabled2(event.card,event.player,current); + }); + else list=game.filterPlayer(current=>current.canAddJudge(event.card)); + let list2=list.filter(current=>get.effect(current,event.card,player,player)>eff); + let list3=list.filter(current=>get.effect(current,event.card,player,player)>0); + return list2.length>=list.length/2||player.countMark('mpjiusong')>=2&&list3.length>=list.length/2; + }, + content:function(){ + player.removeMark('mpjiusong',1); + var list,oriTarget=trigger.target; + trigger.targets.remove(oriTarget); + trigger.getParent().triggeredTargets1.remove(oriTarget); + trigger.untrigger(); + game.delayx(); + if(get.type(trigger.card)!='delay') list=game.filterPlayer(current=>{ + return lib.filter.targetEnabled2(trigger.card,trigger.player,current); + }); + else list=game.filterPlayer(current=>current.canAddJudge(trigger.card)); + if(list.length) target=list.randomGet(); + trigger.targets.push(target); + trigger.player.line(target,'thunder'); + game.log(trigger.card,'的目标被改为',target); + if(target==oriTarget){ + var card=get.cardPile2('jiu'); + if(card) player.gain(card,'gain2'); + else{ + player.chat('没酒了!'); + game.log('但是牌堆中已经没有','#y酒','了!'); + } + } + }, + }, + mpbishi:{ + audio:2, + forced:true, + trigger:{global:'useCard1'}, + filter:function(event,player){ + if(get.type2(event.card)!='trick'||!get.tag(event.card,'damage')) return false; + if(!lib.skill.xunshi.isXunshi(event.card)) return false; + const targets=event.targets.slice(); + targets.remove(event.player); + return targets.length==game.countPlayer()-2; + }, + content:function*(){}, + mod:{ + targetEnabled:function(card){ + if(get.type2(card)=='trick'&&get.tag(card,'damage')>0) return false; + } + } + }, //十周年嵇康 dcjuexiang: { derivation: 'dccanyun', @@ -4730,7 +4819,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' player.chooseTarget('请选择【抗歌】的目标','其于回合外摸牌后,你摸等量的牌;其进入濒死状态时,你可令其回复体力至1点;其死亡后,你弃置所有牌并失去1点体力',lib.filter.notMe,true).set('ai',function(target){ - return get.attitude(_status.event.player,target)>0; + return get.attitude(_status.event.player,target); }); 'step 1' if(result.bool){ @@ -10198,6 +10287,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ guānning:'关宁,《三国演义》的虚构人物,为关定之子,关平的哥哥,学文。关羽前往冀州寻找刘备时曾居于关定庄,关定命关宁、关平二子出拜。后关羽同刘备回到关定庄时,关羽向刘备介绍关宁、关平二人,关定即提出让关平拜关羽为义父。', mushun:'穆顺,小说《三国演义》中的人物,男,东汉末宦官。献帝欲修书与国舅伏完,共谋图曹公。因顺为宦官中之忠义可托者,乃命顺往送书。顺藏书于发中,潜出禁宫,径至完宅,将书呈上。及完回书付顺,顺乃藏于头髻内,辞完回宫。然公闻信,先于宫门等候,顺回遇公,公喝左右,遍搜身上,并无夹带,放行。忽然风吹落其帽。公又唤回,取帽视之,遍观无物,还帽令戴。顺双手倒戴其帽。公心疑,令左右搜其头发中,搜出伏完书来。公见书大怒,执下顺于密室问之,顺不肯招。当晚将顺、完等宗族二百余口,皆斩于市。', jsp_guanyu:'关羽,字云长。曾水淹七军、擒于禁、斩庞德、威震华夏,吓得曹操差点迁都躲避,但是东吴偷袭荆州,关羽兵败被害。后传说吕蒙因关羽之魂索命而死。', + liuling:'刘伶(约221年-约300年),字伯伦,西晋沛国(治今安徽濉溪县西北)人,竹林七贤之一,中国魏晋时期作家,名士。
刘伶自幼便失去了父爱,因其父亲身材矮小,及至长大成人后,刘伶身高也不过六尺。魏齐王曹芳正始之末(249年),刘伶已成为当世名重一时的名士,并且常与嵇康、阮籍、阮咸集会于山阳竹林之下,饮酒赋诗,弹琴作歌。晋武帝司马炎泰始初年(265年)前后,曾做过一段时间的建威参军,不久朝廷下诏,入宫中策问。他大谈老庄,强调无为而治,非但没有得到重用,反而连参军之职也被罢免了,从此再无仕进。晋惠帝司马衷永康元年(300年)前后,以寿而终。
刘伶有“品酒第一人”的美称,也被酒行业传颂至今,后人以古瀑河边上的井水酿酒,还取刘伶墓地的黄土垒成窖池酿酒,为了纪念刘伶,当地百姓也将“润泉涌”更名为“刘伶醉”。其传世作品仅有《酒德颂》《北芒客舍》两篇,其中《酒德颂》所表现出的藐视一切存在的气概,敌视礼教之士的反抗精神,既高扬了人格的力量,批判了当时的黑暗政治,同时也抒发了压抑的愤世之情,充满了浪漫色彩,气魄豪迈,用辞又骈偶间行,有无意追求而自至的特点,对后代影响极大。', }, characterTitle:{ chunyuqiong:'#b对决限定武将', @@ -10791,6 +10881,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcjuexiang_info:'当你死亡时,杀死你的角色弃置其装备区内的所有牌并失去1点体力,然后你可以令一名其他角色获得〖残韵〗。', dccanyun:'残韵', dccanyun_info:'每名角色限一次。出牌阶段,你可以弃置一张牌并选择一名其他角色,然后若其装备区里的牌数:小于你,其回复1点体力;大于你,其失去1点体力;等于你,其摸一张牌。若你的体力值为1,你摸一张牌。', + mp_liuling:'刘伶', + mpjiusong:'酒颂', + mpjiusong_info:'当一名角色使用【酒】时,你获得1枚“醉”标记(“醉”数至多为3)。', + mpmaotao:'酕醄', + mpmaotao_info:'当其他角色使用牌指定唯一目标时,你可以移去1枚“醉”,令此牌的目标改为随机一名合法角色(无距离限制)。若目标角色与原目标相同,你从牌堆中获得一张【酒】。', + mpbishi:'避世', + mpbishi_info:'锁定技。你不能成为伤害类锦囊牌的目标。', star_caoren:'星曹仁', star_caoren_prefix:'星', starsujun:'肃军', @@ -10827,6 +10924,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_danqi:'千里单骑', sp_star:'将星系列', sp_decade:'其他新服武将', + mini_qixian:'小程序·竹林七贤', }, pinyins:{ 卑弥呼:['Himiko'] diff --git a/character/tw.js b/character/tw.js index ff2d11fe5..386b99523 100644 --- a/character/tw.js +++ b/character/tw.js @@ -127,8 +127,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ kaisa:["male","western",4,["zhengfu"]], }, characterIntro:{ - xiahousone:'三国杀集换式卡牌游戏《阵面对决》中的裂土系列卡牌。游卡桌游官方原创的三国时期女性角色。', - zhangwei:'三国杀集换式卡牌游戏《阵面对决》中的帝畿系列卡牌。游卡桌游官方原创的三国时期女性角色。', + xiahousone:'夏侯子萼,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为在貂蝉不在时血婆娑的实际首领。在海外服中,设定为夏侯惇的养女,继承了夏侯紫萼的血婆娑,之后“夏侯紫萼”这个名字就被隐匿于历史之中,而“夏侯子萼”则成为了血婆娑的首领“血蔷薇”的固定名号。', + zhangwei:'张葳,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为被夏侯子萼救下后加入的血婆娑成员。在海外服中,设定为张奂的养女,张奂为宦官迫害时与其失散,为神秘女子所救并学得武艺,后与夏侯紫萼一起建立血婆娑。在李儒分成时为了保护百姓而牺牲。', nashime:'难升米(なしめ,或なんしょうまい)是倭国大夫。景初二年六月,受女王卑弥呼之命,与都市牛利出使魏国,被魏国拜为率善中郎将。', jiachong:'贾充(217年—282年),字公闾,平阳襄陵(今山西襄汾)人,三国曹魏至西晋时期大臣,曹魏豫州刺史贾逵之子。西晋王朝的开国元勋。出身平阳贾氏。曾参与镇压淮南二叛和弑杀魏帝曹髦,因此深得司马氏信任,其女儿贾褒(一名荃)及贾南风分别嫁予司马炎弟司马攸及次子司马衷,与司马氏结为姻亲,地位显赫。晋朝建立后,转任车骑将军、散骑常侍、尚书仆射,后升任司空、太尉等要职。更封鲁郡公。咸宁末,为使持节、假黄钺、大都督征讨吴国。吴国平定后,增邑八千户。太康三年(282年),贾充去世。西晋朝廷追赠他为太宰,礼官议谥曰荒,司马炎不采纳,改谥为武。有集五卷。', duosidawang:'朵思大王是《三国演义》中人物,南蛮秃龙洞的元帅,孟获弟弟孟优的朋友,据说是南蛮第一智者。', @@ -298,9 +298,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ selectTarget:[1,3], multitarget:true, multiline:true, + group:'twdanlie_add', content:function(){ 'step 0' - player.addTempSkill('twdanlie_effect'); player.chooseToCompare(targets).setContent('chooseToCompareMeanwhile'); 'step 1' if(result.winner&&result.winner==player){ @@ -325,18 +325,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, subSkill:{ - effect:{ - charlotte:true, - trigger:{player:'compare'}, + add:{ + audio:'twdanlie', + trigger:{player:'compare',target:'compare'}, filter:function(event,player){ - return event.getParent().name=='twdanlie'&&!event.iwhile&&player.isDamaged(); + if(!player.isDamaged()) return false; + if(player!=event.target&&event.iwhile) return false; + return true; }, forced:true, - popup:false, + locked:false, content:function(){ var num=player.getDamagedHp(); - trigger.num1+=num; - if(trigger.num1>13) trigger.num1=13; + if(player==trigger.player){ + trigger.num1+=num; + if(trigger.num1>13) trigger.num1=13; + } + else{ + trigger.num2+=num; + if(trigger.num2>13) trigger.num2=13; + } game.log(player,'的拼点牌点数+',num); }, }, @@ -397,8 +405,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.when('useCardAfter').filter(evt=>evt==trigger.getParent()).then(()=>{ if(player.getHistory('sourceDamage',evt=>evt.card==trigger.card).length){ player.draw(); - player.addTempSkill('shenzhu_more','phaseUseAfter'); - player.addMark('shenzhu_more',1,false); + player.addTempSkill('twhuzhong_sha','phaseUseAfter'); + player.addMark('twhuzhong_sha',1,false); } else{ target.line(player); @@ -427,6 +435,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.log(result.targets,'成为了',trigger.card,'的额外目标'); } }, + subSkill:{ + sha:{ + charlotte:true, + onremove:true, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.countMark('twhuzhong_sha'); + }, + }, + } + } }, twfenwang:{ audio:2, @@ -500,7 +519,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ subSkill:{ effect:{ charlotte:true, - trigger:{player:'useCard'}, + trigger:{player:'useCard1'}, filter:function(event,player){ return get.type(event.card)=='basic'||get.type(event.card)=='trick'; }, @@ -514,7 +533,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:trigger.card.name, isCard:true, }; - var targets=trigger.targets.filter(i=>i.isIn()); + var targets=trigger.targets.filter(i=>i.isIn()&&player.canUse(card,i,false)); if(targets.length) player.useCard(card,targets,false); } }); @@ -531,50 +550,65 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{global:'damageEnd'}, filter:function(event,player){ if(!event.player.isIn()) return false; + if(event.player.getHistory('damage').indexOf(event)!=0) return false; return event.player==player||player.inRange(event.player); }, usable:1, direct:true, content:function(){ 'step 0' - var list=lib.inpile.filter(name=>{ - var type=get.type2(name); - if(type!='basic'&&type!='trick') return false; - return !player.getStorage('twshenyi').includes(name); + var list=get.inpileVCardList(info=>{ + return ['basic','trick','delay'].includes(info[0])&&!player.getStorage('twshenyi').includes(info[2]); }); - var dialog=['###'+get.prompt('twshenyi',trigger.player)+'###选择一个牌名,从牌堆中将此一张此牌名的牌称为“侠义”置于武将牌上',[list,'vcard']]; + var dialog=[`###${get.prompt('twshenyi',trigger.player)}###
从牌堆中将一张牌作为“侠义”置于武将牌上${player!=trigger.player&&player.countCards('h')?',然后将所有手牌交给其':''}
`,[list,'vcard']]; player.chooseButton(dialog).set('ai',function(button){ var trigger=_status.event.getTrigger(); var player=_status.event.player,name=button.link[2]; if(get.attitude(player,trigger.player)<=0) return 0; if(!get.cardPile2(card=>card.name==name)) return 0; - return get.value({name:name}); + var value=get.value({name:name}); + if(['tao','jiu','caochuan','wuxie'].includes(name)&&get.event().getRand()>0.4) return value*2; + return value; }); 'step 1' if(result.bool){ - var name=result.links[0][2]; + var name=result.links[0][2],nature=result.links[0][3]; + var cardx={name:name,nature:nature}; player.logSkill('twshenyi',trigger.player); - player.popup(name); + player.popup(cardx); player.markAuto('twshenyi',[name]); - game.log(player,'声明了','#y'+get.translation(name)); - var card=get.cardPile2(card=>card.name==name); + game.log(player,'声明了',`#y${get.translation(cardx)}`); + var card=get.cardPile2(card=>get.name(card,false)==name&&get.nature(card,false)==nature); if(card) player.addToExpansion([card],'gain2').gaintag.add('twshenyi'); else{ player.chat('无牌可得?!'); game.log('但是牌堆中已经没有','#y'+get.translation(name),'了!'); } if(trigger.player!=player&&player.countCards('h')){ + game.delayex(); var skill='twshenyi_'+player.playerid; - if(!lib.skill[skill]){ - lib.skill[skill]={charlotte:true}; - lib.translate[skill]='义·'+get.translation(player.name); - } + game.broadcastAll(lib.skill.twshenyi.createGainTag,skill,player.name); + game.addVideo('skill',player,['twshenyi',[skill,player.name]]); player.give(player.getCards('h'),trigger.player).gaintag.add(skill); player.addSkill('twshenyi_draw'); } } else player.storage.counttrigger.twshenyi--; }, + video:(player,info)=>lib.skill.twshenyi.createGainTag(info[0],info[1]), + createGainTag:function(skill,name){ + if(!lib.skill[skill]){ + lib.skill[skill]={charlotte:true}; + lib.translate[skill]='义·'+get.translation(name); + } + if(!_status.postReconnect.twshenyi){ + _status.postReconnect.twshenyi=[ + lib.skill.twshenyi.createGainTag,[],[] + ]; + } + _status.postReconnect.twshenyi[1].add(skill); + _status.postReconnect.twshenyi[2].add(name); + }, marktext:'义', intro:{ name:'侠义', @@ -598,56 +632,31 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return game.hasPlayer(target=>{ var evt=event.getl(target); if(!evt||!evt.hs||!evt.hs.length) return false; - if(event.name=='lose'){ - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].contains(skill)) return true; - } - return false; + for(let i in evt.gaintag_map){ + if(evt.gaintag_map[i].includes(skill)) return true; } - return target.hasHistory('lose',function(evt){ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].contains(skill)) return true; - } - return false; - }); + return false; }); }, forced:true, + direct:true, content:function(){ var skill='twshenyi_'+player.playerid; + var num=0; var targets=game.filterPlayer(target=>{ var evt=trigger.getl(target); + var numx=0; if(!evt||!evt.hs||!evt.hs.length) return false; - if(trigger.name=='lose'){ - for(var i in trigger.gaintag_map){ - if(trigger.gaintag_map[i].contains(skill)) return true; - } - return false; + for(var i in evt.gaintag_map){ + if(evt.gaintag_map[i].includes(skill)) numx++; } - return target.hasHistory('lose',function(evt){ - if(trigger!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].contains(skill)) return true; - } - return false; - }); - }),num=0; - targets.forEach(target=>{ - var cards=trigger.getl(target).hs; - if(trigger.name=='lose'){ - for(var i in trigger.gaintag_map){ - if(trigger.gaintag_map[i].contains(skill)) num++; - } - } - else target.getHistory('lose',function(evt){ - if(trigger!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].contains(skill)) num++; - } - }); + if(numx>0) return num+=numx; + return false; }); - if(num>0) player.draw(num); + if(num>0){ + player.logSkill('twshenyi_draw',targets); + player.draw(num); + } }, }, }, @@ -659,23 +668,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return player.getExpansions('twshenyi').length>game.countPlayer(); }, check:function(event,player){ + if(player.hp>=3||(player.countCards('h')>=4&&player.getExpansions('twshenyi').every(card=>!player.hasValueTarget(card)||!get.tag(card,'damage')||!lib.skill.xunshi.isXunshi(card)))) return false; return player.getExpansions('twshenyi').some(card=>player.hasValueTarget(card)); }, - prompt2:function(event,player){ - return '依次使用武将牌上的“侠义”牌,回合结束时弃置所有手牌并将失去X点体力(X为你的体力值-1且X至少为1)'; - }, + direct:true, content:function*(event,map){ var player=map.player; - while(player.getExpansions('twshenyi').some(card=>player.hasValueTarget(card))){ - var result=yield player.chooseButton(['兴汉:请选择其中的一张牌使用',player.getExpansions('twshenyi').filter(card=>player.hasValueTarget(card))]).set('ai',function(button){ - return _status.event.player.getUseValue(button.link); - }); - if(result.bool){ - player.chooseToUse(true,result.links[0],false); - } + var result=yield player.chooseBool().set('createDialog',[ + get.prompt('twxinghan'), + `
按顺序使用以下“侠义”牌。但是回合结束时你须弃置所有手牌并失去X点体力(X为你的体力值-1且X至少为1)
`, + player.getExpansions('twshenyi').filter(card=>player.hasUseTarget(card)).reverse(), + 'hidden', + ]).set('choice',lib.skill.twxinghan.check(null,player)); + if(!result.bool){ + event.finish(); + return; + } + while(true){ + var cards=player.getExpansions('twshenyi').filter(card=>player.hasUseTarget(card)).reverse(); + if(!cards.length) break; + yield player.chooseUseTarget(true,cards[0],false); } player.when('phaseEnd').then(()=>{ - if(player.countCards('h')) player.discard(player.getCards('h')); + if(player.countCards('h')) player.chooseToDiscard(player.countCards('h'),true); var num=Math.max(1,player.getHp()-1); player.loseHp(num); }); @@ -685,17 +700,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ init:{ audio:'twxinghan', trigger:{ - player:['loseEnd','dying','dyingAfter'], + player:['loseEnd','dying','die','dyingAfter'], global:['equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'], }, filter:function(event,player){ - return (player.getExpansions('twshenyi').length&&(!player.countCards('h')||player.isDying()))^player.hasSkill('twxinghan_in'); + return (player.getExpansions('twshenyi').length&&event.name!='die'&&(!player.countCards('h')||player.isDying()))^player.hasSkill('twxinghan_in'); }, forced:true, firstDo:true, silent:true, + forceDie:true, content:function(){ - if(player.getExpansions('twshenyi').length&&(!player.countCards('h')||player.isDying())){ + if(player.getExpansions('twshenyi').length&&trigger.name!='die'&&(!player.countCards('h')||player.isDying())){ var cards=player.getExpansions('twshenyi'); var cardsx=cards.map(card=>{ var cardx=ui.create.card(); @@ -15207,7 +15223,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xia_xiahoudun:'侠夏侯惇', xia_xiahoudun_prefix:'侠', twdanlie:'胆烈', - twdanlie_info:'出牌阶段限一次,你可以与至多三名其他角色同时拼点,且你此次的拼点牌点数+X(X为你已损失的体力值)。若你赢,你对这些角色各造成1点伤害;若你没赢,你失去1点体力。', + twdanlie_info:'①出牌阶段限一次。你可以与至多三名其他角色共同拼点。若你赢,你对没赢的角色依次造成1点伤害;若你没赢,你失去1点体力。②你的拼点牌点数+X(X为你已损失的体力值)。', xia_zhangwei:'张葳', twhuzhong:'护众', twhuzhong_info:'当你于出牌阶段使用无属性【杀】指定唯一目标角色时,你可以选择一项:①弃置一张手牌,然后你可以为此牌额外选择一个目标;②令其弃置一张手牌,此牌结算完毕后,若此牌造成过伤害,则你摸一张牌且本阶段可以额外使用一张【杀】,否则其对你造成1点伤害。', @@ -15219,9 +15235,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xia_liubei:'侠刘备', xia_liubei_prefix:'侠', twshenyi:'伸义', - twshenyi_info:'每回合限一次,当你或你攻击范围内的一名角色受到伤害后,你可以声明一个基本牌或锦囊牌的牌名(每种牌名限一次),然后从牌堆中将一张同名牌称为“侠义”置于武将牌上,然后若受伤角色不为你,则你将所有手牌交给其,且当其失去一张你以此法交给其的牌后,你摸一张牌。', + twshenyi_info:'每回合限一次。当你或你攻击范围内的一名角色于一回合内首次受到伤害后,你可以声明一种基本牌或锦囊牌(每种牌名限一次),然后从牌堆中将一张同名牌称为“侠义”置于武将牌上。若受伤角色不为你,则你将所有手牌交给其,且当其失去一张你以此法交给其的牌后,你摸一张牌。', twxinghan:'兴汉', - twxinghan_info:'①当你没有手牌时或你处于濒死状态时,你可以如手牌般使用或打出你武将牌上的“侠义”牌。②准备阶段,若你武将牌上的“侠义”牌数大于场上的存活角色数,则你可以依次使用其中所有可以使用的牌,然后于回合结束时弃置所有手牌并失去X点体力(X为你的体力值-1且X至少为1)。', + twxinghan_info:'①当你没有手牌时或你处于濒死状态时,你可以如手牌般使用或打出“侠义”牌。②准备阶段,若“侠义”牌数大于存活角色数,则你可以依次使用其中所有可以使用的牌。然后你获得如下效果:回合结束时,你弃置所有手牌并失去X点体力(X为你的体力值-1且X至少为1)。', tw_mobile:'海外服·稀有专属', tw_yunchouzhi:'运筹帷幄·智', diff --git a/character/xianding.js b/character/xianding.js index 5ba612336..6ecb8175e 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -8,6 +8,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dc_xujing:['male','shu',3,['dcshangyu','dccaixia']], dc_zhaoxiang:['female','shu',4,['refanghun','refuhan']], dc_guansuo:['male','shu',4,['xinzhengnan','xiefang']], + xin_baosanniang:['female','shu',3,['decadewuniang','decadexushen']], dc_shixie:['male','qun',3,['rebiluan','ollixia']], dc_sp_machao:['male','qun',4,['zhuiji','dc_olshichou']], old_huangfusong:['male','qun',4,['xinfenyue']], @@ -28,7 +29,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhangjinyun:['female','shu',3,['dchuizhi','dcjijiao']], huanfan:['male','wei',3,['dcjianzheng','dcfumou']], chentai:['male','wei',4,['dcctjiuxian','dcchenyong']], - sunyu:['male','wu',3,['dcquanshou','dcshexue'],['unseen']], + sunyu:['male','wu',3,['dcquanshou','dcshexue']], xizheng:['male','shu',3,['dcdanyi','dcwencan']], dc_ruiji:['female','wu',4,['dcwangyuan','dclingyin','dcliying']], zerong:['male','qun',4,['dccansi','dcfozong']], @@ -95,7 +96,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji','duanqiaoxiao','tianshangyi'], sp2_jichu:['zhaoang','dc_liuye','dc_wangyun','yanghong','huanfan','xizheng'], sp2_yuxiu:['dongguiren','dc_tengfanglan','zhangjinyun','zhoubuyi','dc_xujing'], - sp2_qifu:['dc_guansuo','dc_zhaoxiang'], + sp2_qifu:['dc_guansuo','xin_baosanniang','dc_zhaoxiang'], sp2_gaoshan:['wanglang','liuhui'], sp2_wumiao:['wu_zhugeliang','wu_luxun'], } @@ -155,7 +156,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(shown.length0){ player.$gain2(shown,false); @@ -1506,7 +1507,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(type=='equip'&&game.hasPlayer(current=>{ return current.canEquip(card); })||type=='delay'&&game.hasPlayer(current=>{ - return !current.storage._disableJudge&&!current.hasJudge(card.name); + return current.canAddJudge(card); })) choices.unshift('场上'); player.chooseControl(choices).set('prompt','请选择要将'+get.translation(card)+'置于的位置').set('ai',()=>{ return _status.event.choice; @@ -1526,7 +1527,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return _status.event.targets.contains(target); }).set('targets',game.filterPlayer(current=>{ if(type=='equip') return current.canEquip(card); - if(type=='delay') return !current.storage._disableJudge&&!current.hasJudge(card.name); + if(type=='delay') return current.canAddJudge(card); return false; })).set('ai',target=>{ var player=_status.event.player; @@ -1539,7 +1540,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else{ player.$throw(card,1000); - var next=player.lose(card,ui.cardPile); + var next=player.lose(card,ui.cardPile,'visible'); if(result.control=='牌堆顶') next.insert_card=true; game.log(player,'将',card,'置于了','#y'+result.control); } @@ -1555,7 +1556,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.addJudge(card); } } - if(event.count<4) event.goto(1); 'step 5' game.countPlayer(current=>{ var count=current.countCards('e'); @@ -1564,7 +1564,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ current.link(false); current.turnOver(false); } + event.equipCount[current.playerid]=count; }); + if(event.count<4) event.goto(1); } }, //杜预 @@ -3145,11 +3147,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{global:'phaseBegin'}, filter:function(event,player){ - return event.player.countCards('h')0||event.player.maxHp-event.player.countCards('h')<=2; + if(get.attitude(player,event.player)>0) return true; + const draw=event.player.maxHp-event.player.countCards('h'); + return draw<=2&&event.player.getHp(true)-draw>=1; }, content:function(){ 'step 0' @@ -3161,7 +3165,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var draw=Math.min(5,Math.max(0,trigger.player.maxHp-trigger.player.countCards('h'))); if(get.attitude(trigger.player,player)>0){ if(draw>=3||trigger.player.getCardUsable('sha')>1) return '选项一'; - if(draw<=1&&trigger.player.countCards('hs',card=>{ + if(!draw||draw<=1&&trigger.player.countCards('hs',card=>{ return get.name(card)=='sha'&&trigger.player.hasValueTarget(card); })) return '选项二'; return '选项一'; @@ -3212,7 +3216,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ popup:false, charlotte:true, onremove:true, - marktext:'守', + marktext:'', intro:{content:'本回合使用的牌被抵消后,$摸一张牌'}, content:function(){ var targets=player.getStorage('dcquanshou_respond'); @@ -3232,7 +3236,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'phaseUseBegin'}, filter:function(event,player){ var card=lib.skill.dcshexue.getLast(); - return card&&player.hasUseTarget(card); + return card&&player.hasUseTarget(card,false); }, getLast:function(){ for(var current of game.filterPlayer()){ @@ -3258,10 +3262,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var card=lib.skill.dcshexue.getLast(); game.broadcastAll(function(card){ lib.skill.dcshexue_backup.viewAs=card; - lib.skill.dcshexue_backup.prompt='设学:是否将一张牌当做'+get.translation(card)+'使用?'; },card); var next=player.chooseToUse(); - next.set('openskilldialog','设学:是否将一张牌当做'+get.translation(card)+'使用?'); + next.set('openskilldialog',`###${get.prompt('dcshexue')}###将一张牌当做${get.translation(card.nature)||''}【${get.translation(card.name)}】使用`); next.set('norestore',true); next.set('addCount',false); next.set('_backupevent','dcshexue_backup'); @@ -3277,6 +3280,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterCard:function(card){ return get.itemtype(card)=='card'; }, + filterTarget:lib.filter.targetEnabled, position:'hes', selectCard:1, check:(card)=>6-get.value(card), @@ -3297,6 +3301,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var card=history[history.length-1].card; return '令下一回合的角色于其出牌阶段开始时选择是否将一张牌当做'+(get.translation(card.nature)||'')+'【'+get.translation(card.name)+'】使用'; }, + check:function(event,player){ + let evt=event.getParent('phase').getParent(); + let nextPlayer=player.getNext(); + if(evt&&evt.next&&evt.next.length){ + nextPlayer=evt.next[0].player; + } + return get.attitude(player,nextPlayer)>0; + }, content:function(){ var history=player.getHistory('useCard',evt=>{ return evt.getParent('phaseUse')==trigger&&(get.type(evt.card)=='basic'||get.type(evt.card)=='trick'); @@ -3311,7 +3323,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ study:{ trigger:{player:'phaseUseBegin'}, filter:function(event,player){ - return player.getStorage('dcshexue_study').some(i=>event.player.hasUseTarget(i)); + return player.getStorage('dcshexue_study').some(i=>event.player.hasUseTarget(i,false)); }, onremove:true, charlotte:true, @@ -3321,13 +3333,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.cards=player.getStorage('dcshexue_study'); 'step 1' var card=cards.pop(); - if(trigger.player.hasUseTarget(card)){ + if(trigger.player.hasUseTarget(card,false)){ game.broadcastAll(function(card){ lib.skill.dcshexue_backup.viewAs=card; lib.skill.dcshexue_backup.prompt='设学:是否将一张牌当做'+get.translation(card)+'使用?'; },card); var next=trigger.player.chooseToUse(); - next.set('openskilldialog','设学:是否将一张牌当做'+get.translation(card)+'使用?'); + next.set('openskilldialog',`###${get.prompt('dcshexue_study')}###将一张牌当做${get.translation(card.nature)||''}【${get.translation(card.name)}】使用`); next.set('norestore',true); next.set('addCount',false); next.set('_backupevent','dcshexue_backup'); @@ -10226,7 +10238,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'phaseUse', usable:1, filter:function(event,player){ - return !player.storage.zunwei||player.storage.zunwei.length<3; + let storage=player.getStorage('zunwei'); + return storage.length<3&&game.hasPlayer(current=>{ + return player.isDamaged()&¤t.getHp()>player.getHp()&&!storage.includes(0)|| + current.countCards('h')>player.countCards('h')&&!storage.includes(1)|| + current.countCards('e')>player.countCards('e')&&!storage.includes(2); + }); }, chooseButton:{ dialog:function(event,player){ @@ -10237,12 +10254,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ]; var choiceList=ui.create.dialog('尊位:请选择一项','forcebutton','hidden'); choiceList.add([list.map((item,i)=>{ + if(player.getStorage('zunwei').includes(i)) item=`${item}`; return [i,item]; }),'textbutton']) return choiceList; }, filter:function(button){ - return button._filterButton; + const player=get.player(); + if(player.getStorage('zunwei').includes(button.link)) return false; + if(button.link==0){ + if(!player.isDamaged()) return false; + return game.hasPlayer(current=>{ + return current.getHp()>player.getHp(); + }); + } + if(button.link==1){ + return game.hasPlayer(current=>{ + return current.countCards('h')>player.countCards('h'); + }); + } + if(button.link==2){ + return game.hasPlayer(current=>{ + return current.countCards('e')>player.countCards('e'); + }); + } }, backup:function(links){ var next=get.copy(lib.skill.zunwei.backups[links[0]]); @@ -12680,9 +12715,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcchenyong_info:'结束阶段,你可以摸X张牌(X为本回合你使用过的牌的类型数)。', sunyu:'孙瑜', dcquanshou:'劝守', - dcquanshou_info:'一名角色的回合开始时,若其手牌数小于其体力上限,你可以令其选择一项:1.将手牌摸至体力上限,然后本回合使用【杀】的次数上限-1(至多摸五张);2.其本回合使用牌被抵消后,你摸一张牌。', + dcquanshou_info:'一名角色的回合开始时,若其手牌数不大于其体力上限,你可以令其选择一项:1.将手牌摸至体力上限,然后本回合使用【杀】的次数上限-1(至多摸五张);2.其本回合使用牌被抵消后,你摸一张牌。', dcshexue:'设学', - dcshexue_info:'①出牌阶段开始时,你可以将一张牌当做于上回合的角色于其出牌阶段内使用的最后一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的最后一张基本牌或普通锦囊牌使用。', + dcshexue_info:'①出牌阶段开始时,你可以将一张牌当做上回合的角色于其出牌阶段内使用的最后一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的最后一张基本牌或普通锦囊牌使用(一名角色因〖设学〗使用的牌均无距离和次数限制)。', xizheng:'郤正', dcdanyi:'耽意', dcdanyi_info:'当你使用牌指定第一个目标后,若此牌的目标与你使用的上一张牌目标相同,你可以摸X张牌(X为此牌目标数)。', diff --git a/character/yingbian.js b/character/yingbian.js index e1fcf2e68..4435f60b7 100644 --- a/character/yingbian.js +++ b/character/yingbian.js @@ -4,6 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'yingbian', connect:true, character:{ + chengjichengcui:['male','jin',6,['oltousui','olchuming']], wangxiang:['male','jin',3,['bingxin']], jin_jiachong:['male','jin',3,['xiongshu','jianhui']], xuangongzhu:['female','jin',3,['gaoling','qimei','ybzhuiji'],['hiddenSkill']], @@ -37,6 +38,151 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //二成 + oltousui:{ + audio:2, + enable:'chooseToUse', + viewAsFilter:function(player){ + return player.countCards('he'); + }, + viewAs:{ + name:'sha', + suit:'none', + number:null, + isCard:true, + }, + filterCard:true, + selectCard:[1,Infinity], + position:'he', + check:function(card){ + const player=get.player(); + return 4.5+(player.hasSkill('olchuming')?1:0)-1.5*ui.selected.cards.length-get.value(card); + }, + popname:true, + ignoreMod:true, + precontent:function*(event,map){ + var player=map.player; + var evt=event.getParent(); + if(evt.dialog&&typeof evt.dialog=='object') evt.dialog.close(); + player.logSkill('oltousui'); + delete event.result.skill; + var cards=event.result.cards; + player.loseToDiscardpile(cards,ui.cardPile,false,'blank').log=false; + var shownCards=cards.filter(i=>get.position(i)=='e'),handcardsLength=cards.length-shownCards.length; + if(shownCards.length){ + player.$throw(shownCards,null); + game.log(player,'将',shownCards,'置于了牌堆底'); + } + if(handcardsLength>0){ + player.$throw(handcardsLength,null); + game.log(player,'将',get.cnNumber(handcardsLength),'张牌置于了牌堆底'); + } + game.delayex(); + var viewAs=new lib.element.VCard({name:event.result.card.name,isCard:true}); + event.result.card=viewAs; + event.result.cards=[]; + event.result._apply_args={ + shanReq:cards.length, + oncard:()=>{ + var evt=get.event(); + for(var target of evt.targets){ + var id=target.playerid; + var map=evt.customArgs; + if(!map[id]) map[id]={}; + map[id].shanRequired=evt.shanReq; + } + } + }; + }, + ai:{ + order:function(item,player){ + return get.order({name:'sha'})+0.1; + }, + result:{player:1}, + keepdu:true, + respondSha:true, + skillTagFilter:(player,tag,arg)=>{ + if(tag=='respondSha'&&arg!='use') return false; + }, + }, + }, + olchuming:{ + audio:2, + trigger:{ + source:'damageBegin1', + player:'damageBegin3', + }, + filter:function(event,player){ + return event.source!=event.player; + }, + forced:true, + content:function*(event,map){ + var player=map.player,trigger=map.trigger; + if(!trigger.card||!trigger.cards.length){ + trigger.num++; + event.finish(); + return; + } + else{ + var target=trigger[trigger.source==player?'player':'source']; + trigger._olchuming=true; + target.addTempSkill('olchuming_effect'); + } + }, + ai:{ + effect:{ + player:function(card,player,target){ + if(!get.tag(card,'damage')) return; + if(!lib.card[card.name]||!card.cards||!card.cards.length) return [1,0,1,-1]; + return [1,-1]; + }, + }, + }, + subSkill:{ + effect:{ + charlotte:true, + trigger:{global:'phaseEnd'}, + forced:true, + popup:false, + content:function*(event,map){ + var player=map.player; + var mapx={}; + var history=player.getHistory('damage').concat(player.getHistory('sourceDamage')); + history.forEach(evt=>{ + if(!evt._olchuming) return; + var target=evt[evt.source==player?'player':'source']; + if(!target.isIn()) return; + if(!mapx[target.playerid]) mapx[target.playerid]=[]; + mapx[target.playerid].addArray(evt.cards.filterInD('d')); + }); + var entries=Object.entries(mapx).map(entry=>{ + return [(_status.connectMode?lib.playerOL:game.playerMap)[entry[0]],entry[1]]; + }); + if(!entries.length){ + event.finish(); + return; + } + player.logSkill('olchuming_effect',entries.map(i=>i[0])); + entries.sort((a,b)=>lib.sort.seat(a[0],b[0])); + for(var entry of entries){ + var current=entry[0],cards=entry[1]; + var list=['jiedao','guohe'].filter(i=>player.canUse(new lib.element.VCard({name:i,cards:cards}),current,false)); + if(!list.length) return; + var result=({}); + if(list.length==1) result={bool:true,links:[['','',list[0]]]}; + else result=yield player.chooseButton([`畜鸣:请选择要对${get.translation(current)}使用的牌`,[list,'vcard']],true).set('ai',button=>{ + var player=get.player(); + return get.effect(get.event('currentTarget'),{name:button.link[2]},player,player); + }).set('currentTarget',current); + if(result.bool){ + var card=get.autoViewAs({name:result.links[0][2]},cards); + if(player.canUse(card,current,false)) player.useCard(card,cards,current,false); + } + } + } + } + } + }, bingxin:{ audio:2, enable:'chooseToUse', @@ -3586,6 +3732,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xuangongzhu:'高陵宣公主(?—?)司马氏,晋宣帝司马懿第二女。司马氏下嫁杜预。其侄司马炎登基时,司马氏已经去世。泰始年间(265年—274年)追赠高陵公主。', jin_guohuai:'郭槐(237年-296年),字媛韶,太原阳曲(今山西太原)人,魏晋权臣贾充的妻子。父亲是曹魏城阳郡太守郭配,伯父是曹魏名将郭淮。出身太原郭氏。二十一岁时,嫁贾充作继室,生二女二子,长女贾南风,次女贾午,一子贾黎民。贾南风是西晋惠帝司马衷皇后,干预国政,专权误国,直接导致“八王之乱”和西晋亡国。', wangxiang:'王祥(184年,一作180年-268年4月30日),字休徵。琅邪临沂(今山东省临沂市西孝友村)人。三国曹魏及西晋时大臣。王祥于东汉末隐居二十年,在曹魏,先后任县令、大司农、司空、太尉等职,封爵睢陵侯。西晋建立,拜太保,进封睢陵公。泰始四年四月戊戌日(268年4月30日)去世,年八十五(一作八十九),谥号“元”。有《训子孙遗令》一文传世。王祥侍奉后母朱氏极孝,为传统文化中二十四孝之一“卧冰求鲤”的主人翁。', + chengjichengcui:'成倅、成济(?~260年6月21日),扬州丹阳(今安徽省宣城市)人。三国时期曹魏将领。依附于司马氏家族,得到司马昭的心腹贾充指使,刺死魏帝曹髦。司马昭为平息众怒,将成倅、成济兄弟二人杀死。据《魏氏春秋》记载,成济兄弟不服罪,光着身子跑到屋顶,大骂司马昭,被军士从下乱箭射杀。', }, characterTitle:{}, characterFilter:{}, @@ -3802,6 +3949,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qiaoyan_info:'锁定技,当你于回合外受到其他角色造成的伤害时,若你:有“珠”,则你令伤害来源获得“珠”;没有“珠”,则你防止此伤害,然后摸一张牌,并将一张牌正面朝上置于武将牌上,称为“珠”。', xianzhu:'献珠', xianzhu_info:'锁定技,出牌阶段开始时,你令一名角色A获得“珠”。若A不为你自己,则你选择A攻击范围内的一名角色B,视为A对B使用一张【杀】。', + chengjichengcui:'成济成倅', + oltousui:'透髓', + oltousui_info:'你可以将任意张牌置于牌堆底,视为使用一张需使用等量张【闪】抵消的【杀】。', + olchuming:'畜鸣', + olchuming_info:'锁定技。当你对其他角色造成伤害时,或当你受到其他角色造成的伤害时,若此伤害的渠道不为牌或没有对应的实体牌,此伤害+1,否则其于本回合结束时将所有以此法造成伤害的牌当【借刀杀人】或【过河拆桥】对你使用。', yingbian_pack1:'文德武备·理', yingbian_pack2:'文德武备·备', diff --git a/game/game.js b/game/game.js index aa99e4b64..97c914f16 100644 --- a/game/game.js +++ b/game/game.js @@ -16234,6 +16234,9 @@ 'step 4' player.$compareMultiple(event.card1,targets,cards); game.log(player,'的拼点牌为',event.card1); + event.cardlist.forEach((card,index)=>{ + game.log(targets[index],'的拼点牌为',card); + }); player.animate('target'); game.delay(0,1000); 'step 5' @@ -16245,7 +16248,6 @@ event.target.animate('target'); event.card2=event.cardlist[event.iwhile]; event.num2=event.getNum(event.card2); - game.log(event.target,'的拼点牌为',event.card2); //event.tempplayer.line(event.target); delete event.player; event.trigger('compare'); @@ -58224,6 +58226,26 @@ }, }; const get={ + /** + * 返回 VCard[] 形式的所有牌,用于印卡将遍历 + * @param {Function} filter + * @returns {string[][]} + */ + inpileVCardList:filter=>{ + let list=[]; + for(const name of lib.inpile){ + const type=get.type(name); + const info=[type,'',name]; + if(!filter||filter(info)) list.push(info); + if(name=='sha'){ + for(const nature of lib.inpile_nature){ + const info=[type,'',name,nature]; + if(!filter||filter(info)) list.push(info); + } + } + } + return list; + }, /** * 根据座次数n(从0开始)获取对应的“n+1号位”翻译 * @param {number} seat @@ -58479,6 +58501,38 @@ return 0; }, is:{ + /** + * 判断是否为进攻坐骑 + * @param {Card | VCard} card + * @param {false | Player} [player] + * @returns {boolean} + */ + attackingMount:(card,player)=>{ + const subtype=get.subtype(card,player); + if(subtype=='equip4') return true; + else if(subtype=='equip6'){ + const info=get.info(card,player),distance=info.distance; + if(!distance) return false; + if(distance.globalFrom&&!info.notMount) return true; + } + return false; + }, + /** + * 判断是否为防御坐骑 + * @param {Card | VCard} card + * @param {false | Player} [player] + * @returns {boolean} + */ + defendingMount:(card,player)=>{ + const subtype=get.subtype(card,player); + if(subtype=='equip3') return true; + else if(subtype=='equip6'){ + const info=get.info(card,player),distance=info.distance; + if(!distance) return false; + if(distance.globalTo&&!info.notMount) return true; + } + return false; + }, /** * 判断坐骑栏是否被合并 */ diff --git a/game/pinyinjs.js b/game/pinyinjs.js index 73fec645f..54a2e76e4 100644 --- a/game/pinyinjs.js +++ b/game/pinyinjs.js @@ -64,6 +64,7 @@ var pinyin_dict_polyphone = { "库特莉亚芙卡": " kǎ", "露娜": "lù ", // 技能名 + "畜鸣": "chù ", "聆乐": " yuè", "没矢": "mò ", "没欲": "mò ", diff --git a/image/character/chengjichengcui.jpg b/image/character/chengjichengcui.jpg new file mode 100644 index 000000000..9075a1c28 Binary files /dev/null and b/image/character/chengjichengcui.jpg differ diff --git a/image/character/mp_liuling.jpg b/image/character/mp_liuling.jpg new file mode 100644 index 000000000..1822fd50e Binary files /dev/null and b/image/character/mp_liuling.jpg differ diff --git a/image/character/sunyu.jpg b/image/character/sunyu.jpg new file mode 100644 index 000000000..a85f67d9a Binary files /dev/null and b/image/character/sunyu.jpg differ diff --git a/mode/identity.js b/mode/identity.js index fee5cb4e2..5a4d0d5fc 100644 --- a/mode/identity.js +++ b/mode/identity.js @@ -3167,7 +3167,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ return x/num; } var real=get.realAttitude(from,to),zhibi=from.storage.zhibi,stratagem_expose=from.storage.stratagem_expose,followCamouflage=true; - if(to.ai.shown) return to.ai.shown*(real+(from.identity==to.identity||from.identity=='zhu'&&to.identity=='zhong'||from.identity=='zhong'&&to.identity=='zhu'||(to.identity=='nei'&&get.situation()<=0&&['zhu','zhong'].contains(from.identity)||get.situation()>=3&&from.identity=='fan')?3:-3)) + if(to.ai.shown) return to.ai.shown*(real+(from.identity==to.identity||from.identity=='zhu'&&to.identity=='zhong'||from.identity=='zhong'&&to.identity=='zhu'||from.identity=='nei'&&to.identity=='zhu'&&get.situation()<=1||(to.identity=='nei'&&get.situation()<=0&&['zhu','zhong'].contains(from.identity)||get.situation()>=3&&from.identity=='fan')?2.9:-2.9)) if(from==to||to.identityShown||((stratagem_expose&&stratagem_expose.contains(to))||(zhibi&&zhibi.contains(to)))&&!to.ai.stratagemCamouflage) return real*1.1; if(from.identity=='nei'&&to.ai.stratagemCamouflage) return real*1.1; if(to.identity=='nei'){