Cabecera de scripts de nivel

Como ubicar scripts en la cabecera de una mapa

El objetivo es conseguir que se carguen scripts nada más entrar en un mapa. Como cuando alguna gente cambia de posición hasta que ocurran determinados eventos, o cuando entras en el club de Fans de Pokémon después de ganar la liga y la gente se te acercan para felicitarte.

El rollo:

Bueno, esto es el resultado de un poco de investigación que hice para hacerme yo un script de mapa. Voy a explicar un poco como llegué yo a los resultados (incompletos, pero suficientes), para que así podais indagar vosotros en los scripts de otros mapas:

El mapa en el que investigué fue el Centro Pokémon de One Island (la primera de las islas Sevii).

Lo primero que teneis que saber es donde encontrar/poner los datos del cabezal del mapa. En Elitemap, puedes encontrar su dirección dándole al botón "ver guión del nivel" (se te abrirá en scripted... pero kawa no sabía que esos datos no son un script cuando lo hizo).

Para estar más seguro (y no tener que abrir elitemap, yo apenas lo uso y uso mucho advancemap), en Advancemap lo puedes encontrar en el cabezal del mapa.

Para ver el cabezal del mapa, activa antes la opcion "vistra profesional del cabezal " o pulsa ctrl+H. Ve a la pestaña "Visor del cabezal" y en el cabezal del mapa verás un montón de números. Cada dos números es un byte. Los primeros 4 bytes contienen el puntero del mapeado. Los 4 siguientes el puntero de los eventos. Los 4 siguientes pertenecen al cabezal del mapa y es lo que nos interesa aquí.

Como deberías saber, las direcciones en hex se deben pasar de dirección a puntero: están permutadas (cambiando los bytes de orden) y siempre llevan un 08 delante. Por ejemplo, en la imagen vemos el cabezal del mapa del Centro Pokémon de One Island. Los números subrayados son el puntero al cabezal del mapa: F8 0B 17 08. Es decir, que los datos del cabezal del mapa de ese nivel se encuentran en 0x170BF8. Si el puntero fuese AB CD EF 08, los datos estarían en la dirección 0xEFCDAB.

En thingy32 (sirve cualquier editor hex, de hecho ni siquiera necesitas uno que acepte tablas, cygnus es muy bueno, por ejemplo) vamos a la dirección 0x170BF8 y esto es lo que vemos (os lo pongo con colorines para que os deis cuenta de la estructura)

Bytes indicadores

Como puedes ver, es una estructura con varias parejas de byte y puntero. Los bytes indican cómo y cuando se ejecutan los scripts.
Como siempre, las direcciones estan permutadas. Ten en cuenta que:

  1. Cuando el byte que acompaña al dirección es distinto de 02 ó 04, lo que hay a continuación es un script.
  2. Cuando el byte es un 02 o un 04, la dirección no es de uns cript, sino de otra estructura (de momento solo sé como es la 02, pero falta por buscar alguno con 04)
  3. La lista no tiene un numero fijo de entradas: acaba con un 00

Mirando los scripts del centro, me doy cuenta de lo siguiente:
El 03 lo usa para mover minisprites (comando 0x63) y para el comando de hacer que aparezcas ahí cuando pierdes (0x9f).
El 05 lo usa para un special. En este caso, special 0x182, que no sé que hace... aunque posiblemente sea el que hace que puedas consultar los cuatro mapas.
El 01 lo usa para scripts de setmaptiles.

Sin explicar que es cada byte exactamente, pero los vas a usar para estas cosas.
El 02 es un dirección a otra estructura. En este caso, [02] A7 0C 17 08 nos lleva a 0x170CA7 donde encontramos lo siguiente:

76 40 00 00 B1 0C 17 08 00 00

O agrupando los bytes de otra manera:

0x4076		- Flag (o variable) del que depende el evento
0x0000 - Condición del script. equivalente a var value en AM.
0x8170CB1 - Script que se ejecuta. En este caso, el script de Bill y Celio.
0x0000 - Espacio vacío.

El script que aparece en esta estructura se ejecuta siempre que el flag o variable cumpla la condición que se señala.

Nota: el script se ejecuta continuamente siempre que se cumpla la condición, así que incluye un setvar en el script para que pare.

 

Cómo hacerte uno propio

  1. Una vez tengas los scripts que quieras colocar en el mapa hechos y colocados, decide done vas a poner el cabezal del mapa y escribe su dirección, permutado como siempre, en el cabezal del mapa (en AM, los bytes del 9 al 12, mira la imagen de arriba).
  2. Ve a esa dirección en tu editor hexadecimal y escribe el cabezal del mapa. Recuerda: grupos byte-puntero, todos los que quieras, y acaba en 00. Puedes poner tanto uno como varios (no sé si puedes repetir, por ejemplo, poner dos scripts con el byte 03... de todos modos no tiene sentido), mientras acaben en 0. Ten en cuenta lo que dije antes de qué es cada byte.
  3. Recuerda: cuando lo que vayas a hacer sea un evento típico de message, applymovement, etc (lo típico de que al personaje le pasan cosas) te conviene más asignare un 02 y por tanto, hacer la estructura:
  4. Flag (permutada, 2 bytes) ; condición (permutada, 2 bytes) ; dirección del script (permutado, 4 bytes, el ultimo un 08) ; 00 00 (sea lo que sea eso, si pusieses cualquier cosa, iría permutado)
    Y en vez de ponerle la dirección del script en el cabezal del mapa, pones la dirección donde has escrito esta estructura.
  5. Recuerda que tienes que ponerle un setvar o setflag al script que pongas en la estructura de 02, porque si no se repetirá hasta la saciedad.