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]
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]
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:
Voy a explicar un poco mejor este último punto ya que puede ser el más lioso de primeras.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.
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
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!!