Registrarse

[Otros] FR | Hacer que un movimiento no se pueda olvidar

Inferno

Miembro insignia
Miembro insignia
INTRODUCCIÓN​

En el día de hoy os traigo un tutorial sobre como hacer que un movimiento no pueda ser olvidado, tal y como si fuese una MO.
Lo primero agradecer a JPAN por todos los aportes a la comunidad del rom hacking, aquí tenéis su post.

Herramientas necesarias:
-Editor Hexadecimal (Yo usaré HxD)
-XSE y el archivo stdattacks.rbh
-Una ROM de Fire Red


PASO 1º​

Lo primero será repuntear la lista de MO, esta se encuentra en el offset 0x25E014 y contiene los siguientes elementos:

Código:
0F 00 13 00 39 00 46 00 94 00 F9 00 7F 00 23 01 [COLOR="Red"]FF FF[/COLOR]
Siendo los bytes 0F 00 la 1ª MO, 13 00 la 2ª MO, 39 00 la 3ª y así, esto nos dice que cada movimiento está formado por un conjunto de 2 bytes, o lo que es lo mismo, 1 halfword.
Pero en esta lista hay un detalle relevante, se trata de los dos últimos bytes (FF FF), y es que estos 2 últimos bytes tendrán que ser siempre de este modo, por lo que, cada vez que vayáis a añadir un movimiento a esta lista, tendréis que aseguraros que estos son los bytes finales, más adelante hablaré sobre esto.

La vamos a mover a otro offset ya que pretendemos añadir elementos a esa lista, puesto que queremos que más ataques se comporten como MOs. En mi caso yo la moveré al offset 0x900000.

Bueno, pero antes de moverla tendremos que tener claros que movimientos queremos que tengan comportamiento de movimiento oculto, ¿No? Pues bien, yo haré que el movimiento Ascuas no se puede olvidar.
Una vez pensado que movimiento o movimientos queremos utilizar vamos a mirar cual es valor hexadecimal que se le ha asignado a cada uno, pues de otro modo no sabremos que valores poner en la lista. Lo que deberemos hacer es abrir el XSE y, desde ahí, abrir el archivo stdattacks.rbh que debería estar en la carpeta del XSE o en el lugar donde hayáis extraído el XSE cuando lo descargasteis, al menos si lo habéis hecho desde el foro.



Si os fijáis veréis una lista completa con todos los movimientos y su valor, en mi caso el movimiento Ascuas tiene el valor 0x34 (Para ahorraros tiempo os recomiendo hacer CTRL+F y desde ahí podréis buscar el movimiento al momento).

Ya tenemos el valor que corresponde al movimiento, así que ahora nos vamos a la anterior lista y le añadimos los nuevos valores:

Código:
0F 00 13 00 39 00 46 00 94 00 F9 00 7F 00 23 01 34 00 [COLOR="Red"]FF FF[/COLOR]
Añadimos 34 00 y no 34 solo porque, como dije antes, cada movimiento está representado por dos bytes. En caso de querer añadir un movimiento que tenga asignado un valor mayor, como Hidropulso (valor 0x160), no podréis añadir 16 00, puesto que eso no representaría a este movimiento, sino al movimiento Látigo Cepa, sino que tendréis que hacer lo siguiente:



Con la nueva lista acabada nos vamos a la dirección donde queríamos insertarla, en mi caso elegí el offset 0x900000, copiamos y hacemos CTRL+B.

NOTA: Como podéis observar hemos añadido un nuevo movimiento dejando los bytes FF FF al final de la lista.


PASO 2º​


Una vez tenemos la nueva lista extendida en la nueva dirección, nos deberemos dirigir a las siguientes direcciones y efectuar los cambios correspondientes:

Vamos a 0x125A9C y cambiamos el primer byte por 00

Nos dirigimos a 0x125AAC, aquí ponemos el pointer a la nueva lista, es decir, como yo la inserte en el offset 0x900000 tendré que poner 00 00 90.

Por último iremos a 0x125AB6, este dígito que veis aquí viene representado por: Nº de movimientos de la lista - 2 (en hexa), pero hay un matiz, pues en este punto es donde cobran importancia los dos últimos bytes de la lista, y es que tendremos que contarlos como si fuese otro movimiento más, por lo tanto la función sería más precisa de este modo: [(Nº movimientos de la lista + 1 Halfword formada por los bytes FF FF) - 2].
Sabiendo esto, solo nos queda operar, en mi lista tengo 9 movimientos así que vendría a ser algo así: [(9 +1) - 2] = 8.
Voy a explicar un poco mejor este último punto ya que puede ser el más lioso de primeras.
La razón por la que se hace todo esto es simple, la última Halfword (conjunto de dos bytes) de la lista no será tratada como un movimiento oculto, lo que implica que si ponemos ahí los valores de un movimiento normal este se podría olvidar como si de un movimiento común se tratase. Es por eso que ponemos como última halfword FF FF, pero claro, no serviría de nada ponerla si luego no se lo indicamos de alguna manera a la ROM, ahí es donde entra el dígito del offset anterior, con él le estamos diciendo a la ROM hasta donde va la lista, dicho de otro modo, cuál es la última halfword, por lo tanto le estamos indicando cual es el conjunto de 2 bytes que no va a ser tratado como una MO. Debido a esto se tiene en cuenta a la hora de realizar las operaciones aritméticas, por poneros el ejemplo de hacerlo mal, si ahora yo lo que hago es esta operación: 9 movimientos de mi lista - 2 = 7, lo que estaría indicando es que la halfword que no se leería sería de esta en adelante:

Código:
0F 00 13 00 39 00 46 00 94 00 F9 00 7F 00 23 01 [COLOR="DarkOrange"]34 00[/COLOR] FF FF
Es decir, nuestro movimiento, aunque puesto en la lista podrá ser olvidado como el resto de movimientos normales y corrientes.


PASO 3º​

Como paso final lo que haremos será comprobar nuestros resultados en la ROM, como podréis observar lo he comprobado tanto en el caso de enseñar un movimiento mediante MT como en el caso de aprender un movimiento por nivel.


No sé porque, pero el 2º vídeo me quedó con bastante lag, sorry xD

------------------------------
------------------------------

Espero que os haya servido de ayuda y que no me haya liado mucho con la explicación sobre esa última halfword, de todos modos siempre podéis preguntar cualquier cosa y os ayudaré en lo que pueda.

Un saludo!! :D
 

MetalKaktus

A la luz del quinto día, mira al este
Miembro insignia
Pues la verdad es un tutorial bastante útil y simple de aplicar la verdad, siempre y cuando uno tenga las nociones básicas. Y sin duda es algo que te da cierta jugabilidad.

Estaría bien que no sea algo permanente y que sea temporal, dependiendo del valor de una variable por ejemplo pero ahora mismo no se me ocurre forma de lograrlo, a no ser que sea modificando la rutina que lea las MO, pero no me voy a meter en camisa de once varas.

En fin, buen aporte compañero ;)
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: [FR][HEX] Hacer que un movimiento no se pueda olvidar

No tengo idea de por qué alguien en su sano juicio querria hacer algo como esto en su hack.

Dejando mi naturalmente subjetiva opinión de lado, tiene pinta de que el tutorial podria ser muchisimo más corto y directo al punto, pero el esfuerzo que pusiste en escribirlo es sin dudas admirable.
Gran trabajo.
 

Naren Jr.

Puto amo
Usuario de Platino
Respuesta: [FR][HEX] Hacer que un movimiento no se pueda olvidar

Uhhhhhhhhh genial esto!!!!

De hecho deberías hacerle la etiqueta al post en Plan Jpan y así traer mas tutoriales de los que tiene toda esa ROM BASE, podríamos hacer un libro con todo ello.

He de decir que esta rutina esta espectacular, otra cosa @Inferno es posible hacerlo olvidar con el Olvida Movimientos?

Un saludo bro!
 
Arriba