L’atelier de l’ingénieur : concevoir l’application WoW Companion
Pour la sortie de Shadowlands, nous avons travaillé sur une amélioration technique majeure de l’application WoW Companion : la prise en charge du contenu partagé entre plusieurs extensions. De nombreux joueurs ont réclamé cette fonctionnalité, et nous souhaitons aujourd’hui vous faire part des défis et des décisions associés à cette modification technique à grande échelle.
Petit rappel historique
À l’origine, nous avons créé l’application WoW Companion pour accompagner l’extension Legion. Avant l’arrivée de Battle for Azeroth, nous avons décidé de nous concentrer sur plusieurs améliorations de fond majeures, comme le partage de code entre l’application et le client sur PC, qui permet de profiter de nombreux outils et fonctionnalités de l’interface du jeu auxquels l’application n’avait pas encore accès. En contrepartie, nous n’avons pas pu créer le type d’environnement nécessaire pour prendre en charge plus d’une extension à la fois. C’est pourquoi la nouvelle extension, Battle for Azeroth, est venue remplacer Legion dans l’application.
Nous savons que les joueurs ont été déçus de ne plus avoir accès au contenu de Legion depuis l’application, nous nous sommes donc promis de tout faire pour proposer la prise en charge de plusieurs extensions à la sortie de Shadowlands. De plus, l’équipe mobile était désireuse de satisfaire les attentes de la communauté et de rétablir le contenu de Legion.
Afin d’optimiser notre capacité de travail sur le contenu de Shadowlands, nous avons brièvement envisagé d’ajouter uniquement une partie des fonctionnalités des extensions précédentes, mais nous avons rapidement décidé de rétablir le plus d’options possible. Nous savions également qu’avec l’arrivée de Shadowlands, les joueurs pourraient faire progresser leurs personnages secondaires dans Legion via les campagnes des Marcheurs du temps, et nous tenions à nous assurer qu’ils puissent bénéficier de tout le contenu nécessaire à leur montée de niveau depuis l’application mobile.
Par chance, il s’est avéré que la majeure partie du code spécifique à Legion se trouvait toujours dans l’application, ainsi que les ressources originales de l’extension. La ré-implémentation du contenu de Legion a donc constitué le test parfait pour notre fonctionnalité multi-extension. Même s’il ne restait pas grand-chose à implémenter, nous avions encore beaucoup à faire pour séparer de manière claire le contenu de Legion et de Battle for Azeroth.
Pour créer la structure multi-extension, trois facteurs majeurs étaient nécessaires :
- L’application devait effacer les données de l’extension actuelle et récupérer les données de la nouvelle extension sur le serveur.
- Il était nécessaire de diviser le code d’interface spécifique à chaque extension pour séparer les différentes fonctionnalités.
- Les données spécifiques à chaque extension devaient être divisées afin de réduire la consommation de ressources de l’application.
Données d’extension
Lorsque nous avons développé l’application pour Legion, le code du serveur gérant les requêtes depuis l’application était conçu pour renvoyer uniquement les données de Legion. Au moment de passer à Battle for Azeroth, nous avons modifié ces fonctions pour qu’elles renvoient les données de Battle for Azeroth à la place. Cette fois-ci, nous avons dû faire en sorte que le système récupère les données de n’importe quelle extension. Pour cela, il a fallu parcourir toutes les fonctions du serveur répondant aux requêtes depuis l’appareil mobile et les modifier pour qu’elles renvoient les données spécifiques à l’extension sélectionnée. Par exemple, les requêtes de données dédiées aux sujets devaient préciser le type de sujet (de Legion ou de Battle for Azeroth), et les requêtes dédiées aux expéditions devaient inclure les zones nécessitant les données.
Un certain nombre d’emplacements ont également été ajoutés à l’application afin de correspondre à Battle for Azeroth. Dans Legion, l’application vous demandait des ressources de domaine ; dans Battle for Azeroth, nous avions simplement ajouté les ressources de guerre. Mais pour Shadowlands, au lieu d’ajouter plus de monnaies à ce même message, nous avons décidé de transposer le système de monnaie complet du client PC vers le nouveau cadre partagé développé pour Battle for Azeroth. Cela signifie que chaque extension peut désormais accéder directement à son propre type de monnaie, au lieu d’avoir à préciser manuellement quelle monnaie est nécessaire.
Code d’interface
Une grande partie du code écrit pour Battle for Azeroth a été conçu sur la base du code de Legion. Il était, par conséquent, difficile de déterminer quel code était actif. Par exemple, la liste des sujets de Battle for Azeroth pouvait toujours afficher l’armement, mais le bouton était masqué, et le code jamais utilisé. Les fonctionnalités de Legion et de Battle for Azeroth étaient suffisamment similaires pour que cela ne représente pas un réel problème, mais une telle architecture ne pouvait pas être maintenue avec les fonctionnalités inédites de Shadowlands. Demander au même code de gérer les fonctionnalités des liens d’âme et des congrégations complexifiait grandement un système déjà très complexe.
C’est pourquoi nous avons étudié les scripts séparément afin de déterminer quelles fonctionnalités étaient partagées et lesquelles étaient spécifiques à une extension. Nous avons ensuite réparti ces codes en sous-classes ou dans des composantes totalement nouvelles, tout en conservant uniquement les fonctionnalités communes de base dans des classes parentes, et créé des objets pour chaque extension à l’aide de ces nouvelles sous-classes. Bien qu’elles dépendent du même système et partagent la majeure partie de leurs fonctionnalités, seules les missions de Legion nécessitent le bouton Combattant allié, tandis que la liste des aventures de Shadowlands peut ignorer les deux onglets de Legion et Battle for Azeroth et afficher les portraits des adversaires au lieu des icônes des types de missions.
Une autre modification de fond apportée à l’application pour Shadowlands est la façon dont nous générons les fichiers de base de données : WoW Companion construit désormais le code et les fichiers de base de données de la même manière que sur PC. Cela s’est avéré particulièrement utile pour déterminer sur quelle carte chaque expédition s’affiche. À l’origine, l’application utilisait une logique manuelle pour chaque ID de carte, ce qui ne posait pas de problème particulier au moment où seuls Argus et les îles Brisées étaient nécessaires. Cependant, à mesure que nous ajoutions des zones de Battle for Azeroth, ce système est rapidement devenu trop lourd. Pour Shadowlands, nous sommes facilement parvenus à extraire les tables de la base de données de cartes nécessaires afin de rendre le système entièrement dynamique, en convertissant une grande partie du code gérant les zones des trois extensions en une seule fonction allégée capable de gérer automatiquement n’importe quelle expédition, sans aucun lien spécifique avec une extension.
Fichiers de ressources
Contrairement au développement sur PC, sur mobile, nous devons prendre en compte la probabilité que les joueurs utilisent l’application sur un appareil disposant d’une connexion à faible débit, ou à données limitées. Nous devons nous assurer que l’utilisation de l’application reste amusante sans générer de frustration, quelle que soit la connexion Internet utilisée, c’est pourquoi l’une des solutions est de limiter la quantité de données à télécharger nécessaires pour utiliser l’application.
Chaque extension dispose de nombreux fichiers de ressources, et passer d’une extension à la fois sur l’application, comme c’était le cas pour Legion et Battle for Azeroth, à trois extensions à l’arrivée de Shadowlands triplerait la quantité de données nécessaires. Cependant, de nombreuses ressources ne sont utilisées que par une extension, comme les textures en haute résolution de la carte du monde, les fonds d’ambiance des emplacements de missions, et les portraits des sujets et des ennemis. Nous avons donc décidé de regrouper ces ressources dans différents packs pour chaque extension. Ce faisant, l’application ne chargera en mémoire que les ressources actuellement utilisées, réduisant ainsi la quantité de mémoire nécessaire.
Nous avons également décidé très tôt de créer un cadre spécifique à chaque extension, afin de séparer au mieux leurs différentes fonctionnalités. Le cadre de Legion ne nécessite pas de page dédiée aux Appels des congrégations, et celle de Shadowlands ne dispose d’aucune fenêtre permettant le transport de troupes. Tout comme pour les modifications apportées au code, celle-ci permet de repérer plus facilement et à tout moment ce qui se passe dans l’application. Séparer à la fois les ressources et les cadres nous permet de mieux contrôler les informations de chaque extension, et de proposer des options de téléchargement plus simples.
Nous souhaitons permettre aux joueurs de décider davantage des ressources à télécharger. Il est donc possible de télécharger toutes les données d’un coup, lorsque vous disposez d’une connexion stable, ou de récupérer les ressources d’une autre extension plus tard, afin de pouvoir profiter plus rapidement de l’application. Si vous ne souhaitez pas utiliser les fonctionnalités d’une extension, vous ne serez jamais contraint de télécharger les ressources associées. Sachant que les données d’une extension pèsent entre 30 et 40 Mo, cette fonctionnalité permet d’économiser beaucoup de ressources !
Modifications du système de traitement des données
Séparer les ressources par extension nécessitait de modifier deux parties de notre pipeline : il fallait indiquer à notre outil de conservation quelles données appartenaient à quelle extension, tandis que l’outil de création de packs de données devait pouvoir assembler ces données pour créer les packs finaux. Cet outil de conservation de données a été créé spécifiquement pour Legion et Battle for Azeroth, nous avons donc dû le reprogrammer pour qu’il fonctionne avec n’importe quelle extension. La nouvelle version de l’outil parcourt la liste des contenus dont l’application a besoin (par itération de l’énumération « GarrisonType ») et renvoie les données de chaque extension dans des répertoires séparés. Cela signifie également que l’outil utilisera automatiquement toute donnée ajoutée à cette liste dans le futur, ce qui facilite l’implémentation de nouveau contenu dans l’application WoW Companion sans avoir à la mettre à jour systématiquement.
La création de fichiers de ressources et leur exécution utilise majoritairement la fonctionnalité de variantes « AssetBundle » d’Unity, qui permet à l’application de traiter différentes versions d’un pack comme s’il s’agissait du même pack. Le pipeline de création de packs crée une variante de chaque pack pour chaque extension, en se basant sur les répertoires spécifiques de l’outil de conservation de données. Ces ressources sont remplacées lors de leur exécution dès que l’utilisateur choisit une autre extension dans l’application. Puisque toutes les variantes d’un pack sont traitées de la même façon, les codes qui récupèrent les portraits des sujets, par exemple, peuvent le faire sans se soucier de quels portraits sont déjà chargés dans l’application. Cela permet à notre code d’ignorer le chargement et le déchargement des ressources, ainsi, chaque extension peut prétendre être la seule présente dans l’application.
En route pour l’Ombreterre
Que vous découvriez les nouvelles aventures de Shadowlands ou que vous fassiez progresser un personnage secondaire dans Legion, nous avons hâte de pouvoir vous proposer encore plus de contenu de World of Warcraft depuis votre appareil mobile ! Nous espérons que vous avez apprécié cet aperçu des coulisses de notre travail et de certaines des décisions nécessaires pour développer un cadre capable de gérer le contenu actuel du jeu, mais aussi tout ce que nous allons déployer dans World of Warcraft à l’avenir.