Files
2024-07-20 15:46:46 +08:00

1841 lines
61 KiB
JavaScript

'use strict';
decadeModule.import((lib, game, ui, get, ai, _status) => {
const skillMap = {
guanxing: {
content: function () {
'step 0'
if (player.isUnderControl()) {
game.modeSwapPlayer(player);
}
var num = Math.min(5, game.countPlayer());
if (player.hasSkill('yizhi') && player.hasSkill('guanxing')) {
num = 5;
}
var player = event.player;
if (player.isUnderControl()) game.modeSwapPlayer(player);
var cards = get.cards(num);
var guanXing = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length);
game.broadcast(function (player, cards) {
if (!window.decadeUI) return;
decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length);
}, player, cards);
event.switchToAuto = function () {
var cards = guanXing.cards[0].concat();
var cheats = [];
var judges = player.node.judges.childNodes;
if (judges.length) {
cheats = decadeUI.get.cheatJudgeCards(cards, judges, true);
}
if (cards.length && cheats.length == judges.length) {
for (var i = 0; i >= 0 && i < cards.length; i++) {
if (get.value(cards[i], player) >= 5) {
cheats.push(cards[i]);
cards.splice(i, 1)
}
}
}
var time = 500;
for (var i = 0; i < cheats.length; i++) {
setTimeout(function (card, index, finished) {
guanXing.move(card, index, 0);
if (finished) guanXing.finishTime(1000);
}, time, cheats[i], i, (i >= cheats.length - 1) && cards.length == 0);
time += 500;
}
for (var i = 0; i < cards.length; i++) {
setTimeout(function (card, index, finished) {
guanXing.move(card, index, 1);
if (finished) guanXing.finishTime(1000);
}, time, cards[i], i, (i >= cards.length - 1));
time += 500;
}
};
if (event.isOnline()) {
event.player.send(function () {
if (!window.decadeUI && decadeUI.eventDialog) _status.event.finish();
}, event.player);
event.player.wait();
decadeUI.game.wait();
} else if (!event.isMine()) {
event.switchToAuto();
}
'step 1'
player.popup(get.cnNumber(event.num1) + '上' + get.cnNumber(event.num2) + '下');
game.log(player, '将' + get.cnNumber(event.num1) + '张牌置于牌堆顶,' + get.cnNumber(event.num2) + '张牌置于牌堆底');
game.updateRoundNumber()
}
},
reguanxing: {
content: function () {
'step 0'
var player = event.player;
if (player.isUnderControl()) game.modeSwapPlayer(player);
var cards = get.cards(game.countPlayer() < 4 ? 3 : 5);
var guanXing = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length);
game.broadcast(function (player, cards) {
if (!window.decadeUI) return;
decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length);
}, player, cards);
event.switchToAuto = function () {
var cheats = [];
var cards = guanXing.cards[0].concat();
var judges;
var next = player.getNext();
var friend = player;
if (event.triggername == 'phaseJieshuBegin') {
friend = next;
judges = friend.node.judges.childNodes;
if (get.attitude(player, friend) < 0) friend = null;
} else {
judges = player.node.judges.childNodes;
}
if (judges.length) {
cheats = decadeUI.get.cheatJudgeCards(cards, judges, friend != null);
}
if (cards.length && cheats.length == judges.length) {
for (var i = 0; i >= 0 && i < cards.length; i++) {
if (friend) {
if (get.value(cards[i], friend) >= 5) {
cheats.push(cards[i]);
cards.splice(i, 1)
}
} else {
if (get.value(cards[i], next) < 4) {
cheats.push(cards[i]);
cards.splice(i, 1)
}
}
}
}
var time = 500;
for (var i = 0; i < cheats.length; i++) {
setTimeout(function (card, index, finished) {
guanXing.move(card, index, 0);
if (finished) guanXing.finishTime(1000);
}, time, cheats[i], i, (i >= cheats.length - 1) && cards.length == 0);
time += 500;
}
for (var i = 0; i < cards.length; i++) {
setTimeout(function (card, index, finished) {
guanXing.move(card, index, 1);
if (finished) guanXing.finishTime(1000);
}, time, cards[i], i, (i >= cards.length - 1));
time += 500;
}
};
if (event.isOnline()) {
// 判断其他玩家是否有十周年UI,否则直接给他结束,不知道有没有效果
event.player.send(function () {
if (!window.decadeUI && decadeUI.eventDialog) _status.event.finish();
}, event.player);
// 等待其他玩家操作
event.player.wait();
// 暂停主机端游戏
decadeUI.game.wait();
} else if (!event.isMine()) {
event.switchToAuto();
/*
注释说明
var guanXing = decadeUI.content.chooseGuanXing(
控制观星的玩家, // 必选
[顶部初始化的牌], // 必选,可为null,但底部不能为null
顶部允许控制的牌数范围, // 可选,不填根据初始化的牌数量
[底部初始化的牌], // 必选,可为null,但顶部不能为null
底部允许控制的牌数范围, // 可选,不填根据初始化的牌数量
第一个参数的玩家是否可见); // 可选,不设置则根据控制观星的玩家来显示
// undefined 均为可设置,其他为只读或调用
var properties = {
caption: undefined, // 设置标题
header1: undefined, // 牌堆顶的文字
header2: undefined, // 牌堆底的文字
cards: [[],[]], // 获取当前观星的牌,不要瞎改
callback: undefined, // 回调函数,返回 true 表示可以点击【确认】按钮,例:guanXing.callback = function(){ return guanXing.cards[1].length == 1; }
// 注意:此值一旦设置,观星finish后不会自己置顶牌堆顶和牌堆底,需要自行实现
infohide: undefined, // 设置上面第1个参数的玩家是否可见观星的牌
confirmed: undefined, // 是否按下确认按钮
doubleSwitch: undefined, // 双击切换牌
finishTime:function(time), // 指定的毫秒数后完成观星
finish:function(), // 观星完成,在下一个step 中,可以通过 event.cards1 与 event.cards2 访问观星后的牌
swap:function(s, t), // 交换观星中的两个牌
switch:function(card), // 将观星中的牌切换到另一方
move:function(card, index, moveDown) // 移动观星的牌到指定的一方位置
}
*/
}
'step 1'
if (event.triggername == 'phaseZhunbeiBegin' && event.num1 == 0) player.addTempSkill('reguanxing_on');
player.popup(get.cnNumber(event.num1) + '上' + get.cnNumber(event.num2) + '下');
game.log(player, '将' + get.cnNumber(event.num1) + '张牌置于牌堆顶,' + get.cnNumber(event.num2) + '张牌置于牌堆底');
game.updateRoundNumber();
}
},
chengxiang: {
content: function () {
'step 0'
var cards = get.cards(4);
var guanXing = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, 4, false);
guanXing.doubleSwitch = true;
guanXing.caption = '【称象】';
guanXing.header2 = '获得的牌';
guanXing.callback = function () {
var num = 0;
for (var i = 0; i < this.cards[1].length; i++) {
num += get.number(this.cards[1][i]);
}
return num > 0 && num <= 13;
};
game.broadcast(function (player, cards, callback) {
if (!window.decadeUI) return;
var guanXing = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, 4, false);
guanXing.caption = '【称象】';
guanXing.header2 = '获得的牌';
guanXing.callback = callback;
}, player, cards, guanXing.callback);
var player = event.player;
event.switchToAuto = function () {
var cards = guanXing.cards[0];
var num, sum, next;
var index = 0;
var results = [];
for (var i = 0; i < cards.length; i++) {
num = 0;
sum = 0;
next = i + 1;
for (var j = i; j < cards.length; j++) {
if (j != i && j < next)
continue;
num = sum + get.number(cards[j]);
if (num <= 13) {
sum = num;
if (!results[index]) results[index] = [];
results[index].push(cards[j]);
}
if (j >= cards.length - 1) index++;
}
if (results[index] && results[index].length == cards.length) break;
}
var costs = [];
for (var i = 0; i < results.length; i++) {
costs[i] = {
value: 0,
index: i,
};
for (var j = 0; j < results[i].length; j++) {
costs[i].value += get.value(results[i][j], player);
// 如果有队友且有【仁心】且血量不低,优先选择装备牌
if (player.hasFriend() && player.hasSkill('renxin') && get.type(results[i][j]) == 'equip' && player.hp > 1) {
costs[i].value += 5;
}
// 如果自己有延时牌且没有无懈可击,优先选择无懈可击
if (player.node.judges.childNodes.length > 0 && !player.hasWuxie() && results[i][j] == 'wuxie') {
costs[i].value += 5;
}
}
}
costs.sort(function (a, b) {
return b.value - a.value;
});
var time = 500;
var result = results[costs[0].index];
for (var i = 0; i < result.length; i++) {
setTimeout(function (move, finished) {
guanXing.move(move, guanXing.cards[1].length, 1);
if (finished) guanXing.finishTime(1000);
}, time, result[i], (i >= result.length - 1));
time += 500;
}
};
if (event.isOnline()) {
event.player.send(function () {
if (!window.decadeUI && decadeUI.eventDialog) _status.event.finish();
}, event.player);
event.player.wait();
decadeUI.game.wait();
} else if (!event.isMine()) {
event.switchToAuto();
}
'step 1'
if (event.result && event.result.bool) {
game.cardsDiscard(event.cards1);
player.gain(event.cards2, 'log', 'gain2');
}
}
},
xinfu_zuilun: {
content: function () {
'step 0'
event.num = 0;
event.cards = get.cards(3);
if (player.getHistory('lose', function (evt) {
return evt.type == 'discard';
}).length) event.num++;
if (!player.isMinHandcard()) event.num++;
if (!player.getStat('damage')) event.num++;
'step 1'
if (event.num == 0) {
player.gain(event.cards, 'draw');
event.finish();
return;
}
var cards = event.cards;
var gains = cards.length - event.num;
var zuiLun = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, gains);
zuiLun.caption = '【罪论】';
zuiLun.header2 = '获得的牌';
zuiLun.tip = '可获得' + gains + '张牌<br>' + zuiLun.tip;
zuiLun.callback = function () {
return this.cards[1].length == gains;
};
game.broadcast(function (player, cards, gains, callback) {
if (!window.decadeUI) return;
var zuiLun = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, gains);
zuiLun.caption = '【罪论】';
zuiLun.header2 = '获得的牌';
zuiLun.tip = '可获得' + gains + '张牌<br>' + zuiLun.tip;
zuiLun.callback = callback;
}, player, cards, gains, zuiLun.callback);
var player = event.player;
event.switchToAuto = function () {
var cheats = [];
var cards = zuiLun.cards[0].concat();
var stopped = false;
var next = player.getNext();
var hasFriend = get.attitude(player, next) > 0;
// 判断下家是不是队友,令其生效或者失效
var judges = next.node.judges.childNodes;
if (judges.length > 0) cheats = decadeUI.get.cheatJudgeCards(cards, judges, hasFriend);
// 如果有【父荫】优先把好牌给队友
if (hasFriend && player.hasSkill('xinfu_fuyin')) {
cards = decadeUI.get.bestValueCards(cards, next);
} else {
cards.sort(function (a, b) {
return get.value(a, player) - get.value(b, player);
});
}
cards = cheats.concat(cards);
var time = 500;
var gainNum = gains;
for (var i = cards.length - 1; i >= 0; i--) {
setTimeout(function (card, index, finished, moveDown) {
zuiLun.move(card, index, moveDown ? 1 : 0);
if (finished) zuiLun.finishTime(1000);
}, time, cards[i], i, i == 0, gainNum > 0);
time += 500;
gainNum--;
}
};
if (event.isOnline()) {
event.player.send(function () {
if (!window.decadeUI && decadeUI.eventDialog) _status.event.finish();
}, event.player);
event.player.wait();
decadeUI.game.wait();
} else if (!event.isMine()) {
event.switchToAuto();
}
'step 2'
event.cards = event.cards2
if (event.result && event.result.bool) {
var cards = event.cards1;
var first = ui.cardPile.firstChild;
for (var i = 0; i < cards.length; i++) {
ui.cardPile.insertBefore(cards[i], first);
}
}
'step 3'
game.updateRoundNumber();
if (event.cards.length) {
player.gain(event.cards, 'draw');
event.finish();
} else {
player.chooseTarget('请选择一名角色,与其一同失去1点体力', true, function (card, player, target) {
return target != player;
}).ai = function (target) {
return - get.attitude(_status.event.player, target);
};
}
'step 4'
player.line(result.targets[0], 'fire');
player.loseHp();
result.targets[0].loseHp();
}
},
xunxun: {
content: function () {
'step 0'
var cards = get.cards(4);
var player = event.player;
var xunxun = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, 2);
xunxun.caption = '【恂恂】';
xunxun.header1 = '牌堆底';
xunxun.header2 = '牌堆顶';
xunxun.callback = function () {
return this.cards[0].length == 2 && this.cards[1].length == 2;
};
game.broadcast(function (player, cards, callback) {
if (!window.decadeUI) return;
var xunxun = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, 2);
xunxun.caption = '【恂恂】';
xunxun.header1 = '牌堆底';
xunxun.header2 = '牌堆顶';
xunxun.callback = callback;
}, player, cards, xunxun.callback);
event.switchToAuto = function () {
var cards = decadeUI.get.bestValueCards(xunxun.cards[0].concat(), player);
var time = 500;
for (var i = 0; i < 2; i++) {
setTimeout(function (card, index, finished) {
xunxun.move(card, index, 1);
if (finished) xunxun.finishTime(1000);
}, time, cards[i], i, i >= 1);
time += 500;
}
}
if (event.isOnline()) {
event.player.send(function () {
if (!window.decadeUI && decadeUI.eventDialog) _status.event.finish();
}, event.player);
event.player.wait();
decadeUI.game.wait();
} else if (!event.isMine()) {
event.switchToAuto();
}
'step 1'
var first = ui.cardPile.firstChild;
var cards = event.cards2;
for (var i = 0; i < cards.length; i++) {
ui.cardPile.insertBefore(cards[i], first);
}
cards = event.cards1;
for (var i = 0; i < cards.length; i++) {
ui.cardPile.appendChild(cards[i]);
}
}
},
xinfu_dianhua: {
content: function () {
'step 0'
var num = 0;
var player = event.player;
for (var i = 0; i < lib.suit.length; i++) {
if (player.hasMark('xinfu_falu_' + lib.suit[i])) num++;
}
var cards = get.cards(num);
var dialog = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length);
dialog.caption = '【点化】';
game.broadcast(function (player, cards) {
if (!window.decadeUI) return;
decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length).caption = '【点化】';
}, player, cards);
event.switchToAuto = function () {
var cheats = [];
var cards = dialog.cards[0].concat();
var judges;
var next = player.getNext();
var friend = player;
if (event.triggername == 'phaseJieshuBegin') {
friend = next;
judges = friend.node.judges.childNodes;
if (get.attitude(player, friend) < 0) friend = null;
} else {
judges = player.node.judges.childNodes;
}
if (judges.length) {
cheats = decadeUI.get.cheatJudgeCards(cards, judges, friend != null);
}
if (cards.length && cheats.length == judges.length) {
for (var i = 0; i >= 0 && i < cards.length; i++) {
if (friend) {
if (get.value(cards[i], friend) >= 5) {
cheats.push(cards[i]);
cards.splice(i, 1)
}
} else {
if (get.value(cards[i], next) < 4) {
cheats.push(cards[i]);
cards.splice(i, 1)
}
}
}
}
var time = 500;
for (var i = 0; i < cheats.length; i++) {
setTimeout(function (card, index, finished) {
dialog.move(card, index, 0);
if (finished) dialog.finishTime(1000);
}, time, cheats[i], i, (i >= cheats.length - 1) && cards.length == 0);
time += 500;
}
for (var i = 0; i < cards.length; i++) {
setTimeout(function (card, index, finished) {
dialog.move(card, index, 1);
if (finished) dialog.finishTime(1000);
}, time, cards[i], i, (i >= cards.length - 1));
time += 500;
}
};
// var dianhua = decadeUI.content.chooseGuanXing(player, cards, cards.length);
// dianhua.caption = '【点化】';
// game.broadcast(function(player, cards, callback){
// if (!window.decadeUI) return;
// var dianhua = decadeUI.content.chooseGuanXing(player, cards, cards.length);
// dianhua.caption = '【点化】';
// dianhua.callback = callback;
// }, player, cards, dianhua.callback);
// event.switchToAuto = function(){
// var cards = dianhua.cards[0].concat();
// var cheats = [];
// var judges;
// var next = player.getNext();
// var friend = player;
// if (event.triggername == 'phaseJieshuBegin') {
// friend = next;
// judges = friend.node.judges.childNodes;
// if (get.attitude(player, friend) < 0) friend = null;
// } else {
// judges = player.node.judges.childNodes;
// }
// if (judges.length > 0) cheats = decadeUI.get.cheatJudgeCards(cards, judges, friend != null);
// if (friend) {
// cards = decadeUI.get.bestValueCards(cards, friend);
// } else {
// cards.sort(function(a, b){
// return get.value(a, next) - get.value(b, next);
// });
// }
// cards = cheats.concat(cards);
// var time = 500;
// for (var i = 0; i < cards.length; i++) {
// setTimeout(function(card, index, finished){
// dianhua.move(card, index, 0);
// if (finished) dianhua.finishTime(1000);
// }, time, cards[i], i, i >= cards.length - 1);
// time += 500;
// }
// }
if (event.isOnline()) {
event.player.send(function () {
if (!window.decadeUI && decadeUI.eventDialog) _status.event.finish();
}, event.player);
event.player.wait();
decadeUI.game.wait();
} else if (!event.isMine()) {
event.switchToAuto();
}
'step 1'
player.popup(get.cnNumber(event.num1) + '上' + get.cnNumber(event.num2) + '下');
game.log(player, '将' + get.cnNumber(event.num1) + '张牌置于牌堆顶,' + get.cnNumber(event.num2) + '张牌置于牌堆底');
game.updateRoundNumber();
}
},
zongxuan: {
content: function () {
'step 0'
var cards = [];
for (var i = 0; i < trigger.cards2.length; i++) {
var card = trigger.cards2[i];
if (get.position(card, true) == 'd') {
cards.push(card);
clearTimeout(card.timeout);
card.classList.remove('removing');
// 防止因为限制结算速度,而导致牌提前进入弃牌堆
}
}
if (!cards.length) return;
var dialog = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length);
dialog.caption = '【纵玄】';
dialog.header1 = '弃牌堆';
dialog.header2 = '牌堆顶';
dialog.lockCardsOrder(0);
dialog.callback = function () { return this.cards[1].length > 0; };
game.broadcast(function (player, cards, callback) {
if (!window.decadeUI) return;
var zongxuan = decadeUI.content.chooseGuanXing(player, cards, cards.length);
dialog.caption = '【纵玄】';
dialog.header1 = '弃牌堆';
dialog.header2 = '牌堆顶';
dialog.lockCardsOrder(0);
dialog.callback = callback;
}, player, cards, dialog.callback);
event.switchToAuto = function () {
var parent = event.parent;
while (parent != null && parent.name != 'phaseDiscard') parent = parent.parent;
var cards = dialog.cards[0].concat();
var cheats = [];
var next = player.getNext();
var hasFriend = get.attitude(player, next) > 0;
if (parent) {
var hasZhiYan = player.hasSkill('zhiyan'); //如果有【直言】,AI 1000%肯定会用这个技能
var judges = next.node.judges.childNodes;
if (judges > 0 && hasZhiYan && cards.length > 1) {
cheats = decadeUI.get.cheatJudgeCards(cards, judges, hasFriend);
}
}
if (cards.length > 0) {
cards.sort(function (a, b) {
return get.value(b, player) - get.value(a, player);
});
cheats.splice(0, 0, cards.shift());
var cost;
for (var i = 0; i < cards.length; i++) {
if (hasFriend) {
if (get.value(cards[i], next) >= 5) cheats.push(cards[i]);
} else {
if (get.value(cards[i], next) < 5) cheats.push(cards[i]);
}
}
}
var time = 500;
for (var i = 0; i < cheats.length; i++) {
setTimeout(function (card, index, finished) {
dialog.move(card, index, 1);
if (finished) dialog.finishTime(cards.length <= 1 ? 250 : 1000);;
}, time, cheats[i], i, (i >= cheats.length - 1));
time += 500;
}
}
if (event.isOnline()) {
event.player.send(function () {
if (!window.decadeUI && decadeUI.eventDialog) _status.event.finish();
}, event.player);
event.player.wait();
decadeUI.game.wait();
} else if (!event.isMine()) {
event.switchToAuto();
}
'step 1'
var first = ui.cardPile.firstChild;
var cards = event.cards2;
for (var i = 0; i < cards.length; i++) {
ui.cardPile.insertBefore(cards[i], first);
}
cards = event.cards1;
for (var i = 0; i < cards.length; i++) {
ui.discardPile.appendChild(cards[i]);
}
game.log(player, '将' + get.cnNumber(event.num2) + '张牌置于牌堆顶');
}
},
identity_junshi: {
content: function () {
"step 0"
if (player.isUnderControl()) {
game.modeSwapPlayer(player);
}
var num = 3;
var cards = get.cards(num);
var guanxing = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length);
guanxing.caption = '【军师】';
game.broadcast(function (player, cards, callback) {
if (!window.decadeUI) return;
var guanxing = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length);
guanxing.caption = '【军师】';
guanxing.callback = callback;
}, player, cards, guanxing.callback);
event.switchToAuto = function () {
var cards = guanxing.cards[0].concat();
var cheats = [];
var judges = player.node.judges.childNodes;
if (judges.length) cheats = decadeUI.get.cheatJudgeCards(cards, judges, true);
if (cards.length) {
for (var i = 0; i >= 0 && i < cards.length; i++) {
if (get.value(cards[i], player) >= 5) {
cheats.push(cards[i]);
cards.splice(i, 1)
}
}
}
var time = 500;
for (var i = 0; i < cheats.length; i++) {
setTimeout(function (card, index, finished) {
guanxing.move(card, index, 0);
if (finished) guanxing.finishTime(1000);
}, time, cheats[i], i, (i >= cheats.length - 1) && cards.length == 0);
time += 500;
}
for (var i = 0; i < cards.length; i++) {
setTimeout(function (card, index, finished) {
guanxing.move(card, index, 1);
if (finished) guanxing.finishTime(1000);
}, time, cards[i], i, (i >= cards.length - 1));
time += 500;
}
}
if (event.isOnline()) {
event.player.send(function () {
if (!window.decadeUI && decadeUI.eventDialog) _status.event.finish();
}, event.player);
event.player.wait();
decadeUI.game.wait();
} else if (!event.isMine()) {
event.switchToAuto();
}
"step 1"
player.popup(get.cnNumber(event.num1) + '上' + get.cnNumber(event.num2) + '下');
game.log(player, '将' + get.cnNumber(event.num1) + '张牌置于牌堆顶,' + get.cnNumber(event.num2) + '张牌置于牌堆底');
game.updateRoundNumber();
}
},
wuxin: {
content: function () {
var num = get.population('qun');
if (player.hasSkill('huangjintianbingfu')) {
num += player.getExpansions('huangjintianbingfu').length;
}
var cards = get.cards(num);
var dialog = decadeUI.content.chooseGuanXing(player, cards, cards.length);
dialog.caption = '【悟心】';
game.broadcast(function (player, cards, callback) {
if (!window.decadeUI) return;
var dialog = decadeUI.content.chooseGuanXing(player, cards, cards.length);
dialog.caption = '【悟心】';
dialog.callback = callback;
}, player, cards, dialog.callback);
event.switchToAuto = function () {
var cards = dialog.cards[0].concat();
var cheats = [];
var next = player.getNext();
var friend = player;
var judges = friend.node.judges.childNodes;
if (judges.length > 0) cheats = decadeUI.get.cheatJudgeCards(cards, judges, friend != null);
if (friend) {
cards = decadeUI.get.bestValueCards(cards, friend);
} else {
cards.sort(function (a, b) {
return get.value(a, next) - get.value(b, next);
});
}
cards = cheats.concat(cards);
var time = 500;
for (var i = 0; i < cards.length; i++) {
setTimeout(function (card, index, finished) {
dialog.move(card, index, 0);
if (finished) dialog.finishTime(cards.length <= 1 ? 250 : 1000);;
}, time, cards[i], i, i >= cards.length - 1);
time += 500;
}
}
if (event.isOnline()) {
event.player.send(function () {
if (!window.decadeUI && decadeUI.eventDialog) _status.event.finish();
}, event.player);
event.player.wait();
decadeUI.game.wait();
} else if (!event.isMine()) {
event.switchToAuto();
}
}
},
luoying_discard: {
content: function () {
"step 0"
if (trigger.delay == false) game.delay();
"step 1"
var cards = [];
for (var i = 0; i < trigger.cards2.length; i++) {
var card = trigger.cards2[i];
if (get.suit(card, trigger.player) == 'club' && get.position(card, true) == 'd') {
cards.push(card);
clearTimeout(card.timeout);
card.classList.remove('removing');
// 防止因为限制结算速度,而导致牌提前进入弃牌堆
}
}
var dialog = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length, false);
dialog.caption = '【落英】';
dialog.header1 = '弃牌堆';
dialog.header2 = '获得牌';
dialog.tip = '请选择要获得的牌';
dialog.lockCardsOrder(0);
dialog.cards[1] = dialog.cards[0];
dialog.cards[0] = [];
dialog.update();
dialog.onMoved();
dialog.callback = function () { return true; };
game.broadcast(function (player, cards, callback) {
if (!window.decadeUI) return;
var dialog = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length, false);
dialog.caption = '【落英】';
dialog.header1 = '弃牌堆';
dialog.header2 = '获得牌';
dialog.tip = '请选择要获得的牌';
dialog.lockCardsOrder(0);
dialog.cards[1] = dialog.cards[0];
dialog.cards[0] = [];
dialog.update();
dialog.onMoved();
dialog.callback = callback;
}, player, cards, dialog.callback);
event.switchToAuto = function () {
var cards = dialog.cards[1].concat();
var time = 500;
if (cards.length) {
var discards = [];
for (var i = 0; i < cards.length; i++) {
if (get.value(cards[i]) < 0) {
discards.push(cards[i]);
}
}
if (discards.length) {
for (var i = 0; i < discards.length; i++) {
setTimeout(function (card, index, finished) {
dialog.move(card, index, 0);
if (finished) dialog.finishTime(1000);
}, time, discards[i], i, i >= discards.length - 1);
time += 500;
}
} else {
dialog.finishTime(1000);
}
} else {
dialog.finishTime(1000);
}
}
if (event.isOnline()) {
event.player.send(function () {
if (!window.decadeUI && decadeUI.eventDialog) _status.event.finish();
}, event.player);
event.player.wait();
decadeUI.game.wait();
} else if (!event.isMine()) {
event.switchToAuto();
}
"step 2"
game.cardsDiscard(event.cards1);
if (event.cards2) {
// player.logSkill(event.name);
player.gain(event.cards2, 'gain2', 'log');
}
}
},
luoying_judge: {
content: function () {
"step 0"
var cards = trigger.cards;
var dialog = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length, false);
dialog.caption = '【落英】';
dialog.header1 = '弃牌堆';
dialog.header2 = '获得牌';
dialog.tip = '请选择要获得的牌';
dialog.lockCardsOrder(0);
dialog.callback = function () { return true; };
game.broadcast(function (player, cards, callback) {
if (!window.decadeUI) return;
var dialog = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length, false);
dialog.caption = '【落英】';
dialog.header1 = '弃牌堆';
dialog.header2 = '获得牌';
dialog.tip = '请选择要获得的牌';
dialog.lockCardsOrder(0);
dialog.callback = callback;
}, player, cards, dialog.callback);
event.switchToAuto = function () {
var cards = dialog.cards[0].concat();
var time = 500;
for (var i = 0; i < cards.length; i++) {
if (get.value(cards[i], player) < 0) continue;
setTimeout(function (card, index, finished) {
dialog.move(card, index, 1);
if (finished) dialog.finishTime(cards.length <= 1 ? 250 : 1000);;
}, time, cards[i], i, i >= cards.length - 1);
time += 500;
}
}
if (event.isOnline()) {
event.player.send(function () {
if (!window.decadeUI && decadeUI.eventDialog) _status.event.finish();
}, event.player);
event.player.wait();
decadeUI.game.wait();
} else if (!event.isMine()) {
event.switchToAuto();
}
"step 1"
game.cardsDiscard(event.cards1);
if (event.cards2) {
// player.logSkill(event.name);
player.gain(event.cards2, 'gain2', 'log');
}
}
},
// huashen: {
// audio: 'huashen2',
// unique: true,
// forbid: ['guozhan'],
// init: function (player) {
// player.storage.huashen = {
// list: [],
// shown: [],
// owned: {},
// player: player,
// }
// },
// get: function (player, num) {
// if (typeof num != 'number') num = 1;
// var list = [];
// while (num--) {
// var name = player.storage.huashen.list.randomRemove();
// var skills = lib.character[name][3].slice(0);
// for (var i = 0; i < skills.length; i++) {
// var info = lib.skill[skills[i]];
// if (info.limited || info.juexingji || info.charlotte || info.zhuSkill || info.hiddenSkill || info.dutySkill) {
// skills.splice(i--, 1);
// }
// }
// player.storage.huashen.owned[name] = skills;
// // player.popup(name);
// game.log(player, '获得了一个化身');
// list.push(name);
// }
// if (player.isUnderControl(true)) {
// var cards = [];
// for (var i = 0; i < list.length; i++) {
// var cardname = 'huashen_card_' + list[i];
// lib.card[cardname] = {
// fullimage: true,
// image: 'character:' + list[i]
// }
// lib.translate[cardname] = lib.translate[list[i]];
// cards.push(game.createCard(cardname, '', ''));
// }
// player.$draw(cards);
// }
// },
// group: ['huashen1', 'huashen2'],
// intro: {
// content: function (storage, player) {
// var str = '';
// var slist = storage.owned;
// var list = [];
// for (var i in slist) {
// list.push(i);
// }
// if (list.length) {
// str += get.translation(list[0]);
// for (var i = 1; i < list.length; i++) {
// str += '、' + get.translation(list[i]);
// }
// }
// var skill = player.additionalSkills.huashen[0];
// if (skill) {
// str += '<p>当前技能:' + get.translation(skill);
// }
// return str;
// },
// mark: function (dialog, content, player) {
// var slist = content.owned;
// var list = [];
// for (var i in slist) {
// list.push(i);
// }
// if (list.length) {
// dialog.addSmall([list, 'character']);
// }
// if (!player.isUnderControl(true)) {
// for (var i = 0; i < dialog.buttons.length; i++) {
// if (!content.shown.includes(dialog.buttons[i].link)) {
// dialog.buttons[i].node.group.remove();
// dialog.buttons[i].node.hp.remove();
// dialog.buttons[i].node.intro.remove();
// dialog.buttons[i].node.name.innerHTML = '未<br>知';
// dialog.buttons[i].node.name.dataset.nature = '';
// dialog.buttons[i].style.background = '';
// dialog.buttons[i]._nointro = true;
// dialog.buttons[i].classList.add('menubg');
// }
// }
// }
// if (player.additionalSkills.huashen) {
// var skill = player.additionalSkills.huashen[0];
// if (skill) {
// dialog.add('<div><div class="skill">【' + get.translation(skill) +
// '】</div><div>' + lib.translate[skill + '_info'] + '</div></div>');
// }
// }
// }
// },
// setup: function (player, gain) {
// for (var i in lib.character) {
// if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) continue;
// var add = false;
// for (var j = 0; j < lib.character[i][3].length; j++) {
// var info = lib.skill[lib.character[i][3][j]];
// if (!info) {
// continue;
// }
// if (!info.limited && !info.juexingji && !info.charlotte && !info.zhuSkill && !info.hiddenSkill && !info.dutySkill) {
// add = true; break;
// }
// }
// if (add) {
// player.storage.huashen.list.push(i);
// }
// }
// for (var i = 0; i < game.players.length; i++) {
// player.storage.huashen.list.remove([game.players[i].name]);
// player.storage.huashen.list.remove([game.players[i].name1]);
// player.storage.huashen.list.remove([game.players[i].name2]);
// }
// player.storage.huasheninited = true;
// if (gain) {
// player.markSkill('huashen');
// lib.skill.huashen.get(player, 2);
// _status.event.trigger('huashenStart');
// }
// }
// },
// huashen1: {
// trigger: { global: 'gameStart', player: ['enterGame', 'damageBefore'] },
// forced: true,
// popup: false,
// //priority:10,
// filter: function (event, player) {
// return !player.storage.huasheninited;
// },
// content: function () {
// lib.skill.huashen.setup(player, trigger.name != 'damage');
// }
// },
// huashen2: {
// audio: 2,
// trigger: { player: ['phaseBegin', 'phaseEnd', 'huashenStart'] },
// filter: function (event, player, name) {
// //if(name=='phaseBegin'&&game.phaseNumber==1) return false;
// return true;
// },
// //priority:50,
// forced: true,
// //popup:false,
// content: function () {
// 'step 0'
// if (get.is.empty(player.storage.huashen.owned)) {
// if (!player.storage.huasheninited) {
// lib.skill.huashen.setup(player, false);
// }
// event.finish();
// return;
// }
// event.trigger('playercontrol');
// 'step 1'
// var slist = player.storage.huashen.owned;
// var list = [];
// for (var i in slist) {
// list.push(i);
// }
// event.switchToAuto = function () {
// var currentbutton = event.dialog.querySelector('.selected.button');
// if (!currentbutton) {
// currentbutton = event.dialog.buttons[0];
// currentbutton.classList.add('selected');
// }
// event.clickControl(player.storage.huashen.owned[currentbutton.link].randomGet());
// }
// event.clickControl = function (link, type) {
// if (link != 'cancel2') {
// var currentname;
// if (type == 'ai') {
// currentname = event.currentname;
// }
// else {
// currentname = event.dialog.querySelector('.selected.button').link;
// }
// player.storage.huashen.shown.add(currentname);
// if (!player.additionalSkills.huashen || !player.additionalSkills.huashen.includes(link)) {
// player.addAdditionalSkill('huashen', link);
// //player.logSkill('huashen2');
// player.flashAvatar('huashen', currentname);
// game.log(player, '获得技能', '【' + get.translation(link) + '】');
// player.popup(link);
// if (event.dialog && event.dialog.buttons) {
// for (var i = 0; i < event.dialog.buttons.length; i++) {
// if (event.dialog.buttons[i].classList.contains('selected')) {
// var name = event.dialog.buttons[i].link;
// player.sex = lib.character[name][0];
// player.group = lib.character[name][1];
// // player.node.identity.style.backgroundColor=get.translation(player.group+'Color');
// break;
// }
// }
// }
// // if(event.triggername=='phaseZhunbeiBegin'){
// // (function(){
// // var skills=[link];
// // var list=[];
// // game.expandSkills(skills);
// // var triggerevent=event._trigger;
// // var name='phaseZhunbeiBegin';
// // for(i=0;i<skills.length;i++){
// // var trigger=get.info(skills[i]).trigger;
// // if(trigger){
// // var add=false;
// // if(player==triggerevent.player&&trigger.player){
// // if(typeof trigger.player=='string'){
// // if(trigger.player==name) add=true;
// // }
// // else if(trigger.player.includes(name)) add=true;
// // }
// // if(trigger.global){
// // if(typeof trigger.global=='string'){
// // if(trigger.global==name) add=true;
// // }
// // else if(trigger.global.includes(name)) add=true;
// // }
// // if(add&&player.isOut()==false) list.push(skills[i]);
// // }
// // }
// // for(var i=0;i<list.length;i++){
// // game.createTrigger('phaseZhunbeiBegin',list[i],player,triggerevent);
// // }
// // }());
// // }
// }
// }
// if (type != 'ai') {
// // ui.auto.show();
// event.dialog.close();
// event.control.close();
// game.resume();
// }
// };
// if (event.isMine()) {
// event.dialog = ui.create.dialog('选择获得一项技能', [list, 'character']);
// for (var i = 0; i < event.dialog.buttons.length; i++) {
// event.dialog.buttons[i].classList.add('pointerdiv');
// }
// if (trigger.name == 'game') {
// event.control = ui.create.control();
// }
// else {
// event.control = ui.create.control(['cancel2']);
// }
// event.control.custom = event.clickControl;
// event.control.replaceTransition = false;
// // ui.auto.hide();
// game.pause();
// for (var i = 0; i < event.dialog.buttons.length; i++) {
// event.dialog.buttons[i].classList.add('selectable');
// }
// event.custom.replace.button = function (button) {
// if (button.classList.contains('selected')) {
// button.classList.remove('selected');
// if (trigger.name == 'game') {
// event.control.style.opacity = 0;
// }
// else {
// event.control.replace(['cancel2']);
// }
// }
// else {
// for (var i = 0; i < event.dialog.buttons.length; i++) {
// event.dialog.buttons[i].classList.remove('selected');
// }
// button.classList.add('selected');
// event.control.replace(slist[button.link]);
// if (trigger.name == 'game' && getComputedStyle(event.control).opacity == 0) {
// event.control.style.transition = 'opacity 0.5s';
// ui.refresh(event.control);
// event.control.style.opacity = 1;
// event.control.style.transition = '';
// ui.refresh(event.control);
// }
// else {
// event.control.style.opacity = 1;
// }
// }
// event.control.custom = event.clickControl;
// }
// event.custom.replace.window = function () {
// for (var i = 0; i < event.dialog.buttons.length; i++) {
// if (event.dialog.buttons[i].classList.contains('selected')) {
// event.dialog.buttons[i].classList.remove('selected');
// if (trigger.name == 'game') {
// event.control.style.opacity = 0;
// }
// else {
// event.control.replace(['cancel2']);
// }
// event.control.custom = event.clickControl;
// return;
// }
// }
// }
// }
// else {
// var skills = [];
// var map = {};
// for (var i = 0; i < list.length; i++) {
// var sub = player.storage.huashen.owned[list[i]];
// skills.addArray(sub);
// for (var j = 0; j < sub.length; j++) {
// map[sub[j]] = list[i];
// }
// }
// var add = player.additionalSkills.huashen;
// if (typeof add == 'string') {
// add = [add];
// }
// if (Array.isArray(add)) {
// for (var i = 0; i < add.length; i++) {
// skills.remove(add[i]);
// }
// }
// var cond = 'out';
// if (event.triggername == 'phaseZhunbeiBegin') {
// cond = 'in';
// }
// skills.randomSort();
// skills.sort(function (a, b) {
// return get.skillRank(b, cond) - get.skillRank(a, cond);
// });
// var choice = skills[0];
// if (choice) {
// event.currentname = map[choice];
// event.clickControl(choice, 'ai');
// }
// }
// }
// },
};
const inheritSkillMap = {
xz_xunxun: {
content: skillMap.xunxun.content
},
reluoying_discard: {
content: skillMap.luoying_discard.content
},
reluoying_judge: {
content: skillMap.luoying_judge.content
},
nk_shekong: {
content: function () {
'step 0'
event.cardsx = cards.slice(0);
var num = get.cnNumber(cards.length);
var trans = get.translation(player);
var prompt = ('弃置' + num + '张牌,然后' + trans + '摸一张牌');
if (cards.length > 1) prompt += (';或弃置一张牌,然后' + trans + '摸' + num + '张牌');
var next = target.chooseToDiscard(prompt, 'he', true);
next.numx = cards.length;
next.selectCard = function () {
if (ui.selected.cards.length > 1) return _status.event.numx;
return [1, _status.event.numx];
};
next.complexCard = true;
next.ai = function (card) {
if (ui.selected.cards.length == 0 || (_status.event.player.countCards('he',
function (cardxq) {
return get.value(cardxq) < 7;
}) >= _status.event.numx)) return 7 - get.value(card);
return - 1;
};
'step 1'
if (result.bool) {
if (result.cards.length == cards.length) player.draw();
else player.draw(cards.length);
event.cardsx.addArray(result.cards);
for (var i = 0; i < event.cardsx.length; i++) {
if (get.position(event.cardsx[i]) != 'd') event.cardsx.splice(i--, 1);
}
} else event.finish();
'step 2'
if (event.cardsx.length) {
var cards = event.cardsx;
var dialog = decadeUI.content.chooseGuanXing(player, cards, cards.length);
dialog.caption = '【设控】';
game.broadcast(function (player, cards, callback) {
if (!window.decadeUI) return;
var dialog = decadeUI.content.chooseGuanXing(player, cards, cards.length);
dialog.caption = '【设控】';
dialog.callback = callback;
}, player, cards, dialog.callback);
event.switchToAuto = function () {
var cards = dialog.cards[0].concat();
var cheats = [];
var judges;
var next = player.getNext();
var friend = (get.attitude(player, next) < 0) ? null : next;
judges = next.node.judges.childNodes;
if (judges.length > 0) cheats = decadeUI.get.cheatJudgeCards(cards, judges, friend != null);
if (friend) {
cards = decadeUI.get.bestValueCards(cards, friend);
} else {
cards.sort(function (a, b) {
return get.value(a, next) - get.value(b, next);
});
}
cards = cheats.concat(cards);
var time = 500;
for (var i = 0; i < cards.length; i++) {
setTimeout(function (card, index, finished) {
dialog.move(card, index, 0);
if (finished) dialog.finishTime(cards.length <= 1 ? 250 : 1000);;
}, time, cards[i], i, i >= cards.length - 1);
time += 500;
}
}
if (event.isOnline()) {
event.player.send(function () {
if (!window.decadeUI && decadeUI.eventDialog) _status.event.finish();
}, event.player);
event.player.wait();
decadeUI.game.wait();
} else if (!event.isMine()) {
event.switchToAuto();
}
} else event.finish();
}
},
kamome_huanmeng: {
content: function () {
"step 0"
if (player.isUnderControl()) {
game.modeSwapPlayer(player);
}
var num = 1 + player.countCards('e');;
var cards = get.cards(num);
var guanxing = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length);
guanxing.caption = '【幻梦】';
game.broadcast(function (player, cards, callback) {
if (!window.decadeUI) return;
var guanxing = decadeUI.content.chooseGuanXing(player, cards, cards.length, null, cards.length);
guanxing.caption = '【幻梦】';
guanxing.callback = callback;
}, player, cards, guanxing.callback);
event.switchToAuto = function () {
var cards = guanxing.cards[0].concat();
var cheats = [];
var judges = player.node.judges.childNodes;
if (judges.length) cheats = decadeUI.get.cheatJudgeCards(cards, judges, true);
if (cards.length) {
for (var i = 0; i >= 0 && i < cards.length; i++) {
if (get.value(cards[i], player) >= 5) {
cheats.push(cards[i]);
cards.splice(i, 1)
}
}
}
var time = 500;
for (var i = 0; i < cheats.length; i++) {
setTimeout(function (card, index, finished) {
guanxing.move(card, index, 0);
if (finished) guanxing.finishTime(1000);
}, time, cheats[i], i, (i >= cheats.length - 1) && cards.length == 0);
time += 500;
}
for (var i = 0; i < cards.length; i++) {
setTimeout(function (card, index, finished) {
guanxing.move(card, index, 1);
if (finished) guanxing.finishTime(1000);
}, time, cards[i], i, (i >= cards.length - 1));
time += 500;
}
}
if (event.isOnline()) {
event.player.send(function () {
if (!window.decadeUI && decadeUI.eventDialog) _status.event.finish();
}, event.player);
event.player.wait();
decadeUI.game.wait();
} else if (!event.isMine()) {
event.switchToAuto();
}
"step 1"
player.popup(get.cnNumber(event.num1) + '上' + get.cnNumber(event.num2) + '下');
game.log(player, '将' + get.cnNumber(event.num1) + '张牌置于牌堆顶,' + get.cnNumber(event.num2) + '张牌置于牌堆底');
game.updateRoundNumber()
}
},
// xinbenxi: {
// content: function () {
// "step 0"
// event.videoId = lib.status.videoId++;
// var func = function (card, id, bool) {
// var list = ['为XXX多指定一个目标', '令XXX无视防具', '令XXX不可被抵消', '当XXX造成伤害时摸一张牌',];
// var choiceList = ui.create.dialog('【奔袭】:请选择一至两项', 'forcebutton');
// choiceList.videoId = id;
// for (var i = 0; i < list.length; i++) {
// list[i] = list[i].replace(/XXX/g, card);
// var str = '<div class="popup text" style="width:calc(100% - 10px);display:inline-block">';
// if (i == 0 && !bool) str += '<div style="opacity:0.5">';
// str += list[i];
// if (i == 0 && !bool) str += '</div>';
// str += '</div>';
// var next = choiceList.add(str);
// next.firstChild.addEventListener(lib.config.touchscreen ? 'touchend' : 'click', ui.click.button);
// next.firstChild.link = i;
// for (var j in lib.element.button) {
// next[j] = lib.element.button[j];
// }
// choiceList.buttons.add(next.firstChild);
// }
// return choiceList;
// };
// if (player.isOnline2()) {
// player.send(func, get.translation(trigger.card), event.videoId, lib.skill.xinbenxi.filterx(trigger, player));
// }
// event.dialog = func(get.translation(trigger.card), event.videoId, lib.skill.xinbenxi.filterx(trigger, player));
// if (player != game.me || _status.auto) {
// event.dialog.style.display = 'none';
// }
// var next = player.chooseButton();
// next.set('dialog', event.videoId);
// next.set('forced', true);
// next.set('selectButton', [1, 2]);
// next.set('filterButton',
// function (button) {
// if (button.link == 0) {
// return _status.event.bool1;
// };
// return true;
// });
// next.set('bool1', lib.skill.xinbenxi.filterx(trigger, player));
// next.set('ai',
// function (button) {
// var player = _status.event.player;
// var event = _status.event.getTrigger();
// switch (button.link) {
// case 0:
// {
// if (game.hasPlayer(function (current) {
// return lib.filter.targetEnabled2(event.card, player, current) && !event.targets.includes(current) && get.effect(current, event.card, player, player) > 0;
// })) return 1.6 + Math.random();
// return 0;
// }
// case 1:
// {
// if (event.targets.filter(function (current) {
// var eff1 = get.effect(current, event.card, player, player);
// player._xinbenxi_ai = true;
// var eff2 = get.effect(current, event.card, player, player);
// delete player._xinbenxi_ai;
// return eff1 > eff2;
// }).length) return 1.9 + Math.random();
// return Math.random();
// }
// case 2:
// {
// var num = 1.3;
// if (event.card.name == 'sha' && event.targets.filter(function (current) {
// if (current.mayHaveShan() && get.attitude(player, current) <= 0) {
// if (current.hasSkillTag('useShan')) num = 1.9;
// return true;
// }
// return false;
// }).length) return num + Math.random();
// return 0.5 + Math.random();
// }
// case 3:
// {
// return (get.tag(event.card, 'damage') || 0) + Math.random();
// }
// }
// });
// "step 1"
// if (player.isOnline2()) {
// player.send('closeDialog', event.videoId);
// }
// event.dialog.close();
// var map = [function (trigger, player, event) {
// player.chooseTarget('请选择' + get.translation(trigger.card) + '的额外目标', true,
// function (card, player, target) {
// var player = _status.event.player;
// if (_status.event.targets.includes(target)) return false;
// return lib.filter.targetEnabled2(_status.event.card, player, target);
// }).set('targets', trigger.targets).set('card', trigger.card).set('ai',
// function (target) {
// var trigger = _status.event.getTrigger();
// var player = _status.event.player;
// return get.effect(target, trigger.card, player, player);
// });
// },
// function (trigger, player, event) {
// player.storage.xinbenxi_unequip.add(trigger.card);
// },
// function (trigger, player, event) {
// player.storage.xinbenxi_directHit.add(trigger.card);
// trigger.nowuxie = true;
// trigger.customArgs.
// default.directHit2 = true;
// },
// function (trigger, player, event) {
// player.storage.xinbenxi_damage.add(trigger.card);
// }];
// for (var i = 0; i < result.links.length; i++) {
// game.log(player, '选择了', '#g【奔袭】', '的', '#y选项' + get.cnNumber(result.links[i] + 1, true));
// map[result.links[i]](trigger, player, event);
// }
// if (!result.links.includes(0)) event.finish();
// "step 2"
// if (result.targets) {
// player.line(result.targets);
// trigger.targets.addArray(result.targets);
// }
// }
// }
};
if (!_status.connectMode) {
Object.keys(skillMap).forEach(key => {
const skill = lib.skill[key];
if (!skill) return;
const decadeUISkill = skillMap[key];
Object.keys(decadeUISkill).forEach(subKey => skill[subKey] = decadeUISkill[subKey]);
});
Object.keys(inheritSkillMap).forEach(key => {
const skill = lib.skill[key];
if (!skill) return;
const decadeUIInheritSkill = inheritSkillMap[key];
Object.keys(decadeUIInheritSkill).forEach(subKey => skill[subKey] = decadeUIInheritSkill[subKey]);
});
}
const onlineSkillMap = {
xinfu_pingcai: {
contentx: function () {
"step 0"
event.pingcai_delayed = true;
var name = lib.skill.xinfu_pingcai_backup.takara;
event.cardname = name;
event.videoId = lib.status.videoId++;
if (player.isUnderControl()) {
game.swapPlayerAuto(player);
}
var switchToAuto = function () {
game.pause();
game.countChoose();
setTimeout(function () {
_status.imchoosing = false;
event._result = {
bool: true,
};
game.resume();
}, 9000);
};
var createDialog = function (player, id, name) {
if (player == game.me) return;
var dialog = ui.create.dialog('forcebutton', 'hidden');
var str = get.translation(player) + '正在擦拭宝物上的灰尘…';
var canSkip = (!_status.connectMode);
if (canSkip) str += '<br>(点击宝物可以跳过等待AI操作)';
dialog.textPrompt = dialog.add('<div class="text center">' + str + '</div>');
dialog.classList.add('fixed');
dialog.classList.add('scroll1');
dialog.classList.add('scroll2');
dialog.classList.add('fullwidth');
dialog.classList.add('fullheight');
dialog.classList.add('noupdate');
dialog.videoId = id;
var canvas2 = document.createElement('canvas');
dialog.canvas_viewer = canvas2;
dialog.appendChild(canvas2);
canvas2.classList.add('grayscale');
canvas2.style.position = "absolute";
canvas2.style.width = '249px';
canvas2.style.height = '249px';
canvas2.style['border-radius'] = '6px';
canvas2.style.left = "calc(50% - 125px)";
canvas2.style.top = "calc(50% - 125px)";
canvas2.width = 249;
canvas2.height = 249;
canvas2.style.border = '3px solid';
var ctx2 = canvas2.getContext('2d');
var img = new Image();
img.src = lib.assetURL + 'image/card/' + name + '.png';
img.onload = function () {
ctx2.drawImage(this, 0, 0, this.width, this.height, 0, 0, canvas2.width, canvas2.height);
}
if (canSkip) {
var skip = function () {
if (event.pingcai_delayed) {
delete event.pingcai_delayed;
event._result = {
bool: true,
};
game.resume();
canvas2.removeEventListener(lib.config.touchscreen ? 'touchend' : 'click', skip);
}
};
canvas2.addEventListener(lib.config.touchscreen ? 'touchend' : 'click', skip);
}
dialog.open();
};
var chooseButton = function (id, name) {
var event = _status.event;
_status.xinfu_pingcai_finished = false;
var dialog = ui.create.dialog('forcebutton', 'hidden');
dialog.textPrompt = dialog.add('<div class="text center">擦拭掉宝物上的灰尘吧!</div>');
event.switchToAuto = function () {
event._result = {
bool: _status.xinfu_pingcai_finished,
};
game.resume();
_status.imchoosing = false;
_status.xinfu_pingcai_finished = true;
};
dialog.classList.add('fixed');
dialog.classList.add('scroll1');
dialog.classList.add('scroll2');
dialog.classList.add('fullwidth');
dialog.classList.add('fullheight');
dialog.classList.add('noupdate');
dialog.videoId = id;
var canvas = document.createElement('canvas');
var canvas2 = document.createElement('canvas');
dialog.appendChild(canvas2);
dialog.appendChild(canvas);
canvas.style.position = "absolute";
canvas.style.width = '249px';
canvas.style.height = '249px';
canvas.style['border-radius'] = '6px';
canvas.style.left = "calc(50% - 125px)";
canvas.style.top = "calc(50% - 125px)";
canvas.width = 249;
canvas.height = 249;
canvas.style.border = '3px solid';
canvas2.style.position = "absolute";
canvas2.style.width = '249px';
canvas2.style.height = '249px';
canvas2.style['border-radius'] = '6px';
canvas2.style.left = "calc(50% - 125px)";
canvas2.style.top = "calc(50% - 125px)";
canvas2.width = 249;
canvas2.height = 249;
canvas2.style.border = '3px solid';
var ctx = canvas.getContext('2d');
var ctx2 = canvas2.getContext('2d');
var img = new Image();
img.src = lib.assetURL + 'image/card/' + name + '.png';
img.onload = function () {
ctx2.drawImage(this, 0, 0, this.width, this.height, 0, 0, canvas2.width, canvas2.height);
}
ctx.fillStyle = 'lightgray';
ctx.fillRect(0, 0, canvas.width, canvas.height);
canvas.onmousedown = function (ev) {
//if(_status.xinfu_pingcai_finished) return;
canvas.onmousemove = function (e) {
if (_status.xinfu_pingcai_finished) return;
ctx.beginPath();
ctx.clearRect(e.offsetX / game.documentZoom - 16, e.offsetY / game.documentZoom - 16, 32, 32);
var data = ctx.getImageData(canvas.width * 0.1, canvas.height * 0.1, canvas.width * 0.8, canvas.height * 0.8).data;
var sum = 0;
for (var i = 3; i < data.length; i += 4) {
if (data[i] == 0) {
sum++;
}
}
if (sum >= (canvas.width * canvas.height) * 0.6) {
//ctx.clearRect(0,0,canvas.width,canvas.height);
if (!_status.xinfu_pingcai_finished) {
_status.xinfu_pingcai_finished = true;
event.switchToAuto();
}
}
}
}
canvas.ontouchstart = function (ev) {
//if(_status.xinfu_pingcai_finished) return;
canvas.ontouchmove = function (e) {
if (_status.xinfu_pingcai_finished) return;
ctx.beginPath();
var rect = canvas.getBoundingClientRect();
var X = ((e.touches[0].clientX / game.documentZoom - rect.left) / rect.width * canvas.width);
var Y = ((e.touches[0].clientY / game.documentZoom - rect.top) / rect.height * canvas.height);
ctx.clearRect(X - 16, Y - 16, 32, 32);
var data = ctx.getImageData(canvas.width * 0.1, canvas.height * 0.1, canvas.width * 0.8, canvas.height * 0.8).data;
var sum = 0;
for (var i = 3; i < data.length; i += 4) {
if (data[i] == 0) {
sum++;
}
}
if (sum >= (canvas.width * canvas.height) * 0.6) {
if (!_status.xinfu_pingcai_finished) {
_status.xinfu_pingcai_finished = true;
event.switchToAuto();
}
}
}
}
canvas.onmouseup = function (ev) {
canvas.onmousemove = null;
}
canvas.ontouchend = function (ev) {
canvas.ontouchmove = null;
}
dialog.open();
game.pause();
game.countChoose();
};
//event.switchToAuto=switchToAuto;
game.broadcastAll(createDialog, player, event.videoId, name);
if (event.isMine()) {
chooseButton(event.videoId, name);
}
else if (event.isOnline()) {
event.player.send(chooseButton, event.videoId, name);
event.player.wait();
game.pause();
}
else {
switchToAuto();
}
"step 1"
var result = event.result || result;
if (!result) result = { bool: false };
event._result = result;
game.broadcastAll(function (id, result, player) {
_status.xinfu_pingcai_finished = true;
var dialog = get.idDialog(id);
if (dialog) {
dialog.textPrompt.innerHTML = '<div class="text center">' + (get.translation(player) + '擦拭宝物' + (result.bool ? '成功!' : '失败…')) + '</div>';
if (result.bool && dialog.canvas_viewer) dialog.canvas_viewer.classList.remove('grayscale');
}
if (!_status.connectMode) delete event.pingcai_delayed;
}, event.videoId, result, player);
game.delay(2.5);
"step 2"
game.broadcastAll('closeDialog', event.videoId);
if (result.bool) {
player.logSkill('pcaudio_' + event.cardname);
event.insert(lib.skill.xinfu_pingcai[event.cardname], {
player: player,
});
}
}
}
};
Object.keys(onlineSkillMap).forEach(key => {
const skill = lib.skill[key];
if (!skill) return;
const decadeUIOnlineSkill = onlineSkillMap[key];
Object.keys(decadeUIOnlineSkill).forEach(subKey => skill[subKey] = decadeUIOnlineSkill[subKey]);
});
});