KeKo Posted June 15, 2013 Report Share Posted June 15, 2013 Buenas zoneros, hoy que me encuentro especialmente trabajador (es decir, que no me apetece estudiar) voy a publicar una nueva entrega del curso de creación de quests de metin2zone. Esta nueva guía se la dedico a mi amigo raul, que siempre me habia dicho que debería aprender esto :trollface: y que era una de las guias que teniamos planeadas cuando configuramos el curso por primera vez pero que no se llego a llevar a cabo. Como veis la he titulado: amigas o enemigas? es para que os deis cuenta de que como programadores que somos los que nos especializamos en lua es importante reducir el código lo máximo posible por diferentes razones: ocupa menos, es menos texto para la vista, queda mas guay, etc y tu quest seguirá haciendo lo mismo que antes pero con menos código. 1 - Tablas: Bueno, antes de nada vamos a crear nuestra tabla o array sencillo: local keko = {10,20,34,43,57} Como veis, a diferencia de los selects a los que estáis acostumbrados los elementos de la tabla estan dentro de { } --------------------------------------------------------------------------------------------------------------------------- Ojo:Los elementos deben estar separados por comas, y el último de ellos NO debe llevar la coma. --------------------------------------------------------------------------------------------------------------------------- Bueno, ahora que tenemos una mini tabla vamos a llamar a los diferentes elementos de la misma. La sintaxis es la siguiente: nombre[posicion] keko[1] -- 10 keko[2] -- 20 keko[3] -- 34 keko[4] -- 43 keko[5] -- 57 Como veis escribimos el nombre del local y luego entre [ ] ponemos la posicion del elemento que queramos seleccionar dentro del array. Asi que ahora ya podeis meter vuestras tablas en la quest del siguiente modo: local items = {160,161,162,163} pc.give_item2(items[1]) -- te dara el 160 pc.give_item2(items[2]) -- te dara el 161 pc.give_item2(items[3]) -- etc pc.give_item2(items[4]) -- etc De todos modos en ese ejemplo un for lo haría mucho mas sencillo, aunque ya os explicare mas a fondo como se usa local items = {160,161,162,163} for i=1, table.getn(items) do -- en la i ponemos igual a 1 y luego la cantidad de veces que se repita pc.give_item2(items[i]) -- te dara cada uno de los items que haya en la tabla end -- cada for le corresponde un end 2 - Arrays con subcategorías: Bueno, hemos visto una tabla sencillita, vamos a complicar un poco la cosa: local cordes = { {12500,13400}, {12400,18900}, {19800,12300} } Ahora tenemos una tabla con diferentes apartados dentro della. Vamos a ver como sería la sintaxis en este caso: nombre[subcategoria][posicion] cordes[1][1] -- 12500 cordes[1][2] -- 13400 cordes[2][1] -- 12400 cordes[2][2] -- 18900 cordes[3][1] -- 19800 cordes[3][2] -- 12300 ----------------------------------------------------------------------------------------------------- Ojo:Las subcategorias deben estar separadas por comas, y la ultima NO la lleva ----------------------------------------------------------------------------------------------------- Como veis, de nuevo escribimos el nombre, luego pondremos un primer [ ] con la subcategoría, que es el número de arrays simples dentro del array compuesto: local nombre = { -- abres la tabla {} -- subcategoria 1 {} -- subcategoria 2 {} -- subcategoria 3 } -- cierras la tabla En el segundo [ ] va la posicion del elemento como habiamos hecho con el array simple local cordes = { {12500,13400,17500,14000}, {12400,18900,13200} } cordes[1][4] -- 14000 cordes[2][2] -- 18900 Veamoslo en una quest: local cordes = { {12500,13400}, {12400,18900}, {19800,12300} } pc.warp(cordes[1][1],cordes[1][2]) -- 12500, 13400 3. Arrays + funciones + selects = locura? Bien, hasta ahora solo hemos visto ejemplos sin llegar a hacer una quest en condiciones. Lo más habitual usando arrays es combinarlos con un local = select del siguiente modo say("Que arma quieres") say("") local items = {160,161,162} local arma = select ("Ninfa +0" , "Ninfa +1" , "Ninfa +2" , "Cerrar") if arma == table.getn(items)+1 then return end pc.give_item2(items[arma],1) De este modo, segun lo que eligamos en el select, nos asignara uno de los elementos del array, si pinchamos en Ninfa +0 el juego enviara al array la orden de mostrar el elemento de posicion 1, si pinchas en Ninfa +1 te enviará la de posicion 2 y así sucesivamente. Por lo tanto, al meter el resultado del select en el array pc.give_item2(items[arma],1) Te dara la que hayas seleccionado, y así te evitarás tener que poner tres if y solo pondras 1 Ahora con un array doble: say("Que arma quieres") say("") local items = { {160,2}, {161,1}, {162,3} } local arma = select ("Ninfa +0" , "Ninfa +1" , "Ninfa +2" , "Cerrar") if arma == table.getn(items)+1 then return end pc.give_item2(items[arma][1],items[arma][2]) Tal y como está ahora, cogera la subcategoría del select, y una vez la tenga te dara lo que tengas en la posicion 1 y en la cantidad pondra lo que tengas en la posicion 2. De este modo, aunque las cantidades del item sean diferentes podrás hacerlo con un solo if. Y por último vamos a meterle mas complicacion, una funcion dentro del array! say("Te voi a dar un arma aleatoria") say("") local items = { {160,2}, {161,1}, {162,3} } local arma = select ("OK" , "Cerrar") if arma == 2 then return end pc.give_item2(items[math.random(1,table.getn(items))][1],items[math.random(1,table.getn(items))][2]) Bien, ahora en este caaso el juego nos va a dar un arma aleatoria, porque hemos incluido la funcion math.random dentro del array. Tal y como la hemos puesto: [math.random(1,table.getn(items))] Nos dara un resultado que puede estar entre 1 y el numero de subcategorias que tiene la tabla items. ----------------------------------------------------------------------------------------------------------------------------------------------------------------- (table.getn(nombretabla)) es una función muy útil que devuelve el número maximo de elementos que tiene una tabla simple o de subcategorias de una compuesta) ----------------------------------------------------------------------------------------------------------------------------------------------------------------- Por lo tanto tal y como esta configurada la quest buscara primero la subcategoría, que sera el número aleatorio, y después irá a la posicion dentro de ella que le hemos dicho (1 para la id y 2 para la cantidad) 4 - KeKo, no lo hemos entendido!!!! Bueno vale, os pondré otro ejemplo: say("A donde quieres ir?") sa("") local sitio = select ("Mapa1" , "Mapa2", "Mapa3" , "Cerrar") local cordes = { {cordx,cordy}, {cordx,cordy}, {cordx,cordy} } if sitio == table.getn(cordes)+1 then return end pc.warp(cordes[sitio][1],cordes[sitio][2]) 5 - Subcategorías numeradas Vamos a probar otra cosa: y si metemos un numero determinado para cada subcategoría en vez de 1,2,3,etc? local prueba = { [100] = {10,11}, [1001] = {12,13}, [134] = {14,15} } Veamos la sintaxis de esto: chat(prueba[100][1]) -- 10 chat(prueba[1001][2] -- 13 De nuevo debemos hacer referencia primero a la subcategoria y luego a la posicion detro de la misma. Y para que nos sirve esto? Tiene un monton de aplicaciones pero una muy típica es igualar la numeración de la subcategoría a una funcion: when 45000.use or 45001.use or 45002.use begin local premios = { [45000] = {30,31}, [45001] = {32,33}, [45002] = {34,35} } chat(premios[item.get_vnum()][1]) -- si tu item es 45000 esto es 30 chat(premios[item.get_vnum()][2]) -- si tu item es 45002 esto es 34 end De este modo la subcategoría la reconoce el juego segun el item que hayas usado. Y bueno chicos, eso sería todo. Todavía me quedaría muchísimo de explicar sobre el uso de las tablas, pero el hecho de que no tengo demasiado tiempo y de que mis conocimientos de las mismas no son tan amplios como los de Noa (y muchos otros xd) lo dejaré aqui en esta entrega del curso de quests. Espero que os sea útil. fuuton97, Croqueta, Jfirewall and 1 other 4 Link to comment Share on other sites More sharing options...
LORDCarlo™ Posted June 15, 2013 Report Share Posted June 15, 2013 Muy buena tio!! Oie este lenguaje se basa en python no??? Link to comment Share on other sites More sharing options...
KeKo Posted June 15, 2013 Author Report Share Posted June 15, 2013 Muy buena tio!! Oie este lenguaje se basa en python no??? Ese lenguaje se llama lua Link to comment Share on other sites More sharing options...
LORDCarlo™ Posted June 15, 2013 Report Share Posted June 15, 2013 Aaaaa tio yo pensaba que era basado en python pero bueno muchas gracias por la guia!!!! Link to comment Share on other sites More sharing options...
Melany Posted June 15, 2013 Report Share Posted June 15, 2013 yo solo se pseudocodigo Link to comment Share on other sites More sharing options...
Rafa23Alzira Posted June 16, 2013 Report Share Posted June 16, 2013 Muy buena KeKo, como siempre todo es practicar, estaría bien que os ayudara Noa, pero veo que a veces tiene problemas con el Español, Gracias Link to comment Share on other sites More sharing options...
PACI Posted June 16, 2013 Report Share Posted June 16, 2013 Aqui te falta un ), si no me equivoco KeKo. pc.give_item2(items[math.random(1,table.getn(items)][1],items[math.random(1,table.getn(items))][2]) Supongo que seria así: pc.give_item2(items[math.random(1,table.getn(items))][1],items[math.random(1,table.getn(items))][2]) Rafa23Alzira 1 Link to comment Share on other sites More sharing options...
KeKo Posted June 17, 2013 Author Report Share Posted June 17, 2013 Aqui te falta un ), si no me equivoco KeKo. pc.give_item2(items[math.random(1,table.getn(items)][1],items[math.random(1,table.getn(items))][2]) Supongo que seria así: pc.give_item2(items[math.random(1,table.getn(items))][1],items[math.random(1,table.getn(items))][2]) Um sep se me colo el ) las prisas son malas compañeras perdonad Link to comment Share on other sites More sharing options...
EzekielitohMercury Posted June 17, 2013 Report Share Posted June 17, 2013 Gracias keko buen aporte ;D NataliMontoya 1 Link to comment Share on other sites More sharing options...
Croqueta Posted June 19, 2013 Report Share Posted June 19, 2013 keko no lo entiendo por q en la parte esta 2 - Arrays con subcategorías: cordes[4][2] es -> 12300 ami me da nil por q son solo 3 tablas en esta parte 4 - KeKo, no lo hemos entendido!!!! local sitio = select ("Mapa1" , "Mapa2", "Mapa3" , "Cerrar") sito es un select no una tabla por eso me pregunto por q usas esto if sitio == table.getn(sitio)+1 then return end table.getn(tala) esta funcion cuenta las cosas en la tabla por ejemplo a={4,5,6,13,5} print(table.getn(a))-->5 del select debe de ser nil por q el sitio no es una tabla perdona por corregirte pero es mejor saver los errores y no aserlo muchas veses, por q con una script complicada puede ser ese error mui grave Link to comment Share on other sites More sharing options...
KeKo Posted June 19, 2013 Author Report Share Posted June 19, 2013 keko no lo entiendo por q en la parte esta 2 - Arrays con subcategorías: cordes[4][2] es -> 12300 ami me da nil por q son solo 3 tablas en esta parte 4 - KeKo, no lo hemos entendido!!!! local sitio = select ("Mapa1" , "Mapa2", "Mapa3" , "Cerrar") sito es un select no una tabla por eso me pregunto por q usas esto if sitio == table.getn(sitio)+1 then return end table.getn(tala) esta funcion cuenta las cosas en la tabla por ejemplo a={4,5,6,13,5} print(table.getn(a))-->5 del select debe de ser nil por q el sitio no es una tabla perdona por corregirte pero es mejor saver los errores y no aserlo muchas veses, por q con una script complicada puede ser ese error mui grave Pos en el primer caso era un 3, me equivoque al escribirlo [3][2] En el segundo caso también me equivoqué, era table.getn(cordes) no (sitio). Link to comment Share on other sites More sharing options...
Recommended Posts