Merge pull request #1105 from mengxinzxz/PR-Branch

部分issue问题梳理解决
This commit is contained in:
Spmario233 2024-03-18 23:09:53 +08:00 committed by GitHub
commit 608b1e700d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 124 additions and 94 deletions

View File

@ -2494,7 +2494,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
}, },
icesha_skill:{ icesha_skill:{
inherit:'hanbing_skill', inherit:'hanbing_skill',
trigger:{source:'damageBegin2'}, trigger:{source:'damageBegin3'},
equipSkill:false, equipSkill:false,
ruleSkill:true, ruleSkill:true,
filter:function(event){ filter:function(event){

View File

@ -5337,10 +5337,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
check:function(event,player){ check:function(event,player){
var num=player.getDamagedHp()-1; var num=player.getDamagedHp()-1;
if(num<=0) return false; if(num<=0) return false;
var list=game.filterPlayer().map(target=>{ return game.hasPlayer(target=>{
return get.attitude(player,target)*Math.pow(Math.max(0,target.maxHp-target.countCards('h')-1),2); return get.attitude(player,target)>0&&target.maxHp-target.countCards('h')>1;
}).sort((a,b)=>b-a); });
return list.slice(0,num).reduce((p,c)=>p+c,0)>0;
}, },
content:function(){ content:function(){
'step 0' 'step 0'
@ -5348,7 +5347,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 1' 'step 1'
var num=player.getDamagedHp(); var num=player.getDamagedHp();
if(!player.isIn()||!num) event.finish(); if(!player.isIn()||!num) event.finish();
else player.chooseTarget('御关:令'+get.cnNumber(num)+'名角色将手牌摸至体力上限',Math.min(game.countPlayer(),num),true).set('ai',target=>{ else player.chooseTarget('御关:令'+get.cnNumber(num)+'名角色将手牌摸至体力上限',Math.min(game.countPlayer(),[1,num]),true).set('ai',target=>{
return get.attitude(_status.event.player,target)*Math.max(0.1,target.maxHp-target.countCards('h')); return get.attitude(_status.event.player,target)*Math.max(0.1,target.maxHp-target.countCards('h'));
}); });
'step 2' 'step 2'
@ -12716,7 +12715,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
xingchong:'幸宠', xingchong:'幸宠',
xingchong_info:'一轮游戏开始时你可声明两个自然数X和Y且(X+Y)≤min(5, 你的体力上限)。你摸X张牌并展示Y张手牌。若如此做当你于本轮内失去一张以此法展示的牌后你摸两张牌。', xingchong_info:'一轮游戏开始时你可声明两个自然数X和Y且(X+Y)≤min(5, 你的体力上限)。你摸X张牌并展示Y张手牌。若如此做当你于本轮内失去一张以此法展示的牌后你摸两张牌。',
liunian:'流年', liunian:'流年',
liunian_info:'锁定技。回合结束时若本回合内进行了本次游戏的第一次洗牌则你加1点体力上限若本回合内进行了本次游戏的第二次洗牌则你于本回合结束时回复1点体力且本局游戏内的手牌上限+10。', liunian_info:'锁定技。一名角色的回合结束时若本回合内进行了本次游戏的第一次洗牌则你加1点体力上限若本回合内进行了本次游戏的第二次洗牌则你于本回合结束时回复1点体力且本局游戏内的手牌上限+10。',
caimaozhangyun:'蔡瑁张允', caimaozhangyun:'蔡瑁张允',
lianzhou:'连舟', lianzhou:'连舟',
lianzhou_info:'锁定技。准备阶段,你横置你的武将牌。然后你可横置任意名体力值等于你的角色。', lianzhou_info:'锁定技。准备阶段,你横置你的武将牌。然后你可横置任意名体力值等于你的角色。',
@ -12828,7 +12827,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dcxuewei:'血卫', dcxuewei:'血卫',
dcxuewei_info:'结束阶段你可以选择一名体力值不大于你的角色然后你获得如下效果直到你的下回合开始时当其受到伤害时防止此伤害然后你失去1点体力你与其各摸一张牌若该角色为你则改为你摸一张牌。', dcxuewei_info:'结束阶段你可以选择一名体力值不大于你的角色然后你获得如下效果直到你的下回合开始时当其受到伤害时防止此伤害然后你失去1点体力你与其各摸一张牌若该角色为你则改为你摸一张牌。',
dcyuguan:'御关', dcyuguan:'御关',
dcyuguan_info:'一名角色的回合结束时若你已损失的体力值为全场最多你可以减1点体力上限然后令X名角色将手牌摸至体力上限X为你已损失的体力值。', dcyuguan_info:'一名角色的回合结束时若你已损失的体力值为全场最多你可以减1点体力上限然后令至多X名角色将手牌摸至体力上限X为你已损失的体力值。',
qinlang:'秦朗', qinlang:'秦朗',
dchaochong:'昊宠', dchaochong:'昊宠',
dchaochong_info:'当你使用牌后,你可以将手牌摸至或弃置至你的手牌上限数(至多摸五张)。然后若你以此法:得到牌,你的手牌上限-1失去牌你的手牌上限+1。', dchaochong_info:'当你使用牌后,你可以将手牌摸至或弃置至你的手牌上限数(至多摸五张)。然后若你以此法:得到牌,你的手牌上限-1失去牌你的手牌上限+1。',

View File

@ -754,12 +754,61 @@ game.import('character',function(lib,game,ui,get,ai,_status){
content:'mark', content:'mark',
}, },
ai:{threaten:2.5}, ai:{threaten:2.5},
getNum(num){
if(typeof num!='number'||Array.from({length:8}).map((_,i)=>i+1).includes(num)) return 0;
return [1,2,3,4,2,2,3,3][num-1];
},
getEffect(player,num){
if(!player||typeof num!='number') return 0;
switch(num){
//行殇四个选项
case 1://-1重置武将牌
if(game.hasPlayer(target=>{
return get.attitude(player,target)>0&&target.isTurnedOver();
})) return 10;
return 0;
case 2://-2摸min(5,max(1,阵亡角色数))的牌
return Math.min(5,(Math.max(1,game.dead.length)));
case 3://-3加上限加血+复原装备栏
if(!game.hasPlayer(target=>{
return get.attitude(player,target)>0&&target.maxHp<10;
})) return 0;
return 2+(game.hasPlayer(target=>{
return get.attitude(player,target)>0&&target.hasDisabledSlot();
})?1:0);
case 4://-4劝封/化萍
return 0;
//放逐四个选项
case 5://-2白板到结束
if(game.hasPlayer(target=>{
if(target.hasSkill('sbfangzhu_ban')||target.hasSkill('fengyin')||target.hasSkill('baiban')) return false;
return get.attitude(player,target)<0&&['name','name1','name2'].reduce((sum,name)=>{
if(target[name]&&(name!='name1'||target.name!=target.name1)){
if(get.character(target[name])) sum+get.rank(target[name],true);
}
return sum;
},0)>5;
})) return 6;
return 0;
case 6://-2强命到结束
return 0;
case 7://-3翻面
if(game.hasPlayer(target=>{
return get.attitude(player,target)<0&&!target.isTurnedOver();
})) return 8;
return 0;
case 8://-3定向鸡肋
return 0;
default://其他
return 0;
}
},
group:'sbxingshang_use', group:'sbxingshang_use',
subSkill:{ subSkill:{
use:{ use:{
audio:'sbxingshang', audio:'sbxingshang',
enable:'phaseUse', enable:'phaseUse',
filter:function(event,player){ filter(event,player){
return game.hasPlayer(target=>{ return game.hasPlayer(target=>{
if(player.countMark('sbxingshang')>1) return true; if(player.countMark('sbxingshang')>1) return true;
return player.countMark('sbxingshang')&&(target.isLinked()||target.isTurnedOver()); return player.countMark('sbxingshang')&&(target.isLinked()||target.isTurnedOver());
@ -767,7 +816,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}, },
usable:1, usable:1,
chooseButton:{ chooseButton:{
dialog:function(){ dialog(){
var dialog=ui.create.dialog( var dialog=ui.create.dialog(
'行殇:请选择你要执行的一项', '行殇:请选择你要执行的一项',
[[ [[
@ -783,7 +832,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
); );
return dialog; return dialog;
}, },
filter:function(button,player){ filter(button,player){
if(button.link>player.countMark('sbxingshang')) return false; if(button.link>player.countMark('sbxingshang')) return false;
switch(button.link){ switch(button.link){
case 1: case 1:
@ -796,39 +845,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return game.dead.length; return game.dead.length;
} }
}, },
check:function(button){ check(button){
let player=_status.event.player; const player=get.event('player'),info=get.info('sbxingshang');
switch(button.link){ let list=Array.from({length:4}).map((_,i)=>i+1);
case 1: list=list.filter(num=>player.countMark('sbxingshang')>=info.getNum(num));
return game.filterPlayer(current=>get.attitude(player,current)>0).reduce((list,target)=>{ const num=list.sort((a,b)=>info.getEffect(player,b)-info.getEffect(player,a))[0];
let num=0; return (button.link==num)?10:0;
if(target.isLinked()) num+=0.5;
if(target.isTurnedOver()) num+=10;
list.push(num);
return list;
},[]).sort((a,b)=>b-a)[0];
case 2:
return Math.min(5,Math.max(1,game.dead.length));
case 3:
return game.filterPlayer().reduce((list,target)=>{
list.push(get.recoverEffect(target,player,player));
return list;
},[]).sort((a,b)=>b-a)[0];
case 4:
return game.dead.reduce((list,target)=>{
let num=0;
if(target.name&&lib.character[target.name]) num+=get.rank(target.name,true);
if(target.name2&&lib.character[target.name2]) num+=get.rank(target.name2,true);
list.push(num);
return list;
},[]).sort((a,b)=>b-a)[0];
}
}, },
backup:function(links,player){ backup(links,player){
return { return {
num:links[0], num:links[0],
audio:'sbxingshang', audio:'sbxingshang',
filterTarget:function(card,player,target){ filterTarget(card,player,target){
switch(lib.skill.sbxingshang_use_backup.num){ switch(lib.skill.sbxingshang_use_backup.num){
case 1: case 1:
return target=>target.isLinked()||target.isTurnedOver(); return target=>target.isLinked()||target.isTurnedOver();
@ -889,17 +917,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}, },
ai:{ ai:{
result:{ result:{
target:function(player,target){ target(player,target){
switch(lib.skill.sbxingshang_use_backup.num){ switch(lib.skill.sbxingshang_use_backup.num){
case 1: case 1:
let num=0; let num=0;
if(target.isLinked()) num+=0.5; if(target.isLinked()&&!target.hasSkill('nzry_jieying')) num+=0.5;
if(target.isTurnedOver()) num+=10; if(target.isTurnedOver()) num+=10;
return num; return num;
case 2: case 2:
return 1; return get.effect(target,{name:'draw'},player,player);
case 3: case 3:
return get.recoverEffect(target,player,player); return Math.max(0,get.recoverEffect(target,player,player))+get.attitude(player,target);
case 4: case 4:
return 1; return 1;
} }
@ -908,21 +936,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}, },
} }
}, },
prompt:function(links,player){ prompt(links,player){
const str='###行殇###';
switch(links[0]){ switch(links[0]){
case 1: case 1:
return '复原一名角色的武将牌'; return str+'复原一名角色的武将牌';
case 2: case 2:
return '令一名角色摸'+get.cnNumber(Math.min(5,Math.max(1,game.dead.length)))+'张牌'; return str+'令一名角色摸'+get.cnNumber(Math.min(5,Math.max(1,game.dead.length)))+'张牌';
case 3: case 3:
return '令一名体力上限小于10的角色加1点体力上限并回复1点体力然后随机恢复一个被废除的装备栏'; return str+'令一名体力上限小于10的角色加1点体力上限并回复1点体力然后随机恢复一个被废除的装备栏';
case 4: case 4:
return '获得一名已阵亡角色的所有技能,然后失去武将牌上的所有技能'; return str+'获得一名已阵亡角色的所有技能,然后失去武将牌上的所有技能';
} }
} }
}, },
ai:{ ai:{
order:9, order(_,player){
const info=get.info('sbxingshang');
const goon=(player.hasSkill('sbfangzhu')&&!player.getStat('skill').sbfangzhu);
let list=Array.from({length:goon?8:4}).map((_,i)=>i+1);
list=list.filter(num=>player.countMark('sbxingshang')>=info.getNum(num));
list.sort((a,b)=>info.getEffect(player,b)-info.getEffect(player,a));
return (Array.from({length:4}).map((_,i)=>i+1).includes(list[0])&&info.getEffect(player,list[0])>0)?1:0;
},
result:{player:1}, result:{player:1},
}, },
}, },
@ -932,12 +968,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sbfangzhu:{ sbfangzhu:{
audio:2, audio:2,
enable:'phaseUse', enable:'phaseUse',
filter:function(event,player){ filter(event,player){
return player.countMark('sbxingshang')>1; return player.countMark('sbxingshang')>1;
}, },
usable:1, usable:1,
chooseButton:{ chooseButton:{
dialog:function(){ dialog(){
var dialog=ui.create.dialog('放逐:请选择你要执行的一项','hidden'); var dialog=ui.create.dialog('放逐:请选择你要执行的一项','hidden');
dialog.add([[ dialog.add([[
[1,'移去2个“颂”标记令一名其他角色的非Charlotte技能失效直到其回合结束'], [1,'移去2个“颂”标记令一名其他角色的非Charlotte技能失效直到其回合结束'],
@ -947,40 +983,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){
],'textbutton']); ],'textbutton']);
return dialog; return dialog;
}, },
filter:function(button,player){ filter(button,player){
if(button.link>2&&player.countMark('sbxingshang')<3) return false; if(button.link>2&&player.countMark('sbxingshang')<3) return false;
if(button.link==4) return game.hasPlayer(target=>target!=player&&!target.hasSkill('sbfangzhu_ban')); if(button.link==4) return game.hasPlayer(target=>target!=player&&!target.hasSkill('sbfangzhu_ban'));
return true; return true;
}, },
check:function(button){ check(button){
let player=_status.event.player; const player=get.event('player'),info=get.info('sbxingshang');
switch(button.link){ let list=Array.from({length:4}).map((_,i)=>i+1);
case 1: list=list.filter(num=>player.countMark('sbxingshang')>=info.getNum(num+4));
return game.filterPlayer(current=>get.attitude(player,current)<0).reduce((list,target)=>{ const num=list.sort((a,b)=>info.getEffect(player,b+4)-info.getEffect(player,a+4))[0]-4;
let num=0; return (button.link==num)?10:0;
if(target.name&&lib.character[target.name]) num+=get.rank(target.name,true);
if(target.name2&&lib.character[target.name2]) num+=get.rank(target.name2,true);
list.push(num);
return list;
},[]).sort((a,b)=>b-a)[0];
case 2:
return 0;
case 3:
return game.filterPlayer(target=>target!=player&&!target.hasSkill('sbfangzhu_ban')).reduce((list,target)=>{
if(get.attitude(player,target)>0&&target.isTurnedOver()) list.push(10*target.countCards('hs')+1);
else if(get.attitude(player,target)<0&&!target.isTurnedOver()) list.push(5*target.countCards('hs')+1);
else list.push(0);
return list;
},[]).sort((a,b)=>b-a)[0];
case 4:
return 0;
}
}, },
backup:function(links,player){ backup(links,player){
return { return {
num:links[0], num:links[0],
audio:'sbfangzhu', audio:'sbfangzhu',
filterTarget:lib.filter.notMe, filterTarget(card,player,target){
if(target==player) return false;
if(lib.skill.sbfangzhu_backup.num==4) return !target.hasSkill('sbfangzhu_ban');
return true;
},
async content(event,trigger,player){ async content(event,trigger,player){
const target=event.target; const target=event.target;
const num=lib.skill.sbfangzhu_backup.num; const num=lib.skill.sbfangzhu_backup.num;
@ -1008,7 +1031,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}, },
ai:{ ai:{
result:{ result:{
target:function(player,target){ target(player,target){
switch(lib.skill.sbfangzhu_backup.num){ switch(lib.skill.sbfangzhu_backup.num){
case 1: case 1:
let num=0; let num=0;
@ -1029,21 +1052,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}, },
} }
}, },
prompt:function(links,player){ prompt(links,player){
const str='###放逐###';
switch(links[0]){ switch(links[0]){
case 1: case 1:
return '移去2个“颂”标记令一名其他角色的非Charlotte技能失效直到其回合结束'; return str+'移去2个“颂”标记令一名其他角色的非Charlotte技能失效直到其回合结束';
case 2: case 2:
return '移去2个“颂”标记令一名其他角色不能响应除其外的角色使用的牌直到其回合结束'; return str+'移去2个“颂”标记令一名其他角色不能响应除其外的角色使用的牌直到其回合结束';
case 3: case 3:
return '移去3个“颂”标记令一名其他角色将武将牌翻面'; return str+'移去3个“颂”标记令一名其他角色将武将牌翻面';
case 4: case 4:
return '移去3个“颂”标记令一名其他角色只能使用你选择的一种类型的牌直到其回合结束'; return str+'移去3个“颂”标记令一名其他角色只能使用你选择的一种类型的牌直到其回合结束';
} }
} }
}, },
ai:{ ai:{
order:9, order(_,player){
const info=get.info('sbxingshang');
const goon=(player.hasSkill('sbxingshang')&&!player.getStat('skill').sbxingshang_use);
let list=Array.from({length:goon?8:4}).map((_,i)=>i+(goon?1:5));
list=list.filter(num=>player.countMark('sbxingshang')>=info.getNum(num));
list.sort((a,b)=>info.getEffect(player,b)-info.getEffect(player,a));
return (Array.from({length:4}).map((_,i)=>i+5).includes(list[0])&&info.getEffect(player,list[0])>0)?1:0;
},
result:{player:1}, result:{player:1},
}, },
subSkill:{ subSkill:{
@ -1054,7 +1085,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
marktext:'禁', marktext:'禁',
intro:{content:'不能响应其他角色使用的牌'}, intro:{content:'不能响应其他角色使用的牌'},
trigger:{global:'useCard1'}, trigger:{global:'useCard1'},
filter:function(event,player){ filter(event,player){
return event.player!=player; return event.player!=player;
}, },
forced:true, forced:true,
@ -1073,10 +1104,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
content:'只能使用$牌', content:'只能使用$牌',
}, },
mod:{ mod:{
cardEnabled:function(card,player){ cardEnabled(card,player){
if(!player.getStorage('sbfangzhu_ban').includes(get.type2(card))) return false; if(!player.getStorage('sbfangzhu_ban').includes(get.type2(card))) return false;
}, },
cardSavable:function(card,player){ cardSavable(card,player){
if(!player.getStorage('sbfangzhu_ban').includes(get.type2(card))) return false; if(!player.getStorage('sbfangzhu_ban').includes(get.type2(card))) return false;
}, },
}, },
@ -1089,7 +1120,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.addSkill('sbsongwei_delete'); player.addSkill('sbsongwei_delete');
}, },
trigger:{player:'phaseUseBegin'}, trigger:{player:'phaseUseBegin'},
filter:function(event,player){ filter(event,player){
return game.hasPlayer(target=>target.group=='wei'&&target!=player); return game.hasPlayer(target=>target.group=='wei'&&target!=player);
}, },
zhuSkill:true, zhuSkill:true,
@ -1102,10 +1133,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
delete:{ delete:{
audio:'sbsongwei', audio:'sbsongwei',
enable:'phaseUse', enable:'phaseUse',
filter:function(event,player){ filter(event,player){
return game.hasPlayer(target=>lib.skill.sbsongwei.subSkill.delete.filterTarget(null,player,target)); return game.hasPlayer(target=>lib.skill.sbsongwei.subSkill.delete.filterTarget(null,player,target));
}, },
filterTarget:function(card,player,target){ filterTarget(card,player,target){
return target!=player&&target.group=='wei'&&target.getStockSkills(false,true).length; return target!=player&&target.group=='wei'&&target.getStockSkills(false,true).length;
}, },
skillAnimation:true, skillAnimation:true,
@ -1117,7 +1148,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ai:{ ai:{
order:13, order:13,
result:{ result:{
target:function(player,target){ target(player,target){
return -target.getStockSkills(false,true).length; return -target.getStockSkills(false,true).length;
}, },
}, },

View File

@ -11484,7 +11484,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
quanjiu_info:'锁定技。①你手牌区中的【酒】的牌名视为【杀】。②你使用对应的实体牌为一张【酒】的非转化【杀】不计入次数限制。', quanjiu_info:'锁定技。①你手牌区中的【酒】的牌名视为【杀】。②你使用对应的实体牌为一张【酒】的非转化【杀】不计入次数限制。',
re_pangdegong:'庞德公', re_pangdegong:'庞德公',
heqia:'和洽', heqia:'和洽',
heqia_info:'出牌阶段开始时,你可选择一项:①将任意张牌交给一名其他角色。②令一名有手牌的其他角色交给你任意张牌。然后以此法得到牌的角色可以视为使用一张基本牌且当其声明使用此牌后可以为此牌增加至至多X个目标X为以此法移动的牌数。', heqia_info:'出牌阶段开始时,你可选择一项:①将任意张牌交给一名其他角色。②令一名有手牌的其他角色交给你任意张牌。然后以此法得到牌的角色可以将一张手牌当作任意基本牌使用且当其声明使用此牌后可以为此牌增加至至多X个目标X为以此法移动的牌数。',
yinyi:'隐逸', yinyi:'隐逸',
yinyi_info:'锁定技。每回合限一次,当你受到非属性伤害时,若你的手牌数和体力值与伤害来源均不相同,则你防止此伤害。', yinyi_info:'锁定技。每回合限一次,当你受到非属性伤害时,若你的手牌数和体力值与伤害来源均不相同,则你防止此伤害。',
haomeng:'郝萌', haomeng:'郝萌',
@ -11492,7 +11492,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
xiongmang_info:'你可将任意张花色各不相同的手牌当做目标数上限为X的【杀】使用X为此【杀】对应的实体牌数。此【杀】使用结算结束后若你未造成过渠道为此牌的伤害则你减1点体力上限。', xiongmang_info:'你可将任意张花色各不相同的手牌当做目标数上限为X的【杀】使用X为此【杀】对应的实体牌数。此【杀】使用结算结束后若你未造成过渠道为此牌的伤害则你减1点体力上限。',
yanfuren:'严夫人', yanfuren:'严夫人',
channi:'谗逆', channi:'谗逆',
channi_info:'出牌阶段限一次。你可将任意张手牌交给一名其他角色,然后其可以将等量的手牌当做【决斗】使用。若其因此【决斗】造成了伤害则其摸X张牌X为此【决斗】对应的实体牌数。若其因此【决斗】受到过伤害则你弃置所有手牌。', channi_info:'出牌阶段限一次。你可将任意张手牌交给一名其他角色,然后其可以将至多等量的手牌当做【决斗】使用。若其因此【决斗】造成了伤害则其摸X张牌X为此【决斗】对应的实体牌数。若其因此【决斗】受到过伤害则你弃置所有手牌。',
nifu:'匿伏', nifu:'匿伏',
nifu_info:'锁定技。一名角色的回合结束时,你将手牌摸至或弃置至三张。', nifu_info:'锁定技。一名角色的回合结束时,你将手牌摸至或弃置至三张。',
licaiwei:'李采薇', licaiwei:'李采薇',