diff --git a/audio/die/dc_wuban.mp3 b/audio/die/dc_wuban.mp3 new file mode 100644 index 000000000..89d3aa9ea Binary files /dev/null and b/audio/die/dc_wuban.mp3 differ diff --git a/audio/die/zhugeruoxue.mp3 b/audio/die/zhugeruoxue.mp3 new file mode 100644 index 000000000..8008f234a Binary files /dev/null and b/audio/die/zhugeruoxue.mp3 differ diff --git a/audio/skill/dcnuanhui1.mp3 b/audio/skill/dcnuanhui1.mp3 new file mode 100644 index 000000000..6294394cd Binary files /dev/null and b/audio/skill/dcnuanhui1.mp3 differ diff --git a/audio/skill/dcnuanhui2.mp3 b/audio/skill/dcnuanhui2.mp3 new file mode 100644 index 000000000..fe01afd34 Binary files /dev/null and b/audio/skill/dcnuanhui2.mp3 differ diff --git a/audio/skill/dcqiongying1.mp3 b/audio/skill/dcqiongying1.mp3 new file mode 100644 index 000000000..6578d9fbb Binary files /dev/null and b/audio/skill/dcqiongying1.mp3 differ diff --git a/audio/skill/dcqiongying2.mp3 b/audio/skill/dcqiongying2.mp3 new file mode 100644 index 000000000..d4d871cee Binary files /dev/null and b/audio/skill/dcqiongying2.mp3 differ diff --git a/audio/skill/dcyouzhan1.mp3 b/audio/skill/dcyouzhan1.mp3 new file mode 100644 index 000000000..32d5f447c Binary files /dev/null and b/audio/skill/dcyouzhan1.mp3 differ diff --git a/audio/skill/dcyouzhan2.mp3 b/audio/skill/dcyouzhan2.mp3 new file mode 100644 index 000000000..ac25033b1 Binary files /dev/null and b/audio/skill/dcyouzhan2.mp3 differ diff --git a/character/huicui.js b/character/huicui.js index 157e42808..8395ae735 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -1039,6 +1039,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], }, forced:true, + direct:true, filter:function(event,player){ if(player!=_status.currentPhase) return false; return game.hasPlayer(current=>{ @@ -1058,7 +1059,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.logSkill('dcyouzhan',targets); 'step 1' var target=targets.shift(); - player.draw(); + player.draw().gaintag=['dcyouzhan']; + player.addTempSkill('dcyouzhan_limit'); target.addTempSkill('dcyouzhan_effect'); target.addMark('dcyouzhan_effect',1,false); target.addTempSkill('dcyouzhan_draw'); @@ -1066,8 +1068,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.redo(); } }, + ai:{ + damageBonus:true, + skillTagFilter:function(player,tag,arg){ + if(!arg||!arg.target||!arg.target.hasSkill('dcyouzhan_effect')) return false; + } + }, subSkill:{ effect:{ + audio:'dcyouzhan', trigger:{ player:'damageBegin3', }, @@ -1087,7 +1096,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:'本回合下一次受到的伤害+#', }, ai:{ - damageBonus:true, effect:{ target:function(card,player,target){ if(get.tag(card,'damage')) return 1+0.5*target.countMark('dcyouzhan_effect'); @@ -1105,9 +1113,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return !player.getHistory('damage').length; }, content:function(){ - player.draw(player.getHistory('lose').length); + player.draw(Math.min(3,player.getHistory('lose').length)); }, }, + limit:{ + charlotte:true, + onremove:function(player){ + player.removeGaintag('dcyouzhan'); + }, + mod:{ + ignoredHandcard:function(card,player){ + if(card.hasGaintag('dcyouzhan')) return true; + }, + cardDiscardable:function(card,player,name){ + if(name=='phaseDiscard'&&card.hasGaintag('dcyouzhan')) return false; + }, + }, + } } }, //乐蔡文姬 @@ -11317,7 +11339,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcbeifen_info:'锁定技。①当你失去牌后,若这些牌中有“胡笳”牌,你获得与你手牌中“胡笳”牌花色均不同的每种花色的牌各一张。②若你手牌中“胡笳”牌数小于不为“胡笳”牌的牌数,你使用牌无距离和次数限制。', dc_wuban:'吴班', dcyouzhan:'诱战', - dcyouzhan_info:'锁定技。当其他角色于你的回合内失去牌后,你摸一张牌,且其获得如下效果:1.其于此回合下一次受到的伤害+1;2.结束阶段,若其于此回合未受到过伤害,其摸X张牌(X为其此回合失去过牌的次数)。', + dcyouzhan_info:'锁定技。当其他角色于你的回合内失去牌后,你摸一张牌(不计入本回合的手牌上限),且其获得如下效果:1.其于此回合下一次受到的伤害+1;2.结束阶段,若其于此回合未受到过伤害,其摸X张牌(X为其此回合失去过牌的次数且至多为3)。', yue_zhoufei:'乐周妃', yue_zhoufei_prefix:'乐', dclingkong:'灵箜', diff --git a/character/jsrg.js b/character/jsrg.js index d49fa986c..9294a7aa5 100644 --- a/character/jsrg.js +++ b/character/jsrg.js @@ -1226,8 +1226,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ player.logSkill('jsrgguiji_swapback',trigger.player); player.swapHandcards(trigger.player); - player.unmarkAuto('jsrgguiji_swapback',[trigger.player]); } + player.unmarkAuto('jsrgguiji_swapback',[trigger.player]); }, intro:{ content:'$的下个出牌阶段结束时,你可以与其交换手牌' diff --git a/character/mobile.js b/character/mobile.js index 22e8c378f..f09caa344 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -5111,8 +5111,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{player:'phaseJieshuBegin'}, filter:function(event,player){ - var num=player.storage.mobileyanzhu?player.maxHp:player.hp; - return num>0; + return (player.storage.mobileyanzhu?player.maxHp:player.hp)>0; }, direct:true, content:function(){ @@ -5144,7 +5143,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } 'step 3' if(event.current&&event.current.countCards('he')){ - if(player.storage.mobileyanzhu||event.targets2.length==1) event.current.chooseCard('选择一张牌置于牌堆顶','he',true); + if(!player.storage.mobileyanzhu||event.targets2.length==1) event.current.chooseCard('选择一张牌置于牌堆顶','he',true); else event.current.chooseCardTarget({ prompt:'将一张牌置于牌堆顶,或交给其他目标角色', filterCard:true, @@ -5212,7 +5211,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.removeSkill('mobileyanzhu'); player.storage.mobileyanzhu=true; player.popup('兴学'); - game.log(player,'修改了技能','【兴学】'); + game.log(player,'修改了技能','#g【兴学】'); } else{ player.gainPlayerCard(target,true,'hej'); diff --git a/character/old.js b/character/old.js index 0e86e2529..4d2eb8b0f 100755 --- a/character/old.js +++ b/character/old.js @@ -411,12 +411,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'jiefan', enable:'chooseToUse', filter:function(event,player){ - return event.type=='dying'&&_status.currentPhase&&_status.currentPhase.isIn()&&!event.oldjiefan; + return event.type=='dying'&&_status.currentPhase&&_status.currentPhase.isIn(); }, direct:true, content:function(){ - 'step 0' - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); player.chooseToUse(function(card,player,event){ if(get.name(card)!='sha') return false; return lib.filter.filterCard.apply(this,arguments); @@ -425,13 +423,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return lib.filter.filterTarget.apply(this,arguments); }).set('logSkill','oldjiefan').set('oncard',function(){ _status.event.player.addTempSkill('oldjiefan_recover'); + }).set('custom',{ + add:{}, + replace:{ + window:()=>{ + ui.click.cancel(); + } + }, }); - 'step 1' - if(!result.bool){ - var evt=event.getParent(2); - evt.oldjiefan=true; - evt.goto(0); - } }, ai:{ save:true, @@ -440,7 +439,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, subSkill:{ recover:{ - audio:'jiefan', + // audio:'jiefan', trigger:{source:'damageBegin2'}, filter:function(event,player){ return event.getParent(4).name=='oldjiefan'; diff --git a/character/rank.js b/character/rank.js index a0d6cbdbc..d6b6dc98d 100644 --- a/character/rank.js +++ b/character/rank.js @@ -639,6 +639,7 @@ window.noname_character_rank={ 'shen_huatuo', 'dc_guansuo', 'dc_dongzhao', + 'zhugeruoxue', ], bp:[ 'chess_diaochan', diff --git a/character/refresh.js b/character/refresh.js index cb49f0a8f..1727b10e3 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -27,7 +27,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xin_zhangliang:['male','qun',4,['rejijun','refangtong']], re_simalang:['male','wei',3,['requji','rejunbing']], re_zhugedan:['male','wei',4,['regongao','rejuyi']], - re_caorui:['male','wei',3,['huituo','mingjian','rexingshuai'],['zhu']], + re_caorui:['male','wei',3,['huituo','remingjian','rexingshuai'],['zhu']], re_caochong:['male','wei',3,['rechengxiang','renxin']], ol_zhangzhang:['male','wu',3,['olzhijian','olguzheng']], re_jsp_huangyueying:['female','qun',3,['rejiqiao','relinglong']], @@ -625,6 +625,63 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, //堪比界曹冲的界曹叡 + remingjian:{ + inherit:'mingjian', + content:function(){ + player.give(cards,target); + target.addTempSkill('remingjian_buff',{player:'phaseAfter'}); + if(!target.storage.remingjian_buff) target.storage.remingjian_buff=[]; + target.storage.remingjian_buff.push(player); + target.markSkill('remingjian_buff'); + }, + subSkill:{ + buff:{ + charlotte:true, + mark:true, + marktext:'鉴', + intro:{ + content:(storage,player)=>{ + const num=storage.length; + return `
  • 被${get.translation(storage.toUniqued())}鉴识
  • 手牌上限+${num},出杀次数+${num}`; + }, + }, + onremove:true, + trigger:{ + source:'damageSource', + }, + filter:function(event,player){ + if(_status.currentPhase!=player) return false; + return player.getHistory('sourceDamage').indexOf(event)==0&&player.getStorage('remingjian_buff').some(i=>i.isIn()); + }, + content:function*(event,map){ + const player=map.player; + const masters=player.getStorage('remingjian_buff').filter(i=>i.isIn()).toUniqued().sortBySeat(_status.currentPhase); + while(masters.length){ + const master=masters.shift(); + if(!master.isIn()) continue; + const result=yield player.chooseBool(`是否令${get.translation(master)}发动一次〖恢拓〗?`).set('choice',get.attitude(player,master)>0); + if(!result.bool) continue; + if(!player.isUnderControl(true)&&!event.isOnline()) game.delayx(); + player.logSkill('remingjian_buff',master); + const next=game.createEvent('huituo'); + next.setContent(lib.skill.huituo.content); + next.player=master; + next.forced=true; + next._trigger=map.trigger; + yield next; + } + }, + mod:{ + maxHandcard:function(player,num){ + return num+player.getStorage('remingjian_buff').length; + }, + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.getStorage('remingjian_buff').length; + } + }, + } + }, + }, rexingshuai:{ audio:2, skillAnimation:true, @@ -15512,6 +15569,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rechengxiang_info:'当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于13的牌。若你得到的牌点数之和为13,你复原武将牌。', re_caorui:'界曹叡', re_caorui_prefix:'界', + remingjian:'明鉴', + remingjian_info:'出牌阶段限一次。你可以将所有手牌交给一名其他角色,然后该角色于其下个回合获得如下效果:1.手牌上限与使用【杀】的次数上限+1;2.当该角色首次造成伤害后,其可以令你发动一次〖恢拓〗。', rexingshuai:'兴衰', rexingshuai_info:'主公技,限定技。当你进入濒死状态时,你可令其他魏势力角色依次选择是否令你回复1点体力。然后这些角色依次受到1点伤害。有〖明鉴〗效果的角色于其回合内杀死角色后,你重置〖兴衰〗。', xin_zhangliang:'界张梁', diff --git a/character/shenhua.js b/character/shenhua.js index a329089be..2175b92f6 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -4165,7 +4165,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ init:function(player){ if(!player.storage.huashen){ player.storage.huashen={ - shown:[], owned:{} }; } @@ -4173,11 +4172,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ intro:{ content:function(storage,player){ var str=''; - var slist=storage.owned; - var list=[]; - for(var i in slist){ - list.push(i); - } + var list=Object.keys(storage.owned); if(list.length){ str+=get.translation(list[0]); for(var i=1;ilib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); - } - for(var i=0;ilib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); + dialog.add('
    【'+get.translation(lib.translate[skill+'_ab']||get.translation(skill).slice(0,2))+'】
    '+ + '
    '+get.skillInfoTranslation(skill,player)+'
    '); } - if(dialog.buttons[i].link==player.storage.huashen.current){ - dialog.buttons[i].classList.add('glow2'); + if(player.isUnderControl(true)){ + dialog.addSmall([list,(item,type,position,noclick,node)=>lib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); + } + else{ + dialog.addText('共有'+get.cnNumber(list.length)+'张“化身”'); } } - var skill=player.storage.huashen.current2; - if(skill){ - dialog.add('
    【'+get.translation(lib.translate[skill+'_ab']||get.translation(skill).slice(0,2))+'】
    '+ - '
    '+get.skillInfoTranslation(skill,player)+'
    '); + else{ + return '没有化身'; } } }, @@ -4425,7 +4413,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var skill=map.skill,character=map.character; if(character!=player.storage.huashen.current){ player.storage.huashen.current=character; - player.storage.huashen.shown.add(character); player.markSkill('huashen'); game.broadcastAll(function(character,player){ player.sex=lib.character[character][0]; diff --git a/character/sp.js b/character/sp.js index 60d058cd8..0dbf0d90d 100755 --- a/character/sp.js +++ b/character/sp.js @@ -12790,25 +12790,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } var name=button.link[2]; var evt=_status.event.getParent(); - if(get.type(name)=='basic'){ + if(evt.type=='phase'){ + var card={name:name,nature:button.link[3],isCard:true}; if(name=='shan') return 2; if(evt.type=='dying'){ if(get.attitude(player,evt.dying)<2) return false; if(name=='jiu') return 2.1; return 1.9; } - if(evt.type=='phase') return player.getUseValue({name:name,nature:button.link[3],isCard:true}); - return 1; + return player.getUseValue(card); } - if(!['chuqibuyi','shuiyanqijunx','juedou','nanman','wanjian','shunshou','zhujinqiyuan'].contains(name)) return 0; - var card={name:name,isCard:true}; - if(['shunshou','zhujinqiyuan'].contains(card.name)){ - if(!game.hasPlayer(function(current){ - return get.attitude(player,current)!=0&&get.distance(player,current)<=1&&player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })) return 0; - return player.getUseValue(card)-7; - } - return player.getUseValue(card)-4; + return 1; }, backup:function(links,player){ if(typeof links[1]=='number') links.reverse(); @@ -12852,10 +12844,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var name=(tag=='respondSha'?'sha':'shan'); return !player.storage.youlong2.contains(name); }, - order:1, - result:{ - player:1, + order:function(item,player){ + if(player&&_status.event.type=='phase'){ + var max=0,add=false; + var type=player.storage.youlong?'basic':'trick'; + var list=lib.inpile.filter(name=>get.type(name)==type&&!player.storage.youlong2.includes(name)); + if(list.includes('sha')) add=true; + list=list.map(namex=>{return {name:namex,isCard:true}}); + if(add) lib.inpile_nature.forEach(naturex=>list.push({name:'sha',nature:naturex,isCard:true})); + for(var card of list){ + if(player.getUseValue(card)>0){ + var temp=get.order(card); + if(temp>max) max=temp; + } + } + if(max>0) max+=0.3; + return max; + } + return 1; }, + result:{player:1}, }, }, youlong_true:{charlotte:true}, diff --git a/character/xianding.js b/character/xianding.js index ba14d158a..9315779c1 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -4,6 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'xianding', connect:true, character:{ + zhugeruoxue:['female','wei',3,['dcqiongying','dcnuanhui']], caoyi:['female','wei',4,['dcmiyi','dcyinjun']], malingli:['female','shu',3,['dclima','dcxiaoyin','dchuahuo']], wu_luxun:['male','wu',3,['dcxiongmu','dczhangcai','dcruxian']], @@ -92,7 +93,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp2_bizhe:['dc_luotong','dc_wangchang','chengbing','dc_yangbiao','ruanji'], sp2_huangjia:['caomao','liubian','dc_liuyu','quanhuijie','dingshangwan','yuanji','xielingyu','sunyu','ganfurenmifuren','dc_ganfuren','dc_mifuren','dc_shixie'], sp2_zhangtai:['guozhao','fanyufeng','ruanyu','yangwan','re_panshu'], - sp2_jinse:['caojinyu','re_sunyi','re_fengfangnv','caohua','laiyinger','zhangfen'], + sp2_jinse:['caojinyu','re_sunyi','re_fengfangnv','caohua','laiyinger','zhangfen','zhugeruoxue'], sp2_yinyu:['zhouyi','luyi','sunlingluan','caoyi'], sp2_wangzhe:['dc_daxiaoqiao','dc_sp_machao'], sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji','duanqiaoxiao','tianshangyi','malingli'], @@ -104,6 +105,152 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, skill:{ + //诸葛若雪 + dcqiongying:{ + audio:2, + enable:'phaseUse', + usable:1, + direct:true, + filter:function(event,player){ + return player.canMoveCard(); + }, + content:function*(event,map){ + const player=map.player; + event.pushHandler('onNextMoveCard',(event,option)=>{ + if(_status.connectMode&&event.step==1&&event._result.bool&&option.state=='end'){ + game.broadcastAll(()=>{ + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + }); + let result=yield player.moveCard(false,`###琼英###移动场上的一张牌,然后弃置一张与此牌花色相同的手牌(若没有则展示手牌)。`).set('logSkill','dcqiongying').set('custom',{ + add:{}, + replace:{ + window:()=>{ + if(get.event().name=='chooseTarget') ui.click.cancel(); + } + }, + }); + if(result.bool){ + const card=result.card,suit=get.suit(card); + if(!player.hasCard({suit:suit})) player.showHandcards(); + else player.chooseToDiscard({suit:suit},true,`请弃置一张${get.translation(suit)}手牌`); + } + else{ + player.getStat('skill').dcqiongying--; + } + }, + ai:{ + expose:0.2, + order:function(item,player){ + if(player.countCards('h')<=4) return 0.5; + return 9; + }, + result:{ + player:function(player){ + if(player.canMoveCard(true)) return 1; + return 0; + } + } + } + }, + dcnuanhui:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + direct:true, + filter:function(event,player){ + return game.hasPlayer(current=>current.countCards('e')); + }, + content:function*(event,map){ + const player=map.player; + let result=yield player.chooseTarget(get.prompt('dcnuanhui'),'选择一名装备区有牌的角色,该角色可以依次使用X张基本牌(X为其装备区牌数)。',(card,player,target)=>{ + return target.countCards('e'); + }).set('ai',target=>{ + return get.event('aiTarget')==target?10:0; + }).set('aiTarget',(()=>{ + const player=get.player(); + const list=get.inpileVCardList(info=>{ + return info[0]=='basic'; + }); + if(!list.length) return null; + const getUseValue=target=>{ + if(get.attitude(player,target)<=0) return -1; + const toUse=[]; + const hp=target.hp; + let eff=0,count=target.countCards('e'); + while(count--){ + target.hp=Math.min(target.maxHp,target.hp+toUse.filter(card=>card.name=='tao').length); + const listx=list.map(info=>{ + const card=new lib.element.VCard({name:info[2],nature:info[3],isCard:true}); + return [card,target.getUseValue(card)]; + }).sort((a,b)=>{ + return b[1]-a[1]; + }); + const mostValuablePair=listx[0].slice(); + if(mostValuablePair[1]<=0) mostValuablePair[1]=0; + eff+=mostValuablePair[1]; + toUse.push(mostValuablePair[0]); + target.hp=hp; + } + if(toUse.length>1&&eff>0){ + eff-=target.getCards('e',card=>{ + return lib.filter.cardDiscardable(card,target,'dcnuanhui'); + }).map(card=>{ + return get.value(card,target); + }).reduce((p,c)=>{ + return p+c; + },0); + } + return eff; + } + const playerList=game.filterPlayer(current=>{ + return current.countCards('e'); + }).map(current=>[current,getUseValue(current)]).sort((a,b)=>{ + return b[1]-a[1]; + }); + if(playerList[0][1]<=0) return null; + return playerList[0][0]; + })()); + if(!result.bool) return event.finish(); + const target=result.targets[0]; + player.logSkill('dcnuanhui',target); + if(!target.isUnderControl(true)&&!target.isOnline()) game.delayx(); + const total=target.countCards('e'); + let count=0,forced=false; + while(count{ + return info[0]=='basic'&&target.hasUseTarget({name:info[2],nature:info[3],isCard:true}); + }); + if(!basicList.length){ + game.log('但是',target,'无牌可出!'); + break; + } + const str=forced?'视为使用一张基本牌':'是否视为使用一张基本牌?'; + result=yield target.chooseButton([str,[basicList,'vcard']],forced).set('ai',button=>{ + return get.player().getUseValue({name:button.link[2],nature:button.link[3],isCard:true}); + }); + if(!result.bool){ + game.log('但是',target,'不愿出牌!'); + break; + } + forced=true; + const card=new lib.element.VCard({name:result.links[0][2],nature:result.links[0][3],isCard:true}); + yield target.chooseUseTarget(card,true,false); + count++; + } + if(count>1){ + const cards=target.getCards('e',card=>{ + return lib.filter.cardDiscardable(card,target,'dcnuanhui'); + }); + if(cards.length) target.discard(cards).discarder=target; + } + }, + ai:{ + expose:0.3, + threaten:3.7, + }, + }, //曹轶 dcmiyi:{ audio:2, @@ -12596,6 +12743,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhoubuyi:'周不疑(192年—208年),字元直(或作“文直”),零陵重安(今湖南衡阳县)人,刘表别驾刘先的外甥,少有异才,聪明敏达,在十七岁时就著有文论四首。曹冲死后,曹操怀疑曹丕无法驾驭周不疑,于是派人杀了周不疑。', tianshangyi:'田尚衣,一作陈尚衣,魏文帝曹丕宫中著名宫人。能歌善舞,一时冠绝于世,私以为比之汉宫飞燕也不遑多让。', malingli:'马伶俐,游卡桌游原创角色,设定上为,马超之女,其身形虽娇小,却继承了马超英勇略带冲动的个性,活泼阳光,调皮伶俐,爱摆弄爆竹烟花一类的小器具,包包里经常放置用五色彩纸包装的小炸弹球。马伶俐从小跟随马超和马云騄学习战斗技巧,战斗力超强,坚强的意志和勇气也得到了提升,同时擅长马术,有一匹可爱的小白马伴随其身边。后马伶俐成年,嫁与刘备之子刘理,获封梁王妃。两人琴瑟相和,极为恩爱,常结伴出游,被人誉为天作之合。', + zhugeruoxue:'诸葛氏(“若雪”为网络小说虚构),诸葛亮的二姐,庞山民之妻。', }, characterTitle:{ // wulan:'#b对决限定武将', @@ -13169,6 +13317,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcmiyi_info:'准备阶段,你可以选择一项:1.回复1点体力;2.受到你造成的1点伤害。然后你令任意名角色执行该项。若如此做,这些角色于结束阶段执行另一项。', dcyinjun:'寅君', dcyinjun_info:'当你使用对应实体牌均为你的手牌的【杀】或锦囊牌结算结束后,若此牌目标为1,你可以视为对该目标使用一张无伤害来源的【杀】。然后若你本回合发动〖寅君〗的次数大于你的体力值,〖寅君〗失效直到回合结束。', + zhugeruoxue:'诸葛若雪', + dcqiongying:'琼英', + dcqiongying_info:'出牌阶段限一次。你可以移动场上的一张牌,然后你弃置一张与此牌花色相同的手牌(若没有该花色的手牌则改为展示所有手牌)。', + dcnuanhui:'暖惠', + dcnuanhui_info:'结束阶段,你可以选择一名装备区有牌的角色,其可以视为依次使用X张基本牌(X为其装备区牌数)。若其以此法使用了至少两张牌,其弃置装备区里的所有牌。', sp2_yinyu:'隐山之玉', sp2_huben:'百战虎贲', diff --git a/character/yijiang.js b/character/yijiang.js index 9b067e71b..9d7841886 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -9060,7 +9060,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, mingjian:{ audio:2, - audioname:['re_caorui'], enable:'phaseUse', usable:1, filterTarget:function(card,player,target){ @@ -9178,7 +9177,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ 'step 0' - player.chooseTarget(get.prompt2('huituo')).set('ai',function(target){ + var forced=event.forced===undefined?false:event.forced; + var info=get.skillInfoTranslation('huituo',player); + var str=`###${forced?'恢拓:请选择一名角色':get.prompt('huituo')}###令一名角色判定。若结果为红色,其回复1点体力;若结果为黑色,其摸${get.cnNumber(trigger.num)}张牌`; + player.chooseTarget(str,event.forced).set('ai',function(target){ var player=_status.event.player; if(get.attitude(player,target)>0){ return get.recoverEffect(target,player,player)+1; @@ -14280,7 +14282,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huituo_info:'当你受到伤害后,你可以令一名角色进行一次判定,若结果为红色,该角色回复1点体力;若结果为黑色,该角色摸X张牌(X为此次伤害的伤害点数)。', mingjian:'明鉴', mingjian2:'明鉴', - mingjian_info:'出牌阶段限一次,你可以将所有手牌交给一名其他角色,若如此做,该角色于其下个回合的手牌上限+1,且使用【杀】的次数上限+1。', + mingjian_info:'出牌阶段限一次。你可以将所有手牌交给一名其他角色,然后该角色于其下个回合的手牌上限+1,且使用【杀】的次数上限+1。', xingshuai:'兴衰', xingshuai_info:'主公技,限定技,当你进入濒死状态时,其他魏势力角色可依次令你回复1点体力,然后这些角色依次受到1点伤害。', reduodao:'夺刀', diff --git a/game/game.js b/game/game.js index 7ddfb6cb8..085ff696f 100644 --- a/game/game.js +++ b/game/game.js @@ -9022,7 +9022,12 @@ new Promise(resolve=>{ writable:true, value:function(){ for(const item of arguments){ - const pos=this.indexOf(item); + let pos=-1; + if (typeof item=='number'&&isNaN(item)){ + pos=this.findIndex(v=>isNaN(v)) + }else{ + pos=this.indexOf(item); + } if(pos==-1) continue; this.splice(pos,1); } @@ -13920,7 +13925,9 @@ new Promise(resolve=>{ bool:true, targets:event.targets2||result.targets, }; - var next=player.useCard(card,event.targets2||result.targets); + var args=[card,event.targets2||result.targets]; + if(cards) args.push(cards.slice()); + var next=player.useCard(...args); next.oncard=event.oncard; if(cards) next.cards=cards.slice(0); if(event.nopopup) next.nopopup=true; @@ -15725,7 +15732,7 @@ new Promise(resolve=>{ info.onChooseToUse(event); } } - _status.noclearcountdown=true; + if(_status.noclearcountdown!=='direct') _status.noclearcountdown=true; if(event.type=='phase'){ if(event.isMine()){ event.endButton=ui.create.control('结束回合','stayleft',function(){ @@ -15935,6 +15942,12 @@ new Promise(resolve=>{ if(game.online){ event._sendskill=[event.buttoned+'_backup',lib.skill[event.buttoned+'_backup']]; } + else{ + game.broadcast((skill,audio)=>{ + if(!lib.skill[skill]) lib.skill[skill]={}; + lib.skill[skill].audio=audio; + },event.buttoned+'_backup',lib.skill[event.buttoned+'_backup'].audio); + } event.backup(event.buttoned+'_backup'); if(info.prompt){ event.openskilldialog=info.prompt(info.chooseControl?result:result.links,player); @@ -15962,6 +15975,12 @@ new Promise(resolve=>{ else if(event._sendskill){ event.result._sendskill=event._sendskill; } + if((!event.result||!event.result.bool||event.result._noHidingTimer)&&(event.result.skill||event.logSkill)){ + var info=get.info(event.result.skill||event.logSkill); + if(info.direct&&!info.clearTime){ + _status.noclearcountdown='direct'; + } + } if(event.dialog&&typeof event.dialog=='object') event.dialog.close(); if(!_status.noclearcountdown){ game.stopCountChoose(); @@ -15985,7 +16004,7 @@ new Promise(resolve=>{ info.onChooseToRespond(event); } } - _status.noclearcountdown=true; + if(_status.noclearcountdown!=='direct') _status.noclearcountdown=true; if(!_status.connectMode&&lib.config.skip_shan&&event.autochoose&&event.autochoose()){ event.result={bool:false}; } @@ -16117,6 +16136,12 @@ new Promise(resolve=>{ if(game.online){ event._sendskill=[event.buttoned+'_backup',lib.skill[event.buttoned+'_backup']]; } + else{ + game.broadcast((skill,audio)=>{ + if(!lib.skill[skill]) lib.skill[skill]={}; + lib.skill[skill].audio=audio; + },event.buttoned+'_backup',lib.skill[event.buttoned+'_backup'].audio); + } event.backup(event.buttoned+'_backup'); if(info.prompt){ event.openskilldialog=info.prompt(info.chooseControl?result:result.links,player); @@ -16142,9 +16167,9 @@ new Promise(resolve=>{ if(event.onresult){ event.onresult(event.result); } - if(event.result.skill){ + if((!event.result||!event.result.bool||event.result._noHidingTimer)&&(event.result.skill||event.logSkill)){ if(info.direct&&!info.clearTime){ - _status.noclearcountdown=true; + _status.noclearcountdown='direct'; } } if(event.logSkill){ @@ -18550,7 +18575,7 @@ new Promise(resolve=>{ if(current!=target&&get.attitude(player,current)>0){ var es=target.getCards('e',filterCard); for(var i=0;i0&¤t.canEquip(es[i],_status.event.canReplace)&&get.effect(current,es[i],player,player)>_status.event.canReplace?get.effect(target,es[i],player,player):0) return true; + if(get.value(es[i],target)>0&¤t.canEquip(es[i],_status.event.canReplace)&&get.effect(current,es[i],player,player)>(_status.event.canReplace?get.effect(target,es[i],player,player):0)) return true; } } })){ @@ -18585,11 +18610,13 @@ new Promise(resolve=>{ next.set('sourceTargets',event.sourceTargets||game.filterPlayer()); next.set('aimTargets',event.aimTargets||game.filterPlayer()); next.set('canReplace',event.canReplace); + next.set('custom',get.copy(event.custom)); if(event.prompt2) next.set('prompt2',event.prompt2); if(event.forced) next.set('forced',true); 'step 1' event.result=result; if(result.bool){ + if(event.logSkill) player.logSkill(event.logSkill,result.targets,false); player.line2(result.targets,'green'); event.targets=result.targets; } @@ -18623,7 +18650,7 @@ new Promise(resolve=>{ else{ return targets1.canEquip(button.link,_status.event.canReplace); } - }).set('filter',event.filter).set('canReplace',event.canReplace); + }).set('filter',event.filter).set('canReplace',event.canReplace).set('custom',get.copy(event.custom)); } else{ event.finish(); @@ -25189,7 +25216,6 @@ new Promise(resolve=>{ if(!canReplace||att<0&¤t2.countEquipableSlot(get.subtype(es[i]))){ if(att==att2||att2!=get.sgn(get.effect(current2,es[i],player,current2))) return false; } - // if((!canReplace||!current2.countEquipableSlot(get.subtype(es[i]))&¤t2.canEquip(es[i],true))&&(att==att2||att2!=get.sgn(get.effect(current2,es[i],player,current2)))) return false; } return current!=current2&&!current2.isMin()&¤t2.canEquip(es[i],canReplace); })){ @@ -25271,9 +25297,9 @@ new Promise(resolve=>{ if(info.onuse){ info.onuse(result,this); } - if(info.direct&&!info.clearTime){ - _status.noclearcountdown=true; - } + // if(info.direct&&!info.clearTime){ + // _status.noclearcountdown=true; + // } } if(event.logSkill){ if(typeof event.logSkill=='string'){ @@ -26671,7 +26697,7 @@ new Promise(resolve=>{ } player._hide_all_timer=true; } - else if(!_status.event._global_waiting){ + else if(!_status.event._global_waiting&&_status.noclearcountdown!=='direct'){ player.showTimer(time); } lib.node.torespondtimeout[this.playerid]=setTimeout(function(){ @@ -26688,7 +26714,7 @@ new Promise(resolve=>{ game.players[i].hideTimer(); } } - else if(!_status.event._global_waiting){ + else if(!get.event('_global_waiting')&&(_status.noclearcountdown!=='direct'||result&&result.bool)&&!(result&&result._noHidingTimer)){ this.hideTimer(); } clearTimeout(lib.node.torespondtimeout[this.playerid]); @@ -57198,6 +57224,10 @@ new Promise(resolve=>{ const skill=gameEvent.skill; if(skill){ result.skill=skill; + const info=get.info(skill); + if(info&&info.direct&&!info.clearTime){ + result._noHidingTimer=true; + } const skillInformation=get.info(gameEvent.skill),viewAs=skillInformation.viewAs; if(typeof viewAs=='function'){ const viewedAs=viewAs(result.cards,gameEvent.player); @@ -61201,8 +61231,8 @@ new Promise(resolve=>{ str2+='·'+tagstr; } } - if(str.suit&&str.number){ - var cardnum=str.number||''; + if(str.suit&&str.number||str.isCard){ + var cardnum=get.number(str,false)||''; if([1,11,12,13].contains(cardnum)){ cardnum={'1':'A','11':'J','12':'Q','13':'K'}[cardnum] } @@ -61210,7 +61240,7 @@ new Promise(resolve=>{ str2+='('+get.translation(str)+')'; } else{ - str2+='【'+get.translation(str.suit)+cardnum+'】'; + str2+='【'+get.translation(get.suit(str,false))+cardnum+'】'; // var len=str2.length-1; // str2=str2.slice(0,len)+''+str2[len]+'·'+get.translation(str.suit)+str.number; } diff --git a/image/character/dc_wuban.jpg b/image/character/dc_wuban.jpg new file mode 100644 index 000000000..84871c846 Binary files /dev/null and b/image/character/dc_wuban.jpg differ diff --git a/image/character/zhugeruoxue.jpg b/image/character/zhugeruoxue.jpg new file mode 100644 index 000000000..15eb63f18 Binary files /dev/null and b/image/character/zhugeruoxue.jpg differ