Anuncio del foro
  • Visita el area de tutoriales sobre pokéhacking.
    No es una pila de documentos para resolver dudas puntuales sino una wiki dinámica donde investigar y publicar técnicas para que la comunidad mejore.

    Tutoriales Herramientas
  • Wah es una comunidad hispana dedicada a la creación y modificación de contenido creativo sobre Pokémon.

    Ver todos los Hacks Hall de la Fama
    • Novedades Pokemon Mirage
    • MHM marzo PK IslasDoradas
    • Beta del Pokemon Light Platinum
    • Pokemon Crono, el Mejor Hack del Año 2010
  • El museo donde se exponen los trabajos de dibujantes de sprites seleccionados para que sirvan de ejemplo a seguir por otros spriters.

    Ver Galerías
  • Con autoaprendizaje, y descargando aquí los archivos necesarios, el único límite será tu propia imaginación.

    Descargas Códigos Tiles Parches Hacks Herramientas
  • T
  • H
  • S
  • D

Manual I/O

Aprende a manejar los datos de entrada y salida del rom

Antes que nada, diré que este tutorial es muy útil para hacer unos scripts creativos.

Como ejemplo podeis ver este script de Pidgeot que hice para el Keyra.

Bueno, pasemos al verdadero manual.

¿Que es el I/O de nuestra GBA?
En primer lugar, I/O quiere decir Input/Output (Entrada/Salida). Refiriendose a datos, es obvio, y esos son los datos que se manejan entre nuestro rom y nuestra GBA. Es decir, un envío de datos continuos del Software al Hardware, y del Hardware al Software.
Los datos que se manejan con el I/O son, sonidos (volumen, agudeza..etc.), calidad imagen (distorsionada, nítida..etc.), teclas que presionas en cada momento. (Z, X, A, S, Arriba, Abajo..etc.)

Con los datos mencionados anteriormente, puedes hacer lo que quieras. Estos se clasifican en:

  • <>Solo lectura (los datos solo se pueden leer, mediante un "comparefarbytetobyte 0xdireccionRAM 0xBYTE, no se pueden escribir, ya que seria una tonteria.)
  • Lectura y escritura (Los datos se pueden escribir y leer.)
  • Otros (Estos otros, en verdad no existen, pero los coloco porque son datos, que simplemente están ahí y no los puedes modificar, ya que su variación de un byte a otro es muy rápido, y es casi imposible visualizar cada byte para el ojo humano, por lo tanto, ni se podrán leer ni escribir por tu cuenta, solo podrá hacerlo el rom.)

Ahora daré un ejemplo de cada uno de ellos, y también un pequeño script, donde usaré mi imaginación, para darle utilidad. Vosotros una vez aprendido el funcionamiento de esos datos de I/O, podeis darle otra utilidad.

Solo lectura
Un ejemplo de estos tipos de datos, sería saber que teclas presionas en cada momento.
Las teclas que presionas se hayan en la dirección 4000130 y 4000131. (Los bytes van de dos digitos en dos..) Por defecto, los dos bytes ubicados en dicha dirección son: 03FF (Recordad que están permutados, en realidad es FF03). A continuación dejo una lista de los bytes que significan cada cosa:

40001304000131Tecla Pulsada
FF00AS
FF01A
FF02S
FE03Z
FD03X
FC03ZX
FB03<-
F703Enter
7F03Abajo
BF03Arriba
DF03Izquierda
EF03Derecha

*He colocado en la tabla los botones que mas se usan, así como posibles combinaciones al igual que (AS + arriba), que sería BF y 00.

Como veis, eso son todas las teclas disponibles en el Visual Boy Advance (si tienes la configuracion por defecto claro..)
Y ahora, os preguntareis, vale si. Fácil pero.. ¿para que sirve?
Bien, con esto pueden hacer muchos tipos de scripts muy ingeniosos, desde mover minis que no sean el protagonista, (ojo, no respetarán las distintas capas ¡cuidado!), alguna combinacion de teclas para poner un password..etc. Ya sabeis, usar la imaginación.
La forma de usarlo, es así...

comparefarbytetobyte 0x4000130 0xbyte tabla

Lo que hace ese comando del XSE, es comparar una dirección del rom, con un byte.
Bueno, continuemos con una estructura de script para que veais un ejemplo.

Explicacion del script: Será una "caja" donde haya que poner contraseñas, y la contraseña estará escrita en una direccion fisica del rom. (memory viewer en apartado ROM). Allí escribiremos -dentro del mismo script esta claro-, los bytes de las teclas que deberemos presionar para que la contraseña sea correcta. Y luego ya introducir la contraseña que el jugador quiera. La contraseña que escriba el jugador, se escribe en otra direccion del ROM, y luego cuando ya se han introducido todos los dígitos/caracteres, se comparan. Si son iguales, pues la contraseña será correcta, de ser incorrecta, ya con que de error el primer digito, dirá que la contraseña es erronea.
(CLICK EN MOSTRAR SCRIPT PARA VISUALIZARLO.)
Mostrar script de ejemplo
También podeis hacer con las teclas de movimiento, lo que yo hice con el pidgeot, simplemente deberás crear la misma estructura que arriba, comparando que tecla presionais, y un bucle que si no presionas ninguna tecla de direccion, vuelva a empezar de nuevo las comprobaciones. Y por cada direccion un applymovement. (recordar que los applymovement, no respetan capas, así que usarlo para algo como el "volar").

Lectura y escritura
Son aquellos datos, que se pueden leer mediante un "comparefarbytetobyte 0xdireccion 0xbyte" , "comparefarbytetofarbyte 0xdireccion 0xdireccion" ..etc.
Y mediante esa comparación obtener un resultado, o bien sobreescribir un dato con "writebytetooffset 0xbyte 0xoffset".

Por ultimo, voy a explicar como encontrar cada dato en el I/O wiever.

Como encontrar cada dato en el I/O wiever
Primero que nada cargamos nuestro rom, y esperamos a que estemos en un mapa cualquiera.
Seguido de ello, vamos a Tools --> memory viewer. Y activamos la casilla "automatic update".
Dejen abierto esta ventanita, y ahora vayan de nuevo a Tools --> IO viewer. (En este No activen la casilla "automatic update", si no, no les dejará investigar..)
Y ahora una vez abierto, en el IO viewever ¡investiguen!.
Yo a continuación dejaré mis investigaciones, que a mi me han parecido útiles para posibles scripts...

DIRECCIONES BYTES SUCESO
4000000 4000001 60 5F Toda la pantalla negra. Solo se ven los msgbox.
4000000 4000001 60 6F Oculta TODOS los minis.
4000000 4000001 60 70 Toda la pantalla negra, solo se ven los minis.
4000000 4000001 E0 7F Vuelve la pantalla totalmente blanca.
4000040 4000041 7F 70 Solo se ven los tiles que estén en la misma vertical de la coordenada del mini.
4000048 4000049 2F 1F Desaparecen todos los minis y objetos del mapa.
4000082 4000083 ?? ?? Altera esos bytes, mirando el IO, y conseguirás distintos efectos en la melodia que suena..
4000084 4000085 0B 00 Silencia el rom, es decir desactiva el sonido.
4000130 4000131 ?? ?? Por cada tecla presionada, indica un byte. Útil para el ejemplo mencionado mas arriba.
4000208 4000209 00 00 Crashea el juego, y se queda congelado. (se arregla poniendo writebytetooffset 0x01 0x04000208)

Ejemplo de Script

#org 0xinicio
checkflag 0x1200 //Compara si ya has abierto la caja fuerte. 
if 0x1 goto 0xfinal // Si es si, ir al texto final 
writebytetooffset 0x01 0x087F0000 //Escribe el primer digito de la contraseña en la direccion del ROM 087F0000. 
writebytetooffset 0x02 0x087F0001 //Idem que arriba. (Poner tantos como digitos que quieras que tenga la contraseña. 
msgbox 0x8texto 1 //Primer texto, ejemplo: "Oh una caja fuerte, pero está cerrada hay que abrirla con una contraseña, vamos a introducirla.." "Presiona cualquier tecla que creas que es la contraseña" 
callstd 0x2
goto 0xintroducir_contraseña  //IR a introducir contraseña 

#org 0xintroducir_contraseña
compare 0x4051 0x2 //Comparar cuantas digitos has introducido, si ya son dos, ir a contraseña introducida. (Poner X valor a la variable, como digitos haya que poner, 5 digitos = 0x5 
if 0x1 goto 0xcontraseña_introducida // Ir a la direccion donde ya haya sido introducida la contraseña.
comparefarbytetobyte 0x4000130 0x7F //Compara si la tecla presionada es "Abajo"
if 0x1 goto 0xcomprobar_1 //Si es si, ir a comprobar_1
comparefarbytetobyte 0x4000130 0xDF //Compara si la tecla presionada es "Izquierda"
if 0x1 goto 0xcomprobar_2 //Si es si, ir a comprobar_2
comparefarbytetobyte 0x4000130 0xBF //Compara si la  tecla presionada es "Arriba" 
if 0x1 goto 0xcomprobar_3 //Si es si, ir a comprobar_3
comparefarbytetobyte 0x4000130 0xEF //Compara si la tecla presionada es "Derecha" 
if 0x1 goto 0xcomprobar_4  //Si es si, ir a comprobar_4 
comparefarbytetobyte 0x4000130 0xF7 //Compara si la tecla presionada es "Enter" 
if 0x1 goto 0xcomprobar_5 //Si es si, ir a comprobar_5 
comparefarbytetobyte 0x4000130 0xFD //Compara si la tecla presionada es "X" 
if 0x1 goto 0xcomprobar_6 //Si es si, ir a comprobar_6
comparefarbytetobyte 0x4000130 0xFE //Compara si la tecla presionada es "Z" 
if 0x1 goto 0xcomprobar_7 //Si es si, ir a comprobar_7
comparefarbytetobyte 0x4000131 0x01 //Compara si la tecla presionada es "A" 
if 0x1 goto 0xcomprobar_8 //Si es si, ir a comprobar_8
comparefarbytetobyte 0x4000131 0x02 //Compara si la tecla presionada es "S" 
if 0x1 goto 0xcomprobar_9 //Si es si, ir a comprobar_9 
goto 0xintroducir_contraseña //Ir a introducir_contraseña de nuevo, ya que no has presionado ninguna tecla. (Se produce un bucle, hasta que presiones una tecla.)

#org 0xcomprobar_1 
compare 0x4051 0x1 //Compara si ya has introducido algun digito de la contraseña.
if 0x1 goto 0xcomprobar_1_1 //Si es si, ir a comprobar_1_1
writebytetooffset 0x7F 0x087F1000 //Escribir el byte de la tecla presionada, en una direccion del rom.
addvar 0x4051 0x1 //Añade +1 a la variable 4051, esto indica que ya hemos introducido un digito de la contraseña.
goto 0xintroducir_contraseña //Ir de nuevo a introducir contraseña

#org 0xcomprobar_1_1 //Ya has introducido previamente un digito de la contraseña.
writebytetooffset 0x7F 0x087F1001 //Escribe el byte de la tecla presionada en una direccion del rom. 
addvar 0x4051 0x1 //Añade +1 a la variable 4051, esto indica que hemos introducido otro digito de la contraseña.
goto 0xintroducir_contraseña  //Ir de nuevo a introducir la contraseña
//No comento los demás, porque es igual que el _1 y _1_1, salvo que cambiando el byte que se escribe en el rom.
#org 0xcomprobar_2
compare 0x4051 0x1 
if 0x1 goto 0xcomprobar_2_1
writebytetooffset 0xDF 0x087F1000
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_2_1
writebytetooffset 0xDF 0x087F1001
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_3
compare 0x4051 0x1
if 0x1 goto 0xcomprobar_3_1
writebytetooffset 0xBF 0x087F1000
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_3_1
writebytetooffset 0xBF 0x087F1001
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_4
compare 0x4051 0x1
if 0x1 goto 0xcomprobar_4_1
writebytetooffset 0xEF 0x087F1000
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_4_1
writebytetooffset 0xEF 0x087F1001
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_5
compare 0x4051 0x1
if 0x1 goto 0xcomprobar_5_1
writebytetooffset 0xF7 0x087F1000
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_5_1
writebytetooffset 0xF7 0x087F1001
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_6
compare 0x4051 0x1
if 0x1 goto 0xcomprobar_6_1
writebytetooffset 0xFD 0x087F1000
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_6_1
writebytetooffset 0xFD 0x087F1001
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_7
compare 0x4051 0x1
if 0x1 goto 0xcomprobar_7_1
writebytetooffset 0xFE 0x087F1000
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_7_1
writebytetooffset 0xFE 0x087F1001
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_8
compare 0x4051 0x1
if 0x1 goto 0xcomprobar_8_1
writebytetooffset 0x01 0x087F1000
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_8_1
writebytetooffset 0x01 0x087F1001
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_9
compare 0x4051 0x1
if 0x1 goto 0xcomprobar_9_1
writebytetooffset 0x02 0x087F1000
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcomprobar_9_1
writebytetooffset 0x02 0x087F1001
addvar 0x4051 0x1
goto 0xintroducir_contraseña

#org 0xcontraseña_introducida //Ya hemos introducido la contraseña completa.
comparefarbytetofarbyte 0x087F0000 0x087F1000 //Comparamos el byte escrito por nosotros (el byte que nosotros queremos) al que ha escrito el player (el byte que él ha querido) 
if 0x0 goto 0xerror_contraseña //Si no son iguales, ir a contraseña erronea
sound 0xconfirmacion //Sonido de confirmacion, primer digito correcto.
comparefarbytetofarbyte 0x087F0001 0x087F1001  //Comparamos el segundo byte escrito por nosotros de la contraseña (el que nosotros queremos) al que ha escrito el player
if 0x0 goto 0xerror_contraseña  //Si no son iguales, ir a contraseña erronea.
sound 0xconfirmacion //Sonido de confirmacion. 
goto 0xtodo_correcto //Ir a todo correcto 

#org 0xerror_contraseña  //Error en la introduccion de los datos.
msgbox 0x8texto 2 //Texto segundo, "la contraseña introducida es incorrecta, vuelve a intentarlo más tarde."
callstd 0x2
end

#org 0xtodo_correcto //La contraseña introducida es correcta.
sound 0xfanfare //Sonido de que todo ha sido llevado a cabo bien 100%.
msgbox 0x8texto 3 //Texto tercero, "La contraseña es correcta, y la caja se abrió.."
callstd 0x2
giveitem 0xobjeto 0xcantidad  //Premio por abrir la caja fuerte.
setflag 0x1200 //Activamos la flag, para que no se repita más el script.
release
end

#org 0xfinal //Una vez activada la flag.
msgbox 0x8 texto 4 //Algun texto indicando que la caja fuerte ya ha sido abierta..
callstd 0x2
release
end
PHO

Tutorial escrito por Eing.
Web designed by Serg!o.
Hosting powered by HostingGazel.

Pokémon y todos sus respectivos nombres son marcas registradas y © de Nintendo Nintendo 1996-2010.

Para más información véase el aviso legal.