Merge pull request #650 from mengxinzxz/PR-Branch

bugfix+手杀新将
This commit is contained in:
Spmario233 2023-11-18 22:15:57 +08:00 committed by GitHub
commit aaa0f59a58
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 791 additions and 4 deletions

BIN
audio/die/re_xianglang.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/die/sb_zhugeliang.mp3 Normal file

Binary file not shown.

BIN
audio/die/shen_huatuo.mp3 Normal file

Binary file not shown.

BIN
audio/skill/naxue1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/naxue2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/sbguanxing1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/sbguanxing2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/sbhuoji1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/sbhuoji2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/sbjizhi1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/sbjizhi2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/sbkanpo1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/sbkanpo2.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/skill/sbqicai1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/sbqicai2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/wuling1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/wuling2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/yijie1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/yijie2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/youyi1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/youyi2.mp3 Normal file

Binary file not shown.

View File

@ -17,11 +17,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
extra_ol:['ol_zhangliao','shen_caopi','shen_zhenji','shen_sunquan'],
extra_mobilezhi:['shen_guojia','shen_xunyu'],
extra_mobilexin:['shen_taishici','shen_sunce'],
extra_mobileren:['shen_huatuo'],
extra_tw:['tw_shen_guanyu','tw_shen_lvmeng'],
extra_offline:['shen_diaochan','boss_zhaoyun','shen_dianwei','le_shen_jiaxu'],
},
},
character:{
shen_huatuo:['male','shen',3,['wuling','youyi'],['qun']],
le_shen_jiaxu:['male','shen',4,['jxlianpo','jxzhaoluan'],['qun']],
shen_dianwei:['male','shen',4,['juanjia','qiexie','cuijue'],['wei']],
shen_dengai:['male','shen',4,['dctuoyu','dcxianjin','dcqijing'],['wei']],
@ -88,6 +90,215 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
skill:{
//神华佗
wuling:{
audio:2,
enable:'phaseUse',
filter:function(event,player){
return game.hasPlayer(target=>lib.skill.wuling.filterTarget(null,player,target));
},
filterTarget:function(card,player,target){
return !target.hasSkill('wuling_wuqinxi');
},
usable:1,
content:function(){
'step 0'
target.addSkill('wuling_wuqinxi');
player.chooseControl(lib.skill.wuling.wuqinxi).set('prompt','五灵:请选择'+get.translation(target)+'的初始五禽戏效果').set('ai',()=>['鹿','熊'].randomGet()).set('choiceList',lib.skill.wuling.wuqinxiMap);
'step 1'
player.popup(result.control);
target.storage.wuling_wuqinxi=result.control;
lib.skill.wuling.updateMark(target);
},
wuqinxi:['虎','鹿','熊','猿','鹤'],
wuqinxiMap:[
'虎:使用仅指定唯一目标的牌对目标角色造成的伤害+1',
'鹿回复1点体力并弃置判定区的所有牌不能成为延时锦囊牌的目标',
'熊:受到伤害时,此伤害-1',
'猿:出牌阶段开始时,摸两张牌',
'鹤:出牌阶段开始时,选择一名角色,随机获得其装备区里的一张牌',
],
updateMark:function(player){
var wuqinxi=player.storage.wuling_wuqinxi;
game.log(player,'获得了','#g【'+wuqinxi+'】','标记');
player.markSkill('wuling_wuqinxi');
game.broadcastAll(function(player,wuqinxi){
if(player.marks.wuling_wuqinxi) player.marks.wuling_wuqinxi.firstChild.innerHTML=wuqinxi;
},player,wuqinxi);
if(wuqinxi=='鹿'){
player.logSkill('wuling_wuqinxi');
player.recover();
player.discard(player.getCards('j'));
}
},
ai:{
order:7,
result:{target:1},
},
derivation:'wuling_wuqinxi',
subSkill:{
wuqinxi:{
nopop:true,
charlotte:true,
intro:{
content:function(storage){
var str='<li>当前效果:'+storage;
var list=lib.skill.wuling.wuqinxiMap;
var list1=list.map(str2=>str2.slice(0,1));
var list2=list.map(str2=>str2.slice(2));
str+='<br><li>';
str+=list2[list1.indexOf(storage)];
return str;
},
},
mod:{
targetEnabled:function(card,player,target){
if(get.type(card)=='delay'&&target.storage.wuling_wuqinxi&&target.storage.wuling_wuqinxi=='鹿') return false;
},
},
trigger:{
source:'damageBegin1',
player:['phaseBegin','damageBegin2','phaseUseBegin'],
},
filter:function(event,player,name){
var wuqinxi=player.storage.wuling_wuqinxi;
if(!wuqinxi) return false;
if(event.name=='phase') return true;
switch(name){
case 'damageBegin1':
if(wuqinxi!='虎') return false;
return event.card&&event.targets&&event.targets.length==1&&event.targets.includes(event.player);
break;
case 'damageBegin2':
return wuqinxi=='熊';
break;
default:
if(wuqinxi=='鹤') return true;
if(wuqinxi!='猿') return false;
return game.hasPlayer(target=>target.countGainableCards(player,'e'));
break;
}
},
forced:true,
content:function(){
'step 0'
var wuqinxi=player.storage.wuling_wuqinxi;
if(trigger.name=='phase'){
var num=lib.skill.wuling.wuqinxi.indexOf(wuqinxi)+1;
if(num>=lib.skill.wuling.wuqinxi.length) num-=lib.skill.wuling.wuqinxi.length;
player.storage.wuling_wuqinxi=lib.skill.wuling.wuqinxi[num];
lib.skill.wuling.updateMark(player);
event.finish();
}
else{
var name=event.triggername;
switch(name){
case 'damageBegin1':
player.line(trigger.player);
trigger.num++;
event.finish();
break;
case 'damageBegin2':
trigger.num--;
event.finish();
break;
default:
if(wuqinxi=='鹤'){
player.draw(2);
event.finish();
}
else{
player.chooseTarget('五禽戏:获得一名角色装备区里的一张装备牌',function(card,player,target){
return target.countGainableCards(player,'e');
}).set('ai',function(target){
var player=_status.event.player;
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;
});
}
}
}
'step 1'
if(result.bool){
var target=result.targets[0];
player.line(target,'green');
var cards=target.getGainableCards(player,'e');
player.gain(cards.randomGets(1),target,'give');
}
},
ai:{
effect:{
target:function(card,player,target){
var wuqinxi=target.storage.wuling_wuqinxi;
if(!wuqinxi&&wuqinxi!='熊') return;
if(player.hasSkillTag('jueqing',false,target)) return;
var num=get.tag(card,'damage');
if(num){
if(num>1) return 0.5;
return 0;
}
}
}
},
},
},
},
youyi:{
init:function(player){
player.storage.renku=true;
},
audio:2,
enable:'phaseUse',
filter:function(event,player){
return _status.renku.length;
},
prompt:'将仁区所有牌置入弃牌堆令所有角色各回复1点体力',
content:function(){
'step 0'
var cards=_status.renku.slice();
game.cardsDiscard(cards);
_status.renku.removeArray(cards);
player.$throw(cards,1000);
game.updateRenku();
game.log(cards,'被置入了弃牌堆');
'step 1'
var targets=game.filterPlayer();
player.line(targets);
targets.forEach(target=>target.recover());
},
ai:{
order:function(item,player){
return get.order({name:'taoyuan'},player);
},
result:{
player:function(player){
return Math.max(0,game.filterPlayer().reduce((num,target)=>num+get.recoverEffect(target,player,player),0));
},
},
},
group:'youyi_put',
subSkill:{
put:{
audio:'youyi',
trigger:{player:'phaseDiscardEnd'},
filter:function(event,player){
return lib.skill.twlijian.getCards(event).length;
},
prompt2:function(event,player){
return '将'+get.translation(lib.skill.twlijian.getCards(event))+'置入仁区';
},
content:function(){
var cards=lib.skill.twlijian.getCards(trigger);
game.log(player,'将',cards,'置于了仁库');
game.cardsGotoSpecial(cards,'toRenku');
},
},
},
},
//神贾诩
jxlianpo:{
audio:2,
@ -7589,6 +7800,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){
jxlianpo_info:'锁定技。①若场上最大阵营为:反贼,其他角色的手牌上限-1所有角色使用【杀】的次数上限和攻击范围+1主忠其他角色不能对其以外的角色使用【桃】。其他角色死亡后若有多个最大阵营来源摸两张牌并回复1点体力。②一轮游戏开始时你展示一张未加入游戏或已死亡角色的身份牌本轮视为该身份对应阵营的角色数+1。',
jxzhaoluan:'兆乱',
jxzhaoluan_info:'限定技。一名角色死亡前若其此次进入过濒死状态你可以取消之令其加3点体力上限并失去所有非锁定技回复体力至3点摸四张牌。然后你获得如下效果出牌阶段你可以令一名成为过你〖兆乱〗目标的角色减1点体力上限然后对一名此阶段未以此法选择过的角色造成1点伤害。',
shen_huatuo:'神华佗',
shen_huatuo_prefix:'神',
wuling:'五灵',
wuling_info:'出牌阶段限一次,你可以令一名没有“五禽戏”的角色获得“五禽戏”,然后你为其指定一个“五禽戏”的初始效果。',
wuling_wuqinxi:'五禽戏',
wuling_wuqinxi_info:'<br><li>“五禽戏”分为“虎、鹿、熊、猿、鹤”五个不同的效果,有“五禽戏”的角色的准备阶段,将自己“五禽戏”的效果更换为“五禽戏”顺序的下一种效果'+
'<br><li>虎:你使用仅指定唯一目标的牌对目标角色造成的伤害+1'+
'<br><li>鹿获得或更换至此效果时回复1点体力并弃置判定区的所有牌你不能成为延时锦囊牌的目标'+
'<br><li>熊:当你受到伤害时,此伤害-1'+
'<br><li>猿:出牌阶段开始时,你摸两张牌'+
'<br><li>鹤:出牌阶段开始时,你选择一名角色,随机获得其装备区里的一张牌',
youyi:'游医',
youyi_info:'①弃牌阶段结束时你可以将所有于此阶段进入弃牌堆的牌置入仁区。②出牌阶段限一次你可以将仁区的所有牌置入弃牌堆然后令所有角色各回复1点体力。',
extra_feng:'神话再临·风',
extra_huo:'神话再临·火',
@ -7600,6 +7824,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
extra_ol:'神话再临OL',
extra_mobilezhi:'始计篇·智',
extra_mobilexin:'始计篇·信',
extra_mobileren:'始计篇·仁',
extra_offline:'神话再临·线下',
extra_decade:'神·武',
extra_tw:'海外服神将',

View File

@ -10798,6 +10798,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
mamidi:['mamidi','xin_mamidi'],
mengyou:['mengyou','ns_mengyou'],
zhangchu:['zhangchu','jsrg_zhangchu'],
xianglang:['xianglang','re_xianglang'],
},
translate:{
re_panfeng:'潘凤',

View File

@ -6,7 +6,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
connect:true,
characterSort:{
mobile:{
mobile_default:['yanxiang','xin_wuban','laimin','baoxin','jiangji','liwei','xin_guozhao',"miheng","taoqian","lingcao","sunru","lifeng","zhuling","liuye","zhaotongzhaoguang","majun","simazhao","wangyuanji","pangdegong","shenpei","hujinding","zhangyì","jiakui","yangbiao","chendeng","dongcheng","yangyi","dengzhi","zhengxuan","sp_sufei","furong","dingyuan","simashi","yanghuiyu","hucheer","gongsunkang","nanhualaoxian","zhouqun","qiaozhou","fuqian","simafu","mayuanyi","yanpu","sunhanhua","sp_maojie","peixiu","sp_jianggan","ruanhui","xin_mamidi","sp_caosong","yangfu","wangjun","sp_pengyang","qianzhao",'shichangshi'],
mobile_default:['re_xianglang','yanxiang','xin_wuban','laimin','baoxin','jiangji','liwei','xin_guozhao',"miheng","taoqian","lingcao","sunru","lifeng","zhuling","liuye","zhaotongzhaoguang","majun","simazhao","wangyuanji","pangdegong","shenpei","hujinding","zhangyì","jiakui","yangbiao","chendeng","dongcheng","yangyi","dengzhi","zhengxuan","sp_sufei","furong","dingyuan","simashi","yanghuiyu","hucheer","gongsunkang","nanhualaoxian","zhouqun","qiaozhou","fuqian","simafu","mayuanyi","yanpu","sunhanhua","sp_maojie","peixiu","sp_jianggan","ruanhui","xin_mamidi","sp_caosong","yangfu","wangjun","sp_pengyang","qianzhao",'shichangshi'],
mobile_yijiang:["yj_zhanghe","yj_zhangliao","yj_xuhuang","yj_ganning",'yj_huangzhong','yj_weiyan','yj_zhoubuyi'],
mobile_standard:["xin_xiahoudun","xin_zhangfei"],
mobile_shenhua_feng:['re_xiaoqiao',"xin_zhoutai"],
@ -26,6 +26,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
character:{
re_xianglang:['male','shu',3,['naxue','yijie']],
yanxiang:['male','qun',3,['kujian','twruilian'],['character:tw_yanxiang','die_audio:tw_yanxiang']],
mb_sunluyu:['female','wu',3,['mbmeibu','mbmumu']],
xin_wuban:['male','shu',4,['xinjintao'],['clan:陈留吴氏','character:wuban']],
@ -388,6 +389,78 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
skill:{
//向朗
naxue:{
audio:2,
trigger:{player:'phaseUseBefore'},
check:function(event,player){
var cards=player.getCards('h',card=>player.hasValueTarget(card));
if(!cards.length) return true;
if(!(player.hp>=2&&player.countCards('h')<=player.hp+1)) return false;
return game.hasPlayer(function(target){
if(target.hasJudge('lebu')||target==player) return false;
if(get.attitude(player,target)>4){
return (get.threaten(target)/Math.sqrt(target.hp+1)/Math.sqrt(target.countCards('h')+1)>0);
}
return false;
});
},
content:function*(event,map){
var player=map.player;
map.trigger.cancel();
var num=player.countDiscardableCards(player,'he');
if(num){
var result=yield player.chooseToDiscard('纳学:弃置任意张牌并摸等量的牌',[1,num],true).set('ai',lib.skill.zhiheng.check);
if(result.bool) player.draw(result.cards.length);
}
if(player.countCards('he')){
var result2=yield player.chooseCardTarget({
prompt:'纳学:将至多两张牌交给一名其他角色',
selectCard:[1,2],
filterCard:true,
filterTarget:lib.filter.notMe,
forced:true,
position:'he',
ai1:function(card){
if(card.name=='du') return 10;
else if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0;
var player=_status.event.player;
if(ui.selected.cards.length>4||!game.hasPlayer(function(current){
return get.attitude(player,current)>0&&!current.hasSkillTag('nogain');
})) return 0;
return 1/Math.max(0.1,get.value(card));
},
ai2:function(target){
var player=_status.event.player,att=get.attitude(player,target);
if(ui.selected.cards[0].name=='du') return -att;
if(target.hasSkillTag('nogain')) att/=6;
return att;
},
});
if(result2.bool) player.give(result2.cards,result2.targets[0]);
}
},
},
yijie:{
audio:2,
trigger:{player:'die'},
filter:function(event,player){
return game.hasPlayer(target=>target!=player);
},
forced:true,
forceDie:true,
content:function(){
var targets=game.filterPlayer(target=>target!=player);
var sum=targets.reduce((num,target)=>num+=target.hp,0);
sum=Math.max(1,Math.floor(sum/targets.length));
targets.forEach(target=>{
if(target.hp!=sum){
game.log(target,'将体力从',target.hp,'改为',sum);
target.changeHp(sum-target.hp)._triggered=null;
}
});
},
},
//阎象
kujian:{
audio:'twkujian',
@ -15667,6 +15740,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){
yanxiang:'阎象',
kujian:'苦谏',
kujian_info:'出牌阶段限一次,你可以将至多两张手牌称为“谏”并交给一名其他角色,然后你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸两张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。',
re_xianglang:'手杀向朗',
re_xianglang_prefix:'手杀',
naxue:'纳学',
naxue_info:'你可以跳过出牌阶段。若如此做,你弃置任意张牌并摸等量的牌,然后交给一名其他角色至多两张牌。',
yijie:'遗诫',
yijie_info:'锁定技当你死亡时所有其他角色将体力调整为XX为所有其他角色的体力值之和除以所有其他角色数向下取整且X至少为1。',
mobile_standard:'手杀异构·标准包',
mobile_shenhua_feng:'手杀异构·其疾如风',

View File

@ -5,6 +5,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
name:'sb',
connect:true,
character:{
sb_huangyueying:['female','shu',3,['sbqicai','sbjizhi']],
sb_sp_zhugeliang:['male','shu',3,['sbhuoji','sbkanpo']],
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']],
@ -51,6 +54,465 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
},
skill:{
//黄月英
sbqicai:{
mod:{
targetInRange:function(card,player,target){
if(get.type2(card)=='trick') return true;
},
},
init:function(player){
var skill='sbqicai_'+player.playerid;
if(!lib.skill[skill]){
lib.skill[skill]={
onremove:true,
mark:true,
marktext:'奇',
intro:{
markcount:function(storage){
return (storage||0).toString();
},
content:function(storage){
return '已被掠夺'+(storage||0)+'张普通锦囊牌';
},
},
};
lib.translate[skill]='奇才';
lib.translate[skill+'_bg']='奇';
}
},
getLimit:3,
audio:2,
enable:'phaseUse',
filter:function(event,player){
if(!game.hasPlayer(target=>target!=player&&target.hasEmptySlot(2))) return false;
return player.countCards('h',card=>lib.skill.sbqicai.filterCardx(card,player))||Array.from(ui.discardPile.childNodes).some(card=>lib.skill.sbqicai.filterCardx(card,player));
},
filterCardx:function(card,player){
if(player.getStorage('sbqicai').includes(card.name)) return false;
return get.type(card)=='equip'&&get.subtype(card)=='equip2';
},
usable:1,
chooseButton:{
dialog:function(event,player){
var list1=player.getCards('h',card=>lib.skill.sbqicai.filterCardx(card,player));
var list2=Array.from(ui.discardPile.childNodes).filter(card=>lib.skill.sbqicai.filterCardx(card,player));
var dialog=ui.create.dialog('###奇才###<div class="text center">请选择一张防具牌置入一名其他角色的装备区</div>');
if(list1.length){
dialog.add('<div class="text center">手牌区</div>');
dialog.add(list1);
}
if(list2.length){
dialog.add('<div class="text center">弃牌堆</div>');
dialog.add(list2);
}
return dialog;
},
check:function(button){
var player=_status.event.player;
var num=get.value(button.link);
if(!game.hasPlayer(target=>target!=player&&target.hasEmptySlot(2)&&get.attitude(player,target)>0)) num=1/(get.value(button.link)||0.5);
if(get.owner(button.link)) return num;
return num*5;
},
backup:function(links,player){
return {
audio:'sbqicai',
card:links[0],
filterCard:function(card,player){
var cardx=lib.skill.sbqicai_backup.card;
if(get.owner(cardx)) return card==cardx;
return false;
},
selectCard:-1,
filterTarget:function(card,player,target){
return target!=player&&target.canEquip(lib.skill.sbqicai_backup.card);
},
check:()=>1,
discard:false,
lose:false,
prepare:function(cards,player,targets){
if(cards&&cards.length) player.$give(cards,targets[0],false);
},
content:function(){
if(!cards||!cards.length){
cards=[lib.skill.sbqicai_backup.card];
target.$gain2(cards);
game.delayx();
}
player.markAuto('sbqicai',[cards[0].name]);
target.equip(cards[0]);
player.addSkill('sbqicai_gain');
target.addSkill('sbqicai_'+player.playerid);
},
ai:{
result:{
target:function(player,target){
var att=get.attitude(player,target);
if(att>0) return 3;
if(att<0) return -1;
return 0;
},
},
},
}
},
prompt:function(links,player){
return '请选择置入'+get.translation(links)+'的角色';
},
},
ai:{
order:7,
result:{
player:function(player){
if(!game.hasPlayer(target=>target!=player&&target.hasEmptySlot(2)&&get.attitude(player,target)!=0)) return 0;
return 1;
},
},
},
intro:{content:'已使用$发动过此技能'},
subSkill:{
gain:{
audio:'sbqicai',
trigger:{global:['gainAfter','loseAsyncAfter']},
filter:function(event,player){
return game.hasPlayer(function(current){
if(!event.getg(current).length||!current.hasSkill('sbqicai_'+player.playerid)) return false;
if(current.countMark('sbqicai_'+player.playerid)>=lib.skill.sbqicai.getLimit) return false;
return event.getg(current).some(card=>get.type(card)=='trick'&&lib.filter.canBeGained(card,current,player));
});
},
forced:true,
content:function(){
'step 0'
var target=game.findPlayer(function(current){
if(!trigger.getg(current).length||!current.hasSkill('sbqicai_'+player.playerid)) return false;
if(current.countMark('sbqicai_'+player.playerid)>=lib.skill.sbqicai.getLimit) return false;
return trigger.getg(current).some(card=>get.type(card)=='trick'&&lib.filter.canBeGained(card,current,player));
});
event.target=target;
var cards=trigger.getg(target).filter(card=>get.type(card)=='trick'&&lib.filter.canBeGained(card,target,player));
if(cards.length<=lib.skill.sbqicai.getLimit-target.countMark('sbqicai_'+player.playerid)) event._result={bool:true,links:cards};
else{
var num=(lib.skill.sbqicai.getLimit-target.countMark('sbqicai_'+player.playerid));
target.chooseButton(['奇才:将其中'+get.cnNumber(num)+'张牌交给'+get.translation(player),cards],num,true).set('ai',function(button){
return get.value(button.link)*get.sgn(_status.event.att);
}).set('att',get.attitude(target,player));
}
'step 1'
if(result.bool){
target.give(result.links,player);
target.addMark('sbqicai_'+player.playerid,result.links.length,false);
}
},
},
},
},
sbjizhi:{
audio:2,
trigger:{player:'useCard'},
filter:function(event,player){
return get.type(event.card)=='trick';
},
forced:true,
content:function(){
player.draw().gaintag=['sbjizhi'];
player.addTempSkill('sbjizhi_mark')
},
subSkill:{
mark:{
charlotte:true,
onremove:function(player){
player.removeGaintag('sbjizhi');
},
mod:{
ignoredHandcard:function(card,player){
if(card.hasGaintag('sbjizhi')) return true;
},
cardDiscardable:function(card,player,name){
if(name=='phaseDiscard'&&card.hasGaintag('sbjizhi')) return false;
},
},
},
},
},
//诸葛亮
sbhuoji:{
audio:2,
enable:'phaseUse',
filterTarget:lib.filter.notMe,
prompt:'选择一名其他角色对其与其势力相同的所有其他角色各造成1点火属性伤害',
usable:1,
line:false,
content:function(){
var targets=game.filterPlayer(current=>{
if(current==player) return false;
return current.group==target.group;
});
player.line(targets);
targets.forEach(i=>i.damage(1,'fire'));
},
ai:{
order:7,
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',
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;
},
forced:true,
locked:false,
skillAnimation:true,
animationColor:'fire',
content:function(){
player.awakenSkill('sbhuoji');
game.log(player,'成功完成使命');
var list=[];
if(player.name&&get.character(player.name)[3].includes('sbhuoji')) list.add(player.name);
if(player.name1&&get.character(player.name1)[3].includes('sbhuoji')) list.add(player.name1);
if(player.name2&&get.character(player.name2)[3].includes('sbhuoji')) list.add(player.name2);
if(list.length) list.forEach(name=>player.reinit(name,'sb_zhugeliang'));
else{
player.removeSkill(['sbhuoji','sbkanpo']);
player.addSkill(['sbguanxing','sbkongcheng']);
}
},
},
fail:{
audio:'sbhuoji',
trigger:{player:'dying'},
forced:true,
locked:false,
content:function(){
player.awakenSkill('sbhuoji');
game.log(player,'使命失败');
},
},
mark:{
charlotte:true,
trigger:{source:'damage'},
filter:function(event,player){
return event.hasNature('fire');
},
firstDo:true,
forced:true,
popup:false,
content:function(){
player.addTempSkill('sbhuoji_count',{player:['sbhuoji_achieveBegin','sbhuoji_failBegin']});
player.storage.sbhuoji_count=player.getAllHistory('sourceDamage',evt=>evt.hasNature('fire')).reduce((num,evt)=>num+evt.num,0);
player.markSkill('sbhuoji_count');
},
},
count:{
charlotte:true,
intro:{content:'本局游戏已造成过#点火属性伤害'},
},
},
},
sbkanpo:{
audio:2,
trigger:{global:'roundStart'},
forced:true,
locked:false,
content:function*(event,map){
var player=map.player;
var storage=player.getStorage('sbkanpo').slice();
if(storage.length){
player.unmarkAuto('sbkanpo',storage);
}
var result=yield player.chooseButton(['看破:是否记录三张不同的牌名',[lib.inpile.map(name=>[get.translation(get.type(name)),'',name]),'vcard']],3).set('ai',function(button){
switch(button.link[2]){
case 'wuxie':return 5+Math.random();
case 'sha':return 5+Math.random();
case 'tao':return 4+Math.random();
case 'lebu':return 3+Math.random();
case 'shan':return 4.5+Math.random();
case 'wuzhong':return 4+Math.random();
case 'shunshou':return 3+Math.random();
case 'nanman':return 2+Math.random();
case 'wanjian':return 2+Math.random();
default:return Math.random();
}
}).set('filterButton',button=>{
return !_status.event.names.includes(button.link[2]);
}).set('names',storage);
if(result.bool){
var names=result.links.map(link=>link[2]);
player.markAuto('sbkanpo',names);
game.log(player,'记录了','#y'+get.translation(names));
}
},
intro:{content:'已记录$'},
group:'sbkanpo_kanpo',
subSkill:{
kanpo:{
audio:'sbkanpo',
trigger:{global:'useCard'},
filter:function(event,player){
return event.player!=player&&player.getStorage('sbkanpo').includes(event.card.name);
},
prompt:function(event,player){
return '移除'+get.translation(event.card.name)+',令'+get.translation(event.card)+'失效';
},
check:function(event,player){
var effect=0;
if(event.card.name=='wuxie'||event.card.name=='shan'){
if(get.attitude(player,event.player)<-1) effect=-1;
}
else if(event.targets&&event.targets.length){
for(var i=0;i<event.targets.length;i++){
effect+=get.effect(event.targets[i],event.card,event.player,player);
}
}
if(effect<0){
if(event.card.name=='sha'){
var target=event.targets[0];
if(target==player) return !player.countCards('h','shan');
else return target.hp==1||(target.countCards('h')<=2&&target.hp<=2);
}
else return true;
}
return false;
},
logTarget:'player',
content:function(){
player.unmarkAuto('sbkanpo',[trigger.card.name]);
trigger.targets.length=0;
trigger.all_excluded=true;
},
},
},
},
sbguanxing:{
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')));
},
forced:true,
locked:false,
content:function(){
'step 0'
if(trigger.name=='phaseJieshu'){
event.goto(1);
return;
}
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;
var num=Math.min(7,bool?cards.length+1:7);
var cards2=get.cards(num+1);
player.$gain2(cards2,false);
game.log(player,'将',cards2,'置于了武将牌上');
player.loseToSpecial(cards2,'sbguanxing').visible=true;
player.markSkill('sbguanxing');
'step 1'
var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing'));
if(cards.length){
player.chooseToMove().set('list',[
['“星”',cards],
['牌堆顶'],
]).set('prompt','观星:点击将牌移动到牌堆顶').set('processAI',function(list){
var cards=list[0][1].slice(),player=_status.event.player;
var name=_status.event.getTrigger().name;
var target=(name=='phaseBegin'?player:target);
var top=[],att=get.sgn(get.attitude(player,target));
if(att!=0&&(target!=player||!player.hasWuxie())){
for(var i=0;i<judges.length;i++){
var judge=get.judge(judges[i])*att;
cards.sort((a,b)=>judge(b)-judge(a));
if(judge(cards[0])>0) top.unshift(cards.shift());
else break;
}
}
return [cards,top];
}).set('filterOk',function(moved){
return moved[1].length;
});
}
else event._result={bool:false};
'step 2'
if(result.bool){
var cards=result.moved[1];
player.$throw(cards,1000);
for(var i=cards.length-1;i>=0;i--){
player.lose([cards[i]],ui.cardPile,'insert');
}
}
else if(trigger.name=='phaseBegin') player.addTempSkill('sbguanxing_on');
},
group:'sbguanxing_unmark',
subSkill:{
on:{charlotte:true},
unmark:{
trigger:{player:'loseAfter'},
filter:function(event,player){
if(!event.ss||!event.ss.length) return false;
return !player.countCards('s',card=>card.hasGaintag('sbguanxing'));
},
charlotte:true,
forced:true,
silent:true,
content:function(){
player.unmarkSkill('sbguanxing');
},
},
},
marktext:'星',
intro:{
mark:function(dialog,storage,player){
var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing'));
if(!cards||!cards.length) return;
dialog.addAuto(cards);
},
markcount:function(storage,player){
return player.countCards('s',card=>card.hasGaintag('sbguanxing'));
},
onunmark:function(storage,player){
var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing'));
if(cards.length) player.loseToDiscardpile(cards);
},
},
mod:{
aiOrder:function(player,card,num){
var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing'));
if(get.itemtype(card)=='card'&&card.hasGaintag('sbguanxing')) return num+(cards.length>1?0.5:-0.0001);
},
},
},
sbkongcheng:{
audio:2,
trigger:{player:'damageBegin2'},
filter:function(event,player){
return player.hasSkill('sbguanxing');
},
forced:true,
content:function(){
'step 0'
var num=player.countCards('s',card=>card.hasGaintag('sbguanxing'));
event.num=num;
if(!num){
trigger.num++;
event.finish();
}
else player.judge();
'step 1'
if(result.number<=num) trigger.num--;
},
},
//卢植
sbzhenliang:{
mark:true,
@ -5100,6 +5562,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sb_xiaoqiao_prefix:'谋',
sbtianxiang:'天香',
sbtianxiang_info:'①出牌阶段限三次你可以交给一名没有“天香”标记的其他角色一张红色牌然后令其获得此牌花色的“天香”标记。②当你受到伤害时你可以移去一名角色的“天香”标记若此“天香”标记为红桃你防止此伤害其受到伤害来源对其造成的1点伤害若没有伤害来源则改为无来源伤害方片其交给你两张牌。③准备阶段你移去场上所有的“天香”标记然后摸等量的牌。',
sb_sp_zhugeliang:'谋卧龙',
sb_sp_zhugeliang_prefix:'谋',
sb_zhugeliang:'谋诸葛亮',
sb_zhugeliang_prefix:'谋',
sbhuoji:'火计',
sbhuoji_info:'使命技。①使命出牌阶段限一次你可以选择一名其他角色对其和所有势力与其势力相同的其他角色造成1点火属性伤害。②成功准备阶段若你本局游戏已造成的火属性伤害大于等于游戏人数则你将武将牌更换为谋诸葛亮若你没有拥有此技能的武将牌则改为失去〖火计〗和〖看破〗然后获得〖观星〗和〖空城〗。③失败使命成功前进入濒死状态。',
sbkanpo:'看破',
sbkanpo_info:'①一轮开始时,你清除“看破”记录的牌名,然后你可以记录三个非此次移去的牌名的牌名。②一名其他角色使用你“看破”记录的牌名的牌时,你可以从“看破”中移去此牌名,令此牌无效。',
sbguanxing:'观星',
sbguanxing_info:'①准备阶段你将武将牌上所有“星”置入弃牌堆将牌堆顶的X张牌称为“星”置于你的武将牌上X为你此次移去的“星”数+1且至多为7若本次为第一次发动〖观星〗则X为7然后你可以将任意张“星”置于牌堆顶若你未将任意“星”置于牌堆顶你可以于结束阶段将任意张“星”置于牌堆顶。②你可以如手牌般使用或打出“星”。',
sbkongcheng:'空城',
sbkongcheng_info:'锁定技,当你受到伤害时,若你拥有技能〖观星〗,则:若你有“星”,你进行一次判定,若判定结果点数小于等于你的“星”,则此伤害-1没有“星”此伤害+1。',
sb_huangyueying:'谋黄月英',
sb_huangyueying_prefix:'谋',
sbqicai:'奇才',
sbqicai_backup:'奇才',
sbqicai_info:'①出牌阶段限一次,你可以将手牌中或弃牌堆中的一张防具牌置于一名其他角色的装备栏,然后其须将之后获得的前三张基本锦囊牌交给你。②你使用锦囊牌无距离限制。',
sbjizhi:'集智',
sbjizhi_info:'锁定技,当你使用一张普通锦囊牌时,你摸一张牌,且此牌本回合不计入你的手牌上限。',
sb_zhi:'谋攻篇·知',
sb_shi:'谋攻篇·识',

View File

@ -7719,7 +7719,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
zhangjiao:['sp_zhangjiao','re_zhangjiao','sb_zhangjiao','zhangjiao'],
dianwei:['dianwei','ol_dianwei','re_dianwei'],
xunyu:['xunyu','ol_xunyu','re_xunyu'],
sp_zhugeliang:['sp_zhugeliang','ol_sp_zhugeliang','re_sp_zhugeliang'],
sp_zhugeliang:['sp_zhugeliang','ol_sp_zhugeliang','re_sp_zhugeliang','sb_sp_zhugeliang'],
pangtong:['pangtong','ol_pangtong','re_pangtong','sb_pangtong'],
re_jsp_pangtong:['re_jsp_pangtong','jsrg_pangtong','sp_pangtong'],
taishici:['taishici','re_taishici'],

View File

@ -1449,6 +1449,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
][player.countCards('h')%2];
},
check:function(card){
var player=_status.event.player;
if(player.hasSkill('hezhong')){
if(player.countCards('h')-ui.selected.cards.length>1) return 1/(get.value(card)||0.5);
return 0;

View File

@ -2545,8 +2545,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_zhaoyun:['sp_zhaoyun','jsp_zhaoyun'],
machao:['machao','re_machao','sb_machao','ps_machao'],
sp_machao:['sp_machao','dc_sp_machao','jsrg_machao','old_machao'],
zhugeliang:['zhugeliang','re_zhugeliang','ps2066_zhugeliang','ps_zhugeliang'],
huangyueying:['huangyueying','re_huangyueying','junk_huangyueying'],
zhugeliang:['zhugeliang','re_zhugeliang','ps2066_zhugeliang','ps_zhugeliang','sb_zhugeliang'],
huangyueying:['huangyueying','re_huangyueying','junk_huangyueying','sb_huangyueying'],
sunquan:['sunquan','re_sunquan','sb_sunquan','dc_sunquan'],
zhouyu:['zhouyu','re_zhouyu','sb_zhouyu','ps1062_zhouyu','ps2080_zhouyu'],
luxun:['luxun','re_luxun'],