Skip to content

Formato FPG

Vii edited this page Mar 11, 2022 · 4 revisions

El formato FPG (Fichero Para Gráficos), como su nombre indica es un contenedor para almacenar múltiples gráficos en un solo archivo. Internamente todos los gráficos se almacenan en un formato similar al formato MAP, por lo que hereda sus mismas características, incluyendo la posibilidad de incluir una descripción y puntos de control.

Una limitación importante es que todos los gráficos dentro de un FPG deben compartir la misma paleta de color. Esto es más que nada por comodidad y simplicidad ya que, puesto que durante la ejecución del juego sólo podemos tener una paleta activa a la vez, al dibujar varios gráficos en pantalla sabremos que se dibujan con los colores correctos si todos provienen de un mismo FPG.

Al igual que el formato MAP, el formato FPG está limitado a 256 colores (como el propio DIV) y no utiliza ningún sistema para comprimir los datos. Existen variantes del formato FPG que permiten mayor densidad de color y compresión sin pérdida, usadas en otros entornos como Fenix o BennuGD, pero actualmente DIV no los soporta.

Cabecera

struct fpg_header {
    char    magic[7];   // "fpg\x1A\x0D\x0A\0"
    byte    version;    // 0
};

La cabecera de los FPG no puede ser más sencilla. Tan sólo incluye la habitual cadena de identificación y un byte indicando el número de versión, que debe aumentarse siempre que se incluyan cambios en el formato que rompan la compatibilidad con la versión anterior.

Paleta

Los datos de la paleta de color tienen exactamente la misma estructura que la descrita en los ficheros PAL. Diríjase al artículo del formato PAL para más detalles.

struct pal_rgb {
    byte    r, g, b;    // 0..63
};

enum range_type {
    DIRECT  = 0,    // Directa de paleta
    EDIT1   = 1,    // Editable cada color
    EDIT2   = 2,    // Editable cada 2 colores
    EDIT4   = 4,    // Editable cada 4 colores
    EDIT8   = 8     // Editable cada 8 colores
};

struct pal_range {
    byte        n_colors;   // 8, 16 o 32
    range_type  type;
    byte        fixed;      // 0=editable, 1=fija
    byte        black;      // color negro?? (suele ser 0)
    byte        colors[32]; // colores de la gama
};

struct fpg_palette {
    pal_rgb     colors[256];    // Colores de la paleta
    pal_range   ranges[16];     // Gamas de color
};

Mapas

A continuación nos encontramos en secuencia toda la información de los gráficos, cada uno formado por una cabecera, la lista de puntos de control (si existe) y el mapa de bits en sí. Nótese que esta cabecera guarda similitudes con la del formato MAP pero tiene algunas diferencias importantes.

struct map_cpoint {
    short x, y;
};

struct fpg_map {
    int         code;                   // Código identificador (1..999)
    int         length;                 // Longitud de la entrada
    char        description[32];
    char        filename[12];
    int         width;
    int         height;
    int         n_cpoints;              // Número de puntos de control
    map_cpoint  cpoints[n_cpoints];     // Puntos de control
    byte        pixels[width*height];   // Mapa de bits
};

Lo primero que nos encontramos es el código identificador. Este es el número con el que accedemos desde el lenguaje a un gráfico determinado (por ejemplo mediante la local graph). El entorno de DIV además muestra los gráficos ordenados según su código. Nótese que dentro del fichero los gráficos pueden estar en cualquier orden, no necesariamente ordenados según su código. El código debe estar comprendido entre 1 y 999 inclusive, y no puede haber dos gráficos con el mismo código.

El siguiente campo indica la longitud en bytes de la entrada, es decir, de los datos del gráfico en el fichero, incluyendo su cabecera y su mapa de bits. Normalmente debería corresponderse con la fórmula 64 + (4 * n_cpoints) + (width * height). Es importante que este campo se rellene correctamente ya que de lo contrario DIV no podrá leer el fichero. La razón de que esté ahí es para ganar en rendimiento, ya que, cuando no interesa cargar un FPG entero en memoria, DIV recorre el fichero de inicio a fin para buscar un gráfico concreto. Cuando lee un código que no le interesa, lee el campo length para saber cuántos bytes debe saltarse para leer en el fichero el siguiente código.

NOTA: Fenix lee y escribe los FPG de forma diferente, ignorando completamente el campo length y rellenándolo con datos aleatorios. Por eso, es muy posible que FPGs creados con Fenix (y derivados) y herramientas pensadas para Fenix no puedan leerse desde DIV Games Studio. Estos ficheros requieren que se corrijan sus campos length para que DIV pueda leerlos.

El campo description es el que se usa para mostrar la descripción del gráfico en el entorno de DIV. Si el gráfico se importa desde un fichero MAP, por defecto se usará la misma descripción que éste contenga en su cabecera.

El campo filename contiene, si aplica, el nombre del fichero original desde el que se importó el gráfico. Cuando se extrae un gráfico desde un FPG, por defecto se le dará el nombre de fichero que contenga este campo.

El resto de campos son equivalentes a los correspondientes del formato MAP.

Clone this wiki locally