From 40dfb97076f95e5170d2d7d07822d198376f2cc5 Mon Sep 17 00:00:00 2001 From: Spmario233 Date: Sun, 5 May 2024 01:34:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0game.parseDieTextMap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- noname/game/index.js | 55 +++++++++++++++++++++++++++++ noname/library/element/character.js | 14 ++++++++ noname/library/element/content.js | 34 ++++-------------- 3 files changed, 75 insertions(+), 28 deletions(-) diff --git a/noname/game/index.js b/noname/game/index.js index 13c0d8608..8b804ee30 100644 --- a/noname/game/index.js +++ b/noname/game/index.js @@ -1580,6 +1580,61 @@ export class Game { return getAudioList(skill, { audioname: [], history: [] }, skillInfo); } + /** + * 获取角色死亡时能播放的所有阵亡语音 + * @param { string | Player } player 角色名 + * @returns { any[] } 语音地址列表 + */ + parseDieTextMap(player){ + let name, rawName; + if (typeof player === "string") { + name = player; + rawName = name; + } + else if (get.itemtype(player) === "player") { + // @ts-ignore + name = player.skin.name || player.name; + rawName = player.name; + } + const info = get.character(name), datas = []; + let dieAudios; + if(info && info.dieAudios.length > 0){ + dieAudios = info.dieAudios; + } + //@mengxinzxz写的屎山 + else if(rawName !== name && lib.characterSubstitute[rawName] && lib.characterSubstitute[rawName].some((i) => i[0] == name)){ + const trashes = lib.characterSubstitute[rawName].find((i) => i[0] == name)[1]; + const newCharacter = get.convertedCharacter(['','',0,[],trashes]); + dieAudios = newCharacter.dieAudios; + } + if(dieAudios && dieAudios.length > 0){ + dieAudios.forEach(item => { + let key, file; + if(item.startsWith("ext:")){ + const audioData = item.split(":"); + key = audioData[2]; + file = item; + } + else { + key = item; + file = `die/${item}.mp3`; + } + const data = {key, file} + if(lib.translate[`#${key}:die`]) data.text = lib.translate[`#${key}:die`]; + datas.push(data); + }); + } + else { + const data = { + key: name, + file: `die/${name}.mp3`, + isDefault: true, + } + if(lib.translate[`#${name}:die`]) data.text = lib.translate[`#${name}:die`]; + datas.push(data); + } + return datas; + } /** * * @param { string } skill diff --git a/noname/library/element/character.js b/noname/library/element/character.js index cd9b9eba8..085de4def 100644 --- a/noname/library/element/character.js +++ b/noname/library/element/character.js @@ -145,6 +145,11 @@ export class Character { * @type { string[] } **/ clans = []; + /** + * 武将牌拥有的全部阵亡语音 + * @type { string[] } + **/ + dieAudios = []; /** * 武将牌“无法享受到的主公/地主红利” * @type { string[] } @@ -191,6 +196,7 @@ export class Character { this.clans = []; this.initFilters = []; this.trashBin = []; + this.dieAudios = []; } /** * @param { any[] } trash @@ -248,6 +254,10 @@ export class Character { clans.push(item.slice(5)); } else if (item.startsWith("InitFilter:")) { this.initFilters = item.slice(11).split(":"); + } else if (item.startsWith("die:")){ + this.dieAudios.push(item.slice(4)); + } else if (item.startsWith("die_audio:")){ + this.dieAudios = item.slice(10).split(":"); } else { keptTrashes.push(item); } @@ -369,6 +379,10 @@ export class Character { if (character.initFilters.length > 0) { trashes.push(`InitFilters:${character.initFilters.join(":")}`); } + if (character.dieAudios.length > 0) { + if (character.dieAudios.length === 1) trashes.push(`die:${character.dieAudios[0]}`) + else trashes.push(`die_audio:${character.dieAudios.join(":")}`); + } return new Proxy(trashes.concat(character.trashBin), { set(target, prop, newValue) { diff --git a/noname/library/element/content.js b/noname/library/element/content.js index 5eb0e0dbb..cdba51a66 100644 --- a/noname/library/element/content.js +++ b/noname/library/element/content.js @@ -8786,38 +8786,16 @@ export const Content = { _status.dying.remove(player); if (lib.config.background_speak) { - const name = player.skin.name || player.name; - const goon = !lib.character[name]; - if (goon) - lib.character[name] = [ - "", - "", - 0, - [], - ((lib.characterSubstitute[player.name] || []).find((i) => i[0] == name) || [ - name, - [], - ])[1], - ]; - if (lib.character[name][4].some((tag) => /^die:.+$/.test(tag))) { - var tag = lib.character[name][4].find((tag) => /^die:.+$/.test(tag)); - var reg = new RegExp("^ext:(.+)?/"); - var match = tag.match(/^die:(.+)$/); - if (match) { - var path = match[1]; - if (reg.test(path)) path = path.replace(reg, (_o, p) => `../extension/${p}/`); - game.playAudio(path); - } - } else if (lib.character[name][4].some((tag) => tag.startsWith("die_audio"))) { - var tag = lib.character[name][4].find((tag) => tag.startsWith("die_audio")); - var list = tag.split(":").slice(1); - game.playAudio("die", list.length ? list.randomGet() : name); - } else { + const audios = game.parseDieTextMap(player).randomGet(); + if (audios.isDefault) { + const name = audios.key; game.playAudio("die", name, function () { game.playAudio("die", name.slice(name.indexOf("_") + 1)); }); } - if (goon) delete lib.character[name]; + else{ + game.playAudio(audios.file); + } } }, player);