goldware Posted April 21, 2014 Report Share Posted April 21, 2014 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] WeedCalifa, Rinnegan, oscar caballero and 7 others 9 1 Quote Link to comment Share on other sites More sharing options...
PACI Posted April 21, 2014 Report Share Posted April 21, 2014 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 Jeo 1 Quote Link to comment Share on other sites More sharing options...
LovePlay Posted April 21, 2014 Report Share Posted April 21, 2014 Muchas gracias por la guia :D (Y) Quote Link to comment Share on other sites More sharing options...
Jeo Posted April 21, 2014 Report Share Posted April 21, 2014 Buena guia, me gusta que no sea tan orientada a metin2 Quote Link to comment Share on other sites More sharing options...
goldware Posted April 21, 2014 Author Report Share Posted April 21, 2014 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 =) Rinnegan 1 Quote Link to comment Share on other sites More sharing options...
WeedCalifa Posted April 22, 2014 Report Share Posted April 22, 2014 Mi primer +1 para ti, gracias por la explicación me resolvieron dudas goldware 1 Quote Link to comment Share on other sites More sharing options...
Yori Posted April 22, 2014 Report Share Posted April 22, 2014 buena guia, que pena no haber tenido una de estas cuando empecé. para los que quieran mas detalles sobre lua pueden ver su documentacion oficial por aqui (En español) Debes iniciar sesión para ver el contenido del enlace en esta publicación. Saludos goldware, Danher Epic Random, jose osses and 2 others 5 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.