Merge branch 'PR-Branch' into PR-Suggest-AddGroup-With-Hook

This commit is contained in:
Rintim 2023-09-07 18:35:49 +08:00
commit 1e0e18764c
7 changed files with 187 additions and 109 deletions

View File

@ -293,7 +293,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var info=get.info(skill);
if(info.charlotte) return false;
var translation=get.skillInfoTranslation(skill,event.player);
if(!translation||translation.match(/“?出牌阶段限一次/g).every(value=>value!='出牌阶段限一次')) return false;
if(!translation) return false;
var match=translation.match(/“?出牌阶段限一次/g);
if(!match||match.every(value=>value!='出牌阶段限一次')) return false;
return event.player.countCards('h')>0;
},
check:function(event,player){

View File

@ -4019,13 +4019,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
jsrglinghua:{
audio:2,
locked:false,
mod:{
judge:(player,result)=>{
const parent=_status.event.getParent(2);
if(parent.name=='jsrglinghua'&&parent.triggername=='phaseJieshuBegin') result.bool=!result.bool;
}
},
trigger:{
player:['phaseZhunbeiBegin','phaseJieshuBegin'],
},
@ -4048,7 +4041,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
content:function(){
'step 0'
event.executeDelayCardEffect=player.executeDelayCardEffect('shandian');
var next=event.executeDelayCardEffect=player.executeDelayCardEffect('shandian');
if(event.triggername!='phaseJieshuBegin') return;
next.judge=card=>-lib.card.shandian.judge(card)-4;
next.judge2=result=>!lib.card.shandian.judge2(result);
'step 1'
var executeDelayCardEffect=event.executeDelayCardEffect;
if(!player.hasHistory('damage',evt=>evt.getParent(2)==executeDelayCardEffect)){

View File

@ -2102,7 +2102,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
intro:{
content:function(storage,player){
var targets=storage.filter(i=>i.isIn());
return '被'+get.translation(targets)+'吓到了,对他'+(targets.length>1?'们':'')+(get.mode()=='identity'?'的友方角色':'')+'打不出伤害';
return '被'+get.translation(targets)+'吓到了,对他'+(targets.length>1?'们':'')+(get.mode()!='identity'?'和他的友方角色':'')+'打不出伤害';
},
},
ai:{

View File

@ -53,10 +53,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sbqiaobian:{
audio:2,
trigger:{player:['phaseJudgeBefore','phaseDrawBefore','phaseUseBefore']},
filter:function(event,player){
if(event.name=='phaseJudge') return player.countCards('j');
return event.name!='phaseUse'||player.countCards('h')>6;
},
usable:1,
direct:true,
content:function(){
@ -90,7 +86,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
break;
case 'phaseUse':
var num=(player.countCards('h')-6);
player.chooseToDiscard(get.prompt('sbqiaobian'),num,'弃置'+get.cnNumber(num)+'张手牌并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌').set('ai',function(card){
if(num<=0) player.chooseBool(get.prompt('sbqiaobian'),'跳过出牌阶段和弃牌阶段,然后移动场上的一张牌').set('choice',player.canMoveCard(true)).setHiddenSkill('sbqiaobian');
else player.chooseToDiscard(get.prompt('sbqiaobian'),num,'弃置'+get.cnNumber(num)+'张手牌并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌').set('ai',function(card){
var player=_status.event.player;
if(!player.canMoveCard(true)||player.countCards('hs',card=>player.hasValueTarget(card))>=9) return 0;
return 7-get.value(card);
@ -121,6 +118,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.addSkill('sbqiaobian_draw');
break;
case 'phaseUse':
if(!result.cards||!result.cards.length) player.logSkill('sbqiaobian',target);
player.skip('phaseDiscard');
game.log(player,'跳过了出牌阶段');
game.log(player,'跳过了弃牌阶段');
@ -299,7 +297,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
trigger:{player:'useCardToPlayered'},
filter:function(event,player){
return event.targets.length==1&&event.card.name=='sha'&&!player.hasSkillTag('noCompareSource')&&event.target!=player&&event.target.countCards('h')>0&&!event.target.hasSkillTag('noCompareTarget');
return event.targets.length==1&&event.card.name=='sha'&&player.canCompare(event.target);
},
check:function(event,player){
return get.attitude(player,event.target)<0||game.hasPlayer(current=>{
@ -310,10 +308,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
logTarget:'target',
content:function(){
'step 0'
player.draw();
'step 1'
if(player.canCompare(trigger.target)) player.chooseToCompare(trigger.target);
'step 2'
'step 1'
if(result.bool){
player.addTempSkill('sblieren_damage');
if(!trigger.card.storage) trigger.card.storage={};
@ -322,6 +318,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
subSkill:{
damage:{
audio:'sblieren',
trigger:{global:'useCardAfter'},
filter:function(event,player){
return event.card.name=='sha'&&event.card.storage&&event.card.storage.sblieren&&event.card.storage.sblieren[0]==player&&game.hasPlayer(current=>{
@ -360,17 +357,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
content:function(){
'step 0'
if(!_status.sbjuxiang_nanman){
_status.sbjuxiang_nanman=[];
var numbers=[7,9,11,13],suits=['spade','club'];
for(var num of numbers){
for(var suit of suits){
_status.sbjuxiang_nanman.push({name:'nanman',number:num,suit:suit});
}
}
_status.sbjuxiang_nanman=[
{name:'nanman',number:7,suit:'spade'},
{name:'nanman',number:13,suit:'spade'},
{name:'nanman',number:7,suit:'club'},
];
game.broadcastAll(function(){
if(!lib.inpile.contains('nanman')){
lib.inpile.add('nanman');
}
if(!lib.inpile.contains('nanman')) lib.inpile.add('nanman');
});
}
player.chooseTarget(get.prompt('sbjuxiang'),'将游戏外的随机一张【南蛮入侵】交给一名角色(剩余'+get.cnNumber(_status.sbjuxiang_nanman.length)+'张)').set('ai',target=>{
@ -544,7 +537,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 1'
player.changeHujia(1,null,true);
'step 2'
player.draw(2);
player.draw(3);
'step 3'
player.addSkillLog('sbyingzi');
player.addSkillLog('gzyinghun');
@ -558,8 +551,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){
effect:{
target:function(card,player,target){
if(!target.hasFriend()||target.hp>1) return;
if(get.tag(card,'damage')==1&&(target.hasZhuSkill('sbzhiba')||player.countCards('hs','tao')+target.countCards('hs',['tao','jiu'])>0)&&
!target.isTurnedOver()&&_status.currentPhase!=target&&get.distance(_status.currentPhase,target,'absolute')<=3) return [0.5,1];
if(get.tag(card,'damage')==1&&((target.hasZhuSkill('sbzhiba')&&game.countPlayer(current=>current!=target&&current.group=='wu'))||player.countCards('hs',function(card){
var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player);
if(mod2!='unchanged') return mod2;
var mod=game.checkMod(card,player,target,'unchanged','cardSavable',player);
if(mod!='unchanged') return mod;
var savable=get.info(card).savable;
if(typeof savable=='function') savable=savable(card,player,target);
return savable;
})+target.countCards('hs',function(card){
var mod2=game.checkMod(card,target,'unchanged','cardEnabled2',target);
if(mod2!='unchanged') return mod2;
var mod=game.checkMod(card,target,target,'unchanged','cardSavable',target);
if(mod!='unchanged') return mod;
var savable=get.info(card).savable;
if(typeof savable=='function') savable=savable(card,target,target);
return savable;
})>0)&&!target.isTurnedOver()&&_status.currentPhase!=target&&get.distance(_status.currentPhase,target,'absolute')<=3) return [0.5,1];
}
}
}
@ -585,7 +593,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
event.targets=game.filterPlayer(current=>{
return current.group=='wu'&&current!=player;
}).sortBySeat(_status.currentPhase);
var num=event.targets.length+1;
var num=event.targets.length;
if(num>0) player.recover(num);
player.addMark('sbjiang',1,false);
player.addTempSkill('sbzhiba_draw');
@ -645,8 +653,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.useCard({name:'lebu'},target,cards).audio=false;
}
'step 1'
player.draw(2);
player.chooseToDiscard(true,'he','国色:请弃置一张牌');
player.draw();
},
ai:{
result:{
@ -809,7 +816,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger:{player:'phaseJieshuBegin'},
forced:true,
content:function(){
player.draw(Math.min(5,game.countPlayer2(current=>{
player.draw(Math.min(4,game.countPlayer2(current=>{
return current.getHistory('damage').length>0;
})+1));
}
@ -959,7 +966,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
filter:function(event,player){
if(event.name=='chooseToUse') return player.countCards('hs')>1&&!player.hasSkill('sbluanji_used');
var evt=event.getParent(2);
return evt.name=='wanjian'&&evt.getParent().player==player&&event.player!=player;
return evt.name=='wanjian'&&evt.getParent().player==player&&event.player!=player&&player.getHistory('gain',function(evt){
return evt.getParent(2).name=='sbluanji';
}).length<3;
},
filterCard:true,
selectCard:2,
@ -1010,6 +1019,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
zhuSkill:true,
forced:true,
usable:2,
logTarget:'target',
content:function(){
player.draw();
@ -1205,9 +1215,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.awakenSkill('sbniepan');
player.discard(player.getCards('hej'));
'step 1'
player.draw(3);
player.draw(2);
'step 2'
if(player.hp<3) player.recover(3-player.hp);
if(player.hp<2) player.recover(2-player.hp);
'step 3'
player.turnOver(false);
'step 4'
@ -1394,8 +1404,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(num>=3){
var cards=player.getCards('he');
if(!cards.length) event._result={bool:false};
else if(cards.length<=2) event._result={bool:true,cards:cards};
else player.chooseCard('恩怨:交给'+get.translation(target)+'两张牌',true,2,'he');
else if(cards.length<=3) event._result={bool:true,cards:cards};
else player.chooseCard('恩怨:交给'+get.translation(target)+'三张牌',true,3,'he');
}
else{
target.loseHp();
@ -2045,7 +2055,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
mark:{charlotte:true},
draw:{
charlotte:true,
trigger:{player:['useCardAfter','respondAfter']},
trigger:{player:['useCardAfter']},
forced:true,
popup:false,
filter:function(event,player){
@ -2519,9 +2529,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
event.goto(1);
}
'step 5'
if(target.countDiscardableCards(player,'hej')){
if(event.num>0&&target.countDiscardableCards(player,'hej')){
player.line(target);
player.discardPlayerCard(target,event.num+1,true,'hej');
player.discardPlayerCard(target,event.num,true,'hej');
}
},
ai:{
@ -4570,8 +4580,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return '①出牌阶段' + (player.storage.sbkeji ? '' :'各') + '限一次。你可以选择一项1.弃置一张手牌然后获得1点护甲2.失去1点体力然后获得2点护甲。②你的手牌上限+XX为你的护甲数。③若你不为正在结算濒死流程的角色你不能使用【桃】。';
},
sblongdan:function(player){
if(player.hasSkill('sblongdan_mark',null,null,false)) return '蓄力技1/3。①你可以消耗1点蓄力值将一张基本牌当做任意基本牌使用或打出然后摸一张牌。②一名角色的回合结束时你获得1点蓄力值。';
return '蓄力技1/3。①你可以消耗1点蓄力值将【杀】当做【闪】或将【闪】当做【杀】使用或打出然后摸一张牌。②一名角色的回合结束时你获得1点蓄力值。';
if(player.hasSkill('sblongdan_mark',null,null,false)) return '蓄力技1/3。①你可以消耗1点蓄力值将一张基本牌当做任意基本牌使用或打出然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时你获得1点蓄力值。';
return '蓄力技1/3。①你可以消耗1点蓄力值将【杀】当做【闪】或将【闪】当做【杀】使用或打出然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时你获得1点蓄力值。';
},
sblianhuan:function(player){
var str='①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。';
@ -4587,12 +4597,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
},
translate:{
sp_yangwan:'手杀杨婉',
sp_yangwan:'杨婉',
spmingxuan:'瞑昡',
spmingxuan_info:'锁定技。出牌阶段开始时你须选择至多X张花色各不相同的手牌X为未选择过选项一的角色将这些牌随机交给这些角色中的等量角色。然后这些角色依次选择一项⒈对你使用一张【杀】。⒉交给你一张牌然后你摸一张牌。',
spxianchou:'陷仇',
spxianchou_info:'当你受到有来源的伤害后你可选择一名不为伤害来源的其他角色。该角色可以弃置一张牌然后视为对伤害来源使用一张【杀】无距离限制。若其因此【杀】造成了伤害则其摸一张牌你回复1点体力。',
liucheng:'刘赪',
liucheng:'刘赪',
splveying:'掠影',
splveying_info:'锁定技。①每回合限两次当你使用【杀】指定目标后你获得一个“椎”。②当你使用的【杀】结算结束后若你的“椎”数大于1则你弃置两个“椎”并摸一张牌然后可以视为使用一张【过河拆桥】。',
spyingwu:'莺舞',
@ -4668,7 +4678,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sbluoshen_info:'准备阶段你可以选择一名角色。从其开始按逆时针方向的X名其他角色依次执行X为角色数的一半向上取整展示一张手牌若此牌为黑色你获得之且此牌不计入本回合手牌上限若此牌为红色其弃置之。',
sb_ganning:'谋甘宁',
sbqixi:'奇袭',
sbqixi_info:'出牌阶段限一次。若你有手牌你可以令一名其他角色猜测你手牌中最多的花色。若其猜对你展示所有手牌若其猜错你可令其从其未选择过的花色中再次猜测重复此流程。然后你弃置其区域内的X张牌X为其于本次〖奇袭〗中猜错的次数+1)。',
sbqixi_info:'出牌阶段限一次。若你有手牌你可以令一名其他角色猜测你手牌中最多的花色。若其猜对你展示所有手牌若其猜错你可令其从其未选择过的花色中再次猜测重复此流程。然后你弃置其区域内的X张牌X为其于本次〖奇袭〗中猜错的次数)。',
sbfenwei:'奋威',
sbfenwei_info:'限定技。①出牌阶段你可以将至多三张牌分别置于等量名角色的武将牌上称为“威”然后你摸等量牌。②当一名角色成为锦囊牌的目标时若其有“威”你须选择1.令其获得其“威”2.令其移去“威”,并取消此目标。',
sb_machao:'谋马超',
@ -4686,7 +4696,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sbxieji_info:'准备阶段开始时你可以和一名其他角色进行协力。其的下个结束阶段开始时若你与其协力成功则你可以选择至多三名其他角色。你对这些角色视为使用一张【杀】且当此【杀】因执行牌面效果造成伤害后你摸X张牌X为伤害值。',
sb_zhaoyun:'谋赵云',
sblongdan:'龙胆',
sblongdan_info:'蓄力技1/3。①你可以消耗1点蓄力值将【杀】当做【闪】或将【闪】当做【杀】使用或打出然后摸一张牌。②一名角色的回合结束时你获得1点蓄力值。',
sblongdan_info:'蓄力技1/3。①你可以消耗1点蓄力值将【杀】当做【闪】或将【闪】当做【杀】使用或打出然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时你获得1点蓄力值。',
sbjizhu:'积著',
sbjizhu_info:'准备阶段开始时,你可以和一名其他角色进行协力。其的下个结束阶段开始时,若你与其协力成功,则你修改〖龙胆〗直到你的下个结束阶段开始。',
sblongdan_shabi:'龙胆',
@ -4707,7 +4717,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sbxuanhuo:'眩惑',
sbxuanhuo_info:'①出牌阶段限一次。你可以将一张牌交给一名没有“眩”标记的其他角色然后令其获得“眩”标记。②当有“眩”的其他角色于摸牌阶段外获得牌后若你以此法于其本次获得“眩”的期间内获得其的牌数小于5你随机获得其一张手牌。',
sbenyuan:'恩怨',
sbenyuan_info:'锁定技。准备阶段若场上存在有“眩”的角色你移去该角色的“眩”且你于其本次获得“眩”的期间内获得其的牌数不小于3你交给其张牌小于3其失去1点体力你回复1点体力。',
sbenyuan_info:'锁定技。准备阶段若场上存在有“眩”的角色你移去该角色的“眩”且你于其本次获得“眩”的期间内获得其的牌数不小于3你交给其张牌小于3其失去1点体力你回复1点体力。',
sb_chengong:'谋陈宫',
sbmingce:'明策',
sbmingce_info:'①出牌阶段限一次。你可以将一张牌交给一名其他角色其选择一项1.失去1点体力令你摸两张牌并获得1枚“策”2.摸一张牌。②出牌阶段开始时,你可以移去所有“策”并对一名其他角色造成等量伤害。',
@ -4715,31 +4725,31 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sbzhichi_info:'锁定技。当你受到伤害后,防止你本回合受到的伤害。',
sb_yuanshao:'谋袁绍',
sbluanji:'乱击',
sbluanji_info:'①出牌阶段限一次。你可以将两张手牌当【万箭齐发】使用。②当其他角色因响应你使用的【万箭齐发】而打出【闪】时,你摸一张牌。',
sbluanji_info:'①出牌阶段限一次。你可以将两张手牌当【万箭齐发】使用。②每回合限三次,当其他角色因响应你使用的【万箭齐发】而打出【闪】时,你摸一张牌。',
sbxueyi:'血裔',
sbxueyi_info:'主公技,锁定技。①你的手牌上限+2XX为场上其他群势力角色数。②当你使用牌指定其他群势力角色为目标后,你摸一张牌。',
sbxueyi_info:'主公技,锁定技。①你的手牌上限+2XX为场上其他群势力角色数。②每回合限两次,当你使用牌指定其他群势力角色为目标后,你摸一张牌。',
sb_diaochan:'谋貂蝉',
sblijian:'离间',
sblijian_info:'出牌阶段限一次。你可以选择至少两名其他角色并弃置X张牌X为你选择的角色数-1。然后每名你选择的角色依次视为对这些角色中与其逆时针座次最近的另一名角色使用一张【决斗】。',
sbbiyue:'闭月',
sbbiyue_info:'锁定技。结束阶段你摸Y张牌Y为本回合包括已死亡角色在内受到过伤害的角色数+1且至多为5)。',
sbbiyue_info:'锁定技。结束阶段你摸Y张牌Y为本回合包括已死亡角色在内受到过伤害的角色数+1且至多为4)。',
sb_pangtong:'谋庞统',
sblianhuan:'连环',
sblianhuan_info:'①出牌阶段你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。③当你使用【铁索连环】时你可以失去1点体力然后当此牌指定第一个目标后你随机弃置每名不处于连环状态的目标角色一张手牌。',
sblianhuan_lv2:'连环·改',
sblianhuan_lv2_info:'①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。③当你使用【铁索连环】时,你可以额外指定任意名角色为目标。④当你使用【铁索连环】指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。',
sbniepan:'涅槃',
sbniepan_info:'限定技。当你处于濒死状态时,你可以弃置区域里的所有牌,摸三张牌将体力回复至3点,复原武将牌,然后修改〖连环〗。',
sbniepan_info:'限定技。当你处于濒死状态时,你可以弃置区域里的所有牌,摸两张牌将体力回复至2点,复原武将牌,然后修改〖连环〗。',
sb_sunce:'谋孙策',
sbjiang:'激昂',
sbjiang_info:'①当你使用【决斗】或红色【杀】指定目标后或当你成为【决斗】或红色【杀】的目标后你摸一张牌。②当你使用【决斗】时你可以额外指定一名目标然后你失去1点体力。③出牌阶段限一次。你可以将所有手牌当【决斗】使用。',
sbhunzi:'魂姿',
sbhunzi_info:'觉醒技。当你脱离濒死状态后你减1点体力上限获得1点护甲张牌。然后你获得〖英姿〗和〖英魂〗。',
sbhunzi_info:'觉醒技。当你脱离濒死状态后你减1点体力上限获得1点护甲张牌。然后你获得〖英姿〗和〖英魂〗。',
sbzhiba:'制霸',
sbzhiba_info:'主公技限定技。当你进入濒死状态时你可以回复X点体力并修改〖激昂③〗为“出牌阶段限X次”X为场上其他吴势力角色数+1。然后其他吴势力角色依次受到1点无来源伤害且当有角色因此死亡后你摸三张牌。',
sbzhiba_info:'主公技限定技。当你进入濒死状态时你可以回复X点体力并修改〖激昂③〗为“出牌阶段限X次”X为场上其他吴势力角色数。然后其他吴势力角色依次受到1点无来源伤害且当有角色因此死亡后你摸三张牌。',
sb_daqiao:'谋大乔',
sbguose:'国色',
sbguose_info:'出牌阶段限四次。你可以选择一项1.将一张♦牌当【乐不思蜀】使用2.弃置场上一张【乐不思蜀】。然后你摸两张牌并弃置一张牌。',
sbguose_info:'出牌阶段限四次。你可以选择一项1.将一张♦牌当【乐不思蜀】使用2.弃置场上一张【乐不思蜀】。然后你摸一张牌。',
sbliuli:'流离',
sbliuli_info:'当你成为【杀】的目标时,你可以弃置一张牌并选择你攻击范围内的一名不为此【杀】使用者的角色,将此【杀】转移给该角色。若你以此法弃置了♥牌,则你可以令一名不为此【杀】使用者的其他角色获得“流离”标记,且移去场上所有其他的“流离”(每回合限一次)。有“流离”的角色回合开始时,其移去其“流离”并执行一个额外的出牌阶段。',
sb_liubiao:'谋刘表',
@ -4749,9 +4759,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sbzongshi_info:'锁定技。每名角色限一次。当你受到伤害后,你令伤害来源弃置所有手牌。',
sb_zhurong:'谋祝融',
sblieren:'烈刃',
sblieren_info:'当你使用【杀】指定唯一目标后,你可以摸一张牌并与其拼点。若你赢此【杀】结算结束后你可以对另一名其他角色造成1点伤害。',
sblieren_info:'当你使用【杀】指定唯一目标后,你可以与其拼点。若你赢此【杀】结算结束后你可以对另一名其他角色造成1点伤害。',
sbjuxiang:'巨象',
sbjuxiang_info:'锁定技。①【南蛮入侵】对你无效。②当其他角色使用【南蛮入侵】结算结束后,你获得此牌对应的所有实体牌。③结束阶段,若你未于本回合使用过【南蛮入侵】,你可以将一张游戏外的随机【南蛮入侵】(共张)交给一名角色。',
sbjuxiang_info:'锁定技。①【南蛮入侵】对你无效。②当其他角色使用【南蛮入侵】结算结束后,你获得此牌对应的所有实体牌。③结束阶段,若你未于本回合使用过【南蛮入侵】,你可以将一张游戏外的随机【南蛮入侵】(共张)交给一名角色。',
sb_menghuo:'谋孟获',
sbhuoshou:'祸首',
sbhuoshou_info:'锁定技。①【南蛮入侵】对你无效。②当其他角色使用【南蛮入侵】指定第一个目标后,你代替其成为此牌的伤害来源。③出牌阶段开始时,你随机获得弃牌堆中的一张【南蛮入侵】。④出牌阶段,若你于此阶段使用过【南蛮入侵】,你不能使用【南蛮入侵】。',
@ -4759,7 +4769,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sbzaiqi_info:'蓄力技1/7。①弃牌阶段结束时你可以消耗任意点蓄力值并选择等量名角色然后令这些角色选择一项1.令你摸一张牌2.弃置一张牌然后你回复1点体力。②每回合限一次。当你造成伤害后你获得1点蓄力值。',
sb_zhanghe:'谋张郃',
sbqiaobian:'巧变',
sbqiaobian_info:'每回合限一次。①你可以失去1点体力并跳过判定阶段将判定区的所有牌移动给一名其他角色无法置入其判定区的牌改为弃置之。②你可以跳过摸牌阶段于下个准备阶段摸两张牌并回复1点体力。③你可以将手牌数弃置至六张并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌。',
sbqiaobian_info:'每回合限一次。①你可以失去1点体力并跳过判定阶段将判定区的所有牌移动给一名其他角色无法置入其判定区的牌改为弃置之。②你可以跳过摸牌阶段于下个准备阶段摸两张牌并回复1点体力。③你可以将手牌数弃置至六张(若手牌数少于六张则跳过之)并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌。',
sb_zhi:'谋攻篇·知',
sb_shi:'谋攻篇·识',

View File

@ -701,7 +701,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
filter:function(event,player){
if(event.name=='useCardToTargeted') return get.type(event.card)=='delay'&&!player.hasSkill('olcuorui_skip');
return player.countCards('h')<Math.min(8,game.countPlayer());
return (event.name!='phase'||game.phaseNumber==0)&&player.countCards('h')<Math.min(8,game.countPlayer());
},
forced:true,
content:function(){
@ -731,9 +731,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
inherit:'mouzhu',
content:function(){
'step 0'
target.chooseCard('he','交给'+get.translation(player)+'一张牌',true);
target.chooseCard('h','交给'+get.translation(player)+'一张牌',true);
'step 1'
target.give(result.cards,player);
if(result.bool) target.give(result.cards,player);
'step 2'
if(player.countCards('h')<=target.countCards('h')){
event.finish();
@ -754,18 +754,40 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ai:{
order:7,
result:{
target:-1,
player:function(player,target){
if(get.attitude(player,target)>0&&get.attitude(target,player)>0&&game.hasPlayer(function(current){
target:function(player,target){
if(get.attitude(target,player)>0&&game.hasPlayer(function(current){
if(current==target) return false;
for(var card of [{name:'sha'},{name:'juedou'}]){
if(target.canUse(card,current)&&get.effect(current,card,target,player)>0&&get.effect(current,card,target,target)>0) return true;
}
return false;
})&&target.countCards('he')<=player.countCards('he')) return 3;
})&&target.countCards('h')<player.countCards('h')+2) return 3;
if(!target.hasValueTarget({name:'sha'})&&!target.hasValueTarget({name:'juedou'})) return -2;
if(target.countCards('he')>player.countCards('he')+1) return -1;
return -0.5;
if(target.countCards('h')+1>player.countCards('h')) return -2;
var canSave=function(player,target){
return target.hp+player.countCards('hs',function(card){
var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player);
if(mod2!='unchanged') return mod2;
var mod=game.checkMod(card,player,target,'unchanged','cardSavable',player);
if(mod!='unchanged') return mod;
var savable=get.info(card).savable;
if(typeof savable=='function') savable=savable(card,player,target);
return savable;
})>1+((get.mode()=='identity'&&target.identity=='zhu')||(get.mode()=='guozhan'&&get.is.jun(target)));
};
if(target.hasValueTarget({name:'sha'})){
var aimx=game.filterPlayer(current=>{
return target.canUse({name:'sha'},current)&&get.effect(current,{name:'sha'},target,target)>0;
}).sort((a,b)=>get.effect(b,{name:'sha'},target,target)-get.effect(a,{name:'sha'},target,target))[0];
if(get.effect(aimx,{name:'sha'},target,player)<0&&get.effect(aimx,{name:'sha'},target,aimx)<0&&!canSave(player,aimx)) return 0;
}
if(target.hasValueTarget({name:'juedou'})){
var aimy=game.filterPlayer(current=>{
return target.canUse({name:'juedou'},current)&&get.effect(current,{name:'juedou'},target,target)>0;
}).sort((a,b)=>get.effect(b,{name:'juedou'},target,target)-get.effect(a,{name:'juedou'},target,target))[0];
if(get.effect(aimy,{name:'juedou'},target,player)<0&&get.effect(aimy,{name:'sha'},target,aimy)<0&&!canSave(player,aimy)) return 0;
}
return -1;
},
},
},
@ -10870,15 +10892,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return game.hasPlayer((current)=>lib.skill.spmouzhu.filterTarget(null,player,current));
},
filterTarget:function(card,player,target){
if(!target.countCards('h')) return false;
return player!=target&&(target.hp==player.hp||get.distance(player,target)==1);
},
selectTarget:[1,Infinity],
content:function(){
'step 0'
if(!target.countCards('h')) event.finish();
else target.chooseCard('h','交给'+get.translation(player)+'一张牌',true);
target.chooseCard('h','交给'+get.translation(player)+'一张牌',true);
'step 1'
target.give(result.cards,player);
if(result.bool) target.give(result.cards,player);
'step 2'
if(player.countCards('h')<=target.countCards('h')){
event.finish();
@ -11924,13 +11946,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
enable:'phaseUse',
usable:1,
filterTarget:function(card,player,target){
return target!=player&&target.countCards('he')>0;
return target!=player&&target.countCards('h')>0;
},
content:function(){
'step 0'
target.chooseCard('he','交给'+get.translation(player)+'一张牌',true);
target.chooseCard('h','交给'+get.translation(player)+'一张牌',true);
'step 1'
target.give(result.cards,player);
if(result.bool) target.give(result.cards,player);
'step 2'
if(player.countCards('h')<=target.countCards('h')){
event.finish();
@ -23482,7 +23504,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
xjshijian:'实荐',
xjshijian_info:'一名其他角色于其回合内使用的第二张牌结算完成后,你可弃置一张牌并令其获得技能〖誉虚〗直到回合结束。',
mouzhu:'谋诛',
mouzhu_info:'出牌阶段限一次,你可以令一名有牌的其他角色交给你一张牌。然后若你的手牌数大于其,其选择视为对你使用一张【杀】或【决斗】。',
mouzhu_info:'出牌阶段限一次,你可以令一名有牌的其他角色交给你一张牌。然后若你的手牌数大于其,其选择视为对你使用一张【杀】或【决斗】。',
yanhuo:'延祸',
yanhuo_info:'当你死亡时你可以依次弃置一名其他角色的X张牌。X为你的牌数',
niluan:'逆乱',
@ -24410,7 +24432,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
olcuorui:'挫锐',
olcuorui_info:'锁定技。①游戏开始时你将手牌摸至场上存活人数张至多摸至8张。②当你成为延时锦囊牌的目标后你跳过下个判定阶段。',
olmouzhu:'谋诛',
olmouzhu_info:'出牌阶段限一次,你可以令一名有牌的其他角色交给你一张牌。然后若你的手牌数大于其,其视为使用一张【杀】或【决斗】。',
olmouzhu_info:'出牌阶段限一次,你可以令一名有手牌的其他角色交给你一张手牌。然后若其手牌数小于你,其视为使用一张【杀】或【决斗】。',
olyanhuo:'延祸',
olyanhuo_info:'当你死亡时你可以弃置杀死你的角色至多X张牌X为你的牌数。',
olniluan:'逆乱',

View File

@ -6999,6 +6999,7 @@
'<li>游击:若一名角色拥有带有“游击”的技能,则当该游击技能执行至“游击”处时,若本次技能的目标角色在你的攻击范围内,且你不在其攻击范围内,则你可以执行“游击”后的额外效果。'+
''
},
path:{},
setIntro:function(node,func,left){
if(lib.config.touchscreen){
if(left){
@ -7166,8 +7167,8 @@
genAsync:fn=>gnc.async(fn),
genAwait:gen=>gnc.await(gen),
gnc:{
async:gnc.async(fn),
await:gnc.await(gen),
async:fn=>gnc.async(fn),
await:gen=>gnc.await(gen),
is:{
coroutine:item=>gnc.is.coroutine(item),
generatorFunc:item=>gnc.is.generatorFunc(item),
@ -8244,6 +8245,13 @@
delete _status.htmlbg;
window.game=game;
// node:path library alternative
if (typeof module!="object"||typeof module.exports!="object") lib.init.js(`${lib.assetURL}game`,"path.min",()=>{
lib.path=window._noname_path;
delete window._noname_path;
},(e)=>{
throw e;
});
var styleToLoad=6;
var styleLoaded=function(){
styleToLoad--;
@ -8595,10 +8603,12 @@
else if(typeof window.require=='function'){
lib.node={
fs:require('fs'),
path:require("path"),
debug:function(){
require('electron').remote.getCurrentWindow().toggleDevTools();
}
};
lib.path=lib.node.path;
game.download=function(url,folder,onsuccess,onerror,dev,onprogress){
if(url.indexOf('http')!=0){
url=get.url(dev)+url;
@ -9198,7 +9208,9 @@
var connectCardPack=[];
for(i in character){
if(character[i].character){
lib.characterPack[i]=character[i].character
const characterPack=lib.characterPack[i];
if(characterPack) Object.assign(characterPack,character[i].character);
else lib.characterPack[i]=character[i].character;
}
for(j in character[i]){
if(j=='mode'||j=='forbid') continue;
@ -9301,11 +9313,11 @@
lib.cardPackList={};
}
for(i in card){
lib.cardPack[i]=[];
const cardPack=lib.cardPack[i]?lib.cardPack[i]:lib.cardPack[i]=[];
if(card[i].card){
for(var j in card[i].card){
if(!card[i].card[j].hidden&&card[i].translate[j+'_info']){
lib.cardPack[i].push(j);
cardPack.push(j);
}
}
}
@ -9317,7 +9329,9 @@
}
if(j=='list'){
if(lib.config.mode=='connect'){
lib.cardPackList[i]=card[i][j];
const cardPackList=lib.cardPackList[i];
if(cardPackList) cardPackList.addArray(card[i][j]);
else lib.cardPackList[i]=card[i][j];
}
else{
if(lib.config.cards.contains(i)){
@ -9328,7 +9342,9 @@
else{
pile=card[i][j];
}
lib.cardPile[i]=pile.slice(0);
const cardPile=lib.cardPile[i];
if(cardPile) cardPile.addArray(pile);
else lib.cardPile[i]=pile.slice(0);
if(lib.config.bannedpile[i]){
for(var k=0;k<lib.config.bannedpile[i].length;k++){
pile[lib.config.bannedpile[i][k]]=null;
@ -9344,7 +9360,7 @@
pile.push(lib.config.addedpile[i][k]);
}
}
lib.card.list=lib.card.list.concat(pile);
lib.card.list.addArray(pile);
}
}
}
@ -9365,7 +9381,7 @@
};
}
else{
lib[j][k]=card[i][j][k];
Object.defineProperty(lib[j],k,Object.getOwnPropertyDescriptor(card[i][j],k));
}
}
else{
@ -9571,7 +9587,7 @@
}
game.loop();
})
var proceed=function(){
var proceed=gnc.async(function*(){
if(!lib.db){
try{
lib.storage=JSON.parse(localStorage.getItem(lib.configprefix+lib.config.mode));
@ -9582,7 +9598,7 @@
lib.storage={};
localStorage.setItem(lib.configprefix+lib.config.mode,"{}");
}
proceed2();
yield proceed2();
}
else{
game.getDB('data',lib.config.mode,function(obj){
@ -9590,7 +9606,7 @@
proceed2();
});
}
};
});
if(!lib.imported.mode||!lib.imported.mode[lib.config.mode]){
window.inSplash=true;
clearTimeout(window.resetGameTimeout);
@ -9677,7 +9693,7 @@
}
}
else{
proceed();
yield proceed();
}
localStorage.removeItem(lib.configprefix+'directstart');
delete lib.init.init;
@ -11076,23 +11092,27 @@
event.nojudge=true;
}
'step 1'
if(!event.cancelled&&!event.nojudge) player.judge(card);
if(event.cancelled||event.nojudge) return;
var next=player.judge(card),judge=event.judge;
if(typeof judge=='function') next.judge=judge;
var judge2=event.judge2;
if(typeof judge2=='function') next.judge2=judge2;
'step 2'
if(event.excluded) delete event.excluded;
else{
const cardName=event.cardName;
var cardName=event.cardName;
if(event.cancelled&&!event.direct){
const cardCancel=lib.card[cardName].cancel;
var cardCancel=lib.card[cardName].cancel;
if(cardCancel){
const next=game.createEvent(`${cardName}Cancel`);
var next=game.createEvent(`${cardName}Cancel`);
next.setContent(cardCancel);
next.cards=[card];
if(!card.viewAs){
const autoViewAs=next.card=get.autoViewAs(card);
var autoViewAs=next.card=get.autoViewAs(card);
autoViewAs.expired=card.expired;
}
else{
const autoViewAs=next.card=get.autoViewAs({
var autoViewAs=next.card=get.autoViewAs({
name:cardName
},next.cards);
autoViewAs.expired=card.expired;
@ -11101,16 +11121,16 @@
}
}
else{
const next=game.createEvent(cardName);
var next=game.createEvent(cardName);
next.setContent(lib.card[cardName].effect);
next._result=result;
next.cards=[card];
if(!card.viewAs){
const autoViewAs=next.card=get.autoViewAs(card);
var autoViewAs=next.card=get.autoViewAs(card);
autoViewAs.expired=card.expired;
}
else{
const autoViewAs=next.card=get.autoViewAs({
var autoViewAs=next.card=get.autoViewAs({
name:cardName
},next.cards);
autoViewAs.expired=card.expired;
@ -12837,7 +12857,9 @@
var i,j,k;
for(i in character){
if(character[i].character){
lib.characterPack[i]=character[i].character;
const characterPack=lib.characterPack[i];
if(characterPack) Object.assign(characterPack,character[i].character);
else lib.characterPack[i]=character[i].character;
}
if(character[i].forbid&&character[i].forbid.contains(lib.config.mode)) continue;
if(character[i].mode&&character[i].mode.contains(lib.config.mode)==false) continue;
@ -12869,7 +12891,7 @@
}
else{
if(lib[j][k]==undefined){
lib[j][k]=character[i][j][k];
Object.defineProperty(lib[j],k,Object.getOwnPropertyDescriptor(character[i][j],k));
}
else if(Array.isArray(lib[j][k])&&Array.isArray(character[i][j][k])){
lib[j][k].addArray(character[i][j][k]);
@ -12887,11 +12909,11 @@
}
}
for(i in card){
lib.cardPack[i]=[];
const cardPack=lib.cardPack[i]?lib.cardPack[i]:lib.cardPack[i]=[];
if(card[i].card){
for(var j in card[i].card){
if(!card[i].card[j].hidden&&card[i].translate[j+'_info']){
lib.cardPack[i].push(j);
cardPack.push(j);
}
}
}
@ -12906,7 +12928,7 @@
lib[j][k+'_card_config']=card[i][j][k];
}
else{
if(lib[j][k]==undefined) lib[j][k]=card[i][j][k];
if(lib[j][k]==undefined) Object.defineProperty(lib[j],k,Object.getOwnPropertyDescriptor(card[i][j],k));
else{
console.log(
`dublicate ${j} in card ${i}:\n${k}\nlib.${j}.${k}`,
@ -18998,7 +19020,7 @@
},
//Execute the delay card effect
//执行延时锦囊牌效果
executeDelayCardEffect:function(card,target){
executeDelayCardEffect:function(card,target,judge,judge2){
const executeDelayCardEffect=game.createEvent('executeDelayCardEffect');
executeDelayCardEffect.player=this;
executeDelayCardEffect.target=target||this;
@ -19011,6 +19033,8 @@
}
else if(get.itemtype(card)=='card') executeDelayCardEffect.card=card;
else _status.event.next.remove(executeDelayCardEffect);
executeDelayCardEffect.judge=judge;
executeDelayCardEffect.judge2=judge2;
executeDelayCardEffect.setContent('executeDelayCardEffect');
executeDelayCardEffect._args=Array.from(arguments);
return executeDelayCardEffect;
@ -28197,14 +28221,14 @@
if(this.player&&lib.phaseName.contains(this.name)) this.player.getHistory('skipped').add(this.name)}
},
neutralize:function(event){
this.untrigger(true);
this.untrigger();
this.finish();
this._neutralized=true;
this.trigger('eventNeutralized');
this._neutralize_event=event||_status.event;
},
unneutralize:function(){
this.untrigger(true);
this.untrigger();
delete this._neutralized;
delete this.finished;
if(this.type=='card'&&this.card&&this.name=='sha') this.directHit=true;
@ -35540,7 +35564,7 @@
linexy:function(path){
const from=[path[0],path[1]],to=[path[2],path[3]];
let total=typeof arguments[1]==='number'?arguments[1]:lib.config.duration*2,opacity=1,color=[255,255,255],dashed=false,drag=false;
if(arguments[1]!=null&&typeof arguments[1]=='object') Object.keys(arguments[1]).forEach(value=>{
if(arguments[1]&&typeof arguments[1]=='object') Object.keys(arguments[1]).forEach(value=>{
switch(value){
case 'opacity':
opacity=arguments[1][value];

24
game/path.min.js vendored Normal file

File diff suppressed because one or more lines are too long