Lección 1: Creando una poción de experiencia.

   Lección 1: Creando una poción de experiencia.

Habiendo completado la introducción básica vamos a empezar a hacer cosas un poquito más divertidas y relacionadas directamente al juego, para esto vamos a usar la versión 13.0 de AO, pueden descargarla del siguiente link: Argentum Online 13.0, comencemos:

Para poder crear una poción nueva lo primero que tenemos que hacer es ir al archivo Obj.dat que se encuentra en la carpeta Servidor/Dat/, vamos a modificar el valor máximo de objetos:

Luego vamos a buscar una poción existente para usarla como base:


Name es el nombre con el que veremos a nuestro nuevo objeto en el juego, GrhIndex es la referencia al aspecto visual que tendrá, ObjType es el tipo de objeto (este permanecerá igual, sigue siendo una poción al fin y al cabo), Agarrable es bastante anti-intuitivo porque 0 significa que si es agarrable, mientras que 1 significa que no, como regla general el 0 se usa para el caso mas probable y 1 para el mas improbable, no 0 para el negativo y 1 para el positivo como uno pensaría naturalmente, TipoPoción es básicamente un subtipo de objeto, es decir, el objeto es de tipo 11 (poción) y es una poción de tipo (todavía no sabemos) nro X que se va a referir a las pociones de experiencia, MaxModificador y MinModificador es cuanto va a influir la poción al utilizarla, Valor es cuanto va a valer en el comerciante con 0 skills en comercio y Crucial se refiere a si el objeto vuelve a aparecer en el comerciante al acabarse o no, siendo 1 que si y 0 que no, la poción roja por supuesto, reaparece si alguien las compra todas.

Nuestro nuevo objeto se va a ver así:











Existían 6 tipos de poción, por lo que la nuestra va a ser la 7ma.
5 y 15 van a ser modificadores porcentuales.
GrhIndex 23651 es el siguiente número libre en la lista de Grhs, pero...

¿Cómo se agrega un GRH?

Lo primero que vamos a necesitar es una herramienta para descomprimir los archivos .IND, por ejemplo el DIU, una vez descomprimidos vamos a abrirlo y nos vamos a encontrar con algo como:






















Si, a primera instancia parece un quilombo, pero que no cunda el pánico, lo que tenemos que hacer hoy es muy simple, vamos a aumentar en uno el número de grhs desde la parte superior, debajo de "INIT", donde dice "NumGrh=", antes decía 23650, yo lo aumenté a 23651 para agregar esta linea al final del archivo:
























Acá lo que hicimos fue agregar el Grh 23651, una nueva referencia gráfica para nuestro juego, básicamente indica que nro de gráfico contiene la referencia que necesitamos, desde donde se lee y cuanto, literalmente en ese orden.
Grh(Nro)=(Cantidad de frames)-(Nro de imagen .bmp)-(Desde donde se lee en x)-(Desde donde se lee en y)-(Cuanto se lee en x)-(Cuanto se lee en y)
Luego del nro de grh nuestros datos son: 1 frame, ya que no es una animación si no una imagen estática para el inventario, tomamos el recurso gráfico desde el archivo 30000.bmp, empezamos a leerlo en el pixel 0,0, lo leemos 32 pixeles a lo ancho y 32 pixeles a lo largo.
Para concluir, tenemos que volver a comprimir nuestro archivo descomprimido, a este proceso se le suele llamar "Indexar" y "Desindexar" las referencias gráficas o Grhs.

Ahora tenemos que agregar nuestra imagen al archivo Grafics.AO, para eso vamos a usar un Compresor / descompresor de recursos, una vez que descomprimimos, agregamos el archivo a la carpeta y volvemos a comprimir.

En mi caso cree este gráfico a partir de la poción roja usando Paint:




Le puse como nro de gráfico 30000, el nro al que hago referencia en el Grh.
Ahora que ya tengo mi archivo .DAT, .IND y .AO, ya tengo todos los recursos que necesito para programar mi nueva poción y su función mecánica.

En el procedimiento "UseInvItem" hay un select case basado en el tipo de objeto que estamos usando, este procedimiento se corre en el servidor cuando un usuario hace doble click o presiona U en el inventario, dentro del select case del tipo de objeto hay un caso específico para el tipo de objeto pociones y dentro de este hay otro select case en el que se especifica que ordenes ejecutar según el tipo de poción, aquí un fragmento:

Como podemos ver, el último caso escrito es el de la poción negra, el caso 6, donde se corren unos pocos llamados que alcanzan para generar el efecto deseado, nosotros vamos a agregar otro caso, el 7mo, correspondiente a nuestro tipo de poción nueva, dentro del case vamos a especificar su mecánica, la cual debería aumentar la experiencia porcentualmente según el modificador mínimo y máximo que pusimos, luego comprobar si la experiencia actual del usuario es suficiente para pasar de nivel, y por supuesto, quitarle el objeto del inventario, acompañando con un mensaje de consola que explique lo sucedido, esto se hace con realmente muy pocas lineas, vamos a eso:


Case 7 es el caso de nuestro nuevo tipo de poción, lo que está en verde a continuación es un comentario, es decir, una linea escrita que no se ejecutará como instrucción.
Debajo tenemos un llamado al procedimiento QuitarUserInvItem, que lleva 3 parametros de entrada, el índice de usuario (Si, esto es nuevo, en la próxima entrega vamos a hablar del tema), el slot sobre el que el usuario clickió o presionó U, y la cantidad que vamos a quitarle, en este caso 1.
Debajo vemos que asigné a la experiencia del usuario (.stats.exp) algo más de experiencia, es decir, la que tenía + lo que necesita para pasar de nivel dividido cien multiplicado por un número al azar entre el modificador mínimo y el máximo, básicamente, un porcentaje al azar.
En la siguiente linea se llama haciendo uso de la palabra reservada "Call" al subprocedimiento CheckUserLevel el cual se encarga de corroborar si el usuario tiene suficiente experiencia para subir de nivel y en caso de tenerla, aumenta sus estadísticas y actualiza al cliente con los datos nuevos, ya vamos a hablar de cliente y servidor, no se preocupen, básicamente el cliente es una mera pantalla mientras que el servidor es donde realmente transcurre el juego, si no se avisara al cliente de los cambios, podría subir de nivel y nunca enterarse.
Por último tenemos un llamado a WriteConsoleMsg, el cual lleva 3 parametros de entrada, el índice de usuario, el mensaje que se mostrará en consola y la fuente que se utilizará para mostrar el mensaje, todos los parametros se separan con comas (",") en vb6.

Con esto concluimos nuestra "Poción de experiencia", que nos dará entre 5% y 15% de la experiencia que necesitamos para subir de nivel.

¡Inténtenlo!

Agradecimientos:
El proyecto de base 13.0 y todas las herramientas facilitadas en este artículo fueron publicadas en gs-zone por Jonathan Helc "Hide", agradecemos infinitamente su contribución a lo largo de los años y su dedicación para con la comunidad.



Comentarios

Entradas populares de este blog

Introducción a la programación en Argentum Online parte 1

Introducción a la programación en Argentum Online parte 2