This commit is contained in:
libccy 2016-01-24 16:34:21 +08:00
parent 0b9a94bc5e
commit 881fda8c14
66 changed files with 4860 additions and 3415 deletions

Binary file not shown.

BIN
audio/skill/fentian1.mp3 Executable file

Binary file not shown.

BIN
audio/skill/fentian2.mp3 Executable file

Binary file not shown.

BIN
audio/skill/jiewei1.mp3 Executable file

Binary file not shown.

BIN
audio/skill/jiewei2.mp3 Executable file

Binary file not shown.

BIN
audio/skill/jieyue12.mp3 Normal file

Binary file not shown.

BIN
audio/skill/jieyue2.mp3 Normal file → Executable file

Binary file not shown.

BIN
audio/skill/jieyue3.mp3 Executable file

Binary file not shown.

BIN
audio/skill/xintan1.mp3 Executable file

Binary file not shown.

BIN
audio/skill/xintan2.mp3 Executable file

Binary file not shown.

BIN
audio/skill/zhiri1.mp3 Executable file

Binary file not shown.

BIN
audio/skill/zhiri2.mp3 Executable file

Binary file not shown.

View File

@ -1205,7 +1205,10 @@ card.standard={
viewAs:{name:'sha'}, viewAs:{name:'sha'},
audio:true, audio:true,
prompt:'将两张手牌当杀使用或打出', prompt:'将两张手牌当杀使用或打出',
check:function(card){return 6-ai.get.useful(card)}, check:function(card){
if(card.name=='sha') return 0;
return 6-ai.get.useful(card)
},
ai:{ ai:{
respondSha:true, respondSha:true,
} }

View File

@ -1,6 +1,5 @@
'usr strict'; 'usr strict';
character.boss={ character.boss={
mode:['identity','guozhan','stone','boss'],
character:{ character:{
boss_zhangchunhua:['female','wei',4,['jueqing','wuxin','shangshix'],['boss','bossallowed'],'wei'], boss_zhangchunhua:['female','wei',4,['jueqing','wuxin','shangshix'],['boss','bossallowed'],'wei'],
boss_zhenji:['female','wei',4,['tashui','lingbo','jiaoxia','fanghua'],['boss','bossallowed'],'wei'], boss_zhenji:['female','wei',4,['tashui','lingbo','jiaoxia','fanghua'],['boss','bossallowed'],'wei'],
@ -34,8 +33,136 @@ character.boss={
boss_dongzhuo:['male','qun',20,['jiuchi','boss_qiangzheng','boss_baolin'],['boss','bossallowed'],'shu'], boss_dongzhuo:['male','qun',20,['jiuchi','boss_qiangzheng','boss_baolin'],['boss','bossallowed'],'shu'],
// boss_shuijing:['male','qun',8,[],['boss','bossallowed'],'wei'], // boss_shuijing:['male','qun',8,[],['boss','bossallowed'],'wei'],
boss_liedixuande:['male','shu',5,[],['jiangeboss','hiddenboss','bossallowed'],'shu'],
boss_gongshenyueying:['male','shu',4,[],['jiangeboss','hiddenboss','bossallowed'],'shu'],
boss_tianhoukongming:['male','shu',4,[],['jiangeboss','hiddenboss','bossallowed'],'shu'],
boss_yuhuoshiyuan:['male','shu',4,[],['jiangeboss','hiddenboss','bossallowed'],'shu'],
boss_qiaokuijunyi:['male','wei',4,[],['jiangeboss','hiddenboss','bossallowed'],'wei'],
boss_jiarenzidan:['male','wei',5,['boss_chiying','boss_jingfan'],['jiangeboss','hiddenboss','bossallowed'],'wei'],
boss_duanyuzhongda:['male','wei',5,['boss_fanshi','boss_xuanlei','boss_skonghun'],['jiangeboss','hiddenboss','bossallowed'],'wei'],
boss_juechenmiaocai:['male','wei',4,['boss_chuanyun','boss_leili','boss_fengxing'],['jiangeboss','hiddenboss','bossallowed'],'wei'],
boss_baihumech:['male','shu',4,[],['jiangemech','hiddenboss','bossallowed'],'shu'],
boss_qinglongmech:['male','shu',4,[],['jiangemech','hiddenboss','bossallowed'],'shu'],
boss_xuanwumech:['male','shu',4,[],['jiangemech','hiddenboss','bossallowed'],'shu'],
boss_zhuquemech:['male','shu',4,[],['jiangemech','hiddenboss','bossallowed'],'shu'],
boss_bianmech:['male','wei',4,[],['jiangemech','hiddenboss','bossallowed'],'wei'],
boss_chiwenmech:['male','wei',4,[],['jiangemech','hiddenboss','bossallowed'],'wei'],
boss_suannimech:['male','wei',4,[],['jiangemech','hiddenboss','bossallowed'],'wei'],
boss_yazimech:['male','wei',4,[],['jiangemech','hiddenboss','bossallowed'],'wei'],
}, },
skill:{ skill:{
boss_xuanlei:{
trigger:{player:'phaseBegin'},
forced:true,
filter:function(event,player){
for(var i=0;i<game.players.length;i++){
if(typeof player.side=='boolean'&&player.side==game.players[i].side) continue;
if(game.players[i]!=player&&game.players[i].num('j')) return true;
}
return false;
},
content:function(){
"step 0"
event.targets=[];
for(var i=0;i<game.players.length;i++){
if(typeof player.side=='boolean'&&player.side==game.players[i].side) continue;
if(game.players[i]!=player&&game.players[i].num('j')){
event.targets.push(game.players[i]);
}
}
event.targets.sort(lib.sort.seat);
player.line(event.targets,'thunder');
"step 1"
if(event.targets.length){
event.targets.shift().damage('thunder');
event.redo();
}
},
ai:{
threaten:function(player,target){
if(target.hp==1) return 2;
if(target.hp==2&&game.players.length<8) return 1.5;
return 0.5;
},
}
},
boss_fanshi:{
trigger:{player:'phaseEnd'},
forced:true,
check:function(){
return false;
},
content:function(){
player.loseHp();
}
},
boss_skonghun:{
trigger:{player:'phaseUseBegin'},
filter:function(event,player){
var num=player.maxHp-player.hp;
for(var i=0;i<game.players.length;i++){
if(game.players[i].side!=player.side){
num--;
}
}
return num>=0;
},
forced:true,
content:function(){
'step 0'
var targets=[];
for(var i=0;i<game.players.length;i++){
if(game.players[i].side!=player.side){
targets.push(game.players[i]);
}
}
targets.sort(lib.sort.seat);
event.targets=targets;
player.line(targets,'thunder');
event.num=targets.length;
'step 1'
if(event.targets.length){
event.targets.shift().damage('thunder');
event.redo();
}
'step 2'
player.recover(event.num);
}
},
boss_chiying:{
trigger:{global:'damageBegin'},
forced:true,
filter:function(event,player){
if(event.num<=1) return false;
if(typeof player.side=='boolean'){
return player.side==event.player.side;
}
return player==event.player;
},
priority:-11,
content:function(){
trigger.num=1;
}
},
boss_jingfan:{
global:'boss_jingfan2',
},
boss_jingfan2:{
mod:{
globalFrom:function(from,to,distance){
if(typeof from.side=='boolean'){
for(var i=0;i<game.players.length;i++){
if(game.players[i].skills.contains('boss_jingfan')&&
game.players[i].side==from.side&&game.players[i]!=from){
return distance-1;
}
}
}
}
}
},
boss_bianshen2:{ boss_bianshen2:{
mode:['boss'], mode:['boss'],
global:'boss_bianshen2x' global:'boss_bianshen2x'
@ -747,7 +874,7 @@ character.boss={
} }
}, },
boss_wange:{ boss_wange:{
inherit:'guiji' inherit:'boss_guiji'
}, },
fengwu:{ fengwu:{
audio:2, audio:2,
@ -1125,7 +1252,32 @@ character.boss={
}, },
boss_tianyu:{ boss_tianyu:{
audio:true, audio:true,
inherit:'suoling' trigger:{player:'phaseEnd'},
forced:true,
filter:function(event,player){
if(player.isLinked()) return true;
for(var i=0;i<game.players.length;i++){
if(game.players[i]!=player&&!game.players[i].isLinked()){
return true;
}
}
return false;
},
content:function(){
"step 0"
event.targets=game.players.slice(0);
event.targets.remove(player);
event.targets.sort(lib.sort.seat);
if(player.isLinked()) player.link();
"step 1"
if(event.targets.length){
var target=event.targets.shift();
if(!target.isLinked()){
target.link();
}
event.redo();
}
}
}, },
boss_jizhi:{ boss_jizhi:{
audio:2, audio:2,
@ -1311,6 +1463,7 @@ character.boss={
forced:true, forced:true,
priority:100, priority:100,
audio:2, audio:2,
mode:['identity','guozhan','boss','stone'],
filter:function(event,player){ filter:function(event,player){
return player.hp<=4 return player.hp<=4
}, },
@ -1362,6 +1515,51 @@ character.boss={
player.draw(4,false); player.draw(4,false);
} }
}, },
qiwu:{
audio:true,
trigger:{player:'useCard'},
forced:true,
filter:function(event,player){
return get.suit(event.card)=='club'&&player.hp<player.maxHp;
},
content:function(){
player.recover();
}
},
jizhen:{
trigger:{player:'phaseEnd'},
direct:true,
filter:function(event,player){
for(var i=0;i<game.players.length;i++){
if(game.players[i].hp<game.players[i].maxHp&&player!=game.players[i]){
return true;
}
}
},
content:function(){
"step 0"
var num=0;
for(var i=0;i<game.players.length;i++){
if(!game.players[i].isLinked()&&player!=game.players[i]){
num++;
}
}
player.chooseTarget('是否发动【激阵】?',[1,2],function(card,player,target){
return target.hp<target.maxHp&&player!=target;
}).ai=function(target){
return ai.get.attitude(player,target);
}
"step 1"
if(result.bool){
player.logSkill('jizhen',result.targets);
game.asyncDraw(result.targets);
}
},
ai:{
expose:0.3,
threaten:1.3
}
},
}, },
translate:{ translate:{
boss_chi:'魑', boss_chi:'魑',
@ -1375,6 +1573,40 @@ character.boss={
boss_luocha:'罗刹', boss_luocha:'罗刹',
boss_yecha:'夜叉', boss_yecha:'夜叉',
boss_liedixuande:'烈帝玄德',
boss_gongshenyueying:'工神月英',
boss_tianhoukongming:'天侯孔明',
boss_yuhuoshiyuan:'浴火士元',
boss_qiaokuijunyi:'巧魁儁乂',
boss_jiarenzidan:'佳人子丹',
boss_duanyuzhongda:'断狱仲达',
boss_juechenmiaocai:'绝尘妙才',
boss_baihumech:'机雷白虎',
boss_qinglongmech:'云屏青龙',
boss_xuanwumech:'灵甲玄武',
boss_zhuquemech:'炽羽朱雀',
boss_bianmech:'缚地狴犴',
boss_chiwenmech:'吞天螭吻',
boss_suannimech:'食火狻猊',
boss_yazimech:'裂石睚眦',
boss_skonghun:'控魂',
boss_skonghun_info:'出牌阶段开始时若你已损失体力值不小于敌方角色数你可以对所有敌方角色各造成1点雷电伤害然后你恢复X点体力X为受到伤害的角色数',
boss_fanshi:'反噬',
boss_fanshi_info:'锁定技结束阶段你失去1点体力',
boss_xuanlei:'玄雷',
boss_xuanlei_info:'锁定技准备阶段令所有判定区内有牌的敌方角色受到1点雷电伤害',
boss_chiying:'持盈',
boss_chiying_info:'锁定技每当己方角色受到多于1伤害时你防止其余伤害',
boss_jingfan:'惊帆',
boss_jingfan_info:'锁定技,己方其他角色计算与敌方角色距离时,始终-1',
qiwu:'栖梧',
qiwu_info:'锁定技。每当你使用一张梅花牌,你回复一点体力',
jizhen:'激阵',
jizhen_info:'结束阶段,你可以令所至多两名已受伤角色摸一张牌',
boss_yushou:'驭兽', boss_yushou:'驭兽',
boss_yushou_info:'出牌阶段开始时,视为你使用了一张[南蛮入侵]', boss_yushou_info:'出牌阶段开始时,视为你使用了一张[南蛮入侵]',
boss_moyany:'魔炎', boss_moyany:'魔炎',
@ -1447,7 +1679,7 @@ character.boss={
boss_konghun:'控心', boss_konghun:'控心',
boss_konghun_info:'回合结束阶段,你可以指定一名敌人令其进入混乱状态(不受对方控制,并将队友视为敌人)直到下一回合开始', boss_konghun_info:'回合结束阶段,你可以指定一名敌人令其进入混乱状态(不受对方控制,并将队友视为敌人)直到下一回合开始',
yuehun:'月魂', yuehun:'月魂',
yuehun_info:'回合开始阶段,你可以回复一点体力并摸两张牌', yuehun_info:'回合结束阶段,你可以回复一点体力并摸两张牌',
fengwu:'风舞', fengwu:'风舞',
fengwu_info:'出牌阶段限一次可令除你外的所有角色依次对与其距离最近的另一名角色使用一张【杀】无法如此做者失去1点体力。', fengwu_info:'出牌阶段限一次可令除你外的所有角色依次对与其距离最近的另一名角色使用一张【杀】无法如此做者失去1点体力。',
boss_wange:'笙歌', boss_wange:'笙歌',
@ -1477,6 +1709,7 @@ character.boss={
// boss_yuhuo:'浴火', // boss_yuhuo:'浴火',
// boss_yuhuo_info:'觉醒技,在你涅槃后,你获得技能【神威】、【朱羽】', // boss_yuhuo_info:'觉醒技,在你涅槃后,你获得技能【神威】、【朱羽】',
boss_tianyu:'天狱', boss_tianyu:'天狱',
boss_tianyu_info:'锁定技,回合结束阶段,你解除横置状态,除你之外的所有角色进入横置状态',
boss_juejing:'绝境', boss_juejing:'绝境',
boss_juejing2:'绝境', boss_juejing2:'绝境',

View File

@ -1,527 +0,0 @@
'use strict';
character.fire={
character:{
zhugeliangwolong:['male','shu',3,['huoji','bazhen','kanpo']],
pangtong:['male','shu',3,['lianhuan','niepan']],
xunyu:['male','wei',3,['quhu','jieming']],
dianwei:['male','wei',4,['qiangxi']],
taishici:['male','wu',4,['tianyi']],
yanwen:['male','qun',4,['shuangxiong']],
yuanshao:['male','qun',4,['luanji','xueyi'],['zhu']],
pangde:['male','qun',4,['mashu','mengjin']],
},
perfectPair:{
zhugeliangwolong:['pangtong','huangyueying'],
yuanshao:['yanwen']
},
skill:{
huoji:{
audio:2,
enable:'chooseToUse',
filterCard:function(card){
return get.color(card)=='red';
},
viewAs:{name:'huogong',nature:'fire'},
viewAsFilter:function(player){
if(!player.num('h',{color:'red'})) return false;
},
prompt:'将一张红色牌当火攻使用',
check:function(card){
var player=_status.currentPhase;
if(player.num('h')>player.hp){
return 6-ai.get.value(card);
}
return 4-ai.get.value(card)
}
},
bazhen:{
audio:2,
inherit:'bagua_skill',
filter:function(event,player){
if(!event.filterCard({name:'shan'})) return false;
if(event.parent.player.num('s','unequip')) return false;
if(player.get('e','2')) return false;
return true;
},
ai:{
effect:{
target:function(card,player,target){
if(player==target&&get.subtype(card)=='equip2'){
if(ai.get.equipValue(card)<=8) return 0;
}
if(target.num('e','2')) return;
if(player.skills.contains('unequip')) return;
if(get.tag(card,'respondShan')) return [0.5,0];
}
}
}
},
kanpo:{
audio:2,
enable:'chooseToUse',
filterCard:function(card){
return get.color(card)=='black';
},
viewAsFilter:function(player){
return player.num('h',{color:'black'})>0;
},
viewAs:{name:'wuxie'},
prompt:'将一张黑色牌当无懈可击使用',
check:function(card){return 8-ai.get.value(card)},
threaten:1.2
},
lianhuan:{
group:['lianhuan1','lianhuan2']
},
lianhuan1:{
audio:2,
enable:'phaseUse',
filter:function(event,player){
return player.num('h',{suit:'club'})>0;
},
filterCard:function(card){
return get.suit(card)=='club';
},
viewAs:{name:'tiesuo'},
prompt:'将一张梅花牌当铁锁连环使用',
check:function(card){return 4-ai.get.value(card)}
},
lianhuan2:{
audio:2,
enable:'phaseUse',
filter:function(event,player){
return player.num('h',{suit:'club'})>0;
},
filterCard:function(card){
return get.suit(card)=='club';
},
check:function(card){
return 5-ai.get.useful(card);
},
content:function(){
player.draw();
},
discard:false,
prepare:function(cards,player){
player.$throw(cards);
},
ai:{
basic:{
order:1
},
result:{
player:1,
},
}
},
niepan:{
audio:2,
unique:true,
enable:'chooseToUse',
mark:true,
skillAnimation:true,
animationStr:'涅盘',
animationColor:'fire',
init:function(player){
player.storage.niepan=false;
},
filter:function(event,player){
if(event.type!='dying') return false;
if(player!=_status.dying) return false;
if(player.storage.niepan) return false;
},
content:function(){
player.hp=Math.min(3,player.maxHp);
player.discard(player.get('hej'));
player.draw(3);
player.unmarkSkill('niepan');
if(player.classList.contains('linked')) player.link();
if(player.classList.contains('turnedover')) player.turnOver();
player.storage.niepan=true;
},
ai:{
skillTagFilter:function(player){
if(player.storage.niepan) return false;
if(player.hp>0) return false;
},
save:true,
result:{
player:10
},
threaten:function(player,target){
if(!target.storage.niepan) return 0.6;
}
},
intro:{
content:'limited'
}
},
quhu:{
audio:2,
enable:'phaseUse',
usable:1,
filter:function(event,player){
if(player.num('h')==0) return false;
for(var i=0;i<game.players.length;i++){
if(game.players[i].hp>player.hp&&game.players[i].num('h')) return true;
}
return false;
},
filterTarget:function(card,player,target){
return target.hp>player.hp&&target.num('h')>0;
},
content:function(){
"step 0"
player.chooseToCompare(target);
"step 1"
if(result.bool){
player.chooseTarget(function(card,player,target1){
return target1!=target&&get.distance(target,target1,'attack')<=1;
},true).ai=function(target1){
return ai.get.damageEffect(target1,target,player);
}
}
else{
player.damage(target);
event.finish();
}
"step 2"
if(result.bool&&result.targets&&result.targets.length){
result.targets[0].damage(target);
}
},
ai:{
order:0.5,
result:{
target:function(player,target){
var att=ai.get.attitude(player,target);
var oc=(target.num('h')==1);
if(att>0&&oc) return 0;
for(var i=0;i<game.players.length;i++){
if(game.players[i]!=target&&game.players[i]!=player&&
get.distance(target,game.players[i],'attack')<=1){
if(ai.get.damageEffect(game.players[i],target,player)>0){
return att>0?att/2:att-(oc?5:0);
}
}
}
return 0;
},
player:function(player,target){
if(target.skills.contains('jueqing')) return -10;
var mn=1;
var hs=player.get('h');
for(var i=0;i<hs.length;i++){
mn=Math.max(mn,hs[i].number);
}
if(mn<=11&&player.hp<2) return -20;
var max=player.maxHp-hs.length;
for(var i=0;i<game.players.length;i++){
if(ai.get.attitude(player,game.players[i])>2){
max=Math.max(Math.min(5,game.players[i].hp)-game.players[i].num('h'),max);
}
}
switch(max){
case 0:return mn==13?0:-20;
case 1:return mn>=12?0:-15;
case 2:return 0;
case 3:return 1;
default:return max;
}
}
},
expose:0.2
}
},
jieming:{
audio:2,
trigger:{player:'damageEnd'},
direct:true,
filter:function(event,player){
return event.num>0
},
content:function(){
"step 0"
player.chooseTarget([1,trigger.num],function(card,player,target){
return target.num('h')<Math.min(target.maxHp,5);
}).ai=function(target){
var att=ai.get.attitude(_status.event.player,target);
if(att>2){
return Math.min(5,target.maxHp)-target.num('h');
}
return att/3;
}
"step 1"
if(result.bool){
player.logSkill('jieming',result.targets);
for(var i=0;i<result.targets.length;i++){
result.targets[i].draw(Math.min(5,result.targets[i].maxHp)-result.targets[i].num('h'));
}
}
},
ai:{
maixie:true,
effect:{
target:function(card,player,target,current){
if(get.tag(card,'damage')&&target.hp>1){
if(player.skills.contains('jueqing')) return [1,-2];
var max=0;
for(var i=0;i<game.players.length;i++){
if(ai.get.attitude(target,game.players[i])>0){
max=Math.max(Math.min(5,game.players[i].hp)-game.players[i].num('h'),max);
}
}
switch(max){
case 0:return 2;
case 1:return 1.5;
case 2:return [1,2];
default:return [0,max];
}
}
if((card.name=='tao'||card.name=='caoyao')&&
target.hp>1&&target.num('h')<=target.hp) return [0,0];
}
},
}
},
qiangxi:{
audio:2,
enable:'phaseUse',
usable:1,
filterCard:function(card){
return get.subtype(card)=='equip1';
},
selectCard:[0,1],
filterTarget:function(card,player,target){
if(player==target) return false;
return get.distance(player,target,'attack')<=1;
},
content:function(){
"step 0"
if(cards.length==0){
player.loseHp();
}
"step 1"
target.damage();
},
check:function(card){
return 10-ai.get.value(card);
},
position:'he',
ai:{
order:8,
result:{
player:function(player,target){
if(ui.selected.cards.length) return 0;
if(player.hp>=target.hp) return -0.9;
if(player.hp<=2) return -10;
return -2;
},
target:function(player,target){
if(player.hp<=2) return 0;
return ai.get.damageEffect(target,player);
}
}
},
threaten:1.3
},
tianyi:{
audio:2,
enable:'phaseUse',
usable:1,
filterTarget:function(card,player,target){
return player!=target&&target.num('h')>0;
},
filter:function(event,player){
return player.num('h')>0;
},
content:function(){
"step 0"
player.chooseToCompare(target);
"step 1"
if(result.bool){
player.addTempSkill('tianyi2','phaseAfter');
}
else{
player.addTempSkill('tianyi3','phaseAfter');
}
},
ai:{
order:function(name,player){
var cards=player.get('h');
if(player.num('h','sha')==0){
return 1;
}
for(var i=0;i<cards.length;i++){
if(cards[i].name!='sha'&&cards[i].number>11&&ai.get.value(cards[i])<7){
return 9;
}
}
return lib.card.sha.ai.order-1;
},
result:{
player:function(player){
if(player.num('h','sha')>0) return 0.6;
var num=player.num('h');
if(num>player.hp) return 0;
if(num==1) return -2;
if(num==2) return -1;
return -0.7;
},
target:function(player,target){
var num=target.num('h');
if(num==1) return -1;
if(num==2) return -0.7;
return -0.5
},
},
threaten:1.3
}
},
tianyi2:{
mod:{
targetInRange:function(card,player,target,now){
if(card.name=='sha') return true;
},
selectTarget:function(card,player,range){
if(card.name=='sha'&&range[1]!=-1) range[1]++;
},
cardUsable:function(card,player,num){
if(card.name=='sha') return num+1;
}
},
},
tianyi3:{
mod:{
cardEnabled:function(card){if(card.name=='sha') return false}
}
},
shuangxiong:{
audio:true,
trigger:{player:'phaseDrawBefore'},
check:function(event,player){
if(player.num('h')>player.hp) return true;
if(player.num('h')>3) return true;
return false;
},
content:function(){
"step 0"
player.judge(ui.special);
"step 1"
player.gain(result.card);
player.$gain2(result.card);
player.addTempSkill('shuangxiong2','phaseAfter');
player.storage.shuangxiong=get.color(result.card);
trigger.untrigger();
trigger.finish();
}
},
shuangxiong2:{
audio:true,
enable:'phaseUse',
viewAs:{name:'juedou'},
filterCard:function(card,player){
return get.color(card)!=player.storage.shuangxiong;
},
check:function(card){
return 6-ai.get.value(card);
},
ai:{
basic:{
order:10
}
}
},
luanji:{
audio:2,
enable:'phaseUse',
viewAs:{name:'wanjian'},
filterCard:function(card,player){
if(ui.selected.cards.length){
return get.suit(card)==get.suit(ui.selected.cards[0]);
}
var cards=player.get('h');
for(var i=0;i<cards.length;i++){
if(card!=cards[i]){
if(get.suit(card)==get.suit(cards[i])) return true;
}
}
return false;
},
selectCard:2,
check:function(card){
return 6-ai.get.value(card);
},
ai:{
basic:{
order:10
}
}
},
xueyi:{
mod:{
maxHandcard:function(player,num){
if(player.isZhu){
for(var i=0;i<game.players.length;i++){
if(player!=game.players[i]&&game.players[i].group=='qun') num+=2;
}
}
return num;
}
}
},
mengjin:{
audio:2,
trigger:{player:'shaMiss'},
priority:-1,
filter:function(event){
return event.target.num('he')>0;
},
check:function(event,player){
return ai.get.attitude(player,event.target)<0;
},
content:function(){
player.discardPlayerCard('he',trigger.target,true);
}
},
},
translate:{
zhugeliangwolong:'卧龙',
pangtong:'庞统',
xunyu:'荀彧',
dianwei:'典韦',
taishici:'太史慈',
yanwen:'颜良文丑',
yuanshao:'袁绍',
pangde:'庞德',
huoji:'火计',
bazhen:'八阵',
kanpo:'看破',
lianhuan:'连环',
lianhuan1:'连环',
lianhuan2:'重铸♣︎',
niepan:'涅槃',
quhu:'驱虎',
jieming:'节命',
qiangxi:'强袭',
tianyi:'天义',
shuangxiong:'双雄',
shuangxiong2:'双雄',
luanji:'乱击',
xueyi:'血裔',
mengjin:'猛进',
huoji_info:'出牌阶段,你可以将你的任意一张♥或♦手牌当【火攻】使用。',
bazhen_info:'当你没装备防具时,始终视为你装备着【八卦阵】。',
kanpo_info:'你可以将你的任意一张♠或♣手牌当【无懈可击】使用。',
lianhuan_info:'出牌阶段,你可以将你任意一张梅花手牌当【铁索连环】使用或重铸。',
niepan_info:'限定技当你处于濒死状态时你可以丢弃你所有的牌和你判定区里的牌并重置你的武将牌然后摸三张牌且体力回复至3点。',
quhu_info:'出牌阶段你可以与一名体力比你多的角色拼电若你赢则该角色对其攻击范围内另一名由你指定的角色造成1点伤害。若你没赢他/她对你造成一点伤害。每回合限用一次。',
jieming_info:'你每受到1点伤害可令任意一名角色将手牌补至其体力上限的张数(不能超过五张)。',
qiangxi_info:'出牌阶段,你可以自减一点体力或弃一张武器牌,然后你对你攻击范围内的一名角色造成一点伤害,每回合限一次。',
tianyi_info:'出牌阶段,你可以和一名角色拼点,若你赢,你获得以下技能直到回合结束:攻击范围无限;可额外使用一张【杀】;使用【杀】时可额外指定一个目标,若你没赢,你不能使用【杀】直到回合结束。每回合限一次。',
shuangxiong_info:'摸牌阶段,你可选择放弃摸牌并进行一次判定:你获得此判定牌,且于此回合的出牌阶段,你可以将任意一张与此判定牌不同颜色的手牌当【决斗】使用。',
luanji_info:'出牌阶段,你可以将任意两张相同花色的手牌当【万箭齐发】使用。',
xueyi_info:'场上每有一名其他群雄角色存活,你的手牌上限便+2。',
mengjin_info:'当你使用的【杀】被【闪】抵消时,你可以弃掉对方的一张牌。',
},
}

View File

@ -775,7 +775,8 @@ character.gujian={
} }
}, },
ai:{ ai:{
expose:0.2 expose:0.2,
threaten:1.3
} }
}, },
yangming:{ yangming:{
@ -804,7 +805,8 @@ character.gujian={
return 1; return 1;
} }
}, },
order:6 order:6,
threaten:1.3
} }
}, },
yangming2:{ yangming2:{

View File

@ -12,5 +12,6 @@ character.guozhan={
hetaihou:['female','qun',3,['zhendu','qiluan']], hetaihou:['female','qun',3,['zhendu','qiluan']],
kongrong:['male','qun',3,['lirang','mingshi']], kongrong:['male','qun',3,['lirang','mingshi']],
dingfeng:['male','wu',4,['fenxun']], dingfeng:['male','wu',4,['fenxun']],
panfeng:['male','qun',4,['kuangfu']],
}, },
}; };

View File

@ -249,7 +249,7 @@ character.jiange={
lingfeng:{ lingfeng:{
trigger:{player:'phaseDrawBefore'}, trigger:{player:'phaseDrawBefore'},
check:function(event,player){ check:function(event,player){
for(i=0;i<game.players.length;i++){ for(var i=0;i<game.players.length;i++){
if(player!=game.players[i]){ if(player!=game.players[i]){
if(ai.get.attitude(player,game.players[i])<0) return true; if(ai.get.attitude(player,game.players[i])<0) return true;
} }
@ -455,17 +455,6 @@ character.jiange={
threaten:1.3 threaten:1.3
} }
}, },
qiwu:{
audio:true,
trigger:{player:'useCard'},
forced:true,
filter:function(event,player){
return get.suit(event.card)=='club'&&player.hp<player.maxHp;
},
content:function(){
player.recover();
}
},
tianyu:{ tianyu:{
trigger:{player:'phaseEnd'}, trigger:{player:'phaseEnd'},
direct:true, direct:true,
@ -553,7 +542,6 @@ character.jiange={
jg_caozhen:'佳人子丹', jg_caozhen:'佳人子丹',
jg_zhanghe:'巧魁儁乂', jg_zhanghe:'巧魁儁乂',
jg_simayi:'断狱仲达', jg_simayi:'断狱仲达',
qiwu:'栖梧',
tianyu:'天狱', tianyu:'天狱',
zhinang:'智囊', zhinang:'智囊',
jingmiao:'精妙', jingmiao:'精妙',
@ -579,7 +567,6 @@ character.jiange={
biantian_info:'锁定技,准备阶段,你进行一次判定,若为红色,你可以选择至多三名角色进入“狂风”状态直到你的下一回合开始,若为黑桃,直到下个回合开始前,你处于“大雾”状态', biantian_info:'锁定技,准备阶段,你进行一次判定,若为红色,你可以选择至多三名角色进入“狂风”状态直到你的下一回合开始,若为黑桃,直到下个回合开始前,你处于“大雾”状态',
jingmiao_info:'每当有一名其他角色使用无懈可击,你可以弃置其一张牌', jingmiao_info:'每当有一名其他角色使用无懈可击,你可以弃置其一张牌',
zhinang_info:'准备阶段,你可以亮出牌堆顶的三张牌,你可以将其中锦囊或装备牌交给一名角色,然后将其余牌置入弃牌堆', zhinang_info:'准备阶段,你可以亮出牌堆顶的三张牌,你可以将其中锦囊或装备牌交给一名角色,然后将其余牌置入弃牌堆',
qiwu_info:'锁定技。每当你使用一张梅花牌,你回复一点体力',
tianyu_info:'回合结束阶段,你可以将任意名未横置的其他角色横置', tianyu_info:'回合结束阶段,你可以将任意名未横置的其他角色横置',
juechen:'绝尘', juechen:'绝尘',
juechen_info:'每当你使用一张杀,可以弃置一名其他角色的一张牌(不能是杀的目标)', juechen_info:'每当你使用一张杀,可以弃置一名其他角色的一张牌(不能是杀的目标)',

File diff suppressed because it is too large Load Diff

View File

@ -254,6 +254,7 @@ window.characterRank={
'quancong', 'quancong',
'yxs_luocheng', 'yxs_luocheng',
'yxs_napolun', 'yxs_napolun',
'caoren',
], ],
b:[ b:[
'yxs_lishimin', 'yxs_lishimin',
@ -336,7 +337,7 @@ window.characterRank={
'yxs_mingchenghuanghou', 'yxs_mingchenghuanghou',
'pangtong', 'pangtong',
'yxs_libai', 'yxs_libai',
'zhugeliangwolong', 'sp_zhugeliang',
'shen_guanyu', 'shen_guanyu',
'jiangfei', 'jiangfei',
're_caocao', 're_caocao',
@ -371,7 +372,6 @@ window.characterRank={
'huaxiong', 'huaxiong',
'xiahouyuan', 'xiahouyuan',
'liaohua', 'liaohua',
'caoren',
'huangzhong', 'huangzhong',
'zhaoyun', 'zhaoyun',
'machao', 'machao',
@ -388,6 +388,7 @@ window.characterRank={
], ],
d:[ d:[
'menghuo', 'menghuo',
'panfeng',
'sunru', 'sunru',
'zhoucang', 'zhoucang',
'weiyan', 'weiyan',

View File

@ -1011,7 +1011,7 @@ character.refresh={
!lib.filter.autoRespondSha.call({player:player}); !lib.filter.autoRespondSha.call({player:player});
}, },
content:function(){ content:function(){
player.chooseToUse({name:'sha'},'是否对'+get.translation(trigger.player)+'使用一张杀', player.chooseToUse({name:'sha'},'诛害:是否对'+get.translation(trigger.player)+'使用一张杀',
trigger.player).logSkill='zhuhai'; trigger.player).logSkill='zhuhai';
} }
}, },

3151
character/shenhua.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -40,6 +40,10 @@ character.sp={
sunru:['female','wu',3,['shixin','qingyi']], sunru:['female','wu',3,['shixin','qingyi']],
lingju:['female','qun',3,['jieyuan','fenxin']], lingju:['female','qun',3,['jieyuan','fenxin']],
lifeng:['male','shu',3,['tunchu','shuliang']], lifeng:['male','shu',3,['tunchu','shuliang']],
// zhuling:['male','wei',4,['zhanyi']],
sunluyu:['female','wu',3,['meibu','mumu']],
hanba:['female','qun',4,['fentian','zhiri']],
}, },
perfectPair:{ perfectPair:{
zhugejin:['zhugeke'], zhugejin:['zhugeke'],
@ -58,6 +62,262 @@ character.sp={
caohong:['caoren'], caohong:['caoren'],
}, },
skill:{ skill:{
meibu:{
trigger:{global:'phaseUseBegin'},
filter:function(event,player){
return event.player!=player&&get.distance(event.player,player,'attack')>1;
},
prompt:function(event,player){
return '是否对'+get.translation(event.player)+'发动【魅步】?'
},
check:function(event,player){
if(ai.get.attitude(player,event.player)>=0) return false;
var e2=player.get('e','2');
if(e2){
if(e2.name=='tengjia') return true;
if(e2.name=='bagua') return true;
}
return player.num('h','shan')>0;
},
content:function(){
var target=trigger.player;
player.line(target,'green');
target.addTempSkill('meibu_viewas','phaseAfter');
target.addTempSkill('meibu_range','phaseAfter');
target.storage.meibu=player;
target.marks.meibu=target.markCharacter(player,{
name:'魅步',
content:'锦囊牌均视为杀且'+get.translation(player)+'视为在攻击范围内'
});
game.addVideo('markCharacter',target,{
name:'魅步',
content:'锦囊牌均视为杀且'+get.translation(player)+'视为在攻击范围内',
id:'meibu',
target:player.dataset.position
});
},
ai:{
expose:0.2
},
subSkill:{
range:{
mod:{
targetInRange:function(card,player,target){
if(card.name=='sha'&&target==player.storage.meibu){
return true;
}
}
},
onremove:function(player){
if(player.marks.meibu){
player.marks.meibu.delete();
delete player.marks.meibu;
game.addVideo('unmark',player,'meibu');
}
},
trigger:{player:'useCard'},
forced:true,
popup:false,
filter:function(event,player){
return event.skill=='meibu_viewas'
},
content:function(){
player.removeSkill('meibu_viewas');
if(player.marks.meibu&&player.marks.meibu.info){
player.marks.meibu.info.content=player.marks.meibu.info.content.slice(8);
}
}
},
viewas:{
mod:{
cardEnabled:function(card,player){
if(card.name!='sha'&&get.type(card,'trick')=='trick') return false;
},
cardUsable:function(card,player){
if(card.name!='sha'&&get.type(card,'trick')=='trick') return false;
},
cardRespondable:function(card,player){
if(card.name!='sha'&&get.type(card,'trick')=='trick') return false;
},
cardSavable:function(card,player){
if(card.name!='sha'&&get.type(card,'trick')=='trick') return false;
},
},
enable:['chooseToUse','chooseToRespond'],
filterCard:function(card){
return get.type(card,'trick')=='trick';
},
viewAs:{name:'sha'},
check:function(){return 1},
ai:{
effect:{
target:function(card,player,target,current){
if(get.tag(card,'respondSha')&&current<0) return 0.8
}
},
respondSha:true,
order:4,
useful:-1,
value:-1
}
}
}
},
mumu:{
enable:'phaseUse',
// usable:1,
filterCard:function(card,player,target){
return card.name=='sha'||(get.type(card,'trick')=='trick'&&get.color(card)=='black');
},
check:function(card){
return 7-ai.get.value(card);
},
filterTarget:function(card,player,target){
if(target==player) return false;
return target.get('e','1')||target.get('e','2');
},
content:function(){
'step 0'
var e1=target.get('e','1');
var e2=target.get('e','2');
event.e1=e1;
event.e2=e2;
if(e1&&e2){
player.chooseControl('武器牌','防具牌').ai=function(){
if(player.get('e','2')){
return '武器牌';
}
return '防具牌';
}
}
else if(e1){
event.choice='武器牌';
}
else{
event.choice='防具牌';
}
'step 1'
var choice=event.choice||result.control;
if(choice=='武器牌'){
target.discard(event.e1);
player.draw();
}
else{
player.equip(event.e2);
target.$give(event.e2,player);
}
},
ai:{
order:8,
result:{
target:function(player,target){
if(target.get('e','2')&&!player.get('e','2')){
return -2;
}
return -1;
}
}
}
},
fentian:{
audio:2,
trigger:{player:'phaseEnd'},
direct:true,
filter:function(event,player){
if(player.num('h')>=player.hp) return false;
for(var i=0;i<game.players.length;i++){
if(player!=game.players[i]&&get.distance(player,game.players[i],'attack')<=1){
return true;
}
}
return false;
},
intro:{
content:'cards',
},
init:function(player){
player.storage.fentian=[];
},
content:function(){
'step 0'
player.chooseTarget('焚天:选择一名攻击范围内的角色,将其一张牌置于你的武将牌上',true,function(card,player,target){
return player!=target&&get.distance(player,target,'attack')<=1;
}).ai=function(target){
return -ai.get.attitude(player,target)
}
'step 1'
if(result.bool){
player.logSkill('fentian',result.targets);
event.target=result.targets[0];
player.choosePlayerCard(result.targets[0],'he',true);
}
else{
event.finish();
}
'step 2'
if(result.bool){
event.target.$give(result.links,player);
event.target.lose(result.links,ui.special);
player.storage.fentian=player.storage.fentian.concat(result.links);
player.syncStorage('fentian');
setTimeout(function(){
player.markSkill('fentian');
},700);
}
},
mod:{
attackFrom:function(from,to,distance){
return distance-from.storage.fentian.length;
}
}
},
zhiri:{
trigger:{player:'phaseBegin'},
forced:true,
unique:true,
audio:2,
skillAnimation:true,
animationColor:'fire',
filter:function(event,player){
return player.storage.fentian&&player.storage.fentian.length>=3&&!player.storage.zhiri;
},
content:function(){
player.loseMaxHp();
player.addSkill('xintan');
player.storage.zhiri=true;
}
},
xintan:{
enable:'phaseUse',
usable:1,
audio:2,
unique:true,
filter:function(event,player){
return player.storage.fentian&&player.storage.fentian.length>=2;
},
filterTarget:true,
prompt:'两张“焚”置入弃牌堆并令一名角色失去一点体力',
content:function(){
'step 0'
player.chooseCardButton(2,'两张“焚”置入弃牌堆并令'+get.translation(target)+'失去一点体力',player.storage.fentian,true);
'step 1'
if(result.bool){
player.$throw(result.links);
for(var i=0;i<result.links.length;i++){
player.storage.fentian.remove(result.links[i]);
ui.discardPile.appendChild(result.links[i]);
}
player.syncStorage('fentian');
target.loseHp();
}
},
ai:{
order:8,
result:{
target:-1
}
}
},
danji:{ danji:{
skillAnimation:true, skillAnimation:true,
trigger:{player:'phaseBegin'}, trigger:{player:'phaseBegin'},
@ -1089,7 +1349,8 @@ character.sp={
}, },
content:function(){ content:function(){
"step 0" "step 0"
if(player.storage.kunfen){ if(player.storage.kunfen||
(lib.config.mode=='guozhan'&&player.hiddenSkills.contains('kunfen'))){
player.chooseBool('是否发动【困奋】?').ai=function(){ player.chooseBool('是否发动【困奋】?').ai=function(){
if(player.hp>3) return true; if(player.hp>3) return true;
if(player.hp==3&&player.num('h')<3) return true; if(player.hp==3&&player.num('h')<3) return true;
@ -2405,26 +2666,60 @@ character.sp={
suishi:{ suishi:{
trigger:{global:'dying'}, trigger:{global:'dying'},
forced:true, forced:true,
popup:false,
priority:6, priority:6,
filter:function(event,player){ filter:function(event,player){
return event.player!=player; return event.player!=player&&event.parent.name=='damage'&&event.parent.source&&event.parent.source!=event.player;
}, },
content:function(){ content:function(){
player.draw(); 'step 0'
var str;
if(trigger.parent.source==player){
str='随势:是否摸一张牌?';
}
else{
str='随势:是否令'+get.translation(player)+'摸一张牌?'
}
trigger.parent.source.chooseBool(str).ai=function(){
return ai.get.attitude(trigger.parent.source,player)>0;
};
'step 1'
if(result.bool){
player.logSkill('suishi');
trigger.parent.source.line(player,'green');
player.draw();
}
}, },
group:'suishi2' group:'suishi2'
}, },
suishi2:{ suishi2:{
trigger:{global:'dieAfter'}, trigger:{global:'dieAfter'},
forced:true, forced:true,
popup:false,
check:function(){ check:function(){
return false; return false;
}, },
filter:function(event,player){ filter:function(event,player){
return event.player!=player; return event.player!=player&&event.source&&event.source!=player&&event.source!=event.player;
}, },
content:function(){ content:function(){
player.loseHp(); 'step 0'
var str;
if(trigger.source==player){
str='随势:是否流失一点体力?';
}
else{
str='随势:是否令'+get.translation(player)+'流失一点体力?'
}
trigger.source.chooseBool(str).ai=function(){
return ai.get.attitude(trigger.source,player)<0;
};
'step 1'
if(result.bool){
player.logSkill('suishi');
trigger.source.line(player,'green');
player.loseHp();
}
}, },
}, },
sijian:{ sijian:{
@ -3727,7 +4022,32 @@ character.sp={
result.targets[0].draw(3); result.targets[0].draw(3);
} }
} }
} },
kuangfu:{
trigger:{source:'damageEnd'},
direct:true,
audio:2,
filter:function(event){
return event.card&&event.card.name=='sha'&&event.player.num('e');
},
content:function(){
"step 0"
var neg=ai.get.attitude(player,trigger.player)<=0;
player.choosePlayerCard('e',trigger.player).ai=function(button){
if(neg){
return ai.get.buttonValue(button);
}
return 0;
};
"step 1"
if(result.bool){
player.logSkill('kuangfu');
trigger.player.$give(result.links,player);
game.delay(2);
player.equip(result.links[0]);
}
}
},
}, },
translate:{ translate:{
chenlin:'陈琳', chenlin:'陈琳',
@ -3785,7 +4105,25 @@ character.sp={
lingju:'灵雎', lingju:'灵雎',
lifeng:'李丰', lifeng:'李丰',
jsp_guanyu:'sp关羽', jsp_guanyu:'sp关羽',
zhuling:'朱灵',
sunluyu:'孙鲁育',
hanba:'旱魃',
panfeng:'潘凤',
kuangfu:'狂斧',
kuangfu_info:'每当你使用杀造成伤害,可以将对方的一张装备牌移到你的装备区',
xintan:'心惔',
xintan_info:'出牌阶段限一次,你可以将两张“焚”置入弃牌堆并选择一名角色,该角色失去一点体',
fentian:'焚天',
fentian_info:'锁定技,结束阶段开始时,若你的手牌数少于体力值,你须选择一名攻击范围内的角色,将其一张牌置于你的武将牌上,称为“焚”。锁定技,你的攻击范围+XX为“焚”的数量',
zhiri:'炙日',
zhiri_info:'觉醒技准备阶段开始时若“焚”数不小于3你减1点体力上限然后获得技能“心惔”出牌阶段限一次你可以将两张“焚”置入弃牌堆并选择一名角色该角色失去一点体力',
meibu:'魅步',
meibu_info:'一名其他角色的出牌阶段开始时,若你不在其攻击范围内,你可以令该角色的锦囊牌均视为【杀】,直到该角色以此法使用了一张【杀】或回合结束。若如此做,则直到回合结束,视为你在其攻击范围内。',
mumu:'穆穆',
mumu_info:'出牌阶段限一次,你可以弃置一张【杀】或黑色锦囊牌,然后选择一项:弃置场上一张武器牌,然后摸一张牌;或将场上的一张防具牌移动到你的装备区里(可替换原防具)',
zhanyi:'战意',
zhanyi_info:'出牌阶段限一次你可以弃置一张牌并失去1点体力然后根据你弃置的牌获得以下效果直到回合结束基本牌你可以将一张基本牌当任意一张基本牌使用或打出锦囊牌摸两张牌且你使用的牌无距离限制装备牌你使用【杀】指定目标角色后其弃置两张牌。',
nuzhan:'怒斩', nuzhan:'怒斩',
nuzhan_info:'锁定技,你使用的由一张锦囊牌转化而来的【杀】不计入限制的使用次数;锁定技,你使用的由一张装备牌转化而来的【杀】的伤害值基数+1', nuzhan_info:'锁定技,你使用的由一张锦囊牌转化而来的【杀】不计入限制的使用次数;锁定技,你使用的由一张装备牌转化而来的【杀】的伤害值基数+1',
danji:'单骑', danji:'单骑',
@ -3976,7 +4314,7 @@ character.sp={
duanxie_info:'出牌阶段限一次,你可以令一名其他角色横置武将牌,若如此做,你横置武将牌。', duanxie_info:'出牌阶段限一次,你可以令一名其他角色横置武将牌,若如此做,你横置武将牌。',
xiaoguo_info:'其他角色的结束阶段开始时你可以弃置一张基本牌令该角色选择一项1.弃置一张装备牌并令你摸一张牌2.受到你对其造成的1点伤害。', xiaoguo_info:'其他角色的结束阶段开始时你可以弃置一张基本牌令该角色选择一项1.弃置一张装备牌并令你摸一张牌2.受到你对其造成的1点伤害。',
sijian_info:'当你失去最后的手牌时,你可以弃置一名其他角色的一张牌。', sijian_info:'当你失去最后的手牌时,你可以弃置一名其他角色的一张牌。',
suishi_info:'锁定技。当一名其他角色进入濒死状态时你摸一张牌当一名其他角色死亡时你失去1点体力。', suishi_info:'每当其他角色进入濒死状态时伤害来源可以令你摸一张牌每当其他角色死亡时伤害来源可以令你失去1点体力',
quji_info:'出牌阶段限一次你可以弃置X张牌X为你已损失的体力值然后令至多X名已受伤的角色各回复1点体力。若你以此法弃置的牌中有黑色牌你失去一点体力。', quji_info:'出牌阶段限一次你可以弃置X张牌X为你已损失的体力值然后令至多X名已受伤的角色各回复1点体力。若你以此法弃置的牌中有黑色牌你失去一点体力。',
junbing_info:'一名角色的结束阶段开始时若其手牌数少于或者等于1该角色可以摸一张牌。若如此做该角色须将所有手牌交给你然后你交给其等量的牌。', junbing_info:'一名角色的结束阶段开始时若其手牌数少于或者等于1该角色可以摸一张牌。若如此做该角色须将所有手牌交给你然后你交给其等量的牌。',
shefu_info:'结束阶段开始时,你可以将一张手牌移出游戏,称为“伏兵”。然后为“伏兵”记录一个基本牌或锦囊牌名称(须与其他“伏兵”记录的名称均不同)。你的回合外,当有其他角色使用与你记录的“伏兵”牌名相同的牌时,你可以令此牌无效,然后将该“伏兵”置入弃牌堆。', shefu_info:'结束阶段开始时,你可以将一张手牌移出游戏,称为“伏兵”。然后为“伏兵”记录一个基本牌或锦囊牌名称(须与其他“伏兵”记录的名称均不同)。你的回合外,当有其他角色使用与你记录的“伏兵”牌名相同的牌时,你可以令此牌无效,然后将该“伏兵”置入弃牌堆。',

View File

@ -408,7 +408,7 @@ character.standard={
viewAsFilter:function(player){ viewAsFilter:function(player){
if(!player.num('h',{color:'black'})) return false; if(!player.num('h',{color:'black'})) return false;
}, },
prompt:'将一张黑色牌当闪打出', prompt:'将一张黑色牌当闪打出',
check:function(){return 1}, check:function(){return 1},
ai:{ ai:{
respondShan:true, respondShan:true,

View File

@ -113,7 +113,7 @@ character.swd={
swd_sikongyu:['swd_muyue'], swd_sikongyu:['swd_muyue'],
swd_fengyu:['swd_ziqiao'], swd_fengyu:['swd_ziqiao'],
swd_zhaoyun:['swd_hengai','swd_yeyaxi','zhaoyun'], swd_zhaoyun:['swd_hengai','swd_yeyaxi','zhaoyun'],
swd_hengai:['zhugeliang','zhugeliangwolong'], swd_hengai:['zhugeliang','sp_zhugeliang'],
swd_duanmeng:['swd_shangzhang'], swd_duanmeng:['swd_shangzhang'],
swd_shangzhang:['swd_situqiang'], swd_shangzhang:['swd_situqiang'],
swd_tuwei:['swd_hengai'], swd_tuwei:['swd_hengai'],
@ -559,30 +559,6 @@ character.swd={
} }
}, },
}, },
kuangfu:{
trigger:{source:'damageEnd'},
direct:true,
filter:function(event){
return event.card&&event.card.name=='sha'&&event.player.num('e');
},
content:function(){
"step 0"
var neg=ai.get.attitude(player,trigger.player)<=0;
player.choosePlayerCard('e',trigger.player).ai=function(button){
if(neg){
return ai.get.buttonValue(button);
}
return 0;
};
"step 1"
if(result.bool){
player.logSkill('kuangfu');
trigger.player.$give(result.links,player);
game.delay(2);
player.equip(result.links[0]);
}
}
},
huajin:{ huajin:{
enable:'phaseUse', enable:'phaseUse',
usable:1, usable:1,
@ -4456,7 +4432,7 @@ character.swd={
trigger:{player:'phaseAfter'}, trigger:{player:'phaseAfter'},
frequent:true, frequent:true,
filter:function(event,player){ filter:function(event,player){
return get.cardCount(true,player)>=3&&event.parent.name!='lingwu'; return get.cardCount(true,player)>=player.hp&&event.parent.name!='lingwu';
}, },
content:function(){ content:function(){
player.phase(); player.phase();
@ -7768,8 +7744,6 @@ character.swd={
yaotong_info:'当你的手牌数为奇数时,你可以将一张手牌当作杀或闪使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用', yaotong_info:'当你的手牌数为奇数时,你可以将一张手牌当作杀或闪使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用',
pojian:'破茧', pojian:'破茧',
pojian_info:'每当你失去最后一张手牌,可以从牌堆中获得一张装备牌并装备之', pojian_info:'每当你失去最后一张手牌,可以从牌堆中获得一张装备牌并装备之',
kuangfu:'狂斧',
kuangfu_info:'每当你使用杀造成伤害,可以将对方的一张装备牌移到你的装备区',
huajin:'化金', huajin:'化金',
huajin2:'化金', huajin2:'化金',
huajin_info:'出牌阶段限一次,你可以弃置一张牌令你造成的伤害+1直到你的下一回合开始', huajin_info:'出牌阶段限一次,你可以弃置一张牌令你造成的伤害+1直到你的下一回合开始',
@ -7878,7 +7852,7 @@ character.swd={
benlei2:'奔雷', benlei2:'奔雷',
benlei_info:'你可以将三张牌当惊雷闪使用;每当你造成一次雷属性伤害,你回复一点体力', benlei_info:'你可以将三张牌当惊雷闪使用;每当你造成一次雷属性伤害,你回复一点体力',
lingwu:'灵舞', lingwu:'灵舞',
lingwu_info:'回合结束后,若你在本回合内使用了至少3张牌,你可以进行一个额外的回合(不可重复发动)', lingwu_info:'回合结束后,若你在本回合内使用的牌数不少于当前体力值,你可以进行一个额外的回合(不可重复发动)',
miejing:'灭境', miejing:'灭境',
miejing_info:'限制技,你可以弃置所有黑色牌,然后令所有其他角色受到一点雷电伤害', miejing_info:'限制技,你可以弃置所有黑色牌,然后令所有其他角色受到一点雷电伤害',
lingxin:'灵心', lingxin:'灵心',

View File

@ -1,561 +0,0 @@
'use strict';
character.wind={
character:{
xiahouyuan:['male','wei',4,['shensu']],
caoren:['male','wei',4,['jushou']],
huangzhong:['male','shu',4,['liegong']],
weiyan:['male','shu',4,['kuanggu']],
xiaoqiao:['female','wu',3,['tianxiang','hongyan']],
zhoutai:['male','wu',4,['buqu','fenji']],
zhangjiao:['male','qun',3,['leiji','guidao','huangtian'],['zhu']],
sp_zhangjiao:['male','qun',3,['diyleiji','guidao','huangtian'],['zhu']],
// spzhangjiao:['male','qun',3,['spleiji','guidao','huangtian'],['zhu']],
// yuji:['male','qun',3,['guhuo']],
},
skill:{
diyleiji:{
audio:2,
trigger:{player:'respond'},
filter:function(event,player){
return event.card.name=='shan';
},
direct:true,
content:function(){
"step 0";
player.chooseTarget('是否发动新雷击?').ai=function(target){
return ai.get.damageEffect(target,player,player,'thunder');
};
"step 1"
if(result.bool){
player.logSkill('diyleiji',result.targets,'thunder');
event.target=result.targets[0];
event.target.judge(function(card){
var suit=get.suit(card);
if(suit=='spade') return -4;
if(suit=='club') return -2;
return 0;
});
}
else{
event.finish();
}
"step 2"
if(result.suit=='club'){
event.target.damage('thunder');
player.recover();
}
else if(result.suit=='spade'){
event.target.damage(2,'thunder');
}
},
ai:{
effect:{
target:function(card,player,target,current){
if(get.tag(card,'respondShan')){
var hastarget=false;
for(var i=0;i<game.players.length;i++){
if(ai.get.attitude(target,game.players[i])<0){
hastarget=true;break;
}
}
var be=target.num('e',{color:'black'});
if(target.num('h','shan')&&be){
if(!target.skills.contains('guidao')) return 0;
return [0,hastarget?target.num('he')/2:0];
}
if(target.num('h','shan')&&target.num('h')>2){
if(!target.skills.contains('guidao')) return 0;
return [0,hastarget?target.num('h')/4:0];
}
if(target.num('h')>3||(be&&target.num('h')>=2)){
return [0,0];
}
if(target.num('h')==0){
return [1.5,0];
}
if(target.num('h')==1&&!be){
return [1.2,0];
}
if(!target.skills.contains('guidao')) return [1,0.05];
return [1,Math.min(0.5,(target.num('h')+be)/4)];
}
}
}
}
},
shensu:{
group:['shensu1','shensu2']
},
shensu1:{
audio:2,
trigger:{player:'phaseBegin'},
direct:true,
content:function(){
"step 0"
player.addSkill('shensu3');
var check= player.num('h')>2;
player.chooseTarget('是否发动【神速】?',function(card,player,target){
if(player==target) return false;
return player.canUse({name:'sha'},target);
}).ai=function(target){
if(!check) return 0;
return ai.get.effect(target,{name:'sha'},_status.event.player);
}
"step 1"
if(result.bool){
player.logSkill('shensu1',result.targets);
player.useCard({name:'sha'},result.targets[0],false);
player.skip('phaseJudge');
player.skip('phaseDraw');
}
player.removeSkill('shensu3');
}
},
shensu2:{
audio:2,
trigger:{player:'phaseUseBefore'},
direct:true,
filter:function(event,player){
return player.num('he',{type:'equip'})>0;
},
content:function(){
"step 0"
player.addSkill('shensu3');
var check=player.num('h')<=player.hp;
player.chooseCardTarget({
prompt:'是否发动【神速】?',
filterCard:function(card){
return get.type(card)=='equip'
},
position:'he',
filterTarget:function(card,player,target){
if(player==target) return false;
return player.canUse({name:'sha'},target);
},
ai1:function(card){
if(!check) return 0;
return 6-ai.get.value(card);
},
ai2:function(target){
if(!check) return 0;
return ai.get.effect(target,{name:'sha'},_status.event.player);
}
});
"step 1"
if(result.bool){
player.logSkill('shensu2',result.targets);
player.discard(result.cards[0]);
player.useCard({name:'sha'},result.targets[0]);
trigger.untrigger();
trigger.finish();
}
player.removeSkill('shensu3');
}
},
shensu3:{
mod:{
targetInRange:function(card,player,target,now){
return true;
}
},
},
jushou:{
audio:true,
trigger:{player:'phaseEnd'},
content:function(){
player.turnOver();
player.draw(3);
}
},
liegong:{
audio:2,
trigger:{player:'shaBegin'},
filter:function(event,player){
var length=event.target.num('h');
return (length>=player.hp||length<=get.attackRange(player));
},
content:function(){
trigger.directHit=true;
}
},
kuanggu:{
audio:2,
trigger:{source:'damageEnd'},
forced:true,
filter:function(event,player){
return get.distance(player,event.player)<=1;
},
content:function(){
player.recover(trigger.num);
}
},
tianxiang:{
audio:2,
trigger:{player:'damageBefore'},
direct:true,
filter:function(event,player){
return player.num('h',{suit:'heart'})>0&&event.num>0;
},
content:function(){
"step 0"
player.chooseCardTarget({
filterCard:function(card){
return get.suit(card)=='heart';
},
filterTarget:function(card,player,target){
return player!=target;
},
ai1:function(card){
return 10-ai.get.value(card);
},
ai2:function(target){
var att=ai.get.attitude(player,target);
if(trigger.num>1){
if(target.maxHp>5&&target.hp>1) return -att/10;
return -att;
}
var eff=ai.get.damageEffect(target,trigger.source,target,trigger.nature);
if(att==0) return 0.1;
if(eff>=0&&trigger.num==1){
return att;
}
if(target.hp==target.maxHp) return -att;
if(target.hp==1){
if(target.maxHp<=4&&!target.hasSkillTag('maixie')){
if(target.maxHp<=3){
return -att;
}
return -att/2;
}
return 0;
}
if(target.hp==target.maxHp-1){
if(target.hp>2||target.hasSkillTag('maixie')) return att/5;
if(att>0) return 0.02;
return 0.05;
}
return att/2;
},
prompt:'天香:弃置一张红桃牌转移伤害'
});
"step 1"
if(result.bool){
player.logSkill('tianxiang',result.targets);
trigger.untrigger();
trigger.player=result.targets[0];
trigger.player.addSkill('tianxiang2');
player.discard(result.cards[0]);
}
else{
event.finish();
}
"step 2"
trigger.trigger('damageBefore');
},
ai:{
effect:{
target:function(card,player,target){
if(player.skills.contains('jueqing')) return;
if(get.tag(card,'damage')&&target.num('h')>1) return 0.7;
}
},
threaten:function(player,target){
if(target.num('h')==0) return 2;
}
}
},
tianxiang2:{
trigger:{player:['damageAfter','damageCancelled']},
forced:true,
popup:false,
audio:false,
content:function(){
if(player.hp<player.maxHp) player.draw(player.maxHp-player.hp);
player.removeSkill('tianxiang2');
player.popup('tianxiang');
}
},
hongyan:{
mod:{
suit:function(card,suit){
if(suit=='spade') return 'heart';
}
}
},
buqu:{
audio:2,
trigger:{player:'dieBefore'},
forced:true,
filter:function(event,player){return player.maxHp>0},
content:function(){
"step 0"
event.card=get.cards()[0];
if(player.storage.buqu==undefined) player.storage.buqu=[];
player.storage.buqu.push(event.card);
game.addVideo('storage',player,['buqu',get.cardsInfo(player.storage.buqu),'cards']);
player.showCards(player.storage.buqu,'不屈')
game.log(player,'的不屈牌为',player.storage.buqu);
player.markSkill('buqu');
"step 1"
for(var i=0;i<player.storage.buqu.length-1;i++){
if(get.number(event.card)&&get.number(event.card)==get.number(player.storage.buqu[i])) return;
}
trigger.untrigger();
trigger.finish();
player.hp=0;
},
mod:{
maxHandcard:function(player){
if(player.storage.buqu&&player.storage.buqu.length) return player.storage.buqu.length;
}
},
intro:{
content:'cards',
onunmark:function(storage,player){
if(storage&&storage.length){
player.$throw(storage);
for(var i=0;i<storage.length;i++){
ui.discardPile.appendChild(storage[i]);
}
delete player.storage.buqu;
}
}
}
},
fenji:{
audio:2,
trigger:{global:'discardAfter'},
filter:function(event){
if(_status.currentPhase!=event.player){
for(var i=0;i<event.cards.length;i++){
if(event.cards[i].original=='h') return true;
}
}
return false;
},
check:function(event,player){
return ai.get.attitude(player,event.player)>2;
},
content:function(){
"step 0"
player.loseHp();
"step 1"
trigger.player.draw(2);
},
},
leiji:{
audio:2,
trigger:{player:'respond'},
filter:function(event,player){
return event.card.name=='shan';
},
direct:true,
content:function(){
"step 0";
player.chooseTarget('是否发动雷击?').ai=function(target){
return ai.get.damageEffect(target,player,player);
};
"step 1"
if(result.bool){
player.logSkill('leiji',result.targets,'thunder');
event.target=result.targets[0];
event.target.judge(function(card){
if(get.suit(card)=='spade') return -4;
return 0;
});
}
else{
event.finish();
}
"step 2"
if(result.bool==false){
event.target.damage(2,'thunder');
}
},
ai:{
mingzhi:false,
effect:{
target:function(card,player,target,current){
if(get.tag(card,'respondShan')){
var hastarget=false;
for(var i=0;i<game.players.length;i++){
if(ai.get.attitude(target,game.players[i])<0){
hastarget=true;break;
}
}
if(target.num('h','shan')&&target.num('e',{suit:'spade'})){
return [0,hastarget?target.num('he')/2:0];
}
if(target.num('h','shan')){
return [1,hastarget?target.num('he')/2:0];
}
return [1,target.num('h')/4];
}
}
}
}
},
guidao:{
audio:2,
trigger:{global:'judge'},
filter:function(event,player){
return player.num('he',{color:'black'})>0;
},
direct:true,
content:function(){
"step 0"
player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+
get.translation(trigger.player.judging[0])+',是否发动【鬼道】?','he',function(card){
return get.color(card)=='black';
}).ai=function(card){
var trigger=_status.event.parent._trigger;
var player=_status.event.player;
var result=trigger.judge(card)-trigger.judge(trigger.player.judging[0]);
var attitude=ai.get.attitude(player,trigger.player);
if(attitude==0||result==0) return 0;
if(attitude>0){
return result;
}
else{
return -result;
}
};
"step 1"
if(result.bool){
player.respond(result.cards,'highlight');
}
else{
event.finish();
}
"step 2"
if(result.bool){
player.logSkill('guidao');
player.$gain2(trigger.player.judging[0]);
player.gain(trigger.player.judging[0]);
trigger.player.judging[0]=result.cards[0];
trigger.position.appendChild(result.cards[0]);
game.log(trigger.player,'的判定牌改为',result.cards[0]);
}
"step 3"
game.delay(2);
},
ai:{
tag:{
rejudge:1
}
}
},
guhuo:{
trigger:{player:'phaseBegin'},
forced:true,
content:function(){
player.draw();
player.chooseToDiscard('hej',true).ai=ai.get.disvalue;
},
ai:{
effect:{
target:function(card){
if(get.type(card)=='delay') return [0,1];
}
}
}
},
huangtian:{
unique:true,
global:'huangtian2'
},
huangtian2:{
audio:2,
enable:'phaseUse',
discard:false,
line:true,
prepare:function(cards,player,targets){
player.$give(cards,targets[0]);
},
filter:function(event,player){
if(!game.zhu) return false;
if(!game.zhu.isZhu) return false;
return (player!=game.zhu&&game.zhu.skills.contains('huangtian')&&player.group=='qun')
},
filterCard:function(card){
return (card.name=='shan'||card.name=='shandian')
},
filterTarget:function(card,player,target){
return target==game.zhu;
},
usable:1,
forceaudio:true,
content:function(){
target.gain(cards);
},
ai:{
expose:0.3,
order:10,
result:{
target:5
}
}
}
},
translate:{
xiahouyuan:'夏侯渊',
caoren:'曹仁',
huangzhong:'黄忠',
sp_zhangjiao:'张角',
weiyan:'魏延',
xiaoqiao:'小乔',
zhoutai:'周泰',
zhangjiao:'张角',
spzhangjiao:'张角',
yuji:'于吉',
shensu:'神速',
shensu1:'神速',
shensu2:'神速',
jushou:'据守',
liegong:'烈弓',
kuanggu:'狂骨',
tianxiang:'天香',
hongyan:'红颜',
buqu:'不屈',
leiji:'雷击',
spleiji:'新雷击',
guidao:'鬼道',
huangtian:'黄天',
huangtian2:'黄天',
guhuo:'蛊惑',
fenji:'奋激',
diyleiji:'雷击',
diyleiji_info:'每当你使用或打出一张【闪】,可令任意一名角色进行一次判定,若结果为梅花,其受到一点雷电伤害,然后你回复一点体力;若结果为黑桃,其受到两点雷电伤害',
tiangong:'天公',
tiangong2:'天公',
tiangong_info:'锁定技,你防止即将受到的雷电伤害,每当你造成一次雷电伤害,你摸一张牌',
shensu_info:
'你可以跳过摸牌阶段,或跳过出牌阶段并弃置一张装备牌,'+
'若如此则视为对任意一名使用一张【杀】',
jushou_info:
'回合结束阶段你可以将武将牌翻页并摸3张牌',
liegong_info:
'当你使用【杀】时,若目标的手牌数大于等于你的体力值,或小于等于你的攻击范围,你可令此【杀】不能闪避',
kuanggu_info:
'锁定技每当你造成一点伤害若受伤害角色与你的距离不大于1你回复一点体力',
tianxiang_info:
'当你即将受到伤害时你可以弃置一张红桃牌将伤害转移给任意一名其他角色然后该角色摸x张牌x为其已损失体力值',
hongyan_info:
'锁定技,你的黑桃牌均视为红桃',
buqu_info:
'锁定技每当你扣减1点体力后若你当前的体力值为0你可以将牌堆顶的一张牌置于你的武将牌上'+
'称为“创”,若所有“创”的点数均不同,你不会死亡。你的手牌上限为“创”的个数',
leiji_info:
'每当你使用或打出一张【闪】,可令任意一名角色进行一次判定,若结果为黑桃,其受到两点雷电伤害',
spleiji_info:
'每当你使用或打出一张【闪】,可令任意一名角色进行一次判定,若结果为黑色,其受到一点雷电伤害,然后你回复一点体力',
guidao_info:
'任意一名角色的判定生效前,你可以打出一张黑色牌替换之',
huangtian_info:
'主公技,群雄角色可在他们各自的回合里给你一张【闪】或【闪电】。',
guhuo_info:
'锁定技,回合开始阶段,你摸一张牌并弃置区域内的一张牌',
fenji_info:
'每当一名角色的手牌于回合外被弃置时你可以失去1点体力然后该角色摸两张牌。'
},
}

View File

@ -1,786 +0,0 @@
'use strict';
character.woods={
character:{
menghuo:['male','shu',4,['huoshou','zaiqi']],
zhurong:['female','shu',4,['juxiang','lieren']],
caopi:['male','wei',3,['xingshang','fangzhu','songwei'],['zhu']],
xuhuang:['male','wei',4,['duanliang']],
lusu:['male','wu',3,['haoshi','dimeng']],
sunjian:['male','wu',4,['yinghun']],
dongzhuo:['male','qun',8,['jiuchi','roulin','benghuai','baonue'],['zhu']],
jiaxu:['male','qun',3,['luanwu','wansha','weimu']],
},
perfectPair:{
menghuo:['zhurong']
},
skill:{
huoshou:{
locked:true,
group:['huoshou1','huoshou2'],
ai:{
effect:{
target:function(card,player,target){
if(card.name=='nanman') return 0;
}
}
}
},
huoshou1:{
audio:2,
trigger:{target:'useCardToBefore'},
forced:true,
priority:15,
filter:function(event,player){
return (event.card.name=='nanman');
},
content:function(){
trigger.untrigger();
trigger.finish();
},
},
huoshou2:{
trigger:{global:'damageBefore'},
forced:true,
filter:function(event,player){
return (event.card&&event.card.name=='nanman');
},
content:function(){
trigger.source=player;
}
},
zaiqi:{
audio:2,
trigger:{player:'phaseDrawBefore'},
filter:function(event,player){
return player.hp<player.maxHp;
},
check:function(event,player){
if(player.maxHp-player.hp<2){
return false;
}
else if(player.maxHp-player.hp==2){
return player.num('h')>=2;
}
return true;
},
content:function(){
"step 0"
trigger.untrigger();
trigger.finish();
event.cards=get.cards(player.maxHp-player.hp);
player.showCards(event.cards);
"step 1"
var num=0;
for(var i=0;i<event.cards.length;i++){
if(get.suit(event.cards[i])=='heart'){
num++;
ui.discardPile.appendChild(event.cards[i]);
event.cards.splice(i--,1);
}
}
if(num){
player.recover(num);
}
"step 2"
if(event.cards.length){
player.gain(event.cards);
player.$gain2(event.cards);
game.delay();
}
},
ai:{
threaten:function(player,target){
if(target.hp==1) return 2;
if(target.hp==2) return 1.5;
return 1;
},
}
},
juxiang:{
unique:true,
locked:true,
group:['juxiang1','juxiang2'],
ai:{
effect:{
target:function(card){
if(card.name=='nanman') return [0,1];
}
}
}
},
juxiang1:{
audio:2,
trigger:{target:'useCardToBefore'},
forced:true,
priority:15,
filter:function(event,player){
return (event.card.name=='nanman');
},
content:function(){
trigger.untrigger();
trigger.finish();
}
},
juxiang2:{
trigger:{global:'useCardAfter'},
forced:true,
filter:function(event,player){
return (event.card.name=='nanman'&&event.player!=player&&get.position(event.card)=='d'&&get.itemtype(event.card)=='card');
},
content:function(){
player.gain(trigger.card);
player.$gain2(trigger.card);
}
},
lieren:{
audio:2,
trigger:{source:'damageEnd'},
filter:function(event,player){
return (event.card&&event.card.name=='sha'&&
event.player.classList.contains('dead')==false&&
event.player.num('h')&&player.num('h'));
},
check:function(event,player){
return ai.get.attitude(player,event.player)<0&&player.num('h')>1;
},
priority:5,
content:function(){
"step 0"
player.chooseToCompare(trigger.player);
"step 1"
if(result.bool&&trigger.player.num('he')){
player.gainPlayerCard(trigger.player,true,'he');
}
}
},
xingshang:{
audio:2,
unique:true,
gainable:true,
trigger:{global:'dieEnd'},
priority:5,
filter:function(event){
return event.cards.length>0
},
content:function(){
"step 0"
player.gain(trigger.playerCards);
player.$draw(trigger.playerCards);
game.delay();
"step 1"
for(var i=0;i<trigger.playerCards.length;i++){
trigger.cards.remove(trigger.playerCards[i]);
}
trigger.playerCards.length=0;
}
},
fangzhu:{
audio:2,
trigger:{player:'damageEnd'},
direct:true,
content:function(){
"step 0"
player.chooseTarget('是否发动【放逐】?',function(card,player,target){
return player!=target
}).ai=function(target){
var player=_status.event.player;
if(ai.get.attitude(_status.event.player,target)==0) return 0;
if(ai.get.attitude(_status.event.player,target)>0){
if(target.classList.contains('turnedover')) return 1000-target.num('h');
if(player.maxHp-player.hp<3) return -1;
return 100-target.num('h');
}
else{
if(target.classList.contains('turnedover')) return -1;
if(player.maxHp-player.hp>=3) return -1;
return 1+target.num('h');
}
}
"step 1"
if(result.bool){
player.logSkill('fangzhu',result.targets);
result.targets[0].draw(player.maxHp-player.hp);
result.targets[0].turnOver();
}
},
ai:{
maixie:true,
effect:{
target:function(card,player,target){
if(get.tag(card,'damage')){
if(player.skills.contains('jueqing')) return [1,-2];
if(target.hp<=1) return;
var hastarget=false;
var hasfriend=false;
var turnfriend=false;
for(var i=0;i<game.players.length;i++){
if(ai.get.attitude(target,game.players[i])<0&&!game.players[i].isTurnedOver()){
hastarget=true;
}
if(ai.get.attitude(target,game.players[i])>0&&game.players[i].isTurnedOver()){
hastarget=true;
turnfriend=true;
}
if(game.players[i]!=target&&ai.get.attitude(game.players[i],target)>=0){
hasfriend=true;
}
}
if(ai.get.attitude(player,target)>0&&!hastarget) return;
if(!hasfriend) return;
if(turnfriend||target.hp==target.maxHp) return [0.5,1];
if(target.hp>1) return [1,1];
}
}
}
}
},
songwei:{
unique:true,
global:'songwei2',
},
songwei2:{
audio:2,
forceaudio:true,
trigger:{player:'judgeEnd'},
filter:function(event,player){
if(!game.zhu) return false;
if(!game.zhu.isZhu) return false;
return (player!=game.zhu&&game.zhu.skills.contains('songwei')&&player.group=='wei'&&get.color(event.result.card)=='black');
},
check:function(event,player){
return ai.get.attitude(player,game.zhu)>0;
},
content:function(){
game.zhu.draw();
}
},
duanliang:{
group:['duanliang1','duanliang2'],
ai:{
threaten:1.2
}
},
duanliang1:{
audio:2,
enable:'chooseToUse',
filterCard:function(card){
if(get.type(card)=='trick') return false;
if(get.type(card)=='delay') return false;
return get.color(card)=='black';
},
position:'he',
viewAs:{name:'bingliang'},
prompt:'将一黑色的基本牌或装备牌当兵粮寸断使用',
check:function(card){return 6-ai.get.value(card)},
ai:{
order:9
}
},
duanliang2:{
mod:{
targetInRange:function(card,player,target){
if(card.name=='bingliang'){
if(get.distance(player,target)<=2) return true;
}
}
}
},
haoshi:{
audio:2,
trigger:{player:'phaseDrawBegin'},
threaten:1.4,
check:function(event,player){
if(player.num('h')<=1) return true;
var min=[];
var temp=player.next.num('h');
for(var i=0;i<game.players.length;i++){
if(game.players[i]!=player&&game.players[i].num('h')<temp){
temp=game.players[i].num('h');
}
}
for(var i=0;i<game.players.length;i++){
if(game.players[i]!=player&&game.players[i].num('h')==temp){
min.push(game.players[i]);
}
}
for(var i=0;i<min.length;i++){
if(ai.get.attitude(player,min[i])>0) return true;
}
return false;
},
content:function(){
trigger.num+=2;
player.addSkill('haoshi2');
},
ai:{
threaten:2
}
},
haoshi2:{
trigger:{player:'phaseDrawEnd'},
forced:true,
popup:false,
audio:false,
content:function(){
"step 0"
player.removeSkill('haoshi2');
if(player.num('h')<=5){
event.finish();
return;
}
var temp=player.next.num('h');
for(var i=0;i<game.players.length;i++){
if(game.players[i]!=player&&game.players[i].num('h')<temp){
temp=game.players[i].num('h');
}
}
player.chooseCardTarget({
selectCard:Math.floor(player.num('h')/2),
filterTarget:function(card,player,target){
return target.num('h')==temp;
},
forced:true,
ai2:function(target){
return ai.get.attitude(player,target);
}
});
"step 1"
if(result.targets&&result.targets[0]){
result.targets[0].gain(result.cards);
player.$give(result.cards.length,result.targets[0]);
}
}
},
dimeng:{
audio:2,
enable:'phaseUse',
usable:1,
position:'he',
filterCard:true,
selectCard:[0,Infinity],
selectTarget:2,
filterTarget:function(card,player,target){
if(player==target) return false;
if(ui.selected.targets.length==0) return true;
return (Math.abs(ui.selected.targets[0].num('h')-target.num('h'))==
ui.selected.cards.length);
},
multitarget:true,
content:function(){
'step 0'
event.cards0=targets[0].get('h');
event.cards1=targets[1].get('h');
targets[0].lose(event.cards0,ui.special);
targets[1].lose(event.cards1,ui.special);
'step 1'
targets[0].gain(event.cards1);
targets[1].gain(event.cards0);
targets[0].$give(event.cards0.length,targets[1]);
targets[1].$give(event.cards1.length,targets[0]);
},
check:function(card){
var list=[],player=_status.event.player;
var num=player.num('he');
var count;
for(var i=0;i<game.players.length;i++){
if(game.players[i]!=player&&ai.get.attitude(player,game.players[i])>3) list.push(game.players[i]);
}
list.sort(function(a,b){
return a.num('h')-b.num('h');
});
if(list.length==0) return -1;
var from=list[0];
list.length=0;
for(var i=0;i<game.players.length;i++){
if(game.players[i]!=player&&ai.get.attitude(player,game.players[i])<1) list.push(game.players[i]);
}
if(list.length==0) return -1;
list.sort(function(a,b){
return b.num('h')-a.num('h');
});
if(from.num('h')>=list[0].num('h')) return -1;
for(var i=0;i<list.length&&from.num('h')<list[i].num('h');i++){
if(list[i].num('h')-from.num('h')<=num){
count=list[i].num('h')-from.num('h');break;
}
}
if(count<2&&from.num('h')>=2) return -1;
if(ui.selected.cards.length<count) return 11-ai.get.value(card);
return -1;
},
ai:{
order:6,
threaten:3,
expose:0.9,
result:{
target:function(player,target){
var list=[];
var num=player.num('he');
if(ui.selected.targets.length==0){
for(var i=0;i<game.players.length;i++){
if(game.players[i]!=player&&ai.get.attitude(player,game.players[i])>3) list.push(game.players[i]);
}
list.sort(function(a,b){
return a.num('h')-b.num('h');
});
if(target==list[0]) return ai.get.attitude(player,target);
return -ai.get.attitude(player,target);
}
else{
var from=ui.selected.targets[0];
for(var i=0;i<game.players.length;i++){
if(game.players[i]!=player&&ai.get.attitude(player,game.players[i])<1) list.push(game.players[i]);
}
list.sort(function(a,b){
return b.num('h')-a.num('h');
});
if(from.num('h')>=list[0].num('h')) return -ai.get.attitude(player,target);
for(var i=0;i<list.length&&from.num('h')<list[i].num('h');i++){
if(list[i].num('h')-from.num('h')<=num){
var count=list[i].num('h')-from.num('h');
if(count<2&&from.num('h')>=2) return -ai.get.attitude(player,target);
if(target==list[i]) return ai.get.attitude(player,target);
return -ai.get.attitude(player,target);
}
}
}
}
}
}
},
yinghun:{
audio:2,
trigger:{player:'phaseBegin'},
filter:function(event,player){
return player.hp<player.maxHp;
},
direct:true,
content:function(){
"step 0"
player.chooseTarget(function(card,player,target){
return player!=target;
}).ai=function(target){
if(player.maxHp-player.hp==1&&target.num('he')==0){
return 0;
}
if(ai.get.attitude(_status.event.player,target)>0){
return 10+ai.get.attitude(_status.event.player,target);
}
if(player.maxHp-player.hp==1){
return -1;
}
return 1;
}
"step 1"
if(result.bool){
player.logSkill('yinghun',result.targets);
event.target=result.targets[0];
player.chooseControl('yinghun_true','yinghun_false',function(event,player){
if(ai.get.attitude(player,event.target)>0) return 'yinghun_true';
return 'yinghun_false';
})
}
else{
event.finish();
}
"step 2"
if(result.control=='yinghun_true'){
event.target.draw(player.maxHp-player.hp);
event.target.chooseToDiscard(true,'he');
}
else{
event.target.draw();
event.target.chooseToDiscard(player.maxHp-player.hp,true,'he');
}
},
ai:{
threaten:function(player,target){
if(target.hp==1) return 2;
if(target.hp==2) return 1.5;
return 0.5;
},
maixie:true,
effect:{
target:function(card,player,target){
if(target.maxHp<=3) return;
if(get.tag(card,'damage')){
if(target.hp==target.maxHp) return [0,1];
}
if(get.tag(card,'recover')&&player.hp>=player.maxHp-1) return [0,0];
}
}
}
},
jiuchi:{
audio:2,
enable:'chooseToUse',
filterCard:function(card){
return get.suit(card)=='spade';
},
viewAs:{name:'jiu'},
viewAsFilter:function(player){
if(!player.num('h',{suit:'spade'})) return false;
},
prompt:'将一张黑桃手牌当酒使用',
check:function(card){
if(_status.event.type=='dying') return 1;
return 4-ai.get.value(card);
},
ai:{
skillTagFilter:function(player){
return player.num('h',{suit:'spade'})>0;
},
threaten:1.5,
save:true,
}
},
roulin:{
audio:2,
trigger:{player:'shaBegin',target:'shaBegin'},
forced:true,
filter:function(event,player){
if(event.directHit) return false;
if(player==event.player){
return event.target.sex=='female';
}
return event.player.sex=='female';
},
check:function(event,player){
return player==event.player;
},
content:function(){
"step 0"
var next=trigger.target.chooseToRespond({name:'shan'});
next.autochoose=lib.filter.autoRespondShan;
next.ai=function(card){
if(trigger.target.num('h','shan')>1){
return ai.get.unuseful2(card);
}
return -1;
};
"step 1"
if(result.bool==false){
trigger.untrigger();
trigger.directHit=true;
}
}
},
benghuai:{
audio:4,
trigger:{player:'phaseEnd'},
forced:true,
check:function(){
return false;
},
filter:function(event,player){
for(var i=0;i<game.players.length;i++){
if(game.players[i]!=player&&game.players[i].hp<player.hp) return true;
}
return false;
},
content:function(){
"step 0"
player.chooseControl('baonue_hp','baonue_maxHp',function(event,player){
if(player.hp<player.maxHp-1||player.hp<=2) return 'baonue_maxHp';
return 'baonue_hp';
});
"step 1"
if(result.control=='baonue_hp'){
player.loseHp();
}
else{
player.loseMaxHp();
}
},
ai:{
threaten:0.5
}
},
baonue:{
unique:true,
global:'baonue2'
},
baonue2:{
audio:2,
forceaudio:true,
trigger:{source:'damageEnd'},
filter:function(event,player){
if(!game.zhu) return false;
if(!game.zhu.isZhu) return false;
return (player!=game.zhu&&game.zhu.skills.contains('baonue')&&player.group=='qun')&&game.zhu.hp<game.zhu.maxHp;
},
check:function(event,player){
return ai.get.attitude(player,game.zhu)>0;
},
content:function(){
"step 0"
player.judge(function(card){
if(get.suit(card)=='spade') return 4;
return 0;
})
"step 1"
if(result.bool){
game.zhu.recover();
}
}
},
luanwu:{
audio:2,
unique:true,
enable:'phaseUse',
filter:function(event,player){
return !player.storage.luanwu;
},
init:function(player){
player.storage.luanwu=false;
},
mark:true,
intro:{
content:'limited'
},
skillAnimation:'epic',
animationColor:'thunder',
prepare:function(cards,player){
player.line(game.players);
for(var i=0;i<game.players.length;i++){
if(game.players[i]!=player){
game.players[i].animate('target');
}
}
},
content:function(){
"step 0"
player.unmarkSkill('luanwu')
player.storage.luanwu=true;
event.current=player.next;
"step 1"
event.current.animate('target');
event.current.chooseToUse({name:'sha'},function(card,player,target){
if(player==target) return false;
if(get.distance(player,target)<=1) return true;
for(var i=0;i<game.players.length;i++){
if(game.players[i]==player) continue;
if(get.distance(player,game.players[i])<get.distance(player,target)) return false;
}
return true;
})
"step 2"
if(result.bool==false) event.current.loseHp();
if(event.current.next!=player){
event.current=event.current.next;
game.delay(0.5);
event.goto(1);
}
},
ai:{
order:1,
result:{
player:function(player){
if(lib.config.mode=='identity'&&game.zhu.isZhu&&player.identity=='fan'){
if(game.zhu.hp==1&&game.zhu.num('h')<=2) return 1;
}
var num=0;
for(var i=0;i<game.players.length;i++){
var att=ai.get.attitude(player,game.players[i]);
if(att>0) att=1;
if(att<0) att=-1;
if(game.players[i]!=player&&game.players[i].hp<=3){
if(game.players[i].num('h')==0) num+=att/game.players[i].hp;
else if(game.players[i].num('h')==1) num+=att/2/game.players[i].hp;
else if(game.players[i].num('h')==2) num+=att/4/game.players[i].hp;
}
if(game.players[i].hp==1) num+=att*1.5;
}
// console.log(num);
if(player.hp==1){
return -num;
}
if(player.hp==2){
return -game.players.length/4-num;
}
return -game.players.length/3-num;
}
}
}
},
wansha:{
locked:true,
global:'wansha2'
},
wansha2:{
mod:{
cardSavable:function(card,player){
if(_status.currentPhase.skills.contains('wansha')&&_status.currentPhase!=player){
if(card.name=='tao'&&_status.dying!=player) return false;
}
}
}
},
weimu:{
mod:{
targetEnabled:function(card){
if((get.type(card)=='trick'||get.type(card)=='delay')&&
get.color(card)=='black') return false;
}
}
},
},
translate:{
zhurong:'祝融',
menghuo:'孟获',
caopi:'曹丕',
xuhuang:'徐晃',
lusu:'鲁肃',
sunjian:'孙坚',
dongzhuo:'董卓',
jiaxu:'贾诩',
huoshou:'祸首',
huoshou1:'祸首',
huoshou2:'祸首',
zaiqi:'再起',
juxiang:'巨象',
juxiang1:'巨象',
juxiang2:'巨象',
lieren:'烈刃',
xingshang:'行殇',
fangzhu:'放逐',
songwei:'颂威',
songwei2:'颂威',
duanliang:'断粮',
duanliang1:'断粮',
haoshi:'好施',
dimeng:'缔盟',
yinghun:'英魂',
yinghun_true:'摸X弃1',
yinghun_false:'摸1弃X',
jiuchi:'酒池',
roulin:'肉林',
benghuai:'崩坏',
baonue:'暴虐',
baonue2:'暴虐',
baonue_hp:'体力',
baonue_maxHp:'体力上限',
luanwu:'乱武',
wansha:'完杀',
weimu:'帷幕',
huoshou_info:'【南蛮入侵】对你无效;你是任何【南蛮入侵】造成伤害的来源。',
zaiqi_info:'摸牌阶段若你已受伤你可以放弃摸牌并展示牌堆顶的X张牌X为你已损失的体力值其中每有一张♥牌你回复1点体力然后弃掉这些♥牌将其余的牌收入手牌。',
juxiang_info:'南蛮入侵】对你无效;若其他角色使用的【南蛮入侵】在结算完时进入弃牌堆,你立即获得它。',
lieren_info:'你每使用【杀】造成一次伤害,可与受到该伤害的角色拼点;若你赢,你获得对方的一张牌。',
xingshang_info:'你可以立即获得死亡角色的所有牌。',
fangzhu_info:'你每受到一次伤害可令除你以外的任一角色补X张牌X为你已损失的体力值然后该角色将其武将牌翻面。',
songwei_info:'主公技,其他魏势力的角色的判定牌结果为♠或♣且失效后,可以让你摸一张牌。',
duanliang_info:'出牌阶段你可以将你的任意一张♠或♣的基本牌或装备牌当【兵粮寸断】使用你可以对与你距离2以内的角色使用【兵粮寸断】。',
haoshi_info:'摸牌阶段,你可以额外摸两张牌,若此时你的手牌数多于五张,你必须将一半(向下取整)的手牌交给场上除你外手牌数最少的一名角色。',
dimeng_info:'出牌阶段,你可以选择其他两名角色,你弃掉等同于这两名角色手牌数量之差的牌,然后交换他们的手牌,每回合限一次。',
yinghun_info:'回合开始阶段,若你已受伤,可选择一名其他角色执行下列两项中的一项: 1.摸X张牌然后弃一张牌。 2.摸一张牌然后弃X张牌。 X为你已损失的体力值每回合限一次。',
jiuchi_info:'你可将你的任意一张♠手牌当【酒】使用。',
roulin_info:'你对女性角色、女性角色对你使用【杀】时,都需连续使用两张【闪】才能抵消。',
benghuai_info:'回合结束阶段,若你的体力不是全场最少的(或之一)你须减1点体力或体力上限。',
baonue_info:'主公技其他群雄角色每造成一次伤害可进行一次判定若为♠你回复1点体力。',
luanwu_info:'出牌阶段可令除你外的所有角色依次对与其距离最近的另一名角色使用一张【杀】无法如此做者失去1点体力。',
wansha_info:'在你的回合,除你以外,只有处于濒死状态的角色才能使用【桃】。',
weimu_info:'你不能成为♠或♣锦囊的目标。',
},
}

View File

@ -50,7 +50,7 @@ character.xianjian={
trigger:{source:'damageBegin'}, trigger:{source:'damageBegin'},
forced:true, forced:true,
filter:function(event){ filter:function(event){
return event.nature=='fire'; return event.nature=='fire'&&event.notLink();
}, },
content:function(){ content:function(){
trigger.num++; trigger.num++;

View File

@ -62,6 +62,8 @@ character.yijiang={
quancong:['male','wu',4,['yaoming']], quancong:['male','wu',4,['yaoming']],
gongsunyuan:['male','qun',4,['huaiyi']], gongsunyuan:['male','qun',4,['huaiyi']],
guotufengji:['male','qun',3,['jigong','shifei']], guotufengji:['male','qun',3,['jigong','shifei']],
xin_yujin:['male','wei',4,['jieyue']],
}, },
perfectPair:{ perfectPair:{
wuguotai:['sunjian','sunshangxiang'], wuguotai:['sunjian','sunshangxiang'],
@ -80,6 +82,119 @@ character.yijiang={
guanping:['guanyu'], guanping:['guanyu'],
}, },
skill:{ skill:{
jieyue:{
group:'jieyue1'
},
jieyue1:{
audio:2,
trigger:{player:'phaseEnd'},
direct:true,
content:function(){
'step 0'
player.chooseCardTarget({
filterTarget:function(card,player,target){
return target!=player&&target.num('he')>0;
},
filterCard:true,
ai1:function(card){
return 7-ai.get.useful(card);
},
ai2:function(target){
return 1-ai.get.attitude(player,target);
},
prompt:'是否发动【节钺】?'
});
'step 1'
if(result.bool){
player.logSkill('jieyue1',result.targets);
player.discard(result.cards);
var target=result.targets[0];
event.target=target;
target.chooseCard('将一张牌置于'+get.translation(player)+'的武将牌上,或令其弃置你的一张牌','he').ai=function(card){
if(ai.get.attitude(player,target)>0){
return 8-ai.get.value(card);
}
var nh=player.num('h');
if(nh<=2){
return 6-ai.get.value(card);
}
if(nh<=3){
return 2-ai.get.value(card);
}
return 0;
}
}
else{
event.finish();
}
'step 2'
if(result.bool&&result.cards&&result.cards.length){
event.target.$give(result.cards,player);
player.storage.jieyue2=result.cards[0];
event.target.lose(result.cards[0],ui.special);
player.syncStorage('jieyue2');
player.addSkill('jieyue2');
}
else if(event.target.num('he')){
player.discardPlayerCard(event.target,true);
}
},
ai:{
expose:0.1
}
},
jieyue2:{
mark:'card',
intro:{
content:'card'
},
audio:true,
enable:'chooseToUse',
filterCard:function(card){
return get.color(card)=='black';
},
viewAsFilter:function(player){
return player.num('h',{color:'black'})>0;
},
viewAs:{name:'wuxie'},
prompt:'将一张黑色手牌当无懈可击使用',
check:function(card){return 8-ai.get.value(card)},
threaten:1.2,
group:['jieyue3','jieyue4']
},
jieyue3:{
enable:['chooseToRespond'],
filterCard:function(card){
return get.color(card)=='red';
},
viewAs:{name:'shan'},
viewAsFilter:function(player){
if(!player.num('h',{color:'red'})) return false;
},
audio:true,
prompt:'将一张红色手牌当闪打出',
check:function(){return 1},
ai:{
respondShan:true,
skillTagFilter:function(player){
if(!player.num('h',{color:'red'})) return false;
},
result:{
target:function(card,player,target,current){
if(get.tag(card,'respondShan')&&current<0) return 0.8
}
}
}
},
jieyue4:{
trigger:{player:'phaseBegin'},
forced:true,
content:function(){
player.gain(player.storage.jieyue2,'gain2');
player.storage.jieyue2=null;
player.removeSkill('jieyue2');
}
},
jinjiu:{ jinjiu:{
mod:{ mod:{
cardEnabled:function(card,player){ cardEnabled:function(card,player){
@ -665,7 +780,10 @@ character.yijiang={
!trigger.player.skills.contains('fengnu')&& !trigger.player.skills.contains('fengnu')&&
!trigger.player.num('e','zhuge')){ !trigger.player.num('e','zhuge')){
var nh=trigger.player.num('h'); var nh=trigger.player.num('h');
if(nh>=4){ if(player==trigger.player){
go=(player.num('h','sha')>0);
}
else if(nh>=4){
go=true; go=true;
} }
else if(player.num('h','sha')){ else if(player.num('h','sha')){
@ -5460,7 +5578,14 @@ character.yijiang={
hanhaoshihuan:'韩浩史涣', hanhaoshihuan:'韩浩史涣',
chengpu:'程普', chengpu:'程普',
gaoshun:'高顺', gaoshun:'高顺',
xin_yujin:'新于禁',
jieyue:'节钺',
jieyue1:'节钺',
jieyue2:'节钺',
jieyue3:'节钺',
jieyue4:'节钺',
jieyue_info:'结束阶段开始时,你可以弃置一张手牌,然后令一名其他角色选择一项:将一张牌置于你的武将牌上;或令你弃置其一张牌。你武将牌上有牌时,你可以将红色手牌当【闪】、黑色的手牌当【无懈可击】使用或打出。准备阶段开始时,你获得你武将牌上的牌。',
xianzhen:'陷阵', xianzhen:'陷阵',
xianzhen_info:'出牌阶段,你可以与一名角色拼点。若你赢,你获得以下技能直到回合结束:无视与该角色的距离;无视防具且可使用任意数量的【杀】。若你没赢,你不能使用【杀】直到回合结束。每回合限一次', xianzhen_info:'出牌阶段,你可以与一名角色拼点。若你赢,你获得以下技能直到回合结束:无视与该角色的距离;无视防具且可使用任意数量的【杀】。若你没赢,你不能使用【杀】直到回合结束。每回合限一次',
jinjiu:'禁酒', jinjiu:'禁酒',

View File

@ -1646,7 +1646,7 @@ character.yxs={
trigger:{player:'recoverEnd'}, trigger:{player:'recoverEnd'},
check:function(event,player){ check:function(event,player){
if(event.parent.name=='taoyuan'&&event.parent.player==player){ if(event.parent.name=='taoyuan'&&event.parent.player==player){
console.log(1);return false; return false;
} }
var num=0; var num=0;
var ef; var ef;

View File

@ -242,6 +242,9 @@ character.zhuogui={
result.targets[0].$give(1,player); result.targets[0].$give(1,player);
game.delay(); game.delay();
} }
},
ai:{
threaten:1.7
} }
}, },
suoling:{ suoling:{

View File

@ -1,6 +1,6 @@
window.config={ window.config={
forbidai:['zuoci','caiwenji'], forbidai:['zuoci','caiwenji'],
forbidsingle:['menghuo','huanggai','caoren','machao','pangde','yanwen','xiahoudun','xuzhu','luxun', forbidsingle:['menghuo','huanggai','machao','pangde','yanwen','xiahoudun','xuzhu','luxun',
'xuhuang','yujin','xiaoqiao','daqiao','zhangjiao','zhangbao'], 'xuhuang','yujin','xiaoqiao','daqiao','zhangjiao','zhangbao'],
forbidall:['caocao','simayi','guanyu','zhangfei','zhaoyun','ganning','lvmeng','lvbu', forbidall:['caocao','simayi','guanyu','zhangfei','zhaoyun','ganning','lvmeng','lvbu',
'xiahouyuan','huangzhong','weiyan','dianwei','gongsunzan','zhangjiao'], 'xiahouyuan','huangzhong','weiyan','dianwei','gongsunzan','zhangjiao'],
@ -8,7 +8,7 @@ window.config={
forbidstone:['zhugedan','pal_xuanxiao'], forbidstone:['zhugedan','pal_xuanxiao'],
forbidchess:['hetaihou','swd_kangnalishi'], forbidchess:['hetaihou','swd_kangnalishi'],
forbidboss:['caiwenji','gjqt_aruan','pal_xuanxiao','swd_hupo'], forbidboss:['caiwenji','gjqt_aruan','pal_xuanxiao','swd_hupo'],
forbiddouble:['zhugedan','swd_kangnalishi','swd_nicole','dongzhuo','wutugu','jg_simayi','hs_siwangzhiyi','hs_ronghejuren'], forbiddouble:['zhugedan','swd_kangnalishi','dongzhuo','wutugu','jg_simayi','hs_siwangzhiyi','hs_ronghejuren','hs_shanlingjuren'],
layoutfixed:['chess'], layoutfixed:['chess'],
all:{ all:{
mode:['identity','guozhan','versus','boss','chess','stone'], mode:['identity','guozhan','versus','boss','chess','stone'],
@ -253,7 +253,7 @@ window.config={
sort:'type_sort', sort:'type_sort',
cards:['standard','ex','extra','refresh'], cards:['standard','ex','extra','refresh'],
characters:['standard','wind','fire','woods','mountain','refresh','yijiang'], characters:['standard','shenhua','refresh','yijiang'],
plays:[], plays:[],
banned:[], banned:[],
bannedcards:[], bannedcards:[],

View File

@ -16,16 +16,18 @@
dieClose:[] dieClose:[]
}; };
var lib={ var lib={
version:1.76, version:1.77,
changeLog:[ changeLog:[
'bug修复捉鬼、导出武将', '新武将(SP)',
'配音支持引用文件名', '志继、化身结算',
'挑战模式可关闭单人控制', '提示样式修改',
'不同模式可单独设置禁将、禁卡', '牌堆管理',
'自定义技能禁配', '战棋1v1、对决4v4',
'战棋对战选项', '年兽、守卫剑阁',
'炉石模式平衡调整', '注1年兽在挑战模式守卫剑阁在对决模式菜单中的游戏模式里选',
'ctrl+shift+R重置游戏' '注2此版本去掉了diy捉鬼和剑阁武将包未来将进入diy武将包',
'注3此版本更改了手气卡代码若要关闭需重新设置',
'注4安卓版预计一周内更新'
], ],
configprefix:'noname_0.9_', configprefix:'noname_0.9_',
updates:[], updates:[],
@ -662,6 +664,20 @@
} }
} }
}, },
// popup_style:{
// name:'提示样式',
// init:'newstyle',
// item:{
// newstyle:'默认',
// old:'旧版'
// },
// unfrequent:true,
// },
show_card_prompt:{
name:'出牌显示卡牌名',
init:true,
unfrequent:true,
},
fold_card:{ fold_card:{
name:'折叠手牌', name:'折叠手牌',
init:true, init:true,
@ -1346,12 +1362,11 @@
name:'其它', name:'其它',
config:{ config:{
reset_game:{ reset_game:{
name:'重置游戏', name:'重置游戏设置',
onclick:function(){ onclick:function(){
var node=this; var node=this;
if(node._clearing){ if(node._clearing){
localStorage.clear(); localStorage.clear();
if(indexedDB) indexedDB.deleteDatabase(lib.configprefix+'data');
game.reload(); game.reload();
return; return;
} }
@ -1370,6 +1385,30 @@
}, },
clear:true clear:true
}, },
reset_database:{
name:'重置自定义武将及录像',
onclick:function(){
var node=this;
if(node._clearing){
if(indexedDB) indexedDB.deleteDatabase(lib.configprefix+'data');
game.reload();
return;
}
node._clearing=true;
node.innerHTML='单击以确认 (3)';
setTimeout(function(){
node.innerHTML='单击以确认 (2)';
setTimeout(function(){
node.innerHTML='单击以确认 (1)';
setTimeout(function(){
node.innerHTML='重置自定义武将及录像';
delete node._clearing;
},1000);
},1000);
},1000);
},
clear:true
},
reset_hiddenpack:{ reset_hiddenpack:{
name:'重置隐藏扩展包', name:'重置隐藏扩展包',
onclick:function(){ onclick:function(){
@ -1596,7 +1635,13 @@
}, },
change_card:{ change_card:{
name:'开启手气卡', name:'开启手气卡',
init:false, init:'disabled',
item:{
disabled:'禁用',
once:'一次',
twice:'两次',
unlimited:'无限',
}
}, },
dierestart:{ dierestart:{
name:'死亡后显示重来', name:'死亡后显示重来',
@ -1826,7 +1871,13 @@
}, },
change_card:{ change_card:{
name:'开启手气卡', name:'开启手气卡',
init:false, init:'disabled',
item:{
disabled:'禁用',
once:'一次',
twice:'两次',
unlimited:'无限',
}
}, },
dierestart:{ dierestart:{
name:'死亡后显示重来', name:'死亡后显示重来',
@ -1903,6 +1954,62 @@
versus:{ versus:{
name:'对决', name:'对决',
config:{ config:{
update:function(config,map){
if(config.versus_mode=='four'){
map.change_choice.hide();
map.enable_all.show();
map.four_assign.show();
}
else{
map.change_choice.show();
map.enable_all.hide();
map.four_assign.hide();
}
if(config.versus_mode=='jiange'){
map.free_choose.show();
}
else{
map.free_choose.hide();
}
},
versus_mode:{
name:'游戏模式',
init:'standard',
item:{
standard:'标准',
jiange:'剑阁',
four:'<span style="display:inline-block;width:100%;text-align:center">4v4</span>'
},
restart:true,
frequent:true,
},
enable_all:{
name:'启用全部武将',
init:false,
frequent:true,
restart:true,
},
four_assign:{
name:'代替队友选将',
init:true,
frequent:true,
restart:true,
},
free_choose:{
name:'自由选将',
init:true,
frequent:true,
onclick:function(bool){
game.saveConfig('free_choose',bool,this._link.config.mode);
if(!ui.create.cheat2) return;
if(!_status.event.parent.showConfig&&!_status.event.showConfig) return;
if(!ui.cheat2&&get.config('free_choose')) ui.create.cheat2();
else if(ui.cheat2&&!get.config('free_choose')){
ui.cheat2.close();
delete ui.cheat2;
}
}
},
change_choice:{ change_choice:{
name:'开启换将卡', name:'开启换将卡',
init:false, init:false,
@ -2123,25 +2230,6 @@
clear:true, clear:true,
frequent:true, frequent:true,
}, },
// battle_number:{
// name:'对战人数',
// init:'3',
// frequent:true,
// item:{
// '2':'2v2',
// '3':'3v3',
// '4':'4v4',
// '6':'6v6',
// '8':'8v8',
// },
// onclick:function(num){
// game.saveConfig('battle_number',num,this._link.config.mode);
// if(!_status.event.parent.showConfig&&!_status.event.showConfig) return;
// if(_status.event.parent.changeDialog){
// _status.event.parent.changeDialog();
// }
// },
// },
chess_treasure:{ chess_treasure:{
name:'战场机关', name:'战场机关',
init:'0.2', init:'0.2',
@ -2168,27 +2256,22 @@
attack_move:{ attack_move:{
name:'击退效果', name:'击退效果',
init:true, init:true,
// frequent:true,
}, },
show_distance:{ show_distance:{
name:'显示距离', name:'显示距离',
init:true, init:true,
// frequent:true,
}, },
// chess_ordered:{
// name:'交替行动',
// init:true,
// // frequent:true,
// },
chess_character:{ chess_character:{
name:'战棋武将', name:'战棋武将',
init:true, init:true,
// frequent:true,
}, },
// chess_jiange:{
// name:'守卫剑阁',
// init:true,
// },
chess_card:{ chess_card:{
name:'战棋卡牌', name:'战棋卡牌',
init:true, init:true,
// frequent:true,
}, },
free_choose:{ free_choose:{
name:'自由选将', name:'自由选将',
@ -2400,6 +2483,9 @@
'<div style="margin:10px">明忠</div><ul style="margin-top:0"><li>本模式需要8名玩家进行游戏使用的身份牌为1主公、2忠臣、4反贼和1内奸。游戏开始时每名玩家随机获得一个身份由系统随机选择一名忠臣身份的玩家亮出身份将忠臣牌正面朝上放在面前其他身份包括主公的玩家不亮出身份。<li>'+ '<div style="margin:10px">明忠</div><ul style="margin-top:0"><li>本模式需要8名玩家进行游戏使用的身份牌为1主公、2忠臣、4反贼和1内奸。游戏开始时每名玩家随机获得一个身份由系统随机选择一名忠臣身份的玩家亮出身份将忠臣牌正面朝上放在面前其他身份包括主公的玩家不亮出身份。<li>'+
'首先由亮出身份的忠臣玩家随机获得六张武将牌,挑选一名角色,并将选好的武将牌展示给其他玩家。之后其余每名玩家随机获得三张武将牌,各自从其中挑选一张同时亮出<li>'+ '首先由亮出身份的忠臣玩家随机获得六张武将牌,挑选一名角色,并将选好的武将牌展示给其他玩家。之后其余每名玩家随机获得三张武将牌,各自从其中挑选一张同时亮出<li>'+
'亮出身份牌的忠臣增加1点体力上限。角色濒死和死亡的结算及胜利条件与普通身份局相同。', '亮出身份牌的忠臣增加1点体力上限。角色濒死和死亡的结算及胜利条件与普通身份局相同。',
'对决模式':'<div style="margin:10px">4v4</div><ul style="margin-top:0"><li>双方各有一名主公和三名忠臣,杀死对方主公获胜<li>'+
'8号位游戏开始时额外摸一张牌7、8号位可在游戏开始时置换一次手牌<li>'+
'杀死对方忠臣摸2+x张牌x为对方含刚被杀的忠臣与己方的存活人数之差主公杀死己方忠臣须弃置所有牌',
}, },
help2:{ help2:{
'战棋模式': '战棋模式':
@ -2411,7 +2497,7 @@
'开启无尽模式后,任何一方有角色死亡都将选择一名新角色重新加入战场,直到点击左上角的结束游戏按钮手动结束游戏。结束游戏时,杀敌更多的一方获胜<li>'+ '开启无尽模式后,任何一方有角色死亡都将选择一名新角色重新加入战场,直到点击左上角的结束游戏按钮手动结束游戏。结束游戏时,杀敌更多的一方获胜<li>'+
'开启交替行动时双方无论存活角色角色多少都将轮流进行行动。在一方所有角色行动完毕进行下一轮行动时若其人数比另一方少另一方可指定至多X名角色名摸一张牌X为人数之差<li>'+ '开启交替行动时双方无论存活角色角色多少都将轮流进行行动。在一方所有角色行动完毕进行下一轮行动时若其人数比另一方少另一方可指定至多X名角色名摸一张牌X为人数之差<li>'+
'开启战场机关后每个回合结束时有一定机率出现一个机关该机关不参与战斗并有一个影响周围或全体角色的效果。机关在出现后的5〜10个回合内消失<li>'+ '开启战场机关后每个回合结束时有一定机率出现一个机关该机关不参与战斗并有一个影响周围或全体角色的效果。机关在出现后的5〜10个回合内消失<li>'+
'开启击退效果后,当一名角色对距离两格以内且在同一直线上的目标造成伤害后,受伤害角色将沿反方向移动一格<li>'+ '开启击退效果后,当一名角色对距离两格以内的目标造成伤害后,受伤害角色将沿反方向移动一格<li>'+
'战场上可设置出现随机路障,角色无法移动到路障处。当一名角色的周围四格有至少三格为路障或在战场外时,其可以在回合内清除一个相邻路障</ul>'+ '战场上可设置出现随机路障,角色无法移动到路障处。当一名角色的周围四格有至少三格为路障或在战场外时,其可以在回合内清除一个相邻路障</ul>'+
'<div style="margin:10px">君主模式</div><ul style="margin-top:0"><li>收集武将进行战斗,根据战斗难度及我方出场武将的强度,战斗胜利后将获得数量不等的金钱。没有君主出场时,获得的金钱较多<li>'+ '<div style="margin:10px">君主模式</div><ul style="margin-top:0"><li>收集武将进行战斗,根据战斗难度及我方出场武将的强度,战斗胜利后将获得数量不等的金钱。没有君主出场时,获得的金钱较多<li>'+
'金钱可以用来招募随机武将,招到已有武将,或遣返不需要的武将时可得到招募令<li>'+ '金钱可以用来招募随机武将,招到已有武将,或遣返不需要的武将时可得到招募令<li>'+
@ -2426,6 +2512,7 @@
'炉石模式': '炉石模式':
'<div style="margin:10px">构筑</div><ul style="margin-top:0"><li>点击右上角的卡组管理构建卡组<li>一套卡组共30张牌由法术和随从牌构成每个同名卡牌最多带两张'+ '<div style="margin:10px">构筑</div><ul style="margin-top:0"><li>点击右上角的卡组管理构建卡组<li>一套卡组共30张牌由法术和随从牌构成每个同名卡牌最多带两张'+
'<li>卡组管理器中随从右上角的x/y表示登场状态为x牌y血'+ '<li>卡组管理器中随从右上角的x/y表示登场状态为x牌y血'+
'<li>游戏开始时,双方摸三张牌并从牌库中获得一张牌,并可选择将手牌置换一次'+
'<li>摸牌阶段,主将少摸一张牌,并从卡组中获得一张牌'+ '<li>摸牌阶段,主将少摸一张牌,并从卡组中获得一张牌'+
'<li>每名角色使用一套卡组,卡组用完后会重新补满'+ '<li>每名角色使用一套卡组,卡组用完后会重新补满'+
'<li>卡组与职业绑定,每个职业有一个专属技能,每回合限用一次,消耗两点行动值</ul>'+ '<li>卡组与职业绑定,每个职业有一个专属技能,每回合限用一次,消耗两点行动值</ul>'+
@ -2776,6 +2863,9 @@
lib.skill[i].createInfo=skills[i]; lib.skill[i].createInfo=skills[i];
lib.setTranslate(i); lib.setTranslate(i);
lib.translate[i+'_info']=skills[i].description; lib.translate[i+'_info']=skills[i].description;
if(lib.skill[i].marktext){
lib.translate[i+'_bg']=lib.skill[i].marktext;
}
} }
if(_status.cardsFinished){ if(_status.cardsFinished){
game.finishCards(); game.finishCards();
@ -3100,9 +3190,9 @@
playerproto:{ playerproto:{
phase:function(){ phase:function(){
"step 0" "step 0"
if(player.node.judges.childElementCount){ // if(player.node.judges.childElementCount){
player.popup('判定阶段'); // player.popup('判定阶段');
} // }
player.phaseJudge(); player.phaseJudge();
"step 1" "step 1"
player.phaseDraw(); player.phaseDraw();
@ -3135,6 +3225,7 @@
player.$phaseJudge(event.card); player.$phaseJudge(event.card);
event.cancelled=false; event.cancelled=false;
event.trigger('phaseJudge'); event.trigger('phaseJudge');
player.popup(event.card.viewAs||event.card.name,'thunder');
} }
else event.finish(); else event.finish();
"step 1" "step 1"
@ -3978,6 +4069,9 @@
player.logSkill(event.skill); player.logSkill(event.skill);
player.popup(event.card.name); player.popup(event.card.name);
} }
else if(lib.config.show_card_prompt&&get.type(event.card)!='equip'){
player.popup(event.card.name,'metal');
}
if(event.audio===false){ if(event.audio===false){
cardaudio=false; cardaudio=false;
} }
@ -4443,6 +4537,9 @@
player.checkShow(event.skill); player.checkShow(event.skill);
} }
} }
else if(lib.config.show_card_prompt){
player.popup(card.name,'wood');
}
if(cardaudio&&event.parent.parent.parent.name=='useCard'){ if(cardaudio&&event.parent.parent.parent.name=='useCard'){
if(lib.config.background_audio){ if(lib.config.background_audio){
var sex=player.sex=='female'?'female':'male'; var sex=player.sex=='female'?'female':'male';
@ -4685,11 +4782,8 @@
else if(event.nature=='thunder'){ else if(event.nature=='thunder'){
player.$thunder(); player.$thunder();
} }
player.$damagepop(-num,event.nature);
}
else{
player.popup(-num,event.nature);
} }
player.$damagepop(-num,event.nature);
} }
// if(source){ // if(source){
// if(player._damagetimeout!=source){ // if(player._damagetimeout!=source){
@ -4732,11 +4826,8 @@
player.changeHp(num,false); player.changeHp(num,false);
if(lib.config.animation&&!lib.config.low_performance){ if(lib.config.animation&&!lib.config.low_performance){
player.$recover(); player.$recover();
player.$damagepop(num,'wood');
}
else{
player.popup('+'+num);
} }
player.$damagepop(num,'wood');
game.log(player,'回复了'+get.cnNumber(num)+'点体力') game.log(player,'回复了'+get.cnNumber(num)+'点体力')
} }
}, },
@ -5593,7 +5684,7 @@
syncStorage:function(skill){ syncStorage:function(skill){
switch(get.itemtype(this.storage[skill])){ switch(get.itemtype(this.storage[skill])){
case 'cards':game.addVideo('storage',this,[skill,get.cardsInfo(this.storage[skill]),'cards']);break; case 'cards':game.addVideo('storage',this,[skill,get.cardsInfo(this.storage[skill]),'cards']);break;
case 'card':game.addVideo('storage',this,[skill,get.cardInfo(this.storage[skill]),'cards']);break; case 'card':game.addVideo('storage',this,[skill,get.cardInfo(this.storage[skill]),'card']);break;
default:game.addVideo('storage',this,[skill,this.storage[skill]]); default:game.addVideo('storage',this,[skill,this.storage[skill]]);
} }
}, },
@ -6764,6 +6855,11 @@
}, },
popup:function(name,className){ popup:function(name,className){
var name2=get.translation(name); var name2=get.translation(name);
if(true){
if(!name2) return;
this.$damagepop(name2,className||'water',true);
return;
}
var node=ui.create.div('.popup',this.parentNode); var node=ui.create.div('.popup',this.parentNode);
if(!name2){ if(!name2){
node.remove(); node.remove();
@ -7009,6 +7105,9 @@
this.unmarkSkill(skill); this.unmarkSkill(skill);
this.skills.remove(skill); this.skills.remove(skill);
this.checkConflict(); this.checkConflict();
if(lib.skill[skill]&&lib.skill[skill].onremove){
lib.skill[skill].onremove(this);
}
return skill; return skill;
}, },
addTempSkill:function(skill,expire){ addTempSkill:function(skill,expire){
@ -7118,6 +7217,7 @@
return false; return false;
} }
if(lib.config.mode=='versus'){ if(lib.config.mode=='versus'){
if(_status.mode=='four'||_status.mode=='jiange') return false;
return ui.autoreplace&&ui.autoreplace.classList.contains('on')&& return ui.autoreplace&&ui.autoreplace.classList.contains('on')&&
this.side==game.me.side; this.side==game.me.side;
} }
@ -8037,10 +8137,13 @@
node.delete(); node.delete();
},1000); },1000);
}, },
$damagepop:function(num,nature){ $damagepop:function(num,nature,font){
if(typeof num=='number'||typeof num=='string'){ if(typeof num=='number'||typeof num=='string'){
game.addVideo('damagepop',this,[num,nature]); game.addVideo('damagepop',this,[num,nature,font]);
var node=ui.create.div('.damage'); var node=ui.create.div('.damage');
if(font){
node.classList.add('normal-font');
}
if(num>0){ if(num>0){
num='+'+num; num='+'+num;
} }
@ -8548,79 +8651,7 @@
if(list.length){ if(list.length){
list.sort(lib.sort.priority); list.sort(lib.sort.priority);
for(i=0;i<list.length;i++){ for(i=0;i<list.length;i++){
if(list[i][1].isOut()||list[i][1].isDead()||list[i][1].removed) continue; game.createTrigger(name,list[i][0],list[i][1],event);
var next=game.createEvent('trigger',false);
next.skill=list[i][0];
next.player=list[i][1];
next.triggername=name;
next._trigger=event;
next.content=function(){
"step 0"
var info=get.info(event.skill);
if(info.filter&&!info.filter(trigger,player,event.triggername)){
event.finish();
}
else if(event._trigger.notrigger.contains(player)&&!lib.skill.global.contains(event.skill)){
event.finish();
}
else{
var hidden=player.hiddenSkills.slice(0);
game.expandSkills(hidden);
if(hidden.contains(event.skill)&&!get.info(event.skill).direct){
event.trigger('triggerHidden');
}
}
"step 1"
if(event.cancelled){
event.finish();
}
else{
event.trigger('triggerBefore');
}
"step 2"
if(event.cancelled){
event.finish();
return;
}
if(!event.revealed&&!get.info(event.skill).forced){
if(get.info(event.skill).direct&&player.isUnderControl()){
game.modeSwapPlayer(player);
event._result={bool:true};
}
else if(get.info(event.skill).frequent&&!lib.config.autoskilllist.contains(event.skill)){
event._result={bool:true};
}
else if(get.info(event.skill).direct&&player==game.me&&!_status.auto){
event._result={bool:true};
}
else{
var str;
var check=get.info(event.skill).check;
if(get.info(event.skill).prompt) str=get.info(event.skill).prompt;
else str='是否发动【'+get.translation(event.skill)+'】?';
if(typeof str=='function'){str=str(trigger,player)}
player.chooseBool(str).ai=function(){
return !check||check(trigger,player);
};
}
}
"step 3"
if(result&&result.bool==false) return;
var info=get.info(event.skill);
var next=game.createEvent(event.skill);
next.player=player;
next._trigger=trigger;
next.content=info.content;
if(info.popup!=false&&!info.direct){
if(info.popup){
player.popup(info.popup);
game.log(player,'发动了','【'+get.translation(event.skill)+'】');
}
else{
player.logSkill(event.skill);
}
}
}
} }
} }
}, },
@ -9041,7 +9072,7 @@
popup:false, popup:false,
content:function(){ content:function(){
if(!player.noPhaseDelay){ if(!player.noPhaseDelay){
player.popup('_phasebegin'); player.popup('回合开始');
} }
if(lib.config.glow_phase){ if(lib.config.glow_phase){
if(_status.currentPhase){ if(_status.currentPhase){
@ -9650,6 +9681,9 @@
videoContent:{ videoContent:{
init:function(players){ init:function(players){
if(lib.config.mode=='chess') return; if(lib.config.mode=='chess') return;
if(lib.config.mode=='versus'){
players.bool=players.pop();
}
ui.arena.dataset.number=players.length; ui.arena.dataset.number=players.length;
ui.arena.classList.add('video'); ui.arena.classList.add('video');
game.players.length=0; game.players.length=0;
@ -10197,7 +10231,7 @@
}, },
damagepop:function(player,content){ damagepop:function(player,content){
if(player&&content){ if(player&&content){
player.$damagepop(content[0],content[1]); player.$damagepop(content[0],content[1],content[2]);
} }
else{ else{
console.log(player); console.log(player);
@ -11078,7 +11112,83 @@
game.draw(drawfunc); game.draw(drawfunc);
} }
}, },
createEvent:function(name,trigger){ createTrigger:function(name,skill,player,event){
if(player.isOut()||player.isDead()||player.removed) return;
var next=game.createEvent('trigger',false,event);
next.skill=skill;
next.player=player;
next.triggername=name;
next._trigger=event;
next.content=function(){
"step 0"
var info=get.info(event.skill);
if(info.filter&&!info.filter(trigger,player,event.triggername)){
event.finish();
}
else if(event._trigger.notrigger.contains(player)&&!lib.skill.global.contains(event.skill)){
event.finish();
}
else{
var hidden=player.hiddenSkills.slice(0);
game.expandSkills(hidden);
if(hidden.contains(event.skill)&&!get.info(event.skill).direct){
event.trigger('triggerHidden');
}
}
"step 1"
if(event.cancelled){
event.finish();
}
else{
event.trigger('triggerBefore');
}
"step 2"
if(event.cancelled){
event.finish();
return;
}
if(!event.revealed&&!get.info(event.skill).forced){
if(get.info(event.skill).direct&&player.isUnderControl()){
game.modeSwapPlayer(player);
event._result={bool:true};
}
else if(get.info(event.skill).frequent&&!lib.config.autoskilllist.contains(event.skill)){
event._result={bool:true};
}
else if(get.info(event.skill).direct&&player==game.me&&!_status.auto){
event._result={bool:true};
}
else{
var str;
var check=get.info(event.skill).check;
if(get.info(event.skill).prompt) str=get.info(event.skill).prompt;
else str='是否发动【'+get.translation(event.skill)+'】?';
if(typeof str=='function'){str=str(trigger,player)}
player.chooseBool(str).ai=function(){
return !check||check(trigger,player);
};
}
}
"step 3"
if(result&&result.bool==false) return;
var info=get.info(event.skill);
var next=game.createEvent(event.skill);
next.player=player;
next._trigger=trigger;
next.triggername=event.triggername;
next.content=info.content;
if(info.popup!=false&&!info.direct){
if(info.popup){
player.popup(info.popup);
game.log(player,'发动了','【'+get.translation(event.skill)+'】');
}
else{
player.logSkill(event.skill);
}
}
}
},
createEvent:function(name,trigger,triggerevent){
var next={ var next={
name:name, name:name,
step:0, step:0,
@ -11096,7 +11206,7 @@
for(var i in lib.element.event){ for(var i in lib.element.event){
next[i]=lib.element.event[i]; next[i]=lib.element.event[i];
} }
_status.event.next.push(next); (triggerevent||_status.event).next.push(next);
return next; return next;
}, },
createCard:function(name,suit,number,nature){ createCard:function(name,suit,number,nature){
@ -11186,7 +11296,9 @@
added=added*(game.players.length+game.dead.length); added=added*(game.players.length+game.dead.length);
break; break;
case 'versus': case 'versus':
added=5*(game.players.length+_status.friend.length); if(_status.friend){
added=5*(game.players.length+_status.friend.length);
}
break; break;
default: default:
added=10; added=10;
@ -11566,7 +11678,7 @@
event._triggered++; event._triggered++;
} }
else{ else{
if(player&&player.classList.contains('dead')&&event.name!='phaseLoop'){ if(player&&player.classList.contains('dead')&&!event.forceDie&&event.name!='phaseLoop'){
while(_status.dieClose.length){ while(_status.dieClose.length){
_status.dieClose.shift().close(); _status.dieClose.shift().close();
} }
@ -12164,8 +12276,12 @@
player=player.next; player=player.next;
} }
while(player!=end); while(player!=end);
event.changeCard=get.config('change_card');
if(lib.config.mode!='identity'&&lib.config.mode!='guozhan'){
event.changeCard='disabled';
}
"step 1" "step 1"
if(get.config('change_card')){ if(event.changeCard!='disabled'){
event.dialog=ui.create.dialog('是否使用手气卡?'); event.dialog=ui.create.dialog('是否使用手气卡?');
ui.create.confirm('oc'); ui.create.confirm('oc');
event.custom.replace.confirm=function(bool){ event.custom.replace.confirm=function(bool){
@ -12177,24 +12293,34 @@
event.finish(); event.finish();
} }
"step 2" "step 2"
if(event.changeCard=='once'){
event.changeCard='disabled';
}
else if(event.changeCard=='twice'){
event.changeCard='once';
}
else if(event.changeCard=='disabled'){
event.bool=false;
return;
}
game.pause(); game.pause();
"step 3" "step 3"
if(event.bool){ if(event.bool){
if(game.changeCoin){ if(game.changeCoin){
game.changeCoin(-3); game.changeCoin(-3);
} }
game.me.lose(game.me.get('h'))._triggered=null; var hs=game.me.get('h');
for(var i=0;i<hs.length;i++){
ui.discardPile.appendChild(hs[i]);
}
game.me.directgain(get.cards(hs.length));
event.goto(2);
} }
else{ else{
event.dialog.close(); event.dialog.close();
ui.confirm.close(); ui.confirm.close();
event.finish(); event.finish();
} }
"step 4"
game.delay();
game.me.gain(get.cards(4))._triggered=null;
"step 5"
event.goto(2);
} }
}, },
asyncDraw:function(players,num){ asyncDraw:function(players,num){
@ -12326,6 +12452,9 @@
if(lib.skill[i].subSkill[j].description){ if(lib.skill[i].subSkill[j].description){
lib.translate[i+'_'+j+'_info']=lib.skill[i].subSkill[j].description; lib.translate[i+'_'+j+'_info']=lib.skill[i].subSkill[j].description;
} }
if(lib.skill[i].subSkill[j].marktext){
lib.translate[i+'_'+j+'_bg']=lib.skill[i].subSkill[j].marktext;
}
} }
} }
if(i[0]=='_'){ if(i[0]=='_'){
@ -17496,7 +17625,6 @@
if(this.classList.contains('selectable')&& if(this.classList.contains('selectable')&&
!this.classList.contains('selected')&& !this.classList.contains('selected')&&
!this.classList.contains('noclick')){ !this.classList.contains('noclick')){
game.print(1)
this._waitingfordrag={clientX:e.touches[0].clientX,clientY:e.touches[0].clientY}; this._waitingfordrag={clientX:e.touches[0].clientX,clientY:e.touches[0].clientY};
} }
}, },
@ -19269,7 +19397,11 @@
return info; return info;
}, },
infoCard:function(info){ infoCard:function(info){
return ui.create.card().init(info); var card=ui.create.card();
if(info[0]){
card.init(info);
}
return card;
}, },
infoCards:function(info){ infoCards:function(info){
var cards=[]; var cards=[];

View File

@ -1,16 +1,13 @@
character.pack={ character.pack={
standard:'标准', standard:'标准',
wind:'风包', shenhua:'神话再临',
fire:'火包',
woods:'林包',
mountain:'山包',
refresh:'界限突破', refresh:'界限突破',
extra:'神将', extra:'神将',
sp:'SP', sp:'SP',
guozhan:'国战', guozhan:'国战',
yijiang:'一将成名', yijiang:'一将成名',
jiange:'守卫剑阁', // jiange:'守卫剑阁',
zhuogui:'捉鬼驱邪', // zhuogui:'捉鬼驱邪',
diy:'DIY', diy:'DIY',
yxs:'英雄杀', yxs:'英雄杀',
hearth:'炉石传说', hearth:'炉石传说',

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 71 KiB

BIN
image/character/hanba.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
image/character/panfeng.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

BIN
image/character/sunluyu.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
image/character/zhuling.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
image/skin/caoren/2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

View File

@ -623,6 +623,15 @@ margin-bottom: 5px;
transform:scale(2); transform:scale(2);
font-size: 120px; font-size: 120px;
} }
.damage.normal-font{
font-family: xinwei;
font-size: 30px;
top: calc(50% - 15px);
}
.player.minskin>.damage.normal-font{
font-size: 26px;
top: calc(50% - 13px);
}
.player[data-position='0']>.damage.dieidentity, .player[data-position='0']>.damage.dieidentity,
.player:not(.dead)>.damage.dieidentity{ .player:not(.dead)>.damage.dieidentity{
opacity: 0 !important opacity: 0 !important

View File

@ -64,9 +64,10 @@
top: calc(100% - 150px); top: calc(100% - 150px);
background: none !important; background: none !important;
border:none !important; border:none !important;
border-radius: 0 !important;
pointer-events: none; pointer-events: none;
} }
#arena:not(.chess) .player[data-position='0']:not(.selected):not(.selectable):not(.glow){ #arena:not(.chess) .player[data-position='0']:not(.selected):not(.selectedx):not(.selectable):not(.glow){
box-shadow: none !important; box-shadow: none !important;
} }
#arena:not(.chess) .player[data-position='0']:not(.minskin)>.avatar, #arena:not(.chess) .player[data-position='0']:not(.minskin)>.avatar,

View File

@ -396,12 +396,19 @@ mode.chess={
} }
} }
if(_status.mode=='combat'&&!_status.vsboss){ if(_status.mode=='combat'&&!_status.vsboss){
if(game.players.length==1&&get.config('additional_player')&&
_status.additionallist.length&&source==game.players[0]){
source.draw(get.config('reward'));
}
if(player.side==game.me.side){ if(player.side==game.me.side){
if(get.config('additional_player')&&_status.additionallist.length){ if(get.config('additional_player')&&_status.additionallist.length){
game.replaceChessPlayer(); game.replaceChessPlayer();
return; return;
} }
else if(_status.replacelist.length){ else if(_status.replacelist.length){
if(game.players.length==1&&source==game.players[0]){
source.draw(get.config('reward'));
}
game.replaceChessPlayer(_status.replacelist.randomRemove()); game.replaceChessPlayer(_status.replacelist.randomRemove());
return; return;
} }
@ -419,6 +426,9 @@ mode.chess={
return; return;
} }
else if(_status.enemyreplacelist.length){ else if(_status.enemyreplacelist.length){
if(game.players.length==1&&source==game.players[0]){
source.draw(get.config('reward'));
}
game.replaceChessPlayer(_status.enemyreplacelist.randomRemove(),true); game.replaceChessPlayer(_status.enemyreplacelist.randomRemove(),true);
return; return;
} }
@ -673,6 +683,7 @@ mode.chess={
event.filterButton=function(){return true;}; event.filterButton=function(){return true;};
event.player=game.me; event.player=game.me;
event.forced=true; event.forced=true;
event.forceDie=true;
event.custom.replace.confirm=function(){ event.custom.replace.confirm=function(){
event.playername=ui.selected.buttons[0].link; event.playername=ui.selected.buttons[0].link;
event.dialog.close(); event.dialog.close();
@ -693,6 +704,7 @@ mode.chess={
event.filterButton=function(){return true;}; event.filterButton=function(){return true;};
event.player=game.me; event.player=game.me;
event.forced=true; event.forced=true;
event.forceDie=true;
event.custom.replace.confirm=function(){ event.custom.replace.confirm=function(){
event.playername=ui.selected.buttons[0].link; event.playername=ui.selected.buttons[0].link;
event.dialog.close(); event.dialog.close();
@ -706,12 +718,18 @@ mode.chess={
else{ else{
game.delay(); game.delay();
} }
if(game.me.isDead()){
event.swapNow=true;
}
'step 1' 'step 1'
var player=game.addChessPlayer(event.playername,event.enemy); var player=game.addChessPlayer(event.playername,event.enemy);
game.log(player,'加入游戏'); game.log(player,'加入游戏');
player.chessFocus(); player.chessFocus();
player.playerfocus(1000); player.playerfocus(1000);
game.delay(2); game.delay(2);
if(event.swapNow&&player.side==game.me.side){
game.modeSwapPlayer(player);
}
}, },
chooseToMove:function(){ chooseToMove:function(){
"step 0" "step 0"
@ -1864,6 +1882,7 @@ mode.chess={
} }
else{ else{
switch(num){ switch(num){
case 1:ui.chessheight=4;break;
case 2:ui.chessheight=5;break; case 2:ui.chessheight=5;break;
case 3:ui.chessheight=5;break; case 3:ui.chessheight=5;break;
case 4:ui.chessheight=6;break; case 4:ui.chessheight=6;break;
@ -1871,9 +1890,11 @@ mode.chess={
case 6:ui.chessheight=7;break; case 6:ui.chessheight=7;break;
case 7:ui.chessheight=7;break; case 7:ui.chessheight=7;break;
case 8:ui.chessheight=8;break; case 8:ui.chessheight=8;break;
default:ui.chessheight=8;
} }
ui.chesswidth=Math.round(ui.chessheight*1.5); ui.chesswidth=Math.round(ui.chessheight*1.5);
} }
if(num==1) ui.chesswidth++;
ui.chess.style.height=148*ui.chessheight+'px'; ui.chess.style.height=148*ui.chessheight+'px';
ui.chess.style.width=148*ui.chesswidth+'px'; ui.chess.style.width=148*ui.chesswidth+'px';
if(!lib.config.touchscreen){ if(!lib.config.touchscreen){
@ -3783,8 +3804,16 @@ mode.chess={
var i; var i;
var list=[]; var list=[];
var bosslist=[]; var bosslist=[];
var jiangelist=[];
event.list=list; event.list=list;
for(i in lib.character){ for(i in lib.character){
if(lib.character[i][4].contains('chessboss')){
bosslist.push(i);continue;
}
else if(lib.character[i][4].contains('jiangeboss')){
// if(get.config('chess_jiange')) jiangelist.push(i);
continue;
}
if(i.indexOf('treasure_')==0) continue; if(i.indexOf('treasure_')==0) continue;
if(i.indexOf('chess_mech_')==0) continue; if(i.indexOf('chess_mech_')==0) continue;
if(lib.character[i][4]&&lib.character[i][4].contains('forbidai')) continue; if(lib.character[i][4]&&lib.character[i][4].contains('forbidai')) continue;
@ -3794,12 +3823,9 @@ mode.chess={
if(lib.config.banned.contains(i)) continue; if(lib.config.banned.contains(i)) continue;
if(lib.config.forbidchess.contains(i)) continue; if(lib.config.forbidchess.contains(i)) continue;
if(get.config('ban_weak')&&lib.config.forbidsingle.contains(i)) continue; if(get.config('ban_weak')&&lib.config.forbidsingle.contains(i)) continue;
if(lib.character[i][4].contains('boss')){ if(get.config('ban_strong')&&(lib.rank.s.contains(i)||lib.rank.ap.contains(i))) continue;
bosslist.push(i);
} list.push(i);
else{
list.push(i);
}
} }
list.randomSort(); list.randomSort();
var bosses=ui.create.div('.buttons'); var bosses=ui.create.div('.buttons');
@ -3810,6 +3836,10 @@ mode.chess={
_status.event.dialog.content.childNodes[1].innerHTML= _status.event.dialog.content.childNodes[1].innerHTML=
ui.selected.buttons.length+'/'+_status.event.selectButton(); ui.selected.buttons.length+'/'+_status.event.selectButton();
}; };
var jiange=ui.create.div('.buttons');
event.jiange=jiange;
var jiangebuttons=ui.create.buttons(jiangelist,'character',jiange);
var clickedBoss=false; var clickedBoss=false;
var clickBoss=function(){ var clickBoss=function(){
clickedBoss=true; clickedBoss=true;
@ -3848,10 +3878,28 @@ mode.chess={
} }
addToButton(); addToButton();
}; };
var clickedJiange=false;
var clickJiange=function(){
clickedJiange=true;
if(this.classList.contains('glow2')){
this.classList.remove('glow2');
}
else{
this.classList.add('glow2');
}
addToButton();
};
for(var i=0;i<bossbuttons.length;i++){ for(var i=0;i<bossbuttons.length;i++){
bossbuttons[i].classList.add('noclick'); bossbuttons[i].classList.add('noclick');
bossbuttons[i].listen(clickBoss); bossbuttons[i].listen(clickBoss);
} }
for(var i=0;i<jiangebuttons.length;i++){
jiangebuttons[i].classList.add('noclick');
jiangebuttons[i].listen(clickJiange);
}
if(get.config('reward')==undefined) game.saveConfig('reward',1,true); if(get.config('reward')==undefined) game.saveConfig('reward',1,true);
if(get.config('punish')==undefined) game.saveConfig('punish','无',true); if(get.config('punish')==undefined) game.saveConfig('punish','无',true);
@ -3870,6 +3918,10 @@ mode.chess={
dialog.add('挑战魔王'); dialog.add('挑战魔王');
dialog.add(bosses); dialog.add(bosses);
} }
if(jiangebuttons.length){
dialog.add('守卫剑阁');
dialog.add(jiange);
}
event.addConfig=function(dialog){ event.addConfig=function(dialog){
dialog.add('选项'); dialog.add('选项');
dialog.choice={}; dialog.choice={};
@ -3891,7 +3943,7 @@ mode.chess={
dialog.choice.reward=dialog.add(ui.create.switcher('reward',[0,1,2,3,4],get.config('reward'))).querySelector('.toggle'); dialog.choice.reward=dialog.add(ui.create.switcher('reward',[0,1,2,3,4],get.config('reward'))).querySelector('.toggle');
dialog.choice.punish=dialog.add(ui.create.switcher('punish',['弃牌','无','摸牌'],get.config('punish'))).querySelector('.toggle'); dialog.choice.punish=dialog.add(ui.create.switcher('punish',['弃牌','无','摸牌'],get.config('punish'))).querySelector('.toggle');
dialog.choice.seat_order=dialog.add(ui.create.switcher('seat_order',['交替','随机'],get.config('seat_order'))).querySelector('.toggle'); dialog.choice.seat_order=dialog.add(ui.create.switcher('seat_order',['交替','随机'],get.config('seat_order'))).querySelector('.toggle');
dialog.choice.battle_number=dialog.add(ui.create.switcher('battle_number',[2,3,4,6,8],get.config('battle_number'))).querySelector('.toggle'); dialog.choice.battle_number=dialog.add(ui.create.switcher('battle_number',[1,2,3,4,6,8],get.config('battle_number'))).querySelector('.toggle');
dialog.choice.replace_number=dialog.add(ui.create.switcher('replace_number',[0,1,2,3,5,7,9,17],get.config('replace_number'))).querySelector('.toggle'); dialog.choice.replace_number=dialog.add(ui.create.switcher('replace_number',[0,1,2,3,5,7,9,17],get.config('replace_number'))).querySelector('.toggle');
dialog.choice.choice_number=dialog.add(ui.create.switcher('choice_number',[3,6,9],get.config('choice_number'))).querySelector('.toggle'); dialog.choice.choice_number=dialog.add(ui.create.switcher('choice_number',[3,6,9],get.config('choice_number'))).querySelector('.toggle');
if(get.config('additional_player')){ if(get.config('additional_player')){
@ -3909,6 +3961,9 @@ mode.chess={
for(var i=0;i<bosses.childNodes.length;i++){ for(var i=0;i<bosses.childNodes.length;i++){
bosses.childNodes[i].classList.add('squarebutton'); bosses.childNodes[i].classList.add('squarebutton');
} }
for(var i=0;i<jiange.childNodes.length;i++){
jiange.childNodes[i].classList.add('squarebutton');
}
ui.control.style.transition='all 0s'; ui.control.style.transition='all 0s';
if(lib.config.layout=='mobile'||lib.config.layout=='default'){ if(lib.config.layout=='mobile'||lib.config.layout=='default'){
ui.control.style.top='calc(100% - 70px)'; ui.control.style.top='calc(100% - 70px)';
@ -3948,6 +4003,15 @@ mode.chess={
delete event.asboss; delete event.asboss;
} }
} }
if(clickedJiange){
clickedJiange=false;
}
else{
for(var i=0;i<jiange.childElementCount;i++){
jiange.childNodes[i].classList.remove('forbidden');
jiange.childNodes[i].classList.remove('glow2');
}
}
var dialog=_status.event.dialog; var dialog=_status.event.dialog;
if(dialog.choice){ if(dialog.choice){
for(var i in dialog.choice){ for(var i in dialog.choice){
@ -4005,6 +4069,10 @@ mode.chess={
dialog.add('挑战魔王'); dialog.add('挑战魔王');
dialog.add(bosses); dialog.add(bosses);
} }
if(jiangebuttons.length){
dialog.add('守卫剑阁');
dialog.add(jiange);
}
event.addConfig(dialog); event.addConfig(dialog);
dialog.open(); dialog.open();
game.uncheck(); game.uncheck();
@ -4098,6 +4166,7 @@ mode.chess={
event.list.remove(result.links[i]); event.list.remove(result.links[i]);
} }
var glows=event.bosses.querySelectorAll('.glow'); var glows=event.bosses.querySelectorAll('.glow');
var glows2=event.jiange.querySelectorAll('.glow2');
if(glows.length){ if(glows.length){
_status.vsboss=true; _status.vsboss=true;
_status.enemylist=[]; _status.enemylist=[];
@ -4113,6 +4182,13 @@ mode.chess={
} }
} }
} }
else if(glows2.length){
_status.vsboss=true;
_status.enemylist=[];
for(var i=0;i<glows2.length;i++){
_status.enemylist.push(glows2[i].link);
}
}
else{ else{
event.list.randomSort(); event.list.randomSort();
_status.enemylist=event.list.splice(0,_status.mylist.length); _status.enemylist=event.list.splice(0,_status.mylist.length);
@ -4333,7 +4409,7 @@ mode.chess={
var xy2=player.getXY(); var xy2=player.getXY();
var dx=xy2[0]-xy1[0]; var dx=xy2[0]-xy1[0];
var dy=xy2[1]-xy1[1]; var dy=xy2[1]-xy1[1];
if(dx*dy!=0) return false; // if(dx*dy!=0) return false;
if(dx==0&&Math.abs(dy)==2){ if(dx==0&&Math.abs(dy)==2){
dy/=2; dy/=2;
} }
@ -5124,10 +5200,10 @@ mode.chess={
} }
}, },
}, },
boss_baolin:{ boss_stonebaolin:{
inherit:'juece', inherit:'juece',
}, },
boss_qiangzheng:{ boss_stoneqiangzheng:{
trigger:{player:'phaseEnd'}, trigger:{player:'phaseEnd'},
forced:true, forced:true,
unique:true, unique:true,
@ -5820,9 +5896,9 @@ mode.chess={
guanchuan:'贯穿射击', guanchuan:'贯穿射击',
guanchuan_info:'当你使用杀指定惟一的目标后,可将攻击射线内的其他角色也加入目标', guanchuan_info:'当你使用杀指定惟一的目标后,可将攻击射线内的其他角色也加入目标',
boss_qiangzheng:'强征', boss_stoneqiangzheng:'强征',
boss_qiangzheng_info:'锁定技,回合结束阶段,你获得每个其他角色的一张手牌', boss_stoneqiangzheng_info:'锁定技,回合结束阶段,你获得每个其他角色的一张手牌',
boss_baolin:'暴凌', boss_stonebaolin:'暴凌',
boss_moyan:'魔焰', boss_moyan:'魔焰',
boss_moyan_info:'锁定技,回合结束阶段,你对场上所有角色造成一点火焰伤害', boss_moyan_info:'锁定技,回合结束阶段,你对场上所有角色造成一点火焰伤害',
@ -6164,11 +6240,11 @@ mode.chess={
// chess_zhangjiao:['male','qun',3,['']], // chess_zhangjiao:['male','qun',3,['']],
// chess_menghuo:['male','qun',3,['']], // chess_menghuo:['male','qun',3,['']],
// //
chess_jinchidiao:['male','qun',15,['boss_fengxing','boss_chiyu'],['boss']], chess_jinchidiao:['male','qun',15,['boss_fengxing','boss_chiyu'],['boss','chessboss']],
chess_beimingjukun:['male','qun',25,['boss_wuying','cangming'],['boss']], chess_beimingjukun:['male','qun',25,['boss_wuying','cangming'],['boss','chessboss']],
chess_wuzhaojinlong:['male','qun',30,['boss_tenglong','boss_wushang'],['boss']], chess_wuzhaojinlong:['male','qun',30,['boss_tenglong','boss_wushang'],['boss','chessboss']],
chess_dongzhuo:['male','qun',20,['jiuchi','boss_qiangzheng','boss_baolin'],['boss']], chess_dongzhuo:['male','qun',20,['jiuchi','boss_stoneqiangzheng','boss_stonebaolin'],['boss','chessboss']],
chess_xingtian:['male','qun',99,['boss_moyan','wushuang'],['boss']], chess_xingtian:['male','qun',99,['boss_moyan','wushuang'],['boss','chessboss']],
} }
}, },
cardPack:{ cardPack:{

View File

@ -363,7 +363,12 @@ mode.stone={
} }
} }
if(source&&source.side!=this.side&&!source.isMin()){ if(source&&source.side!=this.side&&!source.isMin()){
source.draw(2,{drawDeck:1}); if(_status.mode=='deck'){
source.draw(2,{drawDeck:1});
}
else{
source.draw(2);
}
if(source.getActCount()>0){ if(source.getActCount()>0){
source.actused--; source.actused--;
} }
@ -1176,6 +1181,23 @@ mode.stone={
else{ else{
game.gameDraw(game.me); game.gameDraw(game.me);
} }
"step 4"
game.me.chooseBool('是否置换手牌?');
"step 5"
if(result.bool){
var hs=game.me.get('h');
for(var i=0;i<hs.length;i++){
ui.discardPile.appendChild(hs[i]);
}
if(_status.mode=='deck'){
game.me.drawDeck(1,false);
game.me.directgain(get.cards(3));
}
else{
game.me.directgain(get.cards(4));
}
}
"step 6"
if(game.me.side){ if(game.me.side){
game.stoneLoop(game.me); game.stoneLoop(game.me);
} }

View File

@ -43,6 +43,7 @@ mode.versus={
_status.waitingForCharacters=true; _status.waitingForCharacters=true;
game.pause(); game.pause();
} }
_status.mode=get.config('versus_mode');
"step 1" "step 1"
var playback=localStorage.getItem(lib.configprefix+'playback'); var playback=localStorage.getItem(lib.configprefix+'playback');
if(playback){ if(playback){
@ -64,105 +65,529 @@ mode.versus={
event.finish(); event.finish();
return; return;
} }
if(lib.storage.choice==undefined) game.save('choice',20); if(_status.mode=='jiange'||_status.mode=='four'){
if(lib.storage.zhu==undefined) game.save('zhu',true); game.prepareArena(8);
if(lib.storage.noreplace_end==undefined) game.save('noreplace_end',true); // game.pause();
if(get.config('first_less')==undefined) game.saveConfig('first_less',true,true);
if(lib.storage.autoreplaceinnerhtml==undefined) game.save('autoreplaceinnerhtml',true);
// if(lib.storage.only_zhu==undefined) game.save('only_zhu',true);
if(lib.storage.single_control==undefined) game.save('single_control',true);
if(lib.storage.number==undefined) game.save('number',3);
if(lib.storage.versus_reward==undefined) game.save('versus_reward',3);
if(lib.storage.versus_punish==undefined) game.save('versus_punish','弃牌');
if(lib.storage.replace_number==undefined) game.save('replace_number',3);
// if(lib.storage.control_all==undefined) game.save('control_all',true);
switch(lib.storage.seat_order){
case '交叉':lib.storage.cross_seat=true;lib.storage.random_seat=false;break;
case '随机':lib.storage.cross_seat=false;lib.storage.random_seat=true;break;
default:lib.storage.cross_seat=false;lib.storage.random_seat=false;
} }
game.save('only_zhu',true); else{
game.save('control_all',true); if(lib.storage.choice==undefined) game.save('choice',20);
if(lib.storage.zhu==undefined) game.save('zhu',true);
if(lib.storage.noreplace_end==undefined) game.save('noreplace_end',true);
if(get.config('first_less')==undefined) game.saveConfig('first_less',true,true);
if(lib.storage.autoreplaceinnerhtml==undefined) game.save('autoreplaceinnerhtml',true);
if(lib.storage.single_control==undefined) game.save('single_control',true);
if(lib.storage.number==undefined) game.save('number',3);
if(lib.storage.versus_reward==undefined) game.save('versus_reward',3);
if(lib.storage.versus_punish==undefined) game.save('versus_punish','弃牌');
if(lib.storage.replace_number==undefined) game.save('replace_number',3);
ui.create.cards(); switch(lib.storage.seat_order){
game.finishCards(); case '交叉':lib.storage.cross_seat=true;lib.storage.random_seat=false;break;
// ui.auto.hide(); case '随机':lib.storage.cross_seat=false;lib.storage.random_seat=true;break;
ui.wuxie.hide(); default:lib.storage.cross_seat=false;lib.storage.random_seat=false;
}
game.save('only_zhu',true);
game.save('control_all',true);
ui.wuxie.hide();
ui.create.cards();
game.finishCards();
}
game.delay(); game.delay();
"step 2" "step 2"
game.chooseCharacter(); if(_status.mode=='four'){
"step 3" var list=['zhu','zhong','zhong','zhong','ezhu','ezhong','ezhong','ezhong'];
event.trigger('gameStart'); list.randomSort();
var firstAct; var side=Math.random()<0.5;
if(lib.storage.zhu){ for(var i=0;i<8;i++){
firstAct=(_status.currentSide==game.me.side)?game.friendZhu:game.enemyZhu; 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.chooseCharacterFour();
} }
else{ else if(_status.mode=='jiange'){
if(!lib.storage.cross_seat&&!lib.storage.random_seat&&lib.storage.number>1){ var list=['shumech','shu','shuboss','shu','wei','weiboss','wei','weimech'];
for(var i=0;i<game.players.length-1;i++){ var pos=Math.floor(Math.random()*8);
if(game.players[i].side!=game.players[i+1].side){ for(var i=0;i<8;i++){
var actcount; var j=pos+i;
if(Math.random()<0.5){ if(j>=8){
actcount=i; j-=8;
} }
else{ if(list[i][0]=='w'){
if(i>=lib.storage.number){ game.players[j].side=true;
actcount=i-lib.storage.number; game.players[j].setIdentity('wei');
} game.players[j].identity='wei';
else{ }
actcount=i+lib.storage.number; else{
} game.players[j].side=false;
} game.players[j].setIdentity('shu');
if(actcount>0){ game.players[j].identity='shu';
actcount--; }
} if(list[i].indexOf('mech')!=-1){
else{ game.players[j].type='mech';
actcount=game.players.length-1; }
} else if(list[i].indexOf('boss')!=-1){
firstAct=game.players[actcount]; game.players[j].type='boss';
break; }
} else{
game.players[j].type='human';
} }
} }
else{ game.chooseCharacterJiange();
firstAct=game.players[Math.floor(Math.random()*game.players.length)];
}
}
game.gameDraw(firstAct,4);
_status.first_less=true;
_status.round=0;
if(lib.storage.single_control){
lib.skill.global.push('versus_swap');
ui.autoreplace=ui.create.div('.caption.normal');
ui.autoreplace.innerHTML='<div class="underline">自动换人</div>';
ui.autoreplace.style.textAlign='center';
if(lib.storage.autoreplaceinnerhtml){
ui.autoreplace.classList.add('on')
}
ui.autoreplace.listen(game.switchAutoreplace);
// ui.versusreplace=ui.create.system('换人',null,true);
// lib.setPopped(ui.versusreplace,game.versusHoverReplace);
if(game.players.length>2){
ui.versushs=ui.create.system('手牌',null,true);
lib.setPopped(ui.versushs,game.versusHoverHandcards,220);
}
}
_status.enemyCount=ui.create.system('杀敌: '+get.cnNumber(0,true),null,true);
_status.friendCount=ui.create.system('阵亡: '+get.cnNumber(0,true),null,true);
// _status.friendCount=ui.create.system('友方',null,true);
// _status.enemyCount=ui.create.system('敌方',null,true);
lib.setPopped(_status.friendCount,game.versusHoverFriend);
lib.setPopped(_status.enemyCount,game.versusHoverEnemy);
if(lib.storage.zhu){
_status.currentSide=true;
game.versusPhaseLoop(firstAct);
} }
else{ else{
game.versusPhaseLoop(firstAct); game.chooseCharacter();
}
"step 3"
var players=get.players(lib.sort.position);
var info=[];
for(var i=0;i<players.length;i++){
info.push({
name:players[i].name,
name2:players[i].name2,
identity:players[i].node.identity.firstChild.innerHTML,
color:players[i].node.identity.dataset.color
});
}
_status.videoInited=true;
if(_status.mode=='four'||_status.mode=='jiange'){
info.push(false);
}
else{
info.push(lib.storage.single_control&&lib.storage.control_all&&game.players.length>=4);
}
game.addVideo('init',null,info);
event.trigger('gameStart');
if(_status.mode=='four'){
game.gameDraw(_status.firstAct,function(player){
if(player==_status.firstAct.previousSeat){
return 5;
}
return 4;
});
if(game.me==_status.firstAct.previous||game.me==_status.firstAct.previous.previous){
game.me.chooseBool('是否置换手牌?');
event.replaceCard=true;
}
}
else if(_status.mode=='jiange'){
var firstAct;
for(var i=0;i<game.players.length;i++){
if(game.players[i].type=='mech'&&game.players[i].group=='wei'){
firstAct=game.players[i];break;
}
}
_status.actlist=[
firstAct,
firstAct.next,
firstAct.previous,
firstAct.next.next,
firstAct.previous.previous,
firstAct.next.next.next,
firstAct.previous.previous.previous,
firstAct.next.next.next.next
];
game.gameDraw(firstAct);
game.phaseLoopJiange();
}
else{
var firstAct;
if(lib.storage.zhu){
firstAct=(_status.currentSide==game.me.side)?game.friendZhu:game.enemyZhu;
}
else{
if(!lib.storage.cross_seat&&!lib.storage.random_seat&&lib.storage.number>1){
for(var i=0;i<game.players.length-1;i++){
if(game.players[i].side!=game.players[i+1].side){
var actcount;
if(Math.random()<0.5){
actcount=i;
}
else{
if(i>=lib.storage.number){
actcount=i-lib.storage.number;
}
else{
actcount=i+lib.storage.number;
}
}
if(actcount>0){
actcount--;
}
else{
actcount=game.players.length-1;
}
firstAct=game.players[actcount];
break;
}
}
}
else{
firstAct=game.players[Math.floor(Math.random()*game.players.length)];
}
}
game.gameDraw(firstAct,4);
_status.first_less=true;
_status.round=0;
if(lib.storage.single_control){
lib.skill.global.push('versus_swap');
ui.autoreplace=ui.create.div('.caption.normal');
ui.autoreplace.innerHTML='<div class="underline">自动换人</div>';
ui.autoreplace.style.textAlign='center';
if(lib.storage.autoreplaceinnerhtml){
ui.autoreplace.classList.add('on')
}
ui.autoreplace.listen(game.switchAutoreplace);
// ui.versusreplace=ui.create.system('换人',null,true);
// lib.setPopped(ui.versusreplace,game.versusHoverReplace);
if(game.players.length>2){
ui.versushs=ui.create.system('手牌',null,true);
lib.setPopped(ui.versushs,game.versusHoverHandcards,220);
}
}
_status.enemyCount=ui.create.system('杀敌: '+get.cnNumber(0,true),null,true);
_status.friendCount=ui.create.system('阵亡: '+get.cnNumber(0,true),null,true);
// _status.friendCount=ui.create.system('友方',null,true);
// _status.enemyCount=ui.create.system('敌方',null,true);
lib.setPopped(_status.friendCount,game.versusHoverFriend);
lib.setPopped(_status.enemyCount,game.versusHoverEnemy);
if(lib.storage.zhu){
_status.currentSide=true;
game.versusPhaseLoop(firstAct);
}
else{
game.versusPhaseLoop(firstAct);
}
}
if(_status.mode!='four'){
event.finish();
}
"step 4"
if(event.replaceCard&&result.bool){
var hs=game.me.get('h');
for(var i=0;i<hs.length;i++){
ui.discardPile.appendChild(hs[i]);
}
game.me.directgain(get.cards(hs.length));
}
game.phaseLoop(_status.firstAct);
}
},
chooseCharacterJiange:function(){
var next=game.createEvent('chooseCharacter',false);
next.showConfig=true;
next.content=function(){
'step 0'
var list={
weilist:[],shulist:[],
weimech:[],shumech:[],
weiboss:[],shuboss:[],
}
event.list=list;
for(var i in lib.character){
if(lib.character[i][4]){
if(lib.character[i][4].contains('jiangeboss')){
list[lib.character[i][1]+'boss'].push(i);continue;
}
else if(lib.character[i][4].contains('jiangemech')){
list[lib.character[i][1]+'mech'].push(i);continue;
}
}
if(lib.character[i][4]&&lib.character[i][4].contains('forbidai')) continue;
if(lib.config.forbidai.contains(i)) continue;
if(lib.config.forbidall.contains(i)) continue;
if(lib.config.banned.contains(i)) continue;
if(!get.config('double_character')&&get.config('ban_weak')&&
(lib.config.forbidsingle.contains(i)||lib.rank.c.contains(i)||lib.rank.d.contains(i))) continue;
if(get.config('ban_strong')&&(lib.rank.s.contains(i)||lib.rank.ap.contains(i))) continue;
if(get.config('double_character')&&lib.config.forbiddouble.contains(i)) continue;
if(lib.character[i][1]=='wei'){
list.weilist.push(i);
}
else if(lib.character[i][1]=='shu'){
list.shulist.push(i);
}
}
if(!list.weiboss.length){
alert('剑阁模式不可隐藏boss武将包请在选项其它中选择“重置隐藏扩展包”');
event.finish();
_status.over=true;
return;
}
var dialog;
switch(game.me.type){
case 'human':
for(var i=0;i<game.players.length;i++){
if(game.players[i].type!='human'){
game.players[i].init(list[game.players[i].identity+game.players[i].type].randomRemove());
}
}
dialog=ui.create.dialog('选择角色',[list[game.me.identity+'list'].randomGets(8),'character']);
ui.create.cheat=function(){
_status.createControl=ui.cheat2;
ui.cheat=ui.create.control('更换',function(){
if(ui.cheat2&&ui.cheat2.dialog==_status.event.dialog){
return;
}
if(game.changeCoin){
game.changeCoin(-3);
}
_status.event.dialog.close();
_status.event.dialog=ui.create.dialog('选择角色',[list[game.me.identity+'list'].randomGets(8),'character']);
game.uncheck();
game.check();
});
delete _status.createControl;
}
event.dialogxx=ui.create.characterDialog(function(name){
if(lib.character[name][4]){
if(lib.character[name][4].contains('jiangeboss')) return true;
if(lib.character[name][4].contains('jiangemech')) return true;
}
if(lib.character[name][1]!=game.me.identity) return true;
});
ui.create.cheat2=function(){
ui.cheat2=ui.create.control('自由选将',function(){
if(this.dialog==_status.event.dialog){
if(game.changeCoin){
game.changeCoin(50);
}
this.dialog.close();
_status.event.dialog=this.backup;
this.backup.open();
delete this.backup;
game.uncheck();
game.check();
if(ui.cheat){
ui.cheat.style.opacity=1;
}
}
else{
if(game.changeCoin){
game.changeCoin(-10);
}
this.backup=_status.event.dialog;
_status.event.dialog.close();
_status.event.dialog=_status.event.parent.dialogxx;
this.dialog=_status.event.dialog;
this.dialog.open();
game.uncheck();
game.check();
if(ui.cheat){
ui.cheat.style.opacity=0.6;
}
}
});
}
if(!ui.cheat&&get.config('change_choice')) ui.create.cheat();
if(!ui.cheat2&&get.config('free_choose')) ui.create.cheat2();
break;
case 'mech':
dialog=ui.create.dialog('选择角色',[list[game.me.identity+'mech'],'character']);
break;
case 'boss':
for(var i=0;i<game.players.length;i++){
if(game.players[i].type=='mech'){
game.players[i].init(list[game.players[i].identity+game.players[i].type].randomRemove());
}
}
dialog=ui.create.dialog('选择角色',[list[game.me.identity+'boss'],'character']);
break;
}
game.me.chooseButton(dialog,true);
'step 1'
if(ui.cheat){
ui.cheat.close();
delete ui.cheat;
}
if(ui.cheat2){
ui.cheat2.close();
delete ui.cheat2;
}
game.me.init(result.links[0]);
for(var i=0;i<game.players.length;i++){
if(game.players[i].name) continue;
if(game.players[i].type!='human'){
game.players[i].init(event.list[game.players[i].identity+game.players[i].type].randomRemove());
}
else{
game.players[i].init(event.list[game.players[i].identity+'list'].randomRemove());
}
}
};
},
chooseCharacterFour:function(){
var next=game.createEvent('chooseCharacter',false);
next.ai=function(player,list,list2){
if(player.identity=='zhu'){
list2.randomSort();
var choice;
if(Math.random()-0.8<0&&list2.length){
choice=list2[0];
}
else{
choice=list[0];
}
player.init(choice);
player.hp++;
player.maxHp++;
player.update();
}
else if(Math.random()<0.5){
var choice=0;
for(var i=0;i<list.length;i++){
if(lib.character[list[i]][1]==game[player.side+'Zhu'].group){
choice=i;break;
}
}
player.init(list[choice]);
}
else{
player.init(list[0]);
}
this.list.remove(player.name);
this.list2.remove(player.name);
}
next.content=function(){
"step 0"
var i;
var list;
var list2=[];
event.list=[];
event.filterChoice=function(name){
if(get.config('enable_all')) return false;
if(['yuanshu','re_yuanshu','zhangxingcai','hetaiyou','wenpin','yuji','sunluyu',
'sp_zhaoyun','sp_diaochan','sp_pangtong','sp_caoren'].contains(name)){
return true;
}
if(lib.characterPack.refresh[name]) return false;
if(lib.characterPack.standard[name]){
if(lib.characterPack.refresh['re_'+name]) return true;
return false;
}
if(lib.characterPack.shenhua[name]) return false;
if(lib.characterPack.sp[name]) return false;
if(lib.characterPack.yijiang[name]) return false;
return true;
}
for(i in lib.character){
if(event.filterChoice(i)) continue;
if(lib.character[i][4]&&lib.character[i][4].contains('forbidai')) continue;
if(lib.config.forbidai.contains(i)) continue;
if(lib.config.forbidall.contains(i)) continue;
if(lib.config.banned.contains(i)) continue;
if(!get.config('double_character')&&get.config('ban_weak')&&
(lib.config.forbidsingle.contains(i)||lib.rank.c.contains(i)||lib.rank.d.contains(i))) continue;
if(get.config('ban_strong')&&(lib.rank.s.contains(i)||lib.rank.ap.contains(i))) continue;
if(get.config('double_character')&&lib.config.forbiddouble.contains(i)) continue;
event.list.push(i);
if(lib.character[i][4]&&lib.character[i][4].contains('zhu')){
list2.push(i);
}
}
event.list.randomSort();
event.list2=list2;
event.current=game.players.randomGet();
_status.firstAct=event.current;
event.four_assign=get.config('four_assign');
event.flipassign=true;
"step 1"
if(event.current==game.me||(event.four_assign&&event.current.side==game.me.side)){
var dialog=event.xdialog||ui.create.characterDialog(event.filterChoice);
var names=[];
for(var i=0;i<game.players.length;i++){
if(game.players[i].name){
names.push(game.players[i].name);
}
}
for(var i=0;i<dialog.buttons.length;i++){
if(names.contains(dialog.buttons[i].link)){
dialog.buttons[i].classList.add('unselectable');
dialog.buttons[i].classList.add('noclick');
}
}
if(!event.groupControl){
event.groupControl=ui.create.groupControl(dialog);
}
game.me.chooseButton(dialog,true).closeDialog=false;
event.xdialog=dialog;
dialog.static=true;
event.current.classList.add('selectedx');
}
else{
event.ai(event.current,event.list.randomGets(3),event.list2);
if(!event.four_assign){
event.current=event.current.next;
event.redo();
}
}
"step 2"
event.current.classList.remove('selectedx');
if(event.current.side==game.me.side){
event.current.init(result.buttons[0].link);
event.list.remove(event.current.name);
event.list2.remove(event.current.name);
if(event.current.identity=='zhu'){
event.current.hp++;
event.current.maxHp++;
event.current.update();
}
}
if(event.four_assign){
for(var i=0;i<game.players.length;i++){
if(!game.players[i].name) break;
}
if(i<game.players.length){
var side=event.current.side;
event.current=_status.firstAct;
if(event.flipassign){
for(var iwhile=0;iwhile<8;iwhile++){
event.current=event.current.next;
if(event.current.side!=side&&!event.current.name){
break;
}
}
}
else{
for(var iwhile=0;iwhile<8;iwhile++){
event.current=event.current.previous;
if(event.current.side==side&&!event.current.name){
break;
}
}
}
event.flipassign=!event.flipassign;
event.goto(1);
}
}
else{
for(var i=0;i<game.players.length;i++){
if(!game.players[i].name){
event.ai(game.players[i],event.list.splice(0,3),event.list2);
}
}
}
"step 3"
if(event.groupControl){
event.groupControl.close();
}
if(event.xdialog){
event.xdialog.close();
} }
} }
}, },
@ -664,20 +1089,6 @@ mode.versus={
// ui.fakemebg.show(); // ui.fakemebg.show();
game.onSwapControl(); game.onSwapControl();
} }
var players=get.players(lib.sort.position);
var info=[];
for(var i=0;i<players.length;i++){
info.push({
name:players[i].name,
name2:players[i].name2,
identity:players[i].node.identity.firstChild.innerHTML,
color:players[i].node.identity.dataset.color
});
}
_status.videoInited=true,
info.bool=(lib.storage.single_control&&lib.storage.control_all&&game.players.length>=4);
game.addVideo('init',null,info);
} }
}, },
versusPhaseLoop:function(player){ versusPhaseLoop:function(player){
@ -729,6 +1140,21 @@ mode.versus={
event.goto(0); event.goto(0);
} }
}, },
phaseLoopJiange:function(){
var next=game.createEvent('phaseLoop');
next.num=0;
next.content=function(){
if(event.num>=8){
event.num-=8;
}
var player=_status.actlist[event.num];
if(player.isAlive()){
player.phase();
}
event.num++;
event.redo();
}
},
replacePlayer:function(player){ replacePlayer:function(player){
var next=game.createEvent('replacePlayer'); var next=game.createEvent('replacePlayer');
next.source=player; next.source=player;
@ -1110,6 +1536,8 @@ mode.versus={
}, },
}, },
translate:{ translate:{
zhu:'主',
zhong:'忠',
trueZhu:"帅", trueZhu:"帅",
falseZhu:"将", falseZhu:"将",
trueZhong:"兵", trueZhong:"兵",
@ -1183,6 +1611,40 @@ mode.versus={
} }
}, },
dieAfter:function(source){ dieAfter:function(source){
if(_status.mode=='four'){
if(this.identity=='zhu'){
game.over(this.side!=game.me.side);
}
else if(source){
if(source.side==this.side){
if(source.identity=='zhu'){
source.discard(source.get('he'));
}
}
else{
var num1=0,num2=1;
for(var i=0;i<game.players.length;i++){
if(game.players[i].side==source.side){
num1++;
}
else{
num2++;
}
}
source.draw(2+Math.max(0,num2-num1));
}
}
return;
}
else if(_status.mode=='jiange'){
if(get.population('wei')==0){
game.over(game.me.identity=='shu');
}
else if(get.population('shu')==0){
game.over(game.me.identity=='wei');
}
return;
}
this.dieSpeak(); this.dieSpeak();
if(this.side==game.me.side){ if(this.side==game.me.side){
_status.friendDied.push(this.name); _status.friendDied.push(this.name);
@ -1237,10 +1699,10 @@ mode.versus={
get:{ get:{
attitude:function(from,to){ attitude:function(from,to){
if(from.side==to.side){ if(from.side==to.side){
if(to.identity=='zhu'&&lib.storage.main_zhu) return 10; if(to.identity=='zhu'&&(lib.storage.main_zhu||_status.mode=='four')) return 10;
return 6; return 6;
} }
if(to.identity=='zhu'&&lib.storage.main_zhu) return -10; if(to.identity=='zhu'&&(lib.storage.main_zhu||_status.mode=='four')) return -10;
return -6; return -6;
}, },
} }