Registrarse

[Scripting] Poner varios scripts de nivel

Javi4315

♪♫♪
Miembro de honor
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:

Código:
'---------------
#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:

Código:
#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.
 

Helix Boo

Emperador Kaktiácero
Miembro de honor
Respuesta: [TUTORIAL] ¡Pon varios scripts de nivel!

Te doy las gracias por el tutorial, pero es mucho más sencillo hacer un script de nivel principal que contenga a varios sub-scripts de nivel diferentes:

  • Se juega con el valor de una variable para posibilitar o no la ejecución de un script de nivel.
  • Si se ejecuta un script de nivel, se compara una serie de valores que determinarán uno u otro tipo de ejecución.

Rallarse más es tontería.
 

Javi4315

♪♫♪
Miembro de honor
Respuesta: [TUTORIAL] ¡Pon varios scripts de nivel!

Loony Boo♪;225217 dijo:
Te doy las gracias por el tutorial, pero es mucho más sencillo hacer un script de nivel principal que contenga a varios sub-scripts de nivel diferentes:

  • Se juega con el valor de una variable para posibilitar o no la ejecución de un script de nivel.
  • Si se ejecuta un script de nivel, se compara una serie de valores que determinarán uno u otro tipo de ejecución.

Rallarse más es tontería.
Sí, pero eso ya lo sabíamos. Lo que no sabíamos era poner varios script de nivel, que es lo correcto y lo profesional. Simplemente hay que añadir tres parámetros a la estructura y ya tienes tu script, no hay por qué liarse cambiando el valor de la variable para que se ejecute el script. A parte de que con ese método ahora chapucero, tienes que gastar una variable o flag extra en muchos casos.
 

Helix Boo

Emperador Kaktiácero
Miembro de honor
Respuesta: [TUTORIAL] ¡Pon varios scripts de nivel!

Javi4315♪;225219 dijo:
Sí, pero eso ya lo sabíamos. Lo que no sabíamos era poner varios script de nivel, que es lo correcto y lo profesional. Simplemente hay que añadir tres parámetros a la estructura y ya tienes tu script, no hay por qué liarse cambiando el valor de la variable para que se ejecute el script. A parte de que con ese método ahora chapucero, tienes que gastar una variable o flag extra en muchos casos.
Existen muchas variables disponibles dentro del rom, también tienes un sinfín de formas para activar mecanismos según el valor de las variables, me explico:

  • A diferencia de las flag, las variables son cuantiosas, con usos nada limitados (las flag serían, dicho vulgarmente, "de usar y tirar").
  • No necesitas despilfarrar variables, puedes comparar múltiples valores para una misma variable y coordinarías la ejecución de varios scripts de nivel en múltiples mapas (y me atrevería a decir que tan sólo necesitarías sacrificar una variable para la comprobación de ejecuciones, ¿cuántas te quedarían disponibles, más de 4000?).

Luego es más que nada una forma de mantener un trabajo ordenado, no es lo mismo programar varios scripts de nivel "02" a reunirlos todos, cómodamente, en un mismo script de nivel principal.
 

Javi4315

♪♫♪
Miembro de honor
Respuesta: [TUTORIAL] ¡Pon varios scripts de nivel!

Loony Boo♪;225221 dijo:
Existen muchas variables disponibles dentro del rom, también tienes un sinfín de formas para activar mecanismos según el valor de las variables, me explico:

  • A diferencia de las flag, las variables son cuantiosas, con usos nada limitados (las flag serían, dicho vulgarmente, "de usar y tirar").
  • No necesitas despilfarrar variables, puedes comparar múltiples valores para una misma variable y coordinarías la ejecución de varios scripts de nivel en múltiples mapas (y me atrevería a decir que tan sólo necesitarías sacrificar una variable para la comprobación de ejecuciones, ¿cuántas te quedarían disponibles, más de 4000?).

Luego es más que nada una forma de mantener un trabajo ordenado, no es lo mismo programar varios scripts de nivel "02" a reunirlos todos, cómodamente, en un mismo script de nivel principal.
Bueno, vale, lo que tú digas. No voy a discutir contigo. Pero una cosa es lo profesional y otra las formas de hacerlo. Si quieres tener un único script, tienes un único script con las vertientes que te de la gana. Y si quieres tener más, pues sigues este tutorial.

También se hacen los scripts de gatillo y se pone un pointer vacío para que no se ejcute cuando lo profesional es desactivarlos mediante variable. Se puede hacer ¿Y qué? No deja de ser el método chapucero.

De todas formas, hablando de comodidad, para mí es más cómodo tener cada script por separado para evitar líos y no tener que andar acomodando el valor de la variable en otros mapas.

Pero como sea y a fin de cuentas, tu opinión en un intento de dinamitar el tutorial, por el mero hecho de no haber sabido hacerlo considerándote a ti mismo un experto en scripts, creo que no procede. Si te gusta bien y si no sigues con el método que todos hemos hecho hasta ahora, que no eras el único iluminado, vamos, que a mí no hace falta que me expliques nada de flags y variables. Así que te agradecería que no volvieses a comentar. Y si quieres hacerlo, adelante, yo no te contestaré. A menos que me enfades y no sé si sería positivo.
 

Cheve_X

MoonLover~
Miembro de honor
Respuesta: [TUTORIAL] ¡Pon varios scripts de nivel!

Yo estuve intentando hacer ésto un par de veces, aunque no le dí muchas vueltas al asunto, siempre terminaba desapareciendo el segundo script, y nunca probé si funcionaba o no xD

Bueno, muchas gracias Javiño :3 ésto, ademas de ayudar lo que normalmente ayuda, también ayuda cuando la Rom de JPAN ya no acepta más Sripts de Cabezal... Asi, eliminamos otro Bug :3

Saludos, y sigue aportando tantos tutoriales útiles :D
 

Helix Boo

Emperador Kaktiácero
Miembro de honor
Respuesta: [TUTORIAL] ¡Pon varios scripts de nivel!

Javi4315♪;225223 dijo:
Si quieres tener un único script, tienes un único script con las vertientes que te de la gana. Y si quieres tener más, pues sigues este tutorial.
Amén.

Javi4315♪;225223 dijo:
También se hacen los scripts de gatillo y se pone un pointer vacío para que no se ejcute cuando lo profesional es desactivarlos mediante variable. Se puede hacer ¿Y qué? No deja de ser el método chapucero.
No mezcles pichas con medinas, ahí se despilfarra espacio, tiempo y, lamentablemente, flags (sí, he visto muchos casos), ¿qué te va a importar sacrificar una variable? Las hay a patadas, las puedes usar chorrocientas veces y no causan los jaleos que causan las flags.

Javi4315♪;225223 dijo:
De todas formas, hablando de comodidad, para mí es más cómodo tener cada script por separado para evitar líos y no tener que andar acomodando el valor de la variable en otros mapas.
Cada uno tiene sus gustos, si quieres hacerlo de una forma porque te organizas mejor, hazlo.

Javi4315♪;225223 dijo:
Pero como sea y a fin de cuentas, tu opinión en un intento de dinamitar el tutorial, por el mero hecho de no haber sabido hacerlo considerándote a ti mismo un experto en scripts, creo que no procede. Si te gusta bien y si no sigues con el método que todos hemos hecho hasta ahora, que no eras el único iluminado, vamos, que a mí no hace falta que me expliques nada de flags y variables. Así que te agradecería que no volvieses a comentar. Y si quieres hacerlo, adelante, yo no te contestaré. A menos que me enfades y no sé si sería positivo.
Perdona, pero no soy el mejor scripter, sólo defiendo que llevo ya unos cuantos añitos y que es uno de mis puntos fuertes, así que comento en base a mi experiencia (llámalas "anécdotas"), y no he venido a catapultar, dinamitar, explosionar o a corroer ningún tema de tutoriales, sólo he venido a dejar caer ideas.

Si quieres poner varios scripts de nivel con tu método, hazlo, y si quieres organizar en un script de nivel principal, adelante, pero no tienes que ponerte agresivo.
 

Juanjo

Hacker del pasado...
Respuesta: [TUTORIAL] ¡Pon varios scripts de nivel!

Es mucho más simple controlar todo desde un solo script con el valor de una variable. Además puedes combinarlo con un setmapfooter y hacer una especie script multimapa (Si en que muestres muchas cosas que pasan en muchos mapas durante un script) Directamente desde un script central. Para mi eso es mucho más profesional.

Aunque lo que has descubierto es mucho más útil para cuando quieras que un script de nivel no tenga nada que ver con otro (Que lo añadas más después) O razones de mayor estética y orden En ese caso se te agradece.

Att: Juanjo
 

Master Brock

Usuario de platino
Usuario de Platino
Respuesta: [TUTORIAL] ¡Pon varios scripts de nivel!

Probare haber, aunque se tarde mas... queda mas ordenado

Pero lo que no entiendo es por que @Javi4315♪ Hace tan buenos tutoriales y sabe tanto de scripts y no sabe aceptar una critica..... tio que no es para tanto... @Loony Boo♪ solo daba su opinion.... no queria demostrar nada..

Bueno buen tutorial... me venda genial para no tener que formar mucho barullo en el mismo script

Gracias :)
 

Javi4315

♪♫♪
Miembro de honor
Respuesta: [TUTORIAL] ¡Pon varios scripts de nivel!

Probare haber, aunque se tarde mas... queda mas ordenado

Pero lo que no entiendo es por que @Javi4315♪ Hace tan buenos tutoriales y sabe tanto de scripts y no sabe aceptar una critica..... tio que no es para tanto... @Loony Boo♪ solo daba su opinion.... no queria demostrar nada..

Bueno buen tutorial... me venda genial para no tener que formar mucho barullo en el mismo script

Gracias :)
Esto viene de largo ya. De él y su afortunado "No me hagas reir". Él sabe a lo que me refiero. Y no sólo a eso, claro, sino a todo lo que vino después. Claro que sé aceptar una crítica, pero que no me vengan con historias.

Como sea, esto es un tutorial. El que quiera que lo aplique y al que no le guste que se vaya por donde ha venido. Si no tenéis dudas sobre el manual o no vais a reportar algún tipo de error o problema, no hace falta comentar nada.

Eso sí, si quiere que haya más manuales en su foro, que empiece a redactarlos. Al menos por mi parte.
 

ReoNeky

Miembro de honor
Miembro de honor
Respuesta: [TUTORIAL] ¡Pon varios scripts de nivel!

Lo que os gusta rallaros Hacedlo como mejor veáis, pero que sepáis que se puede barajar esas opciones, cosa que antes no (Supuestamente nadie se dedicó a investigar esto)
Por esto mismo, me alegra que @Javi4315♪ lo haya querido aportar y se haya entretenido en barajar otra opción (Que es la que debería ser la correcta)
Nos hemos adaptado tanto al otro método que ya es que nos da igual.
De otro modo, muy buen tutorial y gran esfuerzo de tu parte Javi.
Me alegra ver a gente como tú investigando cosas que se desconocen.

Lo probaré, pero seguiré con mi método C: (Simplemente porque estoy demasiado acostumbrado a ver millones de líneas en un solo script Jajaj)

¡Saludos!
 

Sayer301!

UnityLord!
Miembro de honor
Respuesta: [TUTORIAL] ¡Pon varios scripts de nivel!

Javi4315♪;225214 dijo:
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:

Cita:
#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
Pues a mi no me ha quedado tan claro como al resto. A ver, mi duda surge por lo que esta en rojo.

Me explico, si en el script original el script de tipo 02 ya tenia su estructura (del existente), ¿Porque la modificas? Es decir, no deberías ser algo asi?
#org 0x16545A
#raw 0x3
#raw pointer 0x8165465
#raw 0x2
#raw pointer 0x81654CE
#raw 0x2
#raw pointer @S02
#raw 0x0

Si no es así no entiendo el porqué se borra la estructura anterior, ¿Se podrían meter todos los que te de la gana si repunteas la estructura de cada tipo de script de nivel? (Se que pones que solo en el 02 y el 04, pero aun así no me ha quedado muy claro porque)

Aunque te enfades con Boo yo sigo pensando que tus aportes son geniales y que este metodo aunque no lo parezca si que ahorra vars, como minimo una si querías hacerlo así. Muy buena man, esto puede dar unas ideas y unos resultados cojonudos y cosas que no se podrían hacer tan facilmente en un solo script. Eres un champion y espero que me expliques eso XDD
Paz!
 

Javi4315

♪♫♪
Miembro de honor
Respuesta: [TUTORIAL] ¡Pon varios scripts de nivel!

Pues a mi no me ha quedado tan claro como al resto. A ver, mi duda surge por lo que esta en rojo.

Me explico, si en el script original el script de tipo 02 ya tenia su estructura (del existente), ¿Porque la modificas? Es decir, no deberías ser algo asi?
#org 0x16545A
#raw 0x3
#raw pointer 0x8165465
#raw 0x2
#raw pointer 0x81654CE
#raw 0x2
#raw pointer @S02
#raw 0x0

Si no es así no entiendo el porqué se borra la estructura anterior, ¿Se podrían meter todos los que te de la gana si repunteas la estructura de cada tipo de script de nivel? (Se que pones que solo en el 02 y el 04, pero aun así no me ha quedado muy claro porque)

Aunque te enfades con Boo yo sigo pensando que tus aportes son geniales y que este metodo aunque no lo parezca si que ahorra vars, como minimo una si querías hacerlo así. Muy buena man, esto puede dar unas ideas y unos resultados cojonudos y cosas que no se podrían hacer tan facilmente en un solo script. Eres un champion y espero que me expliques eso XDD
Paz!
No va así. Hay una estructura y una subestructura. La primera estructura (la que queda sin repointear) es la que guarda los tipos de scripts que hay en el mapa y los offsets de la subestructura (en caso de que sean de tipo 02 o 04) o el offset del propio script si es de otro tipo.

En otros tipos de scripts, es ilógico poner más de uno porque son scripts que se ejecutan siempre, entonces sólo tienes que tener uno funcionando. Pero con los de tipo 02 y 04 es distinto ya que son como scripts de gatillo pero a nivel de todo el mapa. Además de que necesitan ser configurados con una variable y un valor. Por eso tienen una subestructura (@S02). En esa subestructura están los parámetros del script de nivel y es donde podemos meter más.

#org @S02
#raw word 0x4050
#raw word 0x2
#raw pointer 0x81654D8
#raw word 0x0
Esta es la configuración de nuestro script de nivel. Si queremos meter uno más, lo que tenemos que hacer es configurar otro:

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

#raw word 0x0
 
Arriba