Merge pull request #214 from mengxinzxz/PR-Branch

族钟会+bug修复
This commit is contained in:
Spmario233 2023-08-14 00:21:15 +08:00 committed by GitHub
commit 6c3a5a75dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 314 additions and 41 deletions

BIN
audio/die/clan_zhonghui.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/skill/clanxieshu1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/clanxieshu2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/clanyuzhi1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/clanyuzhi2.mp3 Normal file

Binary file not shown.

Binary file not shown.

View File

@ -18,6 +18,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
clan_zhongyan:['female','jin',3,['clanguangu','clanxiaoyong','clanbaozu'],['clan:颍川钟氏']],
clan_wangyun:['male','qun',3,['clanjiexuan','clanmingjie','clanzhongliu'],['clan:太原王氏']],
clan_wanghun:['male','jin',3,['clanfuxun','clanchenya','clanzhongliu'],['clan:太原王氏']],
clan_zhonghui:['male','wei','3/4',['clanyuzhi','clanxieshu','clanbaozu'],['clan:颍川钟氏']],
},
characterSort:{
clan:{
@ -25,10 +26,102 @@ game.import('character',function(lib,game,ui,get,ai,_status){
clan_xun:['clan_xunshu','clan_xunchen','clan_xuncai','clan_xuncan'],
clan_han:['clan_hanshao','clan_hanrong'],
clan_wang:['clan_wangling','clan_wangyun','clan_wanghun'],
clan_zhong:['clan_zhongyan'],
clan_zhong:['clan_zhongyan','clan_zhonghui'],
},
},
skill:{
//族钟会
clanyuzhi:{
mod:{
aiOrder:function(player,card,num){
if(card.name=='tao') return num/114514;
},
},
audio:2,
trigger:{global:'roundStart'},
direct:true,
locked:true,
content:function(){
'step 0'
var num1=0,num2=0,num3=0,bool=true;
var history=player.actionHistory;
for(var i=history.length-2;i>=0;i--){
for(var evt of history[i].gain){
if(evt.getParent().name=='draw'&&evt.getParent(2).name=='clanyuzhi'){
if(bool) num1+=evt.cards.length;
else num2+=evt.cards.length;
}
}
if(bool) num3+=history[i].useCard.length;
if(history[i].isRound){
if(bool) bool=false;
else break;
}
}
event.num1=num1;
if(num1>0&&(num2>0&&num1>num2)||num1>num3){
player.logSkill('clanyuzhi');
if(num2>0&&num1>num2) game.log(player,'的野心已开始膨胀','#y('+num1+'张>'+num2+'张)');
if(num1>num3) game.log(player,'的行动未达到野心','#y('+num3+'张<'+num1+'张)');
if(player.hasSkill('clanbaozu',null,false,false)) player.chooseBool('迂志:是否失去〖保族〗?','若选择“否”则你失去1点体力').set('choice',player.awakenedSkills.contains('clanbaozu'));
else event._result={bool:false};
}
else event.goto(2);
'step 1'
if(result.bool){
player.removeSkill('clanbaozu');
player.popup('保族');
game.log(player,'失去了技能','#g【保族】');
}
else player.loseHp();
'step 2'
if(!player.countCards('h')) event.finish();
'step 3'
player.chooseCard('迂志:请展示一张手牌','摸此牌牌名字数的牌。下一轮开始时若本轮你使用的牌数或上一轮你以此法摸的牌数小于此牌牌名字数则你失去1点体力。',true,function(card,player){
var num=lib.skill.dcweidang.getLength(card);
return typeof num=='number'&&num>0;
}).set('ai',function(card){
if(_status.event.dying&&_status.event.num>0&&lib.skill.dcweidang.getLength(card)>_status.event.num) return 1/lib.skill.dcweidang.getLength(card);//怂
return lib.skill.dcweidang.getLength(card);//勇
}).set('dying',player.hp+player.countCards('hs',{name:['tao','jiu']})<1).set('num',event.num);
'step 4'
if(result.bool){
player.logSkill('clanyuzhi');
player.showCards(result.cards,get.translation(player)+'发动了【迂志】');
player.draw(lib.skill.dcweidang.getLength(result.cards[0]));
}
},
ai:{
threaten:3,
nokeep:true,
},
},
clanxieshu:{
audio:2,
trigger:{player:'damageEnd',source:'damageSource'},
filter:function(event,player){
if(!event.card) return false;
var num=lib.skill.dcweidang.getLength(event.card);
return typeof num=='number'&&num>0&&player.countCards('he');
},
direct:true,
content:function(){
'step 0'
var num=lib.skill.dcweidang.getLength(trigger.card),str='';
if(player.getDamagedHp()>0) str+=('并摸'+get.cnNumber(player.getDamagedHp())+'张牌');
player.chooseToDiscard(get.prompt('clanxieshu'),'弃置'+get.cnNumber(num)+'张牌'+str,'he',num).set('ai',function(card){
var player=_status.event.player;
var num=_status.event.num;
var num2=player.getDamagedHp();
if(num>num2) return 7-get.value(card);
if(num==num2) return lib.skill.zhiheng.check(card);
return 0;
}).set('num',num).logSkill='clanxieshu';
'step 1'
if(result.bool&&player.getDamagedHp()>0) player.draw(player.getDamagedHp());
},
ai:{threaten:3},
},
//族王浑
clanfuxun:{
audio:2,
@ -644,16 +737,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
clanbaozu:{
audio:2,
audioname:['clan_zhongyan'],
trigger:{
gloabl:'dying',
},
audioname:['clan_zhongyan','clan_zhonghui'],
trigger:{global:'dying'},
clanSkill:true,
limited:true,
skillAnimation:true,
animationColor:'water',
filter:function(event,player){
return event.player.hasClan('颍川钟氏')&&event.player.hp<=0&&!event.player.isLinked();
return (event.player==player||event.player.hasClan('颍川钟氏'))&&event.player.hp<=0&&!event.player.isLinked();
},
logTarget:'player',
check:function(event,player){
@ -672,9 +763,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
content:function(){
'step 0'
player.awakenSkill('clanbaozu');
'step 1'
trigger.player.link(true);
trigger.player.recover();
}
},
},
//族王凌
clanbolong:{
@ -2281,6 +2374,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
clanfuxun_info:'出牌阶段限一次。你可以获得或交给一名其他角色一张手牌,然后若其手牌数与你相等且于此阶段仅以此法获得或失去过牌,你可以将一张牌当任意基本牌使用。',
clanchenya:'沉雅',
clanchenya_info:'当一名角色发动“出牌阶段限一次”的技能后你可以令其重铸任意张牌名字数为X的牌X为其手牌数。',
clan_zhonghui:'族钟会',
clanyuzhi:'迂志',
clanyuzhi_info:'锁定技。新的一轮开始时你依次执行以下项①若你上一轮使用的牌数或你上上轮因〖迂志〗摸的牌数小于你上轮因〖迂志〗摸的牌数你失去1点体力或失去〖保族〗。②你展示一张手牌然后摸X张牌X为此牌牌名字数。',
clanxieshu:'挟术',
clanxieshu_info:'当你使用牌造成伤害后或受到来自牌造成的伤害后你可以弃置Y张牌并摸你已损失体力值张牌Y为此牌牌名字数。',
clan_wu:'陈留·吴氏',
clan_xun:'颍川·荀氏',

View File

@ -504,8 +504,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var names=map[first];
return !names.contains(changshi);
});
if(list.length==0) return others.randomGets(1);
return list;
return list.length?list:others;
}());
next.set('ai',button=>{
if(button.link=='scs_gaowang') return 10;
@ -1492,6 +1491,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
wuxie:function(){
'step 0'
var trigger=event.getParent().getTrigger();
if(!trigger.respondTo){event.finish();return;}
var target=trigger.respondTo[0];
event.target=target;
if(!target||!target.countGainableCards(player,player==target?'e':'he')) event._result={bool:false};

View File

@ -9858,7 +9858,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
else if(event.isMine()){
func(event.videoId);
}
event._result={control:'弃置化身'};
event._result={control:'更换技能'};
event.goto(1);
return;
}

View File

@ -1,5 +1,4 @@
'use strict';
game.import('character',function(lib,game,ui,get,ai,_status){
return {
name:'shiji',
@ -257,24 +256,44 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 1'
if(result.bool){
var name=result.links[0][2],target=trigger.player;
target.addTempSkill('zhengsu',{player:['phaseDiscardAfter','phaseAfter']});
target.addTempSkill('houfeng_share',{player:['phaseDiscardAfter','phaseAfter']});
target.markAuto('houfeng_share',[player]);
target.addTempSkill(name,{player:['phaseDiscardAfter','phaseAfter']});
target.popup(name,'thunder');
player.addTempSkill('houfeng_share');
game.delayx();
}
},
subSkill:{
share:{
trigger:{global:['drawAfter','recoverAfter']},
charlotte:true,
onremove:true,
trigger:{player:'phaseDiscardEnd'},
filter:function(event,player){
return lib.skill.zhengsu.filter(event,player);
},
forced:true,
popup:false,
charlotte:true,
filter:function(event,player){
return event.getParent(2).name=='zhengsu';
},
content:function(){
player.chooseDrawRecover(2,true);
'step 0'
var list=player.getStorage('houfeng_share').filter(i=>i.isIn());
list.unshift(player);
event.list=list;
var num1=0,num2=0;
for(var target of list){
num1+=get.effect(target,{name:'wuzhong'},player,player);
num2+=get.recoverEffect(target,player,player);
}
if(!list.some(i=>i.isDamaged())) result.index=0;
else trigger.player.chooseControl('摸两张牌','回复体力').set('prompt','整肃奖励:请选择'+get.translation(list)+'的整肃奖励').set('ai',function(){
return _status.event.goon?0:1;
}).set('goon',num1>=num2);
'step 1'
if(result.index==0) game.asyncDraw(event.list,2);
else{
for(var i of event.list) i.recover();
}
'step 2'
game.delayx();
},
},
},
@ -317,9 +336,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 1'
if(result.bool){
var target=result.targets[0];
player.logSkill('spzhengjun',target);
target.chooseDrawRecover(2,true);
event.target=target;
var num1=get.effect(target,{name:'wuzhong'},target,player);
var num2=get.recoverEffect(target,target,player);
player.line(target);
if(target.isHealthy()) result.index=0;
else player.chooseControl('摸牌','回血').set('prompt','整肃奖励:令'+get.translation(target)+'摸两张牌或回复1点体力').set('ai',function(){
return _status.event.goon?0:1;
}).set('goon',num1>=num2);
}
else event.finish();
'step 2'
if(result.index==0) target.draw(2);
else target.recover();
},
},
},
@ -504,7 +533,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
spyanji:{
audio:2,
audio:3,
trigger:{player:'phaseUseBegin'},
direct:true,
filter:function(event,player){
@ -6435,7 +6464,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
spyanji_info:'出牌阶段开始时,你可以进行“整肃”。',
sp_huangfusong:'手杀皇甫嵩',
spzhengjun:'整军',
spzhengjun_info:'①出牌阶段开始时,你可进行“整肃”。②当你因整肃而摸牌或回复体力后,你可令一名其他角色选择摸两张牌或回复1点体力。',
spzhengjun_info:'①出牌阶段开始时,你可进行“整肃”。②当你因整肃而摸牌或回复体力后,你可令一名其他角色摸两张牌或回复1点体力。',
spshiji:'势击',
spshiji_info:'当你对其他角色造成属性伤害时,若你的手牌数不为全场唯一最多,则你可以观看其手牌。你令其弃置其中的所有红色牌,然后摸等量的牌。',
sptaoluan:'讨乱',
@ -6446,7 +6475,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
zjjuxiang:'拒降',
zjjuxiang_info:'限定技。一名其他角色脱离濒死状态时你可以对其造成1点伤害然后摸X张牌X为其体力上限且至多为5。',
houfeng:'厚俸',
houfeng_info:'每轮限一次。一名其他角色的出牌阶段开始时,若其在你的攻击范围内,则你可以令其进行“整肃”。然后当其于本回合内因整肃而摸牌或回复体力后,你可选择摸两张牌或回复1点体力。',
houfeng_info:'每轮限一次。一名其他角色的出牌阶段开始时,若其在你的攻击范围内,则你可以令其进行“整肃”。然后当其于本回合内因整肃而摸牌或回复体力后,你获得相同的整肃奖励。',
liuba:'刘巴',
duanbi:'锻币',
duanbi_info:'出牌阶段限一次。若场上所有角色的手牌数之和大于角色数之和的二倍则你可以令所有其他角色各弃置X张手牌X为该角色手牌数的一半且向下取整且至多为3。然后你可选择一名角色令其随机获得三张以此法被弃置的牌。',

View File

@ -10018,7 +10018,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return str;
},
},
perfectPair:{},
perfectPair:{
nanhualaoxian:['zuoci','yuji'],
re_nanhualaoxian:['zuoci','yuji'],
},
characterReplace:{
lijue:['lijue','ns_lijue'],
fanchou:['fanchou','tw_fanchou','ns_fanchou'],

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

View File

@ -525,7 +525,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
gz_miheng:['male','qun',3,['gzrekuangcai','gzshejian'],['gzskin']],
gz_fengxi:['male','wu',3,['gzyusui','gzboyan'],['gzskin']],
gz_dengzhi:['male','shu',3,['gzjianliang','gzweimeng'],['gzskin']],
gz_re_nanhualaoxian:['male','qun',4,['gzgongxiu','gztaidan','gzrejinghe']],
gz_re_nanhualaoxian:['male','qun',3,['gzgongxiu','gztaidan','gzrejinghe']],
gz_zhouyi:['female','wu',3,['gzzhukou','gzduannian','gzlianyou']],
gz_re_xunchen:['male','qun',3,['gzfenglve','gzanyong']],
gz_lvlingqi:['female','qun',4,['guowu','gzshenwei','gzzhuangrong'],['gzskin']],
@ -661,7 +661,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
return event.player.isFriendOf(player)&&event.targets.some(target=>target.isMajor());
},
check:function(event,player){
var num=0,targets=event.targets.some(target=>target.isMajor());
var num=0,targets=event.targets.filter(target=>target.isMajor());
for(var target of targets) num+=get.sgn(get.attitude(player,target)*get.effect(target,event.card,event.player,player));
return num>=0;
},
@ -7619,6 +7619,146 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
},
},
},
yigui_gzshan:{
enable:'chooseToUse',
filter:function(event,player){
if(event.type!='respondShan'||!event.filterCard({name:'shan'},player,event)||!lib.inpile.contains('shan')) return false;
var storage=player.storage.yigui,target=event.getParent().player;
if(!storage||!target||!storage.character.length||storage.used.contains('shan')) return false;
var identity=target.identity;
return ['unknown','ye'].contains(identity)||storage.character.some(function(i){
if(lib.character[i][1]=='ye') return true;
var double=get.is.double(i,true);
var groups=(double?double:[lib.character[i][1]]);
return groups.contains(identity);
});
},
chooseButton:{
dialog:function(event,player){
var dialog=ui.create.dialog('役鬼','hidden');
dialog.add([player.storage.yigui.character,'character']);
return dialog;
},
filter:function(button,player){
var evt=_status.event.getParent('chooseToUse');
var target=evt.getParent().player,identity=target.identity;
if(['unknown','ye'].contains(identity)) return true;
if(lib.character[button.link][1]=='ye') return true;
var double=get.is.double(button.link,true);
var groups=(double?double:[lib.character[button.link][1]]);
return groups.contains(identity);
},
check:function(button){
return 1/(1+game.countPlayer(function(current){
return current.identity==button.link;
}));
},
backup:function(links,player){
var character=links[0];
var next={
character:character,
filterCard:()=>false,
selectCard:-1,
complexCard:true,
check:()=>1,
popname:true,
audio:'yigui',
viewAs:{name:'shan',isCard:true},
onuse:function(result,player){
player.logSkill('yigui');
var character=lib.skill.yigui_gzshan_backup.character;
player.flashAvatar('yigui',character);
player.storage.yigui.character.remove(character);
_status.characterlist.add(character);
game.log(player,'从「魂」中移除了','#g'+get.translation(character));
player.syncStorage('yigui');
player.updateMarks('yigui');
player.storage.yigui.used.add(result.card.name);
},
};
return next;
},
},
ai:{
respondShan:true,
skillTagFilter:function(player){
var storage=player.storage.yigui;
if(!storage||!storage.character.length||storage.used.contains('shan')||!lib.inpile.contains('shan')) return false;
},
order:0.1,
result:{player:1},
},
},
yigui_gzwuxie:{
hiddenCard:function(player,name){
var storage=player.storage.yigui;
if(name!='wuxie'||!storage||!storage.character.length||storage.used.contains(name)||!lib.inpile.contains(name)) return false;
return true;
},
enable:'chooseToUse',
filter:function(event,player){
if(event.type!='wuxie'||!event.filterCard({name:'wuxie'},player,event)||!lib.inpile.contains('wuxie')) return false;
var storage=player.storage.yigui,target=event.getParent(2).player;
if(!storage||!target||!storage.character.length||storage.used.contains('wuxie')) return false;
var identity=target.identity;
return ['unknown','ye'].contains(identity)||storage.character.some(function(i){
if(lib.character[i][1]=='ye') return true;
var double=get.is.double(i,true);
var groups=(double?double:[lib.character[i][1]]);
return groups.contains(identity);
});
},
chooseButton:{
dialog:function(event,player){
var dialog=ui.create.dialog('役鬼','hidden');
dialog.add([player.storage.yigui.character,'character']);
return dialog;
},
filter:function(button,player){
var evt=_status.event.getParent('chooseToUse');
var target=evt.getParent(2).player,identity=target.identity;
if(['unknown','ye'].contains(identity)) return true;
if(lib.character[button.link][1]=='ye') return true;
var double=get.is.double(button.link,true);
var groups=(double?double:[lib.character[button.link][1]]);
return groups.contains(identity);
},
check:function(button){
return 1/(1+game.countPlayer(function(current){
return current.identity==button.link;
}));
},
backup:function(links,player){
var character=links[0];
var next={
character:character,
filterCard:()=>false,
selectCard:-1,
complexCard:true,
check:()=>1,
popname:true,
audio:'yigui',
viewAs:{name:'wuxie',isCard:true},
onuse:function(result,player){
player.logSkill('yigui');
var character=lib.skill.yigui_gzwuxie_backup.character;
player.flashAvatar('yigui',character);
player.storage.yigui.character.remove(character);
_status.characterlist.add(character);
game.log(player,'从「魂」中移除了','#g'+get.translation(character));
player.syncStorage('yigui');
player.updateMarks('yigui');
player.storage.yigui.used.add(result.card.name);
},
};
return next;
},
},
ai:{
order:0.1,
result:{player:1},
},
},
jihun:{
trigger:{
player:'damageEnd',
@ -14409,15 +14549,17 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
gzzongyu_info:'当【六龙骖驾】进入其他角色的装备区后,你可以将你装备区内所有坐骑牌(至少一张)与【六龙骖驾】交换位置。锁定技,当你使用坐骑牌后,若场上或弃牌堆中有【六龙骖驾】,则将【六龙骖驾】置入你的装备区。',
yigui:"役鬼",
"yigui_info":"当你首次明置此武将牌时,你将剩余武将牌堆的两张牌扣置于游戏外,称为“魂”;你可以展示一张“魂”并将其置入剩余武将牌堆,视为使用一张本回合内未以此法使用过的基本牌或普通锦囊牌。(此牌指定目标,且目标须为未确定势力的角色或野心家或与此“魂”势力相同的角色)",
"yigui_info":"当你首次明置此武将牌时,你将剩余武将牌堆的两张牌置于武将牌上,称为“魂”;你可以展示一张武将牌上的“魂”并将其置入剩余武将牌堆,视为使用一张本回合内未以此法使用过的基本牌或普通锦囊牌。(此牌指定目标,且目标须为未确定势力的角色或野心家或与此“魂”势力相同的角色)",
"yigui_init":"役鬼",
"yigui_init_info":"",
"yigui_refrain":"役鬼",
"yigui_refrain_info":"",
yigui_shan:'役鬼',
yigui_wuxie:'役鬼',
yigui_gzshan:'役鬼',
yigui_gzwuxie:'役鬼',
jihun:"汲魂",
jihun_info:"当你受到伤害后,或与你势力不同的角色脱离濒死状态后,你可以将剩余武将牌堆的一张牌当做“魂”扣置于游戏外。",
jihun_info:"当你受到伤害后,或与你势力不同的角色脱离濒死状态后,你可以将剩余武将牌堆的一张牌置于武将牌上,称为“魂”。",
_guozhan_marks:'标记',
_guozhan_marks_backup:'标记',
@ -15892,22 +16034,23 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(name2.indexOf('gz_shibing')==0) return false;
if(get.is.jun(this.name1)) return true;
if(choosing&&lib.character[name1][1]!='ye'&&lib.character[name2][1]!='ye'&&lib.character[name1][1]!=lib.character[name2][1]) return false;
var list=['re','diy','sp','jsp','shen','jg','xin','old','ol','sb','sc','gz'];
for(var i=0;i<list.length;i++){
if(name1.indexOf(list[i]+'_')==0){
name1=name1.slice(list[i].length+1);
}
if(name2.indexOf(list[i]+'_')==0){
name2=name2.slice(list[i].length+1);
if(name1.indexOf('gz_')==0){
name1=name1.slice(name1.indexOf('_')+1);
}
else{
while(name1.indexOf('_')!=-1&&!lib.perfectPair[name1]){
name1=name1.slice(name1.indexOf('_')+1);
}
}
if(lib.perfectPair[name1]&&lib.perfectPair[name1].contains(name2)){
return true;
if(name2.indexOf('gz_')==0){
name2=name2.slice(name2.indexOf('_')+1);
}
if(lib.perfectPair[name2]&&lib.perfectPair[name2].contains(name1)){
return true;
else{
while(name2.indexOf('_')!=-1&&!lib.perfectPair[name2]){
name2=name2.slice(name2.indexOf('_')+1);
}
}
return false;
return (lib.perfectPair[name1]&&lib.perfectPair[name1].contains(name2))||(lib.perfectPair[name2]&&lib.perfectPair[name2].contains(name1));
},
siege:function(player){
if(this.identity=='unknown'||this.hasSkill('undist')) return false;