The wiki has been upgraded to MediaWiki 1.43. The wiki's theme is still being adapted to work with the new version, and may appear broken for the time being. --RanAS

es/Dynamic Xtreme files and formats

From SnesLab
Jump to: navigation, search
English Português Español 日本語

Dynamic Xtreme utiliza un sistema de archivos propio y bien estructurado que permite al usuario tener un control preciso y flexible sobre los recursos, efectos y datos que se usan durante la ejecución del juego.

Esta página documenta los diferentes tipos de archivos que maneja la herramienta, cómo funcionan, su propósito y los formatos específicos que utilizan (tanto los actuales como los legacy). Entender esta estructura es fundamental para aprovechar al máximo las capacidades de Dynamic Xtreme.

Muchos de los formatos legacy presentes en Dynamic Xtreme provienen originalmente de Dynamic X, la versión antigua sobre la cual evolucionó el proyecto. Estos formatos continúan siendo totalmente compatibles con el objetivo de mantener soporte para una gran cantidad de recursos ya existentes desarrollados para Dynamic X.

A continuación se detallan los principales tipos de archivos y sus formatos:

Tipos de Archivos

Dynamic Xtreme utiliza varios tipos de archivos especializados. A continuación se describen los principales:

  • Recursos Dinámicos: Son recursos que se guardan en el ROM de forma descomprimida. Normalmente se usan para sprites dinámicos, cambios de gráficos, cambios de tilemaps o cambios de paletas.
  • Palette Effects (*.paleffect): Son archivos utilizados para registrar efectos de paletas de colores.
  • Dynamic Info (*.dynamicinfo): Son archivos que se usan para incluir recursos dinámicos en el ROM y también generar la data relevante para los sprites dinámicos.
  • Draw Info (*.drawinfo): Son archivos utilizados para generar las poses (cuadros de animación) para los sprites y luego poder dibujarlas en pantalla.

Inclusión de archivos desde PIXI y UberASMTool

Los recursos de PIXI y UberASMTool pueden declarar los archivos que utilizan mediante comentarios especiales dentro de su ASM principal:

;#incdyn  "ruta/al/recurso.dynamicinfo"
;#incdri  "ruta/al/recurso.drawinfo"
;#incpale "ruta/al/recurso.paleffect"

Cada directiva registra un tipo de archivo diferente:

  • ;#incdyn incluye un archivo *.dynamicinfo.
  • ;#incdri incluye un archivo *.drawinfo.
  • ;#incpale incluye un archivo *.paleffect.

Las rutas son relativas al ASM principal que contiene la directiva. Los archivos incluidos pueden encontrarse en la misma carpeta o en cualquiera de sus subcarpetas.

Dynamic Xtreme busca estas directivas únicamente en los ASM principales registrados en las listas de PIXI y UberASMTool. No sigue archivos cargados mediante incsrc.

Los recursos internos de un *.dynamicinfo o *.paleffect incluido de esta forma utilizan como base la carpeta donde se encuentra su archivo de definición.

Recursos Dinámicos

Los Recursos Dinámicos son uno de los sistemas centrales de Dynamic Xtreme. Estos recursos se almacenan en el ROM de forma descomprimida, lo que permite cargarlos y utilizarlos rápidamente durante la ejecución del juego.

¿Cómo funciona el sistema?

Dynamic Xtreme recopila todos los recursos dinámicos, los organiza en paquetes de máximo 1 bank (32 O 64 KB) y los inserta automáticamente en el ROM. Si el ROM tiene hi-banks disponibles, el tool prioriza estos bancos para la inserción, mejorando la organización del espacio.

No existe una limitación estricta sobre el tipo de datos que se pueden insertar, aunque la mayoría de los archivos suelen ser de tipo "*.bin".

Usos principales

Los recursos dinámicos se utilizan comúnmente para:

  • Gráficos: Gráficos de sprites dinámicos o reemplazos gráficos en tiempo real.
  • Tilemaps: Reemplazar tiles de los diferentes layers del nivel.
  • Paletas de colores: Reemplazar paletas completas o asignar paletas específicas a sprites dinámicos.
  • Otros: Cualquier tipo de información que se desee almacenar en el ROM, como muestras de audio .brr, tablas de datos, etc.

Esto hace que el sistema sea extremadamente flexible, permitiendo no solo usos gráficos sino también cualquier otro tipo de dato que el usuario necesite tener disponible en el ROM de forma rápida.

Archivos de Paletas de colores

Actualmente, la mejor forma de guardar archivos de paletas de colores es utilizando archivos binarios (*.bin) donde cada color ocupa 2 bytes siguiendo el formato de color utilizado por el SNES. Existen herramientas que facilitan este proceso, como Pal2Bin.

Para entender esto, es importante considerar que el formato de color del SNES es BGR555. Esto significa que cada color se almacena utilizando 5 bits para azul, 5 bits para verde y 5 bits para rojo.

Conceptualmente, los bits se organizan así:

-BBBBB GGGGG RRRRR

Sin embargo, debido al endian utilizado por el SNES, los bytes deben almacenarse invertidos en memoria, por lo que internamente terminan organizados así:

GGG RRRRR -BBBBB GG

Debido a que este formato puede resultar confuso para usuarios no familiarizados con hardware del SNES, a futuro se planea incorporar soporte mejorado para archivos *.pal, los cuales son mucho más conocidos y utilizados en herramientas gráficas modernas.

En el caso de las paletas utilizadas por sprites dinámicos, estas deben contener un máximo de 15 colores. Esto significa que únicamente deben incluirse los colores 1 al 15 de la paleta correspondiente, ya que el color 0 es utilizado como transparencia.

Gráficos para sprites dinámicos

Los gráficos de un sprite dinámico se dividen en poses. Cada pose contiene los tiles que deben cargarse en VRAM para mostrar un cuadro de animación.

Dynamic Xtreme admite dos formas de organizar estos gráficos:

  • El formato actual, recomendado para recursos nuevos.
  • El formato legacy, conservado para mantener compatibilidad con

recursos creados para Dynamic X.

Ambos formatos producen el mismo resultado dentro del juego. La diferencia se encuentra únicamente en cómo deben organizarse los gráficos dentro del archivo.

Formato actual

En el formato actual, los gráficos se organizan utilizando espacios de 16x16 píxeles.

Los tiles de cada pose se colocan de forma consecutiva. Después de los gráficos de una pose comienzan los gráficos de la siguiente.

El autor decide el orden de los tiles de cada pose en el archivo de gráficos. El DynamicInfo indica cuántos tiles pertenecen a cada pose, y el DrawInfo indica dónde se dibuja cada uno. Ambos deben corresponder con la organización de los gráficos.

Por ejemplo, una pose de 32x32 píxeles normalmente utiliza cuatro tiles de 16x16:

La cantidad de tiles utilizada por cada pose se declara dentro del archivo *.dynamicinfo mediante NumberOf16x16TilesPerPose.

Dynamic Xtreme reorganiza automáticamente estos gráficos al formato interno utilizado para realizar las transferencias DMA. Por esta razón, el autor del recurso no necesita preparar manualmente el layout utilizado en VRAM.

Este es el formato recomendado para crear recursos nuevos.

Si el último tile de 16×16 solo se utiliza parcialmente, puedes indicar qué partes conservar mediante q, h o q3. Los gráficos se preparan con el espacio completo de 16×16; Dynamic Xtreme conserva las partes indicadas y descarta las restantes al procesar el recurso.

Cada celda de las siguientes tablas representa un tile de 8×8. La tabla completa representa el último tile de 16×16 de la pose. El verde indica las partes utilizadas y el gris las que se descartan.

q
Mitad izquierda Mitad derecha
Mitad superior Tile de 8×8 superior izquierdo: usado Tile de 8×8 superior derecho: no utilizado
Mitad inferior Tile de 8×8 inferior izquierdo: no utilizado Tile de 8×8 inferior derecho: no utilizado
h
Mitad izquierda Mitad derecha
Mitad superior Tile de 8×8 superior izquierdo: usado Tile de 8×8 superior derecho: usado
Mitad inferior Tile de 8×8 inferior izquierdo: no utilizado Tile de 8×8 inferior derecho: no utilizado
q3
Mitad izquierda Mitad derecha
Mitad superior Tile de 8×8 superior izquierdo: usado Tile de 8×8 superior derecho: usado
Mitad inferior Tile de 8×8 inferior izquierdo: usado Tile de 8×8 inferior derecho: no utilizado

Formato legacy

El formato legacy requiere que los gráficos ya se encuentren organizados según los bloques que serán transferidos mediante DMA.

Para una pose que utiliza siete tiles de 16x16 o menos, cada tile debe separarse en dos mitades de 16x8. Primero se almacenan todas las mitades superiores y después todas las mitades inferiores.

Por ejemplo, una pose formada por cuatro tiles:

t1 t2 t3 t4

debe almacenarse de esta manera:

t1th t2th t3th t4th t1bh t2bh t3bh t4bh

Donde:

  • th representa la mitad superior del tile.
  • bh representa la mitad inferior del tile.

Cuando una pose contiene ocho tiles de 16x16 o más, cada fila completa de ocho tiles puede almacenarse directamente. Los tiles restantes se organizan utilizando el sistema de mitades explicado anteriormente.

La distribución de cada pose se declara mediante PosesChunksSizes dentro del archivo *.dynamicinfo.

Este formato ofrece control directo sobre la organización interna, pero es más difícil de preparar y mantener. Se recomienda principalmente para recursos antiguos o casos avanzados.

Efectos de Paletas

Los archivos de Efectos de paletas se almacenan dentro de la carpeta PaletteEffects y utilizan la extensión "*.paleffect".

Los efectos de paleta permiten realizar modificaciones de colores en tiempo real sobre las paletas utilizadas por el juego. Estos efectos pueden ser utilizados por el sistema global de efectos de paleta de Dynamic Xtreme.

El efecto global afecta a todos los colores de cada paleta habilitada para recibirlo. Del mismo modo, un efecto aplicado a un sprite completo afecta a toda la paleta del sprite. Estos sistemas no permiten seleccionar colores individuales dentro de una paleta.

Si necesitas aplicar un efecto solo a colores específicos, debes hacerlo manualmente mediante las macros y rutinas descritas en la API ASM de Dynamic Xtreme.

Internamente, estos sistemas funcionan modificando los canales RGB o HSL de los colores de la paleta para producir distintos efectos visuales.

Algunos usos comunes incluyen:

  • Transiciones de día a noche.
  • Flashes rojos para indicar peligro.
  • Efectos cyan intermitentes para objetos a punto de explotar.
  • Cambios de tinte para efectos tipo discoteca.
  • Transiciones suaves entre estados visuales.
  • Efectos de iluminación o ambientación.

El sistema permite una gran cantidad de combinaciones y efectos distintos.

Tipos de efectos

Actualmente existen los siguientes efectos:

  • MixRGB (ID 0): Interpola los canales RGB con un color base.
  • MixHSL (ID 1): Interpola los canales HSL con un color base.
  • MixRG (ID 2): Interpola únicamente R y G.
  • MixHS (ID 3): Interpola únicamente H y S.
  • MixRB (ID 4): Interpola únicamente R y B.
  • MixHL (ID 5): Interpola únicamente H y L.
  • MixGB (ID 6): Interpola únicamente G y B.
  • MixSL (ID 7): Interpola únicamente S y L.
  • MixR (ID 8): Interpola únicamente el canal R.
  • MixH (ID 9): Interpola únicamente el canal H.
  • MixG (ID 10): Interpola únicamente el canal G.
  • MixS (ID 11): Interpola únicamente el canal S.
  • MixB (ID 12): Interpola únicamente el canal B.
  • MixL (ID 13): Interpola únicamente el canal L.
  • PalTransitionRGB (ID 14): Interpola una paleta completa hacia otra utilizando canales RGB.
  • PalTransitionHSL (ID 15): Interpola una paleta completa hacia otra utilizando canales HSL.
  • PalFunctionRGB (ID 16): Aplica una transformación lineal sobre los canales RGB:
    • R = R11*R + R12*G + R13*B
    • G = R21*R + R22*G + R23*B
    • B = R31*R + R32*G + R33*B
    Donde:
    • RXY Son ratios
    • R Corresponde al canal rojo
    • G Corresponde al canal verde
    • B Corresponde al canal azul
    Nota: Este efecto aún no se encuentra implementado.
  • PalFunctionHSL (ID 17): Aplica una transformación lineal sobre los canales HSL:
    • H = R11*H + R12*S + R13*L
    • S = R21*H + R22*S + R23*L
    • L = R31*H + R32*S + R33*L
    Donde:
    • RXY Son ratios.
    • H Corresponde al tinte (Hue).
    • S Corresponde a la saturación.
    • L Corresponde al brillo (Lightness).
    Nota: Este efecto aún no se encuentra implementado.

Formato de archivos

Los efectos de paleta utilizan un formato basado en JSON:

{
  "Effects": []
}

Donde:

  • Effects: Contiene la lista de efectos utilizados.
Formato simple

El formato simple define un único efecto:

{
  "Channel1": 31,
  "Channel2": 0,
  "Channel3": 0,
  "Ratio1": 64,
  "Ratio2": 64,
  "Ratio3": 64,
  "EffectType": 0
}

Donde:

  • Channel1, Channel2, Channel3 corresponden a los valores de canales principales
    • En efectos RGB:
      • 1 = R
      • 2 = G
      • 3 = B
    • En efectos HSL:
      • 1 = H
      • 2 = S
      • 3 = L
  • Ratio1, Ratio2 y Ratio3 son factores de interpolación: se utilizan para calcular cuánto influye el efecto en cada canal. Sus valores van de 0 (influencia mínima) a 127 (influencia máxima).
  • EffectType corresponde al ID del efecto utilizado.

Por ejemplo, el MixRGB anterior mezcla los colores originales con rojo: Channel1 = 31, Channel2 = 0 y Channel3 = 0. Con los tres ratios en 64, el resultado queda aproximadamente a mitad de camino entre cada color original y ese rojo. Así, un color negro se convierte en un rojo de intensidad media. Al aumentar los ratios, el resultado se acerca más al rojo indicado.

Transiciones de paleta

Los efectos PalTransitionRGB y PalTransitionHSL permiten interpolar los colores de una paleta hacia otra.

A diferencia de los efectos de mezcla normales, estos efectos utilizan el campo Palette para indicar la paleta objetivo:

{
  "Palette": "Palettes/NightPalette.bin",
  "Ratio1": 64,
  "Ratio2": 64,
  "Ratio3": 64,
  "EffectType": 14
}

En este ejemplo se utiliza PalTransitionRGB, cuyo ID es 14. Para realizar la transición en HSL debe utilizarse PalTransitionHSL, cuyo ID es 15.

El archivo indicado en Palette debe contener colores BGR555 de 2 bytes. Dynamic Xtreme convierte automáticamente la paleta al formato interno requerido por el efecto RGB o HSL.

Los valores Ratio1, Ratio2 y Ratio3 controlan la interpolación de sus respectivos canales y deben encontrarse entre 0 y 127.

Cuando el archivo *.paleffect se encuentra en la carpeta tradicional PaletteEffects, la ruta de Palette se resuelve desde DynamicResources.

Cuando el efecto se incluye desde PIXI o UberASMTool mediante ;#incpale, la ruta se resuelve desde la carpeta donde se encuentra el archivo *.paleffect.

Rangos de valores

  • Los valores de canales (Channel) utilizan rangos entre 0 y 31.
  • Los valores de ratios (Ratio) utilizan rangos entre 0 y 127.

DynamicInfo

Los archivos DynamicInfo se almacenan dentro de la carpeta DynamicInfos y utilizan la extensión *.dynamicinfo.

Estos archivos tienen 2 funciones principales:

  • Incluir recursos dinámicos dentro del ROM.
  • Definir qué gráficos corresponden a sprites dinámicos y cómo debe cargarse cada pose.

La estructura básica de un archivo `DynamicInfo` es la siguiente:

PosesGraphics:
    MyGraphics.bin
    AnotherGraphics.bin

Palettes:
    MyPal.bin
    AnotherPal.bin

Resources:
    MyResource.bin
    AnotherResource.bin

Estas secciones funcionan como listas de recursos dinámicos que serán incluidos por Dynamic Xtreme.

La base de las rutas depende de cómo se registre el archivo DynamicInfo:

Método Desde dónde se buscan los archivos de PosesGraphics, Palettes y Resources
Carpetas tradicionales: DynamicInfo dentro de DynamicInfos Las rutas son relativas a la carpeta DynamicResources, junto al ejecutable de Dynamic Xtreme.
Inclusión mediante ;#incdyn Las rutas son relativas a la carpeta donde se encuentra el archivo *.dynamicinfo incluido.

Por ejemplo, en el método tradicional, Graficos/MyGraphics.bin se busca en DynamicResources/Graficos/MyGraphics.bin, no junto al DynamicInfo.

  • PosesGraphics contiene archivos gráficos para sprites dinámicos. Estos deben utilizar formato *.bin.
  • Palettes contiene archivos de paletas de colores. Actualmente utilizan formato *.bin, aunque a futuro se planea agregar soporte para archivos *.pal.
  • Resources permite incluir recursos dinámicos arbitrarios y no posee restricciones específicas de formato.

En el caso de PosesGraphics, cuando se utilizan múltiples archivos gráficos, todos ellos son combinados internamente en un único gran bloque de gráficos siguiendo el orden en el que fueron declarados.

Posteriormente, cada pose es recortada desde esa data combinada y almacenada dentro del ROM de la forma más conveniente posible para el sistema dinámico.

Debido a esto, no existe una diferencia práctica importante entre:

  • Utilizar un único archivo grande de gráficos.
  • Utilizar múltiples archivos pequeños separados.

Ambos enfoques producirán el mismo resultado interno dentro de Dynamic Xtreme.

Además de estas listas de recursos, los archivos DynamicInfo también contienen la definición de las poses dinámicas utilizadas por el sprite.

La forma en la que estas poses son definidas depende del formato utilizado por el recurso:

  • Formato actual (NumberOf16x16TilesPerPose).
  • Formato legacy (PosesChunksSizes).

Formato Actual

El formato moderno fue diseñado para simplificar la creación y mantenimiento de sprites dinámicos.

En este formato, el usuario únicamente necesita indicar cuántos tiles de 16x16 utiliza cada pose. Dynamic Xtreme se encarga automáticamente de procesar los gráficos y convertirlos internamente al formato optimizado utilizado por el sistema dinámico.

Ejemplo:

NumberOf16x16TilesPerPose:
.Pose0 5
.Pose1 7h
.Pose2..6 4

En este ejemplo:

  • Pose0 utiliza 5 tiles de 16x16.
  • Pose1 utiliza 7 tiles de 16x16 y adicionalmente una mitad superior (16x8).
  • Pose2 hasta Pose6 utilizan 4 tiles de 16x16.

El formato también permite utilizar modificadores para representar tiles parciales:

  • q: Tile 8x8 superior izquierdo.
  • h: Mitad superior (16x8).
  • q3: Mitad superior + tile inferior izquierdo (16x8 + 8x8).

De este modo es posible incluir un tile de 16x16 que contenga gráficos de manera parcial. Estos tiles parciales no permiten todas las combinaciones posibles, debido a que muchas de ellas no son prácticas para el sistema. Únicamente se consideran las configuraciones más comunes y útiles.

Internamente, Dynamic Xtreme transforma automáticamente este formato al formato legacy, ya que dicho formato se encuentra optimizado para realizar transferencias DMA hacia VRAM de manera más eficiente.

Formato Legacy

El formato legacy utiliza una tabla llamada PosesChunksSizes, la cual define manualmente cómo deben organizarse los gráficos dinámicos internamente.

Ejemplo:

PosesChunksSizes:
Pose0_PoseChunksSizes:
    db $02,$02
Pose1_PoseChunksSizes:
    db $02,$02

Cada pose posee una subtabla compuesta por 2 valores.

La idea detrás de estos valores es representar cuántas rutinas DMA serían necesarias para transferir los gráficos de la pose hacia VRAM en condiciones ideales, es decir, asumiendo que el sprite se encuentra alineado al inicio de la sección de sprites de VRAM. En la práctica, en condiciones ideales se necesita 1 o 2 rutinas DMA.

La mayoría de las veces, la primera rutina DMA transfiere una cantidad mayor de datos que la segunda.

Cada uno de los 2 valores representa la cantidad de tiles de 8x8 transferidos por cada rutina DMA.

Por ejemplo:

db $02,$02

Significa:

  • la primera rutina DMA transfiere 2 tiles de 8x8
  • la segunda rutina DMA transfiere otros 2 tiles de 8x8

En casos especiales donde el sprite utiliza una cantidad de tiles de 16x16 que completa filas exactas dentro de VRAM (por ejemplo múltiplos de 8 tiles de 16x16), es posible realizar toda la transferencia utilizando una sola rutina DMA. En esos casos, el segundo valor se define como $00.

Este formato fue reemplazado por el formato actual debido a que resultaba complejo y poco intuitivo para la mayoría de usuarios. Actualmente se recomienda utilizar NumberOf16x16TilesPerPose, aunque el legacy continúa siendo totalmente compatible y sigue ofreciendo mayor flexibilidad para casos avanzados.

DrawInfo

Los archivos DrawInfo se almacenan dentro de la carpeta DrawInfos y utilizan la extensión "*.drawinfo" y contienen la información necesaria para dibujar poses en pantalla.

Internamente, Dynamic Xtreme recopila esta información y genera rutinas gráficas optimizadas automáticamente. Cada rutina gráfica agrupa múltiples poses que comparten características similares y es optimizada específicamente para ese tipo de poses. Esto permite no solo un sistema global de renderizado de poses, sino también un sistema bastante eficiente en una gran cantidad de casos.

Para comprender cómo funcionan los archivos DrawInfo, es necesario entender a grandes rasgos cómo funciona la OAM del SNES.

La OAM es una memoria especial utilizada para almacenar información de sprites. En el caso del SMW, este trabaja utilizando tiles de 8x8 y 16x16.

Cada tile posee los siguientes atributos:

  • TileCode: a veces llamado simplemente Tile, corresponde a un ID interno utilizado por la consola para indicar qué gráfico específico de VRAM debe utilizarse.
    Nota: Cuando se trabaja con sprites dinámicos, los TileCodes deben definirse asumiendo que el sprite fue cargado al inicio de la sección de sprites de VRAM.
    Dynamic Xtreme se encarga automáticamente de ajustar internamente estos valores dependiendo de la posición real donde la pose haya sido cargada en VRAM durante la ejecución.
  • Properties: corresponde a un byte con propiedades especiales del tile. Este byte utiliza el siguiente formato:
    • YXCCPPPT
    Donde:
    • Y: indica si el tile se encuentra flippeado verticalmente.
    • X: indica si el tile se encuentra flippeado horizontalmente.
    • CC: prioridad del tile respecto a los layers (mayor valor = mayor prioridad).
    • PPP: paleta de sprites utilizada (000 => palette 8, 001 => palette 9, ..., 111 => palette F).
    • T: indica qué página gráfica utilizar (0 => SP12, 1 => SP34).

    Nota: Es posible definir Properties generales para todos los tiles de una pose o sprite. Debido a esto, normalmente las properties más importantes dentro de los archivos DrawInfo son Y, X y T, mientras que las propiedades CC y PPP suelen configurarse desde el código que llama al sistema.

    En el caso específico de sprites dinámicos, la property T normalmente no necesita ser configurada manualmente, ya que Dynamic Xtreme detecta automáticamente en qué página gráfica se encuentra la pose y configura este bit de forma automática.
  • Size: define el tamaño del tile:
    • $00: tile pequeño (8x8).
    • $02: tile grande (16x16).

Además, cada tile posee:

  • X displacement (X Offset)
  • Y displacement (Y Offset)

Estos valores permiten mover el tile respecto a la posición base del sprite.

Actualmente, Dynamic Xtreme posee 2 formatos DrawInfo: el formato actual y el formato legacy.

Formato Actual

El formato actual de DrawInfo fue diseñado para mejorar considerablemente la legibilidad y facilidad de mantenimiento de los archivos de dibujo.

A diferencia del formato legacy, este sistema permite:

  • Agrupar múltiples poses.
  • Agrupar rangos de tiles.
  • Utilizar valores por defecto individuales.
  • Omitir subtables innecesarias.
  • Definir valores individuales o listas completas de valores.

Ejemplo:

MyPose_Pose0..4:
.NumberOfTiles: 5
.TileCode2: $02
.TileCode3..4: $04
.Properties: $00,$40,$00,$00,$40
.XOffsets: $00,$10,$F8,$08,$18
.XPivot: $08
.YOffset2..4: $10
.YPivot: $10
.Size0..4: $02

En este ejemplo:

  • MyPose_Pose0..4: Define información compartida para las poses 0 hasta 4 que comparten el nombre "MyPose".
  • .NumberOfTiles: Define que cada pose utiliza 5 tiles.
  • .TileCode2: Modifica el TileCode únicamente del tile 2.
  • .TileCode3..4: Modifica el TileCode de los tiles 3 y 4.
  • .Properties: Define una lista individual de Properties para cada tile.
  • .XOffsets: Define un XOffset individual para cada tile.
  • .YOffset2..4: Modifica el YOffset únicamente de los tiles 2 al 4.
  • .Size0..4: Define el tamaño de los tiles 0 al 4.

Los tiles se numeran desde 0. Por ejemplo, con .NumberOfTiles: 5, los tiles disponibles son del 0 al 4.

Las directivas utilizadas en singular permiten modificar un tile específico o un rango de tiles determinado.

Ejemplos:

.TileCode2: $02
.TileCode3..4: $04
.YOffset1..3: $10

En estos casos:

  • .TileCode2:: Modifica únicamente el tile 2
  • .TileCode3..4: Modifica únicamente los tiles 3 y 4
  • .YOffset1..3: Modifica el YOffset de los tiles 1 al 3

Por otro lado, las directivas en plural permiten definir explícitamente una lista completa de valores para todos los tiles de la pose.

Ejemplos:

.Properties: $00,$40,$00,$00,$40
.XOffsets: $00,$10,$F8,$08,$18

En estos casos:

  • .Properties: define una lista completa de Properties.
  • .XOffsets: define una lista completa de XOffsets.

Esto permite combinar configuraciones generales simples con modificaciones específicas únicamente donde sean necesarias.

Las declaraciones se aplican en el orden en que aparecen. Si varias modifican el mismo atributo de un tile, se utiliza el último valor indicado. Por ejemplo, después de .Properties: $00,$40,$00,$00,$40, puedes escribir .Property2: $80 para cambiar únicamente la propiedad del tile 2 a $80. Si escribes la lista completa después, esa lista reemplazará los valores anteriores de todos los tiles.

Cuando un valor no es definido explícitamente, Dynamic Xtreme utiliza automáticamente valores por defecto:

  • TileCode: $00
  • Property: $00
  • XOffset: $00
  • YOffset: $00
  • Size: $02

A diferencia del formato legacy, estos valores por defecto funcionan de forma individual por tile, permitiendo omitir únicamente la información necesaria sin afectar el resto de la pose.

Los offsets indican dónde se coloca cada tile respecto a la posición del sprite, en píxeles. Sin volteo, se suma XOffset a la posición X del sprite y YOffset a su posición Y. Por ejemplo, un XOffset de $10 coloca el tile 16 píxeles a la derecha; $F8 representa −8 y lo coloca 8 píxeles a la izquierda.

Los valores XPivot y YPivot permiten calcular dónde deben colocarse los tiles al voltear toda la pose horizontal o verticalmente. No giran la pose: se utilizan para reflejar su distribución.

Para el volteo horizontal, el cálculo equivale a estos pasos:

  1. Se toma la posición X del sprite.
  2. Se le suma XPivot.
  3. Se resta el XOffset original del tile, para invertir su desplazamiento.
  4. Si el tile es de 16×16, se restan otros 8 píxeles para ajustar su posición según su tamaño. Para un tile de 8×8 no se hace este ajuste.

Por tanto, la posición X del tile volteado es:

  • Tile de 8×8: X del sprite + XPivot − XOffset.
  • Tile de 16×16: X del sprite + XPivot − XOffset − 8.

Por ejemplo, una pose tiene dos tiles de 16×16 con XOffset de 0 y 16. Si defines .XPivot: $18 (24 en decimal), sus posiciones se intercambian al voltear la pose:

Tile Sin volteo Con volteo horizontal
Primero: XOffset = 0 X del sprite + 0 X del sprite + 24 − 0 − 8 = X del sprite + 16
Segundo: XOffset = 16 X del sprite + 16 X del sprite + 24 − 16 − 8 = X del sprite + 0

Para el volteo vertical se hace el mismo cálculo, usando la posición Y del sprite, YPivot y YOffset.

Estos desplazamientos para el volteo se calculan durante la instalación. Durante el juego, la rutina de dibujo utiliza los que corresponden al volteo solicitado.

Si XPivot no es definido, la pose no será considerada compatible con flip horizontal. Del mismo modo, si YPivot no es definido, la pose no será considerada compatible con flip vertical.

Esto permite que Dynamic Xtreme genere rutinas gráficas más optimizadas cuando estas características no son necesarias, además de reducir ligeramente el espacio utilizado dentro del ROM.

También es posible utilizar:

.IsStatic

Esto indica que las poses definidas deben considerarse poses estáticas en lugar de dinámicas. Por defecto, todas las poses son tratadas como dinámicas.

El formato legacy de DrawInfo continúa siendo totalmente compatible. El formato moderno existe principalmente para simplificar la escritura, lectura y mantenimiento de archivos DrawInfo, manteniendo al mismo tiempo un alto nivel de flexibilidad.

Formato Legacy

El formato legacy de DrawInfo utiliza múltiples tablas separadas para definir cada atributo de los tiles utilizados por una pose.

Este formato fue diseñado siguiendo una estructura similar a la utilizada normalmente al escribir rutinas gráficas manuales para sprites en SNES. La idea original era que las personas que ya estaban acostumbradas a desarrollar sprites de esta forma pudieran trabajar con DrawInfo utilizando una organización familiar y relativamente intuitiva para ese workflow tradicional.

Ejemplo:

Dynamic: 
true

Tiles:
MyPose0_Tiles:
    db $00
MyPose1_Tiles:
    db $00

Properties:
MyPose0_Properties:
    db $00
MyPose1_Properties:
    db $00

XDisplacements:
MyPose0_XDisp:
    db $00
MyPose1_XDisp:
    db $00
MyPose0_XDispFlip:
    db $00
MyPose1_XDispFlip:
    db $00

YDisplacements:
MyPose0_YDisp:
    db $01
MyPose1_YDisp:
    db $01
MyPose0_YDispFlip:
    db $FF
MyPose1_YDispFlip:
    db $FF

Sizes:
MyPose0_Sizes:
    db $02
MyPose1_Sizes:
    db $02

En este formato:

  • Cada atributo utiliza una sección independiente
  • Cada pose requiere una subtabla separada
  • Todos los valores deben escribirse manualmente
  • No existen rangos de tiles ni agrupación de poses

Las tablas principales corresponden a:

  • Tiles: TileCodes
  • Properties: Properties de OAM
  • XDisplacements: Desplazamientos horizontales
  • YDisplacements: Desplazamientos verticales
  • Sizes: Tamaño de los tiles (8x8 o 16x16)

En el caso de XDisplacements y YDisplacements, también es posible definir versiones flippeadas:

  • XDispFlip
  • YDispFlip

Estas tablas permiten especificar manualmente los offsets utilizados cuando una pose es dibujada utilizando flip horizontal o vertical.

La directiva:

Dynamic: true

Indica que las poses deben ser tratadas como poses dinámicas. Si se define como false, las poses serán consideradas estáticas.

Al igual que en el formato moderno, existen valores por defecto automáticos. Si alguna tabla no existe, Dynamic Xtreme asumirá automáticamente los siguientes valores:

  • TileCode: $00
  • Property: $00
  • XOffset: $00
  • YOffset: $00
  • Size: $02

Este formato continúa siendo totalmente compatible con Dynamic Xtreme, aunque actualmente se recomienda utilizar el formato moderno debido a que resulta considerablemente más legible, mantenible y fácil de editar.