MMORPG DB: Cuenta, Jugador, Personaje

Juan Mellado, 12 Abril, 2008 - 09:22

Aunque normalmente se utilice cualquiera de las tres palabras que aparecen en el título de este post para referirse a una misma cosa, sobre todo las dos primeras, en realidad son bastante distintas.

Cuenta es la entidad que se crea en el momento que una persona decide suscribirse a un juego, o a una serie de ellos, habitualmente a través de un portal web. La información característica asociada a ella la componen los datos de carácter personal que se suministran tradicionalmente en el momento de la apertura, como por ejemplo un dirección de correo o una contraseña. Si además el disfrute del juego requiere la realización de algún tipo de pago, entonces habría que añadir el nombre, dirección y algún tipo de información de tipo económico que permita realizar la facturación correspondiente.

Un detalle interesante acerca de las cuentas reside en el hecho de que nunca se utilizarán durante el desarrollo de una partida, a excepción quizás del login de usuario [otra palabra más para referirse a una misma cosa]. Cualquier tipo de consulta o proceso, como el cálculo de la facturación mensual por ejemplo, debería poder ejecutarse sin afectar al desarrollo del juego. Para conseguir este propósito quizás lo mejor sería mantener toda esta información es un esquema propio separado del que almacene el estado del mundo en juego. Esa separación podría ser incluso física, es decir, mantenerse en servidores distintos.

Jugador es una instancia de una cuenta que se utiliza en el momento que se accede a un juego. En un principio podría pensarse en tratar las cuentas y los jugadores como una misma cosa, pero mantenerla separadas tiene sus ventajas, como por ejemplo permitir varios juegos para una misma cuenta, e incluso varios jugadores para una misma cuenta. La información propia de un jugador sería la generada a partir del uso que haga de cada juego, como por ejemplo la fecha y dirección IP de su última conexión.

Lo importante entre cuenta y jugador es que se mantengan sincronizados de algún modo lógico, y en una base de datos relacional la mejor forma de conseguirlo es mediante el uso de foreign keys (claves foráneas). Es decir, el identificador de cuenta ha de arrastrarse al registro del jugador correspondiente. Naturalmente, si se opta por esquemas separados, entonces se complica un poco el mantenimiento de la integridad, pero se puede resolver fácilmente dando de alta al jugador en el momento de que se subscriba a cada juego. Los identificadores que identifican a cada registro de cada tabla no suelen cambiarse nunca, por lo que la integridad quedará garantizada a partir de ese momento. Los procesos de baja se realizan normalmente desactivando las cuentas, no borrándolas físicamente.

Personaje es cada uno de los avatares con los que cuenta un jugador. Es normal, y bastante deseable, que se puedan crear varios de ellos para poder disfrutar así del juego desde perspectivas distintas, aumentando además la vida útil del mismo. La información asociada a cada personaje es la que se selecciona en el momento de darlo de alta, como el nombre, sexo, raza, o clase a la que pertenece. El resto de atributos dependerá del tipo de juego y de las posibilidades que ofrezca este, como su ubicación actual, los puntos de salud, algún tipo de karma, el dinero disponible, los objetos del inventario, las zonas visitadas, o las misiones en curso o completadas, por ejemplo.

La gestión de personajes, y de hecho la gestión de cualquier entidad, puede hacerse con un diseño tremendamente abierto que permita asociarles cualquier tipo de atributo mediante el uso de tablas genéricas como "tipo de atributos", "atributos", "valores de atributos" y "relaciones entre valores de atributos y personajes". Las ventajas de este modelo es que permite añadir cualquier tipo de atributo a un personaje sin cambiar el modelo, pero presenta serios inconvenientes, como el hecho de que resulta difícil de gestionar, al quedar distribuida la información por muchos registros en vez de en uno sólo, como ocurre en un diseño más tradicional, donde hay una sola tabla y se van añadiendo columnas para cada atributo que se necesite.

¿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
yens (no verificado), 13 Abril, 2008 - 16:47

Lo que comentas al final daría para mucho... Pero yo evitaría caer en la trampa de tender hacia tablas más anchas en lugar de más tablas estrechas. Se me ocurren miles de ejemplos, pero imaginemos que tienes tu personaje, que varía su arma a empuñar... vas a añadirle una columna con el nombre de la espada, sus atributos, etc? Lo lógico sería añadir un simple id de arma y tener guardada en la tabla armas toda esa información, y acceder a ella mediante consulta no? No tengo ni warra sobre mmorpgs en cuanto a cómo se organizan, pero desde luego que en un diseño relacional sería una buena cagada, a noser que afecte notablemente al rendimiento el estar realizando consultas y subconsultas :P

Juan Mellado, 13 Abril, 2008 - 17:46

En el ejemplo que pones de la espada y tal, evidentemente es mejor poner una referencia con el ID. Bueno, no es que sea mejor, es que HAY que poner el ID. Creo que en eso deberiamos estar siempre todos de acuerdo.

El nombre de la espada y sus características tienen que ir en su propia tabla y aparecer una única vez en todo el modelo. Lo que habría que decidir más bien es: ¿en qué tabla? ¿Ponemos las espadas con el resto de objetos, como la comida, ropa o munición por ejemplo? ¿O creamos una tabla específica para las armas? ¿O creamos una tabla para todos los objetos, y otras auxiliares con especializaciones por cada tipo de objeto? Lo que planteaba ese párrafo que comentas era tener una tabla muy básica, como "objetos", y poner los atributos en otras tablas muy genéricas, de forma que todos tuvieran cabida sin tener que modificar el modelo cada vez.

De todas formas, "empuñar un arma", también supone un desafio en el diseño. En realidad no basta con poner un ID de arma en la tabla de personajes, ya que normalmente se podrán empuñar varias armas al mismo tiempo. Aunque depende del juego que se quiera hacer, claro. Aquí empiezan otra vez las preguntas: ¿Ponemos un ID para la mano izquierda y otro para la derecha en la tabla de personajes? ¿O creamos una tabla con zona del cuerpo y arma portada?

Además, ¿qué ocurre con el arma misma? Puede que el diseñador del juego quiera que se vaya desgastando con el tiempo, o que tenga un uso limitado. Luego en realidad no tendremos el arma asociada al personaje, sino una instancia de la misma con sus atributos "vivos" por personaje.

No creo que haya una solución única.