From c9fe123b9021058faeb943803e46037827f4a9a6 Mon Sep 17 00:00:00 2001
From: mengxinzxz <2223529500@qq.com>
Date: Sun, 21 Apr 2024 00:43:24 +0800
Subject: [PATCH 01/11] =?UTF-8?q?=E6=97=8F=E9=92=9F=E7=B9=87?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
character/clan.js | 326 +++++++++++++++++++++++++++++++++++++---------
character/rank.js | 2 +
2 files changed, 268 insertions(+), 60 deletions(-)
diff --git a/character/clan.js b/character/clan.js
index c99823343..1a6400698 100644
--- a/character/clan.js
+++ b/character/clan.js
@@ -73,6 +73,8 @@ game.import("character", function () {
["clantanque", "clanshengmo", "clanzhongliu"],
["clan:太原王氏"],
],
+ //笑点解析——群雄
+ clan_zhongyao: ["male", "qun", 3, ["clanchengqi", "clanjieli", "clanbaozu"], ["clan:颍川钟氏"]],
},
characterSort: {
clan: {
@@ -87,11 +89,208 @@ game.import("character", function () {
"clan_wangguang",
"clan_wangmingshan",
],
- clan_zhong: ["clan_zhongyan", "clan_zhonghui", "clan_zhongyu"],
+ clan_zhong: ["clan_zhongyan", "clan_zhonghui", "clan_zhongyu", "clan_zhongyao"],
},
},
/** @type { importCharacterConfig['skill'] } */
skill: {
+ //族钟繇
+ clanchengqi: {
+ hiddenCard(player, name) {
+ if (get.type(name) != "basic" && get.type(name) != "trick") return false;
+ if (player.getStorage("clanchengqi_effect").includes(name)) return false;
+ return player.countCards("hs") > 1 && lib.inpile.includes(name);
+ },
+ audio: 2,
+ enable: "chooseToUse",
+ filter(event, player) {
+ if (player.countCards("hs") < 2) return false;
+ return get.inpileVCardList(info => {
+ const name = info[2];
+ if (get.type(name) != "basic" && get.type(name) != "trick") return false;
+ return !player.getStorage("clanchengqi_effect").includes(name);
+ }).some(card => event.filterCard({ name: card[2], nature: card[3] }, player, event));
+ },
+ chooseButton: {
+ dialog(event, player) {
+ const list = get.inpileVCardList(info => {
+ const name = info[2];
+ if (get.type(name) != "basic" && get.type(name) != "trick") return false;
+ return !player.getStorage("clanchengqi_effect").includes(name);
+ }).filter(card => event.filterCard({ name: card[2], nature: card[3] }, player, event));
+ return ui.create.dialog("承启", [list, "vcard"]);
+ },
+ check(button) {
+ if (get.event().getParent().type != "phase") return 1;
+ return get.event("player").getUseValue({ name: button.link[2], nature: button.link[3] });
+ },
+ backup(links, player) {
+ return {
+ audio: "clanchengqi",
+ filterCard: true,
+ complexCard: true,
+ selectCard: [2, Infinity],
+ popname: true,
+ viewAs: {
+ name: links[0][2],
+ nature: links[0][3],
+ },
+ filterOk() {
+ return (ui.selected.cards || []).reduce((sum, card) => {
+ return sum + get.cardNameLength(card);
+ }, 0) >= get.cardNameLength(lib.skill.clanchengqi_backup.viewAs.name);
+ },
+ check(card) {
+ const player = get.event("player");
+ const name = lib.skill.clanchengqi_backup.viewAs.name;
+ if (ui.selected.cards.length > 1 || card.name == name) return 0;
+ if (ui.selected.cards.length && game.hasPlayer(target => {
+ return get.effect(target, { name: "draw" }, player, player) > 0;
+ })) {
+ if (get.cardNameLength(name) <= get.cardNameLength(card) + get.cardNameLength(ui.selected.cards[0])) {
+ return 10 / (get.value(card) || 0.5);
+ }
+ }
+ return 1 / (get.value(card) || 0.5);
+ },
+ position: "hs",
+ precontent() {
+ player.addTempSkill("clanchengqi_effect");
+ player.markAuto("clanchengqi_effect", [event.result.card.name]);
+ },
+ };
+ },
+ },
+ ai: {
+ order(item, player) {
+ if (player && get.event().type == "phase") {
+ let list = get.inpileVCardList(info => {
+ const name = info[2];
+ if (get.type(name) != "basic" && get.type(name) != "trick") return false;
+ return !player.getStorage("clanchengqi_effect").includes(name);
+ }).map(card => { return { name: card[2], nature: card[3] } }).filter(card => player.getUseValue(card, true, true) > 0);
+ if (!list.length) return 0;
+ list.sort((a, b) => (player.getUseValue(b, true, true) || 0) - (player.getUseValue(a, true, true) || 0));
+ return get.order(list[0], player) * 0.99;
+ }
+ return 0.001;
+ },
+ respondSha: true,
+ respondShan: true,
+ skillTagFilter(player, tag, arg) {
+ if (arg == "respond") return false;
+ const name = tag == "respondSha" ? "sha" : "shan";
+ return get.info("clanchengqi").hiddenCard(player, name);
+ },
+ result: { player: 1 },
+ },
+ subSkill: {
+ backup: { audio: "clanchengqi" },
+ effect: {
+ charlotte: true,
+ onremove: true,
+ trigger: { player: "useCard" },
+ filter(event, player) {
+ return event.skill == "clanchengqi_backup" && get.cardNameLength(event.card) == (event.cards || []).reduce((sum, card) => {
+ return sum + get.cardNameLength(card);
+ }, 0);
+ },
+ async cost(event, trigger, player) {
+ event.result = await player.chooseTarget("承启:是否令一名角色摸一张牌?").set('ai', target => {
+ const player = get.event("player");
+ return get.effect(target, { name: "draw" }, player, player);
+ }).forResult();
+ },
+ popup: false,
+ content() {
+ player.line(event.targets);
+ event.targets[0].draw();
+ },
+ },
+ },
+ },
+ clanjieli: {
+ audio: 2,
+ trigger: { player: 'phaseJieshuBegin' },
+ filter(event, player) {
+ return game.hasPlayer(target => {
+ return target.countCards("h");
+ });
+ },
+ async cost(event, trigger, player) {
+ let num = 0;
+ if (player.getHistory("useCard").length) {
+ for (const history of player.getHistory("useCard")) {
+ if (num < get.cardNameLength(history.card)) {
+ num = get.cardNameLength(history.card);
+ }
+ }
+ }
+ const str = (num > 0 ? ("并观看牌堆顶" + get.cnNumber(num) + "张牌,然后你可以交换其中等量的牌") : "");
+ event.result = await player.chooseTarget(get.prompt("clanjieli"), "观看一名角色的牌名字数最多的手牌" + str, (card, player, target) => {
+ return target.countCards("h");
+ }).set('ai', target => {
+ const player = get.event("player");
+ return get.effect(target, { name: "draw" }, player, player);
+ }).forResult();
+ },
+ async content(event, trigger, player) {
+ const target = event.targets[0];
+ let num = 0;
+ if (player.getHistory("useCard").length) {
+ for (const history of player.getHistory("useCard")) {
+ if (num < get.cardNameLength(history.card)) {
+ num = get.cardNameLength(history.card);
+ }
+ }
+ }
+ let map = {};
+ for (const i of target.getCards("h")) {
+ if (!map[get.cardNameLength(i)]) {
+ map[get.cardNameLength(i)] = 0;
+ }
+ map[get.cardNameLength(i)]++;
+ }
+ const num2 = Object.keys(map).sort((a, b) => map[b] - map[a])[0];
+ const cards = target.getCards("he", card => get.cardNameLength(card) == num2);
+ if (num > 0 && cards.length >= num) {
+ const topCards = get.cards(num);
+ game.updateRoundNumber();
+ const result = await player.chooseToMove(
+ "诫厉:交换其中" + get.cnNumber(num) + "张牌"
+ ).set("list", [
+ [get.translation(target) + "牌名字数最多的手牌", cards, "dcsushou_tag"],
+ ["牌堆顶", topCards],
+ ]).set("filterMove", (from, to) => {
+ return typeof to != "number";
+ }).set('num', num).set("filterOk", moved => {
+ return moved[1].every(card => get.owner(card));
+ }).set("processAI", list => {
+ const player = get.event("player"), target = get.event().getParent().targets[0];
+ const sgn = get.sgn(get.sgn(get.attitude(player, target)) - 0.5);
+ const cards1 = list[0][1].slice().sort((a, b) => get.value(a, "raw") * sgn - get.value(b, "raw") * sgn);
+ const cards2 = list[1][1].slice().sort((a, b) => get.value(b, "raw") * sgn - get.value(a, "raw") * sgn);
+ return [cards1.slice().addArray(cards2.slice(0, get.event("num"))), cards2.slice().addArray(cards1.slice(0, get.event("num")))];
+ }).forResult();
+ if (result.bool) {
+ const lose = result.moved[1].slice();
+ const gain = result.moved[0].slice().filter(i => !get.owner(i));
+ if (lose.length) await target.lose(lose, ui.special);
+ for (let i = lose.length - 1; i--; i >= 0) {
+ ui.cardPile.insertBefore(lose[i], ui.cardPile.firstChild);
+ }
+ game.updateRoundNumber();
+ if (gain.length) await target.gain(gain, "draw");
+ }
+ }
+ else {
+ const topCards = get.cards(num, true);
+ game.updateRoundNumber();
+ const content = [get.translation(target) + "牌名字数最多的手牌", cards, "牌堆顶", topCards];
+ await player.chooseControl("ok").set("dialog", content);
+ }
+ },
+ },
//族王明山
clantanque: {
audio: 2,
@@ -179,9 +378,9 @@ game.import("character", function () {
filter(event, player) {
if (event.responded) return false;
const names = lib.inpile.filter(
- (name) =>
- get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name)
- ),
+ (name) =>
+ get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name)
+ ),
cards = get.event("clanshengmo_cards") || [];
return (
cards.length > 0 &&
@@ -216,9 +415,9 @@ game.import("character", function () {
async content(event, trigger, player) {
const evt = event.getParent(2);
const names = lib.inpile.filter(
- (name) =>
- get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name)
- ),
+ (name) =>
+ get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name)
+ ),
cards = evt.clanshengmo_cards;
const links = await player
.chooseButton(["剩墨:获得其中一张牌", cards], true)
@@ -276,7 +475,7 @@ game.import("character", function () {
evt.set("norestore", true);
evt.set("custom", {
add: {},
- replace: { window() {} },
+ replace: { window() { } },
});
evt.goto(0);
},
@@ -428,8 +627,8 @@ game.import("character", function () {
let str = "";
const card = new lib.element.VCard({ name: "sha" });
const targets = game.filterPlayer((target) => {
- return event.player.getPrevious() == target || event.player.getNext() == target;
- }),
+ return event.player.getPrevious() == target || event.player.getNext() == target;
+ }),
bool = !targets.some((target) => {
return target.getHistory("useCard").length;
}),
@@ -455,8 +654,8 @@ game.import("character", function () {
check(event, player) {
const card = new lib.element.VCard({ name: "sha" });
const targets = game.filterPlayer((target) => {
- return event.player.getPrevious() == target || event.player.getNext() == target;
- }),
+ return event.player.getPrevious() == target || event.player.getNext() == target;
+ }),
bool = !targets.some((target) => {
return target.getHistory("useCard").length;
}),
@@ -481,10 +680,10 @@ game.import("character", function () {
player.awakenSkill("clanjianji");
const card = new lib.element.VCard({ name: "sha" });
const targets = game.filterPlayer((target) => {
- return (
- trigger.player.getPrevious() == target || trigger.player.getNext() == target
- );
- }),
+ return (
+ trigger.player.getPrevious() == target || trigger.player.getNext() == target
+ );
+ }),
boolx = !targets.some((target) => {
return target.getHistory("useCard").length;
}),
@@ -507,7 +706,7 @@ game.import("character", function () {
.set(
"choice",
get.attitude(player, trigger.player) > 0 ||
- trigger.player.countCards("h") > player.countCards("h")
+ trigger.player.countCards("h") > player.countCards("h")
);
if (bool) draw = true;
} else draw = true;
@@ -546,9 +745,9 @@ game.import("character", function () {
.set(
"prompt",
"当前手牌点数和为" +
- player.getCards("h").reduce((sum, card) => sum + get.number(card), 0) +
- "," +
- get.prompt("clanqiajue")
+ player.getCards("h").reduce((sum, card) => sum + get.number(card), 0) +
+ "," +
+ get.prompt("clanqiajue")
)
.set(
"prompt2",
@@ -972,7 +1171,7 @@ game.import("character", function () {
return false;
return (
get.effect(target, card, player, player) +
- get.effect(target, { name: "draw" }, player, player) >
+ get.effect(target, { name: "draw" }, player, player) >
0
);
});
@@ -1130,10 +1329,10 @@ game.import("character", function () {
.set(
"dying",
player.hp +
- player.countCards("hs", {
- name: ["tao", "jiu"],
- }) <
- 1
+ player.countCards("hs", {
+ name: ["tao", "jiu"],
+ }) <
+ 1
)
.set("num", event.num1);
} else event.finish();
@@ -1353,7 +1552,7 @@ game.import("character", function () {
next.set("_backupevent", "clanfuxun_backup");
next.set("custom", {
add: {},
- replace: { window() {} },
+ replace: { window() { } },
});
next.backup("clanfuxun_backup");
}
@@ -2488,13 +2687,13 @@ game.import("character", function () {
if (eff > 0) return eff;
return Math.max(
2 * get.effect(target, { name: "draw" }, player, player) +
- 0.6 * get.effect(player, { name: "draw" }, player, player),
+ 0.6 * get.effect(player, { name: "draw" }, player, player),
get.recoverEffect(target, player, player)
);
}
return Math.max(
2 * get.effect(target, { name: "draw" }, player, player) +
- 0.6 * get.effect(player, { name: "draw" }, player, player),
+ 0.6 * get.effect(player, { name: "draw" }, player, player),
get.recoverEffect(target, player, player)
);
})
@@ -2503,10 +2702,10 @@ game.import("character", function () {
player.countCards("hs", (card) => {
return get.name(card) == "jiu" && player.hasUseTarget(card);
}) &&
- player.countCards("hs", (card) => {
- if (get.name(card) != "sha") return false;
- return game.hasNature(card, "linked");
- })
+ player.countCards("hs", (card) => {
+ if (get.name(card) != "sha") return false;
+ return game.hasNature(card, "linked");
+ })
);
"step 1";
if (result.bool) {
@@ -2782,11 +2981,11 @@ game.import("character", function () {
trigger.player
.chooseCard(
"连和:交给" +
- get.translation(player) +
- get.cnNumber(num - 1) +
- "张牌,或点“取消”令其摸" +
- get.cnNumber(num + 1) +
- "张牌",
+ get.translation(player) +
+ get.cnNumber(num - 1) +
+ "张牌,或点“取消”令其摸" +
+ get.cnNumber(num + 1) +
+ "张牌",
num - 1,
pos
)
@@ -2966,8 +3165,8 @@ game.import("character", function () {
.chooseTarget(
"三恇:选择一名其他角色",
"令其交给你至少X张牌" +
- (cards.length ? ",然后其获得" + get.translation(cards) : "") +
- "(X为以下条件中其满足的项数:场上有牌、已受伤、体力值小于手牌数)",
+ (cards.length ? ",然后其获得" + get.translation(cards) : "") +
+ "(X为以下条件中其满足的项数:场上有牌、已受伤、体力值小于手牌数)",
true,
lib.filter.notMe
)
@@ -3007,15 +3206,15 @@ game.import("character", function () {
"prompt",
num > 0
? "是否交给" +
- get.translation(player) +
- "任意张牌" +
- (cards.length ? "并获得" + get.translation(cards) : "") +
- "?"
+ get.translation(player) +
+ "任意张牌" +
+ (cards.length ? "并获得" + get.translation(cards) : "") +
+ "?"
: "交给" +
- get.translation(player) +
- "至少" +
- get.cnNumber(num) +
- "张牌"
+ get.translation(player) +
+ "至少" +
+ get.cnNumber(num) +
+ "张牌"
);
}
} else event.finish();
@@ -3194,19 +3393,19 @@ game.import("character", function () {
next.set(
"openskilldialog",
"将" +
- get.cnNumber(cards.length) +
- "张牌当做" +
- (get.translation(nature) || "") +
- "【" +
- get.translation(name) +
- "】使用"
+ get.cnNumber(cards.length) +
+ "张牌当做" +
+ (get.translation(nature) || "") +
+ "【" +
+ get.translation(name) +
+ "】使用"
);
next.set("norestore", true);
next.set("addCount", false);
next.set("_backupevent", "clanshenjun_backup");
next.set("custom", {
add: {},
- replace: { window() {} },
+ replace: { window() { } },
});
next.backup("clanshenjun_backup");
}
@@ -3405,7 +3604,7 @@ game.import("character", function () {
filter(event, player) {
return player.getStorage("clanfenchai").length;
},
- content() {},
+ content() { },
},
},
mod: {
@@ -3441,8 +3640,8 @@ game.import("character", function () {
return (
num > 0 &&
num ==
- player.getDiscardableCards(player, "h").filter((i) => get.name(i) == link)
- .length
+ player.getDiscardableCards(player, "h").filter((i) => get.name(i) == link)
+ .length
);
},
check(button) {
@@ -3830,8 +4029,8 @@ game.import("character", function () {
player
.chooseTarget(
"蹈节:将" +
- get.translation(trigger.cards.filterInD()) +
- "交给一名颍川荀氏角色",
+ get.translation(trigger.cards.filterInD()) +
+ "交给一名颍川荀氏角色",
true,
(card, player, target) => {
return target == player || target.hasClan("颍川荀氏");
@@ -3924,7 +4123,7 @@ game.import("character", function () {
player.countCards("h", function (card) {
return lib.skill.clanyirong.checkx(card) > 0;
}) +
- 1 <
+ 1 <
player.countCards("h") - player.getHandcardLimit()
)
return 0;
@@ -4284,6 +4483,13 @@ game.import("character", function () {
clanshengmo: "剩墨",
clanshengmo_info:
"当你需要使用一张未以此法使用过的基本牌时,你可以获得一张于本回合进入弃牌堆且点数不为这些牌中最大且不为这些牌中最小的牌,视为你使用需要使用的牌。",
+ clan_zhongyao: "族钟繇",
+ clan_zhongyao_prefix: "族",
+ clanchengqi: "承启",
+ clanchengqi_info: "你可以将至少两张手牌当作本回合未以此法转换过的基本牌或普通锦囊牌使用,且你以此法转化的牌名字数须不大于以此法转化的所有实体牌牌名字数之和,若你以此法转化的牌名字数等于以此法转化的所有实体牌牌名字数之和,则你使用此牌时可以令一名角色摸一张牌。",
+ clanjieli: "诫厉",
+ clanjieli_info: "结束阶段,你可以选择一名角色,你观看其手牌中牌名字数最多的牌和牌堆顶X张牌,然后你可以交换其中的X张牌(X为你本回合使用过的牌中的牌名字数最大值)。",
+
clan_wu: "陈留·吴氏",
clan_xun: "颍川·荀氏",
diff --git a/character/rank.js b/character/rank.js
index 3ad34972e..76252d8b8 100644
--- a/character/rank.js
+++ b/character/rank.js
@@ -142,6 +142,7 @@ window.noname_character_rank = {
"dc_shen_huatuo",
"sp_zhenji",
"wu_guanyu",
+ "clan_zhongyao",
],
a: [
"star_caoren",
@@ -1916,6 +1917,7 @@ window.noname_character_rank = {
"wu_guanyu",
],
epic: [
+ "clan_zhongyao",
"dc_caoshuang",
"tianchou",
"star_yuanshao",
From 4dbe771586133be15238778f5c14a3384e80a6af Mon Sep 17 00:00:00 2001
From: mengxinzxz <2223529500@qq.com>
Date: Sun, 21 Apr 2024 00:44:35 +0800
Subject: [PATCH 02/11] =?UTF-8?q?=E6=97=8F=E9=92=9F=E4=BC=9A=E3=80=90?=
=?UTF-8?q?=E6=8C=9F=E6=9C=AF=E3=80=91bugfix?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
character/clan.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/character/clan.js b/character/clan.js
index 1a6400698..ab8296e3f 100644
--- a/character/clan.js
+++ b/character/clan.js
@@ -1366,7 +1366,7 @@ game.import("character", function () {
str = "";
if (player.getDamagedHp() > 0)
str += ",然后摸" + get.cnNumber(player.getDamagedHp()) + "张牌";
- player
+ event.result=await player
.chooseToDiscard(
get.prompt("clanxieshu"),
"横置武将牌并弃置" + get.cnNumber(num) + "张牌" + str,
From 27e269ec160985e96c522dab24bb0ad864cb4fd5 Mon Sep 17 00:00:00 2001
From: mengxinzxz <2223529500@qq.com>
Date: Sun, 21 Apr 2024 00:46:20 +0800
Subject: [PATCH 03/11] =?UTF-8?q?=E7=A5=9E=E9=B2=81=E8=82=83=E5=8F=88?=
=?UTF-8?q?=E5=8F=8C=E5=8F=92=E5=8F=95=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
character/extra.js | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/character/extra.js b/character/extra.js
index c70a11367..acd1b10ee 100755
--- a/character/extra.js
+++ b/character/extra.js
@@ -33,7 +33,7 @@ game.import("character", function () {
character: {
dc_shen_huatuo: ["male", "shen", 3, ["jingyu", "lvxin", "huandao"], ["qun"]],
shen_xuzhu: ["male", "shen", 5, ["zhengqing", "zhuangpo"], ["wei"]],
- shen_lusu: ["male", "shen", 3, ["dingzhou", "tamo", "zhimeng"], ["wu"]],
+ shen_lusu: ["male", "shen", 3, ["tamo", "dingzhou", "zhimeng"], ["wu"]],
shen_huatuo: ["male", "shen", 3, ["wuling", "youyi"], ["qun"]],
le_shen_jiaxu: ["male", "shen", 4, ["jxlianpo", "jxzhaoluan"], ["qun"]],
shen_dianwei: ["male", "shen", 4, ["juanjia", "qiexie", "cuijue"], ["wei"]],
@@ -715,7 +715,7 @@ game.import("character", function () {
eff = ui.selected.cards
.map((card) => get.value(card))
.reduce((p, c) => p + c, 0);
- if (player.hasSkill("zhimeng")) eff *= 1 + get.sgnAttitude(player, target) * 0.15;
+ if (player.hasSkill("zhimeng") && (get.mode() == 'identity' || (player.countCards('h') - target.countCards('h') > 2 * ui.selected.cards.length))) eff *= 1 + get.sgnAttitude(player, target) * 0.15;
const es = target.getCards("e"),
js = target.getCards("j");
es.forEach((card) => {
@@ -931,8 +931,7 @@ game.import("character", function () {
filter(event, player) {
return game.hasPlayer(target => {
if (target == player || target.countCards('h') + player.countCards('h') == 0) return false;
- // return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1;
- return true;
+ return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1;
});
},
direct: true,
@@ -945,8 +944,7 @@ game.import("character", function () {
"与一名其他角色平分手牌",
(card, player, target) => {
if (target == player || target.countCards('h') + player.countCards('h') == 0) return false;
- // return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1;
- return true;
+ return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1;
}
)
.set("ai", (target) => {
@@ -10845,14 +10843,16 @@ game.import("character", function () {
dingzhou_info:
"出牌阶段限一次。你可以将X张牌交给一名场上有牌的角色,然后你获得其场上的所有牌(X为其场上的牌数)。",
tamo: "榻谟",
- tamo_info_doudizhu: "游戏开始时,你可以重新分配除三号位角色外所有角色的座次。",
tamo_info: "游戏开始时,你可以重新分配除主公外所有角色的座次。",
+ tamo_info_doudizhu: "游戏开始时,你可以重新分配除三号位角色外所有角色的座次。",
tamo_faq: "FAQ",
tamo_faq_info:
"
Paer|8