Registrarse

[pokeemerald] Asignar paletas a minis

Kaktus

Miembro insignia
Miembro insignia
@Jaizu ha escrito también un tutorial de esto y como me parece que está mucho mejor explicado que como yo lo he hecho, edito el post con su tuto para que todos lo entendáis mejor, podéis elegir el que queráis, y si no os aclaráis con uno, tenéis el otro:

Hola soy Jaizu y hoy os vengo a enseñar cómo cambiar la paleta que usa cada mini.
Tened en cuenta que este es un tutorial para cambiar IDs de paletas que ya tenemos, no para añadir otras o hacerlas dinámicas.

Cada mini tiene una estructura, esta se encuentra en /src/data/object_events/object_event_graphics_info.h
Ahí buscaremos el mini al que le cambiaremos la paleta, en mi caso Girl1.

Código:
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Girl1 = {0xFFFF, OBJ_EVENT_PAL_TAG_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Girl1, gDummySpriteAffineAnimTable};
Pues para cambiar la paleta que usa hay que cambiar dos párametros, el segundo y el séptimo.
Si buscamos la función ObjectEventGraphicsInfo vemos lo siquiente:
Código:
struct ObjectEventGraphicsInfo

{

    /*0x00*/ u16 tileTag;

    /*0x02*/ u16 paletteTag1;

    /*0x04*/ u16 paletteTag2;

    /*0x06*/ u16 size;

    /*0x08*/ s16 width;

    /*0x0A*/ s16 height;

    /*0x0C*/ u8 paletteSlot:4;

             u8 shadowSize:2;

             u8 inanimate:1;

             u8 disableReflectionPaletteLoad:1;

    /*0x0D*/ u8 tracks;

    /*0x10*/ const struct OamData *oam;

    /*0x14*/ const struct SubspriteTable *subspriteTables;

    /*0x18*/ const union AnimCmd *const *anims;

    /*0x1C*/ const struct SpriteFrameImage *images;

    /*0x20*/ const union AffineAnimCmd *const *affineAnims;

};
Lo que nos interesa es cambiar el paletteTag1 que es el parámetro que indica qué paleta usar, y, además, el paletteSlot, pues a menos que estemos usando paletas dinámicas, siempre será el mismo.

Si queremos hacer que el mini de girl tenga la paleta 3, solo tenemos que buscar otro mini que use esa paleta para ver qué paletteSlot tenemos que asignarle.

Podemos usar el LittleBoy como ejemplo, que usa la paleta 3, y mirando su struct vemos que...

Código:
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleBoy = {0xFFFF, OBJ_EVENT_PAL_TAG_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_LittleBoy, gDummySpriteAffineAnimTable};
...su paletteSlot es el 5, que es el único dato que tendríamos que saber para terminar de cambiarle la paleta a girl1.

Volvemos a girl1, cambiamos el palettetag1 y el paletteslot para que coincida con el de LittleBoy y nos quedaría así:

Código:
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Girl1 = {0xFFFF, OBJ_EVENT_PAL_TAG_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Girl1, gDummySpriteAffineAnimTable};
Compilamos con make y listo.

En mi caso he usado -j4 porque es el nproc que tiene mi pc, recordad que esto varía según el pc que useis.
¡Buenas!

Visto que @Howdy tenía dudas respecto a cambiar la paleta que debería leer el juego que tiene cada mini, he decidido crear un minituto para explicarlo, pues es un poco tricky (sip, he vuelto).

El único archivo que deberemos modificar es "pokeemerald\src\data\object_events\object_event_graphics_info.h", donde deberemos buscar el mini del cuál queramos cambiar la paleta con la que carga, cuyo nombre será algo como "gObjectEventGraphicsInfo_Nombre", en nuestro caso "gObjectEventGraphicsInfo_Girl1". Si nos fijamos, hay una estructura que se repite en todos los minis:

Código:
{0xFFFF, X, _, _, _, _, Y, _, _, _, _, _, _, _, _, _};
X debe contener el número de la paleta que corresponde en el archivo, es decir, si queremos que tenga la paleta 01.pal, pues X deberá ser EVENT_PAL_TAG_1 (o al menos, esa es la relación que tienen por defecto, si añadís nuevas paletas, tendrá que coincidir el nombre de la constante que le deis con el número que tenga el archivo)

Por otro lado, Y es el slot en el que se cargará dicha paleta.

Viendo el fragmento de Girl1...

Código:
{0xFFFF, OBJ_EVENT_PAL_TAG_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Girl1, gDummySpriteAffineAnimTable};
Su X e Y son "OBJ_EVENT_PAL_TAG_3" y "1" respectivamente.

Visto que por defecto, todas las paletas ya siguen un orden donde ser cargadas, nosotros respetaremos dicho orden para que todo vaya bien, pues tiene cierta lógica que cada paleta se cargue siempre en cierto slot. Imaginad dos minis distintos, ambos tienen la misma paleta (X), sin embargo, uno la carga en el slot 1 y otro en el 5. Obviamente eso ocasionará conflicto. uno de esos slots será en el que se carga por defecto, sin embargo, el otro no, por lo que se estará intentando cargar una paleta en un slot que le pertenece a otra... Como veis se puede liar una muy grande si asignamos estos valores a lo loco, por lo que lo recomendable es que siempre le asignemos un slot a cada paleta, pero como en este caso ya todas las paletas tienen un slot asignado, buscaremos que slot le toca a la paleta que le queremos asignar, y lo pondremos también.

Si aplicamos lo explicado, veremos que por ejemplo LittleBoy usa la paleta 3:

Código:
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleBoy = {0xFFFF, OBJ_EVENT_PAL_TAG_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_LittleBoy, gDummySpriteAffineAnimTable};
Y observamos que se carga en el slot 5, bien pues ahora sólo queda reemplazar nuestros dos parámetros en Girl1, quedando de la siguiente forma:

Código:
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Girl1 = {0xFFFF, OBJ_EVENT_PAL_TAG_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Girl1, gDummySpriteAffineAnimTable};
Guardamos cambios, vamos a nuestra consola de comandos

Código:
make -j4
(Importante no incluir el NODEP=1, o no se guardarán los cambios)

Y voilá, ya tenemos nuestro mini con una paleta distinta

girl1.png

Ale, a disfrutar de vuestros minis con otras paletas :D
 
Última edición:
Arriba