Move Animations
Las animaciones de los ataques se encuentran en el offset $C900A, en una tabla de pointers que van del 0x00 al 0xFB. Las animaciones no tienen una estructura fija, pero casi siempre siguen un patro de carga de graficos-musica-animacion, las mas complicadas usan comandos que repiten una misma animacion 7-8 veces.
Para los que esten mas familiarizados con los scripts, las animaciones usan unos comandos similares (jump, call y loop).
D0 - makeobj ; ['id', SingleByteParam], ['x', SingleByteParam], ['y', SingleByteParam], ['unknown', SingleByteParam]],
D1 - anim_1gfx ; carga un grafico. [D1] [XX]
D2 - anim_2gfx ; carga 2 graficos. [D1] [XX] [YY]
D3 - anim_3gfx ; carga 3 graficos. [D1] [XX] [YY] [ZZ]
D4 - anim_4gfx ; carga 4 graficos. [D1] [XX] [YY] [ZZ] [AA]
D5 - anim_5gfx ; carga 5 graficos. [D1] [XX] [YY] [ZZ] [AA]
E0 - animplaysound ; Reproduce un sonido. [E0]
E1 - animplaycry ; reproduce un Cry
FC - anim_jump ; Como su nombre lo indica, hace un "brinco" a otra animacion. [FC] [2-byte pointer]
FD - anim_loop ; Repite una animacion "n" veces. [FD] [No. de repeticiones] [2-byte pointer] [Wait]
FE - anim_call ; llama una animacion y despues "regresa" a la animacion principal. [FE] [2-byte pointer] [Wait]
FF - endanim ; Termina animacion.
Aqui encontraran la estructura de los movimientos. Link
Aqui la lista de graficos para cargar en la Vram. Link
Aqui la lista de sonidos y efectos. Link
Como uso todo eso?
Primero tengan en mente que desean hacer. Yo por ejemplo, para crear la animacion de Bullet Punch, pense en traerme los "reflejos" de acero de Iron Tail y combinarlos con la animacion de Mach Punch. Algo asi:
Para ello hay que mirar la estructura de Iron Tail para copiar los reflejos. Una manera de enconcatrar los datos facilmente para pokemon GOLD, es seguir los datos del desamble de Crystal (link de arriba) y restarle -0x65 al offset indicado.
Iron Tail lo marca en $CB6B6, restamos x65 y nos da $CB651, ahi comienzan los datos de Iron Tail en G/S. Hay veces que el numero a restar varia de x65 a x67, pero siempre resten x65 y en Gold Finger vayan retrocediendo hasta encontrar el FF y solo posicionense en la casilla inmediata al FF, asi sabremos que termina un comando e inicia el nuestro. En nuestro caso, Iron Tail no estuvo en $CB651, si no dos casillas atras, en CB64F.
Despues copiamos la parte que nos interesa:
BattleAnim_IronTail: ; cb6b6
anim_1gfx ANIM_GFX_REFLECT
anim_obp0 $0
anim_sound $0, SFX_RAGE
anim_call BattleAnim_IronTail_branch_cbca7
anim_call BattleAnim_IronTail_branch_cbc43
anim_wait 4
En hex se ve de la siguiente manera D1 18 F2 00 E0 00 75 FE 40 7C FE DC 7B 04.
D1 18 ; Carga los graficos de REFLECT
F2 00 ; Me parece que es lo que define que los reflejos solo sean dentro del contorno de nuestro sprite y no cuadrado como en el ataque Reflect.
E0 00 75 ; Reproduce el sonido de Rage.
FE 40 7C ; Llama (call) a la primera animacion de reflejo.
FE DC 7B ; Llama (call) a una segunda animacion de reflejo.
Con esto tenemos la primera parte de nuestro animacion, ahora solo falta hacer una llamada a la animacion de Mach Punch. Buscamos de nuevo en el desamble de Crystal y vemos que esta en el offset $CAF33, aplicamos la resta de los 0x65 y comrpobamos en Gold Finger que sea su ubicacion real. al comprobar vemos que hay que recorrernos dos espacios atras, a $CAECC.
Sacamos el pointer de 2-bytes y agregamos el comando anim_call (FE). Algunas ocaciones es necesario que carguemos los graficos antes de hacer el call, asi que usamos D1 (para cargar 1 grafico) y 01 (Graficos de Mach Punch). Al final tenermos la terminacion de nuestra nueva animacion: D1 01 FE CC 6E FF
Juntamos todos los comandos (D1 18 F2 00 E0 00 75 FE 40 7C FE DC 7B 04 D1 01 FE CC 6E FF) y listo, ya tenemos nuestra nueva animacion, ahora solo falta ponerla en algun lugar en blanco dentro del mismo bank y repuntear la tabla de pointers hacia alguna animacion que no pensemos usar.
La rutina final se puede resumir un poco, sise fijan el comando D1 se repite dos veces, podemos omitir el segundo, si desde el principio usamos D2 y cargamos las dos animaciones necesarias, el 0x18 de los reflejos y el 0x01 de Mach Punch. Incluso puede haber casos en que la segunda carga de Graficos no se necesaria, ya que teoricamente el comando FE (call) deberia ser suficiente para que se cargue toda la animacion, hay veces que funciona y hay otras que no, asi que solo la practica nos lo dira.
Por ultimo les dejo algunas animaciones que yo he hecho para el Revolution. Solo tienen que copiar los numero despues del ";" y pegarlos en Gold Finger. Las animaciones que tengan Loop (FD) deben ser colocadas en el offset indicado ahi mismo para que funcionen bien.
PD1:Water Pulse esta mal redactado, solo hay que redirigir el Loop hacia el E0 de su misma animacion.
PD2:Esto al final quedo como tutorial.
PD3:Gracias a GOLD por hacer de este "guia" un tutorial independiente.