PORTFOLIO
Overlay - JDR Arkonautes

Apercu général

VIDEO - Présentation de l'overlay JDR Arkonautes

Depuis quelques temps, on joue à plusieurs et à distance à une campagne de jeu de rôle. Petit à petit, notre lore (la mythologie et l’histoire de notre jeu) s’est étoffé et j’ai fini par en faire un overlay assez complexe au final.

On joue via FoundryVTT, un service qui permet de jouer à distance, de gérer sa fiche de personnage, jeter les dés. On joue à Dungeon World, qui utilise le système de jeu PBtA.

C’est un overlay assez complexe, tant au niveau graphique que technique. D’une part pour l’intégration avec FoundryVTT pour récuperer des données de jeu, d’autre part pour la construction de l’overlay qui comprend une grande part de développement.

CREDITS

  • Illustrations originales des personnages et des objets : Randallflagg_
  • Création de l’univers : Kobal

Récupération et affichage des données sur l’overlay

La pierre angulaire de cet overlay est la synchronisation entre les visuels affichés à l’écran et les informations de jeu de FoundryVTT.

J’ai fait beaucoup de recherches là dessus et je n’ai trouvé personne proposant quelque chose de similaire, j’ai donc beaucoup galéré pour développer le système.

L’overlay affiche les infos des personnages (points de vie, armure, stats…) en temps réel.

IMAGE - L’overlay affiche les infos des personnages (points de vie, armure, stats…) en temps réel

Des premiers tests difficiles…

Lors des premiers tests, j’ai réussi à extraire des informations venant des logs.

A chaque nouvelle session de jeu, des fichiers consignent tous nos événements de jeu : changement de points de vie, modification d’une statistique, jets de dés…

J’ai donc commencé par faire un script qui, toutes les 2 secondes, récupérait dans ces fichiers les nouvelles informations pour chaque personnage, ainsi que le dernier jet de dés.

Dès qu’un nouvel événement avait lieu, comme un changement de points de vie, le log consignait une nouvelle entrée qui ressemble à ça. :

Un exemple tiré du log, un gros pavé de texte non formatté, avec diverses statistiques de personnage dedans (pv, armure, argent…)

IMAGE - Un exemple tiré du log, un gros pavé de texte non formatté, avec diverses statistiques de personnage dedans (pv, armure, argent…)

Dans cet amas de données, je pouvais récupérer des valeurs type : Points de vie, Points de vie max, Armure, Statistiques (Force, Dextérité…) pour ensuite les afficher dans l’overlay.

Les premiers tests pour l’overlay ressemblaient à ça :

Premier test, changer les valeurs du personnage modifiait le fichier HTML contenant les infos à gauche

IMAGE - A droite, changer les valeurs du personnage modifiait le fichier HTML contenant les infos à gauche

Premier test d’affichage des jets de dés, avec un visuel plus poussé

IMAGE - A gauche, les jets de dés sur Foundry s’affichent sur les premiers tests graphiques de l’overlay à droite

Cette méthode était clairement assez laborieuse et bancale. Certains logs présentaient souvent des problèmes d’encodage de caractères qui pétaient tout mon script et le tout manquait de réactivité, car je ne pouvais pas récupérer les infos en temps réel.

Une autre limitation venait du fait que si FoundryVTT est hébergé sur un serveur à distance, il y a quelques galères de configuration pour pouvoir accéder à ces logs de l’extérieur (coucou le Cross-Origin Resource Sharing).

Une seconde méthode plus probante (pour l’instant)…

Au fur et à mesure de mes tests, j’ai commencé à retravailler sur une méthode qui n’avait pas marché jusque-là.

J’ai repéré le “socket” utilisé par FoundryVTT, un port de communication qui gère l’échange de données entre le serveur le client web et j’ai codé un script qui surveille les événements durant le jeu pour récupérer les infos en jeu.

Quelques infos des jets de dés récupérés sur la console de NodeCG

IMAGE - Quelques infos des jets de dés récupérés sur la console de NodeCG

Cette méthode n’est pas parfaite mais à deux avantages : une récupération plus simple des infos et en temps-réel !

Cela fonctionne plutôt bien mais le principal obstacle à l’heure actuelle est la difficulté de pouvoir décliner simplement cette méthode sur d’autres systèmes de jeu, pour l’instant je ne l’utilise que sur le système PBtA.

Premiere maquette visuelle de l’overlay

Côté graphisme, j’ai mis beaucoup de temps à trouver la bonne idée car les premiers tests graphiques ne me plaisaient pas vraiment.

Pour moi, un des soucis de certains overlays est le fait de vouloir afficher tout le temps les caméras des joueurs et des joueuses. C’est sympa mais souvent cela prend souvent énormément de place et alourdit énormément le rendu visuel. Afficher 4 ou 5 webcams rend l’overlay assez vite brouillon.

J’ai tout de même fait des premiers tests assez satisfaisants mais ce n’est pas la direction vers laquelle je souhaitais aller, par exemple :

VIDEO - Presentation de la premiere maquette de l’overlay. Chaque personnage a sa scene avec une camera et sa fiche de perso. Une autre scène affiche différentes configurations de caméras en face à face.

Au niveau de l’identité graphique, j’avais commencé à décliner certains éléments (avatars, cartouches de personnage…) sur Figma au format SVG, pour pouvoir ensuite dynamiquement les remplir avec les données que je récupérais du jeu.

Les templates graphiques réalisés sur Figma

IMAGE - Les templates graphiques réalisés sur Figma.

Les premiers tests d’affichage des jets de dés sur l’overlay

IMAGE - Les premiers tests d’affichage des jets de dés sur l’overlay

Les différentes cartouches des personnages

IMAGE - Les différentes cartouches des personnages

Le visuel définitif de l’overlay

Après pas mal de tests, j’ai fini par creuser une idée d’overlay dans le style d’un petit théâtre de marionnettes, type “guignol”. Un petit théâtre avec un fond, des lumières et où les personnages sont représentés par des petites poupées/marionnettes.

On retrouve principalement deux types de scènes : une scène principale et une scène Focus.

La scène principale

VIDEO - La scène principale de l’overlay, qui ressemble toutes les marionnettes des personnages

La scène principale rassemble tous les personnages et chacun dispose d’une petite cartouche avec son nom, sa classe, ses points de vie et son armure. On ne le voit pas ici, mais la scène peut afficher d’autres éléments, comme un panneau pour afficher les résultats des jets de dés par exemple.

Les scènes “FOCUS”

Les scènes “FOCUS” servent à montrer un personnage en particulier.

VIDEO - Une scène Focus pour chaque personnage, avec son avatar et ses infos

Les scènes “Focus” (dans mon jargon), servent à mettre en avant un personnage. Chaque scène montre donc le personnage, son blason, un fond personnalisé et un carton récapitulatif des statistiques.

J’ai paramétré une transition de scène particulière, pour faire en sorte que le personnage apparaisse du dessous et le carton de stats par la droite ou par la gauche (c’est bête mais c’est pas si simple à faire).

Affichage des jets de dés

Une grosse partie du travail a été de trouver un moyen sympa d’afficher les résultats des jets de dés des joueurs et des joueuses.

Un panneau avec les résultats du jet de dés se déploie en haut de l’écran

IMAGE - Un panneau avec les résultats du jet de dés se déploie en haut de l’écran

J’ai crée un template de panneau au format SVG, et codé un script qui permet de récupérer certaines infos quand un jet de dé est fait sur FoundryVTT. Cela active une animation qui fait apparaitre un petit panneau du haut de l’écran.

Le script me permet de récupérer et d’afficher les informations suivantes :

  • Le nom de la statistique ou de la compétence utilisée
  • La formule du jet de dé (par exemple : 2d6+2, 2d6-1).
  • Le détail des résultats des dés.
  • Le résultat total.
  • Le personnage qui a fait l’action suivi d’une phrase personnalisée

En fait, récupérer ces données via le socket a été plus dur que prévu. Je pensais que les données seraient facilement accessibles, mais elles ne sont pas présentés de la même manière selon s’il s’agit d’un jet public, d’un jet basé sur la fiche de personnage, ou d’un jet du maître de jeu, etc.

VIDEO - Les jets de dés sur FoundryVTT s’affichent en temps réel sur l’overlay

J’ai également mis en place une liste de phrases personnalisées qui s’affichent en fonction du personnage, de la compétence et du résultat du jet de dés.

Le système de jeu utilise principalement deux dés à six faces et des modificateurs (-1, +1, +2…). Les résultats sont classés en trois catégories :

  • Entre 2 et 6 : le jet est raté
  • Entre 7 et 9 : le jet est mitigé. L’action est réussie, mais avec une contrepartie (par exemple, crocheter une serrure mais en faisant du bruit).
  • 10 et plus : le jet est parfaitement réussi (avec des confettis en prime)

J’ai donc listé de nombreuses phrases qui se déclenchent aléatoirement en fonction du score et de la compétence.

Une liste de phrases personnalisées pour la compétence “FORCE”, au format JSON

IMAGE - Une liste de phrases personnalisées pour la compétence “FORCE”, au format JSON

Animation des marionnettes et indicateur de voix

Pour représenter les personnages, j’utilise les avatars dessinés par RandallFlagg_, que j’ai ensuite décliné sous forme de marionnettes sur Figma.

Les marionnettes s’activent et une bulle de dialogue apparait quand le joueur ou la joueuse prend la parole

GIF - Les marionnettes s’activent et une bulle de dialogue apparait quand le joueur ou la joueuse prend la parole

Comme je ne souhaite pas afficher les webcams des joueurs et des joueuses, il faut trouver un moyen de dynamiser et montrer qui parle, et quand. Ainsi quand un joueur ou une joueuse parle, un système permet d’activer une animation de la marionnette et afficher un indicateur vocal.

Je décline la marionnette dans un fichier HTML avec deux animations : une simple animation de flottement au repos, mais une animation de mouvement quand elle est “active”. Une petite bulle animée s’affiche également.

Pour faire cela, j’ai crée un salon vocal VDO Ninja et j’utilise un système de liens personnalisés pour récupérer séparément la voix de chacune des personnes connectées.

Ainsi, je récupère séparément les voix via une source “Navigateur Internet”, qui s’affichent ensuite dans le mélangeur audio d’OBS.

Sur OBS, les voix sont récupérées via une source “Navigateur Internet” et apparaissent ensuite dans le mélangeur audio

IMAGE - Sur OBS, les voix sont récupérées via une source “Navigateur Internet” et apparaissent ensuite dans le mélangeur audio

Ensuite j’utilise Advanced Scene Switcher, un plugin qui permet de créer des macros et des actions automatiques dans OBS. Ainsi j’ai crée une macro pour chaque joueur et joueuse :

Si le volume de la voix est supérieur à un certain seuil pendant 0.5s, alors masque la marionnette en mode “repos”, mais affiche la marionnette en mouvement, ainsi que la bulle de dialogue

Et inversement si la personne arrête de parler.

La macro utilisée par le plugin “Advanced Scene Switcher” pour animer la marionnette au son de la voix

La macro utilisée par le plugin “Advanced Scene Switcher” pour animer la marionnette au son de la voix

IMAGE - La macro utilisée par le plugin “Advanced Scene Switcher” pour animer la marionnette au son de la voix

Module de changement des décors

Pour renforcer l’aspect pièce de théâtre, j’ai imaginé un petit système de changement du décor qui vont et viennent depuis le haut de la scène.

VIDEO - Le module NodeCG à droite permet d’afficher et masquer différents objets et décors

J’ai donc commencé à coder sur NodeCG un module de gestion du décor pour faire apparaitre différents types de fond (taverne, forêt, donjon…), mais également des objets animés (torches, nuages, lune…)

J’ai également commencé à créer des presets, des configurations toutes faites en un clic, comme par exemple un fond de forêt avec des nuages et la lune.

Les personnages dans un décor de forêt, avec des nuages, la lune et un effet de pluie

IMAGE - Les personnages dans un décor de forêt, avec des nuages, la lune et un effet de pluie

Des confettis pour les effets de sang et de soin

Quelques confettis rouges volent quand un personnage prend des dégâts

IMAGE - Quelques confettis rouges volent quand un personnage prend des dégâts

J’utilise la librairie Javascript “Canvas Confetti” pour générer des gerbes de confettis et illustrer les soins et les dégâts. Chaque effet est accompagné d’un petit visuel qui décompte les PVs reçus ou gagnés.

VIDEO - Le système de confettis en action, quand un personnage gagne ou perd des points de vie

Pour aller plus loin, j’ai mis en place trois configurations pour l’effet de sang, selon le nombre de dégâts pris :

  • Entre 1 et 4 dégâts reçus : petit jet de confetti
  • Entre 4 et 8 dégâts reçus : jet moyen avec plus de dispersion
  • Plus de 9 dégâts reçus : jet puissant avec beaucoup de confettis.