Bon, j'ai rippé les décors... ils sont stockés entiers dans la RAM et chargés à chaque changement de niveau. Chaque image fait 3072*136 en 3 plans. Pas de construction extemporanée, c'est du transfert de block brut : donc pas applicable à la Lynx, il n'y a pas assez de RAM. Je dois donc utiliser une table et des éléments de décors (GT_en_attente, si on m'écoute).
Pour anecdote, le jeu original affiche plus de 16 couleurs : ils utilisent la même astuce que Dungeon Master c-a-d un changement de palette.
En attendant, je me concentre sur le fond : le scrolling est parallax. J'ai obtenu les fonds de décors (horizons), que j'ai pu 'rétrécir' en sprites spr 2 plans. Forcément, les couleurs sont mauvaises, mais il y a une astuce, dans le SCB.
struct scb {
uchar b0;
uchar b1;
uchar b2;
uint *next;
uint *bitmap;
int x;
int y;
int sizex;
int sizey;
uchar palette[8];
};
...
struct scb background1;
struct scb background2;
...
background1.b0 = 0x40;
background1.b1 = 0x10;
background1.b2 = 0x20;
background1.next = &background2;
background1.bitmap = 0; // valeur allouée après chargement de la CART vers buffer
background1.x = -320;
background1.y = 0;
background1.sizex = 0x100;
background1.sizey = 0x100;
background1.palette[0] = 0x31;
background1.palette[1] = 0xbc;
background1.palette[2] = 0x00;
background1.palette[3] = 0x00;
background1.palette[4] = 0x00;
background1.palette[5] = 0x00;
background1.palette[6] = 0x00;
background1.palette[7] = 0x00;
Désolé pour l'écriture C, je suis pas très à l'aise avec le mélange ASM+C... J'espère que ça reste compréhensible. J'ai étudié ces trucs bizarres en fin de SCB, ces fameux 'pens'. Normalement, on a généralement :
background1.palette[0] = 0x01;
background1.palette[1] = 0x23;
background1.palette[2] = 0x45;
background1.palette[3] = 0x67;
background1.palette[4] = 0x89;
background1.palette[5] = 0xab;
background1.palette[6] = 0xcd;
background1.palette[7] = 0xef;
En fait, il s'agit d'une table de correspondance (un mappage). Pour lire celle juste au dessus, il faut dire la 1ère valeur indique la couleur 0, la seconde valeur la couleur 1, la troisième la couleur 2... En fait, la palette du sprite est celle de la lynx, donc il suffit d'avoir une table de 1 -> 1, 0 -> 0, 2 -> 2, etc.
Dans mon cas j'ai 0x31 et 0xbc... que 4 couleurs (uniquement 2 plans), donc seulement les 4 premières valeurs de cette table à renseigner.
La première couleur (noire dans degas Elite) sera dessinée avec la couleur 3 (bleue claire dans Degas).
La deuxième couleur du sprite sera peinte avec la couleur 1 de la palette en cours de la Lynx.
La troisième couleur du sprite sera affichée avec la couleur 11 de la palette Lynx.
La quatrième couleur du sprite sera peinte avec la couleur 12 de la palette Lynx.
Sinon, pour les plans, c'est codé dans le premier octet (bits 7 à 4), exemples :
background1.b0 = 0x40; -> 2 plans
background1.b0 = 0x80; -> 3 plans
background1.b0 = 0xc0; -> 4 plans
Dans cet octet est aussi codé, si c'est un background, s'il doit y avoir calcul de collisions, etc... voir la table en fin de page de ce
lien (SPRCTL0).
Ze Beepbeep must run.