Merge pull request #1290 from copcap/dev

新增「吴普」「星孙坚」;补充原画及配音
This commit is contained in:
Spmario233 2024-04-30 16:46:41 +08:00 committed by GitHub
commit 46e43d6b6e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 239 additions and 1 deletions

BIN
audio/die/wupu.mp3 Normal file

Binary file not shown.

BIN
audio/skill/dcduanti1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/dcduanti2.mp3 Normal file

Binary file not shown.

BIN
audio/skill/dcshicao1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/dcshicao2.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/skill/lvxin1.mp3 Normal file

Binary file not shown.

BIN
audio/skill/lvxin2.mp3 Normal file

Binary file not shown.

View File

@ -4,6 +4,7 @@ game.import("character", function () {
name: "huicui",
connect: true,
character: {
wupu: ["male", "qun", 4, ["dcduanti", "dcshicao"]],
dc_caoshuang: ["male", "wei", 4, ["dcjianzhuan", "dcfanshi"]],
zangba: ["male", "wei", 4, ["rehengjiang"]],
dc_simashi: ["male", "wei", 3, ["dcsanshi", "dczhenrao", "dcchenlve"]],
@ -191,7 +192,7 @@ game.import("character", function () {
"dc_wuban",
"jiangfei",
],
sp_jishi: ["dc_jiben", "zhenghun", "dc_sunhanhua", "liuchongluojun"],
sp_jishi: ["dc_jiben", "zhenghun", "dc_sunhanhua", "liuchongluojun", "wupu"],
sp_raoting: ["dc_huanghao", "dc_sunziliufang", "dc_sunchen", "dc_jiachong"],
sp_yijun: ["gongsundu", "mengyou", "dc_sp_menghuo", "gongsunxiu"],
sp_zhengyin: ["yue_caiwenji", "yue_zhoufei", "yue_caiyong", "yue_xiaoqiao", "yue_daqiao"],
@ -200,6 +201,106 @@ game.import("character", function () {
},
/** @type { importCharacterConfig['skill'] } */
skill: {
//吴普
dcduanti: {
audio: 2,
trigger: {
player: ["useCardAfter", "respondAfter"],
},
forced: true,
filter(event, player) {
const number = game
.getAllGlobalHistory("everything", evt => {
if (evt.player !== player) return false;
return ["useCard", "respond"].includes(evt.name);
})
.indexOf(event);
return number >= 0 && (number + 1) % 5 === 0;
},
onremove: true,
async content(event, trigger, player) {
await player.recover();
if (player.countMark("dcduanti") >= 5) return;
player.addMark("dcduanti", 1, false);
await player.gainMaxHp();
},
},
dcshicao: {
audio: 2,
enable: "phaseUse",
onremove: ["dcshicao_aiRecord"],
chooseButton: {
dialog(event, player) {
return ui.create.dialog("###识草###选择一种类型与要摸牌的来源", [["basic", "trick", "equip"].map(type => [type, get.translation(type)]), "tdnodes"], [["牌堆顶", "牌堆底"], "tdnodes"]);
},
check(button) {
const aiStorage = get.player().getStorage("dcshicao_aiRecord");
if (aiStorage.length > 0 && get.name(ui.cardPile.lastChild, false) === get.name(aiStorage.lastItem, false)) {
if (button.link === "牌堆底" || button.link === get.type2(aiStorage.lastItem, false)) return 20;
}
if (button.link === "牌堆顶" || button.link === "basic") return 10;
return 5 + Math.random();
},
filter(button, player) {
if (!ui.selected.buttons.length) return true;
return ui.selected.buttons[0].parentNode != button.parentNode;
},
select: 2,
backup(links, player) {
return {
audio: "dcshicao",
type: links[0],
pos: links[1],
filterCard: () => false,
selectCard: -1,
async content(event, trigger, player) {
let { type, pos } = lib.skill.dcshicao_backup;
game.log(player, "声明了", `#y${get.translation(type)}`);
const next = player.draw();
const bottom = pos === "牌堆底";
if (bottom) {
next.set("bottom", true);
if (player.getStorage("dcshicao_aiRecord").length > 0) {
player.storage.dcshicao_aiRecord.pop();
}
}
const drawnCards = await next.forResult();
if (get.type2(drawnCards[0], player) === type) return;
let cards;
if (bottom) {
cards = get.bottomCards(2);
cards.reverse();
} else cards = get.cards(2);
await game.cardsGotoOrdering(cards);
await player.viewCards(`${bottom ? "牌堆顶" : "牌堆底"}的两张牌(靠左的在牌堆更靠上)`, cards);
if (bottom) {
cards.reverse();
delete player.storage.dcshicao_aiRecord;
} else {
player.storage.dcshicao_aiRecord = cards.slice();
}
await game.cardsGotoPile(cards, bottom ? "insert" : null);
player.tempBanSkill("dcshicao");
},
ai: {
result: {player: 1},
},
};
},
prompt(links, player) {
return `点击“确定”,从${links[1]}摸一张牌`;
},
},
subSkill: {
backup: {},
},
ai: {
order: 8,
result:{
player: 1,
},
},
},
//新杀曹爽
dcjianzhuan: {
audio: 2,
@ -16450,6 +16551,11 @@ game.import("character", function () {
dcfudou: "覆斗",
dcfudou_info:
"当你使用黑色牌/红色牌指定唯一目标后,若该角色不为你,且其于本局游戏对你/未对你造成过伤害则你可以与其各失去1点体力/各摸一张牌。",
wupu: "吴普",
dcduanti: "锻体",
dcduanti_info: "锁定技。当你使用或打出牌结算结束后若此牌是你本局游戏使用或打出过的牌中的第5X张牌X∈N⁺你回复1点体力然后若你以此法增加的上限小于5你加1点体力上限。",
dcshicao: "识草",
dcshicao_info: "出牌阶段,你可以声明一种类型,然后选择从牌堆顶或牌堆底摸一张牌。若此牌类型与你声明的类型不同,你观看牌堆另一端的两张牌,此技能本回合失效。",
sp_baigei: "无双上将",
sp_caizijiaren: "才子佳人",

View File

@ -144,6 +144,7 @@ window.noname_character_rank = {
"wu_guanyu",
"clan_zhongyao",
"guanyue",
"wupu",
],
a: [
"star_caoren",
@ -383,6 +384,7 @@ window.noname_character_rank = {
"drag_guanyu",
"drag_caoren",
"drag_lvchang",
"star_sunjian",
],
am: [
"tw_yanliang",
@ -2204,6 +2206,8 @@ window.noname_character_rank = {
"sp_zhenji",
"drag_guanyu",
"drag_caoren",
"wupu",
"star_sunjian",
],
rare: [
"drag_lvchang",

View File

@ -4,6 +4,7 @@ game.import("character", function () {
name: "sp2",
connect: true,
character: {
star_sunjian: ["male", "qun", "4/5", ["starruijun", "stargangyi"]],
liqueguosi: ["male", "qun", 4, ["xiongsuan"]],
star_zhangchunhua: ["female", "wei", 3, ["starliangyan", "starminghui"]],
star_yuanshao: [
@ -168,12 +169,133 @@ game.import("character", function () {
"star_dongzhuo",
"star_yuanshao",
"star_zhangchunhua",
"star_sunjian",
],
mini_qixian: ["mp_liuling"],
sp2_waitforsort: ["caobuxing", "re_maliang", "dc_jikang"],
},
},
skill: {
//星孙坚
starruijun: {
audio: 2,
trigger: {
player: "useCardToPlayered",
},
filter(event, player) {
if (event.targets.length > 1) return false;
if (
player.hasHistory("useCard", evt => {
if (evt === event.getParent()) return false;
const targets = evt.targets;
return targets.length === 1 && targets[0] !== player;
})
)
return false;
const target = event.target;
if (target === player || !target.isIn()) return false;
return true;
},
logTarget: "target",
locked: false,
check(event, player) {
return (
get.attitude(player, event.target) <= 0 ||
!player.hasCard(card => {
return game.hasPlayer(current => {
return get.effect(current, card, player, player) > 0 && player.canUse(card, current, true, true);
});
}, "hs")
);
},
prompt2(event, player) {
return `${get.cnNumber(player.getDamagedHp() + 1)}张牌,令所有除${get.translation(event.target)}外的其他角色不在你的攻击范围内,且你对其造成的伤害逐次增加。`;
},
async content(event, trigger, player) {
await player.draw(player.getDamagedHp() + 1);
player.addTempSkill("starruijun_effect", "phaseChange");
player.markAuto("starruijun_effect", trigger.target);
},
subSkill: {
effect: {
audio: "starruijun",
trigger: {
source: "damageBegin2",
},
charlotte: true,
forced: true,
onremove: true,
async content(event, trigger, player) {
let num = 1;
const evts = player.getHistory("sourceDamage", evt => {
return evt.source === player && evt.player === trigger.player;
});
if (evts.length) num += evts.lastItem.num;
trigger.num = Math.min(5, num);
},
mod: {
inRange(from, to) {
if (!from.getStorage("starruijun_effect").includes(to)) return false;
},
}
},
},
mod: {
aiOrder(player, card, num) {
const event = get.event();
if (!event || event.type !== "phase") return;
if (
game.hasPlayer(current => {
return get.effect(current, card, player, player) > 0 && player.canUse(card, current, true, true) && get.damageEffect(current, player, player) > 0;
})
)
return num * 2;
return num / 1.5;
}
},
},
stargangyi: {
audio: 2,
trigger: {
source: "damage",
},
silent: true,
forced: true,
group: "stargangyi_recover",
async content(event, trigger, player) {
player.addTempSkill("stargangyi_access");
},
subSkill: {
recover: {
audio: "stargangyi",
trigger: {
player: "recoverBegin",
},
filter(event, player) {
const evt = event.getParent(3);
if (!player.isDying() || evt.type !== "dying") return false;
return ["tao", "jiu"].includes(event.getParent().name);
},
forced: true,
async content(event, trigger, player) {
trigger.num++;
},
},
access: {
charlotte: true,
},
},
mod: {
cardEnabled(card, player) {
if (player.hasSkill("stargangyi_access")) return;
if (player === _status.currentPhase && card.name === "tao") return false;
},
cardSavable(card, player) {
if (player.hasSkill("stargangyi_access")) return;
if (player === _status.currentPhase && card.name === "tao") return false;
},
},
},
//李傕郭汜
xiongsuan: {
audio: 2,
@ -14584,6 +14706,12 @@ game.import("character", function () {
xiongsuan: "凶算",
xiongsuan_info:
"出牌阶段限一次你可以弃置一张手牌并对一名角色造成1点伤害然后你摸三张牌。若该角色不为你你失去1点体力。",
star_sunjian: "星孙坚",
star_sunjian_prefix: "星",
starruijun: "锐军",
starruijun_info: "当你于出牌阶段首次使用牌指定其他角色为目标后若目标角色数为1你可以摸X张牌X为你已损失的体力值+1。直到此阶段结束所有不为其的其他角色均不在你的攻击范围内且当你对其造成伤害时此伤害值改为YY为你本回合上一次对其造成过的伤害值+1至多为5。",
stargangyi: "刚毅",
stargangyi_info: "锁定技。①你的回合内,若你本回合没有造成过伤害,你不能使用【桃】。②当你处于濒死状态时,以你为目标的【桃】或【酒】的回复值+1。",
sp_whlw: "文和乱武",
sp_zlzy: "逐鹿中原",

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
image/character/wupu.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB