diff --git a/character/sb.js b/character/sb.js
index 994ab98c0..ce6694b45 100644
--- a/character/sb.js
+++ b/character/sb.js
@@ -7,7 +7,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
character:{
sb_huangyueying:['female','shu',3,['sbjizhi','sbqicai']],
sb_sp_zhugeliang:['male','shu',3,['sbhuoji','sbkanpo']],
- sb_zhugeliang:['male','shu',3,['sbguanxing','sbkongcheng'],['unseen']],
+ sb_zhugeliang:['male','shu',3,['sbguanxing','sbkongcheng']],
sb_zhanghe:['male','wei',4,['sbqiaobian']],
sb_yujin:['male','wei',4,['sbxiayuan','sbjieyue']],
sb_huaxiong:['male','qun','3/4/1',['new_reyaowu','sbyangwei']],
@@ -274,44 +274,48 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
//诸葛亮
sbhuoji:{
- audio:2,
- enable:'phaseUse',
- filterTarget:lib.filter.notMe,
- prompt:'选择一名其他角色,对其与其势力相同的所有其他角色各造成1点火属性伤害',
- usable:1,
- line:'fire',
- content:function(){
- 'step 0'
- target.damage('fire');
- 'step 1'
- var targets=game.filterPlayer(current=>{
- if(current==player||current==target) return false;
- return current.group==target.group;
- });
- if(targets.length){
- game.delayx();
- player.line(targets,'fire');
- targets.forEach(i=>i.damage('fire'));
- }
- },
- ai:{
- order:7,
- fireAttack:true,
- result:{
- target:function(player,target){
- var att=get.attitude(player,target);
- return get.sgn(att)*game.filterPlayer(current=>{
- if(current==player) return false;
+ audio:3,
+ dutySkill:true,
+ derivation:['sbguanxing','sbkongcheng'],
+ group:['sbhuoji_fire','sbhuoji_achieve','sbhuoji_fail','sbhuoji_mark'],
+ subSkill:{
+ fire:{
+ audio:'sbhuoji1',
+ enable:'phaseUse',
+ filterTarget:lib.filter.notMe,
+ prompt:'选择一名其他角色,对其与其势力相同的所有其他角色各造成1点火属性伤害',
+ usable:1,
+ line:'fire',
+ content:function(){
+ 'step 0'
+ target.damage('fire');
+ 'step 1'
+ var targets=game.filterPlayer(current=>{
+ if(current==player||current==target) return false;
return current.group==target.group;
- }).reduce((num,current)=>num+get.damageEffect(current,player,player,'fire'),0);
+ });
+ if(targets.length){
+ game.delayx();
+ player.line(targets,'fire');
+ targets.forEach(i=>i.damage('fire'));
+ }
+ },
+ ai:{
+ order:7,
+ fireAttack:true,
+ result:{
+ target:function(player,target){
+ var att=get.attitude(player,target);
+ return get.sgn(att)*game.filterPlayer(current=>{
+ if(current==player) return false;
+ return current.group==target.group;
+ }).reduce((num,current)=>num+get.damageEffect(current,player,player,'fire'),0);
+ },
+ },
},
},
- },
- derivation:['sbguanxing','sbkongcheng'],
- group:['sbhuoji_achieve','sbhuoji_fail','sbhuoji_mark'],
- subSkill:{
achieve:{
- audio:'sbhuoji',
+ audio:'sbhuoji2',
trigger:{player:'phaseZhunbeiBegin'},
filter:function(event,player){
return player.getAllHistory('sourceDamage',evt=>evt.hasNature('fire')).reduce((num,evt)=>num+evt.num,0)>=game.players.length+game.dead.length;
@@ -335,7 +339,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
fail:{
- audio:'sbhuoji',
+ audio:'sbhuoji3',
trigger:{player:'dying'},
forced:true,
locked:false,
@@ -365,20 +369,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
},
+ sbhuoji1:{audio:2},
+ sbhuoji2:{audio:2},
+ sbhuoji3:{audio:2},
sbkanpo:{
+ init:function(player){
+ if(!player.storage.sbkanpo){
+ player.storage.sbkanpo=[10,[],[]];
+ player.markSkill('sbkanpo');
+ }
+ },
audio:2,
trigger:{global:'roundStart'},
+ filter:function(event,player){
+ var storage=player.storage.sbkanpo;
+ return storage[0]||storage[1].length;
+ },
forced:true,
locked:false,
- get getNumber(){
- return 3;
- },
content:function*(event,map){
- var player=map.player;
- var storage=player.getStorage('sbkanpo').slice();
- if(storage.length){
- player.unmarkAuto('sbkanpo',storage);
- }
+ var player=map.player,storage=player.storage.sbkanpo;
+ var sum=storage[0];
+ storage[1]=[];
+ player.markSkill('sbkanpo');
+ if(!sum) return;
const list=get.inpileVCardList(info=>{
if(info[2]=='sha'&&info[3]) return false;
return info[0]!='equip';
@@ -411,7 +425,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
};
if(event.isMine()) func();
else if(event.isOnline()) event.player.send(func);
- var result=yield player.chooseButton(['看破:是否记录三个牌名?',[list,'vcard']],[1,3],true).set('ai',function(button){
+ var result=yield player.chooseButton(['看破:是否记录至多'+get.cnNumber(sum)+'个牌名?',[list,'vcard']],[1,sum],true).set('ai',function(button){
+ if(ui.selected.buttons.length>=Math.max(3,game.countPlayer()/2)) return 0;
switch(button.link[2]){
case 'wuxie':return 5+Math.random();
case 'sha':return 5+Math.random();
@@ -427,7 +442,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
}).set('filterButton',button=>{
return !_status.event.names.includes(button.link[2]);
- }).set('names',storage).set('custom',{
+ }).set('names',storage[2]).set('custom',{
add:{
confirm:function(bool){
if(bool!=true) return;
@@ -481,25 +496,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){
});
if(result.bool){
var names=result.links.map(link=>link[2]);
- player.setStorage('sbkanpo',names);
- player.markSkill('sbkanpo');
+ storage[1]=names;
+ storage[2]=names;
}
+ else storage[2]=[];
+ player.markSkill('sbkanpo');
},
marktext:'破',
intro:{
markcount:function(storage,player){
- if(player.isUnderControl(true)) return storage.length;
+ if(player.isUnderControl(true)) return storage[1].length;
return '?';
},
mark:function(dialog,content,player){
+ const storage=player.getStorage('sbkanpo')[1];
if(player.isUnderControl(true)){
- const storage=player.getStorage('sbkanpo');
dialog.addText('已记录牌名:');
dialog.addSmall([storage,'vcard']);
}
- else{
- return `${get.translation(player)}记录了一些牌名`;
- }
},
},
group:'sbkanpo_kanpo',
@@ -535,9 +549,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
logTarget:'player',
content:function(){
- player.unmarkAuto('sbkanpo',[trigger.card.name]);
+ player.storage.sbkanpo[1].remove(trigger.card.name);
+ player.markSkill('sbkanpo');
trigger.targets.length=0;
trigger.all_excluded=true;
+ player.draw();
},
},
},
@@ -546,7 +562,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']},
filter:function(event,player){
- return event.name=='phaseZhunbei'||(player.hasSkill('sbguanxing_on')&&player.countCards('s',card=>card.hasGaintag('sbguanxing')));
+ var cards=player.countCards('s',card=>card.hasGaintag('sbguanxing'));
+ var num=player.getAllHistory('useSkill',evt=>evt.skill=='sbguanxing').length;
+ if(!cards.length&&num>3) return false;
+ return event.name=='phaseZhunbei'||(player.hasSkill('sbguanxing_on'));
},
forced:true,
locked:false,
@@ -558,14 +577,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing'));
if(cards.length) player.loseToDiscardpile(cards);
- var bool=player.getAllHistory('useSkill',evt=>evt.skill=='sbguanxing').length>1;
- event.num=Math.min(7,bool?cards.length+1:7);
+ var num=player.getAllHistory('useSkill',evt=>evt.skill=='sbguanxing').length-1;
+ event.num=Math.max(0,7-2*num);
'step 1'
- var cards2=get.cards(num);
- player.$gain2(cards2,false);
- game.log(player,'将',cards2,'置于了武将牌上');
- player.loseToSpecial(cards2,'sbguanxing').visible=true;
- player.markSkill('sbguanxing');
+ if(num){
+ var cards2=get.cards(num);
+ player.$gain2(cards2,false);
+ game.log(player,'将',cards2,'置于了武将牌上');
+ player.loseToSpecial(cards2,'sbguanxing').visible=true;
+ player.markSkill('sbguanxing');
+ }
+ else if(!player.countCards('s',card=>card.hasGaintag('sbguanxing'))) event.finish();
'step 2'
var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing'));
if(cards.length){
@@ -676,7 +698,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
marktext:'☯',
intro:{
content:function(storage,player){
- if(storage) return '你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸一张牌。';
+ if(storage) return '你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。';
return '出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。';
},
},
@@ -706,7 +728,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
check:function(card){
return 6.5-get.value(card);
},
- prompt:'弃置与攻击范围内的一名角色体力值之差(至少为1)张与“任”颜色相同的牌,对其造成1点伤害。',
+ prompt:'弃置与攻击范围内的一名角色体力值之差(至少为1)张与“任”颜色相同的牌,对其造成1点伤害',
content:function(){
player.changeZhuanhuanji('sbzhenliang');
target.damage('nocard');
@@ -732,7 +754,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
direct:true,
content:function(){
'step 0'
- player.chooseTarget(get.prompt('sbzhenliang'),'令一名角色摸一张牌').set('ai',function(target){
+ player.chooseTarget(get.prompt('sbzhenliang'),'令一名角色摸两张牌').set('ai',function(target){
if(target.hasSkillTag('nogain')) return 0.1;
var att=get.attitude(player,target);
return att*(Math.max(5-target.countCards('h'),2)+3);
@@ -742,7 +764,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var target=result.targets[0];
player.changeZhuanhuanji('sbzhenliang');
player.logSkill('sbzhenliang',target);
- target.draw();
+ target.draw(2);
}
},
},
@@ -5502,7 +5524,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(player.countMark('sbjiang')) str+='X次。你可以将所有手牌当【决斗】使用(X为场上其他吴势力角色数+1)。';
else str+='一次。你可以将所有手牌当【决斗】使用。';
return str;
- }
+ },
+ sbzhenliang:function(player){
+ var storage=player.storage.sbzhenliang;
+ var str='转换技。';
+ if(!storage) str+='';
+ str+='阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。';
+ if(!storage) str+='';
+ if(storage) str+='';
+ str+='阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。';
+ if(storage) str+='';
+ return str;
+ },
},
translate:{
sb_zhanghe_prefix:'谋',
@@ -5714,24 +5747,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sb_yl_luzhi:'谋卢植',
sb_yl_luzhi_prefix:'谋',
sbzhenliang:'贞良',
- sbzhenliang_info:'转换技。阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸一张牌。',
+ sbzhenliang_info:'转换技。阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。',
sb_xiaoqiao:'谋小乔',
sb_xiaoqiao_prefix:'谋',
sbtianxiang:'天香',
sbtianxiang_info:'①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸等量的牌。',
sbtianxiang_info_versus_two:'①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸X张牌(X为移去的“天香”标记数+2)。',
- sb_sp_zhugeliang:'谋诸葛亮',
+ sb_sp_zhugeliang:'谋卧龙',
sb_sp_zhugeliang_prefix:'谋',
sb_zhugeliang:'谋诸葛亮',
sb_zhugeliang_prefix:'谋',
sbhuoji:'火计',
sbhuoji_info:'使命技。①使命:出牌阶段限一次。你可以对一名其他角色造成1点火焰伤害,然后你对所有与其势力相同的不为其的其他角色各造成1点火焰伤害。②成功:准备阶段,若你本局游戏已造成的火焰伤害不小于本局游戏总角色数,则你失去〖火计〗和〖看破〗,然后获得〖观星〗和〖空城〗。③失败:使命成功前进入濒死状态。',
sbkanpo:'看破',
- sbkanpo_info:'①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录共计三个未于本次清除过的非装备牌牌名(对其他角色不可见)。②当其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录,令此牌无效。',
+ sbkanpo_info:'①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录10个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。',
sbguanxing:'观星',
- sbguanxing_info:'①准备阶段,你将所有“星”置入弃牌堆,将牌堆顶的X张牌置于你的武将牌上,称为“星”。然后你可以将任意张“星”置于牌堆顶(X为你此次移去的“星”数+1且至多为7,若你此前未发动过〖观星①〗则X为7)。②结束阶段,若你未于本回合的准备阶段将“星”置于过牌堆顶,你可以将任意张“星”置于牌堆顶。③你可以如手牌般使用或打出“星”。',
+ sbguanxing_info:'①准备阶段,你将所有“星”置入弃牌堆,将牌堆顶的X张牌置于你的武将牌上,称为“星”(X为7-此前发动〖观星①〗次数的两倍,且X至少为0)。然后你可以将任意张“星”置于牌堆顶。②结束阶段,若你未于本回合的准备阶段将“星”置于过牌堆顶,你可以将任意张“星”置于牌堆顶。③你可以如手牌般使用或打出“星”。',
sbkongcheng:'空城',
- sbkongcheng_info:'锁定技。当你受到伤害时,若你有〖观星〗,且若你:有“星”,你判定,若结果点数不大于你的“星”数,此伤害-1;没有“星”,此伤害+1。',
+ sbkongcheng_info:'锁定技。当你受到伤害时,若你拥有技能〖观星〗,且若你:有“星”,你判定,若结果点数不大于你的“星”数,此伤害-1;没有“星”,此伤害+1。',
sb_huangyueying:'谋黄月英',
sb_huangyueying_prefix:'谋',
sbqicai:'奇才',