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

This commit is contained in:
157 2023-11-07 21:51:07 +08:00 committed by GitHub
commit 6daa448d0c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
67 changed files with 3306 additions and 2046 deletions

View File

@ -1,5 +1,5 @@
{
"extends": "chrome 46",
"extends": "eslint:recommended",
"env": {
"browser": true,
"node": true,
@ -10,6 +10,12 @@
"no-console": 0,
"no-unused-vars": 0,
"no-undef": 0,
"no-redeclare": 0
"no-redeclare": 0,
"no-prototype-builtins": 0,
"require-yield": 0,
"no-irregular-whitespace": ["error", { "skipStrings": true, "skipTemplates": true }],
"no-constant-condition": ["error", { "checkLoops": false }]/* ,
"comma-dangle": ["error", "only-multiline"],
"complexity": ["error",100] */
}
}

Binary file not shown.

Binary file not shown.

BIN
audio/die/star_caoren.mp3 Normal file

Binary file not shown.

BIN
audio/die/star_yuanshu.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/skill/olchuming1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/olchuming2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/oltousui1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/oltousui2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/starcanxi1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/starcanxi2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/starlifeng1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/starlifeng2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/starpizhi1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/starpizhi2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/starsujun1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/starsujun2.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

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

View File

@ -238,7 +238,6 @@ game.import('card',function(lib,game,ui,get,ai,_status){
fullskin:true,
type:'equip',
subtype:'equip5',
loseDelay:false,
skills:['tianjitu_skill'],
onLose:function(){
player.addTempSkill('tianjitu_skill_lose')

View File

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

View File

@ -48,7 +48,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
return get.type(card)=='equip'&&!cards.contains(card);
});
if(cardx) cards.push(cardx);
};
}
if(!cards.length){
event.finish();
event.getParent().excluded.addArray(game.players);
@ -115,11 +115,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){
if(dialog.buttons[i].link==card){
button=dialog.buttons[i];
button.querySelector('.info').innerHTML=function(target){
if(target._tempTranslate) return target._tempTranslate;
var name=target.name;
if(lib.translate[name+'_ab']) return lib.translate[name+'_ab'];
return get.translation(name);
}(target);
if(target._tempTranslate) return target._tempTranslate;
var name=target.name;
if(lib.translate[name+'_ab']) return lib.translate[name+'_ab'];
return get.translation(name);
}(target);
dialog.buttons.remove(button);
break;
}
@ -701,7 +701,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){
player.$throw(card);
game.log(card,'进入了弃牌堆');
delete _status.jinhe[es[i].cardid];
};
}
}
game.broadcastAll(function(jinhe){
_status.jinhe=jinhe;

View File

@ -210,7 +210,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
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;
if(!player.canUse(get.autoViewAs({name:name,nature:nature},[]),target)) continue;
list.push([get.translation(get.type(name)),'',name,nature]);
}
}

View File

@ -359,8 +359,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return card!=card2&&get.number(card2,player)<num;
})
}).set('ai',function(card){
var player=_status.event.player;
return 1+Math.max(0,player.getUseValue(card,null,true))
var player=_status.event.player;
return 1+Math.max(0,player.getUseValue(card,null,true))
})
'step 1'
if(result.bool){
@ -819,11 +819,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(target.isIn()){
var num=target.countCards('e');
if(num>0){
player.discardPlayerCard(target,true,'e',num)
player.discardPlayerCard(target,true,'e',num)
}
else{
target.loseHp();
game.delayex();
target.loseHp();
game.delayex();
}
}
if(targets.length>0) event.redo();
@ -860,11 +860,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.line(target,'green');
var num=target.countCards('h');
if(num>0){
player.discardPlayerCard(target,true,'h',num)
player.discardPlayerCard(target,true,'h',num)
}
else{
target.loseHp();
game.delayex();
target.loseHp();
game.delayex();
}
}
},
@ -1479,6 +1479,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(stat==0) return Math.random()<0.7;
return false;
}
return false;
},
prompt:function(event,player){
return '焚心:是否与'+get.translation(event.player)+'交换身份?';

View File

@ -526,7 +526,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var skill={
viewAs:{
name:links[0][2],
isCard:true,
suit:'none',
number:null,
isCard:true,
@ -1697,7 +1696,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
dddxunxun:{
inherit:"xunxun",
audio:"ext:3D8测试包:2",
audio:2,
},
dddfusi:{
mod:{
@ -3381,7 +3380,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
//轲比能
dddxiaoxing:{
audio:2,
forced:true,
trigger:{global:'gameDrawBegin'},
forced:true,
group:'dddxiaoxing_remove',

View File

@ -294,7 +294,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
key_inari:'#bSummer Pockets',
key_saya:'#bLittle Busters!',
key_harukakanata:'#bLittle Busters!',
key_tsumugi:'#bSummer Pockets',
key_yui:'#rAngel Beats!',
key_yoshino:'#bRewrite',
key_kengo:'#bLittle Busters!',
@ -753,8 +752,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(map[1]){
if(map[1].length==len&&len>4){
for(var i=0;i<map[1].length-1;i++){
if(map[1][i+1]-map[1][i]!=1) return null;
if(map[1][i+1]==15) return null;
if(map[1][i+1]-map[1][i]!=1) return null;
if(map[1][i+1]==15) return null;
}
return ['单顺',nums[0],len];
}
@ -764,7 +763,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
else if(map[3]&&map[1].length==map[3].length&&len==map[1].length*4){
if(map[3].length==1) return ['三带一',map[3][0],1];
for(var i=0;i<map[3].length-1;i++){
if(map[3][i+1]-map[3][i]!=1) return null;
if(map[3][i+1]-map[3][i]!=1) return null;
}
return ['单带飞机',map[3][0],map[3].length];
}
@ -773,8 +772,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(map[2]){
if(map[2].length*2==len&&len>5){
for(var i=0;i<map[2].length-1;i++){
if(map[2][i+1]-map[2][i]!=1) return null;
if(map[2][i+1]==15) return null;
if(map[2][i+1]-map[2][i]!=1) return null;
if(map[2][i+1]==15) return null;
}
return ['双顺',nums[0],len];
}
@ -784,8 +783,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
else if(map[3]&&map[2].length==map[3].length&&len==map[2].length*5){
if(map[3].length==1) return ['三带二',map[3][0],1];
for(var i=0;i<map[3].length-1;i++){
if(map[3][i+1]-map[3][i]!=1) return null;
if(map[3][i+1]==15) return null;
if(map[3][i+1]-map[3][i]!=1) return null;
if(map[3][i+1]==15) return null;
}
return ['双带飞机',map[3][0],map[3].length];
}
@ -794,8 +793,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(map[3]){
if(map[3].length*3==len&&len>5){
for(var i=0;i<map[3].length-1;i++){
if(map[3][i+1]-map[3][i]!=1) return null;
if(map[3][i+1]==15) return null;
if(map[3][i+1]-map[3][i]!=1) return null;
if(map[3][i+1]==15) return null;
}
return ['三顺',nums[0],len];
}
@ -2934,9 +2933,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(target.hasCard(function(card){
return get.name(card,target)=='shan';
},'h')){
player.discardPlayerCard(target,true,'h','visible').set('filterButton',function(button){
return get.name(button.link)=='shan';
});
player.discardPlayerCard(target,true,'h','visible').set('filterButton',function(button){
return get.name(button.link)=='shan';
});
}
else if(player.countCards('he')>0) player.chooseToDiscard('he',true);
},
@ -3008,7 +3007,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return false;
},
content:function(){
player.draw();
player.draw();
},
mod:{
maxHandcard:function(player,num){
@ -3793,7 +3792,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.chooseButton(['选择获得一张“兴”',player.getExpansions('tenzen_yixing')],true);
'step 1'
if(result.bool){
player.gain(result.links,'gain2');;
player.gain(result.links,'gain2');
}
var next=game.createEvent('tenzen_yixing_insert');
event.next.remove(next);
@ -3968,9 +3967,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
filterTarget:function(card,kyouko,hina){
if(kyouko==hina||kyouko.getStorage('kyouko_gongmian').contains(hina)) return false;
var hs=hina.countCards('he');
if(hs==0) return kyouko.countCards('h')==0;
return true;
var hs=hina.countCards('he');
if(hs==0) return kyouko.countCards('h')==0;
return true;
},
content:function(){
'step 0'
@ -4958,10 +4957,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
}
switch(button.link){
case 3:return 4.5;break;
case 4:return 4.4;break;
case 5:return 4.3;break;
case 2:return (3-player.hp)*1.5;break;
case 3:return 4.5;
case 4:return 4.4;
case 5:return 4.3;
case 2:return (3-player.hp)*1.5;
case 1:{
if(game.hasPlayer(function(current){
return (get.realAttitude||get.attitude)(player,current)<0&&get.distance(player,current)>1;
@ -6122,7 +6121,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.popup('花绽',get.groupnature(name.slice(12)));
game.log(player,'发动了技能',lib.translate[name].replace(/魔物/g,'【花绽】'));
player.removeMark(name,1,false);
;game.log(player,'移去了一个',lib.translate[name].replace(/魔物/g,'【魔物】'));
game.log(player,'移去了一个',lib.translate[name].replace(/魔物/g,'【魔物】'));
},
}
}
@ -6388,7 +6387,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger:{source:'damageBefore'},
forced:true,
charlotte:true,
audio:'abyusa_jueqing',
filter:function(event,player){
return player.storage.abyusa_jueqing_rewrite==true;
},
@ -9106,7 +9104,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
});
},
filterCard:true,
log:false,
filterTarget:function(card,player,target){
return target!=player&&target.hasZhuSkill('akane_yifu',player)&&!target.hasSkill('akane_yifu3');
},
@ -9349,7 +9346,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
for(var i=0;i<targets.length;i++){
if(targets[i].differentSexFrom(player)){
bool=true;break;
};
}
}
if(bool) player.loseHp();
},
@ -9807,10 +9804,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
backup:function(links,player){
return {
filterCard:true,
audio:'haruka_shuangche',
selectCard:-1,
filterCard:function(){return false},
selectCard:-1,
popname:true,
check:function(card){
return 6-get.value(card);
@ -11986,7 +11982,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
})){
event.finish();
return;
};
}
_status.currentPhase.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+
get.translation(trigger.player.judging[0])+',请打出一张手牌进行改判','h',true,function(card){
var player=_status.event.player;
@ -13140,11 +13136,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(n==1){
player.addTempSkill("releiji",{player:"phaseUseBegin"});
player.markSkill("releiji",{player:"phaseUseBegin"});
};
}
if(n==2){
player.addTempSkill("guidao",{player:"phaseUseBegin"});
player.markSkill("guidao",{player:"phaseUseBegin"});
};
}
},
},
ns_xiandao2:{

View File

@ -114,8 +114,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){
num+=current.countMark('jxlianpo_mark_fan');
return num;
}),
nei:(game.hasPlayer(current=>current.identity=='nei')?0:1)+game.countPlayer(current=>{
return current.countMark('jxlianpo_mark_nei');
nei:game.countPlayer(current=>{
let num=0;
if(current.identity=='nei') num++;
num+=current.countMark('jxlianpo_mark_nei');
return num;
}),
commoner:game.countPlayer(current=>{
let num=0;
if(current.identity=='commoner') num++;
num+=current.countMark('jxlianpo_mark_commoner');
return num;
}),
};
let population=0,identities=[];
@ -126,7 +135,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
identities.add(i);
population=curPopulation;
}
};
}
return identities;
},
group:'jxlianpo_show',
@ -139,9 +148,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
intro:{
content:()=>`场上最大阵营为${lib.skill.jxlianpo.getMax().map(i=>{
if(i=='zhu') return '主忠';
if(i=='fan') return '反贼';
if(i=='nei') return '内奸';
return '';
return get.translation(i+'2');
}).join('、')}`,
},
$createButton:function(item,type,position,noclick,node){
@ -613,7 +620,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
})){
goon=6;
}
}catch(e){}
}catch(e){
console.trace(e);
}
ui.selected.cards.remove(card);
return goon-get.value(card);
},
@ -1715,13 +1724,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
filter:function(event,player){
if(event.responded||event.shouli||event.type=='wuxie') return false;
if(game.hasPlayer(function(current){
return current.getCards('e',card=>get.subtype(card)=='equip4').length>0;
return current.getCards('e',card=>get.is.attackingMount(card)).length>0;
})&&event.filterCard({
name:'sha',
storage:{shouli:true},
},player,event)) return true;
if(game.hasPlayer(function(current){
return current.getCards('e',card=>get.subtype(card)=='equip3').length>0;
return current.getCards('e',card=>get.is.defendingMount(card)).length>0;
})&&event.filterCard({
name:'shan',
storage:{shouli:true},
@ -1733,8 +1742,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
filterTarget:function(card,player,target){
var event=_status.event,evt=event;
if(event._backup) evt=event._backup;
var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3');
var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4');
var equip3=target.getCards('e',card=>get.is.defendingMount(card,false));
var equip4=target.getCards('e',card=>get.is.attackingMount(card,false));
if(equip3.length&&equip3.some(card=>evt.filterCard(get.autoViewAs({
name:'shan',
storage:{shouli:true},
@ -1749,7 +1758,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return game.hasPlayer(function(current){
return evt.filterTarget(sha,player,current);
})
};
}
})
},
prompt:'将场上的一张坐骑牌当做【杀】或【闪】使用或打出',
@ -1758,8 +1767,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var evt=event.getParent(2);
evt.set('shouli',true);
var list=[];
var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3');
var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4');
var equip3=target.getCards('e',card=>get.is.defendingMount(card,false));
var equip4=target.getCards('e',card=>get.is.attackingMount(card,false));
var backupx=_status.event;
_status.event=evt;
try{
@ -1784,8 +1793,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return false;
})){
list.push('sha');
};
}catch(e){game.print(e)};
}
}catch(e){game.print(e)}
_status.event=backupx;
if(list.length==1){
event.cardName=list[0];
@ -1799,13 +1808,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}).set('cards',cards)
}
else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){
var type=get.subtype(button.link);
return type=='equip3'||type=='equip4';
var card=button.link;
return get.is.attackingMount(card)||get.is.defendingMount(card);
});
'step 1'
var evt=event.getParent(2);
if(result.bool&&result.links&&result.links.length){
var name=(event.cardName||(get.subtype(result.links[0])=='equip4'?'sha':'shan'));
var name=(event.cardName||(get.is.attackingMount(result.links[0])?'sha':'shan'));
if(evt.name=='chooseToUse'){
game.broadcastAll(function(result,name){
lib.skill.shouli_backup.viewAs={
@ -1847,9 +1856,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
respondSha:true,
respondShan:true,
skillTagFilter:function(player,tag){
var subtype=(tag=='respondSha'?'equip4':'equip3');
var func=get.is[tag=='respondSha'?'attackingMount':'defendingMount'];
return game.hasPlayer(function(current){
return current.hasCard(card=>get.subtype(card,false)==subtype,'e');
return current.hasCard(card=>func(card,false),'e');
});
},
order:2,
@ -4393,14 +4402,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var list=[];
for(var i in player.disabledSkills){
if(player.disabledSkills[i].contains(skill)) list.push(i);
};
}
if(list.length){
var str='失效技能:';
for(var i=0;i<list.length;i++){
if(lib.translate[list[i]+'_info']) str+=get.translation(list[i])+'、';
};
}
return str.slice(0,str.length-1);
};
}
},
},
},
@ -4670,7 +4679,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
enable:'phaseUse',
derivation:'wushuang',
filter:function(event,player){
return player.countMark('baonu')>=2;
return player.countMark('baonu')>=2&&game.hasPlayer(target=>lib.skill.ol_wuqian.filterTarget(null,player,target));
},
filterTarget:function(card,player,target){
return target!=player&&!target.hasSkill('ol_wuqian_targeted');
@ -4678,29 +4687,42 @@ game.import('character',function(lib,game,ui,get,ai,_status){
content:function(){
player.removeMark('baonu',2);
player.addTempSkill('wushuang');
player.storage.ol_wuqian_target=target;
player.addTempSkill('ol_wuqian_target');
player.popup('无双');
game.log(player,'获得了技能','#g【无双】');
target.addTempSkill('ol_wuqian_targeted');
},
subSkill:{
equip:{
ai:{
unequip:true,
skillTagFilter:function(player,tag,arg){
if(arg&&arg.target&&arg.target.hasSkill('ol_wuqian_targeted')) return true;
return false;
}
}
},
targeted:{ai:{unequip2:true}},
target:{
mark:'character',
onremove:true,
intro:{
content:'获得无双且$防具失效直到回合结束'
ai:{
order:9,
result:{
target:function(player,target){
if(player.countCards('hs',card=>{
if(!player.getCardUsable({name:card.name})) return false;
if(!player.canUse(card,target)) return false;
var eff1=get.effect(target,card,player,player);
_status.baonuCheck=true;
var eff2=get.effect(target,card,player,player);
delete _status.baonuCheck;
return eff2>Math.max(0,eff1);
})) return -1;
return 0;
},
}
}
},
},
global:'ol_wuqian_ai',
subSkill:{
targeted:{
charlotte:true,
ai:{unequip2:true},
},
ai:{
ai:{
unequip2:true,
skillTagFilter:function(player){
if(!_status.baonuCheck) return false;
},
},
},
},
},
wumou:{
audio:2,
@ -5360,7 +5382,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
wuhun2:{
trigger:{
player:'dieBegin',
player:'dieBegin',
},
forced:true,
popup:false,
@ -5385,8 +5407,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return -ai.get.attitude(_status.event.player,target);
});
"step 1"
player.line(result.targets[0],'fire');
result.targets[0].addSkill('wuhun3')
player.line(result.targets[0],'fire');
result.targets[0].addSkill('wuhun3')
},
ai:{
threaten:0.5,
@ -5945,7 +5967,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(player.countCards('he',{suit:'heart'})<Math.max(1,player.hp)) return false;
break;
}
default:return true;break;
default:return true;
}
},
maixie:true,
@ -6481,7 +6503,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
else{
player.addTempSkill('nzry_longnu_1','phaseUseAfter');
};
}
},
subSkill:{
'1':{
@ -6587,7 +6609,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
result.targets[0].link(true);
}else{
event.finish();
};
}
},
},
},
@ -6642,8 +6664,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
else{
result.targets[0].link(true);
player.discardPlayerCard(result.targets[0],1,'hej',true);
};
};
}
}
'step 2'
if(player.countMark('nzry_junlve')>7){
player.chooseBool().set('ai',function(){
@ -6651,7 +6673,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}).set('prompt','是否弃置所有“军略”标记并对所有其他角色造成1点伤害');
}else{
event.finish();
};
}
'step 3'
if(result.bool){
var players=game.players.slice(0).sortBySeat();
@ -6659,8 +6681,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.removeMark('nzry_junlve',player.countMark('nzry_junlve'));
for(var i=0;i<players.length;i++){
if(players[i]!=player) players[i].damage();
};
};
}
}
},
},
"nzry_dinghuo":{
@ -6813,14 +6835,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var list=[];
for(var i in player.disabledSkills){
if(player.disabledSkills[i].contains(skill)) list.push(i);
};
}
if(list.length){
var str='失效技能:';
for(var i=0;i<list.length;i++){
if(lib.translate[list[i]+'_info']) str+=get.translation(list[i])+'、';
};
}
return str.slice(0,str.length-1);
};
}
},
},
},
@ -6949,7 +6971,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
chooseButton.set('filterButton',function(button){
for(var i=0;i<ui.selected.buttons.length;i++){
if(get.suit(button.link)==get.suit(ui.selected.buttons[i].link)) return false;
};
}
return true;
});
'step 1'
@ -6960,8 +6982,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
event.list1.push(list[i]);
}else{
event.list2.push(list[i]);
};
};
}
}
if(event.list1.length&&event.list2.length){
game.loseAsync({
lose_list:[
@ -6975,7 +6997,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
target.discard(event.list2);
}
else player.discard(event.list1);
};
}
'step 2'
if(event.list1.length+event.list2.length==4){
if(event.list1.length==0) player.loseMaxHp();
@ -6986,13 +7008,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(evt.name=='phaseUse'){
evt.skipped=true;
break;
};
};
}
}
player.addTempSkill('drlt_poxi1',{player:'phaseAfter'});
};
}
if(event.list1.length==3) player.recover();
if(event.list1.length==4) player.draw(4);
};
}
},
ai:{
order:13,
@ -7103,7 +7125,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var mark=player.countMark('drlt_jieying_mark');
player.removeMark('drlt_jieying_mark',mark);
target.addMark('drlt_jieying_mark',mark);
};
}
},
},
'3':{

View File

@ -1959,7 +1959,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
case 'jiu':return 3.01;
case 'sha':
if(button.link[3]=='fire') return 2.95;
else if(button.link[3]=='fire') return 2.92;
else if(button.link[3]=='thunder') return 2.92;
else return 2.9;
default:return 2+_status.event.getRand()*2;
}

View File

@ -4,6 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
name:'huicui',
connect:true,
character:{
dc_sunchen:['male','wu',4,['dczigu','dczuowei'],['unseen']],
dc_zhangmancheng:['male','qun',4,['dclvecheng','dczhongji']],
yue_zhoufei:['female','wu',3,['dclingkong','dcxianshu']],
dc_wuban:['male','shu',4,['dcyouzhan'],['clan:陈留吴氏','unseen']],
@ -4137,7 +4138,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var cards=evt.cards.filterInD();
return get.value(cards,evt.player)*get.attitude(player,evt.player);
}
return 0;
})
'step 1'
if(result.bool){
@ -5780,7 +5780,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
subSkill:{
blocker:{
charlotte:true,
init:function(player,skill){
player.addSkillBlocker(skill);
},
@ -10164,7 +10163,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
characterTitle:{
},
perfectPair:{},
characterFilter:{
},
dynamicTranslate:{

View File

@ -384,7 +384,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
onremove:true,
filter:function(event,player){
if(!event.card.storage||!event.card.storage.jsrgzhenfeng) return false;
debugger
// debugger
var str=event.target.getSkills(null,false,false).map(skill=>{
var info=get.info(skill);
if(!info||info.charlotte) return;
@ -1992,7 +1992,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
subSkill:{
undist:{
group:'undist',
charlotte:true,
trigger:{
player:['useCardAfter','damageEnd'],
},
@ -2954,7 +2953,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(count==1) return true;
for(var i=0;i<ui.selected.buttons.length;i++){
if(get.owner(button.link)==get.owner(ui.selected.buttons[i].link)) return false;
};
}
return true;
}).set('count',targets.length).set('ai',button=>{
var player=_status.event.player;
@ -4390,7 +4389,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var ind=skillx.lastIndexOf('_');
if(ind==-1) break;
skillx=skillx.slice(0,ind);
};
}
}
if(popup!=false&&!infox.silent) infox.forced=false;
if(!infox.charlotte&&infox.mod) delete infox.mod;

View File

@ -614,8 +614,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
filterTarget:function(card,player,target){
var event=_status.event,evt=event;
if(event._backup) evt=event._backup;
var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3');
var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4');
var equip3=target.getCards('e',card=>get.is.defendingMount(card,false));
var equip4=target.getCards('e',card=>get.is.attackingMount(card,false));
if(equip3.length&&equip3.some(card=>evt.filterCard(get.autoViewAs({
name:'shan',
storage:{psshouli:true},
@ -630,7 +630,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return game.hasPlayer(function(current){
return evt.filterTarget(sha,player,current);
})
};
}
})
},
prompt:'将场上的一张坐骑牌当做【杀】或【闪】使用或打出',
@ -639,8 +639,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var evt=event.getParent(2);
evt.set('psshouli',true);
var list=[];
var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3');
var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4');
var equip3=target.getCards('e',card=>get.is.defendingMount(card,false));
var equip4=target.getCards('e',card=>get.is.attackingMount(card,false));
var backupx=_status.event;
_status.event=evt;
try{
@ -665,8 +665,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return false;
})){
list.push('sha');
};
}catch(e){game.print(e)};
}
}catch(e){game.print(e)}
_status.event=backupx;
if(list.length==1){
event.cardName=list[0];
@ -680,13 +680,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}).set('cards',cards)
}
else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){
var type=get.subtype(button.link);
return type=='equip3'||type=='equip4';
var card=button.link;
return get.is.attackingMount(card)||get.is.defendingMount(card);
});
'step 1'
var evt=event.getParent(2);
if(result.bool&&result.links&&result.links.length){
var name=(event.cardName||(get.subtype(result.links[0])=='equip4'?'sha':'shan'));
var name=(event.cardName||(get.is.attackingMount(result.links[0])?'sha':'shan'));
if(evt.name=='chooseToUse'){
game.broadcastAll(function(result,name){
lib.skill.psshouli_backup.viewAs={
@ -728,9 +728,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
respondSha:true,
respondShan:true,
skillTagFilter:function(player,tag){
var subtype=(tag=='respondSha'?'equip4':'equip3');
var func=get.is[tag=='respondSha'?'attackingMount':'defendingMount'];
return game.hasPlayer(function(current){
return current.getEquip(subtype);
return current.hasCard(card=>func(card,false),'e');
});
},
order:2,
@ -1533,7 +1533,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.addToExpansion(result.cards[0],'give',player).gaintag.add('psshiyin');
var card=player.getExpansions('psshiyin')[0];
if(card) player.gain(card,'gain2');
};
}
},
}
}
@ -1654,7 +1654,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(card.name=='du') addi-=5;
if(get.color(card)=='black') addi-=6;
if(player==event.player){
if(Boolean(event.small)){
if(event.small){
return -getn(card)-get.value(card)/2+addi;
}
return getn(card)-get.value(card)/2+addi;
@ -2670,9 +2670,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return '没有“戮”';
}
},
content:function(storage,player){
return '共有'+get.cnNumber(storage.length)+'张“戮”';
},
// content:function(storage,player){
// return '共有'+get.cnNumber(storage.length)+'张“戮”';
// },
},
group:'zyshilu_zhiheng',
subSkill:{
@ -4096,7 +4096,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
list.push(['基本','','sha']);
}
for(var i of lib.inpile_nature){
if(lib.filter.cardUsable({name:'sha',nature:i},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){
if(lib.filter.cardUsable({name:'sha',nature:i},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){
return player.canUse({name:'sha',nature:i},current);
})){
list.push(['基本','','sha',i]);
@ -4594,14 +4594,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(cards.length) player.gain(cards,'gain2','log');
'step 5'
if(event.count>0&&player.hasSkill('spyinzhi')){
player.chooseBool(get.prompt2('spyinzhi')).set('frequentSkill','spyinzhi');
player.chooseBool(get.prompt2('spyinzhi')).set('frequentSkill','spyinzhi');
}
else event.finish();
'step 6'
if(result.bool){
player.logSkill('spyinzhi');
event.goto(1);
};
}
},
},
spmingjian:{

View File

@ -124,6 +124,8 @@ window.noname_character_rank={
'db_key_liyingxia',
'key_kiyu',
'jsrg_pangtong',
'star_caoren',
'clan_xunyou',
],
a:[
'diy_zaozhirenjun',
@ -339,6 +341,7 @@ window.noname_character_rank={
'key_kotarou',
'key_kyou',
'key_tomoyo',
'star_yuanshu',
],
am:[
'diy_caiwenji',
@ -618,6 +621,7 @@ window.noname_character_rank={
'jsrg_xiahourong',
'jsrg_sunshangxiang',
'jsrg_machao',
'sunyu',
],
bp:[
'chess_diaochan',
@ -976,6 +980,9 @@ window.noname_character_rank={
'zhangyan',
'jsrg_huangzhong',
'jsrg_zhangchu',
'ol_dingshangwan',
'ol_liwan',
'chengjichengcui',
],
b:[
'diy_feishi',
@ -2023,6 +2030,9 @@ window.noname_character_rank={
'key_kotomi',
'db_key_liyingxia',
'key_iriya',
'star_caoren',
'star_yuanshu',
'clan_xunyou',
],
rare:[
'luoxian',
@ -2486,6 +2496,8 @@ window.noname_character_rank={
'ol_wenqin',
'clan_wanghun',
'yue_zhoufei',
'ol_dingshangwan',
'ol_liwan',
],
junk:[
'sunshao',

View File

@ -331,10 +331,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
switch(button.link[2]){
case 'tao':return 5;
case 'jiu':return 3.01;
case 'shan':return 3.01;
case 'sha':
if(button.link[3]=='fire') return 2.95;
else if(button.link[3]=='fire') return 2.92;
else if(button.link[3]=='thunder') return 2.92;
else return 2.9;
case 'shan':return 1;
}
@ -1195,7 +1194,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var color=get.color(card),colors=player.getStorage('olshuangxiong_effect');
for(var i of colors){
if(color!=i) return true;
};
}
return false;
},
prompt:function(){
@ -2305,7 +2304,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return current!=player;
}).sortBySeat(target);
for(var target of players){
if(get.damageEffect(target,player,target,'fire')>=0){num=0;continue};
if(get.damageEffect(target,player,target,'fire')>=0){num=0;continue}
var shao=false;
num++;
if(target.countCards('he',function(card){
@ -3171,7 +3170,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
forced:true,
audio:2,
check:function(event,player){
return player.getHistory('damage').indexOf(event)==0;
return player.getHistory('damage').indexOf(event)==0;
},
filter:function(event,player){
var index=player.getHistory('damage').indexOf(event);
@ -4501,7 +4500,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
locked:false,
enable:'chooseToUse',
filterCard:function(card){
return (get.type2(card)!='trick'&&get.color(card)=='black');
return (get.type2(card)!='trick'&&get.color(card)=='black');
},
filter:function(event,player){
return player.hasCard((card)=>(get.type2(card)!='trick'&&get.color(card)=='black'),'hes');
@ -6418,7 +6417,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
enable:'phaseUse',
usable:1,
position:'hs',
viewAs:{
name:'sha',
changbiao:true,
@ -7373,7 +7371,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(!lib.skill.yongjin.filter(null,player,cards)){
event.finish();
return;
};
}
var next=player.chooseTarget(2,function(card,player,target){
if(ui.selected.targets.length){
var from=ui.selected.targets[0];
@ -7655,7 +7653,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return evt&&evt.cards2&&evt.cards2.filter(function(i){
return get.name(i,evt.hs.contains(i)?player:false)=='sha';
}).length>0;
};
}
if(event.name=='gain'&&event.player==player) return false;
var evt=event.getl(player);
return evt&&evt.cards2&&evt.cards2.length>0;
@ -9468,7 +9466,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player:function(player){
if(player.hp<3) return false;
var mindist=player.hp;
if(player.countCards('hs',card=>player.canSave(card,player))) mindist++;
if(player.countCards('hs',card=>player.canSaveCard(card,player))) mindist++;
if(game.hasPlayer(function(current){
return (get.distance(player,current)<=mindist&&
player.canUse('sha',current,false)&&
@ -11158,7 +11156,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(checkx>0) return checkx;
}
return 0;
};
}
if(attitude>0){
return result;
}
@ -11521,7 +11519,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return 1;
}
else return 4;
};
}
return 3;
}).set('logSkill',['new_liyu',trigger.player]);
'step 1'
@ -12033,7 +12031,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(get.attitude(_status.event.player,_status.currentPhase)<0&&_status.currentPhase.needsToDiscard()&&card.name!='du') return -1;
for(var i=0;i<ui.selected.cards.length;i++){
if(get.type(ui.selected.cards[i])==get.type(card)||(ui.selected.cards[i].name=='du'&&card.name!='du')) return -1;
};
}
if(card.name=='du') return 20;
return (_status.event.player.countCards('h')-_status.event.player.hp);
},
@ -12673,7 +12671,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
list.push(['基本','','sha']);
}
for(var i of lib.inpile_nature){
if(lib.filter.cardUsable({name:'sha',nature:i},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){
if(lib.filter.cardUsable({name:'sha',nature:i},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){
return player.canUse({name:'sha',nature:i},current);
})){
list.push(['基本','','sha',i]);
@ -14312,7 +14310,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(!result.bool&&!event.directbool){
//game.cardsDiscard(card);
return;
};
}
player.addToExpansion(card,'gain2').gaintag.add('tuntian');
},
group:'tuntian_dist',
@ -14931,8 +14929,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
refangzhu_info:'当你受到伤害后你可以令一名其他角色选择一项摸X张牌并将武将牌翻面或弃置X张牌并失去1点体力。X为你已损失的体力值',
rezaiqi:'再起',
rezaiqi_info:'结束阶段开始时你可以令至多X名角色选择一项1.摸一张牌2.令你回复1点体力X为本回合进入弃牌堆的红色牌数。',
ol_jiangwei:'界姜维',
ol_jiangwei_prefix:'界',
ol_caiwenji:'界蔡琰',
ol_caiwenji_prefix:'界',
retuntian:'屯田',

View File

@ -101,6 +101,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return get.damageEffect(target,player,player);
},
},
combo:'nzry_mingren',
},
group:'sbzhenliang_draw',
subSkill:{
@ -129,7 +130,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
},
ai:{combo:'nzry_mingren'},
},
//小乔
sbtianxiang:{
@ -1289,7 +1289,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sblianhuan:{
audio:2,
enable:'phaseUse',
filterCard:{suit:'club'},
filter:(event,player)=>player.hasCard(card=>lib.skill.sblianhuan.filterCard(card,player),lib.skill.sblianhuan.position),
filterTarget:function(card,player,target){
if(player.hasSkill('sblianhuan_blocker')) return false;

View File

@ -750,7 +750,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.line(player,trigger.player);
player.logSkill('drlt_zhenrong');
player.addToExpansion(result.links,trigger.player,'give','log').gaintag.add('drlt_zhenrong');
};
}
},
},
"drlt_hongju":{
@ -822,11 +822,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var cards=result.links;
for(var i=0;i<cards.length;i++){
player.storage.drlt_zhenrong.remove(cards[i]);
};
}
player.syncStorage('drlt_zhenrong');
player.$throw(cards);
player.discardPlayerCard(target,'ej',1,true);
};
}
},
ai:{
order:13,
@ -1268,7 +1268,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
else{
player.addTempSkill('drlt_yongsi1',{player:'phaseDiscardAfter'});
};
}
},
},
},
@ -1482,7 +1482,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var num=1;
if(get.type(result.cards[0])=='equip') num=2;
player.draw(num);
};
}
},
},
drlt_wanglie:{
@ -1820,7 +1820,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},'选择一名装备区里牌数大于你的角色').ai=function(target){
return -get.attitude(player,target)
};
};
}
'step 2'
if(result.bool){
event.target=result.targets[0];
@ -1846,7 +1846,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 3'
if(result.bool){
target.give(result.cards,player);
};
}
},
ai:{
order:11,
@ -1958,14 +1958,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
else event._result={index:0};
}else{
event.finish();
};
}
'step 2'
player.logSkill('nzry_yili',target);
if(result.index==1){
player.removeMark('nzry_huaiju',1);
}else{
player.loseHp();
};
}
target.addMark('nzry_huaiju',1);
target.addSkill('nzry_huaiju_ai');
},
@ -2024,7 +2024,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var num=0;
for(var i=0;i<targets.length;i++){
num+=targets[i].hp;
};
}
return num+target.hp<=_status.event.num;
}).set('ai',function(target){
if(ui.selected.targets[0]!=undefined) return -1;
@ -2043,7 +2043,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.chooseTarget('请选择〖溃诛〗的目标',[1,event.num]).ai=function(target){
return get.attitude(player,target);
};
};
}
'step 3'
if(result.bool){
var targets=result.targets.sortBySeat();
@ -2056,7 +2056,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var num=0;
for(var i=0;i<targets.length;i++){
num+=targets[i].hp;
};
}
if(num<event.num){
event.bool=false;
event.goto(2);
@ -2066,11 +2066,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.logSkill('nzry_kuizhu',targets);
for(var i=0;i<targets.length;i++){
targets[i].damage();
};
}
//if(targets.length>=2) player.loseHp();
};
};
};
}
}
}
},
},
rechezheng:{
@ -2122,7 +2122,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(result.bool){
player.line(result.targets);
player.discardPlayerCard(result.targets[0],'he',1,true);
};
}
},
group:'rechezheng',
},
@ -2234,7 +2234,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
player.markSkill('nzry_chenglve');
player.addTempSkill('nzry_chenglve1');
};
}
},
ai:{
order:2.7,
@ -2252,13 +2252,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var cards=player.storage.nzry_chenglve1;
for(var i=0;i<cards.length;i++){
if(cards[i]==get.suit(card)) return Infinity;
};
}
},
targetInRange:function(card,player){
var cards=player.storage.nzry_chenglve1;
for(var i=0;i<cards.length;i++){
if(cards[i]==get.suit(card)) return true;
};
}
}
},
onremove:true,
@ -2388,7 +2388,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 2'
if(result.bool){
player.addToExpansion(result.cards[0],player,'give','log').gaintag.add('nzry_mingren');
};
}
},
},
2:{
@ -2425,7 +2425,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.addToExpansion(result.cards[0],'log','give',player).gaintag.add('nzry_mingren');
var card=player.getExpansions('nzry_mingren')[0];
if(card) player.gain(card,'gain2');
};
}
},
},
},
@ -2591,12 +2591,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
else{
event.finish();
};
}
'step 2'
if(result.bool){
player.line(result.targets);
result.targets[0].draw(4-result.targets[0].countCards('h'))
};
}
},
ai:{
order:1,
@ -2633,7 +2633,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger.source.storage.nzry_shenshi1=result.cards[0];
trigger.source.storage.nzry_shenshi2=player;
trigger.source.addSkill('nzry_shenshi1');
};
}
},
},
},
@ -2654,7 +2654,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(player.getCards('he').contains(card)&&4-pl.countCards('h')>0){
pl.draw(4-pl.countCards('h'));
pl.logSkill('nzry_shenshi');
};
}
player.removeSkill('nzry_shenshi1');
delete player.storage.nzry_shenshi1;
delete player.storage.nzry_shenshi2;
@ -3698,7 +3698,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
'step 2'
if(!result.bool&&!event.directbool){
return;
};
}
player.addToExpansion(event.card,'gain2').gaintag.add('tuntian');
},
callback:function(){
@ -3731,7 +3731,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
}
},
locked:false,
ai:{
effect:{
target:function(card,player,target,current){
@ -6233,7 +6232,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
content:function(){
"step 0";
player.chooseTarget(get.prompt2('releiji'),function(card,player,target){
return target!=player;
return target!=player;
}).ai=function(target){
if(target.hasSkill('hongyan')) return 0;
return get.damageEffect(target,_status.event.player,_status.event.player,'thunder');
@ -7080,7 +7079,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(cards[i]!=card&&get.number(cards[i])==num){
player.loseToDiscardpile(card);
return;
};
}
}
trigger.cancel();
trigger.result={bool:true};

View File

@ -435,6 +435,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
else{
evt.finish();
evt._triggered=null;
if(evt.name.startsWith('pre_')){
var evtx=evt.getParent();
evtx.finish();
evtx._triggered=null;
}
var nexts=trigger.next.slice();
for(var next of nexts){
if(next.name=='judgeCallback') trigger.next.remove(next);
@ -2053,7 +2058,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(!list.contains(type)){
list.push(type);
cards.push(ui.cardPile.childNodes[i])
};
}
}
player.gain(cards,'gain2').gaintag.add('zhangming');
player.addTempSkill('zhangming_keep');
@ -4860,7 +4865,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(!list.contains(type)){
list.push(type);
cards.push(ui.cardPile.childNodes[i])
};
}
}
player.gain(cards,'gain2');
}
@ -4960,8 +4965,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
onunmark:'throw',
},
ai:{
order:1,
result:{target:-1},
order:1,
result:{target:-1},
},
subSkill:{
equip:{
@ -6286,10 +6291,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
};
if(!targets.length){
if(get.attitude(player,target)<0){
if(target.countCards('e',function(card){
if(target.countCards('e',function(card){
return get.value(card,target)<=0;
})) return 1;
if(game.hasPlayer(function(current){
if(game.hasPlayer(function(current){
return current.countCards('h',fh)==target.countCards('h',fh)-2;
})) return -2;
if(game.hasPlayer(function(current){

View File

@ -1574,7 +1574,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
chooseButton:{
dialog:function(event,player){
return ui.create.dialog(
'###缚豕###<div class="text center">重铸任意“缚豕”牌,视为使用一张【杀】并执行等量项</div>',
'###缚豕###<div class="text center">将任意“缚豕”牌置入弃牌堆,视为使用一张【杀】并执行等量项</div>',
player.getExpansions('olfushi'),
[['额外目标','伤害-1','伤害+1'],'tdnodes'],
'hidden'
@ -1686,7 +1686,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
delete event.result.skill;
event.result.card=new lib.element.VCard(lib.skill.olfushi_wusheng_backup.viewAs);
event.result.cards=[];
player.recast(cards);
player.loseToDiscardpile(cards);
event.result.card.storage.olfushi_buff=controls;
player.addTempSkill('olfushi_buff');
}
@ -1695,7 +1695,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
prompt:function(links,player){
let controls=links.filter(button=>typeof button=='string');
if(!controls.length) controls=['额外目标','伤害-1','伤害+1'];
return `选择【杀】的目标(${controls.join('、')}`;
return `选择【杀】的目标(${controls.join('、')}`;
}
},
ai:{
@ -1937,17 +1937,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
switch(get.sgn(get.attitude(player,target))){
case 0:
return 2;
break;
case 1:
if(num1-1>=num2) return 0;
if(num1+1<=num2) return 1;
return 2;
break;
case -1:
if(num1-2<=num2) return 0;
if(num1+3>=num2) return 1;
return 2;
break;
}
}).set('prompt',get.prompt('olrunwei',trigger.player));
'step 1'
@ -5690,7 +5687,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var cards1=list[0][1].slice(),cards2=list[1][1].slice();
var card1=cards1.sort((a,b)=>get.value(b)-get.value(a))[0];
var card2=cards2.sort((a,b)=>get.value(a)-get.value(b))[0];
if(get.value(card1)>get.value(card2)){
if(card1&&card2&&get.value(card1)>get.value(card2)){
cards1.remove(card1);
cards2.remove(card2);
cards1.push(card2);
@ -6253,7 +6250,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
else used.push(name);
}
else used.push(name);
};
}
if(info.isRound) break;
}
var vcards=[];
@ -7261,7 +7258,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(evt.card.nature) natures.remove(evt.card.nature);
}
else tricks.remove(name);
};
}
if(info.isRound) break;
}
var vcards=[];
@ -11567,11 +11564,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return target.countCards('h')!=ui.selected.targets[0].countCards('h');
}).set('complexTarget',true).set('ai',function(target){
if(!ui.selected.targets.length){
var player=_status.event.player,hs=target.countCards('h');
if(game.hasPlayer(function(current){
return current!=player&&current!=target&&current.countCards('h')>hs&&!current.hasMark('quxi_gain')&&!current.hasMark('quxi_lose');
})) return get.attitude(player,target)/(Math.sqrt(1+target.countCards('h')));
return 0;
var player=_status.event.player,hs=target.countCards('h');
if(game.hasPlayer(function(current){
return current!=player&&current!=target&&current.countCards('h')>hs&&!current.hasMark('quxi_gain')&&!current.hasMark('quxi_lose');
})) return get.attitude(player,target)/(Math.sqrt(1+target.countCards('h')));
return 0;
}
if(target.countCards('h')>ui.selected.targets[0].countCards('h')) return -get.attitude(_status.event.player,target);
return 0;
@ -11837,7 +11834,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
silent:true,
popup:false,
filter:function(event,player){
return player.storage.juguan_draw&&player.storage.juguan_draw.contains(event.source);
return player.storage.juguan_draw&&player.storage.juguan_draw.contains(event.source);
},
content:function(){
player.unmarkAuto('juguan_draw',[trigger.source]);
@ -12689,10 +12686,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return 5-val;
}
switch(button.link){
case 3:return 4.5;break;
case 4:return 4.4;break;
case 5:return 4.3;break;
case 2:return (3-player.hp)*1.5;break;
case 3:return 4.5;
case 4:return 4.4;
case 5:return 4.3;
case 2:return (3-player.hp)*1.5;
case 1:{
if(game.hasPlayer(function(current){
return (get.realAttitude||get.attitude)(player,current)<0&&get.distance(player,current)>1;
@ -12913,7 +12910,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
filterCard:{color:'black'},
position:'hes',
audio:'niluan',
viewAsFilter:function(player){
return player.countCards('hes',lib.skill.spniluan.filterCard)>0;
},
@ -13422,7 +13418,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
backup:function(links,player){
return {
audio:'jingong',
filterCard:true,
popname:true,
position:'hes',
viewAs:{name:links[0][2]},
@ -14707,7 +14702,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
forced:true,
popup:false,
onremove:true,
firstDo:true,
init:function(player,skill){
player.storage[skill]=0;
@ -15627,7 +15621,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
backup:function(links,player){
return {
audio:'jingong',
filterCard:true,
popname:true,
position:'hes',
viewAs:{name:links[0][2]},
@ -17089,16 +17082,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var map={sha:'shan',tao:'jiu',jiu:'tao'}
for(var i=0;i<list.length;i++){
var name=list[i];
if(player.countCards('hs',map[name])>(name=='jiu'?1:0)&&player.getUseValue({name:name})>0){
var temp=get.order({name:name});
if(temp>max){
max=temp;
name2=map[name];
}
}
}
if(name2==get.name(card,player)) return 1;
return 0;
if(player.countCards('hs',map[name])>(name=='jiu'?1:0)&&player.getUseValue({name:name})>0){
var temp=get.order({name:name});
if(temp>max){
max=temp;
name2=map[name];
}
}
}
if(name2==get.name(card,player)) return 1;
return 0;
}
return 1;
},
@ -17123,7 +17116,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
onrespond:function(){return this.onuse.apply(this,arguments)},
onuse:function(result,player){
player.removeMark('fanghun',1);
player.removeMark('fanghun',1);
},
ai:{
respondSha:true,
@ -17144,13 +17137,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var map={sha:'shan',tao:'jiu',jiu:'tao'}
for(var i=0;i<list.length;i++){
var name=list[i];
if(player.countCards('hs',map[name])>(name=='jiu'?1:0)&&player.getUseValue({name:name})>0){
var temp=get.order({name:name});
if(temp>max) max=temp;
}
}
if(max>0) max+=((player.storage.refuhan||player.storage.twfuhan)?0.3:-0.3);
return max;
if(player.countCards('hs',map[name])>(name=='jiu'?1:0)&&player.getUseValue({name:name})>0){
var temp=get.order({name:name});
if(temp>max) max=temp;
}
}
if(max>0) max+=((player.storage.refuhan||player.storage.twfuhan)?0.3:-0.3);
return max;
}
if(!player) player=_status.event.player;
return (player.storage.refuhan||player.storage.twfuhan)?4:1;
@ -20721,7 +20714,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
next.set('filterButton',function(button){
if(button.link==2){
return _status.event.bool1;
};
}
return true;
});
next.set('bool1',trigger.player.isDamaged());
@ -22600,9 +22593,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
"step 0"
event.target=player;
event.player=trigger.player;
var prompt;
if(player==event.player) prompt='是否发动【郡兵】摸一张牌?';
else prompt=('###是否对'+get.translation(event.target)+'发动【郡兵】?###'+(event.player==event.target?'摸一张牌':'摸一张牌,将所有手牌交给该角色,然后该角色交给你等量的手牌'));
var prompt;
if(player==event.player) prompt='是否发动【郡兵】摸一张牌?';
else prompt=('###是否对'+get.translation(event.target)+'发动【郡兵】?###'+(event.player==event.target?'摸一张牌':'摸一张牌,将所有手牌交给该角色,然后该角色交给你等量的手牌'));
event.player.chooseBool(prompt).set('choice',lib.skill.junbing.checkx(event.target,event.player));
"step 1"
if(!result.bool){event.finish();return}
@ -22621,7 +22614,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
"step 4"
target.give(result.cards,player);
},
audio:2,
},
xiongyi:{
skillAnimation:true,
@ -26454,7 +26446,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
skill_feiyi_B_info:'每回合每项限一次当你的手牌数变为1后你可以展示此唯一手牌A并摸一张牌然后你选择一项①本回合使用点数大于A的点数的牌额外结算一次②本回合使用点数小于A的点数的牌额外结算一次。',
lvboshe:'吕伯奢',
olfushi:'缚豕',
olfushi_info:'①一名角色使用【杀】结算结束后若你至其的距离不大于1你将此【杀】对应的所有实体牌置于武将牌上。②当你需要使用一张【杀】时你可以重铸任意张“缚豕”牌视为使用一张【杀】并选择X项X为你以此法重铸的牌数且至多为31.你为此【杀】额外指定一个目标2.你选择此【杀】的一个目标角色,此牌对其造成的伤害-13.你选择此【杀】的一个目标角色,此【杀】对其造成的伤害+1。当此【杀】指定最后一个目标后若此牌被选择的效果选项相邻且此牌的目标角色座位连续则此【杀】不计入次数限制。',
olfushi_info:'①一名角色使用【杀】结算结束后若你至其的距离不大于1你将此【杀】对应的所有实体牌置于武将牌上。②当你需要使用一张【杀】时你可以将任意张“缚豕”牌置入弃牌堆视为使用一张【杀】并选择X项X为你以此法重铸的牌数且至多为31.你为此【杀】额外指定一个目标2.你选择此【杀】的一个目标角色,此牌对其造成的伤害-13.你选择此【杀】的一个目标角色,此【杀】对其造成的伤害+1。当此【杀】指定最后一个目标后若此牌被选择的效果选项相邻且此牌的目标角色座位连续则此【杀】不计入次数限制。',
oldongdao:'东道',
oldongdao_info:'农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。',
zhangyan:'张燕',

View File

@ -4,7 +4,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
name:'sp2',
connect:true,
character:{
star_yuanshu:['male','qun',4,['starcanxi','starpizhi','starzhonggu'],['zhu']],
star_caoren:['male','wei',4,['starsujun','starlifeng']],
mp_liuling:['male','jin',3,['mpjiusong','mpmaotao','mpbishi'],['doublegroup:wei:qun:jin']],
dc_jikang:['male','wei',3,['new_qingxian','dcjuexiang']],
dc_jsp_guanyu:['male','wei',4,['new_rewusheng','dcdanji']],
dc_mengda:['male','wei',4,['dclibang','dcwujie']],
@ -55,7 +57,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dongxie:['female','qun',4,['dcjiaoxia','dchumei']],
wangrong:['female','qun',3,['minsi','jijing','zhuide']],
ol_dingyuan:['male','qun',4,['cixiao','xianshuai']],
xin_baosanniang:['female','shu',3,['decadewuniang','decadexushen']],
re_hejin:['male','qun',4,['spmouzhu','spyanhuo']],
re_hansui:['male','qun',4,['spniluan','spweiwu']],
liuhong:['male','qun',4,['yujue','tuxing']],
@ -108,11 +109,210 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_xuzhou:['re_taoqian','caosong','zhangmiao','qiuliju'],
sp_zhongyuan:['re_hucheer','re_zoushi','caoanmin','re_dongcheng'],
sp_xiaohu:['haomeng','yanfuren','yanrou','dc_zhuling'],
sp_star:['star_caoren'],
sp_decade:['caobuxing','re_maliang','xin_baosanniang','dc_jikang'],
sp_star:['star_caoren','star_yuanshu'],
mini_qixian:['mp_liuling'],
sp_decade:['caobuxing','re_maliang','dc_jikang'],
}
},
skill:{
//星袁术
starcanxi:{
audio:2,
trigger:{
global:['phaseBefore','roundStart'],
player:'enterGame',
},
filter:function(event,player,name){
if(name=='roundStart') return player.getSkills().some(skill=>skill.indexOf('starcanxi_')==0);
return event.name!='phase'||game.phaseNumber==0;
},
forced:true,
content:function(){
'step 0'
if(event.triggername!='roundStart'){
var list=game.filterPlayer().reduce((list,target)=>list.add(target.group),[]);
list.sort((a,b)=>lib.group.indexOf(a)-lib.group.indexOf(b));
list.forEach(group=>lib.skill.starcanxi.create(group,player));
}
'step 1'
var groups=player.getSkills().filter(skill=>skill.indexOf('starcanxi_')==0);
groups=groups.map(group=>group.slice(10));
groups.sort((a,b)=>lib.group.indexOf(a)-lib.group.indexOf(b));
var map={};
groups.forEach(group=>map[group]=get.translation(group+'2'));
event.map=map;
player.chooseButton([
'###残玺###<div class="text center">请选择势力和效果</div>',
[Object.values(map),'tdnodes'],
[[
['wangsheng','<div class="popup text" style="width:calc(100% - 10px);display:inline-block"><div class="skill">【妄生】</div><div>被选择势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1</div></div>'],
['xiangsi','<div class="popup text" style="width:calc(100% - 10px);display:inline-block"><div class="skill">【向死】</div><div>其他被选择势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效</div></div>']
],'textbutton']
],2,true).set('filterButton',function(button){
var list=['wangsheng','xiangsi'];
if(!ui.selected.buttons.length) return true;
return list.includes(ui.selected.buttons[0].link)!=list.includes(button.link);
}).set('ai',function(button){
var player=_status.event.player;
var map=_status.event.map,list=['wangsheng','xiangsi'];
var getNum=function(group,effect){
var num=0,sgn=effect=='wangsheng'?1.05:-1;
game.countPlayer(function(current){
if(!(current==player&&sgn==-1)) num+=get.sgn(get.attitude(player,current))*sgn;
});
return num;
};
var listx=[];
Object.keys(map).forEach(group=>list.forEach(effect=>listx.add([group,effect])));
listx.sort((a,b)=>getNum(b[0],b[1])-getNum(a[0],a[1]));
if(button.link==map[listx[0][0]]||button.link==listx[0][1]) return 1;
return 0;
}).set('map',map);
'step 2'
if(result.bool){
if(!Object.keys(event.map).some(group=>event.map[group]==result.links[0])) result.links.reverse();
player.popup(result.links[0]);
var group=Object.keys(event.map).find(group=>event.map[group]==result.links[0]);
var skill='starcanxi_'+result.links[1];
player.popup(skill);
game.log(player,'选择了','#g'+result.links[0],'、','#y'+get.translation(skill));
player.addTempSkill(skill,'roundStart');
player.markAuto(skill,[group]);
}
},
create:function(group,player){
if(!lib.skill['starcanxi_'+group]){
lib.skill['starcanxi_'+group]={
mark:true,
charlotte:true,
onremove:function(player){
player.addMark('starpizhi',1,false);
},
intro:{content:'玉玺的一角'},
};
lib.translate['starcanxi_'+group]='残玺·'+get.translation(group+'2');
lib.skill['starcanxi_'+group].marktext=get.translation(group);
lib.translate['starcanxi_'+group+'_bg']=get.translation(group);
}
player.addSkill('starcanxi_'+group);
},
subSkill:{
wangsheng:{
charlotte:true,
onremove:true,
trigger:{global:'damageBegin1'},
filter:function(event,player){
if(!event.source||!player.getStorage('starcanxi_wangsheng').includes(event.source.group)) return false;
return !event.source.getHistory('sourceDamage').length;
},
forced:true,
logTarget:'source',
content:function(){
trigger.num++;
},
group:'starcanxi_remove',
global:'starcanxi_effect',
intro:{content:'$势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1'},
},
xiangsi:{
charlotte:true,
onremove:true,
trigger:{global:'recoverEnd'},
filter:function(event,player){
if(!player.getStorage('starcanxi_xiangsi').includes(event.player.group)||event.player==player) return false;
return game.getGlobalHistory('changeHp',function(evt){
return evt.getParent().name=='recover'&&evt.player==event.player;
}).length==1;
},
forced:true,
logTarget:'player',
content:function(){
trigger.player.loseHp();
},
group:['starcanxi_remove','starcanxi_cancel'],
global:'starcanxi_effect',
intro:{content:'其他$势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效'},
},
cancel:{
charlotte:true,
trigger:{global:'useCard'},
filter:function(event,player){
if(!event.targets||!event.targets.includes(player)||!player.getStorage('starcanxi_xiangsi').includes(event.player.group)||event.player==player) return false;
return event.player.getHistory('useCard',evt=>evt.targets&&evt.targets.includes(player)).indexOf(event)==0;
},
forced:true,
logTarget:'player',
content:function(){
trigger.excluded.add(player);
},
},
effect:{
mod:{
globalFrom:function(from,to,distance){
if(game.hasPlayer(target=>target.getStorage('starcanxi_wangsheng').includes(from.group))) return distance-1;
},
},
ai:{
effect:{
player_use:function(card,player,target){
var targets=game.filterPlayer(targetx=>targetx!=player&&targetx.getStorage('starcanxi_xiangsi').includes(player.group));
if(!targets.length) return;
if(get.tag(card,'recover')&&target==player&&target.hp>2) return 0;
if(get.tag(card,'damage')&&targets.includes(target)) return 0.5;
},
},
},
},
remove:{
charlotte:true,
trigger:{player:'die'},
forced:true,
popup:false,
firstDo:true,
forceDie:true,
content:function(){
player.removeSkill('starcanxi_wangsheng');
player.removeSkill('starcanxi_xiangsi');
},
},
},
},
starpizhi:{
audio:2,
trigger:{player:'phaseEnd',global:'die'},
filter:function(event,player){
if(event.name=='phase') return player.hasMark('starpizhi');
var groups=player.getSkills().filter(skill=>skill.indexOf('starcanxi_')==0);
groups=groups.map(group=>group.slice(10));
return groups.includes(event.player.group);
},
forced:true,
content:function(){
'step 0'
if(trigger.name=='die'){
var skills=player.getSkills().filter(skill=>skill.indexOf('starcanxi_')==0&&skill.slice(10)==trigger.player.group);
player.removeSkill(skills);
}
'step 1'
player.draw(player.countMark('starpizhi'));
},
intro:{content:'已失去#个“玺角”'},
ai:{combo:'starcanxi'},
},
starzhonggu:{
unique:true,
audio:2,
trigger:{player:'phaseDrawBegin2'},
filter:function(event,player){
return !event.numFixed;
},
forced:true,
zhuSkill:true,
content:function(){
var num=(game.roundNumber>=game.countPlayer(current=>current.group=='qun')?2:-1);
trigger.num+=num;
},
},
//星曹仁
starsujun:{
audio:2,
@ -139,7 +339,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
enable:'chooseToUse',
filter:function(event,player){
if(!event.filterCard({name:'sha'},player,event)&&!event.filterCard({name:'wuxie'},player,event)) return false;
return player.countCards('h',card=>{
return player.countCards('hs',card=>{
return !player.getStorage('starlifeng_count').contains(get.color(card,player))||_status.connectMode;
});
},
@ -165,7 +365,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
event.getParent().addCount=false;
},
popname:true,
position:'h',
viewAs:{
name:links[0][2],
},
@ -185,7 +384,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
hiddenCard:function(player,name){
if(name=='wuxie') return player.countCards('h',card=>{
if(name=='wuxie') return player.countCards('hs',card=>{
return !player.getStorage('starlifeng_count').contains(get.color(card,player))||_status.connectMode;
});
},
@ -193,7 +392,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
respondSha:true,
skillTagFilter:function(player,tag,arg){
if(arg=='respond') return false;
if(!player.countCards('h',card=>{
if(!player.countCards('hs',card=>{
return !player.getStorage('starlifeng_count').contains(get.color(card,player))||_status.connectMode;
})) return false;
},
@ -222,6 +421,94 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
},
//小程序刘伶
mpjiusong:{
audio:2,
trigger:{global:'useCard'},
filter:function(event,player){
return event.card.name=='jiu'&&player.countMark('mpjiusong')<3;
},
forced:true,
locked:false,
content:function(){
player.addMark('mpjiusong');
},
marktext:'醉',
intro:{
name:'醉(酒颂/酕醄)',
name2:'醉',
content:'mark',
}
},
mpmaotao:{
audio:2,
trigger:{global:'useCardToPlayer'},
filter:function(event,player){
if(event.targets.length!=1||!event.isFirstTarget) return false;
return event.player!=player&&player.countMark('mpjiusong');
},
prompt2:function(event,player){
let list;
if(get.type(event.card)!='delay') list=game.filterPlayer(current=>{
return lib.filter.targetEnabled2(event.card,event.player,current);
});
else list=game.filterPlayer(current=>current.canAddJudge(event.card));
return `移去1枚“醉”${list.length>1?`${get.translation(event.card)}目标改为${get.translation(list)}中的一名随机角色。若新目标与原目标相同,你`:''}获得牌堆中的一张【酒】。`
},
check:function(event,player){
const eff=get.effect(event.target,event.card,player,player);
let list;
if(get.type(event.card)!='delay') list=game.filterPlayer(current=>{
return lib.filter.targetEnabled2(event.card,event.player,current);
});
else list=game.filterPlayer(current=>current.canAddJudge(event.card));
let list2=list.filter(current=>get.effect(current,event.card,player,player)>eff);
let list3=list.filter(current=>get.effect(current,event.card,player,player)>0);
return list2.length>=list.length/2||player.countMark('mpjiusong')>=2&&list3.length>=list.length/2;
},
content:function(){
player.removeMark('mpjiusong',1);
var list,oriTarget=trigger.target;
trigger.targets.remove(oriTarget);
trigger.getParent().triggeredTargets1.remove(oriTarget);
trigger.untrigger();
game.delayx();
if(get.type(trigger.card)!='delay') list=game.filterPlayer(current=>{
return lib.filter.targetEnabled2(trigger.card,trigger.player,current);
});
else list=game.filterPlayer(current=>current.canAddJudge(trigger.card));
if(list.length) target=list.randomGet();
trigger.targets.push(target);
trigger.player.line(target,'thunder');
game.log(trigger.card,'的目标被改为',target);
if(target==oriTarget){
var card=get.cardPile2('jiu');
if(card) player.gain(card,'gain2');
else{
player.chat('没酒了!');
game.log('但是牌堆中已经没有','#y酒','了!');
}
}
},
},
mpbishi:{
audio:2,
forced:true,
trigger:{global:'useCard1'},
filter:function(event,player){
if(get.type2(event.card)!='trick'||!get.tag(event.card,'damage')) return false;
if(!lib.skill.xunshi.isXunshi(event.card)) return false;
const targets=event.targets.slice();
targets.remove(event.player);
return targets.length==game.countPlayer()-2;
},
content:function*(){},
mod:{
targetEnabled:function(card){
if(get.type2(card)=='trick'&&get.tag(card,'damage')>0) return false;
}
}
},
//十周年嵇康
dcjuexiang: {
derivation: 'dccanyun',
@ -669,7 +956,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
dcwujie:{
audio:2,
forced:true,
trigger:{
global:['discardBegin','drawBegin'],
},
@ -748,7 +1034,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(!num) delete player.getStat().skill[skillx];
else player.getStat().skill[skillx]=num;
var bool3=!(bool1&&!bool2);
}catch(e){}
} catch (e) {
console.trace(e);
}
if(!bool1&&!bool2&&get.skillInfoTranslation(skill,player).indexOf('出牌阶段限一次')==-1) return false;
if((bool1||bool2)&&bool3) return false;
}
@ -2033,7 +2321,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
subSkill:{
blocker:{
charlotte:true,
init:function(player,skill){
player.addSkillBlocker(skill);
},
@ -2428,7 +2715,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(eff2>0) return eff1>0;
return player.hp>2&&eff2<eff1;
}
return false;
},
logTarget:'player',
shaRelated:true,
@ -3846,7 +4132,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var player=_status.event.player,att=get.attitude(player,target);
if(att>=0) return 0;
if(!target.hasCard(function(card){
return get.value(card,target)<=0;
return get.value(card,target)<=0;
},'he')) return -att/Math.sqrt(target.countCards('he'));
return 0;
});
@ -4111,10 +4397,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return 5-val;
}
switch(num){
case 'equip3':return 4.5;break;
case 'equip4':return 4.4;break;
case 'equip5':return 4.3;break;
case 'equip2':return (3-player.hp)*1.5;break;
case 'equip3':return 4.5;
case 'equip4':return 4.4;
case 'equip5':return 4.3;
case 'equip2':return (3-player.hp)*1.5;
case 'equip1':{
if(game.hasPlayer(function(current){
return (get.realAttitude||get.attitude)(player,current)<0&&get.distance(player,current)>1;
@ -4533,7 +4819,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
content:function(){
'step 0'
player.chooseTarget('请选择【抗歌】的目标','其于回合外摸牌后你摸等量的牌其进入濒死状态时你可令其回复体力至1点其死亡后你弃置所有牌并失去1点体力',lib.filter.notMe,true).set('ai',function(target){
return get.attitude(_status.event.player,target)>0;
return get.attitude(_status.event.player,target);
});
'step 1'
if(result.bool){
@ -6075,8 +6361,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
event.num++;
if(event.num<targets.length) event.goto(1);
else{
var cards=[];
game.getGlobalHistory('cardMove',function(evt){
var cards=[];
game.getGlobalHistory('cardMove',function(evt){
if(evt.player&&evt.hs&&evt.type=='discard'&&evt.getParent(3)==event){
for(var i of evt.hs){
if(get.name(i,evt.player)=='sha'&&get.position(i,true)=='d') cards.add(i);
@ -8945,7 +9231,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
else{
target.$damagepop('K','thunder');
event.num=13;
};
}
game.log(target,'选择的点数是','#y'+get.strNumber(event.num));
player.storage.xinfu_lveming++;
player.judge(function(card){
@ -9292,7 +9578,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
else{
player.logSkill('xinfu_zhenxing');
event.num={一张:1,两张:2,三张:3}[result.control];
};
}
'step 2'
event.cards=get.cards(num);
player.chooseButton(['【镇行】:请选择要获得的牌',event.cards]).set('filterButton',function(button){
@ -9330,8 +9616,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var num2=ui.cardPile.childElementCount;
var num3=num2;
if(num1>num2) num3=0;
else if(!player.storage.xinfu_qianxin){}
else{
else if(player.storage.xinfu_qianxin){
for(var i=0;i<num2;i++){
if(player.storage.xinfu_qianxin.contains(ui.cardPile.childNodes[i])){
num3=0;break;
@ -9731,7 +10016,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(player.storage.xinfu_dianhu2&&player.storage.xinfu_dianhu2.isIn()){
if(event.name=='damage') return event.source==player.storage.xinfu_dianhu2;
return true;
};
}
},
content:function(){
'step 0'
@ -9961,9 +10246,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
zhangwen:'张温193年—230年字惠恕吴郡吴县今江苏苏州人。少修节操容貌奇伟。孙权召拜议郎、选曹尚书徙太子太傅。黄武三年224以辅义中郎将身份出使蜀汉孙权原先害怕诸葛亮会有意留难张温但张温不担心。在呈上蜀汉朝廷的文书刻意称颂蜀汉以表明和解的诚意重建两国关系。他在蜀汉表现出色得蜀汉朝廷重视。回东吴后不久被调进豫章的军队事业上再无进展。孙权一方面介怀他出使蜀汉时称颂蜀汉又嫌他声名太盛恐怕张温不会尽忠地由他任用。当时正好碰上暨艳事件暨艳是张温引荐的臣子但他滥用职权升迁评定等只看自己喜恶。事件被揭发后暨艳及同党徐彪都自杀。孙权见此于是以张温与暨艳、徐彪等人多有来往而下罪张温后更将张温发还到家乡吴郡。将军骆统曾上书为张温辩解但孙权不理会。六年后张温病逝。',
lisu:'李肃192年五原治今内蒙古包头西北人。永汉三年四月司徒王允、尚书仆射士孙瑞、卓将吕布共谋诛卓。是时天子有疾新愈大会未央殿。布使同郡骑都尉肃等、将亲兵十馀人伪著卫士服守掖门。布怀诏书。卓至肃等格卓。卓惊呼布所在。布曰“有诏”遂杀卓夷三族。后卓女婿中郎将牛辅典兵别屯陕分遣校尉李傕、郭汜、张济略陈留、颍川诸县。卓死吕布使李肃至陕欲以诏命诛辅。辅等逆与肃战肃败走弘农布诛肃。',
xinpi:'辛毗生卒年不详字佐治颍川阳翟人。三国时期曹魏大臣。原居陇西郡治在今甘肃临洮县东汉光武帝建武年间其先人东迁。当初辛毗跟随其兄事袁绍。曹操任司空时征召辛毗他不受命。官渡战后辛毗事袁绍的儿子袁谭。公元204年曹操攻下邺城上表推荐辛毗任议郎后为丞相长史。公元220年曹丕即皇帝位以辛毗为侍中赐爵关内侯后赐广平亭侯。魏明帝即位封辛毗颍乡侯食邑三百户后为卫尉。公元234年诸葛亮屯兵渭南司马懿上表魏明帝。魏明帝任辛毗为大将军军师加使持节号。诸葛亮病逝后辛毗返回仍任卫尉。不久逝世谥肃侯。',
zhangchangpu:"钟会的母亲。《母夫人张氏传》:夫人张氏,字昌蒲,太原兹氏人,太傅定陵成侯之命妇也。",
xugong:"许贡是东汉末官吏。先后任吴郡都尉、太守欲送密信给曹操要曹操注意孙策却被孙策发现而被杀。许贡生前招揽了一些门客当中有三人不忘故主千方百计想要手刃仇人。建安五年公元200年广陵太守陈登派人秘密联系孙策治下的山贼余党企图颠覆孙策在江东的统治。孙策决定讨伐陈登行军到丹徒时许贡门客终于找到了机会。因为孙策有单骑出猎在野外思考的习惯三门客趁孙策轻装外出打猎时放冷箭射中孙策面颊。这些门客后来在与孙策的搏斗中被赶到的侍卫杀死。孙策此后因为伤口感染并且俊美的容貌被毁终于不治身亡去世时年仅26岁。",
mangyachang:"南蛮王孟获的部将,使一口截头大刀,骑一匹黄骠马。率军与蜀军交战,战败王平。后被平北将军马岱斩杀。只出现在《三国演义》里,正史中无此人。",
liuzan:'字正明会稽长山人人曾任左护军有两子留略、留平。少为会稽郡吏曾参与镇压黄巾起义后被东吴大将凌统所引用任屯骑校尉。吴五凤二年公元255年留赞任左护军随孙峻征淮南因病撤军被魏将蒋班围困于道力战而死时年73岁。',
zhujun:'朱儁195年字公伟。会稽郡上虞县今浙江绍兴上虞区人。东汉末年名将。朱儁出身寒门赡养母亲以好义轻财闻名受乡里敬重。后被太守徐珪举为孝廉任兰陵令颇有治绩。再升任交州刺史以家兵五千大破叛军平定交州。战后以功封都亭侯入朝为谏议大夫。光和七年184年黄巾起义爆发朱儁以右中郎将、持节平定三郡之地以功进封西乡侯迁镇贼中郎将。又率军讨平黄巾“威声满天下”。中平二年185年进拜右车骑将军更封钱塘侯。后为河内太守击退进逼的张燕。权臣董卓秉政时想任朱儁为副手遭其婉拒。其后出逃荆州更屯军中牟徐州刺史陶谦等欲推举他为太师并传檄各州牧伯相邀讨伐李傕、奉迎天子。但朱儁却奉诏入京任太仆。初平三年192年升任太尉、录尚书事。兴平元年194年行骠骑将军事持节镇关东因故未成行。兴平二年195年李傕与郭汜相互攻杀郭汜扣留朱儁作为人质。朱儁性格刚烈即日发病而死。',
@ -9976,7 +10258,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
zhangmiao:'张邈195年字孟卓东平寿张今山东东平县人。东汉大臣、名士“八厨”之一。举孝廉出身授骑都尉出任陈留太守。参与讨伐董卓参加汴水之战归附于曹操。兴平元年194年趁着曹操讨伐徐州牧陶谦联合陈宫发动叛乱迎立吕布为兖州牧。受到曹操讨伐兵败投奔徐州牧刘备。兴平二年张邈向袁术借兵途中被部下所杀。',
duanwei:'段煨209年字忠明武威郡姑臧今甘肃省武威市人也。东汉末年将领东汉太尉段颎同族兄弟与太尉贾诩、张济、宣威侯张绣乃是同乡。原为董卓帐下将领奉命屯兵华阴勤劳农业。兴平二年195年迎接汉献帝刘协东归洛阳供给衣食补给与护驾将领杨定不和引发激战十余天听从汉献帝刘协劝解。东汉建安三年198年攻打黄白城击杀李傕夷其三族封为镇远将军、闅乡亭侯、北地太守累迁大鸿胪、金光禄大夫。建安十四年209年寿终正寝。',
zhangheng:'张横生卒年不详武威郡姑臧人东汉末年凉州军阀之一。与梁兴、贾诩、段煨乃是同乡。建安三年198张横与梁兴、段煨等斩杀李傕。十六年211同韩遂、马超联合起兵反抗曹操兵败后不知所终。',
tangji:'唐姬,会稽太守唐瑁女,弘农怀王刘辩的妃子。刘辩死后,唐姬回归故里,因节烈不愿改嫁他人,后被汉献帝下诏封为弘农王妃。',
wenqin:'文钦(?~258年字仲若沛国谯郡今安徽省亳州市三国时期曹魏将领曹操部将文稷之子。魏明帝太和年间文钦任牙门将、五营校督后拜庐江太守、冠军将军嘉平元年249年曹爽及其同党在高平陵之变中被杀文钦心中不安执政的司马氏集团为了安抚文钦升其为前将军、扬州刺史任职期间结交镇东将军毌丘俭。击退吴国太傅诸葛恪进攻取得一定战果。正元二年255年文钦与镇东将军毌丘俭在扬州起兵讨伐司马师兵败后投奔吴国被封为镇北大将军、幽州牧封谯侯。甘露二年257年文钦随吴军援救起兵反抗司马氏的诸葛诞此后因被司马昭大军围困军情告急文钦与诸葛诞本就有矛盾对文钦日益不满的诸葛诞遂将文钦杀死。淮南平定之后文钦遗体被其二子收敛安葬。',
qiuliju:'丘力居,东汉末年的辽西乌丸大人。拉拢中山太守张纯反叛东汉,寇略青、徐、幽、冀四州,杀略吏民。死时认为儿子楼班年幼,于是让从子蹋顿总摄三王部。',
liuba:'刘巴222年字子初荆州零陵郡烝阳县今湖南省衡阳县、邵东县一带东汉末年至三国时期蜀汉时期官员、名士。刘巴少知名荆州牧刘表多次征用推举刘巴均不应就。曹操征伐荆州荆州士人多归刘备刘巴却北上投靠曹操。后受曹操命令招降荆南三郡不料先为刘备所得刘巴不能复命曹操遂远至交趾又辗转进入益州。刘备平定益州后刘巴归附刘备为左将军西曹掾法正死后接任尚书令。章武二年222年去世。刘巴博学多才为刘备解决入蜀后的财政困难问题又与诸葛亮等共制蜀汉的法律文件《蜀科》。为人简朴清高退无私交曹魏大臣陈群甚敬重之。所著录于《刘令君集》。',
@ -10006,12 +10287,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){
guānning:'关宁,《三国演义》的虚构人物,为关定之子,关平的哥哥,学文。关羽前往冀州寻找刘备时曾居于关定庄,关定命关宁、关平二子出拜。后关羽同刘备回到关定庄时,关羽向刘备介绍关宁、关平二人,关定即提出让关平拜关羽为义父。',
mushun:'穆顺,小说《三国演义》中的人物,男,东汉末宦官。献帝欲修书与国舅伏完,共谋图曹公。因顺为宦官中之忠义可托者,乃命顺往送书。顺藏书于发中,潜出禁宫,径至完宅,将书呈上。及完回书付顺,顺乃藏于头髻内,辞完回宫。然公闻信,先于宫门等候,顺回遇公,公喝左右,遍搜身上,并无夹带,放行。忽然风吹落其帽。公又唤回,取帽视之,遍观无物,还帽令戴。顺双手倒戴其帽。公心疑,令左右搜其头发中,搜出伏完书来。公见书大怒,执下顺于密室问之,顺不肯招。当晚将顺、完等宗族二百余口,皆斩于市。',
jsp_guanyu:'关羽,字云长。曾水淹七军、擒于禁、斩庞德、威震华夏,吓得曹操差点迁都躲避,但是东吴偷袭荆州,关羽兵败被害。后传说吕蒙因关羽之魂索命而死。',
liuling:'刘伶约221年-约300年字伯伦西晋沛国治今安徽濉溪县西北竹林七贤之一中国魏晋时期作家名士。<br>刘伶自幼便失去了父爱因其父亲身材矮小及至长大成人后刘伶身高也不过六尺。魏齐王曹芳正始之末249年刘伶已成为当世名重一时的名士并且常与嵇康、阮籍、阮咸集会于山阳竹林之下饮酒赋诗弹琴作歌。晋武帝司马炎泰始初年265年前后曾做过一段时间的建威参军不久朝廷下诏入宫中策问。他大谈老庄强调无为而治非但没有得到重用反而连参军之职也被罢免了从此再无仕进。晋惠帝司马衷永康元年300年前后以寿而终。<br>刘伶有“品酒第一人”的美称,也被酒行业传颂至今,后人以古瀑河边上的井水酿酒,还取刘伶墓地的黄土垒成窖池酿酒,为了纪念刘伶,当地百姓也将“润泉涌”更名为“刘伶醉”。其传世作品仅有《酒德颂》《北芒客舍》两篇,其中《酒德颂》所表现出的藐视一切存在的气概,敌视礼教之士的反抗精神,既高扬了人格的力量,批判了当时的黑暗政治,同时也抒发了压抑的愤世之情,充满了浪漫色彩,气魄豪迈,用辞又骈偶间行,有无意追求而自至的特点,对后代影响极大。',
},
characterTitle:{
chunyuqiong:'#b对决限定武将',
sp_xuyou:'#g4v4限定武将',
},
perfectPair:{},
characterFilter:{
chunyuqiong:function(mode){
return mode!='identity'&&mode!='guozhan';
@ -10600,12 +10881,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dcjuexiang_info:'当你死亡时杀死你的角色弃置其装备区内的所有牌并失去1点体力然后你可以令一名其他角色获得〖残韵〗。',
dccanyun:'残韵',
dccanyun_info:'每名角色限一次。出牌阶段你可以弃置一张牌并选择一名其他角色然后若其装备区里的牌数小于你其回复1点体力大于你其失去1点体力等于你其摸一张牌。若你的体力值为1你摸一张牌。',
mp_liuling:'刘伶',
mpjiusong:'酒颂',
mpjiusong_info:'当一名角色使用【酒】时你获得1枚“醉”标记“醉”数至多为3。',
mpmaotao:'酕醄',
mpmaotao_info:'当其他角色使用牌指定唯一目标时你可以移去1枚“醉”令此牌的目标改为随机一名合法角色无距离限制。若目标角色与原目标相同你从牌堆中获得一张【酒】。',
mpbishi:'避世',
mpbishi_info:'锁定技。你不能成为伤害类锦囊牌的目标。',
star_caoren:'星曹仁',
star_caoren_prefix:'星',
starsujun:'肃军',
starsujun_info:'当你使用一张牌时,若你手牌中的基本牌和非基本牌的牌数相等,你可以摸两张牌。',
starlifeng:'砺锋',
starlifeng_info:'你可以将一张本回合未有角色使用过的颜色的手牌当做不计入次数的【杀】或【无懈可击】使用。',
star_yuanshu:'星袁术',
star_yuanshu_prefix:'星',
starcanxi:'残玺',
starcanxi_wangsheng:'妄生',
starcanxi_xiangsi:'向死',
starcanxi_cancel:'向死',
starcanxi_info:'锁定技。游戏开始时,你获得场上所有角色的势力对应的“玺角”标记,然后选择一个“玺角”对应势力并选择以下一项;一轮开始时,你选择一个“玺角”对应势力并选择以下一项:①妄生:本轮被选择势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1②向死本轮其他被选择势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效。',
starpizhi:'圮秩',
starpizhi_info:'锁定技。①一名角色死亡后若你拥有该角色对应的“玺角”标记你失去之并摸X张牌。②结束阶段你摸X张牌。X为你本局游戏失去的“玺角”标记数',
starzhonggu:'冢骨',
starzhonggu_info:'主公技,锁定技。摸牌阶段,若游戏轮数大于等于场上的群势力角色数,则你额外摸两张牌,否则你少摸一张牌。',
sp_whlw:"文和乱武",
sp_zlzy:"逐鹿中原",
@ -10625,6 +10924,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp_danqi:'千里单骑',
sp_star:'将星系列',
sp_decade:'其他新服武将',
mini_qixian:'小程序·竹林七贤',
},
pinyins:{
卑弥呼:['Himiko']

View File

@ -1114,9 +1114,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
paoxiao:{
audio:2,
firstDo:true,
audioname2:{old_guanzhang:'old_fuhun'},
audioname:['re_zhangfei','guanzhang','xiahouba'],
audioname2:{
audioname2: {
old_guanzhang:'old_fuhun',
dc_xiahouba:'paoxiao_xiahouba',
},
trigger:{player:'useCard1'},

View File

@ -5351,7 +5351,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
for(j=0;j<storage[i].handcards2.length;j++){
if(storage[i].handcards2[j].parentNode==ui.discardPile||
storage[i].handcards2[j].parentNode==ui.cardPile){
storage[i].handcards2[j].parentNode==ui.cardPile){
player.node.handcards2.appendChild(storage[i].handcards2[j]);
}
else{
@ -5360,7 +5360,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
for(j=0;j<storage[i].equips.length;j++){
if(storage[i].equips[j].parentNode==ui.discardPile||
storage[i].equips[j].parentNode==ui.cardPile){
storage[i].equips[j].parentNode==ui.cardPile){
storage[i].equips[j].style.transform='';
player.$equip(storage[i].equips[j]);
}

View File

@ -12,7 +12,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
tw_yunchouyong:['tw_zongyu','tw_chendong','tw_sunyi'],
tw_yunchouyan:['tw_jiangqing'],
tw_zhu:['tw_beimihu','tw_ol_sunjian','ol_liuyu','tw_menghuo'],
tw_swordsman:['xia_xushu','xia_wangyue','xia_liyàn','xia_tongyuan','xia_lusu','xia_dianwei','xia_zhaoe','xia_xiahouzie'],
tw_swordsman:['xia_liubei','xia_xiahousone','xia_xiahoudun','xia_zhangwei','xia_xushu','xia_wangyue','xia_liyàn','xia_tongyuan','xia_lusu','xia_dianwei','xia_zhaoe','xia_xiahouzie'],
tw_mobile:['nashime','tw_gexuan','tw_zhugeguo'],
tw_mobile2:['tw_chengpu','tw_guohuai','old_quancong','tw_caoxiu','tw_guanqiujian','tw_re_fazheng','tw_madai','tw_zhangfei','tw_guyong','tw_handang','tw_xuezong','tw_yl_luzhi'],
tw_yijiang:['tw_caoang','tw_caohong','tw_zumao','tw_dingfeng','tw_maliang','tw_xiahouba'],
@ -20,6 +20,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
character:{
xia_liubei:['male','shu',4,['twshenyi','twxinghan']],
xia_xiahousone:['female','qun',3,['twchengxi']],
xia_xiahoudun:['male','qun',4,['twdanlie']],
xia_zhangwei:['female','qun',3,['twhuzhong','twfenwang']],
tw_zhanghong:['male','wu',3,['twquanqian','twrouke']],
tw_zhangzhao:['male','wu',3,['twlijian','twchungang']],
tw_ol_sunjian:['male','wu','4/5',['gzyinghun','wulie','twpolu'],['zhu']],
@ -123,6 +127,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
kaisa:["male","western",4,["zhengfu"]],
},
characterIntro:{
xiahousone:'夏侯子萼,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为在貂蝉不在时血婆娑的实际首领。在海外服中,设定为夏侯惇的养女,继承了夏侯紫萼的血婆娑,之后“夏侯紫萼”这个名字就被隐匿于历史之中,而“夏侯子萼”则成为了血婆娑的首领“血蔷薇”的固定名号。',
zhangwei:'张葳,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为被夏侯子萼救下后加入的血婆娑成员。在海外服中,设定为张奂的养女,张奂为宦官迫害时与其失散,为神秘女子所救并学得武艺,后与夏侯紫萼一起建立血婆娑。在李儒分成时为了保护百姓而牺牲。',
nashime:'难升米(なしめ,或なんしょうまい)是倭国大夫。景初二年六月,受女王卑弥呼之命,与都市牛利出使魏国,被魏国拜为率善中郎将。',
jiachong:'贾充217年—282年字公闾平阳襄陵今山西襄汾三国曹魏至西晋时期大臣曹魏豫州刺史贾逵之子。西晋王朝的开国元勋。出身平阳贾氏。曾参与镇压淮南二叛和弑杀魏帝曹髦因此深得司马氏信任其女儿贾褒一名荃及贾南风分别嫁予司马炎弟司马攸及次子司马衷与司马氏结为姻亲地位显赫。晋朝建立后转任车骑将军、散骑常侍、尚书仆射后升任司空、太尉等要职。更封鲁郡公。咸宁末为使持节、假黄钺、大都督征讨吴国。吴国平定后增邑八千户。太康三年282年贾充去世。西晋朝廷追赠他为太宰礼官议谥曰荒司马炎不采纳改谥为武。有集五卷。',
duosidawang:'朵思大王是《三国演义》中人物,南蛮秃龙洞的元帅,孟获弟弟孟优的朋友,据说是南蛮第一智者。',
@ -278,6 +284,526 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
},
skill:{
//夏侯惇
twdanlie:{
audio:2,
enable:'phaseUse',
filter:function(event,player){
return game.hasPlayer(target=>player.canCompare(target));
},
filterTarget:function(card,player,target){
return player.canCompare(target);
},
usable:1,
selectTarget:[1,3],
multitarget:true,
multiline:true,
group:'twdanlie_add',
content:function(){
'step 0'
player.chooseToCompare(targets).setContent('chooseToCompareMeanwhile');
'step 1'
if(result.winner&&result.winner==player){
player.line(targets);
targets.forEach(target=>target.damage());
}
else player.loseHp();
},
ai:{
order:10,
result:{
target:function(player,target){
var att=get.attitude(player,target);
if(att>=0) return 0;
if(player.getHp()>2) return -get.damageEffect(target,player,player)-10/target.countCards('h');
var hs=player.getCards('h').sort((a,b)=>b.number-a.number);
var ts=target.getCards('h').sort((a,b)=>b.number-a.number);
if(!hs.length||!ts.length) return 0;
if(Math.min(13,hs[0].number+player.getDamagedHp())>ts[0].number) return -get.damageEffect(target,player,player);
return 0;
},
},
},
subSkill:{
add:{
audio:'twdanlie',
trigger:{player:'compare',target:'compare'},
filter:function(event,player){
if(!player.isDamaged()) return false;
if(player!=event.target&&event.iwhile) return false;
return true;
},
forced:true,
locked:false,
content:function(){
var num=player.getDamagedHp();
if(player==trigger.player){
trigger.num1+=num;
if(trigger.num1>13) trigger.num1=13;
}
else{
trigger.num2+=num;
if(trigger.num2>13) trigger.num2=13;
}
game.log(player,'的拼点牌点数+',num);
},
},
},
},
//张葳
twhuzhong:{
audio:2,
trigger:{player:'useCardToPlayer'},
filter:function(event,player){
return event.card.name=='sha'&&!game.hasNature(event.card,'linked')&&event.targets.length==1&&player.isPhaseUsing()&&((player.countCards('h')&&game.hasPlayer(target=>!event.targets.includes(target)&&player.canUse(event.card,target)))||event.target.countCards('h')>0);
},
direct:true,
content:function(){
'step 0'
var target=trigger.target;
event.target=target;
var list=['cancel2'];
var choiceList=[
'弃置一张手牌,令此【杀】可以额外指定一个目标',
'令其弃置一张手牌若此【杀】造成伤害则你摸一张牌且本阶段可以额外使用一张【杀】若此【杀】未造成伤害你受到其对你造成的1点伤害',
];
if(target.countCards('h')) list.unshift('其弃置');
else choiceList[1]='<span style="opacity:0.5">'+choiceList[1]+'</span>';
if(player.countCards('h')&&game.hasPlayer(targetx=>!trigger.targets.includes(targetx)&&player.canUse(trigger.card,targetx))) list.unshift('你弃置');
else choiceList[0]='<span style="opacity:0.5">'+choiceList[0]+'</span>';
player.chooseControl(list).set('choiceList',choiceList).set('ai',()=>{
var controls=_status.event.controls;
var trigger=_status.event.getTrigger();
var player=trigger.player;
var target=trigger.target;
if(controls.contains('其弃置')&&_status.event.goon) return '其弃置';
if(controls.contains('你弃置')){
if(game.hasPlayer(targetx=>!trigger.targets.includes(targetx)&&player.canUse(trigger.card,targetx)&&get.effect(targetx,trigger.card,player,player)>0)) return '你弃置';
}
return 'cancel2';
}).set('goon',function(){
var d1=true;
if(player.hasSkill('jueqing')||player.hasSkill('gangzhi')) d1=false;
if(!target.mayHaveShan()||player.hasSkillTag('directHit_ai',true,{
target:target,
card:trigger.card,
},true)){
if(!target.hasSkill('gangzhi')) d1=false;
if(!target.hasSkillTag('filterDamage',null,{
player:player,
card:trigger.card,
})&&get.attitude(player,target)<0) return true;
}
if(d1) return get.damageEffect(player,player,player)>0;
return false;
}());
'step 1'
if(result.control!='cancel2'){
player.logSkill('twhuzhong',target);
if(result.control=='其弃置'){
target.chooseToDiscard('h',true);
player.when('useCardAfter').filter(evt=>evt==trigger.getParent()).then(()=>{
if(player.getHistory('sourceDamage',evt=>evt.card==trigger.card).length){
player.draw();
player.addTempSkill('twhuzhong_sha','phaseUseAfter');
player.addMark('twhuzhong_sha',1,false);
}
else{
target.line(player);
player.damage(1,target);
}
}).vars({target:target});
event.finish();
}
else{
player.chooseToDiscard('h',true);
player.chooseTarget('请选择'+get.translation(trigger.card)+'的额外目标',function(card,player,target){
var trigger=_status.event.getTrigger();
return !trigger.targets.includes(target)&&player.canUse(trigger.card,target);
}).set('ai',function(target){
var player=_status.event.player;
var trigger=_status.event.getTrigger();
return get.effect(target,trigger.card,player,player);
});
}
}
else event.finish();
'step 2'
if(result.bool){
player.line(result.targets);
trigger.getParent().targets.addArray(result.targets);
game.log(result.targets,'成为了',trigger.card,'的额外目标');
}
},
subSkill:{
sha:{
charlotte:true,
onremove:true,
mod:{
cardUsable:function(card,player,num){
if(card.name=='sha') return num+player.countMark('twhuzhong_sha');
},
},
}
}
},
twfenwang:{
audio:2,
trigger:{source:'damageBegin2',player:'damageBegin4'},
filter:function(event,player,name){
if(name=='damageBegin2'){
return !event.hasNature()&&player.countCards('h')>event.player.countCards('h');
}
return event.hasNature();
},
forced:true,
content:function(){
'step 0'
if(event.triggername=='damageBegin2'){
player.line(trigger.player);
trigger.num++;
event.finish();
}
else player.chooseToDiscard('h','弃置一张手牌,或令此伤害+1').set('ai',function(card){
return 8-get.value(card);
});
'step 1'
if(!result.bool) trigger.num++;
},
},
//夏侯子萼
//差点和夏侯紫萼搞混
twchengxi:{
audio:2,
enable:'phaseUse',
filter:function(event,player){
return game.hasPlayer(target=>lib.skill.twchengxi.filterTarget(null,player,target));
},
filterTarget:function(card,player,target){
if(player.getStorage('twchengxi_used').contains(target)||target==player) return false;
return !player.hasSkillTag('noCompareSource')&&target.countCards('h')>0&&!target.hasSkillTag('noCompareTarget');
},
content:function(){
'step 0'
if(!player.storage.twchengxi_used){
player.when('phaseUseAfter').then(()=>delete player.storage.twchengxi_used);
}
player.markAuto('twchengxi_used',[target]);
player.draw();
'step 1'
if(player.canCompare(target)) player.chooseToCompare(target);
else event.finish();
'step 2'
if(result.bool){
player.addSkill('twchengxi_effect');
}
else{
var card={name:'sha',isCard:true};
if(target.canUse(card,player,false)) target.useCard(card,player,false);
}
},
ai:{
order:8,
result:{
target:function(player,target){
if(player.hasSkill('twchengxi_effect')) return 0;
var hs=player.getCards('h').sort((a,b)=>b.number-a.number);
var ts=target.getCards('h').sort((a,b)=>b.number-a.number);
if(!hs.length||!ts.length) return 0;
if(hs[0].number>ts[0].number) return -3;
if(!target.canUse({name:'sha',isCard:true},player,false)) return -1;
return 0;
},
},
},
subSkill:{
effect:{
charlotte:true,
trigger:{player:'useCard1'},
filter:function(event,player){
return get.type(event.card)=='basic'||get.type(event.card)=='trick';
},
forced:true,
popup:false,
content:function(){
player.removeSkill('twchengxi_effect');
player.when('useCardAfter').filter(evt=>evt==trigger).then(()=>{
if(trigger.targets){
var card={
name:trigger.card.name,
isCard:true,
};
var targets=trigger.targets.filter(i=>i.isIn()&&player.canUse(card,i,false));
if(targets.length) player.useCard(card,targets,false);
}
});
},
mark:true,
marktext:'袭',
intro:{content:'使用的下一张基本牌或非延时锦囊牌结算完毕后视为对相同目标再使用一张无次数限制的同名牌'},
},
},
},
//侠刘备
twshenyi:{
audio:2,
trigger:{global:'damageEnd'},
filter:function(event,player){
if(!event.player.isIn()) return false;
if(event.player.getHistory('damage').indexOf(event)!=0) return false;
return event.player==player||player.inRange(event.player);
},
usable:1,
direct:true,
content:function(){
'step 0'
var list=get.inpileVCardList(info=>{
return ['basic','trick','delay'].includes(info[0])&&!player.getStorage('twshenyi').includes(info[2]);
});
var dialog=[`###${get.prompt('twshenyi',trigger.player)}###<div class="text center">从牌堆中将一张牌作为“侠义”置于武将牌上${player!=trigger.player&&player.countCards('h')?',然后将所有手牌交给其':''}</div>`,[list,'vcard']];
player.chooseButton(dialog).set('ai',function(button){
var trigger=_status.event.getTrigger();
var player=_status.event.player,name=button.link[2];
if(get.attitude(player,trigger.player)<=0) return 0;
if(!get.cardPile2(card=>card.name==name)) return 0;
var value=get.value({name:name});
if(['tao','jiu','caochuan','wuxie'].includes(name)&&get.event().getRand()>0.4) return value*2;
return value;
});
'step 1'
if(result.bool){
var name=result.links[0][2],nature=result.links[0][3];
var cardx={name:name,nature:nature};
player.logSkill('twshenyi',trigger.player);
player.popup(cardx);
player.markAuto('twshenyi',[name]);
game.log(player,'声明了',`#y${get.translation(cardx)}`);
var card=get.cardPile2(card=>get.name(card,false)==name&&get.nature(card,false)==nature);
if(card) player.addToExpansion([card],'gain2').gaintag.add('twshenyi');
else{
player.chat('无牌可得?!');
game.log('但是牌堆中已经没有','#y'+get.translation(name),'了!');
}
if(trigger.player!=player&&player.countCards('h')){
game.delayex();
var skill='twshenyi_'+player.playerid;
game.broadcastAll(lib.skill.twshenyi.createGainTag,skill,player.name);
game.addVideo('skill',player,['twshenyi',[skill,player.name]]);
player.give(player.getCards('h'),trigger.player).gaintag.add(skill);
player.addSkill('twshenyi_draw');
}
}
else player.storage.counttrigger.twshenyi--;
},
video:(player,info)=>lib.skill.twshenyi.createGainTag(info[0],info[1]),
createGainTag:function(skill,name){
if(!lib.skill[skill]){
lib.skill[skill]={charlotte:true};
lib.translate[skill]='义·'+get.translation(name);
}
if(!_status.postReconnect.twshenyi){
_status.postReconnect.twshenyi=[
lib.skill.twshenyi.createGainTag,[],[]
];
}
_status.postReconnect.twshenyi[1].add(skill);
_status.postReconnect.twshenyi[2].add(name);
},
marktext:'义',
intro:{
name:'侠义',
content:'expansion',
markcount:'expansion',
},
onremove:function(player,skill){
delete player.storage[skill];
//var cards=player.getExpansions(skill);
//if(cards.length) player.loseToDiscardpile(cards);
},
subSkill:{
draw:{
charlotte:true,
audio:'twshenyi',
trigger:{
global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'],
},
filter:function(event,player){
var skill='twshenyi_'+player.playerid;
return game.hasPlayer(target=>{
var evt=event.getl(target);
if(!evt||!evt.hs||!evt.hs.length) return false;
for(let i in evt.gaintag_map){
if(evt.gaintag_map[i].includes(skill)) return true;
}
return false;
});
},
forced:true,
direct:true,
content:function(){
var skill='twshenyi_'+player.playerid;
var num=0;
var targets=game.filterPlayer(target=>{
var evt=trigger.getl(target);
var numx=0;
if(!evt||!evt.hs||!evt.hs.length) return false;
for(var i in evt.gaintag_map){
if(evt.gaintag_map[i].includes(skill)) numx++;
}
if(numx>0) return num+=numx;
return false;
});
if(num>0){
player.logSkill('twshenyi_draw',targets);
player.draw(num);
}
},
},
},
},
twxinghan:{
audio:2,
trigger:{player:'phaseZhunbeiBegin'},
filter:function(event,player){
return player.getExpansions('twshenyi').length>game.countPlayer();
},
check:function(event,player){
if(player.hp>=3||(player.countCards('h')>=4&&player.getExpansions('twshenyi').every(card=>!player.hasValueTarget(card)||!get.tag(card,'damage')||!lib.skill.xunshi.isXunshi(card)))) return false;
return player.getExpansions('twshenyi').some(card=>player.hasValueTarget(card));
},
direct:true,
content:function*(event,map){
var player=map.player;
var result=yield player.chooseBool().set('createDialog',[
get.prompt('twxinghan'),
`<div class="text center">按顺序使用以下“侠义”牌。但是回合结束时你须弃置所有手牌并失去X点体力X为你的体力值-1且X至少为1</div>`,
player.getExpansions('twshenyi').filter(card=>player.hasUseTarget(card)).reverse(),
'hidden',
]).set('choice',lib.skill.twxinghan.check(null,player));
if(!result.bool){
event.finish();
return;
}
while(true){
var cards=player.getExpansions('twshenyi').filter(card=>player.hasUseTarget(card)).reverse();
if(!cards.length) break;
yield player.chooseUseTarget(true,cards[0],false);
}
player.when('phaseEnd').then(()=>{
if(player.countCards('h')) player.chooseToDiscard(player.countCards('h'),true);
var num=Math.max(1,player.getHp()-1);
player.loseHp(num);
});
},
group:'twxinghan_init',
subSkill:{
init:{
audio:'twxinghan',
trigger:{
player:['loseEnd','dying','die','dyingAfter'],
global:['equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'],
},
filter:function(event,player){
return (player.getExpansions('twshenyi').length&&event.name!='die'&&(!player.countCards('h')||player.isDying()))^player.hasSkill('twxinghan_in');
},
forced:true,
firstDo:true,
silent:true,
forceDie:true,
content:function(){
if(player.getExpansions('twshenyi').length&&trigger.name!='die'&&(!player.countCards('h')||player.isDying())){
var cards=player.getExpansions('twshenyi');
var cardsx=cards.map(card=>{
var cardx=ui.create.card();
cardx.init(get.cardInfo(card));
cardx._cardid=card.cardid;
return cardx;
});
player.directgains(cardsx,null,'twxinghan');
player.addSkill('twxinghan_in');
}
else player.removeSkill('twxinghan_in');
},
},
in:{
charlotte:true,
audio:'twxinghan',
trigger:{player:'addToExpansionEnd'},
filter:function(event,player){
return event.gaintag.contains('twshenyi');
},
forced:true,
locked:false,
silent:true,
content:function(){
'step 0'
var cards2=player.getCards('s',card=>card.hasGaintag('twxinghan'));
if(player.isOnline2()){
player.send(function(cards,player){
cards.forEach(i=>i.delete());
if(player==game.me) ui.updatehl();
},cards2,player);
}
cards2.forEach(i=>i.delete());
if(player==game.me) ui.updatehl();
'step 1'
var cards=player.getExpansions('twshenyi');
var cardsx=cards.map(card=>{
var cardx=ui.create.card();
cardx.init(get.cardInfo(card));
cardx._cardid=card.cardid;
return cardx;
});
player.directgains(cardsx,null,'twxinghan');
},
onremove:function(player){
var cards2=player.getCards('s',card=>card.hasGaintag('twxinghan'));
if(player.isOnline2()){
player.send(function(cards,player){
cards.forEach(i=>i.delete());
if(player==game.me) ui.updatehl();
},cards2,player);
}
cards2.forEach(i=>i.delete());
if(player==game.me) ui.updatehl();
},
group:'twxinghan_use',
},
use:{
charlotte:true,
trigger:{player:['useCardBefore','respondBefore']},
filter:function(event,player){
var cards=player.getCards('s',card=>card.hasGaintag('twxinghan')&&card._cardid);
return event.cards&&event.cards.some(card=>{
return cards.includes(card);
});
},
forced:true,
popup:false,
firstDo:true,
content:function(){
var idList=player.getCards('s',card=>card.hasGaintag('twxinghan')).map(i=>i._cardid);
var cards=player.getExpansions('twshenyi');
var cards2=[];
for(var card of trigger.cards){
var cardx=cards.find(cardx=>cardx.cardid==card._cardid);
if(cardx) cards2.push(cardx);
}
var cards3=trigger.cards.slice();
trigger.cards=cards2;
trigger.card.cards=cards2;
if(player.isOnline2()){
player.send(function(cards,player){
cards.forEach(i=>i.delete());
if(player==game.me) ui.updatehl();
},cards3,player);
}
cards3.forEach(i=>i.delete());
if(player==game.me) ui.updatehl();
},
},
},
},
//张纮
twquanqian:{
audio:2,
@ -462,10 +988,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
switch(get.sgn(att)){
case 1:
return [cards,[]];
break;
case 0:
return [cardx,cardy];
break;
case -1:
var num=Math.ceil(cards.length/2)+(cards.length%2==0?1:0);
if(num>1&&player.hasSkill('twchungang')) num--;
@ -475,7 +999,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
cardy.sort((a,b)=>get.value(b)-get.value(a));
cardx.addArray(cardy.slice(num,cardy.length));
return [cardx,cardy.slice(0,num)];
break;
}
}).set('cards',cards);
'step 1'
@ -5226,7 +5749,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return false;
});
},
direct:true,
content:function(){
'step 0'
var target=lib.skill.twenyuan1.logTarget(trigger,player)[0];
@ -5508,7 +6030,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
})){
event.finish();
return;
};
}
player.chooseTarget(get.prompt('twzhengrong'),'将一名其他角色的一张牌置于武将牌上,称为“荣”',function(card,player,target){
return target!=player&&target.countCards('he');
}).set('ai',function(target){
@ -5937,7 +6459,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.addToExpansion(result.cards[0],'log','give',player).gaintag.add('twmingren');
var card=player.getExpansions('twmingren')[0];
if(card) player.gain(card,'gain2');
};
}
},
},
},
@ -8329,7 +8851,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return 6+get.effect(player,card,target,target);
}
return get.effect(target,{name:'guohe_copy2'},player,player)/2+get.effect(target,card,player,player);
});;
});
'step 1'
if(result.bool){
event.targets=result.targets;
@ -9251,42 +9773,42 @@ game.import('character',function(lib,game,ui,get,ai,_status){
mod:{
cardEnabled:function(card,player){
if(game.hasPlayer(function(current){
var list=current.storage.twgongsun_shadow;
if(!list) return false;
for(var i=0;i<list.length;i++){
if(list[i][0]==player&&list[i][1]==card.suit) return true;
}
return false;
var list=current.storage.twgongsun_shadow;
if(!list) return false;
for(var i=0;i<list.length;i++){
if(list[i][0]==player&&list[i][1]==card.suit) return true;
}
return false;
})) return false;
},
cardSavable:function(card,player){
if(game.hasPlayer(function(current){
var list=current.storage.twgongsun_shadow;
if(!list) return false;
for(var i=0;i<list.length;i++){
if(list[i][0]==player&&list[i][1]==card.suit) return true;
}
return false;
var list=current.storage.twgongsun_shadow;
if(!list) return false;
for(var i=0;i<list.length;i++){
if(list[i][0]==player&&list[i][1]==card.suit) return true;
}
return false;
})) return false;
},
cardRespondable:function(card,player){
if(game.hasPlayer(function(current){
var list=current.storage.twgongsun_shadow;
if(!list) return false;
for(var i=0;i<list.length;i++){
if(list[i][0]==player&&list[i][1]==card.suit) return true;
}
return false;
var list=current.storage.twgongsun_shadow;
if(!list) return false;
for(var i=0;i<list.length;i++){
if(list[i][0]==player&&list[i][1]==card.suit) return true;
}
return false;
})) return false;
},
cardDiscardable:function(card,player){
if(game.hasPlayer(function(current){
var list=current.storage.twgongsun_shadow;
if(!list) return false;
for(var i=0;i<list.length;i++){
if(list[i][0]==player&&list[i][1]==card.suit) return true;
}
return false;
var list=current.storage.twgongsun_shadow;
if(!list) return false;
for(var i=0;i<list.length;i++){
if(list[i][0]==player&&list[i][1]==card.suit) return true;
}
return false;
})) return false;
},
},
@ -9867,8 +10389,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player.logSkill('twfenghan',targets);
if(targets.length>1) game.asyncDraw(targets);
else{
targets[0].draw();
event.finish();
targets[0].draw();
event.finish();
}
}
else{
@ -10249,20 +10771,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){
});
},
content:function(){
'step 0'
player.chooseTarget(lib.skill.twfuzuan.filterTarget,get.prompt('twfuzuan'),'变更一名角色的一个转换技的状态').set('ai',function(target){
var player=_status.event.player;
return get.effect(target,'twfuzuan',player,player);
});
'step 1'
if(result.bool){
var target=result.targets[0];
player.logSkill('twfuzuan',target);
var next=game.createEvent('twfuzuan');
next.player=player;
next.target=target;
next.setContent(lib.skill.twfuzuan.content);
}
'step 0'
player.chooseTarget(lib.skill.twfuzuan.filterTarget,get.prompt('twfuzuan'),'变更一名角色的一个转换技的状态').set('ai',function(target){
var player=_status.event.player;
return get.effect(target,'twfuzuan',player,player);
});
'step 1'
if(result.bool){
var target=result.targets[0];
player.logSkill('twfuzuan',target);
var next=game.createEvent('twfuzuan');
next.player=player;
next.target=target;
next.setContent(lib.skill.twfuzuan.content);
}
},
},
},
@ -10702,7 +11224,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
content:function(storage){
if(storage){
return '经过'+storage[1]+'个“回合结束时”后,若有“示”,则从牌堆中获得'+storage[0]+'张和“示”名称相同的牌';
return '经过'+storage[1]+'个“回合结束时”后,若有“示”,则从牌堆中获得'+storage[0]+'张和“示”名称相同的牌';
}
return '未指定施法效果';
},
@ -10876,7 +11398,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
content:function(storage){
if(storage){
return '经过'+storage[1]+'个“回合结束时”后,回复'+storage[0]+'点体力';
return '经过'+storage[1]+'个“回合结束时”后,回复'+storage[0]+'点体力';
}
return '未指定施法效果';
},
@ -10952,7 +11474,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
content:function(storage){
if(storage){
return '经过'+storage[1]+'个“回合结束时”后,摸'+storage[0]*2+'张牌';
return '经过'+storage[1]+'个“回合结束时”后,摸'+storage[0]*2+'张牌';
}
return '未指定施法效果';
},
@ -11032,7 +11554,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
content:function(storage){
if(storage){
return '经过'+storage[1]+'个“回合结束时”后,获得'+storage[0]+'层“防止一次伤害”的效果';
return '经过'+storage[1]+'个“回合结束时”后,获得'+storage[0]+'层“防止一次伤害”的效果';
}
return '未指定施法效果';
},
@ -11254,7 +11776,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var checkx=get.color(card,player)==get.color(judging);
if(checkx>0) return checkx;
return 0;
};
}
return result*(attitude>0?1:-1);
}).set('judging',trigger.player.judging[0]);
'step 1'
@ -12610,7 +13132,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
});
}).sortBySeat();
for(var i of list){
i.discardPlayerCard(player,true,'he').boolline=true;
i.discardPlayerCard(player,true,'he').boolline=true;
}
},
},
@ -14698,6 +15220,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){
kaisa:"凯撒",
zhengfu:"征服",
zhengfu_info:"当你使用【杀】指定目标时,你可以选择一种牌的类别,然后除非目标角色交给你一种该类别的牌,否则其不能闪避此【杀】。",
xia_xiahoudun:'侠夏侯惇',
xia_xiahoudun_prefix:'侠',
twdanlie:'胆烈',
twdanlie_info:'①出牌阶段限一次。你可以与至多三名其他角色共同拼点。若你赢你对没赢的角色依次造成1点伤害若你没赢你失去1点体力。②你的拼点牌点数+XX为你已损失的体力值。',
xia_zhangwei:'张葳',
twhuzhong:'护众',
twhuzhong_info:'当你于出牌阶段使用无属性【杀】指定唯一目标角色时你可以选择一项①弃置一张手牌然后你可以为此牌额外选择一个目标②令其弃置一张手牌此牌结算完毕后若此牌造成过伤害则你摸一张牌且本阶段可以额外使用一张【杀】否则其对你造成1点伤害。',
twfenwang:'焚亡',
twfenwang_info:'①当你受到属性伤害时,你须弃置一张牌或令此伤害+1。②当你对其他角色造成非属性伤害时若你的手牌数大于其则此伤害+1。',
xia_xiahousone:'夏侯子萼',
twchengxi:'承袭',
twchengxi_info:'出牌阶段每名角色限一次,你可以摸一张牌并与一名其他角色拼点。若你赢,你使用的下一张基本牌或非延时锦囊牌结算完毕后,你视为对原目标使用一张无次数限制的同名牌;若你没赢,其视为对你使用一张无距离限制的【杀】。',
xia_liubei:'侠刘备',
xia_liubei_prefix:'侠',
twshenyi:'伸义',
twshenyi_info:'每回合限一次。当你或你攻击范围内的一名角色于一回合内首次受到伤害后,你可以声明一种基本牌或锦囊牌(每种牌名限一次),然后从牌堆中将一张同名牌称为“侠义”置于武将牌上。若受伤角色不为你,则你将所有手牌交给其,且当其失去一张你以此法交给其的牌后,你摸一张牌。',
twxinghan:'兴汉',
twxinghan_info:'①当你没有手牌时或你处于濒死状态时你可以如手牌般使用或打出“侠义”牌。②准备阶段若“侠义”牌数大于存活角色数则你可以依次使用其中所有可以使用的牌。然后你获得如下效果回合结束时你弃置所有手牌并失去X点体力X为你的体力值-1且X至少为1。',
tw_mobile:'海外服·稀有专属',
tw_yunchouzhi:'运筹帷幄·智',

View File

@ -8,6 +8,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dc_xujing:['male','shu',3,['dcshangyu','dccaixia']],
dc_zhaoxiang:['female','shu',4,['refanghun','refuhan']],
dc_guansuo:['male','shu',4,['xinzhengnan','xiefang']],
xin_baosanniang:['female','shu',3,['decadewuniang','decadexushen']],
dc_shixie:['male','qun',3,['rebiluan','ollixia']],
dc_sp_machao:['male','qun',4,['zhuiji','dc_olshichou']],
old_huangfusong:['male','qun',4,['xinfenyue']],
@ -28,7 +29,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
zhangjinyun:['female','shu',3,['dchuizhi','dcjijiao']],
huanfan:['male','wei',3,['dcjianzheng','dcfumou']],
chentai:['male','wei',4,['dcctjiuxian','dcchenyong']],
sunyu:['male','wu',3,['dcquanshou','dcshexue'],['unseen']],
sunyu:['male','wu',3,['dcquanshou','dcshexue']],
xizheng:['male','shu',3,['dcdanyi','dcwencan']],
dc_ruiji:['female','wu',4,['dcwangyuan','dclingyin','dcliying']],
zerong:['male','qun',4,['dccansi','dcfozong']],
@ -95,7 +96,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji','duanqiaoxiao','tianshangyi'],
sp2_jichu:['zhaoang','dc_liuye','dc_wangyun','yanghong','huanfan','xizheng'],
sp2_yuxiu:['dongguiren','dc_tengfanglan','zhangjinyun','zhoubuyi','dc_xujing'],
sp2_qifu:['dc_guansuo','dc_zhaoxiang'],
sp2_qifu:['dc_guansuo','xin_baosanniang','dc_zhaoxiang'],
sp2_gaoshan:['wanglang','liuhui'],
sp2_wumiao:['wu_zhugeliang','wu_luxun'],
}
@ -155,7 +156,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(shown.length<cards.length){
var num=cards.length-shown.length;
player.$draw(num);
game.log(player,'从牌堆获得了',num,'张点数为8的牌');
game.log(player,'从牌堆获得了',get.cnNumber(num),'张点数为8的牌');
}
if(shown.length>0){
player.$gain2(shown,false);
@ -1506,7 +1507,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(type=='equip'&&game.hasPlayer(current=>{
return current.canEquip(card);
})||type=='delay'&&game.hasPlayer(current=>{
return !current.storage._disableJudge&&!current.hasJudge(card.name);
return current.canAddJudge(card);
})) choices.unshift('场上');
player.chooseControl(choices).set('prompt','请选择要将'+get.translation(card)+'置于的位置').set('ai',()=>{
return _status.event.choice;
@ -1526,7 +1527,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return _status.event.targets.contains(target);
}).set('targets',game.filterPlayer(current=>{
if(type=='equip') return current.canEquip(card);
if(type=='delay') return !current.storage._disableJudge&&!current.hasJudge(card.name);
if(type=='delay') return current.canAddJudge(card);
return false;
})).set('ai',target=>{
var player=_status.event.player;
@ -1539,7 +1540,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
else{
player.$throw(card,1000);
var next=player.lose(card,ui.cardPile);
var next=player.lose(card,ui.cardPile,'visible');
if(result.control=='牌堆顶') next.insert_card=true;
game.log(player,'将',card,'置于了','#y'+result.control);
}
@ -1555,7 +1556,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
target.addJudge(card);
}
}
if(event.count<4) event.goto(1);
'step 5'
game.countPlayer(current=>{
var count=current.countCards('e');
@ -1564,7 +1564,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
current.link(false);
current.turnOver(false);
}
event.equipCount[current.playerid]=count;
});
if(event.count<4) event.goto(1);
}
},
//杜预
@ -2806,7 +2808,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
result:{
target:function(player,target){
if(ui.cardPile.childNodes.length>game.players.length*5&&!player.hasSkill('dcjijiao_risutoa')&&
!game.hasPlayer(current=>current.hp<=1)&&game.countPlayer(current=>current.hp===2&&current.countCards('hes')<3)<=1) return 0;
!game.hasPlayer(current=>current.hp<=1)&&game.countPlayer(current=>current.hp===2&&current.countCards('hes')<3)<=1) return 0;
return 5;
}
}
@ -3145,11 +3147,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
trigger:{global:'phaseBegin'},
filter:function(event,player){
return event.player.countCards('h')<event.player.maxHp;
return event.player.countCards('h')<=event.player.maxHp;
},
logTarget:'player',
check:function(event,player){
return get.attitude(player,event.player)>0||event.player.maxHp-event.player.countCards('h')<=2;
if(get.attitude(player,event.player)>0) return true;
const draw=event.player.maxHp-event.player.countCards('h');
return draw<=2&&event.player.getHp(true)-draw>=1;
},
content:function(){
'step 0'
@ -3161,7 +3165,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var draw=Math.min(5,Math.max(0,trigger.player.maxHp-trigger.player.countCards('h')));
if(get.attitude(trigger.player,player)>0){
if(draw>=3||trigger.player.getCardUsable('sha')>1) return '选项一';
if(draw<=1&&trigger.player.countCards('hs',card=>{
if(!draw||draw<=1&&trigger.player.countCards('hs',card=>{
return get.name(card)=='sha'&&trigger.player.hasValueTarget(card);
})) return '选项二';
return '选项一';
@ -3212,7 +3216,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
popup:false,
charlotte:true,
onremove:true,
marktext:'守',
marktext:'<span style="text-decoration: line-through;"></span>',
intro:{content:'本回合使用的牌被抵消后,$摸一张牌'},
content:function(){
var targets=player.getStorage('dcquanshou_respond');
@ -3232,7 +3236,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger:{player:'phaseUseBegin'},
filter:function(event,player){
var card=lib.skill.dcshexue.getLast();
return card&&player.hasUseTarget(card);
return card&&player.hasUseTarget(card,false);
},
getLast:function(){
for(var current of game.filterPlayer()){
@ -3258,10 +3262,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var card=lib.skill.dcshexue.getLast();
game.broadcastAll(function(card){
lib.skill.dcshexue_backup.viewAs=card;
lib.skill.dcshexue_backup.prompt='设学:是否将一张牌当做'+get.translation(card)+'使用?';
},card);
var next=player.chooseToUse();
next.set('openskilldialog','设学:是否将一张牌当做'+get.translation(card)+'使用?');
next.set('openskilldialog',`###${get.prompt('dcshexue')}###将一张牌当做${get.translation(card.nature)||''}${get.translation(card.name)}】使用`);
next.set('norestore',true);
next.set('addCount',false);
next.set('_backupevent','dcshexue_backup');
@ -3277,6 +3280,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
filterCard:function(card){
return get.itemtype(card)=='card';
},
filterTarget:lib.filter.targetEnabled,
position:'hes',
selectCard:1,
check:(card)=>6-get.value(card),
@ -3297,6 +3301,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var card=history[history.length-1].card;
return '令下一回合的角色于其出牌阶段开始时选择是否将一张牌当做'+(get.translation(card.nature)||'')+'【'+get.translation(card.name)+'】使用';
},
check:function(event,player){
let evt=event.getParent('phase').getParent();
let nextPlayer=player.getNext();
if(evt&&evt.next&&evt.next.length){
nextPlayer=evt.next[0].player;
}
return get.attitude(player,nextPlayer)>0;
},
content:function(){
var history=player.getHistory('useCard',evt=>{
return evt.getParent('phaseUse')==trigger&&(get.type(evt.card)=='basic'||get.type(evt.card)=='trick');
@ -3311,7 +3323,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
study:{
trigger:{player:'phaseUseBegin'},
filter:function(event,player){
return player.getStorage('dcshexue_study').some(i=>event.player.hasUseTarget(i));
return player.getStorage('dcshexue_study').some(i=>event.player.hasUseTarget(i,false));
},
onremove:true,
charlotte:true,
@ -3321,13 +3333,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){
event.cards=player.getStorage('dcshexue_study');
'step 1'
var card=cards.pop();
if(trigger.player.hasUseTarget(card)){
if(trigger.player.hasUseTarget(card,false)){
game.broadcastAll(function(card){
lib.skill.dcshexue_backup.viewAs=card;
lib.skill.dcshexue_backup.prompt='设学:是否将一张牌当做'+get.translation(card)+'使用?';
},card);
var next=trigger.player.chooseToUse();
next.set('openskilldialog','设学:是否将一张牌当做'+get.translation(card)+'使用?');
next.set('openskilldialog',`###${get.prompt('dcshexue_study')}###将一张牌当做${get.translation(card.nature)||''}${get.translation(card.name)}】使用`);
next.set('norestore',true);
next.set('addCount',false);
next.set('_backupevent','dcshexue_backup');
@ -4141,7 +4153,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var selected=ui.selected.targets;
if(!selected.length) return true;
for(var i of selected){
if(i.getNext()==target||i.getPrevious()==target) return true;
if(i.getNext()==target||i.getPrevious()==target) return true;
}
return false;
},
@ -4245,7 +4257,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
try{
targetsx=game.filterPlayer(current=>player.inRange(current));
}
catch(e){player.storage.dcyuanmo_range=_tmp};
catch(e){
player.storage.dcyuanmo_range=_tmp
}
player.storage.dcyuanmo_range=_tmp;
targetsx.removeArray(targets);
return targetsx.reduce((p,c)=>{
@ -6061,7 +6075,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dcshoutan:{
audio:2,
enable:'phaseUse',
selectCard:-1,
position:'h',
filter:function(event,player){
if(player.hasSkill('dcyaoyi')) return !player.hasSkill('dcshoutan_blocker',null,null,false);
@ -8052,7 +8065,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var selected=ui.selected.targets;
if(!selected.contains(next)&&!selected.contains(prev)) return (target==next||target==prev);
for(var i of selected){
if(i.getNext()==target||i.getPrevious()==target) return true;
if(i.getNext()==target||i.getPrevious()==target) return true;
}
return false;
},
@ -8626,20 +8639,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
group:'baoshu_draw',
subSkill:{
draw:{
trigger:{global:'phaseDrawBegin2'},
forced:true,
popup:false,
filter:function(event,player){
return !event.numFixed&&event.player.hasMark('baoshu');
},
content:function(){
var target=trigger.player,num=target.countMark('baoshu');
trigger.player.logSkill('baoshu_draw');
trigger.num+=num;
trigger.player.removeMark('baoshu',num);
},
},
draw:{
trigger:{global:'phaseDrawBegin2'},
forced:true,
popup:false,
filter:function(event,player){
return !event.numFixed&&event.player.hasMark('baoshu');
},
content:function(){
var target=trigger.player,num=target.countMark('baoshu');
trigger.player.logSkill('baoshu_draw');
trigger.num+=num;
trigger.player.removeMark('baoshu',num);
},
},
},
},
//吴范
@ -8908,7 +8921,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(blacks.length>0){
dialog.push('<div class="text center">黑色牌</div>');
dialog.push(blacks);
};
}
player.chooseButton(dialog,true).set('ai',function(button){
var player=_status.event.player;
var color=get.color(button.link),cards=player.getExpansions('syjiqiao');
@ -9255,7 +9268,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
switch(button.link){
case 0:
return 2;
break;
case 1:
return Math.max(0.5,player.countCards('hs',function(card){
return get.name(card)=='sha'&&player.hasValueTarget(card);
@ -9264,10 +9276,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}).map(function(target){
return get.damageEffect(target,player,player);
}));
break;
case 2:
return player.needsToDiscard()/4;
break;
case 3:
var num=0;
return 0.8*Math.max.apply(Math,game.filterPlayer(function(current){
@ -9275,7 +9285,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}).map(function(target){
return get.effect(target,{name:'shunshou_copy'},player,player);
}));
break;
case 4:
var num=0;
game.countPlayer(function(current){
@ -9285,7 +9294,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
}
});
return num*0.8;
break;
}
});
if(player.getDamagedHp()>0) next.set('selectButton',[1,1+player.getDamagedHp()]);
@ -10230,7 +10238,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){
enable:'phaseUse',
usable:1,
filter:function(event,player){
return !player.storage.zunwei||player.storage.zunwei.length<3;
let storage=player.getStorage('zunwei');
return storage.length<3&&game.hasPlayer(current=>{
return player.isDamaged()&&current.getHp()>player.getHp()&&!storage.includes(0)||
current.countCards('h')>player.countCards('h')&&!storage.includes(1)||
current.countCards('e')>player.countCards('e')&&!storage.includes(2);
});
},
chooseButton:{
dialog:function(event,player){
@ -10241,12 +10254,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){
];
var choiceList=ui.create.dialog('尊位:请选择一项','forcebutton','hidden');
choiceList.add([list.map((item,i)=>{
if(player.getStorage('zunwei').includes(i)) item=`<span style="text-decoration: line-through;">${item}</span>`;
return [i,item];
}),'textbutton'])
return choiceList;
},
filter:function(button){
return button._filterButton;
const player=get.player();
if(player.getStorage('zunwei').includes(button.link)) return false;
if(button.link==0){
if(!player.isDamaged()) return false;
return game.hasPlayer(current=>{
return current.getHp()>player.getHp();
});
}
if(button.link==1){
return game.hasPlayer(current=>{
return current.countCards('h')>player.countCards('h');
});
}
if(button.link==2){
return game.hasPlayer(current=>{
return current.countCards('e')>player.countCards('e');
});
}
},
backup:function(links){
var next=get.copy(lib.skill.zunwei.backups[links[0]]);
@ -10256,27 +10287,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return next;
},
check:function(button){
var player=_status.event.player;
switch(button.link){
case 0:{
var target=game.findPlayer(function(current){
return current.isMaxHp();
});
return (Math.min(target.hp,player.maxHp)-player.hp)*2;
}
case 1:{
var target=game.findPlayer(function(current){
return current.isMaxHandcard();
});
return Math.min(5,target.countCards('h')-player.countCards('h'))*0.8;
}
case 2:{
var target=game.findPlayer(function(current){
return current.isMaxEquip();
});
return (target.countCards('e')-player.countCards('e'))*1.4;
}
}
var player=_status.event.player;
switch(button.link){
case 0:{
var target=game.findPlayer(function(current){
return current.isMaxHp();
});
return (Math.min(target.hp,player.maxHp)-player.hp)*2;
}
case 1:{
var target=game.findPlayer(function(current){
return current.isMaxHandcard();
});
return Math.min(5,target.countCards('h')-player.countCards('h'))*0.8;
}
case 2:{
var target=game.findPlayer(function(current){
return current.isMaxEquip();
});
return (target.countCards('e')-player.countCards('e'))*1.4;
}
}
},
prompt:function(links){
return [
@ -11041,7 +11072,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
mod:{
cardUsable:function(card,player,num){
if(card.name=='sha') return num+player.countMark('spzhuilie2');
if(card.name=='sha') return num+player.countMark('spzhuilie2');
},
},
},
@ -11071,8 +11102,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
},
frequent:true,
content:function(){
player.draw();
player.addMark('mansi',1,false);
player.draw();
player.addMark('mansi',1,false);
},
intro:{content:'已因此技能得到了#张牌'},
},
@ -11852,7 +11883,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
//filter:function(event,player){
// return player.storage.gxlianhua&&player.storage.gxlianhua.red+player.storage.gxlianhua.black>0;
//},
forced:true,
content:function(){
var cards=[];
var cards2=[];
@ -12308,7 +12338,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return '当你使用或打出'+(player.hasSkill('dczhangcai_all')?'':'点数为8的')+'牌时你可以摸X张牌X为你手牌区里'+(player.hasSkill('dczhangcai_all')?'与此牌点数相同':'点数为8')+'的牌数且至少为1。';
},
},
perfectPair:{},
characterReplace:{
wenyang:['wenyang','db_wenyang','diy_wenyang'],
gexuan:['gexuan','tw_gexuan'],
@ -12686,9 +12715,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
dcchenyong_info:'结束阶段你可以摸X张牌X为本回合你使用过的牌的类型数。',
sunyu:'孙瑜',
dcquanshou:'劝守',
dcquanshou_info:'一名角色的回合开始时,若其手牌数于其体力上限你可以令其选择一项1.将手牌摸至体力上限,然后本回合使用【杀】的次数上限-1至多摸五张2.其本回合使用牌被抵消后,你摸一张牌。',
dcquanshou_info:'一名角色的回合开始时,若其手牌数不大于其体力上限你可以令其选择一项1.将手牌摸至体力上限,然后本回合使用【杀】的次数上限-1至多摸五张2.其本回合使用牌被抵消后,你摸一张牌。',
dcshexue:'设学',
dcshexue_info:'①出牌阶段开始时,你可以将一张牌当做上回合的角色于其出牌阶段内使用的最后一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的最后一张基本牌或普通锦囊牌使用。',
dcshexue_info:'①出牌阶段开始时,你可以将一张牌当做上回合的角色于其出牌阶段内使用的最后一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的最后一张基本牌或普通锦囊牌使用(一名角色因〖设学〗使用的牌均无距离和次数限制)。',
xizheng:'郤正',
dcdanyi:'耽意',
dcdanyi_info:'当你使用牌指定第一个目标后若此牌的目标与你使用的上一张牌目标相同你可以摸X张牌X为此牌目标数。',

View File

@ -811,7 +811,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
limited:true,
enable:"phaseUse",
filter:function(event,player){;
filter:function(event,player){
return player.countCards('e')>0;
},
filterTarget:lib.filter.notMe,

View File

@ -415,21 +415,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){
subSkill:{
effect:{
audio:'qingbei',
trigger:{
player:'useCardAfter',
},
forced:true,
trigger:{player:'useCardAfter'},
charlotte:true,
onremove:true,
filter:function(event,player){
if(!lib.suit.includes(get.suit(event.card))) return false;
return player.getStorage('qingbei_effect').length;
},
direct:true,
firstDo:true,
content:function(){
player.draw(player.getStorage('qingbei_effect').length);
},
mark:true,
intro:{
content:(storage)=>`本轮内不能使用${get.translation(storage)}花色的牌,且使用牌后摸${get.cnNumber(storage.length)}张牌`,
content:(storage)=>`本轮内不能使用${get.translation(storage)}花色的牌,且使用一张有花色的牌后摸${get.cnNumber(storage.length)}张牌`,
},
mod:{
cardEnabled:function(card,player){
@ -1514,7 +1514,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
unlimit:{
mod:{
cardUsable:function(card,player){
var list=lib.skill.lkbushi.getBushi(player);
var list=lib.skill.lkbushi.getBushi(player);
if(list[0]==get.suit(card)) return Infinity;
},
},
@ -2210,7 +2210,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
next.set('filterButton',function(button){
if(button.link==0){
return _status.event.bool1;
};
}
return true;
});
next.set('bool1',lib.skill.xinbenxi.filterx(trigger,player));
@ -3151,7 +3151,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
for(var i=0;i<storage.length;i++){
str+='、';
str+=get.translation(storage[i]);
};
}
str=str.slice(1);
str2+=('<br><li>已对'+str+'发动过〖残韵〗');
}
@ -4169,7 +4169,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
if(!player.storage.juexiang_lie){
event.finish();
return;
};
}
player.storage.juexiang_lie--;
}
player.chooseTarget(get.prompt2('juexiang_lie'),function(card,player,target){
@ -5409,8 +5409,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){
ai:{
skillTagFilter:function(player){
if(!player.countCards('hes')||player.hasSkill('taoluan3')) return false;
if(!player.storage.taoluan.contains('tao')){}
else if(player.isDying()&&!player.storage.taoluan.contains('jiu')){}
if(!player.storage.taoluan.contains('tao')){ /* empty */ }
else if(player.isDying()&&!player.storage.taoluan.contains('jiu')){ /* empty */ }
else return false;
},
order:4,
@ -6473,7 +6473,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return current!=player;
}).sortBySeat(player);
for(var target of players){
if(get.damageEffect(target,player,target,'fire')>=0){num=0;continue};
if(get.damageEffect(target,player,target,'fire')>=0){num=0;continue}
var shao=false;
num++;
if(target.countCards('he',function(card){
@ -8766,10 +8766,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){
switch(button.link[2]){
case 'tao':return 5;
case 'jiu':return 3.01;
case 'shan':return 3.01;
case 'sha':
if(button.link[3]=='fire') return 2.95;
else if(button.link[3]=='fire') return 2.92;
else if(button.link[3]=='thunder') return 2.92;
else return 2.9;
case 'shan':return 1;
}
@ -10057,7 +10056,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
return false;
},
filter:function(event,player){
return player!=event.player;
return player!=event.player;
},
logTarget:'player',
content:function(){
@ -11072,11 +11071,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){
order:10,
result:{
target:function(player,target){
if(player!=target) return 0;
if(player.hasSkill('requanji')||(player.countCards('h')+2<=player.hp+player.getExpansions('quanji').length)) return 1;
return 0;
}
},
if(player!=target) return 0;
if(player.hasSkill('requanji')||(player.countCards('h')+2<=player.hp+player.getExpansions('quanji').length)) return 1;
return 0;
}
},
},
}
},
@ -13537,7 +13536,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
audio:2,
audioname:['xin_jushou'],
check:function(event,player){
return player.getHistory('damage').indexOf(event)==0;
return player.getHistory('damage').indexOf(event)==0;
},
content:function(){
if(player.getHistory('damage').indexOf(trigger)>0){
@ -14696,7 +14695,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
cuguo_info:'锁定技。当你于一回合使用牌首次被抵消后你弃置一张牌视为对此牌的目标角色使用一张该被抵消的牌。此牌结算结束后若此牌被抵消你失去1点体力。',
chenshi:'陈式',
qingbei:'擎北',
qingbei_info:'一轮游戏开始时,你可以选择任意种花色,你不能于本轮内使用这些花色的牌。然后当你于本轮使用牌结算结束后,你摸等同于你上一次〖擎北〗选择过的花色数的牌。',
qingbei_info:'一轮游戏开始时,你可以选择任意种花色,你不能于本轮内使用这些花色的牌。然后当你于本轮使用一张有花色的牌结算结束后,你摸等同于你上一次〖擎北〗选择过的花色数的牌。',
feiyao:'费曜',
zhenfeng:'镇锋',
zhenfeng_info:'每回合限一次。当其他角色于其回合内使用牌时若其手牌数不大于其体力值你可以猜测其手牌中与此牌类别相同的牌数。若你猜对你摸X张牌并视为对其使用一张【杀】X为你连续猜对的次数且至多为5若你猜错且差值大于1其视为对你使用一张【杀】。',

View File

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

View File

@ -136,7 +136,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
});
},
content:function(){
for(var i=0;i<game.players.length;i++){
for(var i=0;i<game.players.length;i++){
if(game.players[i].hasSkill('yxs_menshen2')){
game.players[i].removeSkill('yxs_menshen2');
}
@ -149,14 +149,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){
player:"phaseEnd",
},
priority:15,
group:'yxs_menshen3',
group:'yxs_menshen3',
onremove:true,
filter:function (event,player){
return game.players.length>1;
},
content:function(){
"step 0"
player.chooseTarget('选择【门神】的目标',lib.translate.yxs_menshen_info,true,function(card,player,target){
"step 0"
player.chooseTarget('选择【门神】的目标',lib.translate.yxs_menshen_info,true,function(card,player,target){
return target!=player;
}).set('ai',function(target){
return get.attitude(player,target);
@ -177,7 +177,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
expose:0.5,
},
},
yxs_menshen2:{
yxs_menshen2:{
audio:2,
mark:'character',
intro:{
@ -188,7 +188,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){
trigger:{
target:["shaBegin","juedouBegin"],
},
forced:true,
forced:true,
popup:false,
filter:function(event,player){
return player.isAlive();
@ -197,10 +197,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){
var target=player.storage.yxs_menshen2;
trigger.player.line(target,'green');
trigger.targets.remove(player);
trigger.targets.push(target);
trigger.targets.push(target);
trigger.target = target;
},
},
},
guimian:{
trigger:{source:'damageEnd'},
forced:true,

View File

@ -400,6 +400,52 @@
return method;
}
},
handler:{
_handlers:{},
getHandler:function(name,type){
if(!type)type = this.getDefaultHandlerType(name);
if(!this._handlers[name])return null;
if(!this._handlers[name][type])return null;
return this._handlers[name][type];
},
ensureHandlerList:function(name,type){
if(!type)type = this.getDefaultHandlerType(name);
if(!this._handlers[name])this._handlers[name] = {};
if(!this._handlers[name][type])this._handlers[name][type] = [];
return this._handlers[name][type];
},
removeHandler:function(name,type,func){
var list = this.ensureHandlerList(name,type);
list.remove(func);
if(list.length == 0){
delete this._handlers[name][type];
if(Object.keys(this._handlers[name]) == 0){
delete this._handlers[name];
}
}
},
pushHandler:function(name,type){
let functions = (typeof type == 'string' ? arguments.slice(2):arguments.slice(1));
type = (typeof type == 'string'?type:this.getDefaultHandlerType(name));
this.ensureHandlerList(name,type).addArray(functions);
},
getDefaultHandlerType:(name)=>{
return `on${name[0].toUpperCase()}${name.slice(1)}`;
},
addHandlerToEvent:function(event){
if(typeof event.name == 'string'){
let handlerMap = this._handlers[event.name];
if(handlerMap){
Object.keys(handlerMap).forEach((key)=>{
let list = handlerMap[key];
if(list){
list.forEach(handler=>event.pushHandler(key,handler));
}
});
}
}
}
},
objectURL:new Map(),
hookmap:{},
imported:{},
@ -4982,6 +5028,8 @@
map.connect_limit_zhu.hide();
map.connect_enhance_zhu.hide();
map.connect_double_nei.hide();
map.connect_enable_commoner.hide();
map.connect_enable_year_limit.show();
map.connect_zhong_card.show();
map.connect_special_identity.hide();
map.connect_double_character.show();
@ -4992,6 +5040,8 @@
map.connect_limit_zhu.hide();
map.connect_enhance_zhu.hide();
map.connect_double_nei.hide();
map.connect_enable_commoner.hide();
map.connect_enable_year_limit.show();
map.connect_zhong_card.hide();
map.connect_special_identity.hide();
}
@ -5000,6 +5050,8 @@
map.connect_limit_zhu.hide();
map.connect_enhance_zhu.hide();
map.connect_double_nei.hide();
map.connect_enable_commoner.hide();
map.connect_enable_year_limit.hide();
map.connect_zhong_card.hide();
map.connect_special_identity.hide();
map.connect_double_character.hide();
@ -5009,12 +5061,9 @@
map.connect_player_number.show();
map.connect_limit_zhu.show();
map.connect_enhance_zhu.show();
if(config.connect_player_number!='2'){
map.connect_double_nei.show();
}
else{
map.connect_double_nei.hide();
}
map.connect_double_nei[config.connect_player_number!='2'&&!config.connect_enable_commoner?'show':'hide']();
map.connect_enable_commoner[config.connect_player_number!='2'&&!config.connect_double_nei?'show':'hide']();
map.connect_enable_year_limit.show();
map.connect_zhong_card.hide();
if(config.connect_player_number=='8'){
@ -5074,6 +5123,15 @@
return lib.mode.identity.config.double_nei.intro;
}
},
connect_enable_commoner:{
name:'启用平民',
init:false,
restart:true,
frequent:false,
get intro(){
return lib.mode.identity.config.enable_commoner.intro;
}
},
connect_double_character:{
name:'双将模式',
init:false,
@ -5093,6 +5151,15 @@
frequent:true,
intro:'开启后游戏中将增加军师、大将、贼首三个身份'
},
connect_enable_year_limit:{
name:'启用年机制',
init:false,
restart:true,
frequent:false,
get intro(){
return lib.mode.identity.config.enable_year_limit.intro;
}
},
connect_round_one_use_fury:{
name:'开启首轮强化卡牌',
init:false,
@ -5137,6 +5204,9 @@
map.choice_zhong.hide();
map.choice_nei.hide();
map.choice_fan.hide();
map.enable_commoner.hide();
map.choice_commoner.hide();
map.enable_year_limit.show();
map.ban_identity.hide();
map.ban_identity2.hide();
map.ban_identity3.hide();
@ -5172,6 +5242,9 @@
map.choice_zhong.show();
map.choice_nei.show();
map.choice_fan.show();
map.enable_commoner.hide();
map.choice_commoner.hide();
map.enable_year_limit.show();
map.ban_identity.show();
if(config.ban_identity=='off'){
map.ban_identity2.hide();
@ -5210,6 +5283,9 @@
map.choice_zhong.hide();
map.choice_nei.hide();
map.choice_fan.hide();
map.enable_commoner.hide();
map.choice_commoner.hide();
map.enable_year_limit.hide();
map.ban_identity.hide();
map.ban_identity2.hide();
map.ban_identity3.hide();
@ -5229,17 +5305,15 @@
map.player_number.show();
map.enhance_zhu.show();
map.auto_identity.show();
if(config.player_number!='2'){
map.double_nei.show();
}
else{
map.double_nei.hide();
}
map.double_nei[config.player_number!='2'&&!config.enable_commoner?'show':'hide']();
map.choice_zhu.show();
map.limit_zhu.show();
map.choice_zhong.show();
map.choice_nei.show();
map.choice_fan.show();
map.enable_commoner[config.player_number!='2'&&!config.double_nei?'show':'hide']();
map.choice_commoner[config.enable_commoner?'show':'hide']();
map.enable_year_limit.show();
map.ban_identity.show();
if(config.ban_identity=='off'){
map.ban_identity2.hide();
@ -5305,7 +5379,7 @@
init:false,
restart:true,
frequent:true,
intro:'若游戏人数不大于8则开启后游戏中将有两个内奸内奸胜利条件仍为主内1v1时击杀主公'
intro:'若游戏人数不大于9则开启后游戏中将有两个内奸内奸胜利条件仍为主内1v1时击杀主公'
},
choose_group:{
name:'神武将选择势力',
@ -5632,6 +5706,33 @@
'10':'十',
},
},
enable_commoner:{
name:'启用平民',
init:false,
restart:true,
frequent:false,
intro:'开启后游戏中将有一个平民(身份)加入游戏。<br>具体规则请查看帮助。',
},
choice_commoner:{
name:'平民候选武将数',
init:'4',
restart:true,
item:{
'3':'三',
'4':'四',
'5':'五',
'6':'六',
'8':'八',
'10':'十',
},
},
enable_year_limit:{
name:'启用年机制',
init:false,
restart:true,
frequent:false,
intro:'开启后将会加入年机制。<br>年机制的具体规则请查看帮助。',
},
}
},
guozhan:{
@ -6456,7 +6557,7 @@
else{
lib.codeMirrorReady(node,editor);
}
};
}
},
},
reset_character_three:{
@ -6548,7 +6649,7 @@
else{
lib.codeMirrorReady(node,editor);
}
};
}
},
},
reset_character_four:{
@ -7002,7 +7103,7 @@
else{
lib.codeMirrorReady(node,editor);
}
};
}
},
},
reset_character:{
@ -7639,9 +7740,9 @@
}else if(newMessage.includes("Invalid regular expression flags")){
newMessage="无效的正则表达式的标记";
}else if(newMessage.includes("missing ) after argument list")){
newMessage="参数列表后面缺少 \')\' (丢失运算符或者转义字符等)";
newMessage="参数列表后面缺少 ')' (丢失运算符或者转义字符等)";
}else if(newMessage.includes("Invalid shorthand property initializer")){
newMessage="在定义一个{}对象时,应该使用\':\'而不是\'=\'";
newMessage="在定义一个{}对象时,应该使用':'而不是'='";
}else if(newMessage.includes("Missing initializer in const declaration")){
newMessage="在使用const定义一个对象时必须指定初始值";
}else if(newMessage.includes("Unexpected number")||newMessage.includes("Unexpected string")){
@ -7668,11 +7769,11 @@
}else if(newMessage.includes("Cannot read property")){
messageName=newMessage.replace('TypeError: Cannot read property ', '').replace(' of null', '').replace(' of undefined', '');
let ofName=newMessage.slice(newMessage.indexOf(" of ")+4);
newMessage="无法读取\'"+ofName+"\'的属性值"+messageName;
newMessage="无法读取'"+ofName+"'的属性值"+messageName;
}else if(newMessage.includes("Cannot read properties")){
messageName=newMessage.slice(newMessage.indexOf("reading '")+9,-2);
let ofName=newMessage.slice(newMessage.indexOf(" of ")+4,newMessage.indexOf("(")-1);
newMessage="无法读取\'"+ofName+"\'的属性值"+messageName;
newMessage="无法读取'"+ofName+"'的属性值"+messageName;
}else if(newMessage.includes("Property description must be an object")){
messageName=newMessage.replace('TypeError: Property description must be an object: ', '');
newMessage=messageName+"是非对象类型的值";
@ -7685,7 +7786,7 @@
messageName=newMessage.slice(newMessage.indexOf('\'')+1);
messageName=messageName.slice(0,messageName.indexOf('\''));
let obj=newMessage.slice(newMessage.indexOf(messageName)+16);
newMessage=obj+"不能添加或修改\'"+messageName+"\'属性,任何 Primitive 值都不允许有property";
newMessage=obj+"不能添加或修改'"+messageName+"'属性,任何 Primitive 值都不允许有property";
}else if(newMessage.includes("Can't add property")&&newMessage.includes("is not extensible")){
newMessage="对象不可添加属性(不可扩展)";
}else if(newMessage.includes("Cannot redefine property")){
@ -7755,10 +7856,10 @@
code=node.editor.getValue();
}else if(node.textarea){
code=node.textarea.value;
};
}
//动态绑定文本
if(code.length&&change.origin=="+input" &&
/{|}|\s|=|;|:|,||。|||\!|\?|&|#|%|@|||/.test(change.text[0])==false&&
/{|}|\s|=|;|:|,||。|||!|\?|&|#|%|@|||/.test(change.text[0])==false&&
change.text.length==1) {
//输入了代码,并且不包括空格,{}= ; : 逗号等,才可以自动提示
node.editor.showHint();
@ -7887,7 +7988,7 @@
}
function javascriptHint(editor,options){
return scriptHint(editor,javascriptKeywords,function(e,cur){return e.getTokenAt(cur);},options);
};
}
//覆盖原本的javascript提示
CodeMirror.registerHelper("hint","javascript",javascriptHint);
const stringProps=Object.getOwnPropertyNames(String.prototype);
@ -8081,7 +8182,7 @@
run:function(time){
lib.status.time=time;
for(var i=0;i<lib.updates.length;i++){
if(!lib.updates[i].hasOwnProperty('_time')){
if(!Object.prototype.hasOwnProperty.call(lib.updates[i], '_time')){
lib.updates[i]._time=time;
}
if(lib.updates[i](time-lib.updates[i]._time-lib.status.delayed)===false){
@ -8951,7 +9052,7 @@
str+=`\n行号: ${line}`;
str+=`\n列号: ${column}`;
const version=lib.version||'';
const reg=/[^\d\.]/;
const reg=/[^\d.]/;
const match=version.match(reg)!=null;
str+='\n'+`${match?'游戏':'无名杀'}版本: ${version||'未知版本'}`;
if(match) str+='\n⚠您使用的游戏代码不是源于libccy/noname无名杀官方仓库请自行寻找您所使用的游戏版本开发者反馈';
@ -8990,7 +9091,7 @@
}
str+='\n-------------';
if(typeof line=='number'&&(typeof game.readFile=='function'||location.origin!='file://')){
function createShowCode(lines){
const createShowCode=function(lines){
let showCode='';
if(lines.length>=10){
if(line>4){
@ -11313,7 +11414,7 @@
function Legacy(func){
//Remove all comments
//移除所有注释
let str=func.toString().replace(/((?:(?:^[ \t]*)?(?:\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/)))?|\/\/(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/))|(?=\r?\n))))+)|("(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\])*'|(?:\r?\n|[\s\S])[^\/"'\\\s]*)/mg,'$2').trim();
let str=func.toString().replace(/((?:(?:^[ \t]*)?(?:\/\*[^*]*\*+(?:[^/*][^*]*\*+)*\/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/)))?|\/\/(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/))|(?=\r?\n))))+)|("(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\])*'|(?:\r?\n|[\s\S])[^/"'\\\s]*)/mg,'$2').trim();
//获取第一个 { 后的所有字符
str=str.slice(str.indexOf('{')+1);
//判断代码中是否有debugger
@ -11437,6 +11538,7 @@
}
}
}
// falls through
default:
return Legacy(item);
}
@ -11447,7 +11549,7 @@
}
else if(typeof func=='object'){
for(var i in func){
if(func.hasOwnProperty(i)){
if(Object.prototype.hasOwnProperty.call(func, i)){
func[i]=lib.init.eval(func[i]);
}
}
@ -14414,7 +14516,7 @@
event.finish();
return;
}
};
}
event.doing=event.map.shift();
'step 3'
event.num=0;
@ -14533,11 +14635,11 @@
event._result={bool:true};
event._direct=true;
}
else if(info.direct){
else if(info.direct&&player.isOnline()){
event._result={bool:true};
event._direct=true;
}
else if(info.direct&&player.isOnline()){
else if(info.direct){
event._result={bool:true};
event._direct=true;
}
@ -14966,7 +15068,7 @@
current.getHistory().isRound=true;
current.getStat().isRound=true;
}
};
}
if(isRound){
game.getGlobalHistory().isRound=true;
}
@ -16130,7 +16232,7 @@
result[0].cards=lib.skill[result[0].skill].onCompare(player)
}
else lose_list.push([player,result[0].cards]);
};
}
for(var j=0; j<targets.length; j++){
if(event.list.contains(targets[j])){
var i=event.list.indexOf(targets[j]);
@ -16178,6 +16280,9 @@
'step 4'
player.$compareMultiple(event.card1,targets,cards);
game.log(player,'的拼点牌为',event.card1);
event.cardlist.forEach((card,index)=>{
game.log(targets[index],'的拼点牌为',card);
});
player.animate('target');
game.delay(0,1000);
'step 5'
@ -16189,7 +16294,6 @@
event.target.animate('target');
event.card2=event.cardlist[event.iwhile];
event.num2=event.getNum(event.card2);
game.log(event.target,'的拼点牌为',event.card2);
//event.tempplayer.line(event.target);
delete event.player;
event.trigger('compare');
@ -16295,7 +16399,7 @@
result[0].cards=lib.skill[result[0].skill].onCompare(player)
}
else lose_list.push([player,result[0].cards]);
};
}
for(var j=0;j<targets.length;j++){
if(event.list.contains(targets[j])){
var i=event.list.indexOf(targets[j]);
@ -16486,7 +16590,7 @@
}
else event.lose_list.push([player,event.resultOL[player.playerid].cards[0]]);
event.card1=event.resultOL[player.playerid].cards[0];
};
}
if(!event.card2){
if(event.resultOL[target.playerid].skill&&lib.skill[event.resultOL[target.playerid].skill]&&lib.skill[event.resultOL[target.playerid].skill].onCompare){
target.logSkill(event.resultOL[target.playerid].skill);
@ -18626,7 +18730,7 @@
next.cards=cards;
next.player=player;
return;
};
}
var next=game.createEvent(card.name);
next.setContent(info.content);
next.targets=targets;
@ -19675,14 +19779,14 @@
cards[i].recheck();
var info=lib.card[cards[i].name];
if(cards[i].hasOwnProperty('_destroy')){
if(Object.prototype.hasOwnProperty.call(cards[i], '_destroy')){
if(cards[i]._destroy){
cards[i].delete();
cards[i].destroyed=cards[i]._destroy;
continue;
}
}
else if(cards[i].hasOwnProperty('destroyed')){
else if(Object.prototype.hasOwnProperty.call(cards[i], 'destroyed')){
if(event.getlx!==false&&event.position&&cards[i].willBeDestroyed(event.position.id,null,event)){
cards[i].selfDestroy(event);
continue;
@ -20497,7 +20601,7 @@
if(event.judge2){
var judge2=event.judge2(event.result);
if(typeof judge2=='boolean') player.tryJudgeAnimate(judge2);
};
}
if(event.clearArena!=false){
game.broadcastAll(ui.clear);
}
@ -21189,9 +21293,9 @@
if(type=='horse'||type=='equip3_4'){
return player.hasEnabledSlot(3)&&(get.is.mountCombined()||player.hasEnabledSlot(4));
}
else if(type=='equip3_4'){
type='equip3';
}
// else if(type=='equip3_4'){
// type='equip3';
// }
else if(get.is.mountCombined()&&type=='equip4'){
return false;
}
@ -21925,7 +22029,7 @@
txy=to.getXY();
n=Math.abs(fxy[0]-txy[0])+Math.abs(fxy[1]-txy[1]);
}
else if(to.isMin(true)||from.isMin(true)){}
else if(to.isMin(true)||from.isMin(true)){/* empty */}
else{
var length=game.players.length;
var totalPopulation=game.players.length+game.dead.length+1;
@ -22193,7 +22297,7 @@
default:{
this.maxHp=maxHp1+maxHp2-3;
this.hp=hp1+hp2-3;
};
}
}
if(info2[4].contains('hiddenSkill')&&!this.noclick){
if(!this.hiddenSkills) this.hiddenSkills=[];
@ -24027,19 +24131,19 @@
var player=_status.event.player;
var event=_status.event.getParent();
var getn=function(card){
if(player.hasSkill('tianbian')&&get.suit(card)=='heart') return 13*(Boolean(event.small)?-1:1);
return get.number(card)*(Boolean(event.small)?-1:1);
if(player.hasSkill('tianbian')&&get.suit(card)=='heart') return 13*(event.small?-1:1);
return get.number(card)*(event.small?-1:1);
}
if(source&&source!=player){
if(get.attitude(player,source)>1){
if(Boolean(event.small)) return getn(card)-get.value(card)/2+addi;
if(event.small) return getn(card)-get.value(card)/2+addi;
return -getn(card)-get.value(card)/2+addi;
}
if(Boolean(event.small)) return -getn(card)-get.value(card)/2+addi;
if(event.small) return -getn(card)-get.value(card)/2+addi;
return getn(card)-get.value(card)/2+addi;
}
else{
if(Boolean(event.small)) return -getn(card)-get.value(card)/2+addi;
if(event.small) return -getn(card)-get.value(card)/2+addi;
return getn(card)-get.value(card)/2+addi;
}
}
@ -24063,7 +24167,7 @@
var addi=(get.value(card)>=8&&get.type(card)!='equip')?-6:0;
if(card.name=='du') addi-=5;
if(player==event.player){
if(Boolean(event.small)){
if(event.small){
return -getn(card)-get.value(card)/2+addi;
}
return getn(card)-get.value(card)/2+addi;
@ -25291,7 +25395,7 @@
}
}
if(next.animate=='gain2'||next.animate=='draw2'){
if(!next.hasOwnProperty('log')){
if(!Object.prototype.hasOwnProperty.call(next, 'log')){
next.log=true;
}
}
@ -25378,7 +25482,7 @@
}
}
if(next.animate=='gain2'||next.animate=='draw2'||next.animate=='give'){
if(!next.hasOwnProperty('log')){
if(!Object.prototype.hasOwnProperty.call(next, 'log')){
next.log=true;
}
}
@ -25696,7 +25800,7 @@
case 1:this.draw(nodelay?'nodelay':1);break;
case 2:this.recover();break;
case 3:this.changeHujia();break;
case 4:this.tempHide();
case 4:this.tempHide();break;
case 5:this.discard(this.getCards('j')).delay=(!nodelay);break;
case 6:{
if(this.isLinked()) this.link();
@ -26001,7 +26105,7 @@
const position=get.position(card,true);
return position!='j'&&position!='o';
})){
game.log(card,'已被移出处理区,无法置入判定区');
game.log(card,'已被移出处理区,无法置入判定区');
return;
}
for(let iwhile=0;iwhile<20;iwhile++){
@ -26182,7 +26286,7 @@
}
clearTimeout(lib.node.torespondtimeout[this.playerid]);
delete lib.node.torespondtimeout[this.playerid];
if(!lib.node.torespond.hasOwnProperty(this.playerid)){
if(!Object.prototype.hasOwnProperty.call(lib.node.torespond, this.playerid)){
return;
}
var noresume=false;
@ -26209,7 +26313,7 @@
else if(_status.paused&&!noresume) game.resume();
}
tempUnwait(result){
if(!lib.node.torespond.hasOwnProperty(this.playerid)){
if(!Object.prototype.hasOwnProperty.call(lib.node.torespond, this.playerid)){
return;
}
var proceed;
@ -27566,7 +27670,8 @@
}
else{
for(var i in this.forbiddenSkills){
if(this.forbiddenSkills[i].remove(skill)){
if(this.forbiddenSkills[i].includes(skill)){
this.forbiddenSkills[i].remove(skill)
if(!this.forbiddenSkills[i].length){
delete this.forbiddenSkills[i];
}
@ -27913,6 +28018,11 @@
if(func&&!func(target)) return false;
return target.identity!='fan';
});break;
case 'commoner':targets=game.filterPlayer(function(target){
if(func&&!func(target)) return false;
if(num>=3) return target.identity!='fan';
return target.identity=='fan';
}); break;
}
}
}
@ -27983,6 +28093,10 @@
if(func&&!func(target)) return false;
return target.identity=='fan';
});break;
case 'commoner':targets=game.filterPlayer(function(target){
if(func&&!func(target)) return false;
return true;
}); break;
}
}
}
@ -30901,6 +31015,7 @@
const type=`onNext${name[0].toUpperCase()}${name.slice(1)}`;
if(gameEvent.hasHandler(type)) this.pushHandler(...gameEvent.getHandler(type));
}
lib.handler.addHandlerToEvent(this);
}
this.step=0;
this.finished=false;
@ -31224,7 +31339,6 @@
parent=parent.parent;
if(historys.contains(parent)) return toreturn;
}
if(!parent) return toreturn;
}
if(toreturn===null){
return null;
@ -31456,7 +31570,7 @@
for(var i=0;i<map.list2.length;i++){
if(map.list2[i][0]==toadd[0]&&map.list2[i][1]==toadd[1]) return;
}
};
}
for(var i=0;i<map.list.length;i++){
if(map.list[i][0]==toadd[0]&&map.list[i][1]==toadd[1]) return;
}
@ -31469,43 +31583,6 @@
func(skill[j]);
}
}
return this;
}
removeTrigger(skill,player){
if(!player||!skill) return;
var evt=this;
if(typeof skill=='string') skill=[skill];
game.expandSkills(skill);
while(true){
var evt=evt.getParent('arrangeTrigger');
if(!evt||evt.name!='arrangeTrigger'||!evt.map) return;
var filter=function(content){
if(typeof content=='string') return content==triggername;
return content.contains(triggername);
};
var trigger=evt._trigger;
var triggername=evt.triggername;
var map=false;
if(evt.doing&&evt.doing.player==player) map=evt.doing;
else{
for(var i=0;i<evt.map.length;i++){
if(evt.map[i].player==player){
map=evt.map[i];
break;
}
}
}
if(!map) return;
var func=function(skillx){
var toremove=map.list.filter(i=>{
return i[0]==skillx&&i[1]==player;
});
if(toremove.length>0) map.list.removeArray(toremove);
}
for(var j=0;j<skill.length;j++){
func(skill[j]);
}
}
}
removeTrigger(skill,player){
if(!player||!skill) return;
@ -31749,7 +31826,7 @@
}
evt.list=[];
if(evt.doing) evt.doing.list=[];
};
}
this._triggered=5;
}
else if(player){
@ -37515,7 +37592,7 @@
}
const blob=zip.generate({
type:'blob'
}),fileNameToSaveAs=`${exportExtension.replace(/\\|\/|\:|\?|\"|\*|<|>|\|/g,'-')}.zip`;
}),fileNameToSaveAs=`${exportExtension.replace(/\\|\/|:|\?|"|\*|<|>|\|/g,'-')}.zip`;
if(lib.device){
const directory=lib.device=='android'?cordova.file.externalDataDirectory:cordova.file.documentsDirectory;
@ -37561,7 +37638,7 @@
const config=game.importedPack.config;
Object.keys(config).forEach(value=>{
const configObject=config[value];
if(configObject&&configObject.hasOwnProperty('init')) game.saveConfig(`extension_${extensionName}_${value}`,configObject.init);
if(configObject&&Object.prototype.hasOwnProperty.call(configObject, 'init')) game.saveConfig(`extension_${extensionName}_${value}`,configObject.init);
});
if(game.download){
const files=zip.files,hiddenFileFlags=['.','_'],fileList=Object.keys(files).filter(key=>!files[key].dir&&!hiddenFileFlags.includes(key[0])).reverse();
@ -37639,7 +37716,7 @@
export:function(textToWrite,name){
var textFileAsBlob = new Blob([textToWrite], {type:'text/plain'});
var fileNameToSaveAs = name||'noname';
fileNameToSaveAs=fileNameToSaveAs.replace(/\\|\/|\:|\?|\"|\*|<|>|\|/g,'.');
fileNameToSaveAs=fileNameToSaveAs.replace(/\\|\/|:|\?|"|\*|<|>|\|/g,'.');
if(lib.device){
var directory;
@ -42001,7 +42078,7 @@
config.num=config.num||num||3;
config.ratio=config.ratio||ratio||1.2;
config.update=config.update||update;
if(!config.hasOwnProperty('first')){
if(!Object.prototype.hasOwnProperty.call(config, 'first')){
if(typeof first=='boolean'){
config.first=first;
}
@ -42615,10 +42692,10 @@
}
if(info.marktext) lib.translate[`${i}_bg`]=info.marktext;
if(info.silent){
if(!info.hasOwnProperty('forced')) info.forced=true;
if(!info.hasOwnProperty('popup')) info.popup=false;
if(!Object.prototype.hasOwnProperty.call(info, 'forced')) info.forced=true;
if(!Object.prototype.hasOwnProperty.call(info, 'popup')) info.popup=false;
}
if(!info.hasOwnProperty('_priority')){
if(!Object.prototype.hasOwnProperty.call(info, '_priority')){
let priority=0;
if(info.priority){
priority=info.priority*100;
@ -43037,7 +43114,7 @@
game.reload2();
reject(event);
}
};;
};
record.onsuccess=event=>{
if(typeof onSuccess=='function'){
_status.dburgent=true;
@ -43077,7 +43154,7 @@
game.reload2();
reject(event);
}
};;
};
idbRequest.onsuccess=event=>{
const result=event.target.result;
if(typeof onSuccess=='function'){
@ -43101,7 +43178,7 @@
game.reload2();
reject(event);
}
};;
};
idbRequest.onsuccess=event=>{
const result=event.target.result;
if(result){
@ -43162,7 +43239,7 @@
request.onerror=event=>{
game.reload2();
reject(event);
};;
};
request.onsuccess=event=>{
game.reload2();
resolve(event);
@ -44915,7 +44992,7 @@
var cfg=copyObj(infoconfig[j]);
cfg._name=j;
cfg.mode=mode;
if(!config.hasOwnProperty(j)){
if(!Object.prototype.hasOwnProperty.call(config, j)){
game.saveConfig(j,cfg.init,mode);
}
else{
@ -45383,7 +45460,7 @@
}
var cfg=copyObj(info.config[j]);
cfg._name=j;
if(!config.hasOwnProperty(j)){
if(!Object.prototype.hasOwnProperty.call(config, j)){
if(cfg.type!='autoskill'&&cfg.type!='banskill'){
game.saveConfig(j,cfg.init);
}
@ -45501,7 +45578,7 @@
}
var link=(game.writeFile?'cdv_':'custom_')+name;
if(lib.config.customBackgroundMusic[link]){
if(!confirm('已经存在文件名称相同的背景音乐,是否仍然要继续导入?')){_status.music_importing=false;return};
if(!confirm('已经存在文件名称相同的背景音乐,是否仍然要继续导入?')){_status.music_importing=false;return}
for(var i=1;i<1000;i++){
if(!lib.config.customBackgroundMusic[link+'_'+i]){
link=link+'_'+i;break;
@ -47257,7 +47334,7 @@
j=mode+'_'+i+'_playpackconfig';
}
cfg._name=j;
if(!lib.config.hasOwnProperty(j)){
if(!Object.prototype.hasOwnProperty.call(lib.config, j)){
game.saveConfig(j,cfg.init);
}
else{
@ -48510,7 +48587,7 @@
editnode.classList.add('disabled');
delnode.innerHTML='取消';
delete delnode.button;
container.code='card={\n \n}\n\n\/*\n示例\ncard={\n type:"basic",\n enable:true,\n filterTarget:true,\n content:function(){\n target.draw()\n },\n ai:{\n order:1,\n result:{\n target:1\n }\n }\n}\n此例的效果为目标摸一张牌\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/';
container.code='card={\n \n}\n\n/*\n示例\ncard={\n type:"basic",\n enable:true,\n filterTarget:true,\n content:function(){\n target.draw()\n },\n ai:{\n order:1,\n result:{\n target:1\n }\n }\n}\n此例的效果为目标摸一张牌\n导出时本段代码中的换行、缩进以及注释将被清除\n*/';
}
newCard=ui.create.div('.new_character',page);
@ -48709,7 +48786,7 @@
delete window.saveNonameInput;
};
var editor=ui.create.editor(container,saveInput);
container.code='card={\n \n}\n\n\/*\n示例\ncard={\n type:"basic",\n enable:true,\n filterTarget:true,\n content:function(){\n target.draw()\n },\n ai:{\n order:1,\n result:{\n target:1\n }\n }\n}\n此例的效果为目标摸一张牌\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/';
container.code='card={\n \n}\n\n/*\n示例\ncard={\n type:"basic",\n enable:true,\n filterTarget:true,\n content:function(){\n target.draw()\n },\n ai:{\n order:1,\n result:{\n target:1\n }\n }\n}\n此例的效果为目标摸一张牌\n导出时本段代码中的换行、缩进以及注释将被清除\n*/';
var editnode=ui.create.div('.menubutton.large.new_card.disabled','创建卡牌',newCard,function(){
var name=page.querySelector('input.new_name').value;
@ -49060,7 +49137,7 @@
editnode.classList.add('disabled');
delnode.innerHTML='取消';
delete delnode.button;
container.code='skill={\n \n}\n\n\/*\n示例\nskill={\n trigger:{player:"phaseJieshuBegin"},\n frequent:true,\n content:function(){\n player.draw()\n }\n}\n此例为闭月代码\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/';
container.code='skill={\n \n}\n\n/*\n示例\nskill={\n trigger:{player:"phaseJieshuBegin"},\n frequent:true,\n content:function(){\n player.draw()\n }\n}\n此例为闭月代码\n导出时本段代码中的换行、缩进以及注释将被清除\n*/';
if(page.fromchar=='add'){
page.fromchar=true;
}
@ -49146,7 +49223,7 @@
delete window.saveNonameInput;
};
var editor=ui.create.editor(container,saveInput);
container.code='skill={\n \n}\n\n\/*\n示例\nskill={\n trigger:{player:"phaseJieshuBegin"},\n frequent:true,\n content:function(){\n player.draw()\n }\n}\n此例为闭月代码\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/';
container.code='skill={\n \n}\n\n/*\n示例\nskill={\n trigger:{player:"phaseJieshuBegin"},\n frequent:true,\n content:function(){\n player.draw()\n }\n}\n此例为闭月代码\n导出时本段代码中的换行、缩进以及注释将被清除\n*/';
var citebutton=document.createElement('button');
citebutton.innerHTML='引用代码';
@ -49374,10 +49451,10 @@
}
}
else{
dashes.content.node.code='function(config,pack){\n \n}\n\n\/*\n函数执行时机为游戏数据加载之后、界面加载之前\n参数1扩展选项见选项代码参数2为扩展定义的武将、卡牌和技能等可在此函数中修改\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/';
dashes.precontent.node.code='function(){\n \n}\n\n\/*\n函数执行时机为游戏数据加载之前且不受禁用扩展的限制\n除添加模式外请慎用\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/';
dashes.config.node.code='config={\n \n}\n\n\/*\n示例\nconfig={\n switcher_example:{\n name:"示例列表选项",\n init:"3",\n item:{"1":"一","2":"二","3":"三"}\n },\n toggle_example:{\n name:"示例开关选项",\n init:true\n }\n}\n此例中传入的主代码函数的默认参数为{switcher_example:"3",toggle_example:true}\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/';
dashes.help.node.code='help={\n \n}\n\n\/*\n示例\nhelp={\n "帮助条目":"<ul><li>列表1-条目1<li>列表1-条目2</ul><ol><li>列表2-条目1<li>列表2-条目2</ul>"\n}\n帮助内容将显示在菜单选项帮助中\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/';
dashes.content.node.code='function(config,pack){\n \n}\n\n/*\n函数执行时机为游戏数据加载之后、界面加载之前\n参数1扩展选项见选项代码参数2为扩展定义的武将、卡牌和技能等可在此函数中修改\n导出时本段代码中的换行、缩进以及注释将被清除\n*/';
dashes.precontent.node.code='function(){\n \n}\n\n/*\n函数执行时机为游戏数据加载之前且不受禁用扩展的限制\n除添加模式外请慎用\n导出时本段代码中的换行、缩进以及注释将被清除\n*/';
dashes.config.node.code='config={\n \n}\n\n/*\n示例\nconfig={\n switcher_example:{\n name:"示例列表选项",\n init:"3",\n item:{"1":"一","2":"二","3":"三"}\n },\n toggle_example:{\n name:"示例开关选项",\n init:true\n }\n}\n此例中传入的主代码函数的默认参数为{switcher_example:"3",toggle_example:true}\n导出时本段代码中的换行、缩进以及注释将被清除\n*/';
dashes.help.node.code='help={\n \n}\n\ns/*\n示例\nhelp={\n "帮助条目":"<ul><li>列表1-条目1<li>列表1-条目2</ul><ol><li>列表2-条目1<li>列表2-条目2</ul>"\n}\n帮助内容将显示在菜单选项帮助中\n导出时本段代码中的换行、缩进以及注释将被清除\n*/';
}
};
var dashes={};
@ -49483,10 +49560,10 @@
}
};
page.content={}
createCode('主','主代码',page,clickCode,'content','function(config,pack){\n \n}\n\n\/*\n函数执行时机为游戏数据加载之后、界面加载之前\n参数1扩展选项见选项代码参数2为扩展定义的武将、卡牌和技能等可在此函数中修改\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/');
createCode('启','启动代码',page,clickCode,'precontent','function(){\n \n}\n\n\/*\n函数执行时机为游戏数据加载之前且不受禁用扩展的限制\n除添加模式外请慎用\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/');
createCode('选','选项代码',page,clickCode,'config','config={\n \n}\n\n\/*\n示例\nconfig={\n switcher_example:{\n name:"示例列表选项",\n init:"3",\n item:{"1":"一","2":"二","3":"三"}\n },\n toggle_example:{\n name:"示例开关选项",\n init:true\n }\n}\n此例中传入的主代码函数的默认参数为{switcher_example:"3",toggle_example:true}\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/');
createCode('帮','帮助代码',page,clickCode,'help','help={\n \n}\n\n\/*\n示例\nhelp={\n "帮助条目":"<ul><li>列表1-条目1<li>列表1-条目2</ul><ol><li>列表2-条目1<li>列表2-条目2</ul>"\n}\n帮助内容将显示在菜单选项帮助中\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/');
createCode('主','主代码',page,clickCode,'content','function(config,pack){\n \n}\n\n/*\n函数执行时机为游戏数据加载之后、界面加载之前\n参数1扩展选项见选项代码参数2为扩展定义的武将、卡牌和技能等可在此函数中修改\n导出时本段代码中的换行、缩进以及注释将被清除\n*/');
createCode('启','启动代码',page,clickCode,'precontent','function(){\n \n}\n\n/*\n函数执行时机为游戏数据加载之前且不受禁用扩展的限制\n除添加模式外请慎用\n导出时本段代码中的换行、缩进以及注释将被清除\n*/');
createCode('选','选项代码',page,clickCode,'config','config={\n \n}\n\n/*\n示例\nconfig={\n switcher_example:{\n name:"示例列表选项",\n init:"3",\n item:{"1":"一","2":"二","3":"三"}\n },\n toggle_example:{\n name:"示例开关选项",\n init:true\n }\n}\n此例中传入的主代码函数的默认参数为{switcher_example:"3",toggle_example:true}\n导出时本段代码中的换行、缩进以及注释将被清除\n*/');
createCode('帮','帮助代码',page,clickCode,'help','help={\n \n}\n\n/*\n示例\nhelp={\n "帮助条目":"<ul><li>列表1-条目1<li>列表1-条目2</ul><ol><li>列表2-条目1<li>列表2-条目2</ul>"\n}\n帮助内容将显示在菜单选项帮助中\n导出时本段代码中的换行、缩进以及注释将被清除\n*/');
return page;
}());
@ -49650,7 +49727,7 @@
game.saveConfig('extension_'+extname+'_enable',true);
game.saveConfig('extension_'+extname+'_version',that.info.version);
for(var i in game.importedPack.config){
if(game.importedPack.config[i]&&game.importedPack.config[i].hasOwnProperty('init')){
if(game.importedPack.config[i]&&Object.prototype.hasOwnProperty.call(game.importedPack.config[i], 'init')){
game.saveConfig('extension_'+extname+'_'+i,game.importedPack.config[i].init);
}
}
@ -56891,7 +56968,7 @@
if(!information) {
resolve(`${lib.assetURL}image/card/${imageName}.png`)
return;
};
}
const image=information.image;
if(!image) resolve(`${lib.assetURL}image/card/${imageName}.png`);
else if(image.startsWith('db:')) game.getDB('image',image.slice(3)).then(resolve,reject);
@ -58196,6 +58273,26 @@
},
};
const get={
/**
* 返回 VCard[] 形式的所有牌用于印卡将遍历
* @param {Function} filter
* @returns {string[][]}
*/
inpileVCardList:filter=>{
let list=[];
for(const name of lib.inpile){
const type=get.type(name);
const info=[type,'',name];
if(!filter||filter(info)) list.push(info);
if(name=='sha'){
for(const nature of lib.inpile_nature){
const info=[type,'',name,nature];
if(!filter||filter(info)) list.push(info);
}
}
}
return list;
},
/**
* 根据座次数n从0开始获取对应的n+1号位翻译
* @param {number} seat
@ -58270,7 +58367,7 @@
priority:skill=>{
const info=get.info(skill);
if(!info) return 0;
if(info.hasOwnProperty('_priority')) return info._priority;
if(Object.prototype.hasOwnProperty.call(info, '_priority')) return info._priority;
let priority=0;
if(info.priority){
priority=info.priority*100;
@ -58451,6 +58548,38 @@
return 0;
},
is:{
/**
* 判断是否为进攻坐骑
* @param {Card | VCard} card
* @param {false | Player} [player]
* @returns {boolean}
*/
attackingMount:(card,player)=>{
const subtype=get.subtype(card,player);
if(subtype=='equip4') return true;
else if(subtype=='equip6'){
const info=get.info(card,player),distance=info.distance;
if(!distance) return false;
if(distance.globalFrom&&!info.notMount) return true;
}
return false;
},
/**
* 判断是否为防御坐骑
* @param {Card | VCard} card
* @param {false | Player} [player]
* @returns {boolean}
*/
defendingMount:(card,player)=>{
const subtype=get.subtype(card,player);
if(subtype=='equip3') return true;
else if(subtype=='equip6'){
const info=get.info(card,player),distance=info.distance;
if(!distance) return false;
if(distance.globalTo&&!info.notMount) return true;
}
return false;
},
/**
* 判断坐骑栏是否被合并
*/
@ -58918,7 +59047,7 @@
character:(name,num)=>{
let info=lib.character[name];
if(!info){
const pack=Object.keys(lib.characterPack).find(pack=>lib.characterPack[pack].hasOwnProperty(name));
const pack=Object.keys(lib.characterPack).find(pack=>Object.prototype.hasOwnProperty.call(lib.characterPack[pack], name));
if(pack) info=lib.characterPack[pack][name];
}
if(info){
@ -59117,7 +59246,7 @@
}
num=Math.floor(num/4);
for(i=0;i<num-level;i++){
str=str.replace(/\n /g,'\n');
str=str.replace(/\n {4}/g,'\n');
}
}
else{
@ -59290,7 +59419,7 @@
case 'purple':return '三对三对二';
case 'zhong':return (config.double_character?'双将':'')+'忠胆英杰';
case 'stratagem':return get.cnNumber(parseInt(config.number))+'人'+(config.double_character?'双将':'')+'谋攻';
default:return get.cnNumber(parseInt(config.number))+'人'+(config.double_character?'双将':'')+'身份';
default:return `${get.cnNumber(parseInt(config.number))}${config.double_nei?'双内':''}${config.enable_commoner?'带民':''}${config.double_character?'双将':''}身份`;
}
}
else if(config.mode=='guozhan'){
@ -59976,7 +60105,7 @@
if(card.length==1) return get.suit(card[0],player);
return 'none';
}
else if(!card.hasOwnProperty('suit')&&Array.isArray(card.cards)){
else if(!Object.prototype.hasOwnProperty.call(card, 'suit')&&Array.isArray(card.cards)){
return get.suit(card.cards,player);
}
else{
@ -60028,7 +60157,7 @@
if(!card) return;
//狗卡你是真敢出啊
var number=null;
if(card.hasOwnProperty('number')){
if(Object.prototype.hasOwnProperty.call(card, 'number')){
number=card.number;
if(typeof number!='number') number=null;
}
@ -60561,7 +60690,7 @@
var result=function(){
if(filter==arguments[i]) return true;
for(var j in filter){
if(filter.hasOwnProperty(j)){
if(Object.prototype.hasOwnProperty.call(filter, j)){
if(get.itemtype(arguments[i])=='card'){
if(j=='name'){
if(Array.isArray(filter[j])){
@ -61008,7 +61137,12 @@
for(i=0;i<skills.length;i++){
if(lib.skill[skills[i]]&&(lib.skill[skills[i]].nopop||lib.skill[skills[i]].equipSkill)) continue;
if(lib.translate[skills[i]+'_info']){
translation=lib.translate[skills[i]+'_ab']||get.translation(skills[i]).slice(0,2);
if(lib.translate[skills[i]+'_ab']) translation=lib.translate[skills[i]+'_ab'];
else{
translation=get.translation(skills[i]);
if(!lib.skill[skills[i]].nobracket) translation=translation.slice(0,2);
}
if(node.forbiddenSkills[skills[i]]){
var forbidstr='<div style="opacity:0.5"><div class="skill">【'+translation+'】</div><div>';
if(node.forbiddenSkills[skills[i]].length){
@ -61092,9 +61226,6 @@
intronode.listen(ui.click.skillbutton);
}
}
else if(lib.skill[skills[i]].nobracket){
uiintro.add('<div><div class="skilln">'+get.translation(skills[i])+'</div><div>'+get.skillInfoTranslation(skills[i],node)+'</div></div>');
}
else{
uiintro.add('<div><div class="skill">【'+translation+'】</div><div>'+get.skillInfoTranslation(skills[i],node)+'</div></div>');
}
@ -61790,13 +61921,14 @@
var skills=infoitem[3];
for(i=0;i<skills.length;i++){
if(lib.translate[skills[i]+'_info']){
translation=lib.translate[skills[i]+'_ab']||get.translation(skills[i]).slice(0,2);
if(lib.skill[skills[i]]&&lib.skill[skills[i]].nobracket){
uiintro.add('<div><div class="skilln">'+get.translation(skills[i])+'</div><div>'+get.skillInfoTranslation(skills[i])+'</div></div>');
}
if(lib.translate[skills[i]+'_ab']) translation=lib.translate[skills[i]+'_ab'];
else{
uiintro.add('<div><div class="skill">【'+translation+'】</div><div>'+get.skillInfoTranslation(skills[i])+'</div></div>');
translation=get.translation(skills[i]);
if(!lib.skill[skills[i]].nobracket) translation=translation.slice(0,2);
}
uiintro.add('<div><div class="skill">【'+translation+'】</div><div>'+get.skillInfoTranslation(skills[i])+'</div></div>');
if(lib.translate[skills[i]+'_append']){
uiintro._place_text=uiintro.add('<div class="text">'+lib.translate[skills[i]+'_append']+'</div>')
}

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
image/character/sunyu.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

View File

@ -4071,6 +4071,12 @@ span[data-nature='woodmm'] {
text-shadow: rgba(57, 123, 4,1) 0 0 2px,rgba(57, 123, 4,1) 0 0 2px,rgba(57, 123, 4,1) 0 0 2px,
rgba(57, 123, 4,1) 0 0 2px,black 0 0 1px;
}
.player .identity[data-color="commoner"],
div[data-nature='commoner'],
span[data-nature='commoner'] {
text-shadow: rgb(135, 135, 135, 1) 0 0 2px,rgba(135, 135, 135, 1) 0 0 5px,rgba(135, 135, 135, 1) 0 0 10px,
rgba(135, 135, 135, 1) 0 0 10px,rgba(135, 135, 135, 1) 0 0 20px,rgba(135, 135, 135, 1) 0 0 20px,black 0 0 1px;
}
.player .identity[data-color="cai"],
.player .identity[data-color="bZhu"],

View File

@ -2172,21 +2172,21 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
player.chooseToDiscard('he',get.prompt('noda_axe',trigger.target),2,'弃置两张牌,令'+get.translation(trigger.target)+'本回合内不能使用或打出牌且防具技能无效。',function(card,player){
return card!=player.getEquip(1);
}).set('logSkill',['noda_axe',trigger.target]).set('goon',function(event,player){
if(player.hasSkill('noda_axe2')) return false;
if(event.getParent().excluded.contains(player)) return false;
if(get.attitude(event.player,player)>0){
return false;
}
if(get.type(event.card)=='trick'&&event.player.hasWuxie()) return true;
if(get.tag(event.card,'respondSha')){
if(!player.hasSha()) return false;
return true;
}
else if(get.tag(event.card,'respondShan')){
if(!player.hasShan()) return false;
return true;
}
return false;
if(player.hasSkill('noda_axe2')) return false;
if(event.getParent().excluded.contains(player)) return false;
if(get.attitude(event.player,player)>0){
return false;
}
if(get.type(event.card)=='trick'&&event.player.hasWuxie()) return true;
if(get.tag(event.card,'respondSha')){
if(!player.hasSha()) return false;
return true;
}
else if(get.tag(event.card,'respondShan')){
if(!player.hasShan()) return false;
return true;
}
return false;
}(trigger,trigger.target)).set('ai',function(card){
if(_status.event.goon) return 7.5-get.value(card);
return 0;
@ -2268,7 +2268,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(current!=player&&current.countCards('e')){
player.line(current);
current.discard(current.getCards('e'));
};
}
});
},
},
@ -8266,7 +8266,6 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(target.classList.contains('turnedover')) return -1;
return 5-target.getDamagedHp();
}
return 1;
}
"step 1"
if(result.bool){

File diff suppressed because it is too large Load Diff

View File

@ -5435,7 +5435,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
init:function(player){
for(var i=1;i<6;i++){
player.$disableEquip('equip'+i);
};
}
},
check:function(card){
var player=_status.currentPhase;

View File

@ -50,7 +50,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
event.textnode.textContent='正在连接...';
clearTimeout(event.timeout);
if(e) e.preventDefault();
game.saveConfig('last_ip',node.textContent=node.textContent);
game.saveConfig('last_ip',node.textContent);
game.connect(node.textContent,function(success){
if(!success&&event.textnode){
alert('连接失败');

View File

@ -2103,7 +2103,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
forced:true,
equipSkill:true,
filter:function(event,player){
return lib.skill.toushiche_skill.logTarget(null,player).length>0;
return lib.skill.toushiche_skill.logTarget(null,player).length>0;
},
logTarget:function(event,player){
var hs=player.countCards('h');

View File

@ -365,7 +365,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
mode_guozhan:{
guozhan_default:["gz_caocao","gz_simayi","gz_xiahoudun","gz_zhangliao","gz_xuzhu","gz_guojia","gz_zhenji","gz_xiahouyuan","gz_zhanghe","gz_xuhuang","gz_caoren","gz_dianwei","gz_xunyu","gz_caopi","gz_yuejin","gz_liubei","gz_guanyu","gz_zhangfei","gz_zhugeliang","gz_zhaoyun","gz_machao","gz_huangyueying","gz_huangzhong","gz_weiyan","gz_pangtong","gz_sp_zhugeliang","gz_liushan","gz_menghuo","gz_zhurong","gz_ganfuren","gz_sunquan","gz_ganning","gz_lvmeng","gz_huanggai","gz_zhouyu","gz_daqiao","gz_luxun","gz_sunshangxiang","gz_sunjian","gz_xiaoqiao","gz_taishici","gz_zhoutai","gz_re_lusu","gz_zhangzhang","gz_dingfeng","gz_huatuo","gz_lvbu","gz_diaochan","gz_re_yuanshao","gz_yanwen","gz_jiaxu","gz_pangde","gz_zhangjiao","gz_caiwenji","gz_mateng","gz_kongrong","gz_jiling","gz_tianfeng","gz_panfeng","gz_zoushi",],
guozhan_zhen:["gz_dengai","gz_caohong","gz_jiangfei","gz_jiangwei","gz_xusheng","gz_jiangqing","gz_hetaihou","gz_yuji"],
guozhan_shi:[,"gz_re_lidian","gz_zangba","gz_madai","gz_mifuren","gz_sunce","gz_chendong","gz_sp_dongzhuo","gz_zhangren"],
guozhan_shi:["gz_re_lidian","gz_zangba","gz_madai","gz_mifuren","gz_sunce","gz_chendong","gz_sp_dongzhuo","gz_zhangren"],
guozhan_bian:["gz_liqueguosi","gz_zuoci","gz_bianfuren","gz_xunyou","gz_lingtong","gz_lvfan","gz_masu","gz_shamoke",],
guozhan_quan:["gz_cuimao","gz_yujin","gz_wangping","gz_fazheng","gz_wuguotai","gz_lukang","gz_yuanshu","gz_zhangxiu"],
guozhan_jun:["gz_jun_caocao","gz_jun_sunquan","gz_jun_liubei","gz_jun_zhangjiao"],
@ -1485,7 +1485,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
group:'gzgongjian_gain',
subSkill:{
gain:{
audio:'gongjian',
audio:'gongjian',
trigger:{
global:['loseAfter','loseAsyncAfter'],
},
@ -1911,7 +1911,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
return get.suit(card)=='diamond'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'lebu'},[card]),event.target);
},'he')||player.hasCard(function(card){
return get.suit(card)=='club'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'bingliang'},[card]),event.target,false);
}),'he') return true;
},'he')) return true;
return false;
},
check:function(event,player){
@ -2427,8 +2427,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
mark:{
marktext:'祸',
intro:{
content:'mark',
onunmark:true,
content:'mark',
onunmark:true,
},
},
},
@ -2809,25 +2809,25 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(double) groups=double.slice(0);
else groups=[lib.character[character][1]];
event.groups=groups;
event.videoId=lib.status.videoId++;
game.broadcastAll(function(player,id,character){
ui.create.dialog(get.translation(player)+'发动了【博览】',[[character],'character']).videoId=id;
},player,event.videoId,character);
game.delay(3);
'step 1'
game.broadcastAll('closeDialog',event.videoId);
var list1=['wei','shu','wu','qun','jin'],list2=['gzqice','tiaoxin','gzzhiheng','new_chuli','gzsanchen'];
var skills=[];
for(var i=0;i<list1.length;i++){
if(event.groups.contains(list1[i])) skills.push(list2[i]);
}
if(!skills.length) event.finish();
else if(skills.length==1) event._result={control:skills[0]};
else player.chooseControl(skills).set('prompt','选择获得一个技能直到回合结束');
'step 2'
var skill=result.control;
player.addTempSkill(skill);
game.log(player,'获得了技能','#g【'+get.translation(skill)+'】');
event.videoId=lib.status.videoId++;
game.broadcastAll(function(player,id,character){
ui.create.dialog(get.translation(player)+'发动了【博览】',[[character],'character']).videoId=id;
},player,event.videoId,character);
game.delay(3);
'step 1'
game.broadcastAll('closeDialog',event.videoId);
var list1=['wei','shu','wu','qun','jin'],list2=['gzqice','tiaoxin','gzzhiheng','new_chuli','gzsanchen'];
var skills=[];
for(var i=0;i<list1.length;i++){
if(event.groups.contains(list1[i])) skills.push(list2[i]);
}
if(!skills.length) event.finish();
else if(skills.length==1) event._result={control:skills[0]};
else player.chooseControl(skills).set('prompt','选择获得一个技能直到回合结束');
'step 2'
var skill=result.control;
player.addTempSkill(skill);
game.log(player,'获得了技能','#g【'+get.translation(skill)+'】');
},
derivation:['gzqice','tiaoxin','gzzhiheng','new_chuli','gzsanchen'],
ai:{
@ -4103,9 +4103,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
return '没有“戮”';
}
},
content:function(storage,player){
return '共有'+get.cnNumber(storage.length)+'张“戮”';
},
// content:function(storage,player){
// return '共有'+get.cnNumber(storage.length)+'张“戮”';
// },
},
group:'gzshilu_zhiheng',
subSkill:{
@ -4853,7 +4853,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
});
},
selectTarget:-1,
filterTarget:function(card,player,target){;
filterTarget:function(card,player,target){
if(player==target) return true;
if(player.identity=='unknown'){
var group='shu';
@ -7806,7 +7806,6 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
trigger.source.chooseJunlingControl(player,result.junling,result.targets).set('prompt','补益').set('choiceList',choiceList).set('ai',function(){
if(get.recoverEffect(trigger.player,player,_status.event.player)>0) return 1;
return (get.attitude(trigger.source,trigger.player)<0&&get.junlingEffect(player,result.junling,trigger.source,result.targets,trigger.source)>=-2)?1:0;
return 0;
});
'step 2'
if(result.index==0) trigger.source.carryOutJunling(player,event.junling,targets);
@ -8800,8 +8799,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
game.log(player,'获得了技能','#g【'+get.translation(result.control)+'】');
game.delay();
},
forceaudio:true,
audio:['xuanhuo',2],
// forceaudio:true,
// audio:['xuanhuo',2],
ai:{
order:8,
result:{player:1},
@ -8809,7 +8808,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
},
//used:{},
},
audio:['xuanhuo',2],
// audio:['xuanhuo',2],
},
fz_gzpaoxiao:{
audio:true,
@ -10383,8 +10382,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
case '珠联(桃)': return get.copy(lib.skill._zhulianbihe_mark_tao);
case '珠联(摸牌)': return {
content:function(){
player.draw(2);
player.removeMark(player.hasMark('zhulianbihe_mark')?'zhulianbihe_mark':'yexinjia_mark',1);
player.draw(2);
player.removeMark(player.hasMark('zhulianbihe_mark')?'zhulianbihe_mark':'yexinjia_mark',1);
},
};
case '阴阳鱼': return {
@ -11132,7 +11131,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
backup:function(links,player){
return {
filterCard:true,
audio:"qice",
audio:'qice_backup',
selectCard:-1,
position:'h',
selectTarget:function(){
@ -11154,7 +11153,6 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
return lib.filter.filterTarget(card,player,target);
},
audio:'qice_backup',
popname:true,
viewAs:{name:links[0][2]},
ai1:function(){
@ -11887,7 +11885,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
return false;
})
};
}
if(trigger.name=='lose'){
for(var i of trigger.cards){
if(i.name=='feilongduofeng'&&get.position(i,true)=='d') cards.push(i);
@ -12342,7 +12340,6 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
return player.siege(event.target)&&event.player.siege(event.target);
},
forced:true,
audio:'zniaoxiang',
forceaudio:true,
logTarget:'target',
content:function(){
@ -12661,7 +12658,10 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
for(var i=0;i<skills.length;i++){
list.add(skills[i]);
var info=lib.skill[skills[i]];
if(info.charlotte){list.splice(i--);continue};
if (info.charlotte) {
list.splice(i--);
continue;
}
if(typeof info.derivation=='string'){
list.add(info.derivation);
}
@ -14219,13 +14219,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
game.me.chooseButtonOL(chosen,function(player,result){
if(player==game.me) player.trueIdentity=result.links[0][2].slice(6);
}).set('switchToAuto',function(){
_status.event.result='ai';
}).set('processAI',function(){
return {
bool:true,
links:[_status.event.dialog.buttons.randomGet().link],
}
});
_status.event.result='ai';
}).set('processAI',function(){
return {
bool:true,
links:[_status.event.dialog.buttons.randomGet().link],
}
});
}
else event._result={};
'step 2'

View File

@ -186,6 +186,23 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
});
}
"step 4"
var yearLimitCheck=()=>{
var next=game.createEvent('year_limit_pop',false);
next.setContent(function(){
'step 0'
var str=get.cnNumber(game.shuffleNumber+1,true);
game.me.$fullscreenpop(`${str}`,'thunder');
game.log('游戏进入了',`#y第${str}`);
if(game.shuffleNumber+1<game.countPlayer2()) event.finish();
else game.delay(2);
'step 1'
game.me.$fullscreenpop('年份已到','metal');
game.log('年份已到,主忠方判定为胜利');
game.delay(2);
'step 2'
game.over(game.me.identity=='zhu'||game.me.identity=='zhong'||game.me.identity=='mingzhong'||(game.me.identity=='commoner'&&game.me.isIn()));
});
};
if(_status.connectMode){
_status.mode=lib.configOL.identity_mode;
if(_status.mode=='zhong'){
@ -197,12 +214,45 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
else if(_status.mode=='purple'){
lib.configOL.number=8;
}
else if(_status.mode=='normal'){
if(lib.configOL.enable_commoner||lib.configOL.double_nei){
var identity=lib.configOL.enable_commoner?'commoner':'nei';
for(var i=1;i<lib.config.mode_config.identity.identity.length;i++){
var list=lib.config.mode_config.identity.identity[i];
var toReplace;
if(list.filter(i=>i=='nei').length>=2) toReplace='nei';
else if(list.filter(i=>i=='zhong').length>list.filter(i=>i=='fan').length/2) toReplace='zhong';
else toReplace='fan';
list.remove(toReplace);
list.push(identity);
}
game.broadcast(identityList=>lib.config.mode_config.identity.identity=identityList,lib.config.mode_config.identity.identity);
}
}
if(lib.configOL.number<2){
lib.configOL.number=2;
}
if(_status.mode!='purple'&&lib.configOL.enable_year_limit){
lib.onwash.push(yearLimitCheck);
}
game.randomMapOL();
}
else{
if(_status.mode=='normal'&&(get.config('enable_commoner')||get.config('double_nei'))){
var identity=get.config('enable_commoner')?'commoner':'nei';
for(var i=1;i<lib.config.mode_config.identity.identity.length;i++){
var list=lib.config.mode_config.identity.identity[i];
var toReplace;
if(list.filter(i=>i=='nei').length>=2) toReplace='nei';
else if(list.filter(i=>i=='zhong').length>list.filter(i=>i=='fan').length/2) toReplace='zhong';
else toReplace='fan';
list.remove(toReplace);
list.push(identity);
}
}
if(_status.mode!='purple'&&get.config('enable_year_limit')){
lib.onwash.push(yearLimitCheck);
}
for(var i=0;i<game.players.length;i++){
game.players[i].getId();
}
@ -420,9 +470,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(lib.configOL.identity_mode=='stratagem'){
uiintro.add('<div class="text chat">首轮强化:'+(lib.configOL.round_one_use_fury?'开启':'关闭'));
}
else{
else if(lib.configOL.identity_mode!='purple'){
uiintro.add('<div class="text chat">双内奸:'+(lib.configOL.double_nei?'开启':'关闭'));
uiintro.add('<div class="text chat">加强主公:'+(lib.configOL.enhance_zhu?'开启':'关闭'));
if(lib.configOL.identity_mode!='stratagem'){
uiintro.add('<div class="text chat">加强主公:'+(lib.configOL.enhance_zhu?'开启':'关闭'));
uiintro.add('<div class="text chat">平民身份:'+(lib.configOL.enable_commoner?'开启':'关闭'));
}
uiintro.add('<div class="text chat">年机制:'+(lib.configOL.enable_year_limit?'开启':'关闭'));
}
}
else{
@ -505,6 +559,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
fan:'反',
zhong:'忠',
nei:'内',
commoner:'民',
cai:'猜',
}
}
@ -515,6 +570,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
case 'fan':list[i]='反贼';break;
case 'zhong':list[i]='忠臣';break;
case 'nei':list[i]='内奸';break;
case 'commoner':list[i]='平民'; break;
case 'zhu':list[i]='主公';break;
case 'enemy':list[i]='敌方';break;
case 'friend':list[i]='友方';break;
@ -536,9 +592,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
switch(_status.mode){
case 'purple':str2='3v3v2 - '+(game.me.identity.indexOf('r')==0?'暖色':'冷色')+lib.translate[game.me.identity+'2'];break;
case 'zhong':str2='忠胆英杰 - '+lib.translate[game.me.identity+'2'];break;
case 'stratagem':str2=get.cnNumber(get.playerNumber())+'人谋攻'+'-'+lib.translate[game.me.identity+'2'];
default:str2=get.cnNumber(get.playerNumber())+'人'+
get.translation(lib.config.mode)+' - '+lib.translate[game.me.identity+'2']
case 'stratagem':str2=get.cnNumber(get.playerNumber())+'人谋攻'+'-'+lib.translate[game.me.identity+'2'];break;
default:str2=get.cnNumber(get.playerNumber())+'人'+get.translation(lib.config.mode)+' - '+lib.translate[game.me.identity+'2']
}
}
var name=[
@ -563,7 +618,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
else{
data[identity][1]++;
}
var list=['zhu','zhong','nei','fan'];
var list=['zhu','zhong','nei','fan','commoner'];
var str='';
for(var i=0;i<list.length;i++){
if(data[list[i]]){
@ -672,6 +727,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
switch(me.identity){
case 'fan':game.over(false);break;
case 'zhong':game.over(true);break;
case 'commoner':game.over(true); break;
default:game.over();break;
}
}
@ -679,6 +735,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
switch(me.identity){
case 'fan':game.over(true);break;
case 'zhong':game.over(false);break;
case 'commoner':game.over(true); break;
default:game.over();break;
}
}
@ -698,14 +755,14 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
}
else if(me.identity=='nei'){
if(game.players.length==1&&me.isAlive()){
if(game.players.length==(1+game.players.filter(i=>i.identity=='commoner').length)&&me.isAlive()){
game.over(true);
}
else{
game.over(false);
}
}
else{
else if(me.identity=='fan'){
if((get.population('fan')+get.population('zhong')>0||get.population('nei')>1)&&
game.zhu.classList.contains('dead')){
game.over(true);
@ -714,6 +771,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
game.over(false);
}
}
else if(me.identity=='commoner'){
game.over(true);
}
},
checkOnlineResult:function(player){
if(_status.winner&&_status.loser){
@ -722,13 +782,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(_status.winner.contains(player)) return true;
}
if(game.zhu.isAlive()){
return (player.identity=='zhu'||player.identity=='zhong'||player.identity=='mingzhong');
return (player.identity=='zhu'||player.identity=='zhong'||player.identity=='mingzhong'||player.identity=='commoner'&&player.isAlive());
}
else if(game.players.length==1&&game.players[0].identity=='nei'){
else if(game.players.length==(1+game.players.filter(i=>i.identity=='commoner').length)&&game.players[0].identity=='nei'||game.players[0].identity=='commoner'){
return player.isAlive();
}
else{
return player.identity=='fan';
return player.identity=='fan'||player.identity=='commoner'&&player.isAlive();
}
},
chooseCharacterPurpleOL:function(){
@ -748,24 +808,24 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
players.push(players.shift());
}
game.broadcastAll(function(players,identityList,list){
_status.mode='purple';
if(game.online) ui.arena.classList.add('choose-character');
for(var i=0;i<players.length;i++){
players[i].node.identity.classList.add('guessing');
players[i].identity=identityList[i];
players[i].setIdentity(list.contains(identityList[i])?'cai2':'cai');
if(['rZhu','bZhu'].contains(identityList[i])){
game[identityList[i]]=players[i];
players[i].setIdentity(identityList[i]);
players[i].identityShown=true;
players[i].node.identity.classList.remove('guessing');
}
}
game.zhu=game.rZhu;
game.rZhu.isZhu=true;
game.bZhu.isZhu=true;
game.me.setIdentity();
game.me.node.identity.classList.remove('guessing');
_status.mode='purple';
if(game.online) ui.arena.classList.add('choose-character');
for(var i=0;i<players.length;i++){
players[i].node.identity.classList.add('guessing');
players[i].identity=identityList[i];
players[i].setIdentity(list.contains(identityList[i])?'cai2':'cai');
if(['rZhu','bZhu'].contains(identityList[i])){
game[identityList[i]]=players[i];
players[i].setIdentity(identityList[i]);
players[i].identityShown=true;
players[i].node.identity.classList.remove('guessing');
}
}
game.zhu=game.rZhu;
game.rZhu.isZhu=true;
game.bZhu.isZhu=true;
game.me.setIdentity();
game.me.node.identity.classList.remove('guessing');
},players,identityList,list);
players.sortBySeat(game.zhu);
for(var i=0;i<players.length;i++){
@ -828,15 +888,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
var players=[game.rZhu,game.bZhu];
var list=[];
for(var i=0;i<players.length;i++){
if(true){
var group=event[players[i].identity];
var str='选择角色';
var list2=event.map[group].randomGets(4);
if(event.map_zhu[group]) list2.addArray(event.map_zhu[group].randomGets(2));
event.map[players[i].playerid]=list2;
list.push([players[i],[str,[list2,'character']],true]);
}
}
var group=event[players[i].identity];
var str='选择角色';
var list2=event.map[group].randomGets(4);
if(event.map_zhu[group]) list2.addArray(event.map_zhu[group].randomGets(2));
event.map[players[i].playerid]=list2;
list.push([players[i],[str,[list2,'character']],true]);
}
game.me.chooseButtonOL(list,function(player,result){
if(game.online||player==game.me){
player.init(result.links[0]);
@ -874,13 +932,11 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
var players=game.players.slice(0);
players.removeArray([game.rZhu,game.bZhu]);
for(var i=0;i<players.length;i++){
if(true){
var group=event[players[i].identity.slice(0,1)+'Zhu'];
var str='选择角色';
var list2=event.map[group].randomRemove(event.mapNum[group]);
event.map[players[i].playerid]=list2;
list.push([players[i],[str,[list2,'character']],true]);
}
var group=event[players[i].identity.slice(0,1)+'Zhu'];
var str='选择角色';
var list2=event.map[group].randomRemove(event.mapNum[group]);
event.map[players[i].playerid]=list2;
list.push([players[i],[str,[list2,'character']],true]);
}
game.me.chooseButtonOL(list,function(player,result){
if(game.online||player==game.me){
@ -946,8 +1002,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
}
game.zhu=game.rZhu;
game.rZhu.isZhu=true;
game.bZhu.isZhu=true;
game.rZhu.isZhu=true;
game.bZhu.isZhu=true;
game.me.setIdentity();
game.me.node.identity.classList.remove('guessing');
players.sortBySeat(game.zhu);
@ -1203,8 +1259,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
else{
result[i]=result[i].links;
}
if(get.is.double(result[i][0])||
lib.character[result[i][0]]&&lib.character[result[i][0]][1]=='shen'&&!lib.character[result[i][0]][4].contains('hiddenSkill')) shen.push(lib.playerOL[i]);
if(get.is.double(result[i][0])||lib.character[result[i][0]]&&lib.character[result[i][0]][1]=='shen'&&!lib.character[result[i][0]][4].contains('hiddenSkill')) shen.push(lib.playerOL[i]);
}
event.result2=result;
if(shen.length){
@ -1225,13 +1280,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
game.me.chooseButtonOL(shen,function(player,result){
if(player==game.me) player.changeGroup(result.links[0][2].slice(6),false,false);
}).set('switchToAuto',function(){
_status.event.result='ai';
}).set('processAI',function(){
return {
bool:true,
links:[_status.event.dialog.buttons.randomGet().link],
}
});
_status.event.result='ai';
}).set('processAI',function(){
return {
bool:true,
links:[_status.event.dialog.buttons.randomGet().link],
}
});
}
else event._result={};
'step 3'
@ -1436,34 +1491,6 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
else{
if(_status.mode=='stratagem') event.stratagemMode=true;
identityList=get.identityList(game.players.length);
if(get.config('double_nei')){
switch(get.playerNumber()){
case 8:
identityList.remove('fan');
identityList.push('nei');
break;
case 7:
identityList.remove('zhong');
identityList.push('nei');
break;
case 6:
identityList.remove('fan');
identityList.push('nei');
break;
case 5:
identityList.remove('fan');
identityList.push('nei');
break;
case 4:
identityList.remove('zhong');
identityList.push('nei');
break;
case 3:
identityList.remove('fan');
identityList.push('nei');
break;
}
}
}
var stratagemMode=event.stratagemMode;
@ -1480,6 +1507,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
else{
listi=['random','zhu','zhong','fan','nei'];
if(get.config('enable_commoner')) listi.push('commoner');
}
for(var i=0;i<listi.length;i++){
@ -1519,7 +1547,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
link=['zhu','zhong','nei','fan','mingzhong'].randomGet();
}
else{
link=['zhu','zhong','nei','fan'].randomGet();
var listi=['zhu','zhong','nei','fan'];
if(get.config('enable_commoner')) listi.push('commoner');
link=listi.randomGet();
}
for(var i=0;i<this.parentNode.childElementCount;i++){
if(this.parentNode.childNodes[i].link==link){
@ -1667,7 +1697,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(ban_identity.length){
var identityList2=identityList.slice(0);
for(var i=0;i<ban_identity.length;i++){
while(identityList2.remove(ban_identity[i]));
while(identityList2.includes(ban_identity[i])){
identityList2.remove(ban_identity[i]);
}
}
ban_identity=identityList2.randomGet();
identityList.remove(ban_identity);
@ -1779,7 +1811,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
else{
list3.push(i);
}
};
}
var getZhuList=function(){
if(stratagemMode){
list2.sort(lib.sort.character);
@ -2121,34 +2153,6 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
else{
identityList=get.identityList(game.players.length);
if(lib.configOL.double_nei){
switch(lib.configOL.number){
case 8:
identityList.remove('fan');
identityList.push('nei');
break;
case 7:
identityList.remove('zhong');
identityList.push('nei');
break;
case 6:
identityList.remove('fan');
identityList.push('nei');
break;
case 5:
identityList.remove('fan');
identityList.push('nei');
break;
case 4:
identityList.remove('zhong');
identityList.push('nei');
break;
case 3:
identityList.remove('fan');
identityList.push('nei');
break;
}
}
}
identityList.randomSort();
for(i=0;i<game.players.length;i++){
@ -2436,7 +2440,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
result[i]=result[i].links;
}
if(get.is.double(result[i][0])||
lib.character[result[i][0]]&&lib.character[result[i][0]][1]=='shen'&&!lib.character[result[i][0]][4].contains('hiddenSkill')) shen.push(lib.playerOL[i]);
lib.character[result[i][0]]&&lib.character[result[i][0]][1]=='shen'&&!lib.character[result[i][0]][4].contains('hiddenSkill')) shen.push(lib.playerOL[i]);
}
event.result2=result;
if(shen.length){
@ -2457,13 +2461,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
game.me.chooseButtonOL(shen,function(player,result){
if(player==game.me) player.changeGroup(result.links[0][2].slice(6),false,false);
}).set('switchToAuto',function(){
_status.event.result='ai';
}).set('processAI',function(){
return {
bool:true,
links:[_status.event.dialog.buttons.randomGet().link],
}
});
_status.event.result='ai';
}).set('processAI',function(){
return {
bool:true,
links:[_status.event.dialog.buttons.randomGet().link],
}
});
}
else event._result={};
"step 5"
@ -2471,23 +2475,23 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
for(var i in result){
if(result[i]&&result[i].links) result[i]=result[i].links[0][2].slice(6);
else if(result[i]=='ai') result[i]=function(){
var player=lib.playerOL[i];
var list=['wei','shu','wu','qun','jin','key'];
var player=lib.playerOL[i];
var list=['wei','shu','wu','qun','jin','key'];
for(var ix=0;ix<list.length;ix++){
if(!lib.group.contains(list[ix])) list.splice(ix--,1);
}
if(_status.mode!='zhong'&&game.zhu&&game.zhu.group){
if(['re_zhangjiao','liubei','re_liubei','caocao','re_caocao','sunquan','re_sunquan','zhangjiao','sp_zhangjiao','caopi','re_caopi','liuchen','caorui','sunliang','sunxiu','sunce','re_sunben','ol_liushan','re_liushan','key_akane','dongzhuo','re_dongzhuo','ol_dongzhuo','jin_simashi','caomao'].contains(game.zhu.name)) return game.zhu.group;
if(game.zhu.name=='yl_yuanshu'){
if(player.identity=='zhong') list.remove('qun');
else return 'qun';
}
if(['sunhao','xin_yuanshao','re_yuanshao','re_sunce','ol_yuanshao','yuanshu','jin_simazhao','liubian'].contains(game.zhu.name)){
if(player.identity!='zhong') list.remove(game.zhu.group);
else return game.zhu.group;
}
}
return list.randomGet();
if(_status.mode!='zhong'&&game.zhu&&game.zhu.group){
if(['re_zhangjiao','liubei','re_liubei','caocao','re_caocao','sunquan','re_sunquan','zhangjiao','sp_zhangjiao','caopi','re_caopi','liuchen','caorui','sunliang','sunxiu','sunce','re_sunben','ol_liushan','re_liushan','key_akane','dongzhuo','re_dongzhuo','ol_dongzhuo','jin_simashi','caomao'].contains(game.zhu.name)) return game.zhu.group;
if(game.zhu.name=='yl_yuanshu'){
if(player.identity=='zhong') list.remove('qun');
else return 'qun';
}
if(['sunhao','xin_yuanshao','re_yuanshao','re_sunce','ol_yuanshao','yuanshu','jin_simazhao','liubian'].contains(game.zhu.name)){
if(player.identity!='zhong') list.remove(game.zhu.group);
else return game.zhu.group;
}
}
return list.randomGet();
}();
}
var result2=event.result2;
@ -2542,6 +2546,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
mingzhong:"忠",
nei:"内",
fan:"反",
commoner:'民',
cai:"猜",
cai2:"猜",
rZhu:"主",
@ -2565,6 +2570,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
mingzhong2:"明忠",
nei2:"内奸",
fan2:"反贼",
commoner2:'平民',
random2:"随机",
enemy:'敌',
friend:'友',
@ -2653,16 +2659,16 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(_status.mode=='stratagem') return;
if(_status.mode=='purple'){
if(source){
if(this.identity=='rZhu'||this.identity=='bZhu'){
if(this.identity.slice(0,1)!=source.identity.slice(0,1)) source.recover();
}
else if(this.identity=='rZhong'||this.identity=='bZhong'){
if(this.identity.slice(0,1)!=source.identity.slice(0,1)) source.draw(2);
else if(source.identity.indexOf('Zhu')==1) source.discard(source.getCards('h'));
}
else if(this.identity=='rNei'||this.identity=='bNei'){
if(this.identity.slice(0,1)==source.identity.slice(0,1)) source.draw(3);
}
if(this.identity=='rZhu'||this.identity=='bZhu'){
if(this.identity.slice(0,1)!=source.identity.slice(0,1)) source.recover();
}
else if(this.identity=='rZhong'||this.identity=='bZhong'){
if(this.identity.slice(0,1)!=source.identity.slice(0,1)) source.draw(2);
else if(source.identity.indexOf('Zhu')==1) source.discard(source.getCards('h'));
}
else if(this.identity=='rNei'||this.identity=='bNei'){
if(this.identity.slice(0,1)==source.identity.slice(0,1)) source.draw(3);
}
}
if(!_status.yeconfirm){
_status.yeconfirm=true;
@ -2674,12 +2680,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
});
if(player){
player.showIdentity();
};
}
}
});
}
}
if(this.identity=='fan'&&source) source.draw(3);
else if(this.identity=='commoner'&&source) source.draw(2);
else if(this.identity=='mingzhong'&&source){
if(source.identity=='zhu'){
source.discard(source.getCards('he'));
@ -2725,10 +2732,10 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
});
if(red.length<=1&&blue.length<=1) game.broadcastAll(game.showIdentity);
return;
};
}
if(game.zhu&&game.zhu.isZhu){
if(get.population('zhong')+get.population('nei')==0||
get.population('zhong')+get.population('fan')==0){
if((get.population('zhong')+get.population('nei')==0||
get.population('zhong')+get.population('fan')==0)&&get.population('commoner')==0){
game.broadcastAll(function(){
if(game.showIdentity) game.showIdentity();
if(game.zhu&&game.zhu.isAlive()&&get.population('nei')==1&&get.config('nei_fullscreenpop')) game.me.$fullscreenpop('<span style="font-family:xinwei"><span data-nature="fire">主公</span><span data-nature="soil"> vs </span><span data-nature="thunder">内奸</span></span>',null,null,false);
@ -2832,7 +2839,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
else if(targets.length==1) this.ai.shown+=0.2*c;
else this.ai.shown+=0.1*c;
}
else if(effect<0&&this==game.me&&['nei','rYe','bYe'].contains(game.me.identity)){
else if(effect<0&&this==game.me&&['nei','commoner','rYe','bYe'].contains(game.me.identity)){
if(targets.length==1&&targets[0]==this);
else if(targets.length==1) this.ai.shown-=0.2;
else this.ai.shown-=0.1;
@ -2864,7 +2871,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(targets.length==1&&targets[0]==this){
effect=0;
}
else if(this.identity!='nei'){
else if(this.identity!='nei'&&this.identity!='commoner'){
if(this.ai.shown>0){
if(this.identity=='fan'){
effect=-1;
@ -2884,7 +2891,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
effect+=get.effect(targets[i],card,this,zhu)*c;
}
}
if(this.identity=='nei'){
if(this.identity=='nei'||this.identity=='commoner'){
if(effect>0){
if(this.ai.identity_mark=='fan'){
if(marknow) this.setIdentity();
@ -3160,7 +3167,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
return x/num;
}
var real=get.realAttitude(from,to),zhibi=from.storage.zhibi,stratagem_expose=from.storage.stratagem_expose,followCamouflage=true;
if(to.ai.shown) return to.ai.shown*(real+(from.identity==to.identity||from.identity=='zhu'&&to.identity=='zhong'||from.identity=='zhong'&&to.identity=='zhu'||(to.identity=='nei'&&get.situation()<=0&&['zhu','zhong'].contains(from.identity)||get.situation()>=3&&from.identity=='fan')?3:-3))
if(to.ai.shown) return to.ai.shown*(real+(from.identity==to.identity||from.identity=='zhu'&&to.identity=='zhong'||from.identity=='zhong'&&to.identity=='zhu'||from.identity=='nei'&&to.identity=='zhu'&&get.situation()<=1||(to.identity=='nei'&&get.situation()<=0&&['zhu','zhong'].contains(from.identity)||get.situation()>=3&&from.identity=='fan')?2.9:-2.9))
if(from==to||to.identityShown||((stratagem_expose&&stratagem_expose.contains(to))||(zhibi&&zhibi.contains(to)))&&!to.ai.stratagemCamouflage) return real*1.1;
if(from.identity=='nei'&&to.ai.stratagemCamouflage) return real*1.1;
if(to.identity=='nei'){
@ -3246,7 +3253,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
}
var aishown=to.ai.shown;
if(to.identity=='nei'&&to.ai.shown<1&&(to.ai.identity_mark=='fan'||to.ai.identity_mark=='zhong')){
if((to.identity=='nei'||to.identity=='commoner')&&to.ai.shown<1&&(to.ai.identity_mark=='fan'||to.ai.identity_mark=='zhong')){
aishown=0.5;
}
else if(aishown==0&&to.identity!='fan'&&to.identity!='zhu'){
@ -3455,7 +3462,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
//正常身份模式态度
if(!game.zhu){
if(from.identity=='nei'||to.identity=='nei') return -1;
if(from.identity=='nei'||to.identity=='nei'||from.identity=='commoner'||to.identity=='commoner') return -1;
if(from.identity==to.identity) return 6;
return -6;
}
@ -3469,13 +3476,18 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(from!=to&&to.identity=='nei'&&to.ai.shown<1&&(to.ai.identity_mark=='fan'||to.ai.identity_mark=='zhong')){
identity2=to.ai.identity_mark;
}
if(from.identity!='nei'&&from!=to&&get.population('fan')==0&&identity2=='zhong'){
if(from.identity!='nei'&&from.identity!='commoner'&&from!=to&&get.population('fan')==0&&identity2=='zhong'){
for(var i=0;i<game.players.length;i++){
if(game.players[i].identity=='nei'&&
game.players[i].ai.identity_mark=='zhong'&&
game.players[i].ai.shown<1){
identity2='nei';break;
}
else if(game.players[i].identity=='commoner'&&
game.players[i].ai.identity_mark=='zhong'&&
game.players[i].ai.shown<1){
identity2='commoner'; break;
}
}
}
var zhongmode=false;
@ -3527,6 +3539,29 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
return -3;
}
return -4;
case 'commoner':
if(to.identity=='zhong') return 0;
if(get.population('fan')==0){
if(to.ai.identity_mark=='zhong'&&to.ai.shown<1) return 0;
return -0.5;
}
if(zhongmode&&to.ai.sizhong&&to.ai.shown<1) return 6;
if(game.players.length==3){
var fan;
for(var i=0; i<game.players.length; i++){
if(game.players[i].identity=='fan'){
fan=game.players[i]; break;
}
}
if(fan){
if(to.hp>1&&to.hp>fan.hp&&to.countCards('he')>fan.countCards('he')){
return -3;
}
}
return 3;
}
if(situation<0&&game.zhu&&game.zhu.hp<=2) return -3.8;
return 2-get.population('fan');
}
break;
case 'zhong':case 'mingzhong':
@ -3538,11 +3573,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(zhongmode&&to.ai.sizhong&&to.ai.shown<1) return 6;
return Math.min(3,-situation);
case 'fan': return -8;
case 'commoner':
return Math.min(3,Math.max(-3,situation));
}
break;
case 'nei':
if(identity2=='zhu'&&game.players.length==2) return -10;
if(from!=to&&identity2!='zhu'&&game.players.length==3) return -8;
if(from!=to&&identity2!='zhu'&&identity2!='commoner'&&game.players.length==3) return -8;
var strategy=get.aiStrategy();
if(strategy==4){
if(from==to) return 10;
@ -3620,6 +3657,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(strategy==2) num++;
if(strategy==3) num--;
return num;
case 'commoner':
if(game.players.length<=4) return 5;
return Math.min(Math.max(-situation,-2),2);
}
break;
case 'fan':
@ -3643,7 +3683,35 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(game.zhu&&game.zhu.hp<=2) return -1;
return Math.min(3,situation);
case 'fan': return 5;
case 'commoner':
return 2*get.population('fan')-2;
}
break;
case 'commoner':
switch(identity2){
case 'zhu':
if(situation>0) return 2*Math.min(4,(to.hp+to.countCards('h')/4-2));
if(situation>=-3&&game.zhu) return (to.hp-2)+to.countCards('h')/4; //return Math.min(-0.1,5-game.zhu.hp);
return to.hp+to.countCards('h')/3-4;
case 'zhong':
if(situation>0){
if(to.hp>=2) return Math.min(3,Math.max(1,to.hp+to.countCards('h')/4-4));
else return 0;
}
return -2;
case 'nei':
if(game.players.length==3&&get.population('nei')==1) return Math.min(3.5,(to.hp-1.5)+to.countCards('h')/3)-(to.hp<(game.zhu?game.zhu.hp:0)?4:0);
if(game.players.length<=4&&get.population('nei')==1) return Math.min(5,(to.hp-1.5)+to.countCards('h')/3);
if(situation>0) return -3;
return 0;
case 'fan':
if(situation<0) return to.hp+to.countCards('h')/4-1.7*get.population('fan')+2;
else if(situation==0) return 0;
return 0.55*get.population('fan')-2.1;
case 'commoner':
return from==to?10:(to.hp<=2?-2:0);
}
break;
}
},
situation:function(absolute){
@ -4088,7 +4156,10 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
},
help:{
'身份模式':'<div style="margin:10px">选项</div><ul style="margin-top:0"><li>加强主公<br>反贼人数多于2时主公会额外增加一个技能每个主公的额外技能固定非常备主公增加天命<li>特殊身份<br><ul style="padding-left:20px;padding-top:5px"><li>军师:忠臣身份。只要军师存活,主公在准备阶段开始时,可以观看牌堆顶的三张牌,然后将这些牌以任意顺序置于牌堆顶或牌堆底<li>大将:忠臣身份。只要大将存活,主公手牌上限+1<li>贼首:反贼身份,只要贼首存活,主公手牌上限-1</ul></ul>',
'身份模式':'<div style="margin:10px">选项</div><ul style="margin-top:0"><li>加强主公<br>反贼人数多于2时主公会额外增加一个技能每个主公的额外技能固定非常备主公增加天命'+
'<li>特殊身份<br><ul style="padding-left:20px;padding-top:5px"><li>军师:忠臣身份。只要军师存活,主公在准备阶段开始时,可以观看牌堆顶的三张牌,然后将这些牌以任意顺序置于牌堆顶或牌堆底<li>大将:忠臣身份。只要大将存活,主公手牌上限+1<li>贼首:反贼身份,只要贼首存活,主公手牌上限-1</ul></ul>'+
'<li>平民身份<br>英盗版三国杀于2017标准版中提出的新概念。平民的获胜条件为当其他身份的角色达成了其获胜条件且你存活你也获胜同时内奸的获胜条件改为主公死亡时场上所有忠臣和反贼均已死亡。即内奸可以和与平民共同胜利。杀死平民的角色的奖惩为摸两张牌。'+
'<li>年机制<br>英盗版三国杀于2019标准版中提出的新概念。“年”是一个全局概念游戏开始时为第一年当牌堆洗牌时年数+1。一局游戏的限定年数为本局游戏开始时玩家总数。当年数增加后若当前年数已超过限定年数则主忠方直接获胜若平民存活则平民也获胜。',
'明忠模式':'<div style="margin:10px">明忠模式(忠胆英杰)</div><ul style="margin-top:0"><li>本模式需要8名玩家进行游戏使用的身份牌为1主公、2忠臣、4反贼和1内奸。游戏开始时每名玩家随机获得一个身份由系统随机选择一名忠臣身份的玩家亮出身份将忠臣牌正面朝上放在面前其他身份包括主公的玩家不亮出身份。<li>'+
'首先由亮出身份的忠臣玩家随机获得六张武将牌,挑选一名角色,并将选好的武将牌展示给其他玩家。之后其余每名玩家随机获得三张武将牌,各自从其中挑选一张同时亮出<li>'+
'亮出身份牌的忠臣增加1点体力上限。角色濒死和死亡的结算及胜利条件与普通身份局相同。',

View File

@ -612,16 +612,16 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
var str2;
if(game.versusVideoName) str2=game.versusVideoName;
else{
switch(_status.mode){
case 'two':str2='欢乐成双';break;
case 'endless':str2='无尽模式';break;
case 'three':str2='统率三军';break;
case 'siguo':str2='同舟共济';break;
case 'jiange':str2='守卫剑阁';break;
case 'four':str2='对决 - 4v4';break;
case 'guandu':str2='官渡之战';break;
default:str2='对决 - '+lib.storage.number+'v'+lib.storage.number
}
switch(_status.mode){
case 'two':str2='欢乐成双';break;
case 'endless':str2='无尽模式';break;
case 'three':str2='统率三军';break;
case 'siguo':str2='同舟共济';break;
case 'jiange':str2='守卫剑阁';break;
case 'four':str2='对决 - 4v4';break;
case 'guandu':str2='官渡之战';break;
default:str2='对决 - '+lib.storage.number+'v'+lib.storage.number
}
}
return [str,str2];
},
@ -2551,33 +2551,33 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
next.setContent(function(){
"step 0"
var list=[
['zhu','ezhu','ezhong','zhong','ezhong','zhong','zhong','ezhong'],
['zhu','ezhong','zhong','ezhu','ezhong','zhong','ezhong','zhong'],
['zhu','ezhong','zhong','ezhong','zhong','ezhong','zhong','ezhu'],
['zhu','ezhu','zhong','ezhong','zhong','ezhong','zhong','ezhong'],
['zhu','ezhong','zhong','ezhong','zhong','ezhu','zhong','ezhong'],
].randomGet();
['zhu','ezhu','ezhong','zhong','ezhong','zhong','zhong','ezhong'],
['zhu','ezhong','zhong','ezhu','ezhong','zhong','ezhong','zhong'],
['zhu','ezhong','zhong','ezhong','zhong','ezhong','zhong','ezhu'],
['zhu','ezhu','zhong','ezhong','zhong','ezhong','zhong','ezhong'],
['zhu','ezhong','zhong','ezhong','zhong','ezhu','zhong','ezhong'],
].randomGet();
var side=true;
var num=Math.floor(Math.random()*8);
list=list.splice(8-num).concat(list);
for(var i=0;i<8;i++){
if(list[i][0]=='e'){
game.players[i].side=side;
game.players[i].identity=list[i].slice(1);
}
else{
game.players[i].side=!side;
game.players[i].identity=list[i];
}
if(game.players[i].identity=='zhu'){
game[game.players[i].side+'Zhu']=game.players[i];
game.players[i].isZhu=true;
}
game.players[i].setIdentity(game.players[i].identity);
game.players[i].node.identity.dataset.color=get.translation(game.players[i].side+'Color');
game.players[i].getId();
}
var side=true;
var num=Math.floor(Math.random()*8);
list=list.splice(8-num).concat(list);
for(var i=0;i<8;i++){
if(list[i][0]=='e'){
game.players[i].side=side;
game.players[i].identity=list[i].slice(1);
}
else{
game.players[i].side=!side;
game.players[i].identity=list[i];
}
if(game.players[i].identity=='zhu'){
game[game.players[i].side+'Zhu']=game.players[i];
game.players[i].isZhu=true;
}
game.players[i].setIdentity(game.players[i].identity);
game.players[i].node.identity.dataset.color=get.translation(game.players[i].side+'Color');
game.players[i].getId();
}
var side=true;
var map={};
@ -2611,27 +2611,27 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
}
}
game.falseZhu.init('re_caocao');
game.trueZhu.init('ol_yuanshao');
game.trueZhu.hp++;
game.trueZhu.maxHp++;
game.falseZhu.hp++;
game.falseZhu.maxHp++;
game.trueZhu.update();
game.falseZhu.update();
game.falseZhu.init('re_caocao');
game.trueZhu.init('ol_yuanshao');
game.trueZhu.hp++;
game.trueZhu.maxHp++;
game.falseZhu.hp++;
game.falseZhu.maxHp++;
game.trueZhu.update();
game.falseZhu.update();
ui.arena.classList.add('choose-character');
if(get.is.phoneLayout()){
ui.guanduInfo=ui.create.div('.touchinfo.left',ui.window);
}
else{
ui.guanduInfo=ui.create.div(ui.gameinfo);
}
ui.guanduInfo.innerHTML='当前事件:'+get.translation(evt);
var dialog=ui.create.dialog('本局特殊事件:'+get.translation(evt));
dialog.addText(get.translation(evt+'_info'),false);
setTimeout(function(){
dialog.close();
},5000)
ui.guanduInfo=ui.create.div('.touchinfo.left',ui.window);
}
else{
ui.guanduInfo=ui.create.div(ui.gameinfo);
}
ui.guanduInfo.innerHTML='当前事件:'+get.translation(evt);
var dialog=ui.create.dialog('本局特殊事件:'+get.translation(evt));
dialog.addText(get.translation(evt+'_info'),false);
setTimeout(function(){
dialog.close();
},5000)
};
game.broadcastAll(func,map,evt);
_status.firstAct=game.falseZhu;
@ -2704,12 +2704,12 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
game.addGlobalSkill(evt);
game.broadcastAll(function(evt){
if(get.is.phoneLayout()){
ui.guanduInfo=ui.create.div('.touchinfo.left',ui.window);
}
else{
ui.guanduInfo=ui.create.div(ui.gameinfo);
}
ui.guanduInfo.innerHTML='当前事件:'+get.translation(evt);
ui.guanduInfo=ui.create.div('.touchinfo.left',ui.window);
}
else{
ui.guanduInfo=ui.create.div(ui.gameinfo);
}
ui.guanduInfo.innerHTML='当前事件:'+get.translation(evt);
},evt);
game.me.chooseControl('ok').set('prompt','###本局特殊事件:'+get.translation(evt)+'###'+get.translation(evt+'_info'));
'step 1'
@ -5164,7 +5164,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
content:function(){
"step 0"
event.players=game.filterPlayer(function(current){
return current.isEnemyOf(player);
return current.isEnemyOf(player);
});
"step 1"
if(event.players.length){