Registrarse

[Scripting] Evitando el refrescado

Mariofan

Usuario mítico
[align=center]Antes que nada debo aclarar algunas cosas:[/align]

-Esto es Universal, osea para cualquier ROM.

-Para entender esto, debes saber por lo menos usar el comando WBTO(Writebytetooffset)

-Debes saber manipular la ram con WBTO (Para este caso se recomienda saber cambiar las paletas)

-Debes saber usar el HxD (Buscar datos, editar, ect)

-Este metodo debe ser usado con precaucion, la RAM es limitada asi que no es bueno abusar de ella con este metodo.

[align=center]Comenzemos...[/align]

Vosotros debereis saber que al utilizar el WBTO, podemos manipular lo que sea que este en la RAM, cualquier cosa. Inclusive, podemos manipular aspectos graficos de pantalla con esto (Entiendase VRAM o Video Ram).

El problema viene cuando queremos por ejemplo, cambiar las paletas o el mini del prota, que al abrir la mochila, o con un warp, o un fadescreen, estos vuelven a ser normales...

Eso se debe al refrescado de pantalla, que no es mas que la accion de resetear toda la VRAM.

En pocas palabras, olvidaos de cambios de paletas o de minis duraderos, porque apenas abris la mochila y ¡puf! se quitan.

[align=center]Pero aqui traigo un truco para que el cambio dure para siempre...[/align]

Al resetear la VRAM, el juego Carga nuevamente todos los graficos y paletas desde la ROM hasta la VRAM. Lo que vamos a hacer aqui es cambiar esto:

Cargar desde Rom hasta VRAM

por esto:

Cargar desde RAM hasta VRAM

¿Que hacemos con eso?, sencillo, hacemos que el juego cargue los graficos y paletas X desde la RAM y no desde la rom.

[align=center]Para este ejemplo voy a hacer un cambio de paletas permanente[/align]

1. Vamos a tomar el offset de nuestra paleta y lo permutamos. Entiéndase por permutar, a voltear los bytes de forma que el primero quede de ultimo y el ultimo quede de primero (Ejemplo, si el offset de la paleta es 345A2B, permutado seria 2B5A34)

2. Entramos al HxD y usamos la opcion "Buscar", y buscamos esos bytes permutados.

3.Al encontrarlos el HxD los sombreara, lo que vamos a hacer es a cambiar esos bytes por una dirección en la WRAM. Cambiaremos tambien el 08 que esta justo despues de los bytes encontrados.

Yo usare como ejemplo la direccion 02026CBA(Permutada, es decir BA6C0202), por lo que sustituire los bytes que encontre (En este caso el "2B5A3408") por "BA6C0202.

Con eso hacemos que el juego cargue la paleta desde la WRAM, y no desde la ROM. La ventaja de la WRAM es que se guarda junto con el archivo .sav del juego. Otra ventaja primordial seria que la WRAM es totalmente modificable usando WBTO.

4. Ahora colocaremos en un script al inicio del juego (O en una parte temprana en la que aun no se pueda acceder a la paleta) lineas de WBTO para cargar la paleta en la WRAM.

Haced como si escribieses cualquier dato en cualquier posicion de la RAM, solo que en este caso usareis la direccion en WRAM que colocaste en HxD y cargareis con WBTO vuestra paleta en esa direccion.

en este caso seria:

Writebytetooffset 0x20 0x02026CBA
Writebytetooffset 0x15 0x02026CBB
Writebytetooffset 0x63 0x02026CBC
......
Y asi hasta cargar toda la paleta
Es casi igual que cambiar una paleta de forma normal, solo se distingue en dos cosas:

-Utilizais la direccion en WRAM que pusiste en el HxD
-En esta parte, cargais vuestra paleta ORIGINAL

Si hiciste todo bien, la paleta debería quedar en la WRAM al ejecutarse ese script, por lo que a partir de alli la paleta cargara normalmente como si estuviese en la ROM.

Con una pequeña diferencia ;) , esta radica en que la RAM a diferencia de la ROM, es totalmente modificable :awesome:

Tan solo Abrid el memory viewer con la paleta cargada, y dirigios a la direccion en WRAM que usaron en el HxD. Vereis los bytes de la paleta en cuestion, entonces ¡Cambiadlos! y luego refresca la pantalla(Abre la mochila xD)

BOALA!! al hacer eso la paleta a cambiado segun lo que pusiste en el memory viewer, y lo mejor es, que al refrescar, ¡Esta no vuelve a ser igual que la original!

Perfecto, pero ¿Lo ideal no seria que el juego mismo las cambie y no el usuario, verdad?. Pues en ese caso usaremos WBTO

5.Repetiremos el proceso que hicimos en el primer script, pero esta vez cargaremos la paleta cambiada.
Luego solo refrescamos con un Fadescreen o un Special, quedaria algo parecida a esto:

Writebytetooffset 0x55 0x02026CBA
Writebytetooffset 0x00 0x02026CBB
Writebytetooffset 0x85 0x02026CBC
...
(Muchos WBTO despues)
...
special 0x8e
end
Y con ese script, ya quedarían cambiadas las paletas, y lo mejor es que al refrescar, ESTAS NO VUELVEN A SER LAS ORIGINALES!!, incluso si guardasemos el juego y cerrasemos el emulador ESTAS NO CAMBIARIAN!! porque recordad que la WRAM se guarda con el .sav :awesome:

Y si quisiésemos hacer que las paletas volviesen a ser las originales, tan solo tendriamos que repetir el primer script(EL que carga las paletas originales)

Con esa tecnica, podreis hacer maravillas, como rutas primaverales que de pronto se ponen blancas por la nieve XD

Y si no me equivoco, también podéis aplicarla para otros datos como los minis y esas cosas, pero lamentablemente eso aun no lo termino de investigar xD
 

~Javs

Admon. retirado.
Miembro de honor
En vista de que nuestros users tienen tanta flojera que se limitan
a poner un +Gracias (lo cual, sí, me desepciona..), yo te comento;

Me gustan muchos tus investigaciones, MarioFan. Sin duda, eres
una persona muy curiosa por naturaleza y tus proyectos siempre
tienen un avance muy grande.

Esperemos que sigas poniendo el RomHacking hispano en alto,
junto con otros users de WAH ^^

Ahora, en lo que decimos del tutorial, puede ser muy útil combinado
con la más grande arma, la imaginación.. Ya cada quién puede
saber cómo hacer algo que talvez siempre ha querrido hacer xD

Y bueno, bien explicado, como siempre, bien estructurado, paso a
paso, etc..

Felicidades. ¡Saludos!
 
Muy bien, ya decía yo que este tío andaba en otras andanzas...
Felicidades por esta, por las de antes y por las que vendrán! sigue así!
Saludos.
 

Sonicarvalho

Tutorial Maker
Es realmente una buena técnica, yo nunca me habría recordado de hacer 'loading' de la RAM.

Solo hay unas pequeñas cosas a apuntar.
Tu dijiste que la WRAM se guardaba con el Sav. Esto no es de todo verdad! Mira:
EWRAM->02000000-02040000 (256Kb)
SRAM(save ram)-> 0E000000-0E010000 (64kb) o en la mayoría de los casos 32Kb.

...Así que no se guarda todo en el SRAM! Tuviste la suerte encontrar un offset que es guardado en el SRAM. Y mas una cosa: el WRAM no guarda los offsets donde los datos estaban en SRAM, el juego es el que decide eso (en el principio, antes de el CopyRight screen, que ya he analizado las rutinas de Loading). Eso significa que estas sobrescribiendo algo que el juego necesita (pero si no hay bugs con ese offset, entonces debes usar ese)

Otra cosa menos importante, solo para que pienses sin errores acerca de esto : Las palletes no van para la VRAM, solo los tiles y tilemaps.
Las palletas tienen una área especifica de la RAM (05000000), 1kb, y en VRAM hay datos que definen cual paleta los tiles van a usar

Mas una cosa: Estar haciendo WTBO's muchas veces es desperdicia mucho espacio en la ROM.
Para te facilitar la tarea, acá esta una rutina que te copiará la palleta desde la ROM al offset en la RAM que quieras (no es para gold road, solo para DevKitArm y Mid2GBA):

Sonicarvalho dijo:
.code 16
push {r0, r1, r2, lr}
ldr r1, .PaletteDestination
ldr r0, .PaletteSource
mov r2, #16
swi 11
pop {r0, r1, r2, pc}
.align 2
.PaletteDestination:
.word 0x0202EF88
.PaletteSource:
.word 0x087FFDC4
Solo tienes que cambiar los offsets de las palletas en la ROM y RAM.
Pienso que para goldroad sería así:

Sonicarvalho dijo:
@Define PaletteDestination = 0x0202EF88
@Define PaletteSource = 0x087FFDC4

@Thumb
push {r0, r1, r2, lr}
ldr r1, PaletteDestination
ldr r0, PaletteSource
mov r2, #16
swi 11
pop {r0, r1, r2, pc}
Warning: En las dos rutinas, el 16 y el 11 NO SON HEX. Si quieres hex, sustituis 16 por 0xF y 11 por 0xB.

Bien, esta es mi contribución.
Espero haber ayudado.

Saludos de Sonicarvalho
 

Cheve

MoonLover~
Miembro de honor
¡Vaya!¡Muchas Gracias! Sirve mucho... (Ahora podré cambiar un mapa desde el Rom, usando ésto y setmaptile :awesome: )

Muchas Gracias :D

@Javs: Tienes razón, lo siento :shy:
 

Mariofan

Usuario mítico
Sonicarvalho dijo:
Es realmente una buena técnica, yo nunca me habría recordado de hacer 'loading' de la RAM.

Solo hay unas pequeñas cosas a apuntar.
Tu dijiste que la WRAM se guardaba con el Sav. Esto no es de todo verdad! Mira:
EWRAM->02000000-02040000 (256Kb)
SRAM(save ram)-> 0E000000-0E010000 (64kb) o en la mayoría de los casos 32Kb.

...Así que no se guarda todo en el SRAM! Tuviste la suerte encontrar un offset que es guardado en el SRAM. Y mas una cosa: el WRAM no guarda los offsets donde los datos estaban en SRAM, el juego es el que decide eso (en el principio, antes de el CopyRight screen, que ya he analizado las rutinas de Loading). Eso significa que estas sobrescribiendo algo que el juego necesita (pero si no hay bugs con ese offset, entonces debes usar ese)

Otra cosa menos importante, solo para que pienses sin errores acerca de esto : Las palletes no van para la VRAM, solo los tiles y tilemaps.
Las palletas tienen una área especifica de la RAM (05000000), 1kb, y en VRAM hay datos que definen cual paleta los tiles van a usar

Mas una cosa: Estar haciendo WTBO's muchas veces es desperdicia mucho espacio en la ROM.
Para te facilitar la tarea, acá esta una rutina que te copiará la palleta desde la ROM al offset en la RAM que quieras (no es para gold road, solo para DevKitArm y Mid2GBA):

Sonicarvalho dijo:
.code 16
push {r0, r1, r2, lr}
ldr r1, .PaletteDestination
ldr r0, .PaletteSource
mov r2, #16
swi 11
pop {r0, r1, r2, pc}
.align 2
.PaletteDestination:
.word 0x0202EF88
.PaletteSource:
.word 0x087FFDC4
Solo tienes que cambiar los offsets de las palletas en la ROM y RAM.
Pienso que para goldroad sería así:

Sonicarvalho dijo:
@Define PaletteDestination = 0x0202EF88
@Define PaletteSource = 0x087FFDC4

@Thumb
push {r0, r1, r2, lr}
ldr r1, PaletteDestination
ldr r0, PaletteSource
mov r2, #16
swi 11
pop {r0, r1, r2, pc}
Warning: En las dos rutinas, el 16 y el 11 NO SON HEX. Si quieres hex, sustituis 16 por 0xF y 11 por 0xB.

Bien, esta es mi contribución.
Espero haber ayudado.

Saludos de Sonicarvalho
Es buena critica amigo, pero recuerda que el tuto comienza siendo "General", es por eso que me refiero a la VRAM en el, porque la tecnica se puede aplicar a mas cosas.

Y con respecto a lo de la SRam, pues no se como sera, pero el punto es que las variables (Esas que se usan en XSE con setvar) se guardan en la WRAM, y curiosamente se guardan con el sav.

Yo precisamente use la direccion en WRAM de una Var en Xse, y se cual es, asi que, no pasara nada siempre que no la modifique :D

Por ultimo, esa rutina esta muy bien, es aprovechable, solo que yo use el WBTO para referirme mas al publico que no sabe asm, mientras que el que si sabe, puede aprovechar aun mas el potencial de esta tecnica :XD:
 
Ainda no tenya visto esto, pero gran tuto amigo,
realmyente puede ser utilizado en muchas cosas,
cuando se piensa en algo nuevo para hacer en una hack,
esta todo muy byen explicado, mereces una +Gracias!!
Muy byen!!
 

Scarex

I'M NOT ON DRUGS
Miembro de honor
Bueno, ya me comentaste esto hace tiempo, de verdad de lo que se puede hacer con la RAM es increible, y de verdad, es que se me ocurren 100 ideas a partir de esto, una locura.

Espero que sigas aportando cosas tan interesantes como estas, el hacking se tiene que volver una lucha de ideas xD

Salu2!
 
Arriba