diff --git a/audio/die/wupu.mp3 b/audio/die/wupu.mp3 new file mode 100644 index 000000000..e756428f1 Binary files /dev/null and b/audio/die/wupu.mp3 differ diff --git a/audio/skill/dcduanti1.mp3 b/audio/skill/dcduanti1.mp3 new file mode 100644 index 000000000..37c1aacc4 Binary files /dev/null and b/audio/skill/dcduanti1.mp3 differ diff --git a/audio/skill/dcduanti2.mp3 b/audio/skill/dcduanti2.mp3 new file mode 100644 index 000000000..67fc3b1a6 Binary files /dev/null and b/audio/skill/dcduanti2.mp3 differ diff --git a/audio/skill/dcshicao1.mp3 b/audio/skill/dcshicao1.mp3 new file mode 100644 index 000000000..1f257b374 Binary files /dev/null and b/audio/skill/dcshicao1.mp3 differ diff --git a/audio/skill/dcshicao2.mp3 b/audio/skill/dcshicao2.mp3 new file mode 100644 index 000000000..2676e0fd7 Binary files /dev/null and b/audio/skill/dcshicao2.mp3 differ diff --git a/audio/skill/dcyixian1.mp3 b/audio/skill/dcyixian1.mp3 index 292d310b0..e8932178e 100644 Binary files a/audio/skill/dcyixian1.mp3 and b/audio/skill/dcyixian1.mp3 differ diff --git a/audio/skill/dcyixian2.mp3 b/audio/skill/dcyixian2.mp3 index e8932178e..292d310b0 100644 Binary files a/audio/skill/dcyixian2.mp3 and b/audio/skill/dcyixian2.mp3 differ diff --git a/audio/skill/lvxin1.mp3 b/audio/skill/lvxin1.mp3 new file mode 100644 index 000000000..f1132c9af Binary files /dev/null and b/audio/skill/lvxin1.mp3 differ diff --git a/audio/skill/lvxin2.mp3 b/audio/skill/lvxin2.mp3 new file mode 100644 index 000000000..02236d298 Binary files /dev/null and b/audio/skill/lvxin2.mp3 differ diff --git a/character/huicui.js b/character/huicui.js index bf001fedb..b5023c25d 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -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: "才子佳人", diff --git a/character/rank.js b/character/rank.js index 1f1147e17..c216601e2 100644 --- a/character/rank.js +++ b/character/rank.js @@ -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", diff --git a/character/sp2.js b/character/sp2.js index da9203e56..ec461c793 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -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)。直到此阶段结束,所有不为其的其他角色均不在你的攻击范围内,且当你对其造成伤害时,此伤害值改为Y(Y为你本回合上一次对其造成过的伤害值+1,至多为5)。", + stargangyi: "刚毅", + stargangyi_info: "锁定技。①你的回合内,若你本回合没有造成过伤害,你不能使用【桃】。②当你处于濒死状态时,以你为目标的【桃】或【酒】的回复值+1。", sp_whlw: "文和乱武", sp_zlzy: "逐鹿中原", diff --git a/image/character/dc_shen_huatuo.jpg b/image/character/dc_shen_huatuo.jpg new file mode 100644 index 000000000..b73a933c4 Binary files /dev/null and b/image/character/dc_shen_huatuo.jpg differ diff --git a/image/character/star_sunjian.jpg b/image/character/star_sunjian.jpg new file mode 100644 index 000000000..c5d83dd8d Binary files /dev/null and b/image/character/star_sunjian.jpg differ diff --git a/image/character/wupu.jpg b/image/character/wupu.jpg new file mode 100644 index 000000000..b1035cc29 Binary files /dev/null and b/image/character/wupu.jpg differ