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