Integración de sistemas nativos
FalcomBGMInfo
La funcionalidad parece pequeña. La superficie de ingeniería no lo es: distintos ejecutables, rutas de audio, arquitecturas de CPU, renderizadores y capas de compatibilidad deben comportarse como un solo producto.
Superficie de compatibilidad
Una función. Una matriz de runtimes.
El overlay visible es la parte más pequeña del producto. El trabajo de ingeniería consiste en preservar un mismo comportamiento entre ejecutables, renderizadores, arquitecturas y entornos incompatibles.
- Renderizado
- DirectX 9 · DirectX 11
- Arquitectura
- x86 · x64
- Entorno
- Windows · Proton
- Integración
- Proxy DLL · hooks nativos · ImGui · YAML
Problema
Los ports antiguos de Falcom para PC no incluyen la notificación discreta de pistas presente en versiones más nuevas. Ningún hook ni ruta de renderizado funciona para todo el catálogo.
Enfoque de ingeniería
- Detectar el título en ejecución y seleccionar en tiempo de ejecución la configuración y los metadatos musicales específicos.
- Soportar DirectX 9 y 11, x86 y x64, carga mediante DLL proxy, detours con MinHook y hooks alternativos específicos por juego.
- Preservar el estado del renderizador al dibujar una notificación ligera con ImGui y metadatos externos en YAML.
- Mantener la instalación compatible con Windows y configuraciones de Steam Deck basadas en Proton.
Resultado
- Un solo proyecto público soporta lanzamientos modernos y retro mediante seis iteraciones publicadas.
- El proyecto demuestra ingeniería de compatibilidad entre sistemas que nunca fueron diseñados para compartir una capa de extensión.
El problema más difícil
Un mismo comportamiento de notificación en diecinueve juegos cuyo único rasgo común es el publisher.
DirectX 9 y 11 gestionan el estado de renderizado de forma distinta, x86 y x64 cambian las convenciones de llamada, y varios juegos no exponen un punto de hook limpio para los cambios de música.
Detectar el título en tiempo de ejecución, cargar un mapa musical y una estrategia de hook por juego, y aislar los backends de renderizado para que el dibujado con ImGui siempre restaure el estado exacto que encontró.
Cómo lo resolví
La instalación es parte de la superficie de compatibilidad. Los jugadores cargan el mod mediante una DLL proxy, winmm, dinput8, version o xinput1_4 según el juego y Proton, así que un nombre que funciona en un título silenciosamente no hace nada en otro. La solución fue tratar la matriz de carga como una función del producto: renombres documentados por juego y por Proton, con Xanadu Next necesitando además su propio wrapper d3d8.
Donde no existe un hook de audio limpio, el mod recurre a hooks específicos elegidos por título, y todos los metadatos musicales viven en YAML externo, así que soportar un juego nuevo rara vez significa recompilar: significa mapearlo.
Tecnologías
- C++17
- DirectX 9
- DirectX 11
- MinHook
- Dear ImGui
- CMake
- YAML
- Win32