Création des sorts

Je travaille à dompter le GAS, le système EPIC pour gérer les actions qui me simplifie le travail car il gère la réplication pour que tout le monde reçoive les actions des joueurs et la prédiction, qui permet de lancer un sort alors que le serveur n’a pas encore accordé le droit de le faire avant de résoudre les conséquences du sort – qui pourra fort bien n’avoir aucun effet s’il est rejeté par le serveur, pour des raisons diverses comme le lag.

Je n’avais jusqu’ici créé qu’un seul sort, une attaque de mêlée générant un critique garanti, me reste à implémenter les choses plus compliquées, buffs, debuffs, soins et dégâts sur la durée et sorts conditionnels/complexes. Ca ne se passe pas trop mal mais c’est complexe, je dois associer des blueprints à du C++ en tel nombre que cela ressemble à un puzzle. Je vais travailler là-dessus dans les jours qui viennent, ça va probablement me prendre assez longtemps mais il est indispensable de répéter les opérations pour maîtriser le flux de travail. J’adapte au fur et à mesure une page de feuille de route pour éviter de reconstruire le processus à l’aveugle quand je ne l’aurai pas utilisé depuis longtemps. Ca se présente bien, le chapitre GAS sera bientôt derrière moi !

Comment est-ce que je fais ?

Je suis en train de traiter quelques problèmes que j’aurais dû traiter plus tôt, c’est l’inconvénient d’être seul, je ne peux pas tout faire simultanément. Il m’arrive de construire un système en faisant abstraction de fonctions de bas niveau pour me concentrer sur des aspects de plus haut niveau. Par exemple, je n’ai pas traité le problème des BoE (lier un objet quand on l’équipe), BoP (lier un objet quand on le ramasse) ni de l’apprentissage de sorts à partir de parchemins. Je me suis concentré sur la construction des tables, l’API node.js et l’affichage du livre de sorts en créant manuellement quelques entrées dans la base de données.
Maintenant, je dois reprendre le code pour traiter, c’est le problème du jour, l’apprentissage des sorts à partir des parchemins trouvés comme butin dans le monde. Cela m’impose de remonter au code en blueprints de gestion des clics sur les objets d’inventaire et de là vers le code C++ pour traiter les mouvements d’objets entre Unreal et la base de données, en SQL, en passant par l’API, en javascript.
Bien entendu, je ne sais plus du tout, le temps ayant passé, où se trouvent tous ces segments de code ni comment ils s’articulent.
Alors, j’utilise l’IA comme canard en caoutchouc : je lui dis ce dont je crois me souvenir, elle me répond ce qu’elle comprend et ce qui lui manque, ça m’aide à chercher, je lui renvoie les infos que j’ai trouvées et quand j’ai démêlé l’écheveau je précise le code que je dois écrire, je lui donne l’architecture, elle me propose une solution, je prends ou en rediscute et à la fin de la journée j’ai un code qui fonctionne et un problème de moins à traiter. Il n’en reste plus beaucoup, mais il en reste !
Ce qui m’étonne, c’est que j’arrive à m’y retrouver dans ce méandre en passant d’un language et d’un outil à l’autre. C’est dur, ça fume, mais j’y arrive. Cela prouve tout l’intérêt d’être à la manoeuvre pour toutes les phases du développement : un ingénieur qui prendrait des librairies de code fonctionnel sur une étagère, ce qui est la tendance dans l’informatique moderne, ne connaîtrait jamais les rouages internes. C’est ce qui explique, en partie, la philosophie du patch éternel : le code n’est plus maîtrisé. Et donc, les failles de vulnérabilité surviennent, des librairies entrent en conflit avec d’autres et on ré-invente la roue perpétuellement.
Il est quand même temps que ça se termine, j’arrive à la limite du supportable et j’en viens à passer plus de temps à me motiver à replonger dans le code qu’à l’écrire !

Liste des bugs vide

J’ai corrigé tous les bugs connus, il n’en restait que deux : la présence inexpliquée d’une plante dans le loot d’un monstre qui n’en portait pas et la chute des corps à la mort.

Pour la chute en ‘ragdoll’, ou poupée de chiffons, ce n’était pas bien difficile, j’ai ajouté une impulsion aléatoire aux corps qui tombent, en moins d’une heure c’était fait pour que cette chute soit crédible.

Pour la plante, c’était autre chose. J’avais déjà essayé de régler ce bug par le passé, en attaquant le problème à la racine, soit au C++, mais cette fichue plante finissait toujours par revenir un jour ou l’autre ! En fait, je n’avais pas déroulé complètement la table de loot du mob et j’avais laissé une chance sur deux de dropper un objet d’une sous-table de loot. Con comme la lune.

Bref, je suis en train de nettoyer tout mon C++, j’ai encore trop souvent des #include dans les fichiers headers là ou une simple forward déclaration des classes suffirait, ce qui allonge mes temps de compilation. Entre nous, avec mes commandes bash, Visual Studio, l’UHT d’Unreal, Git et le reste : l’informatique moderne, c’est encore le moyen-âge !

Respawn

Je corrigeais les quelques bugs que j’ai encore sur Trello et je me suis rendu compte que je n’avais jamais terminé le respawn. Ce n’est pas un bug, mais il fallait bien le faire un jour. J’ai donc codé toute la mécanique de dissimulation de l’interface, blocage du clavier et de la souris et création d’un menu à la mort, qui pour le moment n’a qu’une seule option : retour au sanctuaire !
Ca m’a quand même bien rappelé Althea, je créerai d’ailleurs probablement quelque chose qui s’approche de nos anciens sanctuaires. Cela n’a pas été sans mal mais, au final, ça c’est bien mis en place, le joueur décédé respawn à son sanctuaire full points de vie et les mobs ne lui courent pas après.
C’était aussi un peu spécial, ça, tant que le mob a le joueur dans le collimateur, mort ou pas, il lui fonce dessus, par-delà les montagnes et les océans s’il le faut. Bon, c’est marrant, mais c’était quand même bof. J’ai donc, dans la foulée, revisité le Behavior Tree des mobs pour qu’ils oublient les cibles mortes et tant que j’y étais je les fais revenir à leur point de spawn s’ils s’en écartent de plus d’une certaine distance. Le côté rigolo, contrairement à WoW, c’est que s’ils rencontrent un joueur sur le chemin, ils l’aggro direct. Normalement, on ne fait pas comme ça, mais ça me fait marrer, c’est toujours fun de laisser un pack de mobs foncer sur un gars qui s’assied son café à la main. C’est que je n’ai pas si souvent l’occasion de rigoler en développant le jeu, ça restera comme ça !

Foley

Ca m’est tombé dessus, comme ça, en ajoutant des notifications dans un montage : faudrait mettre des sons de combat ! Et puis aussi des sons de pas. Et puis de sons de voix. Bref, je allé voir ce que j’ai en stock et on ne va pas la faire longue : je n’ai que des collections de sons faites par Pierre et Jacques, sans rapport entre eux, ça ne peut donner qu’un résultat Frankenstein, j’oublie.

Il vaut mieux que je m’oriente vers le bruitage. Ca s’appelle foley en anglais, du nom du gars qui a jeté les bases du bruitage moderne, semble-t-il. Ca peut être marrant. J’ai une bibliothèque de sons de pas, je vais voir ce que je peux en faire mais pour le reste je vais devoir aiguiser mes sens d’écoute des bruits du quotidien pour les associer aux sons nécessaires pour le jeu. Et puis, dans mon bureau, pour toujours avoir le même environnement, je m’amuserai à jeter une poignée de fourchettes dans un torchon pour faire un bruit d’armure, chiffonner des étoffes, frotter des cailloux, bref, expérimenter.