MMORPG DB: Objetos

Juan Mellado, 9 Agosto, 2008 - 09:06

La gestión de objetos es un tema que ya ha aparecido anteriormente, ya sea de una forma auxiliar, como objetivos o recompensas de misiones por ejemplo, o de una forma totalmente destacada, como cuando se trató el tema de los contenedores (bolsas). Por si solos constituyen una entidad bastante importante dentro de lo que sería un diseño de juego clásico, aunque en la práctica resultan sencillos de modelar con una base de datos relacional.

La idea fundamental es que debe existir una tabla con todas las clases de items posibles, y otra tabla con las instancias concretas que existen en el mundo del juego. Para los que tengan nociones de programación orientada a objetos esto debe de ser fácil de entender. El item es el "concepto" abstracto (como automóvil), y los objetos son las "instancias" concretas de ese concepto (como cada uno de los coches del mundo mundial).

La cantidad, tipo y naturaleza de cada atributo concreto que pueda llegar a tener la tabla de items dependerá enteramente del juego concreto que se esté diseñando. Lo más sencillo sería tratar de identificar el mayor número posible de ellos en las fases iniciales de diseño, e ir añadiendo columnas a la tabla para aquellos que tengan una naturaleza estática, y para los que no se prevean grandes cambios a priori. Para el resto de atributos que no se identifiquen claramente, o cuyos valores apliquen muy rara vez, o que sólo tengan sentido con un tipo muy concreto de objetos, tal vez la mejor solución sería la de crear tablas auxiliares, u optar por una estructura genérica de pares (tipo, valor) como ya se ha discutido muchas veces en esta serie.

Tal vez una buena forma de ver todo esto sea con un pequeño análisis de algunos atributos básicos que pueden distinguirse en los objetos de un juego real como el popular "World of Warcraft" (WoW).

Lo más evidente es el nombre de cada objeto, que en un principio iría en la tabla de items a través de una foreign key a la tabla de textos para el soporte multidioma. Y otro tanto ocurría con las descripciones, o cualquier otro tipo de texto asociado de forma única a cada item.

Otros atributos básicos que se añadirían como columnas de la tabla serían los "tipos", "categorías", "familias" o "grupos" a los que pertenece cada item. A grandes rasgos, en WoW los objetos están clasificados en función de aspectos tales como su utilidad (armadura, arma, munición, comida, ...), material (tela, cuero, malla, placa, ...), manejo (mano izquierda, mano derecha, ambas manos, ...), y así sucesivamente, aunque no todas esas clasificaciones tienen sentido para todas las clases de items existentes. Por ejemplo, un elixir no se maneja ni puede equiparse, solo consumirse, lo que varía de un elixir a otro es el efecto que provoca en quien lo consume o el tiempo que dura dicho efecto, aunque esto no resta el hecho de que también existan categorías propias dentro de la familia de elixires (batalla, defensa, ...). La forma más lógica de modelar toda esta vasta variedad de posibilidades sería crear tablas específicas para cada tipo, almacenando en ellas sus atributos concretos, con la idea de dejar el modelo lo más normalizado posible. La penitencia de esta solución posiblemente sea la de tener que realizar más accesos, al encontrarse la información distribuida por más tablas. Lo importante es recordar que esta información es de carácter estático, introducida durante el desarrollo del juego, que no cambiará durante la ejecución del mismo, y que por lo tanto, podría sacarse partido de estructuras básicas como las caches de objetos más frecuentemente utilizados.

El precio de un objeto también sería un atributo básico a guardar en una columna de la tabla de items. Aunque en WoW no se puede comerciar con todos los objetos, algunos no tienen un precio predeterminado, como por ejemplo los objetos únicos utilizados para la realización de algunas misiones. Algo que en la práctica podría simplemente indicarse guardando un valor de cero para ellos en la columna de precio. No obstante, en WoW también existen otras restricciones a la hora de comerciar con los objetos. Por ejemplo, existe el concepto de "ligamiento", de forma que los objetos ligados al espíritu de un personaje no pueden ser utilizados por otros personajes, lo que los hace inútiles a efectos de trueques o subastas por ejemplo, pero que no impide que puedan sean vendidos por dinero a los NPCs comerciantes del mundo virtual. Es decir, que sería necesaria una columna para indicar por cada item si puede ligarse y la forma en que se liga (no se liga, se liga al recogerlo, se liga al equiparlo, ...). Y de igual forma, sería necesaria una columna en la tabla de objetos para indicar para cada instancia concreta si se encuentra ligada o no.

Por su parte, la rareza de un objeto, un concepto que en WoW se utiliza para distinguir objetos difíciles de encontrar o que aportan algún tipo de ventaja significativa, sería igualmente una gran candidata a almacenarse en la propia tabla de items. Las ventajas que aporta cada objeto, en cambio, habría que mirarlas una a una. Si la ventaja que reporta es un incremento de estadísticas en uno o varios atributos concretos del personaje, entonces estos valores deberían almacenarse de igual forma que se hace para cada personaje. Esto es, si en la tabla de personajes hay una columna para cada atributo (fuerza, intelecto, poder, agilidad, espíritu, ..) entonces podrían añadirse esas mismas columnas en la tabla de items para facilitar su gestión. El riesgo que se correría con esta solución es que dichas columnas no tuvieran sentido para la gran mayoría de items, que para un porcentaje enorme de ellos siempre se almacenase un valor de cero, con el consiguiente desperdicio de almacenamiento. Si el tamaño es un problema, entonces se podría optar por crear una tabla auxiliar que sólo contuviera esas columnas, y que sólo contuviera registros para los items que aporten alguna ventaja de ese tipo. Un matiz importante al respecto que hay que tener en cuenta dentro del diseño de WoW, es que algunos objetos (instancias, no items) pueden ser mejorados por los propios personajes aplicándoles refuerzos o encantamientos. Debe ser claro que esas mejoras deben estar almacenadas en columnas de nuevas tablas relacionadas con las instancias en vez de con los items. Es decir, al crear una instancia se crearían los registros copiando los atributos del item tomado como patrón, y a partir de ahí ya se podrían cambiar los valores para cada objeto en particular.

Otra peculiaridad propia de WoW es que permite que los personajes creen objetos mediante el aprendizajes de profesiones y habilidades (sastrería, herrería, cocina, primeros auxilios, ...), y la combinación o refinamiento de la materia prima apropiada. Varios objetos se destruyen, borrando físicamente los registros asociados en la base de datos, para crear unos nuevos, insertando físicamente los registros correspondientes. Las recetas, diseños o patrones que indican el tipo y número de objetos necesarios podrían modelarse simplemente creando una tabla con una columna que hiciera referencia a un item y otra al número concreto de ellos que hace falta.

Un análisis más detallado de los objetos de WoW incluirían otros atributos básicos como el nivel mínimo que debe tener un personaje para utilizar o equipar un objeto, la durabilidad de las armas o armaduras, y así sucesivamente. Pero este análisis no resultaría de ninguna utilidad a menos que se quiera hacer un clon de WoW. Lo importante, a mi juicio, es entender que el diseño de la base de datos necesario para soportar items y objetos es algo que depende enteramente del juego que se quiera desarrollar.

¿No encontró lo que buscaba?

Utilice el buscador para encontrar más páginas en esta web o en toda Internet.
 
Web www.inmensia.com