"use strict";
game.import("mode", function (lib, game, ui, get, ai, _status) {
	return {
		name: "doudizhu",
		start: function () {
			"step 0";
			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) {
				game.prepareArena(3);
			}
			"step 1";
			event.replacePile = function () {
				var map = {
					shuiyanqijunx: "shuiyanqijuny",
					bingliang: "binglinchengxia",
					fangtian: "toushiche",
					wutiesuolian: "toushiche",
				};
				for (var i = 0; i < lib.card.list.length; i++) {
					var name = lib.card.list[i][2];
					if (map[name]) {
						lib.card.list[i][2] = map[name];
						lib.card.list[i][4] = null;
						lib.card.list[i]._replaced = true;
					} else if (name == "lebu") {
						switch (lib.card.list[i][0]) {
							case "spade":
								lib.card.list[i][2] = "shuiyanqijuny";
								break;
							case "club":
								lib.card.list[i][2] = "luojingxiashi";
								break;
							default:
								lib.card.list[i][2] = "baiyidujiang";
								break;
						}
						lib.card.list[i]._replaced = true;
					}
				}
			};
			_status.mode = get.config("doudizhu_mode");
			if (_status.connectMode) {
				_status.mode = lib.configOL.doudizhu_mode;
				game.waitForPlayer(function () {
					lib.configOL.number = 3;
				});
			} else if (_status.mode == "binglin") {
				event.replacePile();
			} else if (_status.mode == "online") {
				lib.card.list = lib.online_cardPile.slice(0);
				lib.inpile.addArray(["nanman", "wanjian", "taoyuan", "wugu"]);
				game.fixedPile = true;
			}
			"step 2";
			if (_status.connectMode) {
				if (_status.mode == "online") {
					lib.card.list = lib.online_cardPile.slice(0);
					lib.inpile.addArray(["nanman", "wanjian", "taoyuan", "wugu"]);
					game.fixedPile = true;
				} else if (_status.mode == "binglin") event.replacePile();
				if (lib.configOL.number < 3) {
					lib.configOL.number = 3;
				}
				game.randomMapOL();
			} else {
				for (var i = 0; i < game.players.length; i++) {
					game.players[i].getId();
				}
				game.chooseCharacter();
			}
			"step 3";
			if (ui.coin) {
				_status.coinCoeff = get.coinCoeff([game.me.name]);
			}
			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);
			switch (_status.mode) {
				case "online":
					game.addGlobalSkill("online_juzhong");
					game.addGlobalSkill("online_zhadan_button");
					game.addGlobalSkill("online_zhadan");
					game.addGlobalSkill("online_aozhan");
					game.addGlobalSkill("online_gongshoujintui");
					break;
				case "binglin":
					game.addGlobalSkill("binglin_bingjin");
					break;
				default:
					if (!game.zhu.isInitFilter("noZhuSkill")) {
						game.zhu.addSkill("feiyang");
						game.zhu.addSkill("bahu");
					}
			}
			game.syncState();
			event.trigger("gameStart");

			var players = get.players(lib.sort.position);
			var info = [];
			for (var i = 0; i < players.length; i++) {
				info.push({
					name: players[i].name1,
					name2: players[i].name2,
					identity: players[i].identity,
				});
			}
			_status.videoInited = true;
			game.addVideo("init", null, info);
			if (_status.mode == "kaihei") game.addGlobalSkill("kaihei");

			var next = game.gameDraw(game.zhu || _status.firstAct || game.me);
			if (_status.mode == "online") {
				game.zhu.$equip(game.createCard("diqi", "club", 13));
				next.num = function (player) {
					var num = 4;
					if (player == game.zhu) {
						if (lib.character[player.name1] && get.infoHp(lib.character[player.name1][2]) > 3)
							num++;
						if (lib.character[player.name2] && get.infoHp(lib.character[player.name2][2]) > 3)
							num++;
					}
					return num;
				};
			} else if (_status.mode == "binglin") {
				next.num = function (player) {
					return player == game.zhu ? 5 : 4;
				};
			}
			if (_status.mode != "online" && _status.connectMode && lib.configOL.change_card)
				game.replaceHandcards(game.players.slice(0));
			game.phaseLoop(game.zhu || _status.firstAct || game.me);
			game.zhu.showGiveup();
		},
		game: {
			canReplaceViewpoint: () => true,
			recommendDizhu: [
				"re_guojia",
				"re_huanggai",
				"re_lvbu",
				"re_guanyu",
				"re_sunquan",
				"re_xusheng",
				"re_wuyi",
				"re_sunben",
				"xuyou",
				"zhangchunhua",
				"caochong",
				"zhangsong",
				"zhongyao",
				"wangyi",
				"caochun",
				"maliang",
				"sp_diaochan",
				"quyi",
				"sp_zhaoyun",
				"shamoke",
				"lijue",
				"liuzan",
				"wenyang",
				"shen_lvmeng",
				"shen_ganning",
				"jiakui",
				"wangyuanji",
				"lingcao",
				"miheng",
				"sp_key_yuri",
				"key_hinata",
				"key_rin",
				"key_kyousuke",
				"ns_chendao",
				"jiakui",
				"haozhao",
			],
			addRecord: function (bool) {
				if (typeof bool == "boolean") {
					var data = lib.config.gameRecord.doudizhu.data;
					var identity = game.me.identity;
					if (!data[identity]) {
						data[identity] = [0, 0];
					}
					if (bool) {
						data[identity][0]++;
					} else {
						data[identity][1]++;
					}
					var list = ["zhu", "fan"];
					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.doudizhu.str = str;
					game.saveConfig("gameRecord", lib.config.gameRecord);
				}
			},
			getState: function () {
				var state = {};
				for (var i in lib.playerOL) {
					var player = lib.playerOL[i];
					state[i] = { identity: player.identity };
				}
				return state;
			},
			updateState: function (state) {
				for (var i in state) {
					var player = lib.playerOL[i];
					if (player) {
						player.identity = state[i].identity;
					}
				}
			},
			updateRoundNumber: function () {
				if (_status.mode == "online") {
					game.broadcastAll(
						function (num1, num2, top, bonusNum) {
							if (ui.cardPileNumber) {
								var str = num1 + "轮 公共牌堆: " + num2;
								if (
									game.me &&
									game.me.storage.doudizhu_cardPile &&
									game.me.storage.doudizhu_cardPile.length
								)
									str += " 个人牌堆: " + game.me.storage.doudizhu_cardPile.length;
								if (bonusNum) str += "<br>本场叫价: " + bonusNum * 100;
								ui.cardPileNumber.innerHTML = str;
							}
							_status.pileTop = top;
						},
						game.roundNumber,
						ui.cardPile.childNodes.length,
						ui.cardPile.firstChild,
						game.bonusNum
					);
					return;
				}
				game.broadcastAll(
					function (num1, num2, top) {
						if (ui.cardPileNumber) ui.cardPileNumber.innerHTML = num1 + "轮 剩余牌: " + num2;
						_status.pileTop = top;
					},
					game.roundNumber,
					ui.cardPile.childNodes.length,
					ui.cardPile.firstChild
				);
			},
			getRoomInfo: function (uiintro) {
				uiintro.add(
					'<div class="text chat">双将模式:' + (lib.configOL.double_character ? "开启" : "关闭")
				);
				// 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) {
					uiintro.add('<div class="text chat">禁用武将:' + get.translation(lib.configOL.banned));
				}
				if (lib.configOL.bannedcards.length) {
					uiintro.add(
						'<div class="text chat">禁用卡牌:' + get.translation(lib.configOL.bannedcards)
					);
				}
				uiintro.style.paddingBottom = "8px";
			},
			getVideoName: function () {
				var str = get.translation(game.me.name);
				if (game.me.name2) {
					str += "/" + get.translation(game.me.name2);
				}
				var namex;
				switch (_status.mode) {
					case "normal":
						namex = "休闲斗地主";
						break;
					case "kaihei":
						namex = "开黑斗地主";
						break;
					case "huanle":
						namex = "欢乐斗地主";
						break;
					case "binglin":
						namex = "兵临城下";
						break;
					case "online":
						namex = "智斗三国";
						break;
				}
				var name = [str, namex + " - " + lib.translate[game.me.identity + "2"]];
				return name;
			},
			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].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 (game.zhu.isAlive()) {
					if (
						_status.mode != "online" &&
						(_status.mode != "binglin" || game.roundNumber < 3) &&
						game.players.length > 1
					)
						return;
					if (me == game.zhu) {
						game.over(true);
					} else {
						game.over(false);
					}
				} else {
					if (me == game.zhu) {
						game.over(false);
					} else {
						game.over(true);
					}
				}
			},
			checkOnlineResult: function (player) {
				if (game.zhu.isAlive()) {
					return player.identity == "zhu";
				} else return player.identity == "fan";
			},
			chooseCharacterZhidou: function () {
				var next = game.createEvent("chooseCharacter");
				next.setContent(function () {
					"step 0";
					game.no_continue_game = true;
					lib.init.onfree();
					"step 1";
					ui.arena.classList.add("choose-character");
					var i;
					var groups = [];
					event.list = [];
					event.map = {};
					var chara = get.config("character_online") || lib.characterOnline;
					for (i in chara) {
						var list = chara[i];
						for (var j = 0; j < list.length; j++) {
							if (
								!lib.character[list[j]] ||
								(i == "key" && lib.filter.characterDisabled(list[j]))
							)
								list.splice(j--, 1);
						}
						if (list.length >= 3) {
							groups.push(i);
							event.list.addArray(list);
						}
					}
					event.list.randomSort();
					_status.characterlist = event.list.slice(0);
					event.controls = ["不叫地主", "一倍", "两倍", "三倍"];
					for (var player of game.players) {
						var id = player.playerid;
						player._group = groups.randomRemove(1)[0];
						event.map[id] = chara[player._group].randomGets(4);
						player.storage.doudizhu_cardPile = get.cards(20).sort(function (a, b) {
							if (a.name != b.name) return lib.sort.card(a.name, b.name);
							else if (a.suit != b.suit) return lib.suit.indexOf(a) - lib.suit.indexOf(b);
							else return a.number - b.number;
						});
					}
					event.dialog = ui.create.dialog(
						"你的选将框与底牌",
						[event.map[game.me.playerid], "character"],
						game.me.storage.doudizhu_cardPile
					);
					event.start = game.players.randomGet();
					event.current = event.start;
					game.delay(7);
					"step 2";
					event.current.classList.add("glow_phase");
					if (event.current == game.me) event.dialog.content.firstChild.innerHTML = "是否叫地主?";
					else {
						event.dialog.content.firstChild.innerHTML = "请等待其他玩家叫地主";
						game.delay(2);
					}
					event.current.chooseControl(event.controls).set("ai", function () {
						return _status.event.getParent().controls.randomGet();
					});
					"step 3";
					event.current.classList.remove("glow_phase");
					event.current._control = result.control;
					event.current.chat(result.control);
					if (result.control == "三倍") {
						game.bonusNum = 3;
						game.zhu = event.current;
						return;
					} else if (result.control != "不叫地主") {
						event.controls.splice(1, event.controls.indexOf(result.control));
						event.tempDizhu = event.current;
						if (result.control == "二倍") game.bonusNum = 2;
					}
					event.current = event.current.next;
					if (
						event.current == event.start &&
						(event.start == event.tempDizhu || event.start._control == "不叫地主")
					) {
						game.zhu = event.tempDizhu || event.start.previous;
					} else if (event.current == event.start.next && event.current._control) {
						game.zhu = event.tempDizhu;
					} else event.goto(2);
					if (event.current == event.start.previous && !event.tempDizhu)
						event.controls.remove("不叫地主");
					"step 4";
					game.updateRoundNumber();
					for (var player of game.players) {
						player.identity = player == game.zhu ? "zhu" : "fan";
						player.showIdentity();
					}
					event.dialog.content.firstChild.innerHTML =
						"请选择" + get.cnNumber(game.me == game.zhu ? 2 : 1) + "张武将牌";
					game.me
						.chooseButton(event.dialog, true, game.me == game.zhu ? 2 : 1)
						.set("filterButton", function (button) {
							return typeof button.link == "string";
						});
					"step 5";
					game.me.init(result.links[0], result.links[1]);
					for (var player of game.players) {
						if (player != game.me) {
							if (player == game.zhu) {
								var list = event.map[player.playerid].randomGets(2);
								player.init(list[0], list[1]);
							} else player.init(event.map[player.playerid].randomGet());
						}
						player.markSkill("doudizhu_cardPile");
					}
					game.zhu.hp = 4;
					game.zhu.maxHp = 4;
					game.zhu.update();
					for (var i = 0; i < game.players.length; i++) {
						_status.characterlist.remove(game.players[i].name1);
						_status.characterlist.remove(game.players[i].name2);
					}
					setTimeout(function () {
						ui.arena.classList.remove("choose-character");
					}, 500);
				});
			},
			chooseCharacterBinglin: function () {
				var next = game.createEvent("chooseCharacter");
				next.setContent(function () {
					"step 0";
					game.no_continue_game = true;
					lib.init.onfree();
					"step 1";
					ui.arena.classList.add("choose-character");
					game.zhuSkill = "zhuSkill_" + ["xiangyang", "jiangling", "fancheng"].randomGet();
					var i;
					event.list = [];
					event.map = {};
					for (i in lib.character) {
						if (lib.filter.characterDisabled(i)) continue;
						event.list.push(i);
					}
					event.list.randomSort();
					_status.characterlist = event.list.slice(0);
					for (var player of game.players) {
						event.map[player.playerid] = event.list.randomRemove(4);
					}
					event.controls = ["不叫地主", "一倍", "两倍", "三倍"];
					event.dialog = ui.create.dialog("本局城池:" + get.translation(game.zhuSkill), [
						event.map[game.me.playerid],
						"character",
					]);
					event.start = game.players.randomGet();
					event.current = event.start;
					game.delay(8);
					"step 2";
					event.current.classList.add("glow_phase");
					if (event.current == game.me) event.dialog.content.firstChild.innerHTML = "是否叫地主?";
					else {
						event.dialog.content.firstChild.innerHTML = "请等待其他玩家叫地主";
						game.delay(2);
					}
					event.current.chooseControl(event.controls).set("ai", function () {
						return _status.event.getParent().controls.randomGet();
					});
					"step 3";
					event.current.classList.remove("glow_phase");
					event.current._control = result.control;
					event.current.chat(result.control);
					if (result.control == "三倍") {
						game.bonusNum = 3;
						game.zhu = event.current;
						return;
					} else if (result.control != "不叫地主") {
						event.controls.splice(1, event.controls.indexOf(result.control));
						event.tempDizhu = event.current;
						if (result.control == "二倍") game.bonusNum = 2;
					}
					event.current = event.current.next;
					if (event.current == event.start) {
						game.zhu = event.tempDizhu || event.start.previous;
					} else event.goto(2);
					if (event.current == event.start.previous && !event.tempDizhu)
						event.controls.remove("不叫地主");
					"step 4";
					for (var player of game.players) {
						player.identity = player == game.zhu ? "zhu" : "fan";
						player.showIdentity();
					}
					event.dialog.close();
					event.map[game.zhu.playerid].addArray(event.list.randomRemove(3));
					"step 5";
					var list = ["请选择你的武将", [event.map[game.me.playerid], "character"]];
					if (game.me.identity == "fan") {
						var friend = game.findPlayer(function (current) {
							return current != game.me && current.identity == "fan";
						});
						list.push('<div class="text center">队友的选将框</div>');
						list.push([event.map[friend.playerid], "character"]);
					}
					game.me
						.chooseButton(list, true)
						.set("list", event.map[game.me.playerid])
						.set("filterButton", function (button) {
							return _status.event.list.includes(button.link);
						});
					"step 6";
					game.me.init(result.links[0]);
					for (var player of game.players) {
						if (player != game.me) player.init(event.map[player.playerid].randomGet());
						if (player == game.zhu) {
							player.addSkill(game.zhuSkill);
						} else player.addSkill("binglin_neihong");
					}
					if (!game.zhu.isInitFilter("noZhuHp")) {
						game.zhu.maxHp++;
						game.zhu.hp++;
						game.zhu.update();
					}
					for (var i = 0; i < game.players.length; i++) {
						_status.characterlist.remove(game.players[i].name1);
						_status.characterlist.remove(game.players[i].name2);
					}
					setTimeout(function () {
						ui.arena.classList.remove("choose-character");
					}, 500);
				});
			},
			chooseCharacterHuanle: function () {
				var next = game.createEvent("chooseCharacter");
				next.setContent(function () {
					"step 0";
					ui.arena.classList.add("choose-character");
					game.no_continue_game = true;
					var i;
					event.list = [];
					event.list2 = [];
					var list4 = [];
					if (!event.map) event.map = {};
					for (i in lib.characterReplace) {
						var ix = lib.characterReplace[i];
						for (var j = 0; j < ix.length; j++) {
							if (lib.filter.characterDisabled(ix[j])) ix.splice(j--, 1);
						}
						if (ix.length) {
							var name = ix.randomGet();
							event.list.push(name);
							if (game.recommendDizhu.includes(name)) event.list2.push(name);
							list4.addArray(ix);
						}
					}
					for (i in lib.character) {
						if (list4.includes(i) || lib.filter.characterDisabled(i)) continue;
						event.list.push(i);
						if (game.recommendDizhu.includes(i)) event.list2.push(i);
					}
					event.list.randomSort();
					_status.characterlist = event.list.slice(0);
					event.controls = ["不叫", "叫地主"];
					for (var player of game.players) {
						var id = player.playerid;
						if (!event.map[id]) event.map[id] = [];
						event.map[id].addArray(event.list2.randomRemove(1));
						event.list.removeArray(event.map[id]);
						event.map[id].addArray(event.list.randomRemove(4 - event.map[id].length));
						event.list2.removeArray(event.map[id]);
					}
					event.dialog = ui.create.dialog("你的选将框", [event.map[game.me.playerid], "character"]);
					event.start = game.players.randomGet();
					event.current = event.start;
					lib.init.onfree();
					game.delay(2.5);
					"step 1";
					event.current.chooseControl(event.controls).set("ai", function () {
						return Math.random() > 0.5 ? "不叫" : "叫地主";
					});
					if (event.current == game.me) {
						event.dialog.content.childNodes[0].innerHTML = "是否抢地主?";
					}
					"step 2";
					event.current.chat(result.control);
					if (result.control == "叫地主" || event.current == event.start.next) {
						game.zhu = result.control == "叫地主" ? event.current : event.current.next;
						for (var player of game.players) {
							player.identity = player == game.zhu ? "zhu" : "fan";
							player.showIdentity();
						}
						event.dialog.close();
						event.map[game.zhu.playerid].addArray(event.list.randomRemove(3));
					} else {
						event.current = event.current.next;
						event.goto(1);
						game.delay(1.5);
					}
					"step 3";
					game.me.chooseButton(
						["请选择你的武将", [event.map[game.me.playerid], "character"]],
						true
					);
					"step 4";
					game.me.init(result.links[0]);
					for (var player of game.players) {
						if (player != game.me) player.init(event.map[player.playerid].randomGet());
					}
					if (!game.zhu.isInitFilter("noZhuHp")) {
						game.zhu.maxHp++;
						game.zhu.hp++;
						game.zhu.update();
					}
					for (var i = 0; i < game.players.length; i++) {
						_status.characterlist.remove(game.players[i].name1);
						_status.characterlist.remove(game.players[i].name2);
					}
					setTimeout(function () {
						ui.arena.classList.remove("choose-character");
					}, 500);
				});
			},

			chooseCharacterKaihei: function () {
				var next = game.createEvent("chooseCharacter");
				next.setContent(function () {
					"step 0";
					ui.arena.classList.add("choose-character");
					game.no_continue_game = true;
					var i;
					var identityList = ["zhu", "fan", "fan"];
					game.saveConfig("continue_name");
					event.list = [];
					var list4 = [];
					identityList.randomSort();
					for (i = 0; i < game.players.length; i++) {
						game.players[i].identity = identityList[i];
						game.players[i].showIdentity();
						if (identityList[i] == "zhu") {
							game.zhu = game.players[i];
						}
					}

					if (!game.zhu) game.zhu = game.me;
					else {
						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");
					}

					for (i in lib.characterReplace) {
						var ix = lib.characterReplace[i];
						for (var j = 0; j < ix.length; j++) {
							if (lib.filter.characterDisabled(ix[j])) ix.splice(j--, 1);
						}
						if (ix.length) {
							event.list.push(ix.randomGet());
							list4.addArray(ix);
						}
					}
					for (i in lib.character) {
						if (list4.includes(i) || lib.filter.characterDisabled(i)) continue;
						event.list.push(i);
					}
					event.list.randomSort();
					_status.characterlist = event.list.slice(0);
					for (var player of game.players) {
						player._characterChoice = event.list.randomRemove(player.identity == "zhu" ? 5 : 3);
						if (player.identity == "fan")
							player._friend = player.next.identity == "fan" ? player.next : player.previous;
					}
					var createDialog = ["选择武将"];
					createDialog.push([game.me._characterChoice, "character"]);
					if (game.me._friend) {
						createDialog.push("队友的武将");
						createDialog.push([game.me._friend._characterChoice, "character"]);
					}
					game.me
						.chooseButton(createDialog, true)
						.set("onfree", true)
						.set("filterButton", function (button) {
							return _status.event.player._characterChoice.includes(button.link);
						});
					"step 1";
					game.me.init(result.links[0]);
					for (var i = 0; i < game.players.length; i++) {
						if (game.players[i] != game.me)
							game.players[i].init(game.players[i]._characterChoice.randomGet());
						_status.characterlist.remove(game.players[i].name1);
						_status.characterlist.remove(game.players[i].name2);
						if (game.players[i] == game.zhu) {
							if (!game.zhu.isInitFilter("noZhuHp")) {
								game.zhu.maxHp++;
								game.zhu.hp++;
								game.zhu.update();
							}
						}
					}
					setTimeout(function () {
						ui.arena.classList.remove("choose-character");
					}, 500);
				});
			},
			chooseCharacter: function () {
				if (_status.mode == "kaihei") {
					game.chooseCharacterKaihei();
					return;
				}
				if (_status.mode == "huanle") {
					game.chooseCharacterHuanle();
					return;
				}
				if (_status.mode == "online") {
					game.chooseCharacterZhidou();
					return;
				}
				if (_status.mode == "binglin") {
					game.chooseCharacterBinglin();
					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) {
					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 == game.zhu) {
						if (!game.zhu.isInitFilter("noZhuHp")) {
							game.zhu.maxHp++;
							game.zhu.hp++;
							game.zhu.update();
						}
					}
					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);
					}
					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 list4 = [];
					var identityList = ["zhu", "fan", "fan"];
					var chosen = lib.config.continue_name || [];
					game.saveConfig("continue_name");
					event.chosen = chosen;

					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 = ["random", "zhu", "fan"];
						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.name) {
									if (link != "random") {
										_status.event.parent.fixedseat = get.distance(
											game.me,
											game.zhu,
											"absolute"
										);
									}
									game.zhu.uninit();
									delete game.zhu.isZhu;
									delete game.zhu.identityShown;
								}
								var current = this.parentNode.querySelector(".bluebg");
								if (current) {
									current.classList.remove("bluebg");
								}
								current = seats.querySelector(".bluebg");
								if (current) {
									current.classList.remove("bluebg");
								}
								if (link == "random") {
									link = ["zhu", "fan"].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);
								_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();
									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 (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 = 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 (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 (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 (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 = "zhu";
							if (zhuIdentity != event.identity) {
								identityList.remove(zhuIdentity);
								identityList.splice(event.fixedseat, 0, zhuIdentity);
							}
							delete event.fixedseat;
						}
						delete event.identity;
					}
					for (i = 0; i < game.players.length; i++) {
						game.players[i].identity = identityList[i];
						game.players[i].showIdentity();
						if (identityList[i] == "zhu") {
							game.zhu = game.players[i];
						}
					}

					if (!game.zhu) game.zhu = game.me;
					else {
						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");
					}
					//选将框分配
					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);
						}
					}
					for (i in lib.character) {
						if (chosen.includes(i) || list4.includes(i)) continue;
						if (lib.filter.characterDisabled(i)) continue;
						event.list.push(i);
						list4.push(i);
					}
					event.list.randomSort();
					_status.characterlist = list4.slice(0);
					var num = get.config("choice_" + game.me.identity);
					list = event.list.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);
							}
						}
					}
					dialog.setCaption("选择角色");
					game.me.setIdentity();

					if (!event.chosen.length) {
						game.me.chooseButton(dialog, true).set("onfree", true).selectButton = function () {
							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);
							}

							event.list.randomSort();
							list = event.list.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(10);
								}
								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;
					}
					var chooseGroup = false;
					if (event.chosen.length) {
						if (lib.character[event.chosen[0]][1] == "shen") {
							chooseGroup = true;
						}
					} else if (event.modchosen) {
						if (event.modchosen[0] == "random") event.modchosen[0] = result.buttons[0].link;
						else event.modchosen[1] = result.buttons[0].link;
					} 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);
						if (lib.character[event.choosed[0]][1] == "shen") {
							chooseGroup = true;
						}
					} else {
						event.choosed = [result.buttons[0].link];
						if (lib.character[event.choosed[0]][1] == "shen") {
							chooseGroup = true;
						}
						game.addRecentCharacter(result.buttons[0].link);
					}
					"step 2";
					if (event.chosen.length) {
						game.me.init(event.chosen[0], event.chosen[1]);
					} else if (event.modchosen) {
						game.me.init(event.modchosen[0], event.modchosen[1]);
					} else 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 (game.me == game.zhu) {
						if (!game.me.isInitFilter("noZhuHp")) {
							game.me.hp++;
							game.me.maxHp++;
							game.me.update();
						}
					}

					for (var i = 0; i < game.players.length; i++) {
						if (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";
					for (var i = 0; i < game.players.length; i++) {
						_status.characterlist.remove(game.players[i].name1);
						_status.characterlist.remove(game.players[i].name2);
					}
					setTimeout(function () {
						ui.arena.classList.remove("choose-character");
					}, 500);
				});
			},

			chooseCharacterKaiheiOL: function () {
				var next = game.createEvent("chooseCharacter");
				next.setContent(function () {
					"step 0";
					ui.arena.classList.add("choose-character");
					var i;
					var identityList = ["fan", "fan", "fan"];
					var aiList = game.filterPlayer(function (current) {
						return current != game.me && !current.isOnline();
					});
					if (aiList.length == 1) {
						identityList[game.players.indexOf(aiList[0])] = "zhu";
					} else {
						identityList[0] = "zhu";
						identityList.randomSort();
					}
					for (i = 0; i < game.players.length; i++) {
						game.players[i].identity = identityList[i];
						game.players[i].showIdentity();
						game.players[i].identityShown = true;
						if (identityList[i] == "zhu") game.zhu = game.players[i];
					}
					event.list = [];
					var list4 = [];

					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], libCharacter))
								ix.splice(j--, 1);
						}
						if (ix.length) {
							event.list.push(ix.randomGet());
							list4.addArray(ix);
						}
					}
					for (i in libCharacter) {
						if (list4.includes(i) || lib.filter.characterDisabled(i, libCharacter)) continue;
						event.list.push(i);
					}
					_status.characterlist = event.list.slice(0);

					var map = {};
					for (var player of game.players) {
						player._characterChoice = event.list.randomRemove(player.identity == "zhu" ? 5 : 3);
						if (player.identity == "fan")
							player._friend = player.next.identity == "fan" ? player.next : player.previous;
						map[player.playerid] = player._characterChoice;
					}
					game.broadcastAll(function (map) {
						for (var i in map) {
							lib.playerOL[i]._characterChoice = map[i];
						}
					}, map);
					"step 1";
					var list = [];
					for (var i = 0; i < game.players.length; i++) {
						var dialog = ["请选择武将", [game.players[i]._characterChoice, "character"]];
						if (game.players[i]._friend) {
							dialog.push("队友的武将");
							dialog.push([game.players[i]._friend._characterChoice, "character"]);
						}
						list.push([
							game.players[i],
							dialog,
							true,
							function () {
								return Math.random();
							},
							function (button) {
								return _status.event.player._characterChoice.includes(button.link);
							},
						]);
					}
					game.me.chooseButtonOL(list, function (player, result) {
						if (game.online || player == game.me) player.init(result.links[0]);
					});
					"step 2";
					for (var i in lib.playerOL) {
						if (!result[i] || result[i] == "ai" || !result[i].links || !result[i].links.length) {
							result[i] = lib.playerOL[i]._characterChoice.randomGet();
						} else {
							result[i] = result[i].links[0];
						}
						if (!lib.playerOL[i].name) {
							lib.playerOL[i].init(result[i]);
						}
					}

					if (!game.zhu.isInitFilter("noZhuHp")) {
						game.zhu.maxHp++;
						game.zhu.hp++;
						game.zhu.update();
					}

					game.broadcast(
						function (result, zhu) {
							for (var i in result) {
								if (!lib.playerOL[i].name) {
									lib.playerOL[i].init(result[i]);
								}
							}
							game.zhu = zhu;
							if (!game.zhu.isInitFilter("noZhuHp")) {
								game.zhu.maxHp++;
								game.zhu.hp++;
								game.zhu.update();
							}

							setTimeout(function () {
								ui.arena.classList.remove("choose-character");
							}, 500);
						},
						result,
						game.zhu
					);
					for (var i = 0; i < game.players.length; i++) {
						_status.characterlist.remove(game.players[i].name1);
						_status.characterlist.remove(game.players[i].name2);
					}
					setTimeout(function () {
						ui.arena.classList.remove("choose-character");
					}, 500);
				});
			},
			chooseCharacterHuanleOL: function () {
				var next = game.createEvent("chooseCharacter");
				next.setContent(function () {
					"step 0";
					ui.arena.classList.add("choose-character");
					var i;
					event.list = [];
					event.list2 = [];
					var list4 = [];
					event.controls = ["不叫", "叫地主"];
					if (!event.map) event.map = {};
					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], libCharacter))
								ix.splice(j--, 1);
						}
						if (ix.length) {
							var name = ix.randomGet();
							event.list.push(name);
							if (game.recommendDizhu.includes(name)) event.list2.push(name);
							list4.addArray(ix);
						}
					}
					for (i in libCharacter) {
						if (list4.includes(i) || lib.filter.characterDisabled(i, libCharacter)) continue;
						event.list.push(i);
						if (game.recommendDizhu.includes(i)) event.list2.push(i);
					}
					for (var player of game.players) {
						var id = player.playerid;
						if (!event.map[id]) event.map[id] = [];
						event.map[id].addArray(event.list2.randomRemove(1));
						event.list.removeArray(event.map[id]);
						event.map[id].addArray(event.list.randomRemove(4 - event.map[id].length));
						event.list2.removeArray(event.map[id]);
					}
					_status.characterlist = event.list.slice(0);
					event.videoId = lib.status.videoId++;
					game.broadcastAll(
						function (map, id) {
							ui.create.dialog("你的选将框", [map[game.me.playerid], "character"]).videoId = id;
						},
						event.map,
						event.videoId
					);
					event.start = game.players.randomGet();
					event.current = event.start;
					if (event.current != game.me || !event.current.isOnline()) game.delay(3);
					"step 1";
					event.current.chooseControl(event.controls).set("ai", function () {
						return Math.random() > 0.5 ? "不叫" : "叫地主";
					});
					"step 2";
					event.current.chat(result.control);
					if (result.control == "叫地主" || event.current == event.start.next) {
						game.zhu = result.control == "叫地主" ? event.current : event.current.next;
						for (var player of game.players) {
							player.identity = player == game.zhu ? "zhu" : "fan";
							player.showIdentity();
							player.identityShown = true;
						}
						game.broadcastAll("closeDialog", event.videoId);
						event.map[game.zhu.playerid].addArray(event.list.randomRemove(3));
					} else {
						event.current = event.current.next;
						event.goto(1);
					}
					"step 3";
					var list = [];
					var str = "选择角色";
					for (var i = 0; i < game.players.length; i++) {
						list.push([
							game.players[i],
							[str, [event.map[game.players[i].playerid], "character"]],
							true,
						]);
					}
					game.me.chooseButtonOL(list, function (player, result) {
						if (game.online || player == game.me) player.init(result.links[0], result.links[1]);
					});
					"step 4";
					for (var i in result) {
						if (result[i] && result[i].links) {
							for (var j = 0; j < result[i].links.length; j++) {
								event.list2.remove(result[i].links[j]);
							}
						}
					}
					for (var i in result) {
						if (result[i] == "ai") {
							result[i] = event.list2.randomRemove(lib.configOL.double_character ? 2 : 1);
						} else {
							result[i] = result[i].links;
						}
						if (!lib.playerOL[i].name) {
							lib.playerOL[i].init(result[i][0], result[i][1]);
						}
					}

					if (!game.zhu.isInitFilter("noZhuHp")) {
						game.zhu.maxHp++;
						game.zhu.hp++;
						game.zhu.update();
					}

					game.broadcast(
						function (result, zhu) {
							for (var i in result) {
								if (!lib.playerOL[i].name) {
									lib.playerOL[i].init(result[i][0], result[i][1]);
								}
							}
							game.zhu = zhu;
							if (!game.zhu.isInitFilter("noZhuHp")) {
								game.zhu.maxHp++;
								game.zhu.hp++;
								game.zhu.update();
							}

							setTimeout(function () {
								ui.arena.classList.remove("choose-character");
							}, 500);
						},
						result,
						game.zhu
					);
					for (var i = 0; i < game.players.length; i++) {
						_status.characterlist.remove(game.players[i].name1);
						_status.characterlist.remove(game.players[i].name2);
					}
					setTimeout(function () {
						ui.arena.classList.remove("choose-character");
					}, 500);
				});
			},
			chooseCharacterBinglinOL: function () {
				var next = game.createEvent("chooseCharacter");
				next.setContent(function () {
					"step 0";
					ui.arena.classList.add("choose-character");
					var i;
					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];
						}
					}
					event.list = [];
					event.map = {};
					for (i in libCharacter) {
						if (lib.filter.characterDisabled(i, libCharacter)) continue;
						event.list.push(i);
					}
					event.list.randomSort();
					_status.characterlist = event.list.slice(0);
					event.controls = ["不叫地主", "一倍", "两倍", "三倍"];
					for (var player of game.players) {
						var id = player.playerid;
						event.map[id] = event.list.randomRemove(4);
					}
					event.start = game.players.randomGet();
					event.current = event.start;

					event.videoId = lib.status.videoId++;
					game.zhuSkill = "zhuSkill_" + ["xiangyang", "jiangling", "fancheng"].randomGet();
					game.broadcastAll(
						function (map, id, skill) {
							ui.create.dialog("本局城池:" + get.translation(skill), [
								map[game.me.playerid],
								"character",
							]).videoId = id;
						},
						event.map,
						event.videoId,
						game.zhuSkill
					);
					game.delay(6);
					"step 1";
					game.broadcastAll(
						function (id, current) {
							var dialog = get.idDialog(id);
							if (dialog) {
								if (game.me == current) dialog.content.firstChild.innerHTML = "是否叫地主?";
								else dialog.content.firstChild.innerHTML = "请等待其他玩家叫地主";
							}
						},
						event.videoId,
						event.current
					);
					if (event.current != game.me && !event.current.isOnline()) game.delay(2);
					event.current.chooseControl(event.controls).set("ai", function () {
						return _status.event.getParent().controls.randomGet();
					});
					"step 2";
					event.current._control = result.control;
					event.current.chat(result.control);
					if (result.control == "三倍") {
						game.bonusNum = 3;
						game.zhu = event.current;
						return;
					} else if (result.control != "不叫地主") {
						event.controls.splice(1, event.controls.indexOf(result.control));
						event.tempDizhu = event.current;
						if (result.control == "二倍") game.bonusNum = 2;
					}
					event.current = event.current.next;
					if (event.current == event.start) {
						game.zhu = event.tempDizhu || event.start;
					} else event.goto(1);
					if (event.current == event.start.previous && !event.tempDizhu)
						event.controls.remove("不叫地主");
					"step 3";
					for (var player of game.players) {
						player.identity = player == game.zhu ? "zhu" : "fan";
						player.showIdentity();
						player.identityShown = true;
						player._characterChoice = event.map[player.playerid];
					}
					event.map[game.zhu.playerid].addArray(event.list.randomRemove(3));
					game.broadcastAll(
						function (id, map) {
							var dialog = get.idDialog(id);
							if (dialog) dialog.close();
							game.me._characterChoice = map[game.me.playerid];
						},
						event.videoId,
						event.map
					);
					var list = [];
					for (var i = 0; i < game.players.length; i++) {
						var dialog = ["请选择武将", [event.map[game.players[i].playerid], "character"]];
						if (game.players[i].identity == "fan") {
							var friend = game.findPlayer(function (current) {
								return current != game.players[i] && current.identity == "fan";
							});
							dialog.push('<div class="text center">队友的选将框</div>');
							dialog.push([event.map[friend.playerid], "character"]);
						}
						list.push([
							game.players[i],
							dialog,
							true,
							function () {
								return Math.random();
							},
							function (button) {
								return _status.event.player._characterChoice.includes(button.link);
							},
						]);
					}
					game.me.chooseButtonOL(list, function (player, result) {
						if (game.online || player == game.me) player.init(result.links[0]);
					});
					"step 4";
					for (var i in lib.playerOL) {
						if (!result[i] || result[i] == "ai" || !result[i].links || !result[i].links.length) {
							result[i] = event.map[i].randomGet();
						} else {
							result[i] = result[i].links[0];
						}
						if (!lib.playerOL[i].name) {
							lib.playerOL[i].init(result[i]);
						}
					}

					if (!game.zhu.isInitFilter("noZhuHp")) {
						game.zhu.maxHp++;
						game.zhu.hp++;
						game.zhu.update();
					}

					game.broadcast(
						function (result, zhu) {
							for (var i in result) {
								if (!lib.playerOL[i].name) {
									lib.playerOL[i].init(result[i]);
								}
							}
							game.zhu = zhu;
							if (!game.zhu.isInitFilter("noZhuHp")) {
								game.zhu.maxHp++;
								game.zhu.hp++;
								game.zhu.update();
							}

							setTimeout(function () {
								ui.arena.classList.remove("choose-character");
							}, 500);
						},
						result,
						game.zhu
					);
					for (var player of game.players) {
						if (player == game.zhu) {
							player.addSkill(game.zhuSkill);
						} else player.addSkill(["binglin_shaxue", "binglin_neihong"]);
					}
					for (var i = 0; i < game.players.length; i++) {
						_status.characterlist.remove(game.players[i].name1);
						_status.characterlist.remove(game.players[i].name2);
					}
					setTimeout(function () {
						ui.arena.classList.remove("choose-character");
					}, 500);
				});
			},
			chooseCharacterZhidouOL: function () {
				var next = game.createEvent("chooseCharacter");
				next.setContent(function () {
					"step 0";
					ui.arena.classList.add("choose-character");
					var i;
					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];
						}
					}
					var groups = [];
					event.list = [];
					event.map = {};
					var chara = get.config("character_online") || lib.characterOnline;
					for (i in chara) {
						var list = chara[i];
						for (var j = 0; j < list.length; j++) {
							if (
								!lib.character[list[j]] ||
								lib.connectBanned.includes(list[j]) ||
								(i == "key" && lib.filter.characterDisabled(list[j], libCharacter))
							)
								list.splice(j--, 1);
						}
						if (list.length >= 3) {
							groups.push(i);
							event.list.addArray(list);
						}
					}
					event.list.randomSort();
					_status.characterlist = event.list.slice(0);
					event.controls = ["不叫地主", "一倍", "两倍", "三倍"];
					for (var player of game.players) {
						var id = player.playerid;
						player._group = groups.randomRemove(1)[0];
						event.map[id] = chara[player._group].randomGets(3);
						player.storage.doudizhu_cardPile = get.cards(20).sort(function (a, b) {
							if (a.name != b.name) return lib.sort.card(a.name, b.name);
							else if (a.suit != b.suit) return lib.suit.indexOf(a) - lib.suit.indexOf(b);
							else return a.number - b.number;
						});
						player.markSkill("doudizhu_cardPile");
					}
					event.start = game.players.randomGet();
					event.current = event.start;

					event.videoId = lib.status.videoId++;
					game.broadcastAll(
						function (map, id) {
							ui.create.dialog(
								"你的选将框和底牌",
								[map[game.me.playerid], "character"],
								game.me.storage.doudizhu_cardPile
							).videoId = id;
						},
						event.map,
						event.videoId
					);
					game.delay(4);
					"step 1";
					game.broadcastAll(
						function (id, current) {
							var dialog = get.idDialog(id);
							if (dialog) {
								if (game.me == current) dialog.content.firstChild.innerHTML = "是否叫地主?";
								else dialog.content.firstChild.innerHTML = "请等待其他玩家叫地主";
							}
						},
						event.videoId,
						event.current
					);
					if (event.current != game.me && !event.current.isOnline()) game.delay(2);
					event.current.chooseControl(event.controls).set("ai", function () {
						return _status.event.getParent().controls.randomGet();
					});
					"step 2";
					event.current._control = result.control;
					event.current.chat(result.control);
					if (result.control == "三倍") {
						game.bonusNum = 3;
						game.zhu = event.current;
						return;
					} else if (result.control != "不叫地主") {
						event.controls.splice(1, event.controls.indexOf(result.control));
						event.tempDizhu = event.current;
						if (result.control == "二倍") game.bonusNum = 2;
					}
					event.current = event.current.next;
					if (
						event.current == event.start &&
						(event.start == event.tempDizhu || event.start._control == "不叫地主")
					) {
						game.zhu = event.tempDizhu || event.start.previous;
					} else if (event.current == event.start.next && event.current._control) {
						game.zhu = event.tempDizhu;
					} else event.goto(1);
					if (event.current == event.start.previous && !event.tempDizhu)
						event.controls.remove("不叫地主");
					"step 3";
					for (var player of game.players) {
						player.identity = player == game.zhu ? "zhu" : "fan";
						player.showIdentity();
						player.identityShown = true;
					}
					game.broadcastAll("closeDialog", event.videoId);
					var list = [];
					for (var i = 0; i < game.players.length; i++) {
						list.push([
							game.players[i],
							[
								"选择" + (game.players[i] == game.zhu ? "两" : "一") + "张武将牌",
								[event.map[game.players[i].playerid], "character"],
							],
							true,
							game.players[i] == game.zhu ? 2 : 1,
						]);
					}
					game.me.chooseButtonOL(list, function (player, result) {
						if (game.online || player == game.me) player.init(result.links[0], result.links[1]);
					});
					"step 4";
					for (var i in result) {
						if (result[i] == "ai") {
							result[i] = event.map[i].randomRemove(lib.playerOL[i] == game.zhu ? 2 : 1);
						} else {
							result[i] = result[i].links;
						}
						if (!lib.playerOL[i].name) {
							lib.playerOL[i].init(result[i][0], result[i][1]);
						}
					}

					game.zhu.hp = 4;
					game.zhu.maxHp = 4;
					game.zhu.update();

					game.broadcast(
						function (result, zhu) {
							for (var i in result) {
								if (!lib.playerOL[i].name) {
									lib.playerOL[i].init(result[i][0], result[i][1]);
								}
							}
							game.zhu = zhu;
							game.zhu.hp = 4;
							game.zhu.maxHp = 4;
							game.zhu.update();

							setTimeout(function () {
								ui.arena.classList.remove("choose-character");
							}, 500);
						},
						result,
						game.zhu
					);
					for (var i = 0; i < game.players.length; i++) {
						_status.characterlist.remove(game.players[i].name1);
						_status.characterlist.remove(game.players[i].name2);
					}
					setTimeout(function () {
						ui.arena.classList.remove("choose-character");
					}, 500);
				});
			},
			chooseCharacterOL: function () {
				if (_status.mode == "kaihei") {
					game.chooseCharacterKaiheiOL();
					return;
				} else if (_status.mode == "huanle") {
					game.chooseCharacterHuanleOL();
					return;
				} else if (_status.mode == "online") {
					game.chooseCharacterZhidouOL();
					return;
				} else if (_status.mode == "binglin") {
					game.chooseCharacterBinglinOL();
					return;
				}
				var next = game.createEvent("chooseCharacter");
				next.setContent(function () {
					"step 0";
					ui.arena.classList.add("choose-character");
					var i;
					var identityList = ["zhu", "fan", "fan"];
					identityList.randomSort();
					for (i = 0; i < game.players.length; i++) {
						game.players[i].identity = identityList[i];
						game.players[i].showIdentity();
						game.players[i].identityShown = true;
						if (identityList[i] == "zhu") game.zhu = game.players[i];
					}

					var list;
					var list4 = [];
					event.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 (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], libCharacter))
								ix.splice(j--, 1);
						}
						if (ix.length) {
							event.list.push(i);
							list4.addArray(ix);
						}
					}
					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) || lib.filter.characterDisabled(i, libCharacter)) continue;
						event.list.push(i);
						list4.push(i);
					}
					_status.characterlist = list4;
					"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);
					num2 = event.list.length - num * game.players.length;
					if (num > 5) {
						num = 5;
					}
					if (num2 > 2) {
						num2 = 2;
					}

					for (var i = 0; i < game.players.length; i++) {
						var num3 = 0;
						if (game.players[i] == game.zhu) num3 = 3;
						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";
					for (var i in result) {
						if (result[i] && result[i].links) {
							for (var j = 0; j < result[i].links.length; j++) {
								event.list.remove(get.sourceCharacter(result[i].links[j]));
							}
						}
					}
					for (var i in result) {
						if (result[i] == "ai") {
							var listc = event.list.randomRemove(lib.configOL.double_character ? 2 : 1);
							for (var i = 0; i < listc.length; i++) {
								var listx = lib.characterReplace[listc[i]];
								if (listx && listx.length) listc[i] = listx.randomGet();
							}
							result[i] = listc;
						} else {
							result[i] = result[i].links;
						}
						if (!lib.playerOL[i].name) {
							lib.playerOL[i].init(result[i][0], result[i][1]);
						}
					}

					if (!game.zhu.isInitFilter("noZhuHp")) {
						game.zhu.maxHp++;
						game.zhu.hp++;
						game.zhu.update();
					}

					game.broadcast(
						function (result, zhu) {
							for (var i in result) {
								if (!lib.playerOL[i].name) {
									lib.playerOL[i].init(result[i][0], result[i][1]);
								}
							}
							game.zhu = zhu;
							if (!game.zhu.isInitFilter("noZhuHp")) {
								game.zhu.maxHp++;
								game.zhu.hp++;
								game.zhu.update();
							}

							setTimeout(function () {
								ui.arena.classList.remove("choose-character");
							}, 500);
						},
						result,
						game.zhu
					);
					for (var i = 0; i < game.players.length; i++) {
						_status.characterlist.remove(game.players[i].name1);
						_status.characterlist.remove(game.players[i].name2);
					}
					setTimeout(function () {
						ui.arena.classList.remove("choose-character");
					}, 500);
				});
			},
		},
		translate: {
			zhu: "主",
			fan: "反",
			zhu2: "地主",
			fan2: "农民",
			random2: "随机",
			feiyang: "飞扬",
			bahu: "跋扈",
			feiyang_info:
				"判定阶段开始时,若你的判定区有牌,则你可以弃置两张手牌,然后弃置你判定区的一张牌。每回合限一次。",
			bahu_info: "锁定技,准备阶段开始时,你摸一张牌。出牌阶段,你可以多使用一张【杀】。",
			kaihei: "强易",
			kaihei_info:
				"出牌阶段,你可以获得一名其他角色的至多两张牌,然后交给其等量的牌。每名角色每局游戏限一次。",
			doudizhu_cardPile: "底牌",
			online_gongshoujintui: "攻守进退",
			gongshoujianbei: "攻守兼备",
			gongshoujianbei_info:
				"出牌阶段,你可选择:①将此牌当做【万箭齐发】使用。②将此牌当做【桃园结义】使用。",
			jintuiziru: "进退自如",
			jintuiziru_info: "出牌阶段,你可选择:①将此牌当做【南蛮入侵】使用。②将此牌当做【五谷丰登】使用。",
			diqi: "地契",
			diqi_skill: "地契",
			diqi_info: "当你受到伤害时,你可以弃置此牌,防止此伤害。当此牌离开你的装备区后,销毁之。",
			_juzhong: "聚众",
			juzhong_jiu: "聚众",
			zhadan: "炸弹",
			zhadan_info: "当一张牌被使用时,对此牌使用。取消此牌的所有目标,且本局游戏的底价翻倍。",
			jiwangkailai: "继往开来",
			jiwangkailai_info:
				"出牌阶段,对包含你自己在内的一名角色使用。目标角色选择一项:①弃置所有手牌,然后摸等量的牌。②将所有手牌当做一张不为【继往开来】的普通锦囊牌使用。",
			zhuSkill_xiangyang: "襄阳",
			zhuSkill_xiangyang_info: "回合结束时,你可获得一个额外的出牌阶段或摸牌阶段。",
			zhuSkill_jiangling: "江陵",
			zhuSkill_jiangling0: "江陵",
			zhuSkill_jiangling1: "江陵",
			zhuSkill_jiangling_info:
				"出牌阶段开始时,你可选择一项:①本阶段内使用【杀】或普通锦囊牌选择唯一目标时可增加一个目标。②本阶段内使用【杀】或普通锦囊牌无次数限制。",
			zhuSkill_fancheng: "樊城",
			zhuSkill_fancheng0: "樊城",
			zhuSkill_fancheng1: "樊城",
			zhuSkill_fancheng_info:
				"限定技,出牌阶段,你可选择获得一项效果直到游戏结束:①因执行【杀】的效果而对其他角色造成的伤害+1。②对其他角色造成的渠道不为【杀】的伤害+1。",
			binglin_shaxue: "歃血",
			binglin_shaxue_info: "锁定技,每局游戏限三次,当你受到队友造成的伤害时,你防止此伤害。",
			binglin_neihong: "内讧",
			binglin_neihong_info: "锁定技,当你杀死队友后,你所在的阵营视为游戏失败。",
			baiyidujiang: "白衣渡江",
			baiyidujiang_info:
				"出牌阶段,对地主使用。你选择一项:①令其将手牌数摸至全场最多。②令其将手牌数弃置至全场最少。",
			luojingxiashi: "落井下石",
			luojingxiashi_info: "出牌阶段,对所有其他的已受伤角色使用。目标角色受到1点伤害。",
			binglinchengxia: "兵临城下",
			binglinchengxia_info:
				"出牌阶段,对一名其他角色使用。将此牌横置于目标角色的判定区内。目标角色于判定阶段进行判定,若判定结果不为♦,则其弃置装备区内的所有牌或受到1点伤害。",
			toushiche: "投石车",
			toushiche_skill: "投石车",
			toushiche_info: "锁定技,结束阶段开始时,你令所有手牌数大于你的角色依次弃置一张手牌。",
			binglin_bingjin: "兵尽",
		},
		element: {
			player: {
				getTopCards: function (num) {
					if (typeof num != "number") num = 1;
					if (num <= 0) num = 1;
					var cards;
					var player = this;
					if (player.storage.doudizhu_cardPile && player.storage.doudizhu_cardPile.length) {
						cards = player.storage.doudizhu_cardPile.randomRemove(num);
						if (player.storage.doudizhu_cardPile.length) player.markSkill("doudizhu_cardPile");
						else player.unmarkSkill("doudizhu_cardPile");
					} else cards = [];
					if (cards.length < num) cards.addArray(get.cards(num - cards.length));
					else game.updateRoundNumber();
					return cards;
				},
				$dieAfter: function () {
					if (_status.video) return;
					if (!this.node.dieidentity) {
						var str = { zhu: "地主", fan: "农民" }[this.identity];
						var node = ui.create.div(".damage.dieidentity", str, this);
						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 = "";
					}
				},
				dieAfter: function (source) {
					if (
						_status.mode == "binglin" &&
						source &&
						this != source &&
						this.identity == source.identity &&
						source.hasSkill("binglin_neihong")
					) {
						if (game.me == game.zhu) {
							game.over(true);
						} else {
							game.over(false);
						}
					} else game.checkResult();
				},
				dieAfter2: function () {
					if (_status.mode == "binglin" || _status.mode == "online" || this.identity != "fan")
						return;
					var player = this,
						target = game.findPlayer(function (current) {
							return current != player && current.identity == "fan";
						}, true);
					if (target) {
						target.showGiveup();
						target.chooseDrawRecover(2);
					}
				},
				logAi: function (targets, card) {},
				showIdentity: function () {
					game.broadcastAll(
						function (player, identity) {
							player.identity = identity;
							player.node.identity.classList.remove("guessing");
							player.identityShown = true;
							player.ai.shown = 1;
							player.setIdentity();
							if (player.identity == "zhu") {
								player.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;
							}
						},
						this,
						this.identity
					);
				},
			},
		},
		get: {
			rawAttitude: function (from, to) {
				if (from.identity == to.identity) return 10;
				return -10;
			},
		},
		skill: {
			binglin_bingjin: {
				trigger: { player: "phaseEnd" },
				forced: true,
				ruleSkill: true,
				filter: function (event, player) {
					return _status.mode == "binglin" && game.roundNumber > 14;
				},
				content: function () {
					player.loseHp();
				},
			},
			zhuSkill_xiangyang: {
				trigger: { player: "phaseEnd" },
				charlotte: true,
				direct: true,
				content: function () {
					"step 0";
					player
						.chooseControl("摸牌阶段", "出牌阶段", "cancel2")
						.set("prompt", "襄阳:是否执行一个额外的阶段?");
					"step 1";
					if (result.control != "cancel2") {
						player.logSkill(event.name);
						var next = player[result.index ? "phaseUse" : "phaseDraw"]();
						event.next.remove(next);
						trigger.next.push(next);
					}
				},
			},
			zhuSkill_jiangling: {
				trigger: { player: "phaseUseBegin" },
				direct: true,
				charlotte: true,
				content: function () {
					"step 0";
					player
						.chooseControl("加目标", "多刀", "取消")
						.set("prompt", get.prompt2("zhuSkill_jiangling"))
						.set("ai", () => 3 - game.countPlayer());
					"step 1";
					if (result.index < 2) {
						player.logSkill("zhuSkill_jiangling");
						player.addTempSkill("zhuSkill_jiangling" + result.index, "phaseUseAfter");
						game.log(player, "选择了", "#y" + result.control, "的效果");
					}
				},
			},
			zhuSkill_jiangling0: {
				trigger: { player: "useCard2" },
				direct: true,
				charlotte: true,
				filter: function (event, player) {
					if (event.card.name != "sha" && get.type(event.card) != "trick") return false;
					if (!event.targets || event.targets.length != 1) return false;
					var info = get.info(event.card);
					if (info.allowMultiple == false) return false;
					if (event.targets && !info.multitarget) {
						if (
							game.hasPlayer(function (current) {
								return (
									!event.targets.includes(current) &&
									lib.filter.targetEnabled2(event.card, player, current) &&
									lib.filter.targetInRange(event.card, player, current)
								);
							})
						) {
							return true;
						}
					}
					return false;
				},
				content: function () {
					"step 0";
					var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标";
					player
						.chooseTarget(get.prompt("zhuSkill_jiangling"), function (card, player, target) {
							var player = _status.event.player;
							if (_status.event.targets.includes(target)) return false;
							return (
								lib.filter.targetEnabled2(_status.event.card, player, target) &&
								lib.filter.targetInRange(_status.event.card, player, target)
							);
						})
						.set("prompt2", prompt2)
						.set("ai", function (target) {
							var trigger = _status.event.getTrigger();
							var player = _status.event.player;
							return (
								get.effect(target, trigger.card, player, player) *
								(_status.event.targets.includes(target) ? -1 : 1)
							);
						})
						.set("targets", trigger.targets)
						.set("card", trigger.card);
					"step 1";
					if (result.bool) {
						if (!event.isMine() && !event.isOnline()) game.delayx();
						event.targets = result.targets;
					} else {
						event.finish();
					}
					"step 2";
					if (event.targets) {
						player.logSkill("zhuSkill_jiangling", event.targets);
						if (trigger.targets.includes(event.targets[0]))
							trigger.targets.removeArray(event.targets);
						else {
							//trigger.directHit.addArray(event.targets);
							trigger.targets.addArray(event.targets);
						}
					}
				},
			},
			zhuSkill_jiangling1: {
				charlotte: true,
				mod: {
					cardUsable: function (card, player) {
						if (card.name == "sha" || get.type(card) == "trick") return Infinity;
					},
				},
			},
			zhuSkill_fancheng: {
				enable: "phaseUse",
				limited: true,
				charlotte: true,
				skillAnimation: true,
				animationColor: "gray",
				content: function () {
					"step 0";
					player.awakenSkill("zhuSkill_fancheng");
					player
						.chooseControl("杀", "其他")
						.set("prompt", "选择要强化的伤害")
						.set("ai", () => get.rand(0, 1));
					"step 1";
					player.addSkill("zhuSkill_fancheng" + result.index);
					game.log(player, "本局游戏内", result.index ? "#g杀以外" : "#y杀", "的伤害+1");
				},
				ai: {
					order: 100,
					result: { player: 100 },
				},
			},
			zhuSkill_fancheng0: {
				trigger: { source: "damageBegin2" },
				forced: true,
				charlotte: true,
				filter: function (event, player) {
					return (
						event.player != player &&
						event.card &&
						event.card.name == "sha" &&
						event.getParent().name == "sha"
					);
				},
				logTarget: "player",
				content: function () {
					trigger.num++;
				},
				mark: true,
				marktext: "殺",
				intro: { content: "因执行【杀】的效果对其他角色造成的伤害+1" },
			},
			zhuSkill_fancheng1: {
				trigger: { source: "damageBegin2" },
				forced: true,
				charlotte: true,
				filter: function (event, player) {
					return event.player != player && (!event.card || event.card.name != "sha");
				},
				logTarget: "player",
				content: function () {
					trigger.num++;
				},
				mark: true,
				marktext: "谋",
				intro: { content: "不因【杀】对其他角色造成的伤害+1" },
			},
			binglin_shaxue: {
				init: function (player, skill) {
					player.addMark(skill, 3, false);
				},
				trigger: { player: "damageBegin3" },
				forced: true,
				charlotte: true,
				filter: function (event, player) {
					return (
						event.source &&
						player != event.source &&
						player.identity == event.source.identity &&
						player.countMark("binglin_shaxue") > 0
					);
				},
				content: function () {
					trigger.cancel();
					player.removeMark("binglin_shaxue", 1, false);
					trigger.source.removeMark("binglin_shaxue", 1, false);
				},
				intro: { content: "剩余次数:#" },
				ai: {
					viewHandcard: true,
					skillTagFilter: function (player, tag, arg) {
						return player != arg && arg.hasSkill("binglin_shaxue");
					},
				},
			},
			binglin_neihong: { charlotte: true },
			toushiche_skill: {
				trigger: { player: "phaseJieshuBegin" },
				forced: true,
				equipSkill: true,
				filter: function (event, player) {
					return lib.skill.toushiche_skill.logTarget(null, player).length > 0;
				},
				logTarget: function (event, player) {
					var hs = player.countCards("h");
					return game.filterPlayer(function (current) {
						return current != player && current.countCards("h") > hs;
					});
				},
				content: function () {
					"step 0";
					event.targets = lib.skill.toushiche_skill.logTarget(null, player).sortBySeat();
					"step 1";
					var target = targets.shift();
					if (target.countCards("h") > 0) target.chooseToDiscard("h", true);
					if (targets.length) event.redo();
				},
			},
			online_gongshoujintui: {
				enable: "chooseToUse",
				filter: function (event, player) {
					var cards = player.getCards("hs");
					for (var i of cards) {
						var name = get.name(i, player);
						if (name == "gongshoujianbei") {
							if (
								event.filterCard(
									{
										name: "wanjian",
										isCard: true,
										cards: [i],
									},
									player,
									event
								) ||
								event.filterCard(
									{
										name: "taoyuan",
										isCard: true,
										cards: [i],
									},
									player,
									event
								)
							)
								return true;
						}
						if (name == "jintuiziru") {
							if (
								event.filterCard(
									{
										name: "nanman",
										isCard: true,
										cards: [i],
									},
									player,
									event
								) ||
								event.filterCard(
									{
										name: "wugu",
										isCard: true,
										cards: [i],
									},
									player,
									event
								)
							)
								return true;
						}
					}
					return false;
				},
				chooseButton: {
					dialog: function (event, player) {
						var list = [];
						if (player.countCards("hs", "gongshoujianbei")) {
							list.push(["锦囊", "", "wanjian"]);
							list.push(["锦囊", "", "taoyuan"]);
						}
						if (player.countCards("hs", "jintuiziru")) {
							list.push(["锦囊", "", "nanman"]);
							list.push(["锦囊", "", "wugu"]);
						}
						return ui.create.dialog("攻守兼备/进退自如", [list, "vcard"], "hidden");
					},
					filter: function (button, player) {
						var name = button.link[2];
						var rawname =
							name == "wanjian" || name == "taoyuan" ? "gongshoujianbei" : "jintuiziru";
						var cards = player.getCards("hs");
						var evt = _status.event.getParent();
						for (var i of cards) {
							if (
								get.name(i, player) == rawname &&
								evt.filterCard(
									{
										name: name,
										isCard: true,
										cards: [i],
									},
									player,
									evt
								)
							)
								return true;
						}
						return false;
					},
					check: function (button) {
						return _status.event.player.getUseValue({ name: button.link[2], isCard: true });
					},
					backup: function (links) {
						var name = links[0][2];
						var rawname =
							name == "wanjian" || name == "taoyuan" ? "gongshoujianbei" : "jintuiziru";
						return {
							popname: true,
							viewAs: { name: name, isCard: true },
							filterCard: { name: rawname },
							ai1: () => 1,
						};
					},
					prompt: function (links) {
						var name = links[0][2];
						var rawname =
							name == "wanjian" || name == "taoyuan" ? "gongshoujianbei" : "jintuiziru";
						return "将一张" + get.translation(rawname) + "当做" + get.translation(name) + "使用";
					},
				},
				ai: {
					order: 10,
					result: {
						player: 1,
					},
				},
			},
			doudizhu_cardPile: {
				intro: {
					content: "cardCount",
				},
			},
			kaihei: {
				enable: "phaseUse",
				filter: function (event, player) {
					return (
						player == game.zhu &&
						game.hasPlayer(function (current) {
							return lib.skill.kaihei.filterTarget(null, player, current);
						})
					);
				},
				filterTarget: function (card, player, target) {
					return (
						player != target &&
						!target.storage.kaihei &&
						target.countGainableCards(player, "he") > 0
					);
				},
				content: function () {
					"step 0";
					player.gainPlayerCard(target, [1, 2], "he", true);
					target.storage.kaihei = true;
					"step 1";
					if (!result.bool || !result.cards.length) {
						event.finish();
						return;
					}
					var num = result.cards.length;
					var hs = player.getCards("he");
					if (hs.length) {
						if (hs.length <= num) event._result = { bool: true, cards: hs };
						else
							player.chooseCard(
								"he",
								true,
								num,
								"选择交给" + get.translation(target) + get.cnNumber(num) + "张牌"
							);
					} else event.finish();
					"step 2";
					if (result.bool && result.cards && result.cards.length) player.give(result.cards, target);
				},
				ai: {
					viewHandcard: true,
					skillTagFilter: function (player, tag, target) {
						if (player == target || player.identity != "fan" || target.identity != "fan")
							return false;
					},
				},
			},
			feiyang: {
				trigger: { player: "phaseJudgeBegin" },
				charlotte: true,
				direct: true,
				filter: function (event, player) {
					return (
						_status.mode != "online" &&
						_status.mode != "binglin" &&
						player == game.zhu &&
						player.countCards("j") &&
						player.countCards("h") > 1
					);
				},
				content: function () {
					"step 0";
					player
						.chooseToDiscard(
							"h",
							2,
							get.prompt("feiyang"),
							"弃置两张手牌,然后弃置判定区里的一张牌"
						)
						.set("logSkill", "feiyang")
						.set("ai", function (card) {
							if (_status.event.goon) return 6 - get.value(card);
							return 0;
						})
						.set(
							"goon",
							(() => {
								if (player.hasSkillTag("rejudge") && player.countCards("j") < 2) return false;
								return player.hasCard(function (card) {
									if (
										get.tag(card, "damage") &&
										get.damageEffect(
											player,
											player,
											_status.event.player,
											get.natureList(card)
										) >= 0
									)
										return false;
									return (
										get.effect(
											player,
											{
												name: card.viewAs || card.name,
												cards: [card],
											},
											player,
											player
										) < 0
									);
								}, "j");
							})()
						);
					"step 1";
					if (result.bool) {
						player.discardPlayerCard(player, "j", true);
					}
				},
			},
			bahu: {
				trigger: { player: "phaseZhunbeiBegin" },
				charlotte: true,
				forced: true,
				filter: function (event, player) {
					return _status.mode != "online" && _status.mode != "binglin" && player == game.zhu;
				},
				content: function () {
					player.draw();
				},
				mod: {
					cardUsable: function (card, player, num) {
						if (
							_status.mode != "online" &&
							_status.mode != "binglin" &&
							player == game.zhu &&
							card.name == "sha"
						)
							return num + 1;
					},
				},
			},
			diqi_skill: {
				trigger: { player: "damageBegin2" },
				filter: function (event, player) {
					var card = player.getEquip("diqi");
					return (
						get.itemtype(card) == "card" && lib.filter.cardDiscardable(card, player, "diqi_skill")
					);
				},
				check: function (event, player) {
					return event.num >= Math.min(player.hp, 2);
				},
				prompt2: function (event, player) {
					return (
						"弃置" +
						get.translation(player.getEquip("diqi")) +
						"并防止即将受到的" +
						get.cnNumber(event.num) +
						"点伤害"
					);
				},
				content: function () {
					player.discard(player.getEquip("diqi"));
					trigger.cancel();
				},
				ai: {
					filterDamage: true,
					skillTagFilter: function (player, tag, arg) {
						if (arg && arg.player) {
							if (arg.player.hasSkillTag("jueqing", false, player)) return false;
						}
					},
				},
			},
			online_aozhan: {
				trigger: { player: "phaseBefore" },
				forced: true,
				popup: false,
				firstDo: true,
				filter: function (event, player) {
					return !_status._aozhan && game.roundNumber > 10;
				},
				content: function () {
					var color = get.groupnature(player.group, "raw");
					if (player.isUnseen()) color = "fire";
					player.$fullscreenpop("鏖战模式", color);
					game.broadcastAll(function () {
						_status._aozhan = true;
						ui.aozhan = ui.create.div(".touchinfo.left", ui.window);
						ui.aozhan.innerHTML = "鏖战模式";
						if (ui.time3) ui.time3.style.display = "none";
						ui.aozhanInfo = ui.create.system("鏖战模式", null, true);
						lib.setPopped(
							ui.aozhanInfo,
							function () {
								var uiintro = ui.create.dialog("hidden");
								uiintro.add("鏖战模式");
								var list = [
									"从第11轮开始,游戏将进入〔鏖战模式〕。",
									"在鏖战模式下,任何角色均不是非转化的【桃】的合法目标。【桃】可以被当做【杀】或【闪】使用或打出。",
								];
								var intro = '<ul style="text-align:left;margin-top:0;width:450px">';
								for (var i = 0; i < list.length; i++) {
									intro += "<li>" + list[i];
								}
								intro += "</ul>";
								uiintro.add('<div class="text center">' + intro + "</div>");
								var ul = uiintro.querySelector("ul");
								if (ul) {
									ul.style.width = "180px";
								}
								uiintro.add(ui.create.div(".placeholder"));
								return uiintro;
							},
							250
						);
						game.playBackgroundMusic();
					});
					game.removeGlobalSkill("online_aozhan");
					game.countPlayer(function (current) {
						current.addSkill("aozhan");
					});
				},
			},
			online_juzhong: {
				trigger: { global: "useCard" },
				direct: true,
				ruleSkill: true,
				filter: function (event, player) {
					return (
						_status.mode == "online" &&
						!event.all_excluded &&
						event.player.isFriendOf(player) &&
						event.player != player &&
						lib.skill.online_juzhong.infos[event.card.name] &&
						player.hasCard(function (card) {
							if (_status.connectMode) return true;
							return get.name(card, player) == event.card.name;
						}, "h")
					);
				},
				content: function () {
					"step 0";
					player
						.chooseToDiscard(
							"是否响应【聚众】?",
							get.translation(trigger.player) +
								"使用了" +
								get.translation(trigger.card) +
								"。你可弃置一张名称相同的牌,令" +
								lib.skill.online_juzhong.infos[trigger.card.name][0],
							function (card, player) {
								return get.name(card, player) == _status.event.getTrigger().card.name;
							}
						)
						.set("ai", lib.skill.online_juzhong.infos[trigger.card.name][2]).logSkill = [
						"_juzhong",
						trigger.player,
					];
					"step 1";
					if (result.bool) {
						lib.skill.online_juzhong.infos[trigger.card.name][1]();
						if (!event.goon) event.finish();
					} else event.finish();
					"step 2";
					trigger.player
						.chooseTarget("你可选择一名角色,弃置其的一张牌", function (card, player, target) {
							return target.countDiscardableCards(player, "he") > 0;
						})
						.set("ai", function (target) {
							var player = _status.event.player;
							return get.effect(target, { name: "guohe_copy2" }, player, player);
						});
					"step 3";
					if (result.bool) {
						var target = result.targets[0];
						trigger.player.line(target, "green");
						trigger.player.discardPlayerCard(target, true, "he");
					}
				},
				infos: {
					sha: [
						"此【杀】的伤害值基数+1。",
						function () {
							var evt = _status.event._trigger;
							if (!evt.baseDamage) evt.baseDamage = 1;
							evt.baseDamage++;
						},
						function (card) {
							var evt = _status.event.getTrigger();
							if (!evt.targets.length) return 0;
							if (
								evt.targets[0].hasShan() ||
								evt.targets[0].hasSkillTag("filterDamage", null, {
									player: evt.targets[0],
									card: evt.card,
								})
							)
								return 0;
							return 1;
						},
					],
					shan: [
						"其可弃置一名角色的一张牌。",
						function () {
							_status.event.goon = true;
						},
						function (card) {
							if (
								game.zhu.countCards("he", function (card) {
									return get.value(card, game.zhu) >= 6;
								})
							)
								return 7 - get.value(card);
							if (
								game.zhu.countCards("he", function (card) {
									return get.value(card, game.zhu) > 0;
								})
							)
								return 5 - get.value(card);
							return 0;
						},
					],
					tao: [
						"其摸两张牌。",
						function () {
							_status.event._trigger.player.draw(2);
						},
						function (card) {
							return 6 - get.value(card);
						},
					],
					jiu: [
						"其本回合的伤害值或回复值+1。",
						function () {
							var player = _status.event._trigger.player;
							player.addTempSkill("juzhong_jiu");
							player.addMark("juzhong_jiu", 1, false);
						},
						function (card) {
							return 6 - get.value(card);
						},
					],
				},
				ai: {
					viewHandcard: true,
					skillTagFilter: function (player, tag, target) {
						if (
							_status.mode != "online" ||
							player == target ||
							player.identity != target.identity
						)
							return false;
					},
				},
			},
			juzhong_jiu: {
				trigger: {
					player: "recoverBegin",
					source: "damageBegin1",
				},
				forced: true,
				popup: false,
				content: function () {
					trigger.num += player.countMark("juzhong_jiu");
				},
				onremove: true,
				intro: { content: "本回合的伤害值和回复值+#" },
			},
			online_zhadan_button: {
				trigger: {
					global: "gameDrawAfter",
					player: ["gainEnd", "loseEnd"],
				},
				firstDo: true,
				forced: true,
				charlotte: true,
				popup: false,
				silent: true,
				filter: function (event, player) {
					if (_status.mode != "online" || (player != game.me && !player.isOnline())) return;
					if (event.name != "lose")
						return !player.hasZhadan && player.countCards("hs", "zhadan") > 0;
					return player.hasZhadan && !player.countCards("hs", "zhadan");
				},
				content: function () {
					if (!player.hasZhadan) {
						player.hasZhadan = true;
						if (player == game.me) lib.skill.online_zhadan_button.initZhadan();
						else
							player.send(function () {
								lib.skill.online_zhadan_button.initZhadan();
							});
					} else {
						delete player.hasZhadan;
						if (player == game.me) lib.skill.online_zhadan_button.removeZhadan();
						else
							player.send(function () {
								lib.skill.online_zhadan_button.removeZhadan();
							});
					}
				},
				initZhadan: function () {
					ui.zhadan_button = ui.create.control("激活炸弹", "stayleft", function () {
						if (this.classList.contains("hidden")) return;
						this.classList.toggle("glow");
						if (
							this.classList.contains("glow") &&
							_status.event.type == "zhadan" &&
							_status.event.isMine() &&
							ui.confirm &&
							_status.imchoosing
						) {
							ui.click.cancel(ui.confirm.lastChild);
						}
					});
				},
				removeZhadan: function () {
					if (ui.zhadan_button) {
						ui.zhadan_button.remove();
						delete ui.zhadan_button;
					}
				},
			},
			online_zhadan: {
				trigger: { player: "useCard" },
				priority: 5,
				popup: false,
				forced: true,
				filter: function (event, player) {
					return game.hasPlayer(function (current) {
						return current.hasCard(function (card) {
							if (get.name(card) != "zhadan") return false;
							return lib.filter.cardEnabled(card, player, "forceEnable");
						}, "hs");
					});
				},
				forceLoad: true,
				content: function () {
					"step 0";
					event.source = trigger.player;
					event.card = trigger.card;
					event.targets = trigger.targets;
					event._global_waiting = true;
					event.filterCard = function (card, player) {
						if (get.name(card) != "zhadan" || get.itemtype(card) != "card") return false;
						return lib.filter.cardEnabled(card, player, "forceEnable");
					};
					event.send = function (player, card, source, targets, id, id2, skillState) {
						if (skillState) {
							player.applySkills(skillState);
						}
						if (
							player == game.me &&
							ui.zhadan_button &&
							!ui.zhadan_button.classList.contains("glow")
						) {
							_status.event._result = { bool: false };
							if (game.online) {
								_status.event._resultid = id;
								game.resume();
							}
							return;
						}
						var str = get.translation(source);
						if (targets && targets.length) {
							str += "对" + get.translation(targets);
						}
						str += "使用了";
						str += get.translation(card);
						str += ",是否对其使用【炸弹】?";

						var next = player.chooseToUse({
							filterCard: function (card, player) {
								if (get.name(card) != "zhadan" || get.itemtype(card) != "card") return false;
								return lib.filter.cardEnabled(card, player, "forceEnable");
							},
							prompt: str,
							_global_waiting: true,
							ai1: function (card) {
								var evt = _status.event.getParent("_zhadan")._trigger,
									player = _status.event.player;
								if (!evt) return 0;
								if (get.attitude(player, evt.player) > 0) return 0;
								var eff = 0;
								if (!targets.length) return Math.random() - 0.5;
								for (var i of targets) eff -= get.effect(i, evt.card, evt.player, player);
								return eff - 8;
							},
							source: source,
							source2: targets,
							id: id,
							id2: id2,
							type: "zhadan",
						});
						next.set("respondTo", [source, card]);

						if (game.online) {
							_status.event._resultid = id;
							game.resume();
						} else {
							next.nouse = true;
						}
					};
					"step 1";
					var list = game.filterPlayer(function (current) {
						return current.hasCard(function (card) {
							if (get.name(card) != "zhadan") return false;
							return lib.filter.cardEnabled(card, player, "forceEnable");
						}, "hs");
					});
					event.list = list;
					event.id = get.id();
					list.sort(function (a, b) {
						return (
							get.distance(event.source, a, "absolute") -
							get.distance(event.source, b, "absolute")
						);
					});
					"step 2";
					if (event.list.length == 0) {
						event.finish();
					} else if (
						_status.connectMode &&
						(event.list[0].isOnline() || event.list[0] == game.me)
					) {
						event.goto(4);
					} else {
						event.current = event.list.shift();
						event.send(
							event.current,
							event.card,
							event.source,
							event.targets,
							event.id,
							trigger.parent.id
						);
					}
					"step 3";
					if (result.bool) {
						event.zhadanresult = event.current;
						event.zhadanresult2 = result;
						if (event.current != game.me && !event.current.isOnline()) game.delayx();
						event.goto(8);
					} else {
						event.goto(2);
					}
					"step 4";
					var id = event.id;
					var sendback = function (result, player) {
						if (result && result.id == id && !event.zhadanresult && result.bool) {
							event.zhadanresult = player;
							event.zhadanresult2 = result;
							game.broadcast("cancel", id);
							if (
								_status.event.id == id &&
								_status.event.name == "chooseToUse" &&
								_status.paused
							) {
								return function () {
									event.resultOL = _status.event.resultOL;
									ui.click.cancel();
									if (ui.confirm) ui.confirm.close();
								};
							}
						} else {
							if (
								_status.event.id == id &&
								_status.event.name == "chooseToUse" &&
								_status.paused
							) {
								return function () {
									event.resultOL = _status.event.resultOL;
								};
							}
						}
					};

					var withme = false;
					var withol = false;
					var list = event.list;
					for (var i = 0; i < list.length; i++) {
						if (list[i].isOnline()) {
							withol = true;
							list[i].wait(sendback);
							list[i].send(
								event.send,
								list[i],
								event.card,
								event.source,
								event.targets,
								event.id,
								trigger.parent.id,
								get.skillState(list[i])
							);
							list.splice(i--, 1);
						} else if (list[i] == game.me) {
							withme = true;
							event.send(
								list[i],
								event.card,
								event.source,
								event.targets,
								event.id,
								trigger.parent.id
							);
							list.splice(i--, 1);
						}
					}
					if (!withme) {
						event.goto(6);
					}
					if (_status.connectMode) {
						if (withme || withol) {
							for (var i = 0; i < game.players.length; i++) {
								game.players[i].showTimer();
							}
						}
					}
					event.withol = withol;
					"step 5";
					if (result && result.bool && !event.zhadanresult) {
						game.broadcast("cancel", event.id);
						event.zhadanresult = game.me;
						event.zhadanresult2 = result;
					}
					"step 6";
					if (event.withol && !event.resultOL) {
						game.pause();
					}
					"step 7";
					for (var i = 0; i < game.players.length; i++) {
						game.players[i].hideTimer();
					}
					"step 8";
					if (event.zhadanresult) {
						event.zhadanresult.$fullscreenpop("炸弹", get.groupnature(event.zhadanresult));
						var next = event.zhadanresult.useResult(event.zhadanresult2);
						next.respondTo = [trigger.player, trigger.card];
						game.bonusNum *= 2;
						game.updateRoundNumber();
					}
				},
			},
		},
		card: {
			baiyidujiang: {
				fullskin: true,
				enable: true,
				filterTarget: function (card, player, target) {
					return target == game.zhu;
				},
				selectTarget: -1,
				type: "trick",
				content: function () {
					"step 0";
					if (!player.isIn() || !target.isIn()) {
						event.finish();
						return;
					}
					var num1 = 0,
						num2 = Infinity,
						str = get.translation(target);
					game.countPlayer(function (current) {
						var num = current.countCards("h");
						if (num > num1) num1 = num;
						if (num < num2) num2 = num;
					});
					var num = target.countCards("h"),
						choices = [];
					event.addIndex = 0;
					if (num < num1) {
						choices.push("令" + str + "将手牌摸至" + get.cnNumber(num1) + "张");
						event.num1 = num1;
					} else event.addIndex++;
					if (num > num2) {
						choices.push("令" + str + "将手牌弃置至" + get.cnNumber(num2) + "张");
						event.num2 = num2;
					}
					if (!choices.length) event.finish();
					else if (choices.length == 1) event._result = { index: 0 };
					else
						player
							.chooseControl()
							.set("choiceList", choices)
							.set("ai", function () {
								var evt = _status.event.getParent();
								return get.attitude(evt.player, evt.target) > 0 ? 0 : 1;
							});
					"step 1";
					if (result.index + event.addIndex == 0) {
						target.drawTo(event.num1);
					} else target.chooseToDiscard(true, "h", target.countCards("h") - event.num2);
				},
				ai: {
					order: 6,
					value: 4,
					useful: 2,
					tag: {
						draw: 1,
						loseCard: 1,
					},
					result: {
						target: function (player, target, card, isLink) {
							var num1 = 0,
								num2 = Infinity,
								str = get.translation(target);
							game.countPlayer(function (current) {
								var num = current.countCards("h", function (cardx) {
									if (ui.selected.cards.includes(cardx)) return false;
									if (card.cards && card.cards.includes(cardx)) return false;
									return true;
								});
								if (num > num1) num1 = num;
								if (num < num2) num2 = num;
							});
							var num = target.countCards("h", function (cardx) {
								if (ui.selected.cards.includes(cardx)) return false;
								if (card.cards && card.cards.includes(cardx)) return false;
								return true;
							});
							if (num1 > num) {
								if (get.attitude(player, target) > 0) return (num1 - num) / 1.2;
							}
							if (num2 < num) {
								if (get.attitude(player, target) > 0) return (num2 - num) / 1.2;
							}
							return 0;
						},
					},
				},
			},
			luojingxiashi: {
				fullskin: true,
				enable: true,
				type: "trick",
				selectTarget: -1,
				filterTarget: function (card, player, target) {
					return target != player && target.isDamaged();
				},
				content: function () {
					target.damage();
				},
				ai: {
					order: 3,
					value: 4,
					useful: 2,
					tag: {
						loseCard: 1,
					},
					result: {
						target: -1.5,
					},
				},
			},
			binglinchengxia: {
				fullskin: true,
				type: "delay",
				filterTarget: function (card, player, target) {
					return lib.filter.judge(card, player, target) && player != target;
				},
				judge: function (card) {
					if (get.suit(card) == "diamond") return 0;
					return -3;
				},
				effect: function () {
					"step 0";
					if (result.bool == false) {
						if (
							!player.countCards("e", function (card) {
								return lib.filter.cardDiscardable(card, player, "shuiyanqijuny");
							})
						) {
							player.damage("nosource");
							event.finish();
							return;
						} else
							player.chooseControl("discard_card", "take_damage", function (event, player) {
								if (get.damageEffect(player, event.player, player) >= 0) {
									return "take_damage";
								}
								if (player.hp >= 3 && player.countCards("e") >= 2) {
									return "take_damage";
								}
								return "discard_card";
							});
					} else event.finish();
					"step 1";
					if (result.control == "discard_card") {
						player.discard(
							player.getCards("e", function (card) {
								return lib.filter.cardDiscardable(card, player, "shuiyanqijuny");
							})
						);
					} else player.damage("nosource");
				},
				ai: {
					order: 1,
					value: 3,
					useful: 2,
					tag: {
						damage: 1,
						loseCard: 1,
					},
					result: {
						target: function (player, target, card, isLink) {
							var es = target.getCards("e");
							if (!es.length) return -1.5;
							var val = 0;
							for (var i of es) val += get.value(i, target);
							return -Math.min(1.5, val / 5);
						},
					},
				},
			},
			toushiche: {
				fullskin: true,
				type: "equip",
				subtype: "equip1",
				distance: { attackFrom: -3 },
				ai: {
					basic: {
						equipValue: 2.5,
					},
				},
				skills: ["toushiche_skill"],
			},
			gongshoujianbei: {
				fullskin: true,
				type: "trick",
			},
			jintuiziru: {
				fullskin: true,
				type: "trick",
			},
			diqi: {
				fullskin: true,
				type: "equip",
				subtype: "equip2",
				skills: ["diqi_skill"],
				destroy: "diqi_skill",
				ai: {
					basic: {
						equipValue: 6,
					},
				},
			},
			zhadan: {
				audio: true,
				fullskin: true,
				type: "trick",
				ai: {
					basic: {
						useful: [6, 4],
						value: [6, 4],
					},
					result: { player: 1 },
				},
				notarget: true,
				content: function () {
					var evt = event.getParent(2)._trigger;
					evt.targets.length = 0;
					evt.all_excluded = true;
					game.log(evt.card, "的效果被炸弹抵消了");
				},
			},
			jiwangkailai: {
				audio: true,
				fullskin: true,
				type: "trick",
				enable: function (card, player) {
					var hs = player.getCards("h", function (cardx) {
						return cardx != card && (!card.cards || !card.cards.includes(cardx));
					});
					if (!hs.length) return false;
					var use = true,
						discard = true;
					for (var i of hs) {
						if (use && !game.checkMod(i, player, "unchanged", "cardEnabled2", player))
							use = false;
						if (discard && !lib.filter.cardDiscardable(i, player, "jiwangkailai"))
							discard = false;
						if (!use && !discard) return false;
					}
					return true;
				},
				selectTarget: -1,
				toself: true,
				filterTarget: function (card, player, target) {
					return target == player;
				},
				modTarget: true,
				content: function () {
					"step 0";
					var hs = player.getCards("h");
					if (hs.length) {
						var use = true,
							discard = true;
						for (var i of hs) {
							if (use && !game.checkMod(i, player, "unchanged", "cardEnabled2", player))
								use = false;
							if (discard && !lib.filter.cardDiscardable(i, player, "jiwangkailai"))
								discard = false;
							if (!use && !discard) break;
						}
						if (use && discard)
							player
								.chooseControl()
								.set("prompt", "继往开来:请选择一项")
								.set("choiceList", [
									"弃置所有手牌,然后摸等量的牌",
									"将所有手牌当做一张普通锦囊牌使用",
								])
								.set("ai", function () {
									if (_status.event.player.countCards("h") > 2) return 0;
									return 1;
								});
						else if (use) event._result = { index: 1 };
						else if (discard) event._result = { index: 0 };
						else event.finish();
					} else event.finish();
					"step 1";
					var cards = player.getCards("h");
					if (result.index == 0) {
						player.discard(cards);
						player.draw(cards.length);
						event.finish();
					} else {
						var list = [];
						for (var i of lib.inpile) {
							if (
								i != "jiwangkailai" &&
								get.type(i) == "trick" &&
								lib.filter.filterCard({ name: i, cards: cards }, player)
							)
								list.push(["锦囊", "", i]);
						}
						if (list.length) {
							player
								.chooseButton(["继往开来:选择要使用的牌", [list, "vcard"]], true)
								.set("ai", function (button) {
									var player = _status.event.player;
									return player.getUseValue({
										name: button.link[2],
										cards: player.getCards("h"),
									});
								});
						} else event.finish();
					}
					"step 2";
					if (result.bool)
						player.chooseUseTarget({ name: result.links[0][2] }, player.getCards("h"), true);
				},
				ai: {
					basic: {
						order: 0.5,
						useful: 3,
						value: 5,
					},
					result: {
						target: function (player, target) {
							if (
								target.needsToDiscard(1) ||
								!target.countCards("h", function (card) {
									return get.value(card, player) >= 5.5;
								})
							)
								return 1;
							return 0;
						},
					},
					tag: {
						draw: 2,
					},
				},
			},
		},
		characterOnline: {
			wei: [
				"re_caocao",
				"re_guojia",
				"re_simayi",
				"re_xiahoudun",
				"xuzhu",
				"re_zhangliao",
				"re_zhenji",
				"ol_xiahouyuan",
				"dianwei",
				"re_xunyu",
				"zhanghe",
				"yujin_yujin",
				"re_caozhang",
				"wangyi",
				"guohuai",
				"hanhaoshihuan",
				"chenqun",
				"re_caoxiu",
				"guohuanghou",
				"sunziliufang",
				"xunyou",
				"xinxianying",
				"sp_caiwenji",
				"caoang",
				"caochun",
				"caohong",
				"sp_caoren",
				"chenlin",
				"sp_jiaxu",
				"litong",
				"sp_pangde",
				"simalang",
				"wanglang",
				"kuailiangkuaiyue",
				"wangji",
				"sp_simazhao",
				"sp_wangyuanji",
				"yuejin",
				"zangba",
				"xinpi",
				"liuye",
				"simashi",
				"zhuling",
				"duji",
				"caoanmin",
			],
			shu: [
				"re_guanyu",
				"re_huangyueying",
				"re_liubei",
				"re_machao",
				"re_zhangfei",
				"zhaoyun",
				"re_huangzhong",
				"re_weiyan",
				"re_pangtong",
				"ol_sp_zhugeliang",
				"re_menghuo",
				"re_zhurong",
				"re_fazheng",
				"re_masu",
				"guanxingzhangbao",
				"xin_liaohua",
				"old_madai",
				"re_jianyong",
				"wuyi",
				"zhangsong",
				"zhoucang",
				"liuchen",
				"xiahoushi",
				"re_zhangyi",
				"liyan",
				"guanyinping",
				"guansuo",
				"mayunlu",
				"mazhong",
				"mizhu",
				"sunqian",
				"xiahouba",
				"zhangxingcai",
				"wangping",
				"yanyan",
				"chendao",
				"ganfuren",
				"re_maliang",
				"dengzhi",
				"lifeng",
				"zhangyì",
			],
			wu: [
				"re_ganning",
				"re_huanggai",
				"re_sunquan",
				"re_sunshangxiang",
				"re_zhouyu",
				"old_zhoutai",
				"re_xiaoqiao",
				"re_taishici",
				"sunjian",
				"re_zhangzhang",
				"re_lingtong",
				"re_wuguotai",
				"xin_xusheng",
				"re_bulianshi",
				"re_chengpu",
				"handang",
				"xin_panzhangmazhong",
				"xin_zhuran",
				"guyong",
				"zhuhuan",
				"cenhun",
				"sundeng",
				"xuezong",
				"daxiaoqiao",
				"heqi",
				"kanze",
				"sunhao",
				"re_sunluyu",
				"sunshao",
				"zhugejin",
				"zumao",
				"dingfeng",
				"sunliang",
				"zhoufei",
				"weiwenzhugezhi",
				"xf_sufei",
				"xugong",
				"lingcao",
				"sunru",
				"lvdai",
				"panjun",
				"yanjun",
				"zhoufang",
			],
			qun: [
				"re_diaochan",
				"re_gongsunzan",
				"re_huatuo",
				"re_huaxiong",
				"re_lvbu",
				"ol_pangde",
				"re_yanwen",
				"jiaxu",
				"gaoshun",
				"xin_liubiao",
				"chengong",
				"re_gongsunyuan",
				"guotufengji",
				"dongbai",
				"fuwan",
				"liuxie",
				"sp_machao",
				"tadun",
				"yanbaihu",
				"yuanshu",
				"zhangbao",
				"yl_luzhi",
				"huangfusong",
				"sp_ganning",
				"huangjinleishi",
				"re_panfeng",
				"guosi",
				"sp_liuqi",
				"mangyachang",
				"gaolan",
				"lvkuanglvxiang",
				"xunchen",
				"sp_zhanghe",
				"re_hansui",
				"re_hejin",
				"zhujun",
				"ol_dingyuan",
				"hanfu",
				"wangrong",
				"dongcheng",
				"gongsunkang",
				"hucheer",
				"sp_sufei",
				"yj_xuhuang",
				"yj_zhanghe",
				"yj_zhangliao",
				"liuyao",
				"wangcan",
				"sp_taishici",
				"caimao",
				"jiling",
			],
			key: [
				"sp_key_yuri",
				"key_akane",
				"key_akiko",
				"key_ao",
				"key_harukakanata",
				"key_haruko",
				"key_hinata",
				"key_kengo",
				"key_komari",
				"key_kotori",
				"key_kyoko",
				"key_nagisa",
				"key_noda",
				"key_rei",
				"key_rin",
				"key_rumi",
				"key_ryoichi",
				"key_sasami",
				"key_shiorimiyuki",
				"key_shiroha",
				"key_shizuku",
				"key_tomoya",
				"key_tsumugi",
				"key_umi",
				"key_yoshino",
				"key_youta",
				"key_yukine",
				"key_nao",
				"key_misuzu",
			],
		},
		online_cardPile: [
			["spade", 1, "guding"],
			["spade", 1, "zhadan"],
			["spade", 2, "tengjia"],
			["spade", 2, "cixiong"],
			["spade", 3, "jiu"],
			["spade", 3, "guohe"],
			["spade", 4, "sha", "thunder"],
			["spade", 4, "guohe"],
			["spade", 5, "sha", "thunder"],
			["spade", 5, "qinglong"],
			["spade", 6, "sha", "thunder"],
			["spade", 6, "jiwangkailai"],
			["spade", 7, "sha", "thunder"],
			["spade", 7, "jintuiziru"],
			["spade", 8, "sha", "thunder"],
			["spade", 8, "sha"],
			["spade", 9, "jiu"],
			["spade", 9, "sha"],
			["spade", 10, "gongshoujianbei"],
			["spade", 10, "sha"],
			["spade", 11, "tiesuo"],
			["spade", 11, "shunshou"],
			["spade", 12, "tiesuo"],
			["spade", 12, "zhangba"],
			["spade", 13, "wuxie"],
			["spade", 13, "dawanma"],

			["club", 1, "baiyin"],
			["club", 1, "zhuge"],
			["club", 2, "tengjia"],
			["club", 2, "bagua"],
			["club", 3, "jiu"],
			["club", 3, "sha"],
			["club", 4, "jintuiziru"],
			["club", 4, "sha"],
			["club", 5, "sha", "thunder"],
			["club", 5, "dilu"],
			["club", 6, "sha", "thunder"],
			["club", 6, "sha"],
			["club", 7, "sha", "thunder"],
			["club", 7, "sha"],
			["club", 8, "sha", "thunder"],
			["club", 8, "sha"],
			["club", 9, "jiu"],
			["club", 9, "sha"],
			["club", 10, "tiesuo"],
			["club", 10, "sha"],
			["club", 11, "tiesuo"],
			["club", 11, "sha"],
			["club", 12, "tiesuo"],
			["club", 12, "wuxie"],
			["club", 13, "tiesuo"],
			["club", 13, "jiedao"],
			["club", 13, "wuxie"],

			["heart", 1, "wuxie"],
			["heart", 1, "gongshoujianbei"],
			["heart", 1, "zhadan"],
			["heart", 2, "huogong"],
			["heart", 2, "shan"],
			["heart", 3, "huogong"],
			["heart", 3, "wuzhong"],
			["heart", 4, "sha", "fire"],
			["heart", 4, "tao"],
			["heart", 5, "tao"],
			["heart", 5, "chitu"],
			["heart", 6, "tao"],
			["heart", 6, "jiwangkailai"],
			["heart", 7, "sha", "fire"],
			["heart", 7, "tao"],
			["heart", 8, "shan"],
			["heart", 8, "wuzhong"],
			["heart", 9, "shan"],
			["heart", 9, "tao"],
			["heart", 10, "sha", "fire"],
			["heart", 10, "sha"],
			["heart", 11, "shan"],
			["heart", 11, "wuzhong"],
			["heart", 12, "shan"],
			["heart", 12, "guohe"],
			["heart", 13, "wuxie"],
			["heart", 13, "zhuahuang"],

			["diamond", 1, "zhuque"],
			["diamond", 1, "juedou"],
			["diamond", 2, "tao"],
			["diamond", 2, "shan"],
			["diamond", 3, "tao"],
			["diamond", 3, "shan"],
			["diamond", 4, "sha", "fire"],
			["diamond", 4, "shunshou"],
			["diamond", 5, "sha", "fire"],
			["diamond", 5, "guanshi"],
			["diamond", 6, "shan"],
			["diamond", 6, "sha"],
			["diamond", 7, "shan"],
			["diamond", 7, "shan"],
			["diamond", 8, "shan"],
			["diamond", 8, "shan"],
			["diamond", 9, "jiu"],
			["diamond", 9, "shan"],
			["diamond", 10, "shan"],
			["diamond", 10, "sha"],
			["diamond", 11, "shan"],
			["diamond", 11, "shan"],
			["diamond", 12, "huogong"],
			["diamond", 12, "tao"],
			["diamond", 13, "xiliu"],
			["diamond", 13, "sha"],
			["diamond", 13, "wuxie"],
		],
		help: {
			斗地主:
				'<div style="margin:10px">游戏规则</div><ul style="margin-top:0"><li>游戏人数<br>游戏人数为3人(地主x1 + 农民x2)。<li>胜利条件<br>农民:地主死亡。<br>地主:所有农民死亡且自己存活。' +
				"<li>死亡奖惩<br>当有农民死亡时,若另一名农民存活,则其可以选择摸两张牌或回复1点体力。<li>地主专属技能<br>地主可以使用专属技能〖飞扬〗和〖跋扈〗。<br>〖飞扬〗判定阶段开始时,若你的判定区有牌,则你可以弃置两张手牌,然后弃置你判定区的一张牌。每回合限一次。<br>〖跋扈〗锁定技,准备阶段开始时,你摸一张牌。出牌阶段,你可以多使用一张【杀】。</ul>",
		},
	};
});