NOTA: Perguntei isso no Stack Overflow há alguns dias, mas tinha muito poucas visualizações e nenhuma resposta. Achei que eu deveria perguntar em gamdev.stackexchange.
Essa é uma pergunta / solicitação geral de aconselhamento sobre manutenção de um sistema de geração de procedimentos por meio de várias atualizações pós-lançamento, sem interromper o conteúdo gerado anteriormente.
Estou tentando encontrar informações e técnicas para evitar problemas de "Efeito Borboleta" ao criar conteúdo processual para jogos. Ao usar um gerador de números aleatórios semeados, uma sequência repetida de números aleatórios pode ser usada para criar um mundo reproduzível. Enquanto alguns jogos simplesmente salvam o mundo gerado no disco, uma vez gerado, um dos poderosos recursos da geração procedural é o fato de que você pode confiar na reprodutibilidade da sequência numérica para recriar uma região várias vezes da mesma maneira, eliminando a necessidade de persistência. Devido às restrições da minha situação específica, devo minimizar a persistência e preciso confiar na concentração puramente propagada, tanto quanto possível.
O principal perigo dessa abordagem é que mesmo a menor mudança no sistema processual de geração pode causar um efeito borboleta que muda o mundo inteiro. Isso torna muito complicado atualizar o jogo sem destruir os mundos que os jogadores estão explorando.
A principal técnica que tenho usado para evitar esse problema é projetar a geração procedural em várias fases, cada uma das quais com seu próprio gerador de números aleatórios semeados. Isso significa que cada subsistema é independente e, se algo quebrar, não afetará tudo no mundo. No entanto, parece que ele ainda tem muito potencial de "quebra", mesmo que em uma parte isolada do jogo.
Outra maneira possível de lidar com esse problema pode ser manter versões completas de seus geradores dentro do código e continuar usando o gerador correto para uma determinada instância mundial. Isso me parece um pesadelo de manutenção e estou curioso para saber se alguém realmente faz isso.
Portanto, minha pergunta é realmente uma solicitação de conselhos gerais, técnicas e padrões de design para lidar com esse problema do efeito borboleta, especialmente no contexto de atualizações de jogos pós-lançamento. (Espero que essa não seja uma pergunta muito ampla.)
Atualmente, estou trabalhando no Unity3D / C #, embora essa seja uma pergunta independente de idioma.
ATUALIZAR:
Obrigado pelas respostas.
Parece cada vez mais que os dados estáticos são a melhor e mais segura abordagem, e também que ao armazenar muitos dados estáticos não é uma opção, ter uma campanha longa em um mundo gerado exigiria uma versão rigorosa dos geradores usados. O motivo da limitação no meu caso é a necessidade de salvar / sincronizar na nuvem baseado em dispositivos móveis. Minha solução pode ser encontrar maneiras de armazenar pequenas quantidades de dados compactos sobre coisas essenciais.
Acho que o conceito de "Gaiolas" de Ventobravo é uma maneira particularmente útil de pensar sobre as coisas. Uma gaiola é basicamente um ponto de repetição, impedindo os efeitos de pequenas mudanças, isto é, enjaulando a borboleta.