Support more players and identities.

This commit is contained in:
Tipx-L 2023-10-19 02:45:39 -07:00
parent 8e361409a4
commit 9d8bf314b4
3 changed files with 567 additions and 465 deletions

View File

@ -432,8 +432,11 @@
},
}
},
//Yingbian
//应变
/**
* Yingbian
*
* 应变
*/
yingbian:{
condition:{
color:new Map([
@ -605,8 +608,32 @@
['all','无视条件执行所有选项']
])
},
//The actual card name
//实际的卡牌名称
/**
* Stratagem buff
*
* 谋攻强化
*/
stratagemBuff:{
buff:new Map([
['sha',[1,'require']],
['shan',[1,'double']],
['juedou',[2,'damage']],
['huogong',[2,'damage']],
['tao',[3,'double']]
]),
prompt:new Map([
['sha','响应时所需【闪】数+1。'],
['shan','视为两张【闪】的效果。'],
['juedou','对目标造成的伤害+1。'],
['huogong','造成的伤害+1。'],
['tao','回复值+1。']
])
},
/**
* The actual card name
*
* 实际的卡牌名称
*/
actualCardName:new Map([
['挟令','挟天子以令诸侯'],
['霹雳投石车','霹雳车']
@ -4875,11 +4902,11 @@
name:'身份',
connect:{
update:function(config,map){
if(config.connect_identity_mode=='mougong'){
map.connect_round1_use_nuqi.show();
if(config.connect_identity_mode=='stratagem'){
map.connect_round_one_use_fury.show();
}
else{
map.connect_round1_use_nuqi.hide();
map.connect_round_one_use_fury.hide();
}
if(config.connect_identity_mode=='zhong'){
map.connect_player_number.hide();
@ -4890,7 +4917,7 @@
map.connect_special_identity.hide();
map.connect_double_character.show();
}
else if(config.connect_identity_mode=='mougong'){
else if(config.connect_identity_mode=='stratagem'){
map.connect_double_character.show();
map.connect_player_number.show();
map.connect_limit_zhu.hide();
@ -4935,7 +4962,7 @@
item:{
normal:'标准',
zhong:'明忠',
mougong:'谋攻',
stratagem:'谋攻',
purple:'3v3v2',
},
restart:true,
@ -4945,14 +4972,8 @@
connect_player_number:{
name:'游戏人数',
init:'8',
item:{
'2':'两人',
'3':'三人',
'4':'四人',
'5':'五人',
'6':'六人',
'7':'七人',
'8':'八人'
get item(){
return lib.mode.identity.config.player_number.item;
},
frequent:true,
restart:true,
@ -4980,7 +5001,9 @@
init:false,
restart:true,
// frequent:true,
intro:'开启后游戏中将有两个内奸内奸胜利条件仍为主内1v1时击杀主公'
get intro(){
return lib.mode.identity.config.double_nei.intro;
}
},
connect_double_character:{
name:'双将模式',
@ -5001,7 +5024,7 @@
frequent:true,
intro:'开启后游戏中将增加军师、大将、贼首三个身份'
},
connect_round1_use_nuqi:{
connect_round_one_use_fury:{
name:'开启首轮强化卡牌',
init:false,
frequent:false,
@ -5027,12 +5050,12 @@
},
config:{
update:function(config,map){
if(config.identity_mode=='mougong'){
map.round1_use_nuqi.show();
if(config.identity_mode=='stratagem'){
map.round_one_use_fury.show();
map.nei_auto_mark_camouflage.show();
}
else{
map.round1_use_nuqi.hide();
map.round_one_use_fury.hide();
map.nei_auto_mark_camouflage.hide();
}
if(config.identity_mode=='zhong'){
@ -5064,7 +5087,7 @@
}
map.continue_game.show();
}
else if(config.identity_mode=='mougong'){
else if(config.identity_mode=='stratagem'){
map.continue_game.show();
map.player_number.show();
map.enhance_zhu.hide();
@ -5188,7 +5211,7 @@
item:{
normal:'标准',
zhong:'明忠',
mougong:'谋攻',
stratagem:'谋攻',
purple:'3v3v2',
},
restart:true,
@ -5198,14 +5221,12 @@
player_number:{
name:'游戏人数',
init:'8',
item:{
'2':'两人',
'3':'三人',
'4':'四人',
'5':'五人',
'6':'六人',
'7':'七人',
'8':'八人'
get item(){
const minimumNumberOfPlayers=2,maximumNumberOfPlayers=Math.max(_status.maximumNumberOfPlayers||10,minimumNumberOfPlayers),item={};
for(let playerNumber=minimumNumberOfPlayers;playerNumber<=maximumNumberOfPlayers;playerNumber++){
item[playerNumber]=`${get.cnNumber(playerNumber)}`;
}
return item;
},
frequent:true,
restart:true,
@ -5215,7 +5236,7 @@
init:false,
restart:true,
frequent:true,
intro:'开启后游戏中将有两个内奸内奸胜利条件仍为主内1v1时击杀主公'
intro:'若游戏人数不大于8开启后游戏中将有两个内奸内奸胜利条件仍为主内1v1时击杀主公'
},
choose_group:{
name:'神武将选择势力',
@ -5361,7 +5382,7 @@
unlimited:'无限',
},
},
round1_use_nuqi:{
round_one_use_fury:{
name:'开启首轮强化卡牌',
init:false,
frequent:false,
@ -5562,13 +5583,8 @@
connect_player_number:{
name:'游戏人数',
init:'8',
item:{
'3':'三人',
'4':'四人',
'5':'五人',
'6':'六人',
'7':'七人',
'8':'八人'
get item(){
return lib.mode.guozhan.config.player_number.item;
},
frequent:true,
restart:true,
@ -5653,13 +5669,12 @@
player_number:{
name:'游戏人数',
init:'8',
item:{
'3':'三人',
'4':'四人',
'5':'五人',
'6':'六人',
'7':'七人',
'8':'八人'
get item(){
const minimumNumberOfPlayers=3,maximumNumberOfPlayers=Math.max(_status.maximumNumberOfPlayers||10,minimumNumberOfPlayers),item={};
for(let playerNumber=minimumNumberOfPlayers;playerNumber<=maximumNumberOfPlayers;playerNumber++){
item[playerNumber]=`${get.cnNumber(playerNumber)}`;
}
return item;
},
frequent:true,
restart:true,
@ -11097,11 +11112,15 @@
}
},
layout:function(layout,nosave){
const previousTransitionDuration=document.body.style.transitionDuration;
document.body.style.transitionDuration='1s';
const previousFilter=document.body.style.filter,previousWebkitFilter=document.body.style.webkitFilter;
document.body.style.filter=document.body.style.webkitFilter='brightness(0)';
if(layout=='default') layout='mobile';
if(!nosave) game.saveConfig('layout',layout);
game.layout=layout;
ui.arena.hide();
setTimeout(function(){
new Promise(resolve=>setTimeout(resolve,500)).then(()=>{
if(game.layout=='default'){
ui.css.layout.href='';
}
@ -11196,17 +11215,26 @@
}
ui.updatej();
ui.updatem();
setTimeout(function(){
ui.arena.show();
if(game.me) game.me.update();
setTimeout(function(){
ui.updatex();
},500);
setTimeout(function(){
ui.updatec();
},1000);
},100);
},500);
return new Promise(resolve=>setTimeout(resolve,100));
}).then(()=>{
ui.arena.show();
if(game.me) game.me.update();
return new Promise(resolve=>setTimeout(resolve,500));
}).then(()=>{
ui.updatex();
ui.create.playerPositions();
return new Promise(resolve=>setTimeout(resolve,500));
}).then(()=>{
ui.updatec();
if(previousFilter) document.body.style.filter=previousFilter;
else document.body.style.removeProperty('filter');
if(previousWebkitFilter) document.body.style.webkitFilter=previousWebkitFilter;
else document.body.style.removeProperty('-webkit-filter');
return new Promise(resolve=>setTimeout(resolve,1000));
}).then(()=>{
if(previousTransitionDuration) document.body.style.transitionDuration=previousTransitionDuration;
else document.body.style.removeProperty('transition-duration');
});
},
background:function(){
if(lib.config.image_background_random){
@ -12302,6 +12330,7 @@
cooperation_use_info:'双方累计使用至少4种花色的牌',
charge:'蓄力值',
expandedSlots:'扩展装备栏',
_stratagem_add_buff:'强化'
},
element:{
content:{
@ -27991,7 +28020,7 @@
var player=this,mode=get.mode();
if(!this.isZhu) return false;
if(mode=='identity'){
if(_status.mode=='mougong'&&!this.identityShown) return false;
if(_status.mode=='stratagem'&&!this.identityShown) return false;
return true;
}
if(mode=='versus'&&(_status.mode=='four'||_status.mode=='guandu')) return true;
@ -30396,7 +30425,6 @@
* @param {string} [nature]
*/
constructor(suitOrCard,numberOrCards,name,nature){
if(typeof suitOrCard=='undefined'&&typeof numberOrCards=='undefined'&&typeof name=='undefined'&&typeof nature=='undefined') return;
if(Array.isArray(suitOrCard)){
/**
* @type {string}
@ -32436,6 +32464,217 @@
}
},
skill:{
_stratagem_add_buff:{
enable:'chooseToUse',
filter:function(event,player){
if(!event.stratagemSettings) return false;
if(game.roundNumber<2&&!event.stratagemSettings.roundOneUseFury) return false;
var cards=player.getCards('hs');
var names=Array.from(lib.stratagemBuff.buff.keys());
if(!names.length) return false;
for(var card of cards){
if(!game.checkMod(card,player,'unchanged','cardEnabled2',player)) continue;
for(var name of names){
var myName=get.name(card,player),nature=get.nature(card,player);
if(name==myName){
if(event.filterCard({name:name,nature:nature,isCard:true,cards:[card]},player,event)){
if(player.storage.stratagem_fury>=lib.stratagemBuff.buff.get(name)[0])
return true;
}
}
}
}
return false;
},
onChooseToUse:function(event){
if(!event.stratagemSettings&&!game.online){
event.set('stratagemSettings',{
roundOneUseFury:_status.connectMode?lib.configOL.round_one_use_fury:get.config('round_one_use_fury')
});
}
},
check:function(card){
var player=_status.event.player;
if(_status.event.type=='phase'){
var name=get.name(card,player);
if(name=='sha'){
if(game.hasPlayer(current=>{
return player.canUse(card,current)&&(player.storage.zhibi&&!player.storage.zhibi.contains(current)||(get.effect(current,card,player,player)>=2-Math.max(0,(player.storage.stratagem_fury||0)-1)))&&current.mayHaveShan()&&player.hasSkill('jiu');
})) return 1;
return 0;
} else if(name=='tao'){
if(player.hp<=2&&player.getDamagedHp()>=2) return 1;
return 0;
}
return 1;
}
else if(_status.event.type=='dying') return get.attitude(player,_status.event.dying)>3?1:0;
return (_status.event.getParent().shanRequired||1)>1&&get.damageEffect(player,_status.event.getParent().player||player,player)<0?1:0;
},
position:'hs',
filterCard:function(card,player,event){
event=event||_status.event;
var filter=event._backup.filterCard;
var names=Array.from(lib.stratagemBuff.buff.keys());
for(var name of names){
var myName=get.name(card,player),nature=get.nature(card,player);
if(name==myName){
if(filter({name:name,nature:nature,isCard:true,cards:[card]},player,_status.event)){
if(player.storage.stratagem_fury>=lib.stratagemBuff.buff.get(name)[0]){
return true;
}
}
}
}
return false;
},
viewAs:function(cards,player){
var name=get.name(cards[0],player);
var nature=get.nature(cards[0],player);
if(name){
return {
name:name,
nature:nature,
suit:get.suit(cards[0],player),
number:get.number(cards[0],player),
isCard:true,
cards:[cards[0]],
storage:{stratagemBuffed:1},
};
}
return null;
},
prompt:()=>{
const span=document.createElement('span');
span.classList.add('text');
span.style.fontFamily='yuanli';
const stratagemBuff=lib.stratagemBuff,buff=stratagemBuff.buff;
stratagemBuff.prompt.forEach((prompt,cardName)=>{
const li=document.createElement('li');
li.innerHTML=`${get.translation(cardName)}】:${buff.get(cardName)[0]}点怒气。${prompt}`;
span.appendChild(li);
});
return `当你需要使用位于“强化表”内的非虚拟卡牌时,你可以消耗对应数量的怒气将其强化并使用。${document.createElement('hr').outerHTML}${span.outerHTML}`;
},
precontent:function(){
'step 0'
player.changeFury(-lib.stratagemBuff.buff.get(event.result.card.name)[0]);
},
ai:{
order:function(item,player){
var player=player||_status.event.player;
if(_status.event.type=='phase'){
var cards=player.getCards('hs');
for(var card of cards){
if(!game.checkMod(card,player,'unchanged','cardEnabled2',player)) continue;
var name=get.name(card,player);
if(name=='sha'){
if(game.hasPlayer(current=>{
return player.canUse(card,current)&&(player.storage.zhibi&&!player.storage.zhibi.contains(current)||(get.effect(current,card,player,player)>=2-Math.max(0,(player.storage.stratagem_fury||0)-1)))&&current.mayHaveShan();
})) return get.order(card,player)+0.5;
} else if(name=='tao'){
if(player.hp<=2&&player.getDamagedHp()>=2) return get.order(card,player)+0.5;
}
return 8;
}
}
return 3.5;
},
},
subSkill:{
sha:{
trigger:{player:'useCardToPlayered'},
forced:true,
silent:true,
popup:false,
charlotte:true,
filter:function(event,player){
return event.card.name=='sha'&&event.card.storage&&event.card.storage.stratagemBuffed&&lib.stratagemBuff.buff.get('sha')[1]=='require'&&!event.getParent().directHit.contains(event.target);
},
content:function(){
if(!trigger.card.storage.stratagem_logged){
game.log(player,'触发了强化杀的效果');
game.log('#y'+get.translation(trigger.card),'需要额外使用一张','#y【闪】','响应');
trigger.card.storage.stratagem_logged=true;
}
var id=trigger.target.playerid;
var map=trigger.getParent().customArgs;
if(!map[id]) map[id]={};
if(typeof map[id].shanRequired=='number'){
map[id].shanRequired++;
}
else{
map[id].shanRequired=2;
}
},
ai:{
directHit_ai:true,
skillTagFilter:function(player,tag,arg){
if(arg.card.name!='sha'||(arg.card&&arg.card.storage&&!arg.card.storage.stratagemBuffed)||(arg.target.countCards('h','shan')>=1&&!arg.target.storage.stratagem_fury)) return false;
},
},
},
shan:{
trigger:{
player:'shanEnd',
},
forced:true,
silent:true,
popup:false,
charlotte:true,
filter:function(event,player){
return event.getParent(3).name=='sha'&&event.getParent().card.storage&&event.getParent().card.storage.stratagemBuffed&&lib.stratagemBuff.buff.get('shan')[1]=='double';
},
content:function(event,player){
if(!trigger.card.storage.stratagem_logged){
game.log(player,'触发了强化闪的效果');
game.log('#y'+get.translation(trigger.card),'视为两张','#y【闪】','的效果');
trigger.card.storage.stratagem_logged=true;
}
if(trigger.getParent(3).shanRequired) trigger.getParent(3).shanRequired--;
}
},
damage:{
trigger:{player:'damageBegin1'},
forced:true,
silent:true,
popup:false,
charlotte:true,
filter:function(event,player){
if(!event.card) return false;
var names=Array.from(lib.stratagemBuff.buff.keys()),name=event.card.name;
return names.contains(name)&&event.getParent(2).player==event.source&&event.card.storage&&event.card.storage.stratagemBuffed&&lib.stratagemBuff.buff.get(name)[1]=='damage';
},
content:function(){
if(!trigger.card.storage.stratagem_logged){
game.log(player,'触发了强化'+get.translation(trigger.card.name)+'的效果');
game.log('#y'+get.translation(trigger.card),'造成的伤害','#y+1');
trigger.card.storage.stratagem_logged=true;
}
trigger.num++;
}
},
tao:{
trigger:{player:'useCard'},
filter:function(event,player){
return event.card.name=='tao'&&event.card.storage&&event.card.storage.stratagemBuffed&&lib.stratagemBuff.buff.get('tao')[1]=='double';
},
forced:true,
silent:true,
popup:false,
charlotte:true,
content:function(){
if(!trigger.card.storage.stratagem_logged){
game.log(player,'触发了强化桃的效果');
game.log('#y'+get.translation(trigger.card),'的回复值','#y+1');
trigger.card.storage.stratagem_logged=true;
}
if(!trigger.baseDamage) trigger.baseDamage=1;
trigger.baseDamage++;
},
}
}
},
expandedSlots:{
markimage:'image/card/expandedSlots.png',
intro:{
@ -37095,7 +37334,7 @@
ui.updatehl();
for(var i=0;i<players.length;i++){
if(lib.config.mode=='identity'){
if(_status.mode=='mougong'){
if(_status.mode=='stratagem'){
game.players[i].init(players[i].name,players[i].name2);
game.players[i].identity=players[i].identity;
if(game.players[i].identity=='fan'&&game.players[i].isCamouflaged&&game.me.identity=='nei'||game.players[i]==game.me){
@ -39666,7 +39905,7 @@
for(i=0;i<game.players.length;i++){
tr=document.createElement('tr');
td=document.createElement('td');
td.innerHTML=get.translation(game.players[i])+(game.players[i].ai.mougong_camouflage?'(被伪装)':'');
td.innerHTML=get.translation(game.players[i])+(game.players[i].ai.stratagem_camouflage?'(被伪装)':'');
tr.appendChild(td);
td=document.createElement('td');
num=0;
@ -39736,7 +39975,7 @@
for(i=0;i<game.dead.length;i++){
tr=document.createElement('tr');
td=document.createElement('td');
td.innerHTML=get.translation(game.dead[i])+(game.dead[i].ai.mougong_camouflage?'(被伪装)':'');
td.innerHTML=get.translation(game.dead[i])+(game.dead[i].ai.stratagem_camouflage?'(被伪装)':'');
tr.appendChild(td);
td=document.createElement('td');
num=0;
@ -42807,6 +43046,10 @@
thrown:[],
touchlines:[],
todiscard:{},
/**
* @type {HTMLStyleElement[]}
*/
playerPositions:[],
refresh:function(node){
void window.getComputedStyle(node, null).getPropertyValue("opacity");
},
@ -51612,6 +51855,7 @@
}
ui.arena.setNumber=function(num){
this.dataset.number=num;
ui.create.playerPositions();
// if(game.layout=='nova'&&parseInt(num)<7){
// ui.arena.classList.add('player_autolong');
// }
@ -52580,16 +52824,55 @@
}
},
player:(position,noclick)=>new lib.element.Player(position,noclick),
connectPlayers:function(ip){
/**
* @author curpond
* @author Tipx-L
* @param {number} [numberOfPlayers]
*/
connectPlayerPositions:numberOfPlayers=>{
if(typeof numberOfPlayers!='number') numberOfPlayers=lib.configOL.number;
if(!numberOfPlayers) return;
const playerPositions=ui.playerPositions;
while(playerPositions.length){
playerPositions.pop().remove();
}
const temporaryPlayer=ui.create.div('.player.connect',ui.window).hide();
const computedStyle=getComputedStyle(temporaryPlayer);
const halfWidth=parseFloat(computedStyle.width)/2;
const halfHeight=parseFloat(computedStyle.height)/2;
temporaryPlayer.remove();
const halfNumberOfPlayers=Math.round(numberOfPlayers/2);
const upperPercentage=100/(halfNumberOfPlayers+1);
const scale=10/numberOfPlayers;
for(let ordinal=0;ordinal<halfNumberOfPlayers;ordinal++){
playerPositions.push(lib.init.sheet([
`#window>.player.connect[data-position='${ordinal}']{`,
`left:calc(${upperPercentage*(ordinal+1)}% - ${halfWidth}px);`,
`top:calc(${100/3}% - ${halfHeight}px);`,
scale<1?`transform:scale(${scale});`:'',
'}'
].join('')));
}
const lowerPercentage=100/(numberOfPlayers-halfNumberOfPlayers+1);
for(let ordinal=halfNumberOfPlayers;ordinal<numberOfPlayers;ordinal++){
playerPositions.push(lib.init.sheet([
`#window>.player.connect[data-position='${ordinal}']{`,
`left:calc(${lowerPercentage*(ordinal-halfNumberOfPlayers+1)}% - ${halfWidth}px);`,
`top:calc(${100*2/3}% - ${halfHeight}px);`,
scale<1?`transform:scale(${scale});`:'',
'}'
].join('')));
}
},
connectPlayers:ip=>{
ui.create.connectPlayerPositions();
game.connectPlayers=[];
for(var i=0;i<8;i++){
var player=ui.create.player(ui.window);
player.dataset.position=i;
const numberOfPlayers=lib.configOL.number;
for(let position=0;position<numberOfPlayers;position++){
const player=ui.create.player(ui.window);
player.dataset.position=position;
player.classList.add('connect');
game.connectPlayers.push(player);
if(i>=lib.configOL.number){
player.classList.add('unselectable2');
}
}
var bar=ui.create.div(ui.window);
@ -52621,7 +52904,7 @@
for(var i of game.connectPlayers){
if(!i.nickname&&!i.classList.contains('unselectable2')) num++;
}
if(num>=lib.configOL.number-1){
if(num>=numberOfPlayers-1){
alert('至少要有两名玩家才能开始游戏!');
return;
}
@ -52637,52 +52920,76 @@
ui.connectStartButton=button;
ui.connectStartBar=bar;
},
players:function(num){
if(num===0){
/**
* @author curpond
* @author Tipx-L
* @param {number} [numberOfPlayers]
*/
playerPositions:numberOfPlayers=>{
if(typeof numberOfPlayers!='number') numberOfPlayers=ui.arena.dataset.number;
//当人数小于8时还是用以前的布局。
if(!numberOfPlayers||numberOfPlayers<9) return;
const playerPositions=ui.playerPositions;
while(playerPositions.length){
playerPositions.pop().remove();
}
//单个人物的宽度。这里要设置玩家的实际的宽度
const temporaryPlayer=ui.create.div('.player',ui.arena).hide();
const computedStyle=getComputedStyle(temporaryPlayer);
const scale=8/numberOfPlayers;
//玩家顶部距离父容器上边缘的距离偏移的单位距离
const oneThirdHeight=parseFloat(computedStyle.height)/3*scale;
const halfWidth=parseFloat(computedStyle.width)/2;
temporaryPlayer.remove();
//列数即假如8人场除去自己后上面7个人占7列
const columnCount=numberOfPlayers-1;
const percentage=100/numberOfPlayers;
//仅当游戏人数大于8人且玩家的座位号大于0时设置玩家的位置。因为0号位是game.me在最下方无需设置。
for(let ordinal=1;ordinal<numberOfPlayers;ordinal++){
const reversedOrdinal=columnCount-ordinal;
//动态计算玩家的top属性实现拱桥的效果。只让两边的各两个人向下偏移一些
const top=Math.max(0,Math.round(numberOfPlayers/5)-Math.min(Math.abs(ordinal-1),Math.abs(reversedOrdinal)))*oneThirdHeight;
playerPositions.push(lib.init.sheet([
`#arena[data-number='${numberOfPlayers}']>.player[data-position='${ordinal}']{`,
`left:calc(${percentage*(reversedOrdinal+1)}% - ${halfWidth}px);`,
`top:${top}px;`,
`transform:scale(${scale});`,
'}'
].join('')));
}
},
players:numberOfPlayers=>{
if(numberOfPlayers===0){
return;
}
if(num==undefined) num=lib.configOL.number;
if(num==undefined) num=get.playerNumber();
if(typeof num=='string'){
num=parseInt(num);
if(numberOfPlayers==undefined) numberOfPlayers=lib.configOL.number;
if(numberOfPlayers==undefined) numberOfPlayers=get.playerNumber();
if(typeof numberOfPlayers=='string'){
numberOfPlayers=parseInt(numberOfPlayers);
}
if(!num) num=5;
for(var i=0;i<num;i++){
var player=ui.create.player().animate('start');
if(!numberOfPlayers) numberOfPlayers=5;
for(let ordinal=0;ordinal<numberOfPlayers;ordinal++){
const player=ui.create.player().animate('start');
game.players.push(player);
player.dataset.position=i;
player.dataset.position=ordinal;
}
var players=game.players;
for(var i=0;i<players.length;i++){
if(i>0){
players[i].previous=players[i-1];
players[i].previousSeat=players[i-1];
const players=game.players;
for(let ordinal=0;ordinal<players.length;ordinal++){
if(ordinal>0){
players[ordinal].previous=players[ordinal-1];
players[ordinal].previousSeat=players[ordinal-1];
}
if(i<players.length-1){
players[i].next=players[i+1];
players[i].nextSeat=players[i+1];
if(ordinal<players.length-1){
players[ordinal].next=players[ordinal+1];
players[ordinal].nextSeat=players[ordinal+1];
}
}
players[0].previous=players[players.length-1];
players[0].previousSeat=players[players.length-1];
players[players.length-1].next=players[0];
players[players.length-1].nextSeat=players[0];
ui.arena.setNumber(num);
for(var i=0;i<num;i++){
ui.arena.appendChild(players[i]);
}
// ui.arena.classList.add('glass');
// for(var i=0;i<num;i++){
// var bg=ui.create.div('.glassbg');
// var bg2=ui.create.div(bg);
// ui.create.div(bg);
// var rect=players[i].getBoundingClientRect();
// bg2.style.backgroundImage='url("image/background/huangtian_bg.jpg")';
// bg2.style.width=ui.window.offsetWidth+'px';
// bg2.style.height=ui.window.offsetHeight+'px';
// bg2.style.transform='translate('+(-rect.left)+'px,'+(-rect.top)+'px)';
// players[i].insertBefore(bg,players[i].firstChild);
// }
ui.arena.setNumber(numberOfPlayers);
players.forEach(player=>ui.arena.appendChild(player));
return players;
},
me:function(hasme){
@ -53487,7 +53794,7 @@
if(!game.getIdentityList) return;
if(_status.video) return;
if(this.parentNode.forceShown) return;
if(!_status.connectMode&&this.parentNode.ai.mougong_camouflage&&get.config('nei_auto_mark_camouflage')&&game.me.identity=='nei') return;
if(!_status.connectMode&&this.parentNode.ai.stratagem_camouflage&&get.config('nei_auto_mark_camouflage')&&game.me.identity=='nei') return;
if(_status.clickingidentity){
for(var i=0;i<_status.clickingidentity[1].length;i++){
_status.clickingidentity[1][i].delete();
@ -58405,7 +58712,7 @@
switch(config.identity_mode){
case 'purple':return '三对三对二';
case 'zhong':return (config.double_character?'双将':'')+'忠胆英杰';
case 'mougong':return get.cnNumber(parseInt(config.number))+'人'+(config.double_character?'双将':'')+'谋攻';
case 'stratagem':return get.cnNumber(parseInt(config.number))+'人'+(config.double_character?'双将':'')+'谋攻';
default:return get.cnNumber(parseInt(config.number))+'人'+(config.double_character?'双将':'')+'身份';
}
}

View File

@ -452,15 +452,6 @@
/*--------位置(1人)------*/
.player[data-position='0']{top:calc(100% - 170px);left:calc(50% - 75px);}
/*--------位置(联机)------*/
#window>.player.connect[data-position='0']{left:calc(200% / 7 - 1200px / 7);top:calc(300% / 7 - 160px + 5px);}
#window>.player.connect[data-position='1']{left:calc(300% / 7 - 750px / 7);top:calc(300% / 7 - 160px + 5px);}
#window>.player.connect[data-position='2']{left:calc(400% / 7 - 300px / 7);top:calc(300% / 7 - 160px + 5px);}
#window>.player.connect[data-position='3']{left:calc(500% / 7 + 150px / 7);top:calc(300% / 7 - 160px + 5px);}
#window>.player.connect[data-position='4']{left:calc(200% / 7 - 1200px / 7);top:calc(400% / 7 - 40px + 5px);}
#window>.player.connect[data-position='5']{left:calc(300% / 7 - 750px / 7);top:calc(400% / 7 - 40px + 5px);}
#window>.player.connect[data-position='6']{left:calc(400% / 7 - 300px / 7);top:calc(400% / 7 - 40px + 5px);}
#window>.player.connect[data-position='7']{left:calc(500% / 7 + 150px / 7);top:calc(400% / 7 - 40px + 5px);}
#window>.player.connect[data-position='c0']{left:calc(50% - 255px);top:calc(50% - 90px)}
#window>.player.connect[data-position='c1']{left:calc(50% - 75px);top:calc(50% - 90px)}
#window>.player.connect[data-position='c2']{left:calc(50% + 105px);top:calc(50% - 90px)}

View File

@ -234,8 +234,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
game.players[i].ai.shown=0;
}
}
var isMougong=_status.mode=='mougong';
if(isMougong){
var stratagemMode=_status.mode=='stratagem';
if(stratagemMode){
var beginner;
if(_status.cheat_seat){
var seat=_status.cheat_seat.link;
@ -248,47 +248,30 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
event.beginner=beginner;
_status.mougong_buff={
sha:[1,'require'],
shan:[1,'double'],
juedou:[2,'damage'],
huogong:[2,'damage'],
tao:[3,'double'],
var stratagemBroadcast=()=>{
_status.stratagemFuryMax=3;
ui.css.stratagemCardStyle=lib.init.sheet([
'.card.stratagem-fury-glow:before{',
'opacity:0.2;',
'box-shadow:rgba(0,0,0,0.2) 0 0 0 1px,rgb(255,109,12) 0 0 5px,rgb(255,0,0) 0 0 10px;',
'background-color:yellow;',
'-webkit-filter:blur(5px);',
'filter:blur(5px);',
'}'
].join(''));
};
game.broadcastAll(function(){
_status.mougong_nuqi_max=3;
var mougong_cardStyle=document.createElement('style');
document.head.appendChild(mougong_cardStyle);
mougong_cardStyle.innerHTML='.card.mougong_nuqi_glow:before{opacity:0.2;box-shadow:rgba(0,0,0,0.2) 0 0 0 1px,rgb(255,109,12) 0 0 5px,rgb(255,0,0) 0 0 10px;background-color:yellow;-webkit-filter:blur(5px);filter:blur(5px);}';
ui.css.mougong_cardStyle=mougong_cardStyle;
});
if(_status.connectMode){
_status.round1_use_nuqi=lib.configOL.round1_use_nuqi;
if(!_status.postReconnect.mougong_reinit){
_status.postReconnect.mougong_reinit=[
function(){
_status.mougong_nuqi_max=3;
var mougong_cardStyle=document.createElement('style');
document.head.appendChild(mougong_cardStyle);
mougong_cardStyle.innerHTML='.card.mougong_nuqi_glow:before{opacity:0.2;box-shadow:rgba(0,0,0,0.2) 0 0 0 1px,rgb(255,109,12) 0 0 5px,rgb(255,0,0) 0 0 10px;background-color:yellow;-webkit-filter:blur(5px);filter:blur(5px);}';
ui.css.mougong_cardStyle=mougong_cardStyle;
},{}
];
}
}
else{
_status.round1_use_nuqi=get.config('round1_use_nuqi');
}
game.broadcastAll(stratagemBroadcast);
if(_status.connectMode&&!_status.postReconnect.stratagemReinit) _status.postReconnect.stratagemReinit=[stratagemBroadcast,{}];
for(var current of game.players){
if(current.identity=='zhu') current.addSkill('mougong_showZhu');
if(current.identity=='fan') current.addSkill('mougong_showFan');
if(current.identity=='zhu') current.addSkill('stratagem_show_zhu');
if(current.identity=='fan') current.addSkill('stratagem_show_fan');
}
}
if(game.zhu==game.me&&game.zhu.identity!='zhu'&&_status.brawl&&_status.brawl.identityShown){
delete game.zhu;
}
else{
if(!isMougong) game.zhu.ai.shown=1;
if(!stratagemMode) game.zhu.ai.shown=1;
if(game.zhu2){
game.zhong=game.zhu;
game.zhu=game.zhu2;
@ -302,10 +285,10 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
var enhance_zhu=false;
if(_status.connectMode){
enhance_zhu=(!['zhong','mougong','purple'].includes(_status.mode)&&lib.configOL.enhance_zhu&&get.population('fan')>=3);
enhance_zhu=(!['zhong','stratagem','purple'].includes(_status.mode)&&lib.configOL.enhance_zhu&&get.population('fan')>=3);
}
else{
enhance_zhu=(!['zhong','mougong','purple'].includes(_status.mode)&&get.config('enhance_zhu')&&get.population('fan')>=3);
enhance_zhu=(!['zhong','stratagem','purple'].includes(_status.mode)&&get.config('enhance_zhu')&&get.population('fan')>=3);
}
if(enhance_zhu){
var skill;
@ -341,18 +324,18 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
name2:players[i].name2,
identity:players[i].identity
};
if(isMougong){
if(stratagemMode){
ifo.translate=lib.translate[game.players[i].name];
ifo.isCamouflaged=players[i].ai.mougong_camouflage;
ifo.isCamouflaged=players[i].ai.stratagemCamouflage;
}
info.push(ifo);
}
_status.videoInited=true;
game.addVideo('init',null,info);
if(isMougong){
if(stratagemMode){
game.addVideo('arrangeLib',null,{
skill:{
mougong_nuqi:{
stratagem_fury:{
mark:true,
marktext:'🔥',
intro:{
@ -363,13 +346,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
},
});
for(var i=0;i<game.players.length;i++){
//game.addVideo('markSkill',game.players[i],['mougong_nuqi']);
//game.addVideo('markSkill',game.players[i],['stratagem_fury']);
game.players[i].ai.shown=0;
}
game.neiDoCamouflage();
}
"step 6"
if(_status.mode!='mougong') event.beginner=_status.firstAct2||game.zhong||game.zhu||_status.firstAct||game.me;
if(_status.mode!='stratagem') event.beginner=_status.firstAct2||game.zhong||game.zhu||_status.firstAct||game.me;
game.gameDraw(event.beginner,function(player){
if(_status.mode=='purple'&&player.seatNum>5) return 5;
return 4;
@ -434,8 +417,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
uiintro.add('<div class="text chat">游戏模式:'+(lib.configOL.identity_mode=='zhong'?'明忠':'标准'));
uiintro.add('<div class="text chat">双将模式:'+(lib.configOL.double_character?'开启':'关闭'));
if(lib.configOL.identity_mode!='zhong'){
if(lib.configOL.identity_mode=='mougong'){
uiintro.add('<div class="text chat">首轮强化:'+(lib.configOL.round1_use_nuqi?'开启':'关闭'));
if(lib.configOL.identity_mode=='stratagem'){
uiintro.add('<div class="text chat">首轮强化:'+(lib.configOL.round_one_use_fury?'开启':'关闭'));
}
else{
uiintro.add('<div class="text chat">双内奸:'+(lib.configOL.double_nei?'开启':'关闭'));
@ -494,7 +477,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
}
}
else if(_status.mode=='mougong'){
else if(_status.mode=='stratagem'){
if(game.zhu&&game.zhu.isZhu&&game.zhu.identityShown||game.me.identity=='zhu'){
return {
fan:'反',
@ -553,7 +536,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
switch(_status.mode){
case 'purple':str2='3v3v2 - '+(game.me.identity.indexOf('r')==0?'暖色':'冷色')+lib.translate[game.me.identity+'2'];break;
case 'zhong':str2='忠胆英杰 - '+lib.translate[game.me.identity+'2'];break;
case 'mougong':str2=get.cnNumber(get.playerNumber())+'人谋攻'+'-'+lib.translate[game.me.identity+'2'];
case 'stratagem':str2=get.cnNumber(get.playerNumber())+'人谋攻'+'-'+lib.translate[game.me.identity+'2'];
default:str2=get.cnNumber(get.playerNumber())+'人'+
get.translation(lib.config.mode)+' - '+lib.translate[game.me.identity+'2']
}
@ -1066,14 +1049,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
},500);
});
},
chooseCharacterMougongOL:function(){
chooseCharacterStratagemOL:function(){
var next=game.createEvent('chooseCharacter');
next.setContent(function(){
'step 0'
ui.arena.classList.add('choose-character');
var i;
var identityList;
identityList=lib.config.mode_config.identity.identity[game.players.length-2].slice(0);
var identityList=get.identityList(game.players.length);
if(lib.configOL.double_nei){
switch(lib.configOL.number){
case 8:
@ -1286,14 +1268,14 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
_status.characterlist.remove(game.players[i].name2);
}
var list=['mougong_nuqi','mougong_nuqi_dongcha','mougong_expose','mougong_addBuff','mougong_addBuff_sha','mougong_addBuff_shan','mougong_addBuff_tao','mougong_addBuff_damage','mougong_shanAi','mougong_cardEffect'];
var list=['stratagem_fury','stratagem_fury_insight','stratagem_expose','stratagem_shan_ai','stratagem_card_effect'];
for(var i=0;i<list.length;i++){
game.addGlobalSkill(list[i]);
}
game.players.forEach(current=>{
current.storage.zhibi=[];
current.storage.zhibi_for=[];
current.markSkill('mougong_nuqi');
current.markSkill('stratagem_fury');
});
setTimeout(function(){
@ -1309,8 +1291,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
var next=game.createEvent('chooseCharacter');
next.showConfig=true;
next.addPlayer=function(player){
var list=lib.config.mode_config.identity.identity[game.players.length-3].slice(0);
var list2=lib.config.mode_config.identity.identity[game.players.length-2].slice(0);
var list=get.identityList(game.players.length-1);
var list2=get.identityList(game.players.length);
for(var i=0;i<list.length;i++) list2.remove(list[i]);
player.identity=list2[0];
player.setIdentity('cai');
@ -1324,7 +1306,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
return;
}
}
var isMougong=_status.event.mougongmode;
var stratagemMode=_status.event.stratagemMode;
if(_status.event.zhongmode){
var listc=list.slice(0,2);
for(var i=0;i<listc.length;i++){
@ -1343,7 +1325,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
player.update();
}
}
else if(player.identity=='zhu'&&!isMougong){
else if(player.identity=='zhu'&&!stratagemMode){
list2.randomSort();
var choice,choice2;
if(!_status.event.zhongmode&&Math.random()-0.8<0&&list2.length){
@ -1371,7 +1353,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
player.update();
}
}
else if(player.identity=='zhong'&&(Math.random()<0.5||['sunliang','key_akane'].contains(game.zhu.name))&&!isMougong){
else if(player.identity=='zhong'&&(Math.random()<0.5||['sunliang','key_akane'].contains(game.zhu.name))&&!stratagemMode){
var listc=list.slice(0);
for(var i=0;i<listc.length;i++){
var listx=lib.characterReplace[listc[i]];
@ -1455,8 +1437,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
identityList=['zhu','zhong','mingzhong','nei','fan','fan','fan','fan'];
}
else{
if(_status.mode=='mougong') event.mougongmode=true;
identityList=lib.config.mode_config.identity.identity[game.players.length-2].slice(0);
if(_status.mode=='stratagem') event.stratagemMode=true;
identityList=get.identityList(game.players.length);
if(get.config('double_nei')){
switch(get.playerNumber()){
case 8:
@ -1486,7 +1468,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
}
}
var isMougong=event.mougongmode;
var stratagemMode=event.stratagemMode;
var addSetting=function(dialog){
dialog.add('选择身份').classList.add('add-setting');
@ -1567,7 +1549,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
node.remove();
game.uncheck();
game.check();
if(event.mougongmode) return;
if(event.stratagemMode) return;
for(var i=0;i<seats.childElementCount;i++){
if(get.distance(game.zhu,game.me,'absolute')===seats.childNodes[i].link){
seats.childNodes[i].classList.add('bluebg');
@ -1577,7 +1559,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
_status.event=_status.event.parent;
_status.event.step=0;
_status.event.identity=link;
if(!event.mougongmode){
if(!event.stratagemMode){
if(link!=(event.zhongmode?'mingzhong':'zhu')){
seats.previousSibling.style.display='';
seats.style.display='';
@ -1598,12 +1580,12 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
seats.style.margin='0';
seats.style.width='100%';
seats.style.position='relative';
for(var i=isMougong?1:2;i<=game.players.length;i++){
for(var i=stratagemMode?1:2;i<=game.players.length;i++){
var td=ui.create.div('.shadowed.reduce_radius.pointerdiv.tdnode');
td.innerHTML=get.cnNumber(i,true);
td.link=i-1;
seats.appendChild(td);
if(!isMougong&&get.distance(game.zhu,game.me,'absolute')===i-1){
if(!stratagemMode&&get.distance(game.zhu,game.me,'absolute')===i-1){
td.classList.add('bluebg');
}
td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){
@ -1617,7 +1599,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
}
if(isMougong){
if(stratagemMode){
this.classList.add('bluebg');
_status.cheat_seat=this;
}
@ -1637,7 +1619,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
});
}
dialog.content.appendChild(seats);
if(!isMougong&&game.me==game.zhu){
if(!stratagemMode&&game.me==game.zhu){
seats.previousSibling.style.display='none';
seats.style.display='none';
}
@ -1698,7 +1680,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
for(i=0;i<game.players.length;i++){
if(_status.brawl&&_status.brawl.identityShown){
if(game.players[i].identity=='zhu') game.zhu=game.players[i];
if(!isMougong) game.players[i].identityShown=true;
if(!stratagemMode) game.players[i].identityShown=true;
}
else{
game.players[i].node.identity.classList.add('guessing');
@ -1721,7 +1703,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
}
if(get.config('special_identity')&&!event.zhongmode&&!event.mougongmode&&game.players.length==8){
if(get.config('special_identity')&&!event.zhongmode&&!event.stratagemMode&&game.players.length==8){
for(var i=0;i<game.players.length;i++){
delete game.players[i].special_identity;
}
@ -1756,7 +1738,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(!game.zhu) game.zhu=game.me;
else{
if(!isMougong){
if(!stratagemMode){
game.zhu.setIdentity();
game.zhu.identityShown=true;
game.zhu.node.identity.classList.remove('guessing');
@ -1774,7 +1756,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(ix.length){
event.list.push(i);
list4.addArray(ix);
if(isMougong){
if(stratagemMode){
list3.push(i);
}
else{
@ -1794,7 +1776,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(lib.filter.characterDisabled(i)) continue;
event.list.push(i);
list4.push(i);
if(!isMougong&&lib.character[i][4]&&lib.character[i][4].contains('zhu')){
if(!stratagemMode&&lib.character[i][4]&&lib.character[i][4].contains('zhu')){
list2.push(i);
}
else{
@ -1802,7 +1784,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
};
var getZhuList=function(){
if(isMougong){
if(stratagemMode){
list2.sort(lib.sort.character);
return list2;
}
@ -1842,7 +1824,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
num=8;
}
}
if(isMougong){
if(stratagemMode){
list=event.list.slice(0,num);
}
else if(game.zhu!=game.me){
@ -2079,13 +2061,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
event.list.remove(get.sourceCharacter(game.me.name1));
event.list.remove(get.sourceCharacter(game.me.name2));
if(!event.mougongmode&&game.me==game.zhu&&game.players.length>4){
if(!event.stratagemMode&&game.me==game.zhu&&game.players.length>4){
game.me.hp++;
game.me.maxHp++;
game.me.update();
}
for(var i=0;i<game.players.length;i++){
if((event.mougongmode||game.players[i]!=game.zhu)&&game.players[i]!=game.me){
if((event.stratagemMode||game.players[i]!=game.zhu)&&game.players[i]!=game.me){
event.list.randomSort();
event.ai(game.players[i],event.list.splice(0,get.config('choice_'+game.players[i].identity)),null,event.list)
}
@ -2102,15 +2084,15 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
_status.characterlist.remove(game.players[i].name2);
}
"step 4"
if(event.mougongmode){
var list=['mougong_nuqi','mougong_nuqi_dongcha','mougong_expose','mougong_addBuff','mougong_addBuff_sha','mougong_addBuff_shan','mougong_addBuff_tao','mougong_addBuff_damage','mougong_shanAi','mougong_cardEffect'];
if(event.stratagemMode){
var list=['stratagem_fury','stratagem_fury_insight','stratagem_expose','stratagem_shan_ai','stratagem_card_effect'];
for(var i=0;i<list.length;i++){
game.addGlobalSkill(list[i]);
}
game.players.forEach(i=>{
i.storage.zhibi=[];
i.storage.zhibi_for=[];
i.markSkill('mougong_nuqi');
i.markSkill('stratagem_fury');
});
}
setTimeout(function(){
@ -2129,8 +2111,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
game.chooseCharacterPurpleOL();
return;
}
else if(_status.mode=='mougong'){
game.chooseCharacterMougongOL();
else if(_status.mode=='stratagem'){
game.chooseCharacterStratagemOL();
return;
}
var next=game.createEvent('chooseCharacter');
@ -2144,7 +2126,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
identityList=['zhu','zhong','mingzhong','nei','fan','fan','fan','fan'];
}
else{
identityList=lib.config.mode_config.identity.identity[game.players.length-2].slice(0);
identityList=get.identityList(game.players.length);
if(lib.configOL.double_nei){
switch(lib.configOL.number){
case 8:
@ -2611,33 +2593,31 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
sheshen:'舍身',
sheshen_info:'锁定技,主公处于濒死状态即将死亡时,令主公+1体力上限回复体力至X点X为你的体力值数获得你的所有牌然后你死亡。',
yexinbilu:'野心毕露',
mougong_nuqi:'怒气',
mougong_nuqi_dongcha:'洞察',
mougong_addBuff:'强化',
mougong_addBuff_info:'当你需要使用位于“强化表”内的非虚拟卡牌时,你可以消耗对应数量的怒气将其强化并使用。<br><br><span class="text" style="font-family:yuanli"><li>【杀】 1点怒气。响应时所需【闪】数+1。<br><li>【闪】 1点怒气。视为两张【闪】的效果。<br><li>【决斗】2点怒气。对目标造成的伤害+1。<br><li>【火攻】2点怒气。造成的伤害+1。<br><li>【桃】 3点怒气。回复值+1。</span>',
mougong_nuqi_cost1:'1🔥',
mougong_nuqi_cost2:'2🔥',
mougong_nuqi_cost3:'3🔥',
stratagem_fury:'怒气',
stratagem_fury_insight:'洞察',
stratagem_fury_cost1:'1🔥',
stratagem_fury_cost2:'2🔥',
stratagem_fury_cost3:'3🔥',
},
element:{
player:{
dongcha:function(target){
var next=game.createEvent('mougongDongcha');
insightInto:function(target){
var next=game.createEvent('stratagemInsight');
next.player=this;
next.target=target;
next.setContent('mougongDongcha');
next.setContent('stratagemInsight');
return next;
},
changeNuqi:function(num){
changeFury:function(num){
var player=this;
if(!player.storage.mougong_nuqi) player.storage.mougong_nuqi=0;
var tmp=player.storage.mougong_nuqi;
player.storage.mougong_nuqi+=num;
player.storage.mougong_nuqi=Math.max(Math.min(player.storage.mougong_nuqi,_status.mougong_nuqi_max),0);
var del=player.storage.mougong_nuqi-tmp;
if(!player.storage.stratagem_fury) player.storage.stratagem_fury=0;
var tmp=player.storage.stratagem_fury;
player.storage.stratagem_fury+=num;
player.storage.stratagem_fury=Math.max(Math.min(player.storage.stratagem_fury,_status.stratagemFuryMax),0);
var del=player.storage.stratagem_fury-tmp;
if(del===0) return;
game.log(player,del>=0?'获得了':'失去了',get.cnNumber(Math.abs(del))+'点<span class="firetext">怒气</span>');
player.markSkill('mougong_nuqi');
player.markSkill('stratagem_fury');
},
addExpose:function(num){
if(!game.zhu||!game.zhu.isZhu||!game.zhu.identityShown) return;
@ -2691,7 +2671,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
},
dieAfter2:function(source){
if(_status.mode=='mougong') return;
if(_status.mode=='stratagem') return;
if(_status.mode=='purple'){
if(source){
if(this.identity=='rZhu'||this.identity=='bZhu'){
@ -2831,8 +2811,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
},
logAi:function(targets,card){
if(this.ai.shown==1||this.isMad()) return;
var isMougong=get.mode()=='identity'&&_status.mode=='mougong';
if(isMougong&&(!game.zhu||!game.zhu.isZhu||!game.zhu.identityShown)) return;
var stratagemMode=get.mode()=='identity'&&_status.mode=='stratagem';
if(stratagemMode&&(!game.zhu||!game.zhu.isZhu||!game.zhu.identityShown)) return;
if(typeof targets=='number'){
this.ai.shown+=targets;
}
@ -2879,11 +2859,11 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
else this.ai.shown-=0.1;
}
}
if(!isMougong&&this!=game.me) this.ai.shown*=2;
if(!stratagemMode&&this!=game.me) this.ai.shown*=2;
if(this.ai.shown>0.95) this.ai.shown=0.95;
if(this.ai.shown<-0.5) this.ai.shown=-0.5;
if(_status.mode=='purple') return;
if(isMougong) return;
if(stratagemMode) return;
var marknow=(!_status.connectMode&&this!=game.me&&get.config('auto_mark_identity')&&this.ai.identity_mark!='finished');
// if(true){
@ -2984,17 +2964,17 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
},
content:{
mougongDongcha:function(event,map){
stratagemInsight:function(event,map){
'step 0'
// var player=map.player,target=map.target;
if(!player.storage.mougong_nuqi){event.finish();return;}
// yield player.changeNuqi(-1);
player.changeNuqi(-1);
if(!player.storage.stratagem_fury){event.finish();return;}
// yield player.changeFury(-1);
player.changeFury(-1);
'step 1'
if(!player.storage.zhibi) player.storage.zhibi=[];
if(!player.storage.zhibi.contains(target)) player.storage.zhibi.push(target);
var res=get.dongchaResult(player,target);
event.dongcha_result=res;
var res=get.insightResult(player,target);
event.insightResult=res;
event.videoId=lib.status.videoId++;
var send=(target,res,id)=>{
@ -3032,7 +3012,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
game.broadcastAll('closeDialog',event.videoId);
if(!_status.connectMode&&get.config('auto_mark_identity')&&!target.node.identity.firstChild.innerHTML.length){
game.broadcastAll(function(player,target,event){
if(player.isUnderControl(true)) target.setIdentity(event.dongcha_result);
if(player.isUnderControl(true)) target.setIdentity(event.insightResult);
},player,target,event);
}
},
@ -3046,7 +3026,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
var target=list.randomGet();
event.target=target;
target.ai.mougong_camouflage=true;
target.ai.stratagemCamouflage=true;
var neis=game.filterPlayer(i=>i.identity=='nei');
if(event.players.includes(game.me)&&game.me.identity=='nei'){
var str=get.translation(target)+'是反贼<br>';
@ -3090,7 +3070,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
}
var target=list.randomGet();
target.ai.mougong_camouflage=true;
target.ai.stratagemCamouflage=true;
event.videoId=lib.status.videoId++;
event.ai_targets=[];
var time=10000;
@ -3179,7 +3159,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(from==to||to.identityShown||from.storage.zhibi&&from.storage.zhibi.contains(to)||(_status.yeconfirm&&['rYe','bYe'].contains(to.identity)&&['rYe','bYe'].contains(to.identity))) return real*1.1;
return ((to.ai.shown+0.1)*real+(from.identity.slice(0,1)==to.identity.slice(0,1)?3:-3)*(1-to.ai.shown))
}
else if(_status.mode=='mougong'){
else if(_status.mode=='stratagem'){
var x=0,num=0,temp,i;
if(_status.ai.customAttitude){
for(i=0;i<_status.ai.customAttitude.length;i++){
@ -3195,15 +3175,15 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
var real=get.realAttitude(from,to),zhibi=from.storage.zhibi,zhibi_for=from.storage.zhibi_for,followCamouflage=true;
if(to.ai.shown) return to.ai.shown*(real+(from.identity==to.identity||from.identity=='zhu'&&to.identity=='zhong'||from.identity=='zhong'&&to.identity=='zhu'||(to.identity=='nei'&&get.situation()<=0&&['zhu','zhong'].contains(from.identity)||get.situation()>=3&&from.identity=='fan')?3:-3))
if(from==to||to.identityShown||((zhibi_for&&zhibi_for.contains(to))||(zhibi&&zhibi.contains(to)))&&!to.ai.mougong_camouflage) return real*1.1;
if(from.identity=='nei'&&to.ai.mougong_camouflage) return real*1.1;
if(from==to||to.identityShown||((zhibi_for&&zhibi_for.contains(to))||(zhibi&&zhibi.contains(to)))&&!to.ai.stratagemCamouflage) return real*1.1;
if(from.identity=='nei'&&to.ai.stratagemCamouflage) return real*1.1;
if(to.identity=='nei'){
if(from.identity=='fan'){
if(get.population('zhong')==0){
if(zhibi){
var dead=game.dead.slice();
for(var current of dead){
if(from.storage.zhibi.contains(current)&&current.ai.mougong_camouflage){
if(from.storage.zhibi.contains(current)&&current.ai.stratagemCamouflage){
if(from.storage.zhibi_for&&from.storage.zhibi_for.contains(to)) return -7;
}
}
@ -3214,7 +3194,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
if(to.identity=='fan'&&from.identity=='nei'&&zhibi.contains(game.zhu)&&game.players.filter(i=>i!=from&&!zhibi.contains(i)).map(i=>i.identity).reduce((p,c)=>(!p.contains(c)?(p.push(c)&&p):p),[]).length==1) return real;
for(var fan of game.dead){
if(fan.identity!='fan'||!fan.storage.mougong_showFan) continue;
if(fan.identity!='fan'||!fan.storage.stratagem_show_fan) continue;
for(var current of fan.storage.zhibi_for){
if(to==current){
return real;
@ -3222,14 +3202,14 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
}
if(from.identity=='fan'&&to.identity=='fan'){
if(from.ai.mougong_camouflage){
if(from.ai.stratagemCamouflage){
var zhu=game.zhu&&game.zhu.isZhu&&game.zhu.identityShown?game.zhu:undefined;
if(zhu){
if(zhu.storage.zhibi_for&&zhu.storage.zhibi_for.contains(to)) return 0;
}
if(zhibi&&zhibi.contains(to)) return -7;
}
if(to.ai.mougong_camouflage){
if(to.ai.stratagemCamouflage){
var zhu=game.zhu&&game.zhu.isZhu&&game.zhu.identityShown?game.zhu:undefined;
if(zhu){
if(zhu.storage.zhibi_for&&zhu.storage.zhibi_for.contains(to)) return 0;
@ -3237,12 +3217,12 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(zhibi&&zhibi.contains(to)) return -7;
}
}
if(from.identity!='nei'&&zhibi&&zhibi.contains(to)&&!to.identityShown&&(followCamouflage&&to.ai.mougong_camouflage)) return -5;
if(from.identity!='nei'&&zhibi&&zhibi.contains(to)&&!to.identityShown&&(followCamouflage&&to.ai.stratagemCamouflage)) return -5;
if(from.identity!='nei'&&zhibi_for&&zhibi_for.contains(to)&&!to.identityShown) return -5;
if(zhibi){
for(var to2 of zhibi){
if(to2.storage.zhibi_for){
if(to2.ai.mougong_camouflage){
if(to2.ai.stratagemCamouflage){
for(var to3 of to2.storage.zhibi_for){
if(zhibi.slice().addArray(zhibi_for).contains(to3)){
if(to==to2){
@ -3315,7 +3295,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
return -7;
}
}
else if(_status.mode=='mougong'){
else if(_status.mode=='stratagem'){
if(!game.zhu){
if(from.identity=='nei'||to.identity=='nei') return -1;
if(from.identity==to.identity) return 6;
@ -3718,17 +3698,42 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
return result;
},
dongchaResult:function(from,to){
insightResult:function(from,to){
var friend='friend',enemy='enemy';
if(from.identity=='nei') return to.identity;
if(to.identity=='nei') return friend;
if(from.ai.mougong_camouflage||to.ai.mougong_camouflage) return enemy;
if(from.ai.stratagemCamouflage||to.ai.stratagemCamouflage) return enemy;
if(from.identity==to.identity||from.identity=='zhu'&&to.identity=='zhong'||from.identity=='zhong'&&to.identity=='zhu') return friend;
return enemy;
},
/**
* @param {number} numberOfPlayers
* @returns {string[]}
*/
identityList:numberOfPlayers=>{
const modeConfig=lib.config.mode_config;
if(modeConfig){
const identityConfig=modeConfig.identity;
if(identityConfig){
const identityLists=identityConfig.identity;
if(identityLists){
const identityList=identityLists[numberOfPlayers-2];
if(Array.isArray(identityList)) return identityList.slice();
}
}
}
const numberOfPlayersExceptLord=numberOfPlayers-1,numberOfLoyalists=Math.round(numberOfPlayersExceptLord*3/9),numberOfSpys=Math.round(numberOfPlayersExceptLord*2/9);
return ['zhu'].concat(Array.from({
length:numberOfLoyalists
},()=>'zhong'),Array.from({
length:numberOfSpys
},()=>'nei'),Array.from({
length:numberOfPlayersExceptLord-numberOfLoyalists-numberOfSpys
},()=>'fan'));
}
},
skill:{
mougong_nuqi:{
stratagem_fury:{
mark:true,
marktext:'🔥',
silent:true,
@ -3738,16 +3743,16 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
player:['phaseBegin','damageEnd'],
},
content:function(){
player.changeNuqi(trigger.name=='damage'?trigger.num:1);
player.changeFury(trigger.name=='damage'?trigger.num:1);
},
intro:{
name:'怒气',
content:function(storage,player){
return '当前怒气值:'+(storage||0)+'/'+_status.mougong_nuqi_max;
return '当前怒气值:'+(storage||0)+'/'+_status.stratagemFuryMax;
},
},
subSkill:{
dongcha:{
insight:{
trigger:{
source:'damageSource',
global:'loseHpEnd',
@ -3758,7 +3763,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
if(event.name=='loseHp'){
if(event.getParent()._trigger) source=event.getParent()._trigger.source;
}
return player==source&&player.storage.mougong_nuqi>0&&event.player&&event.player.isIn()&&event.player!=player;
return player==source&&player.storage.stratagem_fury>0&&event.player&&event.player.isIn()&&event.player!=player;
},
logTarget:'player',
prompt2:function(event,player){
@ -3771,7 +3776,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
},
content:function(){
game.log(player,'洞察了',trigger.player,'与其的阵营关系');
player.dongcha(trigger.player);
player.insightInto(trigger.player);
},
ai:{
order:15,
@ -3779,7 +3784,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
},
}
},
mougong_showZhu:{
stratagem_show_zhu:{
trigger:{
player:['dying','phaseBefore'],
global:'dieAfter',
@ -3793,13 +3798,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
charlotte:true,
ruleSkill:true,
filter:function(event,player){
if(player.storage.mougong_showZhu) return false;
if(player.storage.stratagem_show_zhu) return false;
if(player.identity=='zhu'){
if(event.player==player){
if(event.name=='dying') return true;
return game.roundNumber>=3;
return game.roundNumber>=Math.max(Math.round(get.totalPopulation()/2),3);
}
if(event.name=='die') return game.dead.length>=2;
if(event.name=='die') return game.dead.length>=Math.max(Math.round(get.totalPopulation()/3),2);
}
return false;
},
@ -3807,7 +3812,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
'step 0'
if(trigger.name=='dying') game.delayx();
'step 1'
player.storage.mougong_showZhu=true;
player.storage.stratagem_show_zhu=true;
game.zhu=game.zhu||player;
game.broadcastAll(function(player){
game.zhu=player;
@ -3842,7 +3847,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
}
},
mougong_showFan:{
stratagem_show_fan:{
trigger:{
player:'dying',
},
@ -3852,13 +3857,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
charlotte:true,
ruleSkill:true,
filter:function(event,player){
return player.ai.mougong_camouflage&&event.player==player&&!game.dead.length&&player.storage.mougong_nuqi>=2&&!player.storage.mougong_showFan;
return player.ai.stratagemCamouflage&&event.player==player&&!game.dead.length&&player.storage.stratagem_fury>=2&&!player.storage.stratagem_show_fan;
},
content:function(){
'step 0'
game.delayx();
'step 1'
player.storage.mougong_showFan=true;
player.storage.stratagem_show_fan=true;
game.broadcastAll(function(player){
player.identityShown=true;
player.ai.shown=1;
@ -3870,7 +3875,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
game.delay(2);
player.playerfocus(800);
'step 2'
player.changeNuqi(-player.storage.mougong_nuqi);
player.changeFury(-player.storage.stratagem_fury);
player.discard(player.getCards('hej'));
player.link(false);
player.turnOver(false);
@ -3878,208 +3883,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
player.draw(3);
}
},
mougong_addBuff:{
enable:'chooseToUse',
filter:function(event,player){
if(!event.mougong_settings) return false;
if(game.roundNumber<2&&!event.mougong_settings.round1_use_nuqi) return false;
var cards=player.getCards('hs');
if(!event.mougong_settings.mougong_buff) return false;
var names=Object.keys(event.mougong_settings.mougong_buff);
if(!names.length) return false;
for(var card of cards){
if(!game.checkMod(card,player,'unchanged','cardEnabled2',player)) continue;
for(var name of names){
var myName=get.name(card,player),nature=get.nature(card,player);
if(name==myName){
if(event.filterCard({name:name,nature:nature,isCard:true,cards:[card]},player,event)){
if(player.storage.mougong_nuqi>=event.mougong_settings.mougong_buff[name][0])
return true;
}
}
}
}
return false;
},
onChooseToUse:function(event){
if(!event.mougong_settings&&!game.online){
event.set('mougong_settings',{
round1_use_nuqi:_status.round1_use_nuqi,
mougong_buff:_status.mougong_buff,
});
}
},
check:function(card){
var player=_status.event.player;
if(_status.event.type=='phase'){
var name=get.name(card,player);
if(name=='sha'){
if(game.hasPlayer(current=>{
return player.canUse(card,current)&&(player.storage.zhibi&&!player.storage.zhibi.contains(current)||(get.effect(current,card,player,player)>=2-Math.max(0,(player.storage.mougong_nuqi||0)-1)))&&current.mayHaveShan()&&player.hasSkill('jiu');
})) return 1;
return 0;
} else if(name=='tao'){
if(player.hp<=2&&player.getDamagedHp()>=2) return 1;
return 0;
}
return 1;
}
else if(_status.event.type=='dying') return get.attitude(player,_status.event.dying)>3?1:0;
return (_status.event.getParent().shanRequired||1)>1&&get.damageEffect(player,_status.event.getParent().player||player,player)<0?1:0;
},
position:'hs',
filterCard:function(card,player,event){
event=event||_status.event;
var filter=event._backup.filterCard;
var names=Object.keys(event.mougong_settings.mougong_buff);
for(var name of names){
var myName=get.name(card,player),nature=get.nature(card,player);
if(name==myName){
if(filter({name:name,nature:nature,isCard:true,cards:[card]},player,_status.event)){
if(player.storage.mougong_nuqi>=event.mougong_settings.mougong_buff[name][0]){
return true;
}
}
}
}
return false;
},
viewAs:function(cards,player){
var name=get.name(cards[0],player);
var nature=get.nature(cards[0],player);
if(name){
return {
name:name,
nature:nature,
suit:get.suit(cards[0],player),
number:get.number(cards[0],player),
isCard:true,
cards:[cards[0]],
storage:{mougong_buffed:true},
};
}
return null;
},
precontent:function(){
'step 0'
player.changeNuqi(-_status.mougong_buff[event.result.card.name][0]);
},
ai:{
order:function(item,player){
var player=player||_status.event.player;
if(_status.event.type=='phase'){
var cards=player.getCards('hs');
for(var card of cards){
if(!game.checkMod(card,player,'unchanged','cardEnabled2',player)) continue;
var name=get.name(card,player);
if(name=='sha'){
if(game.hasPlayer(current=>{
return player.canUse(card,current)&&(player.storage.zhibi&&!player.storage.zhibi.contains(current)||(get.effect(current,card,player,player)>=2-Math.max(0,(player.storage.mougong_nuqi||0)-1)))&&current.mayHaveShan();
})) return get.order(card,player)+0.5;
} else if(name=='tao'){
if(player.hp<=2&&player.getDamagedHp()>=2) return get.order(card,player)+0.5;
}
return 8;
}
}
return 3.5;
},
},
subSkill:{
sha:{
trigger:{player:'useCardToPlayered'},
forced:true,
silent:true,
popup:false,
charlotte:true,
filter:function(event,player){
return event.card.name=='sha'&&event.card.storage&&event.card.storage.mougong_buffed&&_status.mougong_buff['sha'][1]=='require'&&!event.getParent().directHit.contains(event.target);
},
content:function(){
if(!trigger.card.storage.mougong_logged){
game.log(player,'触发了强化杀的效果');
game.log('#y'+get.translation(trigger.card),'需要额外使用一张','#y【闪】','响应');
trigger.card.storage.mougong_logged=true;
}
var id=trigger.target.playerid;
var map=trigger.getParent().customArgs;
if(!map[id]) map[id]={};
if(typeof map[id].shanRequired=='number'){
map[id].shanRequired++;
}
else{
map[id].shanRequired=2;
}
},
ai:{
directHit_ai:true,
skillTagFilter:function(player,tag,arg){
if(arg.card.name!='sha'||(arg.card&&arg.card.storage&&!arg.card.storage.mougong_buffed)||(arg.target.countCards('h','shan')>=1&&!arg.target.storage.mougong_nuqi)) return false;
},
},
},
shan:{
trigger:{
player:'shanEnd',
},
forced:true,
silent:true,
popup:false,
charlotte:true,
filter:function(event,player){
return event.getParent(3).name=='sha'&&event.getParent().card.storage&&event.getParent().card.storage.mougong_buffed&&_status.mougong_buff['shan'][1]=='double';
},
content:function(event,player){
if(!trigger.card.storage.mougong_logged){
game.log(player,'触发了强化闪的效果');
game.log('#y'+get.translation(trigger.card),'视为两张','#y【闪】','的效果');
trigger.card.storage.mougong_logged=true;
}
if(trigger.getParent(3).shanRequired) trigger.getParent(3).shanRequired--;
}
},
damage:{
trigger:{player:'damageBegin1'},
forced:true,
silent:true,
popup:false,
charlotte:true,
filter:function(event,player){
if(!event.card) return false;
var names=Object.keys(_status.mougong_buff),name=event.card.name;
return names.contains(name)&&event.getParent(2).player==event.source&&event.card.storage&&event.card.storage.mougong_buffed&&_status.mougong_buff[name][1]=='damage';
},
content:function(){
if(!trigger.card.storage.mougong_logged){
game.log(player,'触发了强化'+get.translation(trigger.card.name)+'的效果');
game.log('#y'+get.translation(trigger.card),'造成的伤害','#y+1');
trigger.card.storage.mougong_logged=true;
}
trigger.num++;
}
},
tao:{
trigger:{player:'useCard'},
filter:function(event,player){
return event.card.name=='tao'&&event.card.storage&&event.card.storage.mougong_buffed&&_status.mougong_buff['tao'][1]=='double';
},
forced:true,
silent:true,
popup:false,
charlotte:true,
content:function(){
if(!trigger.card.storage.mougong_logged){
game.log(player,'触发了强化桃的效果');
game.log('#y'+get.translation(trigger.card),'的回复值','#y+1');
trigger.card.storage.mougong_logged=true;
}
if(!trigger.baseDamage) trigger.baseDamage=1;
trigger.baseDamage++;
},
}
}
},
mougong_expose:{
stratagem_expose:{
trigger:{player:'useCard'},
forced:true,
silent:true,
@ -4087,7 +3891,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
filter:function(event,player){
if(event.targets[0]==player) return false;
return event.targets.length==1&&event.targets[0]&&((player.storage.zhibi.contains(event.targets[0])||event.targets[0].identityShown) ||
game.players.slice().concat(game.dead).filter(current=>(current.storage.mougong_showFan||current.storage.mougong_showZhu)&&current.identityShown&&current.storage.zhibi_for.contains(event.targets[0])).length);
game.players.slice().concat(game.dead).filter(current=>(current.storage.stratagem_show_fan||current.storage.stratagem_show_zhu)&&current.identityShown&&current.storage.zhibi_for.contains(event.targets[0])).length);
},
content:function(){
if(!trigger.targets[0].storage.zhibi_for) trigger.targets[0].storage.zhibi_for=[];
@ -4095,7 +3899,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}
},
mougong_shanAi:{
stratagem_shan_ai:{
trigger:{
player:'chooseToUseBegin',
},
@ -4125,7 +3929,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
var target=_status.event.player;
var evt=_status.event.getParent(2);
var bool=true;
if(_status.event.getParent().shanRequired>1&&!get.is.object(card)&&(target.countCards('h','shan')<_status.event.getParent().shanRequired&&!(target.storage.mougong_nuqi>=1&&target.countCards('h','shan')==1&&_status.event.getParent().shanRequired<=2))){
if(_status.event.getParent().shanRequired>1&&!get.is.object(card)&&(target.countCards('h','shan')<_status.event.getParent().shanRequired&&!(target.storage.stratagem_fury>=1&&target.countCards('h','shan')==1&&_status.event.getParent().shanRequired<=2))){
bool=false;
}
else if(target.hasSkillTag('useShan')){
@ -4139,7 +3943,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
}).set('shanRequired',evt.shanRequired);
},
},
mougong_cardEffect:{
stratagem_card_effect:{
trigger:{
player:['useCard1'],
},
@ -4148,12 +3952,12 @@ game.import('mode',function(lib,game,ui,get,ai,_status){
forced:true,
charlotte:true,
filter:function(event,player,name){
return event.card&&event.card.storage&&event.card.storage.mougong_buffed&&event.cards.length;
return event.card&&event.card.storage&&event.card.storage.stratagemBuffed&&event.cards.length;
},
content:function(){
game.broadcastAll(function(cards){
for(var i of cards){
i.clone.classList.add('mougong_nuqi_glow');
i.clone.classList.add('stratagem-fury-glow');
}
},trigger.cards);
}