Jump to content

[GUIA] Programación Básica LUA


goldware
 Share

Recommended Posts

Buenas, primero me presento: Mi nombre es Álvaro Royo, soy Ingeniero de Software y os voy a enseñar de una vez a tener una idea BÁSICA de programación para hacer quests.
(Esto no es un curso de quest, cursos de quests ya hay muchos.)
COMENCEMOS:

Lua: Es un lenguaje relativamente antiguo, bastante simple, usa pocos conectores como puntos y comas.
Se usa sobre todo en la industria de análisis de funciones por eso lo usan muchas empresas de videojuegos para sus programas.
 
Muchos de vosotros conocereis ya el Python, bien sabreis que el python es un lenguaje que asimila el sangrado. ¿sangrado?: ejemplo de codigo con sangrado y sin sangrado:
CON SANGRADO:
 

if a == 1 then     print "a es igual a 1"end
 
SIN SANGRADO:
 

if a == 1 thenprint "a es igual a 1"end
 
¿Para que esta explicación?
Solo para llegar a la conclusión de que en LUA no hay que respetar el sangrado.
De todas formas siempre es aconsejable tener cierto orden en los códigos por si alguna vez necesitais realizar un programa extenso.
 
También añado: Lua no es un lenguaje solo para metin, lo digo por la gente que piensa que es muy limitado. Lua realiza CASI todas las mismas funciones que un lenguaje como C++ o JAVA.
 

 
Despues de una pequeña introducción sobre LUA, pasamos a la primera clase de programación:
 
VARIABLES:
 

Variable es una palabra que almacena un valor, me explico:
Yo puedo crear la variable texto y almacenar dentro de ella el valor "esto es un texto". Y acudir a ella en cualquier parte del código.
Ejemplo (LUA): 
local texto = "esto es un texto"print texto# El programa en este caso imprimiría en pantalla: esto es un texto

 
Como pudieron ver ya vimos algo de LUA que deben saber: las variables hay que presentarlas con el prefijo local y el nombre de la variable, como en el ejemplo.
Vale cualquier nombre pero no pueden poner espacios ni caracteres especiales como acentos, eñes, arrobas, asteristos etc... Para representar los espacios pueden usar barra baja: get_level
 
TIPOS DE VARIABLES:
Se pueden distinguir varios tipos de variables: string (texto), int (numero sin comas[ 1 ]), float (numero con comas [ 1,54 ]), boolean (verdadero o falso [ true - false ])
Para las quest en LUA solo nos servirán estas.
 
STRING: Tiene que ir entre "", por ejemplo "texto".
NUMERICO, FLOAT O INT: Simplemente el número.
BOOLEAN: Solo true o false ¡ En minusculas sin "" !
 
Los tipos de variable son importantísimos ya que si no sabemos que tipo de variable nos devuelve una función, no sabremos con que podemos compararlo, ya que como es obvio no podemos preguntarlos si 1 es mayor que a...
 
Con las variables numéricas se pueden realizar operaciones matematicas, veremos las más simples por ahora:
SUMA: +
RESTA: -
MULTIPLICAR: *
DIVIDIR: /
 

local num = 5 print num + 4   # Esto seria igual a 9print num - 3   # Esto seria igual a 2print num * 5  # Esto seria igual a 25print num / 5  # Esto seria igual a 1
Por supuesto disponemos de potencias, raices, logaritmos etc... pero no creo que quieran resolver nada parecido en Metin2. De todas formas todo esta en Google.

 

 

 
Lo segundo más importante que hay que saber en programación son las sentencias if y los bucles.
 

La sentencia if que en español seria si: si a es igual 1 haz esto.
En LUA el if tiene tres palabras: if, then y end
 
if [lo que comparamos] then
       [lo que ocurre si es cierta la comparación]
end
 
Hace una comparación de una variable con otra o con un valor.
Para comparar en los if o bucles usaremos lo siguiente:
IGUAL A: ==
DISTINTO A: !=
MAYOR QUE: >
MENOR QUE: <
MAYOR O IGUAL A: >=
MENOR O IGUAL A: <=
 
EJEMPLOS:

local texto = "texto corto"local numero = 1if numero == 1 then      print textoend# Incluso dentro del propio if podemos hacer una operacion basica:if numero+5 == 6 then      print textoend
 
Los if pueden hacer mas de una comparación usando: else o elseif
Else seria completamente lo contrario a lo que el if esta comparando, suene un poco raro lo explicare con un ejemplo: (IMAGINEMOS QUE LA X PUEDE SER CUALQUIER NÚMERO)
 

local numero = Xif numero == 1 then    print "la x es un 1"else #Aqui se ve como el else es como si fuere un if numero != 1    print "la x no es un 1"end # VAMOS A USAR elseif:if numero == 1 then    print "la x es un 1"elseif numero == 2 then  #Podemos ver como el elseif es como un if completamente distinto, se usa para ahorrar codigo.    print "la x es un 2"end
 
No recomiendo usar un else despues de un elseif, podría dar fallos en la ejecución pero cuando tengan practica sabrán en que momentos pueden usar este tipo de combinación.
 
Tambien pueden hacer mas de una comparación junta en el mismo if o hacer comparaciones distintas. 
Esto se hace gracias al and y al or
 
Por ejemplo:
 

local nombre1 = Alvarolocal nombre2 = Royolocal edad1 = 1local edad2 = 3if nombre1 == "Alvaro" and edad1 == 1 then   print nombre1.." tiene "..edad1.." años"elseif nombre1 == "Alvaro" and edad2 == 2 then   print nombre1.." tiene "..edad2.." años"elseif nombre2 == "Royo" and edad1 == 1 or nombre1 == "Alvaro" and edad2 == 3 then   print "Aqui podemos ver como hace las dos comparaciones, y si una de ellas es correcta continua, en este caso las dos son correctas."end
 
 
Creo que podemos pasar ya a los bucles. Hay dos tipos de bucles: FOR y WHILE.
Si no os enterais bien de como usar los bucles o alguna vez tienen alguna duda sobre ellos, en ningún momento los usen. Ya que imaginen que pueden hacer un bucle infinito y el servidor se apagará.
No es para meter miedo, si se usan bien son muy prácticos.
 
Empezaremos por FOR que es un poco mas complicado:
Personalmente no me gusta la forma de los FOR en LUA, prefiero JAVA.
ESTRUCTURA DEL FOR:
for [variable], [max], [incremento] do
end
variable: ya sabeis lo que es.
max: el valor maximo que alcanza la variable.
incremento: cuanto se le suma a la variable a cada vuelta.
 
(El for solo vale para valores numeridos INT (enteros) no FLOAT ni TEXTO)
Imaginar que el for es un parón en el codigo. el for se repite tantas veces como lo que tarde la variable en alcanzar el valor maximo con la suma del incremento xD (Ahora entendeis por que os dije que si no os enterais... xDDD perdón pero no se hacerlo mejor, voy a poner unos ejemplos)
 
EJEMPLO DE FOR:

for local i = 0, 5, 1 do   print "La variable y ahora vale:"..i # eso de ..i lo explico inmediatamenteend#RESULTADO DEL PROGRAMA:# La variable y ahora vale: 1# La variable y ahora vale: 2# La variable y ahora vale: 3# La variable y ahora vale: 4# La variable y ahora vale: 5
Explicación del ..i :cuando tienes un texto y quieres que en el salga el valor de una variable tienes que hacerlo asi: "esto es un texto y mi variable vale: "..variable
pero tambien puedes seguir escribiendo: "esto es un texto y mi variable vale: "..variable.." sigo con el texto"
Espero que haya quedado solucionada la duda de algunos.
 
Como podeis observar el for es como una rueda, toma de valor inicial en este caso el 0 y le va sumando 1 hasta llegar a 5. Cuando llega a 5 se para.
Estos for por ejemplo a mi (que hago APP para Android y trabajo en una empresa conocidisima por todos) me sirven muchisimo a la hora de crear aplicaciones interactivas con el usuario. 
 
Ahora es el turno del WHILE:
Es muy facil de entender, simplemente hay que traducirlo al español: while = mientras.
-- Mientras 1 sea igual a 1 haz esto. 
ESTRUCTURA DEL WHILE: 
while [comparación] do
[lo que hace mientras la comparación sea cierta]
end
 
UN EJEMPLO PELIGROSO (ESTO ES UN BUCLE INFINITO):

while 1 == 1 do   print "BUM"end#RESULTADO DEL PROGRAMA:# infinitos BUM hasta que aguante el procesador. normalmente el ordenador finaliza este tipo de # bucles antes de llegar al colapso. De hecho que su server se apage cuando detecta uno de estos# es buena señal. si no se apagara se quemaria el procesador.
 
Un ejemplo un poco menos lesivo de while es este:
 
local numero = 10while numero < 20 do     numero + 1end# RESULTADO DEL PROGRAMA:# El while se repitiria tantas veces como tarde el 10 en convertirse en 20, no es un bucle infinito ya que# dentro del while hemos puesto que cada vez que se repita sume 1 al 10 asi que si sois buenos en mates# xD podreis ver como el while se repetiria 10 veces.
 

 
Arrays, te hacen la vida mas cómoda:
 

 

 

Los arrays son muy comodos y en LUA son muy facil de acceder. Vamos a ver ya como es la estructura de un Array, no es mas que una variable con varios valores:
Hay dos tipos de Array:
 

#TIPO DE ARRAY 1 (Sencillo):local nombre = {valor1,valor2}# os preguntareis: ¿ como sacamos solo un valor del array? ahí va la respuesta:nombre[1] # Esto seria igual a: valor1nombre[2] # Esto seria igual a: valor2
_________________________________________________________________________
 

#TIPO DE ARRAY 2 (menos sencillo):local nombre = {{valor1,valor2},{valor3,valor4}}# Uff... esto es mas complicado que el otro, ¿comos se hace?nombre[1][1] # Esto es igual a: valor1nombre[1][2] # Esto es igual a: valor2nombre[2][1] # Esto es igual a: valor3nombre[2][2] # Esto es igual a: valor4
 
Parecia mas dificil de lo que en verdad es... pero mirad algo ahora vamos a hacer una fusión de conocimientos para que veais mas o menos para que vale cada cosa:
 

local array = {{1,2},{"DeuS","Gero"}}for local i = 0, 2, 1 do   print "Nombre: "..array[2][i].." ID: "..array[1][i]end# RESULTADO DEL PROGRAMA:# Nombre: DeuS ID: 1# Nombre: Gero ID: 2# ANALISIS DEL PROGRAMA: vamos a olvidar el for y centremonos en el ARRAY. ¿ como llegamos al primer# resultado? como hemos visto antes seria asi: "Nombre: "..array[2][1].." ID: "..array[1][1]# ¿que es lo que hace el for? simplemente ahorrar codigo y trabajo. Como ya sabemos la variable i # incrementa su valor gracias al for por tanto en su primer incremento valdra 0+1 y en su segundo # incremento 0+1+1 por tanto en la primera vuelta del for nos quedaria esto: array[1][1] y array[2][1]# y en la segunda vuelta: array[1][2] y array[2][2] (como podeis observar sustituimos la i por su valor en)# cada vuelta del for.
 
Como pueden ver podemos poner tantos {} en un array como necesitemos, podria poner un ejemplo con mas pero simplemente seria igual pero con un [] en el resultado:
local arrayfinal ={  {    {1,2},{3,4}  }  {    {"pedro","juan"},{"marta","belen"}  }}# queda lioso pero es igual solo que para acceder seria asi:arrayfinal[1][1][1]  # 1arrayfinal[1][1][2]  # 2arrayfinal[1][2][1]  # 3arrayfinal[1][2][2]  # 4arrayfinal[2][1][1]  # pedroarrayfinal[2][1][2]  # juanarrayfinal[2][2][1]  # martaarrayfinal[2][2][2]  # belen
 

 
Funciones en LUA:
 

 

 

Una función sirve para hacer la vida mucho mas fácil al programador ademas tiene muchísimas características, tantas como uno quiera darle.
Normalmente se usan para realizar una función que va a ser igual en muchas partes del código del programa, por lo que solo hay que llamar a la función en dichas partes para que lo que hay en el interior de la función se realice en el programa.
 
ESTRUCTURA:
function [nombre de la función]()
[contenido]
(return o no)
end
 
#################
COMO USAR LAS FUNCIONES PARA LAS QUEST EN METIN2:
Bien, para usar una función en una quest en metin antes de llamarla deben poner el nombre que pusieron en:

quest xxxxxxxxx begin
 
Un ejemplo mejor: 
##EN EL EJEMPLO SOLO FIJENSE EN COMO SE LLAMA A LA FUNCIÓN.

quest caballostatus begin   state start begin      function muerto(caballomuerto) # Aun no hemos visto que es lo de dentro del parentesis          if caballomuerto == 1 then              return "su caballo murio"          else              return "su caballo aun vive"          end      end       when login begin            locale caballomuerto = pc.horse_status()            ###############################            #A CONTINUACION LLAMAMOS A LA FUNCIÓN#            ###############################            say(caballostatus.muerto(caballomuerto))                #nombrequest.funcion()      end   endend
#################
Podemos diferenciar las funciones en con return o sin return.
El return es lo que la función devuelve despues de hacer una comprobación. por ejemplo:
 

#Imaginemos que el valor x lo elige el usuario:locale nombre = xfunction nombres()   if nombre < 1 then # del 0 para abajo      return "anacleto"   elseif nombre > 10 then # del 11 para arriba      return "rutherfio"   elseif nombre >= 1 and <= 10 then # entre el 1 y el 10 incluidos      return "Álvaro"   endendprint "El nombre elegido es: "..nombres() # Como podemos ver aqui nombres() será el valor del return
 
Bueno hasta aqui los códigos cortos. Ahora para demostrar las siguientes cuestiones necesitaré realizar códigos mas largos, espero que los entiendan.
 
Ya hemos visto un poco por encima como es un return, puede devolver valores en texto, numericos y booleanos.
Ahora vamos a ver las funciones sin return:
La caracteristica principal de una función sin return tambien es ahorrar código pero solo se hacen para cuando vas a repetir lo que va dentro de la función muchas veces en el código:
EJEMPLO:
 

quest ejemplo begin   state start begin      function textoquest()         say("Esto lo vamos a repetir varias veces en la quest")         say("por tanto lo usare en la función sin return.")      end      when login begin         ejemplo.textoquest()         # Aqui cuando se cumpla el when saldrá el texto que pusimos en la función.      end   endend
 
Ahora veamos las funciones con llamada. La llamada es una variable que la función necesita para realizar las comprobaciones y se la vamos a enviar desde el código. Las variables se ponen dentro del parentesis de la función. Puede poner tantas variables como necesite la función.
EJEMPLO:
 

quest ejemplo begin   state start begin      function llamada(variable1, variable2)         if variable1 == 2 then            say("Buenos dias")         elseif variable1 == variable2 then            say("Buenas noches")         elseif variable1 != variable2 or variable1 < 1 then            say("Buenas tardes")         end      end      when login begin         locale variable1 = 2         locale variable2 = 1         ejemplo.llamada(variable1, variable2)      end   endend
 
No quiero liaros mucho pero las variables que se envian desde el codigo no tienen porque tener el mismo nombre que las que se usan en la función pero si tienen que llevar la misma posición:
 

function llamada(variable1, variable2) #[Contenido de la función]endwhen login begin locale cont = 3 locale nam = 5 ejemplo.llamada(cont, nam) # Siendo cont variable1 y nam variable2end
 
Arrays en funciones:
Los arrays en funciones solo se pueden usar con las de return, vamos directos al ejemplo:
Doy por supuesto que ya sabeis como funciona un array, esta explicado anteriormente.
 
query ejemplo begin   state start begin      function arrays()         locale array = {1,2}         return array      end      when login begin         ejemplo.arrays()[1] # Devolveria el valor 1         ejemplo.arrays()[2] # Devolveria el valor 2      end   endend
 

 
Bueno con esto ya os podeis defender un poco a la hora de hacer las quests, espero que os sirva de ayuda. Si veis que no se entiende algo y lo veis muy lioso pueden preguntarme por aquí.
No soy mucho de reputación ni cosas de esas me dan un poco igual pero si veis que os ha servido por lo menos poner un comentario dando las gracias :wiii:
[DeuS]
Link to comment
Share on other sites

No es locale, sino local.

Además, los comentarios en lua se hacen con -- y no con #, como en python.

 

El símbolo # a partir de lua 5.1 funciona como la funcion table.getn, y esta, deja de existir.

 

Y de bucles te falta el repeat.

local var, i = 0, 80repeat  print(var)  var = var+1until var == i
Link to comment
Share on other sites

 

No es locale, sino local.

Además, los comentarios en lua se hacen con -- y no con #, como en python.

 

El símbolo # a partir de lua 5.1 funciona como la funcion table.getn, y esta, deja de existir.

 

Y de bucles te falta el repeat.

local var, i = 0, 80repeat  print(var)  var = var+1until var == i

Perdón es verdad es local. Lo de la # para comentario es para que sala en color comentario ya que el lenguaje que usa el foro para poner los scripts es php y en php se pone #para comentarios. Luego cambio lo de locale =)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...