Créer un univers
Dans cette section, nous allons aborder les données qui permettent à un univers d'exister, à la différence du système serveur, qui permet de les mettre à disposition, de les faire vivre pour les logiciels clients qui s'y connectent1).
Les différents types de données utilisées
Base MySQL
Ce système de base de données est utilisé pour les services et l'administration du serveur, cela ne concerne donc pas directement le monde en dehors du fait que c'est dans cette base que sont déterminés les comptes des joueurs et leurs privilèges.
Les Georges Sheets
Dans ces fichiers, stockés dans les sources dans code/ryzom/common/data_leveldesign/leveldesign, le jeu abrite la définition de tous les éléments qui doivent être définis : objets, sorts, créatures… C'est l'encyclopédie de base qui contient la définition de tous les éléments qui pourront être appelés, les briques qui serviront à bâtir le monde.
Ryzom Core stocke les données sous forme de fichiers xml (avec des extensions variables : .txt, .dfn, .cfg, .continent …
Ils sont conçus de façon à adopter une hiérarchie et un parentage qui permet la précision de plus en plus grande des différents éléments.
Ces fichiers xml peuvent être édités manuellement mais il existe un éditeur dédié : Georges Editor.
Une fois définis, ces fichiers sont compactés dans dans des packed sheets, une version binaire compactée, pour être utilisés par un serveur de jeu. Si on en efface, il va les recréer au démarrage.
Les Primitives
Une fois tous vos objets, sorts, actions, compétences etc. définis dans les Georges Sheets, il vous faut assembler toutes les briques pour en faire un monde, c'est là le travail du World Editor, qui est bien plus qu'un logiciel de création de carte, c'est lui qui permet de composer le monde, par sections.
Une fois encore, les données sont stockées sous forme de fichiers xml, avec différentes extensions selon leur destination. Le serveur les stocke dans code/ryzom/common/data_leveldesign/primitives
C'est là qu'il devient possible de créer un personnage précis, affecté à une tâche, en un lieu déterminé. On fait appel aux différentes briques composées dans les Georges Sheets pour cela. Là encore, il existe un système de hiérarchie qui permet de définir des groupes de PNJs, créatures, etc. pour ensuite placer des éléments de ces groupes sans avoir à redéfinir individuellement chaque objet/créature/personnage.
Là aussi, le serveur génère ses packed sheets au démarrage dans le cas où il lui en manque.
Le Persistent Data Record
Avec les Georges Sheets et les Primitives, on obtient l'état du monde au moment où le serveur démarre, à l'instant 0. Mais il va immédiatement se mettre à vivre, les joueurs, via leurs personnages, vont faire des modifications, interagir… Pour enregistrer l'évolution du monde, conserver la mémoire du dernier état de chaque chose, le serveur Ryzom Core écrit des fichiers sur le disque sans passer par un système de base de données.
C'est là que sont conservés tous les personnages, les guildes, les inventaires, la position des créatures, l'état des quêtes…
Les données sont enregistrées dans code/ryzom/server/save_shard, dans des fichiers binaires.
Bien qu'il ne soit normalement pas nécessaire de le faire, il est possible d'éditer les données grâce à l'utilitaire pdr_util, qui transforme le pdr binaire en un xml éditable. On peut ensuite le le ré-assembler avec le même outil. Cela peut servir à une mise à jour massive de données sur un grand nombre de personnages ou de créatures.
Prenons un fichier exemple : code/ryzom/server/save_shard/characters/001/account_1_0_pdr.bin.
On voit qu'on est dans la partie dédiée aux personnages (“characters” en anglais). Le sous-dossier, 001, sert uniquement à éviter que trop de données soient stockées dans le même répertoire, le système les organise donc automatiquement en sous-répertoires. On voit ensuite “account”, cela désigne donc un compte de joueur, puis “1”, c'est donc le compte avec l'ID 1. Puis on lit 0, c'est le premier slot de personnage (sur les 4 possibles). Dans ce fichier binaire, il y a donc toutes les données du premier personnage du premier joueur du serveur : inventaire, position, compétences etc.