Direcciones (offset) y punteros (pointer)

Colocar datos y usar comandos que usan direcciones

¿Qué números poner en los comandos messagebox y applymovement? ¿Qué son la direcciones? ¿Cómo se usan? ¿Cuáles están libres?

Parece que aunque con las guías de scripts bastante gente está aprendiendo a hacerlos. Pero también algunas personas se lían con los comandos en los que hay que poner una dirección y solo consiguen usar comandos sencillos (faceplayer, end, etc.) y los que usan índices (givepokemon, wildbattle...).

Diccionario

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 messagebox 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:
Cuano 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 también se necesitan cargarse con punteros.

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 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 imágenes de un ejemplo:
  1. Primero localizamos un espacio desocupado (en el ejemplo 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...
    ... 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.
  3. 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.
  4. Ahora en el script tienes que poner los comandos como están explicados en la guía de comandos y en la de 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