Merge branch 'libccy:PR-Branch' into PR-Branch

This commit is contained in:
157 2023-11-09 12:41:01 +08:00 committed by GitHub
commit f3bfa1061f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
54 changed files with 559 additions and 416 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/skill/chanyuan1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/chanyuan2.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/skill/rechanyuan1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/rechanyuan2.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -208,12 +208,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(name=='sha'&&get.type(trigger.card.name)!='trick') continue;
if(!player.canUse(get.autoViewAs({name:name},[]),target)) continue;
list.push([get.translation(get.type(name)),'',name]);
if(name=='sha'){
for(var nature of lib.inpile_nature){
if(!player.canUse(get.autoViewAs({name:name,nature:nature},[]),target)) continue;
list.push([get.translation(get.type(name)),'',name,nature]);
}
}
}
if(!list.length) event.goto(3);
else{

View File

@ -20,7 +20,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_fuhuanghou:['female','qun',3,['spcangni','spmixin']],
sp_fuwan:['male','qun',3,['spfengyin','spchizhong']],
old_lingju:['female','qun',3,['jieyuan','fenxin_old']],
sp_mushun:['male','qun',4,['dcmoukui']],
sp_mushun:['male','qun',4,['moukui']],
},
characterFilter:{
old_lingju:function(mode){
@ -598,31 +598,37 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
},
},
content_old:function(){
init:function(player){
player.addSkill('dcshixian_yayun');
var history=player.getAllHistory('useCard');
if(history.length){
player.addGaintag(player.getCards('h',card=>{
return get.is.yayun(get.translation(card.name),get.translation(history[history.length-1].card.name));
}),'dcshixian_yayun');
}
},
onremove:function(player){
player.removeSkill('dcshixian_yayun');
player.removeGaintag('dcshixian_yayun');
},
subSkill:{
yayun:{
charlotte:true,
trigger:{player:'useCard1'},
filter:function(event,player){
return player.countCards('h');
},
direct:true,
priority:11+45+14+19+19+810,
content:function(){
'step 0'
if(lib.skill.dcshixian.filterx(trigger)){
player.chooseControl('cancel2').set('choiceList',[
'摸一张牌',
'令'+get.translation(trigger.card)+'额外结算一次',
]).set('prompt',get.prompt('dcsitian'));
}
else{
player.chooseBool('是否发动【诗仙】摸一张牌?').set('frequentSkill','dcshixian');
}
player.removeGaintag('dcshixian_yayun');
'step 1'
if(result.control){
if(result.index==0){
player.logSkill('dcshixian');
player.draw();
}
else if(result.index==1){
trigger.effectCount++;
}
}
else if(result.bool){
player.logSkill('dcshixian');
player.draw();
}
player.addGaintag(player.getCards('h',card=>{
return get.is.yayun(get.translation(card.name),get.translation(trigger.card.name));
}),'dcshixian_yayun');
},
},
},
},
//龙王
@ -1281,9 +1287,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
direct:true,
content:function(){
'step 0'
player.chooseDrawRecover('###'+get.prompt('spcangni')+'###摸两张牌或回复1点体力然后将武将牌翻面',2).set('ai',function(){
return 'cancel2';
}).logSkill='spcangni';
player.chooseDrawRecover('###'+get.prompt('spcangni')+'###摸两张牌或回复1点体力然后将武将牌翻面',2).logSkill='spcangni';
'step 1'
if(result.control!='cancel2') player.turnOver();
},
@ -1566,6 +1570,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dclbjiuxian:'酒仙',
dclbjiuxian_info:'①你可以将额定目标数大于1的锦囊牌当做【酒】使用。②你使用【酒】无次数限制。',
dcshixian:'诗仙',
dcshixian_yayun:'押韵',
dcshixian_info:'当你使用一张牌时,若此牌的牌名与你于本局游戏使用的上一张牌的牌名押韵,则你可以摸一张牌,并令此牌额外结算一次。',
taoshen:'涛神',
dcnutao:'怒涛',

View File

@ -41,7 +41,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
shen_taishici:['male','shen',4,['dulie','tspowei'],['wu']],
shen_guojia:['male','shen',3,['reshuishi','stianyi','resghuishi'],['wei']],
shen_diaochan:['female','shen',3,['meihun','huoxin'],['qun']],
shen_guanyu:['male','shen',5,['new_wuhun','wushen'],['shu']],
shen_guanyu:['male','shen',5,['wushen','new_wuhun'],['shu']],
shen_zhaoyun:['male','shen',2,['xinjuejing','relonghun'],['shu']],
shen_zhugeliang:['male','shen',3,['qixing','kuangfeng','dawu'],['shu']],
shen_lvmeng:['male','shen',3,['shelie','gongxin'],['wu']],
@ -4414,98 +4414,75 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
wuhun2:{audio:2},
wuhun21:{
audio:true,
skillAnimation:true,
animationColor:'soil',
},
wuhun22:{
audio:true,
skillAnimation:true,
animationColor:'soil',
},
wuhun23:{
audio:true,
skillAnimation:true,
animationColor:'soil',
},
"new_wuhun":{
audio:"wuhun2",
group:["new_wuhun_mark","new_wuhun_die","wuhun22","wuhun23"],
trigger:{
player:"damageEnd",
new_wuhun:{
audio:'wuhun2',
trigger:{player:'damageEnd'},
filter:function(event,player){
return event.source&&event.source.isIn();
},
forced:true,
filter:function (event,player){
return event.source!=undefined;
},
logTarget:'source',
content:function(){
trigger.source.addMark('new_wuhun_mark',trigger.num);
trigger.source.addMark('new_wuhun',trigger.num);
},
group:'new_wuhun_die',
ai:{
threaten:0.01,
notemp:true,
},
marktext:'魇',
intro:{
name:'梦魇',
content:'mark',
onunmark:true,
},
subSkill:{
die:{
//audio:"wuhun2",
skillAnimation:true,
animationColor:'soil',
trigger:{
player:"die",
},
forced:true,
forceDie:true,
direct:true,
audio:'wuhun2',
trigger:{player:'die'},
filter:function(event,player){
return game.hasPlayer(function(current){
return current!=player&&current.hasMark('new_wuhun_mark');
return current!=player&&current.hasMark('new_wuhun');
});
},
forced:true,
direct:true,
forceDie:true,
skillAnimation:true,
animationColor:'soil',
content:function(){
"step 0"
'step 0'
var num=0;
for(var i=0;i<game.players.length;i++){
var current=game.players[i];
if(current!=player&&current.countMark('new_wuhun_mark')>num){
num=current.countMark('new_wuhun_mark');
if(current!=player&&current.countMark('new_wuhun')>num){
num=current.countMark('new_wuhun');
}
}
player.chooseTarget(true,'请选择【武魂】的目标',function(card,player,target){
return target!=player&&target.countMark('new_wuhun_mark')==_status.event.num;
player.chooseTarget(true,'请选择【武魂】的目标','令其进行判定,若判定结果不为【桃】或【桃园结义】,则其死亡',function(card,player,target){
return target!=player&&target.countMark('new_wuhun')==_status.event.num;
}).set('ai',function(target){
return -get.attitude(_status.event.player,target);
}).set('forceDie',true).set('num',num);
"step 1"
if(result.bool&&result.targets&&result.targets.length){
'step 1'
if(result.bool){
var target=result.targets[0];
event.target=target;
player.logSkill(Math.random()<0.5?'wuhun21':'wuhun22',target);
player.logSkill('new_wuhun_die',target);
player.line(target,{color:[255, 255, 0]});
game.delay(2);
}
"step 2"
'step 2'
target.judge(function(card){
if(['tao','taoyuan'].contains(card.name)) return 10;
return -10;
}).judge2=function(result){
return result.bool==false?true:false;
};
"step 3"
if(!result.bool){
lib.element.Player.prototype.die.apply(target,[]);
}
},
sub:true,
},
mark:{
marktext:"魇",
intro:{
name:"梦魇",
content:"mark",
},
sub:true,
'step 3'
if(!result.bool) target.die();
},
},
ai:{
threaten:0.01,
notemp:true,
},
},
"new_guixin":{
@ -4989,7 +4966,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
maixie:true,
maixie_hp:true,
combo:'sbaiyin',
/*effect:{
effect:{
target:function(card,player,target){
if(player.hasSkillTag('jueqing',false,target)) return [1,-2];
if(get.tag(card,'damage')){
@ -5013,7 +4990,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return 'zeroplayertarget';
}
}
}*/
}
}
},
renjie2:{
@ -5030,7 +5007,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
content:function(){
player.addMark('renjie',trigger.getl(player).cards2.length);
}
},
},
sbaiyin:{
skillAnimation:'epic',
@ -5048,11 +5025,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.addSkill('jilue');
player.awakenSkill('sbaiyin');
},
derivation:'jilue',
derivation:['jilue','reguicai','fangzhu','rejizhi','rezhiheng','rewansha'],
},
jilue:{
unique:true,
group:['jilue_guicai','jilue_fangzhu','jilue_wansha','jilue_zhiheng','jilue_jizhi','jilue_jizhi_clear']
group:['jilue_guicai','jilue_fangzhu','jilue_wansha','jilue_zhiheng','jilue_jizhi'],
},
jilue_guicai:{
audio:1,
@ -5253,7 +5230,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
skillTagFilter:function(player,tag,arg){
if(tag==='nokeep') return player.isPhaseUsing()&&!player.getStat().skill.jilue_zhiheng&&player.hasCard((card)=>get.name(card)!=='tao','h');
},
threaten:1.5
},
},
jilue_jizhi:{
@ -5262,9 +5238,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
filter:function(event,player){
return (get.type(event.card,'trick')=='trick'&&event.card.isCard&&player.hasMark('renjie'));
},
init:function(player){
player.storage.jilue_jizhi=0;
},
content:function(){
'step 0'
player.removeMark('renjie',1);
@ -5279,33 +5252,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 2'
if(result.bool){
player.discard(event.card);
player.storage.jilue_jizhi++;
if(_status.currentPhase==player){
player.markSkill('jilue_jizhi');
player.addTempSkill('jilue_jizhi_clear');
player.addMark('jilue_jizhi_clear',1,false);
}
}
},
ai:{
threaten:1.4
},
mod:{
maxHandcard:function(player,num){
return num+player.storage.jilue_jizhi;
}
},
intro:{
content:'本回合手牌上限+#',
},
subSkill:{
clear:{
trigger:{global:'phaseAfter'},
silent:true,
content:function(){
player.storage.jilue_jizhi=0;
player.unmarkSkill('jilue_jizhi');
}
}
}
charlotte:true,
onremove:true,
mod:{
maxHandcard:function(player,num){
return num+player.countMark('jilue_jizhi_clear');
},
},
intro:{content:'手牌上限+#'},
},
},
},
wushen:{
mod:{
@ -5350,161 +5312,39 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
},
wuhun:{
trigger:{
player:"damageEnd",
},
//alter:true,
filter:function (event,player){
if(event.source==undefined) return false;
if(!get.is.altered('wuhun')) return false
return true;
},
forced:true,
content:function (){
if(!trigger.source.storage.wuhun_mark){
trigger.source.storage.wuhun_mark=0;
}
trigger.source.storage.wuhun_mark+=trigger.num;
trigger.source.syncStorage('wuhun_mark');
trigger.source.markSkill('wuhun_mark');
},
global:["wuhun_mark"],
subSkill:{
mark:{
marktext:"魇",
intro:{
content:"mark",
},
sub:true,
},
},
group:["wuhun2","wuhun4","wuhun5"],
},
wuhun2:{
trigger:{
player:'dieBegin',
},
forced:true,
popup:false,
filter:function (event,player){
for(var i=0;i<game.players.length;i++){
if(game.players[i].storage.wuhun_mark) return true;
}
return false;
},
content:function (){
"step 0"
player.chooseTarget(true,get.prompt('wuhun2'),function(card,player,target){
if(player==target) return false;
if(!target.storage.wuhun_mark) return false;
for(var i=0;i<game.players.length;i++){
if(game.players[i].storage.wuhun_mark>target.storage.wuhun_mark){
return false;
}
}
return true;
}).set('ai',function(target){
return -ai.get.attitude(_status.event.player,target);
});
"step 1"
player.line(result.targets[0],'fire');
result.targets[0].addSkill('wuhun3')
},
ai:{
threaten:0.5,
effect:{
target:function (card,player,target,current){
if(get.tag(card,'damage')){
if(player.hasSkill('jueqing')) return [1,-5];
var hasfriend=false;
for(var i=0;i<game.players.length;i++){
if(game.players[i]!=target&&ai.get.attitude(game.players[i],target)>=0){
hasfriend=true;break;
}
}
if(!hasfriend) return;
if(player.hp>2&&ai.get.attitude(player,target)<=0) return [0,2];
return [1,0,0,-player.hp];
}
},
},
},
},
wuhun3:{
audio:3,
trigger:{
global:'dieAfter',
},
forced:true,
content:function (){
"step 0"
player.judge(function(card){
if(card.name=='tao'||card.name=='taoyuan') return 2;
return -2;
})
"step 1"
if(result.judge==-2){
player.die();
}
player.removeSkill('wuhun3');
},
},
wuhun4:{
trigger:{
player:'dieAfter',
},
forced:true,
popup:false,
content:function (){
for(var i=0;i<game.players.length;i++){
if(game.players[i].storage.wuhun_mark){
game.players[i].storage.wuhun_mark=0;
game.players[i].unmarkSkill('wuhun_mark');
}
}
},
},
wuhun5:{
trigger:{player:'dieBegin'},
forced:true,
popup:false,
audio:'wuhun2',
trigger:{player:'die'},
filter:function(event){
if(event.source!=player&&event.source!=undefined&&!get.is.altered('wuhun')) return true
return false;
return event.source&&event.source.isIn();
},
forced:true,
forceDie:true,
skillAnimation:true,
animationColor:'soil',
logTarget:'source',
content:function(){
trigger.source.addSkill('wuhun6');
var num=trigger.source.getHp();
if(num>0) trigger.source.loseHp(num);
},
ai:{
threaten:function(player,target){
if(target.hp==1) return 0.5;
if(target.hp==1){
if(player.getHp()<=0) return 100;
return 0.2;
}
return 0.8;
},
effect:{
target:function(card,player,target,current){
if(target.hp<=1&&get.tag(card,'damage')){
if(player.hasSkillTag('jueqing',false,target)) return [1,-5];
if(player.getHp()<=0) return;
if(!target.hasFriend()) return;
if(player.hp>2&&get.attitude(player,target)<=0) return [0,2];
return [1,0,0,-player.hp];
}
}
}
}
if(target.hp<=1&&get.tag(card,'damage')) return [1,0,0,-2];
},
},
},
wuhun6:{
audio:3,
trigger:{global:'dieAfter'},
forced:true,
content:function(){
if(player.hp<Infinity){
player.loseHp(player.hp);
}
player.removeSkill('wuhun6');
}
},
guixin:{
audio:2,
// alter:true,
trigger:{player:'damageEnd'},
check:function(event,player){
if(player.isTurnedOver()||event.num>1) return true;
@ -5519,59 +5359,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return num>=2;
},
content:function(){
"step 0"
var targets=game.filterPlayer();
targets.remove(player);
targets.sort(lib.sort.seat);
event.targets=targets;
'step 0'
event.count=trigger.num;
"step 1"
event.num=0;
player.line(targets,'green');
"step 2"
if(num<event.targets.length){
if(!get.is.altered('guixin')){
if(event.targets[num].countGainableCards(player,'hej')){
player.gainPlayerCard(event.targets[num],true,'hej');
}
}
else{
var hej=event.targets[num].getCards('hej')
if(hej.length){
var card=hej.randomGet();
player.gain(card,event.targets[num]);
if(get.position(card)=='h'){
event.targets[num].$giveAuto(card,player);
}
else{
event.targets[num].$give(card,player);
}
}
}
event.num++;
event.redo();
}
"step 3"
'step 1'
var targets=game.filterPlayer(current=>current!=player).sortBySeat();
player.line(targets);
player.gainMultiple(targets,'hej');
'step 2'
player.turnOver();
"step 4"
'step 3'
event.count--;
if(event.count&&player.hasSkill('guixin')){
player.chooseBool(get.prompt2('guixin'));
}
else{
event.finish();
}
"step 5"
if(event.count&&result.bool){
event.goto(1);
}
else event.finish();
'step 4'
if(event.count&&result.bool) event.goto(1);
},
ai:{
maixie:true,
maixie_hp:true,
threaten:function(player,target){
if(target.hp==1) return 2.5;
return 1;
return 0.5;
},
effect:{
target:function(card,player,target){
@ -7510,14 +7320,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
longhun_info:'你可以将同花色的X张牌按下列规则使用或打出红桃当【桃】方块当具火焰伤害的【杀】梅花当【闪】黑桃当【无懈可击】X为你当前的体力值且至少为1。',
juejing_info:'锁定技。①摸牌阶段,你令额定摸牌数+XX为你已损失的体力值。②你的手牌上限+2。',
wushen:'武神',
wushen_info:'锁定技,你的红桃手牌均视为【杀】;锁定技,你使用红桃【杀】无距离和次数限制且不可被响应。',
wushen_info:'锁定技。①你的红桃手牌均视为【杀】。②你使用红桃【杀】无距离和次数限制且不可被响应。',
wuhun:'武魂',
wuhun21:'武魂',
wuhun22:'武魂',
wuhun23:'武魂',
wuhun2:'武魂',
wuhun3:'武魂',
wuhun_info_alter:'锁定技当你受到1点伤害后你令伤害来源获得1枚“梦魇”标记当你死亡时你令拥有最多“梦魇”标记的一名其他角色判定若结果不为【桃】或【桃园结义】则该角色死亡。',
wuhun_info:'锁定技,杀死你的角色立即进入濒死状态。',
shelie:'涉猎',
gongxin:'攻心',
@ -7577,8 +7381,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ol_wuqian_info:'出牌阶段你可以弃置2枚“暴怒”标记并选择一名本回合内未选择过的其他角色你获得技能〖无双〗并令其防具无效直到回合结束。',
ol_shenfen:'神愤',
ol_shenfen_info:'出牌阶段限一次你可以弃置6枚“暴怒”标记并选择所有其他角色对这些角色各造成1点伤害。然后这些角色先各弃置其装备区里的牌再各弃置四张手牌。最后你将你的武将牌翻面。',
"new_wuhun":"武魂",
"new_wuhun_info":"锁定技当你受到伤害后伤害来源获得X个“梦魇”标记X为伤害点数。锁定技当你死亡时你选择一名“梦魇”标记数量最多的其他角色。该角色进行判定若判定结果不为【桃】或【桃园结义】则该角色死亡。",
new_wuhun:'武魂',
new_wuhun_info:'锁定技当你受到伤害后伤害来源获得X个“梦魇”标记X为伤害点数。锁定技当你死亡时你选择一名“梦魇”标记数量最多的其他角色。该角色进行判定若判定结果不为【桃】或【桃园结义】则该角色死亡。',
"new_guixin":"归心",
"new_guixin_info":"当你受到1点伤害后你可以按照你选择的区域优先度随机获得每名其他角色区域里的一张牌然后你翻面。",
ol_zhangliao:'OL神张辽',

View File

@ -4,16 +4,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){
name:'huicui',
connect:true,
character:{
dc_sunchen:['male','wu',4,['dczigu','dczuowei'],['unseen']],
dc_sunchen:['male','wu',4,['dczigu','dczuowei']],
dc_zhangmancheng:['male','qun',4,['dclvecheng','dczhongji']],
yue_zhoufei:['female','wu',3,['dclingkong','dcxianshu']],
dc_wuban:['male','shu',4,['dcyouzhan'],['clan:陈留吴氏','unseen']],
dc_wuban:['male','shu',4,['dcyouzhan'],['clan:陈留吴氏']],
yue_caiwenji:['female','qun',3,['dcshuangjia','dcbeifen']],
liuchongluojun:['male','qun',3,['dcminze','dcjini']],
yuechen:['male','wei',4,['dcporui','dcgonghu']],
zhangkai:['male','qun',4,['dcxiangshu']],
gaoxiang:['male','shu',4,['dcchiying']],
yuanyin:['male','qun',3,['dcmoshou','dcyunjiu'],['unseen']],
yuanyin:['male','qun',3,['dcmoshou','dcyunjiu']],
dongwan:['female','qun',3,['dcshengdu','dcjieling']],
zhangchu:['female','qun',3,['dcjizhong','dcrihui','dcguangshi']],
peiyuanshao:['male','qun',4,['dcmoyu']],

View File

@ -31,8 +31,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
xin_wuban:['male','shu',4,['xinjintao'],['clan:陈留吴氏','character:wuban']],
baoxin:['male','qun',4,['mutao','yimou'],['character:tw_baoxin','die_audio:tw_baoxin']],
jiangji:['male','wei',3,['twjichou','jilun'],['character:tw_jiangji','die_audio:tw_jiangji']],
liwei:['male','shu',4,['jiaohua'],['character:tw_liwei','die:tw_liwei']],
laimin:['male','shu',3,['laishou','luanqun'],['unseen']],
liwei:['male','shu',4,['jiaohua'],['die_audio:tw_liwei']],
laimin:['male','shu',3,['laishou','luanqun']],
yj_zhoubuyi:['male','wei',3,['mbhuiyao','mbquesong']],
xin_guozhao:['female','wei',3,['yichong','wufei']],
xin_zhangyi:['male','shu',4,['xinwurong','shizhi']],
@ -4739,7 +4739,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
xingtu:{
trigger:{player:'useCard'},
filter:function(event,player){
var num1=get.number(event.card),num2=player.storage.xingtu;
var evt=lib.skill.dcjianying.getLastUsed(player,event);
if(!evt||!evt.card) return false;
var num1=get.number(event.card),num2=get.number(evt.card);
return typeof num1=='number'&&typeof num2=='number'&&num2%num1==0;
},
forced:true,
@ -4748,29 +4750,73 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
mod:{
cardUsable:function(card,player){
var num1=get.number(card),num2=player.storage.xingtu;
if(typeof card=='object'){
var evt=lib.skill.dcjianying.getLastUsed(player);
if(!evt||!evt.card) return;
var num1=get.number(card),num2=get.number(evt.card);
if(typeof num1=='number'&&typeof num2=='number'&&num1%num2==0) return Infinity;
}
},
aiOrder:function(player,card,num){
var num1=get.number(card),num2=player.storage.xingtu;
if(typeof card=='object'){
var evt=lib.skill.dcjianying.getLastUsed(player);
if(!evt||!evt.card) return;
var num1=get.number(card),num2=num2=get.number(evt.card);
if(typeof num1=='number'&&typeof num2=='number'&&num2%num1==0) return num+5;
}
},
},
group:'xingtu_record',
intro:{
content:'当前记录X=#',
init:function(player){
player.addSkill('xingtu_mark');
var history=player.getAllHistory('useCard');
if(history.length){
var trigger=history[history.length-1],num=get.number(trigger.card);
player.storage.xingtu_mark=num;
player[typeof num!='number'?'unmarkSkill':'markSkill']('xingtu_mark');
}
},
onremove:function(player){
player.removeSkill('xingtu_mark');
player.removeGaintag('xingtu1');
player.removeGaintag('xingtu2');
delete player.storage.xingtu_mark;
},
subSkill:{
record:{
trigger:{player:'useCardAfter'},
forced:true,
filter:function(event,player){
return typeof get.number(event.card)=='number';
mark:{
charlotte:true,
trigger:{
player:['useCard1','gainAfter'],
global:'loseAsyncAfter',
},
filter:function(event,player,name){
if(!player.countCards('h')) return false;
return name=='useCard1'||event.getg(player).length;
},
direct:true,
firstDo:true,
content:function(){
player.storage.xingtu=get.number(trigger.card);
player.markSkill('xingtu');
'step 0'
player.removeGaintag('xingtu1');
player.removeGaintag('xingtu2');
if(event.triggername=='useCard1'){
var num=get.number(trigger.card,player);
player.storage.xingtu_mark=num;
player[typeof num!='number'?'unmarkSkill':'markSkill']('xingtu_mark');
if(typeof num!='number') event.finish();
}
'step 1'
var cards1=[],cards2=[],num=player.storage.xingtu_mark;
player.getCards('h').forEach(card=>{
var numx=get.number(card,player);
if(typeof numx=='number'){
if(numx%num==0) cards1.push(card);
if(num%numx==0) cards2.push(card);
}
});
player.addGaintag(cards1,'xingtu1');
player.addGaintag(cards2,'xingtu2');
},
intro:{content:'上一张牌的点数:#'},
},
},
},
@ -4784,7 +4830,33 @@ game.import('character',function(lib,game,ui,get,ai,_status){
selectCard:[2,Infinity],
check:function(card){
if(ui.selected.cards.length>1) return 0;
return 4-get.value(card);
var player=_status.event.player;
if(player.hasSkill('xingtu')&&player.storage.xingtu){
var cards=player.getCards('he');
var num=player.storage.xingtu,stop=false;
for(var i=0;i<=cards.length;i++){
if(i!=cards.length){
var num1=get.number(cards[i],player);
if(typeof num1!='number') continue;
for(var j=0;j<cards.length;j++){
if(i==j) continue;
var num2=get.number(cards[j],player);
if(typeof num2!='number') continue;
var sum=num1+num2;
if(sum%num==0||num%sum==0){
stop=true;
break;
}
}
if(stop) break;
}
}
if(i!=cards.length){
var cardx=[cards[i],cards[j]];
if(cardx.includes(card)) return 10-get.value(card);
}
}
return 5-get.value(card);
},
content:function(){
var num=0;
@ -15272,9 +15344,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
re_gaoshun_prefix:'手杀界',
peixiu:'裴秀',
xingtu:'行图',
xingtu_info:'锁定技。①当你使用有点数的牌结算结束后你将此牌点数记录为X。②当你使用牌时若X÷Y的余数为0则你摸一张牌Y为此牌的点数。③你使用Y÷X的余数为0的牌无次数限制Y为此牌的点数。',
xingtu1:'倍数',
xingtu2:'约数',
xingtu_info:'锁定技。你使用点数为X的倍数的牌无次数限制你使用点数为X的约数的牌时摸一张牌X为你本局游戏使用的上一张牌的点数。',
juezhi:'爵制',
juezhi_info:'出牌阶段你可以弃置至少两张牌然后从牌堆中获得一张点数为X的牌X为这些牌的点数和除以13后的余数且当余数为0时X为13。',
juezhi_info:'出牌阶段,你可以弃置至少两张牌,然后从牌堆中获得一张点数为Y的牌Y为这些牌的点数和对13取余余数为0时Y取13。',
sp_jianggan:'手杀蒋干',
sp_jianggan_prefix:'手杀',
spdaoshu:'盗书',

View File

@ -4836,7 +4836,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
content:function(){
'step 0'
player.chooseButton([get.prompt('sphantong'),player.storage.sphantong],function(button){return -1});
player.chooseButton([get.prompt('sphantong'),player.storage.sphantong],function(button){
var player=_status.event.player;
if(_status.currentPhase==player){
//血裔
if((player.hasJudge('lebu')||player.skipList.includes('phaseUse'))&&game.hasPlayer(function(current){
return current!=player&&current.group=='qun';
})) return 1;
//激将
if(!player.hasJudge('lebu')&&!player.skipList.includes('phaseUse')&&game.hasPlayer(function(current){
return current!=player&&current.group=='shu'&&current.hasSha()&&get.attitude(player,current)>0&&get.attitude(current,player)>0;
})&&game.hasPlayer(function(target){
return player.canUse({name:'sha'},target)&&get.effect(target,{name:'sha'},player,player)>0;
})) return 1;
}
//护驾
else if(!player.hasShan()&&game.hasPlayer(function(current){
return current!=player&&current.group=='wei'&&current.mayHaveShan()&&get.attitude(player,current)>0&&get.attitude(current,player)>0;
})) return 1;
return -1;
});
'step 1'
if(result.bool){
player.logSkill('sphantong');
@ -4848,27 +4867,37 @@ game.import('character',function(lib,game,ui,get,ai,_status){
game.cardsDiscard(card);
var list=['hujia','jijiang','jiuyuan','xueyi'];
for(var i=0;i<list.length;i++){
if(player.hasZhuSkill(list[i])) list.splice(i--,1);
if(player.hasSkill(list[i])) list.splice(i--,1);
}
if(list.length){
player.chooseControl(list).set('prompt','选择获得以下技能中的一个').set('ai',function(){
var player=_status.event.player;
if(_status.currentPhase==player){
//血裔
if((player.hasJudge('lebu')||player.skipList.includes('phaseUse'))&&game.hasPlayer(function(current){
return current!=player&&current.group=='qun';
})) return 'xueyi';
//激将
if(!player.hasJudge('lebu')&&!player.skipList.includes('phaseUse')&&game.hasPlayer(function(current){
return current!=player&&current.group=='shu'&&current.hasSha()&&get.attitude(player,current)>0&&get.attitude(current,player)>0;
})&&game.hasPlayer(function(target){
return player.canUse({name:'sha'},target)&&get.effect(target,{name:'sha'},player,player)>0;
})) return 'jijiang';
}
//护驾
else if(!player.hasShan()&&game.hasPlayer(function(current){
return current!=player&&current.group=='wei'&&current.mayHaveShan()&&get.attitude(player,current)>0&&get.attitude(current,player)>0;
})) return 'hujia';
});
}
if(list.length>0) player.chooseControl(list).set('prompt','选择获得以下技能中的一个');
else event.finish();
}
else event.finish();
'step 2'
var skill=result.control;
player.addTempSkill(skill);
if(!player.storage.zhuSkill_sphantong) player.storage.zhuSkill_sphantong=[];
player.storage.zhuSkill_sphantong.add(skill);
player.popup(skill,'wood');
game.log(player,'获得了技能','#g【'+get.translation(skill)+'】');
var next=game.createEvent('sphantong_clear',false);
event.next.remove(next);
trigger.after.push(next);
next.player=player;
next.skill=skill;
next.setContent(function(){
if(player.storage.zhuSkill_sphantong) player.storage.zhuSkill_sphantong.remove(event.skill);
})
},
},
sphuangen:{
@ -5436,7 +5465,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
enable:'phaseUse',
filterCard:{suit:'diamond'},
filterTarget:true,
filterTarget:function(card,player,target){
return target.canAddJudge({name:'yanxiao_card'});
},
check:function(card){
return 7-get.value(card);
},

View File

@ -520,7 +520,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
old_guhuo:{
audio:2,
group:['old_guhuo_guess'],
enable:['chooseToUse','chooseToRespond'],
hiddenCard:function(player,name){
return (lib.inpile.contains(name)&&player.countCards('hs')>0);
@ -636,6 +635,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
precontent:function(){
player.logSkill('old_guhuo');
player.addTempSkill('old_guhuo_guess');
var card=event.result.cards[0];
event.result.card.suit=get.suit(card);
event.result.card.number=get.number(card);

View File

@ -342,6 +342,8 @@ window.noname_character_rank={
'key_kyou',
'key_tomoyo',
'star_yuanshu',
'jiangji',
'tianshangyi',
],
am:[
'diy_caiwenji',
@ -622,6 +624,10 @@ window.noname_character_rank={
'jsrg_sunshangxiang',
'jsrg_machao',
'sunyu',
're_caorui',
're_zhugedan',
'tw_yanxiang',
'yanxiang',
],
bp:[
'chess_diaochan',
@ -983,6 +989,10 @@ window.noname_character_rank={
'ol_dingshangwan',
'ol_liwan',
'chengjichengcui',
'xin_zhangliang',
'liwei',
'xin_wuban',
'ol_liuyan',
],
b:[
'diy_feishi',
@ -1290,6 +1300,10 @@ window.noname_character_rank={
'feiyao',
'jsrg_xiahouen',
'old_shen_zhaoyun',
'sb_qiaoxiao',
're_simalang',
'laimin',
'baoxin',
],
bm:[
'diy_xizhenxihong',
@ -1482,6 +1496,7 @@ window.noname_character_rank={
'huanfan',
'jsrg_xugong',
'old_xiaoqiao',
'old_guanyu',
],
c:[
'xiahoudun',
@ -1545,6 +1560,7 @@ window.noname_character_rank={
'ol_huban',
'sb_menghuo',
'old_caocao',
'sb_yl_luzhi',
],
d:[
'lvmeng',

View File

@ -23,10 +23,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
re_xushu:['male','shu',4,['zhuhai','qianxin']],
re_lidian:['male','wei',3,['xunxun','xinwangxi']],
re_zhongyao:['male','wei',3,['rehuomo','zuoding'],['clan:颍川钟氏']],
xin_zhangliang:['male','qun',4,['rejijun','refangtong'],['unseen']],
re_simalang:['male','wei',3,['requji','rejunbing'],['unseen']],
re_zhugedan:['male','wei',4,['regongao','rejuyi'],['unseen']],
re_caorui:['male','wei',3,['huituo','mingjian','rexingshuai'],['unseen','zhu']],
xin_zhangliang:['male','qun',4,['rejijun','refangtong']],
re_simalang:['male','wei',3,['requji','rejunbing']],
re_zhugedan:['male','wei',4,['regongao','rejuyi']],
re_caorui:['male','wei',3,['huituo','mingjian','rexingshuai'],['zhu']],
re_caochong:['male','wei',3,['rechengxiang','renxin']],
ol_zhangzhang:['male','wu',3,['olzhijian','olguzheng']],
re_jsp_huangyueying:['female','qun',3,['rejiqiao','relinglong']],
@ -3850,6 +3850,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.loseMaxHp();
player.addSkill('rejianyan');
},
derivation:'rejianyan',
},
rejianyan:{
audio:2,
@ -10752,6 +10753,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
precontent:function(){
player.logSkill('reguhuo');
player.addTempSkill('reguhuo_guess');
var card=event.result.cards[0];
event.result.card.suit=get.suit(card);
event.result.card.number=get.number(card);
@ -10775,7 +10777,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
threaten:1.3,
},
group:['reguhuo_shan','reguhuo_wuxie','reguhuo_guess'],
group:['reguhuo_shan','reguhuo_wuxie'],
},
reguhuo_shan:{
enable:['chooseToUse','chooseToRespond'],
@ -10812,6 +10814,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
precontent:function(){
player.logSkill('reguhuo');
player.addTempSkill('reguhuo_guess');
var card=event.result.cards[0];
event.result.card.suit=get.suit(card);
event.result.card.number=get.number(card);
@ -10852,6 +10855,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
precontent:function(){
player.logSkill('reguhuo');
player.addTempSkill('reguhuo_guess');
var card=event.result.cards[0];
event.result.card.suit=get.suit(card);
event.result.card.number=get.number(card);
@ -10979,7 +10983,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 1'
if(!result.bool) target.loseHp();
'step 2'
target.addSkill('rechanyuan');
target.addSkillLog('rechanyuan');
if(targets.length) event.goto(0);
},
},
@ -10987,13 +10991,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){
reguhuo_phase:{},
rechanyuan:{
init:function(player,skill){
if(player.hp<=1){
player.logSkill(skill);
player.addSkill('rechanyuan_log');
}
player.addSkillBlocker(skill);
},
onremove:function(player,skill){
player.removeSkill('rechanyuan_log');
player.removeSkillBlocker(skill);
},
charlotte:true,
locked:true,
skillBlocker:function(skill,player){
return skill!='chanyuan'&&skill!='rechanyuan'&&!lib.skill[skill].charlotte&&player.hp<=1;
},
@ -11006,8 +11013,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){
});
if(list.length) str+=('<br><li>失效技能:'+get.translation(list))
return str;
},
},
audio:2,
trigger:{player:'changeHp'},
filter:function(event,player){
return (player.hp<=1)!=(player.hasSkill('rechanyuan_log'));
},
direct:true,
locked:true,
content:function(){
if(player.hp<=1){
player.logSkill('rechanyuan');
player.addSkill('rechanyuan_log');
}
}
else player.removeSkill('rechanyuan_log');
},
subSkill:{
log:{charlotte:true},
},
},
botu:{
audio:2,

View File

@ -38,8 +38,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sb_liubiao:['male','qun',3,['sbzishou','sbzongshi']],
sb_zhurong:['female','shu',4,['sblieren','sbjuxiang']],
sb_menghuo:['male','shu',4,['sbhuoshou','sbzaiqi']],
sb_yl_luzhi:['male','qun',3,['nzry_mingren','sbzhenliang'],['unseen']],
sb_xiaoqiao:['female','wu',3,['sbtianxiang','xinhongyan'],['unseen']],
sb_yl_luzhi:['male','qun',3,['nzry_mingren','sbzhenliang']],
sb_xiaoqiao:['female','wu',3,['sbtianxiang','xinhongyan']],
},
characterSort:{
sb:{

View File

@ -1117,17 +1117,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 1'
switch(result.control){
case 'equip1':
player.addTempSkill('drlt_jueyan1',{player:'phaseAfter'});
player.addTempSkill('drlt_jueyan1');
break;
case 'equip2':
player.draw(3);
player.addTempSkill('drlt_jueyan3',{player:'phaseAfter'});
player.addTempSkill('drlt_jueyan3');
break;
case 'equip3_4':
player.addTempSkill('drlt_jueyan2',{player:'phaseAfter'});
player.addTempSkill('drlt_jueyan2');
break;
case 'equip5':
player.addTempSkill('rejizhi',{player:'phaseAfter'});
player.addTempSkill('rejizhi');
break;
}
},
@ -1146,6 +1146,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
},
derivation:'rejizhi',
},
'drlt_jueyan1':{
mod:{
@ -7457,7 +7458,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
xinfu_guhuo:{
audio:'guhuo_guess',
derivation:['chanyuan'],
group:['guhuo_guess'],
enable:['chooseToUse','chooseToRespond'],
hiddenCard:function(player,name){
return (lib.inpile.contains(name)&&player.countCards('hs')>0&&!player.hasSkill('guhuo_phase'));
@ -7553,6 +7553,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
precontent:function(){
player.logSkill('xinfu_guhuo');
player.addTempSkill('guhuo_guess');
var card=event.result.cards[0];
event.result.card.suit=get.suit(card);
event.result.card.number=get.number(card);
@ -7708,22 +7709,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
chanyuan:{
init:function(player,skill){
if(player.hp==1) player.logSkill(skill);
player.addSkillBlocker(skill);
},
onremove:function(player,skill){
player.removeSkillBlocker(skill);
},
charlotte:true,
locked:true,
skillBlocker:function(skill,player){
return skill!='chanyuan'&&skill!='rechanyuan'&&!lib.skill[skill].charlotte&&player.hp==1;
},
audio:2,
trigger:{player:'changeHp'},
filter:function(event,player){
return event.num<0&&player.hp==1;
},
content:function(){},
mark:true,
intro:{
content:function(storage,player,skill){
@ -7733,8 +7727,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){
});
if(list.length) str+=('<br><li>失效技能:'+get.translation(list))
return str;
}
}
},
},
audio:2,
trigger:{player:'changeHp'},
filter:function(event,player){
return player.hp==1;
},
forced:true,
content:function(){},
},
guhuo_phase:{},
},
@ -7764,7 +7765,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
huangzhong:['re_huangzhong','ol_huangzhong','sb_huangzhong','huangzhong','jsrg_huangzhong'],
weiyan:['re_weiyan','ol_weiyan','weiyan'],
zhoutai:['zhoutai','xin_zhoutai','old_zhoutai'],
xiaoqiao:['xiaoqiao','ol_xiaoqiao','re_xiaoqiao','old_xiaoqiao'],
xiaoqiao:['xiaoqiao','ol_xiaoqiao','re_xiaoqiao','sb_xiaoqiao','old_xiaoqiao'],
yuji:['xin_yuji','re_yuji','yuji'],
zhangjiao:['sp_zhangjiao','re_zhangjiao','sb_zhangjiao','zhangjiao'],
dianwei:['dianwei','ol_dianwei','re_dianwei'],
@ -7797,7 +7798,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
zhugezhan:['zhugezhan','old_zhugezhan'],
ol_lusu:['re_lusu','ol_lusu'],
zhanghe:['zhanghe','re_zhanghe','sb_zhanghe'],
yl_luzhi:['yl_luzhi','tw_yl_luzhi'],
yl_luzhi:['yl_luzhi','sb_yl_luzhi','tw_yl_luzhi'],
sunliang:['sunliang','xin_sunliang'],
},
translate:{
@ -7873,6 +7874,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
drlt_wanglie:"往烈",
drlt_wanglie_info:"①出牌阶段,你使用的第一张牌无距离限制。②当你于出牌阶段内使用牌时,你可以令此牌不能被响应,然后你于本阶段内不能再使用牌。",
"drlt_xiongluan":"雄乱",
drlt_xiongluan1:'雄乱',
"drlt_xiongluan_info":"限定技,出牌阶段,你可以废除你的判定区和装备区,然后指定一名其他角色。直到回合结束,你对其使用牌无距离和次数限制,其不能使用和打出手牌。",
"drlt_congjian":"从谏",
"drlt_congjian_info":"当你成为锦囊牌的目标时若此牌的目标数大于1则你可以交给其中一名其他目标角色一张牌然后摸一张牌若你给出的是装备牌改为摸两张牌。",

View File

@ -49,7 +49,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
haopu:['male','shu',4,['olzhenying']],
ol_mengda:['male','shu',4,['olgoude']],
ol_wanglang:['male','wei',3,['gushe','oljici']],
ol_liuyan:['male','qun','4/6',['olpianan','olyinji','olkuisi'],['unseen']],
ol_liuyan:['male','qun','4/6',['olpianan','olyinji','olkuisi']],
lushi:['female','qun',3,['olzhuyan','olleijie']],
zhangshiping:['male','shu',3,['olhongji','olxinggu']],
sunhong:['male','wu',3,['olxianbi','olzenrun']],
@ -21884,12 +21884,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
},
moukui:{
audio:2,
audioname:['sp_mushun'],
trigger:{player:'useCardToPlayered'},
direct:true,
filter:function(event,player){
return event.card.name=='sha';
},
audio:2,
content:function(){
"step 0"
var controls=['draw_card'];
@ -24282,7 +24283,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
xionghuo:{
marktext:"戾",
mark:true,
intro:{
name:'暴戾',
content:"mark",
@ -25253,7 +25253,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
jin_simazhao:['jin_simazhao','simazhao','sp_simazhao'],
jin_wangyuanji:['jin_wangyuanji','wangyuanji','sp_wangyuanji'],
wangyun:['wangyun','dc_wangyun','re_wangyun','jsrg_wangyun','old_wangyun','pe_wangyun'],
zhangliang:['re_zhangliang','zhangliang'],
zhangliang:['xin_zhangliang','re_zhangliang','zhangliang'],
lingju:['lingju','old_lingju'],
guansuo:['guansuo','dc_guansuo'],
zhangxingcai:['zhangxingcai','old_zhangxingcai'],
@ -25295,6 +25295,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ol_pengyang:['ol_pengyang','sp_pengyang'],
ol_luyusheng:['ol_luyusheng','luyusheng'],
fanjiangzhangda:['fanjiangzhangda','jsrg_fanjiangzhangda'],
simalang:['re_simalang','simalang'],
zhugedan:['re_zhugedan','zhugedan'],
},
translate:{
"xinfu_lingren":"凌人",

View File

@ -12,7 +12,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dc_mengda:['male','wei',4,['dclibang','dcwujie']],
//dc_fuwan:['male','qun',4,['dcmoukui']],
guānning:['male','shu',3,['dcxiuwen','dclongsong']],
sunhuan:['male','wu',4,['dcniji'],['unseen']],
sunhuan:['male','wu',4,['dcniji']],
sunlang:['male','shu',4,['dctingxian','dcbenshi']],
shiyi:['male','wu',3,['dccuichuan','dczhengxu']],
dc_hujinding:['female','shu','3/6',['dcdeshi','dcwuyuan','huaizi']],
@ -3821,7 +3821,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
target:1,
},
},
derivation:['releiji','rebiyue','new_retuxi','mingce','xinzhiyan','nhyinbing','nhhuoqi','nhguizhu','nhxianshou','nhlundao','nhguanyue','nhyanzheng'],
derivation:['releiji','rebiyue','new_retuxi','remingce','xinzhiyan','nhyinbing','nhhuoqi','nhguizhu','nhxianshou','nhlundao','nhguanyue','nhyanzheng'],
subSkill:{
clear:{
onremove:function(player){

View File

@ -2539,7 +2539,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_zhangliao:['sp_zhangliao','yj_zhangliao','jsrg_zhangliao'],
xiahoudun:['xiahoudun','re_xiahoudun','xin_xiahoudun'],
liubei:['liubei','re_liubei','sb_liubei','dc_liubei','junk_liubei'],
guanyu:['guanyu','re_guanyu','ps_guanyu'],
guanyu:['guanyu','re_guanyu','ps_guanyu','old_guanyu'],
zhangfei:['zhangfei','re_zhangfei','old_zhangfei','xin_zhangfei','sb_zhangfei','tw_zhangfei','jsrg_zhangfei','yj_zhangfei'],
zhaoyun:['zhaoyun','re_zhaoyun','old_zhaoyun','sb_zhaoyun','ps2063_zhaoyun','ps2067_zhaoyun'],
sp_zhaoyun:['sp_zhaoyun','jsp_zhaoyun'],

View File

@ -14579,6 +14579,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
jiangji:['tw_jiangji','jiangji'],
baoxin:['tw_baoxin','baoxin'],
yanxiang:['yanxiang','tw_yanxiang'],
liwei:['liwei','tw_liwei'],
},
dynamicTranslate:{
twfeifu:function(player){

View File

@ -14,7 +14,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
old_huangfusong:['male','qun',4,['xinfenyue']],
dc_xiahouba:['male','shu',4,['rebaobian']],
dc_daxiaoqiao:['female','wu',3,['dcxingwu','dcluoyan']],
tianshangyi:['female','wei',3,['dcposuo','dcxiaoren'],['unseen']],
tianshangyi:['female','wei',3,['dcposuo','dcxiaoren']],
sunlingluan:['female','wu',3,['dclingyue','dcpandi']],
dc_wangjun:['male','qun',4,['dctongye','dcchangqu']],
zhoubuyi:['male','wei',3,['dcshiji','dcsilun']],

View File

@ -2043,6 +2043,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.addTempSkill('paoxiao');
}
},
derivation:['wusheng','paoxiao'],
},
shiyong:{
audio:2,
@ -13791,7 +13792,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger:{player:'phaseZhunbeiBegin'},
forced:true,
unique:true,
derivation:['zyexin','zzili'],
derivation:['zyexin','zzili','zpaiyi'],
filter:function(event,player){
return player.countCards('e')>=2;
},

View File

@ -6710,6 +6710,12 @@
frequent:true,
intro:'在用户填写的IP地址没有直接指定使用WS/WSS协议的情况下默认使用WSS协议而非WS协议来连接到联机服务器。<br>请不要轻易勾选此项!',
},
read_clipboard:{
name:'读取邀请链接',
init:false,
frequent:true,
intro:'读取剪贴板以解析邀请链接自动加入联机房间',
}
}
},
boss:{
@ -8571,13 +8577,42 @@
}
else if(modeimage) src=`image/mode/${modeimage}/character/${name}${ext}`;
else if(type=='character'&&lib.config.skin[name]&&arguments[2]!='noskin') src=`image/skin/${name}/${lib.config.skin[name]}${ext}`;
else if(type=='character') src=`image/character/${gzbool?'gz_':''}${name}${ext}`;
else if(type=='character'){
src=`image/character/${gzbool?'gz_':''}${name}${ext}`;
}
else src=`image/${type}/${subfolder}/${name}${ext}`;
}
else src=`image/${name}${ext}`;
new Promise((resolve,reject)=>{
const image=new Image();
image.src=`${lib.assetURL}${src}`;
image.onload=resolve;
if(type=='character') image.onerror=reject;
}).then(()=>{
this.setBackgroundImage(src);
this.style.backgroundPositionX='center';
this.style.backgroundSize='cover';
}).catch(()=>new Promise((resolve,reject)=>{
const nameinfo=get.character(name);
const sex=nameinfo[0];
src=`image/character/default_silhouette_${sex}${ext}`;
const image=new Image();
image.src=`${lib.assetURL}${src}`;
image.onload=()=>resolve(src);
image.onerror=reject;
}).catch(()=>new Promise((resolve,reject)=>{
const nameinfo=get.character(name);
const sex=nameinfo[0];
src=`image/character/default_silhouette_${sex=='female'?'female':'male'}${ext}`;
const image=new Image();
image.src=`${lib.assetURL}${src}`;
image.onload=()=>resolve(src);
image.onerror=reject;
})).then((src)=>{
this.setBackgroundImage(src);
this.style.backgroundPositionX='center';
this.style.backgroundSize='cover';
}));
return this;
}
});
@ -11406,7 +11441,13 @@
localStorage.removeItem(lib.configprefix+'background');
}
},
parsex:function(item){
/**
*
* @param {*} item
* @param {Function} [scope] 作用域
* @returns
*/
parsex:function(item,scope){
//by 诗笺、Tipx-L
/**
* @param {Function} func
@ -11466,9 +11507,15 @@
}
str=`if(event.step==${k}){event.finish();return;}`+str;
}
if(!scope){
return (new (hasDebugger?GeneratorFunction:Function)('event','step','source','player','target','targets',
'card','cards','skill','forced','num','trigger','result',
'_status','lib','game','ui','get','ai',str));
}else{
return scope(`function${hasDebugger?'*':''} anonymous(event,step,source,player,target,targets,
card,cards,skill,forced,num,trigger,result,
_status,lib,game,ui,get,ai){${str}}; anonymous;`);
}
}
switch(typeof item){
case "object":
@ -11537,7 +11584,7 @@
else lastEvent=currentResult;
}
}
}
}else if(item._parsed) return item;
// falls through
default:
return Legacy(item);
@ -20858,11 +20905,24 @@
this.markSkill('stratagem_fury');
}
/**
* version 1.6
* version 1.7
*
* 链式创建一次性技能的api
*
* 使用者只需要关注技能的效果而不是技能的本身
*
* v1.7 可传递作用域
* @example
* ```js
* (function () {
* let _var = 1;
* let me = player;
* player.when('drawAfter')
* .apply(code => eval(code))
* .then(() => console.log(_var))
* .then('me.gainMaxHp(5)');
* })();
* ```
*/
when(){
if(!_status.postReconnect.player_when) _status.postReconnect.player_when=[
@ -20909,6 +20969,11 @@
else if(Array.isArray(trigger.player)) trigger.player.add(after);
else if(typeof trigger.player=='string') trigger.player=[trigger.player,after];
const vars={};
/**
* 作用域
* @type { (code: string) => any }
*/
let scope;
let skill={
trigger:trigger,
forced:true,
@ -20963,11 +21028,12 @@
const fun2=skill.contentFuns[i];
const a=fun2.toString();
//防止传入()=>xxx的情况
const begin=a.indexOf("{")==a.indexOf("}")&&a.indexOf("{")==-1?a.indexOf("=>")+2:a.indexOf("{")+1;
const begin=a.indexOf("{")==a.indexOf("}")&&a.indexOf("{")==-1&&a.indexOf("=>")>-1?a.indexOf("=>")+2:a.indexOf("{")+1;
const str2=a.slice(begin,a.lastIndexOf("}")!=-1?a.lastIndexOf("}"):undefined).trim();
str+=`'step ${i}'\n\t${str2}\n\t`;
}
skill.content=eval(str+`\n};content;`);
skill.content=lib.init.parsex((scope||eval)(str+`\n};content;`),scope);
skill.content._parsed=true;
};
Object.defineProperty(lib.skill,skillName,{
configurable:true,
@ -21042,6 +21108,21 @@
Object.assign(vars,arg);
createContent();
return this;
},
/**
* 传递外部作用域
*
* 一般是传递一个 code=>eval(code) 函数
*
* 传递后可在then中使用外部变量(vars的上位替代)
*
* @param {Function} _scope
*/
apply(_scope){
if(lib.skill[skillName]!=skill) throw `This skill has been destroyed`;
scope=_scope;
if(skill.contentFuns.length>0) createContent();
return this;
}
};
}
@ -31361,14 +31442,18 @@
const next=new lib.element.GameEvent(`${this.name}Inserted`,false);
this.next.push(next);
next.setContent(content);
if(map){
Object.entries(map).forEach(entry=>next.set(entry[0],entry[1]));
}
return next;
}
insertAfter(content,map){
const next=new lib.element.GameEvent(`${this.name}Inserted`,false);
this.after.push(next);
next.setContent(content);
if(map){
Object.entries(map).forEach(entry=>next.set(entry[0],entry[1]));
}
return next;
}
backup(skill){
@ -34938,6 +35023,39 @@
ui.rooms.push(player);
}
}
if(!_status.requestReadClipboard&&get.config('read_clipboard','connect')){
//每次启动只请求一次
_status.requestReadClipboard=true;
function read(text){
try{
var roomId=text.split('\n')[1].match(/\d+/);
var caption=ui.rooms.find(caption=>caption.key==roomId);
if (caption&&(_status.read_clipboard_text||confirm(`是否通过复制的内容加入${roomId}房间?`))){
ui.click.connectroom.call(caption);
delete _status.read_clipboard_text;
}
}catch(e){console.log(e)}
}
if(_status.read_clipboard_text){
read(_status.read_clipboard_text);
}else{
window.focus();
if(navigator.clipboard&&lib.node){
navigator.clipboard.readText().then(read).catch(_=>{});
}else{
var input=ui.create.node('textarea',ui.window,{opacity:'0'});
input.select();
var result=document.execCommand('paste');
input.blur();
ui.window.removeChild(input);
if(result||input.value.length>0) read(input.value);
else if(confirm('是否输入邀请链接以加入房间?')){
var text=prompt('请输入邀请链接');
if(typeof text=='string'&&text.length>0) read(text);
}
}
}
}
}
lib.message.client.updateclients(clients,true);
},
@ -35454,6 +35572,10 @@
ui.connectStartBar.delete();
delete ui.connectStartBar;
}
if(ui.connectShareButton){
ui.connectShareButton.delete();
delete ui.connectShareButton;
}
if(ui.roomInfo){
ui.roomInfo.remove();
delete ui.roomInfo;
@ -53461,7 +53583,7 @@
ipbar.style.borderRadius='2px';
ipbar.style.position='relative';
var button=ui.create.div('.menubutton.large.highlight.connectbutton.pointerdiv',game.online?'退出联机':'开始游戏',ui.window,function(){
var button=ui.create.div('.menubutton.large.highlight.connectbutton.connectbutton1.pointerdiv',game.online?'退出联机':'开始游戏',ui.window,function(){
if(button.clicked) return;
if(game.online){
if(game.onlinezhu){
@ -53487,13 +53609,37 @@
}
button.delete();
bar.delete();
shareButton.delete();
delete ui.connectStartButton;
delete ui.connectStartBar;
delete ui.connectShareButton;
button.clicked=true;
});
var shareButton=ui.create.div('.menubutton.large.highlight.connectbutton.connectbutton2.pointerdiv','分享房间',ui.window,function(){
var text=`无名杀-联机-${lib.translate[get.mode()]}-${game.connectPlayers.filter(p=>p.avatar).length}/${game.connectPlayers.filter(p=>!p.classList.contains('unselectable2')).length}\n${get.connectNickname()}邀请你加入${game.roomId}房间\n联机地址:${game.ip}\n请先通过游戏内菜单-开始-联机中启用“读取邀请链接”选项`;
window.focus();
if(navigator.clipboard&&lib.node){
navigator.clipboard.writeText(text).then(()=>{
game.alert(`分享内容复制成功`);
}).catch(e=>{
game.alert(`分享内容复制失败${e||''}`);
});
}else{
var input=ui.create.node('textarea',ui.window,{opacity:'0'});
input.value=text;
input.focus();
input.select();
var result=document.execCommand('copy');
input.blur();
ui.window.removeChild(input);
game.alert(`分享内容复制${result?'成功':'失败'}`);
}
});
ui.connectStartButton=button;
ui.connectStartBar=bar;
ui.connectShareButton=shareButton;
},
players:numberOfPlayers=>{
if(numberOfPlayers===0){

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

View File

@ -3374,7 +3374,12 @@ div:not(.handcards)>.card>.info>span,
.connectbutton {
top: calc(400% / 7 - 35px);
width: 130px;
left: calc(50% - 70px);
}
.connectbutton1 {
left: calc(50% - 200px);
}
.connectbutton2 {
left: calc(50% + 60px);
}
.connectevents {
left: auto;

View File

@ -119,6 +119,44 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
});
return uiintro;
},220);
if (get.config('read_clipboard','connect')){
var ced=false;
function read(text){
try{
var text2=text.split('\n')[2];
var ip=text2.slice(5);
if(ip.length>0&&text2.startsWith("联机地址:")&&(ced||confirm('是否根据剪贴板的邀请链接以进入联机地址和房间?'))){
node.innerHTML=ip;
event.textnode.innerHTML='正在连接...';
clearTimeout(event.timeout);
game.saveConfig('last_ip',node.innerHTML);
game.connect(node.innerHTML,function(success){
if(!success&&event.textnode){
alert('邀请链接解析失败');
event.textnode.innerHTML='输入联机地址';
}
if (success) _status.read_clipboard_text=text;
});
}
}catch(e){console.log(e);}
}
window.focus();
if (navigator.clipboard&&lib.node){
navigator.clipboard.readText().then(read).catch(_=>{});
}else{
var input=ui.create.node('textarea',ui.window,{opacity:'0'});
input.select();
var result=document.execCommand('paste');
input.blur();
ui.window.removeChild(input);
if(result||input.value.length>0) read(input.value);
else if(confirm('是否输入邀请链接以进入联机地址和房间?')){
ced=true;
var text=prompt('请输入邀请链接');
if(typeof text=='string'&&text.length>0) read(text);
}
}
}
lib.init.onfree();
}
if(window.isNonameServer){