Jump to content
KeKo

Capitulo IV - Profundicemos en las condiciones

Recommended Posts

Buenas zone!

De nuevo tras otro emocionante capítulo del curso brindado por el gran raul es mi turno de seguir con el curso. El capítulo de hoy tratará sobre las condiciones en las quests, lo que popularmente conoceis todos como usar if en una quest.

 

Esta vez también nos vamos a centrar en el cuerpo de una quest, y como mi colega raul empezare con la estructura básica de un if. Recordad esto primero:

 

Llamaremos [X] a una variable que nos sirva para todos los casos.

 

Pero como la variable [X] que nos hemos inventado no existe, tendremos que poner algo en su lugar, ¿no?

Podemos poner muchas acciones que puede realizar el usuario (pc) dentro del servidor.

 

De nuevo la idea es la misma que con los whens:

 

 

 

Por lo tanto la estructura es asi:

 

if [X] then

accion

end

Como veis cada if le corresponde un end y para que nos os de error al cargar tiene que ir un then al final del if, si no os saltara este error:

 

Imagen enviada

 

La sintaxis es incorrecta: el servidor espera encontrar un "then" después de la condición, pero no lo encuentra.

 

Bien si ya tenemos claro la estructura vamos a profundizar un poco en el uso de las condiciones. Lo primero de todo me gustaría hacer una pequeña distinción entre varios tipos de condiciones:

 

- Condiciones simples: Son aquellas que solo tienen un unico if (con sus posibles elseifs).

 

- Condiciones compuestas: Son aquellas que se dan en las quests en las que si superamos la primera condicion se nos pone otra condición. Ojo! Son 2 condiciones diferentes, que llevan dos if y dos ends.

 

- Condiciones opuestas: Que son las que usan habitualmente un else, o si no un return+end (ya os explicare como funcionan en el capi), y que son aquellas en las que ponemos una condicion y lo que pasara si se cumple lo contrario a esa condicion.

 

Bueno vamos aver un pequeño ejemplo de una quest que usa una condicion:

 

quest capicuatro begin
state start begin
		  when login with pc.get_map_index() == 41 begin
					   if pc.get_empire() == 1 then
							   say("No estas en el mapa de tu reino")
					   end
			   end
	   end
end

Hasta aquí todo bien no? Como veis es una quest que se activa si te logeas en el mapa de city1 de jinno, pero te pone la condicion de que si eres del reino 1 (shinsoo) te aparece un mensaje diciendo que no estas en el mapa de tu reino.

 

Respecto a los ends, como hay un if lleva un end y los otros tres son del when y de la apertura.

 

Por lo tanto hagamos un resumen: cuando quieres poner una condicion en una quest primero pones el when [X] begin al que queremos ponerle la condicion, luego escribimos la condicion en si, la accion que se realiza una vez cumplida la condicion y el end.

 

if [X] then
accion
end

 

Ahora pongamos otro ejemplo con esta misma mision pero ya con algunos elseif:

 

quest capicuatro begin
state start begin
		  when login with pc.get_map_index() == 41 begin
					   if pc.get_empire() == 1 then
							   say("No estas en el mapa de tu reino")
					   elseif pc.get_empire() == 2 then
							   say("No estas en el mapa de tu reino")
					   elseif pc.get_empire() == 3 then
							   say("Estas en el mapa de tu reino!")
					   end
			   end
	   end
end

Ahora ya tenemos 3 condiciones, pero como os fijais solo 1 lleva if, ya que son continuacion de la primera y por lo tanto solo llevan un end por las tres.

 

Y también otro ejemplo del uso de un elseif, con un local select que es cuando mas vais a ver un elseif:

 

quest capicuatro begin
state start begin
			    when 70042.use begin
					    say_title("Tienda portatil")
					    say("Con este objeto podras comprar")
					    say("Potas donde quiera que estes.")
					    say_reward("Quieres algunas?")
   local tienda = select ("Potas rojas" , "Potas azules" , "Superpotas" , "Cerrar")
						    if tienda == 1 then
									 say("Toma 200 potas rojas")
									 pc.give_item2("27003", 200)
									 pc.change_money(-30000)
						    elseif tienda == 2 then
									 say("Toma 200 potas azules")
									 pc.give_item2("27006", 200)
									 pc.change_money(-45000)

							 elseif tienda == 3 then
 
									  say(" Usted ha sido trolleado")
									  say("no hay superpotas")
							 elseif tienda == 4 then
									   return
    
				    end
			 end
	   end
end

 

 

A estas alturas ya os habreis dado cuenta de como funciona el uso de un elseif:

 

if [X] then
accion
elseif [X] then
accion
elseif [X] then
accion
end

Al igual que cuando usabamos un solo if, ponemos el when [X] begin, luego la condicion if [X] then y esta vez las otras posibilidades que queremos que haya unidas al primer if [X] then (podemos poner las que queramos) con la estructura elseif [X] then. Por último cerramos el if con un end.

 

Vayamos ahora a un caso de condicion compuesta, por ejemplo un teletransportador para un mapa:

 

quest capicuatro begin
state start begin
				 when 20095.chat."Teleporter" begin
						   if pc.get_level() < 50 then
								    say("Lo siento eres muy bajo")
								    say("vuelve cuando seas mas lvl")
								    return
						  end
						   if pc.count_item("50084") == 0 then
									 say("Valla, no tienes sello")
									 say("Asi que no puedes entrar")
									 return
						  end
						  if pc.get_map_index() == 190 then
									 say("No puedes ir al mapa nuevo")
									 say("Si ya estas en el")
									 return
						  end

				    say("Pues lo siento ahora no quiero")
				    say(" llevarte al mapa nuevo.")
				   end
		 end
end

Ahora en vez de usar condiciones unidas a la primera (el if [X] then) ponemos diferentes condiciones, cada una de estilo if [X] then y con su respectivo end.

 

Usando las condiciones compuestas conseguimos que para llegar a la accion propia del when [X] begin haya que ir cumpliendo cada una de las condiciones. Es decir, si cumplimos la primera condicion el juego mirará aver si cumplimos la segunda.

 

Si no cumplimos la segunda no se ejecutará, y si la cumplimos mirará aver si cumplimos la tercera. Si cumplimos todas las condiciones, la accion principal se ejecutará.

 

Otra cosa a tener en cuenta es que podemos meter condiciones dentro de otras condiciones, y para eso os pondré un ejemplo en el que mezclaré condiciones simples con condiciones opuestas (hare mas compleja la quest de antes de las potas):

 

quest capicuatro begin
state start begin
			    when 70042.use begin
					    say_title("Tienda portatil")
					    say("Con este objeto podras comprar")
					    say("Potas donde quiera que estes.")
					    say_reward("Quieres algunas?")
   local tienda = select ("Potas rojas" , "Potas azules" , "Superpotas" , "Cerrar")
						    if tienda == 1 then
									 if pc.gold < 30000 then
									 say("Vaya no tienes suficiente dinero")
									 return
									 end
									 say("Toma 200 potas rojas")
									 pc.give_item2("27003", 200)
									 pc.change_money(-30000)
						    elseif tienda == 2 then
									 if pc.gold < 45000 then
									 say("Vaya no tienes suficiente dinero")
									 return
									 end
									 say("Toma 200 potas azules")
									 pc.give_item2("27006", 200)
									 pc.change_money(-45000)							    
							 elseif tienda == 3 then
									  say(" Usted ha sido trolleado")
									  say("no hay superpotas")
							 elseif tienda == 4 then
									   return
						    end
				    end
			 end
	   end
end

Ahora hemos metido una condición dentro de otra: primero metemos la condicion de elegir la opcion 1 (la de potas rojas) y luego dentro de esa hacemos que el juego mire si tenemos 30k para comprar las potas.

 

Os habreis fijado que ahi usamos una condición opuesta:

 

if pc.gold < 45000 then
say("Vaya no tienes suficiente dinero")
return
end
say("Toma 200 potas azules")
pc.give_item2("27006", 200)
pc.change_money(-45000)

Ponemos la condicion:

 

if pc.gold < 45000 then

Luego lo que pasa si la cumplimos:

 

say("Vaya no tienes suficiente dinero")

Y para cerrar la condicion ponemos:

 

return
end

De esta manera, lo siguiente que pongamos se cumplirá EN CUALQUIER CASO EN EL QUE NO CUMPLAMOS LA CONDICION ANTERIOR. Y como veis si tenemos mas de 45k de yang (es decir, no cumplimos la condicion) pues nos da las potas:

 

say("Toma 200 potas azules")
pc.give_item2("27006", 200)
pc.change_money(-45000)

Para acabar me gustaría hablarlos de la palabra else. Esta palabra se utiliza para hacer una condicion opuesta, ya que implica que si la cumplimos estará pasando cualquier cosa contraria a la de la condicion anterior. Veamos un ejemplillo, y os recalco que UN ELSE NO TIENE QUE LLEVAR SU CORRESPONDIENTE END.

 

quest capicuatro begin
state start begin
		   when 70044.use begin
					  if pc.count_item("70042") == 0 then
								 pc.give_item2("70024", 1)
								 chat("Toma un 5o bonus")
								 pc.remove_item("70024" , 1)
					  else
								 say("Lo siento pero ya tienes")
								 say("el 5o bonus")
		  
				   end
		    end
	  end
end
		  

En este caso la condicion primera es que no tengamos ningun 5o bonus en el inventario, y si no la cumplimos (es decir, si que tenemos 5o bonus) pues nos dice que ya lo tenemos. Como usamos un else no especificamos una cantidad de bonus que tenemos que tener, si no que en cualquier caso contrario a que no tengamos ninguno nos dirá que sí lo tenemos.

 

Y bueno eso es todo en el capítulo de hoy, espero que lo hayais disfrutado y que os ayude a la hora de hacer nuevas quests .

Share this post


Link to post
Share on other sites

Aún no han acabado de leerse mi capítulo y les pones el tuyo xD ¡Les estallará la cabeza de tanta información!

 

El próximo me toca a mí, a ver que tal se os dan los states :fuckyeah:

Share this post


Link to post
Share on other sites

Aún no han acabado de leerse mi capítulo y les pones el tuyo xD ¡Les estallará la cabeza de tanta información!

 

El próximo me toca a mí, a ver que tal se os dan los states :fuckyeah:

 

sip este lo hice ants de lo normal porque mañana no estare en todo el dia

Share this post


Link to post
Share on other sites

Excelente keko, aún así necesitaría todas las funciones de las quest y que hacen, solo tengo como 150 o 200 variables de la misma questlib.lua xD, sería genial que pusieras que hace cada una en específica.

 

Saludos.

Share this post


Link to post
Share on other sites

Ayer haciendo una quest y ya casi terminada, le quise agregar mas items que hace mi quest son muchos if con elseif que me comparan si el pj tiene cierta cantidad de x item en cada elseif le hago la comparacion

 

pero en el ultimo elseif le pongo que sea todo => a la cantidad de items que pido anteriormente, y todo lo uno con and pero cuando hago unir dos items con 1 and funciona y al poner 3 o 4 and ya no corre bien la quest me :S

 

Yo creo que no se puede mas de 1 and por linea de if , estoy en lo correcto ? tengo esa duda dejo una parte de lo que hablo

 

if pc.count(item1) <=1
say:("te hace falta este item")
elseif pc.count(item2) <=2
say:("te hace falta este item2")
if pc.count(item3) <=9
say:("te hace falta este item")
elseif pc.count(item1) => 2 and pc.count(item1) =>3 and pc.count(item) => 10 then
  say:("recibes estos items:")
end

 

Y excelentes aportes los que llevan en esta Web cada dia se esta mejorando mas la web ;)

Los Felicito

Share this post


Link to post
Share on other sites

Ayer haciendo una quest y ya casi terminada, le quise agregar mas items que hace mi quest son muchos if con elseif que me comparan si el pj tiene cierta cantidad de x item en cada elseif le hago la comparacion

 

pero en el ultimo elseif le pongo que sea todo => a la cantidad de items que pido anteriormente, y todo lo uno con and pero cuando hago unir dos items con 1 and funciona y al poner 3 o 4 and ya no corre bien la quest me :S

 

Yo creo que no se puede mas de 1 and por linea de if , estoy en lo correcto ? tengo esa duda dejo una parte de lo que hablo

 

if pc.count(item1) <=1
say:("te hace falta este item")
elseif pc.count(item2) <=2
say:("te hace falta este item2")
if pc.count(item3) <=9
say:("te hace falta este item")
elseif pc.count(item1) => 2 and pc.count(item1) =>3 and pc.count(item) => 10 then
  say:("recibes estos items:")
end

Pues sí, por desgracia no se pueden encadenar ifs con ands o ors (lo que es una pena la verdad) así que en tu caso yo probaria asi:

 

 

if pc.count(item1) <=1
say:("te hace falta este item")
elseif pc.count(item2) <=2
say:("te hace falta este item2")
if pc.count(item3) <=9
say:("te hace falta este item")
elseif pc.count(item1) => 2 then
 if pc.count(item1) =>3 then
if pc.count(item) => 10 then
  say:("recibes estos items:")
return
end
end
end
say("Lo siento no tienes los items")
end

No estoi seguro de que funcione que no tengo tiempo ahora para probarla y recuerda que el comando para ver si tienes un item es pc.count_item("item", cantidad) o si estas haciendo comparaciones pc.count_item("iditem") == cantidad.

Share this post


Link to post
Share on other sites

Sip lo hize parecido pero despues me puse a mirar y dije eso son rebundancias.... por que compruebo que tenga <=9 por logica el pj tiene 10 o mas entonces ya no nesecito comprobar en el resto del codigo, y al final haciendolo a mi manera no podre dar la advertencia del ultimo item, pero como ya se que ese item no esta lo hago con un else.....

 

Gracias = tu forma tambien funciona pero creo que asi como digo haorramos codigo y como no salimos de la ventana, no veo provabilidades de que la bugueen

 

if pc.count(item1) <=1 then
say:("te hace falta este item")
elseif pc.count(item2) <=2 then
say:("te hace falta este item2")
elseif pc.count(item3) =>9 then
say:("Recibes estos iems")
else
say:("the hace falta este item3")
end

 

Asi la termine dejando y corre muy bien, Gracias nuevamente por aportar, e igualmente por dar tu opinion sirve mucho para mirar los diferentes conociemientos y aprender mas ^^

Share this post


Link to post
Share on other sites

Sip lo hize parecido pero despues me puse a mirar y dije eso son rebundancias.... por que compruebo que tenga <=9 por logica el pj tiene 10 o mas entonces ya no nesecito comprobar en el resto del codigo, y al final haciendolo a mi manera no podre dar la advertencia del ultimo item, pero como ya se que ese item no esta lo hago con un else.....

 

Gracias = tu forma tambien funciona pero creo que asi como digo haorramos codigo y como no salimos de la ventana, no veo provabilidades de que la bugueen

 

Asi la termine dejando y corre muy bien, Gracias nuevamente por aportar, e igualmente por dar tu opinion sirve mucho para mirar los diferentes conociemientos y aprender mas ^^

 

Pues la verdad ni mire como tenias la parte anterior a la del problema asi que simplemente intente hacer lo que comentaras xd, pero si asi te iba mejor pos listo ^^

 

Me alegra ver comentarios como el tuyo ^^ es un placer compartir conocimiento y entre todos ir haciendo la comunidad cada vez mejor :D

Share this post


Link to post
Share on other sites

Amigo tengo una duda para hacer que un pj baje o suba su lv que pc......... tengo que poner yo antes de leer esto sabia muy poco de quest y ps recien termino este capitulo e intente hacer una aun no la pruebo pero si puedes decirme si tengo algo mal

 

quest Reset1 begin
state start begin
when itemvalue.use begin
say_title("by Ares")
say("Pergamino reset 1")
say ("con este pergamino podras")
say ("ser lvl 1 de nuevo pero obtendras")
say ("una poderosa armadura")
say_reward ("SELECCIONA TU RAZA")

local tienda = select ("Guerrero" , "Ninja" , "Sura" , "Chaman" , "Cerrar")
	 if tienda == 1 then
	   if pc.get.level() <250
	   say ("Que intentas? Tienes que ser lv250 para hacer Reset")
	   return
	   end
	   say ("Aqui tienes tu armadura de Guerrero")
	   pc.give_item2 ("Value armadura", 1)
	   pc.set_level (1)
  elseif tienda == 2 then  
	   if pc.get.level() <250
	   say ("Que intentas? Tienes que ser lv250 para hacer Reset")
	   return
	   end
	   say ("Aqui tienes tu armadura de Ninja")
	   pc.give_item2 ("Value armadura", 1)
	   pc.set_level (1)
  elseif tienda == 3 then
		 if pc.get.level() <250
	   say ("Que intentas? Tienes que ser lv250 para hacer Reset")
	   return
	   end
	   say ("Aqui tienes tu armadura de Sura")
	   pc.give_item2 ("Value armadura", 1)
	   pc.set_level (1)
  elseif tienda == 4 then
	   if pc.get.level() <250
	   say ("Que intentas? Tienes que ser lv250 para hacer Reset")
	   return
	   end
	   say ("Aqui tienes tu armadura de Chaman")
	   pc.give_item2 ("Value armadura", 1)
	   pc.set_level (1)
  elseif tienda == 5 then
	   say ("Esta bien si no quieres es tu problema")
	   say ("no sabes de lo que te pierdes jajaja")
	   return
  end
end
end

Share this post


Link to post
Share on other sites

no existe la funcion pc.set_level() tendrias que crearla usando mysql, pero para que fuese viable el jugador tendria que estar un tiempo off, como cuando se desbuguea un pj desde la web, que si se conecta rapido no se desbuguea.

 

tambien tienes un un par de errores, te falto un end al final y pc.get.level() tienes que poner asi pc.get_level(). a simple vista no veo mas fallos

 

Saludos, Yori

Share this post


Link to post
Share on other sites

si tienes el

Debes iniciar sesión para ver el contenido del enlace en esta publicación.
implementado en tu server, con esta funcion cambias el level, pero ya te digo que si el pj no esta off y pasa un tiempo hasta que se vuelva a conectar no creo que sirva. pero siempre puedes intentarlo.

 

mysql_query("Update player.player set level = 1 where name = '"..pc.get_name().."';")

Saludos, Yori

 

Suerte

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...