diff --git a/audio/die/chengui.mp3 b/audio/die/chengui.mp3 new file mode 100644 index 000000000..7b7e34e58 Binary files /dev/null and b/audio/die/chengui.mp3 differ diff --git a/audio/die/dc_huangquan.mp3 b/audio/die/dc_huangquan.mp3 new file mode 100644 index 000000000..1ef6749fd Binary files /dev/null and b/audio/die/dc_huangquan.mp3 differ diff --git a/audio/die/dc_huban.mp3 b/audio/die/dc_huban.mp3 new file mode 100644 index 000000000..62c91e3e3 Binary files /dev/null and b/audio/die/dc_huban.mp3 differ diff --git a/audio/die/dc_liru.mp3 b/audio/die/dc_liru.mp3 new file mode 100644 index 000000000..9deaa1ee8 Binary files /dev/null and b/audio/die/dc_liru.mp3 differ diff --git a/audio/die/dingshangwan.mp3 b/audio/die/dingshangwan.mp3 new file mode 100644 index 000000000..0c4cbc732 Binary files /dev/null and b/audio/die/dingshangwan.mp3 differ diff --git a/audio/die/kebineng.mp3 b/audio/die/kebineng.mp3 new file mode 100644 index 000000000..84e119121 Binary files /dev/null and b/audio/die/kebineng.mp3 differ diff --git a/audio/die/quanhuijie.mp3 b/audio/die/quanhuijie.mp3 new file mode 100644 index 000000000..b4986fed9 Binary files /dev/null and b/audio/die/quanhuijie.mp3 differ diff --git a/audio/die/re_zhuhuan.mp3 b/audio/die/re_zhuhuan.mp3 new file mode 100644 index 000000000..266c46187 Binary files /dev/null and b/audio/die/re_zhuhuan.mp3 differ diff --git a/audio/die/yinfuren.mp3 b/audio/die/yinfuren.mp3 new file mode 100644 index 000000000..7f4b5ea3d Binary files /dev/null and b/audio/die/yinfuren.mp3 differ diff --git a/audio/skill/dcchongyi1.mp3 b/audio/skill/dcchongyi1.mp3 new file mode 100644 index 000000000..4b385ac35 Binary files /dev/null and b/audio/skill/dcchongyi1.mp3 differ diff --git a/audio/skill/dcchongyi2.mp3 b/audio/skill/dcchongyi2.mp3 new file mode 100644 index 000000000..bf56e6305 Binary files /dev/null and b/audio/skill/dcchongyi2.mp3 differ diff --git a/audio/skill/dccongshi1.mp3 b/audio/skill/dccongshi1.mp3 new file mode 100644 index 000000000..e4fc2b20b Binary files /dev/null and b/audio/skill/dccongshi1.mp3 differ diff --git a/audio/skill/dccongshi2.mp3 b/audio/skill/dccongshi2.mp3 new file mode 100644 index 000000000..869db1248 Binary files /dev/null and b/audio/skill/dccongshi2.mp3 differ diff --git a/audio/skill/dcfencheng1.mp3 b/audio/skill/dcfencheng1.mp3 new file mode 100644 index 000000000..a10df7ae1 Binary files /dev/null and b/audio/skill/dcfencheng1.mp3 differ diff --git a/audio/skill/dcfencheng2.mp3 b/audio/skill/dcfencheng2.mp3 new file mode 100644 index 000000000..62cc26df4 Binary files /dev/null and b/audio/skill/dcfencheng2.mp3 differ diff --git a/audio/skill/dcfengyan1.mp3 b/audio/skill/dcfengyan1.mp3 new file mode 100644 index 000000000..a020afbf0 Binary files /dev/null and b/audio/skill/dcfengyan1.mp3 differ diff --git a/audio/skill/dcfengyan2.mp3 b/audio/skill/dcfengyan2.mp3 new file mode 100644 index 000000000..0ccda98ea Binary files /dev/null and b/audio/skill/dcfengyan2.mp3 differ diff --git a/audio/skill/dcfudao1.mp3 b/audio/skill/dcfudao1.mp3 new file mode 100644 index 000000000..5b1dd1938 Binary files /dev/null and b/audio/skill/dcfudao1.mp3 differ diff --git a/audio/skill/dcfudao2.mp3 b/audio/skill/dcfudao2.mp3 new file mode 100644 index 000000000..9a32412cd Binary files /dev/null and b/audio/skill/dcfudao2.mp3 differ diff --git a/audio/skill/dchuishu1.mp3 b/audio/skill/dchuishu1.mp3 new file mode 100644 index 000000000..356179833 Binary files /dev/null and b/audio/skill/dchuishu1.mp3 differ diff --git a/audio/skill/dchuishu2.mp3 b/audio/skill/dchuishu2.mp3 new file mode 100644 index 000000000..287e433bb Binary files /dev/null and b/audio/skill/dchuishu2.mp3 differ diff --git a/audio/skill/dcligong1.mp3 b/audio/skill/dcligong1.mp3 new file mode 100644 index 000000000..f14ae3330 Binary files /dev/null and b/audio/skill/dcligong1.mp3 differ diff --git a/audio/skill/dcligong2.mp3 b/audio/skill/dcligong2.mp3 new file mode 100644 index 000000000..eecce00e5 Binary files /dev/null and b/audio/skill/dcligong2.mp3 differ diff --git a/audio/skill/dcmieji1.mp3 b/audio/skill/dcmieji1.mp3 new file mode 100644 index 000000000..d3939303e Binary files /dev/null and b/audio/skill/dcmieji1.mp3 differ diff --git a/audio/skill/dcmieji2.mp3 b/audio/skill/dcmieji2.mp3 new file mode 100644 index 000000000..751460572 Binary files /dev/null and b/audio/skill/dcmieji2.mp3 differ diff --git a/audio/skill/dcquanjian1.mp3 b/audio/skill/dcquanjian1.mp3 new file mode 100644 index 000000000..708a31a26 Binary files /dev/null and b/audio/skill/dcquanjian1.mp3 differ diff --git a/audio/skill/dcquanjian2.mp3 b/audio/skill/dcquanjian2.mp3 new file mode 100644 index 000000000..8c90402ef Binary files /dev/null and b/audio/skill/dcquanjian2.mp3 differ diff --git a/audio/skill/dctujue1.mp3 b/audio/skill/dctujue1.mp3 new file mode 100644 index 000000000..bef8f27c8 Binary files /dev/null and b/audio/skill/dctujue1.mp3 differ diff --git a/audio/skill/dctujue2.mp3 b/audio/skill/dctujue2.mp3 new file mode 100644 index 000000000..f26845749 Binary files /dev/null and b/audio/skill/dctujue2.mp3 differ diff --git a/audio/skill/dcyingtu1.mp3 b/audio/skill/dcyingtu1.mp3 new file mode 100644 index 000000000..902de8e26 Binary files /dev/null and b/audio/skill/dcyingtu1.mp3 differ diff --git a/audio/skill/dcyingtu2.mp3 b/audio/skill/dcyingtu2.mp3 new file mode 100644 index 000000000..ec9f469cd Binary files /dev/null and b/audio/skill/dcyingtu2.mp3 differ diff --git a/audio/skill/dcyingyu1.mp3 b/audio/skill/dcyingyu1.mp3 new file mode 100644 index 000000000..218fa415b Binary files /dev/null and b/audio/skill/dcyingyu1.mp3 differ diff --git a/audio/skill/dcyingyu2.mp3 b/audio/skill/dcyingyu2.mp3 new file mode 100644 index 000000000..e190a33c5 Binary files /dev/null and b/audio/skill/dcyingyu2.mp3 differ diff --git a/audio/skill/dcyishu1.mp3 b/audio/skill/dcyishu1.mp3 new file mode 100644 index 000000000..02ce68275 Binary files /dev/null and b/audio/skill/dcyishu1.mp3 differ diff --git a/audio/skill/dcyishu2.mp3 b/audio/skill/dcyishu2.mp3 new file mode 100644 index 000000000..88afee16a Binary files /dev/null and b/audio/skill/dcyishu2.mp3 differ diff --git a/audio/skill/dcyongbi1.mp3 b/audio/skill/dcyongbi1.mp3 new file mode 100644 index 000000000..e0a9d8145 Binary files /dev/null and b/audio/skill/dcyongbi1.mp3 differ diff --git a/audio/skill/dcyongbi2.mp3 b/audio/skill/dcyongbi2.mp3 new file mode 100644 index 000000000..ac535ee70 Binary files /dev/null and b/audio/skill/dcyongbi2.mp3 differ diff --git a/audio/skill/juece_dc_liru1.mp3 b/audio/skill/juece_dc_liru1.mp3 new file mode 100644 index 000000000..6baaca578 Binary files /dev/null and b/audio/skill/juece_dc_liru1.mp3 differ diff --git a/audio/skill/juece_dc_liru2.mp3 b/audio/skill/juece_dc_liru2.mp3 new file mode 100644 index 000000000..31faa2114 Binary files /dev/null and b/audio/skill/juece_dc_liru2.mp3 differ diff --git a/audio/skill/kousheng1.mp3 b/audio/skill/kousheng1.mp3 new file mode 100644 index 000000000..e8d905265 Binary files /dev/null and b/audio/skill/kousheng1.mp3 differ diff --git a/audio/skill/kousheng2.mp3 b/audio/skill/kousheng2.mp3 new file mode 100644 index 000000000..3b113927c Binary files /dev/null and b/audio/skill/kousheng2.mp3 differ diff --git a/audio/skill/refenli1.mp3 b/audio/skill/refenli1.mp3 new file mode 100644 index 000000000..554fc0e97 Binary files /dev/null and b/audio/skill/refenli1.mp3 differ diff --git a/audio/skill/refenli2.mp3 b/audio/skill/refenli2.mp3 new file mode 100644 index 000000000..d1d2a9284 Binary files /dev/null and b/audio/skill/refenli2.mp3 differ diff --git a/audio/skill/repingkou1.mp3 b/audio/skill/repingkou1.mp3 new file mode 100644 index 000000000..7a7f61eed Binary files /dev/null and b/audio/skill/repingkou1.mp3 differ diff --git a/audio/skill/repingkou2.mp3 b/audio/skill/repingkou2.mp3 new file mode 100644 index 000000000..01bd414a6 Binary files /dev/null and b/audio/skill/repingkou2.mp3 differ diff --git a/card/sp.js b/card/sp.js index 896006861..42a80d29e 100644 --- a/card/sp.js +++ b/card/sp.js @@ -596,15 +596,19 @@ game.import('card',function(lib,game,ui,get,ai,_status){ cardSkill:true, unique:true, trigger:{player:'phaseDrawBegin'}, - silent:true, + popup:false, + charlotte:true, + forced:true, content:function(){ trigger.num--; }, group:'caomu_skill2' }, caomu_skill2:{ + cardSkill:true, + popup:false, + forced:true, trigger:{player:'phaseDrawAfter'}, - silent:true, content:function(){ var targets=game.filterPlayer(function(current){ return get.distance(player,current)<=1&&player!=current; diff --git a/card/standard.js b/card/standard.js index 7b17b5582..2520be62b 100644 --- a/card/standard.js +++ b/card/standard.js @@ -2583,11 +2583,9 @@ game.import('card',function(lib,game,ui,get,ai,_status){ else{ trigger.neutralize(); if(event.guowuxie==true){ - if(trigger.target.identity!='ye'&&trigger.target.identity!='unknown'){ - trigger.getParent().excluded.addArray(game.filterPlayer(function(current){ - return current.identity==trigger.target.identity; - })); - } + trigger.getParent().excluded.addArray(game.filterPlayer(function(current){ + return current.isFriendOf(trigger.target); + })); } } } diff --git a/character/diy.js b/character/diy.js index 1baf96d73..ac5794bb1 100755 --- a/character/diy.js +++ b/character/diy.js @@ -176,6 +176,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_guohuai:['male','wei',3,['rejingce']], junk_zhangrang:['male','qun',3,['junktaoluan']], old_bulianshi:['female','wu',3,['anxu','zhuiyi']], + junk_sunquan:['male','shen',4,['junkyuheng','junkdili'],['wei']], }, characterFilter:{ key_jojiro:function(mode){ @@ -210,7 +211,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ diy_default:["diy_yuji","diy_caiwenji","diy_lukang","diy_zhenji"], diy_noname:['noname'], diy_key:["key_lucia","key_kyousuke","key_yuri","key_haruko","key_umi","key_rei","key_komari","key_yukine","key_yusa","key_misa","key_masato","key_iwasawa","key_kengo","key_yoshino","key_yui","key_tsumugi","key_saya","key_harukakanata","key_inari","key_shiina","key_sunohara","key_rin","key_sasami","key_akane","key_doruji","key_yuiko","key_riki","key_hisako","key_hinata","key_noda","key_tomoya","key_nagisa","key_ayato","key_ao","key_yuzuru","sp_key_kanade","key_mio","key_midori","key_kyoko","key_shizuru","key_shiorimiyuki","key_miki","key_shiori","key_kaori","sp_key_yuri","key_akiko","key_abyusa","key_godan","key_yuu","key_ryoichi","key_kotori","key_jojiro","key_shiroha","key_shizuku","key_hiroto","key_sakuya","key_youta","key_rumi","key_chihaya","key_yukito","key_asara","key_kotomi","key_mia","key_kano","db_key_liyingxia","key_erika","key_satomi"], - diy_trashbin:['old_jiakui','ol_guohuai','junk_zhangrang','old_bulianshi'], + diy_trashbin:['old_jiakui','ol_guohuai','junk_zhangrang','old_bulianshi','junk_sunquan'], }, }, characterIntro:{ @@ -6368,20 +6369,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, kyoko_juwu:{ - trigger:{global:['loseAfter','cardsDiscardAfter','loseAsyncAfter']}, + trigger:{global:['loseAfter','cardsDiscardAfter','loseAsyncAfter','equipAfter']}, direct:true, filter:function(event,player){ - if(event.name.indexOf('lose')==0&&(event.getlx===false||event.position!=ui.discardPile)) return false; - return player!=event.player&&player!=_status.currentPhase&&event.cards&&event.cards.filter(function(card){ - return get.position(card,true)=='d'&&get.type(card,false)=='equip'; - }).length>0; + if(player==_status.currentPhase) return false; + var cards=event.getd(); + if(!cards.length) return false; + cards.removeArray(event.getd(player)); + for(var card of cards){ + if(get.position(card,true)=='d'&&get.type(card,null,false)=='equip') return true; + } + return false; }, content:function(){ 'step 0' if(trigger.delay==false) game.delay(); 'step 1' - var cards=trigger.cards.filter(function(card){ - return get.position(card,true)=='d'&&get.type(card,false)=='equip'; + var cards=trigger.getd(); + cards.removeArray(trigger.getd(player)); + cards=cards.filter(function(card){ + if(get.position(card,true)=='d'&&get.type(card,null,false)=='equip') return true; }); player.chooseButton([get.prompt('kyoko_juwu'),cards],[1,cards.length]).set('ai',function(){return 1}); 'step 2' @@ -8946,14 +8953,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audioname2:{ wufan:'refenyin_wufan', }, - trigger:{global:['loseAfter','cardsDiscardAfter']}, + trigger:{global:['loseAfter','cardsDiscardAfter','equipAfter']}, forced:true, filter:function(event,player){ if(player!=_status.currentPhase) return false; - if(event.name.indexOf('lose')==0&&(event.getlx===false||event.position!=ui.discardPile)) return false; + var cards=event.getd(); var list=[]; - for(var i=0;i0; + }, + content:function(){ + player.draw(player.additionalSkills.junkyuheng.length); + game.log(player,'失去了以下技能:','#g'+get.translation(player.additionalSkills.junkyuheng)); + player.removeAdditionalSkill('junkyuheng'); + }, + }, + }, + }, + junkdili:{ + audio:'dili', + trigger:{player:'logSkill'}, + forced:true, + juexingji:true, + skillAnimation:true, + animationColor:'wood', + filter:function(event,player){ + if(event.skill!='junkyuheng') return false; + var skills=player.getSkills(null,false,false).filter(function(i){ + var info=get.info(i); + return info&&!info.charlotte; + }); + return skills.length>player.maxHp; + }, + content:function(){ + 'step 0' + player.awakenSkill('junkdili'); + player.loseMaxHp(); + 'step 1' + var skills=player.getSkills(null,false,false).filter(function(i){ + if(i=='junkdili') return false; + var info=get.info(i); + return info&&!info.charlotte; + }); + var list=[]; + for(var skill of skills){ + list.push([ + skill, + '', + ]) + } + var next=player.chooseButton([ + '请选择失去任意个技能', + [list,'textbutton'], + ]); + next.set('forced',true); + next.set('selectButton',[1,skills.length]); + next.set('ai',function(button){ + var skill=button.link,skills=_status.event.skills.slice(0); + skills.removeArray(['xinanguo','lanjiang','rezhiheng','junkyuheng']); + switch(ui.selected.buttons.length){ + case 0: + if(skills.contains(skill)) return 2; + if(skill=='junkyuheng') return 1; + return Math.random(); + case 1: + if(skills.length<2) return 0; + if(skills.contains(skill)) return 2; + if(skill=='junkyuheng') return 1; + return 0 + case 2: + if(skills.contains(skill)) return 2; + if(skill=='junkyuheng') return 1; + return 0; + default: return 0; + } + }); + next.set('skills',skills) + 'step 2' + if(result.bool){ + var skills=result.links; + game.log(player,'失去了以下技能:','#g'+get.translation(skills)); + player.removeSkill(skills.slice(0)); + } + var list=lib.skill.junkdili.derivation; + for(var i=0;iInfinity, + targetInRange:()=>true, + }, + trigger:{player:'useCard1'}, + forced:true, + charlotte:true, + popup:false, + firstDo:true, + content:function(){ + if(trigger.addCount!==false){ + trigger.addCount=false; + player.getStat().card[trigger.card.name]--; + } + player.removeSkill('junkshengzhi_effect'); + }, + mark:true, + intro:{content:'使用下一张牌无距离和次数限制'}, + }, + }, + }, + junkquandao:{ + audio:'dili_quandao', + trigger:{player:'useCard'}, + forced:true, + filter:function(event,player){ + return event.card.name=='sha'||get.type(event.card,null,false)=='trick'; + }, + content:function(){ + 'step 0' + var filter1=function(card){ + return get.name(card)=='sha'; + },filter2=function(card){ + return get.type(card)=='trick'; + }; + var num1=player.countCards('h',filter1),num2=player.countCards('h',filter2); + if(num1!=num2){ + var delta=num1-num2; + player.chooseToDiscard('h',true,Math.abs(delta),delta>0?filter1:filter2,'驭衡:请弃置'+get.cnNumber(Math.abs(delta))+'张'+(delta>0?'【杀】':'普通锦囊牌')); + } + 'step 1' + player.draw(); + }, + }, + junkchigang:{ + audio:'dili_chigang', + trigger:{player:'phaseJudgeBefore'}, + forced:true, + zhuanhuanji:true, + mark:true, + marktext:'☯', + content:function(){ + player.changeZhuanhuanji('junkchigang'); + trigger.cancel(); + var next=player[player.storage.junkchigang?'phaseDraw':'phaseUse'](); + event.next.remove(next); + trigger.getParent().next.push(next); + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(get.type(card)=='delay') return 'zerotarget'; + }, + }, + }, + intro:{ + content:function(storage){ + return '转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的'+(storage?'出牌阶段':'摸牌阶段')+'。' + }, + }, + }, }, dynamicTranslate:{ nsjiquan:function(player){ @@ -16201,6 +16417,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.storage.nstaiping) return '一名角色的判定牌生效前,你可以打出一张牌替换之。'; return '一名角色的判定牌生效前,你可以打出一张黑色牌替换之。'; }, + junkchigang:function(player){ + if(player.storage.junkchigang) return '转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。'; + return '转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。'; + }, }, characterReplace:{ key_yuri:['key_yuri','sp_key_yuri'], @@ -17136,6 +17356,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ns_caimao:'蔡瑁', nsdingzhou:'定州', nsdingzhou_info:'出牌阶段限一次,你可以选择一名区域内有牌的其他角色。你随机获得其区域内的一张牌,然后摸一张牌。若你以此法获得了两张颜色不同的牌,则你失去1点体力。', + junk_sunquan:'改版神孙权', + junk_sunquan_ab:'神孙权', + junkyuheng:'驭衡', + junkyuheng_info:'锁定技。①回合开始时,你须弃置任意张花色不同的牌,从东吴命运线·改中随机获得等量的技能。②回合结束时,你失去所有因〖驭衡①〗获得的技能,然后摸等量的牌。', + junkdili:'帝力', + junkdili_info:'觉醒技。当你发动〖驭衡①〗后,若你拥有的技能数大于你的体力上限,则你减1点体力上限,选择失去任意个其他技能,然后获得以下技能中的前等量个:〖圣质〗/〖权道〗/〖持纲〗。', + junkshengzhi:'圣质', + junkshengzhi_info:'锁定技。当你发动非锁定技后,你令你本回合使用的下一张牌无距离和次数限制。', + junkquandao:'权道', + junkquandao_info:'锁定技。当你使用【杀】或普通锦囊牌时,若你手牌中的【杀】或普通锦囊牌的数量之差X不为0,则你弃置X张数量较多的一种牌,然后你摸一张牌。', + junkchigang:'持纲', + junkchigang_info:'转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。', ol_guohuai_ab:'郭淮', junk_zhangrang_ab:'张让', old_jiakui_ab:'贾逵', @@ -17150,7 +17382,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ diy_yijiang2:'设计比赛2021', diy_yijiang3:'设计比赛2022', diy_fakenews:'假新闻', - diy_trashbin:'垃圾桶', + diy_trashbin:'杀海拾遗', old_jiakui:'贾逵重制', ol_guohuai:'三血郭淮', ns_chengpu:'铁索程普', diff --git a/character/extra.js b/character/extra.js index 4d576aa6c..d9445b92b 100755 --- a/character/extra.js +++ b/character/extra.js @@ -63,6 +63,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shen_zhangliao:['shen_zhangliao','ol_zhangliao'], shen_zhaoyun:['shen_zhaoyun','boss_zhaoyun'], shen_guanyu:['shen_guanyu','tw_shen_guanyu'], + shen_sunquan:['shen_sunquan','junk_sunquan'], }, characterFilter:{ shen_diaochan:function(mode){ @@ -4949,66 +4950,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return target!=player&&target.countCards('h'); }, content:function(){ - "step 0" - event.videoId=lib.status.videoId++; + 'step 0' var cards=target.getCards('h'); - if(player.isOnline2()){ - player.send(function(cards,id){ - ui.create.dialog('攻心',cards).videoId=id; - },cards,event.videoId); - } - event.dialog=ui.create.dialog('攻心',cards); - event.dialog.videoId=event.videoId; - if(!event.isMine()){ - event.dialog.style.display='none'; - } - player.chooseButton().set('filterButton',function(button){ - return get.suit(button.link)=='heart'; - }).set('dialog',event.videoId); - "step 1" + player.chooseButton(2,[ + '攻心', + cards, + [['弃置此牌','置于牌堆顶'],'tdnodes'], + ]).set('filterButton',function(button){ + var type=typeof button.link; + if(ui.selected.buttons.length&&type==typeof ui.selected.buttons[0].link) return false; + return type=='string'||get.suit(button.link)=='heart'; + }); + 'step 1' if(result.bool){ - event.card=result.links[0]; - var func=function(card,id){ - var dialog=get.idDialog(id); - if(dialog){ - for(var i=0;i=game.countGroup(); + return player.getExpansions('jibing').length>=game.countGroup(); }, content:function(){ player.awakenSkill('moucuan'); @@ -5967,17 +5967,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, discard:{ trigger:{ - global:['loseAfter','cardsDiscardAfter','loseAsyncAfter'], + global:['loseAfter','cardsDiscardAfter','loseAsyncAfter','equipAfter'], }, forced:true, locked:false, filter:function(event,player){ - return player.storage.yizhu&&player.storage.yizhu.length&&(event.name=='cardsDiscard'||(event.position==ui.discardPile&&event.getlx!==false))&&event.cards.filter(function(i){ + return player.storage.yizhu&&player.storage.yizhu.length&&event.getd().filter(function(i){ return player.storage.yizhu.contains(i); }).length>0; }, content:function(){ - var list=trigger.cards.filter(function(i){ + var list=trigger.getd().filter(function(i){ return player.storage.yizhu.contains(i); }); player.unmarkAuto('yizhu',list); @@ -13575,14 +13575,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, rebiaozhao2:{ trigger:{ - global:["loseAfter","cardsDiscardAfter","loseAsyncAfter"], + global:["loseAfter","cardsDiscardAfter","loseAsyncAfter",'equipAfter'], }, forced:true, audio:"biaozhao", filter:function(event,player){ - if(event.name.indexOf('lose')==0&&(event.getlx===false||event.position!=ui.discardPile||event.getParent(2).name=='rebiaozhao3')) return false; - var cards=player.getExpansions('rebiaozhao'); - if(!cards.length) return false; + var cards=player.getExpansions('rebiaozhao'),cards2=event.getd(); + if(!cards.length||!cards2.length) return false; var num=get.number(cards[0]); for(var i=0;i=3) return false; - if(event.name.indexOf('lose')==0&&(event.getlx===false||event.position!=ui.discardPile)) return false; - var type=player.storage.xinfu_yanyu; - var cards=event.cards; + var type=player.storage.xinfu_yanyu,cards=event.getd(); for(var i=0;i0; + }, + discard:false, + delay:false, + check:function(card){ + return 8-get.value(card); + }, + loseTo:'cardPile', + insert:true, + visible:true, + content:function(){ + 'step 0' + player.showCards(cards); + 'step 1' + target.chooseToDiscard('he',true).set('prompt','请弃置一张锦囊牌,或依次弃置两张非锦囊牌。'); + 'step 2' + if((!result.cards||get.type(result.cards[0],'trick',result.cards[0].original=='h'?target:false)!='trick')&&target.countCards('he',function(card){ + return get.type(card,'trick')!='trick'; + })){ + target.chooseToDiscard('he',true,function(card){ + return get.type(card,'trick')!='trick'; + }).set('prompt','请弃置第二张非锦囊牌'); + } + }, + ai:{ + order:9, + result:{ + target:-1 + } + } + }, + dcfencheng:{ + skillAnimation:'epic', + animationColor:'fire', + audio:2, + enable:'phaseUse', + filterTarget:function(card,player,target){ + return player!=target; + }, + limited:true, + line:'fire', + content:function(){ + "step 0" + player.awakenSkill('dcfencheng'); + event.num=1; + event.targets=game.filterPlayer((current)=>current!=player); + event.targets.sortBySeat(target); + "step 1" + if(event.targets.length){ + var target=event.targets.shift(); + if(!target.isIn()){ + event.redo(); + return; + } + event.target=target; + player.line(target,'fire'); + var res=get.damageEffect(target,player,target,'fire'); + target.chooseToDiscard('he','弃置至少'+get.cnNumber(event.num)+'张牌或受到2点火焰伤害',[num,Infinity]).set('ai',function(card){ + if(ui.selected.cards.length>=_status.event.getParent().num) return -1; + if(_status.event.player.hasSkillTag('nofire')) return -1; + if(_status.event.res>=0) return 6-get.value(card); + if(get.type(card)!='basic'){ + return 10-get.value(card); + } + return 8-get.value(card); + }).set('res',res); + } + else{ + event.finish(); + } + "step 2" + if(!result.bool){ + event.target.damage(2,'fire'); + event.num=1; + } + else{ + event.num=result.cards.length+1; + event.goto(1); + } + "step 3" + game.delayx(); + event.goto(1); + }, + ai:{ + order:1, + result:{ + player:function(player,target){ + if(player.hasUnknown(2)) return 0; + var num=0,eff=0,players=game.filterPlayer(function(current){ + return current!=player; + }).sortBySeat(target); + for(var target of players){ + if(get.damageEffect(target,player,target,'fire')>=0){num=0;continue}; + var shao=false; + num++; + if(target.countCards('he',function(card){ + if(get.type(card)!='basic'){ + return get.value(card)<10; + } + return get.value(card)<8; + })0) return false; + return game.hasPlayer(function(current){ + return get.attitude(player,current)<0&¤t.hp==1&&get.damageEffect(current,player,player)>0; + }); + }, + content:function(){ + trigger.cancel(); + player.skip('phaseDraw'); + } + }, + use:{ + audio:'refenli', + trigger:{player:'phaseUseBefore'}, + prompt:'是否发动【奋励】跳过出牌阶段?', + filter:function(event,player){ + return player.isMaxHp(); + }, + check:function(event,player){ + if(!player.needsToDiscard()||(player.countCards('e')&&player.isMaxEquip())) return true; + if(player.getHistory('skipped').length>0) return false; + return game.hasPlayer(function(current){ + return get.attitude(player,current)<0&¤t.hp==1&&get.damageEffect(current,player,player)>0; + }); + }, + content:function(){ + trigger.cancel(); + } + }, + discard:{ + audio:'refenli', + trigger:{player:'phaseDiscardBefore'}, + prompt:'是否发动【奋励】跳过弃牌阶段?', + frequent:true, + filter:function(event,player){ + return player.isMaxEquip()&&player.countCards('e'); + }, + content:function(){ + trigger.cancel(); + } + } + }, + ai:{ + combo:'repingkou' + } + }, + repingkou:{ + audio:2, + trigger:{player:'phaseEnd'}, + direct:true, + filter:function(event,player){ + return player.getHistory('skipped').length>0; + }, + content:function(){ + 'step 0' + player.chooseTarget([1,player.getHistory('skipped').length],get.prompt2('repingkou'),'对至多'+get.cnNumber(num)+'名其他角色各造成1点伤害。若你选择的角色数小于最大角色数,则你可以弃置其中一名目标角色装备区内的一张牌',function(card,player,target){ + return target!=player; + }).set('ai',function(target){ + var player=_status.event.player; + return get.damageEffect(target,player,player); + }); + 'step 1' + if(result.bool){ + player.logSkill('repingkou',result.targets); + event.targets=result.targets.slice(0).sortBySeat(); + event.num=0; + } + else{ + event.finish(); + } + 'step 2' + var target=targets[event.num]; + if(target.isIn()) target.damage(); + event.num++; + if(event.num0; + }); + if(targets2.length>0){ + player.chooseTarget('是否弃置一名目标角色的一张装备牌?',function(card,player,target){ + return _status.event.targets.contains(target); + }).set('targets',targets2).set('ai',function(target){ + var att=get.attitude(player,target),eff=0; + target.getCards('e',function(card){ + var val=get.value(card,target); + eff=Math.max(eff,-val*att); + }); + return eff; + }); + } + else event.finish(); + 'step 4' + if(result.bool){ + var target=result.targets[0]; + player.line(target,'green'); + player.discardPlayerCard(target,'e',true); + } + }, + ai:{ + combo:'fenli', + effect:{ + target:function(card){ + if(card.name=='lebu'||card.name=='bingliang') return 0.5; + } + } + } + }, //典韦 olqiangxi:{ audio:'qiangxi', @@ -5243,7 +5494,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.type!='discard') return false; var evt=event.getl(player); return evt&&evt.cards2&&evt.cards2.filter(function(i){ - return get.name(i,evt.hs.contains(i)?player:false)==true; + return get.name(i,evt.hs.contains(i)?player:false)=='sha'; }).length>0; }; if(event.name=='gain'&&event.player==player) return false; @@ -12471,7 +12722,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ decadechunlao:'醇醪', decadechunlao2:'醇醪', decadechunlao_info:'你可以对其他角色使用【酒(使用方法②)】。当你需要使用【酒】时,若你的武将牌未横置,则你可以将武将牌横置,然后视为使用【酒】。当你受到或造成伤害后,若伤害值大于1且你的武将牌横置,则你可以重置武将牌。', - re_liru:'界李儒', + re_liru:'手杀李儒', rejuece:'绝策', rejuece_info:'结束阶段,你可以对一名本回合内失去过牌的角色造成1点伤害。', remieji:'灭计', @@ -12701,6 +12952,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ olqiangxi_info:'出牌阶段限两次。你可以弃置一张武器牌或受到1点无来源伤害,然后对一名本回合内未成为过〖强袭〗目标的其他角色造成1点伤害。', olningwu:'狞恶', olningwu_info:'锁定技。当一名角色A于一回合内第二次受到伤害后,若A或伤害来源为你,则你摸一张牌,然后弃置其装备区或判定区内的一张牌。', + re_zhuhuan:'界朱桓', + refenli:'奋励', + refenli_info:'若你的手牌数为全场最多,你可以跳过摸牌阶段和摸牌阶段;若你的体力值为全场最多,你可以跳过出牌阶段;若你的装备区里有牌且数量为全场最多,你可以跳过弃牌阶段。', + //破界石不值钱了 就逮着免费突破硬削是吧 + repingkou:'平寇', + repingkou_info:'回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。若你选择的角色数小于X,则你可以弃置其中一名角色装备区内的一张牌', + dc_liru:'界李儒', + dcmieji:'灭计', + dcmieji_info:'出牌阶段限一次,你可以展示一张武器牌或黑色锦囊牌。你将此牌置于牌堆顶,然后令一名有手牌的其他角色选择一项:⒈弃置一张锦囊牌;⒉依次弃置两张非锦囊牌。', + dcfencheng:'焚城', + dcfencheng_info:'限定技。出牌阶段,你可以指定一名其他角色,令从其开始的其他角色依次选择一项:⒈弃置至少X张牌(X为上一名角色弃置的牌数+1)。⒉你对其造成2点伤害。', refresh_standard:'界限突破·标', refresh_feng:'界限突破·风', diff --git a/character/sp.js b/character/sp.js index be2c51b5b..28a10c03d 100755 --- a/character/sp.js +++ b/character/sp.js @@ -657,6 +657,85 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //吕范 + xindiaodu:{ + audio:"diaodu", + group:'xindiaodu_use', + frequent:true, + preHidden:true, + isFriendOf:function(player,target){ + if(get.mode()=='guozhan') return player.isFriendOf(target); + return player.group==target.group; + }, + subSkill:{ + temp:{}, + use:{ + trigger:{ + global:"useCard", + }, + filter:function(event,player){ + return get.type(event.card)=='equip'&&event.player.isAlive()&& + lib.skill.xindiaodu.isFriendOf(player,event.player)&&(player==event.player||player.hasSkill('xindiaodu'))&&!event.player.hasSkill('xindiaodu_temp'); + }, + direct:true, + content:function(){ + 'step 0' + var next=trigger.player.chooseBool('是否发动【调度】摸一张牌?'); + if(player.hasSkill('xindiaodu')) next.set('frequentSkill','xindiaodu'); + if(player==trigger.player) next.setHiddenSkill('xindiaodu'); + 'step 1' + if(result.bool){ + player.logSkill('xindiaodu',trigger.player); + trigger.player.draw('nodelay'); + trigger.player.addTempSkill('xindiaodu_temp'); + } + }, + }, + }, + trigger:{ + player:"phaseUseBegin", + }, + filter:function(event,player){ + return game.hasPlayer(function(current){ + return lib.skill.xindiaodu.isFriendOf(current,player)&¤t.countGainableCards(player,'e')>0; + }); + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('xindiaodu'),function(card,player,current){ + return lib.skill.xindiaodu.isFriendOf(current,player)&¤t.countGainableCards(player,'e')>0; + }).setHiddenSkill(event.name).ai=function(target){ + var num=1; + if(target.hasSkill('gzxiaoji')) num+=2.5; + if(target.isDamaged()&&target.getEquip('baiyin')) num+=2.5; + if(target.hasSkill('xuanlve')) num+=2; + return num; + }; + 'step 1' + if(result.bool){ + event.target1=result.targets[0]; + player.logSkill('xindiaodu',event.target1); + player.line(event.target1,'xindiaodu'); + player.gainPlayerCard(event.target1,'e',true); + } + else event.finish(); + 'step 2' + if(result.bool&&player.getCards('h').contains(result.cards[0])){ + event.card=result.cards[0]; + player.chooseTarget('是否将'+get.translation(event.card)+'交给一名其他角色?',function(card,player,current){ + return current!=player&¤t!=_status.event.target1&&lib.skill.xindiaodu.isFriendOf(current,player) + }).set('target1',event.target1); + } + else event.finish(); + 'step 3' + if(result.bool){ + var target=result.targets[0]; + player.line(target,'green'); + target.gain(card,player,'give'); + } + }, + }, //夏侯玄 olhuanfu:{ audio:2, @@ -775,7 +854,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ for(var i=0;i0) event.redo(); else if(event.num0; + })) return 4; + if(button.link=='sha'&&game.hasPlayer(function(current){ + return lib.skill.dcfengyan_sha.filterTarget(null,player,current)&&get.effect(current,'dcfengyan_sha',player,player)>0; + })) return 4; + return 2; + }, + backup:function(links){ + return get.copy(lib.skill['dcfengyan_'+links[0]]); + }, + prompt:function(links){ + if(links[0]=='gain') return '令一名体力值不大于你的其他角色交给你一张手牌'; + return '视为对一名手牌数不大于你的其他角色使用【杀】'; + }, + }, + ai:{ + order:10, + threaten:1.7, + result:{player:1}, + }, + subSkill:{ + backup:{audio:'dcfengyan'}, + gain:{ + audio:'dcfengyan', + filterTarget:function(card,player,target){ + return target!=player&&target.hp<=player.hp&&target.countCards('h')>0; + }, + filterCard:()=>false, + selectCard:-1, + charlotte:true, + content:function(){ + 'step 0' + player.addTempSkill('dcfengyan_gain','phaseUseAfter'); + target.chooseCard('h',true,'交给'+get.translation(player)+'一张牌'); + 'step 1' + if(result.bool) player.gain(result.cards,target,'giveAuto'); + }, + ai:{ + tag:{ + loseCard:1, + gain:1, + }, + result:{ + player:0.1, + target:-1, + }, + }, + }, + sha:{ + audio:'dcfengyan', + filterTarget:function(card,player,target){ + return target!=player&&target.countCards('h')<=player.countCards('h')&&player.canUse('sha',target,false); + }, + filterCard:()=>false, + selectCard:-1, + charlotte:true, + content:function(){ + player.addTempSkill('dcfengyan_sha','phaseUseAfter'); + player.useCard({ + name:'sha', + isCard:true, + },target,false); + }, + ai:{ + result:{ + player:function(player,target){ + return get.effect(target,{ + name:'sha', + isCard:true, + },player,player); + }, + }, + }, + }, + }, + }, + dcfudao:{ + trigger:{ + global:'phaseBefore', + player:'enterGame', + }, + forced:true, + locked:true, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0)&&game.hasPlayer((current)=>current!=player); + }, + content:function(){ + 'step 0' + player.chooseTarget(true,lib.filter.notMe,'抚悼:请选择一名“继子”','你或“继子”每回合首次使用牌指定对方为目标后各摸两张牌;杀死你或“继子”的角色称为“决裂”。你或“继子”对“决裂”造成的伤害+1。“决裂”对你使用牌后,其本回合内不能再使用牌。').set('ai',function(target){ + return get.attitude(_status.event.player,target); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('dcfudao',target); + game.log(target,'成为了',player,'的继子'); + player.addSkill('dcfudao_effect'); + target.addSkill('dcfudao_effect'); + player.markAuto('dcfudao_effect',[target]); + target.markAuto('dcfudao_effect',[player]); + } + }, + group:'dcfudao_refuse', + subSkill:{ + effect:{ + trigger:{player:'useCardToPlayered'}, + forced:true, + charlotte:true, + usable:1, + filter:function(event,player){ + var target=event.target; + if(player==target||!target.isIn()) return false; + return player.getStorage('dcfudao_effect').contains(target); + }, + logTarget:'target', + content:function(){ + 'step 0' + var list=[player,trigger.target]; + list.sortBySeat(); + game.asyncDraw(list,2); + 'step 1' + game.delayx(); + }, + marktext:'继', + intro:{content:'已和$成为继母子关系'}, + group:['dcfudao_revenge','dcfudao_deadmark'], + }, + deadmark:{ + trigger:{player:'dieBegin'}, + forced:true, + popup:false, + lastDo:true, + silent:true, + filter:function(event,player){ + return get.itemtype(event.source)=='player'; + }, + content:function(){ + trigger.source.markAuto('dcfudao_deadmark',[player]); + }, + marktext:'裂', + intro:{ + name:'决裂', + intro:'你害死了$!', + }, + }, + revenge:{ + trigger:{source:'damageBegin1'}, + forced:true, + filter:function(event,player){ + var storage1=event.player.getStorage('dcfudao_deadmark'),storage2=player.getStorage('dcfudao_effect'); + for(var i of storage1){ + if(storage2.contains(i)) return true; + } + return false; + }, + content:function(){ + trigger.num++; + }, + logTarget:'player', + }, + refuse:{ + trigger:{target:'useCardToTargeted'}, + forced:true, + filter:function(event,player){ + var storage1=event.player.getStorage('dcfudao_deadmark'),storage2=player.getStorage('dcfudao_effect'); + for(var i of storage1){ + if(storage2.contains(i)) return true; + } + return false; + }, + content:function(){ + trigger.player.addTempSkill('dcfudao_blocker'); + }, + logTarget:'player', + }, + blocker:{ + charlotte:true, + mod:{ + cardEnabled:()=>false, + cardSavable:()=>false, + }, + }, + }, + }, + //陈珪 + dcyingtu:{ + audio:2, + trigger:{global:'gainAfter'}, + usable:1, + filter:function(event,player){ + var target=event.player; + if(target!=player.getNext()&&target!=player.getPrevious()) return false; + var evt=event.getParent('phaseDraw'); + if(evt&&target==evt.player) return false; + return target.hasCard(function(card){ + return lib.filter.canBeGained(card,target,player) + },'he'); + }, + logTarget:'player', + check:function(event,player){ + var source=event.player; + var target=(event.player==player.getNext()?player.getPrevious():player.getNext()); + return Math.min(0,get.attitude(player,target))>=get.attitude(player,source); + }, + content:function(){ + 'step 0' + var target=trigger.player; + event.side=(target==player.getPrevious()?'getNext':'getPrevious'); + player.gainPlayerCard(target,true,'he'); + 'step 1' + var he=player.getCards('he'); + if(he.length>0){ + var target=player[event.side](); + event.target=target; + if(he.length==1) event._result={bool:true,cards:he}; + else player.chooseCard('he',true,'交给'+get.translation(target)+'一张牌') + } + else event.finish(); + 'step 2' + if(result.bool){ + var card=result.cards[0]; + event.card=card; + player.line(target); + target.gain(card,player,'giveAuto'); + } + else event.finish(); + 'step 3' + if(target.getCards('h').contains(card)&&get.type(card,null,target)=='equip'&&target.canUse(card,target)) target.chooseUseTarget(card,true,'nopopup'); + }, + }, + dccongshi:{ + audio:2, + trigger:{global:'useCardAfter'}, + forced:true, + locked:false, + filter:function(event,player){ + return get.type(event.card,null,false)=='equip'&&event.player.isMaxEquip(); + }, + content:function(){ + player.draw(); + }, + }, + //胡班 + dcchongyi:{ + audio:2, + trigger:{global:'useCard'}, + logTarget:'player', + filter:function(event,player){ + if(event.card.name!='sha'||!event.player.isIn()) return false; + var evt=event.getParent('phaseUse'); + if(!evt||evt.player!=event.player) return false; + var goon=true,goon2=false; + event.player.getHistory('useCard',function(evtx){ + if(goon2||!goon||evtx.getParent('phaseUse')!=evt) return false; + if(evtx==event) goon2=true; + else if(!goon2) goon=false; + }); + return goon; + }, + prompt2:(event)=>'令其摸两张牌,且使用【杀】的次数上限+1', + check:function(event,player){ + return get.attitude(player,event.player)>0; + }, + content:function(){ + var target=trigger.player; + target.draw(2); + target.addMark('dcchongyi_sha',1,false); + target.addTempSkill('dcchongyi_sha'); + }, + group:'dcchongyi_end', + global:'dcchongyi_ai', + subSkill:{ + ai:{ + mod:{ + aiOrder:function(player,card,num){ + if(card.name!='sha') return; + var evt=_status.event.getParent('phaseUse'); + if(!evt||evt.player!=player) return; + if(player.hasHistory('useCard',function(evtx){ + return evtx.getParent('phaseUse')==evt; + })) return; + if(game.hasPlayer(function(current){ + return current.hasSkill('dcchongyi')&&get.attitude(player,current)>=0; + })) return num+10; + }, + }, + }, + end:{ + audio:'dcchongyi', + trigger:{global:'phaseUseEnd'}, + logTarget:'player', + filter:function(event,player){ + if(!event.player.isIn()) return false; + var history=event.player.getHistory('useCard',function(evt){ + return evt.getParent('phaseUse')==event; + }); + return history.length&&history[history.length-1].card.name=='sha'; + }, + prompt2:(event)=>'令'+get.translation(event.player)+'本回合的手牌上限+1', + check:function(event,player){ + return get.attitude(player,event.player)>0; + }, + content:function(){ + var target=trigger.player; + target.addMark('dcchongyi_keep',1,false); + target.addTempSkill('dcchongyi_keep'); + game.delayx(); + }, + }, + sha:{ + charlotte:true, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.countMark('dcchongyi_sha'); + }, + }, + onremove:true, + intro:{content:'使用【杀】的次数上限+#'}, + }, + keep:{ + charlotte:true, + mod:{ + cardUsable:function(player,num){ + return num+player.countMark('dcchongyi_keep'); + }, + }, + onremove:true, + intro:{content:'手牌上限+#'}, + }, + }, + }, + //黄权 + dcquanjian:{ + audio:2, + enable:'phaseUse', + usable:2, + chooseButton:{ + dialog:function(event,player){ + var dialog=ui.create.dialog('劝谏:令一名其他角色…','hidden'); + dialog.add([[ + ['damage','对其攻击范围内的一名角色造成1点伤害'], + ['draw','将其手牌数调整至体力上限(至多摸至五张),且其本回合内不能使用手牌'] + ],'textbutton']); + return dialog; + }, + filter:function(button,player){ + return !player.hasSkill('dcquanjian_'+button.link,null,null,false); + }, + check:()=>1+Math.random(), + backup:function(links){ + return get.copy(lib.skill['dcquanjian_'+links[0]]); + }, + prompt:function(links){ + if(links[0]=='damage') return '令一名其他角色对攻击范围内的另一名角色造成1点伤害'; + return '令一名其他角色将手牌数调整至体力上限(至多摸至五张)且本回合内不能使用手牌'; + }, + }, + ai:{ + order:2, + result:{player:1}, + }, + subSkill:{ + backup:{audio:'dcquanjian'}, + damage:{ + audio:'dcquanjian', + charlotte:true, + selectTarget:2, + filterTarget:function(card,player,target){ + if(!ui.selected.targets.length) return target!=player; + return ui.selected.targets[0].inRange(target); + }, + complexTarget:true, + complexSelect:true, + filterCard:()=>false, + selectCard:-1, + targetprompt:['造成伤害','受到伤害'], + multitarget:true, + content:function(){ + 'step 0' + player.addTempSkill('dcquanjian_damage','phaseUseAfter'); + targets[0].chooseControl().set('choiceList',[ + '对'+get.translation(targets[1])+'造成1点伤害', + '本回合下次受到的伤害+1', + ]).set('ai',function(){ + return _status.event.eff>=0?0:1; + }).set('eff',get.damageEffect(targets[1],targets[0],targets[0])); + 'step 1' + if(result.index==0){ + targets[1].damage(targets[0]); + } + else{ + target.addMark('dcquanjian_effect',1,false); + target.addTempSkill('dcquanjian_effect'); + } + }, + ai:{ + result:{ + player:function(player,target){ + if(ui.selected.targets.length==0){ + if(!game.hasPlayer((current)=>current.inRangeOf(target)&&get.damageEffect(current,target,player)>0)) return 0; + if(get.attitude(player,target)>0) return 2; + return 1; + } + return get.damageEffect(target,ui.selected.targets[0],player,player); + }, + }, + }, + }, + draw:{ + audio:'dcquanjian', + charlotte:true, + filterTarget:function(card,player,target){ + if(target==player) return false; + var num=target.countCards('h'); + if(num>target.maxHp) return true; + return numfalse, + selectCard:-1, + content:function(){ + 'step 0' + player.addTempSkill('dcquanjian_draw','phaseUseAfter'); + var num1=target.countCards('h'),num2=target.maxHp; + var num=0; + if(num1>num2){ + event.index=0; + num=num1-num2; + target.chooseControl().set('choiceList',[ + '弃置'+get.cnNumber(num)+'张手牌', + '本回合下次受到的伤害+1', + ]).set('ai',function(){ + var player=_status.event.player; + if(_status.event.number==1&&player.hasCard(function(card){ + return lib.filter.cardDiscardable(card,player,'dcquanjian_draw')&&get.value(card)<5; + },'h')) return 0; + return 1; + }).set('number',num); + } + else{ + event.index=1; + num=Math.min(num2,5)-num1; + if(num<=0) event.finish(); + else target.chooseControl().set('choiceList',[ + '摸'+get.cnNumber(num)+'张牌,且本回合内不能使用或打出手牌', + '本回合下次受到的伤害+1', + ]).set('ai',function(){ + return 0; + }); + } + event.num=num; + 'step 1' + if(result.index==0){ + if(event.index==0) target.chooseToDiscard('h',true,num); + else target.draw(num); + } + else{ + target.addMark('dcquanjian_effect',1,false); + target.addTempSkill('dcquanjian_effect'); + event.finish(); + } + 'step 2' + target.addTempSkill('dcquanjian_disable'); + }, + ai:{ + result:{ + target:function(player,target){ + var num1=target.countCards('h'),num2=target.maxHp; + if(num1>num2) return -1; + return Math.min(5,num2)-num1; + }, + }, + }, + }, + effect:{ + charlotte:true, + trigger:{player:'damageBegin3'}, + forced:true, + onremove:true, + marktext:'谏', + content:function(){ + trigger.num+=player.countMark(event.name); + player.removeSkill(event.name); + }, + intro:{content:'下次受到的伤害+#'}, + ai:{threaten:2.5}, + }, + disable:{ + charlotte:true, + mod:{ + cardEnabled2:function(card){ + if(get.position(card)=='h') return false; + }, + }, + mark:true, + marktext:'禁', + intro:{content:'不能使用或打出手牌'}, + ai:{threaten:2.5}, + }, + }, + }, + dctujue:{ + audio:2, + trigger:{player:'dying'}, + direct:true, + limited:true, + skillAnimation:true, + animationColor:'gray', + filter:function(event,player){ + return player.countCards('he')>0; + }, + content:function(){ + 'step 0' + player.chooseTarget(lib.filter.notMe,get.prompt2('dctujue')).set('ai',function(target){ + if(_status.event.skip) return 0; + return 200+get.attitude(_status.event.player,target); + }).set('skip',player.countCards('hs',{name:['tao','jiu']})+player.hp>0); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('dctujue',target); + var cards=player.getCards('he'); + target.gain(cards,player,'giveAuto'); + player.recover(cards.length); + player.draw(cards.length); + } + }, + }, + //尹夫人 + dcyingyu:{ + audio:2, + trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, + direct:true, + filter:function(event,player){ + if(event.name=='phaseJieshu'&&!player.storage.dcyingyu) return false; + return game.countPlayer(function(current){ + return current.countCards('h')>0; + })>1; + }, + content:function(){ + 'step 0' + player.chooseTarget(2,get.prompt('dcyingyu'),'展示两名角色的各一张手牌。若这两张牌花色不同,则你可以令其中一名角色获得另一名角色的展示牌。',function(card,player,target){ + return target.countCards('h')>0; + }).set('ai',function(target){ + var player=_status.event.player; + if(!ui.selected.targets.length) return get.attitude(player,target); + return 1-get.attitude(player,target); + }); + 'step 1' + if(result.bool){ + var targets=result.targets.sortBySeat(); + event.targets=targets; + event.cards=[]; + player.logSkill('dcyingyu',targets); + player.choosePlayerCard(targets[0],true,'h'); + } + else event.finish(); + 'step 2' + var card=result.cards[0]; + player.line(targets[0]); + player.showCards(card,get.translation(player)+'对'+get.translation(targets[0])+'发动了【媵语】') + event.cards.push(card); + player.choosePlayerCard(targets[1],true,'h'); + 'step 3' + var card=result.cards[0]; + player.line(targets[1]); + player.showCards(card,get.translation(player)+'对'+get.translation(targets[1])+'发动了【媵语】') + event.cards.push(card); + if(get.suit(cards[0],targets[0])==get.suit(cards[1],targets[1])) event.finish(); + 'step 4' + var str1=get.translation(targets[0]),str2=get.translation(targets[1]); + player.chooseControl('cancel2').set('choiceList',[ + '令'+str1+'获得'+str2+'的'+get.translation(cards[1]), + '令'+str2+'获得'+str1+'的'+get.translation(cards[0]), + ]).set('goon',get.attitude(player,targets[0])>0?0:1).set('ai',()=>_status.event.goon); + 'step 5' + if(result.control!='cancel2'){ + var i=result.index; + targets[i].gain(cards[1-i],targets[1-i],'give'); + } + }, + onremove:true, + }, + dcyongbi:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + return player.countCards('h')>0&&game.hasPlayer((current)=>lib.skill.dcyongbi.filterTarget(null,player,current)); + }, + filterTarget:function(card,player,target){ + return target!=player&&target.hasSex('male'); + }, + selectCard:-1, + filterCard:true, + position:'h', + limited:true, + skillAnimation:true, + animationColor:'fire', + discard:false, + lose:false, + content:function(){ + 'step 0' + player.awakenSkill('dcyongbi'); + if(player.hasSkill('dcyingyu',null,null,false)) player.storage.dcyingyu=true; + target.gain(cards,player,'giveAuto'); + 'step 1' + var list=[]; + for(var i of cards){ + list.add(get.suit(i,player)); + if(list.length>=3) break; + } + if(list.length>=2){ + player.addMark('dcyongbi_eff1',2,false); + player.addSkill('dcyongbi_eff1'); + target.addMark('dcyongbi_eff1',2,false); + target.addSkill('dcyongbi_eff1'); + } + if(list.length>=3){ + player.addMark('dcyongbi_eff2',1,false); + player.addSkill('dcyongbi_eff2'); + target.addMark('dcyongbi_eff2',1,false); + target.addSkill('dcyongbi_eff2'); + } + }, + ai:{ + order:1, + result:{ + target:function(player,target){ + if(player.hasUnknown()) return 0; + var zhu=get.zhu(player); + if(zhu&&get.attitude(player,zhu)>0){ + if(target==zhu) return 4; + } + return 1; + }, + }, + }, + subSkill:{ + eff1:{ + mod:{ + maxHandcard:(player,num)=>num+player.countMark('dcyongbi_eff1'), + }, + charlotte:true, + onremove:true, + marktext:'拥', + intro:{content:'手牌上限+#'}, + }, + eff2:{ + trigger:{player:'damageBegin4'}, + forced:true, + filter:function(event,player){ + return event.num>1; + }, + content:function(){ + trigger.num-=player.countMark('dcyongbi_eff2'); + }, + charlotte:true, + onremove:true, + marktext:'嬖', + intro:{content:'受到大于1的伤害时,此伤害-#'}, + }, + }, + }, + //全惠解 + dchuishu:{ + audio:2, + getList:function(player){ + if(!player.storage.dchuishu) return [3,1,2]; + return player.storage.dchuishu.slice(0); + }, + trigger:{player:'phaseDrawEnd'}, + content:function(){ + 'step 0' + var list=lib.skill.dchuishu.getList(player); + event.list=list; + player.draw(list[0]); + 'step 1' + player.storage.dchuishu_effect=event.list[2]; + player.addTempSkill('dchuishu_effect'); + player.chooseToDiscard('h',true,event.list[1]); + }, + onremove:true, + mark:true, + intro:{ + markcount:function(storage,player){ + var list=lib.skill.dchuishu.getList(player); + return Math.max.apply(Math,list); + }, + content:function(storage,player){ + var list=lib.skill.dchuishu.getList(player); + return '摸牌阶段结束时,你可以摸['+list[0]+']张牌。若如此做:你弃置['+list[1]+']张手牌,且当你于本回合内弃置第['+list[2]+']+1张牌后,你从弃牌堆中获得一张锦囊牌。'; + }, + }, + subSkill:{ + effect:{ + audio:'dchuishu', + trigger:{ + player:'loseAfter', + global:'loseAsyncAfter', + }, + forced:true, + popup:false, + charlotte:true, + onremove:true, + filter:function(event,player){ + var num=player.storage.dchuishu_effect; + if(typeof num!='number') return false; + if(event.type!='discard'||event.getlx===false) return false; + var evt=event.getl(player); + if(evt.cards2.length==0) return false; + var prev=0,goon=true; + player.getHistory('lose',function(evt){ + if(!goon||evt.type!='discard') return false; + prev+=evt.cards2.length; + if(evt==event||event.getParent()==event){ + goon=false; + return false; + } + }); + return prev>num; + }, + content:function(){ + player.removeSkill('dchuishu_effect'); + var card=get.discardPile(function(card){ + return get.type2(card)=='trick'; + }); + if(card) player.gain(card,'gain2'); + }, + }, + }, + }, + dcyishu:{ + audio:2, + trigger:{ + player:['loseAfter'], + global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + }, + forced:true, + filter:function(event,player){ + var evt=event.getl(player); + if(!evt||!evt.cards2.length) return false; + return !player.isPhaseUsing()&&player.hasSkill('dchuishu',null,null,false); + }, + content:function(){ + 'step 0' + var list=lib.skill.dchuishu.getList(player); + var min=list[0]; + for(var i of list){ + if(i>min) min=i; + } + var exps=['摸牌数[','弃牌数[','目标牌数[']; + var choices=[]; + for(var i=0;i=5) return true; + } + return false; + }, + skillAnimation:true, + animationColor:'wood', + content:function(){ + 'step 0' + player.awakenSkill('dcligong'); + player.gainMaxHp(); + player.recover(); + 'step 1' + player.removeSkill('dcyishu'); + 'step 2' + var list; + if(_status.characterlist){ + list=[]; + for(var i=0;i<_status.characterlist.length;i++){ + var name=_status.characterlist[i]; + if(lib.character[name][1]=='wu'&&(lib.character[name][0]=='female'||lib.character[name][0]=='double')) list.push(name); + } + } + else if(_status.connectMode){ + list=get.charactersOL(function(i){ + return lib.character[i][1]!='wu'||(lib.character[i][0]!='female'&&lib.character[i][0]!='double'); + }); + } + else{ + list=get.gainableCharacters(function(info){ + return info[1]=='wu'&&(info[0]=='female'||info[0]=='double'); + }); + } + var players=game.players.concat(game.dead); + for(var i=0;i'; + td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ + if(_status.dragged) return; + if(_status.justdragged) return; + _status.tempNoButton=true; + setTimeout(function(){ + _status.tempNoButton=false; + },500); + var link=this.link; + if(!this.classList.contains('bluebg')){ + if(rSkill.length>=2) return; + rSkill.add(link); + this.classList.add('bluebg'); + } + else{ + this.classList.remove('bluebg'); + rSkill.remove(link); + } + }); + } + dialog.content.appendChild(table); + dialog.add('  '); + dialog.open(); + + event.switchToAuto=function(){ + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing=false; + }; + event.control=ui.create.control('ok',function(link){ + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing=false; + }); + for(var i=0;i_status.currentPhase, filter:function(event,player){ @@ -1592,20 +2564,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(evtx3.gaintag_map[i].contains('dcliuzhuan_tag')) return true; } }); + return false; } - if(event.player!=current||event.position!=ui.discardPile) return false; - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].contains('dcliuzhuan_tag')) return true; + else if(event.name=='lose'){ + if(event.player!=current||event.position!=ui.discardPile) return false; + for(var i in event.gaintag_map){ + if(event.gaintag_map[i].contains('dcliuzhuan_tag')) return true; + } + return false; } - return false; + return current.hasHistory('lose',function(evt){ + if(evt.getParent()!=event||evt.position!=ui.discardPile) return false; + for(var i in evt.gaintag_map){ + if(evt.gaintag_map[i].contains('dcliuzhuan_tag')) return true; + } + }); }, content:function(){ var cards,current=_status.currentPhase; if(trigger.name=='lose') cards=trigger.hs.filter(function(i){ return trigger.gaintag_map[i.cardid]&&trigger.gaintag_map[i.cardid].contains('dcliuzhuan_tag')&&get.position(i,true)=='d'; }); - else{ - var evtx=trigger.getParent();; + else if(trigger.name=='cardsDiscard'){ + var evtx=trigger.getParent(); var evtx2=(evtx.relatedEvent||evtx.getParent()); var bool=false; var history=current.getHistory('lose',function(evtx3){ @@ -1622,6 +2603,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return false; }); } + else{ + cards=[]; + current.getHistory('lose',function(evt){ + if(evt.getParent()!=trigger||evt.position!=ui.discardPile) return false; + for(var card of evt.hs){ + if(get.position(card,true)!='d') continue; + var i=card.cardid; + if(evt.gaintag_map[i]&&evt.gaintag_map[i].contains('dcliuzhuan_tag')) cards.push(card); + } + }); + } if(cards&&cards.length>0) player.gain(cards,'gain2'); }, }, @@ -4902,7 +5894,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ if(event.type!='discard'||event.getlx===false||player.getExpansions('xunli').length>=9) return false; for(var i of event.cards){ - if(get.color(i,event.cards2&&event.cards2.contains(i)?event.player:false)=='black') return true; + if(get.position(i,true)=='d'&&get.color(i,event.cards2&&event.cards2.contains(i)?event.player:false)=='black') return true; } return false; }, @@ -4911,7 +5903,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=9-player.getExpansions('xunli').length; var cards=[]; for(var i of trigger.cards){ - if(get.color(i,trigger.cards2&&trigger.cards2.contains(i)?trigger.player:false)=='black') cards.push(i); + if(get.position(i,true)=='d'&&get.color(i,trigger.cards2&&trigger.cards2.contains(i)?trigger.player:false)=='black') cards.push(i); } if(cards.length<=num) event._result={ bool:true, @@ -5211,6 +6203,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:['useCard','respond']}, forced:true, filter:function(event,player){ + if(player==_status.currentPhase) return false; if(!Array.isArray(event.respondTo)) return false; if(player==event.respondTo[0]) return false; var color=get.color(event.card); @@ -5585,10 +6578,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{global:'phaseEnd'}, forced:true, filter:function(event,player){ - return player.countCards('h')<3; + return player.countCards('h')!=3; }, content:function(){ - player.drawTo(3); + var num=player.countCards('h')-3; + if(num>0) player.chooseToDiscard('h',num,true); + else player.draw(-num); }, }, //郝萌 @@ -7466,6 +8461,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, charlotte:true, logTarget:'player', + usable:1, filter:function(event,player){ if(event.player!=player.storage.rekuanshi_effect||event.player.isHealthy()) return false; var history=event.player.getHistory('damage',null,event),num=0; @@ -7474,7 +8470,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ trigger.player.recover(); - player.removeSkill('rekuanshi_effect'); } }, }, @@ -9148,10 +10143,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' var num=Math.min(5,trigger.player.hp-trigger.player.countCards('h')); if(num>0) trigger.player.draw(num); + 'step 1' trigger.player.addTempSkill('xibing2'); player._xibing=true; if(get.mode()!='guozhan'||player.isUnseen(2)||trigger.player.isUnseen(2)) event.finish(); - 'step 1' + 'step 2' var target=trigger.player; var players1=[player.name1,player.name2]; var players2=[target.name1,target.name2]; @@ -9164,7 +10160,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ]).set('players',players1).set('complexSelect',true).set('filterButton',function(button){ return !get.is.jun(button.link)&&(ui.selected.buttons.length==0)==(_status.event.players.contains(button.link)); }); - 'step 2' + 'step 3' if(result.bool){ var target=trigger.player; player.hideCharacter(player.name1==result.links[0]?0:1); @@ -9768,7 +10764,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ if(event.type!='discard'||event.getlx===false||player!=_status.currentPhase) return false; var evt=event.getl(player); - if(!evt||!evt.cards2||!evt.card2.length) return false; + if(!evt||!evt.cards2||!evt.cards2.length) return false; var list=[]; for(var i of evt.cards2){ list.add(get.suit(i,player)); @@ -9781,10 +10777,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return false; }, content:function(){ - var evt=event.getParent('phaseUse'); + var evt=trigger.getParent('phaseUse'); if(evt&&evt.player==player) evt.youyaned=true; else{ - var evt=event.getParent('phaseDiscard'); + var evt=trigger.getParent('phaseDiscard'); if(evt) evt.youyaned=true; } var list=[],cards=[]; @@ -13394,16 +14390,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ refenyin:{ audio:2, audioname:['wufan'], - trigger:{global:['loseAfter','cardsDiscardAfter','loseAsyncAfter']}, + trigger:{global:['loseAfter','cardsDiscardAfter','loseAsyncAfter','equipAfter']}, forced:true, filter:function(event,player){ if(player!=_status.currentPhase) return false; - if(event.name.indexOf('lose')==0&&(event.getlx===false||event.position!=ui.discardPile)) return false; + var cards=event.getd(); + if(!cards.length) return false; var list=[]; - var num=event.cards.length; - for(var i=0;ievent.target.countCards('h')&&event.target.countCards('he')>0&&player.hasCard(function(card){ + return lib.filter.cardDiscardable(card,player,'dcmffengshi'); + },'he'); + }, + logTarget:function(event,player){ + return player==event.player?event.target:event.player; + }, + prompt2:function(event,player){ + var target=lib.skill.dcmffengshi.logTarget(event,player); + return '弃置你与'+get.translation(target)+'的各一张牌,然后令'+get.translation(event.card)+'的伤害+1'; + }, + check:function(event,player){ + var viewer=player,player=event.player,target=event.target; + if(viewer==player){ + if(get.attitude(viewer,target)>=0) return false; + if(player.countCards('he',(card)=>get.value(card,player)<5)) return true; + var card=_status.event.getTrigger().card; + if((get.tag(card,'damage')||target.countCards('he',(card)=>get.value(card,target)>6))&&player.countCards('he',(card)=>get.value(card,player)<7)) return true; + return false; + } + else{ + if(get.attitude(viewer,player)>=0) return false; + if(!get.tag(card,'damage')) return false; + if(viewer.countCards('he')>player.countCards('he')) return true; + if(viewer.countCards('he',(card)=>get.value(card,target)>6)) return false; + return true; + } + }, + content:function(){ + if(get.tag(trigger.card,'damage')) trigger.getParent().baseDamage++; + var target=lib.skill.dcmffengshi.logTarget(trigger,player); + player.chooseToDiscard('he',true); + player.discardPlayerCard(target,'he',true); + }, + }, mffengshi:{ audio:2, audioname:['sp_mifangfushiren'], @@ -18033,6 +19073,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ subtype:'equip5', skills:['dagongche_skill'], cardPrompt:function(card){ + if(!card.storage) return '出牌阶段开始时,你可以视为使用一张【杀】,且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其一张牌。若此【大攻车】未被强化,则其他角色无法弃置你装备区内的【大攻车】。当此牌离开你的装备区后,销毁之。'; var str='出牌阶段开始时,你可以视为使用一张'; if(card.storage.大攻车选项一) str+='无距离限制且无视防具的'; str+='【杀】'; @@ -18158,6 +19199,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ liuhui:'刘徽(约225年—约295年),汉族,山东滨州邹平市人,魏晋期间伟大的数学家,中国古典数学理论的奠基人之一。在中国数学史上作出了极大的贡献,他的杰作《九章算术注》和《海岛算经》,是中国最宝贵的数学遗产。刘徽思想敏捷,方法灵活,既提倡推理又主张直观。他是中国最早明确主张用逻辑推理的方式来论证数学命题的人。刘徽的一生是为数学刻苦探求的一生。他虽然地位低下,但人格高尚。他不是沽名钓誉的庸人,而是学而不厌的伟人,他给我们中华民族留下了宝贵的财富。2021年5月,国际天文学联合会(IAU)批准中国在嫦娥五号降落地点附近月球地貌的命名,刘徽(liuhui)为八个地貌地名之一。', zhangfen:'张奋,徐州彭城(今江苏徐州)人。三国时期孙吴将领,辅吴将军张昭的侄子。善于制作攻城器械。在步骘举荐下,担任将军,累迁平州都督,册封乐乡亭侯,病逝于任上。', dukui:'杜夔[kuí],字公良,河南人,擅长音律,聪明过人。管弦等各种乐器,他无所不能。他长期总管歌舞音乐,精心研究,继承复兴了前代古乐,并有所创新。仕于曹操、曹丕之世,以通晓音乐称于世。早年任雅乐郎,汉中平五年(188年),因病离职。州郡的司徒以礼相请,他因时世混乱而奔荆州。荆州牧刘表的儿子刘琮投降曹操后,曹操以杜夔为军谋祭酒 ,参与太乐署之事,令他创制雅乐。魏文帝曹丕黄初年间,任太乐令、协律都尉。', + quanhuijie:'全皇后(244年-301年),吴郡钱塘(今浙江杭州)人,吴废帝孙亮的皇后,全尚之女,母孙恭之女。吴大帝长女全公主的侄孙女。赤乌十三年(250年),因全公主推荐全氏被册为孙亮的太子妃,建兴二年(253年),全氏被立为皇后。太平三年(258年),孙亮被权臣孙綝贬为会稽王,全皇后也一同贬为会稽王夫人。永安三年(260年),全皇后随夫到侯官,孙亮在途中死去,全皇后在侯官居住二十余年,吴亡后返回吴郡,永宁元年(301年)去世。', + yinfuren:'尹夫人,原汉大将军何进的儿媳,丈夫早逝,生有一子何晏。曹操任司空时娶尹氏为妾,一并收养何晏,并生有一子曹矩。', + chengui:'陈珪(生卒年不详),一作圭,字汉瑜。徐州下邳(治今江苏睢宁西北)人,广汉太守陈亹之孙,太尉陈球之侄,吴郡太守陈瑀(一作陈璃)、汝阴太守陈琮的从兄,陈登、陈应之父。官至沛相。', + dingshangwan:'丁尚涴,又名丁夫人。东汉末年权臣曹操的原配夫人。丁尚涴嫁给曹操时,曹操另有刘夫人,生长子曹昂和清河长公主。后刘夫人早亡,曹昂便由丁尚涴抚养,丁尚涴视其为己出。
建安二年(公元197年),曹昂随军出征宛城,战死沙场。丁尚涴悲痛欲绝,口出怨言数落曹操,又悲啼不止。曹操恼羞成怒,将其打发回了娘家。不久之后,心生悔意的曹操亲自前往丁家,打算将丁尚涴接回。然而丁尚涴却只是闷头织布。曹操手抚其背,说:“顾我共载归乎!”丁尚涴依旧不理不睬。曹操走到门口,又回过头:“得无尚可邪!”然而依旧得不到回应,只得感叹:“真诀矣。”于是与之和离,并让丁家允许她改嫁,丁家不敢为之。
丁尚涴去世后,卞夫人请求曹操安葬她,于是葬在许城以南。后来曹操病重,知道自己时日无多,临终前叹道:“我前后行意,于心未曾有所负也。假令死而有灵,子修若问‘我母所在’,我将何辞以答!”', }, characterTitle:{ wulan:'#b对决限定武将', @@ -18254,6 +19299,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else str1=(''+str1+''); return str+str1+str2+'(X为该阴阳态剩余选项的数量)。'; }, + dchuishu:function(player){ + var list=lib.skill.dchuishu.getList(player); + return '摸牌阶段结束时,你可以摸['+list[0]+']张牌。若如此做:你弃置['+list[1]+']张手牌,且当你于本回合内弃置第['+list[2]+']+1张牌后,你从弃牌堆中获得一张锦囊牌。'; + }, }, perfectPair:{}, characterReplace:{ @@ -18292,6 +19341,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dc_wangchang:['dc_wangchang','tw_wangchang'], liuba:['dc_liuba','liuba'], lvkuanglvxiang:['lvkuanglvxiang','dc_lvkuanglvxiang'], + dc_huangquan:['dc_huangquan','xf_huangquan'], }, translate:{ lijue:"李傕", @@ -18428,7 +19478,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ lskuizhu:'馈珠', lskuizhu_info:'出牌阶段结束时,你可以选择体力值为全场最多的一名其他角色,将手牌摸至与该角色相同(最多摸至五张),然后该角色观看你的手牌,弃置任意张手牌并从观看的牌中获得等量的牌。若其获得的牌大于一张,则你选择一项:移去一个“珠”;或令其对其攻击范围内的一名角色造成1点伤害。', xpchijie:'持节', - xpchijie_info:'每回合限一次。①当你受到其他角色使用的牌造成的伤害时,你可以令此牌对所有目标无效。②其他角色使用的牌结算完成时,若你是此牌的目标之一且此牌未造成过伤害,则你可以获得此牌对应的所有实体牌。', + xpchijie_info:'每回合限一次。①当你其他角色使用的牌对你结算结束后,你可以令此牌对所有后续目标无效。②其他角色使用的牌结算完成时,若你是此牌的目标之一且此牌未造成过伤害,则你可以获得此牌对应的所有实体牌。', xpchijie2:'持节', yinju:'引裾', yinju_info:'限定技,出牌阶段,你可以选择一名其他角色。若如此做,当你于此阶段内使用牌指定其为目标后,你与其各摸一张牌;当你即将对其造成伤害时,防止此伤害,然后其回复等量的体力。', @@ -18854,10 +19904,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nhyanzheng_info:'准备阶段,若你的手牌数大于1,你可以保留一张手牌并弃置其余的牌,然后选择至多等于弃牌数量的角色,对这些角色各造成1点伤害。', re_kanze:'阚泽', rekuanshi:'宽释', - rekuanshi_info:'结束阶段,你可以选择一名角色。你获得如下一次性效果直到你下回合开始:当其于一回合内受到第2点伤害后,其回复1点体力。', + rekuanshi_info:'结束阶段,你可以选择一名角色。你获得如下效果直到你下回合开始:每回合限一次,当其于一回合内受到第2点伤害后,其回复1点体力。', sp_mifangfushiren:'糜芳傅士仁', mffengshi:'锋势', mffengshi_info:'当你使用牌指定唯一目标后,或成为其他角色使用牌的唯一目标后,若此牌使用者的手牌数大于此牌目标的手牌数,则此牌的使用者可令你弃置自己和对方的各一张牌,并令此牌的伤害值+1。', + dcmffengshi:'锋势', + dcmffengshi_info:'当你使用牌指定唯一目标后,或成为其他角色使用牌的唯一目标后,若此牌使用者的手牌数大于此牌目标的手牌数,则你可弃置自己和对方的各一张牌,并令此牌的伤害值+1。', tongyuan:'童渊', chaofeng:'朝凤', chaofeng_info:'出牌阶段限一次。当你造成伤害时,你可以弃置一张牌,然后摸一张牌。若此伤害的渠道为牌且你弃置的牌:与此牌颜色相同,则你改为摸两张牌;与此牌类型相同,则此伤害+1。', @@ -18961,7 +20013,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ channi:'谗逆', channi_info:'出牌阶段限一次。你可将任意张手牌交给一名其他角色,然后其可以将等量的手牌当做【决斗】使用。若其因此【决斗】造成了伤害,则其摸X张牌(X为此【决斗】对应的实体牌数)。若其因此【决斗】受到过伤害,则你弃置所有手牌。', nifu:'匿伏', - nifu_info:'锁定技。一名角色的回合结束时,你将手牌摸至三张。', + nifu_info:'锁定技。一名角色的回合结束时,你将手牌摸至或弃置至三张。', wufan:'吴范', tianyun:'天运', tianyun_info:'①游戏的第一个回合开始前,你从牌堆中获得手牌区内没有的花色的各一张牌。②一名角色的回合开始时,若其座位号等于游戏轮数,则你可观看牌堆顶的X张牌并以任意顺序置于牌堆顶。若你将所有的牌均置于了牌堆底,则你可以令一名角色摸X张牌,然后失去1点体力。(X为你手牌中包含的花色数)', @@ -18976,7 +20028,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ bingjie:'秉节', bingjie_info:'出牌阶段开始时,你可减1点体力上限,然后当你于本阶段内使用【杀】或普通锦囊牌指定其他角色为目标后,其弃置一张牌。', zhengding:'正订', - zhengding_info:'锁定技。当你于回合外使用或打出牌响应其他角色使用的牌时,若这两张牌花色相同,则你加1点体力上限。', + zhengding_info:'锁定技。当你于回合外使用或打出牌响应其他角色使用的牌时,若这两张牌颜色相同,则你加1点体力上限。', licaiwei:'李采薇', yijiao:'异教', yijiao_info:'出牌阶段限一次,你可以选择一名没有“异”标记的其他角色并声明一个整数X(X∈[1,4]),该角色获得10X个“异”标记。有“异”标记的角色的结束阶段,其移去“异”标记,且若其本回合使用牌的点数之和:1.小于“异”标记数,其随机弃置一张手牌;2.等于“异”标记数,该角色本回合结束后进行一个额外的回合;3.大于“异”标记数,你摸两张牌。', @@ -19175,6 +20227,36 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcshuhe_info:'出牌阶段限一次,你可以展示一张手牌。若场上有与此牌点数相同的牌,则你获得这些牌;否则你将此牌交给一名其他角色并获得一枚“爵”。', dcliehou:'列侯', dcliehou_info:'锁定技。摸牌阶段开始时,你令额定摸牌数+X;然后此摸牌阶段结束时,你选择一项:⒈弃置X张牌。⒉失去1点体力(X为你的“爵”数+1且至多为5)。', + quanhuijie:'全惠解', + dchuishu:'慧淑', + dchuishu_info:'摸牌阶段结束时,你可以摸[3]张牌。若如此做:你弃置[1]张手牌,且当你于本回合内弃置第[2]+1张牌后,你从弃牌堆中获得一张锦囊牌。', + dcyishu:'易数', + dcyishu_info:'锁定技。当你不因出牌阶段而失去牌后,你令〖慧淑〗的中括号内最大的一个数字-1,然后令〖慧淑〗的中括号内最小的一个数字+2。', + dcligong:'离宫', + dcligong_info:'觉醒技。准备阶段,若〖慧淑〗的中括号内有不小于5的数字,则你加1点体力上限,回复1点体力并失去〖易数〗。系统随机检索四张吴势力的女性武将牌,然后你选择一项:⒈摸两张牌。⒉失去〖慧淑〗,然后获得这些武将牌上的任意两个非Charlotte技能。', + yinfuren:'尹夫人', + dcyingyu:'媵语', + dcyingyu_info:'准备阶段开始时,你可以展示两名角色的各一张手牌。若这两张牌的花色不同,则你可以令一名角色获得另一名角色的展示牌。', + dcyongbi:'拥嬖', + dcyongbi_info:'限定技。出牌阶段,你可以将所有手牌交给一名其他男性角色。你将〖媵语〗的发动时机改为“准备阶段和结束阶段开始时”。然后若这些牌中包含的花色数:大于1,则你与其本局游戏的手牌上限+2;大于2,则当你或其于本局游戏内受到大于1的伤害时,此伤害-1。', + dc_huangquan:'黄权', + dcquanjian:'劝谏', + dcquanjian_info:'出牌阶段每项各限一次。你可以选择一项流程并选择一名其他角色A:⒈令A对其攻击范围内的另一名角色B造成1点伤害。⒉令A将手牌数调整至体力上限(至多摸至五张),且其本回合内不能使用或打出手牌。然后A选择一项:⒈执行此流程。⒉本回合下次受到的伤害+1。', + dctujue:'途绝', + dctujue_info:'限定技。当你进入濒死状态时,你可以将所有牌交给一名其他角色。然后你回复等量的体力并摸等量的牌。', + dc_huban:'胡班', + dcchongyi:'崇义', + dcchongyi_info:'①一名角色使用【杀】时,若此牌是其于当前出牌阶段内使用的第一张牌,则你可以令其摸两张牌,且其本回合使用【杀】的次数上限+1。②一名角色的出牌阶段结束时,若其于此阶段内使用的第一张牌为【杀】,则你可以令其本回合的手牌上限+1。', + chengui:'陈珪', + dcyingtu:'营图', + dcyingtu_info:'每回合限一次。当你的上家/下家于出牌阶段外获得牌后,你可以获得其一张牌,然后将一张牌交给你的下家/上家。若你给出的牌为装备牌,则其使用之。', + dccongshi:'从势', + dccongshi_info:'一名角色使用的装备牌结算结束后,若其装备区内的牌数为全场最多,则你摸一张牌。', + dingshangwan:'丁尚涴', + dcfengyan:'讽言', + dcfengyan_info:'出牌阶段每项各限一次。你可以:⒈令一名体力值不大于你的其他角色交给你一张手牌。⒉视为对一名手牌数不大于你的角色使用一张【杀】(无距离和次数限制)。', + dcfudao:'抚悼', + dcfudao_info:'游戏开始时,你选择一名其他角色,称为“继子”角色。当你或“继子”每回合首次使用牌指定对方为目标后,你与其各摸两张牌。当有角色杀死你或“继子”后,该角色称为“决裂”角色。当你或“继子”对“决裂”造成伤害后,此伤害+1。当你成为“决裂”角色使用牌的目标后,其本回合内不能再使用牌。', sp_whlw:"文和乱武", sp_zlzy:"逐鹿中原", diff --git a/character/tw.js b/character/tw.js index ec776f551..04c7ef311 100644 --- a/character/tw.js +++ b/character/tw.js @@ -500,7 +500,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return targets1.isEmpty(get.subtype(button.link)); } }).set('ai',function(button){ - var player=_status.event.player,target=_status.event.targets1,source=_status.event.targets[0]; + var player=_status.event.player,target=_status.event.targets1,source=_status.event.targets0; var att=get.attitude(player,source); if(get.position(card)=='e'){ var val=get.value(card); @@ -749,7 +749,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, twcongji:{ audio:2, - trigger:{player:'loseAfter'}, + trigger:{ + player:'loseAfter', + global:'loseAsyncAfter', + }, direct:true, filter:function(event,player){ if(player==_status.currentPhase||event.type!='discard'||event.getlx===false||!game.hasPlayer((current)=>current!=player)) return false; @@ -761,7 +764,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - var cards=[],cards2=trigger.getl(player); + var cards=[],cards2=trigger.getl(player).cards2; for(var i of cards2){ if(get.color(i,player)=='red'&&get.position(i,true)=='d') cards.push(i); } diff --git a/character/yijiang.js b/character/yijiang.js index ae3aceba5..9bf4c7af7 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -13,10 +13,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yijiang_2015:['caoxiu','caorui','zhongyao','xiahoushi','liuchen','zhangyi','zhuzhi','quancong','sunxiu','gongsunyuan','guotufengji'], yijiang_2016:['guohuanghou','sunziliufang','huanghao','liyan','sundeng','cenhun','zhangrang','liuyu'], yijiang_2017:['xinxianying','jikang','wuxian','qinmi','xuezong','xushi','caiyong','caojie'], - yijiang_2022:['lukai'], + yijiang_2022:['lukai','kebineng'], }, }, character:{ + kebineng:['male','qun',4,['kousheng']], lukai:['male','wu',4,['lkbushi','lkzhongzhuang']], xin_fazheng:['male','shu',3,['xinenyuan','xinxuanhuo'],['die_audio']], old_guanzhang:['male','shu',4,['old_fuhun']], @@ -101,6 +102,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yujin:["male","wei",4,["yizhong"],[]], }, characterIntro:{ + kebineng:'轲比能(?~235年),为中国三国时期的鲜卑首领之一。轲比能出身鲜卑支部,因他作战勇敢,执法公平,不贪财物,所以被鲜卑民众推举为大人。轲比能因其部落近塞,所以他抓住有利条件积极学习汉族先进技术和文化,促进了鲜卑族的进步和北方的民族融合。轲比能统率下的部众,战守有法,战斗力相当强大。自曹操北征后向曹氏进贡表示效忠。魏文帝时,轲比能受封附义王。轲比能在进行部落统一战争时,受魏国干涉,受沉重打击,于是对魏怀贰,献书魏帝表忠,以麻痹魏庭,使之放松警惕。此后,轲比能的部众变得强盛,控弦十余万骑,为害魏国边境。每次钞略得财物,轲比能都公开透明地均平分配,所以得部众死力,各部大人都敬畏之。实力强大后,他继续部落统一战争,于是威行诸部落,建立起强大的鲜卑族政权。深感威胁的魏国幽州刺史王雄派刺客韩龙将其刺杀,其政权立刻崩溃,鲜卑民族再次陷入混战。', lukai:'陆凯(198-269年),字敬风,吴郡吴县(今江苏省苏州市)人。三国时期吴国重臣,丞相陆逊的族侄,大司马陆抗的族兄。黄武年间,举孝廉出身,曾任永兴县长、诸暨县长,颇有治绩。拜建武都尉、儋耳太守,与聂友率军讨伐朱崖和儋耳,迁建武校尉。五凤二年(255年),讨斩零陵山贼陈毖,拜偏将军、巴丘督,册封都乡侯。迁武昌右部督,随军进入寿春。后拜荡魏将军,加号绥远将军。吴景帝孙休继位,拜征北将军、假节、领豫州牧。孙皓即位,迁任镇西大将军,都督巴丘,又领荆州牧,进封嘉兴侯。宝鼎元年(266年),迁左丞相。以正直及屡次劝谏孙皓而闻名。建衡元年(269年),去世,时年七十二。', caozhi:'字子建,沛国谯人,三国曹魏著名文学家,建安文学代表人物。魏武帝曹操之子,魏文帝曹丕之弟,生前曾为陈王,去世后谥号“思”,因此又称陈思王。南朝宋文学家谢灵运更有“天下才有一石,曹子建独占八斗”的评价。王士祯尝论汉魏以来二千年间诗家堪称“仙才”者,曹植、李白、苏轼三人耳。', gaoshun:'中国东汉末年将领,吕布帐下中郎将。史载高顺为人清白有威严,不好饮酒,所统率的部队精锐非常,号称“陷阵营”。屡进忠言于吕布,吕布虽知其忠而不能用。曹操击破吕布后,高顺被曹操所杀。', @@ -197,6 +199,113 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhonghui:['jiangwei'], }, skill:{ + //轲比能 + kousheng:{ + audio:2, + trigger:{player:'phaseUseBegin'}, + direct:true, + filter:function(event,player){ + return player.countCards('h')>0; + }, + content:function(){ + 'step 0' + player.chooseCard('h',[1,player.countCards('h')],get.prompt('kousheng'),'你可以选择任意张手牌,这些手牌于本回合内视为无次数限制的【杀】。但当有角色受到这些【杀】的伤害后,其可以用所有手牌交换剩余的牌。').set('standard',player.getUseValue({name:'sha'},null,true)).set('ai',function(card){ + var player=_status.event.player,standard=_status.event.standard; + if(standard<=0) return 0; + var eff=player.getUseValue(card,null,true); + if(eff<=standard) return standard-eff+0.1; + return 0; + }); + 'step 1' + if(result.bool){ + player.logSkill('kousheng'); + player.addGaintag(result.cards,'kousheng'); + player.addTempSkill('kousheng_effect'); + game.delayx(); + } + }, + subSkill:{ + effect:{ + audio:'kousheng', + trigger:{player:'useCard1'}, + forced:true, + charlotte:true, + firstDo:true, + filter:function(event,player){ + if(event.card.name!='sha') return false; + return player.hasHistory('lose',function(evt){ + if(evt.getParent()!=event) return false; + for(var i in evt.gaintag_map){ + if(evt.gaintag_map[i].contains('kousheng')) return true; + } + return false; + }); + }, + content:function(){ + if(!trigger.card.storage) trigger.card.storage={}; + trigger.card.storage.kousheng=true; + if(trigger.addCount!==false){ + trigger.addCount=false; + player.getStat('card').sha--; + } + }, + onremove:function(player){ + player.removeGaintag('kousheng'); + }, + mod:{ + cardUsable:function(card,player,target){ + if(card.name!='sha'||!card.cards) return; + for(var i of card.cards){ + if(i.hasGaintag('kousheng')) return Infinity; + } + }, + cardname:function(card){ + if(card.hasGaintag('kousheng')) return 'sha'; + }, + cardnature:function(card){ + if(card.hasGaintag('kousheng')) return false; + }, + }, + group:'kousheng_damage', + }, + damage:{ + audio:'kousheng', + trigger:{source:'damageSource'}, + forced:true, + filter:function(event,player){ + if(!event.card.storage||!event.card.storage.kousheng||event.getParent().type!='card') return false; + var target=event.player; + return target.isIn()&&player.hasCard(function(card){ + return card.hasGaintag('kousheng'); + },'h'); + }, + content:function(){ + 'step 0' + var target=trigger.player; + event.target=target; + var cards=player.getCards('h',function(card){ + return card.hasGaintag('kousheng'); + }); + event.cards=cards; + var str=get.translation(player); + player.showCards(cards,str+'的【寇胜】牌'); + if(target.countCards('h')>0) target.chooseBool('是否交换“寇胜”牌?','用你的所有手牌交换'+str+'的下列“寇胜”牌:'+get.translation(cards)).set('ai',function(){ + var player=_status.event.player,target=_status.event.getParent().player; + if(player.hasShan()||player.countCards('hs',{name:['tao','jiu']})>0||get.attitude(player,target)>=0) return false; + var hs1=player.getCards('h'),hs2=_status.event.getParent().cards; + if(hs2.length>=player.hp) return true; + if(get.value(hs1,player)>=get.value(hs2,target)) return false; + return true; + }); + else event.finish(); + 'step 1' + if(result.bool){ + player.swapHandcards(target,cards,target.getCards('h')); + } + }, + }, + }, + }, //陆凯 lkbushi:{ audio:2, @@ -946,42 +1055,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ "step 0" - event.videoId=lib.status.videoId++; - var func=function(card,id,bool){ - var list=[ - '为XXX多指定一个目标', - '令XXX无视防具', - '令XXX不可被抵消', - '当XXX造成伤害时摸一张牌', - ]; - var choiceList=ui.create.dialog('【奔袭】:请选择一至两项','forcebutton'); - choiceList.videoId=id; - for(var i=0;i0; - })) + })) return false; var evt=trigger.getl(player); for(var i=0;i0; + return target!=player&&target.countCards('h')>0; }).set('ai',function(target){ var player=_status.event.player; return get.damageEffect(target,player,player)/Math.sqrt(target.countCards('h')); @@ -369,13 +369,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{global:'phaseUseBegin'}, direct:true, filter:function(event,player){ - return player!=event.player&&event.player.countCards('he')>0&&player.countCards('he')>=player.countMark('xiongshu_count'); + return player!=event.player&&event.player.countCards('h')>0&&player.countCards('he')>=player.countMark('xiongshu_count'); }, content:function(){ 'step 0' event.target=trigger.player; var num=player.countMark('xiongshu_count'); - if(num>0) player.chooseToDiscard('he',num,get.prompt('xiongshu',trigger.player),'弃置'+get.cnNumber(num)+'张牌并展示其一张牌').set('goon',get.attitude(player,event.target)<0).set('ai',function(card){ + if(num>0) player.chooseToDiscard('he',num,get.prompt('xiongshu',trigger.player),'弃置'+get.cnNumber(num)+'张牌并展示其一张手牌').set('goon',get.attitude(player,event.target)<0).set('ai',function(card){ if(!_status.event.goon) return 0; return 6-_status.event.player.countMark('xiongshu_count')-get.value(card); }).logSkill=['xiongshu',trigger.player]; @@ -388,8 +388,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addTempSkill('xiongshu_count','roundStart'); player.addMark('xiongshu_count',1,false); } - if(result.bool&&target.countCards('he')>0){ - player.choosePlayerCard(target,true,'he'); + if(result.bool&&target.countCards('h')>0){ + player.choosePlayerCard(target,true,'h'); } else event.finish(); 'step 2' @@ -3685,10 +3685,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dezhang:'德彰', dezhang_info:'觉醒技。准备阶段,若你没有“绥”,则你减1点体力上限并获得〖卫戍〗。', weishu:'卫戍', - weishu_info:'锁定技。①当你于摸牌阶段外不因〖卫戊①〗而摸牌后,你令一名角色摸一张牌。②当你于弃牌阶段外不因〖卫戊②〗而弃置牌后,你弃置一名其他角色的一张牌。', + weishu_info:'锁定技。①当你于摸牌阶段外不因〖卫戍①〗而摸牌后,你令一名角色摸一张牌。②当你于弃牌阶段外不因〖卫戍②〗而弃置牌后,你弃置一名其他角色的一张牌。', jin_jiachong:'贾充', xiongshu:'凶竖', - xiongshu_info:'其他角色的出牌阶段开始时,你可弃置X张牌(X为你本轮内此前已发动过此技能的次数,为0则不弃)并展示其一张牌,然后你预测“其本阶段内是否会使用与展示牌牌名相同的牌”。此阶段结束时,若你的预测正确,则你对其造成1点伤害;否则你获得展示牌。', + xiongshu_info:'其他角色的出牌阶段开始时,你可弃置X张牌(X为你本轮内此前已发动过此技能的次数,为0则不弃)并展示其一张手牌,然后你预测“其本阶段内是否会使用与展示牌牌名相同的牌”。此阶段结束时,若你的预测正确,则你对其造成1点伤害;否则你获得展示牌。', jianhui:'奸回', jianhui_info:'锁定技。当你造成伤害后,若受伤角色为A,则你摸一张牌;当你受到伤害后,若伤害来源为A,则A弃置一张牌。(A为除本次伤害外最近一次对你造成过伤害的角色)', xinxuanbei:'选备', diff --git a/game/asset.js b/game/asset.js index 06844dea2..2af378fe2 100644 --- a/game/asset.js +++ b/game/asset.js @@ -1,5 +1,5 @@ window.noname_asset_list=[ - 'v1.9.117', + 'v1.9.117.2', 'audio/background/aozhan_chaoming.mp3', 'audio/background/aozhan_online.mp3', 'audio/background/aozhan_rewrite.mp3', @@ -194,6 +194,15 @@ window.noname_asset_list=[ 'audio/die/wangyan.mp3', 'audio/die/xiahouxuan.mp3', 'audio/die/zhangfen.mp3', + 'audio/die/chengui.mp3', + 'audio/die/dc_huangquan.mp3', + 'audio/die/dc_huban.mp3', + 'audio/die/dc_liru.mp3', + 'audio/die/dingshangwan.mp3', + 'audio/die/kebineng.mp3', + 'audio/die/quanhuijie.mp3', + 'audio/die/re_zhuhuan.mp3', + 'audio/die/yinfuren.mp3', 'audio/die/baosanniang.mp3', 'audio/die/beimihu.mp3', @@ -1093,6 +1102,42 @@ window.noname_asset_list=[ 'audio/skill/sanku2.mp3', 'audio/skill/yangkuang1.mp3', 'audio/skill/yangkuang2.mp3', + 'audio/skill/dcchongyi1.mp3', + 'audio/skill/dcchongyi2.mp3', + 'audio/skill/dccongshi1.mp3', + 'audio/skill/dccongshi2.mp3', + 'audio/skill/dcfencheng1.mp3', + 'audio/skill/dcfencheng2.mp3', + 'audio/skill/dcfengyan1.mp3', + 'audio/skill/dcfengyan2.mp3', + 'audio/skill/dcfudao1.mp3', + 'audio/skill/dcfudao2.mp3', + 'audio/skill/dchuishu1.mp3', + 'audio/skill/dchuishu2.mp3', + 'audio/skill/dcligong1.mp3', + 'audio/skill/dcligong2.mp3', + 'audio/skill/dcmieji1.mp3', + 'audio/skill/dcmieji2.mp3', + 'audio/skill/dcquanjian1.mp3', + 'audio/skill/dcquanjian2.mp3', + 'audio/skill/dctujue1.mp3', + 'audio/skill/dctujue2.mp3', + 'audio/skill/dcyingtu1.mp3', + 'audio/skill/dcyingtu2.mp3', + 'audio/skill/dcyingyu1.mp3', + 'audio/skill/dcyingyu2.mp3', + 'audio/skill/dcyishu1.mp3', + 'audio/skill/dcyishu2.mp3', + 'audio/skill/dcyongbi1.mp3', + 'audio/skill/dcyongbi2.mp3', + 'audio/skill/juece_dc_liru1.mp3', + 'audio/skill/juece_dc_liru2.mp3', + 'audio/skill/kousheng1.mp3', + 'audio/skill/kousheng2.mp3', + 'audio/skill/refenli1.mp3', + 'audio/skill/refenli2.mp3', + 'audio/skill/repingkou1.mp3', + 'audio/skill/repingkou2.mp3', 'audio/skill/aichen1.mp3', 'audio/skill/aichen2.mp3', @@ -5771,6 +5816,16 @@ window.noname_asset_list=[ 'image/character/wangyan.jpg', 'image/character/xiahouxuan.jpg', 'image/character/zhangfen.jpg', + 'image/character/chengui.jpg', + 'image/character/dc_huangquan.jpg', + 'image/character/dc_huban.jpg', + 'image/character/dc_liru.jpg', + 'image/character/dingshangwan.jpg', + 'image/character/junk_sunquan.jpg', + 'image/character/kebineng.jpg', + 'image/character/quanhuijie.jpg', + 'image/character/re_zhuhuan.jpg', + 'image/character/yinfuren.jpg', 'image/character/baiwuchang.jpg', 'image/character/baosanniang.jpg', diff --git a/game/game.js b/game/game.js index c149a9d08..2b217ee62 100644 --- a/game/game.js +++ b/game/game.js @@ -13090,8 +13090,12 @@ var evt=event; if(evt.animate!=false){ evt.discardid=lib.status.videoId++; - game.broadcastAll(function(list,id){ + game.broadcastAll(function(list,id,cards){ for(var i of list){ + for(var j of i[1]){ + j.classList.remove('glow'); + j.classList.remove('glows'); + } i[0].$throw(i[1],null,'nobroadcast'); } var cardnodes=[]; @@ -13105,7 +13109,7 @@ } } ui.todiscard[id]=cardnodes; - },event.lose_list,evt.discardid); + },event.lose_list,evt.discardid,cards); if(lib.config.sync_speed&&cards[0]&&cards[0].clone){ if(evt.delay!=false){ var waitingForTransition=get.time(); @@ -15586,6 +15590,8 @@ } } } + event.sourceSkill=logInfo.sourceSkill; + event.type=logInfo.type; player.getHistory('useSkill').push(logInfo); "step 1" var info=get.info(event.skill); @@ -20923,6 +20929,17 @@ } } next.setContent('gain'); + next.getd=function(player,key,position){ + if(!position) position=ui.discardPile; + if(!key) key='cards'; + var cards=[],event=this; + game.getGlobalHistory('cardMove',function(evt){ + if(evt.name!='lose'||evt.position!=position||evt.getParent()!=event) return; + if(player&&player!=evt.player) return; + cards.addArray(evt[key]); + }); + return cards; + }; next.getl=function(player){ var that=this; var map={ @@ -20990,6 +21007,17 @@ } } next.setContent('addToExpansion'); + next.getd=function(player,key,position){ + if(!position) position=ui.discardPile; + if(!key) key='cards'; + var cards=[],event=this; + game.getGlobalHistory('cardMove',function(evt){ + if(evt.name!='lose'||evt.position!=position||evt.getParent()!=event) return; + if(player&&player!=evt.player) return; + cards.addArray(evt[key]); + }); + return cards; + }; next.getl=function(player){ var that=this; var map={ @@ -21070,6 +21098,12 @@ next.cards=next.cards.slice(0); } next.setContent('lose'); + next.getd=function(player,key,position){ + if(!position) position=ui.discardPile; + if(!key) key='cards'; + if(this.getlx===false||this.position!=position||(player&&this.player!=player)||!Array.isArray(this[key])) return []; + return this[key].slice(0); + }; next.getl=function(player){ if(this.getlx!==false&&this.player==player) return this; return { @@ -21449,6 +21483,17 @@ next.setContent(lib.element.content.equip); if(get.is.object(next.card)&&next.card.cards) next.card=next.card.cards[0]; next.cards=[next.card]; + next.getd=function(player,key,position){ + if(!position) position=ui.discardPile; + if(!key) key='cards'; + var cards=[],event=this; + game.getGlobalHistory('cardMove',function(evt){ + if(evt.name!='lose'||evt.position!=position||evt.getParent()!=event) return; + if(player&&player!=evt.player) return; + cards.addArray(evt[key]); + }); + return cards; + }; next.getl=function(player){ var that=this; var map={ @@ -21492,6 +21537,17 @@ } next.player=this; next.setContent('addJudge'); + next.getd=function(player,key,position){ + if(!position) position=ui.discardPile; + if(!key) key='cards'; + var cards=[],event=this; + game.getGlobalHistory('cardMove',function(evt){ + if(evt.name!='lose'||evt.position!=position||evt.getParent()!=event) return; + if(player&&player!=evt.player) return; + cards.addArray(evt[key]); + }); + return cards; + }; next.getl=function(player){ var that=this; var map={ @@ -21860,6 +21916,17 @@ } } } + var next=game.createEvent('logSkill',false),evt=_status.event; + next.player=player; + next.forceDie=true; + evt.next.remove(next); + if(evt.logSkill) evt=evt.getParent(); + for(var i in logInfo){ + if(i=='event') next.log_event=logInfo[i]; + else next[i]=logInfo[i]; + } + evt.after.push(next); + next.setContent('emptyEvent'); player.getHistory('useSkill').push(logInfo); } if(this._hookTrigger){ @@ -22823,9 +22890,12 @@ game.broadcastAll(function(player,skill){ player.skills.remove(skill); player.hiddenSkills.remove(skill); + delete player.tempSkills[skill]; + for(var i in player.additionalSkills){ + player.additionalSkills[i].remove(skill); + } },this,skill); this.checkConflict(skill); - delete this.tempSkills[skill]; if(info){ if(info.onremove){ if(typeof info.onremove=='function'){ @@ -26486,6 +26556,9 @@ if(zoom) buttons.classList.add('smallzoom'); this.buttons=this.buttons.concat(ui.create.buttons(item,'player',buttons,noclick)); } + else if(item[1]=='textbutton'){ + ui.create.textbuttons(item[0],this,noclick); + } else{ var buttons=ui.create.div('.buttons',this.content); if(zoom) buttons.classList.add('smallzoom'); @@ -29376,6 +29449,17 @@ }, loseAsync:function(arg){ var next=game.createEvent('loseAsync'); + next.getd=function(player,key,position){ + if(!position) position=ui.discardPile; + if(!key) key='cards'; + var cards=[],event=this; + game.getGlobalHistory('cardMove',function(evt){ + if(evt.name!='lose'||evt.position!=position||evt.getParent()!=event) return; + if(player&&player!=evt.player) return; + cards.addArray(evt[key]); + }); + return cards; + }; next.getl=function(player){ var that=this; var map={ @@ -29431,6 +29515,9 @@ var next=game.createEvent('cardsDiscard'); next.cards=type=='cards'?cards.slice(0):[cards]; next.setContent('cardsDiscard'); + next.getd=function(player,key,position){ + return this.cards.slice(0); + }; return next; }, cardsGotoOrdering:function(cards){ @@ -33770,151 +33857,152 @@ } }, loop:function(){ - var event=_status.event; - var step=event.step; - var source=event.source; - var player=event.player; - var target=event.target; - var targets=event.targets; - var card=event.card; - var cards=event.cards; - var skill=event.skill; - var forced=event.forced; - var num=event.num; - var trigger=event._trigger; - var result=event._result; - if(_status.paused2||_status.imchoosing){ - if(!lib.status.dateDelaying){ - lib.status.dateDelaying=new Date(); + while(true){ + var event=_status.event; + var step=event.step; + var source=event.source; + var player=event.player; + var target=event.target; + var targets=event.targets; + var card=event.card; + var cards=event.cards; + var skill=event.skill; + var forced=event.forced; + var num=event.num; + var trigger=event._trigger; + var result=event._result; + if(_status.paused2||_status.imchoosing){ + if(!lib.status.dateDelaying){ + lib.status.dateDelaying=new Date(); + } } - } - if(_status.paused||_status.paused2||_status.over){ - return; - } - if(_status.paused3){ - _status.paused3='paused'; - return; - } - if(lib.status.dateDelaying){ - lib.status.dateDelayed+=lib.getUTC(new Date())-lib.getUTC(lib.status.dateDelaying); - delete lib.status.dateDelaying; - } - if(event.next.length>0){ - var next=event.next.shift(); - if(next.player&&next.player.skipList.contains(next.name)){ - event.trigger(next.name+'Skipped'); - next.player.skipList.remove(next.name); - if(lib.phaseName.contains(next.name)) next.player.getHistory('skipped').add(next.name); + if(_status.paused||_status.paused2||_status.over){ + return; } - else{ - next.parent=event; - _status.event=next; + if(_status.paused3){ + _status.paused3='paused'; + return; } - } - else if(event.finished){ - if(event._triggered==1){ - if(event.type=='card') event.trigger('useCardToOmitted'); - event.trigger(event.name+'Omitted'); - event._triggered=4; + if(lib.status.dateDelaying){ + lib.status.dateDelayed+=lib.getUTC(new Date())-lib.getUTC(lib.status.dateDelaying); + delete lib.status.dateDelaying; } - else if(event._triggered==2){ - if(event.type=='card') event.trigger('useCardToEnd'); - event.trigger(event.name+'End'); - event._triggered=3; - } - else if(event._triggered==3){ - if(event.type=='card') event.trigger('useCardToAfter'); - event.trigger(event.name+'After'); - event._triggered++; - } - else if(event.after&&event.after.length){ - var next=event.after.shift(); + if(event.next.length>0){ + var next=event.next.shift(); if(next.player&&next.player.skipList.contains(next.name)){ event.trigger(next.name+'Skipped'); next.player.skipList.remove(next.name); - if(lib.phaseName.contains(next.name)) next.player.getHistory('skipped').add(next.name) + if(lib.phaseName.contains(next.name)) next.player.getHistory('skipped').add(next.name); } else{ next.parent=event; _status.event=next; } } - else{ - if(event.parent){ - if(event.result){ - event.parent._result=event.result; - } - _status.event=event.parent; + else if(event.finished){ + if(event._triggered==1){ + if(event.type=='card') event.trigger('useCardToOmitted'); + event.trigger(event.name+'Omitted'); + event._triggered=4; } - else{ - return; + else if(event._triggered==2){ + if(event.type=='card') event.trigger('useCardToEnd'); + event.trigger(event.name+'End'); + event._triggered=3; } - } - } - else{ - if(event._triggered==0){ - if(event.type=='card') event.trigger('useCardToBefore'); - event.trigger(event.name+'Before'); - event._triggered++; - } - else if(event._triggered==1){ - if(event.type=='card') event.trigger('useCardToBegin'); - if(event.name=='phase'&&!event._begun){ - var next=game.createEvent('phasing',false,event); - next.player=event.player; - next.skill=event.skill; - next.setContent('phasing'); - event._begun=true; - } - else{ - event.trigger(event.name+'Begin'); + else if(event._triggered==3){ + if(event.type=='card') event.trigger('useCardToAfter'); + event.trigger(event.name+'After'); event._triggered++; } - } - else{ - if(player&&player.classList.contains('dead')&&!event.forceDie&&event.name!='phaseLoop'){ - game.broadcastAll(function(){ - while(_status.dieClose.length){ - _status.dieClose.shift().close(); - } - }); - if(event._oncancel){ - event._oncancel(); + else if(event.after&&event.after.length){ + var next=event.after.shift(); + if(next.player&&next.player.skipList.contains(next.name)){ + event.trigger(next.name+'Skipped'); + next.player.skipList.remove(next.name); + if(lib.phaseName.contains(next.name)) next.player.getHistory('skipped').add(next.name) } - event.finish(); - } - else if(player&&player.removed&&event.name!='phaseLoop'){ - event.finish(); - } - else if(player&&player.isOut()&&event.name!='phaseLoop'&&!event.includeOut){ - if(event.name=='phase'&&player==_status.roundStart&&!event.skill){ - _status.roundSkipped=true; + else{ + next.parent=event; + _status.event=next; } - event.finish(); } else{ - if(_status.withError||lib.config.compatiblemode||(_status.connectMode&&!lib.config.debug)){ - try{ + if(event.parent){ + if(event.result){ + event.parent._result=event.result; + } + _status.event=event.parent; + } + else{ + return; + } + } + } + else{ + if(event._triggered==0){ + if(event.type=='card') event.trigger('useCardToBefore'); + event.trigger(event.name+'Before'); + event._triggered++; + } + else if(event._triggered==1){ + if(event.type=='card') event.trigger('useCardToBegin'); + if(event.name=='phase'&&!event._begun){ + var next=game.createEvent('phasing',false,event); + next.player=event.player; + next.skill=event.skill; + next.setContent('phasing'); + event._begun=true; + } + else{ + event.trigger(event.name+'Begin'); + event._triggered++; + } + } + else{ + if(player&&player.classList.contains('dead')&&!event.forceDie&&event.name!='phaseLoop'){ + game.broadcastAll(function(){ + while(_status.dieClose.length){ + _status.dieClose.shift().close(); + } + }); + if(event._oncancel){ + event._oncancel(); + } + event.finish(); + } + else if(player&&player.removed&&event.name!='phaseLoop'){ + event.finish(); + } + else if(player&&player.isOut()&&event.name!='phaseLoop'&&!event.includeOut){ + if(event.name=='phase'&&player==_status.roundStart&&!event.skill){ + _status.roundSkipped=true; + } + event.finish(); + } + else{ + if(_status.withError||lib.config.compatiblemode||(_status.connectMode&&!lib.config.debug)){ + try{ + event.content(event,step,source,player,target,targets, + card,cards,skill,forced,num,trigger,result, + _status,lib,game,ui,get,ai); + } + catch(e){ + game.print('游戏出错:'+event.name); + game.print(e.toString()); + console.log(e); + } + } + else{ event.content(event,step,source,player,target,targets, card,cards,skill,forced,num,trigger,result, _status,lib,game,ui,get,ai); } - catch(e){ - game.print('游戏出错:'+event.name); - game.print(e.toString()); - console.log(e); - } - } - else{ - event.content(event,step,source,player,target,targets, - card,cards,skill,forced,num,trigger,result, - _status,lib,game,ui,get,ai); } + event.step++; } - event.step++; } } - game.loop(); }, pause:function(){ clearTimeout(_status.timeout); @@ -45952,6 +46040,18 @@ }, button:function(item,type,position,noclick,node){ switch(type){ + case 'tdnodes': + node=ui.create.div('.shadowed.reduce_radius.pointerdiv.tdnode.tdnodes',position); + if(Array.isArray(item)){ + node.innerHTML=''+(item[1])+''; + node.link=item[0]; + } + else{ + node.innerHTML=''+(item)+''; + node.link=item; + } + break; + case 'blank': node=ui.create.div('.button.card',position); node.link=item; @@ -46170,18 +46270,6 @@ } } break; - - case 'text': - node=ui.create.div('.button.text',position); - node.link=item; - node.innerHTML=item; - break; - - case 'textButton': - node=ui.create.div('.caption',position); - node.link=item; - node.innerHTML=item; - break; } if(!noclick){ node.addEventListener(lib.config.touchscreen?'touchend':'click',ui.click.button); @@ -46223,6 +46311,27 @@ } return buttons; }, + textbuttons:function(list,dialog,noclick){ + for(var item of list){ + var str,link; + if(Array.isArray(item)){ + str=item[1]; + link=item[0]; + } + else{ + str=item; + link=item; + } + if(str.indexOf(''; + var next=dialog.add(str); + if(!noclick) next.firstChild.addEventListener(lib.config.touchscreen?'touchend':'click',ui.click.button); + next.firstChild.link=link; + for(var j in lib.element.button){ + next[j]=lib.element.button[j]; + } + dialog.buttons.add(next.firstChild) + } + }, player:function(position,noclick){ var node=ui.create.div('.player',position); node.node={ diff --git a/game/update.js b/game/update.js index 3ccdf0e0b..6cfe94879 100644 --- a/game/update.js +++ b/game/update.js @@ -1,12 +1,11 @@ window.noname_update={ - version:'1.9.117.1', - update:'1.9.117', + version:'1.9.117.2', + update:'1.9.117.1', changeLog:[ - '露娜Q', - 'OL界典韦、邓忠、王衍、夏侯玄', - '十周年刘徽、蔡阳、吕旷吕翔、杜夔、张奋', - '其他技能调整和bug修复', - 'players://["dc_caiyang","dc_lvkuanglvxiang","dengzhong","dukui","key_kiyu","liuhui","ol_dianwei","wangyan","xiahouxuan","zhangfen"]', + '新的dialog Button', + 'OL神孙权', + '十周年界李儒、界朱桓、陈珪、黄权、胡班、丁尚涴、柯比能、全惠解、尹夫人', + '其他技能调整和bug修复', 'players://["chengui","dc_huangquan","dc_huban","dc_liru","dingshangwan","junk_sunquan","kebineng","quanhuijie","re_zhuhuan","yinfuren"]', ], files:[ //'card/extra.js', @@ -15,43 +14,43 @@ window.noname_update={ //'card/gwent.js', //'card/huanlekapai.js', //'card/mtg.js', - //'card/sp.js', - //'card/standard.js', + 'card/sp.js', + 'card/standard.js', //'card/swd.js', //'card/yunchou.js', //'card/yingbian.js', //'card/yongjian.js', //'card/zhenfa.js', //'card/zhulu.js', - //'character/diy.js', - //'character/extra.js', + 'character/diy.js', + 'character/extra.js', //'character/hearth.js', //'character/gujian.js', //'character/gwent.js', //'character/hearth.js', - //'character/mobile.js', + 'character/mobile.js', //'character/mtg.js', - //'character/offline.js', + 'character/offline.js', //'character/old.js', //'character/ow.js', - //'character/rank.js', + 'character/rank.js', 'character/refresh.js', //'character/sb.js', //'character/shenhua.js', - //'character/sp.js', - //'character/sp2.js', + 'character/sp.js', + 'character/sp2.js', //'character/standard.js', - //'character/tw.js', + 'character/tw.js', //'character/swd.js', //'character/xianjian.js', //'character/xinghuoliaoyuan.js', - //'character/yingbian.js', - //'character/yijiang.js', + 'character/yingbian.js', + 'character/yijiang.js', //'character/yxs.js', //'extension/boss/extension.js', //'font/suits.ttf', - //'layout/default/layout.css', - //'layout/default/menu.css', + 'layout/default/layout.css', + 'layout/default/menu.css', //'layout/long2/layout.css', //'layout/mobile/equip.css', //'layout/mobile/layout.css', @@ -62,13 +61,13 @@ window.noname_update={ //'mode/chess.js', //'mode/connect.js', //'mode/doudizhu.js', - //'mode/guozhan.js', + 'mode/guozhan.js', //'mode/identity.js', //'mode/single.js', //'mode/stone.js', //'mode/tafang.js', //'mode/versus.js', - //'game/game.js', + 'game/game.js', //'game/keyWords.js', //'game/NoSleep.js', //'game/config.js', diff --git a/image/character/chengui.jpg b/image/character/chengui.jpg new file mode 100644 index 000000000..fb0eeeb19 Binary files /dev/null and b/image/character/chengui.jpg differ diff --git a/image/character/dc_huangquan.jpg b/image/character/dc_huangquan.jpg new file mode 100644 index 000000000..f4a9ebcd7 Binary files /dev/null and b/image/character/dc_huangquan.jpg differ diff --git a/image/character/dc_huban.jpg b/image/character/dc_huban.jpg new file mode 100644 index 000000000..8c8dad3ff Binary files /dev/null and b/image/character/dc_huban.jpg differ diff --git a/image/character/dc_liru.jpg b/image/character/dc_liru.jpg new file mode 100644 index 000000000..004f59462 Binary files /dev/null and b/image/character/dc_liru.jpg differ diff --git a/image/character/dingshangwan.jpg b/image/character/dingshangwan.jpg new file mode 100644 index 000000000..5d4650b38 Binary files /dev/null and b/image/character/dingshangwan.jpg differ diff --git a/image/character/junk_sunquan.jpg b/image/character/junk_sunquan.jpg new file mode 100644 index 000000000..8ad29d625 Binary files /dev/null and b/image/character/junk_sunquan.jpg differ diff --git a/image/character/kebineng.jpg b/image/character/kebineng.jpg new file mode 100644 index 000000000..374e9e68b Binary files /dev/null and b/image/character/kebineng.jpg differ diff --git a/image/character/quanhuijie.jpg b/image/character/quanhuijie.jpg new file mode 100644 index 000000000..0420b425a Binary files /dev/null and b/image/character/quanhuijie.jpg differ diff --git a/image/character/re_zhuhuan.jpg b/image/character/re_zhuhuan.jpg new file mode 100644 index 000000000..e7dcfc8da Binary files /dev/null and b/image/character/re_zhuhuan.jpg differ diff --git a/image/character/yinfuren.jpg b/image/character/yinfuren.jpg new file mode 100644 index 000000000..0d6db9827 Binary files /dev/null and b/image/character/yinfuren.jpg differ diff --git a/layout/default/layout.css b/layout/default/layout.css index a438d5be9..252989f06 100644 --- a/layout/default/layout.css +++ b/layout/default/layout.css @@ -1448,10 +1448,13 @@ div:not(.handcards)>.card>.info>span, .button.card.button>.intro { top: 69px; } +.buttons { + width: 100%; +} .buttons.guanxing { min-height: 106px; - width: 90%; margin: 0px; + width: 90%; } .buttons.smallzoom { display: block; @@ -1733,7 +1736,8 @@ div:not(.handcards)>.card>.info>span, margin: 8px; } .content>.caption + .buttons:not(*:last-child){ - margin: 0 + margin-top: 0; + margin-bottom: 0; } .content>.config { height: 20px; @@ -1770,6 +1774,7 @@ div:not(.handcards)>.card>.info>span, display: block; width: 100%; font-size: 0px; + overflow-x: hidden; } .content>*{ font-size: 16px; @@ -3473,6 +3478,8 @@ div:not(.handcards)>.card>.info>span, #arena.selecting:not(.video) #me .card:not(.selectable)>.gaintag, #arena.selecting:not(.video) #me .card:not(.selectable)>.addinfo, #arena.selecting:not(.video) .dialog:not(.noselect) .button:not(.selectable):not(.noclick):not(.replaceButton), +#arena.selecting:not(.video) .dialog:not(.noselect) .textbutton:not(.selectable):not(.noclick):not(.replaceButton), +#arena.selecting:not(.video) .dialog:not(.noselect) .tdnodes:not(.selectable):not(.noclick):not(.replaceButton), .dead,.likedead { opacity: 0.6; } @@ -4569,7 +4576,7 @@ div[data-decoration="bronze"]::after{ opacity: 1; } -.selected:not(.player):not(.card):not(.button),.selectedx { +.selected:not(.tdnodes):not(.text):not(.player):not(.card):not(.button),.selectedx { box-shadow: rgba(0, 0, 0, 0.2) 0 0 0 1px,rgba(255, 0, 0, 0.4) 0 0 5px, rgba(255, 0, 0, 0.4) 0 0 12px, rgba(255, 0, 0, 0.8) 0 0 15px !important; } diff --git a/layout/default/menu.css b/layout/default/menu.css index 39f4f6a9c..12df29b8b 100644 --- a/layout/default/menu.css +++ b/layout/default/menu.css @@ -1083,6 +1083,8 @@ input.fileinput::-webkit-file-upload-button { .menubutton.blue{ background-image: linear-gradient(rgba(47,101,150,1), rgba(43, 90, 132,1)); } +.tdnodes.selected, +.text.selected, .bluebg{ background-image: linear-gradient(rgba(47,101,150,1), rgba(43, 90, 132,1)) !important; } diff --git a/mode/guozhan.js b/mode/guozhan.js index 98c42b5eb..aaede9fad 100644 --- a/mode/guozhan.js +++ b/mode/guozhan.js @@ -993,7 +993,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ for(var i of result.cards) list.add(get.type2(i)); if(list.length==result.cards.length){ target.draw(); - player.getStat('skill').sanchen--; + player.getStat('skill').gzsanchen--; player.addMark('gzsanchen',1); } } @@ -1630,7 +1630,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ forced:true, trigger:{source:'damageBegin1'}, filter:function(event,player){ - return event.card&&(event.card.name=='sha'||event.card.name=='juedou') + return event.card&&(event.card.name=='sha'||event.card.name=='juedou')&&event.getParent().type=='card'; }, content:function(){ trigger.num++; @@ -5196,6 +5196,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' var next=trigger.player.chooseBool('是否对'+get.translation(player)+'发动【米道】?','令该角色修改'+get.translation(trigger.card)+'的花色和伤害属性'); + next.set('ai',()=>false); if(player==next.player) next.setHiddenSkill(event.name); 'step 1' if(result.bool){ @@ -5878,80 +5879,6 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } }, }, - xindiaodu:{ - audio:"diaodu", - group:'xindiaodu_use', - frequent:true, - preHidden:true, - subSkill:{ - temp:{}, - use:{ - trigger:{ - global:"useCard", - }, - filter:function(event,player){ - return get.type(event.card)=='equip'&&event.player.isAlive()&& - event.player.isFriendOf(player)&&(player==event.player||player.hasSkill('xindiaodu'))&&!event.player.hasSkill('xindiaodu_temp'); - }, - direct:true, - content:function(){ - 'step 0' - var next=trigger.player.chooseBool('是否发动【调度】摸一张牌?'); - if(player.hasSkill('xindiaodu')) next.set('frequentSkill','xindiaodu'); - if(player==trigger.player) next.setHiddenSkill('xindiaodu'); - 'step 1' - if(result.bool){ - player.logSkill('xindiaodu',trigger.player); - trigger.player.draw('nodelay'); - trigger.player.addTempSkill('xindiaodu_temp'); - } - }, - }, - }, - trigger:{ - player:"phaseUseBegin", - }, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.isFriendOf(player)&¤t.countGainableCards(player,'e')>0; - }); - }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('xindiaodu'),function(card,player,current){ - return current.isFriendOf(player)&¤t.countGainableCards(player,'e')>0; - }).setHiddenSkill(event.name).ai=function(target){ - var num=1; - if(target.hasSkill('gzxiaoji')) num+=2.5; - if(target.isDamaged()&&target.getEquip('baiyin')) num+=2.5; - if(target.hasSkill('xuanlve')) num+=2; - return num; - }; - 'step 1' - if(result.bool){ - event.target1=result.targets[0]; - player.logSkill('xindiaodu',event.target1); - player.line(event.target1,'xindiaodu'); - player.gainPlayerCard(event.target1,'e',true); - } - else event.finish(); - 'step 2' - if(result.bool&&player.getCards('h').contains(result.cards[0])){ - event.card=result.cards[0]; - player.chooseTarget('是否将'+get.translation(event.card)+'交给一名其他角色?',function(card,player,current){ - return current!=player&¤t!=_status.event.target1&¤t.isFriendOf(player); - }).set('target1',event.target1); - } - else event.finish(); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - target.gain(card,player,'give'); - } - }, - }, gzbuyi:{ trigger:{global:'dyingAfter'}, usable:1, @@ -12566,9 +12493,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ huibian_info:'出牌阶段限一次,你可以选择一名魏势力角色和另一名已受伤的魏势力角色。若如此做,你对前者造成一点伤害,然后其摸两张牌,然后后者回复一点体力。', gzzongyu:'总御', gzzongyu_info:'当【六龙骖驾】进入其他角色的装备区后,你可以将你装备区内所有坐骑牌(至少一张)与【六龙骖驾】交换位置。锁定技,当你使用坐骑牌后,若场上或弃牌堆中有【六龙骖驾】,则将【六龙骖驾】置入你的装备区。', - - xindiaodu:"调度", - "xindiaodu_info":"每回合限一次,与你势力相同的角色使用装备牌时,其可以摸一张牌;出牌阶段开始时,你可以获得与你势力相同的一名角色装备区内的一张牌,然后你可以将此牌交给另一名与你势力相同的其他角色。", + yigui:"役鬼", "yigui_info":"当你首次明置此武将牌时,你将剩余武将牌堆的两张牌扣置于游戏外,称为“魂”;你可以展示一张“魂”并将其置入剩余武将牌堆,视为使用了一张本回合内未以此法使用过的基本牌或普通锦囊牌。(此牌需指定目标,且目标须为未确定势力的角色或野心家或与此“魂”势力相同的角色)", "yigui_init":"役鬼",