Registrarse

Cambiar al prota

Estado
Cerrado para nuevas respuestas.

Jo7a

Kiero mi nick amarillo D:
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:

Bueno espero que me ayuden, grax!
 

cosarara97

Dejad de cambiar de nick
Miembro de honor
http://whackahack.com/foro/t-CAMBIO-MINI-RUBY-USA?pid=80084#pid80084
No necesitas ASM, solo un writebytetooffset.
 

eing

Miembro de honor
Miembro de honor
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...


Un saludo!
 

cosarara97

Dejad de cambiar de nick
Miembro de honor
Para buscar el puntero no hace falta el cheat engine, puedes hacerlo directamente con vba.
 

Jo7a

Kiero mi nick amarillo D:
Ya probe a buscar el puntero del mini, pero auna vez lo encuentro, no se que hacer con el
 

cosarara97

Dejad de cambiar de nick
Miembro de honor
Una vez lo encuentres, apuntas su dirección y haces lo mismo que harías con ruby...
 

eing

Miembro de honor
Miembro de honor
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)
 

Jo7a

Kiero mi nick amarillo D:
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/2 0x08365BA8
Eso es lo que e probado y no me sale.
Lo estoy haciendo bien??
:s
 

eing

Miembro de honor
Miembro de honor
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...
 

Jo7a

Kiero mi nick amarillo D:
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.
 

eing

Miembro de honor
Miembro de honor
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!

Pd. El offset de donde lo has sacado?
 

Jo7a

Kiero mi nick amarillo D:
Bueno, aki hago un resumen de los pasos que sigo:

Y despues en el script de un mini de ciudad pongo:
writebytetooffset 0x1(aqui no se que poner) 0x02020648
Pero no me sale, que paso me e saltado? :S
 

cosarara97

Dejad de cambiar de nick
Miembro de honor
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...
 

eing

Miembro de honor
Miembro de honor
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.

Quedaría así...

writebytetooffset 0x40 0x02020648
writebytetooffset 0x0C 0x02020649
writebytetooffset 0x3A 0x0202064A


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.
 

Jo7a

Kiero mi nick amarillo D:
Lo he probado con el pointer 3 del mini en el que me quiero comvertir, es 083A0420
Asi que en el script pongo:

writebytetooffset 0x3A 0x02020649
writebytetooffset 0x04 0x0202064A
writebytetooffset 0x20 0x0202064B


Pero cuando se ejecuta, el mini del prota y el mini con el que ablo se estropean y se ven a rayas.
 

eing

Miembro de honor
Miembro de honor
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
 

Jo7a

Kiero mi nick amarillo D:
http://whackahack.com/foro/t-Fire-Red-Usa-sin-bugs
Ahi tienes uno, es el mismo que uso yo, FR USA.
 

eing

Miembro de honor
Miembro de honor
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.

Así que deberiamos colocarlo así..

writebytetooffset 0x40 0x02020648
writebytetooffset 0x0C 0x02020649
writebytetooffset 0x3A 0x0202064A

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..

IMAGEN:


Y el script os lo dejo en un spoiler ^^
#org 0x16575C
faceplayer
writebytetooffset 0xC0 0x02020648
writebytetooffset 0x04 0x02020649
writebytetooffset 0x3A 0x0202064A
writebytetooffset 0x5F 0x020377FA
writebytetooffset 0x5B 0x020377FB
writebytetooffset 0xFE 0x020377FC
writebytetooffset 0x4A 0x020377FD
writebytetooffset 0x5B 0x020377FE
writebytetooffset 0x3A 0x020377FF
writebytetooffset 0x0F 0x02037800
writebytetooffset 0x21 0x02037801
writebytetooffset 0x7F 0x02037802
writebytetooffset 0x27 0x02037803
writebytetooffset 0xBA 0x02037804
writebytetooffset 0x12 0x02037805
writebytetooffset 0x90 0x02037806
writebytetooffset 0x01 0x02037807
writebytetooffset 0x34 0x02037808
writebytetooffset 0x76 0x02037809
writebytetooffset 0x4D 0x0203780A
writebytetooffset 0x5D 0x0203780B
writebytetooffset 0xE8 0x0203780C
writebytetooffset 0x30 0x0203780D
writebytetooffset 0xDD 0x0203780E
writebytetooffset 0x21 0x0203780F
writebytetooffset 0x15 0x02037810
writebytetooffset 0x1D 0x02037811
writebytetooffset 0xC9 0x02037812
writebytetooffset 0x18 0x02037813
writebytetooffset 0xFF 0x02037814
writebytetooffset 0x7F 0x02037815
writebytetooffset 0x00 0x02037816
writebytetooffset 0x00 0x02037817
end

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^^)

Saludos..
 
Estado
Cerrado para nuevas respuestas.
Arriba