Re: Proyecto juego Churrera. Dudas
Publicado: Mar, 04 Feb 2014, 16:36
por na_th_an
El contenido de tileset.h no recibe ningún tratamiento especial. Cuando compilas un array con valores (que es lo único que hay dentro de tileset.h), los valores se van escribiendo en el binario que se carga en RAM en el mismo orden.
$this->bbcode_second_pass_quote('', 'Â')¿ diferentes set de tiles en tileset.h es peor que N tileset.bin comprimidos?
Depende. Por lo general, sÃ. El problema de comprimir todo un tileset es que primero van 2048 bytes con los 8 bytes de cada uno de los 256 caracteres, y luego van los 256 atributos de estos 256 caracteres. Eso significa que si quieres cambiar, digamos, sólo 32 caracteres, tendrÃas que hacer dos binarios: uno con los 32x8 = 256 bytes de esos caracteres, y otro con los 32 bytes de sus atributos, y descomprimirlos en los sitios correctos.
Para que te hagas una idea, el caracter "N" (con N de 0 a 255) empieza en (tileset + N * 8) y su atributo está en (tileset + 2048 + N).
Para lo que tú quieres hacer tienes que actualizar los últimos 64 caracteres (16 tiles por 4 caracteres cada uno) y sus atributos. Para ello necesitas dos binarios, uno con los bitmaps y otro con los atributos, por cada set intercambiable. El primero, descomprimido, ocupará 512 bytes, y el segundo 64 bytes.
Los caracteres de los tiles empiezan en el 64, por lo que estamos hablando de sustituir a partir del caracter número 192, o sea, tendrÃas que descomprimir los bitmaps en (tileset + 192 * 8), y los atributos en (tileset + 2048 + 192).
En tu situación, creo que ahorrarÃas bastante memoria comprimiendo los trozos que necesitas. Lo ideal serÃa programarte un conversor, pero creo que no es muy complicado hacerlo a mano. Con ayuda de un ensamblador puedes conseguirlo. Si recortas tus 64 ultimos caracteres y haces dos archivos asÃ:
bitmap1.asm
$this->bbcode_second_pass_code('', 'defb 0, 0, 0, 0, 0, 0, 0, 0
defb 0, 0, 0, 0, 0, 0, 0, 0
defb 0, 0, 0, 0, 0, 0, 0, 0
defb 0, 0, 0, 0, 0, 0, 0, 0
defb 0, 0, 0, 4, 42, 0, 0, 0
defb 0, 0, 0, 0,160, 0,128, 0
defb 10, 4, 0, 4, 0, 0, 0, 0
defb 168, 0, 8, 0, 42, 0, 8, 0
defb 7, 24, 39, 88, 83,166,173,171
defb 224, 24,228, 26,106,213,181,101
defb 166,173,163, 86, 88, 39, 24, 7
defb 213,181,101,202, 26,228, 24,224
defb 0, 0, 0, 0, 32, 32, 33, 32
defb 0, 16, 16, 16, 18, 16, 18, 16
defb 49, 50, 49, 50, 49,122,120,213
defb 18, 49, 58, 57, 60, 92,186, 85
defb 0, 0, 1, 16, 32, 1, 49, 49
defb 0, 0, 0,128, 0,132,128, 12
defb 33, 48, 3,121, 49, 31, 0, 1
defb 136, 12,192,158,140,248, 0,128
defb 1, 1, 1, 1, 1, 0, 3, 0
defb 0,128, 0,128, 0, 0,192, 0
defb 1, 1, 1, 1, 1, 1, 1, 1
defb 0,128, 0,128, 0,128, 0,128
defb 0, 0, 0, 0, 0, 32, 65, 42
defb 0, 0, 0, 0, 0, 0, 65, 42
defb 0, 69,171, 69, 0, 62, 94, 42
defb 0, 69,234,197, 0, 63, 86, 42
defb 0,243, 90,177, 0, 63, 95, 43
defb 0,231,245, 98, 0,127, 95, 42
defb 0,231,171, 69, 0, 62, 94, 42
defb 0,197,235,197, 0, 63, 86, 42
defb 0,122,125,106, 0,109, 37, 0
defb 0,126,125,106, 0,182,150, 0
defb 0,162, 20, 0, 0, 0, 0, 0
defb 0,162, 20, 0, 0, 0, 0, 0
defb 0, 0, 10, 23, 47, 95, 42, 21
defb 0, 0, 0, 64,132, 74,132, 0
defb 0, 0, 0, 1, 16, 0, 0, 0
defb 0, 80,186,116,170, 84, 0, 0
defb 161,122,209,187, 61,127,125, 58
defb 22,173,255,255,223,190, 15, 30
defb 116, 58,116, 40, 48, 32, 0, 0
defb 76,174, 68,226, 96, 64, 64, 0
defb 0, 0, 0, 0, 0, 0, 0, 0
defb 0, 0, 0, 0, 0, 0, 0, 0
defb 62,115,115, 78, 75,127, 54, 4
defb 0, 0, 64, 48,168, 42, 40,202
defb 7, 56, 71, 95, 95, 95, 95, 95
defb 224, 28,162,194,226,194,226,194
defb 95, 95, 47, 47, 22, 9, 6, 1
defb 162,194,132, 68,136, 16, 96,128
defb 3, 0, 1, 1, 65, 94, 94, 65
defb 192, 0,128, 0,130,114,106,130
defb 1, 1, 1, 1, 1, 1, 0, 7
defb 128,128,128, 0,128, 0,128, 96
defb 3, 6, 5, 1, 5, 5, 1, 34
defb 224, 36, 84, 68, 84, 84, 68, 36
defb 237,102, 35, 0, 41, 64, 40, 68
defb 213, 53,228, 4,192, 31, 0,142
defb 3,231,115,117, 50, 40, 26, 4
defb 230,244,224,208, 32, 16, 32, 16
defb 12, 14, 12, 14, 6, 34, 58,124
defb 24, 56, 56, 56, 48, 34, 46, 31')
attrs1.asm
$this->bbcode_second_pass_code('', 'defb 7, 7, 7, 7, 7, 7, 7, 7
defb 71, 7, 7, 7, 71, 71, 71, 71
defb 71, 7, 71, 7, 71, 7, 71, 7
defb 7, 7, 7, 7, 71, 71, 71, 71
defb 7, 7, 7, 7, 6, 6, 6, 6
defb 71, 71, 7, 7, 7, 7, 7, 7
defb 7, 7, 7, 7, 71, 7, 71, 7
defb 71, 7, 71, 7, 7, 7, 7, 70')
Con esto generas los binarios:
$this->bbcode_second_pass_code('', '../utils/pasmo.exe bitmap1.asm bitmap1.bin
../utils/pasmo.exe attrs1.asm attrs1.bin')
Luego los comprimes con apack...
$this->bbcode_second_pass_code('', '../utils/apack bitmap1.bin bitmap1c.bin
../utils/apack attrs1.bin attrs1c.bin')
y los introduces en algún sitio de tu código, por ejemplo al principio del propio extern.h:
$this->bbcode_second_pass_code('', '
extern unsigned char bitmap1 [0];
extern unsigned char attrs1 [0];
unsigned char *bitmaps [] = { bitmap1 };
unsigned char *attrs [] = { attrs1 };
#asm
._bitmap1
BINARY "bitmap1c.bin"
._attrs1
BINARY "attrs1c.bin"
#endasm
void load_new_subtileset (unsigned char n) {
unpack (bitmaps [n], tileset + 192 * 8);
unpack (attrs [n], attrs + 2048 + 192);
}')
Para cambiar el subtileset llamas a load_new_subtileset. Para añadir más, repite los pasos, crea las etiquetas en el código y no te olvides añadir los que vayas poniendo a los arrays bitmaps y attrs.
Sé que es espeso, pero con paciencia puede hacerse.