Aunque esté feo decirlo, programé el PCX2MSX pero no lo uso casi nunca. Además de que perdí el código fuente, con lo cual no puedo hacer modificaciones sin reprogramar la aplicación completa, la funcionalidad que me da no me resulta todo lo flexible que me gustaría.
Por lo tanto, en la práctica lo que hago es utilizar POTATOSHOP y guardar una copia en un formato "oficial" (PSD, PNG, etc.). Y luego guardo otra copia en formato RAW de 8 bits. Por lo tanto, en este formato 1 pixel = 1 byte, ordenados de izquierda a derecha y de arriba abajo.
A continuación, voy modificando unos programas muy sencillos que he hecho en C para realizar las conversiones, y así consigo convertir sin problemas situaciones un poco "problemáticas" para automatizar, como conversión de gráficos con caracteres y sprites superpuestos, conversión a formato sprites, optimización de tablas (eliminación de patrones repetidos), etc.
Es la mejor solución que he encontrado. Cambiar los parámetros de estos programas en C me supone un minuto, y me devuelven los datos EXACTAMENTE como yo quiero, sin tener que realizar ninguna tarea más, salvo comprimirlos con BitBuster llegado el caso.
Por si acaso, adjunto un programita de estos en C. Concretamente, el que usé para convertir un grupo de sprites de 16x16, con 2 colores superpuestos (2 sprites en cada 16x16 píxeles) para un juego "desconocido":
#include<stdio.h>
main()
{
FILE *fichero;
int x,y,k,i;
unsigned char j,data[16*8][16];
; Determina si el fichero existe
if ((fichero=fopen("GHOST.RAW","rb"))==NULL)
{
printf("File not found!");
return;
}
; Carga el fichero en la tabla
for (y=0;y<16;y++)
for (x=0;x<16*8;x++)
data[x][y]=fgetc(fichero);
fclose(fichero);
; Crea el fichero de salida
fichero=fopen("GHOST.SPR","wb");
; Plano de color 2
for (k=0;k<8;k++)
for (x=0;x<2;x++)
for (y=0;y<16;y++)
{
for (i=0;i<8;i++)
if (data[(k<<4)|(x<<3)|i][y]==2) j=(j<<1)|1; else j=j<<1;
fputc(j,fichero);
}
; Plano de color 1
for (k=0;k<4;k++)
for (x=0;x<2;x++)
for (y=0;y<16;y++)
{
for (i=0;i<8;i++)
if (data[(k<<5)|(x<<3)|i][y]==1) j=(j<<1)|1; else j=j<<1;
fputc(j,fichero);
}
return;
}
Se convierte un RAW a 3 colores (fondo, plano 1, plano 2) de 128x16 píxeles, en un grupo de 16 sprites de 16x16, 8 para el color del plano 1 y otros 8 para el color de plano 2.
Para compilarlo, GCC. Puede optimizarse, corregirse, etc. Pero de lo que se trata es de que es fácil de modificar, eficiente y no me complica la vida. Me cuesta menos modificar dos parámetros, compilar y ejecutar, que cualquier otra solución.