Files
NightSpire/web-next/lib/wow-data.ts
T
Inna 297257b753 Armería/Armory: buscador, ficha de personaje con equipo y visor 3D
Nueva sección Armería (menú Jugadores del header, pública). Migra la idea del
módulo armory de FusionCMS a Next, ajustada al diseño del sitio y en ES/EN.

DATOS (verificado antes de construir): item_template no existe en 3.4.3, pero los
datos de ítem ya están en MySQL (django_wow.item_data, 44.873 filas con nombre
es/en, calidad, item_level, inventory_type y display_id). El equipo del personaje
sale de acore_characters (character_inventory + item_instance, con transmog) y se
resuelve contra item_data en dos pasos (sin joins entre esquemas). lib/armory.ts +
lib/wow-data.ts (razas/clases/slots ES/EN y colores de clase).

RUTAS:
- /armory: buscador con pestañas personajes/ítems/hermandades (SSR por searchParams),
  ítems con tooltip/color/icono de wowhead.
- /armory/character/[guid]: identidad, equipo (tooltips wowhead, color por calidad)
  y visor 3D.
- /armory/guild/[guid]: miembros con enlace a su ficha.

VISOR 3D (components/ArmoryModel3D): usa la librería wow-model-viewer (generateModels)
con jQuery + ZamModelViewer de wowhead cargados bajo demanda, alimentado con
raza+género+display_ids del equipo (transmog si lo hay). Es integración cliente que
depende del CDN de zamimg y NO se puede verificar sin navegador: va todo en try/catch
con temporizador de reserva y aviso si no carga, para no romper la ficha.

Verificado en producción (salvo el render 3D): buscador, ficha con equipo real
(«Camisa de acólito»/«Acolyte's Shirt»), tooltips de wowhead y página de hermandad,
en ES y EN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 14:29:02 +00:00

68 lines
3.0 KiB
TypeScript

// Mapas de datos estáticos de WoW (WotLK 3.4.3): razas, clases, slots de equipo.
// Nombres en ES/EN; el color de clase para la interfaz de la armería.
export const RACES: Record<number, { es: string; en: string; faction: 'alliance' | 'horde' }> = {
1: { es: 'Humano', en: 'Human', faction: 'alliance' },
2: { es: 'Orco', en: 'Orc', faction: 'horde' },
3: { es: 'Enano', en: 'Dwarf', faction: 'alliance' },
4: { es: 'Elfo de la noche', en: 'Night Elf', faction: 'alliance' },
5: { es: 'No-muerto', en: 'Undead', faction: 'horde' },
6: { es: 'Tauren', en: 'Tauren', faction: 'horde' },
7: { es: 'Gnomo', en: 'Gnome', faction: 'alliance' },
8: { es: 'Trol', en: 'Troll', faction: 'horde' },
10: { es: 'Elfo de sangre', en: 'Blood Elf', faction: 'horde' },
11: { es: 'Draenei', en: 'Draenei', faction: 'alliance' },
}
export const CLASSES: Record<number, { es: string; en: string; color: string }> = {
1: { es: 'Guerrero', en: 'Warrior', color: '#C79C6E' },
2: { es: 'Paladín', en: 'Paladin', color: '#F58CBA' },
3: { es: 'Cazador', en: 'Hunter', color: '#ABD473' },
4: { es: 'Pícaro', en: 'Rogue', color: '#FFF569' },
5: { es: 'Sacerdote', en: 'Priest', color: '#FFFFFF' },
6: { es: 'Caballero de la Muerte', en: 'Death Knight', color: '#C41F3B' },
7: { es: 'Chamán', en: 'Shaman', color: '#0070DE' },
8: { es: 'Mago', en: 'Mage', color: '#69CCF0' },
9: { es: 'Brujo', en: 'Warlock', color: '#9482C9' },
11: { es: 'Druida', en: 'Druid', color: '#FF7D0A' },
}
// Slots de equipo 0-18 (EQUIPMENT_SLOT_*). Los que no se muestran (camisa 3, tabardo 18)
// se dejan igual por completitud del modelo 3D.
export const EQUIP_SLOTS: { slot: number; es: string; en: string }[] = [
{ slot: 0, es: 'Cabeza', en: 'Head' },
{ slot: 1, es: 'Cuello', en: 'Neck' },
{ slot: 2, es: 'Hombros', en: 'Shoulders' },
{ slot: 14, es: 'Espalda', en: 'Back' },
{ slot: 4, es: 'Pecho', en: 'Chest' },
{ slot: 3, es: 'Camisa', en: 'Shirt' },
{ slot: 18, es: 'Tabardo', en: 'Tabard' },
{ slot: 8, es: 'Muñecas', en: 'Wrists' },
{ slot: 9, es: 'Manos', en: 'Hands' },
{ slot: 5, es: 'Cintura', en: 'Waist' },
{ slot: 6, es: 'Piernas', en: 'Legs' },
{ slot: 7, es: 'Pies', en: 'Feet' },
{ slot: 10, es: 'Anillo', en: 'Ring' },
{ slot: 11, es: 'Anillo', en: 'Ring' },
{ slot: 12, es: 'Abalorio', en: 'Trinket' },
{ slot: 13, es: 'Abalorio', en: 'Trinket' },
{ slot: 15, es: 'Mano derecha', en: 'Main Hand' },
{ slot: 16, es: 'Mano izquierda', en: 'Off Hand' },
{ slot: 17, es: 'A distancia', en: 'Ranged' },
]
export function raceName(id: number, locale: string): string {
const r = RACES[id]
return r ? (locale === 'en' ? r.en : r.es) : `#${id}`
}
export function className(id: number, locale: string): string {
const c = CLASSES[id]
return c ? (locale === 'en' ? c.en : c.es) : `#${id}`
}
export function classColor(id: number): string {
return CLASSES[id]?.color ?? '#ffffff'
}
export function factionOf(race: number): 'alliance' | 'horde' | null {
return RACES[race]?.faction ?? null
}