diff --git a/character/clan.js b/character/clan.js
index 7ea0ea235..69a0d1bff 100644
--- a/character/clan.js
+++ b/character/clan.js
@@ -41,16 +41,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
filter:function(event,player){
if(player.getStorage('clanbaichu').contains(event.card.name)) return true;
if(get.suit(event.card)=='none') return false;
- var str=(get.suit(event.card)+'、'+get.type2(event.card));
+ var str=(get.suit(event.card)+'+'+get.type2(event.card));
if(!player.getStorage('clanbaichu').contains(str)) return true;
return !player.hasSkill('qice');
},
forced:true,
content:function(){
'step 0'
- if(player.getStorage('clanbaichu').contains(trigger.card.name)){
- event.draw=true;
- }
if(get.suit(trigger.card)!='none'){
var str=(get.suit(trigger.card)+'+'+get.type2(trigger.card));
if(player.getStorage('clanbaichu').contains(str)){
@@ -68,6 +65,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var dialog=['请选择【百出】记录的普通锦囊牌牌名',[list,'vcard']];
player.chooseButton(dialog,true).set('ai',function(button){
var player=_status.event.player,name=button.link[2];
+ if(name==_status.event.getTrigger().card.name) return 1919810;
if(name=='wuxie') return 114514;
return get.effect(player,{name:name},player,player)*(1+player.countCards('hs',name));
});
@@ -85,7 +83,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
game.delayx();
}
'step 2'
- if(event.draw) player.chooseDrawRecover(true);
+ if(player.getStorage('clanbaichu').contains(trigger.card.name)) player.chooseDrawRecover(true);
},
intro:{
markcount:()=>0,
@@ -233,7 +231,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(result.bool){
var card={
name:result.links[0][2],
- nature:result.links[0][2],
+ nature:result.links[0][3],
};
player.useCard(card,target,false);
}
diff --git a/character/extra.js b/character/extra.js
index 7cf7f75de..59de042ed 100755
--- a/character/extra.js
+++ b/character/extra.js
@@ -145,7 +145,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}).join('、')}`,
},
$createButton:function(item,type,position,noclick,node){
- node=ui.create.identityCard(item,position,null,noclick);
+ node=ui.create.identityCard(item,position,noclick);
node.link=item;
return node;
},
@@ -176,7 +176,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
[list,function(item,type,position,noclick,node){
return lib.skill.jxlianpo.$createButton(item,type,position,noclick,node);
}],
- ])
+ ],true);
'step 1'
var choice=result.links[0],mark=`jxlianpo_mark_${choice}`;
player.when({global:'roundStart'})
@@ -192,13 +192,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
});
player.addMark(mark,1,false);
- var videoId=lib.status.videoId++;
+ event.videoId=lib.status.videoId++;
var createDialog=function(player,identity,id){
var dialog=ui.create.dialog(`${get.translation(player)}展示了“${get.translation(identity+'2')}”的身份牌
`,'forcebutton');
dialog.videoId=id;
ui.create.spinningIdentityCard(identity,dialog);
};
- game.broadcastAll(createDialog,player,choice,videoId);
+ game.broadcastAll(createDialog,player,choice,event.videoId);
var color='';
if(choice=='zhong') color='#y';
else if(choice=='fan') color='#g';
@@ -206,7 +206,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
game.log(player,'展示了',`${color}${get.translation(choice+'2')}`,'的身份牌');
game.delay(3);
'step 2'
- game.broadcastAll('closeDialog',videoId);
+ game.broadcastAll('closeDialog',event.videoId);
}
},
global:{
diff --git a/character/mobile.js b/character/mobile.js
index e4205681b..90ea71d1e 100644
--- a/character/mobile.js
+++ b/character/mobile.js
@@ -32,7 +32,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
baoxin:['male','qun',4,['mutao','yimou'],['character:tw_baoxin','die_audio:tw_baoxin']],
jiangji:['male','wei',3,['twjichou','jilun'],['character:tw_jiangji','die_audio:tw_jiangji']],
liwei:['male','shu',4,['jiaohua'],['character:tw_liwei','die:tw_liwei']],
- laimin:['male','shu',3,['laishou','luanqun']],
+ laimin:['male','shu',3,['laishou','luanqun'],['unseen']],
yj_zhoubuyi:['male','wei',3,['mbhuiyao','mbquesong']],
xin_guozhao:['female','wei',3,['yichong','wufei']],
xin_zhangyi:['male','shu',4,['xinwurong','shizhi']],
@@ -970,95 +970,32 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
enable:'phaseUse',
usable:1,
- // filterTarget:lib.filter.notMe,
+ filterTarget:lib.filter.notMe,
content:function(){
- 'step 0'
player.damage('nosource');
- 'step 1'
- if(game.countPlayer()<2) event.finish();
- if(game.countPlayer()==2) event._result={bool:true,targets:[game.findPlayer(i=>i!=player),player]};
- else player.chooseTarget(`慧夭:请选择两名角色`,`令不为你的第一名角色视为对第二名角色造成过1点伤害。`,(card,player,target)=>{
- if(!ui.selected.targets.length) return player!=target;
- return true;
- },2,true).set('multitarget',true).set('targetprompt',['伤害来源','受伤角色']).set('ai',target=>{
- return target==get.event('aiTargets')[ui.selected.targets.length]?10:0;
- }).set('aiTargets',lib.skill.mbhuiyao.getUnrealDamageTargets(player,[game.filterPlayer(i=>i!=player),game.filterPlayer()],true));
- 'step 2'
- if(result.bool){
- var targets=result.targets;
- player.line2(targets,'green');
- game.delaye();
- targets[1].damage(targets[0],'unreal');
- }
- },
- getUnrealDamageTargets:(player,lists,forced)=>{
- const targets=[null,null];
- let sourceList,targetList;
- if(lists.length==2&&lists.every(l=>Array.isArray(l))){
- sourceList=lists[0]; targetList=lists[1];
- }
- else{
- sourceList=lists.slice(); targetList=lists.slice();
- }
- const list=targetList.map(current=>{
- const _hp=current.hp,_maxhp=current.maxHp;
- current.hp=100; current.maxHp=100;
- const att=-get.sgnAttitude(player,current);
- let val=get.damageEffect(current,player,current)*att;
- current.getSkills(null,false,false).forEach(skill=>{
- const info=get.info(skill);
- if(info&&info.ai&&(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend)) val=Math[val>0?'max':'min'](val>0?0.1:-0.1,val+2*att);
- });
- const eff=100/val+15;
- current.hp=_hp; current.maxHp=_maxhp;
- return [current,eff];
- }).sort((a,b)=>b[1]-a[1])[0];
- if(list[1]<0&&!forced) return targets;
- const targetx=list[0];
- targets[1]=targetx;
- const list2=sourceList.filter(i=>i!=targetx).map(current=>{
- const _hp=targetx.hp,_maxhp=targetx.maxHp;
- targetx.hp=100; targetx.maxHp=100;
- const att=-get.sgnAttitude(player,current);
- const eff=get.damageEffect(targetx,current,current)*att;
- targetx.hp=_hp; targetx.maxHp=_maxhp;
- return [current,eff];
- }).sort((a,b)=>b[1]-a[1])[0];
- if(!list2) return targets;
- targets[0]=list2[0];
- return targets;
+ target.damage('unreal');
},
ai:{
order:6,
result:{
- player:function(player){
- if(player.getHp()+player.countCards('hs',card=>player.canSaveCard(card,player))<=1) return 0;
- var limit=25;
- var quesong=player.hasSkill('mbquesong')&&!player.getStat().damaged;
- if(quesong){
- limit-=7.5;
+ target:function(player,target){
+ if(player.getHp()+player.countCards('hs',card=>player.canSaveCard(card,player))<1) return 0;
+ var _hp=target.hp,_maxhp=target.maxHp;
+ target.hp=10; target.maxHp=10;
+ var att=-get.sgnAttitude(player,target);
+ var val=get.damageEffect(target,player,target)*att;
+ target.getSkills(null,false,false).forEach(skill=>{
+ var info=get.info(skill);
+ if(info&&info.ai&&(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend)) val=Math[val>0?'max':'min'](val>0?0.1:-0.1,val+2*att);
+ });
+ var eff=100/val;
+ target.hp=_hp; target.maxHp=_maxhp;
+ var limit=17.5;
+ if(player.hasSkill('mbquesong')){
+ if(!player.getStat().damaged) limit+=7.5;
}
- if(quesong&&game.hasPlayer(target=>{
- var att=get.attitude(player,target);
- if(att<0) return false;
- return att*Math.sqrt(Math.max(1,[1,2,3,4].reduce((p,c)=>p+target.countEmptySlot(c),0)))>=10||target.getHp()<=2;
- })) return 1;
- if(!quesong&&game.hasPlayer(target=>{
- if(target==player) return false;
- var _hp=target.hp,_maxhp=target.maxHp;
- target.hp=100; target.maxHp=100;
- var att=-get.sgnAttitude(player,target);
- var val=get.damageEffect(target,player,target)*att;
- target.getSkills(null,false,false).forEach(skill=>{
- var info=get.info(skill);
- if(info&&info.ai&&(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend)) val=Math[val>0?'max':'min'](val>0?0.1:-0.1,val+2*att);
- });
- var eff=100/val;
- target.hp=_hp; target.maxHp=_maxhp;
- if(eff{
var player=_status.event.player;
if(get.attitude(player,target)<=0) return 0;
- var len=Math.max(1,[1,2,3,4].reduce((p,c)=>p+target.countEmptySlot(c),0)),hp=target.getHp();
+ var len=[1,2,3,4,5].reduce((p,c)=>p+target.countEmptySlot(c),0);hp=target.getHp();
return len+target.isTurnedOver()*2+1.5*Math.min(4,target.getDamagedHp())/(hp+1);
});
'step 1'
@@ -1083,17 +1020,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var target=result.targets[0];
event.target=target;
player.logSkill('mbquesong',target);
- var len=Math.max(1,[1,2,3,4].reduce((p,c)=>p+target.countEmptySlot(c),0)),hp=target.getHp();
- if(hp==0||target.countCards('h')p+target.countEmptySlot(c),0);hp=target.getHp();
+ var forced=false;
+ if(len==0) forced=true;
+ if(hp==0||target.countCards('h'){
- if(!get.event('goon')) return 0;
+ var str=`${forced?'请':'是否'}弃置${get.cnNumber(hp)}张手牌并回复1点体力${forced?'':'?或点击“取消”摸'+get.cnNumber(len)+'张牌并复原武将牌'}。`;
+ target.chooseToDiscard(get.translation(player)+'对你发动了【雀颂】',str,forced,'h',hp).set('ai',card=>{
+ if(!_status.event.goon) return 0;
return 6-get.value(card);
}).set('goon',function(){
var _hp=hp+target.isTurnedOver()*1.5;
- if(_hp+player.countCards('hs',card=>get.tag(card,'recover'))<=2-len/4) return true;
- return len<=_hp;
+ if(forced||_hp+player.countCards('hs',card=>get.tag(card,'recover'))<=2-len/4) return true;
+ return len>_hp;
}());
}
}
@@ -1104,12 +1046,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){
event.finish();
}
else{
- target.draw(Math.max(1,[1,2,3,4].reduce((p,c)=>p+target.countEmptySlot(c),0)));
+ target.draw([1,2,3,4,5].reduce((p,c)=>p+target.countEmptySlot(c),0));
}
'step 3'
- target.link(false);
+ player.link(false);
'step 4'
- target.turnOver(false);
+ player.turnOver(false);
},
ai:{
expose:0.2,
@@ -11287,11 +11229,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
content:function(){
'step 0'
player.chooseTarget(get.prompt('zhongzuo'),'令一名角色摸两张牌。若其已受伤,则你摸一张牌。').set('ai',function(target){
- if(target.hasSkillTag('nogain')) return target.isDamaged()?0:1;
- let att=get.attitude(_status.event.player,target);
- if(att<=0) return 0;
- if(target.isDamaged()) return 1+att/5;
- return att/5;
+ if(target.hasSkillTag('nogain')&&target!=_status.currentPhase) return target.isDamaged()?0:1;
+ var att=get.attitude(_status.event.player,target);
+ if(target.isDamaged()) att=att*1.2;
+ return att;
});
'step 1'
if(result.bool){
@@ -12605,7 +12546,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 3'
if(result.bool){
trigger.player.gain(event.card,'give',player,'bySelf');
- player.chooseBool('是否对'+get.translation(trigger.player)+'造成1点伤害?').ai=function(){
+ player.chooseBool('是否对'+get.translation(trigger.player)+'造成一点伤害?').ai=function(){
return get.damageEffect(trigger.player,player,player)>0
};
}
@@ -12951,7 +12892,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
event.ingame=game.hasPlayer(function(current){
return ['re_xushu','xin_xushu','xushu','dc_xushu'].contains(current.name)||['re_xushu','xin_xushu','xushu','dc_xushu'].contains(current.name2);
})?true:false;
- var prompt='请选择一名角色,令其回复1点体力并摸一张牌';
+ var prompt='请选择一名角色,令其回复一点体力并摸一张牌';
prompt+=event.ingame?',然后你摸一张牌。':'。';
player.chooseTarget(prompt).set('ai',function(target){
var player=_status.event.player;
@@ -15510,9 +15451,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
yj_zhoubuyi:'☆周不疑',
yj_zhoubuyi_prefix:'☆',
mbhuiyao:'慧夭',
- mbhuiyao_info:'出牌阶段限一次。你可以受到1点无来源伤害,然后你选择一名其他角色,令其视为对另一名角色造成过1点伤害。',
+ mbhuiyao_info:'出牌阶段限一次。你可以受到1点无来源伤害,视为对一名其他角色造成过1点伤害。',
mbquesong:'雀颂',
- mbquesong_info:'一名角色的结束阶段,若你于本回合受到过伤害,你可以令一名角色选择一项:1.摸等同于其装备区中非宝物栏中空栏的数量的牌并复原武将牌(至少摸一张牌);2.弃置等同于其体力值的手牌并回复1点体力。',
+ mbquesong_info:'一名角色的结束阶段,若你于本回合受到过伤害,你可以令一名角色选择一项:1.摸等同于其装备区中空栏的数量的牌并复原武将牌;2.弃置等同于其体力值的手牌并回复1点体力。',
xin_yuanshao:'手杀界袁绍',
xin_yuanshao_prefix:'手杀界',
re_baosanniang:'手杀鲍三娘',
diff --git a/character/sb.js b/character/sb.js
index 757988dee..dae7a25e7 100644
--- a/character/sb.js
+++ b/character/sb.js
@@ -38,8 +38,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sb_liubiao:['male','qun',3,['sbzishou','sbzongshi']],
sb_zhurong:['female','shu',4,['sblieren','sbjuxiang']],
sb_menghuo:['male','shu',4,['sbhuoshou','sbzaiqi']],
- sb_yl_luzhi:['male','qun',3,['nzry_mingren','sbzhenliang']],
- sb_xiaoqiao:['female','wu',3,['sbtianxiang','xinhongyan']],
+ sb_yl_luzhi:['male','qun',3,['nzry_mingren','sbzhenliang'],['unseen']],
+ sb_xiaoqiao:['female','wu',3,['sbtianxiang','xinhongyan'],['unseen']],
},
characterSort:{
sb:{
diff --git a/game/game.js b/game/game.js
index feb9d4766..00a191d1d 100644
--- a/game/game.js
+++ b/game/game.js
@@ -43336,8 +43336,8 @@
},
create:{
//创建身份牌实例
- identityCard:function(identity,position,info,noclick){
- const card=ui.create.card(position,info,noclick);
+ identityCard:function(identity,position,noclick){
+ const card=ui.create.card(position,'noclick',noclick);
card.classList.add('button');
card._customintro=uiintro=>uiintro.add(`${get.translation(`${identity}${2}`)}的身份牌`);
const fileName=`image/card/identity_${identity}.jpg`;