Registrarse

[Gráficos] Añadir más frames a tus minis

~Criisss

Usuario mítico
Hoy a la tarde estuve un buen rato investigando esto, para hacer que un mini que no tiene frames de correr, pueda correr sin problema para cuando hacemos un cambio de mini (sea con JPAN, ASM, o lo que fuere). Pude lograrlo después de un rato, y luego Nacho me dijo que existía este tutorial, noté que llegamos al mismo resultado jaja.

La cuestión es que como dice Gold más arriba, los frames se agregan bien, pero cuando corremos la animación no se ve bien como el mini del prota original.

Para esto seguí un poco mas la investigación, y llegué a la solución. Primero que nada, tengo que explicar la estructura de los OW:

OW Data
NamebytesDescription
Starter bytes2Pair of FFs used to mark the start of the sprite. Also used to determine shift and possible animation for the byte, calculated by a complex function at 0x08007190
OW Palette2Number of the 16 color palette for this sprite
Replacement Palette2A second palette for a switch up, but never used.
Unknown2Interesting halfword, responsible for synchronization of all sprites of the same kind. Need more research
Width (pixels)2Horizontal size of the sprite
Height (pixels)2Vertical size of the sprite
Palette slot + ???1The lower half chooses the sprite slot to load the palette to. The upper half is a mystery to me
???1One of its functions is to tell if the palette overwrites some other or not if its slot is already occupied.
Filler2To align the pointers that come
Pointer 14Points to a set of 64 bits that have a say in the starting distribution of the images (but don’t know what exactly)
Size-draw Pointer4Related to the size of the sprite. Not required to be accurate.
Shift-redraw pointer4Points to an address and some data that allow for the drawing of moving animations, that is, the movement frames.
Sprite-pointer pointer4The pointer that tells where your sprite image data begins. (This is the Frames Pointer). Sprite-pointer (first in a series, continues afterward with no frame limiter)
Pointer 24Always the same for all sprites, used to calculate the starting location to store this data in the RAM

Sacado de la documentación del OWM de Kimonas, todos los creditos para él y JPAN, el autor original.
https://github.com/kimwnasptd/OWM-Qt/wiki/Inner-Workings

Lo importante está en el puntero que marqué en negrita. Viendo esta estructura, comparando el mini del prota con los demas, encontré que ese puntero cambia:

Cabecera del Mini 0 de BPRE
FF FF 00 11 02 11 00 02 10 00 20 00 10 01 00 00 10 37 3A 08 9C 37 3A 08 70 34 3A 08 A0 00 3A 08 FC 1C 23 08

Cabecera del Mini random de BPRE
FF FF 00 11 FF 11 00 01 10 00 20 00 15 01 00 00 10 37 3A 08 9C 37 3A 08 68 33 3A 08 80 14 3A 08 FC 1C 23 08

Para cambiar el puntero al mini que le agregamos los frames, ahora vamos a editar la cabecera del OW, y no los frames como hace Eing.
1589758849286.png


La cabecera está resaltada en amarillo en esta imagen del NSE. Para modificar el puntero, ctrl+G en HxD y ponen ese offset. Los va a llevar a los datos que puse arriba.
También se puede ver que acá marca cual es el puntero a la animación, como ese es el mini 0 tiene la animación correcta. Lo que tenemos que hacer es poner ese mismo puntero en la cabecera del mini al que le agregamos frames. En mi caso queda así:

FF FF 00 11 FF 11 00 01 10 00 20 00 15 01 00 00 10 37 3A 08 9C 37 3A 08 70 34 3A 08 80 14 3A 08 FC 1C 23 08

Y así se ve el puntero actualizado en NSE:

1589759033145.png


Espero haber sido claro.
 
Arriba