noname/mode/identity.js

4943 lines
157 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
game.import("mode", function (lib, game, ui, get, ai, _status) {
return {
name: "identity",
start: function () {
"step 0";
if (!lib.config.new_tutorial) {
ui.arena.classList.add("only_dialog");
}
_status.mode = get.config("identity_mode");
if (_status.brawl && _status.brawl.submode) {
_status.mode = _status.brawl.submode;
}
event.replacePile = function () {
var list = [
"shengdong",
"qijia",
"caomu",
"jinchan",
"zengbin",
"fulei",
"qibaodao",
"zhungangshuo",
"lanyinjia",
];
var map = {
shunshou: "shengdong",
jiedao: "qijia",
bingliang: "caomu",
wuxie: "jinchan",
wuzhong: "zengbin",
wugu: "zengbin",
shandian: "fulei",
qinggang: "qibaodao",
qinglong: "zhungangshuo",
bagua: "lanyinjia",
};
for (var i = 0; i < lib.card.list.length; i++) {
var name = lib.card.list[i][2];
if (list.includes(name)) {
lib.card.list.splice(i--, 1);
} else if (map[name]) {
lib.card.list[i][2] = map[name];
lib.card.list[i]._replaced = true;
}
}
};
"step 1";
var playback = localStorage.getItem(lib.configprefix + "playback");
if (playback) {
ui.create.me();
ui.arena.style.display = "none";
ui.system.style.display = "none";
_status.playback = playback;
localStorage.removeItem(lib.configprefix + "playback");
var store = lib.db.transaction(["video"], "readwrite").objectStore("video");
store.get(parseInt(playback)).onsuccess = function (e) {
if (e.target.result) {
game.playVideoContent(e.target.result.video);
} else {
alert("播放失败:找不到录像");
game.reload();
}
};
event.finish();
} else if (!_status.connectMode) {
if (_status.mode == "zhong") {
if (get.config("zhong_card")) {
event.replacePile();
}
game.prepareArena(8);
} else if (_status.mode == "purple") {
game.prepareArena(8);
} else {
game.prepareArena();
}
if (!lib.config.new_tutorial) {
game.delay();
}
}
"step 2";
if (!lib.config.new_tutorial) {
_status.new_tutorial = true;
lib.init.onfree();
game.saveConfig("version", lib.version);
var clear = function () {
ui.dialog.close();
while (ui.controls.length) ui.controls[0].close();
};
var clear2 = function () {
ui.auto.show();
ui.arena.classList.remove("only_dialog");
};
var step1 = function () {
ui.create.dialog("欢迎来到无名杀,是否进入新手向导?");
game.saveConfig("new_tutorial", true);
ui.dialog.add('<div class="text center">跳过后,你可以在选项-其它中重置新手向导');
ui.auto.hide();
ui.create.control("跳过向导", function () {
clear();
clear2();
game.resume();
// lib.cheat.cfg(); // owidgets
});
ui.create.control("继续", step2);
};
var step2 = function () {
if (!lib.config.phonelayout) {
clear();
ui.create.dialog(
"如果你在使用手机,可能会觉得按钮有点小" + ",将布局改成移动可以使按钮变大"
);
ui.dialog.add('<div class="text center">你可以在选项-外观-布局中更改此设置');
var lcontrol = ui.create.control("使用移动布局", function () {
if (lib.config.phonelayout) {
ui.control.firstChild.firstChild.innerHTML = "使用移动布局";
game.saveConfig("phonelayout", false);
lib.init.layout("mobile");
} else {
ui.control.firstChild.firstChild.innerHTML = "使用默认布局";
game.saveConfig("phonelayout", true);
lib.init.layout("mobile");
}
});
ui.create.control("继续", step3);
} else {
step3();
}
};
var step3 = function () {
if (lib.config.touchscreen) {
clear();
ui.create.dialog("触屏模式中,下划可以显示菜单,上划可以切换托管,双指单击可以暂停");
ui.dialog.add('<div class="text center">你可以在选项-通用-中更改手势设置');
ui.create.control("继续", step4);
} else {
step4();
}
};
var step4 = lib.genAsync(function* () {
clear();
ui.window.classList.add("noclick_important");
ui.click.configMenu();
ui.control.classList.add("noclick_click_important");
ui.control.style.top = "calc(100% - 105px)";
yield new Promise((resolve) => ui.create.control("在菜单中,可以进行各项设置", resolve));
ui.click.menuTab("选项");
yield new Promise((resolve) =>
ui.controls[0].replace("如果你感到游戏较卡,可以开启流畅模式", resolve)
);
yield new Promise((resolve) =>
ui.controls[0].replace("在技能一栏中,可以设置自动发动或双将禁配的技能", resolve)
);
ui.click.menuTab("武将");
yield new Promise((resolve) =>
ui.controls[0].replace("在武将或卡牌一栏中,单击武将/卡牌可以将其禁用", resolve)
);
ui.click.menuTab("战局");
yield new Promise((resolve) =>
ui.controls[0].replace("在战局中可以输入游戏命令,或者管理录像", resolve)
);
ui.click.menuTab("帮助");
yield new Promise((resolve) =>
ui.controls[0].replace("在帮助中,可以检查更新和下载素材", resolve)
);
ui.click.configMenu();
ui.window.classList.remove("noclick_important");
ui.control.classList.remove("noclick_click_important");
ui.control.style.top = "";
step5();
});
var step5 = function () {
clear();
ui.create.dialog("如果还有其它问题,欢迎来到百度无名杀吧进行交流");
ui.create.control("完成", function () {
clear();
clear2();
game.resume();
});
};
game.pause();
step1();
} else {
if (!_status.connectMode) {
game.showChangeLog();
}
}
"step 3";
if (typeof _status.new_tutorial == "function") {
_status.new_tutorial();
}
delete _status.new_tutorial;
if (_status.connectMode) {
game.waitForPlayer(function () {
if (lib.configOL.identity_mode == "zhong" || lib.configOL.identity_mode == "purple") {
lib.configOL.number = 8;
}
});
}
"step 4";
var yearLimitCheck = () => {
var next = game.createEvent("year_limit_pop", false);
next.setContent(function () {
"step 0";
var str = get.cnNumber(game.shuffleNumber + 1, true);
game.me.$fullscreenpop(`${str}`, "thunder");
game.log("游戏进入了", `#y第${str}`);
if (game.shuffleNumber + 1 < game.countPlayer2()) event.finish();
else game.delay(2);
"step 1";
game.me.$fullscreenpop("年份已到", "metal");
game.log("年份已到,主忠方判定为胜利");
game.delay(2);
"step 2";
game.over(
game.me.identity == "zhu" ||
game.me.identity == "zhong" ||
game.me.identity == "mingzhong" ||
(game.me.identity == "commoner" && game.me.isIn())
);
});
};
if (_status.connectMode) {
_status.mode = lib.configOL.identity_mode;
if (_status.mode == "zhong") {
lib.configOL.number = 8;
if (lib.configOL.zhong_card) {
event.replacePile();
}
} else if (_status.mode == "purple") {
lib.configOL.number = 8;
} else if (_status.mode == "normal") {
if (lib.configOL.enable_commoner || lib.configOL.double_nei) {
var identity = lib.configOL.enable_commoner ? "commoner" : "nei";
for (var i = 1; i < lib.config.mode_config.identity.identity.length; i++) {
var list = lib.config.mode_config.identity.identity[i];
var toReplace;
if (list.filter((i) => i == "nei").length >= 2) toReplace = "nei";
else if (
list.filter((i) => i == "zhong").length >
list.filter((i) => i == "fan").length / 2
)
toReplace = "zhong";
else toReplace = "fan";
list.remove(toReplace);
list.push(identity);
}
game.broadcast(
(identityList) => (lib.config.mode_config.identity.identity = identityList),
lib.config.mode_config.identity.identity
);
}
}
if (lib.configOL.number < 2) {
lib.configOL.number = 2;
}
if (_status.mode != "purple" && lib.configOL.enable_year_limit) {
lib.onwash.push(yearLimitCheck);
}
game.randomMapOL();
} else {
if (_status.mode == "normal" && (get.config("enable_commoner") || get.config("double_nei"))) {
var identity = get.config("enable_commoner") ? "commoner" : "nei";
for (var i = 1; i < lib.config.mode_config.identity.identity.length; i++) {
var list = lib.config.mode_config.identity.identity[i];
var toReplace;
if (list.filter((i) => i == "nei").length >= 2) toReplace = "nei";
else if (
list.filter((i) => i == "zhong").length >
list.filter((i) => i == "fan").length / 2
)
toReplace = "zhong";
else toReplace = "fan";
list.remove(toReplace);
list.push(identity);
}
}
if (_status.mode != "purple" && get.config("enable_year_limit")) {
lib.onwash.push(yearLimitCheck);
}
for (var i = 0; i < game.players.length; i++) {
game.players[i].getId();
}
if (_status.brawl && _status.brawl.chooseCharacterBefore) {
_status.brawl.chooseCharacterBefore();
}
game.chooseCharacter();
}
"step 5";
if (ui.coin) {
_status.coinCoeff = get.coinCoeff([game.me.name]);
}
if (game.players.length == 2) {
game.showIdentity(true);
var map = {};
for (var i in lib.playerOL) {
map[i] = lib.playerOL[i].identity;
}
game.broadcast(function (map) {
for (var i in map) {
lib.playerOL[i].identity = map[i];
lib.playerOL[i].setIdentity();
lib.playerOL[i].ai.shown = 1;
}
}, map);
} else {
for (var i = 0; i < game.players.length; i++) {
game.players[i].ai.shown = 0;
}
}
var stratagemMode = _status.mode == "stratagem";
if (stratagemMode) {
var beginner;
if (_status.cheat_seat) {
var seat = _status.cheat_seat.link;
beginner = seat == 0 ? game.me : game.players[game.players.length - seat];
if (!beginner) beginner = game.me;
delete _status.cheat_seat;
} else {
beginner = game.players[Math.floor(Math.random() * game.players.length)];
}
event.beginner = beginner;
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(stratagemBroadcast);
if (_status.connectMode && !_status.postReconnect.stratagemReinit)
_status.postReconnect.stratagemReinit = [stratagemBroadcast, {}];
for (var current of game.players) {
if (current.identity == "zhu") current.addSkill("stratagem_monarchy");
if (current.identity == "fan") current.addSkill("stratagem_revitalization");
}
}
if (
game.zhu == game.me &&
game.zhu.identity != "zhu" &&
_status.brawl &&
_status.brawl.identityShown
) {
delete game.zhu;
} else {
if (!stratagemMode) game.zhu.ai.shown = 1;
if (game.zhu2) {
game.zhong = game.zhu;
game.zhu = game.zhu2;
delete game.zhu2;
if (game.zhong.sex == "male" && game.zhong.maxHp <= 4) {
game.zhong.addSkill("dongcha");
} else {
game.zhong.addSkill("sheshen");
}
}
var enhance_zhu = false;
if (_status.connectMode) {
enhance_zhu =
!["zhong", "stratagem", "purple"].includes(_status.mode) &&
lib.configOL.enhance_zhu &&
get.population("fan") >= 3;
} else {
enhance_zhu =
!["zhong", "stratagem", "purple"].includes(_status.mode) &&
get.config("enhance_zhu") &&
get.population("fan") >= 3;
}
if (enhance_zhu) {
var skill;
switch (game.zhu.name) {
case "key_yuri":
skill = "buqu";
break;
case "liubei":
skill = "jizhen";
break;
case "dongzhuo":
skill = "hengzheng";
break;
case "sunquan":
skill = "batu";
break;
case "sp_zhangjiao":
skill = "tiangong";
break;
case "liushan":
skill = "shengxi";
break;
case "sunce":
skill = "ciqiu";
break;
case "re_sunben":
skill = "ciqiu";
break;
case "yuanshao":
skill = "geju";
break;
case "re_caocao":
skill = "dangping";
break;
case "caopi":
skill = "junxing";
break;
case "liuxie":
skill = "moukui";
break;
default:
skill = "tianming";
break;
}
game.broadcastAll(
function (player, skill) {
player.addSkill(skill);
player.storage.enhance_zhu = skill;
},
game.zhu,
skill
);
}
}
game.syncState();
event.trigger("gameStart");
var players = get.players(lib.sort.position);
var info = [];
for (var i = 0; i < players.length; i++) {
var ifo = {
name: players[i].name1,
name2: players[i].name2,
identity: players[i].identity,
};
if (stratagemMode) {
ifo.translate = lib.translate[game.players[i].name];
ifo.isCamouflaged = players[i].ai.stratagemCamouflage;
}
info.push(ifo);
}
_status.videoInited = true;
game.addVideo("init", null, info);
if (stratagemMode) {
game.addVideo("arrangeLib", null, {
skill: {
stratagem_fury: {
mark: true,
marktext: "🔥",
intro: {
name: "怒气",
content: "当前怒气值:#",
},
},
},
});
for (var i = 0; i < game.players.length; i++) {
//game.addVideo('markSkill',game.players[i],['stratagem_fury']);
game.players[i].ai.shown = 0;
}
game.stratagemCamouflage();
}
"step 6";
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;
});
if (_status.connectMode && lib.configOL.change_card) game.replaceHandcards(game.players.slice(0));
"step 7";
game.phaseLoop(event.beginner);
},
game: {
canReplaceViewpoint: () => true,
getState: function () {
var state = {};
for (var i in lib.playerOL) {
var player = lib.playerOL[i];
state[i] = { identity: player.identity };
if (player == game.zhu) {
state[i].zhu = true;
}
if (player == game.zhong) {
state[i].zhong = true;
}
if (player.isZhu) {
state[i].isZhu = true;
}
if (player.special_identity) {
state[i].special_identity = player.special_identity;
}
state[i].shown = player.ai.shown;
//state[i].group=player.group;
}
return state;
},
updateState: function (state) {
for (var i in state) {
var player = lib.playerOL[i];
if (player) {
player.identity = state[i].identity;
if (state[i].identity == "rZhu" || state[i].identity == "bZhu")
game[state[i].identity] = player;
if (state[i].special_identity) {
player.special_identity = state[i].special_identity;
if (player.node.dieidentity) {
player.node.dieidentity.innerHTML = get.translation(
state[i].special_identity
);
player.node.identity.firstChild.innerHTML = get.translation(
state[i].special_identity + "_bg"
);
}
}
if (state[i].zhu) {
game.zhu = player;
}
if (state[i].isZhu) {
player.isZhu = true;
}
if (state[i].zhong) {
game.zhong = player;
}
player.ai.shown = state[i].shown;
//player.group=state[i].group;
//player.node.name.dataset.nature=get.groupnature(player.group);
}
}
},
getRoomInfo: function (uiintro) {
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 == "stratagem") {
uiintro.add(
'<div class="text chat">首轮强化:' +
(lib.configOL.round_one_use_fury ? "开启" : "关闭")
);
} else if (lib.configOL.identity_mode != "purple") {
uiintro.add(
'<div class="text chat">双内奸:' + (lib.configOL.double_nei ? "开启" : "关闭")
);
if (lib.configOL.identity_mode != "stratagem") {
uiintro.add(
'<div class="text chat">加强主公:' +
(lib.configOL.enhance_zhu ? "开启" : "关闭")
);
uiintro.add(
'<div class="text chat">平民身份:' +
(lib.configOL.enable_commoner ? "开启" : "关闭")
);
}
uiintro.add(
'<div class="text chat">年机制:' +
(lib.configOL.enable_year_limit ? "开启" : "关闭")
);
}
} else {
uiintro.add(
'<div class="text chat">卡牌替换:' + (lib.configOL.zhong_card ? "开启" : "关闭")
);
}
var last = uiintro.add(
'<div class="text chat">出牌时限:' + lib.configOL.choose_timeout + "秒"
);
// uiintro.add('<div class="text chat">屏蔽弱将:'+(lib.configOL.ban_weak?'开启':'关闭'));
// var last=uiintro.add('<div class="text chat">屏蔽强将:'+(lib.configOL.ban_strong?'开启':'关闭'));
if (lib.configOL.banned.length) {
last = uiintro.add(
'<div class="text chat">禁用武将:' + get.translation(lib.configOL.banned)
);
}
if (lib.configOL.bannedcards.length) {
last = uiintro.add(
'<div class="text chat">禁用卡牌:' + get.translation(lib.configOL.bannedcards)
);
}
last.style.paddingBottom = "8px";
},
getIdentityList: function (player) {
if (player.identityShown) return;
if (player == game.me) return;
if (_status.mode == "purple") {
if (
_status.yeconfirm &&
["rNei", "bNei"].includes(game.me.identity) &&
["rNei", "bNei"].includes(player.identity)
)
return;
if (player.identity.slice(0, 1) == "r")
return {
cai2: "猜",
rZhong: "忠",
rNei: "内",
rYe: "野",
};
return {
cai: "猜",
bZhong: "忠",
bNei: "内",
bYe: "野",
};
} else if (_status.mode == "zhong") {
if (player.fanfixed) return;
if (game.zhu && game.zhu.isZhu) {
return {
fan: "反",
zhong: "忠",
nei: "内",
cai: "猜",
};
} else {
return {
fan: "反",
zhong: "忠",
nei: "内",
zhu: "主",
cai: "猜",
};
}
} else if (_status.mode == "stratagem") {
if ((game.zhu && game.zhu.isZhu && game.zhu.identityShown) || game.me.identity == "zhu") {
return {
fan: "反",
zhong: "忠",
nei: "内",
enemy: "敌",
friend: "友",
cai: "猜",
};
} else {
return {
fan: "反",
zhong: "忠",
nei: "内",
zhu: "主",
enemy: "敌",
friend: "友",
cai: "猜",
};
}
} else {
if (get.config("enable_commoner")) {
return {
fan: "反",
zhong: "忠",
nei: "内",
commoner: "民",
cai: "猜",
};
} else {
return {
fan: "反",
zhong: "忠",
nei: "内",
cai: "猜",
};
}
}
},
getIdentityList2: function (list) {
for (var i in list) {
switch (i) {
case "fan":
list[i] = "反贼";
break;
case "zhong":
list[i] = "忠臣";
break;
case "nei":
list[i] = "内奸";
break;
case "commoner":
list[i] = "平民";
break;
case "zhu":
list[i] = "主公";
break;
case "enemy":
list[i] = "敌方";
break;
case "friend":
list[i] = "友方";
break;
case "cai":
case "cai2":
list[i] = "未知";
break;
case "rZhong":
case "bZhong":
list[i] = "前锋";
break;
case "rNei":
case "bNei":
list[i] = "细作";
break;
case "rYe":
case "bYe":
list[i] = "野心家";
break;
}
}
},
getVideoName: function () {
var str = get.translation(game.me.name);
if (game.me.name2) {
str += "/" + get.translation(game.me.name2);
}
var str2;
if (game.identityVideoName) str2 = game.identityVideoName;
else {
switch (_status.mode) {
case "purple":
str2 =
"3v3v2 - " +
(game.me.identity.indexOf("r") == 0 ? "暖色" : "冷色") +
lib.translate[game.me.identity + "2"];
break;
case "zhong":
str2 = "忠胆英杰 - " + lib.translate[game.me.identity + "2"];
break;
case "stratagem":
str2 =
get.cnNumber(get.playerNumber()) +
"人谋攻" +
"-" +
lib.translate[game.me.identity + "2"];
break;
default:
str2 =
get.cnNumber(get.playerNumber()) +
"人" +
get.translation(lib.config.mode) +
" - " +
lib.translate[game.me.identity + "2"];
}
}
var name = [str, str2];
return name;
},
addRecord: function (bool) {
if (typeof bool == "boolean") {
var data = lib.config.gameRecord.identity.data;
var identity = game.me.identity;
if (identity == "mingzhong") {
identity = "zhong";
}
if (!data[identity]) {
data[identity] = [0, 0];
}
if (bool) {
data[identity][0]++;
} else {
data[identity][1]++;
}
var list = ["zhu", "zhong", "nei", "fan", "commoner"];
var str = "";
for (var i = 0; i < list.length; i++) {
if (data[list[i]]) {
str +=
lib.translate[list[i] + "2"] +
"" +
data[list[i]][0] +
"胜" +
" " +
data[list[i]][1] +
"负<br>";
}
}
lib.config.gameRecord.identity.str = str;
game.saveConfig("gameRecord", lib.config.gameRecord);
}
},
showIdentity: function (me) {
for (var i = 0; i < game.players.length; i++) {
// if(me===false&&game.players[i]==game.me) continue;
game.players[i].node.identity.classList.remove("guessing");
game.players[i].identityShown = true;
game.players[i].ai.shown = 1;
game.players[i].setIdentity(game.players[i].identity);
if (game.players[i].special_identity) {
game.players[i].node.identity.firstChild.innerHTML = get.translation(
game.players[i].special_identity + "_bg"
);
}
if (game.players[i].identity == "zhu") {
game.players[i].isZhu = true;
}
}
if (_status.clickingidentity) {
for (var i = 0; i < _status.clickingidentity[1].length; i++) {
_status.clickingidentity[1][i].delete();
_status.clickingidentity[1][i].style.transform = "";
}
delete _status.clickingidentity;
}
},
checkResult: function () {
var me = game.me._trueMe || game.me;
if (_status.brawl && _status.brawl.checkResult) {
_status.brawl.checkResult();
return;
} else if (_status.mode == "purple") {
var winner = [];
var loser = [];
var ye = game.filterPlayer(
function (current) {
return ["rYe", "bYe"].includes(current.identity);
},
null,
true
);
var red = game.filterPlayer(
function (current) {
return ["rZhu", "rZhong", "bNei"].includes(current.identity);
},
null,
true
);
var blue = game.filterPlayer(
function (current) {
return ["bZhu", "bZhong", "rNei"].includes(current.identity);
},
null,
true
);
game.countPlayer2(function (current) {
switch (current.identity) {
case "rZhu":
if (ye.length == 0 && game.bZhu.isDead()) winner.push(current);
if (current.isDead()) loser.push(current);
break;
case "rZhong":
case "bNei":
if (ye.length == 0 && game.bZhu.isDead()) winner.push(current);
if (game.rZhu.isDead()) loser.push(current);
break;
case "bZhu":
if (ye.length == 0 && game.rZhu.isDead()) winner.push(current);
if (current.isDead()) loser.push(current);
break;
case "bZhong":
case "rNei":
if (ye.length == 0 && game.rZhu.isDead()) winner.push(current);
if (game.bZhu.isDead()) loser.push(current);
break;
default:
if (red.length + blue.length == 0) winner.push(current);
else if (game.rZhu.isDead() && game.bZhu.isDead()) loser.push(current);
break;
}
}, true);
var winner2 = winner.slice(0);
var loser2 = loser.slice(0);
for (var i = 0; i < winner.length; i++) {
if (winner[i].isDead()) winner.splice(i--, 1);
}
for (var i = 0; i < loser.length; i++) {
if (loser[i].isDead()) loser.splice(i--, 1);
}
if (winner.length > 0 || loser.length == game.players.length) {
game.broadcastAll(
function (winner, loser) {
_status.winner = winner;
_status.loser = loser;
},
winner,
loser
);
if (loser.length == game.players.length) {
game.showIdentity();
game.over("游戏平局");
} else if (winner2.includes(me)) {
game.showIdentity();
if (loser2.includes(me)) game.over(false);
else game.over(true);
} else {
game.showIdentity();
game.over(false);
}
}
return;
}
if (!game.zhu) {
if (get.population("fan") == 0) {
switch (me.identity) {
case "fan":
game.over(false);
break;
case "zhong":
game.over(true);
break;
case "commoner":
game.over(true);
break;
default:
game.over();
break;
}
} else if (get.population("zhong") == 0) {
switch (me.identity) {
case "fan":
game.over(true);
break;
case "zhong":
game.over(false);
break;
case "commoner":
game.over(true);
break;
default:
game.over();
break;
}
}
return;
}
if (game.zhu.isAlive() && get.population("fan") + get.population("nei") > 0) return;
if (game.zhong) {
game.zhong.identity = "zhong";
}
game.showIdentity();
if (me.identity == "zhu" || me.identity == "zhong" || me.identity == "mingzhong") {
if (game.zhu.classList.contains("dead")) {
game.over(false);
} else {
game.over(true);
}
} else if (me.identity == "nei") {
if (
game.players.length ==
1 + game.players.filter((i) => i.identity == "commoner").length &&
me.isAlive()
) {
game.over(true);
} else {
game.over(false);
}
} else if (me.identity == "fan") {
if (
(get.population("fan") + get.population("zhong") > 0 || get.population("nei") > 1) &&
game.zhu.classList.contains("dead")
) {
game.over(true);
} else {
game.over(false);
}
} else if (me.identity == "commoner") {
game.over(true);
}
},
checkOnlineResult: function (player) {
if (_status.winner && _status.loser) {
if (_status.loser.length == game.players.length) return null;
if (_status.loser.includes(player)) return false;
if (_status.winner.includes(player)) return true;
}
if (game.zhu.isAlive()) {
return (
player.identity == "zhu" ||
player.identity == "zhong" ||
player.identity == "mingzhong" ||
(player.identity == "commoner" && player.isAlive())
);
} else if (
(game.players.length == 1 + game.players.filter((i) => i.identity == "commoner").length &&
game.players[0].identity == "nei") ||
game.players[0].identity == "commoner"
) {
return player.isAlive();
} else {
return player.identity == "fan" || (player.identity == "commoner" && player.isAlive());
}
},
chooseCharacterPurpleOL: function () {
var next = game.createEvent("chooseCharacter");
next.setContent(function () {
"step 0";
ui.arena.classList.add("choose-character");
"step 1";
var list = ["rZhu", "rZhong", "rNei", "rYe"];
var list2 = ["bZhu", "bZhong", "bNei", "bYe"];
list.randomSort();
list2.randomSort();
var identityList = list.concat(list2);
var num = get.rand(0, 7);
var players = game.players.slice(0);
for (var i = 0; i < num; i++) {
players.push(players.shift());
}
game.broadcastAll(
function (players, identityList, list) {
_status.mode = "purple";
if (game.online) ui.arena.classList.add("choose-character");
for (var i = 0; i < players.length; i++) {
players[i].node.identity.classList.add("guessing");
players[i].identity = identityList[i];
players[i].setIdentity(list.includes(identityList[i]) ? "cai2" : "cai");
if (["rZhu", "bZhu"].includes(identityList[i])) {
game[identityList[i]] = players[i];
players[i].setIdentity(identityList[i]);
players[i].identityShown = true;
players[i].node.identity.classList.remove("guessing");
}
}
game.zhu = game.rZhu;
game.rZhu.isZhu = true;
game.bZhu.isZhu = true;
game.me.setIdentity();
game.me.node.identity.classList.remove("guessing");
},
players,
identityList,
list
);
players.sortBySeat(game.zhu);
for (var i = 0; i < players.length; i++) {
players[i].seatNum = i;
}
"step 2";
var map = {};
var map_zhu = {};
event.mapNum = {};
var list = [];
var libCharacter = {};
for (var i = 0; i < lib.configOL.characterPack.length; i++) {
var pack = lib.characterPack[lib.configOL.characterPack[i]];
for (var j in pack) {
// if(j=='zuoci') continue;
if (lib.character[j]) libCharacter[j] = pack[j];
}
}
for (var i in libCharacter) {
if (lib.filter.characterDisabled(i, libCharacter)) continue;
if (i.indexOf("lingju") != -1 || get.is.double(i)) continue;
var group = lib.character[i][1];
if (group == "shen") continue;
if (!map[group]) {
map[group] = [];
list.push(group);
}
map[group].push(i);
if (lib.character[i][4] && lib.character[i][4].includes("zhu")) {
if (!map_zhu[group]) {
map_zhu[group] = [];
}
map_zhu[group].push(i);
}
}
for (var i in map) {
if (map[i].length < 12) {
delete map[i];
list.remove(i);
} else event.mapNum[i] = map[i].length > 15 ? 5 : 3;
}
list.sort(function (a, b) {
return lib.group.indexOf(a) - lib.group.indexOf(b);
});
event.list = list;
event.map = map;
event.map_zhu = map_zhu;
game.bZhu
.chooseControl(list)
.set("prompt", "请选择冷方武将势力")
.set("ai", function () {
return _status.event.choice;
})
.set("choice", event.list.randomGet());
"step 3";
event.bZhu = result.control;
event.list.remove(event.bZhu);
game.rZhu
.chooseControl(event.list)
.set("prompt", "请选择暖方武将的势力")
.set("ai", function () {
return _status.event.choice;
})
.set("choice", event.list.randomGet());
"step 4";
event.rZhu = result.control;
var players = [game.rZhu, game.bZhu];
var list = [];
for (var i = 0; i < players.length; i++) {
var group = event[players[i].identity];
var str = "选择角色";
var list2 = event.map[group].randomGets(4);
if (event.map_zhu[group]) list2.addArray(event.map_zhu[group].randomGets(2));
event.map[players[i].playerid] = list2;
list.push([players[i], [str, [list2, "character"]], true]);
}
game.me.chooseButtonOL(list, function (player, result) {
if (game.online || player == game.me) {
player.init(result.links[0]);
if (!player.isInitFilter("noZhuHp")) {
player.hp++;
player.maxHp++;
player.update();
}
}
});
"step 5";
for (var i in result) {
if (result[i] == "ai" || !result[i] || !result[i].links) {
result[i] = event.map[i].randomGet();
} else {
result[i] = result[i].links;
}
var group = lib.character[result[i][0]][1];
event.map[group].remove(result[i][0]);
if (!lib.playerOL[i].name) {
lib.playerOL[i].init(result[i][0]);
}
}
game.broadcast(function (result) {
for (var i in result) {
if (!lib.playerOL[i].name) {
lib.playerOL[i].init(result[i][0], result[i][1]);
if (!lib.playerOL[i].isInitFilter("noZhuHp")) {
lib.playerOL[i].hp++;
lib.playerOL[i].maxHp++;
lib.playerOL[i].update();
}
}
}
}, result);
var list = [];
var players = game.players.slice(0);
players.removeArray([game.rZhu, game.bZhu]);
for (var i = 0; i < players.length; i++) {
var group = event[players[i].identity.slice(0, 1) + "Zhu"];
var str = "选择角色";
var list2 = event.map[group].randomRemove(event.mapNum[group]);
event.map[players[i].playerid] = list2;
list.push([players[i], [str, [list2, "character"]], true]);
}
game.me.chooseButtonOL(list, function (player, result) {
if (game.online || player == game.me) {
player.init(result.links[0]);
}
});
"step 6";
for (var i in result) {
if (result[i] == "ai" || !result[i] || !result[i].links) {
result[i] = event.map[i].randomGet();
} else {
result[i] = result[i].links;
}
var group = lib.character[result[i][0]][1];
event.map[group].remove(result[i][0]);
if (!lib.playerOL[i].name) {
lib.playerOL[i].init(result[i][0]);
}
}
game.broadcast(function (result) {
for (var i in result) {
if (!lib.playerOL[i].name) {
lib.playerOL[i].init(result[i][0], result[i][1]);
}
}
setTimeout(function () {
ui.arena.classList.remove("choose-character");
}, 500);
}, result);
setTimeout(function () {
ui.arena.classList.remove("choose-character");
}, 500);
});
},
chooseCharacterPurple: function () {
var next = game.createEvent("chooseCharacter");
next.setContent(function () {
"step 0";
ui.arena.classList.add("choose-character");
game.no_continue_game = true;
lib.init.onfree();
"step 1";
var list = ["rZhu", "rZhong", "rNei", "rYe"];
var list2 = ["bZhu", "bZhong", "bNei", "bYe"];
list.randomSort();
list2.randomSort();
var identityList = list.concat(list2);
var num = get.rand(0, 7);
var players = game.players.slice(0);
for (var i = 0; i < num; i++) {
players.push(players.shift());
}
for (var i = 0; i < players.length; i++) {
players[i].node.identity.classList.add("guessing");
players[i].identity = identityList[i];
players[i].setIdentity(list.includes(identityList[i]) ? "cai2" : "cai");
if (["rZhu", "bZhu"].includes(identityList[i])) {
game[identityList[i]] = players[i];
players[i].setIdentity(identityList[i]);
players[i].identityShown = true;
players[i].node.identity.classList.remove("guessing");
}
}
game.zhu = game.rZhu;
game.rZhu.isZhu = true;
game.bZhu.isZhu = true;
game.me.setIdentity();
game.me.node.identity.classList.remove("guessing");
players.sortBySeat(game.zhu);
for (var i = 0; i < players.length; i++) {
players[i].seatNum = i;
}
"step 2";
var map = {};
var map_zhu = {};
var list = [];
for (var i in lib.character) {
if (lib.filter.characterDisabled(i)) continue;
if (i.indexOf("lingju") != -1 || get.is.double(i)) continue;
var group = lib.character[i][1];
if (group == "shen") continue;
if (!map[group]) {
map[group] = [];
list.push(group);
}
map[group].push(i);
if (lib.character[i][4] && lib.character[i][4].includes("zhu")) {
if (!map_zhu[group]) {
map_zhu[group] = [];
}
map_zhu[group].push(i);
}
}
for (var i in map) {
if (map[i].length < 12) {
delete map[i];
list.remove(i);
}
}
list.sort(function (a, b) {
return lib.group.indexOf(a) - lib.group.indexOf(b);
});
event.list = list;
event.map = map;
event.map_zhu = map_zhu;
game.bZhu
.chooseControl(list)
.set("prompt", "请选择冷方武将势力")
.set("ai", function () {
return _status.event.choice;
})
.set("choice", event.list.randomGet());
"step 3";
event.bZhu = result.control;
event.list.remove(event.bZhu);
game.rZhu
.chooseControl(event.list)
.set("prompt", "请选择暖方武将的势力")
.set("ai", function () {
return _status.event.choice;
})
.set("choice", event.list.randomGet());
"step 4";
event.rZhu = result.control;
if (game.me == game.rZhu || game.me == game.bZhu) {
event.isZhu = true;
var list = event.map[event[game.me.identity]].randomGets(4);
if (event.map_zhu[event[game.me.identity]])
list.addArray(event.map_zhu[event[game.me.identity]].randomGets(2));
game.me.chooseButton(true, ["请选择您的武将牌", [list, "character"]]);
}
"step 5";
if (event.isZhu) {
event.map[event[game.me.identity]].remove(result.links[0]);
game.me.init(result.links[0]);
}
if (!game.rZhu.name) {
var list = event.map[event.rZhu].randomGets(3);
if (event.map_zhu[event.rZhu]) list.addArray(event.map_zhu[event.rZhu]);
var character = list.randomGet();
event.map[event.rZhu].remove(character);
game.rZhu.init(character);
}
if (!game.bZhu.name) {
var list = event.map[event.bZhu].randomGets(4);
if (event.map_zhu[event.bZhu]) list.addArray(event.map_zhu[event.bZhu].randomGets(2));
var character = list.randomGet();
event.map[event.bZhu].remove(character);
game.bZhu.init(character);
}
if (!game.rZhu.isInitFilter("noZhuHp")) {
game.rZhu.maxHp++;
game.rZhu.hp++;
game.rZhu.update();
}
if (!game.bZhu.isInitFilter("noZhuHp")) {
game.bZhu.maxHp++;
game.bZhu.hp++;
game.bZhu.update();
}
if (!event.isZhu) {
var group = game.me.identity.indexOf("r") == 0 ? event.rZhu : event.bZhu;
game.me.chooseButton(true, [
"请选择您的武将牌",
[event.map[group].randomRemove(5), "character"],
]);
}
"step 6";
if (!event.isZhu) {
game.me.init(result.links[0]);
}
game.countPlayer(function (current) {
if (!current.name) {
var group = current.identity.indexOf("r") == 0 ? event.rZhu : event.bZhu;
current.init(event.map[group].randomRemove(1)[0]);
}
});
"step 7";
setTimeout(function () {
ui.arena.classList.remove("choose-character");
}, 500);
});
},
chooseCharacterStratagemOL: function () {
var next = game.createEvent("chooseCharacter");
next.setContent(function () {
"step 0";
ui.arena.classList.add("choose-character");
var i;
var identityList = get.identityList(game.players.length);
if (lib.configOL.double_nei) {
switch (lib.configOL.number) {
case 8:
identityList.remove("fan");
identityList.push("nei");
break;
case 7:
identityList.remove("zhong");
identityList.push("nei");
break;
case 6:
identityList.remove("fan");
identityList.push("nei");
break;
case 5:
identityList.remove("fan");
identityList.push("nei");
break;
case 4:
identityList.remove("zhong");
identityList.push("nei");
break;
case 3:
identityList.remove("fan");
identityList.push("nei");
break;
}
}
identityList.randomSort();
for (i = 0; i < game.players.length; i++) {
game.players[i].identity = identityList[i];
game.players[i].setIdentity("cai");
game.players[i].node.identity.classList.add("guessing");
if (identityList[i] == "zhu") {
game.zhu = game.players[i];
}
game.players[i].identityShown = false;
}
game.zhu.isZhu = game.zhu.identity == "zhu";
game.me.setIdentity();
game.me.node.identity.classList.remove("guessing");
for (var i = 0; i < game.players.length; i++) {
game.players[i].send(
function (zhu, zhuid, me, identity) {
for (var i in lib.playerOL) {
lib.playerOL[i].setIdentity("cai");
lib.playerOL[i].node.identity.classList.add("guessing");
}
zhu.identity = zhuid;
if (zhuid == "zhu") zhu.isZhu = true;
me.setIdentity(identity);
me.node.identity.classList.remove("guessing");
ui.arena.classList.add("choose-character");
},
game.zhu,
game.zhu.identity,
game.players[i],
game.players[i].identity
);
}
var list;
var list3 = [];
var list4 = [];
event.list = [];
event.list2 = [];
var libCharacter = {};
for (var i = 0; i < lib.configOL.characterPack.length; i++) {
var pack = lib.characterPack[lib.configOL.characterPack[i]];
for (var j in pack) {
if (lib.character[j]) libCharacter[j] = pack[j];
}
}
for (i in lib.characterReplace) {
var ix = lib.characterReplace[i];
for (var j = 0; j < ix.length; j++) {
if (!libCharacter[ix[j]] || lib.filter.characterDisabled(ix[j]))
ix.splice(j--, 1);
}
if (ix.length) {
event.list.push(i);
event.list2.push(i);
list4.addArray(ix);
list3.push(i);
}
}
game.broadcast(function (list) {
for (var i in lib.characterReplace) {
var ix = lib.characterReplace[i];
for (var j = 0; j < ix.length; j++) {
if (!list.includes(ix[j])) ix.splice(j--, 1);
}
}
}, list4);
for (i in libCharacter) {
if (list4.includes(i)) continue;
if (lib.filter.characterDisabled(i, libCharacter)) continue;
event.list.push(i);
event.list2.push(i);
list4.push(i);
list3.push(i);
}
_status.characterlist = list4.slice(0);
list = list3.randomGets(5);
"step 1";
var list = [];
var selectButton = lib.configOL.double_character ? 2 : 1;
var num,
num2 = 0;
num = Math.floor(event.list.length / (game.players.length - 1));
if (num > 5) {
num = 5;
}
num2 = event.list.length - num * (game.players.length - 1);
if (lib.configOL.double_nei) {
num2 = Math.floor(num2 / 2);
}
if (num2 > 2) {
num2 = 2;
}
for (var i = 0; i < game.players.length; i++) {
var num3 = 0;
if (game.players[i].identity == "nei") {
num3 = num2;
}
var str = "选择角色";
list.push([
game.players[i],
[str, [event.list.randomRemove(num + num3), "characterx"]],
selectButton,
true,
]);
}
game.me.chooseButtonOL(list, function (player, result) {
if (game.online || player == game.me) player.init(result.links[0], result.links[1]);
});
"step 2";
var shen = [];
for (var i in result) {
if (result[i] && result[i].links) {
for (var j = 0; j < result[i].links.length; j++) {
event.list2.remove(get.sourceCharacter(result[i].links[j]));
}
}
}
for (var i in result) {
if (result[i] == "ai") {
result[i] = event.list2.randomRemove(lib.configOL.double_character ? 2 : 1);
for (var j = 0; j < result[i].length; j++) {
var listx = lib.characterReplace[result[i][j]];
if (listx && listx.length) result[i][j] = listx.randomGet();
}
} else {
result[i] = result[i].links;
}
if (
get.is.double(result[i][0]) ||
(lib.character[result[i][0]] &&
lib.character[result[i][0]][1] == "shen" &&
!lib.character[result[i][0]][4].includes("hiddenSkill"))
)
shen.push(lib.playerOL[i]);
}
event.result2 = result;
if (shen.length) {
var list = ["wei", "shu", "wu", "qun", "jin", "key"];
for (var i = 0; i < list.length; i++) {
if (!lib.group.includes(list[i])) list.splice(i--, 1);
else list[i] = ["", "", "group_" + list[i]];
}
for (var i = 0; i < shen.length; i++) {
if (get.is.double(result[shen[i].playerid][0])) {
shen[i]._groupChosen = true;
shen[i] = [
shen[i],
[
"请选择你的势力",
[
get.is
.double(result[shen[i].playerid][0], true)
.map(function (i) {
return ["", "", "group_" + i];
}),
"vcard",
],
],
1,
true,
];
} else shen[i] = [shen[i], ["请选择神武将的势力", [list, "vcard"]], 1, true];
}
game.me
.chooseButtonOL(shen, function (player, result) {
if (player == game.me)
player.changeGroup(result.links[0][2].slice(6), false, false);
})
.set("switchToAuto", function () {
_status.event.result = "ai";
})
.set("processAI", function () {
return {
bool: true,
links: [_status.event.dialog.buttons.randomGet().link],
};
});
} else event._result = {};
"step 3";
if (!result) result = {};
for (var i in result) {
if (result[i] && result[i].links) result[i] = result[i].links[0][2].slice(6);
else if (result[i] == "ai")
result[i] = (function () {
return ["wei", "shu", "wu", "qun", "jin", "key"].randomGet();
})();
}
var result2 = event.result2;
game.broadcast(
function (result, result2) {
for (var i in result) {
if (!lib.playerOL[i].name) {
lib.playerOL[i].init(result[i][0], result[i][1]);
}
if (result2[i] && result2[i].length)
lib.playerOL[i].changeGroup(result2[i], false, false);
}
setTimeout(function () {
ui.arena.classList.remove("choose-character");
}, 500);
},
result2,
result
);
for (var i in result2) {
if (!lib.playerOL[i].name) {
lib.playerOL[i].init(result2[i][0], result2[i][1]);
}
if (result[i] && result[i].length)
lib.playerOL[i].changeGroup(result[i], false, false);
}
for (var i = 0; i < game.players.length; i++) {
_status.characterlist.remove(game.players[i].name);
_status.characterlist.remove(game.players[i].name1);
_status.characterlist.remove(game.players[i].name2);
}
["stratagem_gain", "stratagem_insight", "stratagem_expose"].forEach((globalSkill) =>
game.addGlobalSkill(globalSkill)
);
game.players.forEach((current) => {
current.storage.zhibi = [];
current.storage.stratagem_expose = [];
current.markSkill("stratagem_fury");
});
setTimeout(function () {
ui.arena.classList.remove("choose-character");
}, 500);
});
},
chooseCharacter: function () {
if (_status.mode == "purple") {
game.chooseCharacterPurple();
return;
}
var next = game.createEvent("chooseCharacter");
next.showConfig = true;
next.addPlayer = function (player) {
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");
};
next.removePlayer = function () {
return game.players.randomGet(game.me, game.zhu);
};
next.ai = function (player, list, list2, back) {
if (_status.brawl && _status.brawl.chooseCharacterAi) {
if (_status.brawl.chooseCharacterAi(player, list, list2, back) !== false) {
return;
}
}
var stratagemMode = _status.event.stratagemMode;
if (_status.event.zhongmode) {
var listc = list.slice(0, 2);
for (var i = 0; i < listc.length; i++) {
var listx = lib.characterReplace[listc[i]];
if (listx && listx.length) listc[i] = listx.randomGet();
}
if (get.config("double_character")) {
player.init(listc[0], listc[1]);
} else {
player.init(listc[0]);
}
if (player.identity == "mingzhong") {
if (!player.isInitFilter("noZhuHp")) {
player.hp++;
player.maxHp++;
player.update();
}
}
} else if (player.identity == "zhu" && !stratagemMode) {
list2.randomSort();
var choice, choice2;
if (!_status.event.zhongmode && Math.random() - 0.8 < 0 && list2.length) {
choice = list2[0];
choice2 = list[0];
if (choice2 == choice) {
choice2 = list[1];
}
} else {
choice = list[0];
choice2 = list[1];
}
if (lib.characterReplace[choice] && lib.characterReplace[choice].length)
choice = lib.characterReplace[choice].randomGet();
if (lib.characterReplace[choice2] && lib.characterReplace[choice2].length)
choice2 = lib.characterReplace[choice2].randomGet();
if (get.config("double_character")) {
player.init(choice, choice2);
} else {
player.init(choice);
}
if (game.players.length > 4) {
if (!player.isInitFilter("noZhuHp")) {
player.hp++;
player.maxHp++;
player.update();
}
}
} else if (
player.identity == "zhong" &&
(Math.random() < 0.5 || ["sunliang", "key_akane"].includes(game.zhu.name)) &&
!stratagemMode
) {
var listc = list.slice(0);
for (var i = 0; i < listc.length; i++) {
var listx = lib.characterReplace[listc[i]];
if (listx && listx.length) listc[i] = listx.randomGet();
}
var choice = 0;
for (var i = 0; i < listc.length; i++) {
if (lib.character[listc[i]][1] == game.zhu.group) {
choice = i;
break;
}
}
if (get.config("double_character")) {
player.init(listc[choice], listc[choice == 0 ? choice + 1 : choice - 1]);
} else {
player.init(listc[choice]);
}
} else {
var listc = list.slice(0, 2);
for (var i = 0; i < listc.length; i++) {
var listx = lib.characterReplace[listc[i]];
if (listx && listx.length) listc[i] = listx.randomGet();
}
if (get.config("double_character")) {
player.init(listc[0], listc[1]);
} else {
player.init(listc[0]);
}
}
if (back) {
list.remove(get.sourceCharacter(player.name1));
list.remove(get.sourceCharacter(player.name2));
for (var i = 0; i < list.length; i++) {
back.push(list[i]);
}
}
if (typeof lib.config.test_game == "string" && player == game.me.next) {
player.init(lib.config.test_game);
}
if (get.is.double(player.name1)) {
player._groupChosen = true;
player.group = get.is.double(player.name1, true).randomGet();
player.node.name.dataset.nature = get.groupnature(player.group);
} else if (get.config("choose_group") && player.group == "shen" && !player.isUnseen(0)) {
var list = lib.group.slice(0);
list.remove("shen");
if (list.length)
player.group = (function () {
if (_status.mode != "zhong" && game.zhu && game.zhu.group) {
if (
[
"re_zhangjiao",
"liubei",
"re_liubei",
"caocao",
"re_caocao",
"sunquan",
"re_sunquan",
"zhangjiao",
"sp_zhangjiao",
"caopi",
"re_caopi",
"liuchen",
"caorui",
"sunliang",
"sunxiu",
"sunce",
"re_sunben",
"ol_liushan",
"re_liushan",
"key_akane",
"dongzhuo",
"re_dongzhuo",
"ol_dongzhuo",
"jin_simashi",
"caomao",
].includes(game.zhu.name)
)
return game.zhu.group;
if (game.zhu.name == "yl_yuanshu") {
if (player.identity == "zhong") list.remove("qun");
else return "qun";
}
if (
[
"sunhao",
"xin_yuanshao",
"re_yuanshao",
"re_sunce",
"ol_yuanshao",
"yuanshu",
"jin_simazhao",
"liubian",
].includes(game.zhu.name)
) {
if (player.identity != "zhong") list.remove(game.zhu.group);
else return game.zhu.group;
}
}
return list.randomGet();
})();
}
player.node.name.dataset.nature = get.groupnature(player.group);
};
next.setContent(function () {
"step 0";
ui.arena.classList.add("choose-character");
var i;
var list;
var list2 = [];
var list3 = [];
var list4 = [];
var identityList;
var chosen = lib.config.continue_name || [];
game.saveConfig("continue_name");
event.chosen = chosen;
if (_status.mode == "zhong") {
event.zhongmode = true;
identityList = ["zhu", "zhong", "mingzhong", "nei", "fan", "fan", "fan", "fan"];
} else {
if (_status.mode == "stratagem") event.stratagemMode = true;
identityList = get.identityList(game.players.length);
}
var stratagemMode = event.stratagemMode;
var addSetting = function (dialog) {
dialog.add("选择身份").classList.add("add-setting");
var table = document.createElement("div");
table.classList.add("add-setting");
table.style.margin = "0";
table.style.width = "100%";
table.style.position = "relative";
var listi;
if (event.zhongmode) {
listi = ["random", "zhu", "mingzhong", "zhong", "fan", "nei"];
} else {
listi = ["random", "zhu", "zhong", "fan", "nei"];
if (get.config("enable_commoner") && !event.stratagemMode) listi.push("commoner");
}
for (var i = 0; i < listi.length; i++) {
var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode");
td.link = listi[i];
if (td.link === game.me.identity) {
td.classList.add("bluebg");
}
table.appendChild(td);
td.innerHTML = "<span>" + get.translation(listi[i] + "2") + "</span>";
td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () {
if (_status.dragged) return;
if (_status.justdragged) return;
_status.tempNoButton = true;
setTimeout(function () {
_status.tempNoButton = false;
}, 500);
var link = this.link;
if (game.zhu) {
if (link != "random") {
_status.event.parent.fixedseat = get.distance(
game.me,
game.zhu,
"absolute"
);
}
if (game.zhu.name) game.zhu.uninit();
delete game.zhu.isZhu;
delete game.zhu.identityShown;
}
var current = this.parentNode.querySelector(".bluebg");
if (current) {
current.classList.remove("bluebg");
}
current = _status.cheat_seat || seats.querySelector(".bluebg");
if (current) {
current.classList.remove("bluebg");
}
if (link == "random") {
if (event.zhongmode) {
link = ["zhu", "zhong", "nei", "fan", "mingzhong"].randomGet();
} else {
var listi = ["zhu", "zhong", "nei", "fan"];
if (get.config("enable_commoner") && !event.stratagemMode)
listi.push("commoner");
link = listi.randomGet();
}
for (var i = 0; i < this.parentNode.childElementCount; i++) {
if (this.parentNode.childNodes[i].link == link) {
this.parentNode.childNodes[i].classList.add("bluebg");
}
}
} else {
this.classList.add("bluebg");
}
num = get.config("choice_" + link);
if (event.zhongmode) {
num = 6;
if (link == "zhu" || link == "nei" || link == "mingzhong") {
num = 8;
}
}
_status.event.parent.swapnodialog = function (dialog, list) {
var buttons = ui.create.div(".buttons");
var node = dialog.buttons[0].parentNode;
dialog.buttons = ui.create.buttons(list, "characterx", buttons);
dialog.content.insertBefore(buttons, node);
buttons.addTempClass("start");
node.remove();
game.uncheck();
game.check();
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");
}
}
};
_status.event = _status.event.parent;
_status.event.step = 0;
_status.event.identity = link;
if (!event.stratagemMode) {
if (link != (event.zhongmode ? "mingzhong" : "zhu")) {
seats.previousSibling.style.display = "";
seats.style.display = "";
} else {
seats.previousSibling.style.display = "none";
seats.style.display = "none";
}
}
game.resume();
});
}
dialog.content.appendChild(table);
dialog.add("选择座位").classList.add("add-setting");
var seats = document.createElement("div");
seats.classList.add("add-setting");
seats.style.margin = "0";
seats.style.width = "100%";
seats.style.position = "relative";
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 (!stratagemMode && get.distance(game.zhu, game.me, "absolute") === i - 1) {
td.classList.add("bluebg");
}
td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () {
if (_status.dragged) return;
if (_status.justdragged) return;
if (_status.cheat_seat) {
_status.cheat_seat.classList.remove("bluebg");
if (_status.cheat_seat == this) {
delete _status.cheat_seat;
return;
}
}
if (stratagemMode) {
this.classList.add("bluebg");
_status.cheat_seat = this;
} else {
if (get.distance(game.zhu, game.me, "absolute") == this.link) return;
var current = this.parentNode.querySelector(".bluebg");
if (current) {
current.classList.remove("bluebg");
}
this.classList.add("bluebg");
for (var i = 0; i < game.players.length; i++) {
if (get.distance(game.players[i], game.me, "absolute") == this.link) {
game.swapSeat(game.zhu, game.players[i], false);
return;
}
}
}
});
}
dialog.content.appendChild(seats);
if (!stratagemMode && game.me == game.zhu) {
seats.previousSibling.style.display = "none";
seats.style.display = "none";
}
dialog.add(ui.create.div(".placeholder.add-setting"));
dialog.add(ui.create.div(".placeholder.add-setting"));
if (get.is.phoneLayout()) dialog.add(ui.create.div(".placeholder.add-setting"));
};
var removeSetting = function () {
var dialog = _status.event.dialog;
if (dialog) {
dialog.style.height = "";
delete dialog._scrollset;
var list = Array.from(dialog.querySelectorAll(".add-setting"));
while (list.length) {
list.shift().remove();
}
ui.update();
}
};
event.addSetting = addSetting;
event.removeSetting = removeSetting;
event.list = [];
identityList.randomSort();
if (event.identity) {
identityList.remove(event.identity);
identityList.unshift(event.identity);
if (event.fixedseat) {
var zhuIdentity = _status.mode == "zhong" ? "mingzhong" : "zhu";
if (zhuIdentity != event.identity) {
identityList.remove(zhuIdentity);
identityList.splice(event.fixedseat, 0, zhuIdentity);
}
delete event.fixedseat;
}
delete event.identity;
} else if (_status.mode != "zhong" && (!_status.brawl || !_status.brawl.identityShown)) {
var ban_identity = [];
ban_identity.push(get.config("ban_identity") || "off");
if (ban_identity[0] != "off") {
ban_identity.push(get.config("ban_identity2") || "off");
if (ban_identity[1] != "off") {
ban_identity.push(get.config("ban_identity3") || "off");
}
}
ban_identity.remove("off");
if (ban_identity.length) {
var identityList2 = identityList.slice(0);
for (var i = 0; i < ban_identity.length; i++) {
while (identityList2.includes(ban_identity[i])) {
identityList2.remove(ban_identity[i]);
}
}
ban_identity = identityList2.randomGet();
identityList.remove(ban_identity);
identityList.splice(game.players.indexOf(game.me), 0, ban_identity);
}
}
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 (!stratagemMode) game.players[i].identityShown = true;
} else {
game.players[i].node.identity.classList.add("guessing");
game.players[i].identity = identityList[i];
game.players[i].setIdentity("cai");
if (event.zhongmode) {
if (identityList[i] == "mingzhong") {
game.zhu = game.players[i];
} else if (identityList[i] == "zhu") {
game.zhu2 = game.players[i];
}
} else {
if (identityList[i] == "zhu") {
game.zhu = game.players[i];
}
}
game.players[i].identityShown = false;
}
}
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;
}
event.special_identity = [];
var zhongs = game.filterPlayer(function (current) {
return current.identity == "zhong";
});
var fans = game.filterPlayer(function (current) {
return current.identity == "fan";
});
if (fans.length >= 1) {
fans.randomRemove().special_identity = "identity_zeishou";
event.special_identity.push("identity_zeishou");
}
if (zhongs.length > 1) {
zhongs.randomRemove().special_identity = "identity_dajiang";
zhongs.randomRemove().special_identity = "identity_junshi";
event.special_identity.push("identity_dajiang");
event.special_identity.push("identity_junshi");
} else if (zhongs.length == 1) {
if (Math.random() < 0.5) {
zhongs.randomRemove().special_identity = "identity_dajiang";
event.special_identity.push("identity_dajiang");
} else {
zhongs.randomRemove().special_identity = "identity_junshi";
event.special_identity.push("identity_junshi");
}
}
}
if (!game.zhu) game.zhu = game.me;
else {
if (!stratagemMode) {
game.zhu.setIdentity();
game.zhu.identityShown = true;
game.zhu.node.identity.classList.remove("guessing");
}
game.zhu.isZhu = game.zhu.identity == "zhu";
game.me.setIdentity();
game.me.node.identity.classList.remove("guessing");
}
//选将框分配
for (i in lib.characterReplace) {
var ix = lib.characterReplace[i];
for (var j = 0; j < ix.length; j++) {
if (chosen.includes(ix[j]) || lib.filter.characterDisabled(ix[j]))
ix.splice(j--, 1);
}
if (ix.length) {
event.list.push(i);
list4.addArray(ix);
if (stratagemMode) {
list3.push(i);
} else {
var bool = false;
for (var j of ix) {
if (lib.character[j][4] && lib.character[j][4].includes("zhu")) {
bool = true;
break;
}
}
(bool ? list2 : list3).push(i);
}
}
}
for (i in lib.character) {
if (list4.includes(i)) continue;
if (chosen.includes(i)) continue;
if (lib.filter.characterDisabled(i)) continue;
event.list.push(i);
list4.push(i);
if (!stratagemMode && lib.character[i][4] && lib.character[i][4].includes("zhu")) {
list2.push(i);
} else {
list3.push(i);
}
}
var getZhuList = function () {
if (stratagemMode) {
list2.sort(lib.sort.character);
return list2;
}
var limit_zhu = get.config("limit_zhu");
if (!limit_zhu || limit_zhu == "off") return list2.slice(0).sort(lib.sort.character);
if (limit_zhu != "group") {
var num = parseInt(limit_zhu) || 6;
return list2.randomGets(num).sort(lib.sort.character);
}
var getGroup = function (name) {
var characterReplace = lib.characterReplace[name];
if (characterReplace && characterReplace[0] && lib.character[characterReplace[0]])
return lib.character[characterReplace[0]][1];
return lib.character[name][1];
};
var list2x = list2.slice(0);
list2x.randomSort();
for (var i = 0; i < list2x.length; i++) {
for (var j = i + 1; j < list2x.length; j++) {
if (getGroup(list2x[i]) == getGroup(list2x[j])) {
list2x.splice(j--, 1);
}
}
}
list2x.sort(lib.sort.character);
return list2x;
};
event.list.randomSort();
_status.characterlist = list4.slice(0).randomSort();
list3.randomSort();
if (_status.brawl && _status.brawl.chooseCharacterFilter) {
_status.brawl.chooseCharacterFilter(event.list, getZhuList(), list3);
}
var num = get.config("choice_" + game.me.identity);
if (event.zhongmode) {
num = 6;
if (
game.me.identity == "zhu" ||
game.me.identity == "nei" ||
game.me.identity == "mingzhong"
) {
num = 8;
}
}
if (stratagemMode) {
list = event.list.slice(0, num);
} else if (game.zhu != game.me) {
event.ai(game.zhu, event.list, getZhuList());
event.list.remove(get.sourceCharacter(game.zhu.name1));
event.list.remove(get.sourceCharacter(game.zhu.name2));
if (_status.brawl && _status.brawl.chooseCharacter) {
list = _status.brawl.chooseCharacter(event.list, num);
if (list === false || list === "nozhu") {
list = event.list.slice(0, num);
}
} else {
list = event.list.slice(0, num);
}
} else {
if (_status.brawl && _status.brawl.chooseCharacter) {
list = _status.brawl.chooseCharacter(getZhuList(), list3, num);
if (list === false) {
if (event.zhongmode) {
list = list3.slice(0, 6);
} else {
list = getZhuList().concat(list3.slice(0, num));
}
} else if (list === "nozhu") {
list = event.list.slice(0, num);
}
} else {
if (event.zhongmode) {
list = list3.slice(0, 8);
} else {
list = getZhuList().concat(list3.slice(0, num));
}
}
}
delete event.swapnochoose;
var dialog;
if (event.swapnodialog) {
dialog = ui.dialog;
event.swapnodialog(dialog, list);
delete event.swapnodialog;
} else {
var str = "选择角色";
if (_status.brawl && _status.brawl.chooseCharacterStr) {
str = _status.brawl.chooseCharacterStr;
}
dialog = ui.create.dialog(str, "hidden", [list, "characterx"]);
if (!_status.brawl || !_status.brawl.noAddSetting) {
if (get.config("change_identity")) {
addSetting(dialog);
}
}
}
if (game.me.special_identity) {
dialog.setCaption("选择角色(" + get.translation(game.me.special_identity) + "");
game.me.node.identity.firstChild.innerHTML = get.translation(
game.me.special_identity + "_bg"
);
} else {
dialog.setCaption("选择角色");
game.me.setIdentity();
}
if (!event.chosen.length) {
game.me.chooseButton(dialog, true).set("onfree", true).selectButton = function () {
if (_status.brawl && _status.brawl.doubleCharacter) return 2;
return get.config("double_character") ? 2 : 1;
};
} else {
lib.init.onfree();
}
ui.create.cheat = function () {
_status.createControl = ui.cheat2;
ui.cheat = ui.create.control("更换", function () {
if (ui.cheat2 && ui.cheat2.dialog == _status.event.dialog) {
return;
}
if (game.changeCoin) {
game.changeCoin(-3);
}
if (game.zhu != game.me) {
event.list.randomSort();
if (_status.brawl && _status.brawl.chooseCharacter) {
list = _status.brawl.chooseCharacter(event.list, num);
if (list === false || list === "nozhu") {
list = event.list.slice(0, num);
}
} else {
list = event.list.slice(0, num);
}
} else {
getZhuList().sort(lib.sort.character);
list3.randomSort();
if (_status.brawl && _status.brawl.chooseCharacter) {
list = _status.brawl.chooseCharacter(getZhuList(), list3, num);
if (list === false) {
if (event.zhongmode) {
list = list3.slice(0, 6);
} else {
list = getZhuList().concat(list3.slice(0, num));
}
} else if (list === "nozhu") {
event.list.randomSort();
list = event.list.slice(0, num);
}
} else {
if (event.zhongmode) {
list = list3.slice(0, 6);
} else {
list = getZhuList().concat(list3.slice(0, num));
}
}
}
var buttons = ui.create.div(".buttons");
var node = _status.event.dialog.buttons[0].parentNode;
_status.event.dialog.buttons = ui.create.buttons(list, "characterx", buttons);
_status.event.dialog.content.insertBefore(buttons, node);
buttons.addTempClass("start");
node.remove();
game.uncheck();
game.check();
});
delete _status.createControl;
};
if (lib.onfree) {
lib.onfree.push(function () {
event.dialogxx = ui.create.characterDialog("heightset");
if (ui.cheat2) {
ui.cheat2.addTempClass("controlpressdownx", 500);
ui.cheat2.classList.remove("disabled");
}
});
} else {
event.dialogxx = ui.create.characterDialog("heightset");
}
ui.create.cheat2 = function () {
ui.cheat2 = ui.create.control("自由选将", function () {
if (this.dialog == _status.event.dialog) {
if (game.changeCoin) {
game.changeCoin(50);
}
this.dialog.close();
_status.event.dialog = this.backup;
this.backup.open();
delete this.backup;
game.uncheck();
game.check();
if (ui.cheat) {
ui.cheat.addTempClass("controlpressdownx", 500);
ui.cheat.classList.remove("disabled");
}
} else {
if (game.changeCoin) {
game.changeCoin(-10);
}
this.backup = _status.event.dialog;
_status.event.dialog.close();
_status.event.dialog = _status.event.parent.dialogxx;
this.dialog = _status.event.dialog;
this.dialog.open();
game.uncheck();
game.check();
if (ui.cheat) {
ui.cheat.classList.add("disabled");
}
}
});
if (lib.onfree) {
ui.cheat2.classList.add("disabled");
}
};
if (!_status.brawl || !_status.brawl.chooseCharacterFixed) {
if (!ui.cheat && get.config("change_choice")) ui.create.cheat();
if (!ui.cheat2 && get.config("free_choose")) ui.create.cheat2();
}
"step 1";
if (ui.cheat) {
ui.cheat.close();
delete ui.cheat;
}
if (ui.cheat2) {
ui.cheat2.close();
delete ui.cheat2;
}
if (event.chosen.length) {
event.choosed = event.chosen;
} else if (event.modchosen) {
if (event.modchosen[0] == "random") event.modchosen[0] = result.buttons[0].link;
else event.modchosen[1] = result.buttons[0].link;
event.choosed = event.modchosen;
} else if (result.buttons.length == 2) {
event.choosed = [result.buttons[0].link, result.buttons[1].link];
game.addRecentCharacter(result.buttons[0].link, result.buttons[1].link);
} else {
event.choosed = [result.buttons[0].link];
game.addRecentCharacter(result.buttons[0].link);
}
var name = event.choosed[0];
if (get.is.double(name)) {
game.me._groupChosen = true;
game.me.chooseControl(get.is.double(name, true)).set("prompt", "请选择你的势力");
} else if (
lib.character[name][1] == "shen" &&
!lib.character[name][4].includes("hiddenSkill") &&
get.config("choose_group")
) {
var list = lib.group.slice(0);
list.remove("shen");
game.me.chooseControl(list).set("prompt", "请选择神武将的势力");
}
"step 2";
event.group = result.control || false;
if (event.choosed.length == 2) {
game.me.init(event.choosed[0], event.choosed[1]);
} else {
game.me.init(event.choosed[0]);
}
event.list.remove(get.sourceCharacter(game.me.name1));
event.list.remove(get.sourceCharacter(game.me.name2));
if (!event.stratagemMode && game.me == game.zhu && game.players.length > 4) {
if (!game.me.isInitFilter("noZhuHp")) {
game.me.hp++;
game.me.maxHp++;
game.me.update();
}
}
for (var i = 0; i < game.players.length; i++) {
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
);
}
}
"step 3";
if (event.group) {
game.me.group = event.group;
game.me.node.name.dataset.nature = get.groupnature(game.me.group);
game.me.update();
}
for (var i = 0; i < game.players.length; i++) {
_status.characterlist.remove(game.players[i].name);
_status.characterlist.remove(game.players[i].name1);
_status.characterlist.remove(game.players[i].name2);
}
"step 4";
if (event.stratagemMode) {
["stratagem_gain", "stratagem_insight", "stratagem_expose"].forEach((globalSkill) =>
game.addGlobalSkill(globalSkill)
);
game.players.forEach((i) => {
i.storage.zhibi = [];
i.storage.stratagem_expose = [];
i.markSkill("stratagem_fury");
});
}
setTimeout(function () {
ui.arena.classList.remove("choose-character");
}, 500);
if (event.special_identity) {
for (var i = 0; i < event.special_identity.length; i++) {
game.zhu.addSkill(event.special_identity[i]);
}
}
});
},
chooseCharacterOL: function () {
if (_status.mode == "purple") {
game.chooseCharacterPurpleOL();
return;
} else if (_status.mode == "stratagem") {
game.chooseCharacterStratagemOL();
return;
}
var next = game.createEvent("chooseCharacter");
next.setContent(function () {
"step 0";
ui.arena.classList.add("choose-character");
var i;
var identityList;
if (_status.mode == "zhong") {
event.zhongmode = true;
identityList = ["zhu", "zhong", "mingzhong", "nei", "fan", "fan", "fan", "fan"];
} else {
identityList = get.identityList(game.players.length);
}
identityList.randomSort();
for (i = 0; i < game.players.length; i++) {
game.players[i].identity = identityList[i];
game.players[i].setIdentity("cai");
game.players[i].node.identity.classList.add("guessing");
if (event.zhongmode) {
if (identityList[i] == "mingzhong") {
game.zhu = game.players[i];
} else if (identityList[i] == "zhu") {
game.zhu2 = game.players[i];
}
} else {
if (identityList[i] == "zhu") {
game.zhu = game.players[i];
}
}
game.players[i].identityShown = false;
}
if (lib.configOL.special_identity && !event.zhongmode && game.players.length == 8) {
var map = {};
var zhongs = game.filterPlayer(function (current) {
return current.identity == "zhong";
});
var fans = game.filterPlayer(function (current) {
return current.identity == "fan";
});
if (fans.length >= 1) {
map.identity_zeishou = fans.randomRemove();
}
if (zhongs.length > 1) {
map.identity_dajiang = zhongs.randomRemove();
map.identity_junshi = zhongs.randomRemove();
} else if (zhongs.length == 1) {
if (Math.random() < 0.5) {
map.identity_dajiang = zhongs.randomRemove();
} else {
map.identity_junshi = zhongs.randomRemove();
}
}
game.broadcastAll(
function (zhu, map) {
for (var i in map) {
map[i].special_identity = i;
}
},
game.zhu,
map
);
event.special_identity = map;
}
game.zhu.setIdentity();
game.zhu.identityShown = true;
game.zhu.isZhu = game.zhu.identity == "zhu";
game.zhu.node.identity.classList.remove("guessing");
game.me.setIdentity();
game.me.node.identity.classList.remove("guessing");
if (game.me.special_identity) {
game.me.node.identity.firstChild.innerHTML = get.translation(
game.me.special_identity + "_bg"
);
}
for (var i = 0; i < game.players.length; i++) {
game.players[i].send(
function (zhu, zhuid, me, identity) {
for (var i in lib.playerOL) {
lib.playerOL[i].setIdentity("cai");
lib.playerOL[i].node.identity.classList.add("guessing");
}
zhu.identityShown = true;
zhu.identity = zhuid;
if (zhuid == "zhu") zhu.isZhu = true;
zhu.setIdentity();
zhu.node.identity.classList.remove("guessing");
me.setIdentity(identity);
me.node.identity.classList.remove("guessing");
if (me.special_identity) {
me.node.identity.firstChild.innerHTML = get.translation(
me.special_identity + "_bg"
);
}
ui.arena.classList.add("choose-character");
},
game.zhu,
game.zhu.identity,
game.players[i],
game.players[i].identity
);
}
var list;
var list2 = [];
var list3 = [];
var list4 = [];
event.list = [];
event.list2 = [];
var libCharacter = {};
for (var i = 0; i < lib.configOL.characterPack.length; i++) {
var pack = lib.characterPack[lib.configOL.characterPack[i]];
for (var j in pack) {
// if(j=='zuoci') continue;
if (lib.character[j]) libCharacter[j] = pack[j];
}
}
for (i in lib.characterReplace) {
var ix = lib.characterReplace[i];
for (var j = 0; j < ix.length; j++) {
if (!libCharacter[ix[j]] || lib.filter.characterDisabled(ix[j]))
ix.splice(j--, 1);
}
if (ix.length) {
event.list.push(i);
event.list2.push(i);
list4.addArray(ix);
var bool = false;
for (var j of ix) {
if (libCharacter[j][4] && libCharacter[j][4].includes("zhu")) {
bool = true;
break;
}
}
(bool ? list2 : list3).push(i);
}
}
game.broadcast(function (list) {
for (var i in lib.characterReplace) {
var ix = lib.characterReplace[i];
for (var j = 0; j < ix.length; j++) {
if (!list.includes(ix[j])) ix.splice(j--, 1);
}
}
}, list4);
for (i in libCharacter) {
if (list4.includes(i)) continue;
if (lib.filter.characterDisabled(i, libCharacter)) continue;
event.list.push(i);
event.list2.push(i);
list4.push(i);
if (libCharacter[i][4] && libCharacter[i][4].includes("zhu")) {
list2.push(i);
} else {
list3.push(i);
}
}
_status.characterlist = list4.slice(0);
if (event.zhongmode) {
list = event.list.randomGets(8);
} else {
var getZhuList = function (list2) {
var limit_zhu = lib.configOL.limit_zhu;
if (!limit_zhu || limit_zhu == "off")
return list2.slice(0).sort(lib.sort.character);
if (limit_zhu != "group") {
var num = parseInt(limit_zhu) || 6;
return list2.randomGets(num).sort(lib.sort.character);
}
var getGroup = function (name) {
if (lib.characterReplace[name])
return lib.character[lib.characterReplace[name][0]][1];
return lib.character[name][1];
};
var list2x = list2.slice(0);
list2x.randomSort();
for (var i = 0; i < list2x.length; i++) {
for (var j = i + 1; j < list2x.length; j++) {
if (getGroup(list2x[i]) == getGroup(list2x[j])) {
list2x.splice(j--, 1);
}
}
}
list2x.sort(lib.sort.character);
return list2x;
};
list = getZhuList(list2).concat(list3.randomGets(5));
}
var next = game.zhu.chooseButton(true);
next.set("selectButton", lib.configOL.double_character ? 2 : 1);
next.set("createDialog", ["选择角色", [list, "characterx"]]);
next.set("ai", function (button) {
return Math.random();
});
"step 1";
if (!game.zhu.name) {
game.zhu.init(result.links[0], result.links[1]);
}
event.list.remove(get.sourceCharacter(game.zhu.name1));
event.list.remove(get.sourceCharacter(game.zhu.name2));
event.list2.remove(get.sourceCharacter(game.zhu.name1));
event.list2.remove(get.sourceCharacter(game.zhu.name2));
if (game.players.length > 4) {
if (!game.zhu.isInitFilter("noZhuHp")) {
game.zhu.maxHp++;
game.zhu.hp++;
game.zhu.update();
}
}
game.broadcast(
function (zhu, name, name2, addMaxHp) {
if (!zhu.name) {
zhu.init(name, name2);
}
if (addMaxHp) {
if (!zhu.isInitFilter("noZhuHp")) {
zhu.maxHp++;
zhu.hp++;
zhu.update();
}
}
},
game.zhu,
result.links[0],
result.links[1],
game.players.length > 4
);
if (game.zhu.group == "shen" && !game.zhu.isUnseen(0)) {
var list = ["wei", "shu", "wu", "qun", "jin", "key"];
for (var i = 0; i < list.length; i++) {
if (!lib.group.includes(list[i])) list.splice(i--, 1);
else list[i] = ["", "", "group_" + list[i]];
}
game.zhu
.chooseButton(["请选择神武将的势力", [list, "vcard"]], true)
.set("ai", function () {
return Math.random();
});
} else if (get.is.double(game.zhu.name1)) {
game.zhu._groupChosen = true;
var list = get.is.double(game.zhu.name1, true);
for (var i = 0; i < list.length; i++) {
if (!lib.group.includes(list[i])) list.splice(i--, 1);
else list[i] = ["", "", "group_" + list[i]];
}
game.zhu
.chooseButton(["请选择你的势力", [list, "vcard"]], true)
.set("ai", function () {
return Math.random();
});
} else event.goto(3);
"step 2";
var name = result.links[0][2].slice(6);
game.zhu.changeGroup(name);
"step 3";
var list = [];
var selectButton = lib.configOL.double_character ? 2 : 1;
var num,
num2 = 0;
if (event.zhongmode) {
num = 6;
} else {
num = Math.floor(event.list.length / (game.players.length - 1));
if (num > 5) {
num = 5;
}
num2 = event.list.length - num * (game.players.length - 1);
if (lib.configOL.double_nei) {
num2 = Math.floor(num2 / 2);
}
if (num2 > 2) {
num2 = 2;
}
}
for (var i = 0; i < game.players.length; i++) {
if (game.players[i] != game.zhu) {
var num3 = 0;
if (event.zhongmode) {
if (game.players[i].identity == "nei" || game.players[i].identity == "zhu") {
num3 = 2;
}
} else {
if (game.players[i].identity == "nei") {
num3 = num2;
}
}
var str = "选择角色";
if (game.players[i].special_identity) {
str += "" + get.translation(game.players[i].special_identity) + "";
}
list.push([
game.players[i],
[str, [event.list.randomRemove(num + num3), "characterx"]],
selectButton,
true,
]);
}
}
game.me.chooseButtonOL(list, function (player, result) {
if (game.online || player == game.me) player.init(result.links[0], result.links[1]);
});
"step 4";
var shen = [];
for (var i in result) {
if (result[i] && result[i].links) {
for (var j = 0; j < result[i].links.length; j++) {
event.list2.remove(get.sourceCharacter(result[i].links[j]));
}
}
}
for (var i in result) {
if (result[i] == "ai") {
result[i] = event.list2.randomRemove(lib.configOL.double_character ? 2 : 1);
for (var j = 0; j < result[i].length; j++) {
var listx = lib.characterReplace[result[i][j]];
if (listx && listx.length) result[i][j] = listx.randomGet();
}
} else {
result[i] = result[i].links;
}
if (
get.is.double(result[i][0]) ||
(lib.character[result[i][0]] &&
lib.character[result[i][0]][1] == "shen" &&
!lib.character[result[i][0]][4].includes("hiddenSkill"))
)
shen.push(lib.playerOL[i]);
}
event.result2 = result;
if (shen.length) {
var list = ["wei", "shu", "wu", "qun", "jin", "key"];
for (var i = 0; i < list.length; i++) {
if (!lib.group.includes(list[i])) list.splice(i--, 1);
else list[i] = ["", "", "group_" + list[i]];
}
for (var i = 0; i < shen.length; i++) {
if (get.is.double(result[shen[i].playerid][0])) {
shen[i]._groupChosen = true;
shen[i] = [
shen[i],
[
"请选择你的势力",
[
get.is
.double(result[shen[i].playerid][0], true)
.map(function (i) {
return ["", "", "group_" + i];
}),
"vcard",
],
],
1,
true,
];
} else shen[i] = [shen[i], ["请选择神武将的势力", [list, "vcard"]], 1, true];
}
game.me
.chooseButtonOL(shen, function (player, result) {
if (player == game.me)
player.changeGroup(result.links[0][2].slice(6), false, false);
})
.set("switchToAuto", function () {
_status.event.result = "ai";
})
.set("processAI", function () {
return {
bool: true,
links: [_status.event.dialog.buttons.randomGet().link],
};
});
} else event._result = {};
"step 5";
if (!result) result = {};
for (var i in result) {
if (result[i] && result[i].links) result[i] = result[i].links[0][2].slice(6);
else if (result[i] == "ai")
result[i] = (function () {
var player = lib.playerOL[i];
var list = ["wei", "shu", "wu", "qun", "jin", "key"];
for (var ix = 0; ix < list.length; ix++) {
if (!lib.group.includes(list[ix])) list.splice(ix--, 1);
}
if (_status.mode != "zhong" && game.zhu && game.zhu.group) {
if (
[
"re_zhangjiao",
"liubei",
"re_liubei",
"caocao",
"re_caocao",
"sunquan",
"re_sunquan",
"zhangjiao",
"sp_zhangjiao",
"caopi",
"re_caopi",
"liuchen",
"caorui",
"sunliang",
"sunxiu",
"sunce",
"re_sunben",
"ol_liushan",
"re_liushan",
"key_akane",
"dongzhuo",
"re_dongzhuo",
"ol_dongzhuo",
"jin_simashi",
"caomao",
].includes(game.zhu.name)
)
return game.zhu.group;
if (game.zhu.name == "yl_yuanshu") {
if (player.identity == "zhong") list.remove("qun");
else return "qun";
}
if (
[
"sunhao",
"xin_yuanshao",
"re_yuanshao",
"re_sunce",
"ol_yuanshao",
"yuanshu",
"jin_simazhao",
"liubian",
].includes(game.zhu.name)
) {
if (player.identity != "zhong") list.remove(game.zhu.group);
else return game.zhu.group;
}
}
return list.randomGet();
})();
}
var result2 = event.result2;
game.broadcast(
function (result, result2) {
for (var i in result) {
if (!lib.playerOL[i].name) {
lib.playerOL[i].init(result[i][0], result[i][1]);
}
if (result2[i] && result2[i].length)
lib.playerOL[i].changeGroup(result2[i], false, false);
}
setTimeout(function () {
ui.arena.classList.remove("choose-character");
}, 500);
},
result2,
result
);
for (var i in result2) {
if (!lib.playerOL[i].name) {
lib.playerOL[i].init(result2[i][0], result2[i][1]);
}
if (result[i] && result[i].length)
lib.playerOL[i].changeGroup(result[i], false, false);
}
if (event.special_identity) {
for (var i in event.special_identity) {
game.zhu.addSkill(i);
}
}
for (var i = 0; i < game.players.length; i++) {
_status.characterlist.remove(game.players[i].name);
_status.characterlist.remove(game.players[i].name1);
_status.characterlist.remove(game.players[i].name2);
}
setTimeout(function () {
ui.arena.classList.remove("choose-character");
}, 500);
});
},
stratagemCamouflage: function () {
var next = game.createEvent("stratagemCamouflage");
next.players = game.players.slice();
if (_status.connectMode) {
next.setContent("stratagemCamouflageOL");
} else {
next.setContent("stratagemCamouflage");
}
},
},
translate: {
zhu: "主",
zhong: "忠",
mingzhong: "忠",
nei: "内",
fan: "反",
commoner: "民",
cai: "猜",
cai2: "猜",
rZhu: "主",
rZhong: "忠",
rNei: "内",
rYe: "野",
rZhu2: "主帅",
rZhong2: "前锋",
rNei2: "细作",
rYe2: "野心家",
bZhu: "主",
bZhong: "忠",
bNei: "内",
bYe: "野",
bZhu2: "主帅",
bZhong2: "前锋",
bNei2: "细作",
bYe2: "野心家",
zhu2: "主公",
zhong2: "忠臣",
mingzhong2: "明忠",
nei2: "内奸",
fan2: "反贼",
commoner2: "平民",
random2: "随机",
enemy: "敌",
friend: "友",
enemy2: "敌方",
friend2: "友方",
identity_junshi_bg: "师",
identity_dajiang_bg: "将",
identity_zeishou_bg: "首",
identity_junshi: "军师",
identity_dajiang: "大将",
identity_zeishou: "贼首",
ai_strategy_1: "均衡",
ai_strategy_2: "偏反",
ai_strategy_3: "偏主",
ai_strategy_4: "酱油",
ai_strategy_5: "天使",
ai_strategy_6: "仇主",
dongcha: "洞察",
dongcha_info: "游戏开始时,随机一名反贼的身份对你可见;准备阶段,你可以弃置场上的一张牌。",
sheshen: "舍身",
sheshen_info:
"锁定技,主公处于濒死状态即将死亡时,令主公+1体力上限回复体力至X点X为你的体力值数获得你的所有牌然后你死亡。",
yexinbilu: "野心毕露",
stratagem_insight: "洞察",
},
element: {
player: {
insightInto: function (target) {
var next = game.createEvent("stratagemInsight");
next.player = this;
next.target = target;
next.setContent("stratagemInsight");
return next;
},
addExpose: function (num) {
if (!game.zhu || !game.zhu.isZhu || !game.zhu.identityShown) return;
if (typeof this.ai.shown == "number" && !this.identityShown && this.ai.shown < 1) {
this.ai.shown += num;
if (this.ai.shown > 0.95) {
this.ai.shown = 0.95;
}
}
return this;
},
yexinbilu: function () {
game.broadcastAll(function (player) {
player.showIdentity();
}, this);
this.gainMaxHp();
this.recover();
},
$dieAfter: function () {
if (_status.video) return;
if (!this.node.dieidentity) {
var str;
if (this.special_identity) {
str = get.translation(this.special_identity);
} else {
str = get.translation(this.identity + "2");
}
var node = ui.create.div(".damage.dieidentity", str, this);
if (str == "野心家") {
node.style.fontSize = "40px";
}
ui.refresh(node);
node.style.opacity = 1;
this.node.dieidentity = node;
}
var trans = this.style.transform;
if (trans) {
if (trans.indexOf("rotateY") != -1) {
this.node.dieidentity.style.transform = "rotateY(180deg)";
} else if (trans.indexOf("rotateX") != -1) {
this.node.dieidentity.style.transform = "rotateX(180deg)";
} else {
this.node.dieidentity.style.transform = "";
}
} else {
this.node.dieidentity.style.transform = "";
}
},
dieAfter2: function (source) {
if (_status.mode == "stratagem") return;
if (_status.mode == "purple") {
if (source) {
if (this.identity == "rZhu" || this.identity == "bZhu") {
if (this.identity.slice(0, 1) != source.identity.slice(0, 1))
source.recover();
} else if (this.identity == "rZhong" || this.identity == "bZhong") {
if (this.identity.slice(0, 1) != source.identity.slice(0, 1)) source.draw(2);
else if (source.identity.indexOf("Zhu") == 1)
source.discard(source.getCards("h"));
} else if (this.identity == "rNei" || this.identity == "bNei") {
if (this.identity.slice(0, 1) == source.identity.slice(0, 1)) source.draw(3);
}
}
if (!_status.yeconfirm) {
_status.yeconfirm = true;
game.addGlobalSkill("yexinbilu");
game.broadcastAll(function () {
if (game.me.identity == "rYe" || game.me.identity == "bYe") {
var player = game.findPlayer(function (current) {
return (
current != game.me &&
(current.identity == "bYe" || current.identity == "rYe")
);
});
if (player) {
player.showIdentity();
}
}
});
}
}
if (this.identity == "fan" && source) source.draw(3);
else if (this.identity == "commoner" && source) source.draw(2);
else if (this.identity == "mingzhong" && source) {
if (source.identity == "zhu") {
source.discard(source.getCards("he"));
} else {
source.draw(3);
}
} else if (
this.identity == "zhong" &&
source &&
source.identity == "zhu" &&
source.isZhu
) {
source.discard(source.getCards("he"));
}
},
dieAfter: function (source) {
if (!this.identityShown) {
game.broadcastAll(
function (player, identity, identity2) {
player.setIdentity(player.identity);
player.identityShown = true;
player.node.identity.classList.remove("guessing");
if (identity) {
player.node.identity.firstChild.innerHTML = get.translation(
identity + "_bg"
);
game.log(player, "的身份是", "#g" + get.translation(identity));
} else {
game.log(player, "的身份是", "#g" + get.translation(identity2 + "2"));
}
},
this,
this.special_identity,
this.identity
);
}
if (this.special_identity) {
game.broadcastAll(
function (zhu, identity) {
zhu.removeSkill(identity);
},
game.zhu,
this.special_identity
);
}
game.checkResult();
if (_status.mode == "purple") {
var red = [];
var blue = [];
game.countPlayer(function (current) {
var identity = current.identity.slice(1);
if (identity != "Zhu") {
if (current.identity.indexOf("r") == 0) red.push(current);
else blue.push(current);
}
});
if (red.length <= 1 && blue.length <= 1) game.broadcastAll(game.showIdentity);
return;
}
if (game.zhu && game.zhu.isZhu) {
if (
(get.population("zhong") + get.population("nei") == 0 ||
get.population("zhong") + get.population("fan") == 0) &&
get.population("commoner") == 0
) {
game.broadcastAll(function () {
if (game.showIdentity) game.showIdentity();
if (
game.zhu &&
game.zhu.isAlive() &&
get.population("nei") == 1 &&
get.config("nei_fullscreenpop")
)
game.me.$fullscreenpop(
'<span style="font-family:xinwei"><span data-nature="fire">主公</span><span data-nature="soil"> vs </span><span data-nature="thunder">内奸</span></span>',
null,
null,
false
);
});
}
}
if (game.zhu && game.zhu.storage.enhance_zhu && get.population("fan") < 3) {
game.zhu.removeSkill(game.zhu.storage.enhance_zhu);
delete game.zhu.storage.enhance_zhu;
}
if (this == game.zhong) {
game.broadcastAll(function (player) {
game.zhu = player;
game.zhu.identityShown = true;
game.zhu.ai.shown = 1;
game.zhu.setIdentity();
game.zhu.isZhu = true;
var skills = player.getStockSkills(true, true).filter((skill) => {
if (player.hasSkill(skill)) return false;
var info = get.info(skill);
return info && info.zhuSkill;
});
if (skills.length) {
player.addSkills(skills);
}
game.zhu.node.identity.classList.remove("guessing");
if (lib.config.animation && !lib.config.low_performance) game.zhu.$legend();
delete game.zhong;
if (_status.clickingidentity && _status.clickingidentity[0] == game.zhu) {
for (var i = 0; i < _status.clickingidentity[1].length; i++) {
_status.clickingidentity[1][i].delete();
_status.clickingidentity[1][i].style.transform = "";
}
delete _status.clickingidentity;
}
}, game.zhu);
game.delay(2);
game.zhu.playerfocus(1000);
}
if (!_status.over) {
var giveup;
if (get.population("fan") + get.population("nei") == 1) {
for (var i = 0; i < game.players.length; i++) {
if (game.players[i].identity == "fan" || game.players[i].identity == "nei") {
giveup = game.players[i];
break;
}
}
} else if (
get.population("zhong") + get.population("mingzhong") + get.population("nei") ==
0
) {
giveup = game.zhu;
}
if (giveup) {
giveup.showGiveup();
}
}
},
logAi: function (targets, card) {
if (this.ai.shown == 1 || this.isMad()) 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;
} else {
var effect = 0,
c,
shown;
var info = get.info(card);
if (info.ai && info.ai.expose) {
if (_status.event.name == "_wuxie" && card.name == "wuxie") {
const infomap = _status.event._info_map;
if (infomap) {
if (this != infomap.target && infomap.player && infomap.player.ai.shown) {
this.ai.shown += 0.2;
}
}
} else {
this.ai.shown += info.ai.expose;
}
}
if (targets.length > 0) {
for (var i = 0; i < targets.length; i++) {
shown = Math.abs(targets[i].ai.shown);
if (shown < 0.2 || targets[i].identity == "nei") c = 0;
else if (shown < 0.4) c = 0.5;
else if (shown < 0.6) c = 0.8;
else c = 1;
var eff = get.effect(targets[i], card, this);
effect += eff * c;
if (
eff == 0 &&
shown == 0 &&
["zhong", "rZhong", "bZhong"].includes(this.identity) &&
targets[i] != this
) {
effect += 0.1;
}
}
}
if (effect > 0) {
if (effect < 1) c = 0.5;
else c = 1;
if (targets.length == 1 && targets[0] == this);
else if (targets.length == 1) this.ai.shown += 0.2 * c;
else this.ai.shown += 0.1 * c;
} else if (
effect < 0 &&
this == game.me &&
["nei", "commoner", "rYe", "bYe"].includes(game.me.identity)
) {
if (targets.length == 1 && targets[0] == this);
else if (targets.length == 1) this.ai.shown -= 0.2;
else this.ai.shown -= 0.1;
}
}
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 (stratagemMode) return;
var marknow =
!_status.connectMode &&
this != game.me &&
get.config("auto_mark_identity") &&
this.ai.identity_mark != "finished";
// if(true){
if (marknow && _status.clickingidentity && _status.clickingidentity[0] == this) {
for (var i = 0; i < _status.clickingidentity[1].length; i++) {
_status.clickingidentity[1][i].delete();
_status.clickingidentity[1][i].style.transform = "";
}
delete _status.clickingidentity;
}
if (!Array.isArray(targets)) {
targets = [];
}
var effect = 0,
c,
shown;
var zhu = game.zhu;
if (_status.mode == "zhong" && !game.zhu.isZhu) {
zhu = game.zhong;
}
if (targets.length == 1 && targets[0] == this) {
effect = 0;
} else if (this.identity != "nei" && this.identity != "commoner") {
if (this.ai.shown > 0) {
if (this.identity == "fan") {
effect = -1;
} else {
effect = 1;
}
}
} else if (targets.length > 0) {
for (var i = 0; i < targets.length; i++) {
shown = Math.abs(targets[i].ai.shown);
if (shown < 0.2 || targets[i].identity == "nei") c = 0;
else if (shown < 0.4) c = 0.5;
else if (shown < 0.6) c = 0.8;
else c = 1;
effect += get.effect(targets[i], card, this, zhu) * c;
}
}
if (this.identity == "nei" || this.identity == "commoner") {
if (effect > 0) {
if (this.ai.identity_mark == "fan") {
if (marknow) this.setIdentity();
this.ai.identity_mark = "finished";
} else {
if (marknow) this.setIdentity("zhong");
this.ai.identity_mark = "zhong";
}
} else if (effect < 0 && get.population("fan") > 0) {
if (this.ai.identity_mark == "zhong") {
if (marknow) this.setIdentity();
this.ai.identity_mark = "finished";
} else {
if (marknow) this.setIdentity("fan");
this.ai.identity_mark = "fan";
}
}
} else if (marknow) {
if (effect > 0 && this.identity != "fan") {
this.setIdentity("zhong");
this.ai.identity_mark = "finished";
} else if (effect < 0 && this.identity == "fan") {
this.setIdentity("fan");
this.ai.identity_mark = "finished";
}
}
// }
},
showIdentity: function () {
this.node.identity.classList.remove("guessing");
this.identityShown = true;
this.ai.shown = 1;
this.setIdentity();
if (this.special_identity) {
this.node.identity.firstChild.innerHTML = get.translation(
this.special_identity + "_bg"
);
}
if (this.identity == "zhu") {
this.isZhu = true;
} else {
delete this.isZhu;
}
if (_status.clickingidentity) {
for (var i = 0; i < _status.clickingidentity[1].length; i++) {
_status.clickingidentity[1][i].delete();
_status.clickingidentity[1][i].style.transform = "";
}
delete _status.clickingidentity;
}
},
},
content: {
stratagemInsight: (event) => {
"step 0";
game.log(player, "洞察了", target, "与其的阵营关系");
"step 1";
var storage = player.storage;
if (!storage.zhibi) storage.zhibi = [];
var zhibi = storage.zhibi;
if (!zhibi.includes(target)) zhibi.push(target);
var insightResult = (event.insightResult = get.insightResult(player, target));
event.videoId = lib.status.videoId++;
var send = (clientTarget, clientInsightResult, id) => {
var classList = clientTarget.classList,
nonStratagemInsightFlashing = classList.contains(
"flash-animation-iteration-count-infinite"
);
if (nonStratagemInsightFlashing) clientTarget.nonStratagemInsightFlashing = true;
else classList.add("flash-animation-iteration-count-infinite");
var identity = get.translation(`${clientInsightResult}2`);
clientTarget.prompt(identity, clientInsightResult);
var dialog = ui.create.dialog(
`${get.translation(clientTarget)}${identity}<br>`,
"forcebutton"
);
ui.create.spinningIdentityCard(clientInsightResult, dialog);
var control = ui.create.control("ok", () => {
dialog.close();
control.close();
_status.imchoosing = false;
_status.event._result = {
bool: true,
};
game.resume();
});
dialog.videoId = id;
game.pause();
game.countChoose();
};
game.broadcastAll(
(clientPlayer, clientTarget, id) => {
if (clientPlayer != game.me)
ui.create.dialog(
`${get.translation(clientPlayer)}正在洞察${get.translation(
clientTarget
)}的阵营...<br>`
).videoId = id;
},
player,
target,
event.videoId
);
if (event.isMine()) send(target, insightResult, event.videoId);
else if (event.isOnline()) {
player.send(send, target, insightResult, event.videoId);
player.wait();
game.pause();
}
"step 2";
game.broadcastAll("closeDialog", event.videoId);
if (
!_status.connectMode &&
get.config("auto_mark_identity") &&
!target.node.identity.firstChild.innerHTML.length
)
game.broadcastAll(
(clientPlayer, clientTarget, insightResult) => {
if (clientPlayer.isUnderControl(true))
clientTarget.setIdentity(insightResult);
},
player,
target,
event.insightResult
);
var afterInsight = (clientTarget) => {
clientTarget.unprompt();
if (clientTarget.nonStratagemInsightFlashing) {
delete clientTarget.nonStratagemInsightFlashing;
return;
}
var classList = clientTarget.classList;
if (classList.contains("flash-animation-iteration-count-infinite"))
classList.remove("flash-animation-iteration-count-infinite");
};
if (event.isMine()) afterInsight(target);
else if (event.isOnline()) player.send(afterInsight, target);
},
stratagemCamouflage: () => {
"step 0";
var camouflaged = (event.targets = game.players
.filter((current) => current.identity == "fan" && !current.ai.stratagemCamouflage)
.randomGets(Math.max(Math.round(get.population() / 6), 1)));
camouflaged.forEach((current) => (current.ai.stratagemCamouflage = true));
var me = game.me;
if (event.players.includes(me) && me.identity == "nei") {
event.videoId = lib.status.videoId++;
var rebel = get.translation("fan2"),
dialog = ui.create.dialog(
`${get.translation(camouflaged)}${rebel}<br>`,
"forcebutton"
);
ui.create.spinningIdentityCard("fan", dialog);
dialog.videoId = event.videoId;
camouflaged.forEach((victim) => {
var classList = victim.classList,
nonCamouflageFlashing = classList.contains(
"flash-animation-iteration-count-infinite"
);
if (nonCamouflageFlashing) victim.nonCamouflageFlashing = true;
else classList.add("flash-animation-iteration-count-infinite");
victim.prompt(rebel, "fan");
});
me.chooseControl("ok").set("dialog", dialog);
}
game.filterPlayer((current) => {
if (current.identity != "nei") return;
var storage = current.storage;
if (!storage.zhibi) storage.zhibi = [];
storage.zhibi.addArray(camouflaged);
});
"step 1";
targets.forEach((current) => {
if (game.me.identity == "nei" && get.config("nei_auto_mark_camouflage"))
current.setIdentity();
current.unprompt();
if (current.nonCamouflageFlashing) {
delete current.nonCamouflageFlashing;
return;
}
var classList = current.classList;
if (classList.contains("flash-animation-iteration-count-infinite"))
classList.remove("flash-animation-iteration-count-infinite");
});
},
stratagemCamouflageOL: () => {
"step 0";
var send = (clientCamouflaged, id, online) => {
var me = game.me;
if (me.identity == "nei") {
var storage = me.storage;
if (!storage.zhibi) storage.zhibi = [];
storage.zhibi.addArray(clientCamouflaged);
var rebel = get.translation("fan2"),
dialog = ui.create.dialog(
`${get.translation(clientCamouflaged)}${rebel}<br>`,
"forcebutton"
);
ui.create.spinningIdentityCard("fan", dialog);
dialog.videoId = id;
clientCamouflaged.forEach((victim) => {
var classList = victim.classList,
nonCamouflageFlashing = classList.contains(
"flash-animation-iteration-count-infinite"
);
if (nonCamouflageFlashing) victim.nonCamouflageFlashing = true;
else classList.add("flash-animation-iteration-count-infinite");
victim.prompt(rebel, "fan");
});
me.chooseControl("ok").set("dialog", dialog);
} else ui.create.dialog("请等待内奸身份确认...").videoId = id;
if (online) game.resume();
};
var camouflaged = (event.targets = game.players
.filter((current) => current.identity == "fan" && !current.ai.stratagemCamouflage)
.randomGets(Math.max(Math.round(get.population() / 6), 1)));
camouflaged.forEach((current) => (current.ai.stratagemCamouflage = true));
event.videoId = lib.status.videoId++;
var time = 10000;
if (lib.configOL && lib.configOL.choose_timeout)
time = parseInt(lib.configOL.choose_timeout) * 1000;
var aiTargets = (event.aiTargets = []);
event.players.forEach((current) => {
current.showTimer(time);
if (current.isOnline()) {
current.send(send, camouflaged, event.videoId, true);
current.wait();
if (current.identity == "nei") event.withOL = true;
return;
}
var me = game.me;
if (current == me) {
event.withMe = true;
send(camouflaged, event.videoId);
if (me.identity == "nei") me.wait();
else
event._result = {
bool: true,
};
return;
}
if (current.identity == "nei") aiTargets.push(current);
});
if (!aiTargets.length) return;
aiTargets.randomSort();
new Promise((resolve) =>
setTimeout(resolve, Math.ceil(5000 + 5000 * Math.random()))
).then(() => {
var interval = setInterval(() => {
aiTargets.shift();
if (aiTargets.length) return;
clearInterval(interval);
if (event.withAI) game.resume();
}, Math.ceil(500 + 500 * Math.random()));
});
"step 1";
if (event.withMe) game.me.unwait(result);
"step 2";
if (event.withOL && !event.resultOL) game.pause();
"step 3";
if (!event.aiTargets.length) return;
event.withAI = true;
game.pause();
"step 4";
game.broadcastAll("closeDialog", event.videoId);
event.players.forEach((current) => current.hideTimer());
var afterCamouflage = (clientCamouflaged) =>
clientCamouflaged.forEach((victim) => {
victim.unprompt();
if (victim.nonCamouflageFlashing) {
delete victim.nonCamouflageFlashing;
return;
}
var classList = victim.classList;
if (classList.contains("flash-animation-iteration-count-infinite"))
classList.remove("flash-animation-iteration-count-infinite");
});
event.players.forEach((current) => {
if (current.isOnline()) {
current.send(afterCamouflage, targets);
return;
}
var me = game.me;
if (current == me && me.identity == "nei") afterCamouflage(targets);
});
},
},
},
get: {
rawAttitude: function (from, to) {
var x = 0,
num = 0,
temp,
i;
if (_status.ai.customAttitude) {
for (i = 0; i < _status.ai.customAttitude.length; i++) {
temp = _status.ai.customAttitude[i](from, to);
if (temp != undefined) {
x += temp;
num++;
}
}
}
if (num) {
return x / num;
}
if (_status.mode == "purple") {
var real = get.realAttitude(from, to);
if (
from == to ||
to.identityShown ||
(from.storage.zhibi && from.storage.zhibi.includes(to)) ||
(_status.yeconfirm &&
["rYe", "bYe"].includes(to.identity) &&
["rYe", "bYe"].includes(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 == "stratagem") {
var x = 0,
num = 0,
temp,
i;
if (_status.ai.customAttitude) {
for (i = 0; i < _status.ai.customAttitude.length; i++) {
temp = _status.ai.customAttitude[i](from, to);
if (temp != undefined) {
x += temp;
num++;
}
}
}
if (num) {
return x / num;
}
var real = get.realAttitude(from, to),
zhibi = from.storage.zhibi,
stratagem_expose = from.storage.stratagem_expose,
followCamouflage = true;
if (to.ai.shown)
return (
to.ai.shown *
(real +
(from.identity == to.identity ||
(from.identity == "zhu" && to.identity == "zhong") ||
(from.identity == "zhong" && to.identity == "zhu") ||
(from.identity == "nei" && to.identity == "zhu" && get.situation() <= 1) ||
(to.identity == "nei" &&
get.situation() <= 0 &&
["zhu", "zhong"].includes(from.identity)) ||
(get.situation() >= 3 && from.identity == "fan")
? 2.9
: -2.9))
);
if (
from == to ||
to.identityShown ||
(((stratagem_expose && stratagem_expose.includes(to)) ||
(zhibi && zhibi.includes(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.includes(current) &&
current.ai.stratagemCamouflage
) {
if (
from.storage.stratagem_expose &&
from.storage.stratagem_expose.includes(to)
)
return -7;
}
}
if (zhibi.includes(to)) return 3;
}
}
}
}
if (
to.identity == "fan" &&
from.identity == "nei" &&
zhibi.includes(game.zhu) &&
game.players
.filter((i) => i != from && !zhibi.includes(i))
.map((i) => i.identity)
.reduce((p, c) => (!p.includes(c) ? p.push(c) && p : p), []).length == 1
)
return real;
for (var fan of game.dead) {
if (fan.identity != "fan" || !fan.storage.stratagem_revitalization) continue;
for (var current of fan.storage.stratagem_expose) {
if (to == current) {
return real;
}
}
}
if (from.identity == "fan" && to.identity == "fan") {
if (from.ai.stratagemCamouflage) {
var zhu =
game.zhu && game.zhu.isZhu && game.zhu.identityShown ? game.zhu : undefined;
if (zhu) {
if (zhu.storage.stratagem_expose && zhu.storage.stratagem_expose.includes(to))
return 0;
}
if (zhibi && zhibi.includes(to)) return -7;
}
if (to.ai.stratagemCamouflage) {
var zhu =
game.zhu && game.zhu.isZhu && game.zhu.identityShown ? game.zhu : undefined;
if (zhu) {
if (zhu.storage.stratagem_expose && zhu.storage.stratagem_expose.includes(to))
return 0;
}
if (zhibi && zhibi.includes(to)) return -7;
}
}
if (
from.identity != "nei" &&
zhibi &&
zhibi.includes(to) &&
!to.identityShown &&
followCamouflage &&
to.ai.stratagemCamouflage
)
return -5;
if (
from.identity != "nei" &&
stratagem_expose &&
stratagem_expose.includes(to) &&
!to.identityShown
)
return -5;
if (zhibi) {
for (var to2 of zhibi) {
if (to2.storage.stratagem_expose) {
if (to2.ai.stratagemCamouflage) {
for (var to3 of to2.storage.stratagem_expose) {
if (zhibi.slice().addArray(stratagem_expose).includes(to3)) {
if (to == to2) {
return real;
}
} else if (to == to3) {
return Math.abs(real + 10) / 10;
}
}
} else {
for (var to3 of to2.storage.stratagem_expose) {
if (
!zhibi.slice().addArray(stratagem_expose).includes(to3) &&
to == to3
) {
return get.rawAttitude(to3, to) * Math.sign(real);
}
}
}
}
}
}
return Math.max(
-1,
Math.min(
-0.1,
(-Math.min(5, to.countCards("hes") / 2 + 1) / 5 - Math.max(0, 5 - to.hp) / 4) / 2
)
);
}
//正常身份模式态度
var difficulty = 0;
if (to == game.me) difficulty = 2 - get.difficulty();
if (
from == to ||
to.identityShown ||
from.storage.dongcha == to ||
to.identityShown ||
(from.storage.zhibi && from.storage.zhibi.includes(to))
) {
return get.realAttitude(from, to) + difficulty * 1.5;
} else {
if (
from.identity == "zhong" &&
to.ai.shown == 0 &&
from.ai.tempIgnore &&
!from.ai.tempIgnore.includes(to)
) {
for (var i = 0; i < game.players.length; i++) {
if (game.players[i].ai.shown == 0 && game.players[i].identity == "fan") {
return -0.1 + difficulty * 1.5;
}
}
}
var aishown = to.ai.shown;
if (
(to.identity == "nei" || to.identity == "commoner") &&
to.ai.shown < 1 &&
(to.ai.identity_mark == "fan" || to.ai.identity_mark == "zhong")
) {
aishown = 0.5;
} else if (aishown == 0 && to.identity != "fan" && to.identity != "zhu") {
var fanshown = true;
for (var i = 0; i < game.players.length; i++) {
if (
game.players[i].identity == "fan" &&
game.players[i].ai.shown == 0 &&
game.players[i] != from
) {
fanshown = false;
break;
}
}
if (fanshown) aishown = 0.3;
}
return get.realAttitude(from, to) * aishown + difficulty * 1.5;
}
},
realAttitude: function (from, to) {
if (_status.mode == "purple") {
if (["rZhu", "rZhong", "bNei"].includes(from.identity)) {
if (to.identity == "rZhu") return 8;
if (["rZhong", "bNei"].includes(to.identity)) return 7;
return -7;
} else if (["bZhu", "bZhong", "rNei"].includes(from.identity)) {
if (to.identity == "bZhu") return 8;
if (["bZhong", "rNei"].includes(to.identity)) return 7;
return -7;
} else {
if (["rYe", "bYe"].includes(to.identity)) return 7;
if (
["rZhu", "bZhu"].includes(to.identity) &&
game.hasPlayer(function (current) {
return ["rZhong", "bZhong", "rNei", "bNei"].includes(current.identity);
})
)
return 6.5;
return -7;
}
} else if (_status.mode == "stratagem") {
if (!game.zhu) {
if (from.identity == "nei" || to.identity == "nei") return -1;
if (from.identity == to.identity) return 6;
return -6;
}
var situation = get.situation();
var identity = from.identity;
var identity2 = to.identity;
if (identity2 == "zhu" && !to.isZhu) {
identity2 = "zhong";
if (from == to) return 10;
}
if (
from != to &&
to.identity == "nei" &&
to.ai.shown < 1 &&
(to.ai.identity_mark == "fan" || to.ai.identity_mark == "zhong")
) {
identity2 = to.ai.identity_mark;
}
if (
from.identity != "nei" &&
from != to &&
get.population("fan") == 0 &&
identity2 == "zhong"
) {
for (var i = 0; i < game.players.length; i++) {
if (
game.players[i].identity == "nei" &&
game.players[i].ai.identity_mark == "zhong" &&
game.players[i].ai.shown < 1
) {
identity2 = "nei";
break;
}
}
}
switch (identity) {
case "zhu":
switch (identity2) {
case "zhu":
return 10;
case "zhong":
return 6;
case "nei":
if (game.players.length == 2) return -10;
if (to.identity == "zhong") return 0;
if (get.population("fan") == 0) {
if (to.ai.identity_mark == "zhong" && to.ai.shown < 1) return 0;
return -1;
}
if (
get.population("fan") == 1 &&
get.population("nei") == 1 &&
game.players.length == 3
) {
var fan;
for (var i = 0; i < game.players.length; i++) {
if (game.players[i].identity == "fan") {
fan = game.players[i];
break;
}
}
if (fan) {
if (
to.hp > 1 &&
to.hp > fan.hp &&
to.countCards("he") > fan.countCards("he")
) {
return -3;
}
}
return 0;
}
if (situation > 1) return Math.max((situation - 8) / 3, -2);
return Math.min(3, get.population("fan"));
case "fan":
if (
get.population("fan") == 1 &&
get.population("nei") == 1 &&
game.players.length == 3
) {
var nei;
for (var i = 0; i < game.players.length; i++) {
if (game.players[i].identity == "nei") {
nei = game.players[i];
break;
}
}
if (nei) {
if (
nei.hp > 1 &&
nei.hp > to.hp &&
nei.countCards("he") > to.countCards("he")
) {
return 0;
}
}
return -3;
}
return -4;
}
break;
case "zhong":
switch (identity2) {
case "zhu":
return 10;
case "zhong":
if (from == to) return 5;
if (get.population("zhong") > 1) return 3;
return 4;
case "nei":
if (get.population("fan") == 0 && get.population("zhong") == 1) return -2;
if (get.population("zhong") >= 1) return Math.min(3, -situation);
return 3;
case "fan":
return -8;
}
break;
case "nei":
if (identity2 == "zhu" && game.players.length == 2) return -10;
if (from != to && identity2 != "zhu" && game.players.length == 3) return -8;
var strategy = get.aiStrategy();
if (strategy == 4) {
if (from == to) return 10;
return 0;
}
var num;
switch (identity2) {
case "zhu":
if (strategy == 6) return -1;
if (strategy == 5) return 10;
if (to.hp <= 0) return 10;
if (get.population("fan") == 1) {
var fan;
for (var i = 0; i < game.players.length; i++) {
if (game.players[i].identity == "fan") {
fan = game.players[i];
break;
}
}
if (fan) {
if (
to.hp > 1 &&
to.hp > fan.hp &&
to.countCards("he") > fan.countCards("he")
) {
return -3;
}
}
return 0;
} else {
if (situation > 1 || get.population("fan") == 0) num = 0;
else num = get.population("fan") + Math.max(0, 3 - game.zhu.hp);
}
if (strategy == 2) num--;
if (strategy == 3) num++;
return num;
case "zhong":
if (strategy == 5) return Math.min(0, -situation);
if (strategy == 6) return Math.max(-1, -situation);
if (get.population("fan") == 0) num = -5;
else if (situation <= 0) num = 0;
else if (game.zhu && game.zhu.hp < 2) num = 0;
else if (game.zhu && game.zhu.hp == 2) num = -1;
else if (game.zhu && game.zhu.hp <= 2 && situation > 1) num = -1;
else num = -2;
if (strategy == 2) num--;
if (strategy == 3) num++;
return num;
case "nei":
if (from == to) return 10;
if (from.ai.friend.includes(to)) return 5;
if (get.population("fan") + get.population("zhong") > 0) return 0;
return -5;
case "fan":
if (strategy == 5) return Math.max(-1, situation);
if (strategy == 6) return Math.min(0, situation);
if ((game.zhu && game.zhu.hp <= 2 && situation < 0) || situation < -1)
num = -3;
else if (situation < 0 || get.population("zhong") == 0) num = -2;
else if ((game.zhu && game.zhu.hp >= 4 && situation > 0) || situation > 1)
num = 1;
else num = 0;
if (strategy == 2) num++;
if (strategy == 3) num--;
return num;
}
break;
case "fan":
switch (identity2) {
case "zhu":
if (get.population("nei") > 0) {
if (situation == 1) return -6;
if (situation > 1) return -5;
}
return -8;
case "zhong":
if (game.zhu.hp >= 3 && to.hp == 1) {
return -10;
}
return -7;
case "nei":
if (get.population("fan") == 1) return 0;
if (get.population("zhong") == 0) return -2;
if (game.zhu && game.zhu.hp <= 2 && game.zhu.identityShown) return -1;
return 3;
case "fan":
return 5;
}
}
}
//正常身份模式态度
if (!game.zhu) {
if (
from.identity == "nei" ||
to.identity == "nei" ||
from.identity == "commoner" ||
to.identity == "commoner"
)
return -1;
if (from.identity == to.identity) return 6;
return -6;
}
var situation = get.situation();
var identity = from.identity;
var identity2 = to.identity;
if (identity2 == "zhu" && !to.isZhu) {
identity2 = "zhong";
if (from == to) return 10;
}
if (
from != to &&
to.identity == "nei" &&
to.ai.shown < 1 &&
(to.ai.identity_mark == "fan" || to.ai.identity_mark == "zhong")
) {
identity2 = to.ai.identity_mark;
}
if (
from.identity != "nei" &&
from.identity != "commoner" &&
from != to &&
get.population("fan") == 0 &&
identity2 == "zhong"
) {
for (var i = 0; i < game.players.length; i++) {
if (
game.players[i].identity == "nei" &&
game.players[i].ai.identity_mark == "zhong" &&
game.players[i].ai.shown < 1
) {
identity2 = "nei";
break;
} else if (
game.players[i].identity == "commoner" &&
game.players[i].ai.identity_mark == "zhong" &&
game.players[i].ai.shown < 1
) {
identity2 = "commoner";
break;
}
}
}
var zhongmode = false;
if (!game.zhu.isZhu) {
zhongmode = true;
}
switch (identity) {
case "zhu":
switch (identity2) {
case "zhu":
return 10;
case "zhong":
case "mingzhong":
return 6;
case "nei":
if (game.players.length == 2) return -10;
if (to.identity == "zhong") return 0;
if (get.population("fan") == 0) {
if (to.ai.identity_mark == "zhong" && to.ai.shown < 1) return 0;
return -0.5;
}
if (zhongmode && to.ai.sizhong && to.ai.shown < 1) return 6;
if (
get.population("fan") == 1 &&
get.population("nei") == 1 &&
game.players.length == 3
) {
var fan;
for (var i = 0; i < game.players.length; i++) {
if (game.players[i].identity == "fan") {
fan = game.players[i];
break;
}
}
if (fan) {
if (
to.hp > 1 &&
to.hp > fan.hp &&
to.countCards("he") > fan.countCards("he")
) {
return -3;
}
}
return 0;
}
if (situation > 1) return 0;
return Math.min(3, get.population("fan"));
case "fan":
if (
get.population("fan") == 1 &&
get.population("nei") == 1 &&
game.players.length == 3
) {
var nei;
for (var i = 0; i < game.players.length; i++) {
if (game.players[i].identity == "nei") {
nei = game.players[i];
break;
}
}
if (nei) {
if (
nei.hp > 1 &&
nei.hp > to.hp &&
nei.countCards("he") > to.countCards("he")
) {
return 0;
}
}
return -3;
}
return -4;
case "commoner":
if (to.identity == "zhong") return 0;
if (get.population("fan") == 0) {
if (to.ai.identity_mark == "zhong" && to.ai.shown < 1) return 0;
return -0.5;
}
if (zhongmode && to.ai.sizhong && to.ai.shown < 1) return 6;
if (game.players.length == 3) {
var fan;
for (var i = 0; i < game.players.length; i++) {
if (game.players[i].identity == "fan") {
fan = game.players[i];
break;
}
}
if (fan) {
if (
to.hp > 1 &&
to.hp > fan.hp &&
to.countCards("he") > fan.countCards("he")
) {
return -3;
}
}
return 3;
}
if (situation < 0 && game.zhu && game.zhu.hp <= 2) return -3.8;
return Math.max(-4, 2 - get.population("fan"));
}
break;
case "zhong":
case "mingzhong":
switch (identity2) {
case "zhu":
return 10;
case "zhong":
case "mingzhong":
return 4;
case "nei":
if (get.population("fan") == 0) return -2;
if (zhongmode && to.ai.sizhong && to.ai.shown < 1) return 6;
return Math.min(3, -situation);
case "fan":
return -8;
case "commoner":
return Math.min(3, Math.max(-3, situation - 0.2));
}
break;
case "nei":
if (identity2 == "zhu" && game.players.length == 2) return -10;
if (
from != to &&
identity2 != "zhu" &&
identity2 != "commoner" &&
game.players.length == 3
)
return -8;
var strategy = get.aiStrategy();
if (strategy == 4) {
if (from == to) return 10;
return 0;
}
var num;
switch (identity2) {
case "zhu":
if (strategy == 6) return -1;
if (strategy == 5) return 10;
if (to.hp <= 0) return 10;
if (get.population("fan") == 1) {
var fan;
for (var i = 0; i < game.players.length; i++) {
if (game.players[i].identity == "fan") {
fan = game.players[i];
break;
}
}
if (fan) {
if (
to.hp > 1 &&
to.hp > fan.hp &&
to.countCards("he") > fan.countCards("he")
) {
return -1.7;
}
}
return 0;
} else {
if (situation > 1 || get.population("fan") == 0) num = 0;
else num = get.population("fan") + Math.max(0, 3 - game.zhu.hp);
}
if (strategy == 2) num--;
if (strategy == 3) num++;
return num;
case "zhong":
if (strategy == 5) return Math.min(0, -situation);
if (strategy == 6) return Math.max(-1, -situation);
if (get.population("fan") == 0) num = -5;
else if (situation <= 0) num = 0;
else if (game.zhu && game.zhu.hp < 2) num = 0;
else if (game.zhu && game.zhu.hp == 2) num = -1;
else if (game.zhu && game.zhu.hp <= 2 && situation > 1) num = -1;
else num = -2;
if (zhongmode && situation < 2) {
num = 4;
}
if (strategy == 2) num--;
if (strategy == 3) num++;
return num;
case "mingzhong":
if (zhongmode) {
if (from.ai.sizhong == undefined) {
from.ai.sizhong = Math.random() < 0.5;
}
if (from.ai.sizhong) return 6;
}
if (strategy == 5) return Math.min(0, -situation);
if (strategy == 6) return Math.max(-1, -situation);
if (get.population("fan") == 0) num = -5;
else if (situation <= 0) num = 0;
else num = -3;
if (strategy == 2) num--;
if (strategy == 3) num++;
return num;
case "nei":
if (from == to) return 10;
if (from.ai.friend.includes(to)) return 5;
if (get.population("fan") + get.population("zhong") > 0) return 0;
return -5;
case "fan":
if (strategy == 5) return Math.max(-1, situation);
if (strategy == 6) return Math.min(0, situation);
if ((game.zhu && game.zhu.hp <= 2 && situation < 0) || situation < -1)
num = -3;
else if (
situation < 0 ||
get.population("zhong") + get.population("mingzhong") == 0
)
num = -2;
else if ((game.zhu && game.zhu.hp >= 4 && situation > 0) || situation > 1)
num = 1;
else num = 0;
if (strategy == 2) num++;
if (strategy == 3) num--;
return num;
case "commoner":
if (game.players.length <= 4) return 5;
return Math.min(Math.max(-situation, -2), 2);
}
break;
case "fan":
switch (identity2) {
case "zhu":
if (get.population("nei") > 0) {
if (situation == 1) return -6;
if (situation > 1) return -5;
}
return -8;
case "zhong":
if (!zhongmode && game.zhu.hp >= 3 && to.hp == 1) {
return -10;
}
return -7;
case "mingzhong":
return -5;
case "nei":
if (zhongmode && to.ai.sizhong) return -7;
if (get.population("fan") == 1) return 0;
if (get.population("zhong") + get.population("mingzhong") == 0) return -7;
if (game.zhu && game.zhu.hp <= 2) return -1;
return Math.min(3, situation);
case "fan":
return 5;
case "commoner":
return 2 * get.population("fan") - 3;
}
break;
case "commoner":
switch (identity2) {
case "zhu":
if (situation > 0) return 2 * Math.min(4, to.hp + to.countCards("h") / 4 - 2);
if (situation >= -3 && game.zhu) return to.hp - 2 + to.countCards("h") / 4; //return Math.min(-0.1,5-game.zhu.hp);
return to.hp + to.countCards("h") / 3 - 4;
case "zhong":
if (situation > 0) {
if (to.hp >= 2)
return Math.min(3, Math.max(1, to.hp + to.countCards("h") / 4 - 4));
else return 0;
}
return -2;
case "nei":
if (game.players.length == 3 && get.population("nei") == 1)
return (
Math.min(3.5, to.hp - 1.5 + to.countCards("h") / 3) -
(to.hp < (game.zhu ? game.zhu.hp : 0) ? 4 : 0)
);
if (game.players.length <= 4 && get.population("nei") == 1)
return Math.min(5, to.hp - 1.5 + to.countCards("h") / 3);
if (situation > 0) return -3;
return 0;
case "fan":
if (situation < 0)
return to.hp + to.countCards("h") / 4 - 1.7 * get.population("fan") + 2;
else if (situation == 0) return 0;
return 0.55 * get.population("fan") - 2.1;
case "commoner":
return from == to ? 10 : to.hp <= 2 ? -2 : 0;
}
break;
}
},
situation: function (absolute) {
var i, j, player;
var zhuzhong = 0,
total = 0,
zhu,
fan = 0;
for (i = 0; i < game.players.length; i++) {
player = game.players[i];
var php = player.hp;
if (player.hasSkill("benghuai") && php > 4) {
php = 4;
} else if (php > 6) {
php = 6;
}
j = player.countCards("h") + player.countCards("e") * 1.5 + php * 2;
if (player.identity == "zhu") {
zhuzhong += j * 1.2 + 5;
total += j * 1.2 + 5;
zhu = j;
} else if (player.identity == "zhong" || player.identity == "mingzhong") {
zhuzhong += j * 0.8 + 3;
total += j * 0.8 + 3;
} else if (player.identity == "fan") {
zhuzhong -= j + 4;
total += j + 4;
fan += j + 4;
}
}
if (absolute) return zhuzhong;
var result = parseInt(10 * Math.abs(zhuzhong / total));
if (zhuzhong < 0) result = -result;
if (!game.zhong) {
if (zhu < 12 && fan > 30) result--;
if (zhu < 6 && fan > 15) result--;
if (zhu < 4) result--;
}
return result;
},
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.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;
},
},
skill: {
stratagem_gain: {
silent: true,
charlotte: true,
ruleSkill: true,
trigger: {
player: ["phaseBegin", "damageEnd"],
},
content: () => {
player.changeFury(trigger.name == "damage" ? trigger.num : 1, true);
},
},
stratagem_insight: {
trigger: {
source: "damageSource",
global: "loseHpEnd",
},
filter: (event, player) => {
if (!player.storage.stratagem_fury) return false;
const target = event.player;
if (target == player || !target.isIn() || target.identityShown) return false;
let source = event.source;
if (event.name == "loseHp") {
const trigger = event.getParent()._trigger;
if (trigger) source = trigger.source;
}
return player == source;
},
logTarget: "player",
prompt2: (event) => `消耗1点怒气洞察${get.translation(event.player)}的身份`,
check: (event, player) => {
const storage = player.storage,
zhibi = storage.zhibi;
if (zhibi && zhibi.includes(event.player)) return false;
const stratagemExpose = storage.stratagem_expose;
if (stratagemExpose && stratagemExpose.includes(event.player)) return false;
if (get.population("zhong") == 0 && player.identity == "fan") return false;
return Math.abs(get.attitude(player, event.player)) <= 1;
},
content: () => {
player.changeFury(-1, true);
player.insightInto(trigger.player);
},
},
stratagem_monarchy: {
trigger: {
player: ["dying", "phaseZhunbeiBegin"],
global: "dieAfter",
},
forced: true,
priority: 100,
popup: false,
unique: true,
firstDo: true,
silent: true,
charlotte: true,
ruleSkill: true,
filter: (event, player, name) => {
if (player.storage.stratagem_monarchy || player.identity != "zhu") return false;
if (name == "dieAfter")
return game.dead.length >= Math.max(Math.round(get.population() / 3), 2);
return (
name == "dying" || game.roundNumber >= Math.max(Math.round(get.population() / 2), 3)
);
},
content: () => {
"step 0";
if (event.triggername == "dying") game.delayx();
"step 1";
player.storage.stratagem_monarchy = true;
game.broadcastAll((clientPlayer) => {
if (!game.zhu) game.zhu = clientPlayer;
clientPlayer.identityShown = true;
clientPlayer.ai.shown = 1;
clientPlayer.setIdentity();
clientPlayer.isZhu = true;
clientPlayer.node.identity.classList.remove("guessing");
var config = lib.config;
if (config.animation && !config.low_performance) clientPlayer.$legend();
var clickingIdentity = _status.clickingidentity;
if (!clickingIdentity || clickingIdentity[0] != clientPlayer) return;
clickingIdentity[1].forEach((element) => {
element.delete();
element.style.transform = "";
});
delete _status.clickingidentity;
}, player);
game.addVideo("showIdentity", player, "zhu");
game.delay(2);
player.playerfocus(1000);
event.trigger("zhuUpdate");
"step 2";
player.recover();
player.draw();
"step 3";
const skills = player.getStockSkills(true, true).filter((stockSkill) => {
if (player.hasSkill(stockSkill)) return;
var info = get.info(stockSkill);
if (!info || !info.zhuSkill) return;
return true;
});
if (skills.length) player.addSkills(skills);
},
},
stratagem_revitalization: {
trigger: {
player: "dying",
},
forced: true,
unique: true,
silent: true,
charlotte: true,
ruleSkill: true,
filter: (event, player) => {
const storage = player.storage;
return (
!storage.stratagem_revitalization &&
player.ai.stratagemCamouflage &&
game.dead.length < Math.max(Math.round(get.population() / 6), 1) &&
storage.stratagem_fury >= 2
);
},
content: () => {
"step 0";
game.delayx();
"step 1";
player.storage.stratagem_revitalization = true;
game.broadcastAll((clientPlayer) => {
clientPlayer.identityShown = true;
clientPlayer.ai.shown = 1;
clientPlayer.setIdentity();
clientPlayer.node.identity.classList.remove("guessing");
if (lib.config.animation && !lib.config.low_performance) clientPlayer.$thunder();
}, player);
game.addVideo("showIdentity", player, "fan");
game.delay(2);
player.playerfocus(800);
"step 2";
player.changeFury(-player.storage.stratagem_fury, true);
player.discard(player.getCards("hej"));
player.link(false);
player.turnOver(false);
player.recover(2 - player.hp);
player.draw(3);
},
},
stratagem_expose: {
trigger: { player: "useCard" },
forced: true,
silent: true,
popup: false,
filter: (event, player) => {
const targets = event.targets;
if (targets.length != 1) return false;
const target = targets[0];
return (
target == player &&
(target.identityShown ||
player.storage.zhibi.includes(target) ||
game.hasPlayer2((current) => {
if (!current.identityShown) return false;
const storage = current.storage;
return (
(storage.stratagem_revitalization || storage.stratagem_monarchy) &&
storage.stratagem_expose.includes(target)
);
}))
);
},
content: () => {
var storage = trigger.targets[0].storage;
if (!storage.stratagem_expose) storage.stratagem_expose = [];
storage.stratagem_expose.add(player);
},
},
yexinbilu: {
enable: "phaseUse",
filter: function (event, player) {
return player.identity == "rYe" || player.identity == "bYe";
},
skillAnimation: "legend",
animationColor: "thunder",
content: function () {
game.removeGlobalSkill("yexinbilu");
player.yexinbilu();
},
ai: {
order: 10,
result: {
player: function (player) {
return (
1 -
game.countPlayer(function (current) {
return (
current != player &&
(current.identity == "rYe" || current.identity == "bYe") &&
(current == game.me || current.isOnline())
);
})
);
},
},
},
},
identity_junshi: {
name: "军师",
mark: true,
intro: {
content:
"准备阶段开始时,可以观看牌堆顶的三张牌,然后将这些牌以任意顺序置于牌堆顶或牌堆底",
},
trigger: { player: "phaseZhunbeiBegin" },
silent: true,
content: function () {
"step 0";
var cards = get.cards(3);
game.cardsGotoOrdering(cards);
var next = player.chooseToMove();
next.set("list", [["牌堆顶", cards], ["牌堆底"]]);
next.set("prompt", "观星:点击将牌移动到牌堆顶或牌堆底");
next.processAI = function (list) {
var cards = list[0][1],
player = _status.event.player;
var top = [];
var judges = player.getCards("j");
var stopped = false;
if (!player.hasWuxie()) {
for (var i = 0; i < judges.length; i++) {
var judge = get.judge(judges[i]);
cards.sort(function (a, b) {
return judge(b) - judge(a);
});
if (judge(cards[0]) < 0) {
stopped = true;
break;
} else {
top.unshift(cards.shift());
}
}
}
var bottom;
if (!stopped) {
cards.sort(function (a, b) {
return get.value(b, player) - get.value(a, player);
});
while (cards.length) {
if (get.value(cards[0], player) <= 5) break;
top.unshift(cards.shift());
}
}
bottom = cards;
return [top, bottom];
};
"step 1";
var top = result.moved[0];
var bottom = result.moved[1];
top.reverse();
for (var i = 0; i < top.length; i++) {
ui.cardPile.insertBefore(top[i], ui.cardPile.firstChild);
}
for (i = 0; i < bottom.length; i++) {
ui.cardPile.appendChild(bottom[i]);
}
player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下");
game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶");
game.updateRoundNumber();
game.delayx();
},
},
identity_dajiang: {
name: "大将",
mark: true,
intro: {
content: "手牌上限+1",
},
mod: {
maxHandcard: function (player, num) {
return num + 1;
},
},
},
identity_zeishou: {
name: "贼首",
mark: true,
intro: {
content: "手牌上限-1",
},
mod: {
maxHandcard: function (player, num) {
return num - 1;
},
},
},
dongcha: {
trigger: { player: "phaseBegin" },
direct: true,
unique: true,
filter: function (event, player) {
return game.hasPlayer(function (current) {
return current.countCards("ej");
});
},
forceunique: true,
content: function () {
"step 0";
player
.chooseTarget(get.prompt("dongcha"), function (card, player, target) {
return target.countCards("ej") > 0;
})
.set("ai", function (target) {
var player = _status.event.player;
var att = get.attitude(player, target);
if (att > 0) {
var js = target.getCards("j");
if (js.length) {
var jj = js[0].viewAs ? { name: js[0].viewAs } : js[0];
if (
jj.name == "guohe" ||
js.length > 1 ||
get.effect(target, jj, target, player) < 0
) {
return 2 * att;
}
}
if (
target.getEquip("baiyin") &&
target.isDamaged() &&
get.recoverEffect(target, player, player) > 0
) {
if (target.hp == 1 && !target.hujia) return 1.6 * att;
if (target.hp == 2) return 0.01 * att;
return 0;
}
}
var es = target.getCards("e");
var noe = target.hasSkillTag("noe");
var noe2 = es.length == 1 && es[0].name == "baiyin" && target.isDamaged();
if (noe || noe2) return 0;
if (att <= 0 && !es.length) return 1.5 * att;
return -1.5 * att;
});
"step 1";
if (result.bool) {
event.target = result.targets[0];
event.target.addExpose(0.1);
player.logSkill("dongcha", event.target);
game.delayx();
} else {
event.finish();
}
"step 2";
if (event.target) {
player.discardPlayerCard("ej", true, event.target);
}
},
group: ["dongcha_begin", "dongcha_log"],
subSkill: {
begin: {
trigger: { global: "gameStart" },
forced: true,
popup: false,
content: function () {
var list = [];
for (var i = 0; i < game.players.length; i++) {
if (game.players[i].identity == "fan") {
list.push(game.players[i]);
}
}
var target = list.randomGet();
player.storage.dongcha = target;
if (!_status.connectMode) {
if (player == game.me) {
target.setIdentity("fan");
target.node.identity.classList.remove("guessing");
target.fanfixed = true;
player.line(target, "green");
player.popup("dongcha");
}
} else {
player
.chooseControl("ok")
.set("dialog", [
get.translation(target) + "是反贼",
[[target.name], "character"],
]);
}
},
},
log: {
trigger: { player: "useCard" },
forced: true,
popup: false,
filter: function (event, player) {
return (
event.targets.length == 1 &&
event.targets[0] == player.storage.dongcha &&
event.targets[0].ai.shown < 0.95
);
},
content: function () {
trigger.targets[0].addExpose(0.2);
},
},
},
},
sheshen: {
trigger: { global: "dieBefore" },
forced: true,
unique: true,
forceunique: true,
filter: function (event, player) {
return event.player == game.zhu && player.hp > 0;
},
logTarget: "player",
content: function () {
"step 0";
trigger.player.gainMaxHp();
"step 1";
var dh = player.hp - trigger.player.hp;
if (dh > 0) {
trigger.player.recover(dh);
}
"step 2";
var cards = player.getCards("he");
if (cards.length) {
trigger.player.gain(cards, player);
player.$giveAuto(cards, trigger.player);
}
"step 3";
trigger.cancel();
player.die();
},
},
},
help: {
身份模式:
'<div style="margin:10px">选项</div><ul style="margin-top:0"><li>加强主公<br>反贼人数多于2时主公会额外增加一个技能每个主公的额外技能固定非常备主公增加天命' +
'<li>特殊身份<br><ul style="padding-left:20px;padding-top:5px"><li>军师:忠臣身份。只要军师存活,主公在准备阶段开始时,可以观看牌堆顶的三张牌,然后将这些牌以任意顺序置于牌堆顶或牌堆底<li>大将:忠臣身份。只要大将存活,主公手牌上限+1<li>贼首:反贼身份,只要贼首存活,主公手牌上限-1</ul></ul>' +
"<li>平民身份<br>英盗版三国杀于2017标准版中提出的新概念。平民的获胜条件为当其他身份的角色达成了其获胜条件且你存活你也获胜同时内奸的获胜条件改为主公死亡时场上所有忠臣和反贼均已死亡。即内奸可以和与平民共同胜利。杀死平民的角色的奖惩为摸两张牌。" +
"<li>年机制<br>英盗版三国杀于2019标准版中提出的新概念。“年”是一个全局概念游戏开始时为第一年当牌堆洗牌时年数+1。一局游戏的限定年数为本局游戏开始时玩家总数。当年数增加后若当前年数已超过限定年数则主忠方直接获胜若平民存活则平民也获胜。",
明忠模式:
'<div style="margin:10px">明忠模式(忠胆英杰)</div><ul style="margin-top:0"><li>本模式需要8名玩家进行游戏使用的身份牌为1主公、2忠臣、4反贼和1内奸。游戏开始时每名玩家随机获得一个身份由系统随机选择一名忠臣身份的玩家亮出身份将忠臣牌正面朝上放在面前其他身份包括主公的玩家不亮出身份。<li>' +
"首先由亮出身份的忠臣玩家随机获得六张武将牌,挑选一名角色,并将选好的武将牌展示给其他玩家。之后其余每名玩家随机获得三张武将牌,各自从其中挑选一张同时亮出<li>" +
"亮出身份牌的忠臣增加1点体力上限。角色濒死和死亡的结算及胜利条件与普通身份局相同。",
谋攻模式:
'<div style="margin:10px">模式命名由来</div><ul style="margin-top:0"><li>《谋攻篇》一词出自《孙子兵法·谋攻篇》,是春秋时期兵法家孙武创作的一篇散文。《谋攻篇》故知胜有五:知可以战与不可以战者胜,识众寡之用者胜,上下同欲者胜,以虞待不虞者胜,将能而君不御者胜。</ul>' +
'<div style="margin:10px">游戏规则</div><ul style="margin-top:0"><li>谋攻篇模式为六名玩家参与的全暗身份模式,引入新机制“怒气”,玩家可以消耗怒气探查其他角色的身份是敌人或者队友,或使用怒气强化手牌,以达到识别出队友并击杀敌人的目标。' +
"<li>各身份玩家的胜利条件与身份局中对应身份的胜利条件一致,且该模式下没有奖惩。" +
"<li>当主公进入濒死、场上有两名角色阵亡、第三轮的主公准备阶段主公将会翻开身份牌回复1点体力并摸一张牌并获得武将牌上的主公技。" +
"<li>内奸在游戏开始时将会得知一名反贼的身份并令该反贼被“伪装”。本局游戏内被“伪装”的反贼在被任何人探查身份时结果都提示为“敌人”。作为补偿其第一次进入濒死时若场上没有角色死亡且其怒气值不小于2其弃置区域内所有牌重置武将牌将体力回复至2点并摸三张牌。" +
"<li>特殊地,内奸在被所有角色探查时,都提示为“队友”;内奸在进行探查时,直接得知目标的身份。</ul>" +
'<div style="margin:10px">新机制“怒气”</div><ul style="margin-top:0"><li>一名角色在回合开始时或受到1点伤害后将获得1点怒气怒气上限为3。<li>一名角色令其他角色扣减体力后该角色可以消耗1点怒气查探扣减体力的角色是敌或友。</ul>' +
'<div style="margin:10px">强化卡牌规则</div><ul style="margin-top:0"><li>在第二轮游戏开始后,当你需要使用一张“强化表”内的牌时,你可以通过消耗怒气将此牌强化。' +
'<li>可强化卡牌<br><ul style="padding-left:20px;padding-top:5px">' +
"<li>【杀】消耗1点怒气进行强化你令响应此杀所需使用的【闪】数+1" +
"<li>【闪】消耗1点怒气进行强化使用时视为两张【闪】的效果" +
"<li>【决斗】消耗2点怒气进行强化对此牌的目标造成伤害时伤害+1" +
"<li>【火攻】消耗2点怒气进行强化造成的伤害+1" +
"<li>【桃】消耗3点怒气进行强化回复的体力+1</ul></ul>",
"3v3v2":
'<div style="margin:10px">3v3v2模式</div><ul style="margin-top:0"><li>游戏准备<br>本模式需要8名玩家进行游戏。游戏开始前所有玩家随机分成两组每组四人分别称为「冷色阵营」和「暖色阵营」然后分发身份牌抽取到「主帅」身份的玩家亮出身份牌。' +
"<li>身份牌<br>每组的身份分为四种。<br>主帅(主)和前锋(忠):联合对方阵营的细作,击杀己方细作,对方阵营的主帅和前锋以及所有的野心家。<br>细作(内):帮助对方阵营的主帅和前锋,击杀对方细作,己方阵营的主帅和前锋以及所有的野心家。<br>野心家(野):联合对方阵营中的野心家,击杀所有其他角色,成为最后的生还者。<br>" +
"<li>胜负判定<br>冷色主帅,先锋和暖色细作在所有野心家和对方主帅全部阵亡后视为胜利,在冷色主帅阵亡后视为游戏失败。<br>暖色主帅,先锋和冷色细作在所有野心家和对方主帅阵亡后视为胜利,在暖色主帅阵亡后视为失败。<br>野心家在所有不为野心家的角色阵亡后视为胜利,在双方主帅全部阵亡而有非野心家角色存活时失败。<br>当有角色阵亡后,若有角色满足胜利条件,游戏结束。若所有角色均满足失败条件,则游戏平局。若一名角色满足失败条件,即使其满足胜利条件,也视为游戏失败。<br>" +
"<li>游戏流程<br>在「游戏准备」中的工作完成后,冷色主帅选择一个势力,然后暖色主帅选择一个其他势力,作为双方各自的势力将池。<br>双方主帅从各自的势力将池中获得两张常备主公武将牌和四张非常备主公武将牌,然后选择一张作为武将牌,将其他的武将牌放回势力将池并洗混。然后双方的其他玩家从各自的势力将池中随机获得五张武将牌,选择一张作为自己的武将牌。<br>暖色主帅成为游戏的一号位双方主帅各加1点体力和体力上限。七号位和八号位的起始手牌+1。<br>当场上第一次有玩家死亡时野心家确认彼此的身份牌然后获得技能〖野心毕露〗出牌阶段你可以明置身份牌加1点体力上限和体力值。若如此做所有的野心家失去技能〖野心毕露〗<br>" +
"<li>击杀奖惩<br>杀死颜色不同的主帅的角色回复1点体力杀死颜色不同的先锋的角色摸两张牌杀死颜色相同的细作的角色摸三张牌杀死颜色相同的先锋的主帅弃置所有手牌。<br>" +
"<li>制作团队<br>游戏出品:紫星居<br>游戏设计:食茸貳拾肆<br>游戏开发食茸貳拾肆、紫髯的小乔、聆星Mine、空城琴音依旧弥漫、丽景原同志、雪之彩翼、拉普拉斯、明月照沟渠<br>程序化:无名杀<br>鸣谢:荆哲、魔风、萨巴鲁酱、这就是秋夜</ul></ul>",
},
};
});