es/Dynamic Xtreme
| English | Português | Español | 日本語 |
Dynamic Xtreme es una herramienta de soporte dinámico avanzada para Super Mario World en el SNES, creada por Anonimzwx y sucesora de Dynamic Z y Dynamic X. Desarrollada para la comunidad de ROM hacking, permite realizar cambios gráficos y de paletas en tiempo real durante la ejecución del juego. La herramienta se centra en ofrecer un sistema completo y flexible de gráficos dinámicos, con énfasis en el rendimiento y la modularidad.
Un sprite dinámico carga recursos, como gráficos o paletas, en tiempo real durante el juego. En cambio, un sprite estático utiliza los recursos que ya estaban cargados al comenzar el nivel.
Dynamic Xtreme no rompe los límites del hardware de SNES: trabaja dentro de ellos y optimiza el uso de la memoria y las transferencias para reducir su impacto y hacer que sean mucho menos perceptibles durante el juego.
Entre sus características principales se incluyen:
- Cambios gráficos y de paleta en tiempo real (on-the-fly).
- El sistema de Dynamic Sprite más potente y flexible disponible para Super Mario World.
- Advanced Drawing System, que permite dibujar cualquier frame registrado en pantalla con control total sobre prioridad, capa, desplazamiento (offset) y propiedades.
- Efectos de paleta avanzados, que incluyen modificación en tiempo real mediante tono (hue), saturación, brillo, fusión de colores, transiciones suaves y control individual de canales RGB y HSL.
- Reemplazo completo de gráficos y paletas del jugador, compatible con cualquier tamaño de Mario, cualquier cantidad de frames y cualquier estilo de animación.
- Reemplazo de gráficos de Yoshi usando un layout como el del juego original.
- Optimizaciones intensivas en el NMI-handler para maximizar el rendimiento.
Las funciones de Dynamic Xtreme se seleccionan durante la instalación para utilizar solo las que necesita el proyecto. Algunas tienen dependencias, problemas de compatibilidad o restricciones para desinstalarlas; revisa las advertencias de cada opción. La herramienta fue creada con el objetivo de facilitar la implementación de efectos visuales complejos en hacks de Super Mario World manteniendo un alto nivel de compatibilidad y estabilidad.
Objetivos del proyecto
El principal objetivo de Dynamic Xtreme es facilitar el uso de sprites dinámicos y ofrecer un soporte completo para cambios de gráficos, paletas y tilemaps en tiempo real.
El proyecto busca aprovechar al máximo el potencial del SNES sin requerir que el usuario tenga conocimientos avanzados sobre el hardware interno de la consola. Muchos sistemas dinámicos tradicionales suelen ser complejos y dependen fuertemente de conceptos técnicos como VRAM, CGRAM, OAM o DMA. Dynamic Xtreme intenta abstraer gran parte de esa complejidad mediante herramientas y formatos más modernos, legibles y fáciles de utilizar.
Otro de los objetivos principales del proyecto es mantener un alto rendimiento incluso en situaciones visualmente complejas, permitiendo el uso intensivo de gráficos dinámicos, efectos de paletas y sistemas avanzados de renderizado sin comprometer innecesariamente la performance.
Además, Dynamic Xtreme busca que los sprites dinámicos puedan utilizarse de una forma tan natural y sencilla como si fueran sprites normales. La idea es que las personas enfocadas en level design o creación de contenido no necesiten preocuparse constantemente por las limitaciones técnicas internas del sistema y puedan trabajar con recursos dinámicos de forma transparente y práctica.
Funcionalidades
Durante la instalación puedes elegir qué funcionalidades habilitar. Los nombres entre paréntesis corresponden a las opciones del instalador y de Settings.json.
Gráficos, poses y paletas
| Funcionalidad | Para qué sirve |
|---|---|
Cambios de gráficos (GraphicsChange) |
Permite cargar gráficos durante el juego. Es la base para las animaciones de tiles, los cambios de gráficos del nivel y las poses dinámicas. |
Cambios de paletas (PalettesChange) |
Permite cargar y administrar paletas durante el juego. Incluye la asignación automática de paletas para que los sprites puedan compartir los mismos colores sin cargarlos varias veces. |
Poses dinámicas (DynamicPoses) |
Administra el espacio de VRAM como una caché de poses: reutiliza las que ya están cargadas, permite compartirlas entre entidades y elige cuáles reemplazar cuando hace falta espacio. Así evita cargas innecesarias. |
Dibujo de poses (DrawingSystem) |
Dibuja las poses definidas en archivos DrawInfo, tanto dinámicas como estáticas. Permite controlar sus tiles, posición, volteo, paleta y prioridad de dibujo. |
Efectos de paleta (PalettesEffects) |
Permite cambiar colores mediante efectos RGB y HSL: teñir paletas, modificar tono, saturación o luminosidad, y realizar transiciones entre paletas. Pueden aplicarse a recursos individuales o como un efecto global. |
La carga de poses dinámicas y el dibujo son sistemas separados: puedes dibujar una pose estática sin cargar sus gráficos dinámicamente.
Jugador y Yoshi
| Funcionalidad | Para qué sirve |
|---|---|
Funciones del jugador (PlayerFeatures) |
Permite cambiar los gráficos y paletas del jugador y adaptar su dibujo y carga de poses a sistemas personalizados. También permite ocultarlo o desactivar sus cargas dinámicas. Puede entrar en conflicto con parches que modifican los gráficos o paletas del jugador; revisa la advertencia del instalador antes de habilitarla. |
Funciones de Yoshi (YoshiFeatures) |
Permite cambiar los gráficos de Yoshi manteniendo la organización de sus poses originales. Requiere PlayerFeatures y comparte sus restricciones de compatibilidad.
|
Memoria y optimizaciones
Estas opciones reorganizan parte del trabajo del juego para dejar más tiempo disponible para las cargas de gráficos y paletas. NMI es la rutina que realiza las actualizaciones de pantalla durante la pausa entre un frame y el siguiente.
| Funcionalidad | Para qué sirve |
|---|---|
Liberar el área $7E2000 (Free7E2000) |
En ROMs sin SA-1, evita mantener en RAM ciertos gráficos originales del jugador, Yoshi y animaciones, y permite leerlos desde ROM. Dynamic Xtreme utiliza el espacio recuperado para sus variables internas; no queda libre para usarlo sin reservar. Esta opción no se aplica a ROMs con SA-1. |
Optimización del control (ControllerOptimization) |
Mueve el procesamiento del control fuera de NMI para dejar más tiempo disponible para las actualizaciones de pantalla. |
Optimización del color fijo (FixedColorOptimization) |
Reduce el trabajo de NMI relacionado con la actualización del color fijo que utiliza el juego para sus mezclas de color. |
Optimización de VRAM de Lunar Magic de Kevin (KevinLMVRAMOptimization) |
Integra la optimización de Kevin para las actualizaciones de VRAM de Lunar Magic y mueve parte de su procesamiento fuera de NMI. Utiliza esta versión en lugar del parche original por separado. Una vez instalada, no debe desinstalarse: hacerlo puede dañar el funcionamiento de la ROM. |
Optimización de la barra de estado (StatusBarOptimization) |
Reduce el trabajo de NMI de la barra de estado original. No es compatible con recursos que la reemplazan o modifican, como barras de estado personalizadas o parches que la eliminan. |
Para revisar qué opciones pueden entrar en conflicto con otros recursos y qué RAM utiliza el sistema, consulta Compatibilidad.
Algunas funcionalidades necesitan otras: DynamicPoses requiere GraphicsChange; PalettesEffects requiere PalettesChange; PlayerFeatures necesita ambas opciones de cambios gráficos y de paletas; y YoshiFeatures requiere PlayerFeatures.
Quick Start
Guía rápida de instalación: Quick Start
Herramientas y Soporte
Pendiente
Archivos y formatos
Artículo relacionado: Archivos y Formatos de Dynamic Xtreme
Guía de creación de sprites dinámicos
Para aprender a preparar, programar, cargar y dibujar un sprite dinámico, consulta la guía de creación de sprites dinámicos con Dynamic Xtreme.
Dynamic Xtreme con UberASM
La guía de Dynamic Xtreme con UberASM muestra cómo reservar paletas, configurar el espacio para sprites dinámicos y el límite de datos por frame, crear animaciones, cambiar gráficos del jugador y aplicar efectos de paleta.
API
La referencia de la API ASM explica cómo utilizar las variables, los defines, las rutinas y las macros de Dynamic Xtreme. Incluye los datos que necesita cada llamada, sus resultados y ejemplos de uso para trabajar con poses, dibujo, paletas, efectos de color y transferencias de gráficos, además de las macros de multiplicación y división.
Funcionamiento interno del sistema
El artículo sobre el funcionamiento interno de Dynamic Xtreme explica cómo se organizan NMI y los game modes, las cargas de gráficos y paletas, el dibujo de poses, las optimizaciones, la caché de poses dinámicas y los efectos de paleta.
Compatibilidad
En general, las funcionalidades que no muestran warnings en el instalador no suelen presentar problemas de incompatibilidad con otros recursos. Estas son:
GraphicsChangePalettesChangeDynamicPosesDrawingSystemPalettesEffectsFree7E2000ControllerOptimizationFixedColorOptimization
Esto no garantiza que cualquier combinación de recursos funcione: dos códigos todavía pueden utilizar la misma RAM, el mismo espacio de VRAM o modificar la misma rutina del juego. Además, YoshiFeatures necesita PlayerFeatures, por lo que también debes considerar las restricciones de esta última.
Funcionalidades con restricciones de compatibilidad
| Funcionalidad opcional | Posibles conflictos y qué hacer |
|---|---|
PlayerFeatures |
Puede entrar en conflicto con LX5's Powerups, Player 8x8 tiles DMAer, Player 32x32 y otros sistemas que reemplazan la carga de gráficos o paletas del jugador. Player Revolution sí es compatible. Si tu sistema de jugador necesita esas rutinas originales, deja esta opción deshabilitada; también tendrás que deshabilitar YoshiFeatures.
|
YoshiFeatures |
Depende de PlayerFeatures y hereda sus restricciones de compatibilidad, aunque no muestre un warning propio. Si otro recurso es incompatible con PlayerFeatures, no puedes evitar ese conflicto habilitando únicamente YoshiFeatures: debes dejar ambas deshabilitadas.
|
StatusBarOptimization |
No es compatible con recursos que modifican, reemplazan o eliminan la barra de estado original, como LX5's DKC Style Status Bar, Minimalistic Status Bar y Nuke Status Bar. Si utilizas uno de ellos, deja esta optimización deshabilitada. |
KevinLMVRAMOptimization |
Integra el parche de optimización de VRAM de Lunar Magic de Kevin: utiliza esta versión en lugar del parche original por separado. Su warning también indica que no debe desinstalarse después de instalarla, porque hacerlo puede romper el funcionamiento de la ROM. Si necesitas revertirla, restaura una copia de seguridad anterior a su instalación. |
Estas funcionalidades son opcionales: puedes dejar deshabilitada la que entra en conflicto y seguir utilizando los demás sistemas de Dynamic Xtreme, respetando sus dependencias. Deshabilitar una opción no deshace los cambios de otro parche ni elimina la restricción de desinstalación de KevinLMVRAMOptimization.
Espacios de RAM utilizados
Las direcciones principales se configuran en ASM/DXDefines.asm, dentro de la carpeta de Dynamic Xtreme. En el repositorio, ese archivo corresponde a DynamicXtremeLibrary/ASM/DXDefines.asm.
El espacio utilizado depende de las funcionalidades habilitadas y de si la ROM utiliza SA-1. Los siguientes rangos incluyen el primer y el último byte y están calculados con todas las funcionalidades que reservan RAM habilitadas, !VRAMTransferSize = 64 y !CGRAMTransferSize = 64:
| Configuración | Bloque !Variables |
Tamaño | Bloque !Variables2 |
Tamaño |
|---|---|---|---|---|
LoROM con Free7E2000 |
$7E2000–$7E2500 |
$0501: 1281 bytes |
$7E2800–$7E3608 |
$0E09: 3593 bytes
|
LoROM sin Free7E2000 |
$7FB440–$7FB940 |
$0501: 1281 bytes |
$7F9C80–$7FAA88 |
$0E09: 3593 bytes
|
| SA-1 | $40C000–$40C47E |
$047F: 1151 bytes |
$418AFF–$419907 |
$0E09: 3593 bytes
|
Los dos bloques internos suman 4874 bytes en LoROM y 4744 bytes en SA-1. La diferencia se debe a los 130 bytes del sistema de dibujo que solo se reservan en LoROM. No se ocupa automáticamente el espacio que queda entre los bloques.
Al deshabilitar una funcionalidad se eliminan sus reservas condicionales y cambian las direcciones posteriores. Aumentar !VRAMTransferSize o !CGRAMTransferSize también aumenta el tamaño de sus tablas.
Tablas utilizadas por los sprites
DX_FreeRams y DX_FreeRams2 no son espacios disponibles para escribir variables propias: a partir de esas posiciones se ubican las tablas de sprites de DynamicXSpritesTables.asm y MoreSpriteMiscs.asm. También debes reservarlas si utilizas esos recursos.
Con la misma configuración de la tabla anterior, sus rangos son:
| Configuración | Tablas desde DX_FreeRams |
Tamaño | Tablas desde DX_FreeRams2 |
Tamaño |
|---|---|---|---|---|
LoROM con Free7E2000 |
$7E2501–$7E26EC |
492 bytes | $7E3609–$7E3824 |
540 bytes |
LoROM sin Free7E2000 |
$7FB941–$7FBB2C |
492 bytes | $7FAC82–$7FAE9D |
540 bytes |
| SA-1 | $40C47F–$40C6D8 |
602 bytes | $419908–$419BCD |
710 bytes |
Incluyendo estas tablas, el espacio descrito suma 5906 bytes en LoROM y 6056 bytes en SA-1. Las tablas se calculan para 12 sprites normales en LoROM y 22 en SA-1, además de los slots de cluster, extended y smoke correspondientes.
Normalmente, DX_FreeRams2 comienza justo después del segundo bloque interno. En LoROM sin Free7E2000 se coloca por separado mediante !Variables3 = $7FAC82; por eso sus tablas no empiezan inmediatamente después de !Variables2.
Dynamic Xtreme también utiliza los espejos existentes del color fijo y de la paleta: $7E0701 (2 bytes) y $7E0703 (512 bytes) en LoROM. En SA-1 sus direcciones declaradas son $406701 y $006703. No son reservas adicionales dentro de los bloques anteriores ni direcciones libres para tus códigos.
Reubicar la RAM si hay un conflicto
Advertencia: para reubicar estas variables debes saber qué dirección elegir y considerar el tamaño completo del espacio de memoria que utiliza el sistema. No basta con que una dirección esté libre: debe haber espacio suficiente y las rutinas deben poder acceder a él. Si no tienes conocimientos sobre esto, consulta con alguien que los tenga antes de modificar las direcciones.
Si otro recurso utiliza alguno de estos espacios, puedes modificar ASM/DXDefines.asm para hacer que Dynamic Xtreme utilice otras zonas disponibles de tu romhack.
- Cambia
!Variablesy!Variables2en la configuración correspondiente a tu ROM: LoROM conFree7E2000, LoROM sin esa opción o SA-1. - En LoROM sin
Free7E2000, revisa también!Variables3, que determina dónde empiezan las tablas deDX_FreeRams2. - Reserva espacio suficiente para el bloque completo y las tablas de sprites que le siguen. No basta con que la primera dirección esté libre.
- Respeta el mapa de memoria y los bancos que necesitan las rutinas. No cualquier dirección libre sirve para cualquier acceso.
- Después de cambiar las direcciones, reinstala Dynamic Xtreme y vuelve a insertar PIXI, UberASM y los demás recursos que utilicen sus defines.
Con Free7E2000, Dynamic Xtreme aprovecha el área de RAM que recupera al reubicar los gráficos originales; no la compartas con otros recursos sin comprobar qué parte utiliza. Sin esa opción, las direcciones alternativas pueden coincidir con las de otros recursos habituales. SA-1 utiliza sus propias direcciones y desactiva Free7E2000.
Modifica el archivo de la carpeta ASM, no las copias generadas en ExtraDefines o Patch/ExtraDefines: esas copias se regeneran durante la instalación.
Recursos hechos con Dynamic Xtreme
La mayoría de los recursos desarrollados para Dynamic Xtreme no suelen publicarse en sitios tradicionales como SMW Central debido a que muchos de ellos dependen directamente del framework y sus sistemas avanzados.
En su lugar, los recursos, ejemplos, sistemas y proyectos relacionados con Dynamic Xtreme se encuentran recopilados principalmente en:
Allí es posible encontrar sprites, sistemas de jugador, efectos gráficos, ejemplos técnicos y otros recursos diseñados específicamente para trabajar con Dynamic Xtreme.
Conclusión
Dynamic Xtreme es un proyecto orientado a modernizar y simplificar el uso de sistemas dinámicos en Super Mario World, ofreciendo herramientas más flexibles, potentes y fáciles de utilizar sin perder compatibilidad ni control avanzado.
El proyecto continúa evolucionando constantemente con nuevas optimizaciones, formatos y herramientas orientadas tanto a usuarios avanzados como a personas que recién comienzan a trabajar con gráficos dinámicos en SNES.
La intención principal de Dynamic Xtreme es permitir la creación de recursos y sistemas cada vez más complejos, manteniendo al mismo tiempo un workflow más limpio, mantenible y accesible para la comunidad.