WRC 6

À la fin de ma formation à Créajeux, j’ai du chercher un stage pour valider mon diplôme, c’est ainsi que je me suis retrouvé chez Kylotonn. Le studio avait sorti WRC 5 auparavant (jeu avec lequel il avait récupéré la licence) et commençait la production du 6. WRC 6 à été le premier jeu professionnel sur lequel j’ai travaillé et j’était très content de commencer par celui là, étant satisfait de travailler sur un jeu de course (un des style que j’affectionne) mais aussi d’utiliser le C++ sur un moteur propriétaire. Ce dernier, répondant au nom de Kt Engine, m’a permis de découvrir autre chose que Unity ou Unreal, que j’avais utilisé à l’école.

WRC 6 est un jeu de rallye où l’on peut jouer en solo en faisant des courses ou dans le mode carrière, ou en multijoueur local ou en ligne.

J’ai principalement effectué des tâches de gameplay dont voici certaines.

Gameplay des courses en versus

Le jeu proposait des pistes spéciales dans certains pays où le tracé bouclait sur lui même de manière à avoir deux parties de la piste côte à côte la majeure partie du temps de la course. Une de mes tâches les plus longues et compliquées que j’ai réalisées à été de mettre en place et faire marcher tout le gameplay de versus sur ces pistes. Ce dernier, ce jouant à deux, consistait à faire apparaître chaque voiture sur une partie différente de la piste pour qu’elles démarrent côte à côte mais avec une différence de tracé.

Comme on peut le voir sur ces deux images, chaque joueur démarre à la moitié du tracé de l’autre. Ils n’auront donc pas les mêmes difficultés au même moment de leur course.

Ce mode de jeu a posé de nombreux problèmes car il n’était pas prévu par le système gérant la course. Par exemple, quand le deuxième joueur traversait son premier checkpoint, il était téléporté par les vérifications anti-triche car ce n’était pas le premier prévu dans la course dans sa version de base, le joueur ne pouvait donc pas faire sa course. Un autre problème a été posé par la spline servant à indiquer le tracé à suivre au véhicule, lui disant si le joueur s’éloigne trop ou non, là encore le deuxième joueur pouvait se faire téléporter à de mauvais endroits de la course à des moments où il n’aurait pas du.

J’ai donc fait en sorte que l’on puisse donner une deuxième spline au composant de course pour que le deuxième joueur l’utilise et j’ai mis en place un système de filtres sur les checkpoints pour qu’ils ignorent l’un ou l’autre des joueurs à leur passage. D’autres composants ont posé problème comme d’autres checkpoints servant uniquement à éviter la tricherie ou le système d’affichage des indications du copilote que l’on a filtré de la même façon.

Le HUD du deuxième joueur a aussi posé problème puisqu’il affichait son curseur de progression au mauvais endroit, j’ai donc changé le calcul de la position de ce dernier en prenant en compte la position de la ligne de départ sur la spline de la course.

Suivi de la progression des véhicules et interface

L’ajout du versus et des pistes aux tracés spéciaux ont amenés de nombreux problèmes quand au suivi de la progression des véhicules au fil de la course. Le calcul dont j’ai parlé plus tôt consistant à prendre en compte la position de la ligne de départ sur la spline devant être fait à plusieurs endroits car servant à de nombreuses choses, j’ai donc créé une structure pour s’en occuper et permettre de seulement lire ses calculs aux moments appropriés.

On peut voir, sur l’image ci-dessus, la prise en compte de la position de la ligne de départ par rapport au début de la spline.

Cette structure ne contenait au départ que la position de départ, la position du véhicule adaptée à celle-ci et la taille totale de la spline de course, ceci permettant de re-calculer la position des checkpoints et autres déclencheurs posés sur la route. Chaque structure étant propre à un véhicule, il n’y avait donc plus de problèmes relatifs à la position du deuxième joueur pour suivre sa progression où le faire réapparaître au bon endroit.

Accomplissements et succès

Le jeu possède un système d’accomplissements interne au jeu qui récompensent le joueur pour avoir accompli certaines actions lors de ses courses. Certains de ces accomplissements sont aussi des succès (ou trophées) pour Steam, le Xbox Live ou le PSN.

J’ai passé un bon moment à rendre le déblocage de tous ces accomplissements possible par la mise à jour de certains déjà présent ou l’ajout de nouveaux, tous demandant de traquer ce que fait le joueur un peu partout dans le jeu, que ce soit dans certains menus (modifier les réglages de la voiture, regarder les crédits…) ou en jeu (gagner une course, faire un tonneau, finir avec une crevaison…). Heureusement, beaucoup d’entre eux ce géraient au même endroit, se débloquant à la fin des courses, mais d’autres ont demandés plus de minutie. J’ai fini par créer un Google Sheet gardant la trace de mes avancements dans cette tâche qui pouvait facilement me perdre.

Une partie importante de cette tâche à aussi été de faire en sorte que la ré-obtention des succès soit possible en cas de remise à zéro de ces dernier, comme on peut le faire sur PlayStation. Certaines conditions sont donc passées de “gagner une course” à “gagner une course ou plus”, la fonction de déblocage se chargeant de vérifier si le succès était déjà obtenu ou non.

Tâches sur le son

À plusieurs reprises, j’ai travaillé sur les effets sonores du jeu.

Premièrement, j’ai fait en sorte que les sons des roues à gauche et à droite soient séparés, permettant d’avoir, par exemple, le son du goudron à gauche et de l’herbe à droite quand le joueur commence à sortir de la route. Avant, on utilisait l’index de surface le plus haut (disons, 0 pour le goudron, 1 pour l’herbe, 2 pour la neige, etc..) entre les surfaces détectées sous chaque roue, et on jouait le son correspondant au milieu de la voiture. Séparer les sons entre gauche et droite permet un peu plus de réalisme et d’immersion. Pour rendre cela possible, j’ai du dupliquer bon nombre des variables servant à gérer les sons des roues, comme les valeurs de dérapage, la force de rotation appliquée aux roues ou les valeurs de freinage. J’ai aussi doublé les instances d’événements sonores pour pouvoir joueur deux fois le même son quand les surfaces sont les mêmes des deux côtés.

Ensuite, j’ai changé les événements sonores servant aux indications du copilote pour n’utiliser que des sons chargés au moment où on en a besoin puis streamés. Une telle utilisation m’a fait changer la gestion de ces son, notamment sur la récupération de leurs informations comme la durée, accessible seulement quand le son est chargé. Il a aussi fallu modifier un peu leur chargement dans le moteur car ils étaient déchargés automatiquement après les avoir joués et n’étaient chargés qu’au moment d’être jouer alors que je voulais faire ça avant pour certains. Les sons d’indications étant stockés dans une pile au fur et à mesure que le joueur avance, on voulait les charger au moment de la détection pour n’avoir qu’a les jouer le moment venu.

J’ai aussi ajouté les voix de tutoriel dans les menus qui décrivent au joueur ce qui s’y passe. Pour ça, j’ai ajouté un nouveau bus sonore enfant d’un des quatre déjà présents (Musique, Effets sonores, Voix et Interface) et j’ai géré les sons de la même manière que les indications du copilote en les chargeant quand j’en ai besoin.

Enfin, j’ai mis à jour le système servant à gérer la réverbération du son en forêt. Le code déjà présent parcourait en permanence les chunks (zone cubique contenant des objets dans le jeu) autour du joueur pour y détecter les arbres présents, ce qui était très lourd en performances. J’ai utilisé une boite de collision orientée (OBB) autour du véhicule pour remplacer ce code et détecter les arbres présents uniquement dans cette zone et calculer un poids relatif à l’impact qu’aura chacun sur la réverbération du son. Une fois les poids de chaque côté du véhicule dépassent les seuils minimaux requis, une valeur de réverbération est calculée.

Mise à jour des raccourcis clavier / manette

Certains raccourcis étaient déjà présent mais sur les mauvaises touches, d’autres tout simplement absents. La partie importante de cette tâche à été de créer le raccourcis de défilement des caméras de gameplay dans le sens inverse de celui déjà présent, pour que le joueur puisse naviguer dans les deux sens pour atteindre la vue de son choix. Les fonctions s’occupant du changement de caméra n’étant prévues que pour aller dans un seul sens, j’ai du en adapter certaines et en créer de nouvelles, ce qui a prit pas mal de temps au final.

J’ai accompli d’autres tâches plus mineures que je ne détaillerais pas ici, comme l’application du rougeoiement des freins en fonction de leur température ou l’activation de particules quand le joueur roule sur la jante de sa voiture.

J’ai beaucoup apprécié ce projet comme première expérience professionnelle et l’ambiance avec les autres employé(e)s était très bonne. J’ai trouvé la majeure partie de mes tâches intéressantes et valorisantes, ce qui m’a aidé à toujours donner le meilleur de moi même.

J’ai aussi été très honoré de retrouver mon nom dans un jeu commercialisé pour la première fois !

Bande annonce

Captures d’écran

WRC6 - Tutorial
WRC6 - Argentina
WRC6 - Versus Karlstad
WRC6 - Versus Fernet Branca
WRC6 - Replay Fafe
WRC6 - Split screen
previous arrow
next arrow
 
WRC6 - Tutorial
WRC6 - Argentina
WRC6 - Versus Karlstad
WRC6 - Versus Fernet Branca
WRC6 - Replay Fafe
WRC6 - Split screen
previous arrow
next arrow
Shadow

Liens