Merge pull request #614 from copcap/dev-chara

孙瑜;成济成倅;小程序刘伶;bug修复
This commit is contained in:
Spmario233 2023-11-07 19:55:15 +08:00 committed by GitHub
commit 5cd230c7d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 512 additions and 137 deletions

Binary file not shown.

BIN
audio/skill/olchuming1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/olchuming2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/oltousui1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/oltousui2.mp3 Normal file

Binary file not shown.

View File

@ -1685,10 +1685,22 @@ game.import('card',function(lib,game,ui,get,ai,_status){
useful:1,
},
result:{
target:-1.5,
target:function(player,target){
if(ui.selected.targets.length){
const preTarget=ui.selected.targets.lastItem;
const eff=get.effect(target,{name:'sha'},preTarget,player);
return Math.sign(eff)*get.sgnAttitude(player,target);
}
const filter=get.info({name:'jiedao'}).filterAddedTarget;
if(game.hasPlayer(current=>{
return filter(null,null,current,target)&&get.effect(current,{name:'sha'},target,player)>=0;
})) return -1;
if(target.mayHaveSha(player,'use')) return 0.25;
return -1;
},
player:function(player){
if(player.getCards('he',{subtype:'equip1'}).length) return 0;
return 1.5;
return 1.25;
},
},
tag:{

View File

@ -561,13 +561,13 @@ game.import('card',function(lib,game,ui,get,ai,_status){
prompt:'是否发动【赠毒】?',
prompt2:'将本次获得的【毒】交给其他角色',
ai1:function(card){
var player = _status.event.player;
if(player.hasSkillTag("usedu")||get.effect(player,{name: "losehp"}, player, player)>0) return 0;
var player=get.player();
if(['usedu','keepdu'].some(tag=>player.hasSkillTag(tag))||get.effect(player,{name:"losehp"},player,player)>0) return 0;
if(!ui.selected.cards.length) return 1;
return 0;
},
ai2:function(target){
if (target.hasSkillTag("usedu")) return get.attitude(_status.event.player,target)-0.01;
if(['usedu','keepdu'].some(tag=>target.hasSkillTag(tag))) return get.attitude(_status.event.player,target)-0.01;
return -get.attitude(_status.event.player,target)+0.01;
},
});

View File

@ -1724,13 +1724,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
filter:function(event,player){
if(event.responded||event.shouli||event.type=='wuxie') return false;
if(game.hasPlayer(function(current){
return current.getCards('e',card=>get.subtype(card)=='equip4').length>0;
return current.getCards('e',card=>get.is.attackingMount(card)).length>0;
})&&event.filterCard({
name:'sha',
storage:{shouli:true},
},player,event)) return true;
if(game.hasPlayer(function(current){
return current.getCards('e',card=>get.subtype(card)=='equip3').length>0;
return current.getCards('e',card=>get.is.defendingMount(card)).length>0;
})&&event.filterCard({
name:'shan',
storage:{shouli:true},
@ -1742,8 +1742,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
filterTarget:function(card,player,target){
var event=_status.event,evt=event;
if(event._backup) evt=event._backup;
var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3');
var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4');
var equip3=target.getCards('e',card=>get.is.defendingMount(card,false));
var equip4=target.getCards('e',card=>get.is.attackingMount(card,false));
if(equip3.length&&equip3.some(card=>evt.filterCard(get.autoViewAs({
name:'shan',
storage:{shouli:true},
@ -1767,8 +1767,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var evt=event.getParent(2);
evt.set('shouli',true);
var list=[];
var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3');
var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4');
var equip3=target.getCards('e',card=>get.is.defendingMount(card,false));
var equip4=target.getCards('e',card=>get.is.attackingMount(card,false));
var backupx=_status.event;
_status.event=evt;
try{
@ -1808,13 +1808,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}).set('cards',cards)
}
else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){
var type=get.subtype(button.link);
return type=='equip3'||type=='equip4';
var card=button.link;
return get.is.attackingMount(card)||get.is.defendingMount(card);
});
'step 1'
var evt=event.getParent(2);
if(result.bool&&result.links&&result.links.length){
var name=(event.cardName||(get.subtype(result.links[0])=='equip4'?'sha':'shan'));
var name=(event.cardName||(get.is.attackingMount(result.links[0])?'sha':'shan'));
if(evt.name=='chooseToUse'){
game.broadcastAll(function(result,name){
lib.skill.shouli_backup.viewAs={
@ -1856,9 +1856,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
respondSha:true,
respondShan:true,
skillTagFilter:function(player,tag){
var subtype=(tag=='respondSha'?'equip4':'equip3');
var func=get.is[tag=='respondSha'?'attackingMount':'defendingMount'];
return game.hasPlayer(function(current){
return current.hasCard(card=>get.subtype(card,false)==subtype,'e');
return current.hasCard(card=>func(card,false),'e');
});
},
order:2,

View File

@ -614,8 +614,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
filterTarget:function(card,player,target){
var event=_status.event,evt=event;
if(event._backup) evt=event._backup;
var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3');
var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4');
var equip3=target.getCards('e',card=>get.is.defendingMount(card,false));
var equip4=target.getCards('e',card=>get.is.attackingMount(card,false));
if(equip3.length&&equip3.some(card=>evt.filterCard(get.autoViewAs({
name:'shan',
storage:{psshouli:true},
@ -639,8 +639,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var evt=event.getParent(2);
evt.set('psshouli',true);
var list=[];
var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3');
var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4');
var equip3=target.getCards('e',card=>get.is.defendingMount(card,false));
var equip4=target.getCards('e',card=>get.is.attackingMount(card,false));
var backupx=_status.event;
_status.event=evt;
try{
@ -680,13 +680,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}).set('cards',cards)
}
else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){
var type=get.subtype(button.link);
return type=='equip3'||type=='equip4';
var card=button.link;
return get.is.attackingMount(card)||get.is.defendingMount(card);
});
'step 1'
var evt=event.getParent(2);
if(result.bool&&result.links&&result.links.length){
var name=(event.cardName||(get.subtype(result.links[0])=='equip4'?'sha':'shan'));
var name=(event.cardName||(get.is.attackingMount(result.links[0])?'sha':'shan'));
if(evt.name=='chooseToUse'){
game.broadcastAll(function(result,name){
lib.skill.psshouli_backup.viewAs={
@ -728,9 +728,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
respondSha:true,
respondShan:true,
skillTagFilter:function(player,tag){
var subtype=(tag=='respondSha'?'equip4':'equip3');
var func=get.is[tag=='respondSha'?'attackingMount':'defendingMount'];
return game.hasPlayer(function(current){
return current.getEquip(subtype);
return current.hasCard(card=>func(card,false),'e');
});
},
order:2,

View File

@ -621,6 +621,7 @@ window.noname_character_rank={
'jsrg_xiahourong',
'jsrg_sunshangxiang',
'jsrg_machao',
'sunyu',
],
bp:[
'chess_diaochan',
@ -981,6 +982,7 @@ window.noname_character_rank={
'jsrg_zhangchu',
'ol_dingshangwan',
'ol_liwan',
'chengjichengcui',
],
b:[
'diy_feishi',

View File

@ -9466,7 +9466,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player:function(player){
if(player.hp<3) return false;
var mindist=player.hp;
if(player.countCards('hs',card=>player.canSave(card,player))) mindist++;
if(player.countCards('hs',card=>player.canSaveCard(card,player))) mindist++;
if(game.hasPlayer(function(current){
return (get.distance(player,current)<=mindist&&
player.canUse('sha',current,false)&&

View File

@ -435,6 +435,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
else{
evt.finish();
evt._triggered=null;
if(evt.name.startsWith('pre_')){
var evtx=evt.getParent();
evtx.finish();
evtx._triggered=null;
}
var nexts=trigger.next.slice();
for(var next of nexts){
if(next.name=='judgeCallback') trigger.next.remove(next);

View File

@ -5687,7 +5687,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var cards1=list[0][1].slice(),cards2=list[1][1].slice();
var card1=cards1.sort((a,b)=>get.value(b)-get.value(a))[0];
var card2=cards2.sort((a,b)=>get.value(a)-get.value(b))[0];
if(get.value(card1)>get.value(card2)){
if(card1&&card2&&get.value(card1)>get.value(card2)){
cards1.remove(card1);
cards2.remove(card2);
cards1.push(card2);

View File

@ -6,6 +6,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
character:{
star_yuanshu:['male','qun',4,['starcanxi','starpizhi','starzhonggu'],['zhu']],
star_caoren:['male','wei',4,['starsujun','starlifeng']],
mp_liuling:['male','jin',3,['mpjiusong','mpmaotao','mpbishi'],['doublegroup:wei:qun:jin']],
dc_jikang:['male','wei',3,['new_qingxian','dcjuexiang']],
dc_jsp_guanyu:['male','wei',4,['new_rewusheng','dcdanji']],
dc_mengda:['male','wei',4,['dclibang','dcwujie']],
@ -56,7 +57,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dongxie:['female','qun',4,['dcjiaoxia','dchumei']],
wangrong:['female','qun',3,['minsi','jijing','zhuide']],
ol_dingyuan:['male','qun',4,['cixiao','xianshuai']],
xin_baosanniang:['female','shu',3,['decadewuniang','decadexushen']],
re_hejin:['male','qun',4,['spmouzhu','spyanhuo']],
re_hansui:['male','qun',4,['spniluan','spweiwu']],
liuhong:['male','qun',4,['yujue','tuxing']],
@ -110,7 +110,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_zhongyuan:['re_hucheer','re_zoushi','caoanmin','re_dongcheng'],
sp_xiaohu:['haomeng','yanfuren','yanrou','dc_zhuling'],
sp_star:['star_caoren','star_yuanshu'],
sp_decade:['caobuxing','re_maliang','xin_baosanniang','dc_jikang'],
mini_qixian:['mp_liuling'],
sp_decade:['caobuxing','re_maliang','dc_jikang'],
}
},
skill:{
@ -420,6 +421,94 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
},
//小程序刘伶
mpjiusong:{
audio:2,
trigger:{global:'useCard'},
filter:function(event,player){
return event.card.name=='jiu'&&player.countMark('mpjiusong')<3;
},
forced:true,
locked:false,
content:function(){
player.addMark('mpjiusong');
},
marktext:'醉',
intro:{
name:'醉(酒颂/酕醄)',
name2:'醉',
content:'mark',
}
},
mpmaotao:{
audio:2,
trigger:{global:'useCardToPlayer'},
filter:function(event,player){
if(event.targets.length!=1||!event.isFirstTarget) return false;
return event.player!=player&&player.countMark('mpjiusong');
},
prompt2:function(event,player){
let list;
if(get.type(event.card)!='delay') list=game.filterPlayer(current=>{
return lib.filter.targetEnabled2(event.card,event.player,current);
});
else list=game.filterPlayer(current=>current.canAddJudge(event.card));
return `移去1枚“醉”${list.length>1?`${get.translation(event.card)}目标改为${get.translation(list)}中的一名随机角色。若新目标与原目标相同,你`:''}获得牌堆中的一张【酒】。`
},
check:function(event,player){
const eff=get.effect(event.target,event.card,player,player);
let list;
if(get.type(event.card)!='delay') list=game.filterPlayer(current=>{
return lib.filter.targetEnabled2(event.card,event.player,current);
});
else list=game.filterPlayer(current=>current.canAddJudge(event.card));
let list2=list.filter(current=>get.effect(current,event.card,player,player)>eff);
let list3=list.filter(current=>get.effect(current,event.card,player,player)>0);
return list2.length>=list.length/2||player.countMark('mpjiusong')>=2&&list3.length>=list.length/2;
},
content:function(){
player.removeMark('mpjiusong',1);
var list,oriTarget=trigger.target;
trigger.targets.remove(oriTarget);
trigger.getParent().triggeredTargets1.remove(oriTarget);
trigger.untrigger();
game.delayx();
if(get.type(trigger.card)!='delay') list=game.filterPlayer(current=>{
return lib.filter.targetEnabled2(trigger.card,trigger.player,current);
});
else list=game.filterPlayer(current=>current.canAddJudge(trigger.card));
if(list.length) target=list.randomGet();
trigger.targets.push(target);
trigger.player.line(target,'thunder');
game.log(trigger.card,'的目标被改为',target);
if(target==oriTarget){
var card=get.cardPile2('jiu');
if(card) player.gain(card,'gain2');
else{
player.chat('没酒了!');
game.log('但是牌堆中已经没有','#y酒','了!');
}
}
},
},
mpbishi:{
audio:2,
forced:true,
trigger:{global:'useCard1'},
filter:function(event,player){
if(get.type2(event.card)!='trick'||!get.tag(event.card,'damage')) return false;
if(!lib.skill.xunshi.isXunshi(event.card)) return false;
const targets=event.targets.slice();
targets.remove(event.player);
return targets.length==game.countPlayer()-2;
},
content:function*(){},
mod:{
targetEnabled:function(card){
if(get.type2(card)=='trick'&&get.tag(card,'damage')>0) return false;
}
}
},
//十周年嵇康
dcjuexiang: {
derivation: 'dccanyun',
@ -4730,7 +4819,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
content:function(){
'step 0'
player.chooseTarget('请选择【抗歌】的目标','其于回合外摸牌后你摸等量的牌其进入濒死状态时你可令其回复体力至1点其死亡后你弃置所有牌并失去1点体力',lib.filter.notMe,true).set('ai',function(target){
return get.attitude(_status.event.player,target)>0;
return get.attitude(_status.event.player,target);
});
'step 1'
if(result.bool){
@ -10198,6 +10287,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
guānning:'关宁,《三国演义》的虚构人物,为关定之子,关平的哥哥,学文。关羽前往冀州寻找刘备时曾居于关定庄,关定命关宁、关平二子出拜。后关羽同刘备回到关定庄时,关羽向刘备介绍关宁、关平二人,关定即提出让关平拜关羽为义父。',
mushun:'穆顺,小说《三国演义》中的人物,男,东汉末宦官。献帝欲修书与国舅伏完,共谋图曹公。因顺为宦官中之忠义可托者,乃命顺往送书。顺藏书于发中,潜出禁宫,径至完宅,将书呈上。及完回书付顺,顺乃藏于头髻内,辞完回宫。然公闻信,先于宫门等候,顺回遇公,公喝左右,遍搜身上,并无夹带,放行。忽然风吹落其帽。公又唤回,取帽视之,遍观无物,还帽令戴。顺双手倒戴其帽。公心疑,令左右搜其头发中,搜出伏完书来。公见书大怒,执下顺于密室问之,顺不肯招。当晚将顺、完等宗族二百余口,皆斩于市。',
jsp_guanyu:'关羽,字云长。曾水淹七军、擒于禁、斩庞德、威震华夏,吓得曹操差点迁都躲避,但是东吴偷袭荆州,关羽兵败被害。后传说吕蒙因关羽之魂索命而死。',
liuling:'刘伶约221年-约300年字伯伦西晋沛国治今安徽濉溪县西北竹林七贤之一中国魏晋时期作家名士。<br>刘伶自幼便失去了父爱因其父亲身材矮小及至长大成人后刘伶身高也不过六尺。魏齐王曹芳正始之末249年刘伶已成为当世名重一时的名士并且常与嵇康、阮籍、阮咸集会于山阳竹林之下饮酒赋诗弹琴作歌。晋武帝司马炎泰始初年265年前后曾做过一段时间的建威参军不久朝廷下诏入宫中策问。他大谈老庄强调无为而治非但没有得到重用反而连参军之职也被罢免了从此再无仕进。晋惠帝司马衷永康元年300年前后以寿而终。<br>刘伶有“品酒第一人”的美称,也被酒行业传颂至今,后人以古瀑河边上的井水酿酒,还取刘伶墓地的黄土垒成窖池酿酒,为了纪念刘伶,当地百姓也将“润泉涌”更名为“刘伶醉”。其传世作品仅有《酒德颂》《北芒客舍》两篇,其中《酒德颂》所表现出的藐视一切存在的气概,敌视礼教之士的反抗精神,既高扬了人格的力量,批判了当时的黑暗政治,同时也抒发了压抑的愤世之情,充满了浪漫色彩,气魄豪迈,用辞又骈偶间行,有无意追求而自至的特点,对后代影响极大。',
},
characterTitle:{
chunyuqiong:'#b对决限定武将',
@ -10791,6 +10881,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dcjuexiang_info:'当你死亡时杀死你的角色弃置其装备区内的所有牌并失去1点体力然后你可以令一名其他角色获得〖残韵〗。',
dccanyun:'残韵',
dccanyun_info:'每名角色限一次。出牌阶段你可以弃置一张牌并选择一名其他角色然后若其装备区里的牌数小于你其回复1点体力大于你其失去1点体力等于你其摸一张牌。若你的体力值为1你摸一张牌。',
mp_liuling:'刘伶',
mpjiusong:'酒颂',
mpjiusong_info:'当一名角色使用【酒】时你获得1枚“醉”标记“醉”数至多为3。',
mpmaotao:'酕醄',
mpmaotao_info:'当其他角色使用牌指定唯一目标时你可以移去1枚“醉”令此牌的目标改为随机一名合法角色无距离限制。若目标角色与原目标相同你从牌堆中获得一张【酒】。',
mpbishi:'避世',
mpbishi_info:'锁定技。你不能成为伤害类锦囊牌的目标。',
star_caoren:'星曹仁',
star_caoren_prefix:'星',
starsujun:'肃军',
@ -10827,6 +10924,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_danqi:'千里单骑',
sp_star:'将星系列',
sp_decade:'其他新服武将',
mini_qixian:'小程序·竹林七贤',
},
pinyins:{
卑弥呼:['Himiko']

View File

@ -127,8 +127,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
kaisa:["male","western",4,["zhengfu"]],
},
characterIntro:{
xiahousone:'三国杀集换式卡牌游戏《阵面对决》中的裂土系列卡牌。游卡桌游官方原创的三国时期女性角色。',
zhangwei:'三国杀集换式卡牌游戏《阵面对决》中的帝畿系列卡牌。游卡桌游官方原创的三国时期女性角色。',
xiahousone:'夏侯子萼,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为在貂蝉不在时血婆娑的实际首领。在海外服中,设定为夏侯惇的养女,继承了夏侯紫萼的血婆娑,之后“夏侯紫萼”这个名字就被隐匿于历史之中,而“夏侯子萼”则成为了血婆娑的首领“血蔷薇”的固定名号。',
zhangwei:'张葳,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为被夏侯子萼救下后加入的血婆娑成员。在海外服中,设定为张奂的养女,张奂为宦官迫害时与其失散,为神秘女子所救并学得武艺,后与夏侯紫萼一起建立血婆娑。在李儒分成时为了保护百姓而牺牲。',
nashime:'难升米(なしめ,或なんしょうまい)是倭国大夫。景初二年六月,受女王卑弥呼之命,与都市牛利出使魏国,被魏国拜为率善中郎将。',
jiachong:'贾充217年—282年字公闾平阳襄陵今山西襄汾三国曹魏至西晋时期大臣曹魏豫州刺史贾逵之子。西晋王朝的开国元勋。出身平阳贾氏。曾参与镇压淮南二叛和弑杀魏帝曹髦因此深得司马氏信任其女儿贾褒一名荃及贾南风分别嫁予司马炎弟司马攸及次子司马衷与司马氏结为姻亲地位显赫。晋朝建立后转任车骑将军、散骑常侍、尚书仆射后升任司空、太尉等要职。更封鲁郡公。咸宁末为使持节、假黄钺、大都督征讨吴国。吴国平定后增邑八千户。太康三年282年贾充去世。西晋朝廷追赠他为太宰礼官议谥曰荒司马炎不采纳改谥为武。有集五卷。',
duosidawang:'朵思大王是《三国演义》中人物,南蛮秃龙洞的元帅,孟获弟弟孟优的朋友,据说是南蛮第一智者。',
@ -298,9 +298,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
selectTarget:[1,3],
multitarget:true,
multiline:true,
group:'twdanlie_add',
content:function(){
'step 0'
player.addTempSkill('twdanlie_effect');
player.chooseToCompare(targets).setContent('chooseToCompareMeanwhile');
'step 1'
if(result.winner&&result.winner==player){
@ -325,18 +325,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
subSkill:{
effect:{
charlotte:true,
trigger:{player:'compare'},
add:{
audio:'twdanlie',
trigger:{player:'compare',target:'compare'},
filter:function(event,player){
return event.getParent().name=='twdanlie'&&!event.iwhile&&player.isDamaged();
if(!player.isDamaged()) return false;
if(player!=event.target&&event.iwhile) return false;
return true;
},
forced:true,
popup:false,
locked:false,
content:function(){
var num=player.getDamagedHp();
if(player==trigger.player){
trigger.num1+=num;
if(trigger.num1>13) trigger.num1=13;
}
else{
trigger.num2+=num;
if(trigger.num2>13) trigger.num2=13;
}
game.log(player,'的拼点牌点数+',num);
},
},
@ -397,8 +405,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.when('useCardAfter').filter(evt=>evt==trigger.getParent()).then(()=>{
if(player.getHistory('sourceDamage',evt=>evt.card==trigger.card).length){
player.draw();
player.addTempSkill('shenzhu_more','phaseUseAfter');
player.addMark('shenzhu_more',1,false);
player.addTempSkill('twhuzhong_sha','phaseUseAfter');
player.addMark('twhuzhong_sha',1,false);
}
else{
target.line(player);
@ -427,6 +435,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){
game.log(result.targets,'成为了',trigger.card,'的额外目标');
}
},
subSkill:{
sha:{
charlotte:true,
onremove:true,
mod:{
cardUsable:function(card,player,num){
if(card.name=='sha') return num+player.countMark('twhuzhong_sha');
},
},
}
}
},
twfenwang:{
audio:2,
@ -500,7 +519,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
subSkill:{
effect:{
charlotte:true,
trigger:{player:'useCard'},
trigger:{player:'useCard1'},
filter:function(event,player){
return get.type(event.card)=='basic'||get.type(event.card)=='trick';
},
@ -514,7 +533,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
name:trigger.card.name,
isCard:true,
};
var targets=trigger.targets.filter(i=>i.isIn());
var targets=trigger.targets.filter(i=>i.isIn()&&player.canUse(card,i,false));
if(targets.length) player.useCard(card,targets,false);
}
});
@ -531,50 +550,65 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger:{global:'damageEnd'},
filter:function(event,player){
if(!event.player.isIn()) return false;
if(event.player.getHistory('damage').indexOf(event)!=0) return false;
return event.player==player||player.inRange(event.player);
},
usable:1,
direct:true,
content:function(){
'step 0'
var list=lib.inpile.filter(name=>{
var type=get.type2(name);
if(type!='basic'&&type!='trick') return false;
return !player.getStorage('twshenyi').includes(name);
var list=get.inpileVCardList(info=>{
return ['basic','trick','delay'].includes(info[0])&&!player.getStorage('twshenyi').includes(info[2]);
});
var dialog=['###'+get.prompt('twshenyi',trigger.player)+'###选择一个牌名,从牌堆中将此一张此牌名的牌称为“侠义”置于武将牌上',[list,'vcard']];
var dialog=[`###${get.prompt('twshenyi',trigger.player)}###<div class="text center">从牌堆中将一张牌作为“侠义”置于武将牌上${player!=trigger.player&&player.countCards('h')?',然后将所有手牌交给其':''}</div>`,[list,'vcard']];
player.chooseButton(dialog).set('ai',function(button){
var trigger=_status.event.getTrigger();
var player=_status.event.player,name=button.link[2];
if(get.attitude(player,trigger.player)<=0) return 0;
if(!get.cardPile2(card=>card.name==name)) return 0;
return get.value({name:name});
var value=get.value({name:name});
if(['tao','jiu','caochuan','wuxie'].includes(name)&&get.event().getRand()>0.4) return value*2;
return value;
});
'step 1'
if(result.bool){
var name=result.links[0][2];
var name=result.links[0][2],nature=result.links[0][3];
var cardx={name:name,nature:nature};
player.logSkill('twshenyi',trigger.player);
player.popup(name);
player.popup(cardx);
player.markAuto('twshenyi',[name]);
game.log(player,'声明了','#y'+get.translation(name));
var card=get.cardPile2(card=>card.name==name);
game.log(player,'声明了',`#y${get.translation(cardx)}`);
var card=get.cardPile2(card=>get.name(card,false)==name&&get.nature(card,false)==nature);
if(card) player.addToExpansion([card],'gain2').gaintag.add('twshenyi');
else{
player.chat('无牌可得?!');
game.log('但是牌堆中已经没有','#y'+get.translation(name),'了!');
}
if(trigger.player!=player&&player.countCards('h')){
game.delayex();
var skill='twshenyi_'+player.playerid;
if(!lib.skill[skill]){
lib.skill[skill]={charlotte:true};
lib.translate[skill]='义·'+get.translation(player.name);
}
game.broadcastAll(lib.skill.twshenyi.createGainTag,skill,player.name);
game.addVideo('skill',player,['twshenyi',[skill,player.name]]);
player.give(player.getCards('h'),trigger.player).gaintag.add(skill);
player.addSkill('twshenyi_draw');
}
}
else player.storage.counttrigger.twshenyi--;
},
video:(player,info)=>lib.skill.twshenyi.createGainTag(info[0],info[1]),
createGainTag:function(skill,name){
if(!lib.skill[skill]){
lib.skill[skill]={charlotte:true};
lib.translate[skill]='义·'+get.translation(name);
}
if(!_status.postReconnect.twshenyi){
_status.postReconnect.twshenyi=[
lib.skill.twshenyi.createGainTag,[],[]
];
}
_status.postReconnect.twshenyi[1].add(skill);
_status.postReconnect.twshenyi[2].add(name);
},
marktext:'义',
intro:{
name:'侠义',
@ -598,56 +632,31 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return game.hasPlayer(target=>{
var evt=event.getl(target);
if(!evt||!evt.hs||!evt.hs.length) return false;
if(event.name=='lose'){
for(var i in event.gaintag_map){
if(event.gaintag_map[i].contains(skill)) return true;
for(let i in evt.gaintag_map){
if(evt.gaintag_map[i].includes(skill)) return true;
}
return false;
}
return target.hasHistory('lose',function(evt){
if(event!=evt.getParent()) return false;
for(var i in evt.gaintag_map){
if(evt.gaintag_map[i].contains(skill)) return true;
}
return false;
});
});
},
forced:true,
direct:true,
content:function(){
var skill='twshenyi_'+player.playerid;
var num=0;
var targets=game.filterPlayer(target=>{
var evt=trigger.getl(target);
var numx=0;
if(!evt||!evt.hs||!evt.hs.length) return false;
if(trigger.name=='lose'){
for(var i in trigger.gaintag_map){
if(trigger.gaintag_map[i].contains(skill)) return true;
}
return false;
}
return target.hasHistory('lose',function(evt){
if(trigger!=evt.getParent()) return false;
for(var i in evt.gaintag_map){
if(evt.gaintag_map[i].contains(skill)) return true;
if(evt.gaintag_map[i].includes(skill)) numx++;
}
if(numx>0) return num+=numx;
return false;
});
}),num=0;
targets.forEach(target=>{
var cards=trigger.getl(target).hs;
if(trigger.name=='lose'){
for(var i in trigger.gaintag_map){
if(trigger.gaintag_map[i].contains(skill)) num++;
if(num>0){
player.logSkill('twshenyi_draw',targets);
player.draw(num);
}
}
else target.getHistory('lose',function(evt){
if(trigger!=evt.getParent()) return false;
for(var i in evt.gaintag_map){
if(evt.gaintag_map[i].contains(skill)) num++;
}
});
});
if(num>0) player.draw(num);
},
},
},
@ -659,23 +668,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return player.getExpansions('twshenyi').length>game.countPlayer();
},
check:function(event,player){
if(player.hp>=3||(player.countCards('h')>=4&&player.getExpansions('twshenyi').every(card=>!player.hasValueTarget(card)||!get.tag(card,'damage')||!lib.skill.xunshi.isXunshi(card)))) return false;
return player.getExpansions('twshenyi').some(card=>player.hasValueTarget(card));
},
prompt2:function(event,player){
return '依次使用武将牌上的“侠义”牌回合结束时弃置所有手牌并将失去X点体力X为你的体力值-1且X至少为1';
},
direct:true,
content:function*(event,map){
var player=map.player;
while(player.getExpansions('twshenyi').some(card=>player.hasValueTarget(card))){
var result=yield player.chooseButton(['兴汉:请选择其中的一张牌使用',player.getExpansions('twshenyi').filter(card=>player.hasValueTarget(card))]).set('ai',function(button){
return _status.event.player.getUseValue(button.link);
});
if(result.bool){
player.chooseToUse(true,result.links[0],false);
var result=yield player.chooseBool().set('createDialog',[
get.prompt('twxinghan'),
`<div class="text center">按顺序使用以下“侠义”牌。但是回合结束时你须弃置所有手牌并失去X点体力X为你的体力值-1且X至少为1</div>`,
player.getExpansions('twshenyi').filter(card=>player.hasUseTarget(card)).reverse(),
'hidden',
]).set('choice',lib.skill.twxinghan.check(null,player));
if(!result.bool){
event.finish();
return;
}
while(true){
var cards=player.getExpansions('twshenyi').filter(card=>player.hasUseTarget(card)).reverse();
if(!cards.length) break;
yield player.chooseUseTarget(true,cards[0],false);
}
player.when('phaseEnd').then(()=>{
if(player.countCards('h')) player.discard(player.getCards('h'));
if(player.countCards('h')) player.chooseToDiscard(player.countCards('h'),true);
var num=Math.max(1,player.getHp()-1);
player.loseHp(num);
});
@ -685,17 +700,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){
init:{
audio:'twxinghan',
trigger:{
player:['loseEnd','dying','dyingAfter'],
player:['loseEnd','dying','die','dyingAfter'],
global:['equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'],
},
filter:function(event,player){
return (player.getExpansions('twshenyi').length&&(!player.countCards('h')||player.isDying()))^player.hasSkill('twxinghan_in');
return (player.getExpansions('twshenyi').length&&event.name!='die'&&(!player.countCards('h')||player.isDying()))^player.hasSkill('twxinghan_in');
},
forced:true,
firstDo:true,
silent:true,
forceDie:true,
content:function(){
if(player.getExpansions('twshenyi').length&&(!player.countCards('h')||player.isDying())){
if(player.getExpansions('twshenyi').length&&trigger.name!='die'&&(!player.countCards('h')||player.isDying())){
var cards=player.getExpansions('twshenyi');
var cardsx=cards.map(card=>{
var cardx=ui.create.card();
@ -15207,7 +15223,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
xia_xiahoudun:'侠夏侯惇',
xia_xiahoudun_prefix:'侠',
twdanlie:'胆烈',
twdanlie_info:'出牌阶段限一次,你可以与至多三名其他角色同时拼点,且你此次的拼点牌点数+XX为你已损失的体力值。若你赢你对这些角色各造成1点伤害若你没赢你失去1点体力。',
twdanlie_info:'①出牌阶段限一次。你可以与至多三名其他角色共同拼点。若你赢,你对没赢的角色依次造成1点伤害若你没赢你失去1点体力。②你的拼点牌点数+XX为你已损失的体力值。',
xia_zhangwei:'张葳',
twhuzhong:'护众',
twhuzhong_info:'当你于出牌阶段使用无属性【杀】指定唯一目标角色时你可以选择一项①弃置一张手牌然后你可以为此牌额外选择一个目标②令其弃置一张手牌此牌结算完毕后若此牌造成过伤害则你摸一张牌且本阶段可以额外使用一张【杀】否则其对你造成1点伤害。',
@ -15219,9 +15235,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
xia_liubei:'侠刘备',
xia_liubei_prefix:'侠',
twshenyi:'伸义',
twshenyi_info:'每回合限一次,当你或你攻击范围内的一名角色受到伤害后,你可以声明一个基本牌或锦囊牌的牌名(每种牌名限一次),然后从牌堆中将一张同名牌称为“侠义”置于武将牌上,然后若受伤角色不为你,则你将所有手牌交给其,且当其失去一张你以此法交给其的牌后,你摸一张牌。',
twshenyi_info:'每回合限一次。当你或你攻击范围内的一名角色于一回合内首次受到伤害后,你可以声明一种基本牌或锦囊牌(每种牌名限一次),然后从牌堆中将一张同名牌称为“侠义”置于武将牌上若受伤角色不为你,则你将所有手牌交给其,且当其失去一张你以此法交给其的牌后,你摸一张牌。',
twxinghan:'兴汉',
twxinghan_info:'①当你没有手牌时或你处于濒死状态时,你可以如手牌般使用或打出你武将牌上的“侠义”牌。②准备阶段,若你武将牌上的“侠义”牌数大于场上的存活角色数,则你可以依次使用其中所有可以使用的牌,然后于回合结束时弃置所有手牌并失去X点体力X为你的体力值-1且X至少为1。',
twxinghan_info:'①当你没有手牌时或你处于濒死状态时,你可以如手牌般使用或打出“侠义”牌。②准备阶段,若“侠义”牌数大于存活角色数,则你可以依次使用其中所有可以使用的牌。然后你获得如下效果:回合结束时,你弃置所有手牌并失去X点体力X为你的体力值-1且X至少为1。',
tw_mobile:'海外服·稀有专属',
tw_yunchouzhi:'运筹帷幄·智',

View File

@ -8,6 +8,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dc_xujing:['male','shu',3,['dcshangyu','dccaixia']],
dc_zhaoxiang:['female','shu',4,['refanghun','refuhan']],
dc_guansuo:['male','shu',4,['xinzhengnan','xiefang']],
xin_baosanniang:['female','shu',3,['decadewuniang','decadexushen']],
dc_shixie:['male','qun',3,['rebiluan','ollixia']],
dc_sp_machao:['male','qun',4,['zhuiji','dc_olshichou']],
old_huangfusong:['male','qun',4,['xinfenyue']],
@ -28,7 +29,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
zhangjinyun:['female','shu',3,['dchuizhi','dcjijiao']],
huanfan:['male','wei',3,['dcjianzheng','dcfumou']],
chentai:['male','wei',4,['dcctjiuxian','dcchenyong']],
sunyu:['male','wu',3,['dcquanshou','dcshexue'],['unseen']],
sunyu:['male','wu',3,['dcquanshou','dcshexue']],
xizheng:['male','shu',3,['dcdanyi','dcwencan']],
dc_ruiji:['female','wu',4,['dcwangyuan','dclingyin','dcliying']],
zerong:['male','qun',4,['dccansi','dcfozong']],
@ -95,7 +96,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji','duanqiaoxiao','tianshangyi'],
sp2_jichu:['zhaoang','dc_liuye','dc_wangyun','yanghong','huanfan','xizheng'],
sp2_yuxiu:['dongguiren','dc_tengfanglan','zhangjinyun','zhoubuyi','dc_xujing'],
sp2_qifu:['dc_guansuo','dc_zhaoxiang'],
sp2_qifu:['dc_guansuo','xin_baosanniang','dc_zhaoxiang'],
sp2_gaoshan:['wanglang','liuhui'],
sp2_wumiao:['wu_zhugeliang','wu_luxun'],
}
@ -155,7 +156,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(shown.length<cards.length){
var num=cards.length-shown.length;
player.$draw(num);
game.log(player,'从牌堆获得了',num,'张点数为8的牌');
game.log(player,'从牌堆获得了',get.cnNumber(num),'张点数为8的牌');
}
if(shown.length>0){
player.$gain2(shown,false);
@ -1506,7 +1507,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(type=='equip'&&game.hasPlayer(current=>{
return current.canEquip(card);
})||type=='delay'&&game.hasPlayer(current=>{
return !current.storage._disableJudge&&!current.hasJudge(card.name);
return current.canAddJudge(card);
})) choices.unshift('场上');
player.chooseControl(choices).set('prompt','请选择要将'+get.translation(card)+'置于的位置').set('ai',()=>{
return _status.event.choice;
@ -1526,7 +1527,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return _status.event.targets.contains(target);
}).set('targets',game.filterPlayer(current=>{
if(type=='equip') return current.canEquip(card);
if(type=='delay') return !current.storage._disableJudge&&!current.hasJudge(card.name);
if(type=='delay') return current.canAddJudge(card);
return false;
})).set('ai',target=>{
var player=_status.event.player;
@ -1539,7 +1540,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
else{
player.$throw(card,1000);
var next=player.lose(card,ui.cardPile);
var next=player.lose(card,ui.cardPile,'visible');
if(result.control=='牌堆顶') next.insert_card=true;
game.log(player,'将',card,'置于了','#y'+result.control);
}
@ -1555,7 +1556,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
target.addJudge(card);
}
}
if(event.count<4) event.goto(1);
'step 5'
game.countPlayer(current=>{
var count=current.countCards('e');
@ -1564,7 +1564,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
current.link(false);
current.turnOver(false);
}
event.equipCount[current.playerid]=count;
});
if(event.count<4) event.goto(1);
}
},
//杜预
@ -3145,11 +3147,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
trigger:{global:'phaseBegin'},
filter:function(event,player){
return event.player.countCards('h')<event.player.maxHp;
return event.player.countCards('h')<=event.player.maxHp;
},
logTarget:'player',
check:function(event,player){
return get.attitude(player,event.player)>0||event.player.maxHp-event.player.countCards('h')<=2;
if(get.attitude(player,event.player)>0) return true;
const draw=event.player.maxHp-event.player.countCards('h');
return draw<=2&&event.player.getHp(true)-draw>=1;
},
content:function(){
'step 0'
@ -3161,7 +3165,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var draw=Math.min(5,Math.max(0,trigger.player.maxHp-trigger.player.countCards('h')));
if(get.attitude(trigger.player,player)>0){
if(draw>=3||trigger.player.getCardUsable('sha')>1) return '选项一';
if(draw<=1&&trigger.player.countCards('hs',card=>{
if(!draw||draw<=1&&trigger.player.countCards('hs',card=>{
return get.name(card)=='sha'&&trigger.player.hasValueTarget(card);
})) return '选项二';
return '选项一';
@ -3212,7 +3216,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
popup:false,
charlotte:true,
onremove:true,
marktext:'守',
marktext:'<span style="text-decoration: line-through;"></span>',
intro:{content:'本回合使用的牌被抵消后,$摸一张牌'},
content:function(){
var targets=player.getStorage('dcquanshou_respond');
@ -3232,7 +3236,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger:{player:'phaseUseBegin'},
filter:function(event,player){
var card=lib.skill.dcshexue.getLast();
return card&&player.hasUseTarget(card);
return card&&player.hasUseTarget(card,false);
},
getLast:function(){
for(var current of game.filterPlayer()){
@ -3258,10 +3262,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var card=lib.skill.dcshexue.getLast();
game.broadcastAll(function(card){
lib.skill.dcshexue_backup.viewAs=card;
lib.skill.dcshexue_backup.prompt='设学:是否将一张牌当做'+get.translation(card)+'使用?';
},card);
var next=player.chooseToUse();
next.set('openskilldialog','设学:是否将一张牌当做'+get.translation(card)+'使用?');
next.set('openskilldialog',`###${get.prompt('dcshexue')}###将一张牌当做${get.translation(card.nature)||''}${get.translation(card.name)}】使用`);
next.set('norestore',true);
next.set('addCount',false);
next.set('_backupevent','dcshexue_backup');
@ -3277,6 +3280,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
filterCard:function(card){
return get.itemtype(card)=='card';
},
filterTarget:lib.filter.targetEnabled,
position:'hes',
selectCard:1,
check:(card)=>6-get.value(card),
@ -3297,6 +3301,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var card=history[history.length-1].card;
return '令下一回合的角色于其出牌阶段开始时选择是否将一张牌当做'+(get.translation(card.nature)||'')+'【'+get.translation(card.name)+'】使用';
},
check:function(event,player){
let evt=event.getParent('phase').getParent();
let nextPlayer=player.getNext();
if(evt&&evt.next&&evt.next.length){
nextPlayer=evt.next[0].player;
}
return get.attitude(player,nextPlayer)>0;
},
content:function(){
var history=player.getHistory('useCard',evt=>{
return evt.getParent('phaseUse')==trigger&&(get.type(evt.card)=='basic'||get.type(evt.card)=='trick');
@ -3311,7 +3323,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
study:{
trigger:{player:'phaseUseBegin'},
filter:function(event,player){
return player.getStorage('dcshexue_study').some(i=>event.player.hasUseTarget(i));
return player.getStorage('dcshexue_study').some(i=>event.player.hasUseTarget(i,false));
},
onremove:true,
charlotte:true,
@ -3321,13 +3333,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
event.cards=player.getStorage('dcshexue_study');
'step 1'
var card=cards.pop();
if(trigger.player.hasUseTarget(card)){
if(trigger.player.hasUseTarget(card,false)){
game.broadcastAll(function(card){
lib.skill.dcshexue_backup.viewAs=card;
lib.skill.dcshexue_backup.prompt='设学:是否将一张牌当做'+get.translation(card)+'使用?';
},card);
var next=trigger.player.chooseToUse();
next.set('openskilldialog','设学:是否将一张牌当做'+get.translation(card)+'使用?');
next.set('openskilldialog',`###${get.prompt('dcshexue_study')}###将一张牌当做${get.translation(card.nature)||''}${get.translation(card.name)}】使用`);
next.set('norestore',true);
next.set('addCount',false);
next.set('_backupevent','dcshexue_backup');
@ -10226,7 +10238,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){
enable:'phaseUse',
usable:1,
filter:function(event,player){
return !player.storage.zunwei||player.storage.zunwei.length<3;
let storage=player.getStorage('zunwei');
return storage.length<3&&game.hasPlayer(current=>{
return player.isDamaged()&&current.getHp()>player.getHp()&&!storage.includes(0)||
current.countCards('h')>player.countCards('h')&&!storage.includes(1)||
current.countCards('e')>player.countCards('e')&&!storage.includes(2);
});
},
chooseButton:{
dialog:function(event,player){
@ -10237,12 +10254,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){
];
var choiceList=ui.create.dialog('尊位:请选择一项','forcebutton','hidden');
choiceList.add([list.map((item,i)=>{
if(player.getStorage('zunwei').includes(i)) item=`<span style="text-decoration: line-through;">${item}</span>`;
return [i,item];
}),'textbutton'])
return choiceList;
},
filter:function(button){
return button._filterButton;
const player=get.player();
if(player.getStorage('zunwei').includes(button.link)) return false;
if(button.link==0){
if(!player.isDamaged()) return false;
return game.hasPlayer(current=>{
return current.getHp()>player.getHp();
});
}
if(button.link==1){
return game.hasPlayer(current=>{
return current.countCards('h')>player.countCards('h');
});
}
if(button.link==2){
return game.hasPlayer(current=>{
return current.countCards('e')>player.countCards('e');
});
}
},
backup:function(links){
var next=get.copy(lib.skill.zunwei.backups[links[0]]);
@ -12680,9 +12715,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dcchenyong_info:'结束阶段你可以摸X张牌X为本回合你使用过的牌的类型数。',
sunyu:'孙瑜',
dcquanshou:'劝守',
dcquanshou_info:'一名角色的回合开始时,若其手牌数于其体力上限你可以令其选择一项1.将手牌摸至体力上限,然后本回合使用【杀】的次数上限-1至多摸五张2.其本回合使用牌被抵消后,你摸一张牌。',
dcquanshou_info:'一名角色的回合开始时,若其手牌数不大于其体力上限你可以令其选择一项1.将手牌摸至体力上限,然后本回合使用【杀】的次数上限-1至多摸五张2.其本回合使用牌被抵消后,你摸一张牌。',
dcshexue:'设学',
dcshexue_info:'①出牌阶段开始时,你可以将一张牌当做上回合的角色于其出牌阶段内使用的最后一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的最后一张基本牌或普通锦囊牌使用。',
dcshexue_info:'①出牌阶段开始时,你可以将一张牌当做上回合的角色于其出牌阶段内使用的最后一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的最后一张基本牌或普通锦囊牌使用(一名角色因〖设学〗使用的牌均无距离和次数限制)。',
xizheng:'郤正',
dcdanyi:'耽意',
dcdanyi_info:'当你使用牌指定第一个目标后若此牌的目标与你使用的上一张牌目标相同你可以摸X张牌X为此牌目标数。',

View File

@ -4,6 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
name:'yingbian',
connect:true,
character:{
chengjichengcui:['male','jin',6,['oltousui','olchuming']],
wangxiang:['male','jin',3,['bingxin']],
jin_jiachong:['male','jin',3,['xiongshu','jianhui']],
xuangongzhu:['female','jin',3,['gaoling','qimei','ybzhuiji'],['hiddenSkill']],
@ -37,6 +38,151 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
skill:{
//二成
oltousui:{
audio:2,
enable:'chooseToUse',
viewAsFilter:function(player){
return player.countCards('he');
},
viewAs:{
name:'sha',
suit:'none',
number:null,
isCard:true,
},
filterCard:true,
selectCard:[1,Infinity],
position:'he',
check:function(card){
const player=get.player();
return 4.5+(player.hasSkill('olchuming')?1:0)-1.5*ui.selected.cards.length-get.value(card);
},
popname:true,
ignoreMod:true,
precontent:function*(event,map){
var player=map.player;
var evt=event.getParent();
if(evt.dialog&&typeof evt.dialog=='object') evt.dialog.close();
player.logSkill('oltousui');
delete event.result.skill;
var cards=event.result.cards;
player.loseToDiscardpile(cards,ui.cardPile,false,'blank').log=false;
var shownCards=cards.filter(i=>get.position(i)=='e'),handcardsLength=cards.length-shownCards.length;
if(shownCards.length){
player.$throw(shownCards,null);
game.log(player,'将',shownCards,'置于了牌堆底');
}
if(handcardsLength>0){
player.$throw(handcardsLength,null);
game.log(player,'将',get.cnNumber(handcardsLength),'张牌置于了牌堆底');
}
game.delayex();
var viewAs=new lib.element.VCard({name:event.result.card.name,isCard:true});
event.result.card=viewAs;
event.result.cards=[];
event.result._apply_args={
shanReq:cards.length,
oncard:()=>{
var evt=get.event();
for(var target of evt.targets){
var id=target.playerid;
var map=evt.customArgs;
if(!map[id]) map[id]={};
map[id].shanRequired=evt.shanReq;
}
}
};
},
ai:{
order:function(item,player){
return get.order({name:'sha'})+0.1;
},
result:{player:1},
keepdu:true,
respondSha:true,
skillTagFilter:(player,tag,arg)=>{
if(tag=='respondSha'&&arg!='use') return false;
},
},
},
olchuming:{
audio:2,
trigger:{
source:'damageBegin1',
player:'damageBegin3',
},
filter:function(event,player){
return event.source!=event.player;
},
forced:true,
content:function*(event,map){
var player=map.player,trigger=map.trigger;
if(!trigger.card||!trigger.cards.length){
trigger.num++;
event.finish();
return;
}
else{
var target=trigger[trigger.source==player?'player':'source'];
trigger._olchuming=true;
target.addTempSkill('olchuming_effect');
}
},
ai:{
effect:{
player:function(card,player,target){
if(!get.tag(card,'damage')) return;
if(!lib.card[card.name]||!card.cards||!card.cards.length) return [1,0,1,-1];
return [1,-1];
},
},
},
subSkill:{
effect:{
charlotte:true,
trigger:{global:'phaseEnd'},
forced:true,
popup:false,
content:function*(event,map){
var player=map.player;
var mapx={};
var history=player.getHistory('damage').concat(player.getHistory('sourceDamage'));
history.forEach(evt=>{
if(!evt._olchuming) return;
var target=evt[evt.source==player?'player':'source'];
if(!target.isIn()) return;
if(!mapx[target.playerid]) mapx[target.playerid]=[];
mapx[target.playerid].addArray(evt.cards.filterInD('d'));
});
var entries=Object.entries(mapx).map(entry=>{
return [(_status.connectMode?lib.playerOL:game.playerMap)[entry[0]],entry[1]];
});
if(!entries.length){
event.finish();
return;
}
player.logSkill('olchuming_effect',entries.map(i=>i[0]));
entries.sort((a,b)=>lib.sort.seat(a[0],b[0]));
for(var entry of entries){
var current=entry[0],cards=entry[1];
var list=['jiedao','guohe'].filter(i=>player.canUse(new lib.element.VCard({name:i,cards:cards}),current,false));
if(!list.length) return;
var result=({});
if(list.length==1) result={bool:true,links:[['','',list[0]]]};
else result=yield player.chooseButton([`畜鸣:请选择要对${get.translation(current)}使用的牌`,[list,'vcard']],true).set('ai',button=>{
var player=get.player();
return get.effect(get.event('currentTarget'),{name:button.link[2]},player,player);
}).set('currentTarget',current);
if(result.bool){
var card=get.autoViewAs({name:result.links[0][2]},cards);
if(player.canUse(card,current,false)) player.useCard(card,cards,current,false);
}
}
}
}
}
},
bingxin:{
audio:2,
enable:'chooseToUse',
@ -3586,6 +3732,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
xuangongzhu:'高陵宣公主司马氏晋宣帝司马懿第二女。司马氏下嫁杜预。其侄司马炎登基时司马氏已经去世。泰始年间265年—274年追赠高陵公主。',
jin_guohuai:'郭槐237年-296年字媛韶太原阳曲今山西太原魏晋权臣贾充的妻子。父亲是曹魏城阳郡太守郭配伯父是曹魏名将郭淮。出身太原郭氏。二十一岁时嫁贾充作继室生二女二子长女贾南风次女贾午一子贾黎民。贾南风是西晋惠帝司马衷皇后干预国政专权误国直接导致“八王之乱”和西晋亡国。',
wangxiang:'王祥184年一作180年268年4月30日字休徵。琅邪临沂今山东省临沂市西孝友村人。三国曹魏及西晋时大臣。王祥于东汉末隐居二十年在曹魏先后任县令、大司农、司空、太尉等职封爵睢陵侯。西晋建立拜太保进封睢陵公。泰始四年四月戊戌日268年4月30日去世年八十五一作八十九谥号“元”。有《训子孙遗令》一文传世。王祥侍奉后母朱氏极孝为传统文化中二十四孝之一“卧冰求鲤”的主人翁。',
chengjichengcui:'成倅、成济260年6月21日扬州丹阳今安徽省宣城市人。三国时期曹魏将领。依附于司马氏家族得到司马昭的心腹贾充指使刺死魏帝曹髦。司马昭为平息众怒将成倅、成济兄弟二人杀死。据《魏氏春秋》记载成济兄弟不服罪光着身子跑到屋顶大骂司马昭被军士从下乱箭射杀。',
},
characterTitle:{},
characterFilter:{},
@ -3802,6 +3949,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
qiaoyan_info:'锁定技,当你于回合外受到其他角色造成的伤害时,若你:有“珠”,则你令伤害来源获得“珠”;没有“珠”,则你防止此伤害,然后摸一张牌,并将一张牌正面朝上置于武将牌上,称为“珠”。',
xianzhu:'献珠',
xianzhu_info:'锁定技出牌阶段开始时你令一名角色A获得“珠”。若A不为你自己则你选择A攻击范围内的一名角色B视为A对B使用一张【杀】。',
chengjichengcui:'成济成倅',
oltousui:'透髓',
oltousui_info:'你可以将任意张牌置于牌堆底,视为使用一张需使用等量张【闪】抵消的【杀】。',
olchuming:'畜鸣',
olchuming_info:'锁定技。当你对其他角色造成伤害时,或当你受到其他角色造成的伤害时,若此伤害的渠道不为牌或没有对应的实体牌,此伤害+1否则其于本回合结束时将所有以此法造成伤害的牌当【借刀杀人】或【过河拆桥】对你使用。',
yingbian_pack1:'文德武备·理',
yingbian_pack2:'文德武备·备',

View File

@ -16234,6 +16234,9 @@
'step 4'
player.$compareMultiple(event.card1,targets,cards);
game.log(player,'的拼点牌为',event.card1);
event.cardlist.forEach((card,index)=>{
game.log(targets[index],'的拼点牌为',card);
});
player.animate('target');
game.delay(0,1000);
'step 5'
@ -16245,7 +16248,6 @@
event.target.animate('target');
event.card2=event.cardlist[event.iwhile];
event.num2=event.getNum(event.card2);
game.log(event.target,'的拼点牌为',event.card2);
//event.tempplayer.line(event.target);
delete event.player;
event.trigger('compare');
@ -58224,6 +58226,26 @@
},
};
const get={
/**
* 返回 VCard[] 形式的所有牌用于印卡将遍历
* @param {Function} filter
* @returns {string[][]}
*/
inpileVCardList:filter=>{
let list=[];
for(const name of lib.inpile){
const type=get.type(name);
const info=[type,'',name];
if(!filter||filter(info)) list.push(info);
if(name=='sha'){
for(const nature of lib.inpile_nature){
const info=[type,'',name,nature];
if(!filter||filter(info)) list.push(info);
}
}
}
return list;
},
/**
* 根据座次数n从0开始获取对应的n+1号位翻译
* @param {number} seat
@ -58479,6 +58501,38 @@
return 0;
},
is:{
/**
* 判断是否为进攻坐骑
* @param {Card | VCard} card
* @param {false | Player} [player]
* @returns {boolean}
*/
attackingMount:(card,player)=>{
const subtype=get.subtype(card,player);
if(subtype=='equip4') return true;
else if(subtype=='equip6'){
const info=get.info(card,player),distance=info.distance;
if(!distance) return false;
if(distance.globalFrom&&!info.notMount) return true;
}
return false;
},
/**
* 判断是否为防御坐骑
* @param {Card | VCard} card
* @param {false | Player} [player]
* @returns {boolean}
*/
defendingMount:(card,player)=>{
const subtype=get.subtype(card,player);
if(subtype=='equip3') return true;
else if(subtype=='equip6'){
const info=get.info(card,player),distance=info.distance;
if(!distance) return false;
if(distance.globalTo&&!info.notMount) return true;
}
return false;
},
/**
* 判断坐骑栏是否被合并
*/

View File

@ -64,6 +64,7 @@ var pinyin_dict_polyphone = {
"库特莉亚芙卡": " kǎ",
"露娜": "lù ",
// 技能名
"畜鸣": "chù ",
"聆乐": " yuè",
"没矢": "mò ",
"没欲": "mò ",

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

BIN
image/character/sunyu.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

View File

@ -3167,7 +3167,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
return x/num;
}
var real=get.realAttitude(from,to),zhibi=from.storage.zhibi,stratagem_expose=from.storage.stratagem_expose,followCamouflage=true;
if(to.ai.shown) return to.ai.shown*(real+(from.identity==to.identity||from.identity=='zhu'&&to.identity=='zhong'||from.identity=='zhong'&&to.identity=='zhu'||(to.identity=='nei'&&get.situation()<=0&&['zhu','zhong'].contains(from.identity)||get.situation()>=3&&from.identity=='fan')?3:-3))
if(to.ai.shown) return to.ai.shown*(real+(from.identity==to.identity||from.identity=='zhu'&&to.identity=='zhong'||from.identity=='zhong'&&to.identity=='zhu'||from.identity=='nei'&&to.identity=='zhu'&&get.situation()<=1||(to.identity=='nei'&&get.situation()<=0&&['zhu','zhong'].contains(from.identity)||get.situation()>=3&&from.identity=='fan')?2.9:-2.9))
if(from==to||to.identityShown||((stratagem_expose&&stratagem_expose.contains(to))||(zhibi&&zhibi.contains(to)))&&!to.ai.stratagemCamouflage) return real*1.1;
if(from.identity=='nei'&&to.ai.stratagemCamouflage) return real*1.1;
if(to.identity=='nei'){