Tengo un juego en línea donde los jugadores pueden dar forma al mundo de alguna manera, por ejemplo. La vivienda de Ultima Online, donde puedes construir tus casas directamente en ciertas partes del mapa mundial. Estos son cambios que deberían persistir en el tiempo como parte del mundo persistente.
Al mismo tiempo, el equipo de diseño está agregando contenido nuevo y modificando contenido antiguo para mejorar y ampliar el juego para nuevos jugadores. Lo harán en un servidor de desarrollo primero durante las pruebas y luego tendrán que fusionar su trabajo con el "trabajo" de los jugadores en el servidor en vivo.
Suponiendo que solucionemos los problemas de diseño del juego, por ejemplo. los jugadores solo pueden construir en áreas designadas, por lo que nunca chocan geográficamente con las ediciones del diseñador: ¿cuáles son buenas maneras de manejar los datos u organizar las estructuras de datos para evitar conflictos cuando los nuevos datos del diseñador se fusionan con los nuevos datos del jugador?
Ejemplo 1: un jugador crea un nuevo tipo de elemento, y el juego le asigna el ID 123456. Las instancias de ese elemento se refieren a 123456. Ahora imagine que los diseñadores del juego tienen un sistema similar, y un diseñador crea un nuevo elemento también numerado 123456. ¿Cómo se puede evitar esto?
Ejemplo 2: alguien crea un mod popular que le da a todos tus dragones un acento francés. Incluye una secuencia de comandos con un nuevo objeto llamado assignFrenchAccent
que utilizan para asignar los nuevos recursos de voz a cada objeto dragón. Pero está a punto de implementar su DLC "Napoleon vs Smaug" que tiene un objeto del mismo nombre. ¿Cómo puede hacer esto sin muchos problemas de servicio al cliente?
He pensado en las siguientes estrategias:
- Puede usar 2 archivos / directorios / bases de datos separados, pero luego sus operaciones de lectura son significativamente complicadas. "Mostrar todos los elementos" debe realizar una lectura en la base de datos del diseñador y otra en la base de datos del reproductor (y de alguna manera aún debe distinguir entre los 2).
- Puede usar 2 espacios de nombres diferentes dentro de una tienda, por ejemplo. usando cadenas como clave principal y prefijándolas con "DISEÑO:" o "JUGADOR:", pero la creación de esos espacios de nombres puede no ser trivial y las dependencias no están claras. (p. ej., en un RDBMS, es posible que no pueda usar cadenas de manera eficiente como claves primarias. Puede usar números enteros y asignar todas las claves primarias por debajo de un cierto número, por ejemplo, 1 millón, para que sean datos de diseño, y todo lo que esté por encima de ese punto sea datos del jugador. Pero esa información es invisible para el RDBMS y los enlaces de claves externas cruzarán la 'división', lo que significa que todas las herramientas y los scripts deben solucionarlo explícitamente).
- Siempre puede trabajar en la misma base de datos compartida en tiempo real, pero el rendimiento puede ser deficiente y el riesgo de dañar los datos del jugador puede aumentar. Tampoco se extiende a juegos que se ejecutan en más de 1 servidor con datos mundiales diferentes.
- ... alguna otra idea?
Se me ocurre que, aunque esto es principalmente un problema para los juegos en línea, los conceptos también pueden aplicarse a la modificación, donde la comunidad crea modificaciones al mismo tiempo que los desarrolladores parchan su juego. ¿Se utilizan aquí algunas estrategias para reducir la posibilidad de que el mod se rompa cuando salen nuevos parches?
También he etiquetado esto como "control de versiones" porque en un nivel eso es lo que es: 2 ramas de desarrollo de datos que necesitan fusionarse. Quizás algunas ideas puedan venir de esa dirección.
EDITAR: algunos ejemplos agregados anteriormente para ayudar a aclarar el problema. Estoy empezando a pensar que el problema es realmente el espacio de nombres, que podría implementarse en una tienda a través de claves compuestas. Eso simplifica la estrategia de fusión, al menos. Pero puede haber alternativas que no estoy viendo.