Registrarse

[Scripting] Estructuras de comparación de valores

FEL!X

ᴛᴜ ᴀᴍɪɢᴏ ᴇʟ ᴇsᴘᴀᴅᴀᴄʜíɴ
Usuario de Oro
[Tutorial|GBA] Estructuras de comparación de valores (Uso de If)​

Visto la gran cantidad de dudas sobre el tema he decidido explicar el uso de comparaciones, de criterios y su estructura. También dejaré un lista interesante al final de comprobación de valores.

El nivel de éste tutorial será NORMAL (?): se deberá tener conocimientos básicos sobre variables y flags. Como recordatorio digo que ambos son valores de dos bytes pero de diferente extensión:
Flags, variables restringidas a dos valores:
  • 0x0 (desactivada)
  • 0x1 (activada)
Variables, variables que pueden contener valores entre 0x0 y 0xFFFF


* * *​

Como ya sabemos, nos interesa comparar valores para que ocurra cierto evento dependiendo del valor de ciertas flags o variables. Entonces, según el tipo de valor o variable relacionado, usaremos un comando de comparación de valores distinto:

checkflag 0x(flag): comprueba si la flag está activada comparando el valor de la flag con el valor 0x1 (activada).

compare 0x(variable) 0x(valor): comprueba el valor de una variable con un valor determinado.

comparevars 0x(variable A) 0x(variable B): comparación entre variables; comprueba el valor de una variable A con el valor de otro variable B.

Pero hacer una comparación no es suficiente; necesitamos los criterios de comparación para decir que tipo de comparación queremos entre los valores. Estos criterios los marca el comando if 0x(criterio):

Código:
[B]0x0:[/B] [<] Menor que 
[B]0x1:[/B] [=] Igual que 
[B]0x2:[/B] [>] Mayor que 
[B]0x3:[/B] [≤] Menor o igual que 
[B]0x4:[/B] [≥] Mayor o igual que 
[B]0x5:[/B] [≠] Diferente de
Entonces establecido el tipo de comparación y el tipo de criterio; “complementamos” el if 0x(criterio) con un comando de salto a otro pointer. Tenemos dos:

goto @pointer: salta al pointer descrito y continua el script desde éste.

call @pointer: salta al pointer descrito y continua el script desde éste. A diferencia del anterior, este nos permitirá volver al lugar dónde llamamos el pointer ya que recuerda la posición anterior del call y permite volver mediante el comando return.

En pocas palabras, tras la comparación tendremos un if 0x(criterio) goto @pointer o un if 0x(criterio) call @pointer.

* * *​

Uno de los objetivo de éste tutorial era aclarar el tema del If ya que ha dado muchas confusiones a muchos usuarios dando la creencia de que el término if variaba entre flags y variables cuando el funcionamiento es ¡Exactamente el mismo!

Ésta es la interpretación errónea de los comandos:
Código:
[B]checkflag 0x200 '[/B]comprueba si la flag 200 está activada o desactivada
[B]if 0x0 goto [PLAIN]@pointer[/PLAIN]0 '[/B]en caso de que esté desativada va a [PLAIN]@pointer[/PLAIN]0
[B]if 0x1 goto [PLAIN]@pointer[/PLAIN]1 '[/B]en caso de que esté activada va a [PLAIN]@pointer[/PLAIN]0
Ésta es la interpretación correcta de los comandos
Código:
[B]checkflag 0x200 '[/B]comprueba si la flag está activa comparando el valor de la flag 200 con el valor 0x1.
[B]if 0x0 goto [PLAIN]@pointer[/PLAIN]0 '[/B]si el valor es menor a 1, su valor será 0 (desactivada) ya que solo varía entre 0 e 1. En tal caso irá al [PLAIN]@pointer[/PLAIN]0
[B]if 0x1 goto [PLAIN]@pointer[/PLAIN]1'[/B]si el valor es igual a 1, su valor será 1 (activada) y en tal caso irá al [PLAIN]@pointer[/PLAIN]1
Y es tan válida como usar un 0x5
Código:
checkflag 0x200 ‘ compara el valor de la flag 200 con 1
if 0x5 goto [PLAIN]@pointer[/PLAIN]0 ‘si  el valor es diferente a 1
if 0x1 goto [PLAIN]@pointer[/PLAIN]1 ‘si el valor es igual a 1
Y con esto espero aclarar el tema de los criterios. Pese a ello, me han dicho lo contrario, por lo que he hecho una demostración sencilla que realmente justifica el comportamiento del checkflag e if:

#dynamic 0x800000

// Activación o desactivación de flags

#org @flag200x1
lock
setflag 0x200
msgbox @activa 0x6
release
end

#org @flag200x0
lock
clearflag 0x200
msgbox @desactiva 0x6
release
end

#org @activa
= ¡La flag 200 está activa!

#org @desactiva
= ¡La flag 200 está desactivada!

// Revisión de criterios

#org @flag200criterio0
lock
checkflag 0x200
if 0x0 goto @if
release
end

#org @flag200criterio1
lock
checkflag 0x200
if 0x1 goto @if
release
end

#org @flag200criterio2
lock
checkflag 0x200
if 0x2 goto @if
release
end

#org @flag200criterio3
lock
checkflag 0x200
if 0x3 goto @if
release
end

#org @flag200criterio4
lock
checkflag 0x200
if 0x4 goto @if
release
end

#org @flag200criterio5
lock
checkflag 0x200
if 0x5 goto @if
release
end

#org @if
lock
msgbox @msg 0x6
release
end

#org @msg
= ¡El criterio era cierto!

Dicho lo anterior paso una lista interesante de otros comandos de comparación interesantes para usar. Empezaré por el LASTRESULT, el más importante de todos.

LASTRESULT se trata de una variable, concretamente la 0x800D, que almacena el último valor variable observado. Es interesante sabes su valor, para ello lo trataremos como cualquier otra variable. Ejemplos de uso son:
compare LASRESULT 0x(valor): Compara el valor de la variable 0x800D con otro valor.
comparevars LASRESULT 0x(variable): Compara el valor de la variable 0x800D con el valor de otra variable
(Al poner LASRESULT en XSE el programa lo identificará como la variable 0x800D, es decir, la podemos escribir de ambas maneras)

checkmoney 0x(cantidad) 0x0:
compara la variable dinero con una cantidad determinada. Técnicamente es como un compare 0x(variable) 0x(valor) con la diferencia de que tiene integrado la variable dinero en el comando.

checktrainerflag 0x(flag):
compara el valor de la flag del entrenador con el valor 1 (el entrenador perdió)

* * *​

A continuación añado varios comandos de comprobación de valores. Esto comandos se usan para comprobar cierto valor y guardarlo en LASTRESULT, es decir, la variable 0x800D.

checkgender: comprueba el sexo del protagonista. Si es chico la variable 0x800D tendrá valor 0x0, 0x1 en caso contrario

countpokemon:
cuenta el número de pokemon que hay en el equipo almacenando así de 0x0 a 0x5 en la variable 0x800D.

checkitem 0x(ítem index) 0x(cantidad):
comprueba si el jugador tiene cierta cantidad de un ítem en concreto. Si la tiene 0x800D será 0x1, 0x0 en caso contrario.

checkpcitem 0x(ítem index) 0x(cantidad):
comprueba si el jugador tiene cierta cantidad de un ítem en concreto en el PC. Si la tiene 0x800D será 0x1, 0x0 en caso contrario.

checkitemroom 0x(ítem index) 0x(cantidad): comprueba si el jugador tiene algo de espacio para cierta cantidad de cierto ítem. Si lo tiene 0x800D será 0x1, 0x0 en caso contrario.

checkattack 0x(attack índex): comprueba si algún pokemon del equipo tiene cierto ataque, y guarda la ubicación de éste en 0x800D. Si hay, se guardará según la posición de 0x0 a 0x5, 0x6 en caso contrario.

* * *​



Espero que se entienda perfectamente el funcionamiento de cada comando. Sobre todo lo he hecho de cara a los usuarios que, al empezar con variables, se equivocan entendiendo los criterios con los valores ya que entendieron mal el tema de las flags.

Un abrazo. :blush:
 
Última edición:

Laquin

Usuario mítico
Respuesta: [Tutorial| FR] Estructuras de comparación de valores (Uso de If)

Buen aporte, Felix. Encima eres la primera persona que conozco que explica las diferencias entre goto y call(y @~Ruki!; se me olvidaba)(y mira que es útil saberlo). :D

PD: Felix, ¿puedes entrar a tu perfil? Porque a mí no me carga ni en el móvil ni en el ordenador...
 
Última edición:

Kaktus

Miembro insignia
Miembro insignia
Respuesta: [Tutorial| FR] Estructuras de comparación de valores (Uso de If)

Pues para serte sincero yo confundía esto

Código:
0x0: [<] Menor que 
0x1: [=] Igual que 
0x2: [>] Mayor que 
0x3: [≤] Menor o igual que 
0x4: [≥] Mayor o igual que 
0x5: [≠] Diferente de
Y pensaba que 0x0 era igual a no y 0x1 era igual a sí x'D

Gran aporte Felih
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: [Tutorial| FR] Estructuras de comparación de valores (Uso de If)

Buen aporte, Felix. Encima eres la primera persona que conozco que explica las diferencias entre goto y call(y mira que es útil saberlo). :D
really?

Buen aporte, siempre es útil saber este tipo de cosas
 

Corbitto

espantaviejas
Respuesta: [Tutorial| FR] Estructuras de comparación de valores (Uso de If)

Buen aporte realmente. mas tarde lo leo a fondo y veo que tal, aunque a simple vista se ve muy completo.
 

Aguiar

Colega de los colegas
Miembro del equipo
Staff
Respuesta: [Tutorial| FR] Estructuras de comparación de valores (Uso de If)

Vaya mierda de tutorial, dislike, vete del foro pls (?
Graaaacias, buen trabajo!
 

eing

Miembro de honor
Miembro de honor
Respuesta: [Tutorial| FR] Estructuras de comparación de valores (Uso de If)

No sabia que uno de los principios mas básicos de scripting fuese exclusivamente para FR.

Luego viene cuando decis que solo fr esta documentada hahaha los que no estais documentados sois vosotros!

Anyways.. Buen aporte de scripting.
 

FEL!X

ᴛᴜ ᴀᴍɪɢᴏ ᴇʟ ᴇsᴘᴀᴅᴀᴄʜíɴ
Usuario de Oro
Respuesta: [Tutorial| FR] Estructuras de comparación de valores (Uso de If)

No sabia que uno de los principios mas básicos de scripting fuese exclusivamente para FR.

Luego viene cuando decis que solo fr esta documentada hahaha los que no estais documentados sois vosotros!

Anyways.. Buen aporte de scripting.
¡Ostras! Lo siento.

Jajaja, tienes razón eing, aclaro que éste principio se aplica a todos los RomHackers de GBA. La idea sería enfocarlo a Gba no solo a FR. Se me ha colao; es la costumbre lll-_-. Así que... ¡Cambiado! :)

Un abrazo.

PD:Lo que pasa es que soy un racista de usuarios no FR (Muahaha) (?)
 
Arriba