Jump to content

Capítulo VIII - Las tablas, amigas o enemigas?


KeKo

Recommended Posts

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.

Link to comment
Share on other sites

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])
Link to comment
Share on other sites

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

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

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

  • Dilong locked this topic
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

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