Ho un gioco online in cui i giocatori possono modellare il mondo in qualche modo, ad es. Gli alloggi di Ultima Online, dove puoi costruire le tue case direttamente su alcune parti della mappa del mondo. Questi sono cambiamenti che dovrebbero persistere nel tempo come parte del mondo persistente.
Allo stesso tempo, il team di progettazione sta aggiungendo nuovi contenuti e modificando i vecchi contenuti per migliorare ed estendere il gioco ai nuovi giocatori. Lo faranno prima su un server di sviluppo durante i test e poi dovranno unire il loro lavoro con il "lavoro" dei giocatori sul server live.
Supponendo di risolvere i problemi di progettazione del gioco, ad es. i giocatori possono costruire solo in aree designate, quindi non si scontrano mai geograficamente con le modifiche dei designer: quali sono i modi migliori per gestire i dati o organizzare le strutture dei dati in modo da evitare conflitti quando i dati dei nuovi designer vengono uniti a quelli dei nuovi giocatori?
Esempio 1: un giocatore crea un nuovo tipo di oggetto e il gioco gli assegna l'ID 123456. Le istanze di quell'elemento si riferiscono tutte a 123456. Ora immagina che i progettisti di giochi abbiano un sistema simile e un designer crei un nuovo oggetto anche numerato 123456. Come può essere evitato?
Esempio 2: qualcuno crea una mod popolare che dà a tutti i tuoi draghi un accento francese. Include uno script con un nuovo oggetto chiamato assignFrenchAccent
che usano per assegnare le nuove risorse vocali a ciascun oggetto drago. Ma stai per distribuire il tuo DLC "Napoleon vs Smaug" che ha un oggetto con lo stesso nome: come puoi farlo senza molti problemi con il servizio clienti?
Ho pensato alle seguenti strategie:
- È possibile utilizzare 2 file / directory / database separati, ma le operazioni di lettura sono notevolmente complicate. "Mostra tutti gli elementi" deve eseguire una lettura sul DB di progettazione e una lettura sul DB di lettore (e deve comunque distinguere tra i 2, in qualche modo).
- È possibile utilizzare 2 spazi dei nomi diversi all'interno di un negozio, ad es. usare le stringhe come chiave primaria e prefissarle con "DESIGN:" o "PLAYER:", ma la creazione di questi spazi dei nomi può essere non banale e le dipendenze non sono chiare. (ad es. in un RDBMS potrebbe non essere possibile utilizzare in modo efficiente stringhe come chiavi primarie. È possibile utilizzare numeri interi e allocare tutte le chiavi primarie al di sotto di un determinato numero, ad esempio 1 milione, per essere dati di progettazione e tutto quanto sopra quel punto deve essere i dati del giocatore. Ma quelle informazioni sono invisibili all'RDBMS e i collegamenti delle chiavi esterne attraverseranno il "divario", il che significa che tutti gli strumenti e gli script devono aggirare esplicitamente.
- Puoi sempre lavorare sullo stesso database condiviso in tempo reale, ma le prestazioni potrebbero essere scadenti e il rischio di danni ai dati dei giocatori potrebbe essere migliorato. Inoltre, non si estende ai giochi eseguiti su più di 1 server con dati mondiali diversi.
- ... altre idee?
Mi viene in mente che, sebbene questo sia principalmente un problema per i giochi online, i concetti possono applicarsi anche al modding, in cui la community crea mod allo stesso tempo in cui gli sviluppatori modificano il proprio gioco. Ci sono strategie qui utilizzate per ridurre la possibilità di rottura del mod quando escono nuove patch?
Ho anche etichettato questo come "controllo della versione" perché a un livello è quello che sono: 2 rami dello sviluppo dei dati che devono essere uniti. Forse alcune intuizioni potrebbero venire da quella direzione.
EDIT: alcuni esempi aggiunti sopra per aiutare a chiarire il problema. Sto iniziando a pensare che il problema riguardi davvero lo spazio dei nomi, che potrebbe essere implementato in un negozio tramite chiavi composite. Ciò semplifica la strategia di unione, almeno. Ma potrebbero esserci delle alternative che non vedo.