diff --git a/audio/die/ol_zhangzhang.mp3 b/audio/die/ol_zhangzhang.mp3
new file mode 100644
index 000000000..03d811cd2
Binary files /dev/null and b/audio/die/ol_zhangzhang.mp3 differ
diff --git a/audio/skill/olguzheng1.mp3 b/audio/skill/olguzheng1.mp3
new file mode 100644
index 000000000..ad52616e1
Binary files /dev/null and b/audio/skill/olguzheng1.mp3 differ
diff --git a/audio/skill/olguzheng2.mp3 b/audio/skill/olguzheng2.mp3
new file mode 100644
index 000000000..8e0348ae3
Binary files /dev/null and b/audio/skill/olguzheng2.mp3 differ
diff --git a/audio/skill/olzhijian1.mp3 b/audio/skill/olzhijian1.mp3
new file mode 100644
index 000000000..e32c47e09
Binary files /dev/null and b/audio/skill/olzhijian1.mp3 differ
diff --git a/audio/skill/olzhijian2.mp3 b/audio/skill/olzhijian2.mp3
new file mode 100644
index 000000000..5b0619a60
Binary files /dev/null and b/audio/skill/olzhijian2.mp3 differ
diff --git a/character/clan.js b/character/clan.js
index 5a090f6c5..31622434f 100644
--- a/character/clan.js
+++ b/character/clan.js
@@ -2164,7 +2164,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
str+=('摸'+get.cnNumber(Math.min(8,num2-num1))+'张牌,然后手牌上限-1。');
}
str+=('
※当前手牌上限:'+num2);
- var num3=player.countMark('clanguixiang_count');
+ var num3=((_status.event.getParent().phaseIndex||0)+1);
if(num3>0){
str+=(';阶段数:'+num3)
}
@@ -2186,7 +2186,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
ai:{
order:function(item,player){
- var num=player.getHandcardLimit(),numx=player.countMark('clanguixiang_count');
+ var num=player.getHandcardLimit(),numx=((_status.event.getParent().phaseIndex||0)+1);
if(num==5&&numx==4&&player.getStat('skill').clanyirong) return 0;
if(player.countCards('h')==num+1&&num!=2&&(num<=4||num>4&&numx>4)) return 10;
return 0.5;
@@ -2197,56 +2197,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
clanguixiang:{
audio:2,
- init:function(player){
- player.addSkill('clanguixiang_count');
- },
- onremove:function(player){
- player.removeSkill('clanguixiang_count');
- var event=_status.event.getParent('phase');
- if(event) delete event._clanguixiang;
- },
trigger:{
- player:['phaseZhunbeiBefore','phaseJudgeBefore','phaseDrawBefore','phaseDiscardBefore','phaseJieshuBefore'],
+ player:'phaseChange',
},
forced:true,
filter:function(event,player){
- var evt=event.getParent('phase');
- if(!evt||!evt._clanguixiang) return false;
- var num1=player.getHandcardLimit()-1,num2=player.countMark('clanguixiang_count');
+ if(event.phaseList[event.num].startsWith('phaseUse')) return false;
+ var num1=player.getHandcardLimit()-1,num2=event.num;
return num1==num2;
},
content:function(){
- trigger.cancel(null,null,'notrigger');
- var next=player.phaseUse();
- event.next.remove(next);
- trigger.getParent().next.unshift(next);
- },
- subSkill:{
- count:{
- trigger:{
- player:['phaseZhunbeiBegin','phaseJudgeBegin','phaseDrawBegin','phaseDiscardBegin','phaseJieshuBegin','phaseUseBegin'],
- },
- forced:true,
- popup:false,
- lastDo:true,
- priority:-Infinity,
- content:function(){
- player.addMark('clanguixiang_count',1,false);
- },
- group:'clanguixiang_clear',
- },
- clear:{
- trigger:{player:'phaseBefore'},
- forced:true,
- charlotte:true,
- popup:false,
- firstDo:true,
- priority:Infinity,
- content:function(){
- delete player.storage.clanguixiang_count;
- trigger._clanguixiang=true;
- },
- },
+ trigger.phaseList[trigger.num]='phaseUse|clanguixiang';
+ game.delayx();
},
},
clanmuyin:{
diff --git a/character/ddd.js b/character/ddd.js
index 53dbc276e..ad2e67a17 100644
--- a/character/ddd.js
+++ b/character/ddd.js
@@ -3304,14 +3304,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dddduanbing:{
enable:'phaseUse',
filter:function(event,player){
- return player.canAddJudge('bingliang')&&player.hasCard((card)=>lib.skill['dddduanbing'].filterCard(card,player),'h');
+ return player.canAddJudge('bingliang')&&player.hasCard((card)=>lib.skill['dddduanbing'].filterCard(card,player),'he');
},
filterCard:function(card,player){
if(get.color(card)!='black'||get.type2(card)=='trick') return false;
return player.canAddJudge(get.autoViewAs({name:'bingliang'},[card]));
},
check:function(card){
- return 6-get.value(card);
+ return 8.2-get.value(card);
},
discard:false,
lose:false,
diff --git a/character/diy.js b/character/diy.js
index ceeba6270..7a1dcc2ed 100755
--- a/character/diy.js
+++ b/character/diy.js
@@ -178,7 +178,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ns_chengpu:['male','wu',4,['decadelihuo','decadechunlao']],
ns_sundeng:['male','wu',4,['xinkuangbi']],
ns_duji:['male','wei',3,['xinfu_andong','xinyingshi']],
- old_majun:["male","wei",3,["xinfu_jingxie1","xinfu_qiaosi"],[]],
+ old_majun:["male","wei",3,["xinfu_jingxie1","xinfu_qiaosi"]],
+ ns_mengyou:['male','qun',4,['nsmanzhi']],
old_jiakui:['male','wei',4,['tongqu','xinwanlan']],
ol_guohuai:['male','wei',3,['rejingce']],
@@ -219,7 +220,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
"ns_chentai","ns_huangwudie","ns_sunyi","ns_zhangning","ns_yanghu"],
diy_yijiang3:['ns_ruanji','ns_zanghong','ns_limi','ns_zhonglimu','prp_zhugeliang','key_seira','key_kiyu','key_tomoyo','key_minagi','key_michiru'],
diy_tieba:["ns_zuoci","ns_lvzhi","ns_wangyun","ns_nanhua","ns_nanhua_left","ns_nanhua_right","ns_huamulan","ns_huangzu","ns_jinke","ns_yanliang","ns_wenchou","ns_caocao","ns_caocaosp","ns_zhugeliang","ns_wangyue","ns_yuji","ns_xinxianying","ns_guanlu","ns_simazhao","ns_sunjian","ns_duangui","ns_zhangbao","ns_masu","ns_zhangxiu","ns_lvmeng","ns_shenpei","ns_yujisp","ns_yangyi","ns_liuzhang","ns_xinnanhua","ns_luyusheng"],
- diy_fakenews:["diy_wenyang","ns_zhangwei","ns_caimao","ns_chengpu",'ns_sundeng','ns_duji'],
+ diy_fakenews:["diy_wenyang","ns_zhangwei","ns_caimao","ns_chengpu",'ns_sundeng','ns_duji','ns_mengyou'],
diy_xushi:["diy_feishi","diy_hanlong","diy_liufu","diy_liuyan","diy_liuzan","diy_tianyu","diy_xizhenxihong","diy_yangyi","diy_zaozhirenjun"],
diy_default:["diy_yuji","diy_caiwenji","diy_lukang","diy_zhenji","old_majun"],
diy_noname:['noname'],
@@ -373,6 +374,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ns_zhangxiu:'#p本因坊神策',
ns_yangyi:'#p本因坊神策',
ns_liuzhang:'#r矮子剑薄荷糖',
+ ns_mengyou:'#g残昼厄夜',
},
card:{
kano_paibingbuzhen:{
@@ -2599,7 +2601,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
else game.delayx();
'step 3'
- player.addTempSkill('nstuilun_effect',{player:'phaseBegin'});
+ player.addTempSkill('nstuilun_effect',{player:'phaseBeginStart'});
},
subSkill:{
effect:{
@@ -3560,7 +3562,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(player.countCards('h')>0) player.chooseToDiscard('h',true,player.countCards('h'));
player.recover();
trigger.cancel();
- player.addTempSkill('kyou_duanfa_draw',{player:'phaseBegin'});
+ player.addTempSkill('kyou_duanfa_draw',{player:'phaseBeginStart'});
},
subSkill:{
draw:{
@@ -6370,9 +6372,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var num=game.roundNumber;
if(num&&typeof num=='number') player.draw(Math.min(3,num));
'step 1'
- var next=player.phaseUse();
- event.next.remove(next);
- trigger.next.push(next);
+ trigger.phaseList.splice(trigger.num,0,'phaseUse|godan_yuanyi');
},
},
godan_feiqu:{
@@ -17953,6 +17953,96 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
},
+ nsmanzhi:{
+ audio:'dcmanzhi',
+ trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']},
+ direct:true,
+ filter:function(event,player){
+ var nums=[];
+ game.countPlayer(current=>{
+ nums.add(current.hp);
+ nums.add(current.maxHp);
+ nums.add(current.countCards('h'));
+ nums.add(current.countCards('e'));
+ nums.add(current.countCards('j'));
+ });
+ for(var a of nums){
+ for(var b of nums){
+ if((0.5*a*a)+(2.5*b)-game.roundNumber==game.countPlayer()) return true;
+ }
+ }
+ return false;
+ },
+ content:function(){
+ 'step 0'
+ var nums=[];
+ game.countPlayer(current=>{
+ nums.add(current.hp);
+ nums.add(current.maxHp);
+ nums.add(current.countCards('h'));
+ nums.add(current.countCards('e'));
+ nums.add(current.countCards('j'));
+ });
+ nums.sort((a,b)=>a-b);
+ var a=null,b=null,goon=false;
+ for(a of nums){
+ for(b of nums){
+ if((0.5*a*a)+(2.5*b)-game.roundNumber==game.countPlayer()){
+ goon=true;
+ break;
+ }
+ }
+ if(goon) break;
+ }
+ player.chooseButton(2,[
+ '蛮智:请选择让下列等式成立的A与B的值',
+ '
目标等式
',
+ `0.5 × A² + 2.5 × B - ${game.roundNumber} = ${game.countPlayer()}`,
+ 'A的可选值
',
+ [nums.map(i=>{
+ return [
+ `A|${i}`,
+ i==a?(`${i}`):i,
+ ]
+ }),'tdnodes'],
+ 'B的可选值
',
+ [nums.map(i=>{
+ return [
+ `B|${i}`,
+ i==b?(`${i}`):i,
+ ]
+ }),'tdnodes'],
+ ]).set('filterButton',function(button){
+ if(!ui.selected.buttons.length) return true;
+ return button.link[0]!=ui.selected.buttons[0].link[0];
+ }).set('filterOk',function(){
+ if(ui.selected.buttons.length!=2) return false;
+ var a,b;
+ for(var i of ui.selected.buttons){
+ if(i.link[0]=='A') a=parseInt(i.link.slice(2));
+ else b=parseInt(i.link.slice(2));
+ }
+ return (0.5*a*a)+(2.5*b)-game.roundNumber==game.countPlayer();
+ }).set('choice',[a,b]).set('ai',(button)=>{
+ var choice=_status.event.choice;
+ if(button.link==`A|${choice[0]}`||button.link==`B|${choice[1]}`) return 1;
+ return 0;
+ });
+ 'step 1'
+ if(result.bool){
+ var a,b;
+ for(var i of result.links){
+ if(i[0]=='A') a=parseInt(i.slice(2));
+ else b=parseInt(i.slice(2));
+ }
+ equals=`0.5×${a}²+2.5×${b}-${game.roundNumber}=${game.countPlayer()}`;
+ player.logSkill('nsmanzhi');
+ player.chat(equals);
+ game.log(player,'的计算结果为',equals);
+ player.draw(game.countPlayer());
+ }
+ },
+ },
},
dynamicTranslate:{
nsjiquan:function(player){
@@ -19030,6 +19120,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){
junk_huangyueying_prefix:'旧界',
old_majun:'骰子马钧',
old_majun_prefix:'骰子',
+ ns_mengyou:'数学孟优',
+ ns_mengyou_prefix:'数学',
+ ns_mengyou_ab:'孟优',
+ nsmanzhi:'蛮智',
+ nsmanzhi_info:'准备阶段或结束阶段开始时,你可以将场上出现的数字代入等式中的A和B。若此等式成立,你摸Y张牌。(等式为Y=0.5A²+2.5B-X,其中X为游戏轮数,Y为存活人数)',
+ ns_chengpu:'铁索程普',
+ ns_chengpu_prefix:'铁索',
+ ns_chengpu_ab:'程普',
+ ns_sundeng:'画饼孙登',
+ ns_sundeng_prefix:'画饼',
+ ns_sundeng_ab:'孙登',
+ ns_duji:'画饼杜畿',
+ ns_duji_prefix:'画饼',
+ ns_duji_ab:'杜畿',
diy_tieba:'吧友设计',
diy_xushi:'玩点论杀·虚实篇',
@@ -19041,12 +19145,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
diy_yijiang3:'设计比赛2022',
diy_fakenews:'杀海流言',
diy_trashbin:'垃圾桶',
- ns_chengpu:'铁索程普',
- ns_chengpu_ab:'程普',
- ns_sundeng:'画饼孙登',
- ns_sundeng_ab:'孙登',
- ns_duji:'画饼杜畿',
- ns_duji_ab:'杜畿',
},
pinyins:{
加藤うみ:['Kato','Umi'],
diff --git a/character/extra.js b/character/extra.js
index ac81f163b..72c31d4e2 100755
--- a/character/extra.js
+++ b/character/extra.js
@@ -3586,7 +3586,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
huoxin2:{
trigger:{
player:['phaseAfter','dieAfter'],
- global:'phaseBefore',
+ global:'phaseBeforeStart',
},
lastDo:true,
charlotte:true,
@@ -5412,7 +5412,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.chooseTarget(get.prompt('dawu'),'令至多'+get.cnNumber(num)+'名角色获得“大雾”标记',
[1,num]).set('ai',function(target){
if(target.isMin()) return 0;
- if(target.hasSkill('biantian2')) return 0;
+ if(target.hasSkill('biantian2')||target.hasSkill('dawu2')) return 0;
var att=get.attitude(player,target);
if(att>=4){
if(_status.event.allUse) return att;
@@ -5426,13 +5426,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){
})*2);
"step 1"
if(result.bool){
- player.logSkill('dawu',result.targets,'thunder');
- var length=result.targets.length;
- for(var i=0;i{
+ target.addAdditionalSkill(`dawu_${player.playerid}`,'dawu2');
+ target.markAuto('dawu2',[player]);
+ });
+ player.addTempSkill('dawu3',{player:'phaseBeginStart'})
player.chooseCardButton('选择弃置'+get.cnNumber(length)+'张“星”',length,player.getExpansions('qixing'),true);
- player.addSkill('dawu3');
}
else{
event.finish();
@@ -5443,46 +5445,41 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ai:{combo:'qixing'},
},
dawu2:{
- trigger:{player:'damageBegin4'},
- filter:function(event){
- if(!event.hasNature('thunder')) return true;
- return false;
- },
- mark:true,
- forced:true,
charlotte:true,
- content:function(){
- trigger.cancel();
- },
ai:{
nofire:true,
nodamage:true,
effect:{
target:function(card,player,target,current){
- if(get.tag(card,'damage')&&!get.tag(card,'thunderDamage')) return [0,0];
+ if(get.tag(card,'damage')&&!get.tag(card,'thunderDamage')) return 'zeroplayertarget';
}
},
},
intro:{
- markcount:()=>1,
- content:'共有1个标记',
+ content:function(storage){
+ return `共有${storage.length}枚标记`;
+ },
}
},
dawu3:{
- trigger:{player:['phaseBegin','dieBegin']},
- silent:true,
+ trigger:{global:'damageBegin4'},
+ filter:function(event,player){
+ return !event.hasNature('thunder')&&event.player.getStorage('dawu2').includes(player);
+ },
+ forced:true,
charlotte:true,
+ logTarget:'player',
content:function(){
- for(var i=0;i{
+ if(current.getStorage('dawu2').includes(player)){
+ current.unmarkAuto('dawu2',player);
+ current.removeAdditionalSkill(`dawu_${player.playerid}`);
}
- if(game.players[i].hasSkill('kuangfeng2')){
- game.players[i].removeSkill('kuangfeng2');
- }
- }
- player.removeSkill('dawu3');
- }
+ },true);
+ },
},
kuangfeng:{
unique:true,
@@ -5499,13 +5496,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
"step 1"
if(result.bool){
- var length=result.targets.length;
- for(var i=0;i{
+ target.addAdditionalSkill(`kuangfeng_${player.playerid}`,'kuangfeng2');
+ target.markAuto('kuangfeng2',[player]);
+ });
+ player.addTempSkill('kuangfeng3',{player:'phaseBeginStart'})
+ player.chooseCardButton('选择弃置'+get.cnNumber(length)+'张“星”',length,player.getExpansions('qixing'),true);
}
else{
event.finish();
@@ -5516,28 +5515,40 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ai:{combo:'qixing'},
},
kuangfeng2:{
- trigger:{player:'damageBegin3'},
- filter:function(event){
- if(event.hasNature('fire')) return true;
- return false;
- },
- mark:true,
+ charlotte:true,
intro:{
- markcount:()=>1,
- content:'共有1个标记'
- },
- forced:true,
- content:function(){
- trigger.num++;
+ content:function(storage){
+ return `共有${storage.length}枚标记`;
+ },
},
ai:{
effect:{
target:function(card,player,target,current){
- if(get.tag(card,'fireDamage')) return 1.5;
+ if(get.tag(card,'fireDamage')&¤t<0) return 1.5;
}
}
}
},
+ kuangfeng3:{
+ trigger:{global:'damageBegin3'},
+ filter:function(event){
+ return event.hasNature('fire')&&event.player.getStorage('kuangfeng2').includes(player);
+ },
+ charlotte:true,
+ forced:true,
+ logTarget:'player',
+ content:function(){
+ trigger.num++;
+ },
+ onremove:function(player){
+ game.countPlayer2(current=>{
+ if(current.getStorage('kuangfeng2').includes(player)){
+ current.unmarkAuto('kuangfeng2',player);
+ current.removeAdditionalSkill(`kuangfeng_${player.playerid}`);
+ }
+ },true);
+ },
+ },
yeyan:{
unique:true,
forceDie:true,
diff --git a/character/huicui.js b/character/huicui.js
index 3411e5a22..b7301ba44 100644
--- a/character/huicui.js
+++ b/character/huicui.js
@@ -6398,6 +6398,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger.directHit.push(trigger.target);
}
},
+ ai:{
+ effect:{
+ player:function(card,player,target){
+ if(player!==target&&get.itemtype(target)==='player'&&(card.name==='sha'||get.type(card,false)==='trick')&&
+ target.countCards('he')&&!target.hasSkillTag('noh')) return [1,0,1,-1];
+ }
+ }
+ }
},
},
},
@@ -10090,6 +10098,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_jiaxu:['sp_jiaxu','dc_sp_jiaxu','yj_jiaxu'],
qiaorui:['qiaorui','tw_qiaorui'],
mamidi:['mamidi','xin_mamidi'],
+ mengyou:['mengyou','ns_mengyou'],
},
translate:{
re_panfeng:'潘凤',
diff --git a/character/jiange.js b/character/jiange.js
index cad3400b3..937a6e4a4 100644
--- a/character/jiange.js
+++ b/character/jiange.js
@@ -201,7 +201,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
},
chiying:{
- trigger:{global:'damageBegin'},
+ trigger:{global:'damageBegin2'},
check:function(event,player){
return get.attitude(player,event.player)>0;
},
@@ -209,7 +209,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(event.num<=1) return false;
return true;
},
- priority:-11,
content:function(){
trigger.num=1;
if(trigger.source){
diff --git a/character/mobile.js b/character/mobile.js
index 8777ac537..d14170729 100644
--- a/character/mobile.js
+++ b/character/mobile.js
@@ -4595,7 +4595,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
viewAsFilter:function(player){
return player.hasCard({type:'equip'},'ehs');
},
- check:(card)=>5-get.value(card),
+ check:function(card){
+ if(_status.event.type=='dying') return 1/(get.value(card)||0.5);
+ return 5-get.value(card);
+ },
locked:false,
mod:{
maxHandcard:function(player,num){
@@ -12165,7 +12168,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player:"linkBefore",
},
forced:true,
- priority:20,
+ //priority:20,
filter:function(event,player){
return !player.isLinked();
},
@@ -13179,7 +13182,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
cancel:{
trigger:{player:'phaseUseEnd'},
- priority:50,
+ firstDo:true,
silent:true,
charlotte:true,
content:function(){
diff --git a/character/offline.js b/character/offline.js
index 0b0164d47..83492160f 100644
--- a/character/offline.js
+++ b/character/offline.js
@@ -944,6 +944,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
content:function(){
trigger.cancel();
+ },
+ ai:{
+ effect:{
+ target:function(card,player,target){
+ if(card.name==='sha'&&!game.hasNature(card)&&target.hasEmptySlot(2)) return 'zeroplayertarget';
+ if(get.subtype(card)=='equip2'&&target.isEmpty(2)) return [0.6,-0.8];
+ }
+ }
}
},
//战役篇蒋钦
@@ -1976,7 +1984,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
subSkill:{
skip:{
- trigger:{player:'phaseBefore'},
+ trigger:{player:'phaseBeforeStart'},
forced:true,
priority:Infinity,
popup:false,
diff --git a/character/rank.js b/character/rank.js
index 46186010d..0b8cf1ab1 100644
--- a/character/rank.js
+++ b/character/rank.js
@@ -960,6 +960,7 @@ window.noname_character_rank={
'mengyou',
're_wenpin',
'yue_zhoufei',
+ 'ns_mengyou',
],
b:[
'diy_feishi',
@@ -1969,6 +1970,7 @@ window.noname_character_rank={
'clan_zhonghui',
'zhoubuyi',
'dc_wangjun',
+ 'ns_mengyou',
'key_kano',
'key_haruko',
'key_akiko',
diff --git a/character/shenhua.js b/character/shenhua.js
index f3098cfe5..12d929fba 100755
--- a/character/shenhua.js
+++ b/character/shenhua.js
@@ -3804,6 +3804,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
preHidden:true,
audioname:['sp_lvmeng','re_sunben','re_sunce'],
+ mod:{
+ aiOrder:function(player,card,num){
+ if(get.color(card)==='red'&&get.name(card)==='sha') return get.order({name: 'sha'})+0.15;
+ }
+ },
trigger:{
player:'useCardToPlayered',
target:'useCardToTargeted',
@@ -3812,6 +3817,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(!(event.card.name=='juedou'||(event.card.name=='sha'&&get.color(event.card)=='red'))) return false;
return player==event.target||event.getParent().triggeredTargets3.length==1;
},
+ locked:false,
frequent:true,
content:function(){
player.draw();
@@ -4872,9 +4878,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
preHidden:true,
check:function(event,player){
- if(player.countCards('h')<=1) return true;
- return game.hasPlayer(function(current){
- return current!=player&¤t.isMinHandcard()&&get.attitude(player,current)>0;
+ return (player.countCards('h')+2+event.num)<=5||game.hasPlayer(function(target){
+ return player!==target&&!game.hasPlayer(function(current){
+ return current!==player&¤t!==target&¤t.countCards('h')0;
});
},
content:function(){
@@ -6276,30 +6283,33 @@ game.import('character',function(lib,game,ui,get,ai,_status){
useShan:true,
effect:{
target:function(card,player,target,current){
- if(get.tag(card,'respondShan')){
- var hastarget=game.hasPlayer(function(current){
- return get.attitude(target,current)<0;
- });
- var be=target.countCards('e',{color:'black'});
- if(target.countCards('h','shan')&&be){
- if(!target.hasSkill('guidao')) return 0;
- return [0,hastarget?target.countCards('he')/2:0];
+ if(get.tag(card,'respondShan')&&!player.hasSkillTag('directHit_ai',true,{
+ target: target,
+ card: card
+ },true)){
+ let club=0,spade=0;
+ if(game.hasPlayer(function(current){
+ return get.attitude(target,current)<0&&get.damageEffect(current,target,target,'thunder')>0;
+ })){
+ club=2;
+ spade=4;
}
- if(target.countCards('h','shan')&&target.countCards('h')>2){
- if(!target.hasSkill('guidao')) return 0;
- return [0,hastarget?target.countCards('h')/4:0];
- }
- if(target.countCards('h')>3||(be&&target.countCards('h')>=2)){
- return [0,0];
- }
- if(target.countCards('h')==0){
- return [1.5,0];
- }
- if(target.countCards('h')==1&&!be){
- return [1.2,0];
- }
- if(!target.hasSkill('guidao')) return [1,0.05];
- return [1,Math.min(0.5,(target.countCards('h')+be)/4)];
+ if(!target.isHealthy()) club+=2;
+ if(!club&&!spade) return 1;
+ if(!target.mayHaveShan(player)) return 1-0.1*Math.min(5,target.countCards('hs'));
+ if(!target.hasSkillTag('rejudge')) return [1,(club+spade)/4];
+ let pos=player.hasSkillTag('viewHandcard',null,target,true)?'hes':'e',better=club>spade?'club':'spade',max=0;
+ target.hasCard(function(cardx){
+ if(get.suit(cardx)===better){
+ max=2;
+ return true;
+ }
+ if(spade&&get.color(cardx)==='black') max=1;
+ },pos);
+ if(max===2) return [1,Math.max(club,spade)];
+ if(max===1) return [1,Math.min(club,spade)];
+ if(pos==='e') return [1,Math.min(Math.max(1,target.countCards('hs'))*(club+spade)/4,Math.max(club,spade))];
+ return [1,(club+spade)/4];
}
}
}
@@ -7259,17 +7269,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){
useShan:true,
effect:{
target:function(card,player,target,current){
- if(get.tag(card,'respondShan')){
- var hastarget=game.hasPlayer(function(current){
- return get.attitude(target,current)<0;
- });
- if(target.countCards('h','shan')&&target.countCards('e',{suit:'spade'})){
- return [0,hastarget?target.countCards('he')/2:0];
- }
- if(target.countCards('h','shan')){
- return [1,hastarget?target.countCards('he')/2:0];
- }
- return [1,target.countCards('h')/4];
+ if(get.tag(card,'respondShan')&&!player.hasSkillTag('directHit_ai',true,{
+ target: target,
+ card: card
+ },true)&&game.hasPlayer(function(current){
+ return get.attitude(target,current)<0&&get.damageEffect(current,target,target,'thunder')>0;
+ })){
+ if(!target.mayHaveShan(player)) return 1-0.1*Math.min(5,target.countCards('hs'));
+ if(!target.hasSkillTag('rejudge')) return [1,1];
+ let pos=player.hasSkillTag('viewHandcard',null,target,true)?'hes':'e';
+ if(target.hasCard(function(cardx){
+ return get.suit(cardx)==='spade';
+ },pos)) return [1,4];
+ if(pos==='e') return [1,Math.min(4,1+0.75*Math.max(1,target.countCards('hs')))];
+ return [1,1];
}
}
}
diff --git a/character/sp.js b/character/sp.js
index 365e5e325..72f66f354 100755
--- a/character/sp.js
+++ b/character/sp.js
@@ -4054,9 +4054,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 0'
player.damage('nosource');
'step 1'
- var next=player.phaseUse();
- event.next.remove(next);
- trigger.next.push(next);
+ trigger.phaseList.splice(trigger.num,0,'phaseUse|oldianjun');
},
},
olkangrui:{
diff --git a/character/sp2.js b/character/sp2.js
index 8635c4118..e72035f52 100644
--- a/character/sp2.js
+++ b/character/sp2.js
@@ -8836,7 +8836,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
},
zongkui:{
- trigger:{player:'phaseBefore',global:'roundStart'},
+ trigger:{
+ player:'phaseBeforeEnd',
+ global:'roundStart',
+ },
direct:true,
audio:2,
audioname:['tw_beimihu'],
@@ -10208,7 +10211,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
zongkui:'纵傀',
zongkui_mark:'纵傀',
zongkui_mark_bg:'傀',
- zongkui_info:'回合开始时,你可以指定一名未拥有“傀”标记的其他角色,令其获得一枚“傀”标记。每轮游戏开始时,你指定一名体力值最少且没有“傀”标记的其他角色,令其获得一枚“傀”标记。',
+ zongkui_info:'回合开始前,你可以指定一名未拥有“傀”标记的其他角色,令其获得一枚“傀”标记。一轮游戏开始时,你指定一名体力值最少且没有“傀”标记的其他角色,令其获得一枚“傀”标记。',
guju:'骨疽',
guju_info:'锁定技,拥有“傀”标记的角色受到伤害后,你摸一张牌。',
baijia:'拜假',
diff --git a/character/xianding.js b/character/xianding.js
index 1e2b7904c..6850f0c48 100644
--- a/character/xianding.js
+++ b/character/xianding.js
@@ -4585,11 +4585,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
//周宣
dcwumei:{
audio:2,
- trigger:{player:'phaseBegin'},
+ trigger:{player:'phaseBeginStart'},
filter:function(event,player){
return !player.hasSkill('dcwumei_used');
},
- priority:10,//离谱的优先机制
direct:true,
content:function(){
'step 0'
@@ -4616,6 +4615,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger._triggered=5;
var evt=player.insertPhase();
delete evt.skill;
+ game.broadcastAll(function(player){
+ player.classList.remove('glow_phase');
+ delete _status.currentPhase;
+ },player);
}
}
},
@@ -10550,6 +10553,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){
content:function(){
player.draw(2+get.sgn(trigger.player.hp-player.hp));
},
+ ai:{
+ effect:{
+ target:function(card,player,target){
+ if(get.itemtype(player)!=='player'||player===target) return 1;
+ let num=1,ds=2+get.sgn(player.hp-target.hp);
+ if(player===_status.currentPhase&&_status.currentPhase.group==='qun'&&target.hasZhuSkill('yuwei',player)) num=2;
+ if(target.getHistory('gain',function(evt){
+ return evt.getParent(2).name==='shiyuan'&&evt.cards.length===ds;
+ }).length>=num) return 1;
+ let name=get.name(card);
+ if(get.tag(card,'lose')||name==='huogong'||name==='juedou'||name==='tiesuo') return [1,ds];
+ if(!target.hasFriend()) return 1;
+ return [1,0.8*ds];
+ }
+ }
+ }
},
dushi:{
audio:2,
diff --git a/character/yijiang.js b/character/yijiang.js
index 3135aa285..ea57992f9 100755
--- a/character/yijiang.js
+++ b/character/yijiang.js
@@ -2508,10 +2508,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ol_guansuo:'dangxian_guansuo',
},
content:function(){
- var next=player.phaseUse();
- next.xindangxian=true;
- event.next.remove(next);
- trigger.next.push(next);
+ trigger.phaseList.splice(trigger.num,0,'phaseUse|xindangxian');
},
group:'xindangxian_rewrite',
subSkill:{
@@ -2520,7 +2517,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
forced:true,
popup:false,
filter:function(kagari){
- return kagari.xindangxian==true;
+ return kagari._extraPhaseReason=='xindangxian';
},
content:function(){
'step 0'
@@ -7664,9 +7661,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
audioname:['guansuo'],
content:function(){
- var next=player.phaseUse();
- event.next.remove(next);
- trigger.next.push(next);
+ trigger.phaseList.splice(trigger.num,0,'phaseUse|dangxian');
}
},
longyin:{
@@ -10588,6 +10583,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
content:function(){
"step 0"
+ if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.2);
player.draw(2);
"step 1"
player.chooseCard(2,'he',true,'交给'+get.translation(trigger.player)+'两张牌').set('ai',function(card){
@@ -10602,8 +10598,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger.player.storage.xiantu4.push(player);
},
ai:{
- threaten:1.1,
- expose:0.3
+ threaten:1.1
}
},
xiantu1:{audio:true},
diff --git a/character/yingbian.js b/character/yingbian.js
index e6f489f3c..181424f12 100644
--- a/character/yingbian.js
+++ b/character/yingbian.js
@@ -2592,10 +2592,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return player!=event.player&&event.num-2) return false;
- if(player.hp>2) return true;
- if(player.hp==2&&event.player.hp<3) return false;
- return player.hp>1;
+ if(event.player.hasSkillTag('nodamage')) return false;
+ let tj = player.countCards('hs', function (card) {
+ return get.name(card) === 'tao' || get.name(card) === 'jiu';
+ }),
+ att = get.attitude(_status.event.player, event.player),
+ eff = get.damageEffect(event.player, player, _status.event.player, event.nature),
+ fd = event.player.hasSkillTag('filterDamage', null, {
+ player: player,
+ card: event.card
+ }),
+ hp = player.hp + tj;
+ if(player.storage.tairan2) hp -= player.storage.tairan2;
+ if(eff <= 0 || fd || att >= -2 || Math.abs(hp) <= 1) return false;
+ if(hp > 2 || event.player.isLinked() && event.nature && eff > 0) return true;
+ return !event.player.countCards('hs') || event.player.hp > 2 * event.num && !event.player.hasSkillTag('maixie');
},
logTarget:'player',
content:function(){
@@ -2604,6 +2615,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger.yimie_num=trigger.player.hp-trigger.num;
trigger.num=trigger.player.hp;
},
+ ai:{
+ damageBonus:true,
+ skillTagFilter:function(player,tag,arg){
+ return arg && arg.target && arg.target.hp > 1 && player.hp > 1 && get.attitude(player, arg.target) < -2;
+ }
+ }
},
yimie2:{
trigger:{player:'damageEnd'},
diff --git a/game/game.js b/game/game.js
index ba6f9e00d..4efa13d6e 100644
--- a/game/game.js
+++ b/game/game.js
@@ -14388,7 +14388,7 @@
next.setContent(info.content);
next.skillHidden=event.skillHidden;
if(info.forceDie) next.forceDie=true;
- if(info.forceOut||event.skill=='_turnover') next.includeOut=true;
+ if(info.forceOut) next.includeOut=true;
"step 4"
if(player._hookTrigger){
for(var i=0;i0){
+ game.players[i].outCount--;
+ if(game.players[i].outCount==0&&!game.players[i].outSkills){
+ game.players[i].in();
+ }
+ }
+ }
+ event.trigger('roundStart');
+ }
+ }
+ _status.globalHistory.push({
+ cardMove:[],
+ custom:[],
+ useCard:[],
+ changeHp:[],
+ everything:[],
+ });
+ var players=game.players.slice(0).concat(game.dead);
+ for(var i=0;igame.players.length*num&&game.showIdentity){
+ if(!_status.video) player.popup('显示身份');
+ _status.identityShown=true;
+ game.showIdentity(false);
+ }
+ }
+ player.ai.tempIgnore=[];
+ if(ui.land&&ui.land.player==player){
+ game.addVideo('destroyLand');
+ ui.land.destroy();
+ }
+ 'step 6'
+ //规则集中的“回合开始后⑦”,国战武将明置武将牌
+ event.trigger('phaseBeginStart');
+ 'step 7'
+ //规则集中的“回合开始后⑨”,进行当先,化身等操作
+ //没有⑧ 因为⑧用不到
+ event.trigger('phaseBegin');
+ //阶段部分
+ 'step 8'
+ if(num1){
+ next._extraPhaseReason=phase[1];
+ }
+ if(event.currentPhase=='phaseDraw'||event.currentPhase=='phaseDiscard'){
+ if(!player.noPhaseDelay){
+ if(player==game.me){
+ game.delay();
+ }
+ else{
+ game.delayx();
+ }
+ }
+ }
+ }
+ 'step 10'
+ if(event.currentPhase=='phaseUse'){
+ game.broadcastAll(function(){
+ if(ui.tempnowuxie){
+ ui.tempnowuxie.close();
+ delete ui.tempnowuxie;
+ }
+ });
+ delete player._noSkill;
+ }
+ event.num++;
+ 'step 11'
+ if(event.num