Especificación del formato FPG

Esta sección describe el contenido de un fichero FPG. No es necesario conocer
estos detalles simplemente para programar juegos, pero serán de utilidad a
quien quiera realizar utilidades en lenguajes externos que lean o escriban
ficheros FPG.

Un fichero FPG no incluye compresión. Fenix soporta de forma transparente el
uso de compresión GZIP en los ficheros, sin necesidad de marcarlos
especialmente con extensión .gz. Normalmente un fichero FPG se guarda en disco
comprimido de esta manera, pero en el resto del fichero asumiremos que el
fichero FPG no está comprimido.

Cabecera

Un fichero FPG comienza con la siguiente cabecera:
 ____________________________________________________________________________
|Nombre____________|Tamaño_|Descripción______________________________________|
|                  |       |Cadena de caracteres de identificación del       |
|                  |       |fichero. Debe contener exactamente "fpg" o "f16",|
|MAGIC             |3 bytes|en minusculas. Dependiendo de estos valores lo   |
|                  |       |que sigue en el fichero se referirá a un archivo |
|__________________|_______|FPG_de_8_bits_(fpg)_o_de_16_bits_(f16).__________|
|                  |       |A continuación, los cuatro bytes 1Ah, 0Dh, 0Ah y |
|                  |       |00h. Esta terminación indica, en un fichero MS-  |
|TERMINACIÓN MS-DOS|4 bytes|DOS, final de fichero. Gracias a ella un comando |
|                  |       |TYPE en MS-DOS no mostraría los datos binarios   |
|__________________|_______|del_fichero._____________________________________|
|                  |       |Código de versión. Debido a que no se han        |
|VERSION           |1 byte |introducido cambios en el formato, este valor es |
|__________________|_______|siempre_00h._____________________________________|

Paleta de colores

A continuación, si el gráfico es de 8 bits (tal como indica la cabecera del
fichero) y sólo en ese caso, aparecen 768 bytes con la paleta de colores. Cada
color ocupa tres bytes en orden RGB (rojo, verde y azul) y con un rango para
cada componente de color de 0 a 63. Seguido aparecerán 576 bytes con
información de las gamas, que podran ser ignorados en Fenix. Para mas
información sobre este punto y sobre el formato PAL en general, consulta la
especificación del formato PAL.

Mapas

Seguidamente se almacenan los mapas, sin orden necesario. Tan solo habrá que
leer los datos hasta que se produzca el EOF (end of file - final de fichero).
Será solo en ese caso cuando estemos seguros de que no existen más mapas
almacenados en el fichero. No cabe duda decir que esto imposibilita la
adicción de nueva informacion adicional.

Todos los bloques de datos que representan a un mapa siguen la misma
estructura. Esto es, un descriptor con información acerca del mismo y,
seguidamente, los datos propios del mapa.

Como acabamos de decir:
 ____________________________________________________________________________
|Nombre___________|Tamaño__________|Descripción______________________________|
|                 |                |Identificador del gráfico, de 0 a 999.   |
|                 |                |Cuando el gráfico forma parte de una     |
|                 |                |librería FPG, indica su número de        |
|ID               |4 bytes         |índice. El hecho de que se guarde en el  |
|                 |                |fichero FPG permite extraer un gráfico   |
|                 |                |del fichero FPG, grabarlo como MAP, y que|
|                 |                |ocupe la misma posición si se importa de |
|_________________|________________|nuevo_o_se_copia_en_otro_FPG_diferente.__|
|                 |                |Este dato contiene el tamaño en bytes de |
|                 |                |los datos del mapa. Su uso principal es  |
|TAMAÑO EN BYTES  |4 bytes         |obtener esa información de forma         |
|                 |                |inmediata, aunque sería también posible  |
|                 |                |hacerlo mediante un calculo sobre el     |
|_________________|________________|ancho,_el_alto_y_la_profundidad_de_color.|
|                 |                |Cadena de texto de 32 bytes que se       |
|                 |                |corresponde con una breve descripción del|
|                 |                |contenido del gráfico. Debe ocupar       |
|                 |                |exactamente 32 bytes, con lo cual si la  |
|                 |                |descripción es menor en tamaño, la       |
|DESCRIPCIÓN      |32 bytes        |cadena deberá ser rellenada con el       |
|                 |                |código ASCII 0. Además, es otra fuente   |
|                 |                |de información acerca del gráfico, lo    |
|                 |                |que permite hacernos una idea de lo que  |
|                 |                |nos encontraremos sin necesidad de leer y|
|_________________|________________|representar_los_datos_del_mapa.__________|
|                 |                |Cadena de texto de 12 bytes que se       |
|                 |                |corresponde con el nombre de archivo del |
|                 |                |gráfico. Debe ocupar exactamente 12      |
|                 |                |bytes, con lo cual si el nombre es menor |
|                 |                |en tamaño, la cadena deberá ser          |
|                 |                |rellenada con el código ASCII 0. El hecho|
|                 |                |de que se guarde en el fichero FPG       |
|NOMBRE DE ARCHIVO|12 bytes        |permite añadir un gráfico al fichero FPG |
|                 |                |manteniendo dicho nombre y,              |
|                 |                |posteriormente, grabarlo como MAP con el |
|                 |                |mismo nombre exactamente. Además, es otra|
|                 |                |fuente de información acerca del         |
|                 |                |gráfico, lo que permite hacernos una idea|
|                 |                |de lo que nos encontraremos sin necesidad|
|_________________|________________|de_leer_y_representar_los_datos_del_mapa.|
|                 |                |Ancho en pixels del gráfico. A partir de |
|                 |                |este ancho se puede calcular la cantidad |
|                 |                |de memoria en bytes que ocupa una fila   |
|                 |                |del gráfico en disco, y que depende de la|
|ANCHO            |4 bytes         |PROFUNDIDAD de la cabecera:              |
|                 |                |    * Profundidad 8: ancho               |
|                 |                |    * Profundiad 16: ancho * 2           |
|                 |                |NOTA : El tamaño en bytes de este dato   |
|                 |                |difiere del que podemos encontrar en un  |
|_________________|________________|fichero_MAP._____________________________|
|                 |                |Alto en pixels del pixels del gráfico.   |
|ALTO             |4 bytes         |NOTA : El tamaño en bytes de este dato   |
|                 |                |difiere del que podemos encontrar en un  |
|_________________|________________|fichero_MAP._____________________________|
|                 |                |Información adicional acerca de este mapa|
|                 |                |en concreto.                             |
|                 |                |Actualmente, en este dato se almacena    |
|                 |                |información acerca del numero de puntos  |
|                 |                |de control y de la animación. Para saber |
|                 |                |estos dos valores solo deberemos someter |
|                 |                |dicho dato a un AND. Las constantes son: |
|                 |                |    * F_NCPOINTS = 0x0FFF                |
|FLAGS            |4 bytes         |    * F_ANIMATION = 0x1000               |
|                 |                |Por ejemplo, para hayar el numero de     |
|                 |                |puntos de control basta con hacer:       |
|                 |                |n_cpoints = flags AND F_NCPOINTS         |
|                 |                |NOTA : La animación en el formato MAP    |
|                 |                |está en desuso y poco documentada, por lo|
|                 |                |que se desaconseja su uso.               |
|                 |                |NOTA : El tamaño en bytes de este dato   |
|                 |                |difiere del que podemos encontrar en un  |
|_________________|________________|fichero_MAP._____________________________|
|                 |                |A continuación se almacenan los puntos de|
|                 |                |control, tantos como indique el valor    |
|                 |                |extraido del dato FLAGS. Es posible que  |
|PUNTOS DE CONTROL|Tamaño Variable |esta sección no esté presente si ese     |
|                 |                |valor es cero. En todo caso, cada punto  |
|                 |                |de control es una estructura de 4 bytes  |
|_________________|________________|que_se_especifica_más_adelante.__________|
|                 |                |Por último, aparecen los datos del       |
|                 |                |gráfico propiamente dichos, de arriba a  |
|                 |                |abajo:                                   |
|                 |                |Tamaño en bytes de los datos = [ (ancho *|
|                 |                |alto) * (bpp / 8) ]                      |
|                 |                |En un gráfico de 8 bits el valor 0       |
|DATOS DEL MAPA   |Tamaño Variable |(índice 0 de la paleta) está reservado   |
|                 |                |para los pixels transparentes.           |
|                 |                |En un gráfico de 16 bits, cada pixel se  |
|                 |                |guarda en formato RGB565 con el valor 0  |
|                 |                |reservado para los pixels transparentes  |
|                 |                |(lo cual significa que el color negro    |
|                 |                |puro no puede usarse, siendo necesario   |
|_________________|________________|sustituirlo_por_un_valor_aproximado).____|

Puntos de control

En este apartado se almacenan los puntos de control, tantos como indique el
valor extraido del dato FLAGS. Es posible que esta sección no esté presente
si ese valor es cero. En todo caso, cada punto de control es una estructura de
4 bytes que contiene:
 ____________________________________________________________________________
|Nombre|Tamaño_|Descripción__________________________________________________|
|X_____|2_bytes|Coordenada_X_del_punto_de_control.___________________________|
|Y_____|2_bytes|Coordenada_Y_del_punto_de_control.___________________________|

Imaginemos que tenemos configurado solo el punto de control 54, por ejemplo.
Aun así en el fichero se veran representados todos los puntos de control hasta
ese. En este caso los puntos que no hemos configurado tendran un valor de -
1 tanto en la coordenada X como en la Y.

Ejemplo:

      Solo hemos configurado el punto 4. Por lo tanto tendremos esto:
            Punto 000 : X = -1; Y = -1
            Punto 001: X = -1; Y = -1
            Punto 002 : X = -1; Y = -1
            Punto 003 : X = -1; Y = -1
            Punto 004 : X = 200; Y = 125

      Ahora hemos configurado el punto 2 y el 4. Por lo tanto tendremos esto:
            Punto 000 : X = -1; Y = -1
            Punto 001 : X = -1; Y = -1
            Punto 002 : X = 64; Y = 32
            Punto 003 : X = -1; Y = -1
            Punto 004 : X = 200; Y = 125

NOTA : Con la inclusión de la posibilidad de usar puntos de control con
coordenadas negativas, no estoy seguro de que esto siga vigente (lo de usar el
-1 para puntos de control nulos).

Obtenido de http://fenixworld.se32.com/fenixwiki/
Disponible bajo los términos de la GNU Free Documentation License 1.2
