Merge pull request #1312 from libccy/wuyi-dev

名将吴懿;修改game.parseSkillTextMap的返回值格式
This commit is contained in:
Spmario233 2024-05-04 18:23:32 +08:00 committed by GitHub
commit 5408513640
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
47 changed files with 3364 additions and 39676 deletions

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {};
export default characterFilters;

View File

@ -19,6 +19,7 @@ const characters = {
sp_fuwan: ["male", "qun", 3, ["spfengyin", "spchizhong"]],
old_lingju: ["female", "qun", 3, ["jieyuan", "fenxin_old"]],
sp_mushun: ["male", "qun", 4, ["moukui"]],
dc_wuyi: ["male", "shu", 4, ["dcbenxi"]],
};
export default characters;

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {
old_lingju(mode) {
return mode == "identity";

View File

@ -4,5 +4,9 @@ const dynamicTranslates = {
dcjianxiong(player) {
return "当你受到伤害后,你可以摸" + get.cnNumber(player.countMark("dcjianxiong") + 1) + "张牌并获得对你造成伤害的牌,然后你令此技能摸牌数+1至多为5。";
},
dcbenxi(player) {
if(player.storage.dcbenxi) return "转换技锁定技。当你失去手牌后系统随机检索出一句转换为拼音后包含“wu,yi”的技能台词然后你念出此台词。<span class='bluetext'>阳你获得上次所念出的台词对应的技能若你已拥有该技能则改为对其他角色各造成1点伤害。</span>";
return "转换技,锁定技。当你失去手牌后,<span class='bluetext'>阴系统随机检索出一句转换为拼音后包含“wu,yi”的技能台词然后你念出此台词。</span>阳你获得上次所念出的台词对应的技能若你已拥有该技能则改为对其他角色各造成1点伤害。";
},
};
export default dynamicTranslates;

View File

@ -2,6 +2,110 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js";
/** @type { importCharacterConfig['skill'] } */
const skills = {
//名将吴懿
dcbenxi: {
trigger: {
player: ["loseAfter"],
global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
},
forced: true,
zhuanhuanji: true,
filter(event, player) {
const evt = event.getl(player);
return evt && evt.hs && evt.hs.length > 0;
},
async content(event, trigger, player) {
player.changeZhuanhuanji("dcbenxi");
if (player.storage.dcbenxi) {
const map = lib.skill.dcbenxi.getMap(),
list = Object.keys(map);
if (list.length > 0) {
const skill = list.randomGet(),
voiceMap = game.parseSkillTextMap(skill, map[skill]);
console.log(voiceMap);
player.storage.dcbenxi_pending = skill;
findaudio: for (let data of voiceMap) {
if(!data.text) continue;
const pinyins = get.pinyin(data.text, false);
for (let i = 0; i < pinyins.length - 1; i++) {
if (pinyins[i] === "wu" && pinyins[i + 1] === "yi") {
player.chat(data.text);
game.broadcastAll(file => game.playAudio(file), data.file)
break findaudio;
}
}
}
}
} else {
const skill = player.storage.dcbenxi_pending;
if (skill) {
if (player.hasSkill(skill, null, false)){
const targets = game.filterPlayer(current => current != player).sortBySeat();
player.line(targets, 'fire');
for(let target of targets){
if(target.isIn()) await target.damage();
}
}
else{
await player.addTempSkills([skill], {player: "phaseBegin"});
}
delete player.storage.dcbenxi_pending;
}
}
},
onremove(player){
delete player.storage.dcbenxi;
delete player.storage.dcbenxi_pending;
},
mark: true,
marktext: "☯",
intro: {
mark(dialog, storage, player){
if(storage){
const skill = player.storage.dcbenxi_pending;
if(skill){
dialog.addText(`锁定技,当你下次失去手牌后,你获得技能〖${get.translation(skill)}〗直到你的下回合开始。若已获得该技能则改为对所有其他角色各造成1点伤害。`, false);
dialog.add('<div><div class="skill">【' + get.translation(lib.translate[skill + "_ab"] || get.translation(skill).slice(0, 2)) + "】</div><div>" + get.skillInfoTranslation(skill, player) + "</div></div>");
}
}
else{
return "锁定技。当你下次失去手牌后你随机念出一句拼音中含有“wu,yi”的台词。";
}
},
},
getMap() {
if (!_status.dcbenxi_map) {
_status.dcbenxi_map = {};
let list;
if (_status.connectMode) {
list = get.charactersOL();
} else {
list = get.gainableCharacters();
}
list.forEach(name => {
if (name !== "dc_wuyi") {
const skills = get.character(name).skills;
skills.forEach(skill => {
if (skill in _status.dcbenxi_map) return;
const voices = game.parseSkillText(skill, name);
if (
voices.some(text => {
const pinyins = get.pinyin(text, false);
for (let i = 0; i < pinyins.length - 1; i++) {
if (pinyins[i] === "wu" && pinyins[i + 1] === "yi") return true;
}
return false;
})
) {
_status.dcbenxi_map[skill] = name;
}
});
}
});
}
return _status.dcbenxi_map;
},
},
//新InitFilter测试高达一号
//打赢复活赛的牢达[哭]
dclonghun: {

View File

@ -3,7 +3,7 @@ const characterSort = {
collab_tongque: ["sp_fuwan", "sp_fuhuanghou", "sp_jiben", "old_lingju", "sp_mushun"],
collab_duanwu: ["sunwukong", "longwang", "taoshen"],
collab_decade: ["libai", "xiaoyuehankehan", "zhutiexiong", "wu_zhutiexiong"],
collab_remake: ["dc_caocao", "dc_liubei", "dc_sunquan", "nezha", "dc_sunce", "dc_zhaoyun"],
collab_remake: ["dc_caocao", "dc_liubei", "dc_sunquan", "nezha", "dc_sunce", "dc_zhaoyun", "dc_wuyi"],
};
const characterSortTranslate = {

View File

@ -95,11 +95,10 @@ const translates = {
dczhanjiang: "斩将",
dczhanjiang_info: "准备阶段,若场上有【青釭剑】,则你可以获得之。",
collab_olympic: "OL·伦敦奥运会",
collab_tongque: "OL·铜雀台",
collab_duanwu: "新服·端午畅玩",
collab_decade: "新服·创玩节",
collab_remake: "新服·共创武将",
dc_wuyi: "经典吴懿",
dc_wuyi_prefix: "经典",
dcbenxi: "奔袭",
dcbenxi_info: "转换技锁定技。当你失去手牌后系统随机检索出一句转换为拼音后包含“wu,yi”的技能台词然后你念出此台词。阳你获得上次所念出的台词对应的技能若你已拥有该技能则改为对其他角色各造成1点伤害。",
};
export default translates;

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {};
export default characterFilters;

View File

@ -1,21 +1,6 @@
const characters = {
noname: ["female", "key", 3, ["noname_zhuyuan", "noname_duocai"]],
key_kud: ["female", "key", 3, ["kud_qiaoshou", "kud_buhui"]],
key_misuzu: ["female", "key", 3, ["misuzu_hengzhou", "misuzu_nongyin", "misuzu_zhongxing"]],
key_kamome: ["female", "key", 3, ["kamome_yangfan", "kamome_huanmeng", "kamome_jieban"]],
key_nao: ["female", "key", 3, ["nao_duyin", "nao_wanxin", "nao_shouqing"]],
key_yuuki: ["female", "key", 3, ["yuuki_yicha"]],
key_kotarou: ["male", "key", 3, ["kotarou_rewrite", "kotarou_aurora"]],
key_tenzen: ["male", "key", 4, ["tenzen_fenghuan", "tenzen_retianquan"]],
key_kyouko: ["female", "key", 3, ["kyouko_rongzhu", "kyouko_gongmian"]],
key_kyou: ["female", "key", 3, ["kyou_zhidian", "kyou_duanfa"]],
key_seira: ["female", "key", 3, ["seira_xinghui", "seira_yuanying"]],
key_kiyu: ["female", "key", 3, ["kiyu_yuling", "kiyu_rexianyu"]],
key_tomoyo: ["female", "key", 4, ["tomoyo_wuwei", "tomoyo_zhengfeng"]],
key_minagi: ["female", "key", 3, ["minagi_peiquan", "minagi_huanliu"]],
key_michiru: ["female", "key", 3, ["michiru_sheyuan"]],
ns_huangchengyan: ["male", "shu", 3, ["nslongyue", "nszhenyin"]],
ns_sunchensunjun: ["male", "wu", 5, ["nsxianhai", "nsxingchu"]],
ns_yuanxi: ["male", "qun", 4, ["nsshengyan", "nsdaizhan"]],

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {
ns_duangui(mode) {
return mode == "identity" && _status.mode == "normal";

View File

@ -1,18 +1,4 @@
export default {
key_kud: "#b千夜",
key_misuzu: "#b长发及腰黑长直",
key_kamome: "#b仿生纱",
key_nao: "#b潮鸣",
key_kyou: "#b长发及腰黑长直",
key_yuuki: "#b4399司命",
key_kyouko: "#b阿阿阿687",
key_tenzen: "#b皋耳击",
key_kotarou: "#bb1154486224",
key_seira: "#b阿开木木W🍀",
key_kiyu: "#b无面◎隐者",
key_tomoyo: "#b长发及腰黑长直",
key_minagi: "#b无面◎隐者",
ns_huangchengyan: "#g竹邀月",
ns_sunchensunjun: "#gVenusjeu",
ns_yuanxi: "#g食茸二十四",

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
const characterSort = {
diy_yijiang: ["key_kud", "key_misuzu", "key_kamome", "key_nao", "ns_huangchengyan", "ns_sunchensunjun", "ns_yuanxi", "ns_caoshuang"],
diy_yijiang2: ["key_yuuki", "key_tenzen", "key_kyouko", "key_kotarou", "key_kyou", "ns_chentai", "ns_huangwudie", "ns_sunyi", "ns_zhangning", "ns_yanghu"],
diy_yijiang3: ["ns_ruanji", "ns_zanghong", "ns_limi", "ns_zhonglimu", "prp_zhugeliang", "key_seira", "key_kiyu", "key_tomoyo", "key_minagi", "key_michiru"],
diy_yijiang: ["ns_huangchengyan", "ns_sunchensunjun", "ns_yuanxi", "ns_caoshuang"],
diy_yijiang2: ["ns_chentai", "ns_huangwudie", "ns_sunyi", "ns_zhangning", "ns_yanghu"],
diy_yijiang3: ["ns_ruanji", "ns_zanghong", "ns_limi", "ns_zhonglimu", "prp_zhugeliang"],
diy_tieba: ["ns_zuoci", "ns_lvzhi", "ns_wangyun", "ns_nanhua", "ns_nanhua_left", "ns_nanhua_right", "ns_huamulan", "ns_huangzu", "ns_jinke", "ns_yanliang", "ns_wenchou", "ns_caocao", "ns_caocaosp", "ns_zhugeliang", "ns_wangyue", "ns_yuji", "ns_xinxianying", "ns_guanlu", "ns_simazhao", "ns_sunjian", "ns_duangui", "ns_zhangbao", "ns_masu", "ns_zhangxiu", "ns_lvmeng", "ns_shenpei", "ns_yujisp", "ns_yangyi", "ns_liuzhang", "ns_xinnanhua", "ns_luyusheng"],
diy_fakenews: ["diy_wenyang", "ns_zhangwei", "ns_caimao", "ns_chengpu", "ns_sundeng", "ns_duji", "ns_mengyou"],
diy_xushi: ["diy_feishi", "diy_hanlong", "diy_liufu", "diy_liuyan", "diy_liuzan", "diy_tianyu", "diy_xizhenxihong", "diy_yangyi", "diy_zaozhirenjun"],

View File

@ -63,103 +63,6 @@ const translates = {
ns_xinnanhua: "南华老仙",
ns_luyusheng: "陆郁生",
key_kud: "库特莉亚芙卡",
kud_qiaoshou: "巧手",
kud_qiaoshou_equip: "巧手",
kud_qiaoshou_end: "巧手",
kud_qiaoshou_backup: "巧手",
kud_qiaoshou_info: "出牌阶段/结束阶段,若你没有“巧”,则你可以将一张手牌作为“巧”置于武将牌上并摸一张牌,且视为装备了一张你选择的武器牌或进攻坐骑/防具牌或防御坐骑直到“巧”进入弃牌堆。出牌阶段结束时/准备阶段开始时,你将“巧”置入弃牌堆。",
kud_buhui: "不悔",
kud_buhui_info: "限定技当你进入濒死状态时你可以弃置“巧”和装备区内的所有牌至少一张并摸等量的牌将体力回复至2点获得技能〖重振〗。",
key_misuzu: "神尾观铃",
misuzu_hengzhou: "恒咒",
misuzu_hengzhou_info: "锁定技准备阶段开始时或当你受到1点伤害或回复1点体力后你获得一个“诅咒”标记。你的手牌上限和摸牌阶段的额定摸牌数+X。结束阶段开始时若X大于3则你移去所有“诅咒”标记并失去1点体力。X为“诅咒”标记数",
misuzu_nongyin: "浓饮",
misuzu_nongyin_info: "当你需要使用【桃】时,你可将一张红色非锦囊牌当做【乐不思蜀】置入自己的判定区,然后视为使用一张【桃】。",
misuzu_zhongxing: "终幸",
misuzu_zhongxing_info: "每回合限一次当你判定区的牌移动到其他区域后你可令一名角色回复1点体力或摸两张牌。",
key_kamome: "久岛鸥",
kamome_yangfan: "扬帆",
kamome_yangfan_info: "锁定技,游戏开始时,你将一张【旅行箱】置入你的装备区。当你失去装备区内的一张牌后,你摸两张牌。",
kamome_huanmeng: "幻梦",
kamome_huanmeng_info: "准备阶段开始时你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。X为你装备区内的牌数",
kamome_jieban: "结伴",
kamome_jieban_info: "转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。",
kamome_suitcase: "旅行箱",
kamome_suitcase_info: "锁定技,你跳过你的判定阶段和弃牌阶段;当你即将翻面时,取消之。",
key_nao: "友利奈绪",
nao_duyin: "独隐",
nao_duyin2: "独隐",
nao_duyin_info: "一名其他角色的回合开始时,若你本局游戏内未对其发动过〖独隐〗,则你可以弃置一张牌或将武将牌翻面。若如此做,你不能成为其使用牌的目标,且对其使用牌没有距离限制且不计入使用次数直到你的下回合结束。",
nao_wanxin: "挽心",
nao_wanxin_info: "一名角色的回合结束时,你可以令一名本回合内受到过伤害的角色摸两张牌,然后你与其将武将牌重置。",
nao_shouqing: "守情",
nao_shouqing2: "守情",
nao_shouqing3: "守情",
nao_shouqing_info: "其他角色的出牌阶段内可以对你使用【桃】。若如此做,其摸一张牌且本局游戏内的手牌上限+1。",
key_yuuki: "冰室忧希",
yuuki_yicha: "异插",
yuuki_yicha_info: "出牌阶段开始时,你可依次进行两次判定并将判定牌依次置入两行三列方阵的两个随机位置中。然后你依次进行四次判定,每次可将当前判定牌置入空方格,且须与相邻方格的牌颜色均不同。若如此做,你令一名角色获得方阵内的所有牌。",
key_kyouko: "伊座并杏子",
kyouko_rongzhu: "容助",
kyouko_rongzhu_info: "其他角色不因此技能而得到你的牌后,你可摸一张牌,然后交给其一张牌。若其是当前回合角色,则其本回合使用【杀】的次数上限+1若你是当前回合角色则你本回合的手牌上限+1。",
kyouko_gongmian: "共勉",
kyouko_gongmian_use: "共勉",
kyouko_gongmian_exchange: "共勉",
kyouko_gongmian_info: "①出牌阶段你可以选择一名未以此法选择过的角色若其手牌大于你你获得其一张牌然后交给其一张牌小于你其交给你一张牌然后你交给其一张牌等于你你与其各摸一张牌。②出牌阶段结束时你可以获得一名其他角色区域内的至多X张牌然后交给其等量的牌。③弃牌阶段开始时若X不小于你的体力值你可以获得一名手牌数少于你的角色的所有手牌然后将手牌数的一半向上取整交给该角色。X为你本回合内发动过〖共勉①〗的次数",
key_tenzen: "加纳天善",
tenzen_yixing: "弈兴",
tenzen_yixing_info: "当有角色因【杀】或【决斗】而受到伤害后,若其在你的攻击范围内或你在伤害来源的攻击范围内,你可以摸一张牌,然后将一张牌置于武将牌上,称为“兴”。当你成为其他角色使用【杀】或普通锦囊牌的唯一目标后,你可以获得一张“兴”,并可于此牌结算完成后弃置两张牌,视为对其使用一张名称相同的牌。",
//若对方为水织静久则无法触发〖弈兴〗
tenzen_lingyu: "领域",
tenzen_lingyu_info: "觉醒技准备阶段若你的“兴”不小于你的体力值则你减1点体力上限并获得技能〖天全〗。若你以此法失去了体力则你摸两张牌。",
tenzen_tianquan: "天全",
tenzen_tianquan_info: "每回合限一次,当你使用【杀】或【决斗】指定唯一目标后,你可以移去两张“兴”并亮出牌堆顶的五张牌。这些牌中每有一张基本牌,响应此牌需要的【闪】/【杀】的数量便+1。此牌结算完成后若此牌造成过伤害则你获得这些牌中的非基本牌。",
key_kotarou: "天王寺瑚太朗",
kotarou_aurora: "丝刃",
kotarou_aurora_info: "锁定技,当扣减体力或增加体力上限后,若你的装备区内:有武器牌,你视为使用一张【杀】;没有武器牌,你使用牌堆中的一张不为赠物的武器牌。",
kotarou_rewrite: "改写",
kotarou_rewrite_damage: "改写",
kotarou_rewrite_recover: "改写",
kotarou_rewrite_sha: "改写",
kotarou_rewrite_block: "改写",
kotarou_rewrite_info: "出牌阶段你可选择①视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌②移动场上的一张牌③增加1点体力上限并失去1点体力体力上限至多为5④下一次造成的伤害+1⑤下一次回复的体力值+1⑥本回合内的手牌上限和使用【杀】的使用次数+1。若你于本回合内发动过〖改写〗的次数超过两次则你令此技能失效且于回合结束后将体力上限降至3点失去〖丝刃〗和〖改写〗。",
key_kyou: "藤林杏",
kyou_zhidian: "掷典",
kyou_zhidian_info: "你可以将一张锦囊牌当做【杀】使用(无距离限制)。当你使用【杀】指定第一个目标后,你选择一个与上次不同的选项:①此【杀】不可被响应。②此【杀】无视防具。③此【杀】伤害+1。④此【杀】不计入次数限制。",
kyou_duanfa: "断发",
kyou_duanfa_info: "限定技当你受到伤害时若伤害值不小于你的体力值则你可弃置所有手牌防止此伤害并回复1点体力且当你于你的下回合开始前成为【杀】或伤害性锦囊牌的目标后你摸一张牌。",
key_seira: "樱庭星罗",
seira_xinghui: "星辉",
seira_xinghui_info: "准备阶段你可以投掷一枚骰子观看牌堆顶的X张牌X为投掷点数并以任意顺序扣置于一名没有“星屑”的角色的武将牌上称为“星屑”。有“星屑”的角色造成的伤害+1且当其从牌堆顶摸牌或取得判定牌时改为从“星屑”中获取。",
seira_yuanying: "缘映",
seira_yuanying_info: "出牌阶段限一次,你可选择两名角色。这两名角色成为“姻缘者”且获得〖姻缘〗直到你下次发动〖缘映〗。",
seira_yinyuan: "姻缘",
seira_yinyuan_info: "你的手牌对其他“姻缘者”可见。出牌阶段限一次你可以获得一名其他“姻缘者”区域内的一张牌然后其回复1点体力。",
key_kiyu: "露娜Q",
kiyu_yuling: "玉灵",
kiyu_yuling_info: "锁定技。你不是有距离限制的锦囊牌的合法目标你成为【杀】的目标后使用者需弃置X张牌X为其至你的距离。",
kiyu_xianyu: "先预",
kiyu_xianyu_info: "每轮限一次。一名角色的出牌阶段开始时你可观看其手牌并预测其使用这些牌的顺序。此出牌阶段结束时你摸X张牌且其本回合的手牌上限+XX为你的预测与其实际使用顺序的吻合数且至多为3。",
kiyu_rexianyu: "先预",
kiyu_rexianyu_info: "每轮限一次。出牌阶段结束时你可以选择一名其他角色。该角色于下个出牌阶段内使用第X张牌时其可以将一张牌当做你本阶段内使用的第X张基本牌或普通锦囊牌使用X至多为3若如此做你摸一张牌且其本回合的手牌上限+1。",
key_tomoyo: "坂上智代",
tomoyo_wuwei: "武威",
tomoyo_wuwei_info: "①每回合每种花色限一次。你可以将一张手牌当做【杀】使用或打出。②当有角色使用【闪】后,若你在其攻击范围内,你可以对其使用一张【杀】(无距离限制)。",
tomoyo_zhengfeng: "整风",
tomoyo_zhengfeng_info: "使命技。①准备阶段你可以令攻击范围内的一名角色进行判定。若如此做你获得如下效果直到下回合开始你视为在该角色的攻击范围内且当该角色使用与判定牌颜色相同的牌时你摸一张牌。②失败结束阶段若你于本回合内未发动过〖整风①〗则你可以减1点体力上限。你失去〖武威〗摸两张牌并回复1点体力然后获得〖长誓〗。",
tomoyo_changshi: "长誓",
tomoyo_changshi_info: "锁定技。一名攻击范围内包含你的角色回复体力后你获得1点护甲一名攻击范围内包含你的角色一次性获得至少两张牌后你摸一张牌。",
key_minagi: "远野美凪",
minagi_peiquan: "配券",
minagi_peiquan_info: "锁定技。①游戏开始时你将你所有的手牌记录为“米券”。②出牌阶段你可以赠予一张“米券”然后执行一项本回合内未被选择过的效果⒈对其造成1点伤害⒉摸两张牌⒊弃置其的两张牌⒋亮出牌堆顶的一张牌然后你可以使用之。",
minagi_huanliu: "幻流",
minagi_huanliu_info: "准备阶段开始时,你可与一名其他角色进行协力,并获得“远野小满”的所有技能直到目标角色的结束阶段开始。若“协力”成功,则你可以将所有手牌记录为“米券”。",
key_michiru: "远野小满",
michiru_sheyuan: "舍愿",
michiru_sheyuan_info: "每轮限一次。若你没有“米券”,则你可以将所有手牌当做任意基本牌或普通锦囊牌使用,然后摸等量的牌。",
minagi_tag: "米券",
noname: "小无",
noname_zhuyuan: "祝愿",
noname_zhuyuan_info: "①每回合每名角色限一次。出牌阶段,你可以将四张花色各不相同的牌交给一名其他角色。你与其获得技能〖铁骑〗和〖激昂〗至各自的回合结束。②锁定技,若你于当前回合内:未发动过〖祝愿〗,则你使用牌无次数限制;发动过〖祝愿〗,则你使用牌无距离限制。",

View File

@ -13,9 +13,6 @@ const characters = {
shen_machao: ["male", "shen", 4, ["shouli", "hengwu"], ["shu"]],
shen_sunquan: ["male", "shen", 4, ["junkyuheng", "junkdili"], ["wu"]],
shen_jiangwei: ["male", "shen", 4, ["jiufa", "tianren", "pingxiang"], ["shu"]],
key_kagari: ["female", "shen", 3, ["kagari_zongsi"], ["key"]],
key_shiki: ["female", "shen", "3/5", ["shiki_omusubi"], ["key"]],
db_key_hina: ["female", "key", 3, ["hina_shenshi", "hina_xingzhi"], ["doublegroup:key:shen"]],
shen_sunce: ["male", "shen", "1/6", ["yingba", "scfuhai", "pinghe"], ["wu"]],
shen_xunyu: ["male", "shen", 3, ["tianzuo", "lingce", "dinghan"], ["wei", "clan:颍川荀氏"]],

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {
shen_diaochan(mode) {
return mode == "identity" || mode == "doudizhu" || mode == "single" || (mode == "versus" && _status.mode != "standard" && _status.mode != "three");

View File

@ -4049,77 +4049,6 @@ const skills = {
},
},
},
hina_shenshi: {
groupSkill: true,
trigger: { player: ["phaseUseBegin", "phaseUseEnd"] },
frequent: true,
filter(event, player) {
return player.group == "shen";
},
content() {
"step 0";
player.draw(2).gaintag = ["hina_shenshi"];
player.addSkill("hina_shenshi_yingbian");
"step 1";
var cards = player.getCards("h", function (card) {
return card.hasGaintag("hina_shenshi");
});
if (!cards.length) event.finish();
else if (cards.length == 1) event._result = { bool: true, cards: cards };
else
player.chooseCard("h", true, "将一张“神视”牌置于牌堆顶", function (card) {
return card.hasGaintag("hina_shenshi");
});
"step 2";
if (result.bool) {
game.log(player, "将一张牌置于了牌堆顶");
player.lose(result.cards, ui.cardPile, "insert");
player.$throw(1, 1000);
} else event.finish();
"step 3";
game.delayx();
},
onremove(player) {
player.removeGaintag("hina_shenshi");
},
group: "hina_shenshi_yingbian",
},
hina_shenshi_yingbian: {
trigger: { player: "yingbian" },
forced: true,
filter: (event, player) => event.card.isCard && player.hasHistory("lose", evt => evt.getParent() == event && Object.values(evt.gaintag_map).some(value => value.includes("hina_shenshi"))),
content: () => {
if (!Array.isArray(trigger.temporaryYingbian)) trigger.temporaryYingbian = [];
trigger.temporaryYingbian.add("force");
trigger.temporaryYingbian.addArray(get.yingbianEffects());
},
},
hina_xingzhi: {
groupSkill: true,
trigger: { player: "yingbian" },
usable: 1,
filter: (event, player) => player.group == "key" && !event.card.yingbian && lib.yingbian.condition.complex.has("zhuzhan"),
content: () => {
"step 0";
trigger.yingbianZhuzhanAI = (player, card, source, targets) => cardx => {
if (get.attitude(player, source) <= 0) return 0;
var info = get.info(card),
num = 0;
if (info && info.ai && info.ai.yingbian) {
var ai = info.ai.yingbian(card, source, targets, player);
if (ai) num = ai;
}
return Math.max(num, 6) - get.value(cardx);
};
trigger.afterYingbianZhuzhan = event => event.zhuzhanresult.draw(2);
lib.yingbian.condition.complex.get("zhuzhan")(trigger);
"step 1";
if (!result.bool) return;
trigger.card.yingbian = true;
lib.yingbian.effect.forEach(value => game.yingbianEffect(trigger, value));
player.addTempSkill("yingbian_changeTarget");
},
},
yingba: {
audio: 2,
mod: {
@ -5396,179 +5325,6 @@ const skills = {
delete player._trueMe;
},
},
shiki_omusubi: {
audio: 2,
trigger: { global: "roundStart" },
direct: true,
content() {
"step 0";
player.chooseTarget(get.prompt2("shiki_omusubi"), lib.filter.notMe).set("ai", function (target) {
var player = _status.event.player;
if (player.isHealthy()) return 0;
if (player.hp < 3 && player.getDamagedHp() < 2) return 0;
var list = [];
if (lib.character[target.name]) list.addArray(lib.character[target.name][3]);
if (lib.character[target.name1]) list.addArray(lib.character[target.name1][3]);
if (lib.character[target.name2]) list.addArray(lib.character[target.name2][3]);
list = list.filter(function (i) {
return !player.hasSkill(i);
});
if (!list.length) return 0;
return 1 + Math.random();
});
"step 1";
if (result.bool) {
var target = result.targets[0];
player.logSkill("shiki_omusubi", target);
player.loseMaxHp();
var list = [];
if (lib.character[target.name]) list.addArray(lib.character[target.name][3]);
if (lib.character[target.name1]) list.addArray(lib.character[target.name1][3]);
if (lib.character[target.name2]) list.addArray(lib.character[target.name2][3]);
player.addSkills(list);
game.broadcastAll(function (list) {
lib.character.key_shiki[3].addArray(list);
game.expandSkills(list);
for (var i of list) {
var info = lib.skill[i];
if (!info) continue;
if (!info.audioname2) info.audioname2 = {};
info.audioname2.key_shiki = "shiki_omusubi";
}
}, list);
}
},
},
kagari_zongsi: {
enable: "phaseUse",
usable: 1,
content() {
"step 0";
var controls = [];
if (ui.cardPile.hasChildNodes()) controls.push("选择牌堆中的一张牌");
if (ui.discardPile.hasChildNodes()) controls.push("选择弃牌堆中的一张牌");
if (
game.hasPlayer(function (current) {
return current.countCards("hej") > 0;
})
)
controls.push("选择一名角色区域内的一张牌");
if (!controls.length) {
event.finish();
return;
}
event.controls = controls;
var next = player.chooseControl();
next.set("choiceList", controls);
next.set("prompt", "请选择要移动的卡牌的来源");
next.ai = function () {
return 0;
};
"step 1";
result.control = event.controls[result.index];
var list = ["弃牌堆", "牌堆", "角色"];
for (var i = 0; i < list.length; i++) {
if (result.control.indexOf(list[i]) != -1) {
event.index = i;
break;
}
}
if (event.index == 2) {
player.chooseTarget("请选择要移动的卡牌的来源", true, function (card, kagari, target) {
return target.countCards("hej") > 0;
});
} else {
var source = ui[event.index == 0 ? "discardPile" : "cardPile"].childNodes;
var list = [];
for (var i = 0; i < source.length; i++) list.push(source[i]);
player.chooseButton(["请选择要移动的卡牌", list], true).ai = get.buttonValue;
}
"step 2";
if (event.index == 2) {
player.line(result.targets[0]);
event.target1 = result.targets[0];
player.choosePlayerCard(result.targets[0], true, "hej").set("visible", true);
} else {
event.card = result.links[0];
}
"step 3";
if (event.index == 2) event.card = result.cards[0];
var controls = ["将这张牌移动到牌堆的顶部或者底部", "将这张牌移动到弃牌堆的顶部或者底部", "将这张牌移动到一名角色对应的区域里"];
event.controls = controls;
var next = player.chooseControl();
next.set("prompt", "要对" + get.translation(event.card) + "做什么呢?");
next.set("choiceList", controls);
next.ai = function () {
return 2;
};
"step 4";
result.control = event.controls[result.index];
var list = ["弃牌堆", "牌堆", "角色"];
for (var i = 0; i < list.length; i++) {
if (result.control.indexOf(list[i]) != -1) {
event.index2 = i;
break;
}
}
if (event.index2 == 2) {
player.chooseTarget("要将" + get.translation(card) + "移动到哪一名角色的对应区域呢", true).ai = function (target) {
return target == _status.event.player ? 1 : 0;
};
} else {
player.chooseControl("顶部", "底部").set("prompt", "把" + get.translation(card) + "移动到" + (event.index2 == 0 ? "弃" : "") + "牌堆的...");
}
"step 5";
if (event.index2 != 2) {
//if(event.target1) event.target1.lose(card,ui.special);
//else card.goto(ui.special);
event.way = result.control;
} else {
event.target2 = result.targets[0];
var list = ["手牌区"];
if (lib.card[card.name].type == "equip" && event.target2.canEquip(card)) list.push("装备区");
if (lib.card[card.name].type == "delay" && !event.target2.isDisabledJudge() && !event.target2.hasJudge(card.name)) list.push("判定区");
if (list.length == 1) event._result = { control: list[0] };
else {
player.chooseControl(list).set("prompt", "把" + get.translation(card) + "移动到" + get.translation(event.target2) + "的...").ai = function () {
return 0;
};
}
}
"step 6";
if (event.index2 != 2) {
var node = ui[event.index == 0 ? "discardPile" : "cardPile"];
if (event.target1) {
var next = event.target1.lose(card, event.position);
if (event.way == "顶部") next.insert_card = true;
} else {
if (event.way == "底部") node.appendChild(card);
else node.insertBefore(card, node.firstChild);
}
game.updateRoundNumber();
event.finish();
} else {
if (result.control == "手牌区") {
var next = event.target2.gain(card);
if (event.target1) {
next.source = event.target1;
next.animate = "giveAuto";
} else next.animate = "draw";
} else if (result.control == "装备区") {
if (event.target1) event.target1.$give(card, event.target2);
event.target2.equip(card);
} else {
if (event.target1) event.target1.$give(card, event.target2);
event.target2.addJudge(card);
}
}
"step 7";
game.updateRoundNumber();
},
ai: {
order: 10,
result: { player: 1 },
},
},
caopi_xingdong: {
audio: "olfangquan",
audioname: ["shen_caopi"],

View File

@ -5,7 +5,6 @@ const characterSort = {
extra_shan: ["shen_zhaoyun", "shen_simayi"],
extra_yin: ["shen_liubei", "shen_luxun"],
extra_lei: ["shen_ganning", "shen_zhangliao"],
extra_key: ["key_kagari", "key_shiki", "db_key_hina"],
extra_decade: ["shen_jiangwei", "shen_machao", "shen_zhangfei", "shen_zhangjiao", "shen_dengai", "shen_xuzhu", "dc_shen_huatuo"],
extra_ol: ["ol_zhangliao", "shen_caopi", "shen_zhenji", "shen_sunquan"],
extra_mobilezhi: ["shen_guojia", "shen_xunyu"],

View File

@ -258,20 +258,6 @@ const translates = {
hengwu_info: "当你使用或打出有花色的牌时若你的手牌区内没有与此牌花色相同的牌则你可以摸X张牌X为场上装备区内花色与此牌相同的牌数。",
hengwu_append: '<span style="font-family: yuanli">棘手,怀念,摧毁!</span>',
key_kagari: "篝",
kagari_zongsi: "纵丝",
kagari_zongsi_info: "出牌阶段限一次,你可以选择一张不在游戏外的牌,然后将其置于牌堆/弃牌堆的顶部/底部或一名角色的对应区域内。",
key_shiki: "神山识",
key_shiki_ab: "神山识",
shiki_omusubi: "御结",
shiki_omusubi_info: "一轮游戏开始时你可以减1点体力上限然后将一名其他角色武将牌上的技能加入到你的武将牌上。",
shiki_omusubi_append: '<span style="font-family: yuanli">来吧,羽依里。用你的手,让我变成那只真正的鬼吧!</span>',
db_key_hina: "佐藤雏",
hina_shenshi: "神视",
hina_shenshi_yingbian: "神视",
hina_shenshi_info: "神势力技。出牌阶段开始时/结束时,你可摸两张牌,然后将其中一张牌置于牌堆顶。你以此法得到的牌视为拥有全部应变效果,且可以无条件发动。",
hina_xingzhi: "幸凪",
hina_xingzhi_info: "键势力技。每回合限一次,你可以通过“助战”触发一张牌的全部应变效果,且响应助战的角色摸两张牌。",
tw_shen_guanyu: "TW神关羽",
tw_shen_guanyu_prefix: "TW神",
twwushen: "武神",

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {};
export default characterFilters;

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {
jsrg_xushao(mode) {
return mode != "guozhan";

View File

@ -439,6 +439,113 @@ const characters = {
hp: 3,
skills: ["fuuko_xingdiao", "fuuko_chuanyuan"],
},
key_kagari: {
sex: "female",
group: "shen",
groupInGuozhan: "key",
hp: 3,
skills: ["kagari_zongsi"],
},
key_shiki: {
sex: "female",
group: "shen",
groupInGuozhan: "key",
hp: 3,
maxHp: 5,
skills: ["shiki_omusubi"],
},
db_key_hina: {
sex: "female",
group: "shen",
groupInGuozhan: "key",
hp: 3,
skills: ["hina_shenshi", "hina_xingzhi"],
doubleGroup: ["key", "shen"],
},
key_kud: {
sex: "female",
group: "key",
hp: 3,
skills: ["kud_qiaoshou", "kud_buhui"],
},
key_misuzu: {
sex: "female",
group: "key",
hp: 3,
skills: ["misuzu_hengzhou", "misuzu_nongyin", "misuzu_zhongxing"],
},
key_kamome: {
sex: "female",
group: "key",
hp: 3,
skills: ["kamome_yangfan", "kamome_huanmeng", "kamome_jieban"],
},
key_nao: {
sex: "female",
group: "key",
hp: 3,
skills: ["nao_duyin", "nao_wanxin", "nao_shouqing"],
},
key_yuuki: {
sex: "female",
group: "key",
hp: 3,
skills: ["yuuki_yicha"],
},
key_kotarou: {
sex: "male",
group: "key",
hp: 3,
skills: ["kotarou_rewrite", "kotarou_aurora"],
},
key_tenzen: {
sex: "male",
group: "key",
hp: 4,
skills: ["tenzen_fenghuan", "tenzen_retianquan"],
},
key_kyouko: {
sex: "female",
group: "key",
hp: 3,
skills: ["kyouko_rongzhu", "kyouko_gongmian"],
},
key_kyou: {
sex: "female",
group: "key",
hp: 3,
skills: ["kyou_zhidian", "kyou_duanfa"],
},
key_seira: {
sex: "female",
group: "key",
hp: 3,
skills: ["seira_xinghui", "seira_yuanying"],
},
key_kiyu: {
sex: "female",
group: "key",
hp: 3,
skills: ["kiyu_yuling", "kiyu_rexianyu"],
},
key_tomoyo: {
sex: "female",
group: "key",
hp: 4,
skills: ["tomoyo_wuwei", "tomoyo_zhengfeng"],
},
key_minagi: {
sex: "female",
group: "key",
hp: 3,
skills: ["minagi_peiquan", "minagi_huanliu"],
},
key_michiru: {
sex: "female",
group: "key",
hp: 3,
skills: ["michiru_sheyuan"],
},
};
export default characters;

View File

@ -10,6 +10,7 @@ import { characterSort, characterSortTranslate } from "./sort.js";
game.import("character", function () {
return {
name: "key",
connect: true,
character: { ...characters },
characterSort: {
key: characterSort,
@ -31,6 +32,19 @@ game.import("character", function () {
characterTitle: {
key_kotomi: "#g落英逐紫裙",
key_jojiro: "战棋专属角色",
key_kud: "#b千夜",
key_misuzu: "#b长发及腰黑长直",
key_kamome: "#b仿生纱",
key_nao: "#b潮鸣",
key_kyou: "#b长发及腰黑长直",
key_yuuki: "#b4399司命",
key_kyouko: "#b阿阿阿687",
key_tenzen: "#b皋耳击",
key_kotarou: "#bb1154486224",
key_seira: "#b阿开木木W🍀",
key_kiyu: "#b无面◎隐者",
key_tomoyo: "#b长发及腰黑长直",
key_minagi: "#b无面◎隐者",
},
card: { ...cards },
skill: { ...skills },

File diff suppressed because it is too large Load Diff

View File

@ -1,18 +1,18 @@
const characterSort = {
key_one: ["key_rumi"],
key_kanon: ["key_shiori", "key_kaori", "key_akiko"],
key_air: ["key_haruko", "key_yukito", "key_crow", "key_kano"],
key_clannad: ["key_yukine", "key_sunohara", "key_tomoya", "key_nagisa", "key_kotomi", "key_fuuko"],
key_littlebusters: ["key_kyousuke", "key_komari", "key_masato", "key_kengo", "key_saya", "key_harukakanata", "key_rin", "key_sasami", "key_doruji", "key_yuiko", "key_riki", "key_mio", "key_midori"],
key_rewrite: ["key_lucia", "key_akane", "key_shizuru", "key_kotori", "key_sakuya", "key_chihaya", "key_asara"],
key_air: ["key_haruko", "key_yukito", "key_crow", "key_kano", "key_misuzu", "key_minagi", "key_michiru"],
key_clannad: ["key_yukine", "key_sunohara", "key_tomoya", "key_nagisa", "key_kotomi", "key_fuuko", "key_kyou", "key_tomoyo"],
key_littlebusters: ["key_kyousuke", "key_komari", "key_masato", "key_kengo", "key_saya", "key_harukakanata", "key_rin", "key_sasami", "key_doruji", "key_yuiko", "key_riki", "key_mio", "key_midori", "key_kud", "key_yuuki"],
key_rewrite: ["key_lucia", "key_akane", "key_shizuru", "key_kotori", "key_sakuya", "key_chihaya", "key_asara", "key_kagari", "key_kotarou"],
key_angelbeats: ["sp_key_yuri", "key_yuri", "key_iwasawa", "key_yoshino", "key_yui", "key_shiina", "key_hisako", "key_hinata", "key_noda", "key_ayato", "key_yuzuru", "sp_key_kanade", "key_shiorimiyuki", "key_abyusa", "key_godan"],
key_charlotte: ["key_yusa", "key_misa", "key_yuu", "key_jojiro"],
key_charlotte: ["key_yusa", "key_misa", "key_yuu", "key_jojiro", "key_nao"],
key_harmonia: ["key_rei"],
key_kamisamaninattahi: ["key_hiroto", "key_youta"],
key_summerpockets: ["key_umi", "key_umi2", "key_tsumugi", "key_inari", "key_ao", "key_kyoko", "key_miki", "key_ryoichi", "key_shiroha", "key_shizuku"],
key_summerpockets: ["key_umi", "key_umi2", "key_tsumugi", "key_inari", "key_ao", "key_kyoko", "key_miki", "key_ryoichi", "key_shiroha", "key_shizuku", "key_shiki", "key_kamome", "key_tenzen"],
key_kamisamaninattahi: ["key_hiroto", "key_youta", "db_key_hina", "key_kyouko"],
key_loopers: ["key_mia"],
key_lunaria: ["key_iriya"],
key_heavenburnsred: ["db_key_liyingxia", "key_erika", "key_satomi"],
key_lunaria: ["key_iriya", "key_kiyu"],
key_heavenburnsred: ["db_key_liyingxia", "key_erika", "key_satomi", "key_seira"],
};
const characterSortTranslate = {

View File

@ -456,6 +456,119 @@ const translates = {
fuuko_xingdiao_info: "锁定技。游戏开始时你将手牌摸至8张然后将所有手牌明置称为“星”不计入手牌上限。每名其他角色限一次其可以于出牌阶段选择获得你的一张“星”然后你摸一张牌。",
fuuko_chuanyuan: "传愿",
fuuko_chuanyuan_info: "锁定技。当你失去一张“星”后你回复1点体力然后从牌堆中获得一张和“星”花色点数相同的牌没有则改为摸一张牌且使用此牌无距离和次数限制。",
key_kagari: "篝",
kagari_zongsi: "纵丝",
kagari_zongsi_info: "出牌阶段限一次,你可以选择一张不在游戏外的牌,然后将其置于牌堆/弃牌堆的顶部/底部或一名角色的对应区域内。",
key_shiki: "神山识",
key_shiki_ab: "神山识",
shiki_omusubi: "御结",
shiki_omusubi_info: "一轮游戏开始时你可以减1点体力上限然后将一名其他角色武将牌上的技能加入到你的武将牌上。",
shiki_omusubi_append: '<span style="font-family: yuanli">来吧,羽依里。用你的手,让我变成那只真正的鬼吧!</span>',
db_key_hina: "佐藤雏",
hina_shenshi: "神视",
hina_shenshi_yingbian: "神视",
hina_shenshi_info: "神势力技。出牌阶段开始时/结束时,你可摸两张牌,然后将其中一张牌置于牌堆顶。你以此法得到的牌视为拥有全部应变效果,且可以无条件发动。",
hina_xingzhi: "幸凪",
hina_xingzhi_info: "键势力技。每回合限一次,你可以通过“助战”触发一张牌的全部应变效果,且响应助战的角色摸两张牌。",
key_kud: "库特莉亚芙卡",
kud_qiaoshou: "巧手",
kud_qiaoshou_equip: "巧手",
kud_qiaoshou_end: "巧手",
kud_qiaoshou_backup: "巧手",
kud_qiaoshou_info: "出牌阶段/结束阶段,若你没有“巧”,则你可以将一张手牌作为“巧”置于武将牌上并摸一张牌,且视为装备了一张你选择的武器牌或进攻坐骑/防具牌或防御坐骑直到“巧”进入弃牌堆。出牌阶段结束时/准备阶段开始时,你将“巧”置入弃牌堆。",
kud_buhui: "不悔",
kud_buhui_info: "限定技当你进入濒死状态时你可以弃置“巧”和装备区内的所有牌至少一张并摸等量的牌将体力回复至2点获得技能〖重振〗。",
key_misuzu: "神尾观铃",
misuzu_hengzhou: "恒咒",
misuzu_hengzhou_info: "锁定技准备阶段开始时或当你受到1点伤害或回复1点体力后你获得一个“诅咒”标记。你的手牌上限和摸牌阶段的额定摸牌数+X。结束阶段开始时若X大于3则你移去所有“诅咒”标记并失去1点体力。X为“诅咒”标记数",
misuzu_nongyin: "浓饮",
misuzu_nongyin_info: "当你需要使用【桃】时,你可将一张红色非锦囊牌当做【乐不思蜀】置入自己的判定区,然后视为使用一张【桃】。",
misuzu_zhongxing: "终幸",
misuzu_zhongxing_info: "每回合限一次当你判定区的牌移动到其他区域后你可令一名角色回复1点体力或摸两张牌。",
key_kamome: "久岛鸥",
kamome_yangfan: "扬帆",
kamome_yangfan_info: "锁定技,游戏开始时,你将一张【旅行箱】置入你的装备区。当你失去装备区内的一张牌后,你摸两张牌。",
kamome_huanmeng: "幻梦",
kamome_huanmeng_info: "准备阶段开始时你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。X为你装备区内的牌数",
kamome_jieban: "结伴",
kamome_jieban_info: "转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。",
kamome_suitcase: "旅行箱",
kamome_suitcase_info: "锁定技,你跳过你的判定阶段和弃牌阶段;当你即将翻面时,取消之。",
key_nao: "友利奈绪",
nao_duyin: "独隐",
nao_duyin2: "独隐",
nao_duyin_info: "一名其他角色的回合开始时,若你本局游戏内未对其发动过〖独隐〗,则你可以弃置一张牌或将武将牌翻面。若如此做,你不能成为其使用牌的目标,且对其使用牌没有距离限制且不计入使用次数直到你的下回合结束。",
nao_wanxin: "挽心",
nao_wanxin_info: "一名角色的回合结束时,你可以令一名本回合内受到过伤害的角色摸两张牌,然后你与其将武将牌重置。",
nao_shouqing: "守情",
nao_shouqing2: "守情",
nao_shouqing3: "守情",
nao_shouqing_info: "其他角色的出牌阶段内可以对你使用【桃】。若如此做,其摸一张牌且本局游戏内的手牌上限+1。",
key_yuuki: "冰室忧希",
yuuki_yicha: "异插",
yuuki_yicha_info: "出牌阶段开始时,你可依次进行两次判定并将判定牌依次置入两行三列方阵的两个随机位置中。然后你依次进行四次判定,每次可将当前判定牌置入空方格,且须与相邻方格的牌颜色均不同。若如此做,你令一名角色获得方阵内的所有牌。",
key_kyouko: "伊座并杏子",
kyouko_rongzhu: "容助",
kyouko_rongzhu_info: "其他角色不因此技能而得到你的牌后,你可摸一张牌,然后交给其一张牌。若其是当前回合角色,则其本回合使用【杀】的次数上限+1若你是当前回合角色则你本回合的手牌上限+1。",
kyouko_gongmian: "共勉",
kyouko_gongmian_use: "共勉",
kyouko_gongmian_exchange: "共勉",
kyouko_gongmian_info: "①出牌阶段你可以选择一名未以此法选择过的角色若其手牌大于你你获得其一张牌然后交给其一张牌小于你其交给你一张牌然后你交给其一张牌等于你你与其各摸一张牌。②出牌阶段结束时你可以获得一名其他角色区域内的至多X张牌然后交给其等量的牌。③弃牌阶段开始时若X不小于你的体力值你可以获得一名手牌数少于你的角色的所有手牌然后将手牌数的一半向上取整交给该角色。X为你本回合内发动过〖共勉①〗的次数",
key_tenzen: "加纳天善",
tenzen_yixing: "弈兴",
tenzen_yixing_info: "当有角色因【杀】或【决斗】而受到伤害后,若其在你的攻击范围内或你在伤害来源的攻击范围内,你可以摸一张牌,然后将一张牌置于武将牌上,称为“兴”。当你成为其他角色使用【杀】或普通锦囊牌的唯一目标后,你可以获得一张“兴”,并可于此牌结算完成后弃置两张牌,视为对其使用一张名称相同的牌。",
//若对方为水织静久则无法触发〖弈兴〗
tenzen_lingyu: "领域",
tenzen_lingyu_info: "觉醒技准备阶段若你的“兴”不小于你的体力值则你减1点体力上限并获得技能〖天全〗。若你以此法失去了体力则你摸两张牌。",
tenzen_tianquan: "天全",
tenzen_tianquan_info: "每回合限一次,当你使用【杀】或【决斗】指定唯一目标后,你可以移去两张“兴”并亮出牌堆顶的五张牌。这些牌中每有一张基本牌,响应此牌需要的【闪】/【杀】的数量便+1。此牌结算完成后若此牌造成过伤害则你获得这些牌中的非基本牌。",
key_kotarou: "天王寺瑚太朗",
kotarou_aurora: "丝刃",
kotarou_aurora_info: "锁定技,当扣减体力或增加体力上限后,若你的装备区内:有武器牌,你视为使用一张【杀】;没有武器牌,你使用牌堆中的一张不为赠物的武器牌。",
kotarou_rewrite: "改写",
kotarou_rewrite_damage: "改写",
kotarou_rewrite_recover: "改写",
kotarou_rewrite_sha: "改写",
kotarou_rewrite_block: "改写",
kotarou_rewrite_info: "出牌阶段你可选择①视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌②移动场上的一张牌③增加1点体力上限并失去1点体力体力上限至多为5④下一次造成的伤害+1⑤下一次回复的体力值+1⑥本回合内的手牌上限和使用【杀】的使用次数+1。若你于本回合内发动过〖改写〗的次数超过两次则你令此技能失效且于回合结束后将体力上限降至3点失去〖丝刃〗和〖改写〗。",
key_kyou: "藤林杏",
kyou_zhidian: "掷典",
kyou_zhidian_info: "你可以将一张锦囊牌当做【杀】使用(无距离限制)。当你使用【杀】指定第一个目标后,你选择一个与上次不同的选项:①此【杀】不可被响应。②此【杀】无视防具。③此【杀】伤害+1。④此【杀】不计入次数限制。",
kyou_duanfa: "断发",
kyou_duanfa_info: "限定技当你受到伤害时若伤害值不小于你的体力值则你可弃置所有手牌防止此伤害并回复1点体力且当你于你的下回合开始前成为【杀】或伤害性锦囊牌的目标后你摸一张牌。",
key_seira: "樱庭星罗",
seira_xinghui: "星辉",
seira_xinghui_info: "准备阶段你可以投掷一枚骰子观看牌堆顶的X张牌X为投掷点数并以任意顺序扣置于一名没有“星屑”的角色的武将牌上称为“星屑”。有“星屑”的角色造成的伤害+1且当其从牌堆顶摸牌或取得判定牌时改为从“星屑”中获取。",
seira_yuanying: "缘映",
seira_yuanying_info: "出牌阶段限一次,你可选择两名角色。这两名角色成为“姻缘者”且获得〖姻缘〗直到你下次发动〖缘映〗。",
seira_yinyuan: "姻缘",
seira_yinyuan_info: "你的手牌对其他“姻缘者”可见。出牌阶段限一次你可以获得一名其他“姻缘者”区域内的一张牌然后其回复1点体力。",
key_kiyu: "露娜Q",
kiyu_yuling: "玉灵",
kiyu_yuling_info: "锁定技。你不是有距离限制的锦囊牌的合法目标你成为【杀】的目标后使用者需弃置X张牌X为其至你的距离。",
kiyu_xianyu: "先预",
kiyu_xianyu_info: "每轮限一次。一名角色的出牌阶段开始时你可观看其手牌并预测其使用这些牌的顺序。此出牌阶段结束时你摸X张牌且其本回合的手牌上限+XX为你的预测与其实际使用顺序的吻合数且至多为3。",
kiyu_rexianyu: "先预",
kiyu_rexianyu_info: "每轮限一次。出牌阶段结束时你可以选择一名其他角色。该角色于下个出牌阶段内使用第X张牌时其可以将一张牌当做你本阶段内使用的第X张基本牌或普通锦囊牌使用X至多为3若如此做你摸一张牌且其本回合的手牌上限+1。",
key_tomoyo: "坂上智代",
tomoyo_wuwei: "武威",
tomoyo_wuwei_info: "①每回合每种花色限一次。你可以将一张手牌当做【杀】使用或打出。②当有角色使用【闪】后,若你在其攻击范围内,你可以对其使用一张【杀】(无距离限制)。",
tomoyo_zhengfeng: "整风",
tomoyo_zhengfeng_info: "使命技。①准备阶段你可以令攻击范围内的一名角色进行判定。若如此做你获得如下效果直到下回合开始你视为在该角色的攻击范围内且当该角色使用与判定牌颜色相同的牌时你摸一张牌。②失败结束阶段若你于本回合内未发动过〖整风①〗则你可以减1点体力上限。你失去〖武威〗摸两张牌并回复1点体力然后获得〖长誓〗。",
tomoyo_changshi: "长誓",
tomoyo_changshi_info: "锁定技。一名攻击范围内包含你的角色回复体力后你获得1点护甲一名攻击范围内包含你的角色一次性获得至少两张牌后你摸一张牌。",
key_minagi: "远野美凪",
minagi_peiquan: "配券",
minagi_peiquan_info: "锁定技。①游戏开始时你将你所有的手牌记录为“米券”。②出牌阶段你可以赠予一张“米券”然后执行一项本回合内未被选择过的效果⒈对其造成1点伤害⒉摸两张牌⒊弃置其的两张牌⒋亮出牌堆顶的一张牌然后你可以使用之。",
minagi_huanliu: "幻流",
minagi_huanliu_info: "准备阶段开始时,你可与一名其他角色进行协力,并获得“远野小满”的所有技能直到目标角色的结束阶段开始。若“协力”成功,则你可以将所有手牌记录为“米券”。",
key_michiru: "远野小满",
michiru_sheyuan: "舍愿",
michiru_sheyuan_info: "每轮限一次。若你没有“米券”,则你可以将所有手牌当做任意基本牌或普通锦囊牌使用,然后摸等量的牌。",
minagi_tag: "米券",
};
export default translates;

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {
simashi(mode) {
if (["boss", "chess", "tafang", "stone"].includes(mode)) return false;

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {};
export default characterFilters;

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {};
export default characterFilters;

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {};
export default characterFilters;

View File

@ -1422,6 +1422,7 @@ window.noname_character_rank = {
"xia_shie",
"clan_wangmingshan",
"yj_simafu",
"dc_wuyi",
],
bm: [
"kongrong",
@ -1728,6 +1729,7 @@ window.noname_character_rank = {
],
rarity: {
legend: [
"dc_wuyi",
"sp_sunce",
"star_caoren",
"dc_zhaoyun",

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {
re_zuoci(mode) {
return mode != "guozhan";

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {};
export default characterFilters;

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {
zuoci(mode) {
return mode != "guozhan";

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {};
export default characterFilters;

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {
chunyuqiong(mode) {
return mode != "identity" && mode != "guozhan";

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {};
export default characterFilters;

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {
nashime(mode) {
return mode != "guozhan";

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {
// leitong(mode) {
// return mode != "identity" && mode != "guozhan";

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {};
export default characterFilters;

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {};
export default characterFilters;

View File

@ -32,7 +32,7 @@ const characterReplaces = {
chenqun: ["chenqun", "dc_chenqun", "re_chenqun", "old_chenqun"],
hanhaoshihuan: ["hanhaoshihuan", "re_hanhaoshihuan"],
caozhen: ["caozhen", "re_caozhen", "xin_caozhen", "old_caozhen"],
wuyi: ["wuyi", "re_wuyi", "xin_wuyi"],
wuyi: ["wuyi", "re_wuyi", "xin_wuyi", "dc_wuyi"],
sunluban: ["re_sunluban", "xin_sunluban", "sunluban"],
zhuhuan: ["re_zhuhuan", "xin_zhuhuan", "zhuhuan", "old_zhuhuan"],
caoxiu: ["caoxiu", "re_caoxiu", "xin_caoxiu", "tw_caoxiu", "old_caoxiu"],

View File

@ -1,3 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../noname.js";
const characterFilters = {};
export default characterFilters;

BIN
image/character/dc_wuyi.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

View File

@ -1450,7 +1450,32 @@ export class Game {
* //如果key中包含发动技能的角色名player则直接改用info.audioname2[player]来播放语音
* ```
*/
parseSkillAudio(skill, player, skillInfo, useRawAudio) {
parseSkillAudio(skill, player, skillInfo) {
return game.parseSkillTextMap(skill, player, skillInfo).map(data => data.file);
}
/**
* 根据skill中的audio,audioname,audioname2和player来获取技能台词列表
* @param { string } skill 技能名
* @param { Player | Object | string } [player] 角色/角色名
* @param { skillInfo | audioInfo } [skillInfo] 预设的skillInfo/audioInfo(转为skillInfo)覆盖lib.skill[skill]
* @returns { string[] } 语音地址列表
*/
parseSkillText(skill, player, skillInfo) {
const audios = game.parseSkillTextMap(skill, player, skillInfo);
const voiceMap = [];
audios.forEach(audioname => {
if(audioname.text) voiceMap.push(audioname.text);
});
return voiceMap;
}
/**
* 根据skill中的audio,audioname,audioname2和player来获取技能台词列表及其对应的源文件名
* @param { string } skill 技能名
* @param { Player | Object | string } [player] 角色/角色名
* @param { skillInfo | audioInfo } [skillInfo] 预设的skillInfo/audioInfo(转为skillInfo)覆盖lib.skill[skill]
* @returns { any[] } 语音地址列表
*/
parseSkillTextMap(skill, player, skillInfo) {
if (typeof player === "string") player = { name: player };
else if (typeof player !== "object" || player === null) player = {};
@ -1483,12 +1508,6 @@ export class Game {
);
};
/**
* @param {string} skill
* @param {{audioname:string[],history:string[]}} options
* @param {skillInfo} [skillInfo]
* @returns {string[]}
*/
function getAudioList(skill, options, skillInfo) {
const info = skillInfo || lib.skill[skill];
if (!info) {
@ -1506,12 +1525,6 @@ export class Game {
return parseAudio(skill, options, audioInfo);
}
/**
* @param {string} skill
* @param {{audioname:string[],history:string[]}} options
* @param {audioInfo} audioInfo info.audio
* @returns {string[]}
*/
function parseAudio(skill, options, audioInfo) {
const audioname = options.audioname.slice();
const history = options.history.slice();
@ -1537,57 +1550,36 @@ export class Game {
if (!/^db:|^ext:|\//.test(audioInfo)) path = "skill/";
if (!/\.\w+$/.test(audioInfo) && !["data:", "blob:"].some(name => audioInfo.startsWith(name))) format = ".mp3";
if (path && format) return parseAudio(audioInfo, options, [true, 2]);
return [useRawAudio ? audioInfo : `${path}${audioInfo}${format}`];
const key = audioInfo, file = `${path}${audioInfo}${format}`;
const data = {key, file};
if(lib.translate[`#${key}`]) data.text = lib.translate[`#${key}`];
return [data];
}
let _audioname = getName(i => audioname.includes(i));
_audioname = _audioname ? `_${_audioname}` : "";
if (list[2] === "true") return [`${list[1] || "skill"}/${skill}${_audioname}.${list[3] || "mp3"}`];
if (list[2] === "true") {
const key = `${skill}${_audioname}`, file = `${list[1] || "skill"}/${skill}${_audioname}.${list[3] || "mp3"}`;
const data = {key, file};
if(lib.translate[`#${key}`]) data.text = lib.translate[`#${key}`];
return [data];
}
const audioList = [];
const audioList = []
list[2] = parseInt(list[2]);
for (let i = 1; i <= list[2]; i++) {
if (useRawAudio) audioList.push(`${skill}${_audioname}${i}`);
else audioList.push(`${list[1] || "skill"}/${skill}${_audioname}${i}.${list[3] || "mp3"}`);
const key = `${skill}${_audioname}${i}`, file = `${list[1] || "skill"}/${skill}${_audioname}${i}.${list[3] || "mp3"}`;
const data = {key, file};
if(lib.translate[`#${key}`]) data.text = lib.translate[`#${key}`];
audioList.push(data);
}
return audioList;
}
return getAudioList(skill, { audioname: [], history: [] }, skillInfo);
}
/**
* 根据skill中的audio,audioname,audioname2和player来获取技能台词列表
* @param { string } skill 技能名
* @param { Player | Object | string } [player] 角色/角色名
* @param { skillInfo | audioInfo } [skillInfo] 预设的skillInfo/audioInfo(转为skillInfo)覆盖lib.skill[skill]
* @returns { string[] } 语音地址列表
*/
parseSkillText(skill, player, skillInfo) {
const audios = game.parseSkillAudio(skill, player, skillInfo, true);
const voiceMap = [];
audios.forEach(audioname => {
const voiceText = lib.translate[`#${audioname}`];
if (voiceText) voiceMap.push(voiceText);
});
return voiceMap;
}
/**
* 根据skill中的audio,audioname,audioname2和player来获取技能台词列表及其对应的源文件名
* @param { string } skill 技能名
* @param { Player | Object | string } [player] 角色/角色名
* @param { skillInfo | audioInfo } [skillInfo] 预设的skillInfo/audioInfo(转为skillInfo)覆盖lib.skill[skill]
* @returns { Object } 语音地址列表
*/
parseSkillTextMap(skill, player, skillInfo) {
const audios = game.parseSkillAudio(skill, player, skillInfo, true);
const voiceMap = {};
audios.forEach(audioname => {
const voiceText = lib.translate[`#${audioname}`];
if (voiceText) voiceMap[audioname] = voiceText;
});
return voiceMap;
}
/**
*
* @param { string } skill