-
Notifications
You must be signed in to change notification settings - Fork 4
Formato FPG
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.
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.
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
};
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.