Merge pull request #1315 from libccy/die-audio-dev

添加game.parseDieTextMap,将character[4]里的阵亡语音相关屎山规范化
This commit is contained in:
Spmario233 2024-05-05 11:07:39 +08:00 committed by GitHub
commit f1699f7594
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 98 additions and 44 deletions

View File

@ -94,7 +94,9 @@ export default {
"#clanxieshu2": "我有佐国之术,可缚苍龙。",
"#clanbaozu_clan_zhonghui1": "不为刀下脍,且做俎上刀。",
"#clanbaozu_clan_zhonghui2": "吾族恒大,谁敢欺之?",
"#clan_zhonghui:die": "谋事在人,成事在天……",
"#clan_zhonghui:die": "兵来似欲作恶,当云何?",
"#clan_zhonghui2:die": "伯约误我!",
"#clan_zhonghui3:die": "谋事在人,成事在天……",
"#clanjiejian1": "庙胜之策,不临矢石。",
"#clanjiejian2": "王者之兵,有征无战。",
"#clanhuanghan1": "居天子阶下,故诚惶诚恐。",

View File

@ -1580,6 +1580,60 @@ 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:")){
key = item.slice(4).split("/")[1];
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

View File

@ -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) {

View File

@ -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);

View File

@ -3633,21 +3633,23 @@ export class Click {
htmlParser.innerHTML = get.characterIntro(name);
Array.from(htmlParser.childNodes).forEach((value) => introduction.appendChild(value));
//添加技能语音部分
const dieAudio = lib.translate[`#${name}:die`];
const dieAudios = game.parseDieTextMap(name).filter(i => "text" in i);
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){
if (dieAudios.length || skillAudioMap.size > 0) {
introduction.appendChild(document.createElement("hr"));
const skillNameSpan = document.createElement("span");
skillNameSpan.innerHTML = `技能台词<br>`;
introduction.appendChild(skillNameSpan);
if(skillAudioMap.size > 0){
if (skillAudioMap.size > 0) {
const skillNameSpan = document.createElement("span");
skillNameSpan.innerHTML = `技能台词<br>`;
introduction.appendChild(skillNameSpan);
skillAudioMap.forEach((texts, skill) => {
const skillNameSpan = document.createElement("span"), skillNameSpanStyle = skillNameSpan.style;
const skillNameSpan = document.createElement("span"),
skillNameSpanStyle = skillNameSpan.style;
skillNameSpanStyle.fontWeight = "bold";
skillNameSpan.innerHTML = `<br>${get.translation(skill)}<br>`;
introduction.appendChild(skillNameSpan);
@ -3655,18 +3657,22 @@ export class Click {
const skillTextSpan = document.createElement("span");
skillTextSpan.innerHTML = `${index + 1}. ${text}<br>`;
introduction.appendChild(skillTextSpan);
})
});
});
}
if(dieAudio){
const skillNameSpan = document.createElement("span"), skillNameSpanStyle = skillNameSpan.style;
if (dieAudios.length > 0) {
const skillNameSpan = document.createElement("span"),
skillNameSpanStyle = skillNameSpan.style;
skillNameSpanStyle.fontWeight = "bold";
skillNameSpan.innerHTML = `<br>阵亡台词<br>`;
skillNameSpan.innerHTML = `<br>阵亡台词`;
introduction.appendChild(skillNameSpan);
const skillTextSpan = document.createElement("span");
skillTextSpan.innerHTML = `${dieAudio}`;
introduction.appendChild(skillTextSpan);
dieAudios.forEach((item, index) => {
const dieTextSpan = document.createElement("span");
dieTextSpan.innerHTML = `<br>${dieAudios.length > 1 ? `${index + 1}. ` : ""}${item.text}`;
introduction.appendChild(dieTextSpan);
});
}
}
const introduction2 = ui.create.div(".characterintro.intro2", uiintro);