From 1f67b90fec06bfb88e1380934f3e54d0f81d2f2e Mon Sep 17 00:00:00 2001 From: Spmario233 Date: Sun, 28 Apr 2024 21:02:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BE=9B=E4=B8=80=E4=B8=AA=E8=AF=AD?= =?UTF-8?q?=E9=9F=B3=E5=8F=B0=E8=AF=8D=E5=86=99=E6=B3=95=E7=9A=84=E8=8C=83?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/key/index.js | 3 ++- character/key/voices.json | 10 +++++++++ noname/game/index.js | 34 ++++++++++++++++++++++++------- noname/ui/click/index.js | 43 ++++++++++++++++++++++++++++++++++++--- 4 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 character/key/voices.json diff --git a/character/key/index.js b/character/key/index.js index c60f12b14..02bb6493b 100644 --- a/character/key/index.js +++ b/character/key/index.js @@ -4,6 +4,7 @@ import cards from "./card.js"; import pinyins from "./pinyin.js"; import skills from "./skill.js"; import translates from "./translate.js"; +import voices from "./voices.json"; game.import("character", function () { return { @@ -98,7 +99,7 @@ game.import("character", function () { }, card: { ...cards }, skill: { ...skills }, - translate: { ...translates }, + translate: { ...translates, ...voices }, pinyins: { ...pinyins }, }; }); diff --git a/character/key/voices.json b/character/key/voices.json new file mode 100644 index 000000000..9ac69dce4 --- /dev/null +++ b/character/key/voices.json @@ -0,0 +1,10 @@ +{ + "#yuri_xingdong1": "では、オペレーション・スターーート!!", + "#yuri_xingdong2": "では、オペレーション・スタート!", + "#yuri_xingdong3": "では、オペレーションスタート!", + "#yuri_xingdong_gain1": "…さすがね、あたしの勘。", + "#yuri_xingdong_gain2": "あたしの予想ではね。", + "#yuri_wangxi1": "賢明ね。これでようやくあなたにも戦線で戦う目的が生まれたってわけね。", + "#yuri_wangxi2": "落ち着いて…ここは地獄なんかじゃないわ。", + "#key_yuri:die": "ひどい…リーダーね。" +} \ No newline at end of file diff --git a/noname/game/index.js b/noname/game/index.js index 5dbc0ac86..a42e73e4b 100644 --- a/noname/game/index.js +++ b/noname/game/index.js @@ -1482,8 +1482,9 @@ export class Game { * @typedef {[string,number]|string|number|boolean} audioInfo * @typedef {{audio: audioInfo, audioname?:string[], audioname2?:{[playerName: string]: audioInfo}}} skillInfo * @param { string } skill 技能名 - * @param { Player | string } [player] 角色/角色名 + * @param { Player | Object | string } [player] 角色/角色名 * @param { skillInfo | audioInfo } [skillInfo] 预设的skillInfo/audioInfo(转为skillInfo),覆盖lib.skill[skill] + * @param { boolean | undefined } [useRawAudio] * @returns { string[] } 语音地址列表 * @example * ```js @@ -1515,7 +1516,7 @@ export class Game { * //如果key中包含发动技能的角色名player,则直接改用info.audioname2[player]来播放语音 * ``` */ - parseSkillAudio(skill, player, skillInfo) { + parseSkillAudio(skill, player, skillInfo, useRawAudio) { if (typeof player === "string") player = { name: player }; else if (typeof player !== "object" || player === null) player = {}; @@ -1527,7 +1528,7 @@ export class Game { if (!history.includes(skill)) return true; if (history[0] === skill) return false; //deadlock - throw new RangeError(`parseSkillAudio: ${skill} in `, history, ` forms a deadlock`); + throw new RangeError(`parseSkillAudio: ${skill} in ${ history }forms a deadlock`); }; const getName = (filter) => { @@ -1538,7 +1539,7 @@ export class Game { if (result) return result; if (!name) return result; if (filter(name)) return name; - let tempname = get.character(name, 4).find((tag) => tag.startsWith("tempname:")); + let tempname = get.character(name).trashBin.find((tag) => tag.startsWith("tempname:")); if (!tempname) return result; tempname = tempname .split(":") @@ -1555,7 +1556,7 @@ export class Game { * @param {skillInfo} [skillInfo] * @returns {string[]} */ - function getAudioList(skill, options, skillInfo) { + function getAudioList(skill, options, skillInfo, useRawAudio) { const info = skillInfo || lib.skill[skill]; if (!info) { console.error(new ReferenceError(`parseSkillAudio: Cannot find ${skill} in lib.skill`)); @@ -1610,7 +1611,7 @@ export class Game { ) format = ".mp3"; if (path && format) return parseAudio(audioInfo, options, [true, 2]); - return [`${path}${audioInfo}${format}`]; + return [useRawAudio ? audioInfo : `${path}${audioInfo}${format}`]; } let _audioname = getName((i) => audioname.includes(i)); @@ -1622,13 +1623,32 @@ export class Game { const audioList = []; list[2] = parseInt(list[2]); for (let i = 1; i <= list[2]; i++) { - audioList.push(`${list[1] || "skill"}/${skill}${_audioname}${i}.${list[3] || "mp3"}`); + if(useRawAudio) audioList.push(`${skill}${_audioname}${i}`); + else audioList.push(`${list[1] || "skill"}/${skill}${_audioname}${i}.${list[3] || "mp3"}`); } return audioList; } return getAudioList(skill, { audioname: [], history: [] }, skillInfo); } + /** + * 根据skill中的audio,audioname,audioname2和player来获取技能台词列表 + * @typedef {[string,number]|string|number|boolean} audioInfo + * @typedef {{audio: audioInfo, audioname?:string[], audioname2?:{[playerName: string]: audioInfo}}} skillInfo + * @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; + } /** * * @param { string } skill diff --git a/noname/ui/click/index.js b/noname/ui/click/index.js index 680635d7a..97c59fd88 100644 --- a/noname/ui/click/index.js +++ b/noname/ui/click/index.js @@ -3494,14 +3494,14 @@ export class Click { } else { // 样式一 //TODO: 这里的数据也暂时没有改成新格式,需要后续的修改 + const nameInfo = get.character(name); const introduction = ui.create.div(".characterintro", uiintro), showCharacterNamePinyin = lib.config.show_characternamepinyin; if (showCharacterNamePinyin != "doNotShow") { const characterIntroTable = ui.create.div(".character-intro-table", introduction), span = document.createElement("span"); span.style.fontWeight = "bold"; - const nameInfo = get.character(name), - exInfo = nameInfo.trashBin, + const exInfo = nameInfo.trashBin, characterName = exInfo && exInfo.includes("ruby") ? lib.translate[name] : get.rawName2(name); span.innerHTML = characterName; @@ -3632,8 +3632,45 @@ export class Click { const htmlParser = document.createElement("body"); htmlParser.innerHTML = get.characterIntro(name); Array.from(htmlParser.childNodes).forEach((value) => introduction.appendChild(value)); + //添加技能语音部分 + const dieAudio = lib.translate[`#${name}:die`]; + const skillAudioMap = new Map(); + nameInfo.skills.forEach(skill => { + const voiceMap = game.parseSkillText(skill, name, null, true); + if(voiceMap.length) skillAudioMap.set(skill, voiceMap); + }); + if (dieAudio || skillAudioMap.size > 0){ + introduction.appendChild(document.createElement("hr")); + const skillNameSpan = document.createElement("span"); + skillNameSpan.innerHTML = `技能台词
`; + introduction.appendChild(skillNameSpan); + + if(skillAudioMap.size > 0){ + skillAudioMap.forEach((texts, skill) => { + const skillNameSpan = document.createElement("span"), skillNameSpanStyle = skillNameSpan.style; + skillNameSpanStyle.fontWeight = "bold"; + skillNameSpan.innerHTML = `
${get.translation(skill)}
`; + introduction.appendChild(skillNameSpan); + texts.forEach((text, index) => { + const skillTextSpan = document.createElement("span"); + skillTextSpan.innerHTML = `${index + 1}. ${text}
`; + introduction.appendChild(skillTextSpan); + }) + }); + } + if(dieAudio){ + const skillNameSpan = document.createElement("span"), skillNameSpanStyle = skillNameSpan.style; + skillNameSpanStyle.fontWeight = "bold"; + skillNameSpan.innerHTML = `
阵亡台词
`; + introduction.appendChild(skillNameSpan); + + const skillTextSpan = document.createElement("span"); + skillTextSpan.innerHTML = `${dieAudio}`; + introduction.appendChild(skillTextSpan); + } + } const introduction2 = ui.create.div(".characterintro.intro2", uiintro); - var list = get.character(name, 3) || []; + var list = get.character(name).skills; var skills = ui.create.div(".characterskill", uiintro); if (lib.config.touchscreen) { lib.setScroll(introduction);