Skip to content

Commit

Permalink
Merge pull request libccy#1481 from mengxinzxz/PR-Branch
Browse files Browse the repository at this point in the history
幻张郃,幻郭嘉,OL界李儒
  • Loading branch information
Spmario233 committed Jun 16, 2024
2 parents cb8766e + af18396 commit d06378b
Show file tree
Hide file tree
Showing 14 changed files with 295 additions and 6 deletions.
1 change: 1 addition & 0 deletions character/onlyOL/character.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const characters = {
ol_sb_pangtong: ["male", "shu", 3, ["olsbhongtu", "olsbqiwu"]],
ol_fazheng: ["male", "shu", 3, ["olxuanhuo", "olenyuan"]],
ol_caifuren: ["female", "qun", 3, ["olqieting", "xianzhou"]],
ol_liru: ["male", "qun", 3, ["xinjuece", "olmieji", "dcfencheng"]],
};

export default characters;
53 changes: 53 additions & 0 deletions character/onlyOL/skill.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,59 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js";

/** @type { importCharacterConfig['skill'] } */
const skills = {
//OL界李儒
olmieji: {
audio: 2,
inherit: "xinmieji",
filter(event, player) {
return player.countCards("h", { type: ["trick", "delay"] });
},
filterCard(card) {
return get.type2(card) == "trick";
},
async content(event, trigger, player) {
const target = event.target;
await player.showCards(event.cards, get.translation(player) + "发动了【灭计】");
const result = await target.chooseToDiscard("he", true).set("prompt", "请弃置一张锦囊牌,或依次弃置两张非锦囊牌。").forResult();
if (
(!result.cards || get.type(result.cards[0], "trick", result.cards[0].original == "h" ? target : false) != "trick") &&
target.countCards("he", function (card) {
return get.type(card, "trick") != "trick";
})
) {
await target
.chooseToDiscard("he", true, function (card) {
return get.type(card, "trick") != "trick";
})
.set("prompt", "请弃置第二张非锦囊牌");
}
const cards = game
.getGlobalHistory("everything", evt => {
return evt.name == "lose" && evt.getParent(3) == event;
})
.reduce((list, evt) => {
return list.add(evt.cards[0]);
}, [])
.filterInD("d");
if (cards.some(card => player.hasUseTarget(card, true, false))) {
const result = await player
.chooseButton(["灭计:是否使用其中的一张牌?", cards])
.set("filterButton", button => {
return get.event().player.hasUseTarget(button.link, true, false);
})
.set("ai", button => {
return get.event().player.getUseValue(button.link);
})
.forResult();
if (result.bool) {
const card = result.links[0];
player.$gain2(card, false);
await game.asyncDelayx();
await player.chooseUseTarget(true, card, false);
}
}
},
},
//OL界蔡夫人
olqieting: {
audio: 2,
Expand Down
2 changes: 1 addition & 1 deletion character/onlyOL/sort.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const characterSort = {
onlyOL_yijiang1: ["ol_jianyong", "ol_lingtong", "ol_gaoshun", "ol_fazheng"],
onlyOL_yijiang2: ["ol_caozhang", "ol_chengpu", "ol_wangyi"],
onlyOL_yijiang3: ["ol_yufan"],
onlyOL_yijiang3: ["ol_yufan", "ol_liru"],
onlyOL_yijiang4: ["ol_caifuren"],
onlyOL_sb: ["ol_sb_jiangwei", "ol_sb_guanyu", "ol_sb_taishici", "ol_sb_yuanshao", "ol_sb_pangtong"],
};
Expand Down
4 changes: 4 additions & 0 deletions character/onlyOL/translate.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ const translates = {
ol_caifuren_prefix: "OL界",
olqieting: "窃听",
olqieting_info: "其他角色的回合结束后,你可以选择X项:1.将其装备区的一张牌置入你的装备区;2.摸一张牌(X为以下条件中其本回合满足的项数:未对其他角色造成伤害、未对其他角色使用过牌)。",
ol_liru: "OL界李儒",
ol_liru_prefix: "OL界",
olmieji: "灭计",
olmieji_info: "出牌阶段限一次,你可以将一张锦囊牌置于牌堆顶,然后令一名其他角色弃置一张锦囊牌或两张非锦囊牌,然后你可以使用其弃置的一张牌。",
};

export default translates;
6 changes: 6 additions & 0 deletions character/rank.js
Original file line number Diff line number Diff line change
Expand Up @@ -878,6 +878,7 @@ window.noname_character_rank = {
"re_liubiao",
"xin_liubiao",
"re_liru",
"ol_liru",
"re_manchong",
"re_jianyong",
"re_yufan",
Expand Down Expand Up @@ -1149,8 +1150,10 @@ window.noname_character_rank = {
"huan_weiyan",
"huan_simayi",
"huan_zhaoyun",
"huan_guojia",
],
b: [
"huan_zhanghe",
"star_zhangzhao",
"dc_sp_zhurong",
"hansong",
Expand Down Expand Up @@ -1995,6 +1998,7 @@ window.noname_character_rank = {
"jsrg_yuanshao",
],
epic: [
"huan_guojia",
"huan_simayi",
"dc_sb_zhangxiu",
"ol_jiangwan",
Expand Down Expand Up @@ -2297,6 +2301,7 @@ window.noname_character_rank = {
"dc_sp_zhurong",
],
rare: [
"huan_weiyan",
"ol_caifuren",
"dc_sb_caoang",
"dc_sb_guanping",
Expand Down Expand Up @@ -2569,6 +2574,7 @@ window.noname_character_rank = {
"re_manchong",
"re_yufan",
"re_liru",
"ol_liru",
"re_jianyong",
"re_sunluban",
"re_sunxiu",
Expand Down
1 change: 1 addition & 0 deletions character/refresh/skill.js
Original file line number Diff line number Diff line change
Expand Up @@ -2190,6 +2190,7 @@ const skills = {
skillAnimation: "epic",
animationColor: "fire",
audio: 2,
audioname: ["ol_liru"],
enable: "phaseUse",
filterTarget: function (card, player, target) {
return player != target;
Expand Down
2 changes: 1 addition & 1 deletion character/shenhua/characterReplace.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const characterReplaces = {
jiaxu: ["jiaxu", "re_jiaxu", "ns_jiaxu", "ps_jiaxu"],
dongzhuo: ["dongzhuo", "ol_dongzhuo", "re_dongzhuo", "star_dongzhuo", "jsrg_dongzhuo", "sp_dongzhuo", "yj_dongzhuo"],
dengai: ["dengai", "ol_dengai", "re_dengai"],
sp_ol_zhanghe: ["sp_ol_zhanghe", "yj_zhanghe", "sp_zhanghe", "jsrg_zhanghe"],
sp_ol_zhanghe: ["sp_ol_zhanghe", "yj_zhanghe", "sp_zhanghe", "jsrg_zhanghe", "huan_zhanghe"],
jiangwei: ["jiangwei", "ol_jiangwei", "re_jiangwei", "ol_sb_jiangwei", "sb_jiangwei", "jsrg_jiangwei"],
liushan: ["liushan", "ol_liushan", "re_liushan"],
sunce: ["sunce", "re_sunce", "re_sunben", "sb_sunce", "dc_sunce"],
Expand Down
2 changes: 1 addition & 1 deletion character/standard/characterReplace.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const characterReplaces = {
caocao: ["caocao", "re_caocao", "sb_caocao", "dc_caocao"],
guojia: ["guojia", "re_guojia", "ps1059_guojia", "ps2070_guojia"],
guojia: ["guojia", "re_guojia", "ps1059_guojia", "ps2070_guojia", "huan_guojia"],
simayi: ["simayi", "re_simayi", "jsrg_simayi", "ps_simayi", "ps2068_simayi", "huan_simayi"],
jin_simayi: ["jin_simayi", "junk_simayi", "ps_jin_simayi"],
zhenji: ["zhenji", "re_zhenji", "sb_zhenji", "yj_zhenji"],
Expand Down
2 changes: 2 additions & 0 deletions character/tw/character.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
const characters = {
huan_guojia: ["male", "wei", 3, ["huan_guojia_A", "huan_guojia_B"]],
huan_zhanghe: ["male", "wei", 4, ["huan_zhanghe_A"]],
huan_zhaoyun: ["male", "shu", 4, ["huan_zhaoyun_A", "huan_zhaoyun_B"]],
huan_simayi: ["male", "wei", 4, ["twzongquan", "twguimou"]],
huan_weiyan: ["male", "shu", 4, ["twqiji", "twpiankuang"]],
Expand Down
211 changes: 211 additions & 0 deletions character/tw/skill.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,217 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js";

/** @type { importCharacterConfig['skill'] } */
const skills = {
//幻郭嘉
huan_guojia_A: {
audio: 2,
enable: "phaseUse",
onChooseToUse(event) {
if (!game.online && event.type == "phase" && !event.huan_guojia_A) {
const player = event.player;
event.set(
"huan_guojia_A",
player
.getRoundHistory("useSkill", evt => {
return evt.skill == "huan_guojia_A";
})
.reduce((list, evt) => {
return list.add(evt.targets[0]);
}, [])
);
}
},
filter(event, player) {
return player.countCards("he") && game.hasPlayer(target => lib.skill.huan_guojia_A.filterTarget(null, player, target));
},
filterTarget(card, player, target) {
return player != target && !get.event().huan_guojia_A.includes(target);
},
filterCard: true,
selectCard: [1, 2],
position: "he",
check(card) {
return 5 - get.value(card);
},
usable: 3,
lose: false,
discard: false,
delay: 0,
prompt: "将至多两张牌标记为“技一”并交给一名本轮未以此法交给其牌的角色",
content() {
const ID = player.playerid;
const skill = "huan_guojia_A_effect",
skillID = "huan_guojia_A_" + ID;
if (!lib.skill[skillID]) {
game.broadcastAll(skillID => {
lib.skill[skillID] = { charlotte: true };
lib.translate[skillID] = "技一";
}, skillID);
}
if (!target.storage[skill]) {
target.storage[skill] = {};
}
if (!target.storage[skill][player.playerid]) {
target.storage[skill][player.playerid] = 0;
}
target.storage[skill][player.playerid] += cards.length;
player.give(cards, target).gaintag.add(skillID);
},
ai: {
order: 1,
result: {
target(player, target) {
const att = get.attitude(player, target);
return att * (att > 0 ? 2 : 1);
},
},
},
group: ["huan_guojia_A_effect", "huan_guojia_A_remove"],
subSkill: {
effect: {
audio: "huan_guojia_A",
trigger: { global: "phaseUseBegin" },
filter(event, player) {
return event.player.hasCard(card => card.hasGaintag("huan_guojia_A_" + player.playerid), "h");
},
prompt2(event, player) {
const num = event.player.storage["huan_guojia_A_effect"][player.playerid];
return "观看其手牌并将其中至多" + get.cnNumber(num) + "张牌以任意顺序置于牌堆顶";
},
check(event, player) {
return get.attitude(player, event.player) < 0;
},
logTarget: "player",
async content(event, trigger, player) {
const target = trigger.player,
num = target.storage["huan_guojia_A_effect"][player.playerid];
const result = await player
.chooseToMove("技一:将" + get.translation(target) + "的至多" + get.cnNumber(num) + "张牌以任意顺序置于牌堆顶", true)
.set("list", [[get.translation(target) + "的手牌", target.getCards("h"), "dcsushou_tag"], ["牌堆顶"]])
.set("filterOk", moved => {
const num = get.event().num;
return moved[1].length >= 1 && moved[1].length <= num;
})
.set("num", num)
.set("processAI", list => {
const num = get.event().num;
let cards = list[0][1],
sgn = get.attitude(get.event().player, get.event().getTrigger().player) > 0 ? 1 : -1;
cards.sort((a, b) => get.value(a) * sgn - get.value(b) * sgn);
return [cards.slice(sgn > 0 ? 1 : num, cards.length), cards.slice(0, sgn > 0 ? 1 : num)];
})
.forResult();
if (result.bool) {
const cards = result.moved[1];
target.$throw(cards.length, 1000);
await target.lose(cards, ui.cardPile);
game.log(target, "的" + get.cnNumber(cards.length) + "张牌被置入了", "#y牌堆顶");
for (let i = cards.length - 1; i--; i >= 0) {
ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild);
}
game.updateRoundNumber();
}
},
},
remove: {
audio: "huan_guojia_A",
trigger: { player: "phaseBegin" },
filter(event, player) {
return game.hasPlayer(target => target.hasCard(card => card.hasGaintag("huan_guojia_A_" + player.playerid), "h"));
},
forced: true,
locked: false,
async content(event, trigger, player) {
const targets = game.filterPlayer(target => target.hasCard(card => card.hasGaintag("huan_guojia_A_" + player.playerid), "h"));
const sum = targets.reduce((num, target) => num + target.countCards("h", card => card.hasGaintag("huan_guojia_A_" + player.playerid)), 0);
for (const target of targets) target.removeGaintag("huan_guojia_A_" + player.playerid);
await player.draw(sum);
},
},
},
},
huan_guojia_B: {
audio: 2,
trigger: { target: "useCardToTarget" },
filter(event, player) {
return get.type(event.card) == "trick";
},
async content(event, trigger, player) {
const cards = get.cards(1, true),
card = cards[0];
await player.showCards(cards, get.translation(player) + "发动了【技二】");
if (get.color(card) == get.color(trigger.card)) {
await player.gain(cards, "gain2");
}
if (get.suit(card) == get.suit(trigger.card)) {
trigger.getParent().excluded.add(player);
game.log(trigger.card, "对", player, "无效");
}
if (get.color(card) != get.color(trigger.card)) {
await game.cardsDiscard(cards);
player.$throw(cards);
game.log(cards, "被置入了弃牌堆");
}
},
},
//幻张郃
huan_zhanghe_A: {
audio: 2,
trigger: { player: "useCardToPlayered" },
filter(event, player) {
if (event.card.name != "sha" || event.targets.length != 1) return false;
return player.countCards("h") + event.target.countCards("h") > 0;
},
forced: true,
logTarget: "target",
content() {
const targets = [player, trigger.target];
for (const target of targets) {
if (!target.countCards("h")) continue;
target.addSkill("huan_zhanghe_A_card");
target.addGaintag(target.getCards("h").randomGets(2), "huan_zhanghe_A_card");
}
},
group: "huan_zhanghe_A_damage",
subSkill: {
damage: {
audio: "huan_zhanghe_A",
trigger: { global: "damageBegin1" },
filter(event, player) {
if (!event.source) return false;
const evtx = event.getParent(2);
if (
!evtx ||
evtx.name != "useCard" ||
!player.hasHistory("lose", evt => {
if (evt.getParent() != evtx) return false;
return Object.keys(evt.gaintag_map || {}).includes("huan_zhanghe_A_card");
})
)
return false;
return event.source.countCards("h", card => card.hasGaintag("huan_zhanghe_A_card")) > event.target.countCards("h", card => card.hasGaintag("huan_zhanghe_A_card"));
},
forced: true,
logTarget: "source",
content() {
trigger.num++;
},
},
card: {
charlotte: true,
mod: {
aiOrder(player, card, num) {
if (get.itemtype(card) == "card" && card.hasGaintag("huan_zhanghe_A_card")) return num + 1;
},
cardname(card, player) {
if (get.itemtype(card) == "card" && card.hasGaintag("huan_zhanghe_A_card")) return "sha";
},
cardnature(card, player) {
if (get.itemtype(card) == "card" && card.hasGaintag("huan_zhanghe_A_card")) return false;
},
},
},
},
},
//幻赵云
huan_zhaoyun_A: {
audio: 2,
Expand Down
2 changes: 1 addition & 1 deletion character/tw/sort.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const characterSort = {
tw_yunchouyan: ["tw_jiangqing"],
tw_zhu: ["tw_beimihu", "tw_ol_sunjian", "ol_liuyu", "tw_menghuo"],
tw_swordsman: ["xia_yuzhenzi", "xia_shie", "xia_shitao", "xia_guanyu", "xia_liubei", "xia_xiahousone", "xia_xiahoudun", "xia_zhangwei", "xia_xushu", "xia_wangyue", "xia_liyàn", "xia_tongyuan", "xia_lusu", "xia_dianwei", "xia_zhaoe", "xia_xiahouzie"],
tw_beidingzhongyuan: ["huan_weiyan", "huan_simayi", "huan_zhaoyun"],
tw_beidingzhongyuan: ["huan_zhanghe", "huan_guojia", "huan_weiyan", "huan_simayi", "huan_zhaoyun"],
tw_mobile: ["nashime", "tw_gexuan", "tw_zhugeguo"],
tw_mobile2: ["tw_chengpu", "tw_guohuai", "old_quancong", "tw_caoxiu", "tw_guanqiujian", "tw_re_fazheng", "tw_madai", "tw_zhangfei", "tw_guyong", "tw_handang", "tw_xuezong", "tw_yl_luzhi"],
tw_yijiang: ["tw_caoang", "tw_caohong", "tw_zumao", "tw_dingfeng", "tw_maliang", "tw_xiahouba"],
Expand Down
Loading

0 comments on commit d06378b

Please sign in to comment.