v1.10.7.1

v1.10.7.1版本更新内容
※我们继续和一些优秀且具有开源精神的代码编写者保持着积极合作。在这一版本中,我们通过接收GitHub的Pull Request,整合了@PZ157 @nonameShijian @copcap @mengxinzxz @lieren2023 @kuangshen04 @universe-st 等7位代码贡献者编写的代码。
※添加OL新武将「谋太史慈」「界高顺」「胡金定」「田畴」;十周年新武将「神赵云」「神许褚」「刘理」「乐大乔」「孔融」「蒋琬&费祎」「星袁绍」「诸葛梦雪」「柏灵筠」。
※调整「神鲁肃」「高达一号」「谋关羽(OL&手杀)」「谋荀彧」「乐进」「牵招(OL)」「石韬」「史阿」「甘夫人&糜夫人」「段巧笑」的技能。
※根据《炽焰天穹》×《Angel Beats!》联动中的新设定,将「高桥久子」的姓名修正为「渕田久子」。
※同步十周年线上的改动,将“游戏开始时”的时机提前到“第一轮游戏开始时”之前。
※修复AI缓存机制导致的一些bug(如hasSkillTag无法正常判断,导致濒死技能无法正常发动)。
※为了后续升级到升级TypeScript,以及支持使用TypeScript编写扩展,进行了一些准备。
※给角色添加InitFilter的参数,允许角色作为主公时不增加体力上限/在斗地主模式不获得地主专属技能。
※修复【毒】作为“蓄谋”牌置入判定区时被判定为正面向上置入的bug。
※修复部分AI时间复杂度异常的bug。
※其他bug修复和机制优化和AI调整。
This commit is contained in:
Spmario233 2024-02-08 15:35:01 +08:00 committed by GitHub
commit b5d3906437
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
145 changed files with 176091 additions and 1254 deletions

2
.gitignore vendored
View File

@ -1,3 +1,5 @@
audio/*.TXT
image/*.TXT
!extension/boss
!extension/cardpile
!extension/coin

BIN
audio/die/dc_zhaoyun.mp3 Normal file

Binary file not shown.

BIN
audio/die/ol_hujinding.mp3 Normal file

Binary file not shown.

BIN
audio/die/ol_sb_guanyu.mp3 Normal file

Binary file not shown.

Binary file not shown.

BIN
audio/die/sb_xunyu.mp3 Normal file

Binary file not shown.

BIN
audio/die/shen_lusu.mp3 Normal file

Binary file not shown.

BIN
audio/die/star_yuanshao.mp3 Normal file

Binary file not shown.

BIN
audio/die/tianchou.mp3 Normal file

Binary file not shown.

Binary file not shown.

BIN
audio/die/yue_daqiao.mp3 Normal file

Binary file not shown.

BIN
audio/skill/dcjuejing1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/dcjuejing2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/dclonghun1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/dclonghun2.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/skill/dczixi1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/dczixi2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/dingzhou1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/dingzhou2.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/skill/olqingyuan1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/olqingyuan2.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/skill/olsbdulie1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/olsbdulie2.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/skill/olsbfumeng1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/olsbfumeng2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/olsbguidao1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/olsbguidao2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/olsbweilin1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/olsbweilin2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/olshandao1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/olshandao2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/sbjieming1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/sbjieming2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/sbquhu1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/sbquhu2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/staraoshi1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/staraoshi2.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/skill/tamo1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/tamo2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/zhimeng1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/zhimeng2.mp3 Normal file

Binary file not shown.

View File

@ -43,51 +43,58 @@ game.import('card',function(lib,game,ui,get,ai,_status){
fullskin:true,
type:'trick',
enable:true,
filterTarget:function(card,player,target){
filterTarget(card,player,target){
return target!=player&&!target.isMinHp();
},
content:function(){
'step 0'
event.list=game.filterPlayer(function(current){
async content(event,trigger,player){
const target=event.target;
if(!target.isIn()) return;
const str=get.translation(target);
const card=new lib.element.VCard({name:'sha'});
const targets=game.filterPlayer(current=>{
return current!=target;
}).sortBySeat();
'step 1'
if(!target.isIn()){
event.finish();
return;
for(const current of targets){
if(!target.isIn()) return;
if(!current||!current.isIn()||current.hasSkill('diaohulishan')) continue;
let choiceList=[
'弃置一张牌,视为对'+str+'使用一张【杀】',
'弃置'+str+'一张牌',
],choices=['出杀','弃牌','cancel2'];
if(current.identity=='wei'){
choiceList[0]=choiceList[0].slice(6);
choiceList[1]='获得'+choiceList[1].slice(2);
choices[1]='得牌';
}
if(!current.canUse(card,target,false)||(current.identity!='wei'&&!current.countDiscardableCards(current,'he'))){
choiceList[0]='<span style="opacity:0.5">'+choiceList[0]+'</span>';
choices.remove('出杀');
}
if(!target.countCards('he')){
choiceList[1]='<span style="opacity:0.5">'+choiceList[1]+'</span>';
choices.remove(current.identity=='wei'?'得牌':'弃牌');
}
if(choices.length>1){
const {result:{control}}=await current.chooseControl(choices)
.set('prompt','号令天下:请选择其中一项').set('target',target)
.set('ai',()=>{
const player=get.event('player'),target=get.event('target'),choices=get.event('controls');
const guohe=new lib.element.VCard({name:'guohe_copy2'}),shunshou=new lib.element.VCard({name:'shunshou_copy2'}),sha=new lib.element.VCard({name:'sha'});
const num=Math.max(0,choices.includes('弃牌')?get.effect(target,guohe,player):0,choices.includes('得牌')?get.effect(target,shunshou,player):0);
if(choices.includes('出杀')&&get.effect(player,guohe,player)+get.effect(target,sha,player)>num) return '出杀';
if(choices.includes('得牌')&&num>0) return '得牌';
if(choices.includes('弃牌')&&num>0) return '弃牌';
return 'cancel2';
});
if(control!='cancel2'){
if(control=='出杀'){
if(current.identity!='wei') await current.chooseToDiscard('he',true);
await current.useCard(card,target,false);
}
else await current[current.identity=='wei'?'gainPlayerCard':'discardPlayerCard'](target,true,'he').set('boolline',true);
}
}
}
var current=event.list.shift();
if(!current||!current.isIn()||current.hasSkill('diaohulishan')){
if(event.list.length) event.redo();
else event.finish();
return;
}
event.current=current;
if(current.identity!='wei'){
current.chooseToDiscard('he','弃置一张牌,并视为对'+get.translation(target)+'使用一张【杀】,或点击「取消」弃置其一张牌').set('ai',function(card){
if(!_status.event.goon) return 0;
return 5-get.value(card);
}).set('goon',(get.effect(target,{name:'guohe'},current)<get.effect(current,{name:'guohe'},current)+get.effect(target,{name:'sha'},current)));
}
else{
current.chooseBool('是否视为对'+get.translation(target)+'使用一张【杀】?','若点击「取消」则改为获得其一张牌').set('ai',function(){
var player=_status.event.player,target=_status.event.getParent().target;
return (get.effect(target,{name:'shunshou'},player)<=get.effect(target,{name:'sha'},player))
});
}
'step 2'
if(!target.isIn()){
event.finish();
return;
}
var current=event.current;
if(result.bool){
if(current.isIn()&&current.canUse({name:'sha',isCard:true},target,false)) current.useCard({name:'sha',isCard:true},target,false);
}
else{
current[current.identity=='wei'?'gainPlayerCard':'discardPlayerCard'](target,true,'he').set('boolline',true);
}
if(event.list.length) event.goto(1);
},
ai:{
order:6,
@ -99,7 +106,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
loseCard:1,
},
result:{
target:function(player,target){
target(player,target){
return -1.5*(game.countPlayer()-1);
},
},
@ -1844,7 +1851,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
huxinjing_info:'此牌可对其他角色使用。当你受到伤害时若伤害值大于1或大于等于你的体力值则你可以将所有【护心镜】置入弃牌堆然后防止此伤害。',
huxinjing_info_guozhan:'当你受到伤害时,若伤害值大于等于你的体力值,则你可以将所有【护心镜】置入弃牌堆,然后防止此伤害。',
gz_haolingtianxia:'号令天下',
gz_haolingtianxia_info:'出牌阶段,对一名体力值不为全场最少的角色使用。所有其他角色依次选择一项:①弃置一张牌(魏势力角色无需弃牌),视为对目标角色使用一张【杀】;②弃置目标角色的一张牌(魏势力角色改为获得其一张牌)。',
gz_haolingtianxia_info:'出牌阶段,对一名体力值不为全场最少的角色使用。所有其他角色依次可以选择一项:①弃置一张牌(魏势力角色无需弃牌),视为对目标角色使用一张【杀】;②弃置目标角色的一张牌(魏势力角色改为获得其一张牌)。',
gz_kefuzhongyuan:'克复中原',
gz_kefuzhongyuan_info:'出牌阶段,对任意名角色使用。目标角色选择一项:①视为使用一张【杀】(蜀势力角色以此法使用【杀】的伤害值基数+1②摸一张牌蜀势力角色改为摸两张牌。',
gz_guguoanbang:'固国安邦',

View File

@ -235,7 +235,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
if(get.cardtag(card,'yingbian_hit')){
hit=true;
if(targets.some(target=>{
return target.mayHaveShan(viewer,'use',target.getCards(i=>{
return target.mayHaveShan(viewer,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))&&get.attitude(viewer,target)<0&&get.damageEffect(target,player,viewer,get.natureList(card))>0;
})) base+=5;
@ -247,7 +247,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
}
if(get.cardtag(card,'yingbian_damage')){
if(targets.some(target=>{
return get.attitude(player,target)<0&&(hit||!target.mayHaveShan(viewer,'use',target.getCards(i=>{
return get.attitude(player,target)<0&&(hit||!target.mayHaveShan(viewer,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))||player.hasSkillTag('directHit_ai',true,{
target:target,
@ -309,7 +309,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
if(!player.hasSkillTag('directHit_ai',true,{
target:target,
card:card,
},true)) odds-=0.7*target.mayHaveShan(player,'use',target.getCards(i=>{
},true)) odds-=0.7*target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}),'odds');
_status.event.putTempCache('sha_result','eff',{

View File

@ -486,7 +486,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
}
return event.card2.name=='du';
}
if(event.name!='equip'&&event.name!='addJudge'&&!event.visible) return false;
if(event.name!='equip'&&!event.visible) return false;
var evt=event.getl(player);
if(!evt||!evt.hs||!evt.hs.filter(function(i){
return get.name(i,player)=='du';

View File

@ -33,6 +33,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
clan_zhong:['clan_zhongyan','clan_zhonghui','clan_zhongyu'],
},
},
/** @type { importCharacterConfig['skill'] } */
skill:{
//族吴乔
clanqiajue:{
@ -42,7 +43,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return player.countCards('he',card=>{
if(_status.connectMode&&get.position(card)=='h') return true;
return get.color(card,player)=='black'&&lib.filter.cardDiscardable(card,player);
});
})>0;
},
direct:true,
async content(event,trigger,player){
@ -1058,7 +1059,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var owner=_status.event.getParent().owner;
if(owner) owner.$throw(card.cards);
});
if(card.name!=cardx.name||!get.is.sameNature(card,cardx)) next.viewAs=true;
if(card.name===cardx.name&&get.is.sameNature(card,cardx,true)) next.viewAs=false;
var owner=get.owner(card);
if(owner!=player&&get.position(card)=='h'){
next.throw=false;

View File

@ -4,8 +4,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
name:'collab',
connect:true,
character:{
dc_zhaoyun:['male','shen',1,['boss_juejing','dclonghun','dczhanjiang'],['shu','InitFilter:noZhuHp:noZhuSkill']],
dc_sunce:['male','wu',4,['dcshuangbi']],
nezha:['male','qun',2,['dcsantou','dcfaqi']],
nezha:['male','qun',3,['dcsantou','dcfaqi'],['InitFilter:noZhuHp']],
dc_caocao:['male','wei',4,['dcjianxiong']],
dc_liubei:['male','shu',4,['dcrende']],
dc_sunquan:['male','wu',4,['dczhiheng']],
@ -29,16 +30,140 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return mode=='identity';
}
},
characterInitFilter:{
dc_zhaoyun(tag){
if(tag=='noZhuSkill'&&(get.mode()!='doudizhu'||_status.mode!='normal')) return false;
},
},
characterSort:{
collab:{
collab_olympic:['sunyang','yeshiwen'],
collab_tongque:["sp_fuwan","sp_fuhuanghou","sp_jiben","old_lingju",'sp_mushun'],
collab_duanwu:['sunwukong','longwang','taoshen'],
collab_decade:['libai','xiaoyuehankehan','zhutiexiong','wu_zhutiexiong'],
collab_remake:['dc_caocao','dc_liubei','dc_sunquan','nezha','dc_sunce'],
collab_remake:['dc_caocao','dc_liubei','dc_sunquan','nezha','dc_sunce','dc_zhaoyun'],
},
},
/** @type { importCharacterConfig['skill'] } */
skill:{
//新InitFilter测试高达一号
//打赢复活赛的牢达[哭]
dclonghun:{
audio:2,
enable:['chooseToUse','chooseToRespond'],
prompt:'将♦牌当做火【杀】,♥牌当做【桃】,♣牌当做【闪】,♠牌当做【无懈可击】使用或打出',
viewAs(cards,player){
var name;
var nature=null;
switch(get.suit(cards[0],player)){
case 'club':name='shan';break;
case 'diamond':name='sha';nature='fire';break;
case 'spade':name='wuxie';break;
case 'heart':name='tao';break;
}
if(name) return {name:name,nature:nature};
return null;
},
check(card){
var player=_status.event.player;
if(_status.event.type=='phase'){
var max=0;
var name2;
var list=['sha','tao'];
var map={sha:'diamond',tao:'heart'}
for(var i=0;i<list.length;i++){
var name=list[i];
if(player.countCards('hes',function(card){
return (name!='sha'||get.value(card)<5)&&get.suit(card,player)==map[name];
})>0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){
var temp=get.order({name:name,nature:name=='sha'?'fire':null});
if(temp>max){
max=temp;
name2=map[name];
}
}
}
if(name2==get.suit(card,player)) return (name2=='diamond'?(5-get.value(card)):20-get.value(card));
return 0;
}
return 1;
},
position:'hes',
filterCard(card,player,event){
event=event||_status.event;
var filter=event._backup.filterCard;
var name=get.suit(card,player);
if(name=='club'&&filter({name:'shan',cards:[card]},player,event)) return true;
if(name=='diamond'&&filter({name:'sha',cards:[card],nature:'fire'},player,event)) return true;
if(name=='spade'&&filter({name:'wuxie',cards:[card]},player,event)) return true;
if(name=='heart'&&filter({name:'tao',cards:[card]},player,event)) return true;
return false;
},
filter(event,player){
var filter=event.filterCard;
if(filter({name:'sha',nature:'fire'},player,event)&&player.countCards('hes',{suit:'diamond'})) return true;
if(filter({name:'shan'},player,event)&&player.countCards('hes',{suit:'club'})) return true;
if(filter({name:'tao'},player,event)&&player.countCards('hes',{suit:'heart'})) return true;
if(filter({name:'wuxie'},player,event)&&player.countCards('hes',{suit:'spade'})) return true;
return false;
},
usable:20,
ai:{
respondSha:true,
respondShan:true,
skillTagFilter(player,tag){
if((player.getStat('skill').dclonghun||0)>=20) return false;
var name;
switch(tag){
case 'respondSha':name='diamond';break;
case 'respondShan':name='club';break;
case 'save':name='heart';break;
}
if(!player.countCards('hes',{suit:name})) return false;
},
order(item,player){
if(player&&_status.event.type=='phase'){
var max=0;
var list=['sha','tao'];
var map={sha:'diamond',tao:'heart'}
for(var i=0;i<list.length;i++){
var name=list[i];
if(player.countCards('hes',function(card){
return (name!='sha'||get.value(card)<5)&&get.suit(card,player)==map[name];
})>0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){
var temp=get.order({name:name,nature:name=='sha'?'fire':null});
if(temp>max) max=temp;
}
}
max/=1.1;
return max;
}
return 2;
},
},
hiddenCard(player,name){
if((player.getStat('skill').dclonghun||0)>=20) return false;
if(name=='wuxie'&&_status.connectMode&&player.countCards('hes')>0) return true;
if(name=='wuxie') return player.countCards('hes',{suit:'spade'})>0;
if(name=='tao') return player.countCards('hes',{suit:'heart'})>0;
},
},
dczhanjiang:{
audio:2,
trigger:{player:'phaseZhunbeiBegin'},
filter(event,player){
return game.hasPlayer(target=>{
return target.countCards('ej',card=>get.name(card,false)=='qinggang'||get.name(card,get.owner(card))=='qinggang');
});
},
content(){
let cards=[],targets=game.filterPlayer(target=>{
return target.countCards('ej',card=>get.name(card,false)=='qinggang'||get.name(card,get.owner(card))=='qinggang');
});
targets.forEach(target=>cards.addArray(target.getCards('ej',card=>get.name(card,false)=='qinggang'||get.name(card,get.owner(card))=='qinggang')));
player.gain(cards,'give');
},
},
//孙策
//双壁=100%技能周瑜+100%原画孙策
dcshuangbi:{
@ -123,7 +248,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
trigger:{player:'damageBegin4'},
forced:true,
group:'dcsantou_gain',
*content(event,map){
var player=map.player,trigger=map.trigger;
var source=trigger.source;
@ -144,26 +268,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
if(lose) player.loseHp();
},
subSkill:{
gain:{
audio:'dcsantou',
trigger:{
global:'phaseBefore',
player:'enterGame',
},
forced:true,
filter(event,player){
if(player.maxHp>=3) return false;
return (event.name!='phase'||game.phaseNumber==0);
},
*content(event,map){
var player=map.player;
yield player.gainMaxHp(3-player.maxHp);
var num=3-player.getHp(true);
if(num>0) player.recover(num);
}
}
},
ai:{
filterDamage:true,
skillTagFilter(player,tag,arg){
@ -1846,13 +1950,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dczhiheng_info:'①出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你在发动〖制衡〗时弃置了所有手牌,则你多摸一张牌。②每回合每名角色限一次。当你对其他角色造成伤害后,你令〖制衡①〗于此回合发动次数上限+1。',
nezha:'哪吒',
dcsantou:'三头',
dcsantou_info:'锁定技。①当你受到伤害时防止之然后若以下有条件成立你失去1点体力1.你于本回合此前以此法防止过该伤害来源的伤害且你的体力值不小于32.本次伤害为属性伤害且你的体力值为23.本次伤害的渠道为红色的牌且你的体力值为1。②游戏开始时若你的体力上限小于3你将体力上限加至3并将体力回复至3。',
dcsantou_info:'锁定技当你受到伤害时防止之然后若以下有条件成立你失去1点体力1.你于本回合此前以此法防止过该伤害来源的伤害且你的体力值不小于32.本次伤害为属性伤害且你的体力值为23.本次伤害的渠道为红色的牌且你的体力值为1。',
dcfaqi:'法器',
dcfaqi_info:'当你于出牌阶段使用装备牌结算结束后,你视为使用一张本回合未以此法使用过的普通锦囊牌。',
dc_sunce:'经典孙策',
dc_sunce_prefix:'经典',
dcshuangbi:'双壁',
dcshuangbi_info:'出牌阶段限一次你可以选择一项①摸X张牌本回合手牌上限+X②弃置至多X张牌随机对其他角色造成等量火焰伤害③视为使用X张火【杀】或【火攻】。X为场上存活角色数',
dc_zhaoyun:'经典神赵云',
dc_zhaoyun_prefix:'经典神',
dclonghun:'龙魂',
dclonghun_info:'每回合限20次你可以将你的牌按下列规则使用或打出红桃当【桃】方块当火【杀】梅花当【闪】黑桃当【无懈可击】。',
dczhanjiang:'斩将',
dczhanjiang_info:'准备阶段,若场上有【青釭剑】,则你可以获得之。',
collab_olympic:'OL·伦敦奥运会',
collab_tongque:'OL·铜雀台',

View File

@ -4372,7 +4372,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
prompt:(event)=>('是否将【兵粮寸断】转移给'+get.translation(event.player)+''),
check(event,player){
return player.hasCard(card=>{
return (card.viewAs||card.name)=='bingliang'&&event.player.canAddJudge(card)&&get.effect(event.player,card,player,player)>=0;
return (card.viewAs||card.name)=='bingliang'&&event.player.canAddJudge(card)&&get.effect(event.player,new lib.element.VCard({
name:'bingliang',
cards:[card]
}),player,_status.event.player)>=0;
},'j');
},
content(){
@ -4569,7 +4572,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
const skills=player.getStockSkills(true,true).filter(skill=>{
return !player.hasSkill(skill,null,false,false);
});
return skills.length;
return skills.length>0;
},
filter_old(event,player){
var evt=event.getParent();
@ -4674,7 +4677,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
trigger:{global:'phaseUseBegin'},
filter(event,player){
return player.countCards('h')&&event.player!=player;
return player.countCards('h')>0&&event.player!=player;
},
direct:true,
content(){
@ -4788,7 +4791,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
trigger:{player:'useCardAfter'},
filter(event,player){
return event.cards.filterInD('od').length&&get.color(event.card)=='red';
return event.cards.filterInD('od').length>0&&get.color(event.card)=='red';
},
content(){
'step 0'

View File

@ -547,6 +547,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
key_chihaya:['key_sakuya'],
key_lucia:['key_shizuru'],
},
/** @type { importCharacterConfig['skill'] } */
skill:{
//伊吹风子
fuuko_xingdiao:{
@ -3516,7 +3517,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
list.remove(player.storage.kyou_zhidian);
player.chooseControl(list).set('prompt','掷典:请为'+get.translation(trigger.card)+'选择一种效果').set('choice',function(){
if(list.includes('不计入次数')&&player.hasSha()) return '不计入次数';
if(list.includes('不可被响应')&&trigger.target.mayHaveShan(player,'use',trigger.target.getCards(i=>{
if(list.includes('不可被响应')&&trigger.target.mayHaveShan(player,'use',trigger.target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))) return '不可被响应';
if(list.includes('伤害+1')) return '伤害+1';
@ -18080,7 +18081,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
key_doruji:'多鲁基',
key_yuiko:'来谷唯湖',
key_riki:'直枝理树'/*+'子'*/,
key_hisako:'高桥久子',
key_hisako:'渕田久子',
key_hinata:'日向秀树',
key_noda:'野田',
key_tomoya:'冈崎朋也',
@ -19048,7 +19049,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
多鲁基:['Dorj'],
来谷唯湖:['Kurugaya','Yuiko'],
直枝理树:['Naoe','Riki'],
高桥久子:['Takahashi','Hisako'],
渕田久子:['Fuchita','Hisako'],
日向秀树:['Hinata','Hideki'],
野田:['Noda'],
冈崎朋也:['Okazaki','Tomoya'],
@ -19107,6 +19108,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
冈崎汐:['Okazaki','Ushio'],
神山识:['Kamiyama','Shiki'],
佐藤雏:['Satou','Hina'],
:['Kagari'],
},
};
});

View File

@ -13,7 +13,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
extra_yin:['shen_liubei','shen_luxun'],
extra_lei:['shen_ganning','shen_zhangliao'],
extra_key:['key_kagari','key_shiki','db_key_hina'],
extra_decade:['shen_jiangwei','shen_machao','shen_zhangfei','shen_zhangjiao','shen_dengai'],
extra_decade:['shen_jiangwei','shen_machao','shen_zhangfei','shen_zhangjiao','shen_dengai','shen_xuzhu'],
extra_ol:['ol_zhangliao','shen_caopi','shen_zhenji','shen_sunquan'],
extra_mobilezhi:['shen_guojia','shen_xunyu'],
extra_mobilexin:['shen_taishici','shen_sunce'],
@ -23,6 +23,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
character:{
shen_xuzhu:['male','shen',5,['zhengqing','zhuangpo'],['wei']],
shen_lusu:['male','shen',3,['dingzhou','tamo','zhimeng'],['wu']],
shen_huatuo:['male','shen',3,['wuling','youyi'],['qun']],
le_shen_jiaxu:['male','shen',4,['jxlianpo','jxzhaoluan'],['qun']],
@ -90,8 +91,174 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return mode=='identity'&&_status.mode!='purple';
},
},
/** @type { SMap<Skill> } */
/** @type { importCharacterConfig['skill'] } */
skill:{
//神许褚
zhengqing:{
audio:2,
trigger:{global:'roundStart'},
forced:true,
filter(){
return game.hasPlayer(current=>{
return current.countMark('zhengqing');
})||lib.skill.zhengqing.getMostInfoLastRound()[0]>0;
},
getMostInfoLastRound(){
let max=-1,players=[];
const history=game.getAllGlobalHistory();
if(history.length<=2) return [max,players];
for(let i=history.length-2;i>=0;i--){
const evts=history[i]['everything'].filter(evt=>{
if(evt.name!=='damage') return false;
const source=evt.source;
return source&&source.isIn();
});
if(evts.length){
let curMax=-1,curPlayers=[];
const map={};
for(const evt of evts){
const source=evt.source;
const id=source.playerid;
if(typeof map[id]!=='number') map[id]=0;
map[id]+=evt.num;
if(map[id]>curMax){
curMax=map[id];
curPlayers=[source];
}
else if(map[id]==curMax){
curPlayers.add(source);
}
}
if(curMax>max){
max=curMax;
players=curPlayers.slice();
}
else if(curMax===max){
players.addArray(curPlayers);
}
}
if(history[i].isRound) break;
}
return [max,players];
},
async content(event,trigger,player){
game.countPlayer(current=>{
if(current.hasMark('zhengqing')) current.clearMark('zhengqing');
});
const [num,players]=lib.skill.zhengqing.getMostInfoLastRound();
player.line(players,'thunder');
const onlyMe=players.length===1&&players[0]===player;
const isMax=(player.getAllHistory('custom',evt=>evt&&evt.zhengqing_count).map(evt=>evt.zhengqing_count).sort((a,b)=>b-a)[0]||0)<=num;
players.forEach(current=>{
current.addMark('zhengqing',num);
})
if(onlyMe&&isMax){
player.draw(num);
player.getHistory('custom').push({zhengqing_count:num});
}
else{
const drawers=[player].concat(players).sortBySeat(trigger.player);
for(const drawer of drawers){
await drawer.draw();
}
}
},
marktext:'擎',
intro:{
name:'争擎',
name2:'擎',
content:'mark',
},
},
zhuangpo:{
audio:2,
enable:'chooseToUse',
onChooseToUse(event){
if(!game.online&&!event.zhuangpo_cards){
event.set('zhuangpo_cards',event.player.getCards('hes',card=>{
const str=lib.skill.shencai.getStr(card);
return str.includes('【杀】');
}));
}
},
viewAs:{
name:'juedou',
storage:{zhuangpo:true},
},
viewAsFilter(){
return get.event('zhuangpo_cards').length>0;
},
prompt:'将一张牌面信息包含“【杀】”的牌当【决斗】使用',
filterCard(card,player){
return get.event('zhuangpo_cards').includes(card);
},
position:'hes',
precontent(){
player.addTempSkill('zhuangpo_effect');
},
subSkill:{
effect:{
trigger:{
player:'useCardToPlayered',
},
filter(event,player){
const card=event.card;
if(!card||!card.storage||!card.storage.zhuangpo) return false;
return player.hasMark('zhengqing');
},
direct:true,
charlotte:true,
group:'zhuangpo_damage',
async content(event,trigger,player){
const target=trigger.target;
const list=Array.from({length:player.countMark('zhengqing')},(_,i)=>{
return get.cnNumber(i+1,true);
});
const result=await player.chooseControl(list,'cancel2')
.set('prompt','壮魄:是否移去任意枚“擎”?')
.set('prompt2',`若如此做,${get.translation(target)}须弃置等量的牌`)
.set('ai',()=>get.event('choice'))
.set('choice',(()=>{
if(get.attitude(player,target)>=0) return 'cancel2';
const markCount=list.length;
const cards=target.getCards('he',card=>lib.filter.cardDiscardable(card,target));
let allIn=false;
if(player.hp<2||target.hp+target.countCards('h',card=>target.canSaveCard(card,target))<=1+trigger.targets.some(current=>current.hasMark('zhengqing'))) allIn=true;
if(cards.map(card=>get.value(card)).reduce((p,c)=>p+c,0)/cards.length>5) allIn=true;
if(!player.isPhaseUsing()||!player.hasCard(card=>{
if(!lib.skill.shencai.getStr(card).includes('【杀】')) return false;
return player.hasValueTarget(get.autoViewAs({name:'juedou'},[card]));
})) allIn=true;
const maxCount=Math.min(markCount,cards.length);
const toRemoveCount=allIn?maxCount:Math.ceil(Math.random()*maxCount);
return get.cnNumber(toRemoveCount,true);
})())
.forResult();
if(result.control==='cancel2') return;
const toRemoveCount=result.index+1;
player.logSkill('zhuangpo_effect',target);
player.popup(get.cnNumber(toRemoveCount)+'张');
player.removeMark('zhengqing',toRemoveCount);
target.chooseToDiscard('he',toRemoveCount,true);
}
},
damage:{
audio:'zhuangpo',
trigger:{source:'damageBegin1'},
filter(event,player){
const card=event.card;
if(!card||!card.storage||!card.storage.zhuangpo) return false;
const evt=event.getParent(2);
return evt.targets&&evt.targets.some(current=>current.hasMark('zhengqing'));
},
charlotte:true,
forced:true,
async content(event,trigger){
trigger.num++;
},
},
},
},
//神鲁肃
dingzhou:{
audio:2,
@ -100,20 +267,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){
filter(event,player){
const num=player.countCards('he');
return game.hasPlayer(current=>{
if(current==player) return false;
const total=current.countCards('ej');
return total>0&&num>=total;
return total>0&&num>total;
});
},
filterCard:true,
selectCard:[1,Infinity],
selectCard(){
return [1,Math.max(...game.filterPlayer(i=>i!=get.player()).map(i=>i.countCards('ej')))+1];
},
check(card){
return 7-get.value(card);
},
filterTarget(card,player,target){
return ui.selected.cards.length==target.countCards('ej')&&player!=target;
const num=target.countCards('ej');
if(!num) return false;
return ui.selected.cards.length==num+1&&player!=target;
},
filterOk(){
return ui.selected.cards.length==ui.selected.targets[0].countCards('ej');
return ui.selected.cards.length==ui.selected.targets[0].countCards('ej')+1;
},
position:'he',
lose:false,
@ -130,7 +302,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
result:{
target(player,target){
let eff=0;
if(ui.selected.cards.length) eff-=ui.selected.cards.map(card=>get.value(card)).reduce((p,c)=>p+c,0);
if(ui.selected.cards.length) eff=ui.selected.cards.map(card=>get.value(card)).reduce((p,c)=>p+c,0);
if(player.hasSkill('zhimeng')) eff*=1+get.sgnAttitude(player,target)*0.15;
const es=target.getCards('e'),js=target.getCards('j');
es.forEach(card=>{
eff-=get.value(card,target);
@ -245,7 +418,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
const {result}=await next;
if(!result.bool) return;
player.logSkill('tamo');
console.log(result.moved)
const resultList=result.moved[0].map(info=>{
return parseInt(info.split('|')[0]);
});
@ -253,11 +425,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
const cmp=(a,b)=>{
return resultList.indexOf(a)-resultList.indexOf(b);
}
for(let i of toSortPlayers){
for(let j of toSortPlayers){
if(cmp(i.getSeatNum(),j.getSeatNum())<0){
toSwapList.push([i,j]);
[i,j]=[j,i];
for(let i=0;i<toSortPlayers.length;i++){
for(let j=0;j<toSortPlayers.length;j++){
if(cmp(toSortPlayers[i].getSeatNum(),toSortPlayers[j].getSeatNum())<0){
toSwapList.push([toSortPlayers[i],toSortPlayers[j]]);
[toSortPlayers[i],toSortPlayers[j]]=[toSortPlayers[j],toSortPlayers[i]];
}
}
}
@ -977,10 +1149,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 1'
if(result.bool){
var list=result.links;
game.addVideo('skill',player,['qiexie',[list]])
game.broadcastAll(function(list){
game.addVideo('skill',player,['qiexie',[list]]);
_status.characterlist.removeArray(list);
game.broadcastAll(function(player,list){
player.tempname.addArray(list);
for(var name of list) lib.skill.qiexie.createCard(name);
},list);
},player,list);
var cards=list.map(function(name){
var card=game.createCard('qiexie_'+name,'none',get.infoMaxHp(lib.character[name][2]));
return card;
@ -1133,6 +1307,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
card._destroy=true;
game.log(card,'被放回武将牌堆');
var name=card.name.slice(7);
if(player.tempname&&player.tempname.includes(name)){
game.broadcastAll((player,name)=>{
player.tempname.remove(name);
},player,name);
}
if(lib.character[name]) _status.characterlist.add(name);
}
}
@ -1261,7 +1440,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
}
var hasRuanshizi=game.hasPlayer(function(target){
return target!=player&&player.canUse('sha',target,null,true)&&!target.mayHaveShan(player,'use',target.getCards(i=>{
return target!=player&&player.canUse('sha',target,null,true)&&!target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))&&get.attitude(player,target)<0&&get.effect(target,{name:'sha'},player,player)>0;
})
@ -4352,6 +4531,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
boss_juejing:{
audio:'juejing',
audioname2:{
dc_zhaoyun:'dcjuejing',
},
trigger:{player:'phaseDrawBefore'},
forced:true,
content(){
@ -4365,6 +4547,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
boss_juejing2:{
audio:'juejing',
audioname2:{
dc_zhaoyun:'dcjuejing',
},
trigger:{
player:'loseAfter',
global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'],
@ -4387,6 +4572,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
else player.chooseToDiscard('h',true,-num);
},
},
dcjuejing:{audio:2},
meihun:{
audio:2,
trigger:{
@ -5680,10 +5866,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){
mod:{
aiOrder:(player,card,num)=>{
if(num<=0||typeof card!=='object'||!player.isPhaseUsing()) return num;
if(player.awakenedSkills.includes('sbaiyin')){
if(player.hasSkill('sbaiyin')){
if(player.countMark('renjie')<4&&player.getUseValue(card)<Math.min(4,player.hp*player.hp/4)) return 0;
}
else if(player.hasSkill('jilue')){
if(player.countMark('renjie')<3&&player.getUseValue(card)<Math.min(1.8,0.18*player.hp*player.hp)) return 0;
}
else if(player.countMark('renjie')<4&&player.getUseValue(card)<Math.min(4,player.hp*player.hp/4)) return 0;
}
},
trigger:{
@ -6367,33 +6555,33 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
yeyan:{
unique:true,
forceDie:true,
enable:'phaseUse',
limited:true,
audio:3,
animationColor:'metal',
skillAnimation:'legend',
enable:'phaseUse',
filterCard(card,player){
return !ui.selected.cards.some(cardx=>get.suit(cardx,player)==get.suit(card,player));
},
selectCard:[0,4],
filterTarget(card,player,target){
var length=ui.selected.cards.length;
return (length==0||length==4);
return length==0||length==4;
},
filterCard(card){
var suit=get.suit(card);
for(var i=0;i<ui.selected.cards.length;i++){
if(get.suit(ui.selected.cards[i])==suit) return false;
}
return true;
},
complexCard:true,
limited:true,
selectCard:[0,4],
line:'fire',
check (){return -1},
selectTarget(){
if(ui.selected.cards.length==4) return [1,2];
if(ui.selected.cards.length==0) return [1,3];
game.uncheck('target');
return [1,3];
},
complexCard:true,
complexSelect:true,
line:'fire',
forceDie:true,
animationColor:'metal',
skillAnimation:'legend',
check(card){
if(!lib.skill.yeyan.getBigFire(get.event('player'))) return -1;
return 1/(get.value(card)||0.5);
},
multitarget:true,
multiline:true,
contentBefore(){
@ -6440,17 +6628,42 @@ game.import('character',function(lib,game,ui,get,ai,_status){
targets[0].damage('fire',result.control=="2点"?2:3,'nocard');
},
ai:{
order:1,
order(item,player){
return lib.skill.yeyan.getBigFire(player)?10:1;
},
fireAttack:true,
result:{
target(player,target){
if(target.hasSkillTag('nofire')) return 0;
if(lib.config.mode=='versus') return -1;
if(player.hasUnknown()) return 0;
return get.damageEffect(target,player);
const att=get.sgn(get.attitude(player,target));
const targets=game.filterPlayer(target=>get.damageEffect(target,player,player,'fire')&&(!lib.skill.yeyan.getBigFire(player)||(target.hp<=3&&!target.hasSkillTag('filterDamage',null,{player:player}))));
if(!targets.includes(target)) return 0;
if(lib.skill.yeyan.getBigFire(player)){
if(ui.selected.targets.length) return 0;
if(!(targets.length==1||(att<0&&target.identity&&target.identity.indexOf('zhu')!=-1))) return 0;
}
return att*get.damageEffect(target,player,player,'fire');
}
}
}
},
getBigFire(player){
if(player.getDiscardableCards(player,'h').reduce((list,card)=>list.add(get.suit(card,player)),[]).length<4) return false;
const targets=game.filterPlayer(target=>get.damageEffect(target,player,player,'fire')&&target.hp<=3&&!target.hasSkillTag('filterDamage',null,{player:player}));
if(!targets.length) return false;
if(targets.length==1||targets.some(target=>get.attitude(player,target)<0&&target.identity&&target.identity.indexOf('zhu')!=-1)){
let suits=player.getDiscardableCards(player,'h').reduce((map,card)=>{
const suit=get.suit(card,player);
if(!map[suit]) map[suit]=[];
return map;
},{}),cards=[];
Object.keys(suits).forEach(i=>{
suits[i].addArray(player.getDiscardableCards(player,'h').filter(card=>get.suit(card)==i));
cards.add(suits[i].sort((a,b)=>get.value(a)-get.value(b))[0]);
});
return player.hp+player.countCards('h',card=>!cards.includes(card)&&player.canSaveCard(card,player))-3>0;
}
return false;
},
},
longhun:{
audio:4,
@ -6762,7 +6975,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
xinlonghun:{
audio:'longhun',
enable:['chooseToUse','chooseToRespond'],
prompt:'将♦牌当做杀,♥牌当做桃,♣牌当做闪,♠牌当做无懈可击使用或打出',
prompt:'将♦牌当做火【,♥牌当做,♣牌当做,♠牌当做无懈可击使用或打出',
viewAs(cards,player){
var name=false;
var nature=null;
@ -6784,7 +6997,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var map={sha:'diamond',tao:'heart'}
for(var i=0;i<list.length;i++){
var name=list[i];
if(player.countCards('hes',function(card){
if(player.countCards('hs',function(card){
return (name!='sha'||get.value(card)<5)&&get.suit(card,player)==map[name];
})>0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){
var temp=get.order({name:name,nature:name=='sha'?'fire':null});
@ -6799,7 +7012,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
return 1;
},
position:'hes',
position:'hs',
filterCard(card,player,event){
event=event||_status.event;
var filter=event._backup.filterCard;
@ -6812,10 +7025,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
filter(event,player){
var filter=event.filterCard;
if(filter({name:'sha',nature:'fire'},player,event)&&player.countCards('hes',{suit:'diamond'})) return true;
if(filter({name:'shan'},player,event)&&player.countCards('hes',{suit:'club'})) return true;
if(filter({name:'tao'},player,event)&&player.countCards('hes',{suit:'heart'})) return true;
if(filter({name:'wuxie'},player,event)&&player.countCards('hes',{suit:'spade'})) return true;
if(filter({name:'sha',nature:'fire'},player,event)&&player.countCards('hs',{suit:'diamond'})) return true;
if(filter({name:'shan'},player,event)&&player.countCards('hs',{suit:'club'})) return true;
if(filter({name:'tao'},player,event)&&player.countCards('hs',{suit:'heart'})) return true;
if(filter({name:'wuxie'},player,event)&&player.countCards('hs',{suit:'spade'})) return true;
return false;
},
precontent(){
@ -6832,7 +7045,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
case 'respondShan':name='club';break;
case 'save':name='heart';break;
}
if(!player.countCards('hes',{suit:name})) return false;
if(!player.countCards('hs',{suit:name})) return false;
},
order(item,player){
if(player&&_status.event.type=='phase'){
@ -6841,7 +7054,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var map={sha:'diamond',tao:'heart'}
for(var i=0;i<list.length;i++){
var name=list[i];
if(player.countCards('hes',function(card){
if(player.countCards('hs',function(card){
return (name!='sha'||get.value(card)<5)&&get.suit(card,player)==map[name];
})>0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){
var temp=get.order({name:name,nature:name=='sha'?'fire':null});
@ -6855,9 +7068,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
hiddenCard(player,name){
if(name=='wuxie'&&_status.connectMode&&player.countCards('hes')>0) return true;
if(name=='wuxie') return player.countCards('hes',{suit:'spade'})>0;
if(name=='tao') return player.countCards('hes',{suit:'heart'})>0;
if(name=='wuxie'&&_status.connectMode&&player.countCards('hs')>0) return true;
if(name=='wuxie') return player.countCards('hs',{suit:'spade'})>0;
if(name=='tao') return player.countCards('hs',{suit:'heart'})>0;
},
},
xinjuejing:{
@ -7553,6 +7766,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return current.hasSkill('drlt_jieying');
});
},
aiOrder(player,card,num){
if(player.hasMark('drlt_jieying_mark')&&game.hasPlayer(current=>{
return current.hasSkill('drlt_jieying')&&get.attitude(player,current)<=0;
})) return Math.max(num,0)+1;
}
},
audio:'drlt_jieying',
trigger:{
@ -7572,8 +7790,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ai:{
nokeep:true,
skillTagFilter(player){
if(!player.hasMark('drlt_jieying_mark')) return false;
},
return player.hasMark('drlt_jieying_mark')&&game.hasPlayer(current=>{
return current.hasSkill('drlt_jieying')&&get.attitude(player,current)<=0;
});
}
},
},
'drlt_jieying':{
@ -7611,15 +7831,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.chooseTarget(get.prompt('drlt_jieying'),"将“营”交给一名角色;其摸牌阶段多摸一张牌,出牌阶段使用【杀】的次数上限+1且手牌上限+1。该角色回合结束后其移去“营”标记然后你获得其所有手牌。",function(card,player,target){
return target!=player;
}).ai=function(target){
if(get.attitude(player,target)>0)
return 0.1;
if(get.attitude(player,target)<1&&(target.isTurnedOver()||target.countCards('h')<1))
return 0.2;
if(get.attitude(player,target)<1&&target.countCards('h')>0&&target.countCards('j',{name:'lebu'})>0)
return target.countCards('h')*0.8+target.getHandcardLimit()*0.7+2;
if(get.attitude(player,target)<1&&target.countCards('h')>0)
return target.countCards('h')*0.8+target.getHandcardLimit()*0.7;
return 1;
let th=target.countCards('h'),att=get.attitude(_status.event.player,target);
for(let i in target.skills){
let info=get.info(i);
if(info&&info.shaRelated) return Math.abs(att);
}
if(att>0){
if(th>3&&target.hp>2) return 0.6*th;
}
if(att<1){
if(target.countCards('j',{name:'lebu'})) return 1+Math.min((1.5+th)*0.8,target.getHandcardLimit()*0.7);
if(!th||target.getEquip('zhangba')||target.getEquip('guanshi')) return 0;
if(!target.inRange(player)||player.countCards('hs',{name:'shan'})>1) return Math.min((1+th)*0.3,target.getHandcardLimit()*0.2);
}
return 0;
};
'step 1'
if(result.bool){
@ -7631,6 +7856,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
target.addMark('drlt_jieying_mark',mark);
}
},
ai:{
effect:{
player(card,player,target){
if(get.name(card)==='lebu'&&get.attitude(player,target)<0) return 1+Math.min((target.countCards('h')+1.5)*0.8,target.getHandcardLimit()*0.7);
}
}
}
},
'3':{
audio:'drlt_jieying',
@ -8004,7 +8236,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
relonghun:'龙魂',
relonghun_info:'你可以将同花色的一至两张牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当普【无懈可击】。若你以此法使用了两张红色牌,则此牌回复值或伤害值+1。若你以此法使用了两张黑色牌则你弃置当前回合角色一张牌。',
xinlonghun:'龙魂',
xinlonghun_info:'你可以将你的牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当【无懈可击】。',
xinlonghun_info:'你可以将你的牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当【无懈可击】。',
longhun:'龙魂',
longhun1:'龙魂♥︎',
longhun2:'龙魂♦︎',
@ -8299,11 +8531,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){
shen_lusu:'神鲁肃',
shen_lusu_prefix:'神',
dingzhou:'定州',
dingzhou_info:'出牌阶段限一次。你可以交给一名角色X张牌然后你获得其装备区和判定区里的所有牌X为其装备区与判定区里的牌数之和)。',
dingzhou_info:'出牌阶段限一次。你可以将X张牌交给一名场上有牌的角色然后你获得其场上的所有牌X为其场上的牌数+1)。',
tamo:'榻谟',
tamo_info:'游戏开始时,你可以重新分配除主公外所有角色的座次。',
zhimeng:'智盟',
zhimeng_info:'回合结束后,你可以与一名其他角色将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。',
shen_xuzhu:'神许褚',
shen_xuzhu_prefix:'神',
zhengqing:'争擎',
zhengqing_info:'锁定技。一轮游戏开始时你移去所有角色的“擎”标记令上一轮于一回合内造成伤害值最多的角色各获得X枚“擎”且你与这些角色各摸一张牌X为这些角色该回合内造成的伤害值。若该角色为你且本次获得的“擎”数为本局游戏最多的一次你改为摸X张牌。',
zhuangpo:'壮魄',
zhuangpo_info:'你可以将牌面信息中包含“【杀】”的牌当【决斗】使用然后你获得如下效果1.当此【决斗】指定目标后若你有“擎”你可以移去任意枚“擎”令目标角色弃置等量的牌2.当你造成渠道为此牌的伤害时,若此牌的所有目标角色中存在有“擎”的角色,此伤害+1。',
extra_feng:'神话再临·风',
extra_huo:'神话再临·火',

View File

@ -213,6 +213,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
}
},
/** @type { importCharacterConfig['skill'] } */
skill:{
qingshu:{
ai:{

View File

@ -81,6 +81,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
gw_luoqi:'是个爱国者…还是个货真价实的王八蛋。',
gw_yioufeisi:'国王还是乞丐,两者有何区别,人类少一个算一个',
},
/** @type { importCharacterConfig['skill'] } */
skill:{
sqlongyin:{
trigger:{player:'phaseBeginStart'},

View File

@ -218,6 +218,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
hs_jaina:['hs_antonidas'],
hs_malfurion:['hs_malorne'],
},
/** @type { importCharacterConfig['skill'] } */
skill:{
hshuanyu:{
trigger:{player:'damageEnd'},

View File

@ -4,6 +4,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
name:'huicui',
connect:true,
character:{
dc_liuli:['male','shu',3,['dcfuli','dcdehua']],
yue_daqiao:['female','wu',3,['dcqiqin','dczixi']],
dc_kongrong:['male','qun',3,['dckrmingshi','lirang']],
dc_sp_menghuo:['male','qun',4,['dcmanwang']],
dc_lingcao:['male','wu','4/5',['dcdufeng']],
yue_xiaoqiao:['female','wu',3,['dcqiqin','dcweiwan']],
@ -94,25 +97,426 @@ game.import('character',function(lib,game,ui,get,ai,_status){
re_chunyuqiong:['male','qun',4,['recangchu','reliangying','reshishou']],
xingdaorong:['male','qun','4/6',['xuxie']],
re_panfeng:['male','qun',4,['xinkuangfu']],
jiangfei:['male','shu',3,['dcshengxi','dcshoucheng']],
},
characterSort:{
huicui:{
sp_baigei:['re_panfeng','xingdaorong','caoxing','re_chunyuqiong','xiahoujie','dc_caiyang','zhoushan'],
sp_caizijiaren:['re_dongbai','re_sunluyu','heyan','zhaoyan','wangtao','wangyue','zhangxuan','tengyin','zhangyao','xiahoulingnv','dc_sunru','pangshanmin','kuaiqi'],
sp_zhilan:['liuyong','wanniangongzhu','zhanghu','lvlingqi','tenggongzhu','panghui','dc_zhaotongzhaoguang','yuantanyuanxiyuanshang','yuechen','dc_lingcao'],
sp_caizijiaren:['dc_kongrong','re_dongbai','re_sunluyu','heyan','zhaoyan','wangtao','wangyue','zhangxuan','tengyin','zhangyao','xiahoulingnv','dc_sunru','pangshanmin','kuaiqi'],
sp_zhilan:['dc_liuli','liuyong','wanniangongzhu','zhanghu','lvlingqi','tenggongzhu','panghui','dc_zhaotongzhaoguang','yuantanyuanxiyuanshang','yuechen','dc_lingcao'],
sp_guixin:['re_kanze','re_chendeng','caimaozhangyun','dc_lvkuanglvxiang','dc_gaolan','yinfuren','chengui','chenjiao','dc_sp_jiaxu','qinlang','dc_dongzhao'],
sp_daihan:['mamidi','dc_jiling','zhangxun','dc_yuejiu','wanglie','leibo','qiaorui','dongwan','yuanyin'],
sp_jianghu:['guanning','huzhao','dc_huangchengyan','mengjie'],
sp_zongheng:['huaxin','luyusheng','re_xunchen','re_miheng','fengxi','re_dengzhi','dc_yanghu','zongyu'],
sp_taiping:['guanhai','liupi','peiyuanshao','zhangchu','zhangkai','dc_zhangmancheng'],
sp_yanhan:['dc_liuba','dc_huangquan','furongfuqian','xianglang','dc_huojun','gaoxiang','dc_wuban'],
sp_yanhan:['dc_liuba','dc_huangquan','furongfuqian','xianglang','dc_huojun','gaoxiang','dc_wuban','jiangfei'],
sp_jishi:['dc_jiben','zhenghun','dc_sunhanhua','liuchongluojun'],
sp_raoting:['dc_huanghao','dc_sunziliufang','dc_sunchen','dc_jiachong'],
sp_yijun:['gongsundu','mengyou','dc_sp_menghuo'],
sp_zhengyin:['yue_caiwenji','yue_zhoufei','yue_caiyong','yue_xiaoqiao'],
sp_zhengyin:['yue_caiwenji','yue_zhoufei','yue_caiyong','yue_xiaoqiao','yue_daqiao'],
}
},
/** @type { importCharacterConfig['skill'] } */
skill:{
//刘理
dcfuli:{
audio:2,
enable:'phaseUse',
filter(event,player){
return player.getDiscardableCards(player,'h').some(card=>!player.getStorage('dcfuli').includes(get.type2(card)));
},
async content(event,trigger,player){
await player.showHandcards(get.translation(player)+'发动了【抚黎】');
const getNum=(type)=>{
let num=['basic','trick','equip'].indexOf(type);
if(num===-1) num=3;
return num;
};
const types=player.getDiscardableCards(player,'h').filter(card=>{
return !player.getStorage('dcfuli').includes(get.type2(card));
}).reduce((list,card)=>list.add(get.type2(card)),[]).sort((a,b)=>{
return getNum(a)-getNum(b);
});
if(types.length){
const {result:{control}}=await player.chooseControl(types).set('ai',()=>{
const player=get.event('player'),types=get.event('controls').slice();
const getNum=(type)=>{
const cards=player.getDiscardableCards(player,'h').filter(card=>get.type2(card)==type);
const countCards=(target,player,cards)=>{
return target.countCards('h')-(target==player?cards.length:0);
};
const max=game.findPlayer(target=>{
return !game.hasPlayer(target2=>{
return countCards(target2,player,cards)>countCards(target,player,cards);
});
}).countCards('h');
return Math.min(max,cards.reduce((sum,card)=>sum+get.cardNameLength(card),0))/cards.length;
};
return types.sort((a,b)=>{
return getNum(b)-getNum(a);
})[0];
}).set('prompt','弃置一种类别的所有手牌,然后摸这些牌的名字字数之和的牌');
if(control){
if(!player.storage.dcfuli){
player.when({global:'phaseAfter'}).then(()=>delete player.storage.dcfuli);
}
player.markAuto('dcfuli',[control]);
const cards=player.getDiscardableCards(player,'h').filter(card=>get.type2(card)==control);
await player.discard(cards);
const max=game.findPlayer(target=>target.isMaxHandcard()).countCards('h');
const num=Math.min(max,cards.reduce((sum,card)=>sum+get.cardNameLength(card),0));
if(num) await player.draw(num);
if(cards.some(card=>card.name!='shandian'&&get.tag(card,'damage'))){
const {result:{bool,targets}}=await player.chooseTarget('抚黎:是否令一名角色的攻击范围-1直到你的下个回合开始')
.set('ai',target=>{
const player=get.event('player'),num=target.getAttackRange();
return -get.sgn(get.attitude(player,target))*(target.getAttackRange()+(num<=0?(-num+0.5):num));
});
if(bool){
const target=targets[0];
player.line(target);
target.addSkill('dcfuli_range');
target.addMark('dcfuli_range',1,false);
player.when(['phaseBegin','dieBegin']).then(()=>{
target.removeMark('dcfuli_range',1,false);
if(!target.hasMark('dcfuli_range')) target.removeSkill('dcfuli_range');
}).vars({target:target});
}
}
}
}
},
ai:{
order:1,
result:{
player(player){
const types=player.getDiscardableCards(player,'h').filter(card=>!player.getStorage('dcfuli').includes(get.type2(card)));
if(!types.some(type=>{
const cards=player.getDiscardableCards(player,'h').filter(card=>get.type2(card)==type);
const countCards=(target,player,cards)=>{
return target.countCards('h')-(target==player?cards.length:0);
};
return !game.filterPlayer(target=>{
return !game.hasPlayer(target2=>{
return countCards(target2,player,cards)>countCards(target,player,cards);
});
}).includes(player);
})) return 0;
return 1;
},
},
},
subSkill:{
range:{
charlotte:true,
onremove:true,
mod:{
attackRange(player,num){
return num-player.countMark('dcfuli_range');
},
},
marktext:' - ',
intro:{content:'攻击范围-#'},
},
},
},
dcdehua:{
audio:2,
trigger:{global:'roundStart'},
forced:true,
async content(event,trigger,player){
const list=lib.inpile.filter(name=>{
if(get.type(name)==='delay') return false;
const card=new lib.element.VCard({name:name});
return get.tag(card,'damage')&&player.hasUseTarget(card);
});
if(list.length){
const {result:{bool,links}}=await player.chooseButton(['###德化###<div class="text center">视为使用一张仍可以使用的伤害类卡牌</div>',[list,'vcard']],true).set('ai',button=>{
const name=button.link[2],player=get.player();
let value=player.getUseValue({name,isCard:true},null,true);
if(player.countCards('h',card=>get.name(card)===name&&player.hasUseTarget(card))) value/=3;
if(name==='sha') value/=2;
if(player.getStorage('dcdehua').includes('sha')) value=Math.max(0.1,value);
return value;
});
if(bool){
const name=links[0][2],card=new lib.element.VCard({name:name});
await player.chooseUseTarget(card,true);
player.markAuto('dcdehua',[name]);
}
}
if(!lib.inpile.some(name=>{
if(get.type(name)==='delay') return false;
const card=new lib.element.VCard({name:name});
return get.tag(card,'damage')&&!player.getStorage('dcdehua').includes(name);
})) player.removeSkillLog('dcdehua');
},
mod:{
maxHandcard(player,num){
return num+player.getStorage('dcdehua').length;
},
cardEnabled(card,player){
if(player.getStorage('dcdehua').includes(card.name)&&(get.position(card)=='h'||card.cards&&card.cards.some(i=>get.position(i)=='h'))) return false;
},
cardSavable(card,player){
if(player.getStorage('dcdehua').includes(card.name)&&(get.position(card)=='h'||card.cards&&card.cards.some(i=>get.position(i)=='h'))) return false;
},
aiValue(player,card){
if(player.getStorage('dcdehua').includes(get.name(card))) return 0;
},
aiUseful(){
return lib.skill.dcdehua.mod.aiValue.apply(this,arguments);
},
},
intro:{
content(storage){
return '<li>手牌上限+'+storage.length+'<br><li>不能从手牌中使用'+get.translation(storage);
},
},
},
//蒋琬费祎
dcshengxi:{
inherit:'reshengxi',
trigger:{player:'phaseDiscardEnd'},
},
dcshoucheng:{
audio:'shoucheng',
global:'dcshoucheng_ai',
trigger:{
global:['equipAfter','addJudgeAfter','loseAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'],
},
filter(event,player){
const target=_status.currentPhase;
return game.hasPlayer(current=>{
if(target&&current==target) return false;
let evt=event.getl(current);
return evt&&evt.hs&&evt.hs.length&&current.countCards('h')==0;
});
},
direct:true,
async content(event,trigger,player){
const targetx=_status.currentPhase;
const targets=game.filterPlayer(current=>{
if(targetx&&current==targetx) return false;
let evt=trigger.getl(current);
return evt&&evt.hs&&evt.hs.length&&current.countCards('h')==0;
}).sortBySeat(targetx||player);
for(const target of targets){
if(!target.isIn()) continue;
const {result:{bool}}=await player.chooseBool(get.prompt2('dcshoucheng',target)).set('choice',get.attitude(player,target)>0);
if(bool){
player.logSkill('dcshoucheng',target);
if(target!=player) player.addExpose(0.2);
target.draw(2);
}
}
},
ai:{
threaten(player,target){
return Math.sqrt(game.countPlayer(i=>{
return get.attitude(target,i)>0;
}));
},
},
subSkill:{
ai:{
ai:{
noh:true,
skillTagFilter(player,tag,arg){
if(player===_status.currentPhase||player.countCards('h')!=1) return false;
return game.hasPlayer(current=>{
return current.hasSkill('dcshoucheng')&&get.attitude(current,player)>0;
});
}
}
}
}
},
//乐大乔
dczixi:{
init(){
game.addGlobalSkill('dczixi_judge');
game.broadcastAll((list)=>{
list.forEach(name=>{
const namex='dczixi_'+name;
if(!lib.card[namex]){
lib.card[namex]={
type:'special_delay',
fullskin:true,
noEffect:true,
wuxieable:false,
};
lib.card[namex].cardimage=name;
lib.translate[namex]=lib.translate[name]+'·姊希';
lib.translate[namex+'_info']='由【姊希】技能创造的无效果【'+lib.translate[name]+'】';
}
});
},lib.skill.dczixi.zixiList);
},
audio:2,
trigger:{player:['phaseUseBegin','phaseUseEnd']},
filter(event,player){
return player.countCards('h',card=>{
return card.hasGaintag('dcqiqin_tag')&&lib.skill.dczixi.zixiList.some(name=>{
return game.hasPlayer(target=>target.canAddJudge(get.autoViewAs({name:'dczixi_'+name},[card])));
});
})>0;
},
zixiList:['lebu','bingliang','shandian'],
direct:true,
async content(event,trigger,player){
const names=lib.skill.dczixi.zixiList.filter(name=>{
return player.countCards('h',card=>{
return card.hasGaintag('dcqiqin_tag')&&game.hasPlayer(target=>target.canAddJudge(get.autoViewAs({name:'dczixi_'+name},[card])));
});
});
let map={};
for(const name of names){
map[get.translation(name)]=name;
}
const {result:{bool,links}}=await player.chooseButton(2,[
'###'+get.prompt('dczixi')+'###<div class="text center">将一张“琴”以你选择的牌名置于一名角色的判定区</div>',
player.getCards('h'),
[Object.keys(map),'tdnodes'],
]).set('filterButton',button=>{
const type=typeof button.link,card=button.link;
if(ui.selected.buttons.length&&type==typeof ui.selected.buttons[0].link) return false;
if(type=='string') return true;
return card.hasGaintag('dcqiqin_tag')&&lib.skill.dczixi.zixiList.some(name=>{
return game.hasPlayer(target=>target.canAddJudge(get.autoViewAs({name:'dczixi_'+name},[card])));
});
}).set('ai',button=>{
const player=get.event('player'),list=Object.keys(get.event('map'));
if(typeof button.link=='string'){
const card=player.getCards('h',card=>{
if(get.value(card)>=7) return false;
return card.hasGaintag('dcqiqin_tag')&&game.hasPlayer(target=>target.canAddJudge(get.autoViewAs({name:'dczixi_'+name},[card])));
}).sort((a,b)=>get.value(a)-get.value(b))[0];
if(game.hasPlayer(current=>{
return get.attitude(player,current)<0&&lib.skill.dczixi.zixiList.some(name=>current.canAddJudge(get.autoViewAs({name:'dczixi_'+name},[card])));
})) return list.indexOf(button.link)+1;
return 1/(list.indexOf(button.link)+1);
}
return 7-get.value(button.link);
}).set('map',map);
if(bool){
const name=links.find(i=>typeof i=='string'),card=links.find(j=>j!=name),cardname=map[name];
const {result:{bool,targets}}=await player.chooseTarget('请选择【'+name+''+get.translation(card)+')】置入的目标',(cardx,player,target)=>{
return target.canAddJudge(get.autoViewAs({name:'dczixi_'+get.event('name')},[get.event('card')]));
},true).set('ai',target=>{
const player=get.event('player'),card=get.event('card');
if(game.hasPlayer(current=>{
return get.attitude(player,current)<0&&current.canAddJudge(get.autoViewAs({name:'dczixi_'+get.event('name')},[card]));
})) return -target.countCards('j')-1;
return target.countCards('j')+1;
}).set('card',card).set('name',cardname);
if(bool){
const target=targets[0];
player.logSkill('dczixi',target);
player.$give(card,target,false);
await game.asyncDelay(0.5);
target.addJudge({name:'dczixi_'+cardname},[card]);
}
}
},
group:'dczixi_effect',
subSkill:{
judge:{
mod:{
targetEnabled(card,player,target){
const list=lib.skill.dczixi.zixiList;
const name=(typeof card=='string')?card:(card.viewAs?card.viewAs:card.name);
if(name.indexOf('dczixi_')==0){
const namex=name.slice('dczixi_'.length);
if(list.includes(namex)&&target.hasJudge(namex)) return false;
}
else if(list.includes(name)&&target.hasJudge('dczixi_'+name)) return false;
},
},
ai:{
threaten(player,target){
if(!player.hasSkill('dczixi')||![1,2,3].includes(target.countCards('j'))) return;
return 3+target.countCards('j');
},
},
},
effect:{
audio:'dczixi',
trigger:{player:'useCardToTargeted'},
filter(event,player){
return event.isFirstTarget&&event.targets.length==1&&[1,2,3].includes(event.target.countCards('j'))&&(get.type(event.card)=='basic'||get.type(event.card)=='trick');
},
prompt2(event,player){
const target=event.target,str=get.translation(target);
return [
'令'+get.translation(event.card)+'对'+str+'额外结算一次',
'摸两张牌',
'弃置'+str+'判定区里的所有牌对其造成3点伤害',
][target.countCards('j')-1];
},
check(event,player){
const target=event.target,num=target.countCards('j');
if(num==2) return true;
if(num==1) return get.effect(target,event.card,player,player)>0;
return get.attitude(player,target)<0&&get.damageEffect(target,player,player)>0;
},
logTarget:'target',
async content(event,trigger,player){
const target=trigger.target,num=target.countCards('j');
switch(num){
case 1:
trigger.getParent().effectCount++;
game.log(trigger.card,'额外结算一次');
break;
case 2:
player.draw(2);
break;
case 3:
target.discard(target.getCards('j')).discarder=player;
target.damage(3);
break;
}
},
},
},
},
//孔融
dckrmingshi:{
audio:'mingshi',
trigger:{player:'damageBegin4'},
filter(event,player){
return event.source&&event.source.countCards('h')>player.countCards('h');
},
forced:true,
logTarget:'source',
async content(event,trigger,player){
const target=trigger.source;
const {result:{bool}}=await target.chooseToDiscard('名士:弃置一张手牌,或防止对'+get.translation(player)+'造成的伤害').set('ai',card=>{
if(get.event('goon')) return 0;
return 6-get.value(card);
}).set('goon',get.damageEffect(player,target,target)<=0);
if(!bool) trigger.cancel();
},
ai:{
effect:{
target_use(card,player,target,current){
if(get.tag(card,'damage')&&target!=player){
if(_status.event.name=='dckrmingshi') return;
if(get.attitude(player,target)>0&&current<0) return 'zerotarget';
var bs=player.getCards('h');
bs.remove(card);
if(card.cards) bs.removeArray(card.cards);
else bs.removeArray(ui.selected.cards);
if(bs.length>target.countCards('h')){
if(bs.some(bsi=>get.value(bsi)<7)) return [1,0,1,-0.5];
return [1,0,0.3,0];
}
return [1,0,1,-0.5];
}
},
},
},
},
//新服SP孟获
dcmanwang:{
audio:'spmanwang',
@ -270,11 +674,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audioname:['yue_daqiao'],
trigger:{player:'phaseZhunbeiBegin'},
filter:function(event,player){
return player.getStorage('dcqiqin').filterInD('d').length;
const targets=game.players.slice().concat(game.dead);
return targets.some(target=>target.getStorage('dcqiqin').filterInD('d').length);
},
forced:true,
content:function(){
player.gain(player.getStorage('dcqiqin').filterInD('d'),'gain2').gaintag.add('dcqiqin_tag');
const targets=game.players.slice().concat(game.dead);
const cards=targets.reduce((list,target)=>list.addArray(target.getStorage('dcqiqin').filterInD('d')),[]);
player.gain(cards,'gain2').gaintag.add('dcqiqin_tag');
},
},
},
@ -1585,7 +1992,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.logSkill('dcmanzhi',target);
if(result.control=='选项一'){
player.addTempSkill('dcmanzhi_1');
target.chooseCard(2,'he','蛮智:请交给'+get.translation(player)+'两张牌');
target.chooseCard(2,'he','蛮智:请交给'+get.translation(player)+'两张牌',true);
}
else{
player.addTempSkill('dcmanzhi_2');
@ -4843,26 +5250,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.chooseToDiscard('he',get.prompt('dccuijin',target),'弃置一张牌并令'+get.translation(trigger.player)+'使用的【杀】伤害+1但若其未造成伤害则你摸一张牌并对其造成1点伤害。').set('ai',function(card){
if(_status.event.goon) return 7-get.value(card);
return 0;
}).set('goon',function(){
var d1=true;
if(trigger.player.hasSkill('jueqing')||trigger.player.hasSkill('gangzhi')) d1=false
for(var target of trigger.targets){
if(!target.mayHaveShan(player,'use',target.getCards(i=>{
return i.hasGaintag('sha_notshan');
}))||trigger.player.hasSkillTag('directHit_ai',true,{
target:target,
card:trigger.card,
},true)){
if(!target.hasSkill('gangzhi')) d1=false;
if(!target.hasSkillTag('filterDamage',null,{
player:trigger.player,
card:trigger.card,
})&&get.attitude(player,target)<0) return true;
}
}
if(d1) return get.damageEffect(trigger.player,player,player)>0;
return false;
}()).logSkill=['dccuijin',target];
}).set('goon',lib.skill.cuijin.checkx(trigger,player)).logSkill=['dccuijin',target];
'step 1'
if(result.bool){
if(typeof trigger.baseDamage!='number') trigger.baseDamage=1;
@ -5060,7 +5448,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(effect>0) return '选项二';
}
}else{
loses.forEach(i=>effect-=get.effect(i,{name:'losehp'},player,player));
loses.forEach(i=>effect+=get.effect(i,{name:'losehp'},player,player));
recovers.forEach(i=>effect+=get.recoverEffect(i,player,player));
if(effect>0) return '选项二';
return '选项一';
@ -7990,9 +8378,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
buff:{
charlotte:true,
mark:true,
marktext:" +4 ",
marktext:" + ",
intro:{
content:"本回合手牌上限+4且使用牌无次数限制",
content:"本回合手牌上限+#且使用牌无次数限制",
},
mod:{
maxHandcard:function(player,num){
@ -8007,7 +8395,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
debuff:{
charlotte:true,
mark:true,
marktext:" -4 ",
marktext:" - ",
intro:{
content:"本回合手牌上限-#且不能使用基本牌",
},
@ -10775,83 +11163,58 @@ game.import('character',function(lib,game,ui,get,ai,_status){
reliangying:{
audio:2,
trigger:{player:'phaseDiscardBegin'},
filter(event,player){
return player.hasMark('recangchu');
},
direct:true,
content:function(){
'step 0'
var map={};
var list=[];
for(var i=1;i<=player.countMark('recangchu');i++){
var cn=get.cnNumber(i,true);
map[cn]=i;
list.push(cn);
}
list.push('cancel2');
event.map=map;
player.chooseControl(list).set('prompt',get.prompt('reliangying')).set('prompt2','摸至多'+get.cnNumber(player.countMark('recangchu'))+'张牌,然后交给等量的角色各一张牌').set('ai',function(){
var player=_status.event.player;
var num=Math.min(player.countMark('recangchu'),game.countPlayer(function(current){
return get.attitude(player,current)>0;
}));
if(num>0) return get.cnNumber(num,true);
async content(event,trigger,player){
const draws=Array.from({length:player.countMark('recangchu')}).map((_,i)=>get.cnNumber(i+1)+'张');
const {result:{control}}=await player.chooseControl(draws,'cancel2').set('prompt',get.prompt('reliangying'))
.set('prompt2','摸至多'+get.cnNumber(player.countMark('recangchu'))+'张牌,然后交给等量的角色各一张牌').set('ai',()=>{
const player=get.event('player');
const num=Math.min(player.countMark('recangchu'),game.countPlayer(current=>get.attitude(player,current)>0));
if(num>0) return get.cnNumber(num)+'张';
return 'cancel2';
});
'step 1'
if(result.control=='cancel2'){event.finish();return;}
player.logSkill('reliangying');
var num=event.map[result.control]||1;
event.num=num;
player.draw(num);
'step 2'
var num=Math.min(event.num,player.countCards('he'),game.countPlayer(function(target){
return target!=player;
}));
if(num){
player.chooseCardTarget({
prompt:'将'+get.cnNumber(num)+'张牌交给其他角色',
prompt2:'操作提示:先按顺序选中所有要给出的牌,然后再按顺序选择等量的目标角色。可少选一张牌,并将此牌留给自己',
selectCard:[num-1,num],
selectTarget:function(){
return ui.selected.cards.length;
},
filterTarget:function(card,player,target){
return target!=player;
},
filterOk:function(){
return ui.selected.cards.length==ui.selected.targets.length;
},
complexSelect:true,
position:'he',
ai1:function(card){
if(game.countPlayer(function(current){
return target!=_status.event.player&&get.attitude(_status.event.player,target)>0;
})<=ui.selected.cards.length) return 0;
if(card.name=='shan') return 1;
return Math.random();
},
ai2:function(target){
if(!target) return 1;
return Math.sqrt(5-Math.min(4,target.countCards('h')))*get.attitude(_status.event.player,target);
},
forced:true,
});
}
else event.finish();
'step 3'
if(result.bool&&result.cards.length>0){
var list=[];
for(var i=0;i<result.targets.length;i++){
var target=result.targets[i];
var card=result.cards[i];
list.push([target,card]);
player.line(target);
if(control!='cancel2'){
player.logSkill('reliangying');
const num=draws.indexOf(control)+1,max=Math.min(num,player.countCards('he'),game.countPlayer(target=>target!=player));
await player.draw(num);
let list=[];
while(max-list.length>0){
const {result:{bool,cards,targets}}=await player.chooseCardTarget({
prompt:'粮营:将'+get.cnNumber(max-1)+'至'+get.cnNumber(max)+'张牌交给其他角色',
position:'he',
animate:false,
filterCard(card,player){
return !get.event('list').some(list=>list[1]==card);
},
filterTarget(card,player,target){
return target!=player&&!get.event('list').some(list=>list[0]==target);
},
ai1(card){
if(card.name=='shan') return 1;
return Math.random();
},
ai2(target){
return get.attitude(get.event('player'),target);
},
}).set('list',list).set('forced',max-list.length>1);
if(bool){
list.push([targets[0],cards[0]]);
player.addGaintag(cards,'olsujian_given');
}
else break;
}
if(list.length){
await game.loseAsync({
gain_list:list,
player:player,
cards:list.slice().map(list=>list[1]),
giver:player,
animate:'giveAuto',
}).setContent('gaincardMultiple');
}
game.loseAsync({
gain_list:list,
player:player,
cards:result.cards,
giver:player,
animate:'giveAuto',
}).setContent('gaincardMultiple');
}
},
},
@ -11128,7 +11491,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
let ph=player.countCards('h');
if(game.hasPlayer(i=>{
if(!player.canUse('sha',i,true,true)||get.effect(i,{name:'sha'},player,player)<=0) return false;
return !ph||!i.mayHaveShan(player,'use',i.getCards(i=>{
return !ph||!i.mayHaveShan(player,'use',i.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}));
})) return 1;
@ -11142,6 +11505,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
card:{
},
characterIntro:{
dc_liuli:'刘理—244年字奉孝涿郡涿县今河北涿州三国时期蜀汉昭烈帝刘备之子蜀汉后主刘禅、甘陵王刘永异母弟。章武元年221年刘备称帝派司徒许靖封刘理为梁王。建兴八年230年改封为安平王。延熙七年244年刘理去世谥号悼王。',
xingdaorong:'邢道荣是《三国演义》中虚构的人物,为零陵太守刘度手下武将,被评价有万夫不当之勇,于《三国演义》第五十二回登场,被赵云刺死。',
caoxing:'曹性,东汉末年吕布部将,史载他曾与身为自己上司的反叛者郝萌交战,并砍去郝萌一臂,受到吕布的嘉奖。在罗贯中所著古典小说《三国演义》中,也有关于曹性箭射夏侯惇左目的描述,而曹性也随即被暴怒的夏侯惇所杀。在穿越小说《三国之银河射手》中,主角穿越成为曹性,经过一番闯荡之后,被封为“银河射手”。',
xiahoujie:'夏侯杰—208年是罗贯中的小说《三国演义》中曹操的部将征战时常常带在身边。在第42回长坂坡之战中张飞大吼从马儿受惊跌下马来而死。',
@ -11261,6 +11625,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
gaoxiang:['gaoxiang','jsrg_gaoxiang'],
lingcao:['lingcao','dc_lingcao'],
sp_menghuo:['sp_menghuo','dc_sp_menghuo'],
sunchen:['dc_sunchen','ps_sunchen'],
},
translate:{
re_panfeng:'潘凤',
@ -11268,7 +11633,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
xinkuangfu_info:'出牌阶段限一次你可选择1弃置装备区里的一张牌你使用无对应实体牌的普【杀】。若此【杀】造成伤害你摸两张牌。2弃置一名其他角色装备区里的一张牌你使用无对应实体牌的普【杀】。若此【杀】未造成伤害你弃置两张手牌。',
xingdaorong:'邢道荣',
xuxie:'虚猲',
xuxie_info:'出牌阶段开始时你可以减1点体力上限并选择所有与你距离1的角色弃置这些角色的各一张牌或令这些角色各摸一张牌。出牌阶段结束时若你的体力上限不为全场最多则你加1点体力上限然后回复1点体力或摸两张牌。',
xuxie_info:'出牌阶段开始时你可以减1点体力上限并选择所有距离1以内的角色弃置这些角色的各一张牌或令这些角色各摸一张牌。出牌阶段结束时若你的体力上限不为全场最多则你加1点体力上限然后回复1点体力或摸两张牌。',
caoxing:'曹性',
cxliushi:'流矢',
cxliushi2:'流矢',
@ -11721,7 +12086,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
yue_xiaoqiao_prefix:'乐',
dcqiqin:'绮琴',
dcqiqin_tag:'琴',
dcqiqin_info:'锁定技。①游戏开始时,你将所有手牌标记为“琴”。②你的“琴”牌不计入手牌上限。③准备阶段,你获得弃牌堆中所有你标记过的“琴”牌。',
dcqiqin_info:'锁定技。①游戏开始时,你将所有手牌标记为“琴”。②你的“琴”牌不计入手牌上限。③准备阶段,你获得位于弃牌堆的所有“琴”。',
dcweiwan:'媦婉',
dcweiwan_info:'出牌阶段限一次你可以弃置一张“琴”并随机获得一名其他角色区域内花色与此牌不相同的牌各一张若你获得了一张牌其失去1点体力两张牌本回合你对其使用牌无距离和次数限制三张牌本回合你不能对其使用牌。',
dc_lingcao:'新杀凌操',
@ -11734,6 +12099,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dcmanwang_info:'出牌阶段你可以弃置任意张牌。然后你依次执行以下选项中的前X项⒈获得〖叛侵〗。⒉摸一张牌。⒊回复1点体力。⒋摸两张牌并失去〖叛侵〗。',
dcpanqin:'叛侵',
dcpanqin_info:'出牌阶段或弃牌阶段结束时你可将你于本阶段内弃置且位于弃牌堆的所有牌当做【南蛮入侵】使用。然后若此牌被使用时对应的实体牌数不大于此牌的目标数则你执行并移除〖蛮王〗中的最后一个选项然后加1点体力上限并回复1点体力。',
dc_kongrong:'孔融',
dckrmingshi:'名士',
dckrmingshi_info:'锁定技,当你受到其他角色造成的伤害时,若其手牌数大于你,则其需弃置一张手牌,否则此伤害-1。',
yue_daqiao:'乐大乔',
yue_daqiao_prefix:'乐',
dczixi:'姊希',
dczixi_info:'①出牌阶段开始和结束时你可以将一张“琴”当作一张无效果的【乐不思蜀】、【兵粮寸断】或【闪电】置于一名角色的判定区。②当你使用基本牌或普通锦囊牌指定唯一目标后你可根据其判定区内的牌数执行对应项1.令此牌对其额外结算一次2.摸两张牌3.弃置其判定区所有牌对其造成3点伤害。',
jiangfei:'蒋琬费祎',
dcshengxi:'生息',
dcshengxi_info:'弃牌阶段结束时,若你本回合未造成过伤害,你可以摸两张牌。',
dcshoucheng:'守成',
dcshoucheng_info:'一名角色于其回合外失去最后的手牌后,你可令其摸两张牌。',
dc_liuli:'刘理',
dcfuli:'抚黎',
dcfuli_info:'出牌阶段你可以展示手牌并弃置一种类别的所有手牌每种类别每回合限一次然后摸X张牌X为这些牌的牌名字数和且X至多为场上手牌数最多的角色的手牌数。若你因此弃置了伤害类卡牌则你可以选择一名角色令其攻击范围-1直到你的下个回合开始。',
dcdehua:'德化',
dcdehua_info:'锁定技。①一轮游戏开始时,若有你可以使用的非延时类伤害类牌的牌名,你选择其中一个并视为使用之,然后你不能从手牌中使用此牌名的牌,然后若你已选择过所有的伤害类牌牌名,你失去〖德化〗。②你的手牌上限+YY为你〖德化①〗选择过的牌名数。',
sp_baigei:'无双上将',
sp_caizijiaren:'才子佳人',

View File

@ -1045,6 +1045,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return `${get.translation(event.card)}不计入次数限制,且你获得${get.translation(event.target)}一张牌,然后其可以令你本回合至其的距离+2`;
},
group:'jsrgeqian_prepare',
logTarget:'target',
async content(event,trigger,player){
if(trigger.addCount!==false){
trigger.addCount=false;
@ -1071,14 +1072,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
direct:true,
async content(event,trigger,player){
while(true){
while(player.countCards('h')>0){
const {result:{bool,cards}}=await player.chooseCard(get.prompt('jsrgeqian'),'你可以蓄谋任意次').set('ai',card=>{
const player=get.player();
if(player.hasValueTarget(card)) return player.getUseValue(card);
return 0;
});
if(!bool) break;
player.addJudge({name:'xumou_jsrg'},cards);
await player.addJudge({name:'xumou_jsrg'},cards);
}
},
},
@ -4270,7 +4271,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
result:{
target:function(player,target){
var eff=get.effect(target,{name:'sha',nature:'fire'},player,target)/30;
if(!target.mayHaveShan(player,'use',target.getCards(i=>{
if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))) eff*=2;
var del=target.countCards('h')-player.countCards('h')+1.5;
@ -6852,19 +6853,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 6'
if(result.bool&&result.links.length){
var link=result.links[0];
if(get.position(link)=='h'){
event.targets[1].gain(link);
}
else if(get.position(link)=='e'){
event.targets[1].equip(link);
}
else if(link.viewAs){
event.targets[1].addJudge({name:link.viewAs},[link]);
}
if(get.position(link)=='h') event.targets[1].gain(link,event.targets[0],'giveAuto');
else{
event.targets[1].addJudge(link);
event.targets[0].$give(link,event.targets[1],false);
if(get.position(link)=='e') event.targets[1].equip(link);
else if(link.viewAs) event.targets[1].addJudge({name:link.viewAs},[link]);
else event.targets[1].addJudge(link);
}
event.targets[0].$give(link,event.targets[1],false);
game.log(event.targets[0],'的',get.position(link)=='h'?'一张手牌':link,'被移动给了',event.targets[1]);
game.delay();
}
@ -7124,7 +7119,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(_status.event.all) return 1;
if(ui.selected.buttons.length) return 0;
return Math.random();
}).set('all',!target.mayHaveShan(player,'use',target.getCards(i=>{
}).set('all',!target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))&&Math.random()<0.75).set('forceAuto',true);
'step 1'

View File

@ -31,7 +31,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
mb_chengui:['male','qun',3,['guimou','zhouxian']],
mb_huban:['male','wei',4,['mbyilie']],
mb_xianglang:['male','shu',3,['naxue','yijie']],
yanxiang:['male','qun',3,['kujian','twruilian'],['character:tw_yanxiang','die_audio:tw_yanxiang']],
yanxiang:['male','qun',3,['kujian','twruilian'],['die_audio:tw_yanxiang']],
mb_sunluyu:['female','wu',3,['mbmeibu','mbmumu']],
xin_wuban:['male','shu',4,['xinjintao'],['clan:陈留吴氏','character:wuban']],
baoxin:['male','qun',4,['mutao','yimou'],['die_audio:tw_baoxin']],
@ -7523,6 +7523,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){
//钟会
requanji:{
audio:2,
mod:{
aiOrder:(player,card,num)=>{
if(num<=0||typeof card!=='object'||!player.isPhaseUsing()||!player.hasSkill('zili')||player.needsToDiscard()) return num;
if(player.getExpansions('quanji').length<3&&player.getUseValue(card)<Math.min(4,player.hp*player.hp/4)) return 0;
}
},
trigger:{player:['damageEnd','phaseUseEnd']},
frequent:true,
locked:false,
@ -9137,7 +9143,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
]).set('ai',function(){
var target=_status.event.getTrigger().target;
var player=_status.event.player;
var num=target.mayHaveShan(player,'use',target.getCards(i=>{
var num=target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))?0:1;
if(get.attitude(player,target)>0) num=1-num;
@ -15646,7 +15652,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'你随机弃置其装备区的一张牌',
'令其摸一张牌',
][['豹','鹰','熊','兔'].indexOf(zhoufa)];
return str;
return str+'。';
},
},
perfectPair:{

View File

@ -11,7 +11,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
offline_yijiang:['ol_xinxianying'],
offline_luanwu:["ns_lijue","ns_zhangji","ns_fanchou"],
offline_yongjian:["ns_chendao","yj_caoang","yj_caocao",'yj_liru','yj_caohong','yj_zhangfei','yongjian_ganning','yj_dongzhuo','yj_xuyou','yj_jiaxu','yj_zhenji'],
offline_piracyE:['shen_jiaxu','pe_wangyun','pe_zhonghui','pe_sunchen','pe_mengda','pe_wenqin','ns_caoanmin','jiangfei','chendong','jiangqing','kongrong','jiling','tianfeng','mateng'],
offline_piracyE:['shen_jiaxu','pe_wangyun','pe_zhonghui','pe_sunchen','pe_mengda','pe_wenqin','ns_caoanmin','chendong','jiangqing','kongrong','jiling','tianfeng','mateng'],
offline_piracyS:['ns_jiaxu','longyufei','ps_guanyu','ps1059_guojia','ps2070_guojia','ps2063_zhaoyun','ps2067_zhaoyun','ps1062_zhouyu','ps2080_zhouyu','ps_caozhi','ps_jin_simayi','ps_caopi','ps_simayi','ps2068_simayi','ps_machao','ps_zhugeliang','ps2066_zhugeliang','ps_jiaxu','ps_lvbu','ps_shen_machao','jsp_liubei'],
offline_piracyK:['pk_sp_duyu'],
offline_vtuber:['vtb_xiaosha','vtb_xiaoshan','vtb_xiaotao','vtb_xiaole','vtb_xiaojiu'],
@ -36,7 +36,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
kongrong:['male','qun',3,['zymingshi','lirang']],
chendong:['male','wu',4,['duanxie','fenming']],
jiangqing:['male','wu',4,['zyshangyi']],
jiangfei:['male','shu',3,['reshengxi','shoucheng']],
pk_sp_duyu:['male','qun',4,['pkwuku','pksanchen']],
ps_lvbu:['male','qun',4,['wushuang','pssheji']],
ps_jiaxu:['male','qun',4,['wansha','psqupo','psbaoquan']],
@ -168,7 +167,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
d1=true;
if(trigger.player.hasSkill('jueqing')||trigger.player.hasSkill('gangzhi')) d1=false;
for(var target of trigger.targets){
if(!target.mayHaveShan(player,'use',target.getCards(i=>{
if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))||trigger.player.hasSkillTag('directHit_ai',true,{
target:target,
@ -299,7 +298,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var effect=0;
for(var target of trigger.targets){
var eff=get.effect(target,trigger.card,trigger.player,player);
if(!target.mayHaveShan(player,'use',target.getCards(i=>{
if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))||trigger.player.hasSkillTag('directHit_ai',true,{
target:target,
@ -4437,6 +4436,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var target=result.targets[0];
event.target=target;
player.logSkill('nsfeixiong',target);
if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.2);
player.chooseToCompare(target);
}
else event.finish();
@ -6793,8 +6793,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ol_xinxianying_prefix:'将',
chendong:'战役篇陈武董袭',
chendong_prefix:'战役篇',
jiangfei:'战役篇蒋琬费祎',
jiangfei_prefix:'战役篇',
jiangqing:'战役篇蒋钦',
jiangqing_prefix:'战役篇',
tianfeng:'战役篇田丰',

View File

@ -8,13 +8,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ol_caozhang:['male','wei',4,['oljiangchi'],['die_audio:xin_caozhang']],
ol_jianyong:['male','shu',3,['olqiaoshui','jyzongshi'],['tempname:re_jianyong','die_audio:re_jianyong']],
ol_lingtong:['male','wu',4,['olxuanfeng'],['die_audio:re_lingtong']],
ol_sb_guanyu:['male','shu',4,['olsbfumeng','olsbguidao']],
ol_sb_guanyu:['male','shu',4,['olsbweilin','olsbduoshou']],
ol_sb_taishici:['male','wu',4,['olsbdulie','olsbdouchan']],
ol_gaoshun:['male','qun',4,['olxianzhen','decadejinjiu'],['die_audio:re_gaoshun']],
},
characterSort:{
onlyOL:{
onlyOL_yijiang1:['ol_jianyong','ol_lingtong'],
onlyOL_yijiang1:['ol_jianyong','ol_lingtong','ol_gaoshun'],
onlyOL_yijiang2:['ol_caozhang'],
onlyOL_sb:['ol_sb_jiangwei','ol_sb_guanyu'],
onlyOL_sb:['ol_sb_jiangwei','ol_sb_guanyu','ol_sb_taishici'],
},
},
characterIntro:{
@ -22,17 +24,272 @@ game.import('character',function(lib,game,ui,get,ai,_status){
characterReplace:{
},
skill:{
//界高顺
olxianzhen:{
audio:'rexianzhen',
inherit:'xianzhen',
async content(event,trigger,player){
const target=event.target;
const {result:{bool}}=await player.chooseToCompare(target);
if(bool){
player.storage.xinxianzhen=target;
player.addTempSkill('xinxianzhen2');
}
else{
player.markAuto('olxianzhen_buff',[target]);
player.addTempSkill('olxianzhen_buff');
}
},
subSkill:{
buff:{
charlotte:true,
onremove:true,
mod:{
playerEnabled(card,player,target){
if(get.name(card,player)=='sha'&&player.getStorage('olxianzhen_buff').includes(target)) return false;
},
ignoredHandcard(card,player){
if(get.name(card,player)=='sha') return true;
},
cardDiscardable(card,player,name){
if(name=='phaseDiscard'&&get.name(card,player)=='sha') return false;
},
},
},
},
},
//新OL谋关羽
olsbweilin:{
audio:2,
enable:'chooseToUse',
filter(event,player){
return get.inpileVCardList(info=>{
const name=info[2];
if(name!='sha'&&name!='jiu') return false;
return get.type(name)=='basic';
}).some(card=>player.hasCard(cardx=>event.filterCard({name:card[2],nature:card[3],cards:[cardx]},player,event),'hes'));
},
usable:1,
chooseButton:{
dialog(event,player){
const list=get.inpileVCardList(info=>{
const name=info[2];
if(name!='sha'&&name!='jiu') return false;
return get.type(name)=='basic';
}).filter(card=>player.hasCard(cardx=>event.filterCard({name:card[2],nature:card[3],cards:[cardx]},player,event),'hes'));
return ui.create.dialog('威临',[list,'vcard']);
},
filter(button,player){
return _status.event.getParent().filterCard({name:button.link[2],nature:button.link[3]},player,_status.event.getParent());
},
check(button){
if(_status.event.getParent().type!='phase') return 1;
const player=get.event('player'),value=player.getUseValue({name:button.link[2],nature:button.link[3]});
if(button.link[2]=='sha'&&!player.getHistory('useCard',evt=>get.type(evt.card)=='basic').length){
if(value>0) return value+20;
}
return value;
},
backup(links,player){
return {
audio:'olsbweilin',
filterCard:true,
popname:true,
check(card){
const name=lib.skill.olsbweilin_backup.viewAs.name,color=get.color(card);
const phase=(_status.event.getParent().type=='phase');
if(phase&&name=='sha'&&color=='red') return 10-get.value(card);
if(name=='tao') return 7+[-2,0,2][['black','red','none'].indexOf(color)]-get.value(card);
return 6-get.value(card);
},
position:'hse',
viewAs:{name:links[0][2],nature:links[0][3]},
precontent(){
if(!player.storage.olsbweilin_backup){
player.storage.olsbweilin_backup=true;
player.when('useCardToTargeted')
.filter(evt=>evt.getParent().skill=='olsbweilin_backup'&&evt.getParent().triggeredTargets3.length==evt.targets.length)
.then(()=>{
delete player.storage.olsbweilin_backup;
const targets=trigger.targets.slice().sortBySeat();
player.line(targets);
for(const target of targets){
target.addTempSkill('olsbweilin_wusheng');
target.markAuto('olsbweilin_wusheng',[get.color(trigger.card)]);
}
});
}
},
ai:{
directHit_ai:true,
skillTagFilter(player,tag,arg){
if(get.event('skill')!='olsbweilin_backup') return false;
return arg&&arg.card&&arg.card.name=='sha'&&get.color(arg.card)=='red';
},
},
}
},
prompt(links,player){
return '将一张牌当作'+(get.translation(links[0][3])||'')+'【'+get.translation(links[0][2])+'】使用';
}
},
hiddenCard(player,name){
if(!lib.inpile.includes(name)||name!='jiu') return false;
return get.type(name)=='basic'&&!player.getStat('skill').olsbweilin&&player.countCards('hes');
},
ai:{
fireAttack:true,
respondSha:true,
skillTagFilter(player,tag,arg){
if(arg=='respond') return false;
if(player.getStat('skill').olsbweilin||!player.countCards('hes')) return false;
},
order(item,player){
if(player&&_status.event.type=='phase'&&player.hasValueTarget({name:'sha'},true,true)){
let max=0,names=get.inpileVCardList(info=>{
const name=info[2];
if(name!='sha'&&name!='jiu') return false;
return get.type(name)=='basic';
});
names=names.map(namex=>{return {name:namex[2],nature:namex[3]}});
names.forEach(card=>{
if(player.getUseValue(card)>0){
let temp=get.order(card);
if(card.name=='jiu'){
let cards=player.getCards('hs',cardx=>get.value(cardx)<8);
cards.sort((a,b)=>get.value(a)-get.value(b));
if(!cards.some(cardx=>get.name(cardx)=='sha'&&!cards.slice(0,2).includes(cardx))) temp=0;
}
if(temp>max) max=temp;
}
});
if(max>0) max+=15;
return max;
}
return 0.5;
},
result:{
player(player){
if(_status.event.dying) return get.attitude(player,_status.event.dying);
return 1;
},
},
},
subSkill:{
backup:{},
wusheng:{
charlotte:true,
onremove:true,
mod:{
cardname(card,player){
if(player.getStorage('olsbweilin_wusheng').includes(get.color(card))) return 'sha';
},
},
intro:{content:'手牌中所有$牌均视为【杀】'},
},
},
},
olsbduoshou:{
init(player){
if(player.getHistory('useCard',evt=>get.color(evt.card)=='red').length) player.addTempSkill('olsbduoshou_used');
},
mod:{
targetInRange(card,player,target){
if(get.color(card)=='red'&&!player.hasSkill('olsbduoshou_used')) return true;
},
},
audio:2,
trigger:{
player:'useCard',
source:'damageSource',
},
filter(event,player){
if(event.name=='damage') return player.getHistory('sourceDamage').indexOf(event)==0;
if(get.color(event.card)=='red'&&!player.hasSkill('olsbduoshou_used')) return true;
return get.type(event.card)=='basic'&&player.getHistory('useCard',evt=>get.type(evt.card)=='basic').indexOf(event)==0;
},
forced:true,
async content(event,trigger,player){
if(trigger.name=='damage') player.draw();
else{
if(get.color(trigger.card)=='red'&&!player.hasSkill('olsbduoshou_used')){
game.log(trigger.card,'无距离限制');
player.addTempSkill('olsbduoshou_used');
}
if(get.type(trigger.card)=='basic'&&player.getHistory('useCard',evt=>get.type(evt.card)=='basic').indexOf(trigger)==0){
game.log(trigger.card,'不计入次数上限');
trigger.addCount=false;
if(player.stat[player.stat.length-1].card.sha>0) player.stat[player.stat.length-1].card.sha--;
}
}
},
subSkill:{used:{charlotte:true}},
},
//OL谋太史慈
olsbdulie:{
audio:2,
trigger:{target:'useCardToTarget'},
filter(event,player){
if(event.player==player||!event.isFirstTarget||event.targets.length!=1) return false;
if(player.getAttackRange()<=0) return;
return ['basic','trick'].includes(get.type(event.card));
},
prompt2(event,player){
return '令'+get.translation(event.card)+'额外结算一次,此牌结算完毕后,你摸等同于你攻击范围的牌';
},
check(event,player){
const num=Math.min(5,player.getAttackRange());
if(get.effect(player,event.card,event.player,player)>0) return true;
if(event.card.name=='guohe'||event.card.name=='shunshou'||event.card.name=='zhujinqiyuan') return num>(event.effectCount||0);
if(!get.tag(event.card,'damage')) return true;
return num>1;
},
usable:1,
async content(event,trigger,player){
trigger.getParent().effectCount++;
player.when({global:'useCardAfter'})
.filter(evt=>evt==trigger.getParent())
.then(()=>{
const num=Math.min(5,player.getAttackRange());
if(num>0) player.draw(num);
});
},
},
olsbdouchan:{
audio:2,
trigger:{player:'phaseZhunbeiBegin'},
forced:true,
async content(event,trigger,player){
const card=get.cardPile2(card=>card.name=='juedou');
if(card) player.gain(card,'gain2');
else if(player.countMark('olsbdouchan')<game.players.length+game.dead.length) player.addMark('olsbdouchan',1,false);
},
mod:{
attackRange(player,num){
return num+player.countMark('olsbdouchan');
},
cardUsable(card,player,num){
if(card.name=='sha') return num+player.countMark('olsbdouchan');
},
},
intro:{content:'<li>攻击距离+#<br><li>使用【杀】的次数上限+#'},
},
//OL谋关羽
//可以和手杀谋关羽组成卧龙凤雏了
olsbfumeng:{
audio:2,
trigger:{global:'roundStart'},
filter(event,player){
return player.countCards('h');
return player.countCards('h',card=>{
if(_status.connectMode) return true;
return get.name(card,player)!='sha';
});
},
direct:true,
async content(event,trigger,player){
const {result:{bool,cards}}=await player.chooseCard(get.prompt2('olsbfumeng'),[1,Infinity]).set('ai',card=>{
const {result:{bool,cards}}=await player.chooseCard(get.prompt2('olsbfumeng'),[1,Infinity],(card,player)=>{
return get.name(card,player)!='sha';
}).set('ai',card=>{
const player=get.event('player');
if(player.hasSkill('olsbfumeng')) return 7-get.value(card);
return 4.5-get.value(card);
@ -131,7 +388,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
charlotte:true,
trigger:{global:'damageBegin3'},
filter(event,player){
return event.card&&event.source&&event.card.storage&&event.card.storage.olsbguidao&&event.source==player;
if(!event.card||!event.card.storage||!event.card.storage.olsbguidao) return false;
if(!event.source||event.source!=player) return false;
const evt=event.getParent('useCard');
return evt.player==player&&evt.targets.includes(event.player);
},
forced:true,
popup:false,
@ -281,14 +541,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}).set('list',[-num1,player.getDamagedHp()]);
}
if(result.index==0){
if(num1<0) player.drawTo(player.getHandcardLimit());
else player.chooseToDiscard(num1,'h',true);
if(num1<0) yield player.drawTo(player.getHandcardLimit());
else yield player.chooseToDiscard(num1,'h',true);
}
else{
player.recover(player.maxHp-player.hp);
yield player.recover(player.maxHp-player.hp);
}
}
player.when('olsbranjiAfter').then(()=>player.addSkill('olsbranji_norecover'));
player.addSkill('olsbranji_norecover');
player.when({source:'dieAfter'}).then(()=>player.removeSkill('olsbranji_norecover'));
},
derivation:['kunfenx','zhaxiang'],
@ -495,6 +755,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){
olsbfumeng_info:'一轮游戏开始时,你可以令任意张手牌的牌名视为【杀】。',
olsbguidao:'归刀',
olsbguidao_info:'出牌阶段,你可以重铸两张牌并视为使用一张【决斗】(重铸的【杀】数须比本回合上次发动〖归刀〗重铸的【杀】数多)。目标角色受到此牌伤害时,其须猜测你手牌中牌名为【杀】的牌数量多还是牌名不为【杀】的牌数多,若其猜错,则此【决斗】对其造成的伤害+1。',
ol_sb_taishici:'OL谋太史慈',
ol_sb_taishici_prefix:'OL谋',
olsbdulie:'笃烈',
olsbdulie_info:'每回合限一次当你成为其他角色使用基本牌或普通锦囊牌的目标时你可以令此牌额外结算一次。若如此做此牌结算完毕后你摸X张牌X为你的攻击范围且至多为5。',
olsbdouchan:'斗缠',
olsbdouchan_info:'锁定技,准备阶段,你从牌堆中获得一张【决斗】,若牌堆没有【决斗】,则你的攻击范围和出牌阶段使用【杀】的次数上限+1增加次数不超过游戏人数。',
olsbweilin:'威临',
olsbweilin_info:'每回合限一次,你可以将一张牌当作任意【杀】或【酒】使用,且你以此法使用的牌指定最后一个目标后,你令所有目标角色本回合与此牌颜色相同的手牌均视为【杀】。',
olsbduoshou:'夺首',
olsbduoshou_info:'锁定技。①你每回合使用的第一张红色牌无距离限制。②你每回合使用的第一张基本牌不计入使用次数。③你每回合第一次造成伤害后,你摸一张牌。',
ol_gaoshun:'OL界高顺',
ol_gaoshun_prefix:'OL界',
olxianzhen:'陷阵',
olxianzhen_info:'出牌阶段限一次,你可以与一名角色拼点。若你赢,本回合你无视该角色的防具且对其使用牌没有次数和距离限制,且当你使用【杀】或普通锦囊牌指定其他角色为唯一目标时可以令该角色也成为此牌的目标;若你没赢,本回合你不能对其使用【杀】且你的【杀】不计入手牌上限。',
onlyOL_yijiang1:'OL专属·将1',
onlyOL_yijiang2:'OL专属·将2',

View File

@ -47,6 +47,7 @@ window.noname_character_rank={
'sb_machao',
'dc_zhouxuān',
'key_iriya',
'dc_zhaoyun',
],
ap:[
'xia_guanyu',
@ -125,7 +126,7 @@ window.noname_character_rank={
'db_key_liyingxia',
'key_kiyu',
'jsrg_pangtong',
'star_caoren',
'star_dongzhuo',
'clan_xunyou',
'caoxian',
'sb_guanyu',
@ -135,6 +136,8 @@ window.noname_character_rank={
'xia_yuzhenzi',
],
a:[
'star_caoren',
'star_yuanshao',
'xia_shitao',
'diy_zaozhirenjun',
'gjqt_fanglansheng',
@ -290,6 +293,7 @@ window.noname_character_rank={
're_nanhualaoxian',
'fuqian',
'liuyong',
'dc_liuli',
'sunhanhua',
're_pangdegong',
're_fengfangnv',
@ -364,6 +368,7 @@ window.noname_character_rank={
'shen_lusu',
],
am:[
'bailingyun',
'clan_wuqiao',
'muludawang',
'diy_caiwenji',
@ -658,12 +663,15 @@ window.noname_character_rank={
'dc_guansuo',
'dc_dongzhao',
'zhugeruoxue',
'zhugemengxue',
'dc_sb_lusu',
'mb_huban',
'jsrg_simayi',
'jsrg_zhaoyun',
'jsrg_zhangxuan',
'sb_xunyu',
'ol_sb_taishici',
'tianchou',
],
bp:[
'xin_huojun',
@ -954,6 +962,7 @@ window.noname_character_rank={
'ol_dianwei',
'wangyan',
'chengui',
'ol_hujinding',
'dc_huangquan',
'dc_huban',
'dingshangwan',
@ -1005,6 +1014,7 @@ window.noname_character_rank={
'tw_gongsunfan',
'yue_caiwenji',
'yue_xiaoqiao',
'yue_daqiao',
'vtb_xiaole',
'vtb_xiaojiu',
'ol_zhangzhang',
@ -1041,6 +1051,7 @@ window.noname_character_rank={
'jsrg_gaoxiang',
'jsrg_sunlubansunluyu',
'jsrg_weiwenzhugezhi',
'shen_xuzhu',
],
b:[
'ol_sb_guanyu',
@ -1363,6 +1374,7 @@ window.noname_character_rank={
'xia_shie',
],
bm:[
'kongrong',
'diy_xizhenxihong',
'ns_nanhua_left',
'ns_nanhua_right',
@ -1450,6 +1462,7 @@ window.noname_character_rank={
'ol_dengai',
're_wuguotai',
're_gaoshun',
'ol_gaoshun',
're_caozhi',
're_lingtong',
'xin_xusheng',
@ -1554,6 +1567,7 @@ window.noname_character_rank={
'jsrg_xugong',
'old_xiaoqiao',
'old_guanyu',
'dc_kongrong',
],
c:[
'xiahoudun',
@ -1662,6 +1676,12 @@ window.noname_character_rank={
],
rarity:{
legend:[
'star_caoren',
'dc_zhaoyun',
'dc_caocao',
'dc_liubei',
'dc_sunquan',
'dc_sunce',
'xia_yuzhenzi',
'xia_guanyu',
'swd_muyun',
@ -1849,7 +1869,10 @@ window.noname_character_rank={
'caoxian',
],
epic:[
'tianchou',
'star_yuanshao',
'yue_xiaoqiao',
'yue_daqiao',
'mb_chengui',
'ol_pengyang',
'ol_luyusheng',
@ -2111,7 +2134,7 @@ window.noname_character_rank={
'key_kotomi',
'db_key_liyingxia',
'key_iriya',
'star_caoren',
'star_dongzhuo',
'star_yuanshu',
'clan_xunyou',
'lvboshe',
@ -2120,8 +2143,11 @@ window.noname_character_rank={
'ol_sb_jiangwei',
'dc_sb_zhouyu',
'xia_shitao',
'bailingyun',
],
rare:[
'zhugemengxue',
'ol_sb_taishici',
'clan_wuqiao',
'xin_huojun',
'muludawang',
@ -2452,6 +2478,7 @@ window.noname_character_rank={
'yangzhi',
'zuofen',
'liuyong',
'dc_liuli',
'zhangning',
'wanniangongzhu',
're_xunchen',
@ -2528,6 +2555,7 @@ window.noname_character_rank={
'dukui',
'ol_dianwei',
'chengui',
'ol_hujinding',
'dingshangwan',
're_zhuhuan',
'xin_zhuhuan',

View File

@ -4059,23 +4059,34 @@ game.import('character',function(lib,game,ui,get,ai,_status){
decadejinjiu:{
global:'decadejinjiu_global',
mod:{
cardname:function(card){
cardname(card){
if(card.name=='jiu') return 'sha';
},
cardnumber:function(card){
cardnumber(card){
if(card.name=='jiu') return 13;
},
},
audio:2,
audioname2:{
ol_gaoshun:'rejinjiu',
},
trigger:{player:['useCard1','respond']},
filter(event,player){
return event.card.name=='sha'&&!event.skill&&event.cards&&event.cards.length==1&&event.cards[0].name=='jiu';
},
forced:true,
firstDo:true,
content(){},
subSkill:{
global:{
mod:{
cardEnabled:function(card,player){
cardEnabled(card,player){
if(card.name=='jiu'){
var source=_status.currentPhase;
if(source&&source!=player&&source.hasSkill('decadejinjiu')) return false;
}
},
cardSavable:function(card,player){
cardSavable(card,player){
if(card.name=='jiu'){
var source=_status.currentPhase;
if(source&&source!=player&&source.hasSkill('decadejinjiu')) return false;
@ -11142,7 +11153,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(!target.isHealthy()) club+=2;
if(!club&&!spade) return 1;
if(name==='sha'){
if(!target.mayHaveShan(player,'use',target.getCards(i=>{
if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))) return;
}

View File

@ -54,6 +54,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sb_tong:['liucheng','sp_yangwan','sb_xiahoushi','sb_zhangfei','sb_zhaoyun','sb_sunce','sb_zhurong','sb_xiaoqiao'],
sb_yu:['sb_yujin','sb_lvmeng','sb_huangzhong','sb_huanggai','sb_zhouyu','sb_caoren','sb_ganning','sb_yl_luzhi','sb_huangyueying'],
sb_neng:['sb_huaxiong','sb_sunshangxiang','sb_jiangwei','sb_yuanshao','sb_menghuo','sb_guanyu'],
sb_waitforsort:['sb_xunyu'],
}
},
skill:{
@ -66,7 +67,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return game.countPlayer(current=>lib.skill.sbquhu.filterTarget(null,player,current))>1;
},
filterTarget(card,player,target){
return player!=target&&target.countCards('he');
return player!=target&&target.countCards('he')>0;
},
selectTarget:2,
multitarget:true,
@ -360,7 +361,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
direct:true,
async content(event,trigger,player){
let num=Math.max(1,player.getDamagedHp());
const {result:{bool,targets}}=await player.chooseTarget(get.prompt('sbjieming'),`令一名角色摸三张牌,然后其可以弃置任意张牌。若其弃置的牌数${get.cnNumber(num)}你失去1点体力。`).set('ai',target=>{
const {result:{bool,targets}}=await player.chooseTarget(get.prompt('sbjieming'),`令一名角色摸三张牌,然后其可以弃置任意张牌。若其弃置的牌数不大${get.cnNumber(num)}你失去1点体力。`).set('ai',target=>{
if(get.event('nope')) return 0;
const player=get.player(),att=get.attitude(player,target);
if(att>2){
@ -368,18 +369,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return num*att;
}
return att/3;
}).set('nope',(player.getHp()+player.countCards('hs',card=>player.canSaveCard(card,player))<=1)&&num>3);
}).set('nope',(player.getHp()+player.countCards('hs',card=>player.canSaveCard(card,player))<=1)&&num>2);
if(!bool) return;
const target=targets[0];
player.logSkill('sbjieming',target);
await target.draw(3);
num=Math.max(1,player.getDamagedHp());
const {result:{bool:bool2,cards}}=await target.chooseToDiscard('节命:是否弃置任意张牌?',`若你本次弃置的牌数${get.cnNumber(num)}张,${get.translation(player)}失去1点体力。`,[1,Infinity]).set('ai',card=>{
const {result:{bool:bool2,cards}}=await target.chooseToDiscard('节命:是否弃置任意张牌?',`若你本次弃置的牌数不大${get.cnNumber(num)}张,${get.translation(player)}失去1点体力。`,[1,Infinity],'he').set('ai',card=>{
if(get.event('nope')) return 0;
if(ui.selected.cards.length>=get.event('num')) return 0;
return 5.5-get.value(card);
if(ui.selected.cards.length>get.event('num')) return 0;
return 6-get.value(card);
}).set('nope',get.attitude(target,player)*get.effect(player,{name:'losehp'},player,target)>=0).set('num',num);
if(!bool2||cards.length<num) player.loseHp();
if(!bool2||cards.length<=num) player.loseHp();
},
ai:{
maixie:true,
@ -391,19 +392,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(!target.hasFriend()) return;
let max=0;
const num=Math.max(1,player.getDamagedHp());
if(num>3) return 2;
if(num>2) return [1,-2];
const players=game.filterPlayer();
for(const current of players){
if(get.attitude(target,current)>0){
max=Math.max(current.countCards('he'),max);
}
}
switch(max){
case 0:return 2;
case 1:return 1.5;
case 2:return [1,2];
default:return [0,max];
}
return [1,Math.max(1,1+Math.min(2,max/3))];
}
if((card.name=='tao'||card.name=='caoyao')&&
target.hp>1&&target.countCards('h')<=target.hp) return [0,0];
@ -810,7 +806,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
direct:true,
content:function*(event,map){
var player=map.player;
var result=yield player.chooseTarget(get.prompt('sbwusheng'),'选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸一张牌,对其使用'+(get.mode()==='identity'?'五':'三')+'张【杀】后不能对其使用【杀】',(card,player,target)=>{
var result=yield player.chooseTarget(get.prompt('sbwusheng'),'选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸'+(get.mode()==='identity'?'两':'一')+'张牌,对其使用三张【杀】后不能对其使用【杀】',(card,player,target)=>{
return target!=player&&!target.isZhu2();
}).set('ai',target=>{
var player=_status.event.player;
@ -913,7 +909,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
playerEnabled:function(card,player,target){
if(card.name!='sha'||typeof player.storage.sbwusheng_effect[target.playerid]!='number') return;
if(player.storage.sbwusheng_effect[target.playerid]>=(get.mode()==='identity'?5:3)) return false;
if(player.storage.sbwusheng_effect[target.playerid]>=3) return false;
},
},
audio:'sbwusheng',
@ -931,7 +927,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
else{
player.logSkill('sbwusheng_effect',trigger.target);
player.draw();
player.draw(get.mode()==='identity'?2:1);
}
},
},
@ -959,7 +955,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
charlotte:true,
onremove:true,
audio:'sbyijue',
trigger:{player:'useCardToPlayered'},
trigger:{player:'useCardToPlayer'},
filter:function(event,player){
return player.getStorage('sbyijue_effect').includes(event.target);
},
@ -1396,7 +1392,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
replace:{
button:function(button){
const event=get.event();
const event=get.event(),sum=event.sum;
if(!event.isMine()) return;
if(button.classList.contains('selectable')==false) return;
if(ui.selected.buttons.length>=sum) return false;
@ -1418,7 +1414,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
game.check();
},
}
});
}).set('sum',sum)
if(result.bool){
var names=result.links.map(link=>link[2]);
storage[0]-=names.length;
@ -6715,9 +6711,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sbwusheng:'武圣',
sbwusheng_wusheng_backup:'武圣',
sbwusheng_info:'你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸一张牌,对其使用三张【杀】后不能对其使用【杀】。',
sbwusheng_info_identity:'你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸一张牌,对其使用五张【杀】后不能对其使用【杀】。',
sbwusheng_info_identity:'你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸两张牌,对其使用三张【杀】后不能对其使用【杀】。',
sbyijue:'义绝',
sbyijue_info:'锁定技,每名角色每局游戏限一次,当你对一名角色造成大于等于其体力值的伤害时,你防止此伤害,且本回合你使用牌指定其为目标后,取消之。',
sbyijue_info:'锁定技,每名角色每局游戏限一次,当你对一名角色造成大于等于其体力值的伤害时,你防止此伤害,且本回合你使用牌指定其为目标时,此牌对其无效。',
sb_caopi:'谋曹丕',
sb_caopi_prefix:'谋',
sbxingshang:'行殇',
@ -6731,13 +6727,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sbquhu:'驱虎',
sbquhu_info:'出牌阶段限一次。你可以选择两名有牌的其他角色你与这些角色同时将任意张牌扣置于武将牌上。若你以此法扣置的牌唯一最少则扣置牌最多的其他角色获得你扣置的牌且这些角色获得各自扣置的牌否则这两名角色中扣置牌较多的角色对较少的角色造成1点伤害获得你扣置的牌然后这些角色将各自扣置的牌置入弃牌堆若这两名角色扣置的牌数相同视为与你逆时针最近座次的角色扣置牌较多。',
sbjieming:'节命',
sbjieming_info:'当你受到伤害后,你可以令一名角色摸三张牌,然后其可以弃置任意张牌。若其弃置的牌数于X你失去1点体力X为你已损失的体力值至少为1。',
sbjieming_info:'当你受到伤害后,你可以令一名角色摸三张牌,然后其可以弃置任意张牌。若其弃置的牌数不大于X你失去1点体力X为你已损失的体力值至少为1。',
sb_zhi:'谋攻篇·知',
sb_shi:'谋攻篇·识',
sb_tong:'谋攻篇·同',
sb_yu:'谋攻篇·虞',
sb_neng:'谋攻篇·能',
sb_waitforsort:'等待分包',
},
};
});

View File

@ -3676,7 +3676,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ai:{
effect:{
target:function(card,player,target,current){
if(typeof card==='object'&&get.name(card)==='sha'&&target.mayHaveShan(player,'use',target.getCards(i=>{
if(typeof card==='object'&&get.name(card)==='sha'&&target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))) return [0.6,0.75];
if(!target.hasFriend()&&!player.hasUnknown()) return;
@ -6221,7 +6221,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(!target.isHealthy()) club+=2;
if(!club&&!spade) return 1;
if(card.name==='sha'){
if(!target.mayHaveShan(player,'use',target.getCards(i=>{
if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))) return;
}
@ -7209,7 +7209,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return get.attitude(target,current)<0&&get.damageEffect(current,target,target,'thunder')>0;
})){
if(card.name==='sha'){
if(!target.mayHaveShan(player,'use',target.getCards(i=>{
if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))) return;
}
@ -7726,22 +7726,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){
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'],
taishici:['taishici','re_taishici','ol_sb_taishici'],
re_yuanshao:['re_yuanshao','ol_yuanshao','xin_yuanshao','sb_yuanshao'],
pangde:['re_pangde','ol_pangde','pangde'],
yanwen:['yanwen','ol_yanwen','re_yanwen'],
caopi:['caopi','re_caopi','ps_caopi','sb_caopi'],
xuhuang:['re_xuhuang','ol_xuhuang','sb_xuhuang','xuhuang'],
menghuo:['menghuo','re_menghuo','sb_menghuo'],
menghuo:['menghuo','re_menghuo','sb_menghuo','tw_menghuo'],
zhurong:['zhurong','ol_zhurong','re_zhurong','sb_zhurong'],
sunjian:['sunjian','ol_sunjian','re_sunjian'],
jiaxu:['jiaxu','re_jiaxu','ns_jiaxu','ps_jiaxu'],
dongzhuo:['dongzhuo','ol_dongzhuo','re_dongzhuo','sp_dongzhuo','yj_dongzhuo'],
dengai:['dengai','ol_dengai','re_dengai'],
sp_ol_zhanghe:['sp_ol_zhanghe','yj_zhanghe','sp_zhanghe','jsrg_zhanghe'],
jiangwei:['jiangwei','ol_jiangwei','re_jiangwei','sb_jiangwei','jsrg_jiangwei'],
jiangwei:['jiangwei','ol_jiangwei','re_jiangwei','ol_sb_jiangwei','sb_jiangwei','jsrg_jiangwei'],
liushan:['liushan','ol_liushan','re_liushan'],
sunce:['sunce','re_sunce','re_sunben','sb_sunce'],
sunce:['sunce','re_sunce','re_sunben','sb_sunce','dc_sunce'],
zhangzhang:['zhangzhang','ol_zhangzhang','re_zhangzhang'],
zuoci:['zuoci','re_zuoci'],
caiwenji:['caiwenji','ol_caiwenji','re_caiwenji'],

View File

@ -6532,7 +6532,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
qiaogong:['qiaogong','tw_qiaogong'],
sp_chendong:['sp_chendong','tw_chendong','chendong'],
sp_jiangqing:['sp_jiangqing','tw_jiangqing','jiangqing'],
kongrong:['sp_kongrong','jsrg_kongrong','kongrong'],
kongrong:['dc_kongrong','sp_kongrong','jsrg_kongrong','kongrong'],
dc_mifuren:['dc_mifuren','sp_mifuren'],
},
translate:{
@ -6560,6 +6560,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_wangcan_prefix:'手杀',
sp_sunshao_prefix:'手杀',
sp_xunchen_prefix:'手杀',
sp_kongrong_prefix:'手杀',
sp_wangcan:'手杀王粲',
spqiai:'七哀',
@ -6688,7 +6689,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
rechuhai_info:'使命技。①出牌阶段限一次,你可以摸一张牌,然后和一名其他角色拼点。若你赢,则你观看其手牌,并从牌堆/弃牌堆中获得其手牌中包含的类型的牌各一张,且当你于此阶段内对其造成伤害后,你将牌堆/弃牌堆中的一张装备牌置于你的一个空置装备栏内。②当你因发动〖除害①〗而展示拼点牌时,你令此牌的点数+XX=(4-你装备区的牌数)。③使命当有装备牌进入你的装备区后若你的装备区内有至少三张牌则你将体力值回复至上限失去〖乡害〗并获得〖彰名〗。④失败当你因发动〖除害①〗发起的拼点没赢时若你的最终点数不大于6则你触发使命失败分支。',
zhangming:'彰名',
zhangming_info:'锁定技。①你使用的♣牌不能被其他角色响应。②每回合限一次,当你对其他角色造成伤害后,你随机弃置其一张手牌,然后你从牌堆或弃牌堆中获得与其展示牌类型不同类型的牌各一张(若其没有手牌,则你改为从牌堆或弃牌堆中获得所有类型牌各一张),且以此法得到的牌不计入本回合的手牌上限。',
sp_kongrong:'孔融',
sp_kongrong:'手杀孔融',
spmingshi:'名士',
spmingshi_info:'锁定技当你受到1点伤害后伤害来源弃置一张牌。',
splirang:'礼让',

View File

@ -7,7 +7,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp:{
sp_tianji:["sunhao","liuxie","caoang","hetaihou","sunluyu",'ol_wangrong',"zuofen","ol_bianfuren","qinghegongzhu","tengfanglan","ruiji",'caoxiancaohua'],
sp_sibi:["yangxiu","chenlin","chengyu","shixie","fuwan","wangyun","zhugejin","simalang","maliang","buzhi","dongyun","kanze","sunqian","xizhicai","sunshao",'duxi',"jianggan",'ol_dengzhi','ol_yangyi','ol_dongzhao','ol_chendeng','jin_yanghu','wangyan','xiahouxuan','quhuang','zhanghua','wangguan','sunhong','caoxi'],
sp_tianzhu:['zhangyan','niujin','hejin','hansui',"wutugu","yanbaihu","shamoke","zhugedan",'huangzu','gaogan',"tadun","fanjiangzhangda","ahuinan","dongtuna",'ol_wenqin'],
sp_tianzhu:['liyi','zhangyan','niujin','hejin','hansui',"wutugu","yanbaihu","shamoke","zhugedan",'huangzu','gaogan',"tadun","fanjiangzhangda","ahuinan","dongtuna",'ol_wenqin'],
sp_nvshi:['ol_dingshangwan',"lingju","guanyinping","zhangxingcai","mayunlu","dongbai","zhaoxiang",'ol_zhangchangpu',"daxiaoqiao","jin_guohuai"],
sp_shaowei:["simahui","zhangbao","zhanglu","zhugeguo","xujing","zhangling",'huangchengyan','zhangzhi','lushi'],
sp_huben:['duanjiong','ol_mengda',"caohong","xiahouba","zhugeke","zumao","wenpin","litong","mazhong","heqi","quyi","luzhi","zangba","yuejin","dingfeng","wuyan","ol_zhuling","tianyu","huojun",'zhaoyǎn','dengzhong','ol_furong','macheng','ol_zhangyì','ol_zhujun','maxiumatie','luoxian','ol_huban','haopu','ol_qianzhao'],
@ -18,7 +18,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_zhongdan:["cuiyan","huangfusong"],
sp_guozhan2:["sp_dongzhuo","liqueguosi","zhangren"],
sp_others:["hanba","caiyang"],
sp_waitforsort:['ol_luyusheng','ol_pengyang','ol_tw_zhangji','ol_liwan','ol_liuyan','caoyu','liyi'],
sp_waitforsort:['ol_luyusheng','ol_pengyang','ol_tw_zhangji','ol_liwan','ol_liuyan','caoyu','tianchou','ol_hujinding'],
},
},
characterFilter:{
@ -30,6 +30,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
character:{
ol_hujinding:['female','shu',3,['olqingyuan','olchongshen']],
tianchou:['male','qun',4,['olshandao']],
liyi:['male','wu',4,['olchanshuang','olzhanjin']],
caoyu:['male','wei',3,['olgongjie','olxiangxv','olxiangzuo']],
ol_liwan:['female','wei',3,['ollianju','olsilv']],
@ -43,7 +45,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ol_pengyang:['male','shu',3,['olqifan','oltuishi','nzry_cunmu']],
ol_qianzhao:['male','wei',4,['olweifu','olkuansai']],
niujin:['male','wei',4,['olcuorui','liewei']],
hejin:['male','qun',4,['olmouzhu','olyanhuo']],
hejin:['male','qun',4,['mouzhu','olyanhuo']],
hansui:['male','qun',4,['olniluan','olxiaoxi']],
duanjiong:['male','qun',4,['olsaogu']],
ol_zhouqun:['male','shu',4,['oltianhou','olchenshuo']],
@ -203,6 +205,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
luzhi:['male','wei',3,['qingzhong','weijing']]
},
characterIntro:{
tianchou:'田畴169年或170年-214年或216年字子泰东汉右北平郡无终人东汉末年隐士。田畴好文习武。汉初平年间其受刘虞派遣去长安呈送指控公孙赞奏章献帝大悦封为骑都尉田畴不受。携诏返回时刘虞已被公孙所杀田畴到刘墓祭拜被公孙所提不久释放。田畴回故乡后率家族及随从数百人隐居徐无山致力农桑数年间增至5000家。制定法条兴建学校一时民风良好乌桓、鲜卑纷纷与其结交。汉建安二十年207年曹操北征乌桓田畴请为向导。上徐无山、出卢龙、过平冈、登白狼堆、至柳城曹军大胜封田畴为亭侯坚辞不受。曹念田功四次封赏终不受乃拜为议郎。建安二十一年216年田畴去世。',
liyi:'李异生卒年不详三国时期东吴将领。建安末与谢旌率水陆三千击破刘备军将领詹晏、陈凤。刘备领兵攻孙权时李异与陆逊等人屯巫、秭归为蜀将所破。黄武元年222年陆逊破刘备于猇亭李异追踪蜀军屯驻南山。清代学者赵一清认为此李异与刘璋部将李异为同一人。',
caoyu:'曹宇278年字彭祖沛国谯县今安徽亳州人。三国时期魏国宗室魏武帝曹操与环夫人之子邓哀王曹冲同母兄弟。太和六年封为燕王。魏明帝病危欲以大将军辅政不果。其子常道乡公曹奂是魏国末代皇帝史称魏元帝。晋朝建立后降封燕公。咸宁四年278年曹宇去世。',
zhangyan:'张燕,本姓褚,生卒年不详,常山真定(今河北正定南)人,东汉末年黑山军首领。张燕剽捍,敏捷过人,军中称为“飞燕”。官渡之战时投降曹操,被任命为平北将军,封安国亭侯。死后其子张方袭爵。',
@ -707,6 +710,190 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
skill:{
//胡金定
olqingyuan:{
audio:2,
trigger:{
global:['phaseBefore','gainAfter','loseAsyncAfter'],
player:['enterGame','damageEnd'],
},
filter(event,player){
const storage=player.getStorage('olqingyuan');
if(event.name=='gain'||event.name=='loseAsync'){
if(player.hasSkill('olqingyuan_used')) return false;
return storage.some(target=>event.getg(target).length)&&storage.some(target=>target.hasCard(card=>lib.filter.canBeGained(card,target,player),'he'));
}
if(!game.hasPlayer(target=>!storage.includes(target)&&target!=player)) return false;
if(event.name=='damage'&&player.getAllHistory('damage').indexOf(event)!=0) return false;
return event.name!='phase'||game.phaseNumber==0;
},
forced:true,
async content(event,trigger,player){
if(trigger.name=='gain'||trigger.name=='loseAsync'){
const target=player.getStorage('olqingyuan').filter(target=>target.hasCard(card=>lib.filter.canBeGained(card,target,player),'he')).randomGet();
player.line(target);
player.addTempSkill('olqingyuan_used');
player.gain(target.getCards('he',card=>{
return lib.filter.canBeGained(card,target,player);
}).randomGet(),target,'giveAuto');
}
else{
const {result:{bool,targets}}=await player.chooseTarget((card,player,target)=>{
return target!=player&&!player.getStorage('olqingyuan').includes(target);
},true).set('prompt2','每回合限一次,当你以此法选择的角色获得牌后,你随机获得其中一名角色的一张牌')
.set('prompt','请选择【轻缘】的目标').set('ai',target=>{
const player=get.event('player');
return get.effect(target,new lib.element.VCard({name:'shunshou_copy2'}),player,player);
});
if(bool){
const target=targets[0];
player.line(target);
game.log(player,'选择了',target);
player.markAuto('olqingyuan',[target]);
}
}
},
subSkill:{used:{charlotte:true}},
intro:{content:'已选择$为目标'},
ai:{
expose:0.3,
},
},
olchongshen:{
audio:2,
locked:false,
enable:'chooseToUse',
filterCard(card){
return get.itemtype(card)=='card'&&card.hasGaintag('olchongshen');
},
position:'h',
viewAs:{name:'shan'},
viewAsFilter(player){
if(!player.countCards('h',card=>card.hasGaintag('olchongshen'))) return false;
},
prompt:'将本轮得到的牌当作【闪】使用',
check(card){
return 7-get.value(card);
},
ai:{
order:2,
respondShan:true,
skillTagFilter(player,tag,arg){
if(arg=='respond'||!player.countCards('h',card=>card.hasGaintag('olchongshen'))) return false;
},
effect:{
target(card,player,target,current){
if(get.tag(card,'respondShan')&&current<0) return 0.6;
},
},
},
group:'olchongshen_mark',
mod:{
aiValue(player,card,num){
if(get.name(card)!='shan'&&!card.hasGaintag('olchongshen')) return;
var cards=player.getCards('hs',card=>get.name(card)=='shan'||card.hasGaintag('olchongshen'));
cards.sort((a,b)=>(get.name(b)=='shan'?1:2)-(get.name(a)=='shan'?1:2));
const geti=()=>{
if(cards.includes(card)) return cards.indexOf(card);
return cards.length;
};
if(get.name(card)=='shan') return Math.min(num,[6,4,3][Math.min(geti(),2)])*0.6;
return Math.max(num,[6.5,4,3][Math.min(geti(),2)]);
},
aiUseful(){
return lib.skill.olchongshen.mod.aiValue.apply(this,arguments);
},
ignoredHandcard(card,player){
if(card.hasGaintag('olchongshen')) return true;
},
cardDiscardable(card,player,name){
if(name=='phaseDiscard'&&card.hasGaintag('olchongshen')) return false;
},
},
init(player){
if(game.phaseNumber>0){
const hs=player.getCards('h'),history=player.getAllHistory();
let cards=[];
for(let i=history.length-1;i>=0;i--){
for(const evt of history[i].gain){
cards.addArray(evt.cards);
}
if(history[i].isRound) break;
}
cards=cards.filter(i=>hs.includes(i));
if(cards.length) player.addGaintag(cards,'olchongshen');
}
},
onremove(player){
player.removeGaintag('olchongshen');
},
subSkill:{
mark:{
charlotte:true,
trigger:{player:'gainBegin',global:'roundStart'},
filter(event,player){
return event.name=='gain'||game.roundNumber>1;
},
forced:true,
popup:false,
content(){
if(trigger.name=='gain') trigger.gaintag.add('olchongshen');
else player.removeGaintag('olchongshen');
},
},
},
},
//田畴
olshandao:{
audio:2,
enable:'phaseUse',
filter(event,player){
return game.hasPlayer(target=>lib.skill.olshandao.filterTarget(null,player,target));
},
filterTarget(card,player,target){
return target.countCards('he');
},
usable:1,
selectTarget:[1,Infinity],
multitarget:true,
multiline:true,
async content(event,trigger,player){
const wugu=new lib.element.VCard({name:'wugu'});
const wanjian=new lib.element.VCard({name:'wanjian'});
const targets=game.filterPlayer(target=>{
if(target==player) return false;
return !event.targets.includes(target)&&player.canUse(wanjian,target,false);
}),targetx=event.targets.sortBySeat();
let dialog=['将这些角色的各一张牌置于牌堆顶,然后视为对这些角色使用【五谷丰登】'];
for(const target of targetx){
const name=(target==player?'你':get.translation(target));
if(target.countCards('h')){
dialog.add('<div class="text center">'+name+'的手牌区</div>');
if(player.hasSkillTag('viewHandcard',null,target,true)||player==target) dialog.push(target.getCards('h'));
else dialog.push([target.getCards('h'),'blank']);
}
if(target.countCards('e')) dialog.addArray(['<div class="text center">'+name+'的装备区</div>',target.getCards('e')]);
}
const {result:{bool,links}}=await player.chooseButton(dialog,event.targets.length,true).set('filterButton',button=>{
return !ui.selected.buttons.some(but=>get.owner(but.link)==get.owner(button.link));
}).set('ai',button=>1/(get.value(button.link,get.owner(button.link))||0.5));
if(bool){
const cards=links.sort((a,b)=>targetx.indexOf(get.owner(a))-targetx.indexOf(get.owner(b)));
for(const card of cards){
const target=get.owner(card);
target.$throw(1,1000);
await target.lose([card],ui.cardPile,'insert');
}
const targety=targetx.filter(target=>player.canUse(wugu,target,false));
if(targety.length) await player.useCard(wugu,targety,false);
if(targets.length) await player.useCard(wanjian,targets,false);
}
},
ai:{
order:9,
result:{target:1},
},
},
//李异
olchanshuang:{
audio:2,
@ -2577,7 +2764,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(event.list.includes(target.countCards('h'))) event.goto(2);
},
ai:{
combo:'olguangshu',
combo:'olgangshu',
maixie:true,
},
},
@ -2897,7 +3084,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
global:'useCardToPlayered',
},
filter:function(event,player){
return event.isFirstTarget&&event.targets.length>player.getHp();
return event.isFirstTarget&&event.targets.length>=player.getHp();
},
direct:true,
usable:1,
@ -5479,7 +5666,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(!player.hasSkillTag('directHit_ai',true,{
target:target,
card:card,
},true)) odds-=0.7*target.mayHaveShan(player,'use',target.getCards(i=>{
},true)) odds-=0.7*target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}),'odds');
_status.event.putTempCache('sha_result','eff',{
@ -6875,8 +7062,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
else{
event.cancel();
event.getParent().set('olbixin',true);
// event.getParent().set('olbixin',true);
event.getParent().goto(0);
delete event.getParent().openskilldialog;
}
},
}
@ -7275,7 +7463,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
else{
var target=trigger.target;
if(trigger.targets.length>1||target.mayHaveShan(player,'use',target.getCards(i=>{
if(trigger.targets.length>1||target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))) return 0;
}
@ -10770,6 +10958,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 2'
if(result.bool){
target.line(player);
if(player!==target&&(get.mode()!=='identity'||target.identity!=='nei')) target.addExpose(0.15);
player.draw();
}
if(num<targets.length) event.goto(1);
@ -10784,6 +10973,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(result.bool){
var target=result.targets[0];
player.line(target,'green');
if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.15);
target.damage();
}
else event.finish();
@ -10798,6 +10988,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(result.bool){
var target=result.targets[0];
player.line(target);
if(player!==target&&(get.mode()!=='identity'||player.identity!=='nei')) player.addExpose(0.1);
target.draw();
}
},
@ -13582,7 +13773,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
direct:true,
filter:function(event,player){
return player!=event.player&&!event.player.isDisabledJudge()&&event.player.countCards('he')&&!event.player.countCards('j',{type:'delay'});
return player!=event.player&&!event.player.isDisabledJudge()&&event.player.countCards('he')&&!event.player.countCards('j',card=>get.type(card.viewAs||card.name)=='delay');
},
content:function(){
'step 0'
@ -14777,7 +14968,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
else if(get.tag(card,'respondShan')>0){
if(current<0&&used==target.getAttackRange()-1){
if(card.name==='sha'){
if(!target.mayHaveShan(player,'use',target.getCards(i=>{
if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))) return;
}
@ -22709,6 +22900,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audioname:['liushan']
},
shoucheng:{
init(player){
game.addGlobalSkill('shoucheng_draw',player);
},
trigger:{
global:['equipAfter','addJudgeAfter','loseAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'],
},
@ -22740,6 +22934,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
"step 2"
if(result.bool){
player.logSkill(event.name,target);
if(player!==target&&(get.mode()!=='identity'||player.identity!=='nei')) player.addExpose(0.15);
target.draw();
}
"step 3"
@ -22747,8 +22942,28 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
ai:{
threaten:1.3,
expose:0.2,
noh:true,
},
subSkill:{
draw:{
trigger:{player:'dieAfter'},
filter(event,player){
return !game.hasPlayer(current=>{
return current.hasSkill('shoucheng');
},true);
},
content(){
game.removeGlobalSkill('shoucheng_draw');
},
ai:{
noh:true,
skillTagFilter(player,tag,arg){
if(player===_status.currentPhase||player.countCards('h')!==1) return false;
return game.hasPlayer(current=>{
return current.hasSkill('shoucheng')&&player.isFriendOf(current);
});
}
}
}
}
},
hengzheng:{
@ -22979,36 +23194,28 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
trigger:{global:'phaseJieshuBegin'},
filter:function(event,player){
return event.player.isIn()&&event.player!=player&&player.countCards('h',function(card){
if(_status.connectMode) return true;
return get.type(card)=='basic';
});
return event.player.isIn()&&event.player!=player&&player.countCards('h');
},
direct:true,
content:function(){
"step 0"
var nono=(Math.abs(get.attitude(player,trigger.player))<3);
if(get.damageEffect(trigger.player,player,player)<=0){
nono=true;
}
var next=player.chooseToDiscard(get.prompt('xiaoguo',trigger.player),{type:'basic'});
var next=player.chooseToDiscard(get.prompt('xiaoguo',trigger.player));
next.set('ai',function(card){
if(_status.event.nono) return 0;
return 8-get.useful(card);
return _status.event.eff-get.useful(card);
});
next.set('logSkill',['xiaoguo',trigger.player]);
next.set('nono',nono);
next.set('eff',function(){
if(trigger.player.hasSkillTag('noe')) return get.attitude(_status.event.player,trigger.player);
return get.damageEffect(trigger.player,player,_status.event.player);
}());
"step 1"
if(result.bool){
var nono=(get.damageEffect(trigger.player,player,trigger.player)>=0);
if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.15);
trigger.player.chooseToDiscard('he','弃置一张装备牌并令'+get.translation(player)+'摸一张牌或受到1点伤害',{type:'equip'}).set('ai',function(card){
if(_status.event.nono){
return 0;
}
if(_status.event.player.hp==1) return 10-get.value(card);
return 9-get.value(card);
}).set('nono',nono);
if(_status.event.damage>0) return 0;
if(_status.event.noe) return 12-get.value(card);
return 2*_status.event.damage-get.value(card);
}).set('damage',get.damageEffect(trigger.player,player,trigger.player)).set('noe',trigger.player.hasSkillTag('noe'));
}
else{
event.finish();
@ -24760,12 +24967,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player:'enterGame',
},
filter:function(event,player){
if(player.countMark('xinfu_xionghuo')>=3) return false;
return event.name!='phase'||game.phaseNumber==0;
},
forced:true,
locked:false,
content:function(){
player.addMark('xinfu_xionghuo',3);
player.addMark('xinfu_xionghuo',3-player.countMark('xinfu_xionghuo'));
},
},
damage:{
@ -24853,13 +25061,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
trigger:{global:'dying'},
filter:function(event,player){
return event.player!=player;
if(event.player==player) return false;
const bool1=(!player.hasSkill('xinfu_xionghuo')||player.countMark('xinfu_xionghuo')<3);
const bool2=(event.player.hp<0&&get.itemtype(event.parent.cards)=='cards'&&event.parent.cards.some(card=>get.position(card,true)=='o'));
return bool1||bool2;
},
forced:true,
content:function(){
if(player.countMark('xinfu_xionghuo')<3) player.addMark('xinfu_xionghuo',1);
if(trigger.player.hp<0&&get.itemtype(trigger.parent.cards)=='cards'&&get.position(trigger.parent.cards[0],true)=='o'){
player.gain(trigger.parent.cards,'gain2');
if(!player.hasSkill('xinfu_xionghuo')||player.countMark('xinfu_xionghuo')<3) player.addMark('xinfu_xionghuo',1);
if(trigger.player.hp<0&&get.itemtype(trigger.parent.cards)=='cards'&&trigger.parent.cards.some(card=>get.position(card,true)=='o')){
player.gain(trigger.parent.cards.filter(card=>get.position(card,true)=='o'),'gain2');
}
},
},
@ -25135,19 +25346,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
skill.removeMark('lianhuan',source,player,true);
});
},
ai:{
order:1,
fireAttack:true,
result:{
//等PZ157来写
/*target:function(player,target){
if(target.hasSkillTag('nofire')) return 0;
if(lib.config.mode=='versus') return -1;
if(player.hasUnknown()) return 0;
return get.damageEffect(target,player);
}*/
}
}
},
},
},
@ -25805,7 +26003,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
huangchengyan:['huangchengyan','dc_huangchengyan'],
puyuan:['ol_puyuan','puyuan'],
huangzu:['huangzu','dc_huangzu'],
huojun:['huojun','dc_huojun','tw_huojun'],
huojun:['huojun','dc_huojun','xin_huojun','tw_huojun'],
zhaoyǎn:['zhaoyǎn','dc_zhaoyǎn'],
furong:['ol_furong','furong','tw_furong'],
daxiaoqiao:['daxiaoqiao','dc_daxiaoqiao','tw_daxiaoqiao'],
@ -26495,7 +26693,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
guixiu_info:'当你成为【杀】的目标后,若你的手牌数小于体力值,则你可以摸一张牌。',
fenming_info:'结束阶段开始时,若你处于横置状态,你可以弃置所有处于横置状态的角色的各一张牌。',
duanxie_info:'出牌阶段限一次你可以令至多X名其他角色横置X为你已损失的体力值且至少为1然后你横置。',
xiaoguo_info:'其他角色的结束阶段开始时,你可以弃置一张基本令该角色选择一项1.弃置一张装备牌然后你摸一张牌2.受到你对其造成的1点伤害。',
xiaoguo_info:'其他角色的结束阶段开始时,你可以弃置一张令该角色选择一项1.弃置一张装备牌然后你摸一张牌2.受到你对其造成的1点伤害。',
sijian_info:'当你失去最后的手牌时,你可以弃置一名其他角色的一张牌。',
suishi_info:'当其他角色进入濒死状态时伤害来源可以令你摸一张牌当其他角色死亡时伤害来源可以令你失去1点体力。',
quji_info:'出牌阶段限一次你可以弃置X张牌X为你已损失的体力值然后令至多X名已受伤的角色各回复1点体力。若你以此法弃置的牌中有黑色牌你失去1点体力。',
@ -26975,7 +27173,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
olweifu:'威抚',
olweifu_info:'出牌阶段,你可以弃置一张牌并判定。你本回合下次使用与结果类型相同的牌无距离限制,且可以额外指定一个目标。若你弃置的牌与判定牌类型相同,你摸一张牌。',
olkuansai:'款塞',
olkuansai_info:'每回合限一次,当一张牌指定第一个目标后,若目标数于你的体力值你可以令其中一个目标选择一项1.交给你一张牌2.令你回复1点体力。',
olkuansai_info:'每回合限一次,当一张牌指定第一个目标后,若目标数不小于你的体力值你可以令其中一个目标选择一项1.交给你一张牌2.令你回复1点体力。',
ol_luyusheng:'OL陆郁生',
ol_luyusheng_prefix:'OL',
olcangxin:'藏心',
@ -27045,8 +27243,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){
olchanshuang:'缠双',
olchanshuang_info:'①出牌阶段限一次你可以选择一名其他角色。你与其依次选择〖缠双③〗的一项然后你与其依次执行各自选择的项。②结束阶段若X大于0你执行〖缠双③〗的前X项X为你本回合以任意形式执行过的〖缠双③〗的选项数。③选项1.重铸一张牌2.使用一张【杀】3.弃置两张牌。',
olzhanjin:'蘸金',
olzhanjin_guanshi:'贯石斧(蘸金)',
olzhanjin_info:'锁定技,若你有空置的武器栏,则你视为装备【贯石斧】。',
tianchou:'田畴',
olshandao:'善刀',
olshandao_info:'出牌阶段限一次,你可以选择任意名角色,你选择这些角色的各一张牌,依次将这些牌放置到牌堆顶,然后你视为对这些角色使用【五谷丰登】,然后你视为对这些角色外的所有其他角色使用【万箭齐发】。',
ol_hujinding:'胡金定',
olqingyuan:'轻缘',
olqingyuan_info:'锁定技。①游戏开始时,或当你于本局游戏首次受到伤害后,你选择一名未以此法选择过的其他角色。②每回合限一次,你发动〖轻缘①〗选择过的角色得到牌后,你随机获得其中一名角色的随机一张牌。',
olchongshen:'重身',
olchongshen_info:'你可以将本轮得到的手牌当作【闪】使用,且这些牌不计入你的手牌上限。',
sp_tianji:'天极·皇室宗亲',
sp_sibi:'四弼·辅国文曲',

View File

@ -4,6 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
name:'sp2',
connect:true,
character:{
star_yuanshao:['male','qun',4,['starxiaoyan','starzongshi','starjiaowang','staraoshi'],['zhu']],
star_dongzhuo:['male','qun',5,['starweilin','starzhangrong','starhaoshou'],['zhu']],
star_yuanshu:['male','qun',4,['starcanxi','starpizhi','starzhonggu'],['zhu']],
star_caoren:['male','wei',4,['starsujun','starlifeng']],
@ -110,12 +111,199 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_xuzhou:['re_taoqian','caosong','zhangmiao','qiuliju'],
sp_zhongyuan:['re_hucheer','re_zoushi','caoanmin','re_dongcheng'],
sp_xiaohu:['haomeng','yanfuren','yanrou','dc_zhuling'],
sp_star:['star_caoren','star_yuanshu','star_dongzhuo'],
sp_star:['star_caoren','star_yuanshu','star_dongzhuo','star_yuanshao'],
mini_qixian:['mp_liuling'],
sp_decade:['caobuxing','re_maliang','dc_jikang'],
}
},
skill:{
//星袁绍
starxiaoyan:{
audio:2,
trigger:{
global:'phaseBefore',
player:['enterGame'/*,'logSkill'*/],
},
filter(event,player){
if(!game.hasPlayer(current=>current!=player)) return false;
//if(event.name=='logSkill'&&evt.skill!='starjiaowang') return false;
return event.name!='phase'||game.phaseNumber==0;
},
forced:true,
async content(event,trigger,player){
let targets=game.filterPlayer(current=>current!=player);
player.line(targets);
for(const target of targets) await target.damage('fire');
targets=targets.filter(i=>i.isIn());
if(targets.length){
for(const target of targets){
if(!target.countCards('he')) continue;
const {result:{bool}}=await target.chooseToGive('he',player)
.set('prompt','是否交给'+get.translation(player)+'一张牌'+(target.isDamaged()?'并回复1点体力':'')+'')
.set('ai',card=>{
const target=get.event('player'),player=get.event('target');
const att=get.attitude(target,player);
if(get.recoverEffect(target,target,target)<=0){
if(att<=0) return -get.value(card);
return 0;
}
return 7-get.value(card);
}).set('target',player);
if(bool) await target.recover();
}
}
},
},
starzongshi:{
audio:2,
enable:'phaseUse',
filter(event,player){
const cards=player.getCards('h',card=>{
const type=get.type(card,player);
if(type!='basic'&&type!='trick') return false;
return lib.filter.cardUsable(card,player)&&game.hasPlayer(target=>{
return lib.filter.targetEnabled2(card,player,target)&&lib.filter.targetInRange(card,player,target);
});
});
if(!cards.length) return false;
return cards.some(card=>{
const cardss=player.getCards('h',cardx=>card!=cardx&&get.suit(card,player)==get.suit(cardx,player));
return cardss.length&&!cardss.some(cardx=>!game.checkMod(cardx,player,'unchanged','cardEnabled2',player));
});
},
filterCard(card,player){
if(ui.selected.cards.length) return false;
const cards=player.getCards('h',card=>{
const type=get.type(card,player);
if(type!='basic'&&type!='trick') return false;
return lib.filter.cardUsable(card,player)&&game.hasPlayer(target=>{
return lib.filter.targetEnabled2(card,player,target)&&lib.filter.targetInRange(card,player,target);
});
});
if(!cards.includes(card)) return false;
const cardss=player.getCards('h',cardx=>card!=cardx&&get.suit(card,player)==get.suit(cardx,player));
return cardss.length&&!cardss.some(cardx=>!game.checkMod(cardx,player,'unchanged','cardEnabled2',player));
},
selectCard:[1,2],
complexCard:true,
check(card){
const player=get.event('player'),select=get.copy(get.info(card).selectTarget);
let range;
if(select==undefined) range=[1,1];
else if(typeof select=='number') range=[select,select];
else if(get.itemtype(select)=='select') range=select;
else if(typeof select=='function') range=select(card,player);
game.checkMod(card,player,range,'selectTarget',player);
const cards=player.getCards('h',cardx=>card!=cardx&&get.suit(card,player)==get.suit(cardx,player));
let targets=game.filterPlayer(target=>lib.filter.targetEnabled2(card,player,target)&&lib.filter.targetInRange(card,player,target)&&get.effect(target,card,player,player)>0);
const max=range[1],max2=Math.min(cards.length,targets.length);
if(max>max2) return 0;
targets=targets.sort((a,b)=>get.effect(b,card,player,player)-get.effect(a,card,player,player)).slice(0,max2);
const sum=targets.reduce((num,target)=>num+get.effect(target,card,player,player),0);
if(max==-1){
if(game.filterPlayer(target=>{
return lib.filter.targetEnabled2(card,player,target)&&lib.filter.targetInRange(card,player,target);
}).reduce((num,target)=>num+get.effect(target,card,player,player),0)>sum) return 0;
}
return sum;
},
position:'h',
discard:false,
lose:false,
delay:false,
async content(event,trigger,player){
const card=event.cards[0],cards=player.getCards('h',cardx=>card!=cardx&&get.suit(card,player)==get.suit(cardx,player));
await player.showCards([card],get.translation(player)+'发动了【纵势】');
const cardx=new lib.element.VCard({name:get.name(card,player),nature:get.nature(card,player),cards:cards});
const {result:{bool,targets}}=await player.chooseTarget((card,player,target)=>{
//return player.canUse(get.event('cardx'),target);
return lib.filter.targetEnabled2(get.event('cardx'),player,target)&&lib.filter.targetInRange(get.event('cardx'),player,target);
},true).set('cardx',cardx).set('selectTarget',[1,cards.length])
.set('prompt','请选择'+(game.hasNature(cardx)?get.translation(get.nature(cardx)):'')+'【'+get.translation(cardx)+'】('+get.translation(cards)+')的目标')
.set('ai',target=>{
const player=get.event('player'),card=get.event('cardx');
return get.effect(target,card,player,player);
});
if(bool) player.useCard(cardx,cards,targets.sortBySeat());
},
ai:{
order:9,
result:{player:1},
},
},
starjiaowang:{
audio:2,
trigger:{global:'roundStart'},
filter(event,player){
if(game.roundNumber<=1) return false;
const history=game.getAllGlobalHistory();
for(let i=history.length-2;i>=0;i--){
const evt=history[i]['everything'];
for(let j=evt.length-1;j>=0;j--){
if(evt[j].name=='die'&&evt[j].getParent(3).name!='starxiaoyan') return false;
}
if(history[i].isRound) break;
}
return true;
},
forced:true,
async content(event,trigger,player){
await player.loseHp();
if(game.hasPlayer(current=>current!=player)) player.useResult({skill:'starxiaoyan'},event);
},
},
staraoshi:{
audio:2,
zhuSkill:true,
global:'staraoshi_global',
subSkill:{
global:{
audio:'staraoshi',
forceaudio:true,
enable:'phaseUse',
filter(event,player){
return player.group=='qun'&&game.hasPlayer(target=>lib.skill.staraoshi.subSkill.global.filterTarget(null,player,target));
},
filterTarget(card,player,target){
return target!=player&&target.hasZhuSkill('staraoshi');
},
prompt(){
const player=get.event('player');
const targets=game.filterPlayer(target=>lib.skill.staraoshi.subSkill.global.filterTarget(null,player,target));
return '交给'+get.translation(targets)+(targets.length>1?'中的一人':'')+'一张手牌,然后其可以发动一次【纵势】';
},
filterCard:true,
check(card){
const player=get.event('player');
const target=game.filterPlayer(target=>{
return lib.skill.staraoshi.subSkill.global.filterTarget(null,player,target);
}).sort((a,b)=>b.countCards('h')-a.countCards('h'))[0];
return target.getUseValue(card);
},
discard:false,
lose:false,
delay:false,
usable:1,
async content(event,trigger,player){
const target=event.target,info=get.info('starzongshi');
await player.give(event.cards,target);
const {result:{bool,cards}}= await target.chooseCard(info.position,(card,player)=>{
return get.event('info').filterCard(card,player);
}).set('info',info).set('ai',card=>get.event('info').check(card)).set('selectCard',[1,2]).set('complexCard',true)
.set('prompt',get.prompt('starzongshi')).set('prompt2',lib.translate.starzongshi_info.slice(8).slice(0,-1));
if(bool) target.useResult({skill:'starzongshi',cards:cards},event);
},
ai:{
order:9,
result:{
target(player,target){
return target.countCards('h')+1;
},
},
},
},
},
},
//星董卓
starweilin:{
audio:2,
@ -3210,7 +3398,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
marktext:'装',
mark:true,
intro:{
content:'有装备牌进汝你的装备时,可弃置一名其他角色的一张牌',
content:'有装备牌进入你的装备区时,可弃置一名其他角色的一张牌',
},
trigger:{player:'equipAfter'},
filter:function(event,player){
@ -5030,7 +5218,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
})) return 3;
return Math.sqrt(target.countCards('he'));
}
if(target.mayHaveShan(player,'use',target.getCards(i=>{
if(target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))&&player.countCards('hs',function(card){
return !ui.selected.cards.includes(card)&&get.name(card)=='sha'&&player.canUse(card,target)&&get.effect(target,card,player,player)!=0;
@ -5364,7 +5552,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.addSkill('mouni2');
player.chooseTarget(get.prompt2('mouni'),lib.filter.notMe).set('ai',function(target){
var player=_status.event.player,cards=player.getCards('h','sha');
if(get.attitude(player,target)>=0||!player.canUse(cards[0],target,false)||(!player.hasJudge('lebu')&&target.mayHaveShan(player,'use',target.getCards(i=>{
if(get.attitude(player,target)>=0||!player.canUse(cards[0],target,false)||(!player.hasJudge('lebu')&&target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))&&!player.hasSkillTag('directHit_ai',true,{
target:target,
@ -7910,57 +8098,48 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
sushou:{
audio:2,
trigger:{player:'phaseDiscardBegin'},
frequent:true,
audio:2,
content:function(){
'step 0'
player.draw(1+player.countMark('cangchu'));
'step 1'
var num=Math.min(player.countCards('h'),game.countPlayer(function(target){
return target!=player&&target.isFriendOf(player);
}));
async content(event,trigger,player){
await player.draw(1+player.countMark('cangchu'));
const num=Math.min(player.countCards('h'),player.countCards('he'),game.countPlayer(target=>target!=player&&target.isFriendOf(player)));
if(num){
player.chooseCardTarget({
prompt:'是否将任意张手牌交给其他己方角色?',
prompt2:'操作提示:先按顺序选中所有要给出的手牌,然后再按顺序选择等量的目标角色',
selectCard:[1,num],
selectTarget:function(){
return ui.selected.cards.length;
},
filterTarget:function(card,player,target){
return target!=player&&target.isFriendOf(player);
},
complexSelect:true,
filterOk:function(){
return ui.selected.cards.length==ui.selected.targets.length;
},
ai1:function(card){
if(card.name=='shan') return 1;
return Math.random();
},
ai2:function(target){
return Math.sqrt(5-Math.max(4,target.countCards('h')))*get.attitude(_status.event.player,target);
},
});
}
else event.finish();
'step 2'
if(result.bool&&result.cards.length>0){
var list=[];
for(var i=0;i<result.targets.length;i++){
var target=result.targets[i];
var card=result.cards[i];
list.push([target,card]);
player.line(target);
let list=[];
while(num-list.length>0){
const {result:{bool,targets,cards}}=await player.chooseCardTarget({
prompt:'宿守:你可以交给友方角色各一张牌',
position:'he',
animate:false,
filterCard(card,player){
return !get.event('list').some(list=>list[1]==card);
},
filterTarget(card,player,target){
return target!=player&&target.isFriendOf(player)&&!get.event('list').some(list=>list[0]==target);
},
ai1(card){
if(card.name=='shan') return 1;
return Math.random();
},
ai2(target){
return get.attitude(get.event('player'),target);
},
}).set('list',list);
if(bool){
list.push([targets[0],cards[0]]);
player.addGaintag(cards,'olsujian_given');
}
else break;
}
if(list.length){
await game.loseAsync({
gain_list:list,
player:player,
cards:list.slice().map(list=>list[1]),
giver:player,
animate:'giveAuto',
}).setContent('gaincardMultiple');
}
game.loseAsync({
gain_list:list,
player:player,
cards:result.cards,
giver:player,
animate:'giveAuto',
}).setContent('gaincardMultiple');
}
},
},
@ -8541,7 +8720,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
game.expandSkills(list2);
for(var k=0;k<list2.length;k++){
var info=lib.skill[list2[k]];
if(!info||!info.trigger||!info.trigger.player||info.silent||info.limited||info.juexingji||info.zhuanhuanji||info.hiddenSkill||info.dutySkill) continue;
if(!info||!info.trigger||!info.trigger.player||info.silent||info.limited||info.juexingji||info.zhuanhuanji||info.hiddenSkill||info.dutySkill||(info.zhuSkill&&!player.isZhu2())) continue;
if(info.trigger.player==name2||Array.isArray(info.trigger.player)&&info.trigger.player.includes(name2)){
if(info.ai&&(info.ai.combo||info.ai.notemp||info.ai.neg)) continue;
if(info.init) continue;
@ -8621,7 +8800,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
game.expandSkills(list2);
for(var k=0;k<list2.length;k++){
var info=lib.skill[list2[k]];
if(!info||!info.enable||info.charlotte||info.limited||info.juexingji||info.zhuanhuanji||info.hiddenSkill||info.dutySkill) continue;
if(!info||!info.enable||info.charlotte||info.limited||info.juexingji||info.zhuanhuanji||info.hiddenSkill||info.dutySkill||(info.zhuSkill&&!player.isZhu2())) continue;
if((info.enable=='phaseUse'||(Array.isArray(info.enable)&&info.enable.includes('phaseUse')))||(info.enable=='chooseToUse'||(Array.isArray(info.enable)&&info.enable.includes('chooseToUse')))){
if(info.ai&&(info.ai.combo||info.ai.notemp||info.ai.neg)) continue;
if(info.init||info.onChooseToUse) continue;
@ -9782,7 +9961,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
event.directindex=result.index;
}
if(event.directindex==1){
target.chooseUseTarget({name:'sha'},cards,true,false).viewAs=true;
target.chooseUseTarget({name:'sha'},cards,true,false).viewAs=false;
}
else{
target.chooseUseTarget(card,true,false,'nodistance');
@ -10638,7 +10817,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
zhujun:['ol_zhujun','zhujun','sp_zhujun','jsrg_zhujun'],
tw_liuhong:['liuhong','tw_liuhong','jsrg_liuhong'],
re_hejin:['hejin','re_hejin','tw_hejin','jsrg_hejin'],
hujinding:['dc_hujinding','hujinding'],
hujinding:['dc_hujinding','ol_hujinding','hujinding'],
caosong:['caosong','sp_caosong'],
re_niujin:['niujin','re_niujin','tw_niujin'],
haomeng:['haomeng','tw_haomeng'],
@ -11124,7 +11303,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
liyixiejing:'李异谢旌',
dcdouzhen:'斗阵',
dcdouzhen_info:'锁定技。①转换技。你的回合内当你使用非转化且对应的实体牌为一张黑色基本牌的【决斗】时你获得目标角色各一张牌并获得1枚“☯”当你使用或打出非转化且对应的实体牌为一张红色基本牌的【杀】时你获得1枚“☯”。②若你的“☯”数为偶数你的黑色基本牌均视为【决斗】奇数你的红色基本牌均视为无次数限制的普【杀】。',
dc_hujinding:'胡金定',
dc_hujinding:'新杀胡金定',
dc_hujinding_prefix:'新杀',
dcdeshi:'德释',
dcdeshi_info:'锁定技。当你受到【杀】的伤害时,若你已受伤,则你防止此伤害并令系统从弃牌堆/牌堆中检索一张【杀】你获得此【杀】然后减1点体力上限。',
dcwuyuan:'武缘',
@ -11206,6 +11386,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){
starhaoshou:'豪首',
//starhaoshou_info:'主公技。①其他群势力角色使用【酒】结算完毕后其可以令你回复1点体力。②当你处于濒死状态时其他群势力角色可以将【酒】当作【桃】对你使用。',
starhaoshou_info:'主公技。其他群势力角色使用【酒】结算完毕后其可以令你回复1点体力。',
star_yuanshao:'星袁绍',
star_yuanshao_prefix:'星',
starxiaoyan:'硝焰',
starxiaoyan_info:'锁定技游戏开始时你对所有其他角色各造成1点火属性伤害然后这些角色可依次交给你一张牌并回复1点体力。',
starzongshi:'纵势',
starzongshi_info:'出牌阶段,你可以展示一张可展示目标的基本牌或普通锦囊牌,然后你将手牌中所有与此牌花色相同的其他牌当作此牌使用,且此牌至多指定转化牌数的目标。',
starjiaowang:'骄妄',
starjiaowang_info:'锁定技非首轮游戏开始时若上一轮没有角色死亡因〖硝焰〗死亡的角色除外则你失去1点体力并发动〖硝焰〗。',
staraoshi:'傲势',
staraoshi_info:'主公技,其他群势力角色的出牌阶段限一次,其可以交给你一张手牌,然后你可以发动一次〖纵势〗。',
sp_whlw:"文和乱武",
sp_zlzy:"逐鹿中原",

View File

@ -2340,13 +2340,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_zhangliao:['sp_zhangliao','yj_zhangliao','jsrg_zhangliao'],
xiahoudun:['xiahoudun','re_xiahoudun','xin_xiahoudun'],
liubei:['liubei','re_liubei','sb_liubei','dc_liubei','junk_liubei'],
guanyu:['guanyu','re_guanyu','ps_guanyu','old_guanyu'],
guanyu:['guanyu','re_guanyu','ol_sb_guanyu','sb_guanyu','ps_guanyu','old_guanyu'],
zhangfei:['zhangfei','re_zhangfei','old_zhangfei','xin_zhangfei','sb_zhangfei','tw_zhangfei','jsrg_zhangfei','yj_zhangfei'],
zhaoyun:['zhaoyun','re_zhaoyun','old_zhaoyun','sb_zhaoyun','jsrg_zhaoyun','ps2063_zhaoyun','ps2067_zhaoyun'],
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','sb_zhugeliang','jsrg_zhugeliang','ps2066_zhugeliang','ps_zhugeliang'],
zhugeliang:['zhugeliang','re_zhugeliang','sb_zhugeliang','ps2066_zhugeliang','ps_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'],

View File

@ -780,45 +780,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
target.disableEquip(disables);
if(num) target.draw(num);
target.when('phaseDiscardEnd')
.then(()=>{
if(!trigger.cards||!trigger.cards.length||!player.hasDisabledSlot()){
event.finish();
return;
}
const num=trigger.cards.length;
let list=[];
for(let i=1;i<6;i++){
if(player.hasDisabledSlot(i)){
for(let j=0;j<player.countDisabledSlot(i);j++){
list.push('equip'+i);
}
}
}
event.list=list;
const transList=list.map(i=>get.translation(i));
player.chooseButton([
'劫囚:请选择你要恢复的装备栏',
[transList,'tdnodes'],
],num,true).set('ai',button=>['equip5','equip4','equip1','equip3','equip2'].indexOf(button.link)+2);
})
.then(()=>{
if(result.bool){
let map={};
for(let i of event.list){
if(!map[get.translation(i)]) map[get.translation(i)]=i;
}
player.enableEquip(result.links.slice().map(i=>map[i]));
}
});
target.when('phaseEnd')
.then(()=>{
if(player.hasDisabledSlot()&&target.isIn()&&!target.hasSkill('twjieqiu_used')){
target.popup('劫囚');
target.addTempSkill('twjieqiu_used','roundStart');
target.insertPhase();
}
}).vars({target:player});
target.addSkill('twjieqiu_buff');
target.markAuto('twjieqiu_buff',[player]);
target.when('enableEquipEnd')
.filter((e,p)=>!p.hasDisabledSlot())
.then(()=>player.removeSkill('twjieqiu_buff'));
},
ai:{
order:7,
@ -828,7 +794,60 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
},
subSkill:{used:{charlotte:true}},
subSkill:{
used:{charlotte:true},
buff:{
charlotte:true,
onremove:true,
trigger:{player:'phaseDiscardEnd'},
filter(event,player){
return player.hasDisabledSlot()&&event.cards&&event.cards.length;
},
forced:true,
popup:false,
async content(event,trigger,player){
const num=trigger.cards.length;
let list=[],map={};
for(let i=1;i<6;i++){
map[get.translation('equip'+i)]=('equip'+i);
if(player.hasDisabledSlot(i)){
for(let j=0;j<player.countDisabledSlot(i);j++){
list.push('equip'+i);
}
}
}
const transList=list.map(i=>get.translation(i));
const {result:{bool,links}}=await player.chooseButton([
'劫囚:请选择你要恢复的装备栏',
[transList,'tdnodes'],
],num,true).set('map',map)
.set('ai',button=>['equip5','equip4','equip1','equip3','equip2'].indexOf(get.event('map')[button.link])+2);
if(bool) player.enableEquip(links.slice().map(i=>map[i]));
},
group:['twjieqiu_end'],
},
end:{
charlotte:true,
trigger:{player:'phaseEnd'},
filter(event,player){
return player.hasDisabledSlot()&&player.getStorage('twjieqiu_buff').some(target=>{
return target.isIn()&&!target.hasSkill('twjieqiu_used');
});
},
forced:true,
popup:false,
async content(event,trigger,player){
const targets=player.getStorage('twjieqiu_buff').filter(target=>{
return target.isIn()&&!target.hasSkill('twjieqiu_used');
}).sortBySeat();
for(const target of targets){
target.popup('劫囚');
target.addTempSkill('twjieqiu_used','roundStart');
target.insertPhase();
}
},
},
},
},
twenchou:{
audio:2,
@ -855,7 +874,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
const {result:{bool,links}}=await player.chooseButton([
'恩仇:请选择'+get.translation(target)+'要恢复的装备栏',
[transList,'tdnodes'],
],true).set('ai',button=>1/(['equip5','equip4','equip1','equip3','equip2'].indexOf(button.link)+2));
],true).set('map',map)
.set('ai',button=>1/(['equip5','equip4','equip1','equip3','equip2'].indexOf(get.event('map')[button.link])+2));
if(bool) target.enableEquip(links.slice().map(i=>map[i]));
},
ai:{
@ -945,7 +965,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
locked:false,
async content(event,trigger,player){
await player.draw();
await player.addMark('twchue',1);
player.addMark('twchue',1);
},
},
effect:{
@ -1095,7 +1115,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}).set('goon',function(){
var d1=true;
if(player.hasSkill('jueqing')||player.hasSkill('gangzhi')) d1=false;
if(!target.mayHaveShan(player,'use',target.getCards(i=>{
if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))||player.hasSkillTag('directHit_ai',true,{
target:target,
@ -3697,7 +3717,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
expose:0.2,
result:{
target:function(player,target){
if(target.countCards('h')<=target.hp&&!target.mayHaveShan(player,'use',target.getCards(i=>{
if(target.countCards('h')<=target.hp&&!target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))&&get.effect(target,{name:'sha',isCard:true},player,player)>0) return -1;
else if(target.countCards('h')>target.hp&&target.hp>2&&target.hasShan()) return 1;
@ -4534,8 +4554,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger.directHit.addArray(game.players);
var info=get.info(trigger.card);
if(info.allowMultiple==false) event.finish();
else if(trigger.targets&&!info.multitarget){
if(!game.hasPlayer(function(current){
else if(trigger.targets){
if(!info.multitarget&&!game.hasPlayer(function(current){
return !trigger.targets.includes(current)&&lib.filter.targetEnabled2(trigger.card,player,current);
})) event.finish();
}
@ -7273,7 +7293,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var player=_status.event.player;
if(player.hp+player.countCards('hs',{name:['tao','jiu']})<=1) return -1;
var num=1;
if((!target.mayHaveShan(player,'use',target.getCards(i=>{
if((!target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))||player.hasSkillTag('directHit_ai',true,{
target:target,
@ -11796,7 +11816,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var d1=true;
if(trigger.player.hasSkill('jueqing')||trigger.player.hasSkill('gangzhi')) d1=false;
for(var target of trigger.targets){
if(!target.mayHaveShan(player,'use',target.getCards(i=>{
if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))||trigger.player.hasSkillTag('directHit_ai',true,{
target:target,
@ -13986,6 +14006,31 @@ game.import('character',function(lib,game,ui,get,ai,_status){
filter:function(event,player){
return event.card.name=='sha'&&(event.player==player||player.inRange(event.player))&&player.countCards('he')>0;
},
checkx(event,player){
let d1=true,e=false;
if(event.player.hasSkill('jueqing')||event.player.hasSkill('gangzhi')) d1=false;
for(let tar of event.targets){
if(!tar.mayHaveShan(player,'use',tar.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))||event.player.hasSkillTag('directHit_ai',true,{
target:tar,
card:event.card,
},true)){
if(!tar.hasSkill('gangzhi')) d1=false;
if(!tar.hasSkillTag('filterDamage',null,{
player:event.player,
card:event.card,
})){
let att=get.attitude(_status.event.player,tar);
if(att>0) return false;
if(att<0) e=true;
}
}
}
if(e) return true;
if(d1) return get.damageEffect(event.player,player,_status.event.player)>0;
return false;
},
content:function(){
'step 0'
if(player!=game.me&&!player.isOnline()) game.delayx();
@ -13994,26 +14039,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.chooseToDiscard('he',get.prompt('cuijin',target),'弃置一张牌并令'+get.translation(trigger.player)+'使用的【杀】伤害+1但若其未造成伤害则你对其造成1点伤害。').set('ai',function(card){
if(_status.event.goon) return 7-get.value(card);
return 0;
}).set('goon',function(){
var d1=true;
if(trigger.player.hasSkill('jueqing')||trigger.player.hasSkill('gangzhi')) d1=false
for(var target of trigger.targets){
if(!target.mayHaveShan(player,'use',target.getCards(i=>{
return i.hasGaintag('sha_notshan');
}))||trigger.player.hasSkillTag('directHit_ai',true,{
target:target,
card:trigger.card,
},true)){
if(!target.hasSkill('gangzhi')) d1=false;
if(!target.hasSkillTag('filterDamage',null,{
player:trigger.player,
card:trigger.card,
})&&get.attitude(player,target)<0) return true;
}
}
if(d1) return get.damageEffect(trigger.player,player,player)>0;
return false;
}()).logSkill=['cuijin',target];
}).set('goon',lib.skill.cuijin.checkx(trigger,player)).logSkill=['cuijin',target];
'step 1'
if(result.bool){
if(typeof trigger.baseDamage!='number') trigger.baseDamage=1;
@ -15970,7 +15996,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
twchue_info:'①当你使用【杀】指定唯一目标时你可以失去1点体力为此牌额外指定Z个目标。②当你受到伤害或失去体力后你摸一张牌并获得1个“勇”标记。③回合结束时若你本回合发动过〖除恶②〗则你可以失去Z个“勇”标记视为使用一张伤害+1且可以额外指定Z个目标的【杀】。Z为你的体力值',
xia_shitao:'石韬',
twjieqiu:'劫囚',
twjieqiu_info:'出牌阶段限一次你可以选择一名装备区没有废除栏的其他角色废除其所有装备栏然后其摸X张牌X为其废除装备栏前的装备区牌数。其下个弃牌阶段结束时,其恢复等同于其弃置牌数的装备栏;其下个回合结束时,若其仍有已废除的装备栏,则你执行一个额外回合(每轮限一次)。',
twjieqiu_info:'出牌阶段限一次你可以选择一名装备区没有废除栏的其他角色废除其所有装备栏然后其摸X张牌X为其废除装备栏前的装备区牌数,直到其恢复所有装备栏前:其弃牌阶段结束时,其恢复等同于其弃置牌数的装备栏;其回合结束时,若其仍有已废除的装备栏,则你执行一个额外回合(每轮限一次)。',
twenchou:'恩仇',
twenchou_info:'出牌阶段限一次,你可以观看一名存在废除装备栏的其他角色的手牌并获得其中一张牌,然后你恢复其一个装备栏。',
xia_shie:'史阿',
@ -15978,7 +16004,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
twdengjianx:'剑法',
twdengjian_info:'①其他角色的弃牌阶段结束时,你可以弃置一张牌并随机获得本回合所有造成伤害的牌对应的实体牌的其中一张与你本轮以此法获得的牌的颜色均不同的【杀】,称为“剑法”。②你使用“剑法”牌不计入次数限制。',
twxinshou:'心授',
twxinshou_info:'当你于出牌阶段使用【杀】时,若此【杀】与你本回合使用的所有其他【杀】的颜色均不相同,则你可以选择执行以下一项本回合未执行过的项:⒈摸一张牌;⒉交给一名其他角色一张牌。若这两项本回合均已被选择过,则你可以令〖登剑①〗失效并令一名其他角色获得〖登剑〗,你的下个回合开始时,其失去〖登剑〗,若其这期间使用【杀】造成过伤害,则你结束〖登剑①〗的失效状态。',
twxinshou_info:'当你于出牌阶段使用【杀】时,若此【杀】与你本回合使用的所有其他【杀】的颜色均不相同,则你可以选择执行以下一项本回合未执行过的项:⒈摸一张牌;⒉交给一名其他角色一张牌。②当你使用【杀】时,若〖心授①〗的两项本回合均已被你选择过,则你可以令〖登剑①〗失效并令一名其他角色获得〖登剑〗,你的下个回合开始时,其失去〖登剑〗,若其这期间使用【杀】造成过伤害,则你结束〖登剑①〗的失效状态。',
xia_yuzhenzi:'玉真子',
twhuajing:'化境',
twhuajing_info:'①游戏开始时你获得6个效果各不相同的无效果“武”标记。②一名拥有“武”标记的角色的攻击范围+XX为其拥有的“武”标记数。③出牌阶段限一次你可以展示至多四张手牌然后根据这些牌含有的花色数于本回合获得等量你拥有的“武”标记的效果。④拥有“武”标记效果的角色的武器牌失效武器牌不提供攻击范围且武器技能失效。',

View File

@ -4,6 +4,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
name:'xianding',
connect:true,
character:{
zhugemengxue:['female','wei',3,['dcjichun','dchanying']],
bailingyun:['female','wei',3,['dclinghui','dcxiace','dcyuxin']],
dc_qinghegongzhu:['female','wei',3,['dczhangji','dczengou']],
caoxian:['female','wei',3,['dclingxi','dczhifou']],
dc_sb_zhouyu:['male','wu',4,['dcsbronghuo','dcsbyingmou']],
@ -98,10 +100,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp2_bizhe:['dc_luotong','dc_wangchang','chengbing','dc_yangbiao','ruanji'],
sp2_huangjia:['caomao','liubian','dc_liuyu','quanhuijie','dingshangwan','yuanji','xielingyu','sunyu','ganfurenmifuren','dc_ganfuren','dc_mifuren','dc_shixie'],
sp2_zhangtai:['guozhao','fanyufeng','ruanyu','yangwan','re_panshu'],
sp2_jinse:['caojinyu','re_sunyi','re_fengfangnv','caohua','laiyinger','zhangfen','zhugeruoxue','caoxian','dc_qinghegongzhu'],
sp2_jinse:['caojinyu','re_sunyi','re_fengfangnv','caohua','laiyinger','zhangfen','zhugeruoxue','caoxian','dc_qinghegongzhu','zhugemengxue'],
sp2_yinyu:['zhouyi','luyi','sunlingluan','caoyi'],
sp2_wangzhe:['dc_daxiaoqiao','dc_sp_machao'],
sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji','duanqiaoxiao','tianshangyi','malingli'],
sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji','duanqiaoxiao','tianshangyi','malingli','bailingyun'],
sp2_jichu:['zhaoang','dc_liuye','dc_wangyun','yanghong','huanfan','xizheng'],
sp2_yuxiu:['dongguiren','dc_tengfanglan','zhangjinyun','zhoubuyi','dc_xujing'],
sp2_qifu:['dc_guansuo','xin_baosanniang','dc_zhaoxiang'],
@ -111,6 +113,188 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
},
skill:{
//诸葛梦雪
dcjichun:{
audio:2,
enable:'phaseUse',
filter(event,player){
return player.countCards('he',card=>lib.skill.dcjichun.filterCard(card,player));
},
filterCard(card,player){
if(!get.cardNameLength(card)||ui.selected.cards.length) return false;
if(game.hasPlayer(target=>{
return target.countCards('h')<player.countCards('h');
})) return true;
if(lib.filter.cardDiscardable(card,player)&&game.hasPlayer(target=>{
return target.countCards('h')>player.countCards('h')&&target.countDiscardableCards(player,'hej');
})) return true;
return false;
},
selectCard:[1,2],
filterTarget(cardx,player,target){
if(!ui.selected.cards.length) return false;
const card=ui.selected.cards[0];
if(target.countCards('h')<player.countCards('h')) return true;
if(lib.filter.cardDiscardable(card,player)&&target.countCards('h')>player.countCards('h')&&target.countDiscardableCards(player,'hej')) return true;
return false;
},
usable:1,
position:'he',
check(card){
return get.cardNameLength(card);
},
complexCard:true,
complexSelect:true,
lose:false,
discard:false,
delay:false,
targetprompt(){
const target=ui.selected.targets[0],player=get.event('player');
return target.countCards('h')<player.countCards('h')?'给牌摸牌':'双双弃牌';
},
async content(event,trigger,player){
const card=event.cards[0],target=event.target;
const num=get.cardNameLength(card);
await player.showCards([card],get.translation(player)+'发动了【寄春】');
if(target.countCards('h')<player.countCards('h')){
await player.give(card,target);
await player.draw(num);
}
else{
await player.discard(card);
await player.discardPlayerCard(target,'hej',[1,num]);
}
},
ai:{
order:7,
result:{
target(player,target){
return target.countCards('h')<player.countCards('h')?get.attitude(player,target):-get.effect(target,{name:'guohe'},player,player);
},
},
},
},
dchanying:{
audio:2,
trigger:{player:'phaseZhunbeiBegin'},
frequent:true,
async content(event,trigger,player){
const card=get.cardPile(card=>get.type(card)=='equip'&&!get.cardtag(card,'gifts'));
if(!card){
player.chat('无牌可得?!');
game.log('但是牌堆已经没有装备牌了!');
return;
}
await player.showCards([card],get.translation(player)+'发动了【寒英】');
if(game.hasPlayer(target=>target.countCards('h')==player.countCards('h')&&target.hasUseTarget(card))){
const {result:{bool,targets}}=await player.chooseTarget('请选择使用'+get.translation(card)+'的目标角色',(card,player,target)=>{
return target.countCards('h')==player.countCards('h')&&target.hasUseTarget(get.event('card'));
},true).set('ai',target=>get.effect(target,get.event('card'),target,get.event('player'))).set('card',card);
if(bool){
const target=targets[0];
player.line(target);
target.chooseUseTarget(card,true,'nopopup');
}
}
else{
player.chat('无人可装?!');
game.log('但是场上没有角色可以使用',card,'');
}
},
},
//柏灵筠
dclinghui:{
audio:2,
trigger:{global:'phaseJieshuBegin'},
filter(event,player){
if(_status.currentPhase===player) return true;
return game.getGlobalHistory('everything',evt=>evt.name=='dying').length;
},
frequent:true,
async content(event,trigger,player){
let cards=get.cards(3,true);
const {result:{bool,links}}=await player.chooseButton(['灵慧:是否使用其中的一张牌并获得其余牌?',cards]).set('ai',button=>{
return get.event('player').getUseValue(button.link);
});
if(bool){
const card=links[0];
cards.remove(card);
player.$gain2(card,false);
await game.asyncDelayx();
await player.chooseUseTarget(true,card,false);
if(cards.length) await player.gain(cards,'gain2');
}
},
},
dcxiace:{
audio:2,
trigger:{
player:'damageEnd',
source:'damageSource',
},
filter(event,player){
const bool1=(event.player==player&&!player.hasHistory('custom',evt=>evt.dcxiace=='player')&&game.hasPlayer(target=>target!=player&&!target.hasSkill('fengyin')));
const bool2=(event.source&&event.source==player&&!player.hasHistory('custom',evt=>evt.dcxiace=='source')&&player.isDamaged()&&player.countCards('he',card=>{
if(_status.connectMode&&get.position(card)=='h') return true;
return lib.filter.cardDiscardable(card,player);
}));
return bool1||bool2;
},
async content(event,trigger,player){
if(trigger.player==player&&!player.hasHistory('custom',evt=>evt.dcxiace=='player')&&game.hasPlayer(target=>target!=player&&!target.hasSkill('fengyin'))){
const {result:{bool,targets}}=await player.chooseTarget((card,player,target)=>{
return target!=player&&!target.hasSkill('fengyin');
}).set('prompt',get.prompt('dcxiace')).set('prompt2','令一名其他角色的非锁定技于本回合失效')
.set('ai',target=>{
const player=get.event('player');
return -get.sgn(get.attitude(player,target))*(target.getSkills(null,false,false).filter(skill=>{
return !get.is.locked(skill);
}).length+1)*(target===_status.currentPhase?10:1);
});
if(bool){
const target=targets[0];
player.logSkill('dcxiace',target);
player.getHistory('custom').push({dcxiace:'player'});
target.addTempSkill('fengyin');
}
}
if(trigger.source&&trigger.source==player&&!player.hasHistory('custom',evt=>evt.dcxiace=='source')&&player.isDamaged()&&player.countCards('he',card=>{
if(_status.connectMode&&get.position(card)=='h') return true;
return lib.filter.cardDiscardable(card,player);
})&&player.hasSkill('dcxiace')){
const {result:{bool}}=await player.chooseToDiscard('he',get.prompt('dcxiace'),'弃置一张牌并回复1点体力').set('ai',card=>{
const player=get.event('player');
if(get.recoverEffect(player,player,player)<=0) return 0;
return 7-get.value(card);
}).set('logSkill','dcxiace');
if(bool){
player.getHistory('custom').push({dcxiace:'source'});
await player.recover();
}
}
},
},
dcyuxin:{
unique:true,
limited:true,
audio:2,
trigger:{global:'dying'},
filter(event,player){
return event.player.hp<(event.player==player?1:player.getHp());
},
prompt2(event,player){
return '令其将体力值回复至'+(event.player==player?1:player.getHp())+'点';
},
check(event,player){
if(get.recoverEffect(event.player,player,player)<=0) return false;
return lib.skill.luanfeng.check(event,player);
},
logTarget:'player',
async content(event,trigger,player){
player.awakenSkill('dcyuxin');
trigger.player.recover((trigger.player==player?1:player.getHp())-trigger.player.hp);
},
},
//清河公主
dczhangji:{
audio:2,
@ -214,7 +398,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
cards=ui.selected.cards.concat(player.getExpansions('dclingxi')),
suit=get.suit(card,false);
if(_status.event.suits.length<4) _status.event.suits.add(get.suit(ui.selected.cards.at(-1),false));
if(_status.event.name==='phaseUseEnd'){
if(_status.event.triggerName==='phaseUseEnd'){
if(_status.event.suits.includes(suit)) return (dis?10:3)-get.useful(card);
return (dis?6:1)-get.useful(card);
}
@ -245,7 +429,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
suits.add(get.suit(i,false));
});
return suits;
})()).set('name',event.triggername);
})()).set('triggerName',event.triggername);
if(result.bool){
player.logSkill('dclingxi');
player.addToExpansion(result.cards,player,'give').gaintag.add('dclingxi');
@ -2926,7 +3110,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
trigger:{player:'useCardAfter'},
filter:function(event,player){
if(event.targets.length!=1) return false;
if(event.targets.length!=1||!player.hasHistory('lose',evt=>{
if(evt.getParent()!=event) return false;
return event.cards.every(card=>evt.hs.includes(card));
})) return false;
if(!['basic','trick'].includes(get.type(event.card,false))) return false;
if(event.getParent(2).name=='dcchanjuan') return false;
return !player.storage.dcchanjuan[event.card.name]||player.storage.dcchanjuan[event.card.name]<2;
@ -3020,7 +3207,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.reinit('ganfurenmifuren',character,false);
'step 2'
player.recover(1-player.hp);
player.addTempSkill('dcxunbie_muteki');
player.addTempSkill('dcxunbie_muteki',{player:'phaseAfter'});
},
subSkill:{
muteki:{
@ -3033,7 +3220,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger.cancel();
},
mark:true,
intro:{content:'防止本回合受到的所有伤害'},
intro:{content:'防止受到的所有伤害直到我的回合结束'},
ai:{
nofire:true,
nothunder:true,
@ -3816,25 +4003,85 @@ game.import('character',function(lib,game,ui,get,ai,_status){
position:'he',
filterCard:true,
check:function(card){
var player=_status.event.player;
var suit=get.suit(card);
if(get.position(card)!='h'&&player.countCards('h',{suit:suit})==1) return 0.1;
if(!player.hasCard(cardx=>cardx!=card&&get.suit(cardx)==suit)) return 7.5-get.value(card);
return 6-get.value(card);
let cache=lib.skill.dccaizhuang.tempCache();
if(!cache||cache.no) return 0;
let player=_status.event.player,suit=get.suit(card);
if(ui.selected.cards.filter(i=>{
return get.suit(i)===suit;
}).length<(cache[suit]||0)){
if(get.position(card)==='h') return 15-get.value(card);
return 9-get.value(card);
}
return 0;
},
tempCache(){
let cache=_status.event.getTempCache('dccaizhuang','dsuits');
if(cache) return cache;
cache={no:true};
_status.event.putTempCache('dccaizhuang','dsuits',cache);
let player=_status.event.player,suits={};
lib.suit.forEach(i=>{
suits[i]=0;
});
player.getCards('h',i=>{
let suit=get.suit(i);
if(lib.suit.includes(suit)) suits[suit]++;
});
let sortedSuits=Object.fromEntries(Object.entries(suits).sort((a,b)=>b[1]-a[1]));
let dis=0,idx=0,dsuits=0,leave=0;
for(let i in sortedSuits){
idx++;
if(!sortedSuits[i]) continue;
let num=1;
if(idx>2||sortedSuits[i]<3) num=sortedSuits[i];
cache[i]=num;
dis+=num;
suits[i]-=num;
dsuits++;
}
for(let i in suits){
if(suits[i]) leave++;
}
player.getCards('e',i=>{
let suit=get.suit(i);
if(!cache[suit]){
dsuits++;
cache[suit]=1;
dis++;
}
});
let draw=0,e=[0,1,4/3,2,4];
if(dsuits<=leave) return false;
do{
draw+=e[dsuits--];
}while(dsuits>leave);
if(draw>dis){
delete cache.no;
_status.event.putTempCache('dccaizhuang','dsuits',cache);
return cache;
}
return false;
},
content:function(){
'step 0'
var suits=[];
cards.forEach(i=>{
if(suits.length>=4) return;
let suit=get.suit(i,player);
if(lib.suit.includes(suit)) suits.add(suit);
});
event.num=suits.length;
'step 1'
var suits=[];
player.countCards('h',card=>{
if(suits.length>=4) return;
var suit=get.suit(card);
if(!lib.suit.includes(suit)) return;
suits.add(suit);
if(lib.suit.includes(suit)) suits.add(suit);
});
if(suits.length>=cards.length) event.finish();
'step 1'
if(suits.length>=event.num) event.finish();
'step 2'
player.draw();
event.goto(0);
event.goto(1);
},
ai:{
order:2,
@ -5032,58 +5279,77 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return game.hasPlayer(current=>current.countDiscardableCards(player,'hej')>0);
},
direct:true,
content:function(){
'step 0'
var num=4-player.countMark('dcluochong');
var dialog=[];
dialog.push('###'+get.prompt('dcluochong')+'###<div class="text center">弃置任意名角色区域内共计至多'+get.cnNumber(num)+'张牌</div>');
game.filterPlayer().sortBySeat().forEach(target=>{
if(target.countDiscardableCards(player,'hej')<=0) return false;
var name=(target==player?'你':get.translation(target));
if(target.countCards('h')){
dialog.add('<div class="text center">'+name+'的手牌区</div>');
if(player.hasSkillTag('viewHandcard',null,target,true)||player==target) dialog.push(target.getCards('h'));
else dialog.push([target.getCards('h'),'blank']);
}
if(target.countCards('e')) dialog.addArray(['<div class="text center">'+name+'的装备区</div>',target.getCards('e')]);
if(target.countCards('j')) dialog.addArray(['<div class="text center">'+name+'的判定区</div>',target.getCards('j')]);
});
player.chooseButton([1,num]).set('createDialog',dialog).set('filterButton',button=>{
return lib.filter.canBeDiscarded(button.link,_status.event.player,get.owner(button.link));
}).set('ai',button=>{
var player=_status.event.player,
target=get.owner(button.link),
num=ui.selected.buttons.filter(i=>get.owner(i.link)==target).length;
if(num>1&&player.hp+player.hujia>2) return 0;
if(target==player){
if(num) return -get.value(button.link,target);
if(ui.cardPile.childNodes.length>80) return 6-get.value(button.link,player);
return 0;
}
var val=get.buttonValue(button);
if(num===2) val/=4;
if(get.attitude(player,target)>0) return -val;
return val;
//return -(get.position(card)!='h'?get.value(card,target):(4.5+Math.random()-0.2*(num>2?1:0)))*get.attitude(player,target);
});
'step 1'
if(result.bool){
var links=result.links;
var lose_list=[];
var log=false;
for(var target of game.players){
var cards=links.filter(card=>get.owner(card)==target);
if(cards.length){
if(cards.length>2){
player.addMark('dcluochong',1,false);
log=true;
}
lose_list.push([target,cards]);
async content(event,trigger,player){
if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true});
const lose_list = [];
let num = 4 - player.countMark('dcluochong');
while (num>0) {
const result = await player.chooseTarget(
get.prompt('dcluochong'),
`弃置任意名角色区域内的累计至多${num}张牌`,
(card,player,target)=>{
return target.hasCard(card => {
const discarded = _status.event.lose_list.find(item => item[0] == target);
if (discarded && discarded[1].includes(card)) return false;
return lib.filter.canBeDiscarded(card,player,target,'dcluochong');
}, 'hej')
}
).set('ai',target=>{
const player = _status.event.player, discarded = _status.event.lose_list.find(item => item[0] == target);
if(discarded){
if (target == player) return 0;
const num = discarded[1].length;
if (num > 1 && player.hp + player.hujia > 2) return 0;
}
if (target == player){
if(ui.cardPile.childNodes.length > 80 && player.hasCard(card => get.value(card) < 8)) return 20;
return 0;
}
return get.effect(target, {name:'guohe_copy2'}, player, player);
}).set('lose_list',lose_list).forResult();
if (result.bool) {
const target = result.targets[0];
const cards = await player.choosePlayerCard(target, true, 'hej', [1,num], `选择弃置${get.translation(target)}区域内的牌`, (button) => {
const card = button.link, target = _status.event.target;
const discarded = _status.event.lose_list.find(item => item[0] == target);
if (discarded && discarded[1].includes(card)) return false;
return lib.filter.canBeDiscarded(card,player,target,'dcluochong');
}).set('lose_list',lose_list).set('ai', button => {
if (ui.selected.buttons.length>0) return false;
var val = get.buttonValue(button);
if (get.attitude(_status.event.player, _status.event.target) > 0) return -val;
return val;
}).forResultCards();
num -= cards.length;
const index = lose_list.find(item => item[0] == target);
if (!index) {
lose_list.push([target, cards]);
}
else {
index[1].addArray(cards);
}
}
player.logSkill('dcluochong',lose_list.map(i=>i[0]));
if(log) game.log(player,'可弃置牌数','#g-1');
if(lose_list[0].length==1) lose_list[0][0].discard(lose_list[0][1]);
else {
break;
}
}
if (_status.connectMode) {
game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});
}
if (lose_list.length>0) {
lib.tempSortSeat = trigger.player;
lose_list.sort((a,b)=>{
return lib.sort.seat(a[0],b[0]);
});
delete lib.tempSortSeat;
player.logSkill('dcluochong',lose_list.map(i => i[0]));
if (lose_list.some(i => i[1].length > 2)) {
game.log(player,'可弃置牌数','#g-1');
player.addMark('dcluochong',1,false);
}
if (lose_list[0].length==1) {
lose_list[0][0].discard(lose_list[0][1]);
}
else{
game.loseAsync({
lose_list:lose_list,
@ -5793,6 +6059,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger.finish();
trigger.untrigger(true);
trigger._triggered=5;
game.players.slice().concat(game.dead).forEach(current=>{
current.getHistory().isSkipped=true;
current.getStat().isSkipped=true;
});
var evt=player.insertPhase();
delete evt.skill;
game.broadcastAll(function(player){
@ -5874,18 +6144,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dczhanmeng:{
audio:2,
trigger:{player:'useCard'},
filter:function(event,player){
filter(event,player){
return !player.hasSkill('dczhanmeng_choice1')||!player.hasSkill('dczhanmeng_choice2')||
!player.hasSkill('dczhanmeng_choice0')&&!game.hasPlayer2(current=>{
var history=current.actionHistory;
const history=current.actionHistory;
if(history.length<2) return false;
var list=history[history.length-2].useCard.map(evt=>evt.card.name);
if(list.includes(event.card.name)) return true;
for(let i=history.length-2;i>=0;i--){
if(history[i].isSkipped) continue;
const list=history[i].useCard.map(evt=>evt.card.name);
return list.includes(event.card.name);
}
return false;
});
},true);
},
direct:true,
content:function(){
content(){
'step 0'
var list=[];
var choiceList=[
@ -5896,10 +6169,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var used=game.hasPlayer2(current=>{
var history=current.actionHistory;
if(history.length<2) return false;
var list=history[history.length-2].useCard.map(evt=>evt.card.name);
if(list.includes(trigger.card.name)) return true;
for(let i=history.length-2;i>=0;i--){
if(history[i].isSkipped) continue;
const list=history[i].useCard.map(evt=>evt.card.name);
return list.includes(trigger.card.name);
}
return false;
});
},true);
if(!player.hasSkill('dczhanmeng_choice0')&&!used) list.push('选项一');
else choiceList[0]='<span style="opacity:0.5; ">'+choiceList[0]+(used?'(同名牌被使用过)':'(已选择)')+'</span>';
if(!player.hasSkill('dczhanmeng_choice1')) list.push('选项二');
@ -5978,7 +6254,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
charlotte:true,
forced:true,
popup:false,
filter:function(event,player,name){
silent:true,
filter(event,player,name){
var history=player.actionHistory;
if(history.length<2) return false;
var list=history[history.length-2].useCard;
@ -5992,7 +6269,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
return false;
},
content:function(){
content(){
if(event.triggername!='phaseBeginStart'){
player.logSkill('dczhanmeng_delay');
var card=get.cardPile2(card=>{
@ -6740,7 +7017,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
global:'phaseBegin',
},
filter:function(event,player){
return event.player.phaseNumber==1&&lib.skill.dctongguan.derivation.some(i=>{
return event.player.getAllHistory().filter(history=>{
return history.isMe&&!history.isSkipped;
}).indexOf(event.player.getHistory())===0&&lib.skill.dctongguan.derivation.some(i=>{
return (player.getStorage('dctongguan')[i]||0)<2;
});
},
@ -9427,11 +9706,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return true;
});
next.set('processAI',function(list){
var cards=list[0][1].slice(0).sort(function(a,b){
if(b.name=='sha') return 1;
return get.value(b)-get.value(a);
let cards=list[0][1].slice(0),player=_status.event.player;
cards.sort((a,b)=>{
return get.value(b,player)-get.value(a,player);
});
return [cards,cards.splice(0,_status.event.player.getDamagedHp())];
if(!player.storage.juetao&&player.hasSkill('juetao')&&player.hasSha()){
let gain,bottom,pai=cards.filter(card=>card.name!=='sha');
pai.sort((a,b)=>{
return get.value(b,player)-get.value(a,player);
});
gain=pai.splice(0,player.getDamagedHp());
bottom=pai;
return [bottom, gain];
}
return [cards,cards.splice(0,player.getDamagedHp())];
});
'step 1'
game.broadcastAll('closeDialog',event.videoId);
@ -13464,6 +13752,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
characterIntro:{
bailingyun:'柏灵筠是电视剧《大军师司马懿之军师联盟》、《虎啸龙吟》中的主要角色之一由张钧甯饰演。20岁是曹丕赏赐司马懿的美人也是曹丕的眼线被送入司马府中为妾室。柔弱美貌、心机极深。',
caoxian:'曹宪生卒年不详沛国谯县今安徽省亳州市人。东汉末年历史人物汉献帝刘协嫔妃魏武帝曹操女儿。建安十八年嫁给汉献帝刘协受封为贵人。黄初元年220年兄弟曹丕称帝后汉献帝成为山阳公不知所终。',
zhangjian:'张臶136年240年字子明钜鹿人。汉末三国时期隐士、音乐家精通谶纬之学。张臶生活的年代从东汉一直到曹魏齐王时期受到朝廷多次征召一直回避不愿做官。他活了一百零五岁是三国时期有可靠记载的最长寿的人之一。',
puyuan:'蒲元是三国时蜀汉杰出的工匠。为诸葛亮造刀三千口,并且制作木牛流马。后来姜维为他写过两部传记《蒲元传》《蒲元别传》。',
@ -13514,6 +13803,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
tianshangyi:'田尚衣,一作陈尚衣,魏文帝曹丕宫中著名宫人。能歌善舞,一时冠绝于世,私以为比之汉宫飞燕也不遑多让。',
malingli:'马伶俐,游卡桌游原创角色,设定上为,马超之女,其身形虽娇小,却继承了马超英勇略带冲动的个性,活泼阳光,调皮伶俐,爱摆弄爆竹烟花一类的小器具,包包里经常放置用五色彩纸包装的小炸弹球。马伶俐从小跟随马超和马云騄学习战斗技巧,战斗力超强,坚强的意志和勇气也得到了提升,同时擅长马术,有一匹可爱的小白马伴随其身边。后马伶俐成年,嫁与刘备之子刘理,获封梁王妃。两人琴瑟相和,极为恩爱,常结伴出游,被人誉为天作之合。',
zhugeruoxue:'诸葛氏(“若雪”为网络小说虚构),诸葛亮的二姐,庞山民之妻。',
zhugemengxue:'诸葛氏(“梦雪”为网络小说虚构),诸葛亮的大姐。',
caoyi:'曹轶,游卡桌游旗下产品《三国杀》原创角色。设定上为曹纯所收养的孙女,从小受到曹纯的教导,在军营中长大,性情坚毅有担当,军事谋略丰富,战斗能力超强。曹轶喜欢美食,特别是甜食,并且擅长制作各种点心。她身边跟随的雪白小老虎是曹纯在她及笄时送的生辰礼物,希望她如小老虎一样,英勇无畏。曹轶与曹婴交好,两人以姐妹相称。曹轶成年后继承祖父衣钵,接手精锐部队“虎豹骑”,成为新的虎豹骑的统领者。',
},
characterTitle:{
@ -14006,7 +14296,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dcjijiao_info:'限定技。出牌阶段,你可以令一名角色获得所有弃牌堆中你于本局游戏内使用或弃置过的普通锦囊牌,且这些牌不能被【无懈可击】响应。一名角色的回合结束后,若本回合牌堆洗过牌或有角色死亡,你重置〖继椒〗。',
duanqiaoxiao:'段巧笑',
dccaizhuang:'彩妆',
dccaizhuang_info:'出牌阶段限一次,你可以弃置任意张牌。然后若你手牌中的花色数小于你以此法弃置的牌数,你摸一张牌并重复此流程。',
dccaizhuang_info:'出牌阶段限一次,你可以弃置任意张牌。然后若你手牌中的花色数小于你以此法弃置的牌的花色数,你摸一张牌并重复此流程。',
dchuayi:'华衣',
dchuayi_info:'结束阶段,你可以判定,然后你获得如下效果直到你下回合开始时:红色,一名角色的回合结束时,你摸一张牌;黑色,当你受到伤害后,你摸两张牌。',
wu_zhugeliang:'武诸葛亮',
@ -14025,10 +14315,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dcjiudun:'酒遁',
dcjiudun_info:'①以你为目标的【酒】(使用方法①)的作用效果改为“目标对应的角色使用的下一张【杀】的伤害基数+1”。②当你成为其他角色使用黑色牌的目标后若你未处于【酒】状态你可以摸一张牌并视为使用一张【酒】处于【酒】状态你可以弃置一张手牌令此牌对你无效。',
ganfurenmifuren:'甘夫人糜夫人',
dcchanjuan:'双姝',
dcchanjuan_info:'每种牌名限两次。当你使用仅指定单一目标的【杀】或普通锦囊牌结算结束后,你可以视为使用一张名称和属性均相同的牌。若这两张牌指定的目标完全相同,你摸一张牌。',
dcchanjuan:'婵娟',
dcchanjuan_info:'每种牌名限两次。当你使用手牌中仅指定单一目标的【杀】或普通锦囊牌结算结束后,你可以视为使用一张名称和属性均相同的牌。若这两张牌指定的目标完全相同,你摸一张牌。',
dcxunbie:'殉别',
dcxunbie_info:'限定技。当你进入濒死状态时你可以将此武将牌替换为“甘夫人”或“糜夫人”不能选择已在场上的武将。然后回复至1点体力并防止所有伤害直到当前回合结束。',
dcxunbie_info:'限定技。当你进入濒死状态时你可以将此武将牌替换为“甘夫人”或“糜夫人”不能选择已在场上的武将。然后回复至1点体力并防止所有伤害直到你的下一个回合结束。',
dc_mifuren:'糜夫人',
dcguixiu:'闺秀',
dcguixiu_info:'锁定技。①回合开始时若你于本局游戏未发动过〖闺秀①〗你摸两张牌。②当你发动〖存嗣〗后你回复1点体力。',
@ -14146,6 +14436,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dczhangji_info:'锁定技一名角色使用多目标牌时若你是此牌的目标之一则你先结算此牌的效果然后你摸X张牌X为此牌的其他目标数。',
dczengou:'谮构',
dczengou_info:'出牌阶段限一次你可以将至多体力上限张牌称为“谮构”交给一名其他角色并摸等量张牌。若如此做其下次体力值增加或使用牌结算完毕后其展示所有手牌然后失去Y点体力Y为其手牌中的“谮构”牌数。',
bailingyun:'柏灵筠',
dclinghui:'灵慧',
dclinghui_info:'一名角色的结束阶段,若当前回合角色为你或本回合有角色进入过濒死状态,则你可以观看牌堆顶的三张牌,然后你可以使用其中一张牌并获得剩余牌。',
dcxiace:'黠策',
dcxiace_info:'每回合每项各限一次。当你造成/受到伤害后你可以弃置一张牌并回复1点体力/令一名其他角色的非锁定技于本回合失效。',
dcyuxin:'御心',
dcyuxin_info:'限定技一名角色进入濒死状态时你可以令其将体力回复至X点X为1若该角色不为你则X为你的体力值。',
zhugemengxue:'诸葛梦雪',
dcjichun:'寄春',
dcjichun_info:'出牌阶段限一次你可以展示一张手牌并选择一项①将此牌交给一名手牌数小于你的角色然后摸X张牌。②弃置此牌并弃置一名手牌数大于你的角色区域里至多X张牌。X为此牌牌名字数',
dchanying:'寒英',
dchanying_info:'准备阶段,你可以展示牌堆里的一张非赠物装备牌,然后令一名手牌数等于你的角色使用此牌。',
sp2_yinyu:'隐山之玉',
sp2_huben:'百战虎贲',

View File

@ -452,7 +452,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
skillAnimation:true,
animationColor:'gray',
marktext:"登",
content:function (){
"step 0"
player.awakenSkill('xinfu_denglou');

View File

@ -2228,7 +2228,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
case 2:{
var num=1.3;
if(event.card.name=='sha'&&event.targets.filter(function(current){
if(current.mayHaveShan(player,'use',current.getCards(i=>{
if(current.mayHaveShan(player,'use',current.getCards('h',i=>{
return i.hasGaintag('sha_notshan');
}))&&get.attitude(player,current)<=0){
if(current.hasSkillTag('useShan')) num=1.9;
@ -6750,6 +6750,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
xinxianzhen2:{
audio:'xianzhen',
audioname2:{
ol_gaoshun:'rexianzhen',
},
mod:{
targetInRange:function(card,player,target){
if(target==player.storage.xinxianzhen) return true;
@ -13912,7 +13915,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
xusheng:['xusheng','xin_xusheng','re_xusheng','old_xusheng'],
wuguotai:['wuguotai','xin_wuguotai','re_wuguotai'],
lingtong:['lingtong','xin_lingtong','ol_lingtong','re_lingtong','old_lingtong'],
gaoshun:['gaoshun','xin_gaoshun','re_gaoshun','old_gaoshun'],
gaoshun:['gaoshun','xin_gaoshun','ol_gaoshun','re_gaoshun','old_gaoshun'],
zhonghui:['zhonghui','xin_zhonghui','re_zhonghui','old_zhonghui','pe_zhonghui'],
wangyi:['wangyi','re_wangyi','old_wangyi'],
caozhang:['caozhang','ol_caozhang','re_caozhang','xin_caozhang'],

View File

@ -121,7 +121,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
forced:true,
content:function*(event,map){
var player=map.player,trigger=map.trigger;
if(!trigger.card||!trigger.cards.length){
if(!trigger.card||!trigger.cards||!trigger.cards.length){
trigger.num++;
event.finish();
return;
@ -273,12 +273,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
ai:{
order:function(item,player){
return 10;
},
order:10,
respondShan:true,
respondSha:true,
skillTagFilter:function(player,tag){
skillTagFilter:function(player,tag,arg){
if(arg=='respond') return false;
var hs=player.getCards('h');
if(hs.length!=Math.max(0,hs.length)) return false;
if(hs.length>1){

View File

@ -1,5 +1,5 @@
window.noname_asset_list=[
'v1.10.7',
'v1.10.7.1',
/*audio start*/
'audio/background/aozhan_chaoming.mp3',
'audio/background/aozhan_online.mp3',
@ -312,6 +312,7 @@ window.noname_asset_list=[
'audio/die/dc_zhangmancheng.mp3',
'audio/die/dc_zhaotongzhaoguang.mp3',
'audio/die/dc_zhaoyǎn.mp3',
'audio/die/dc_zhaoyun.mp3',
'audio/die/dc_zhouxuān.mp3',
'audio/die/dc_zhuling.mp3',
'audio/die/dengai.mp3',
@ -616,6 +617,7 @@ window.noname_asset_list=[
'audio/die/ol_huangzhong.mp3',
'audio/die/ol_huaxin.mp3',
'audio/die/ol_huban.mp3',
'audio/die/ol_hujinding.mp3',
'audio/die/ol_jiangwei.mp3',
'audio/die/ol_lisu.mp3',
'audio/die/ol_liuba.mp3',
@ -627,7 +629,9 @@ window.noname_asset_list=[
'audio/die/ol_pangtong.mp3',
'audio/die/ol_puyuan.mp3',
'audio/die/ol_qianzhao.mp3',
'audio/die/ol_sb_guanyu.mp3',
'audio/die/ol_sb_jiangwei.mp3',
'audio/die/ol_sb_taishici.mp3',
'audio/die/ol_sp_zhugeliang.mp3',
'audio/die/ol_sunjian.mp3',
'audio/die/ol_wangrong.mp3',
@ -846,6 +850,7 @@ window.noname_asset_list=[
'audio/die/sb_xiahoushi.mp3',
'audio/die/sb_xiaoqiao.mp3',
'audio/die/sb_xuhuang.mp3',
'audio/die/sb_xunyu.mp3',
'audio/die/sb_yl_luzhi.mp3',
'audio/die/sb_yuanshao.mp3',
'audio/die/sb_yujin.mp3',
@ -869,6 +874,7 @@ window.noname_asset_list=[
'audio/die/shen_huatuo.mp3',
'audio/die/shen_jiangwei.mp3',
'audio/die/shen_liubei.mp3',
'audio/die/shen_lusu.mp3',
'audio/die/shen_luxun.mp3',
'audio/die/shen_lvbu.mp3',
'audio/die/shen_lvbu1.mp3',
@ -960,6 +966,7 @@ window.noname_asset_list=[
'audio/die/st_yuanshu.mp3',
'audio/die/star_caoren.mp3',
'audio/die/star_dongzhuo.mp3',
'audio/die/star_yuanshao.mp3',
'audio/die/star_yuanshu.mp3',
'audio/die/sufei.mp3',
'audio/die/sunce.mp3',
@ -993,6 +1000,7 @@ window.noname_asset_list=[
'audio/die/tengfanglan.mp3',
'audio/die/tenggongzhu.mp3',
'audio/die/tengyin.mp3',
'audio/die/tianchou.mp3',
'audio/die/tianfeng.mp3',
'audio/die/tianshangyi.mp3',
'audio/die/tianyu.mp3',
@ -1217,6 +1225,7 @@ window.noname_asset_list=[
'audio/die/yuantanyuanshang.mp3',
'audio/die/yuantanyuanxiyuanshang.mp3',
'audio/die/yue_caiwenji.mp3',
'audio/die/yue_daqiao.mp3',
'audio/die/yue_xiaoqiao.mp3',
'audio/die/yue_zhoufei.mp3',
'audio/die/yuechen.mp3',
@ -1947,6 +1956,8 @@ window.noname_asset_list=[
'audio/skill/dcjizhong2.mp3',
'audio/skill/dcjue1.mp3',
'audio/skill/dcjue2.mp3',
'audio/skill/dcjuejing1.mp3',
'audio/skill/dcjuejing2.mp3',
'audio/skill/dcjuying1.mp3',
'audio/skill/dcjuying2.mp3',
'audio/skill/dckaiji1.mp3',
@ -1981,6 +1992,8 @@ window.noname_asset_list=[
'audio/skill/dcliying2.mp3',
'audio/skill/dclonggong1.mp3',
'audio/skill/dclonggong2.mp3',
'audio/skill/dclonghun1.mp3',
'audio/skill/dclonghun2.mp3',
'audio/skill/dclongsong1.mp3',
'audio/skill/dclongsong2.mp3',
'audio/skill/dcluochong1.mp3',
@ -2053,6 +2066,8 @@ window.noname_asset_list=[
'audio/skill/dcqinshen2.mp3',
'audio/skill/dcqiongying1.mp3',
'audio/skill/dcqiongying2.mp3',
'audio/skill/dcqiqin_yue_daqiao1.mp3',
'audio/skill/dcqiqin_yue_daqiao2.mp3',
'audio/skill/dcqiqin1.mp3',
'audio/skill/dcqiqin2.mp3',
'audio/skill/dcquanjian1.mp3',
@ -2257,6 +2272,8 @@ window.noname_asset_list=[
'audio/skill/dczigu1.mp3',
'audio/skill/dczigu2.mp3',
'audio/skill/dczimu1.mp3',
'audio/skill/dczixi1.mp3',
'audio/skill/dczixi2.mp3',
'audio/skill/dczuojian1.mp3',
'audio/skill/dczuojian2.mp3',
'audio/skill/dczuowei1.mp3',
@ -2316,6 +2333,8 @@ window.noname_asset_list=[
'audio/skill/dingpan2.mp3',
'audio/skill/dingpin1.mp3',
'audio/skill/dingpin2.mp3',
'audio/skill/dingzhou1.mp3',
'audio/skill/dingzhou2.mp3',
'audio/skill/disordersidi1.mp3',
'audio/skill/disordersidi2.mp3',
'audio/skill/donggui1.mp3',
@ -3072,6 +3091,10 @@ window.noname_asset_list=[
'audio/skill/juesi2.mp3',
'audio/skill/juetao1.mp3',
'audio/skill/juetao2.mp3',
'audio/skill/juexiang_he1.mp3',
'audio/skill/juexiang_ji1.mp3',
'audio/skill/juexiang_lie1.mp3',
'audio/skill/juexiang_rou1.mp3',
'audio/skill/juexiang1.mp3',
'audio/skill/juexiang2.mp3',
'audio/skill/jueyong1.mp3',
@ -3539,6 +3562,8 @@ window.noname_asset_list=[
'audio/skill/olchenglie2.mp3',
'audio/skill/olchenshuo1.mp3',
'audio/skill/olchenshuo2.mp3',
'audio/skill/olchongshen1.mp3',
'audio/skill/olchongshen2.mp3',
'audio/skill/olchuanwu1.mp3',
'audio/skill/olchuanwu2.mp3',
'audio/skill/olchuming1.mp3',
@ -3651,16 +3676,32 @@ window.noname_asset_list=[
'audio/skill/olqiejian2.mp3',
'audio/skill/olqingyi1.mp3',
'audio/skill/olqingyi2.mp3',
'audio/skill/olqingyuan1.mp3',
'audio/skill/olqingyuan2.mp3',
'audio/skill/olqisi1.mp3',
'audio/skill/olqisi2.mp3',
'audio/skill/olruoyu1.mp3',
'audio/skill/olruoyu2.mp3',
'audio/skill/olsaogu1.mp3',
'audio/skill/olsaogu2.mp3',
'audio/skill/olsbdouchan1.mp3',
'audio/skill/olsbdouchan2.mp3',
'audio/skill/olsbdulie1.mp3',
'audio/skill/olsbdulie2.mp3',
'audio/skill/olsbduoshou1.mp3',
'audio/skill/olsbduoshou2.mp3',
'audio/skill/olsbfumeng1.mp3',
'audio/skill/olsbfumeng2.mp3',
'audio/skill/olsbguidao1.mp3',
'audio/skill/olsbguidao2.mp3',
'audio/skill/olsbranji1.mp3',
'audio/skill/olsbranji2.mp3',
'audio/skill/olsbweilin1.mp3',
'audio/skill/olsbweilin2.mp3',
'audio/skill/olsbzhuri1.mp3',
'audio/skill/olsbzhuri2.mp3',
'audio/skill/olshandao1.mp3',
'audio/skill/olshandao2.mp3',
'audio/skill/olshengong1.mp3',
'audio/skill/olshengong2.mp3',
'audio/skill/olshilu1.mp3',
@ -4365,6 +4406,8 @@ window.noname_asset_list=[
'audio/skill/sbjiang2.mp3',
'audio/skill/sbjianxiong1.mp3',
'audio/skill/sbjianxiong2.mp3',
'audio/skill/sbjieming1.mp3',
'audio/skill/sbjieming2.mp3',
'audio/skill/sbjiewei1.mp3',
'audio/skill/sbjiewei2.mp3',
'audio/skill/sbjieyin1.mp3',
@ -4431,6 +4474,8 @@ window.noname_asset_list=[
'audio/skill/sbqingzheng2.mp3',
'audio/skill/sbqixi1.mp3',
'audio/skill/sbqixi2.mp3',
'audio/skill/sbquhu1.mp3',
'audio/skill/sbquhu2.mp3',
'audio/skill/sbrende1.mp3',
'audio/skill/sbrende2.mp3',
'audio/skill/sbrende3.mp3',
@ -4813,10 +4858,14 @@ window.noname_asset_list=[
'audio/skill/spzhuilie2.mp3',
'audio/skill/spzundi1.mp3',
'audio/skill/spzundi2.mp3',
'audio/skill/staraoshi1.mp3',
'audio/skill/staraoshi2.mp3',
'audio/skill/starcanxi1.mp3',
'audio/skill/starcanxi2.mp3',
'audio/skill/starhaoshou1.mp3',
'audio/skill/starhaoshou2.mp3',
'audio/skill/starjiaowang1.mp3',
'audio/skill/starjiaowang2.mp3',
'audio/skill/starlifeng1.mp3',
'audio/skill/starlifeng2.mp3',
'audio/skill/starpizhi1.mp3',
@ -4825,10 +4874,14 @@ window.noname_asset_list=[
'audio/skill/starsujun2.mp3',
'audio/skill/starweilin1.mp3',
'audio/skill/starweilin2.mp3',
'audio/skill/starxiaoyan1.mp3',
'audio/skill/starxiaoyan2.mp3',
'audio/skill/starzhangrong1.mp3',
'audio/skill/starzhangrong2.mp3',
'audio/skill/starzhonggu1.mp3',
'audio/skill/starzhonggu2.mp3',
'audio/skill/starzongshi1.mp3',
'audio/skill/starzongshi2.mp3',
'audio/skill/stianyi1.mp3',
'audio/skill/stianyi2.mp3',
'audio/skill/suishi1.mp3',
@ -4847,6 +4900,8 @@ window.noname_asset_list=[
'audio/skill/syxiongyi2.mp3',
'audio/skill/tairan1.mp3',
'audio/skill/tairan2.mp3',
'audio/skill/tamo1.mp3',
'audio/skill/tamo2.mp3',
'audio/skill/taoluan1.mp3',
'audio/skill/taoluan2.mp3',
'audio/skill/taomie1.mp3',
@ -6060,6 +6115,8 @@ window.noname_asset_list=[
'audio/skill/zhiman_re_masu2.mp3',
'audio/skill/zhiman1.mp3',
'audio/skill/zhiman2.mp3',
'audio/skill/zhimeng1.mp3',
'audio/skill/zhimeng2.mp3',
'audio/skill/zhiming1.mp3',
'audio/skill/zhiming2.mp3',
'audio/skill/zhiren1.mp3',
@ -6873,6 +6930,7 @@ window.noname_asset_list=[
'image/character/dc_jikang.jpg',
'image/character/dc_jiling.jpg',
'image/character/dc_jsp_guanyu.jpg',
'image/character/dc_kongrong.jpg',
'image/character/dc_liru.jpg',
'image/character/dc_liuba.jpg',
'image/character/dc_liubei.jpg',
@ -6909,6 +6967,7 @@ window.noname_asset_list=[
'image/character/dc_zhaotongzhaoguang.jpg',
'image/character/dc_zhaoxiang.jpg',
'image/character/dc_zhaoyǎn.jpg',
'image/character/dc_zhaoyun.jpg',
'image/character/dc_zhouxuān.jpg',
'image/character/dc_zhuling.jpg',
'image/character/ddd_baosanniang.jpg',
@ -7696,11 +7755,13 @@ window.noname_asset_list=[
'image/character/ol_dongzhuo.jpg',
'image/character/ol_feiyi.jpg',
'image/character/ol_furong.jpg',
'image/character/ol_gaoshun.jpg',
'image/character/ol_guohuai.jpg',
'image/character/ol_huangzhong.jpg',
'image/character/ol_huaxin.jpg',
'image/character/ol_huaxiong.jpg',
'image/character/ol_huban.jpg',
'image/character/ol_hujinding.jpg',
'image/character/ol_jiangwei.jpg',
'image/character/ol_jianyong.jpg',
'image/character/ol_lingtong.jpg',
@ -7720,6 +7781,7 @@ window.noname_asset_list=[
'image/character/ol_qianzhao.jpg',
'image/character/ol_sb_guanyu.jpg',
'image/character/ol_sb_jiangwei.jpg',
'image/character/ol_sb_taishici.jpg',
'image/character/ol_sp_zhugeliang.jpg',
'image/character/ol_sunjian.jpg',
'image/character/ol_wanglang.jpg',
@ -7920,6 +7982,7 @@ window.noname_asset_list=[
'image/character/re_caocao.jpg',
'image/character/re_caochong.jpg',
'image/character/re_caopi.jpg',
'image/character/re_caorui.jpg',
'image/character/re_caoxiu.jpg',
'image/character/re_caozhang.jpg',
'image/character/re_caozhen.jpg',
@ -8249,6 +8312,7 @@ window.noname_asset_list=[
'image/character/sp_zongyu.jpg',
'image/character/star_caoren.jpg',
'image/character/star_dongzhuo.jpg',
'image/character/star_yuanshao.jpg',
'image/character/star_yuanshu.jpg',
'image/character/std_panfeng.jpg',
'image/character/sunce.jpg',
@ -8367,6 +8431,7 @@ window.noname_asset_list=[
'image/character/tengfanglan.jpg',
'image/character/tenggongzhu.jpg',
'image/character/tengyin.jpg',
'image/character/tianchou.jpg',
'image/character/tianfeng.jpg',
'image/character/tianshangyi.jpg',
'image/character/tianyu.jpg',
@ -8616,6 +8681,7 @@ window.noname_asset_list=[
'image/character/yanpu.jpg',
'image/character/yanrou.jpg',
'image/character/yanwen.jpg',
'image/character/yanxiang.jpg',
'image/character/yanyan.jpg',
'image/character/yeshiwen.jpg',
'image/character/yinfuren.jpg',
@ -8647,6 +8713,7 @@ window.noname_asset_list=[
'image/character/yuantanyuanshang.jpg',
'image/character/yuantanyuanxiyuanshang.jpg',
'image/character/yue_caiwenji.jpg',
'image/character/yue_daqiao.jpg',
'image/character/yue_xiaoqiao.jpg',
'image/character/yue_zhoufei.jpg',
'image/character/yuechen.jpg',
@ -8770,6 +8837,7 @@ window.noname_asset_list=[
'image/character/zhugejin.jpg',
'image/character/zhugeke.jpg',
'image/character/zhugeliang.jpg',
'image/character/zhugemengxue.jpg',
'image/character/zhugeruoxue.jpg',
'image/character/zhugeshang.jpg',
'image/character/zhugezhan.jpg',

View File

@ -1,24 +1,5 @@
/*
const module = import('../noname.js');
module.then(({ ai, game, get, lib, _status, ui, boot }) => {
const coreAndVersion = get.coreInfo();
const core = coreAndVersion[0], version = coreAndVersion[1];
if (core === 'chrome' && !isNaN(version) && version < 77) {
const tip = '检测到您的浏览器内核版本小于77请及时升级浏览器或手机webview内核';
console.warn(tip);
game.print(tip);
const redirect_tip = '您使用的浏览器或无名杀客户端内核版本过低,将在未来的版本被废弃!\n点击“确认”以前往GitHub下载最新版无名杀客户端可能需要科学上网。';
if (confirm(redirect_tip)) {
window.open('https://github.com/libccy/noname/releases/tag/chromium77-client');
}
}
boot().then(lib.other.ignore);
});
*/
import { game, get, lib, boot } from "../noname.js";
// import { canUseHttpProtocol } from "../noname/init/index.js";
import { canUseHttpProtocol, sendUpdate } from "../noname/init/index.js";
import { userAgent } from "../noname/util/index.js";
const coreAndVersion = get.coreInfo();
@ -33,21 +14,125 @@ if (core === 'chrome' && !isNaN(version) && version < 77) {
}
}
// 判断是否从file协议切换到http/s协议
// if (canUseHttpProtocol()) {
/*
升级方法一:
1. 导出数据然后以http/s协议重启
2. 以http/s协议导入数据
3. 保存http/s协议的状态以后不再以file协议启动
升级方法二:
1. app默认以http/s协议启动发现没有数据后以file协议重启
2. 以file协议导出数据
3. 以http/s协议重启导入数据
*/
// 导出数据到根目录的noname.config.txt
// 成功导入后应删除noname.config.txt
// } else {
boot().then(lib.other.ignore);
// }
boot().then(() => {
// 判断是否从file协议切换到http/s协议
if (canUseHttpProtocol()) {
/*
升级方法:
1. 游戏启动后导出数据然后以http/s协议重启
2. 以http/s协议导入数据
3. 保存http/s协议的状态以后不再以file协议启动
*/
// 导出数据到根目录的noname.config.txt
let data;
let export_data = function (data) {
game.promises.writeFile(lib.init.encode(JSON.stringify(data)), './', 'noname.config.txt')
.then(saveProtocol)
.catch(e => {
console.error('升级失败:', e);
});
};
// @ts-ignore
if (!lib.db) {
data = {};
for (let i in localStorage) {
if (i.startsWith(lib.configprefix)) {
data[i] = localStorage[i];
}
}
export_data(data);
}
else {
game.getDB('config', null, function (data1) {
game.getDB('data', null, function (data2) {
export_data({
config: data1,
data: data2
});
});
});
}
// 保存协议的切换状态
function saveProtocol() {
const url = sendUpdate();
if (typeof url == 'string') {
if (typeof window.require == 'function' && typeof window.process == 'object') {
// @ts-ignore
const remote = require('@electron/remote');
const thisWindow = remote.getCurrentWindow();
thisWindow.loadURL(url);
} else {
setTimeout(() => {
location.href = url;
}, 1000);
}
}
}
} else {
// 成功导入后删除noname.config.txt
let searchParams = new URLSearchParams(location.search);
for (let [key, value] of searchParams) {
if (key === 'sendUpdate' && value === 'true') {
game.promises.readFileAsText('noname.config.txt').then(data => {
return /** @type {Promise<void>} */(new Promise(async (resolve, reject) => {
if (!data) return reject('!data');
try {
data = JSON.parse(lib.init.decode(data));
if (!data || typeof data != 'object') {
throw ('err');
}
// @ts-ignore
if (lib.db && (!data.config || !data.data)) {
throw ('err');
}
}
catch (e) {
console.log(e);
if (e == 'err') {
alert('导入文件格式不正确');
reject('导入文件格式不正确');
} else {
alert('导入失败: ' + e.message);
reject('导入失败: ' + e.message);
}
return;
}
alert('导入成功, 即将自动重启');
// @ts-ignore
if (!lib.db) {
const noname_inited = localStorage.getItem('noname_inited');
const onlineKey = localStorage.getItem(lib.configprefix + 'key');
localStorage.clear();
if (noname_inited) {
localStorage.setItem('noname_inited', noname_inited);
}
if (onlineKey) {
localStorage.setItem(lib.configprefix + 'key', onlineKey);
}
for (let i in data) {
localStorage.setItem(i, data[i]);
}
}
else {
for (let i in data.config) {
await game.putDB('config', i, data.config[i]);
lib.config[i] = data.config[i];
}
for (let i in data.data) {
await game.putDB('data', i, data.data[i]);
}
}
lib.init.background();
resolve();
}));
}).then(() => {
return game.promises.removeFile('noname.config.txt');
}).then(() => {
const url = new URL(location.href);
location.href = url.origin + url.pathname;
});
}
}
}
});

View File

@ -86,6 +86,79 @@ new Promise(resolve => {
exit()
}
else {
// node环境下
if (typeof window.require == 'function' &&
typeof window.process == 'object' &&
typeof window.__dirname == 'string') {
// 在http环境下修改__dirname和require的逻辑
if (location.protocol.startsWith('http') &&
window.__dirname.endsWith('electron.asar\\renderer')) {
const path = require('path');
window.__dirname = path.join(path.resolve(), 'resources/app');
const oldData = Object.entries(window.require);
// @ts-ignore
window.require = function (moduleId) {
try {
return module.require(moduleId);
} catch {
return module.require(path.join(window.__dirname, moduleId));
}
};
oldData.forEach(([key, value]) => {
window.require[key] = value;
});
}
// 增加导入ts的逻辑
window.require.extensions['.ts'] = function (module, filename) {
// @ts-ignore
const _compile = module._compile;
// @ts-ignore
module._compile = function (code, fileName) {
/**
* @type { import('typescript') }
*/
// @ts-ignore
const ts = require('./game/typescript.js');
// 使用ts compiler对ts文件进行编译
const result = ts.transpile(code, {
module: ts.ModuleKind.CommonJS,
target: ts.ScriptTarget.ES2019,
inlineSourceMap: true,
resolveJsonModule: true,
esModuleInterop: true,
}, fileName);
// 使用默认的js编译函数获取返回值
return _compile.call(this, result, fileName);
}
// @ts-ignore
module._compile(require('fs').readFileSync(filename, 'utf8'), filename);
};
}
if (location.protocol.startsWith('http') && 'serviceWorker' in navigator) {
let scope = window.location.protocol + '//' + window.location.host + '/';
navigator.serviceWorker.getRegistrations().then(registrations => {
let findServiceWorker = false;
for (let registration of registrations) {
if (registration && registration.active && registration.active.scriptURL == `${scope}service-worker.js`) {
findServiceWorker = true;
}
}
navigator.serviceWorker.register(`${scope}service-worker.js`, {
updateViaCache: "all",
scope,
}).then(registration => {
// 初次加载worker需要重新启动一次
if (!findServiceWorker) location.reload();
navigator.serviceWorker.addEventListener('message', e => {
console.log(e);
});
registration.update();
// console.log(`set scope: ${scope}, service worker instance:`, registration);
}).catch(e => {
console.log('serviceWorker加载失败: ', e);
});
});
}
const script = document.createElement('script')
script.type = "module";
script.src = `${assetURL}game/entry.js`;

View File

@ -12,7 +12,7 @@ window.noname_package={
huicui:'群英荟萃',
xianding:'限定专属',
sp2:'系列专属',
extra:'神将',
extra:'神将',
mobile:'移动版',
shiji:'始计篇',
sb:'谋攻篇',

View File

@ -36,6 +36,7 @@ var pinyin_dict_polyphone = {
"赵累": " lèi",
"夏侯令女": " hóu lìng nǚ",
"马日磾": " mì dī",
"史阿": " ē",
"凯撒": " sà",
@ -60,10 +61,12 @@ var pinyin_dict_polyphone = {
"安卡": " kǎ",
"卡玛": "kǎ ",
"梼杌": "táo ",
"亚煞极": " shà ",
"库特莉亚芙卡": " kǎ",
"露娜": "lù ",
// 技能名
"重身": "chóng ",
"畜鸣": "chù ",
"聆乐": " yuè",
"没矢": "mò ",
@ -119,6 +122,7 @@ var pinyin_dict_polyphone = {
"辟撰": "pì ",
"辟境": "pì ",
"斗阵": "dòu ",
"斗缠": "dòu ",
"冯河": "píng ",
"势吓": " hè",
"虚吓": " hè",
@ -157,6 +161,8 @@ var pinyin_dict_polyphone = {
"血殇": "xuè ",
"血池": "xuè ",
"越行": " xíng",
"侠行": " xíng",
"枭行": " xíng",
"劫行": " xíng",
"割发": " fà",
"落梅": "luò ",
@ -170,6 +176,10 @@ var pinyin_dict_polyphone = {
"沾露": " lù",
"禁咒": "jìn ",
"挟令": "xié lìng",
"七煞": " shà",
"冥煞": " shà",
"虎煞": " shà",
"煞魂": "shà ",
// END
"撒贝宁": "sà ",
"卡比": "kǎ ",

View File

@ -1,6 +1,7 @@
window.noname_source_list=[
'LICENSE',
'noname.js',
'service-worker.js',
'noname/ai/basic.js',
'noname/ai/index.js',

172282
game/typescript.js Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,15 +1,19 @@
window.noname_update={
version:'1.10.7',
update:'1.10.6.2',
version:'1.10.7.1',
update:'1.10.7',
changeLog:[
'整合@PZ157 @nonameShijian @universe-st @mengxinzxz @copcap @Tipx-L 的Pull Request',
'整合@PZ157 @nonameShijian @copcap @mengxinzxz @lieren2023 @kuangshen04 @universe-st 的Pull Request',
'OL族吴乔、谋关羽手杀谋荀彧海外服侠关羽、石韬、史阿、玉真子',
'其他AI优化与bug修复',
],
files:[
'card/guozhan.js',
'card/standard.js',
'card/yongjian.js',
'character/clan.js',
'character/collab.js',
'character/ddd.js',
'character/diy.js',
'character/extra.js',
'character/gujian.js',
@ -24,35 +28,56 @@ window.noname_update={
'character/refresh.js',
'character/sb.js',
'character/shenhua.js',
'character/shiji.js',
'character/sp.js',
'character/sp2.js',
'character/standard.js',
'character/tw.js',
'character/xianding.js',
'character/xinghuoliaoyuan.js',
'character/yijiang.js',
'character/yingbian.js',
'game/entry.js',
'game/game.js',
'game/pinyinjs.js',
'mode/doudizhu.js',
'mode/guozhan.js',
'mode/identity.js',
'mode/versus.js',
'noname/ai/basic.js',
'noname/game/index.js',
'noname/game/promises.js',
'noname/get/index.js',
'noname/init/import.js',
'noname/init/index.js',
'noname/init/polyfill.js',
'noname/library/index.js',
'noname/library/update-urls.js',
'noname/library/cache/cacheContext.js',
'noname/library/cache/childNodesWatcher.js',
'noname/library/crypt/md5.js',
'noname/library/element/button.js',
'noname/library/element/card.js',
'noname/library/element/content.js',
'noname/library/element/contents.js',
'noname/library/element/control.js',
'noname/library/element/dialog.js',
'noname/library/element/gameEvent.js',
'noname/library/element/gameEventPromise.js',
'noname/library/element/player.js',
'noname/library/element/vcard.js',
'noname/library/init/index.js',
'noname/ui/index.js',
'noname/util/index.js',
'service-worker.js',
]
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Some files were not shown because too many files have changed in this diff Show More