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

This commit is contained in:
157 2023-09-23 12:23:36 +08:00 committed by GitHub
commit 701a345d0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
59 changed files with 1947 additions and 890 deletions

Binary file not shown.

Binary file not shown.

View File

@ -68,7 +68,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
content:function(){
if(typeof event.baseDamage!='number') event.baseDamage=1;
if(target.isDying()||event.getParent(2).type=='dying'){
target.recover(event.baseDamage);
target.recover();
if(_status.currentPhase==target){
target.getStat().card.jiu--;
}
@ -210,7 +210,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
game.delay(2);
"step 2"
if(result.bool){
target.damage('fire',event.baseDamage||1);
target.damage('fire');
}
else{
target.addTempSkill('huogong2');

View File

@ -462,13 +462,13 @@ game.import('card',function(lib,game,ui,get,ai,_status){
target.discard(target.getCards('e',function(card){
return lib.filter.cardDiscardable(card,target,'shuiyanqijunx');
}));
target.damage('thunder',event.baseDamage||1);
target.damage('thunder');
event.finish();
}
else if(!target.countCards('e',function(card){
return lib.filter.cardDiscardable(card,target,'shuiyanqijunx');
})){
var next=target.damage(event.baseDamage||1);
var next=target.damage();
if(!get.is.single()) next.nature='thunder';
event.finish();
return;
@ -489,7 +489,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
}));
}
else{
var next=target.damage(event.baseDamage||1);
var next=target.damage();
if(!get.is.single()) next.nature='thunder'
}
event.finish();
@ -861,7 +861,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
selectTarget:-1,
modTarget:true,
content:function(){
target.damage('fire',event.baseDamage||1);
target.damage('fire');
},
ai:{
order:5,

View File

@ -171,7 +171,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
}
"step 3"
if((!result||!result.bool||!result.result||result.result!='shaned')&&!event.unhurt){
target.damage(get.nature(event.card),event.baseDamage+event.extraDamage);
target.damage(get.nature(event.card));
event.result={bool:true}
event.trigger('shaDamage');
}
@ -193,7 +193,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
});
"step 5"
if((!result||!result.bool)&&!event.unhurt){
target.damage(get.nature(event.card),event.baseDamage+event.extraDamage);
target.damage(get.nature(event.card));
event.result={bool:true}
event.trigger('shaDamage');
event.finish();
@ -203,7 +203,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
}
"step 6"
if((!result||!result.bool)&&!event.unhurt){
target.damage(get.nature(event.card),event.baseDamage+event.extraDamage);
target.damage(get.nature(event.card));
event.result={bool:true}
event.trigger('shaDamage');
event.finish();
@ -388,7 +388,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
return target.hp<target.maxHp;
},
content:function(){
target.recover(event.baseDamage||1);
target.recover();
},
ai:{
basic:{
@ -846,7 +846,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
return target.isHealthy();
},
content:function(){
target.recover(event.baseDamage||1);
target.recover();
},
ai:{
basic:{
@ -895,7 +895,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
}
"step 1"
if(result.bool==false){
target.damage(event.baseDamage,event.customSource||player);
target.damage();
}
},
ai:{
@ -970,7 +970,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
}
"step 1"
if(result.bool==false){
target.damage(event.baseDamage);
target.damage();
}
},
ai:{
@ -1147,10 +1147,10 @@ game.import('card',function(lib,game,ui,get,ai,_status){
}
else{
if(event.turn==target){
target.damage(event.baseDamage+event.extraDamage);
target.damage();
}
else{
player.damage(target,event.baseDamage+event.extraDamage);
player.damage(target);
}
}
}

View File

@ -154,7 +154,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
'step 1'
if(result.bool){
target.showCards(result.cards);
if(get.suit(card)!=get.suit(result.cards[0])) target.damage(event.baseDamage||1);
if(get.suit(card)!=get.suit(result.cards[0])) target.damage();
}
},
ai:{

View File

@ -30,7 +30,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
},
content:function(){
'step 0'
target.recover(event.baseDamage||1);
target.recover();
'step 1'
if(target.hasCard(function(card){
return _status.connectMode||get.name(card,target)=='du';
@ -56,6 +56,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
content:function(){
'step 0'
if(typeof event.baseDamage!='number') event.baseDamage=1;
if(typeof event.extraDamage!='number') event.extraDamage=0;
if(!target.countCards('h')||!player.isIn()) event.finish();
else player.choosePlayerCard(target,'h',true);
'step 1'
@ -64,8 +65,8 @@ game.import('card',function(lib,game,ui,get,ai,_status){
var str=get.translation(player);
player.showCards(event.show_card);
target.chooseControl().set('choiceList',[
'令'+str+'获得'+get.translation(event.show_card),
'受到'+str+'造成的'+event.baseDamage+'点伤害',
`${str}获得${get.translation(event.show_card)}`,
`受到${str}造成的${event.baseDamage+event.extraDamage}点伤害`,
]).set('ai',function(){
var evt=_status.event.getParent(),player=evt.target,source=evt.player,card=evt.show_card;
if(get.damageEffect(player,source,player)>0) return 1;

View File

@ -19199,7 +19199,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
雾岛佳乃:['Kirishima','Kano'],
苍井绘梨花:['Aoi','Erika'],
藏里见:['Kura','Satomi'],
喵呜·喵呼:['Myau','Mya-fu'],
'喵呜·喵呼':['Myau','Mya-fu'],
喵呜喵呼:['Myau','Mya-fu'],
伊吹风子:['Ibuki','Fuuko'],
久岛鸥:['Kushima','Kamome'],

View File

@ -830,11 +830,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
content:function(){
'step 0'
player.removeMark('yizhao',player.countMark('yizhao'));
var cards=get.cards(ui.cardPile.childElementCount+1);
for(var i=0;i<cards.length;i++){
ui.cardPile.insertBefore(cards[i],ui.cardPile.childNodes[get.rand(ui.cardPile.childElementCount)]);
}
game.updateRoundNumber();
game.washCard();
'step 1'
var pile=Array.from(ui.cardPile.childNodes);
if(pile.length<3) return;
@ -903,9 +899,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger:{global:'phaseEnd'},
direct:true,
filter:function(event,player){
return player.hasSkill('tianjie_shuffled');
return game.hasGlobalHistory('cardMove',evt=>evt.washCard)&&game.hasPlayer(current=>current!=player);
},
group:'tianjie_effect',
skillAnimation:true,
animationColor:'metal',
content:function(){
@ -925,18 +920,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
}
},
subSkill:{
effect:{
trigger:{global:'washCard'},
forced:true,
silent:true,
charlotte:true,
content:function(){
player.addTempSkill('tianjie_shuffled');
},
},
shuffled:{charlotte:true},
}
},
shencai:{
audio:2,

View File

@ -1080,7 +1080,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
game.delay(2);
"step 2"
if(result.bool){
target.damage('fire',event.baseDamage||1);
target.damage('fire');
}
else{
target.addTempSkill('huogong2');

View File

@ -3050,13 +3050,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(!player.hasZhuSkill('sbhuangtian')||!player.hasSkill('sbguidao',null,false,false)) return false;
if(!event.source||player==event.source||event.source.group!='qun') return false;
if(player.hasSkill('sbguidao')&&player.countMark('sbguidao')>=8) return false;
// if(player.countMark('sbhuangtian_count')>999) return false;
if(player.countMark('sbhuangtian_count')>=4) return false;
return true;
},
content:function(){
player.addMark('sbguidao',1);
// player.addTempSkill('sbhuangtian_count','roundStart');
// player.addMark('sbhuangtian_count',1,false);
player.addTempSkill('sbhuangtian_count','roundStart');
player.addMark('sbhuangtian_count',1,false);
}
},
count:{onremove:true}
@ -4645,7 +4645,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sbguidao:'鬼道',
sbguidao_info:'①游戏开始时你获得4枚“道兵”标记。②“道兵”上限为8。③一名角色受到属性伤害后你获得2枚“道兵”。④当你受到伤害时你可以弃2枚“道兵”并防止此伤害。然后若当前回合角色不为你〖鬼道③〗于你下回合开始前无效。',
sbhuangtian:'黄天',
sbhuangtian_info:'主公技锁定技。①回合开始时若本回合为你的第一个回合且游戏轮数为1且游戏内没有【太平要术】你装备【太平要术】。②其他群势力角色造成伤害后若你拥有〖鬼道〗你获得1枚“道兵”。',
sbhuangtian_info:'主公技锁定技。①回合开始时若本回合为你的第一个回合且游戏轮数为1且游戏内没有【太平要术】你装备【太平要术】。②其他群势力角色造成伤害后若你拥有〖鬼道〗你获得1枚“道兵”每轮你至多以此法获得4枚“道兵”。',
sb_caocao:'谋曹操',
sbjianxiong:'奸雄',
sbjianxiong_info:'①游戏开始时你可获得至多2枚“治世”标记。②当你受到伤害后你可获得伤害牌摸1-X张牌X为“治世”数然后你可弃1枚“治世”。',

View File

@ -13,7 +13,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_huben:['duanjiong','ol_mengda',"caohong","xiahouba","zhugeke","zumao","wenpin","litong","mazhong","heqi","quyi","luzhi","zangba","yuejin","dingfeng","wuyan","ol_zhuling","tianyu","huojun",'zhaoyǎn','dengzhong','ol_furong','macheng','ol_zhangyì','ol_zhujun','maxiumatie','luoxian','ol_huban','haopu','ol_qianzhao'],
sp_liesi:['mizhu','weizi','ol_liuba','zhangshiping'],
sp_default:["sp_diaochan","sp_zhaoyun","sp_sunshangxiang","sp_caoren","sp_jiangwei","sp_machao","sp_caiwenji","jsp_guanyu","jsp_huangyueying","sp_pangde","sp_jiaxu","yuanshu",'sp_zhangliao','sp_ol_zhanghe','sp_menghuo'],
sp_waitforsort:['ol_luyusheng','ol_pengyang'],
sp_waitforsort:['ol_luyusheng','ol_pengyang','ol_tw_zhangji','ol_feiyi','ol_lvboshe'],
sp_qifu:["caoying",'panshu',"caochun","yuantanyuanshang",'caoshuang','wolongfengchu','guansuo','baosanniang','fengfangnv','jin_zhouchu'],
sp_wanglang:['ol_wanglang','ol_puyuan','ol_zhouqun'],
sp_zhongdan:["cuiyan","huangfusong"],
@ -25,9 +25,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){
tianyu:function(mode){
return mode!='chess'&&mode!='tafang'&&mode!='stone';
},
ol_dongzhao:function(mode){
return mode=='identity'&&['normal','zhong'].contains(_status.mode);
},
ol_lvboshe:function(mode){
return mode=='doudizhu';
},
},
character:{
ol_luyusheng:['female','wu',3,['olcangxin','skill_luyusheng_B'],['unseen']],
ol_tw_zhangji:['male','wei',3,['skill_zhangji_A','skill_zhangji_B'],['unseen']],
ol_feiyi:['male','shu',3,['skill_feiyi_A','skill_feiyi_B'],['unseen']],
ol_lvboshe:['male','qun',4,['skill_lvboshe'],['unseen']],
ol_luyusheng:['female','wu',3,['olcangxin','olrunwei']],
caoxi:['male','wei',3,['olgangshu','oljianxuan']],
ol_pengyang:['male','shu',3,['olqifan','oltuishi','nzry_cunmu']],
ol_qianzhao:['male','wei',4,['olweifu','olkuansai']],
@ -192,11 +201,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
xizhicai:['male','wei',3,['tiandu','xianfu','chouce']],
quyi:['male','qun',4,['fuqi','jiaozi']],
luzhi:['male','wei',3,['qingzhong','weijing']],
//kaisa:["male","western",4,["zhengfu"]],
luzhi:['male','wei',3,['qingzhong','weijing']]
},
characterIntro:{
lvboshe:'吕伯奢,东汉成皋(今河南荥阳)人,曹操父亲曹嵩的故友。曹操与陈宫在逃离董卓避祸,返回乡里的途中借宿于吕伯奢家,未伤其人,有贼八人欲捉曹操,曹操杀之,明罗贯中在历史小说《三国演义》中将这段历史进行了丑化加工,也成为小说中曹操名言“宁教我负天下人,休教天下人负我”的出处。',
caoxi:'曹羲249年字昭叔。曹真之子曹爽之弟。为人有学识明律法。司马懿曾组织朝议改革九品中正制废除九品而留中正曹羲认为此举并无区别最终都是决定于人的人治。曹爽掌权后受封中领军掌握禁兵封安乡侯。曹爽及诸兄弟轻视司马懿恣意妄为经常外出狩猎曹羲屡次劝谏不被采纳。249年司马懿发动高平陵政变被夷三族。',
duanjiong:'段颎179年字纪明武威姑臧今甘肃省武威市人。东汉名将西域都护段会宗从曾孙与皇甫规字威明、张奂字然明并称“凉州三明”。段颎少时学习骑射有文武智略最初被举为孝廉为宪陵园丞、阳陵令有治理之才。汉桓帝时入军旅先破鲜卑后讨平东郭窦、公孙举起事以功封列侯。延熹二年159年起戍边征战十余年百战羌人至永康元年167年平定西羌建宁二年169年平定东羌前后斩东西羌六万余级。累功封新丰县侯。建宁三年170年段颎被征入朝历任侍中、执金吾、河南尹、司隶校尉等职他党附宦官、捕杀太学生因而得保富贵两度出任太尉。光和二年179年权宦王甫罪行被揭发段颎受牵连下狱其后在狱中饮鸩而死。',
haopu:'郝普字子太义阳治所在今湖北枣阳东南人。刘备入川后郝普为零陵太守。建安二十年215年吴将吕蒙进攻荆州三郡唯有郝普坚守待援。但援兵久久不至其挚友邓玄之又被吕蒙所骗郝普也因此上当投降吴国。湘水划界后郝普回归刘备。建安二十四年219年吕蒙再次袭击荆州击败关羽郝普再次投降最终归顺吴国并官至廷尉。郝普与隐蕃亲善隐蕃蓄谋叛变事情败露他受到牵连因此自杀。在刘备集团的5个荆州郡守中郝普是唯一一个抵抗过东吴的荆州郡守。',
@ -696,74 +704,437 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
skill:{
//张既
skill_zhangji_A:{
audio:2,
trigger:{player:'useCardToPlayered'},
filter:function(event,player){
if(player.countMark('skill_zhangji_A_count')>=player.hp) return false;
return event.target!=player&&event.target.countCards('h')&&player.isPhaseUsing();
},
check:function(event,player){
return get.attitude(player,event.target)<0;
},
logTarget:'target',
content:function(){
'step 0'
player.addTempSkill('skill_zhangji_A_count','phaseUseAfter');
player.addMark('skill_zhangji_A_count',1,false);
player.viewHandcards(trigger.target);
var list=[],choiceList=[
'弃置'+get.translation(trigger.target)+'的一张牌,然后若弃置的牌的是能造成火焰伤害的牌,你摸一张牌',
'重铸'+get.translation(trigger.target)+'手牌中的所有【杀】和【决斗】',
'你与'+get.translation(trigger.target)+'互相对对方造成1点伤害',
];
list.push('选项一');
if(trigger.target.countCards('h',{name:['sha','juedou']})) list.push('选项二');
else choiceList[1]='<span style="opacity:0.5">'+choiceList[1]+'</span>';
if(!trigger.target.countCards('h',{name:'shan'})) list.push('选项三');
else choiceList[2]='<span style="opacity:0.5">'+choiceList[2]+'</span>';
player.chooseControl(list).set('prompt',get.prompt('tspowei',target)).set('choiceList',choiceList).set('ai',function(){
var player=_status.event.player,target=_status.event.target;
if(list.contains('选项三')&&player.hp+player.countCards('hs',{name:'tao'})>2) return '选项三';
if(list.contains('选项二')&&target.countCards('h',{name:['sha','juedou']})>1) return'选项二';
return '选项一';
}).set('target',trigger.target);
'step 1'
game.log(player,'选择了','#y'+result.control);
switch(result.control){
case '选项一':
player.discardPlayerCard('he',trigger.target,'visible',true);
break;
case '选项二':
var cards=trigger.target.getCards('h',{name:['sha','juedou']}).filter(card=>trigger.target.canRecast(card));
trigger.target.recast(cards);
event.finish();
break;
case '选项三':
trigger.target.damage(player);
player.damage(trigger.target);
event.finish();
break;
}
'step 2'
if(result.bool&&get.tag(result.cards[0],'fireDamage')) player.draw();
},
subSkill:{
count:{
charlotte:true,
onremove:true,
},
},
},
skill_zhangji_B:{
getNum:function(name){
var num=0;
if(name=='litong') num=1;
else switch(game.getRarity(name)){
case 'junk':num=1;break;
case 'rare':num=2;break;
case 'epic':num=3;break;
case 'legend':num=4;break;
}
return num;
},
getCharacter:function(list){
var listx=[],num=0;
for(var name of list){
var numx=lib.skill.skill_zhangji_B.getNum(name);
if(numx>num){
num=numx;
listx=[name];
}
else if(numx==num) listx.push(name);
}
return listx;
},
group:'skill_zhangji_B_jieming',
audio:2,
trigger:{player:'dying'},
skillAnimation:true,
animationColor:'water',
direct:true,
content:function(){
'step 0'
if(!_status.characterlist) lib.skill.pingjian.initList();
player.chooseTarget(get.prompt('skill_zhangji_B'),'令一名其他角色选择是否更换武将牌',lib.filter.notMe).set('ai',function(target){
var att=get.attitude(_status.event.player,target);
var num=lib.skill.skill_zhangji_B.getNum(target.name);
if(target.name2!=undefined) num=Math.min(num,lib.skill.skill_zhangji_B.getNum(target.name2));
return att*(4-num);
});
'step 1'
if(result.bool){
var target=result.targets[0];
event.target=target;
var num=target.maxHp;
event.num=num;
player.logSkill('skill_zhangji_B',target);
var list=[];
for(var i=0;i<_status.characterlist.length;i++){
if(lib.character[_status.characterlist[i]][1]=='wei') list.push(_status.characterlist[i]);
}
list=list.randomGets(5);
var bolDialog=['请选择替换的武将',[list,'character']];
target.chooseButton(bolDialog).set('ai',function(button){
var target=_status.event.player;
var num=lib.skill.skill_zhangji_B.getNum(target.name);
if(target.name2!=undefined) num=Math.min(num,lib.skill.skill_zhangji_B.getNum(target.name2));
return lib.skill.skill_zhangji_B.getNum(button.link)-num;
});
}
else event.finish();
'step 2'
if(result.bool){
event.character=result.links[0];
if(target.name2!=undefined) target.chooseControl(target.name,target.name2).set('prompt','请选择要更换的武将牌').set('ai',function(){
return lib.skill.skill_zhangji_B.getNum(target.name)<lib.skill.skill_zhangji_B.getNum(target.name2)?target.name:target.name2;
});
else result.control=target.name;
}
else{
target.chat('拒绝');
game.log('但',target,'拒绝更换其武将牌');
event.finish();
}
'step 3'
if(result.control==target.name) target.changeGroup('wei',false);
game.log(target,'将','#g'+get.translation(result.control),'替换为了','#g'+get.translation(event.character));
target.reinit(result.control,event.character,false);
target.maxHp=num;
target.update();
},
subSkill:{
jieming:{
audio:'skill_zhangji_B',
trigger:{player:'damageEnd'},
filter:function(event,player){
return game.hasPlayer(function(current){
return current.countCards('h')<current.maxHp;
});
},
direct:true,
content:function(){
'step 0'
event.count=trigger.num;
'step 1'
event.count--;
player.chooseTarget(get.prompt('skill_zhangji_B'),'令一名手牌数小于其体力上限的角色摸三张牌,然后其将手牌数调整至其体力上限值',function(card,player,target){
return target.countCards('h')<target.maxHp;
}).set('ai',function(target){
var att=get.attitude(_status.event.player,target);
if(target.hasSkillTag('nogain')) att/=6;
if(att>2) return Math.min(5,target.maxHp)-target.countCards('h');
return att/3;
});
'step 2'
if(result.bool){
var target=result.targets[0];
event.target=target;
player.logSkill('skill_zhangji_B_jieming',target);
target.draw(3);
}
else event.finish();
'step 3'
if(target.countCards('h')>target.maxHp) target.chooseToDiscard('h',target.countCards('h')-target.maxHp,true);
if(event.count>0&&game.hasPlayer(function(current){
return current.countCards('h')<current.maxHp;
})&&player.hasSkill('skill_zhangji_B')) event.goto(1);
},
ai:{
maixie:true,
maixie_hp:true,
effect:{
target:function(card,player,target,current){
if(get.tag(card,'damage')&&target.hp>1){
if(player.hasSkillTag('jueqing',false,target)) return [1,-2];
var max=0;
var players=game.filterPlayer();
for(var i=0;i<players.length;i++){
if(get.attitude(target,players[i])>0){
max=Math.max(Math.min(5,players[i].hp)-players[i].countCards('h'),max);
}
}
switch(max){
case 0:return 2;
case 1:return 1.5;
case 2:return [1,2];
default:return [0,max];
}
}
if((card.name=='tao'||card.name=='caoyao')&&
target.hp>1&&target.countCards('h')<=target.hp) return [0,0];
}
},
},
},
},
},
//费祎
skill_feiyi_A:{
audio:2,
enable:'phaseUse',
filter:function(event,player){
var num=player.countCards('h')%2;
if(num==0&&!player.countCards('h')) return false;
return !player.hasSkill('skill_feiyi_A_'+num);
},
filterCard:function(card,player){
return player.countCards('h')%2==0;
},
selectCard:function(){
var player=_status.event.player;
if(player.countCards('h')%2==0) return [player.countCards('h')/2,Infinity];
return -1;
},
check:function(card){
if(player.hasSkill('skill_feiyi_B')){
if(player.countCards('h')-ui.selected.cards.length>1) return 1/(get.value(card)||0.5);
return 0;
}
if(ui.selected.cards.length<player.countCards('h')/2) return 5-get.value(card);
return 0;
},
complexCard:true,
delay:0,
content:function(){
'step 0'
player.addTempSkill('skill_feiyi_A_'+(cards.length?'0':'1'),'phaseUseAfter');
if(cards.length){
player.draw(3)
event.finish();
}
else player.draw(3);
'step 2'
player.chooseToDiscard('h','技能:弃置至少一半手牌',[Math.floor(player.countCards('h')/2),Infinity],true).set('ai',card=>{
var player=_status.event.player;
if(player.hasSkill('skill_feiyi_B')&&player.countCards('h')-ui.selected.cards.length>1) return 1/(get.value(card)||0.5);
if(!player.hasSkill('skill_feiyi_B')&&ui.selected.cards.length<Math.floor(player.countCards('h')/2)) return 1/(get.value(card)||0.5);
return 0;
});
},
subSkill:{
'0':{charlotte:true},
'1':{charlotte:true},
},
ai:{
order:3,
result:{player:1},
},
},
skill_feiyi_B:{
audio:2,
trigger:{
player:'loseAfter',
global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'],
},
filter:function(event,player){
if(player.countCards('h')!=1||typeof get.number(player.getCards('h')[0],player)!='number') return false;
if(player.hasSkill('skill_feiyi_B_0')&&player.hasSkill('skill_feiyi_B_1')) return false;
var evt=event.getl(player);
return evt&&evt.player==player&&evt.hs&&evt.hs.length>0;
},
prompt2:function(event,player){
var str='展示最后一张手牌并摸一张牌';
if(!player.hasSkill('skill_feiyi_B_0')||!player.hasSkill('skill_feiyi_B_0')){
str+=',然后令本回合使用点数';
if(!player.hasSkill('skill_feiyi_B_0')) str+='大于';
if(!player.hasSkill('skill_feiyi_B_0')&&!player.hasSkill('skill_feiyi_B_0')) str+='或';
if(!player.hasSkill('skill_feiyi_B_1')) str+='小于';
str+=get.number(player.getCards('h')[0],player);
str+='的牌额外结算一次';
}
return str;
},
frequent:true,
content:function(){
'step 0'
player.showHandcards(get.translation(player)+'发动了【技能】');
event.num=get.number(player.getCards('h')[0],player);
'step 1'
player.draw();
'step 2'
if(player.hasSkill('skill_feiyi_B_0')) event._result={index:1};
else if(player.hasSkill('skill_feiyi_B_1')) event._result={index:0};
else{
player.chooseControl().set('choiceList',[
'本回合使用点数大于'+num+'的牌额外结算一次',
'本回合使用点数小于'+num+'的牌额外结算一次',
]).set('ai',()=>{
var player=_status.event.player;
var num=_status.event.player;
if(player.getCards('h').reduce(function(num,card){
return num=(get.number(card,player)||0);
},0)>num*2) return 0;
return 1;
}).set('num',num);
}
'step 3'
var skill='skill_feiyi_B_'+result.index;
player.addTempSkill(skill);
player.markAuto(skill,[num]);
},
subSkill:{
'0':{
charlotte:true,
onremove:true,
marktext:'技',
intro:{
markcount:()=>0,
content:'使用点数大于$的牌额外结算一次',
},
audio:'skill_feiyi_B',
trigger:{player:'useCard'},
filter:function(event,player){
var num=get.number(event.card,player);
return typeof num=='number'&&player.getStorage('skill_feiyi_B_0').some(numx=>num>numx);
},
forced:true,
content:function(){
trigger.effectCount++;
game.log(trigger.card,'额外结算一次');
},
},
'1':{
charlotte:true,
onremove:true,
marktext:'能',
intro:{
markcount:()=>0,
content:'使用点数小于$的牌额外结算一次',
},
audio:'skill_feiyi_B',
trigger:{player:'useCard'},
filter:function(event,player){
var num=get.number(event.card,player);
return typeof num=='number'&&player.getStorage('skill_feiyi_B_1').some(numx=>num<numx);
},
forced:true,
content:function(){
trigger.effectCount++;
game.log(trigger.card,'额外结算一次');
},
},
},
},
//吕伯奢
skill_lvboshe:{
mode:['doudizhu'],
zhuanhuanji:true,
mark:true,
markcount:'☯',
intro:{
content:function(storage){
if(storage) return '农民的回合结束时,你可以令其进行一个额外回合';
return '农民的回合结束时,你可以令地主进行一个额外回合';
},
},
audio:2,
trigger:{global:'phaseEnd'},
filter:function(event,player){
return event.player.identity=='fan';
},
prompt2:function(event,player){
return '令'+get.translation(lib.skill.skill_lvboshe.logTarget(event,player))+'进行一个额外回合';
},
logTarget:function(event,player){
var storage=player.storage.skill_lvboshe;
return storage?event.player:game.zhu;
},
content:function(){
var target=lib.skill.skill_lvboshe.logTarget(trigger,player);
player.changeZhuanhuanji('skill_lvboshe');
target.insertPhase();
},
},
//OL陆郁生
olcangxin:{
audio:2,
trigger:{player:'damageBegin4'},
filter:function(event,player){
return ui.cardPile.childNodes.length>0;
},
check:function(event,player){
checkx:function(event,player){
var target=event.source;
return get.damageEffect(player,target,target);
return get.damageEffect(player,target,target)<=0;
},
forced:true,
content:function(){
'step 0'
var cards=[],cardx=Array.from(ui.cardPile.childNodes);
for(var i=cardx.length-1;i>=0;i--){
cards.push(cardx[i]);
if(cards.length>=3) break;
}
if(!cards.length){
event.finish();
return;
}
var cards=get.bottomCards(3,true);
player.chooseButton(['###藏心:请选择要弃置的牌###若以此法弃置了红桃牌,则防止此伤害',cards],[1,cards.length],true).set('ai',function(button){
if(!_status.event.bool&&get.suit(button.link,false)=='heart') return 0;
if(get.suit(button.link,false)!='heart') return 1;
if(!ui.selected.buttons.some(but=>get.suit(but.link,false)=='heart')) return 1;
return 0;
});
}).set('bool',lib.skill.olcangxin.checkx(trigger,player));
'step 1'
if(result.bool){
player.$throw(result.links,1000);
game.cardsDiscard(result.links);
if(result.links.some(card=>get.suit(card,false)=='heart')) trigger.cancel();
}
else event.finish();
'step 2'
game.delayx();
},
group:'olcangxin_yingzi',
subSkill:{
yingzi:{
audio:'olcangxin',
trigger:{player:'phaseDrawBegin2'},
filter:function(event,player){
if(event.numFixed) return false;
var cards=[],cardx=Array.from(ui.cardPile.childNodes);
for(var i=cardx.length-1;i>=0;i--){
cards.push(cardx[i]);
if(cards.length>=3) break;
}
return cards.some(card=>get.suit(card,false)=='heart');
},
trigger:{player:'phaseDrawBegin'},
forced:true,
locked:false,
content:function(){
var cards=[],cardx=Array.from(ui.cardPile.childNodes);
for(var i=cardx.length-1;i>=0;i--){
cards.push(cardx[i]);
if(cards.length>=3) break;
}
cards=cards.filter(card=>get.suit(card,false)=='heart');
trigger.num+=cards.length;
var cards=get.bottomCards(3,true);
player.showCards(cards,get.translation(player)+'发动了【藏心】');
trigger.num+=cards.filter(card=>get.suit(card,false)=='heart').length;
},
},
},
},
skill_luyusheng_B:{
olrunwei:{
audio:2,
trigger:{global:'phaseDiscardBegin'},
filter:function(event,player){
if(event.player==player) return false;
return event.player.isDamaged()&&event.player.countCards('h')!=event.player.getHandcardLimit();
return event.player.isDamaged();
},
direct:true,
content:function(){
@ -792,22 +1163,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return 2;
break;
}
}).set('prompt',get.prompt('skill_luyusheng_B',trigger.player));
}).set('prompt',get.prompt('olrunwei',trigger.player));
'step 1'
if(result.index!=2){
player.logSkill('skill_luyusheng_B',trigger.player);
player.logSkill('olrunwei',trigger.player);
if(result.index==0){
trigger.player.chooseToDiscard('he',true).set('ai',card=>{
if(get.position(card)=='e') return -get.value(card);
return 1/(get.value(card)||0.5);
});
trigger.player.addTempSkill('skill_luyusheng_B_+');
trigger.player.addMark('skill_luyusheng_B_+',1,false);
trigger.player.addTempSkill('olrunwei_+');
trigger.player.addMark('olrunwei_+',1,false);
}
if(result.index==1){
trigger.player.draw();
trigger.player.addTempSkill('skill_luyusheng_B_-');
trigger.player.addMark('skill_luyusheng_B_-',1,false);
trigger.player.addTempSkill('olrunwei_-');
trigger.player.addMark('olrunwei_-',1,false);
}
}
},
@ -819,7 +1190,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
intro:{content:'手牌上限+#'},
mod:{
maxHandcard:function(player,num){
return num+player.countMark('skill_luyusheng_B_+');
return num+player.countMark('olrunwei_+');
},
},
},
@ -830,7 +1201,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
intro:{content:'手牌上限-#'},
mod:{
maxHandcard:function(player,num){
return num-player.countMark('skill_luyusheng_B_-');
return num-player.countMark('olrunwei_-');
},
},
},
@ -7841,21 +8212,45 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
//芮姬
qiaoli:{
audio:2,
enable:'chooseToUse',
viewAs:{name:'juedou'},
viewAsFilter:function(player){
return player.hasCard(function(card){
return get.type(card)=='equip';
},'ehs')
onChooseToUse:function(event){
if(event.type=='phase'&&!game.online&&!(event.qiaoli_equip1&&event.qiaoli_noequip1)){
var player=event.player;
var evt=event.getParent('phaseUse');
if(player.getHistory('useCard',function(evtx){
return evtx.getParent('phaseUse')==evt&&evtx.skill=='qiaoli'&&get.subtype(evtx.cards[0])=='equip1';
}).length) event.set('qiaoli_equip1',true);
if(player.getHistory('useCard',function(evtx){
return evtx.getParent('phaseUse')==evt&&evtx.skill=='qiaoli'&&get.subtype(evtx.cards[0])!='equip1';
}).length) event.set('qiaoli_noequip1',true);
}
},
audio:2,
enable:'phaseUse',
viewAs:{
name:'juedou',
qiaoli:true,
},
filterCard:function(card,player){
if(get.type(card)!='equip') return false;
var event=_status.event;
if(get.subtype(card)=='equip1'&&event.qiaoli_equip1) return false;
if(get.subtype(card)!='equip1'&&event.qiaoli_noequip1) return false;
return true;
},
viewAsFilter:function(player){
return player.isPhaseUsing()&&player.hasCard(function(card){
return lib.skill.qiaoli.filterCard(card,player);
},'hes');
},
filterCard:{type:'equip'},
check:function(card){
if(get.position(card)=='e') return 7.5-get.value(card);
return 12-_status.event.player.getUseValue(card);
},
position:'hes',
group:['qiaoli_effect','qiaoli_gain','qiaoli_norespond'],
precontent:function(){
player.addTempSkill('qiaoli_norespond');
player.addTempSkill('qiaoli_effect');
},
ai:{
directHit_ai:true,
skillTagFilter:function(player,tag,arg){
@ -7864,31 +8259,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
subSkill:{
norespond:{
trigger:{player:'useCard1'},
forced:true,
charlotte:true,
popup:false,
trigger:{player:'useCard1'},
filter:function(event,player){
if(event.skill!='qiaoli') return false;
var card=event.cards[0];
return get.subtype(card)!='equip1';
return event.card.qiaoli&&get.subtype(event.cards[0])!='equip1';
},
forced:true,
popup:false,
content:function(){
trigger.directHit.addArray(game.filterPlayer(function(current){
return current!=player;
}));
player.addTempSkill('qiaoli_gain');
trigger.directHit.addArray(game.players);
game.log(trigger.card,'不可被响应');
},
},
effect:{
trigger:{player:'useCardAfter'},
forced:true,
charlotte:true,
popup:false,
trigger:{source:'damageSource'},
filter:function(event,player){
if(event.skill!='qiaoli') return false;
var card=event.cards[0];
return get.subtype(card)=='equip1';
return event.card&&event.cards&&event.card.qiaoli&&get.subtype(event.cards[0])=='equip1';
},
forced:true,
popup:false,
content:function(){
'step 0'
var card=trigger.cards[0];
@ -7921,7 +8312,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
cards:cards,
filterTarget:lib.filter.notMe,
selectCard:[1,cards.length],
prompt:'是否将的牌分配给其他角色?',
prompt:'是否将得的牌分配给其他角色?',
ai1:function(card){
return -1;
},
@ -7940,33 +8331,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
'step 4'
if(_status.connectMode){
game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});
game.broadcastAll(function(){delete _status.noclearcountdown});
game.stopCountChoose();
}
var map=[],cards=[];
for(var i in event.given_map){
var source=(_status.connectMode?lib.playerOL:game.playerMap)[i];
player.line(source,'green');
map.push([source,event.given_map[i]]);
cards.addArray(event.given_map[i]);
source.gain(event.given_map[i],player,'giveAuto');
}
if(map.length) game.loseAsync({
gain_list:map,
player:player,
cards:cards,
giver:player,
animate:'giveAuto',
}).setContent('gaincardMultiple');
event.next.sort(function(a,b){
return lib.sort.seat(a.player,b.player);
});
},
},
gain:{
charlotte:true,
audio:'qiaoli',
trigger:{player:'phaseJieshuBegin'},
forced:true,
filter:function(event,player){
return player.hasHistory('useCard',function(evt){
return evt.skill=='qiaoli';
})
},
content:function(){
var card=get.cardPile2(function(card){
return get.type(card)=='equip';
@ -7979,10 +8361,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
qingliang:{
audio:2,
trigger:{target:'useCardToTarget'},
usable:1,
filter:function(event,player){
if(event.targets.length!=1) return false;
var bool1=(event.card.name=='sha');
var bool2=(get.type2(event.card)=='trick'&&get.tag(event.card,'damage'));
if(!bool1&&!bool2) return false;
return player!=event.player&&player.countCards('h')>0;
},
usable:1,
logTarget:'player',
check:function(event,player){
if(get.attitude(player,event.player)>0||event.player.hasSkillTag('nogain')) return true;
@ -9118,10 +9504,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.logSkill('olxianlve');
player.storage.olxianlve=name;
player.markSkill('olxianlve');
game.log(player,'声明了','#g'+get.translation(name));
}
},
intro:{content:'已声明【$】'},
intro:{
content:function(name,player){
return '已声明'+(player.isUnderControl(true)?'【'+get.translation(name)+'】':'一个牌名');
},
},
group:['olxianlve_use','olxianlve_count'],
subSkill:{
count:{
@ -9238,7 +9627,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var name=result.links[0][2];
player.storage.olxianlve=name;
player.markSkill('olxianlve');
game.log(player,'声明了','#g'+get.translation(name));
}
},
},
@ -12907,47 +13295,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
},
//英文版特典武将凯撒
zhengfu:{
trigger:{
player:"useCardToPlayered",
},
check:function (event,player){
return get.attitude(player,event.target)<0;
},
filter:function(event,player){
return event.card.name=='sha';
},
logTarget:"target",
line:false,
content:function (){
'step 0'
player.line(trigger.target,{color:[220, 90, 139]});
player.chooseControl(['basic','trick','equip']).set('ai',function(){
var player=_status.event.target;
if(!player.countCards('h','sha')&&player.countCards('h','shan')) return 'trick';
return 'basic';
}).set('prompt','请选择一种牌的类别').set('target',trigger.target);
'step 1'
trigger.target.chooseCard('he','交给'+get.translation(player)+'一张'+get.translation(result.control)+'牌,否则此【杀】不可被闪避。',function(card){
return get.type(card,'trick')==result.control;
}).set('ai',function(card){
var num=_status.event.num;
if(num==0) return 0;
if(card.name=='shan') return num>1?2:0;
return 8-get.value(card);
}).set('num',trigger.target.countCards('h','shan'))
'step 2'
if(result.bool){
var cards=result.cards;
trigger.target.give(cards,player);
}
else{
trigger.getParent().directHit.add(trigger.target);
game.delay();
}
},
},
//变权移植
wanwei:{
trigger:{target:['rewriteGainResult','rewriteDiscardResult']},
@ -23933,6 +24280,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(player.storage.olsaogu) return '转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;<span class="bluetext">阳:摸一张牌</span>。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。';
return '转换技。①出牌阶段,你可以。<span class="bluetext">阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】</span>;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。';
},
skill_lvboshe:function(player){
if(player.storage.skill_lvboshe) return '农民的回合结束时:阴,你可以令地主进行一个额外回合;<span class="bluetext">阳,你可以令其进行一个额外回合</span>。';
return '农民的回合结束时:<span class="bluetext">阴,你可以令地主进行一个额外回合</span>;阳,你可以令其进行一个额外回合。';
},
},
characterReplace:{
caoshuang:['caoshuang','ns_caoshuang'],
@ -23988,6 +24339,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
zhouqun:['ol_zhouqun','zhouqun'],
qianzhao:['ol_qianzhao','qianzhao'],
ol_pengyang:['ol_pengyang','sp_pengyang'],
ol_luyusheng:['ol_luyusheng','luyusheng'],
},
translate:{
"xinfu_lingren":"凌人",
@ -24141,7 +24493,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
lvfan:'吕范',
liqueguosi:'李傕郭汜',
cuimao:'崔琰毛玠',
kaisa:"凯撒",
caoying:"曹婴",
@ -24211,8 +24562,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
"zhenwei_three_info":"锁定技,敌方角色至己方其他角色的距离+1。",
"huanshi_three":"缓释",
"huanshi_three_info":"一名友方角色的判定牌生效前,你可打出一张牌代替之。",
zhengfu:"征服",
"zhengfu_info":"当你使用【杀】指定目标时,你可以选择一种牌的类别,然后除非目标角色交给你一种该类别的牌,否则其不能闪避此【杀】。",
yizan:"翊赞",
yizan_info:"你可以将两张牌(其中至少一张是基本牌)当任意基本牌牌使用",
@ -24880,10 +25229,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
liejie_info:'当你受到伤害后你可以弃置至多三张牌摸等量的牌然后可弃置伤害来源的至多X张牌X为你以此法弃置的红色牌的数量。',
ruiji:'OL芮姬',
qiaoli:'巧力',
qiaoli_info:'①你可以将一张装备牌当做【决斗】使用。若此【决斗】对应的实体牌为武器牌,当你以此法声明使用【决斗】后你摸X张牌X为此牌的攻击范围且可以将其中任意张牌分配给其他角色不为武器牌,此牌不可被响应。②结束阶段开始时,若你于本回合内发动过〖巧力①〗,则你从牌堆中获得一张装备牌。',
qiaoli_info:'出牌阶段各限一次,你可以将一张武器牌/非武器装备牌当作【决斗】使用。若此【决斗】对应的实体牌为武器牌,当你以此【决斗】对目标角色造成伤害你摸X张牌X为此牌的攻击范围且可以将其中任意张牌分配给其他角色若此【决斗】对应的实体牌不为武器牌,此牌不可被响应,且你于结束阶段从牌堆中获得一张装备牌。',
qiaoli_given:'已分配',
qingliang:'清靓',
qingliang_info:'每回合限一次。当你成为其他角色使用牌的目标时,你可展示所有手牌,然后选择一项:⒈你与其各摸一张牌,⒉取消此目标,然后弃置你手牌中一种花色的所有牌。',
qingliang_info:'每回合限一次,当你成为其他角色使用【杀】或伤害类锦囊牌的唯一目标时,你可展示所有手牌,然后选择一项:⒈你与其各摸一张牌,⒉取消此目标,然后弃置你手牌中一种花色的所有牌。',
chixueqingfeng:'赤血青锋',
chixueqingfeng2:'赤血青锋',
chixueqingfeng_info:'锁定技,当你使用【杀】指定目标后,你令目标角色不能使用或打出手牌且防具技能无效直到此【杀】结算结束。',
@ -25112,9 +25461,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
olkuansai_info:'当一张牌指定第一个目标后若目标数大于你的体力值你可以令其中一个目标选择一项1.交给你一张牌2.令你回复1点体力。',
ol_luyusheng:'OL陆郁生',
olcangxin:'藏心',
olcangxin_info:'①当你受到伤害时,你可以观看牌堆底的三张牌并弃置其中任意张牌,若你以此法弃置了红桃牌,则防止此伤害。②摸牌阶段你多摸X张牌X为牌堆底前三张牌中红桃牌的数量)。',
skill_luyusheng_B:'技能',
skill_luyusheng_B_info:'其他角色的弃牌阶段开始时,若其已受伤且其手牌数不等于其体力上限,则你可以选择一项:①令其弃置一张牌,其本回合手牌上限+1②令其摸一张牌其本回合手牌上限-1。',
olcangxin_info:'锁定技。①当你受到伤害时,你观看牌堆底的三张牌并弃置其中任意张牌,若你以此法弃置了红桃牌,则防止此伤害。②摸牌阶段开始时你展示牌堆底的三张牌然后摸X张牌X为其中红桃牌的数量)。',
olrunwei:'润微',
olrunwei_info:'其他角色的弃牌阶段开始时,若其已受伤,则你可以选择一项:①令其弃置一张牌,其本回合手牌上限+1②令其摸一张牌其本回合手牌上限-1。',
caoxi:'曹羲',
olgangshu:'刚述',
olgangshu_info:'①当你使用非基本牌结算结束后,你可以令以下一项数值+1每项至多以此法+51.攻击范围2.受〖刚述〗影响的下个摸牌阶段摸牌数3.使用【杀】的次数上限。②当有牌被你抵消后,重置你〖刚述①〗增加的所有数值。',
@ -25125,6 +25474,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){
olqifan_info:'当你需要使用不为【无懈可击】的牌时你可以观看牌堆底的X+1张牌并使用其中的一张。此牌结算结束时你依次弃置以下前X个区域中的所有牌⒈判定区、⒉装备区、⒊手牌区X为你因此技能使用过的牌中包含的类型数。',
oltuishi:'侻失',
oltuishi_info:'锁定技。①你不能使用【无懈可击】。②当你使用点数为字母的牌后,你摸两张牌,且你使用的下一张牌无距离和次数限制。',
ol_tw_zhangji:'张既',
skill_zhangji_A:'技能',
skill_zhangji_A_info:'出牌阶段限X次X为你的体力值当你使用牌指定一名其他角色为目标后你可以观看其手牌然后你选择一项<br>1.弃置其一张牌,然后若弃置的牌是能造成火焰伤害的牌,你摸一张牌。<br>2.重铸其手牌中的所有【杀】和【决斗】。<br>3.若其没有【闪】你与其互相对对方造成1点伤害。',
skill_zhangji_B:'技能',
skill_zhangji_B_info:'当你受到1点伤害后你可令一名手牌数小于体力上限的角色摸三张牌然后其将手牌数弃置至其体力上限数当你进入濒死状态时你可令一名其他角色观看五张魏势力武将牌其可以选择其中一张代替自己的武将牌体力和体力上限不变。',
ol_feiyi:'费祎',
skill_feiyi_A:'技能',
skill_feiyi_A_info:'出牌阶段各限一次,若你的手牌数为:①奇数,你可以摸三张牌,然后弃置至少一半手牌(向下取整);②偶数,你可以弃置至少一半手牌,然后摸三张牌。',
skill_feiyi_B:'技能',
skill_feiyi_B_info:'每回合每项限一次当你的手牌数变为1后你可以展示此唯一手牌A并摸一张牌然后你选择一项①本回合使用点数大于A的点数的牌额外结算一次②本回合使用点数小于A的点数的牌额外结算一次。',
ol_lvboshe:'吕伯奢',
skill_lvboshe:'技能',
skill_lvboshe_info:'农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,你可以令其进行一个额外回合。',
sp_tianji:'天极·皇室宗亲',
sp_sibi:'四弼·辅国文曲',
@ -25141,6 +25504,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_guozhan2:"国战移植",
sp_others:"其他",
sp_waitforsort:'等待分包',
},
}
};
});

View File

@ -2042,7 +2042,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 0'
trigger._dunxi=true;
trigger.player.removeMark('dunxi',1);
var target=trigger.target;
var target=trigger.targets[0];
event.target=target;
trigger.targets.remove(target);
//trigger.triggeredTargets1.remove(target);
@ -10533,5 +10533,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_danqi:'千里单骑',
sp_decade:'其他新服武将',
},
pinyins:{
卑弥呼:['Himiko']
}
};
});

View File

@ -9715,7 +9715,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
enable:['chooseToUse','chooseToRespond'],
filter:function(event,player){
if(event.type=='wuxie') return false;
if(event.type=='wuxie'||player.hasSkill('zhenshan_used')) return false;
var nh=player.countCards('h');
if(!game.hasPlayer(function(current){
return current!=player&&current.countCards('h')<nh;
@ -9787,6 +9787,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 1'
if(result.bool){
player.logSkill('zhenshan',result.targets);
player.addTempSkill('zhenshan_used');
player.swapHandcards(result.targets[0]);
delete event.result.skill;
}
@ -9797,9 +9798,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
},
prompt:function(links,player){
return '选择【'+get.translation(links[0][3]||'')+get.translation(links[0][2])+'】的目标';
return '选择【'+get.translation(links[0][3]||'')+get.translation(links[0][2])+'】的目标';
}
},
subSkill:{
used:{charlotte:true},
},
ai:{
order:function(){
var player=_status.event.player;
@ -9828,6 +9832,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
respondSha:true,
respondShan:true,
skillTagFilter:function(player,tag,arg){
if(player.hasSkill('zhenshan_used')) return false;
var nh=player.countCards('h');
return game.hasPlayer(function(current){
return current!=player&&current.countCards('h')<nh;
@ -10361,7 +10366,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
frequent:true,
content:function(){
'step 0'
player.draw(player.hp);
player.draw(2);
'step 1'
if(player.getHistory('sourceDamage').length||player.getHistory('gain',function(evt){
return evt.getParent('phaseUse')==trigger.getParent('phaseUse')&&evt.getParent().name=='draw';
@ -10380,11 +10385,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
content:function(){
'step 0'
var choiceList=['令'+get.translation(trigger.source)+'本回合不能再使用或打出牌'];
if (trigger.source.countCards('h')) choiceList.push('令'+get.translation(trigger.source)+'弃置'+get.cnNumber(trigger.source.hp)+'张牌');
if (trigger.source.countCards('h')) choiceList.push('令'+get.translation(trigger.source)+'弃置张牌');
player.chooseControl('cancel2').set('prompt2',get.prompt2('yuzhang')).set('choiceList',choiceList).set('ai',function(){
var player=_status.event.player,source=_status.event.source;
if(get.attitude(player,event.source)>0) return 'cancel2';
if(source.hasSkillTag('noh')||source.hasSkillTag('noe')||source.countCards('h')>=2*source.hp) return 0;
if(source.hasSkillTag('noh')||source.hasSkillTag('noe')||source.countCards('h')>=4) return 0;
if(source.hp>1&&source.countCards('h')>1) return 1;
return 'cancel2';
}).set('source',trigger.source);
@ -10393,12 +10398,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.logSkill('yuzhang',trigger.source);
player.removeMark('twjingce',1);
if(result.index==0) trigger.source.addTempSkill('yuzhang_dontuse');
else trigger.source.chooseToDiscard('he',trigger.source.hp,true);
else trigger.source.chooseToDiscard('he',2,true);
}
},
group:"yuzhang_skip",
subSkill:{
skip:{
audio:'yuzhang',
trigger:{
player:["phaseJudgeBefore","phaseDrawBefore","phaseUseBefore","phaseDiscardBefore"],
},
@ -13956,6 +13962,47 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
},
},
//英文版特典武将凯撒
zhengfu:{
trigger:{
player:"useCardToPlayered",
},
check:function (event,player){
return get.attitude(player,event.target)<0;
},
filter:function(event,player){
return event.card.name=='sha';
},
logTarget:"target",
line:false,
content:function(){
'step 0'
player.line(trigger.target,{color:[220, 90, 139]});
player.chooseControl(['basic','trick','equip']).set('ai',function(){
var player=_status.event.target;
if(!player.countCards('h','sha')&&player.countCards('h','shan')) return 'trick';
return 'basic';
}).set('prompt','请选择一种牌的类别').set('target',trigger.target);
'step 1'
trigger.target.chooseCard('he','交给'+get.translation(player)+'一张'+get.translation(result.control)+'牌,否则此【杀】不可被闪避。',function(card){
return get.type(card,'trick')==_status.event.getParent().result.control;
}).set('ai',function(card){
var num=_status.event.num;
if(num==0) return 0;
if(card.name=='shan') return num>1?2:0;
return 8-get.value(card);
}).set('num',trigger.target.countCards('h','shan'))
'step 2'
if(result.bool){
var cards=result.cards;
trigger.target.give(cards,player);
}
else{
trigger.getParent().directHit.add(trigger.target);
game.delay();
}
}
}
},
perfectPair:{
tw_liufuren:['yuanshao'],
@ -13966,6 +14013,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){
mateng:['tw_mateng','mateng'],
},
dynamicTranslate:{
twfeifu:function(player){
var str='转换技。';
if(!player.storage.twfeifu) str+='<span class="bluetext">';
str+='阴:当你成为【杀】的唯一目标后;';
if(!player.storage.twfeifu) str+='</span>';
if(player.storage.twfeifu) str+='<span class="bluetext">';
str+='阳:当你使用【杀】指定唯一目标后;';
if(player.storage.twfeifu) str+='</span>';
str+='目标角色须交给使用者一张牌。若此牌为装备牌,则使用者可使用此牌。';
return str;
},
twfengpo:function(player){
if(player.storage.twfengpo) return '当你使用【杀】或【决斗】指定唯一目标后你可观看目标角色的手牌并选择一项⒈摸X张牌。⒉令此牌的伤害值基数+XX为其手牌中的红色牌数。';
return '①当你使用【杀】或【决斗】指定唯一目标后你可观看目标角色的手牌并选择一项⒈摸X张牌。⒉令此牌的伤害值基数+XX为其手牌中的♦数。②当你杀死一名角色后你将〖凤魄①〗中的“♦数”改为“红色牌数”。';
@ -14136,9 +14194,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
twchunlao_info:'①准备阶段,若场上没有“醇”,则你可将一名角色区域内的一张牌置于其武将牌上,称为“醇”。②一名角色使用【杀】时,若其有“醇”,则其可以交给你一张牌,令此【杀】的伤害值基数+1。③一名角色进入濒死状态时若其有“醇”则你可以移去“醇”并摸一张牌然后令其回复1点体力。',
tw_guohuai:'TW郭淮',
twjingce:"精策",
twjingce_info:"当你于出牌阶段使用第X张牌时你可以摸X张牌X为你的体力值。若此阶段你此前摸过牌或本回合造成过伤害你获得一枚“策”标记。",
twjingce_info:"当你于出牌阶段使用第X张牌时你可以摸张牌X为你的体力值。若此阶段你此前摸过牌或本回合造成过伤害你获得一枚“策”标记。",
yuzhang:"御嶂",
yuzhang_info:"你可以弃置一枚“策”标记,然后跳过一个阶段。当你受到伤害后,你可弃置一枚“策”标记,然后选择一项:⒈令伤害来源弃置X张牌X为其体力值;⒉令伤害来源本回合不能再使用或打出牌。",
yuzhang_info:"你可以弃置一枚“策”标记,然后跳过一个阶段。当你受到伤害后,你可弃置一枚“策”标记,然后选择一项:⒈令伤害来源弃置两张牌;⒉令伤害来源本回合不能再使用或打出牌。",
tw_caozhao:'曹肇',
twfuzuan:'复纂',
twfuzuan_info:'出牌阶段限一次/当你受到伤害后/当你对其他角色造成伤害后,你可选择一名拥有转换技的角色,变更其的一个转换技的的状态。',
@ -14166,7 +14224,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
twcongji_info:'当你的红色牌于回合外因弃置而进入弃牌堆后,你可令一名其他角色获得这些牌。',
old_quancong:'TW全琮',
zhenshan:'振赡',
zhenshan_info:'当你需要使用或打出一张基本牌时,你可以与一名手牌数少于你的角色交换手牌,视为使用或打出此牌。',
zhenshan_info:'每回合限一次,当你需要使用或打出一张基本牌时,你可以与一名手牌数少于你的角色交换手牌,视为使用或打出此牌。',
tw_tianyu:'TW田豫',
twzhenxi:'震袭',
twzhenxi_info:'每回合限一次。当你使用【杀】指定目标后你可选择一项⒈弃置其X张手牌X为你至其的距离⒉将其装备区或判定区内的一张牌移动到另一名角色的装备区或判定区内。若其体力值大于你或其体力值为全场最高则你可以改为依次执行以上两项。',
@ -14516,6 +14574,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
twquanqian_info:'昂扬技。出牌阶段限一次你可以将至多四张花色各不相同的手牌交给一名其他角色然后若你交出的牌数大于1则你从牌堆中获得一张装备牌然后选择一项①将手牌数摸至与其相同②观看其手牌并获得其一种花色的所有牌。<br>激昂:你弃置六张手牌。',
twrouke:'柔克',
twrouke_info:'锁定技。当你于摸牌阶段外得到超过一张牌时,你摸一张牌。',
kaisa:"凯撒",
zhengfu:"征服",
zhengfu_info:"当你使用【杀】指定目标时,你可以选择一种牌的类别,然后除非目标角色交给你一种该类别的牌,否则其不能闪避此【杀】。",
tw_mobile:'海外服·稀有专属',
tw_yunchouzhi:'运筹帷幄·智',
@ -14529,6 +14590,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
tw_mobile2:'海外服·异构',
tw_yijiang:'一将成名TW',
tw_english:'英文版',
},
pinyins:{
凯撒:['Caesar'],
难升米:['Nashime']
}
};
});

View File

@ -4665,6 +4665,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(current.countCards('hs',card=>current.canUse(card,player)&&get.effect(player,card,current,player)<0)>=2) return false;
return true;
},
frequent:'check',
content:function(){
player.draw().gaintag=['dcjiexing'];
player.addTempSkill('dcjiexing_add');
@ -11557,7 +11558,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
zhouyi:'周夷,游卡桌游旗下产品《三国杀》自行杜撰的人物。设定为周瑜的妹妹,和周瑜一同征战。',
caojinyu:'金乡公主,本姓曹氏,名字不详,沛国谯县(今安徽省亳州市)人。魏武帝曹操的女儿,母为杜夫人。适婚的时候,嫁给曹操的养子何晏。高平陵之变,何晏作为大将军曹爽的党羽,遭到太傅司马懿处死。在何晏母亲尹夫人苦苦哀求下,何晏的儿子得以保全。',
wufan:'吴范226年字文则会稽上虞今浙江绍兴上虞区人。三国时期孙吴官员擅长术数。与刘惇、赵达、严武、曹不兴、皇象、宋寿和郑妪合称“吴中八绝”。吴范以推算天象节气和观察气候闻名于郡中。孙权起于东南他委身事奉每推算灾祥多应验遂显名。孙权委以骑都尉领太史令。初孙权为将军时他曾说江南有王气。及孙权立为吴王论功行封欲以为都亭侯但因不愿将其术要诀告知孙权为权所怨恨被除名。黄武中病死。',
caomao:'曹髦241年11月15日260年6月2日[1]字彦士沛国谯县今安徽省亳州市魏文帝曹丕之孙东海王曹霖之子曹魏第四位皇帝254年11月1日260年6月2日。正始二年241年生于东海王宫自幼聪明好学才慧早成正始五年244年封为高贵乡公嘉平六年254年大将军司马师废除齐王曹芳后拥立为帝年号正元曹髦文才武略崇拜少康不满司马氏专权秉政甘露五年260年亲自讨伐司马昭为太子舍人成济所弑年仅十九岁以王礼葬于洛阳西北。曹髦擅长诗文创制了九言诗传世文章有《伤魂赋并序》《颜子论》等。爱好儒学亲赴太学论道著有《春秋左氏传音》失传。精通绘画一说为中国第一位成为画家的皇帝唐张彦远《历代名画记》目曹髦为中品。',
caomao:'曹髦241年11月15日260年6月2日字彦士沛国谯县今安徽省亳州市魏文帝曹丕之孙东海王曹霖之子曹魏第四位皇帝254年11月1日260年6月2日。正始二年241年生于东海王宫自幼聪明好学才慧早成正始五年244年封为高贵乡公嘉平六年254年大将军司马师废除齐王曹芳后拥立为帝年号正元曹髦文才武略崇拜少康不满司马氏专权秉政甘露五年260年亲自讨伐司马昭为太子舍人成济所弑年仅十九岁以王礼葬于洛阳西北。曹髦擅长诗文创制了九言诗传世文章有《伤魂赋并序》《颜子论》等。爱好儒学亲赴太学论道著有《春秋左氏传音》失传。精通绘画一说为中国第一位成为画家的皇帝唐张彦远《历代名画记》目曹髦为中品。',
laiyinger:'来莺儿,是个传说中的人物,正史及古代典籍并无记载。相传来莺儿是东汉歌妓,建安年间洛阳名妓,后爱上曹操的侍卫王图,王图因延误军机而押赴刑场,当时来莺儿奋不顾身以己命换王图一死。新编古装潮剧《曹营恋歌》,秦腔《雀台歌女》讲述了歌女来莺儿与情人王图及曹操三人之间催人泪下的故事。',
caohua:'曹华东汉末年人物曹操之女为汉献帝妃嫔。建安十八年213年曹操进为魏公把曹宪、曹节、曹华三个女儿一齐都送给汉献帝刘协做了妃子皆封为夫人聘以束帛五万匹年龄尚小者在魏公国待年长而聘。',
zhaoang:'赵昂,字伟章(一作伟璋),天水冀人。汉末时曹操部下。初为羌道令,建安中转参军事徒居州治冀城。建安十八年,马超围冀城多天,城中饥困,凉州刺史韦康不愿百姓再受苦而打算投降,赵昂进劝但不为所纳。后马超背信弃义杀韦康并劫其子赵月为人质,把他送至南郑。欲以此要迫使赵昂为己所用。后与梁宽、赵衢、庞恭、杨阜等结谋为康报仇,并举兵讨伐马超。马超兵败遂弃城,投奔张鲁。得张鲁之援后马超于建安十九年复寇,赵昂与妻子王异坚守祁山三十天至夏侯渊的救兵解围,其子赵月终为马超斩杀。自冀城之难,至于祁山,赵昂出九奇策。',

View File

@ -1358,15 +1358,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:'zhaofu',
enable:'phaseUse',
usable:1,
filter:function(event,player){
return player.hasZhuSkill('xinzhaofu');
},
mark:true,
limited:true,
skillAnimation:true,
animationColor:'wood',
selectTarget:[1,2],
filterTarget:lib.filter.notMe,
zhuSkill:true,
contentBefore:function(){
player.awakenSkill('xinzhaofu');
},

View File

@ -241,5 +241,6 @@ window.config={
['akane_quanqing','lianying'],
['akane_quanqing','relianying'],
['akane_quanqing','shangshi'],
['dcruyi','cxliushi'],
]
};

View File

@ -255,13 +255,22 @@
lib.groupnature[id]=id;
}
}
if(typeof config.image=='string') Object.defineProperty(lib.card,`group_${id}`,{
configurable:true,
enumerable:false,
writable:true,
value:{
fullskin:true,
image:config.image
}
});
}],
},
hookmap:{},
imported:{},
layoutfixed:['chess','tafang','stone'],
pinyins:{
metadata:{
_metadata:{
shengmu:['zh','ch','sh','b','p','m','f','d','t','l','n','g','k','h','j','q','x','r','z','c','s','y','w'],
special_shengmu:['j','q','x','y'],
feijiemu:{
@ -1332,6 +1341,26 @@
}
}
},
splash_style:{
name:'启动页',
item:{
style1:'样式一',
style2:'样式二',
},
visualMenu:function(node,link){
node.className='button character';
node.style.width='200px';
node.style.height=node.offsetWidth*1080/2400+'px';
node.style.display='flex';
node.style['flex-direction']='column';
node.style['align-items']='center';
node.style.backgroundSize='100% 100%';
node.setBackgroundImage('image/splash/'+link+'.jpg');
},
onclick:function(item){
game.saveConfig('splash_style',item);
}
},
// fewplayer:{
// name:'启用人数',
// intro:'设置启用新版布局的最小人数(不足时切换至默认布局)',
@ -9854,7 +9883,23 @@
node.link=lib.config.all.mode[i];
ui.create.div(node,'.splashtext',get.verticalStr(get.translation(lib.config.all.mode[i])));
if(lib.config.all.stockmode.indexOf(lib.config.all.mode[i])!=-1){
ui.create.div(node,'.avatar').setBackgroundImage('image/splash/'+lib.config.all.mode[i]+'.jpg');
// 初始启动页设置
if(lib.config.splash_style==undefined){
if(lib.device){
var item='style2';
}else{
var item='style1';
}
lib.configMenu.appearence.config.splash_style.onclick(item);
}
splash.dataset.splash_style=lib.config.splash_style;
// 扩展可通过window.splashurl设置素材读取路径
if(window.splashurl==undefined)window.splashurl='image/splash/';
if(lib.config.splash_style=='style1'||lib.config.splash_style=='style2'){
ui.create.div(node,'.avatar').setBackgroundImage('image/splash/'+lib.config.splash_style+'/'+lib.config.all.mode[i]+'.jpg');
}else{
ui.create.div(node,'.avatar').setBackgroundImage(splashurl+lib.config.splash_style+'/'+lib.config.all.mode[i]+'.jpg');
}
}
else{
var avatarnode=ui.create.div(node,'.avatar');
@ -10302,8 +10347,14 @@
}
}
else{
// TODO: Parse Common Object
throw new Error("NYI: Parse Common Object");
if(Symbol.iterator in item) return lib.init.parsex(Array.from(item));
if("toString" in item) return lib.init.parsex(item.toString());
if("render" in item) {
// TODO: Object Render Parse
throw new Error("NYI: Object Render Parse");
}
// TODO: Object Other Parse
throw new Error("NYI: Object Other Parse");
}
case "function":
if (gnc.is.generatorFunc(item)) {
@ -10329,7 +10380,8 @@
else lastEvent=res.value;
}
}
else return Legacy(item);
default:
return Legacy(item);
}
},
eval:function(func){
@ -20113,6 +20165,11 @@
player.update();
}
},this,this.name,this.sex,num,this.group);
skills=skills.filter(skill=>{
var info=get.info(skill);
if(info&&info.zhuSkill&&!this.isZhu2()) return false;
return true;
});
for(var i=0;i<skills.length;i++){
if(this.hiddenSkills.contains(skills[i])){
this.hiddenSkills.remove(skills[i]);
@ -23771,10 +23828,10 @@
}
if(next.card==undefined&&!nocard) next.card=event.card;
if(next.cards==undefined&&!nocard) next.cards=event.cards;
if(next.source==undefined&&!nosource) next.source=event.player;
if(next.source==undefined&&!nosource) next.source=event.customSource||event.player;
if(next.source&&next.source.isDead()) delete next.source;
if(next.unreal==undefined) next.unreal=false;
if(next.num==undefined) next.num=1;
if(next.num==undefined) next.num=(event.baseDamage||1)+(event.extraDamage||0);
next.original_num=next.num;
next.change_history=[];
if(next.nature=='poison') delete next._triggered;
@ -23824,8 +23881,8 @@
}
if(next.card==undefined&&!nocard) next.card=event.card;
if(next.cards==undefined&&!nocard) next.cards=event.cards;
if(next.source==undefined&&!nosource) next.source=event.player;
if(next.num==undefined) next.num=1;
if(next.source==undefined&&!nosource) next.source=event.customSource||event.player;
if(next.num==undefined) next.num=(event.baseDamage||1)+(event.extraDamage||0);
if(next.num<=0) _status.event.next.remove(next);
next.setContent('recover');
return next;
@ -24758,8 +24815,26 @@
getStorage:function(name){
return this.storage[name]||[];
},
hasStorage:function(name){
return name in this.storage;
hasStorage:function(name,value){
if(!(name in this.storage)) return false;
if(typeof value=="undefined") return true;
const storage=this.storage[name];
if(storage===value) return true;
return !Array.isArray(storage) || storage.contains(value);
},
hasStorageAny:function(name,values){
const storage=this.storage[name];
if(!Array.isArray(values)) values=Array.from(arguments).slice(1);
if(!storage) return false;
if (!Array.isArray(storage)) return values.contains(storage);
return values.some(item => storage.contains(item));
},
hasStorageAll:function(name,values){
const storage=this.storage[name];
if(!Array.isArray(values)) values=Array.from(arguments).slice(1);
if(!storage) return false;
if (!Array.isArray(storage)) return false;
return values.every(item => storage.contains(item));
},
initStorage:function(name,value){
return this.hasStorage(name)?this.getStorage(name):this.setStorage(name,value);
@ -24772,6 +24847,9 @@
.then(value=>operation(value))
.then(value=>this.setStorage(name,value))
},
removeStorage:function(name){
return player.hasStorage(name)&&delete player.storage[name];
},
markSkill:function(name,info,card){
if(info===true){
this.syncStorage(name);
@ -28739,9 +28817,14 @@
this.content=lib.init.parsex(item);
break;
default:
if(!lib.element.content[item]._parsed){
lib.element.content[item]=lib.init.parsex(lib.element.content[item]);
lib.element.content[item]._parsed=true;
try{
if(!lib.element.content[item]._parsed){
lib.element.content[item]=lib.init.parsex(lib.element.content[item]);
lib.element.content[item]._parsed=true;
}
}
catch{
throw new Error(`Content ${item} may not exist.\nlib.element.content[${item}] = ${lib.element.content[item]}`);
}
this.content=lib.element.content[item];
break;
@ -39638,28 +39721,30 @@
}
return node;
},
putDB:function(type,id,item,callback){
putDB:function(type,id,item,onsuccess,onerror){
if(!lib.db) return item;
if(lib.status.reload){
lib[_status.dburgent?'ondb2':'ondb'].push(['putDB',Array.from(arguments)]);
return;
}
lib.status.reload++;
lib.db.transaction([type],'readwrite').objectStore(type).put(item,id).onsuccess=function(){
if(callback){
const record=lib.db.transaction([type],'readwrite').objectStore(type).put(item,id);
record.onsuccess=function(){
if(onsuccess){
_status.dburgent=true;
callback.apply(this,arguments);
onsuccess.apply(this,arguments);
delete _status.dburgent;
}
game.reload2();
};
if(typeof onerror=='function') record.onerror=onerror;
},
getDB:function(type,id,callback){
getDB:function(type,id,onsuccess,onerror){
if(!lib.db){
if(callback) callback(null);
if(onsuccess) onsuccess(null);
return;
}
if(!callback) return;
if(!onsuccess) return;
if(lib.status.reload){
lib[_status.dburgent?'ondb2':'ondb'].push(['getDB',Array.from(arguments)]);
return;
@ -39667,31 +39752,34 @@
lib.status.reload++;
const store=lib.db.transaction([type],'readwrite').objectStore(type);
if(id){
store.get(id).onsuccess=e=>{
const record=store.get(id);
record.onsuccess=e=>{
_status.dburgent=true;
callback(e.target.result);
onsuccess(e.target.result);
delete _status.dburgent;
game.reload2();
};
if(typeof onerror=='function') record.onerror=onerror;
return;
}
const obj={};
store.openCursor().onsuccess=e=>{
const cursor=e.target.result;
if(cursor){
obj[cursor.key]=cursor.value;
cursor.continue();
const cursor=store.openCursor(),obj={};
cursor.onsuccess=e=>{
const result=e.target.result;
if(result){
obj[result.key]=result.value;
result.continue();
return;
}
_status.dburgent=true;
callback(obj);
onsuccess(obj);
delete _status.dburgent;
game.reload2();
}
};
if(typeof onerror=='function') cursor.onerror=onerror;
},
deleteDB:function(type,id,callback){
deleteDB:function(type,id,onsuccess,onerror){
if(!lib.db){
if(callback) callback(false);
if(onsuccess) onsuccess(false);
return;
}
if(lib.status.reload){
@ -39700,10 +39788,12 @@
}
if(arguments.length>1){
lib.status.reload++;
lib.db.transaction([type],'readwrite').objectStore(type).delete(id).onsuccess=function(){
if(callback) callback.apply(this,arguments);
const record=lib.db.transaction([type],'readwrite').objectStore(type).delete(id);
record.onsuccess=function(){
if(onsuccess) onsuccess.apply(this,arguments);
game.reload2();
};
if(typeof onerror=='function') record.onerror=onerror;
return;
}
game.getDB(type,null,obj=>{
@ -41466,7 +41556,7 @@
var page=ui.create.div('');
var node=ui.create.div('.menubutton.large',info.name,position,clickMode);
node.mode=mode;
node._initLink=function(){
// node._initLink=function(){
node.link=page;
var map={};
if(info.config){
@ -41853,8 +41943,8 @@
info.config.update(config,map);
}
}
};
if(!get.config('menu_loadondemand')) node._initLink();
// };
// if(!get.config('menu_loadondemand')) node._initLink();
return node;
};
@ -53214,21 +53304,86 @@
else if(lib.config.favouriteCharacter.contains(name)){
fav.classList.add('active');
}
var intro=ui.create.div('.characterintro',get.characterIntro(name),uiintro);
const intro=ui.create.div('.characterintro',uiintro);
if(lib.config.show_characternamepinyin){
var charactername=get.rawName(name);
var characterpinyin=get.pinyin(charactername);
var nameinfo=get.character(name);
var charactersex=get.translation(nameinfo[0]);
const charactergroups=get.is.double(name,true);
let charactergroup;
if(charactergroups) charactergroup=charactergroups.map(i=>get.translation(i)).join('/')
else charactergroup=get.translation(nameinfo[1]);
var characterhp=nameinfo[2];
var characterintroinfo=get.characterIntro(name);
intro.innerHTML='<span style="font-weight:bold;margin-right:5px;line-height:2">'+charactername+'</span>'+'<span style="font-size:14px;font-family:SimHei,STHeiti,sans-serif">'+'['+characterpinyin+']'+'</span>'+' | '+charactersex+' | '+charactergroup+' | '+characterhp+'<br>'+characterintroinfo;
const span=document.createElement('span');
span.style.fontWeight='bold';
const nameInfo=get.character(name),characterName=nameInfo[4].includes('ruby')?lib.translate[name]:get.rawName(name);
span.textContent=characterName;
const ruby=document.createElement('ruby');
ruby.appendChild(span);
const leftParenthesisRP=document.createElement('rp');
leftParenthesisRP.textContent='';
ruby.appendChild(leftParenthesisRP);
const rt=document.createElement('rt');
rt.textContent=lib.translate[`${name}_rt`]||get.pinyin(characterName).join(' ');
ruby.appendChild(rt);
const rightParenthesisRP=document.createElement('rp');
rightParenthesisRP.textContent='';
ruby.appendChild(rightParenthesisRP);
const tr=document.createElement('tr'),characterNameTD=document.createElement('td');
characterNameTD.appendChild(ruby);
tr.appendChild(characterNameTD);
const characterSexTD=document.createElement('td');
characterSexTD.textContent=get.translation(nameInfo[0]);
tr.appendChild(characterSexTD);
const characterGroupTD=document.createElement('td');
const characterGroups=get.is.double(name,true);
if(characterGroups) Promise.all(characterGroups.map(value=>new Promise((resolve,reject)=>{
const info=lib.card[`group_${value}`];
if(!info) resolve(`image/card/group_${value}.png`);
const image=info.image;
if(!image) resolve(`image/card/group_${value}.png`);
else if(image.indexOf('db:')==0) game.getDB('image',image.slice(3),src=>resolve(src),reject);
else if(image.indexOf('ext:')==0) resolve(image.replace(/ext:/,'extension/'));
else resolve(image);
}).then(element=>new Promise((resolve,reject)=>{
const image=new Image();
image.onload=()=>resolve(image);
image.onerror=reject;
image.src=element;
})))).then(value=>{
const documentFragment=document.createDocumentFragment();
value.forEach(documentFragment.appendChild,documentFragment);
characterGroupTD.appendChild(documentFragment);
}).catch(()=>characterGroupTD.textContent=characterGroups.reduce((previousValue,currentValue)=>previousValue?`${previousValue}/${get.translation(currentValue)}`:get.translation(currentValue),''));
else{
const characterGroup=nameInfo[1];
new Promise((resolve,reject)=>{
const info=lib.card[`group_${characterGroup}`];
if(!info) resolve(`image/card/group_${characterGroup}.png`);
const image=info.image;
if(!image) resolve(`image/card/group_${characterGroup}.png`);
else if(image.indexOf('db:')==0) game.getDB('image',image.slice(3),src=>resolve(src),reject);
else if(image.indexOf('ext:')==0) resolve(image.replace(/ext:/,'extension/'));
else resolve(image);
}).then(value=>new Promise((resolve,reject)=>{
const image=new Image();
image.onload=()=>resolve(image);
image.onerror=reject;
image.src=value;
})).then(value=>characterGroupTD.appendChild(value)).catch(()=>characterGroupTD.textContent=get.translation(characterGroup));
}
tr.appendChild(characterGroupTD);
const characterHPTD=document.createElement('td'),hpDiv=ui.create.div('.hp',characterHPTD),nameInfoHP=nameInfo[2],infoHP=get.infoHp(nameInfoHP);
hpDiv.dataset.condition=infoHP<4?'mid':'high';
ui.create.div(hpDiv);
const hpTextDiv=ui.create.div('.text',hpDiv),infoMaxHP=get.infoMaxHp(nameInfoHP);
hpTextDiv.textContent=infoHP==infoMaxHP?infoHP:`${infoHP}/${infoMaxHP}`;
const infoShield=get.infoHujia(nameInfoHP);
if(infoShield){
ui.create.div('.shield',hpDiv);
const shieldTextDiv=ui.create.div('.text',hpDiv);
shieldTextDiv.textContent=infoShield;
}
tr.appendChild(characterHPTD);
const table=document.createElement('table');
table.appendChild(tr);
intro.appendChild(table);
intro.appendChild(document.createElement('hr'));
}
var intro2=ui.create.div('.characterintro.intro2',uiintro);
intro.appendChild(new Text(get.characterIntro(name)));
const intro2=ui.create.div('.characterintro.intro2',uiintro);
var list=get.character(name,3)||[];
var skills=ui.create.div('.characterskill',uiintro);
if(lib.config.touchscreen){
@ -53241,38 +53396,75 @@
skills.onmousewheel=ui.click.mousewheel;
}
var clickSkill=function(e){
while(intro2.firstChild){
intro2.removeChild(intro2.lastChild);
}
var current=this.parentNode.querySelector('.active');
if(current){
current.classList.remove('active');
}
this.classList.add('active');
var skillname=get.translation(this.link);
var skilltranslationinfo=get.skillInfoTranslation(this.link);
if(lib.config.show_skillnamepinyin&&skillname!='阵亡'){
var skillpinyin=get.pinyin(skillname);
intro2.innerHTML='<span style="font-weight:bold;margin-right:5px">'+skillname+'</span>'+'<span style="font-size:14px;font-family:SimHei,STHeiti,sans-serif">'+'['+skillpinyin+']'+'</span>'+' '+skilltranslationinfo;
}else{
intro2.innerHTML='<span style="font-weight:bold;margin-right:5px">'+skillname+'</span>'+skilltranslationinfo;
const skillNameSpan=document.createElement('span'),skillNameSpanStyle=skillNameSpan.style;
skillNameSpanStyle.fontWeight='bold';
const link=this.link,skillName=get.translation(link);
skillNameSpan.textContent=skillName;
if(lib.config.show_skillnamepinyin&&skillName!='阵亡'){
const ruby=document.createElement('ruby');
ruby.appendChild(skillNameSpan);
const leftParenthesisRP=document.createElement('rp');
leftParenthesisRP.textContent='';
ruby.appendChild(leftParenthesisRP);
const rt=document.createElement('rt');
rt.textContent=lib.translate[`${link}_rt`]||get.pinyin(skillName).join(' ');
ruby.appendChild(rt);
const rightParenthesisRP=document.createElement('rp');
rightParenthesisRP.textContent='';
ruby.appendChild(rightParenthesisRP);
const div=ui.create.div(intro2);
div.style.marginRight='5px';
div.appendChild(ruby);
}
else{
skillNameSpanStyle.marginRight='5px';
intro2.appendChild(skillNameSpan);
}
intro2.appendChild(new Text(get.skillInfoTranslation(this.link)));
var info=get.info(this.link);
var skill=this.link;
var playername=this.linkname;
var skillnode=this;
if(info.derivation){
var derivation=info.derivation;
if(typeof derivation=='string'){
derivation=[derivation];
}
for(var i=0;i<derivation.length;i++){
var derivationname=get.translation(derivation[i]);
var derivationtranslationinfo=get.skillInfoTranslation(derivation[i]);
if(lib.config.show_skillnamepinyin&&derivationname.length<=5&&derivation[i].indexOf('_faq')==-1){
var derivationpinyin=get.pinyin(derivationname);
intro2.innerHTML+='<br><br><span style="font-weight:bold;margin-right:5px">'+derivationname+'</span>'+'<span style="font-size:14px;font-family:SimHei,STHeiti,sans-serif">'+'['+derivationpinyin+']'+'</span>'+' '+derivationtranslationinfo;
}else{
intro2.innerHTML+='<br><br><span style="font-weight:bold;margin-right:5px">'+derivationname+'</span>'+derivationtranslationinfo;
let derivation=info.derivation;
if(derivation){
if(typeof derivation=='string') derivation=[derivation];
derivation.forEach(value=>{
intro2.appendChild(document.createElement('br'));
intro2.appendChild(document.createElement('br'));
const derivationNameSpan=document.createElement('span'),derivationNameSpanStyle=derivationNameSpan.style;
derivationNameSpanStyle.fontWeight='bold';
const derivationName=get.translation(value);
derivationNameSpan.textContent=derivationName;
if(lib.config.show_skillnamepinyin&&derivationName.length<=5&&value.indexOf('_faq')==-1){
const ruby=document.createElement('ruby');
ruby.appendChild(derivationNameSpan);
const leftParenthesisRP=document.createElement('rp');
leftParenthesisRP.textContent='';
ruby.appendChild(leftParenthesisRP);
const rt=document.createElement('rt');
rt.textContent=lib.translate[`${value}_rt`]||get.pinyin(derivationName).join(' ');
ruby.appendChild(rt);
const rightParenthesisRP=document.createElement('rp');
rightParenthesisRP.textContent='';
ruby.appendChild(rightParenthesisRP);
const div=ui.create.div(intro2);
div.style.marginRight='5px';
div.appendChild(ruby);
}
}
else{
derivationNameSpanStyle.marginRight='5px';
intro2.appendChild(derivationNameSpan);
}
intro2.appendChild(new Text(get.skillInfoTranslation(value)));
});
}
if(info.alter){
intro2.innerHTML+='<br><br><div class="hrefnode skillversion"></div>';
@ -54394,40 +54586,36 @@
return [];
},
//装备栏 END
pinyin:function(chinese,withtone){
const util=window.pinyinUtilx;
if(!window.pinyinUtilx) return [];
if(lib.pinyins&&lib.pinyins[chinese]){
const str=lib.pinyins[chinese];
if(withtone===false){
for(let i=0;i<str.length;i++){
str[i]=util.removeTone(str[i]);
}
}
return str;
pinyin:(chinese,withTone)=>{
const pinyinUtilx=window.pinyinUtilx;
if(!pinyinUtilx) return [];
const pinyins=lib.pinyins;
if(pinyins){
const pinyin=pinyins[chinese];
if(Array.isArray(pinyin)) return withTone===false?pinyin.map(pinyinUtilx.removeTone):pinyin.slice();
}
return util.getPinyin(chinese,null,withtone,true);
return pinyinUtilx.getPinyin(chinese,null,withTone,true);
},
yunmu:function(str){
//部分整体认读音节特化处理
const util=window.pinyinUtilx;
if(util&&lib.pinyins.metadata.zhengtirendu.contains(util.removeTone(str))){
if(util&&lib.pinyins._metadata.zhengtirendu.contains(util.removeTone(str))){
return '-'+str[str.length-1];
}
//排除声母
for(let i of lib.pinyins.metadata.shengmu){
for(let i of lib.pinyins._metadata.shengmu){
if(str.indexOf(i)==0){
str=str.slice(i.length);
if(str[0]=='u'&&lib.pinyins.metadata.special_shengmu.contains(i)) str='ü'+str.slice(1);
if(str[0]=='u'&&lib.pinyins._metadata.special_shengmu.contains(i)) str='ü'+str.slice(1);
break;
}
}
//排除介母
if(str.length>0){
for(let i in lib.pinyins.metadata.feijiemu){
for(let i in lib.pinyins._metadata.feijiemu){
if(str[0]==i){
let goon=false;
for(let j of lib.pinyins.metadata.feijiemu[i]){
for(let j of lib.pinyins._metadata.feijiemu[i]){
if(str.indexOf(j)==0) goon=true;
}
if(!goon) str=str.slice(1);
@ -54440,20 +54628,20 @@
yunjiao:function(str){
const util=window.pinyinUtilx;
if(util) str=util.removeTone(str)
if(lib.pinyins.metadata.zhengtirendu.contains(str)){
if(lib.pinyins._metadata.zhengtirendu.contains(str)){
str=('-'+str[str.length-1]);
}
else{
for(let i of lib.pinyins.metadata.shengmu){
for(let i of lib.pinyins._metadata.shengmu){
if(str.indexOf(i)==0){
str=str.slice(i.length);
if(str[0]=='u'&&lib.pinyins.metadata.special_shengmu.contains(i)) str='ü'+str.slice(1);
if(str[0]=='u'&&lib.pinyins._metadata.special_shengmu.contains(i)) str='ü'+str.slice(1);
break;
}
}
}
for(let i in lib.pinyins.metadata.yunjiao){
if(lib.pinyins.metadata.yunjiao[i].contains(str)) return i;
for(let i in lib.pinyins._metadata.yunjiao){
if(lib.pinyins._metadata.yunjiao[i].contains(str)) return i;
}
return null;
},
@ -55037,11 +55225,7 @@
}
}
}
if(name.indexOf('gz_')==0){
name=name.slice(3);
if(lib.characterIntro[name]) return lib.characterIntro[name];
}
if(name.indexOf('_')!=-1){
while(name.indexOf('_')!=-1&&!lib.characterIntro[name]){
name=name.slice(name.indexOf('_')+1);
}
if(lib.characterIntro[name]) return lib.characterIntro[name];

View File

@ -42,12 +42,23 @@ var pinyin_dict_polyphone = {
"乐无异": "yuè ",
"端蒙": " méng",
"妹喜": "mò ",
"露娜": "lù ",
"洛欧塞布": " sài ",
"塞纳留斯": "sài ",
"半藏": " zàng",
"查莉娅": "zhā ",
"单小小": "shàn ",
"少微": "shào ",
"欧阳少恭": " shào ",
"卡尔维特": "kǎ ",
"卡西尔": "kǎ ",
"卡扎库斯": "kǎ ",
"卡德加": "kǎ ",
"法兰茜斯卡": " kǎ",
"卡利莫斯": "kǎ ",
"安卡": " kǎ",
"卡玛": "kǎ ",
"库特莉亚芙卡": " kǎ",
"露娜": "lù ",
// 技能名
"聆乐": " yuè",
"没矢": "mò ",
@ -125,6 +136,7 @@ var pinyin_dict_polyphone = {
"冠绝": "guàn ",
"先著": " zhuó",
"量反": "liàng ",
"复难": " nàn",
"乐动": "yuè ",
"血凰": "xuè ",

BIN
image/card/group_jin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
image/card/group_shen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

BIN
image/splash/style1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
image/splash/style2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

View File

@ -423,6 +423,29 @@ table {
border-radius: 12px;
}
/* 启动页style2 */
#splash[data-splash_style='style2']>div {
width: 250px;
height: 350px;
top: calc(50% - 175px);
}
#splash[data-splash_style='style2']>div:first-child {
margin-left: 15px;
}
#splash[data-splash_style='style2']>div:last-child {
margin-right: 15px;
}
#splash[data-splash_style='style2']>div>.splashtext {
font-family: 'shousha';
font-size: 65px;
}
#splash[data-splash_style='style2'].slim>div>.splashtext {
right: 10px;
bottom: 5px;
}
#splash[data-splash_style='style2'].slim>div>.avatar {
width: 240px;
}
#arena.playerhidden>.player,
#arena.playerhidden>#mebg,

File diff suppressed because it is too large Load Diff