Registrarse

[RH - Scripting] Ayuda con la Liga Pokémon

Estado
Cerrado para nuevas respuestas.
Hola, tengo una duda. Estoy modificando un juego para introducir más legendarios a él, pero quiero que sólo puedan aparecer después de la Liga Pokémon, pero no sé cómo hacer para detectar el cambio. También me gustaría saber como detectar si se tiene o no una medalla, o una cierta cantidad de ellas.
 

Inferno

Miembro insignia
Miembro insignia
Hola, tengo una duda. Estoy modificando un juego para introducir más legendarios a él, pero quiero que sólo puedan aparecer después de la Liga Pokémon, pero no sé cómo hacer para detectar el cambio.
Para comprobar que un evento X ha finalizado, como en este caso la Liga Pokémon, siempre hay dos maneras:

  1. Usar una flag. Puedes elegir una flag libre y tenerla desactivada (valor 0) y, en cuanto el jugador se haya pasado la liga, activarla (valor 1) con el comando setflag. Recuerda que, para comprobar el valor de una flag, tenemos el comando checkflag, con esto podrías saber si se ha pasado la liga o no.
  2. Usar una variable. En este caso el valor que tenga una variable sería el comprobante de que la liga ha sido ganada o aún no, por poner un ejemplo: Usamos la variable 0x40FF, si esta no tiene un valor igual/inferior/superior (la condición que le pongamos es a nuestra elección) a X aún no ha ganado la liga, entonces en el momento en que la gana activas la condición anterior, por medio de comandos como setvar, subvar o addvar.

Para algo como la Liga Pokémon yo usaría una flag, al igual que Game Freak hizo en Fire Red, de hecho puedes aprobechar esa flag sin tener que gastar una.
La flag que Game Freak usó para comprobar si el jugador se había pasado la liga o no es la 0x844, si abres un script de un NPC del alto mando podrás comprobar por ti mismo que es la que se utiliza para la revancha de la liga, pero vamos que puedes hacer lo mismo con cualquiera flag que este libre para usar.

También me gustaría saber como detectar si se tiene o no una medalla, o una cierta cantidad de ellas.
Esto también puedes hacerlo con un checkflag, si estás usando Fire Red como base sabrás que las medallas se activan a través de estas flags:
Código:
setflag 0x820
setflag 0x821
setflag 0x822
setflag 0x823
setflag 0x824
setflag 0x825
setflag 0x826
setflag 0x827
Por lo tanto aplicando el comando checkflag:
Código:
checkflag 0x n°flag
Podremos saber si tenemos la medalla o no, ya que este comando devuelve el valor 0 si la flag está desactivada (equivalente a no tener la medalla), o el valor 1 si la flag está activada (equivalente a tener la medalla), el resto sería usar condicionantes.

Como me aburro mucho te dejo aquí un script que comprueba cuantas medallas tienes. De todas formas si no entiendes como lo he hecho no dudes en preguntarme, ahora bien, si no sabes lo que hace X comando lo mejor es que te pases por algún tutorial de scripting.

Código:
#dynamic 0x800000

#org @start
lock
faceplayer
setvar 0x4FFF 0x0
checkflag 0x820
if 0x1 call @contador
checkflag 0x821
if 0x1 call @contador
checkflag 0x822
if 0x1 call @contador
checkflag 0x823
if 0x1 call @contador
checkflag 0x824
if 0x1 call @contador
checkflag 0x825
if 0x1 call @contador
checkflag 0x826
if 0x1 call @contador
checkflag 0x827
if 0x1 call @contador
buffernumber 0x0 0x4FFF
msgbox @msg1 0x6
release
end

#org @contador
addvar 0x4FFF 0x1
return

#org @msg1
= Tienes [buffer1] medallas.
NOTA: Lo he hecho desde el móvil, porque ahora mismo no puedo entrar al PC, así que puede haber fallos.
 

KERBEROS

Usuario de Platino
Para comprobar que un evento X ha finalizado, como en este caso la Liga Pokémon, siempre hay dos maneras:

  1. Usar una flag. Puedes elegir una flag libre y tenerla desactivada (valor 0) y, en cuanto el jugador se haya pasado la liga, activarla (valor 1) con el comando setflag. Recuerda que, para comprobar el valor de una flag, tenemos el comando checkflag, con esto podrías saber si se ha pasado la liga o no.
  2. Usar una variable. En este caso el valor que tenga una variable sería el comprobante de que la liga ha sido ganada o aún no, por poner un ejemplo: Usamos la variable 0x40FF, si esta no tiene un valor igual/inferior/superior (la condición que le pongamos es a nuestra elección) a X aún no ha ganado la liga, entonces en el momento en que la gana activas la condición anterior, por medio de comandos como setvar, subvar o addvar.

Para algo como la Liga Pokémon yo usaría una flag, al igual que Game Freak hizo en Fire Red, de hecho puedes aprobechar esa flag sin tener que gastar una.
La flag que Game Freak usó para comprobar si el jugador se había pasado la liga o no es la 0x844, si abres un script de un NPC del alto mando podrás comprobar por ti mismo que es la que se utiliza para la revancha de la liga, pero vamos que puedes hacer lo mismo con cualquiera flag que este libre para usar.



Esto también puedes hacerlo con un checkflag, si estás usando Fire Red como base sabrás que las medallas se activan a través de estas flags:
Código:
setflag 0x820
setflag 0x821
setflag 0x822
setflag 0x823
setflag 0x824
setflag 0x825
setflag 0x826
setflag 0x827
Por lo tanto aplicando el comando checkflag:
Código:
checkflag 0x n°flag
Podremos saber si tenemos la medalla o no, ya que este comando devuelve el valor 0 si la flag está desactivada (equivalente a no tener la medalla), o el valor 1 si la flag está activada (equivalente a tener la medalla), el resto sería usar condicionantes.

Como me aburro mucho te dejo aquí un script que comprueba cuantas medallas tienes. De todas formas si no entiendes como lo he hecho no dudes en preguntarme, ahora bien, si no sabes lo que hace X comando lo mejor es que te pases por algún tutorial de scripting.

Código:
#dynamic 0x800000

#org @start
lock
faceplayer
setvar 0x4FFF 0x0
checkflag 0x820
if 0x1 call @contador
checkflag 0x821
if 0x1 call @contador
checkflag 0x822
if 0x1 call @contador
checkflag 0x823
if 0x1 call @contador
checkflag 0x824
if 0x1 call @contador
checkflag 0x825
if 0x1 call @contador
checkflag 0x826
if 0x1 call @contador
checkflag 0x827
if 0x1 call @contador
buffernumber 0x0 0x4FFF
msgbox @msg1 0x6
release
end

#org @contador
addvar 0x4FFF 0x1
return

#org @msg1
= Tienes [buffer1] medallas.
NOTA: Lo he hecho desde el móvil, porque ahora mismo no puedo entrar al PC, así que puede haber fallos.

oye, esta buena la explicacion, pero tenia entendido que el setvar, no deja que se agregue valor a la variable, con addvar, si no es asi eh estado engañado todo este tiempo!!!
 

Inferno

Miembro insignia
Miembro insignia
oye, esta buena la explicacion, pero tenia entendido que el setvar, no deja que se agregue valor a la variable, con addvar, si no es asi eh estado engañado todo este tiempo!!!
Pues sí, has estado equivocado durante un tiempo.

El comando setvar:
Código:
setvar 0x(nº variable) 0x(Valor que la variable recibe)
Lo que este hace es establecer un valor inicial o cambiar el valor a una variable, es decir, por defecto las variables libres tiene asignado el valor 0, por lo tanto con el setvar lo que estamos buscando es cambiar ese valor por uno que nosotros necesitemos, lo mismo ocurriría si una variable ya ha sido usada en otro script y tiene el valor X y nosotros queremos cambiarlo por el valor Y para usar en otro script por ejemplo.

Resumiendo lo que viene a hacer es esto:
Valor variable = X

Siendo X un número elegido por nosotros.
Un ejemplo:
Código:
#dynamic 0x800000

#org @start
lock
faceplayer
setvar 0x4FFF 0x1
buffernumber 0x0 0x4FFF
setvar 0x4FFF 0x5
buffernumber 0x1 0x4FFF
setvar 0x4FFF 0xA
buffernumber 0x2 0x4FFF
msgbox @msg1 0x6
release
end

#org @msg1
= La variable ha tenido el valor\n[buffer1], luego el valor [buffer2] y\lpor último el valor [buffer3]
Luego el addvar:
Código:
addvar 0x(nº variable) 0x(valor a añadir)
Lo que hace es la siguiente operación:
Valor variable = Valor variable + X
Almacena en la variable la suma entre el valor que la variable posee en el momento anterior a realizar la operación y un número X dado por nosotros.

Código:
#dynamic 0x800000

#org @start
lock
faceplayer
setvar 0x4FFF 0x5
buffernumber 0x0 0x4FFF
addvar 0x4FFF 0x4
buffernumber 0x1 0x4FFF
msgbox @msg1 0x6
release
end

#org @msg1
= La variable tenía asignado el\nvalor [buffer1], ahora tiene el\lvalor [buffer2].
Este comando es el más indicado para hacer bucles:
Código:
#dynamic 0x800000

#org @start
lock
faceplayer
setvar 0x4FFF 0x1
buffernumber 0x0 0x4FFF
call @contador
buffernumber 0x1 0x4FFF
msgbox @msg1 0x6
release
end

#org @contador
addvar 0x4FFF 0x1
compare 0x4FFF 0xA
if 0x0 goto @contador
return

#org @msg1
= La variable tenía asignado el\nvalor [buffer1], ahora tiene el\lvalor [buffer2].
[Scripting] Haciendo un bucle en XSE | Revelando porque no todo script tiene que ser finito

Como ves son funciones diferentes, pero que guardar una similitud directa entre si, almacenar un valor en la variable.
Que no funcionasen en un mismo script no tendría mucho sentido la verdad.
 

KERBEROS

Usuario de Platino
Para comprobar que un evento X ha finalizado, como en este caso la Liga Pokémon, siempre hay dos maneras:

  1. Usar una flag. Puedes elegir una flag libre y tenerla desactivada (valor 0) y, en cuanto el jugador se haya pasado la liga, activarla (valor 1) con el comando setflag. Recuerda que, para comprobar el valor de una flag, tenemos el comando checkflag, con esto podrías saber si se ha pasado la liga o no.
  2. Usar una variable. En este caso el valor que tenga una variable sería el comprobante de que la liga ha sido ganada o aún no, por poner un ejemplo: Usamos la variable 0x40FF, si esta no tiene un valor igual/inferior/superior (la condición que le pongamos es a nuestra elección) a X aún no ha ganado la liga, entonces en el momento en que la gana activas la condición anterior, por medio de comandos como setvar, subvar o addvar.

Para algo como la Liga Pokémon yo usaría una flag, al igual que Game Freak hizo en Fire Red, de hecho puedes aprobechar esa flag sin tener que gastar una.
La flag que Game Freak usó para comprobar si el jugador se había pasado la liga o no es la 0x844, si abres un script de un NPC del alto mando podrás comprobar por ti mismo que es la que se utiliza para la revancha de la liga, pero vamos que puedes hacer lo mismo con cualquiera flag que este libre para usar.



Esto también puedes hacerlo con un checkflag, si estás usando Fire Red como base sabrás que las medallas se activan a través de estas flags:
Código:
setflag 0x820
setflag 0x821
setflag 0x822
setflag 0x823
setflag 0x824
setflag 0x825
setflag 0x826
setflag 0x827
Por lo tanto aplicando el comando checkflag:
Código:
checkflag 0x n°flag
Podremos saber si tenemos la medalla o no, ya que este comando devuelve el valor 0 si la flag está desactivada (equivalente a no tener la medalla), o el valor 1 si la flag está activada (equivalente a tener la medalla), el resto sería usar condicionantes.

Como me aburro mucho te dejo aquí un script que comprueba cuantas medallas tienes. De todas formas si no entiendes como lo he hecho no dudes en preguntarme, ahora bien, si no sabes lo que hace X comando lo mejor es que te pases por algún tutorial de scripting.

Código:
#dynamic 0x800000

#org @start
lock
faceplayer
setvar 0x4FFF 0x0
checkflag 0x820
if 0x1 call @contador
checkflag 0x821
if 0x1 call @contador
checkflag 0x822
if 0x1 call @contador
checkflag 0x823
if 0x1 call @contador
checkflag 0x824
if 0x1 call @contador
checkflag 0x825
if 0x1 call @contador
checkflag 0x826
if 0x1 call @contador
checkflag 0x827
if 0x1 call @contador
buffernumber 0x0 0x4FFF
msgbox @msg1 0x6
release
end

#org @contador
addvar 0x4FFF 0x1
return

#org @msg1
= Tienes [buffer1] medallas.
NOTA: Lo he hecho desde el móvil, porque ahora mismo no puedo entrar al PC, así que puede haber fallos.
Pues sí, has estado equivocado durante un tiempo.

El comando setvar:
Código:
setvar 0x(nº variable) 0x(Valor que la variable recibe)
Lo que este hace es establecer un valor inicial o cambiar el valor a una variable, es decir, por defecto las variables libres tiene asignado el valor 0, por lo tanto con el setvar lo que estamos buscando es cambiar ese valor por uno que nosotros necesitemos, lo mismo ocurriría si una variable ya ha sido usada en otro script y tiene el valor X y nosotros queremos cambiarlo por el valor Y para usar en otro script por ejemplo.

Resumiendo lo que viene a hacer es esto:


Un ejemplo:
Código:
#dynamic 0x800000

#org @start
lock
faceplayer
setvar 0x4FFF 0x1
buffernumber 0x0 0x4FFF
setvar 0x4FFF 0x5
buffernumber 0x1 0x4FFF
setvar 0x4FFF 0xA
buffernumber 0x2 0x4FFF
msgbox @msg1 0x6
release
end

#org @msg1
= La variable ha tenido el valor\n[buffer1], luego el valor [buffer2] y\lpor último el valor [buffer3]
Luego el addvar:
Código:
addvar 0x(nº variable) 0x(valor a añadir)
Lo que hace es la siguiente operación:


Almacena en la variable la suma entre el valor que la variable posee en el momento anterior a realizar la operación y un número X dado por nosotros.

Código:
#dynamic 0x800000

#org @start
lock
faceplayer
setvar 0x4FFF 0x5
buffernumber 0x0 0x4FFF
addvar 0x4FFF 0x4
buffernumber 0x1 0x4FFF
msgbox @msg1 0x6
release
end

#org @msg1
= La variable tenía asignado el\nvalor [buffer1], ahora tiene el\lvalor [buffer2].
Este comando es el más indicado para hacer bucles:
Código:
#dynamic 0x800000

#org @start
lock
faceplayer
setvar 0x4FFF 0x1
buffernumber 0x0 0x4FFF
call @contador
buffernumber 0x1 0x4FFF
msgbox @msg1 0x6
release
end

#org @contador
addvar 0x4FFF 0x1
compare 0x4FFF 0xA
if 0x0 goto @contador
return

#org @msg1
= La variable tenía asignado el\nvalor [buffer1], ahora tiene el\lvalor [buffer2].
[Scripting] Haciendo un bucle en XSE | Revelando porque no todo script tiene que ser finito

Como ves son funciones diferentes, pero que guardar una similitud directa entre si, almacenar un valor en la variable.
Que no funcionasen en un mismo script no tendría mucho sentido la verdad.

VAYA amigo gracias, hoy aprendi algo nuevo.hahaha
 
Estado
Cerrado para nuevas respuestas.
Arriba