6. CONDICIONALES (if, else, else if, switch)
Los condicionales sirven para ejecutar distintas líneas de código según se cumpla o no la condición que nosotros definimos, de forma que podemos dirigir la lectura de código según nuestros intereses.
La estructura más simple es la de if:
if(se cumple esta condición)
{
ejecuta este código
}
código que seguirá leyendo haya cumplido o no la condición
Imaginemos que queremos que la trampa mágica que hemos creado solamente afecte a los PJs, para que no dañe a los monstruos que pongamos en el dungeon. Usaremos como condición la función GetIsPC, que en la descripción pone que devuelve TRUE si la criatura es un PJ, FALSE si no.
void main()
{
object oPC = GetEnteringObject();//quien entra
if(GetIsPC(oPC)==TRUE)
{
int iDam = d6()+5; //danyo que hace
effect eEff = EffectDamage(iDam);//definimos el efecto danyo
ApplyEffectToObject(DURATION_TYPE_INSTANT, eEff, oPC);//y se lo aplicamos al PJ, sufreeee!!!!
effect eVis = EffectVisualEffect(VFX_COM_BLOOD_SPARK_MEDIUM); //efecto visual de sangre
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC));//aplicado al segundo 1.0
}
}
Entonces solo provocará daño a las criaturas que cumplan la condición que hemos puesto. Si quisiéramos lo contrario, que solo dañará a quien no sea un PJ, pondríamos FALSE.
Importante darse cuenta que hemos usado ==, esto sirve para decirle que queremos que nos compare los dos valores que hay a los dos lados de los símbolos para ver si son iguales. No confundir, = es para definir variables, creando una igualdad a ambos lados del símbolo, == para establecer una comparación de igualdad. En este caso GetIsPC(oPC) nos devuelve TRUE y nosotros hemos preguntado si el valor que devuelve es también TRUE.
Habiendo visto que ==, ahora toca presentar a !=. Si con == preguntamos si los dos valores son iguales, != sirve para ver si son distintos. Así pues...
if(GetIsPC(oPC)==TRUE)
es lo mismo que poner...
if(GetIsPC(oPC)!=FALSE)
... aunque complicándolo más xD
Otra forma de escribirlo sería sin poner ni TRUE ni FALSE.
if(GetIsPC(oPC))
{
Ejecuta esto si es PJ, es lo mismo que si pusiéramos == TRUE
}
O, muy utilizado, poner el ! delante de la función
if(!GetIsPC(oPC))
{
Ejecuta esto si NO es PJ, es lo mismo que si pusiéramos == FALSE o !=TRUE
}
También veréis que en muchos scripts usan return;. Esto se utiliza para detener el script hasta donde ha leído. Así pues, también podríamos poner, si no queremos que se haga nada de nada con las criaturas no PJs que activen la trampa...
void main()
{
object oPC = GetEnteringObject();//quien entra
if(!GetIsPC(oPC)){return;} //si no es PJ, deja de leer aquí
//entonces todo lo siguiente, lo leerá para quien sea PJ
int iDam = d6()+5; //danyo que hace
effect eEff = EffectDamage(iDam);//definimos el efecto danyo
ApplyEffectToObject(DURATION_TYPE_INSTANT, eEff, oPC);//y se lo aplicamos al PJ, sufreeee!!!!
effect eVis = EffectVisualEffect(VFX_COM_BLOOD_SPARK_MEDIUM); //efecto visual de sangre
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC));//aplicado al segundo 1.0
}
Pero, ¿y si queremos por ejemplo que a los PJs los dañe, y a los no PJs los cure? Conociendo el if, podríamos hacer la estructura:
if(GetIsPC(oPC)
{
daña
}
if(!GetIsPC(oPC)
{
cura
}
O el método correcto, usando else, que traducido sería "si no", para todas las opciones que no cumplan la condición:
if(condición)
{
haz esto
}
else
{
haz esto otro
}
Y quedaría algo cómo:
void main()
{
object oPC = GetEnteringObject();//quien entra
effect eEff; //definimos variable... pero aun no sabemos que es
int iDam = d6()+5; //danyo o curación que hace
if(GetIsPC(oPC)) //si es PJ...
{
eEff = EffectDamage(iDam);//eEff es un efecto de daño
effect eVis = EffectVisualEffect(VFX_COM_BLOOD_SPARK_MEDIUM); //efecto visual de sangre
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC));//aplicado al segundo 1.0
}
else //... y si no...
{
eEff = EffectHeal(iDam);//eEff es un efecto de curacion
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, eEff, oPC);//y aplicamos eEff al PJ o bicho
}
Fíjaos en el truqui utilizado. Esta vez el int iDam lo he dejado fuera de la estructura condicional. De esta forma está definido sea o no sea PJ, así que uso el mismo valor aleatorio iDam tanto si quiero dañar o curar. Después eEff no tiene inicialmente asignado qué es, si daño o curación... depende de cómo lea el script será una cosa u otra. Finalmente una vez lo hemos decidido, aplicamos este efecto. Podríamos haberlo separado todo, repitiendo el ApplyEffect y crear un nuevo valor aleatorio para curar, pero cómo ya he ido diciendo: a cuantas menos líneas mejor.
Otra estructura es con la utilización del else if (traducción: "y si no"), para ir descartando.
if(condición)
{
haz esto
}
else if(otra condición)
{
haz esto otro
}
else if(oootra condición)
{
o esto
}
else
{
si no cumple ninguna, haz esto
}
Otros símbolos aparte de != y == son <, >, >= y <= para comparar valores y que cumplan la condición de ser...
... más pequeños <
... más pequeño o igual <=
... más grandes >
... más grande o igual >=
Y cuando combinemos condiciones, && y || para decir y o o
if( condición1 && condición2 )
{
si se cumplen las dos
}
if( condición1 || condición2 )
{
si se cumple CUALQUIERA de las dos
}
Por ejemplo, haciendo un ejemplo conjunto de varias cosas que hemos visto (operaciones, else if y estos símbolos). Si quisiéramos que el daño que se aplica al jugador dependa de la edad del mismo, haríamos...
[...]
int iDam = d6()+5; //valor base
int iAge = GetAge(oPC); //edad que tiene el PJ
if( (iAge>14)&&(iAge<=25) ) //si tiene entre 15 y 25 años
{
iDam=iDam*2; //dañamos el doble, los jóvenes pueden soportarlo
}
else if( (iAge>25)&&(iAge<=80) )//Entre 26 y 80
{
iDam=iDam/2; //ya están viejales, la mitad de daño
}
else
{
iDam=1; //El resto, solo un toque de atención... que no están pa muchas aventuras
}
effect eEff = EffectDamage(iDam);//definimos el efecto daño
ApplyEffectToObject(DURATION_TYPE_INSTANT, eEff, oPC);//y se lo aplicamos al PJ, sufreeee!!!!
Este último else recoge los valores sobrantes, que serían los PJs de menos de 15 (no incluido) y los mayores de 81 (incluido)... que sería más fácil que poner:
else if( (iAge<15) || (iAge>=81) )
También cuidado, si dividimos por 2 puede quedar decimal (float) y tenemos definido int. En este caso se redondeará el valor.
Y otra estructura más de condición... ¡la última, lo juro!
es la estructura switch (traducción: alterna) Realmente se puede suplir con la anterior de if, else if y else, pero no está de más conocerla por si os la encontráis en algún script, saber qué hace.
La estructura es:
switch(valor)
{
si es x: haz esto; para;
si es y: haz esto; para;
si es z: haz esto; para;
y si no cumple ninguno: haz esto; para;
}
For example... Queremos que el PJ que caiga en la trampa diga 1 de 4 posibles frases aleatorias, y que no siempre diga algo.
Dentro de la condición de si es PJ (no queremos que lo digan los bichos) podríamos poner:
int i12 = d12(); //tira un dado de 12
string sFrase; //declaramos la variable, de momento es nula y le asignaremos valor según el resultado del d12
switch(i12)
{
case 1: sFrase = "¡Cachis!"; break; //si la tirada es 1
case 2: sFrase = "Cagontó"; break; //si la tirada es 2
case 3: sFrase = "¡Maldición!"; break; //si la tirada es 3
case 4: sFrase = "Brbrbrbrb"; break; //si la tirada es 4
default: break; //de 5 a 12, sFrase no es nada... lo que significa que sFrase = ""
}
if(sFrase!="") //así que ponemos la condición de que si sFrase ha sido definida...
{
AssignCommand(oPC, SpeakString(sFrase)); //... el PJ la diga
}
Nota: Cómo la función SpeakString no tiene cómo parámetro a quién se aplica, se usa el AssignCommand para decirle que es el PJ quien queremos que lo diga. De no hacerlo, cómo el script está en el evento OnEnter de un desencadenante, estaríamos haciendo que lo "dijera" el desencadenante.
Editado por Setaka, 03 January 2020 - 05:16 PM.