Le problème
Dans les campagnes multijoueur de Total War: WARHAMMER III, chaque joueur doit avoir sa propre faction. Difficile alors d'initier un ami, chaque bataille est doublée en coopération, et un 2 contre 2 mobilise quatre factions. Le salon refuse deux joueurs sur la même faction, et les outils de modding du jeu n'y peuvent rien.
Ce que j'ai construit
Un mod en deux parties. La partie native est une DLL en C qui repère ses cibles dans le jeu en cours d'exécution grâce à des signatures d'octets et les modifie en mémoire, sans jamais toucher à l'exécutable sur le disque. Sept patchs permettent à plusieurs joueurs de choisir la même faction dans le salon, gardent la faction sous contrôle humain quand un partenaire part, replacent chacun sur sa faction au chargement d'une sauvegarde commune, font attendre la fin de tour de tous les joueurs et rendent le don d'unités possible dans les deux sens pour se répartir une armée. La partie Lua embarque la DLL dans le pack du mod, l'installe et la charge au démarrage, puis gère la vérification des versions entre joueurs, l'indicateur d'état du salon et les journaux.
Défis techniques
- Ni code source, ni API. Tout part de la lecture du code machine du jeu. Les cibles sont cherchées uniquement dans le code non modifiable, pour qu'une mise à jour ne puisse jamais faire écrire un patch au mauvais endroit.
- Échouer proprement. Si une signature ne correspond plus après une mise à jour, le patch reste désactivé et l'indicateur du salon le signale. Une version non testée reste jouable, mais signalée.
- Tester sans jouer. Un test Python désassemble une copie du jeu avec Capstone et vérifie chaque cible de patch : une nouvelle version du jeu s'évalue sans même la lancer.
- Deux PC, un seul tour. Les tours, batailles et sauvegardes partagés ne révèlent leurs bugs qu'avec deux vraies machines : c'est ainsi que le mod a été testé.
Résultat
Testé à deux joueurs sur deux PC, en version 9.0.4 du jeu, dans la campagne Immortal Empires. Le code source est public sous licence MIT, et la publication sur le Steam Workshop est en préparation.