Hoy me gustaria saber como se cambia el prota por otro minisprite (se que es mediante ASM) pero no encuentro tutos por internet que me digan como hacerlo.
Por si no entendieron la duda, vean este video, quiero hacer exactamente lo mismo:
Een fr es distinto creo...
Ya que los punteros que se hayan en la ram son dinamicas, por lo tanto no se si funciona igual que en el rubi, que es cambiando el puntero del mini en el rom, o bien cambiandole el sexo...
Igualmente te doy un consejo, descargate el cheat engine -la ultima version- y busca el puntero del minisprite, -miralo en el overworld editor en modo profesional- seguido de eso coge la direccion y editala mediante wbto, y nos cuentas que tal...
El puntero sale en el overworld editor.. En modo profesional.
Pongamos que es el "08093D60".
Entonces buscamos los bytes en la ram de "08093D60", y nos dara una ubicacion en la ram, entonces luego haces un wbto a esa direccion -la de la ram- y ale mini cambiado!
Pd. Deberias saber que TODO tipo de datos reflejados en la ram,son extraidos del ROM. Por lo tanto empezaran todos los punteros por 08.
Y algunas funciones del rom, estan sacadas de funciones globales de la ram.. (como x ejemplo el i/o)
A ver si lo he entendido.
Tengo que buscar el mini que quiero que aparezca en el overworld, y donde dice "Pointer del sprite me sale un nº (083A0420)
Luego, ese nº lo introduzco en el vba, en tools/memory viewer. Le doy a buscar y el 1º nº que me sale (justo a la derecha de este) es 08365BA8.
Luego pongo ese nº en un script con un writebytetooffset poniendo 0x1/20x08365BA8
Eso es lo que e probado y no me sale.
Lo estoy haciendo bien?? :s
No, has entendido mal..
Abre tu rom en el overworld editor y pon el sprite de tu protagonista, y dale a vista modo profesional.
Entonces te salen 3 pointer sprite, pues te has de quedar con el tercero.
Ahora abres el rom con el vba y le das a search cheata for cheats en modo 32bits (porque una direccion son puntero+direccion, pongamos que la direcion es 080F3D65, pues 08 es el puntero y 0F3D65 es la direccion... Entonces cada byte son dos numeros, y como hay 8 numeros, pues en total son 4bytes. Y 4 bytes son 32bits.. -1byte=8bits-)
Es por eso por lo que has de buscar ese offset en modo 32 bits.
Entonces le das a buscar con el search cheats for cheats esa direccion y si te sale algo sera una direccion de la ram, pues a esa es a donde habras de hacer el writebytetoooffse, poniendo el pointer sprite numero 3 del sprite que quieras manejar.
Por otro lado, NUNCA hagas un wbto a una direccion con puntero 08, ya que esto es el ROM, y este es solo de lectura, por lo cual mientras se ejecuta NO puedes sobreescribir su informacion...
Al buscar la direccion del prota me sale 02020648, eso lo pongo en un writebytetooffset, pero como?
Lo escribo asi en el script:
writebytetooffset 0x1(aqui no se que poner) 0x02020648
Pero el mini del prota se estropea, como hago para que se transforme en el mini que yo quiera?
Tambien probe en buscar en el search for cheats la direccion del pointer 3 del mini que quiero que aparezca, pero no me salen resultados, no encuentra ninguna direccion.
Ponme una screen de lo que te sale en esa direccion.
Porque cada direccion es un byte, y normalmente cuando intentas cambiar un mini, la direccion que te dan es el primer byte, que es el puntero. Asi que solo has de cambiar los 3 primeros bytes de despues de ese numero...
Pasame screen y te digo!
En lugar de 0x1 pones el pointer 3 del mini que quieres, lógicamente. Aún así, me parece muy raro que puedas hacerlo en FR, por el tema de la RAM dinámica y eso...
Muy bien, hasta ahí quería llegar...
Has encontrado el offset en la RAM que carga el mini del protagonista.
La direccion es:
02020648 = A0 (Primer byte de la dirección donde se ubica el mini en la ROM.)
02020649 = 00 (Segundo byte de la direccion donde se ubica el mini en la ROM.)
0202064A = 3A (Tercer byte de la direccion donde se ubica el mini en la ROM.)
0202064B = 08 (Es el puntero del mini, que indica que carga un dato del ROM.)
Tendriamos que cambiar los 3 primeros bytes de esa direccion.
Para colocar una nueva dirección.
Supongamos que el nuevo mini su pointer 3 es el 083A0C40.
Lo permutamos -ya que todo está permutado en la rom cuando apunta a una dirección..-
083A0C40 = SIN PERMUTAR
400C3A08 = PERMUTADO.
Como vemos, que el pointer es el mismo EN AMBOS MINIS (Y siempre será el mismo pointer para TODOS los datos siempre y cuando sean extraidos DEL MISMO LUGAR, -VRAM, I/O,ROM..etc.-) soloo hará falta 3 writebytetooffset.
Y en resumen, siempre que quieras substituir un gráfico u otra cosa con el WBTO, y en el offset que estes indique una direccion offset (3 bytes)| Puntero, habras de modificar solo los 3 bytes primeros.
Mmm que extraño, como dijo cosara, en FR es más "dificil", ya que solo ha sido comprobado en rubí.. y fr en este sentido es más complejo -.-'
Ves con el memoryviewer y comprueba que se hayan cambiado los bytes..
Si no, pasame un FR sin mugs, y dejame que pruebe ;P
Vale fallo garrafal mío, por falta de práctica.
La estructura de un offset, que apunta a otra dirección es un offset permutado.
Es decir, en la dirección de la ram, hayarás la direccion fisica donde se haya el gráfico, pero permutada.
Así mismo, el offset que carga el mini:
02020648 --> A0 00 3A 08 (si te fijas es la dirección fisica que buscamos en el search for cheats, pero permutada)
Así que como estamos en la ram, hay que editar esa dirección, mediante WBTO, poniendo la nueva direccion fisica de nuestro nuevo mini.
De manera que si vamos al visual viewer a la dirección "02020648", encontraremos la siguiente combinacion de bytes. --> 40 0C 3A 08
Y guala! ya tendremos nuestro sprite cambiado con éxito -Si es la misma paleta-
Si no es la misma paleta, tocará poner unos 30 WBTO más para cambiar toda la paleta del sprite, ya que no he podido encontrar como carga la paleta el sprite..
PD:Ah, y no olvides poner scripts de nivel en TODOS los mapas donde interactues con el mini cambiado, con el WBTO, ya que al refrescar la pantalla, los cambios se pierden y vuelven al por defecto.
PD2: De paso, te pondré para que sirve cada pointer.. ANIM POINTER= Animacion del mini. (Te aconsejo cambiarla si el mini no tiene la misma animacion, para evitar problemas)
POINTER 1 = WIDTH del mini
POINTER 2= HEIGHT del mini
POINTER 3= Informacion de mini. (con todas sus frames)
PD3: Adjunto foto...
(No cambie la paleta, por eso se ve con la paleta del protagonista.. para eso como dije anteriormente hacen falta 30 wbto más.. si los quieres hacer allá tu, pero es mejor usar distinto mini, misma paleta..)
-----------------------------
EDIT:
Me he molestado en hacer yo TOOODO el script, para obtener un cambio de mini del protagonista, al policia de FR..
Espacio minimo necesitado (en bytes): 198 bytes.
(Lo que viene a ser 12 lineas de código..)
¿Mucho? Sí, pero el espacio está para gastarlo ¿no?
PD: Esto también se podría hacer por ASM... y se vería notablemente reducido el espacio usado, ya que con asm puedes manejar cadenas de 32 bits (4bytes) y tan solo ocupariamos un par de lineas, ya que con una funcion cargamos el mini anterior, cargamos el mini nuevo, y con 4 funciones mas cargamos toda una paleta.. (4x4=16^^)
¡Es más fácil en nuestro Discord! Actualmente la comunidad está más activa en nuestro Discord oficial. Todavía puedes crear tu duda aquí si lo prefieres, pero recuerda que estamos en Discord para poder ayudarte de una forma más ágil.