From 5974c8b28a08478c48a99662d233de3aec59f5c2 Mon Sep 17 00:00:00 2001 From: mengxinzxz <2223529500@qq.com> Date: Sun, 21 Apr 2024 15:36:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96clan.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 但是... --- character/clan.js | 2883 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 2190 insertions(+), 693 deletions(-) diff --git a/character/clan.js b/character/clan.js index 9df46279e..0da01f5c0 100644 --- a/character/clan.js +++ b/character/clan.js @@ -5,10 +5,34 @@ game.import("character", function () { name: "clan", connect: true, character: { - clan_wuxian: ["female", "shu", 3, ["clanyirong", "clanguixiang", "clanmuyin"], ["clan:陈留吴氏"]], - clan_wuban: ["male", "shu", 4, ["clanzhanding", "clanmuyin"], ["clan:陈留吴氏"]], - clan_xunshu: ["male", "qun", 3, ["clanshenjun", "clanbalong", "clandaojie"], ["clan:颍川荀氏"]], - clan_xunchen: ["male", "qun", 3, ["clansankuang", "clanbeishi", "clandaojie"], ["clan:颍川荀氏"]], + clan_wuxian: [ + "female", + "shu", + 3, + ["clanyirong", "clanguixiang", "clanmuyin"], + ["clan:陈留吴氏"], + ], + clan_wuban: [ + "male", + "shu", + 4, + ["clanzhanding", "clanmuyin"], + ["clan:陈留吴氏"], + ], + clan_xunshu: [ + "male", + "qun", + 3, + ["clanshenjun", "clanbalong", "clandaojie"], + ["clan:颍川荀氏"], + ], + clan_xunchen: [ + "male", + "qun", + 3, + ["clansankuang", "clanbeishi", "clandaojie"], + ["clan:颍川荀氏"], + ], clan_xuncai: [ "female", "qun", @@ -23,10 +47,34 @@ game.import("character", function () { ["clanyunshen", "clanshangshen", "clanfenchai", "clandaojie"], ["clan:颍川荀氏"], ], - clan_hanshao: ["male", "qun", 3, ["clanfangzhen", "clanliuju", "clanxumin"], ["clan:颍川韩氏"]], - clan_hanrong: ["male", "qun", 3, ["clanlianhe", "clanhuanjia", "clanxumin"], ["clan:颍川韩氏"]], - clan_wukuang: ["male", "qun", 4, ["clanlianzhu", "clanmuyin"], ["clan:陈留吴氏"]], - clan_wangling: ["male", "wei", 4, ["clanbolong", "clanzhongliu"], ["clan:太原王氏"]], + clan_hanshao: [ + "male", + "qun", + 3, + ["clanfangzhen", "clanliuju", "clanxumin"], + ["clan:颍川韩氏"], + ], + clan_hanrong: [ + "male", + "qun", + 3, + ["clanlianhe", "clanhuanjia", "clanxumin"], + ["clan:颍川韩氏"], + ], + clan_wukuang: [ + "male", + "qun", + 4, + ["clanlianzhu", "clanmuyin"], + ["clan:陈留吴氏"], + ], + clan_wangling: [ + "male", + "wei", + 4, + ["clanbolong", "clanzhongliu"], + ["clan:太原王氏"], + ], clan_zhongyan: [ "female", "jin", @@ -41,7 +89,13 @@ game.import("character", function () { ["clanjiexuan", "clanmingjie", "clanzhongliu"], ["clan:太原王氏"], ], - clan_wanghun: ["male", "jin", 3, ["clanfuxun", "clanchenya", "clanzhongliu"], ["clan:太原王氏"]], + clan_wanghun: [ + "male", + "jin", + 3, + ["clanfuxun", "clanchenya", "clanzhongliu"], + ["clan:太原王氏"], + ], clan_zhonghui: [ "male", "wei", @@ -49,7 +103,13 @@ game.import("character", function () { ["clanyuzhi", "clanxieshu", "clanbaozu"], ["clan:颍川钟氏"], ], - clan_zhongyu: ["male", "wei", 3, ["clanjiejian", "clanhuanghan", "clanbaozu"], ["clan:颍川钟氏"]], + clan_zhongyu: [ + "male", + "wei", + 3, + ["clanjiejian", "clanhuanghan", "clanbaozu"], + ["clan:颍川钟氏"], + ], clan_wanglun: [ "male", "jin", @@ -57,8 +117,20 @@ game.import("character", function () { ["clanqiuxin", "clanjianyuan", "clanzhongliu"], ["clan:太原王氏"], ], - clan_xunyou: ["male", "wei", 3, ["clanbaichu", "clandaojie"], ["clan:颍川荀氏"]], - clan_wuqiao: ["male", "jin", 4, ["clanqiajue", "clanmuyin"], ["clan:陈留吴氏"]], + clan_xunyou: [ + "male", + "wei", + 3, + ["clanbaichu", "clandaojie"], + ["clan:颍川荀氏"], + ], + clan_wuqiao: [ + "male", + "jin", + 4, + ["clanqiajue", "clanmuyin"], + ["clan:陈留吴氏"], + ], clan_wangguang: [ "male", "wei", @@ -74,12 +146,29 @@ game.import("character", function () { ["clan:太原王氏"], ], //笑点解析——群雄 - clan_zhongyao: ["male", "qun", 3, ["clanchengqi", "clanjieli", "clanbaozu"], ["clan:颍川钟氏"]], + clan_zhongyao: [ + "male", + "qun", + 3, + ["clanchengqi", "clanjieli", "clanbaozu"], + ["clan:颍川钟氏"], + ], }, characterSort: { clan: { - clan_wu: ["clan_wuxian", "clan_wuban", "clan_wukuang", "clan_wuqiao"], - clan_xun: ["clan_xunshu", "clan_xunchen", "clan_xuncai", "clan_xuncan", "clan_xunyou"], + clan_wu: [ + "clan_wuxian", + "clan_wuban", + "clan_wukuang", + "clan_wuqiao", + ], + clan_xun: [ + "clan_xunshu", + "clan_xunchen", + "clan_xuncai", + "clan_xuncan", + "clan_xunyou", + ], clan_han: ["clan_hanshao", "clan_hanrong"], clan_wang: [ "clan_wangling", @@ -89,7 +178,12 @@ game.import("character", function () { "clan_wangguang", "clan_wangmingshan", ], - clan_zhong: ["clan_zhongyan", "clan_zhonghui", "clan_zhongyu", "clan_zhongyao"], + clan_zhong: [ + "clan_zhongyan", + "clan_zhonghui", + "clan_zhongyu", + "clan_zhongyao", + ], }, }, /** @type { importCharacterConfig['skill'] } */ @@ -97,32 +191,69 @@ game.import("character", function () { //族钟繇 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); + 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)); + 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)); + 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] }); + return get + .event("player") + .getUseValue({ + name: button.link[2], + nature: button.link[3], + }); }, backup(links, player) { return { @@ -136,18 +267,49 @@ game.import("character", function () { 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); + 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])) { + 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); } } @@ -156,24 +318,50 @@ game.import("character", function () { position: "hs", precontent() { player.addTempSkill("clanchengqi_effect"); - player.markAuto("clanchengqi_effect", [event.result.card.name]); + player.markAuto("clanchengqi_effect", [ + event.result.card.name, + ]); }, }; }, prompt(links, player) { - return "将至少两张牌当作" + get.translation(links[0][3] || "") + "【" + get.translation(links[0][2]) + "】使用"; + return ( + "将至少两张牌当作" + + get.translation(links[0][3] || "") + + "【" + + get.translation(links[0][2]) + + "】使用" + ); }, }, 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); + 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)); + 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; @@ -194,15 +382,27 @@ game.import("character", function () { 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); + 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(); + 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() { @@ -214,9 +414,9 @@ game.import("character", function () { }, clanjieli: { audio: 2, - trigger: { player: 'phaseJieshuBegin' }, + trigger: { player: "phaseJieshuBegin" }, filter(event, player) { - return game.hasPlayer(target => { + return game.hasPlayer((target) => { return target.countCards("h"); }); }, @@ -229,25 +429,56 @@ game.import("character", function () { } } } - 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"), num = get.event('num'); - let map = {}; - for (const i of target.getCards("h")) { - if (!map[get.cardNameLength(i)]) { - map[get.cardNameLength(i)] = 0; + const str = + num > 0 + ? "并观看牌堆顶" + + get.cnNumber(num) + + "张牌,然后你可以交换其中等量的牌" + : ""; + event.result = await player + .chooseTarget( + get.prompt("clanjieli"), + "观看一名角色的牌名字数最多的手牌" + str, + (card, player, target) => { + return target.countCards("h"); } - map[get.cardNameLength(i)]++; - } - let list = Object.keys(map).sort((a, b) => map[b] - map[a]); - list = list.filter(i => map[i] == map[list[0]]).map(i => parseInt(i)); - if (num >= target.countCards("h", card => { - return list.includes(get.cardNameLength(card)); - })) return target.countCards("h") * 5 * get.sgn(get.sgn(get.attitude(player, target)) - 0.5); - return -target.countCards("h"); - }).set('num', num).forResult(); + ) + .set("ai", (target) => { + const player = get.event("player"), + num = get.event("num"); + let map = {}; + for (const i of target.getCards("h")) { + if (!map[get.cardNameLength(i)]) { + map[get.cardNameLength(i)] = 0; + } + map[get.cardNameLength(i)]++; + } + let list = Object.keys(map).sort( + (a, b) => map[b] - map[a] + ); + list = list + .filter((i) => map[i] == map[list[0]]) + .map((i) => parseInt(i)); + if ( + num >= + target.countCards("h", (card) => { + return list.includes( + get.cardNameLength(card) + ); + }) + ) + return ( + target.countCards("h") * + 5 * + get.sgn( + get.sgn(get.attitude(player, target)) - + 0.5 + ) + ); + return -target.countCards("h"); + }) + .set("num", num) + .forResult(); }, async content(event, trigger, player) { const target = event.targets[0]; @@ -267,46 +498,100 @@ game.import("character", function () { map[get.cardNameLength(i)]++; } let list = Object.keys(map).sort((a, b) => map[b] - map[a]); - list = list.filter(i => map[i] == map[list[0]]).map(i => parseInt(i)); - const cards = target.getCards("h", card => { + list = list + .filter((i) => map[i] == map[list[0]]) + .map((i) => parseInt(i)); + const cards = target.getCards("h", (card) => { return list.includes(get.cardNameLength(card)); }); 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(); + 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); + 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); + ui.cardPile.insertBefore( + lose[i], + ui.cardPile.firstChild + ); } game.updateRoundNumber(); if (gain.length) await target.gain(gain, "draw"); } - } - else { - let content = ['