Registrarse

[RPG - Scripting] Problema con parámetros

Pableroski

Novato - Rpg en desarrollo
Buenas.
Estoy haciendo un script que, tras finalizar una batalla, muestre al lado del oponente el mini del pkm que se debilitó en último lugar.
El script funciona, y cuando lo pula un poco lo pasaré por aquí. Mi versión es la 16.2
Sin embargo, al tocar la función pbTrainerBattle, los parámetros que antes eran opcionales ahora son obligatorios. De lo contrario devuelve un Syntax Error y errores en cadena al no leer bien los parámetros siguientes.

Para hacer mi script, tuve que añadirle parámetros a pbTrainerBattle (foto 1) y añadir un condicional según uno de esos parámetros al final de la batalla (foto 2). El condicional no es más que indicar si se quiere mostrar ese pkm o no cuando acabe el combate. En rojo marco lo que yo he añadido.

Foto 1 (PTrainer_NPCT) - *NOTA: num_evento y direccion_pkm tuve que igualarlas a un número o si no al compilar saltaba un Syntax error en esa línea. Una vez que les di un valor desapareció ese error. Desconozco eso, pero dado que los parámetros que están igualados a algo (doublebattle, etc) son los opcionales y la wiki sus valores por defecto coinciden con el valor que les da el =, supuse que ese era el valor por defecto.
PTrainer_NPCT.PNG


Foto 2 (PokeBattle_Battle)
PokeBattle_Battle.PNG


He probado a eliminar mi código y volver a lo que ya estaba antes pero el problema persiste, me sigue pidiendo los parámetros que antes eran opcionales, lo que provoca fallos en algunos de los combates que ya tenía programados.
No es que sea algo insalvable, pues con añadir esos parámetros cada vez que se llama a un combate valdría, pero es ineficiente y debería funcionar sin ellos.

Cuando llamo a un combate, si me salto un parámetro esto es lo que aparece (foto 3, 4)

Foto 3 - Falta parámetro que recoge el resultado del combate en una variable. Los 3 del final (true,4,6) son míos (que aparezca el pkm, usando el evento 4 y con dirección 6 [mirar derecha]). Produce un error en cadena: syntax error (le falta un parámetro) y no puede asignar TRUE (mi parámetro). Después otro syntax error
Variable que recoge resultado.PNG


Foto 4 - Aquí falta mi último parámetro, que indica la dirección. Igualmente da un syntax error
Último parámetro.PNG


La verdad estoy un poco perdido. Agradezco la ayuda de antemano.

PD: Sé que pasar por parámetros datos a una función para luego guardarlos en variables globales es un poco absurdo, pero mi intención era ahorrarme tener que poner el comando de darle valor a dicha variable en la página de eventos delante de cada combate. Me parecía más sencillo poder ponerlos directamente en el script que llama al combate. La necesidad de pasar esos parámetros a variables globales fue que no sabía cómo pasar esos datos al código del PokeBattle_Battle sin el uso de globales. No quise tocar más parámetros y las globales fueron la solución fácil.
Le habría dado directamente valor a las globales desde el parámetro que recibe la función, en vez de recurrir a pkm_fuera, etc... pero no me dejaba meter variables globales dentro de los parámetros de PBTrainerBattle.
 

Adjuntos

Última edición:

Manurocker95

Doctorando en Ingeniería Biomédica & Game Dev
Miembro insignia
Las dudas se resuelven mejor por el discord pero bueno vamos al lío :D

Sin embargo, al tocar la función pbTrainerBattle, los parámetros que antes eran opcionales ahora son obligatorios.
Yo según veo en tu implementación siguen sin ser obligatorios y eso no debería dar problemas. Obviamente los opcionales deben ir al final por lo que si añades nuevas variables deben ser opcionales o ir al inicio (y modificar TODAS las llamadas a ese método). Los parámetros opcionales se pueden mandar en cualquier orden btw.

Cuando llamo a un combate, si me salto un parámetro esto es lo que aparece (foto 3, 4)
El problema que te sale es porque has puesto mal el comando. Si te das cuenta detrás del false hay 2 comas en vez de 1 y no, no puedes mandar un parámetro vacío. En todo caso sería "nil" si lo quieres nulo.

1727113802223.png


Foto 4 - Aquí falta mi último parámetro, que indica la dirección. Igualmente da un syntax error
Una vez más, no mandas bien los parámetros. Salvo que especifiques cual es cual en la llamada van todos en orden y este falta (además que al final tienes una coma y tampoco mandas el último. Si no hay después, va sin la coma.

1727113873115.png

1727113888325.png


1727113981115.png


p.D: En vez de usar números mágicos para las variables al menos ponlas en constantes.
 

Pableroski

Novato - Rpg en desarrollo
Primero de todo, darte las gracias. Cuando di programación en ingeniería vimos mucho de C y un poco de POO. De ruby entiendo lo justo y a veces se me queda grande.

Me he perdido cuando dices que según mi implementación deberían seguir siendo opcionales pero luego en los ejemplos de las fotos me dices que me faltan parámetros (que faltan, los quité a posta pensando que eran opcionales). Pensaba que ser opcional significaba que no hacía falta darle un valor entre las comas. En algún que otro archivo de la carpeta PBS, sobretodo si mal no recuerdo en la definición de objetos, podías dejar parámetros en blanco entre comas y no daba error. Pero por lo que me dices ser opcional no quiere decir que no haya que darle un valor al llamar al script, o al menos eso entiendo. Y esto me lleva a preguntarte, ¿por qué al declarar el parámetro en el argumento de la función, me obliga el compilador a igualarlos a algo? Es la primera vez que me pasa, Ruby incluido.
Los parámetros opcionales se pueden mandar en cualquier orden btw
Por mera curiosidad, si envío los parámetros opcionales en cualquier orden, cómo sabe la función luego cuál es cuál?

Por otro lado , antes de yo tocar nada podía llamar a la función sin poner, por ejemplo, el parámetro que le llega a variable=nil. No debería haber podido? Esa en concreto guarda el resultado de la batalla en la variable que elijas. Nunca tuve necesidad de usarla, hay otros medios, así que la dejaba en blanco.

En vez de usar números mágicos para las variables al menos ponlas en constantes
Me has recordado a mi profesor de informática con eso de números mágicos 😅. Sí, reconozco que es mejor usar una constante pero no conozco Ruby y no he querido tocar el código principal demasiado. Tendré que hacer una pequeña investigación y bichear un poco, gracias por el consejo. Uso números mágicos (especialmente para indicar la dirección, porque el pbMoveRoute al cambiar de gráfico tiene establecidos esos números (2,4.6.8) para indicar la dirección a la que mirará el mini. El otro número que pongo (num_evento) solo indica el evento del mapa sobre el que recaerá el cambio de gráfico. Que por cierto, mientras esperaba que alguien respondiera he tenido que añadirle otro parámetro más sobre eso, uno para el pkm oponente (el que ya estaba) y otro para el nuestro (el nuevo que he añadido).
El script que me quede probablemente sea un poco (mucho) chapuzas pero me queda un pequeño detalle que solventar y funcionará. Y si me dices que la función no falla y es normal que me devuelva esos errores, me quedo más tranquilo. Lo último que quiero es fastidiarla el juego a alguien.
Te parece un buen aporte?

PD: me imagino que discord es más práctico a la hora de resolver dudas. Sin embargo, probablemente una vez resuelta mi duda, se perdería por el chat, o eso supongo. Imagina que alguien en el futuro tiene la misma duda que yo. Aquí queda registrado como una base de datos. He llegado a resolver varios problemas que he tenido consultando en temas que preguntaban algo que no tenía nada que ver con lo que buscaba.

Pero si prefieres resolver por discord por mí encantado. Lo dicho, muy agradecido por tu ayuda.
 
Última edición:

Manurocker95

Doctorando en Ingeniería Biomédica & Game Dev
Miembro insignia
Como te decía, estas cosas son más sencillas por el discord que en un post enorme pero...

Me he perdido cuando dices que según mi implementación deberían seguir siendo opcionales pero luego en los ejemplos de las fotos me dices que me faltan parámetros (que faltan, los quité a posta pensando que eran opcionales). Pensaba que ser opcional significaba que no hacía falta darle un valor entre las comas. En algún que otro archivo de la carpeta PBS, sobretodo si mal no recuerdo en la definición de objetos, podías dejar parámetros en blanco entre comas y no daba error. Pero por lo que me dices ser opcional no quiere decir que no haya que darle un valor al llamar al script, o al menos eso entiendo. Y esto me lleva a preguntarte, ¿por qué al declarar el parámetro en el argumento de la función, me obliga el compilador a igualarlos a algo? Es la primera vez que me pasa, Ruby incluido.
Que sean opcionales quiere decir que si no los mandas tienen un valor por defecto. Cuando en la defininición del método (en Ruby no declaras y luego implementas si no que se hace "todo de una") pones el = valor, al no mandar el parámetro se establece con ese valor y si lo mandas, cambia al que le digas. Sin embargo, los parámetros los tienes que seguir mandando en orden (salvo que especifiques qué parámetro "sobrescribes" del valor por defecto. Ejemplo:

Código:
def pbMyMethod(myVar1, myVar2 = 3, myVar3 = 5)
printf("Var1: #{myVar1} Var2: #{myVar2} Var3: #{myVar3}")
end

pbMyMethod(1)
pbMyMethod(2, 7)
pbMyMethod(3, myVar3:100)
En este caso myVar1 siempre es "obligatoria" mientras que los otros dos son opcionales. La primera vez que se llama a pbMyMethod, printea 1, 3 y 5. La segunda vez 2, 7, 5 y la tercera 3, 3, 100 (ya que especificas que el segundo parámetro que le mandas corresponde al parámetro "myVar3").

Si los pasas en orden SIEMPRE tienes que mandar un valor.


Por mera curiosidad, si envío los parámetros opcionales en cualquier orden, cómo sabe la función luego cuál es cuál?
Lo sabe a través del compilador. Por eso no se pueden tener 2 funciones llamadas igual con los mismos parámetros.

Por otro lado , antes de yo tocar nada podía llamar a la función sin poner, por ejemplo, el parámetro que le llega a variable=nil. No debería haber podido? Esa en concreto guarda el resultado de la batalla en la variable que elijas. Nunca tuve necesidad de usarla, hay otros medios, así que la dejaba en blanco.
Al ser opcional si solo pones los obligatorios o todos los obligatorios + opcionales definidos, no tienes por qué especificar un valor (como en mi ejemplo de arriba).
 

Pableroski

Novato - Rpg en desarrollo
En este caso myVar1 siempre es "obligatoria" mientras que los otros dos son opcionales. La primera vez que se llama a pbMyMethod, printea 1, 3 y 5. La segunda vez 2, 7, 5 y la tercera 3, 3, 100 (ya que especificas que el segundo parámetro que le mandas corresponde al parámetro "myVar3").

Si los pasas en orden SIEMPRE tienes que mandar un valor
Si lo he entendido bien, al llamar a mi función (foto 1) , bastaría con poner pbTrainerBattle(PBTrainers::ENGINEER, "Pablo", _I("..."), false, 0,false,0,false) ??? Ya que num_evento y dirección están por defecto, asemejando a tu segundo ejemplo de llamada, si no se ponen las comas no debería dar error. Es así?
Eso explicaría por qué nunca tuve necesidad de poner el parámetro que le llega a variable=nil
 

Manurocker95

Doctorando en Ingeniería Biomédica & Game Dev
Miembro insignia
Si lo he entendido bien, al llamar a mi función (foto 1) , bastaría con poner pbTrainerBattle(PBTrainers::ENGINEER, "Pablo", _I("..."), false, 0,false,0,false) ??? Ya que num_evento y dirección están por defecto, asemejando a tu segundo ejemplo de llamada, si no se ponen las comas no debería dar error. Es así?
Eso explicaría por qué nunca tuve necesidad de poner el parámetro que le llega a variable=nil
ahí si la estás poniendo… si no la usas ponla siempre a nil
 
Última edición:

Pableroski

Novato - Rpg en desarrollo
ahí si la estás poniendo… si no la usas ponla siempre a nil
Me refería a antes de modificar la función, que nunca tuve necesidad de ponerla al ser la última y no usarla.
Ahora si no la uso tendría que no ponerla e indicar cuál es cada uno de los parámetros siguientes. O ponerla en nil como dices
Pues todo claro, muchas gracias.
 

Pableroski

Novato - Rpg en desarrollo
Hola, yo otra vez. Espero que esta vez sea la última.
La variable "variable=nil" me sigue dando problemas. Entiendo que es opcional y si no la pongo en la llamada a la función no debería dar problemas.
pbTrainerBattle(PBTrainers::HIKER, "Carlos", _I("..."), false, 0,false,pkm_fuera=true) (asemejando al ejemplo 3 que me pusiste).
El evento corre, comienza el combate y se desarrolla bien. Justo cuando acaba (foto 2 - la del primer post) me salta este error (foto 5)

Foto 5
1727168249892.png


EDIT: Quise poner pkm_fuera:true como tenías en tu ejemplo pero no podía. Igual con ::
Esto me pasó también con num_evento y dirección.
Y me ha llevado a darme cuenta de que no manda el valor que debe a la función. Al mandar pbTrainerBattle(PBTrainers::HIKER, "Carlos", _I("..."), false, 0,false,pkm_fuera=true) "variable" coge true y salta el error porque cuando llega a foto 2 la v64 (pok_fuera) es 0 y eso trastoca luego mi función.
Si pongo pbTrainerBattle(PBTrainers::HIKER, "Carlos", _I("..."), false, 0,false,nil,pkm_fuera=true,direccion_pkm=4) la dirección no será 4, sino que le asigna ese valor a num_evento. pkm_fuera es true por chiripa, porque está en el sitio en el que debería.
Estoy por sacarlos de la función (quitando la asignación a variables globales de la foto 1) y asignarles los valores a las globales manualmente con una llamada a script desde la página de eventos. Salvo el de pkm_fuera, que prefiero dejarlo en false por defecto. Y si al final decido eso, igualmente gracias por toda la ayuda y el aprendizaje.

Siento las molestias, sé que soy un pesado al que le cuesta enterarse de las cosas a veces😅
 
Última edición:

Manurocker95

Doctorando en Ingeniería Biomédica & Game Dev
Miembro insignia
Hola, yo otra vez. Espero que esta vez sea la última.
La variable "variable=nil" me sigue dando problemas. Entiendo que es opcional y si no la pongo en la llamada a la función no debería dar problemas.
pbTrainerBattle(PBTrainers::HIKER, "Carlos", _I("..."), false, 0,false,pkm_fuera=true) (asemejando al ejemplo 3 que me pusiste).
El evento corre, comienza el combate y se desarrolla bien. Justo cuando acaba (foto 2 - la del primer post) me salta este error (foto 5)

Foto 5
Ver el archivo adjunto 17969

EDIT: Quise poner pkm_fuera:true como tenías en tu ejemplo pero no podía. Igual con ::
Esto me pasó también con num_evento y dirección.
Y me ha llevado a darme cuenta de que no manda el valor que debe a la función. Al mandar pbTrainerBattle(PBTrainers::HIKER, "Carlos", _I("..."), false, 0,false,pkm_fuera=true) "variable" coge true y salta el error porque cuando llega a foto 2 la v64 (pok_fuera) es 0 y eso trastoca luego mi función.
Si pongo pbTrainerBattle(PBTrainers::HIKER, "Carlos", _I("..."), false, 0,false,nil,pkm_fuera=true,direccion_pkm=4) la dirección no será 4, sino que le asigna ese valor a num_evento. pkm_fuera es true por chiripa, porque está en el sitio en el que debería.
Estoy por sacarlos de la función (quitando la asignación a variables globales de la foto 1) y asignarles los valores a las globales manualmente con una llamada a script desde la página de eventos. Salvo el de pkm_fuera, que prefiero dejarlo en false por defecto. Y si al final decido eso, igualmente gracias por toda la ayuda y el aprendizaje.

Siento las molestias, sé que soy un pesado al que le cuesta enterarse de las cosas a veces😅
a ver, cuando tu mandas un parámetro no tienes que definir con =. Puedes especificar (indicando la variable exacta del parámetro) con dos puntos. Si no, solo mandas el valor.

Código:
pbTrainerBattle(PBTrainers::HIKER, "Carlos", _I("..."), false, 0,false, pkm_fuera: true)
Debes tener en cuenta los parámetros:

1727181559844.png


Si quieres no establecer "num_evento" ni los otros opcionales salvo pkm_fuera y direccion_pkm:

Código:
pbTrainerBattle(PBTrainers::HIKER, "Carlos", _I("..."), pkm_fuera: true, direccion_evento: 4)
 
Arriba