Dirección

De Wahackpedia

(Redirigido desde Offset)
0x6BA010

Las direcciones (offset) es la posición del comienzo de una serie de bytes. La ROM está compuesta de bytes, uno detrás de otro, pues una dirección es la posición de cada uno, el número ordinal que indica en que punto de la rom se guardan los datos.

¿Para que sirve? ¿Qué números poner en los comandos msgbox y applymovement? ¿Cómo se usan las direcciones? ¿Cuáles están libres?

Contenido

Diccionario

pk_fire_red_pyp_usav_05.png
Hexadecimal (hex)
Es un sistema de numeración de base 16 que usa la rom, se escribe con números y las letras de la a a la efe. Para identificarlo se escribe "0x(número)" aunque en AM se escribe "$(número)". Fíjate bien que cantidades están en decimal y cuales en hexadecimal. Scripted al compilar convierte automaticamente las cifras decimales que escribas a hex.
Byte
Un byte son dos cifras hexadecimales, en la rom la información se escribe en bytes. Por ejemplo esto "0F 00 19 D1 16 08 09 04" es una serie de 8 byes y así se escribiría un msgbox en la rom.
Dirección
Para localizar donde se guardan los datos de la rom, todos sus bytes están numerados desde el 0x000000 hasta el 0xFFFFFF (en decimal 0-16777215). Por ejemplo si la serie anterior la compilamos en la dirección 0x123456 significa que el primer byte (0F) está ahí, el 2º (00) en 0x123457, el 3º (19) 0x123458 y así sucesivamente. Obviamente si compilas algo en una dirección ya ocupada sobreescribirás lo que ya hubiese.
Puntero
Los punteros son como la rom encuentra la información. Aunque para los humanos la serie anterior está en 0x123456 para la rom esto se escribe así: 56341208. ¿Porqué? Pues por una parte la rom permuta los bytes y además añade un prefijo.
Permutar
Cuando decimos permutar nos referimos concretamente a escribir una serie de bytes al revés y por parejas. Como ejemplo: 00 11 AB 23 > 23 AB 11 00. En la rom todas las referencias a otros datos se escriben así, por ejemplo las flags, las direcciones, los índices... todo.
Prefijo de un puntero
Para referirse a los datos de la rom se prefija 08 a las direcciones. Eso es porque cuando el juego se ejecuta, hay datos que no están escritos en la rom como tus medallas, tu nombre tu equipo... todos esos datos se guardan en la partida guardada y necesitan cargarse con punteros que tienen otros prefijos.

Direcciones vacías.

Las rom de Pokémon tienen suficiente espacio libre para que lo habitual sea compilar nuevos scripts sobre espacio vacío en vez de socreescribir los existentes. Para localizar espacio vacío abre la herramienta Thingy verás que en rubí hacia el 0x6BXXXX hay espacio libre, en FR hacia el 0x70XXXX y en ambos también hacia el 0xEBXXXX.

Como usar espacios vacíos para scripts

Compilar en un espacio vacío es la mejor opción y para hacerlo lo más fácil es usar FreeSpaceFinder que te dice direcciones donde hay espacios vacíos. El mejor procedimiento para escribir desde cero un script es: buscar una dirección libre, compilar allí el script poner la dirección de ese script al evento de AM que elijamos y comprobar que funciona. Explicado en la guía [/es/tutorial-gba/scripts2.php#empezar Todo scripts I: Sobre un espacio vacío].

Como preparar los datos de los comandos que requieren direcciones

Aquí la duda que tienen muchos, ¿qué dirección poner en un applymov o messagebox? Hay que colocar los datos que vayamos a llevar donde queramos pues aunque estén perdidos por la rom si la dirección que escribes en el comando coincide el script funcionará bien. Al compilar el juego gamefreaks todos los textos del la rom juntos por un lado y por otro los scripts juntos con los bytes de movimiento (los movs. para abreviar). Cómo lo normal es que hagamos los eventos uno por uno lo lógico es que los textos, scripts y movs. del evento estén juntos. Para que sea más sencillo de reconocer el script cuando busques donde pusiste un evento puedes poner los textos primero y luego los script y los movs.

Voy a poner unas imágenes de ejemplo:

  1. Primero localizamos un espacio desocupado (en el ejemplo de la imagen 0x711AF0).
  2. Bien, como haremos un evento con textos y movimientos vamos a empezar a escribir los textos. Puedes hacerlo con thingy como se ve aquí, para controlar mejor dónde compilas...
dir1vp9.png


... con A-Text no se puede hacer insertar texto directamente en una dirección que elijas... aunque puedes escribir el principio con Thingy, buscarlo con AText y editarlo y ampliarlo, aunque es más pesado claro.

  1. Ahora que ya hemos compilado el texto compilamos los movimientos después de los textos, para saber los pasos, distancia, orientación y todo eso lo mejor es que los movimienos los vayas escribiendo (con thingy) mientras tienes abierto AM para ir viendo que movimientos poner. Bájate las tablas de thingy de la izquierda y con ello escribe los movimientos. Por ejemplo en Rojo fuego los movs. "mirar izquierda, exclamación, esperar, correr a la izquierda, bis, bis" sería traducidos a bytes "02 62 1C 12 12 12 FE" el último FE inidica que los movs. acaban ahí, como el end o return de un script.
  2. Ahora en el script tienes que poner los comandos como están explicados en la guía de comandos y en la de [/es/tutorial-gba/scripts2 todo scripts]. Por ejemplo aquí haremos este que puedes usar de ejemplo:
#org 0x711B60
setflag 0x800
applymovement 0x04 0x8711B40
waitmovement 0x0
msgbox 0x8711aF0
callstd 0x4
givepokemon 152 05 0 0 0 0
#binary 00 00 00 00 00 00 00
special 0x9E
clearspecial
msgbox 0x8711B19
callstd 0x4
applymovement 0x04 0x8711B50
waitmovement 0x0
#binary 53 04 00
release
end

Dudas

helpc.png