Journal Rétro-ingénierie et modding de jeu dans un but esthétique - exemple en vidéo

Posté par  . Licence CC By‑SA.
68
27
mai
2018

Sommaire

Bonjour tout le monde !

Tout d'abord, j'espère que mon message ne sera pas trop considéré comme "publicitaire". Si c'est le cas, brûlez le au lance-flammes. J'espère aussi que la page n'est pas trop lourde, j'ai mis un paquet d'images et de gifs animés dans l'article.

Il y a 8 ans, avec une bande d'amis (regroupés sous le nom de RIdPEF), nous nous sommes lancés dans un projet un peu dingue mais rigolo : filmer le jeu World Of Warcraft, mais une version totalement modifiée/moddée/customisée/patchée dans le but d'obtenir une vidéo la plus esthétique possible. Nous avons terminé il y a quelques jours, et ce fut une longue aventure, avec des méthodes qui peuvent vous intéresser. C'est pourquoi je me lance dans ce journal. Il ne s'agit pas d'un tutoriel, mais plutôt d'une présentation générale des méthodes et outils utilisés.

Tout d'abord, voici la vidéo, si vous souhaitez la regarder avant de lire cet immense pavé (cliquez sur l'image):

Coffee Induced Dreams

Pour ceux qui ne connaissent pas le jeu, dites-vous que 100% du film (y compris introduction et générique) sont des scènes créées amoureusement et artisanalement dans le jeu World of Warcraft.

En quoi c'est intéressant ou original ?

Pour répondre à cette question, il faut d'abord se pencher sur quelques caractéristiques du jeu World of Warcraft. C'est un MMORPG, c'est-à-dire que les joueurs disposent d'un client, grâce auquel ils se connectent sur un serveur, et interagissent dans un monde qui est le même pour tout un chacun.

Il n'est normalement pas possible d'agir vraiment sur le monde, il est semi-figé, c'est à dire qu'il n'évolue que lorsque l'éditeur pousse de nouvelles mises à jour. Aucun outil officiel n'est disponible qui permettrait une quelconque modification du client. Et c'est là que ça devient rigolo.

En gros, nous avons utilisé le savoir et les outils accumulés depuis la sortie du jeu par une bande d'acharnés qui souhaitent modifier le client (certains pour faire des serveurs privés avec du contenu unique, d'autres pour le "fun", etc.). Nous avons aussi participé à cette accumulation d'outils et de savoir.

Et c'est là qu'on touche quelque chose d'assez proche de ce que l'on peut voir parfois dans le monde du logiciel libre : rien de cette vidéo n'aurait été possible sans collaboration, connaissance et documentation partagée (notamment à l'aide d'un wiki), et sans outils "librement" partagés. Je mets "librement" car si la gratuité est de mise dans 99% des cas, et que la plupart des outils créés par la communauté sont libres, quelques uns ont le code source disponible mais sans licence de précisée, et quelques uns sont propriétaires.

Ce journal va servir à montrer de quelle manière nous avons tordu le jeu, et avec quels outils. Parce que c'est rigolo.

Les premières étapes

D'abord, mettre en place un environnement permettant de bidouiller et filmer en toute quiétude

Modifier un jeu en ligne n'est pas quelque chose d'anodin, et peut être très mal vu. Globalement, c'est contre les conditions d'utilisation du jeu, même s'il y a toujours eu une tolérance tant que c'était dans des visées "artistiques". De plus, World of Warcraft étant un jeu qui a beaucoup évolué, beaucoup d'outils ne fonctionnent plus sur les versions récentes. Pour ces deux raisons, nous avons fait le choix d'installer un serveur stabilisé sur une ancienne version de WoW (la 3.3.5 pour ceux qui veulent des détails).

Donc, première étape, compiler et installer un serveur pour bidouiller en local sans risque aucun. La création de serveurs (qu'ils soient le plus complet ou plutôt minimaliste) est d'ailleurs un des grands jeux des gens qui veulent s'amuser à comprendre comment les interactions client/serveur fonctionnent sur ce jeu (un autre exemple plus minimaliste en python).

Ensuite, configurer le client pour s'y connecter, puis préparer le client pour pouvoir filmer sans être limités par les déplacements "normaux" du personnage. Pour cela, une amie nous a concocté un logiciel fort pratique nommé Free Far Sight, même si le code n'est pas libre. Depuis, un autre logiciel (libre celui-ci) a été créé permettant sensiblement les même choses : BugCraft-Studio. Encore une fois, on est à la limite de ce que Blizzard (l'éditeur du jeu) accepte : ces logiciels font du memory editing, et c'est généralement pas très apprécié sur les jeux en ligne. Mais encore une fois, tant que c'est fait pour un but "artistique", Blizzard est en général assez tolérant. Si vous souhaitez savoir ce que permettent réellement ces logiciels, Khamúl en a fait une démonstration par ici.

Installer quelques outils génériques

Dans les outils de base, il faut citer ce qui permet d'extraire les fichiers du jeu, afin de les bidouiller à volonté. Pour ceci, nous avons besoin des outils basés sur la Stormlib (disponible dans vos distributions préférées) et aussi casexplorer.

Comme nous modifions une ancienne version de World Of Warcraft, nous ne disposons pas directement de tous les derniers modèles ajoutés dans le jeu. Ça n'est pas bien grave, il existe un chouette petit logiciel nommé multiconverter, qui permet de convertir les modèles des versions récentes du jeu en quelque chose de compatible avec la version que nous utilisons.

Nous utilisons aussi une méthode permettant de ne pas avoir à "repacker" nos patchs, ce qui fait gagner pas mal de temps (la méthode est rigolote pour ceux que ça intéresse, c'est de la modification du binaire, en y allant à l'éditeur hexa).

Je rappelle que tous ces outils ont été développés au cours du temps par des passionnés ne disposant d'aucune documentation fournie par Blizzard. C'est beau, non ?

Ça y est, on peut commencer à tout casser

Premiers détournements du jeu : le swap

Ça c'est la discipline historique pour commencer le modding sur WoW. Il s'agit de remplacer un fichier par un autre, tout simplement en le renommant. Par exemple, vous trouvez que tel modèle d'arbre qu'on voit dans telle zone il est moche, et qu'une boîte aux lettres ça serait plus joli, et ben vous renommez votre boîte selon le nom de l'arbre, vous la mettez au bon endroit dans l'arborescence de vos fichiers, et hop. Oui c'est crado, mais c'est efficace. À noter que ça marche pour n'importe quoi : modèle 3d, texture, son, cartes entières, voire continents. C'est d'ailleurs LA méthode pour aller explorer certaines zones du jeu normalement non accessibles : les mettre à la place de zones tout à fait normales.

Allez, un exemple :
Exemple de swap

Bon, c'est sympa, mais je veux ajouter des trucs originaux

En effet, le swapping comme présenté juste au-dessus, même s'il permet beaucoup de choses, est limité aux choses déjà incluses dans le jeu. Si l'on veut ajouter un nouveau modèle 3d, modifier une texture déjà existante, ou créer son propre terrain avec des reliefs originaux, il faut passer aux choses plus sérieuses.
Et là, l'ensemble de ce que je vais vous montrer n'a été possible que grâce à un immense travail de reverse des formats du jeu, et de documentation. Si ça vous intéresse, à peu près tous les formats sont documentés ici sur le fameux WoWdev Wiki.

En gros, il y a trois aspects :

  • Convertir des fichiers de formats "classiques" dans des fichiers compris par le jeu.
  • Convertir les fichiers de World Of Warcraft dans un format éditable ou modifiable plus facilement.
  • Modifier directement les fichiers en les laissant dans le format utilisé par le jeu.

Il s'agit donc, pour chaque format (image, modèle 3d, etc), de créer un workflow complet en fonction de ce que l'on désire faire.

Les objets dans Wow sont répartis en deux formats distincts :

  • Le M2, pour tous les objets qui ont besoin d'animations, cela va de la fontaine ruisselante aux monstres et PNJs, ainsi que les petits éléments de décor.
  • Le WMO, pour les bâtiments et les très gros objets.

Lorsque nous avons eu besoin d'altérer le modeling ou l'UV-mapping (manière dont les textures sont appliquées) d'un objet existant, il nous a fallu tout d'abord l'exporter en .obj, le re-travailler, puis le convertir à nouveau dans un format de Wow. L'export a été possible grâce à un visualisateur de modèles, WowModelViewer.
Pour tous les types d'objets custom utilisés, le modeling et l'UV-mapping ont été réalisés dans Blender. Ne pouvant pas utiliser les shaders à l'export, le texturing a été fait en texture pure sans effets, en général avec des images reprises dans les fichiers du jeu et parfois un peu modifiées, pour garder de la cohérence graphique.

Le format M2

Nous avons utilisé plusieurs workflows concurrents, en fonction du besoin de collisions et d'animations que nous avions, car tous les outils ne comprenaient pas les mêmes possibilités.
Pour les objets avec collisions (mais sans animations), nous avons utilisé le convertisseur nommé Obj2M2.
Pour les objets sans collisions, avec ou sans animations, nous avons créé un convertisseur spécialement pour l'occasion, qui effectue une transformation de .gltf (exporté depuis Blender) vers M2.

m2 avec animation m2 sans animation

Le format WMO

Pour tous les objets massifs non-animés, nous avons ré-exporté les fichiers de Blender en .3ds, puis converti ce format en WMO grâce à MirrorMachine.

Un joli bateau en WMO

Le format BLP

Le format BLP (ou les formats, il en existe plusieurs versions) est celui utilisé pour toutes les images du jeu. Il est utilisé à la fois pour les textures, mais aussi pour les différents éléments de l'interface : icônes, barres de chargement, cartes, etc.
Il existe un paquet d'outils permettant de les convertir en png, et de convertir les png en blp. Nous avons utilisé BLP Lab et BLPConverter.
Cela permet de créer des textures pour des objets existant en jeu ou pour les modèles que l'on importe.
Un exemple amusant, vous pouvez ici voir un remplacement de la texture utilisée pour la tempête de sable par un truc plus abstrait, avec une skybox noire :
Tempête de disques !

Les éditions directes de fichiers, sans conversion

Dans plusieurs cas, nous ne sommes pas passés par des convertisseurs, notamment lorsqu'il s'agissait de bidouiller des choses spécifiques aux formats des fichiers.

Par exemple, les WMO possèdent la possibilité d'avoir de la lumière durant la nuit (utilisé en jeu principalement pour les fenêtres de bâtiments vus de l'extérieur). Nous avons utilisé cette option dans le film.
Dans ce cas, la manipulation est la suivante : il faut repérer la bonne texture sur le chunk MOMT (il y a dans le chunk un renvoi vers l'offset dans le MOTX qui contient le nom des textures utilisées) , changer les flags à 0x10 pour activer la couleur émissive, et définir la couleur un peu plus bas (color_1). Au final, voilà le résultat :

Editeur hexa
WMO lumineux

Notez l'utilisation de templates pour 010Editor permettant de mieux se repérer dans le fichier. Ces templates fort utiles sont encore une fois maintenus par la communauté : https://github.com/relaxok/wow010

Dans d'autres cas, il s'est par exemple agi de modifier la durée de certaines animations. On peut aussi citer le fait d'avoir parfois eu à "nettoyer" des terrains (quand nous nous sommes basés sur des terrains pré-existants) notamment pour supprimer les ombres incrustées dans le relief.
Ou encore, on peut citer l'utilisation de PyWMO, une bibliothèque permettant de manipuler directement les WMO en Python, très pratique pour redimensionner rapidement un modèle sans avoir à passer par les étapes de conversion.

Le cas des adt

Les ADT sont des fichiers représentant des carrés de terrain. Ils comportent plusieurs informations : les reliefs, les textures utilisées au sol, la présence d'eau, l’existence et les coordonnées des objets positionnés (M2 et WMO) sur le carré en question, etc.

Le sacro-saint Noggit

Aaaah, Noggit. Ce logiciel est une petite merveille, pas toujours pratique à utiliser, parfois un peu capricieux, mais génial. Il s'agit tout simplement d'un éditeur de carte pour World Of Warcraft. Il permet la création ou l'édition de terrain. Avec un relief personnalisé, choix de textures au sol, ajout d'eau, ajout et positionnement/redimensionnement de modèles, et sauvegarde dans un format directement compréhensible par World Of Warcraft.

Le grand Noggit

Que ce soit pour la création d'une nouvelle carte, ou pour l'édition d'une carte pré-existante, ce logiciel a certainement été l'outil que nous avons le plus utilisé pour cette vidéo.

La génération de terrain

Bien que l'édition manuelle de terrain soit toute indiquée dans un grand nombre de cas, il est parfois intéressant de générer des cartes à partir de données externes. C'est le parti pris de WowMapGen, qui utilise des images pour créer le relief, placer les textures et de la couleur sur le terrain, puis indiquer où placer les objets. Le programme a par exemple permis de placer très rapidement plusieurs milliers d'objets identiques avec des variations d'échelle et de rotation.

Carte de placement d'objets
Résultat du placement

Cependant, le relief créé par WowMapGen comporte des anomalies très longues à corriger manuellement. Cela nous a conduits à utiliser un autre générateur en complément, dont le résultat est beaucoup plus beau, mais qui n'a pas les options de placement d'objets.

Jouer avec les skybox

Historiquement, pour changer la couleur du ciel et du brouillard, nous modifions des fichiers pas très lisibles. Heureusement, l'outil de nous utilisons pour gérer les trajets de caméra permet aussi de modifier ces réglages directement. L'inconvénient est qu'il n'y a pas de sauvegarde directement dans le format utilisé par le jeu. Cela nous importe peu quand le but à la fin est uniquement d'avoir une vidéo.

Changement de skyboxes à la volée

Petits détails supplémentaires

Peut-être vous demandez-vous pourquoi le film s'appelle ainsi ? Tout d'abord, parce que le café, c'est bon. Ensuite, coffee était le terme utilisé au début du jeu pour désigner le modding. On trouve encore quelques traces de ce terme sur internet. "Dreams", c'est simplement parce que ce sont des paysages imaginaires qui sont montrés, et qui n'ont parfois pas grand sens.

Vous pouvez trouver quelques informations en plus sur le petit film, ainsi qu'une galerie de sreenshots par ici : https://ridpef.org/coffee-induced-dreams

Conclusion

Ce projet date d'il y a 8 ans, c'est un boulot de malade (on a compté, il y a presque 2 heures de travail par seconde de vidéo), mais on est heureux d'avoir terminé. Il faut en gros penser ce projet comme l'aboutissement de notre travail créatif sur World Of Warcraft, comme une démo technique, mais aussi comme un grand hommage à tout cette communauté qui depuis les débuts du jeu cherche à en comprendre le fonctionnement.
J'espère que cette description de la manière dont nous avons procédé, et la mise en avant d'une partie des outils utilisés vous ont plu ! N'hésitez pas si vous avez des questions, que ça soit sur l'aspect technique ou n'importe quoi d'autre.

Je rajoute quelques liens, vers des pages traitants de ces sujets :

Merci à tous les copains de la RIdPEF pour m'avoir suivi dans tout ça ! Et merci à Mjollna pour m'avoir aidé à pondre ce journal.

  • # Commentaire supprimé

    Posté par  . Évalué à 10.

    Ce commentaire a été supprimé par l’équipe de modération.

  • # Statut juridique

    Posté par  (site web personnel) . Évalué à 10.

    Pour info, Linux Pratique dans son HS N°41 à fait une analyse sur le Statut juridique de ce type de projet : il s'agit d'une oeuvre "collaborative/de collaboration".

  • # Vidéo : raconter une histoire et prouesse technique

    Posté par  . Évalué à 2.

    La vidéo et le journal ont l'air très intéressants mais avant de me plonger dans 15 minutes de vidéo, ça raconte quoi ?
    Une ligne de synopsis aurait été appréciée.
    Déjà bravo pour la ténacité ! ;-)

    • [^] # Re: Vidéo : raconter une histoire et prouesse technique

      Posté par  . Évalué à 4.

      Merci beaucoup !
      Concernant la vidéo, elle ne raconte… rien ! Ce sont des suites de scènes voulues comme étant "jolies" visuellement. Ça se rapproche presque plus du clip que du film classique.

  • # Démo

    Posté par  . Évalué à 8.

    Bref, vous avez fait une démo :-)

    Joli travail !

    • [^] # Re: Démo

      Posté par  . Évalué à 3.

      C'est à peu près l'idée, oui !

    • [^] # Re: Démo

      Posté par  (Mastodon) . Évalué à -1.

      ouais enfin l'idée des démos c'est de s'imposer une contrainte forte, en général la taille de l'executable et des données (64kB).

      • [^] # Re: Démo

        Posté par  . Évalué à 0.

        En effet. D'autant plus qu'en l’occurrence, c'est bien un fichier vidéo qui est le résultat, et non un exécutable. Il y a bien eu un travail de montage vidéo "classique", ce qui n'est pas le cas dans une démo.

      • [^] # Re: Démo

        Posté par  . Évalué à 10.

        Et de pousser une plateforme aux limites pour lui faire faire des choses impensables.
        L’idées des contraintes fortes c’est de recréer un peu artificiellement les contraintes de ces plates formes en matière de mémoire. Du coup là on est pas du tout loin de ces idées: la plateforme n’est plus un ordi vintage, mais un jeu dont il s’agit de détourner les logiciels et les formats pour faire autre chose de pas nécessairement prévu à la base.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.