Eu tenho um jogo online no qual os jogadores podem moldar o mundo de alguma forma - por exemplo. Habitação da Ultima Online, onde você constrói suas casas diretamente em certas partes do mapa do mundo. Essas são mudanças que devem persistir ao longo do tempo como parte do mundo persistente.
Ao mesmo tempo, a equipe de design está adicionando novo conteúdo e alterando o conteúdo antigo para melhorar e estender o jogo para novos jogadores. Eles farão isso em um servidor de desenvolvimento primeiro durante o teste e depois terão que mesclar seu trabalho com o "trabalho" dos jogadores no servidor ativo.
Assumindo que corrigimos os problemas de design do jogo - por exemplo, os jogadores só podem construir em áreas designadas, para que nunca entrem em conflito geográfico com as edições do designer - quais são as boas maneiras de manipular os dados ou organizar as estruturas de dados para evitar conflitos quando novos dados do designer são mesclados com os dados do novo jogador?
Exemplo 1: um jogador cria um novo tipo de item e o jogo atribui o ID 123456 a ele. Todas as instâncias desse item se referem a 123456. Agora imagine que os designers de jogos tenham um sistema semelhante, e um designer crie um novo item também numerado como 123456. Como isso pode ser evitado?
Exemplo 2: alguém faz um mod popular que dá a todos os seus dragões um sotaque francês. Ele inclui um script com um novo objeto chamado assignFrenchAccent
que eles usam para atribuir os novos recursos de voz a cada objeto dragão. Mas você está prestes a implantar seu DLC "Napoleon vs Smaug", que tem um objeto com o mesmo nome - como você pode fazer isso sem muitos problemas de atendimento ao cliente?
Pensei nas seguintes estratégias:
- Você pode usar 2 arquivos / diretórios / bancos de dados separados, mas suas operações de leitura são significativamente complicadas. "Mostrar todos os itens" deve executar uma leitura no banco de dados do designer e uma leitura no banco de dados do player (e ainda precisa distinguir entre os 2, de alguma forma).
- Você pode usar 2 namespaces diferentes em uma loja, por exemplo. usando strings como chave primária e prefixando-as com "DESIGN:" ou "PLAYER:", mas a criação desses espaços para nome pode não ser trivial e as dependências não são claras. (por exemplo. Em um RDBMS, você pode não conseguir usar seqüências de caracteres de forma eficiente como chaves primárias. Você pode usar números inteiros e alocar todas as chaves primárias abaixo de um determinado número, por exemplo, 1 milhão, para serem dados de designer e tudo acima desse ponto. Mas essas informações são invisíveis para o RDBMS e os links de chave estrangeira cruzam a 'divisão', o que significa que todas as ferramentas e scripts precisam trabalhar explicitamente com isso.)
- Você sempre pode trabalhar no mesmo banco de dados compartilhado em tempo real, mas o desempenho pode ser ruim e o risco de danos aos dados do player pode ser aumentado. Também não se estende a jogos executados em mais de um servidor com dados mundiais diferentes.
- ... outras idéias?
Ocorre-me que, embora esse seja um problema principalmente para jogos online, os conceitos também podem se aplicar à modificação, onde a comunidade cria mods ao mesmo tempo em que os desenvolvedores corrigem o jogo. Existem estratégias usadas aqui para reduzir a chance de quebra de mod quando novos patches são lançados?
Também marquei isso como "controle de versão" porque, em um nível, é isso: dois ramos do desenvolvimento de dados que precisam ser mesclados. Talvez algumas idéias possam vir dessa direção.
EDIT - alguns exemplos adicionados acima para ajudar a esclarecer o problema. Estou começando a pensar que o problema é realmente um namespacing, que pode ser implementado em uma loja por meio de chaves compostas. Isso simplifica a estratégia de mesclagem, pelo menos. Mas pode haver alternativas que não estou vendo.