Mensajepor na_th_an » Lun, 14 Abr 2014, 12:15
Precisamente para eso está el librarian. El librarian coge todos tus binarios, los repega uno detrás de otro generando un RAMn.bin, y luego genera un índice y asigna a cada binario que hay dentro de RAMn.bin un número de recurso. También se acuerda de en qué página de RAM estaba sin que tú te tengas que preocupar.
Desde tu programa, llamas a get_resource (n, address) y te descomprime el recurso "n" en la dirección "address".
Ahora mismo el único ejemplo que te puedo indicar es Goku Mal. Si te fijas en el proceso de construcción del juego (make.bat y auxiliares) se hacen archivos .bin con las pantallas comprimidas y las fases y se llama al librarian para que los pegue en RAM3.bin, RAM4,bin y RAM6.bin y genere el índice en librarian.h. Si abres librarian.h verás todos los .bin en un índice y el número de recurso que les corresponde:
$this->bbcode_second_pass_code('', '// librarian.h
// Generated by The Librarian
// Copyleft 2012 The Mojon Twins
typedef struct {
unsigned char ramPage;
unsigned int ramOffset;
} RESOURCE;
RESOURCE resources [] = {
{3, 49152}, // 0: title.bin
{3, 50737}, // 1: marco.bin
{3, 50737}, // 2: ending.bin
{3, 52504}, // 3: level1c.bin
{3, 55569}, // 4: level2c.bin
{3, 58289}, // 5: level3c.bin
{3, 61025}, // 6: level4c.bin
{4, 49152}, // 7: level5c.bin
{4, 51785}, // 8: zoneA.bin
{4, 54101}, // 9: zoneB.bin
{4, 56255}, // 10: leveltsc.bin
{4, 56793}, // 11: intro1.bin
{4, 58449}, // 12: intro2.bin
{4, 60216}, // 13: intro3.bin
{4, 61948}, // 14: intro4.bin
{6, 49152}, // 15: intro5.bin
{6, 51030}, // 16: intro6.bin
{6, 52896}, // 17: intro7.bin
{6, 54944}, // 18: logo.bin
{6, 56153}, // 19: controls.bin
{6, 57005} // 20: dedicado.bin
};
void get_resource (unsigned char res, unsigned int dest) {
unpack_RAMn (resources [res].ramPage, resources [res].ramOffset, dest);
}')
Con esto, en el juego por ejemplo, si se quiere pintar la pantalla comprimida "intro7.bin", se llamaría a get_resource (17, 16384), sin tener que preocuparnos ni de en qué página está, ni de en qué dirección ha caído. Todo eso es automático. Si, por ejemplo, tuviésemos un tileset en el recurso 38, haríamos un get_resource (38, tileset), para que el recurso 38 se descomprimiese sobre la dirección de memoria apuntada por "tileset".
Al principio puede parecer lioso, pero en cuanto haces uno ya le pillas el rollo. Lo primero es hacerte tu carpeta bin con el librarian y todos tus archivitos .bin. Luego haces list.txt con la lista de tus .bin, y ejecutas el librarian. Empieza por ahí, examina los resultados, y cuéntame.
Como diría Rorshach: "Urm..."