aku test2

This commit is contained in:
Akurosia Kamo 2026-05-22 10:49:49 +02:00
parent e2eed52d07
commit 89b4849ed4
3 changed files with 59 additions and 3 deletions

View File

@ -129,6 +129,17 @@ const MITIGATION_ABILITIES = [
'Addle' => ['dr' => 10, 'buffType' => 'debuff', 'statusId' => 1001203],
];
function localizedMitigationName(string $key, string $language, string $fallback): string {
$names = [
'de' => [
'Reprisal' => 'Reflexion',
'Feint' => 'Zermürben',
'Addle' => 'Stumpfsinn',
],
];
return $names[$language][$key] ?? $fallback;
}
function resolveMitigations(string $buffStr, array $mitigIdMap): array {
if ($buffStr === '') return [];
$result = [];
@ -208,6 +219,7 @@ foreach ($abilityNames as $gameId => $name) {
foreach (MITIGATION_ABILITIES as $name => $meta) {
if (isset($meta['statusId']) && !isset($mitigIdMap[$meta['statusId']])) {
$displayName = $abilityNames[(int)$meta['statusId']] ?? $name;
$displayName = localizedMitigationName($name, $language, $displayName);
$mitigIdMap[$meta['statusId']] = array_merge(['key' => $name, 'name' => $displayName], $meta);
}
}

View File

@ -103,6 +103,7 @@ document.addEventListener('DOMContentLoaded', () => {
window.App.language = normalizeLanguage(languageSelect.value);
localStorage.setItem('ff14-mitigator-language', window.App.language);
setUrlState({ language: window.App.language });
window.dispatchEvent(new CustomEvent('ff14-language-change', { detail: { language: window.App.language } }));
if (window.App.reportCode) {
loadReport(window.App.reportCode, window.App.fightId);
}

View File

@ -89,6 +89,30 @@ function fmtNumber(n) {
return Number(n).toLocaleString('de-DE');
}
function currentLanguage() {
return window.App?.language || localStorage.getItem('ff14-mitigator-language') || 'en';
}
const ABILITY_DISPLAY_NAMES = {
de: {
'Addle': 'Stumpfsinn',
'Feint': 'Zermürben',
'Reprisal': 'Reflexion',
'Passage of Arms': 'Waffengang',
'Heart of Light': 'Herz des Lichts',
'Sacred Soil': 'Geweihte Erde',
'Tactician': 'Taktiker',
'Shake It Off': 'Abschütteln',
'Shield Samba': 'Schildsamba',
'Magick Barrier': 'Magiebarriere',
},
};
function localizedAbilityName(key, fallback = key) {
const lang = currentLanguage();
return ABILITY_DISPLAY_NAMES[lang]?.[key] ?? fallback ?? key;
}
// ── Rendering: Plan List ──────────────────────────────────────────────────────
function renderPlanList() {
@ -224,7 +248,8 @@ function renderMechanicList(plan) {
: a.buffType === 'shield' ? 'badge-assign-shield'
: a.buffType === 'buff' ? 'badge-assign-buff'
: '';
const label = a.job ? `${escHtml(a.job)} · ${escHtml(a.ability)}` : escHtml(a.ability);
const ability = localizedAbilityName(a.ability, a.abilityName ?? a.ability);
const label = a.job ? `${escHtml(a.job)} · ${escHtml(ability)}` : escHtml(ability);
return `<span class="badge badge-assign ${cls}">${label}</span>`;
}).join('')
}
@ -366,6 +391,14 @@ function guessJob(abilityName, players) {
return '';
}
function mitigationDisplayName(mitigation) {
return mitigation?.name ?? mitigation?.key ?? '';
}
function mitigationKey(mitigation) {
return mitigation?.key ?? mitigation?.name ?? '';
}
// ── AoE Events → Plan Mechanics ───────────────────────────────────────────────
function aoeEventsToMechanics(aoeEvents, fightStart, phases, players, withMitigations) {
@ -387,10 +420,15 @@ function aoeEventsToMechanics(aoeEvents, fightStart, phases, players, withMitiga
const seen = new Set();
for (const t of ev.targets) {
for (const m of (t.mitigations ?? [])) {
const key = m.key ?? m.name;
const key = mitigationKey(m);
if (!seen.has(key)) {
seen.add(key);
assignments.push({ ability: key, job: guessJob(key, players), buffType: m.buffType ?? '' });
assignments.push({
ability: key,
abilityName: mitigationDisplayName(m),
job: guessJob(key, players),
buffType: m.buffType ?? '',
});
}
}
}
@ -556,3 +594,8 @@ document.addEventListener('DOMContentLoaded', () => {
renderPlanList();
renderPlanDetail(null);
});
window.addEventListener('ff14-language-change', () => {
if (!activePlanId) return;
renderPlanDetail(getPlan(activePlanId));
});