25151-GBA_|_Scripting_|_\[TUTORIAL]_¡Pon_varios_scripts_de_nivel!
#0
Javi4315♪ 13374
Bueno, recuerdo cuando la gente preguntaba: "¿Por qué cuando pongo un segundo script de nivel de tipo 02 no funciona?". La gente, yo incluido, decíamos: "Sólo es posible poner un script de cada tipo por mapa". Pues me duele mucho contradeciros, eruditos waheros, pero más me duele contradecirme a mí y lo voy a hacer.


¿Antes no y ahora sí?

Resulta que el rom, tan limitado que lo creíamos, no es tan limitado en este sentido. La limitación aquí la tienen A-Map, que no es capaz de introducir dos scripts de nivel del mismo tipo; y XSE, que no es capaz de leer más allá de donde debería. Entonces, de manera automática, no se pueden poner más de un script de nivel del mismo tipo. Así que hemos dado por hecho que no podía hacerse. Pero si uno decide ser tradicional y hacer las cosas entendiéndolas, puede entender que se puede ir más allá de lo estrictamente predispuesto por una herramienta que a lo mejor no sabía que se podía ir más allá. Así que el secreto es hacerlo manualmente. Toca pensar.


Estructura de los scripts

Si váis a la vista profesional del cabezal del mapa y copiáis el offset del "Map script offset" y decidís abrirlo con XSE, podéis ver la estructura de los scripts de nivel del mapa. Ojo, para decompilar este script, hay que marcar la casilla "Script de nivel" en XSE y luego descompilarlo.

Abro el original de Pueblo Paleta para estudiarlo. No voy a ponerlo entero, sólo lo que nos interesa:

'---------------
#org 0x16545A '=> Inicio del script
#raw 0x3 '=> Scripts de tipo 03
#raw pointer 0x8165465 '=> Offset de los scripts de tipo de 03
#raw 0x2 '=> Scripts de tipo 02
#raw pointer 0x81654CE '=> Offset de los scripts de tipo 02
#raw 0x0 '=> Fin de la estructura de los tipos de scripts

'---------------
#org 0x1654CE '=> Scripts de tipo 02
#raw word 0x4050 '=> Variable del script
#raw word 0x2 '=> Valor de la variable del script
#raw pointer 0x81654D8 '=> Offset del script
#raw word 0x0 '=> Fin de la estructura de scripts de tipo 02

La primera estructura detalla los tipos de scripts que hay en el mapa funcionando. El primer raw nos dice que tipo de script es (si es uno de tipo 02, pues será 0x2), mientras que el segundo nos dice cuál es el pointer de la estructura de los scripts. Ojo, nos dice el pointer de la estructura de los scripts, no del propio script. Esto no tiene más ciencia. Si tenemos scripts de tipo, por ejemplo, 02 y 03, ahí aparecerá el 0x2 y el 0x3. Si queremos añadir uno de tipo 04, pues se añade simplemente el 0x4 y el offset de la estructura. Pero lo que a nosotros nos interesa no es esta estructura principal, sino la estructura de tipo de script en el que queramos añadir más de uno (sólo funciona con los scripts 02 y 04, para los otros es ilógico pensar en poner más).

Pero para entender mejor esta primera estructura pondré un ejemplo. Tenemos en nuestro ordenador una carpeta llamada "Scripts de nivel". Si queremos que haya en nuestro mapa scripts de nivel 02, 03 y 04, por ejemplo, dentro de esa carpeta tendríamos tres carpetas: "02", "03" y "04". Ahora, entramos en la carpeta "02". Si queremos poner dos scripts de tipo 02, tendremos, por ejemplo, las carpetas "Script 1" y "Script 2". Entonces, es en la estructura de los scripts de tipo 02 (o 04) donde se añaden más y no en la propia estructura principal que sólo detalla los tipos de scripts que existen en nuestro mapa.

La segunda estructura, que es la estructura de nuestro tipo de script (el 02 en este caso), lo que hace es poner tres parámetros para cada script. El primero es la variable que utilizará el script, el segundo el valor con el que se ejecutará y el tercero es el offset a nuestro script.

Recordemos que un script de nivel se ejecuta cuando X variable tiene Y valor. Es decir, si ponemos la variable 0x7FFF y el valor 0x1, el script de nivel no se ejecutará hasta que la variable 0x7FFF tenga el valor 0x1, mientras tenga un valor distinto, el script permanecerá inactivo.


Añadiendo otro script

Bueno, para añadir un script vamos a ir a la estructura de nuestros scripts del tipo 02 o 04 (el que queramos añadir). En nuestro caso será de tipo 02, que en nuestro ejemplo de Pueblo Paleta es esta la estructura:

#org 0x1654CE
#raw word 0x4050
#raw word 0x2
#raw pointer 0x81654D8
#raw word 0x0

Ahí vamos a añadir nuestro script. Pero claro, necesitamos ponerlo en un espacio vacío. Así que tenemos que cambiar el offset por uno con espacio. Así que vamos a usar un dynamic y pointers (@) donde corresponda. Necesitamos más espacio en la estructura del script, por lo que es lo que repuntearemos. Además, añadimos nuestro script de nivel adicional:

#dynamic 0x800000

'---------------
#org 0x16545A
#raw 0x3
#raw pointer 0x8165465
#raw 0x2
#raw pointer @S02
#raw 0x0

'---------------
#org @S02
#raw word 0x4050
#raw word 0x2
#raw pointer 0x81654D8
#raw word 0x(variable)
#raw word 0x(valor)
#raw pointer 0x(offset del script)
#raw word 0x0


Hemos repunteado la estructura de los script de nivel. Respecto al nuevo script, donde pone variable, ponemos la variable de la que dependerá nuestro script; donde pone valor, el valor que debe tener la variable para que se ejecute el script; y donde pone offset, el offset del script de nivel que queremos añadir. También se puede poner un pointer en vez del offset y compilar directamente el script ahí, pero es mejor compilarlo por otro lado y quitarse de líos.

Importante: Si tenemos, por ejemplo, dos scripts que cumplen las condiciones para ejecutarse, lo que pasará es que se ejecutarán los dos. Se ejecutará en primer lugar, el primero que tengamos y, cuando este acabe, se ejecutará el siguiente.


Fallo de XSE

XSE no cargará toda la estructura de nuestro tipo de script si tenemos más de uno. Por lo que, para editar algunos valores quizás no podamos hacerlo directamente. Así que para cambiarlo, simplemente tenemos que copiar el offset de la estrucuta de nuestros scripts (no de la estructura principal, sino de la de nuestro tipo de script) y editarlo con un editor hexadecimal. Es fácil, no tiene mayor complicación. Sólo hay que tener en cuenta que en hexadecimal, los valores está permutados.

--------------------------
Sé que para los menos experimentados pueda parecer complicado. Pero realmente es muy fácil. Si tenéis cualquier duda o problema, no dudéis en comentar.