import type { Locale } from './index'; import { ENEMY_TYPE_LABELS } from './enemyTypeLabels'; /** Stable keys aligned with backend migrations / model constants. */ export const WANDERING_MERCHANT_NPC_KEY = 'npc.wandering_merchant.v1'; export const WANDERING_MERCHANT_DIALOGUE_KEY = 'npc.wandering_merchant.dialogue.v1'; type Bilingual = { en: string; ru: string }; const TOWNS: Record = { 'town.willowdale.v1': { en: 'Willowdale', ru: 'Ивадол' }, 'town.thornwatch.v1': { en: 'Thornwatch', ru: 'Тернозорь' }, 'town.ashengard.v1': { en: 'Ashengard', ru: 'Пепельный гард' }, 'town.redcliff.v1': { en: 'Redcliff', ru: 'Красная скала' }, 'town.boghollow.v1': { en: 'Boghollow', ru: 'Торфяная низина' }, 'town.cinderkeep.v1': { en: 'Cinderkeep', ru: 'Зола-крепость' }, 'town.starfall.v1': { en: 'Starfall', ru: 'Звездопад' }, 'town.mossharbor.v1': { en: 'Mossharbor', ru: 'Мшистая гавань' }, 'town.emberwell.v1': { en: 'Emberwell', ru: 'Угольный колодец' }, 'town.frostmark.v1': { en: 'Frostmark', ru: 'Морозная метка' }, 'town.duskwatch.v1': { en: 'Duskwatch', ru: 'Сумеречный дозор' }, }; const NPCS: Record = { 'npc.elder_maren.v1': { en: 'Elder Maren', ru: 'Старейшина Марен' }, 'npc.peddler_finn.v1': { en: 'Peddler Finn', ru: 'Бродячий торговец Финн' }, 'npc.sister_asha.v1': { en: 'Sister Asha', ru: 'Сестра Аша' }, 'npc.guard_halric.v1': { en: 'Guard Halric', ru: 'Страж Халрик' }, 'npc.trader_wynn.v1': { en: 'Trader Wynn', ru: 'Торговец Винн' }, 'npc.scholar_orin.v1': { en: 'Scholar Orin', ru: 'Учёный Орин' }, 'npc.bone_merchant.v1': { en: 'Bone Merchant', ru: 'Торговец костями' }, 'npc.priestess_liora.v1': { en: 'Priestess Liora', ru: 'Жрица Лиора' }, [WANDERING_MERCHANT_NPC_KEY]: { en: 'Wandering Merchant', ru: 'Бродячий торговец' }, }; const DIALOGUES: Record = { [WANDERING_MERCHANT_DIALOGUE_KEY]: { en: 'A hooded merchant blocks your path, jingling a pouch of odd trinkets.', ru: 'В капюшоне торговец преграждает путь, звеня мешочком с безделушками.', }, }; function pick(locale: Locale, b: Bilingual): string { return locale === 'ru' ? b.ru : b.en; } export function townLabel(locale: Locale, key: string | undefined, fallback: string): string { if (!key) return fallback; const b = TOWNS[key]; return b ? pick(locale, b) : fallback; } export function npcLabel(locale: Locale, key: string | undefined, fallback: string): string { if (!key) return fallback; const b = NPCS[key]; return b ? pick(locale, b) : fallback; } export function dialogueText(locale: Locale, key: string | undefined, fallback: string): string { if (!key) return fallback; const b = DIALOGUES[key]; return b ? pick(locale, b) : fallback; } /** * Display name for an enemy template: optional i18n by `enemies.type`, else DB name, else slug. * @param enemyTypeSlug - value of `enemies.type` / API `enemy.type` * @param dbName - `enemies.name` from API (English); used when no entry in ENEMY_TYPE_LABELS */ export function enemyFamilyLabel(locale: Locale, enemyTypeSlug: string, dbName: string): string { const slug = enemyTypeSlug?.trim() ?? ''; const b = slug && slug in ENEMY_TYPE_LABELS ? ENEMY_TYPE_LABELS[slug] : undefined; if (b) return pick(locale, b); const name = dbName?.trim(); if (name) return name; return slug || dbName; }