OLD THIESS: THE WEREWOLF'S TRIAL
Pour notre projet final dans le cadre du D.E.S.S. en design narratif du NAD, nous assurons le design et la production d'un jeu inspiré de la transcription du procès d'un loup-garou ayant eu lieu en Livonie au 17e siècle. Lupus Dei est un platformer 2D axé sur le combat et l'exploration, avec un accent sur l'aspect narratif. Le jeu explore les racines du mythe du loup-garou, et la relation que l'on entretient avec notre bête intérieure.
Ce que j'ai fait dans ce projet:
Design d'un niveau de style Metroidvania avec des salles interconnectées contenant des ennemis, des ressources, un NPC, un mini-boss, un boss et des éléments de narration environnementale.
Design et programmation de l'architecture du jeu et des transitions, des mouvements et mécaniques du personnage, du système de combat et comportements des ennemis, des systèmes de dialogue, popup, tutoriel et progression.
Collaboration pour la construction du lore, des personnages et de l'histoire du jeu, et écriture du dialogue pour les 4 fins possibles.
Le jeu est encore en production et sortira en avril/mai 2025.




FAIT AVEC UNITY
Level Design - Programmation - Design Technique
La trame narrative du jeu est liée au procès du vieux Thiess, qui prend place en 1691. Alors que les villageois sont appelés à la barre pour témoigner, ils racontent les événements qui les ont menés à demander l'aide du vieil homme. Le.a joueur.se contrôle ensuite Thiess sous sa forme de loup-garou lors de flashbacks, et explore 3 niveaux se déroulant dans l'Enfer de Dante.
Les buts du.de la joueur.se sont:
Amasser du grain volé afin de le ramener au village.
Compléter une quête pour aider le villageois.
Vaincre un boss pour acquérir un morceau du contrat liant secrètement l'évêque Nickolaïs au Diable.
Selon le succès des objectifs du grain et de la quête, le support des villageois augmente ou diminue, menant ultimement à 3 fins différentes.
Le succès de l'objectif du boss n'a pas d'impact sur le support des villageois, mais si le.a joueur.se parvient à vaincre les 3 boss, une quatrième fin secrète est déverrouillée.
Concept

LEVEL DESIGN
Concevoir un niveau de style Metroidvania avec 10-15 salles interconnectées.
Concevoir la configuration de chaque salle pour refléter l'augmentation de difficulté.
Placer les obstacles et les ennemis dans chaque salle.
Inclure une salle sécuritaire pour le sanctuaire de Mélusine près du centre du niveau pour y accéder plus facilement.
Inclure une salle pour le démon de la quête Aeshma.
Inclure une salle pour le boss.
Utiliser de l'art environnemental fait par nos artistes et de l'éclairage pour souligner la distinction entre les différentes parties du niveau.
Placer dans le niveau des objets de narration environnementale qui peuvent être examinés par Thiess pour obtenir du lore.
Tâches et contraintes
Explorer la verticalité dans la configuration globale du niveau autant que dans les salles individuelles.
Créer un niveau intéressant et non-linéaire avec du backtracking et des raccourcis pour permettre une exploration plus organique.
Créer des salles avec des configurations, des obstacles, de l'art et de l'éclairage différents, afin de permettre aux joueur.se.s de s'orienter plus facilement.
Garder des proportions et distances véritables entre les salles et leurs connexions, afin de permettre aux joueur.se.s d'user de leur perception de l'espace.
Mes buts
Le niveau que j'ai conçu représente le Cinquième Cercle de l'Enfer de Dante, un marécage où les âmes qui ont péché par la colère se battent entre elles pour l'éternité. C'est le deuxième de 3 niveaux, donc les mécaniques et systèmes ont déjà été introduits, et ce niveau sert à augmenter la difficulté et l'intensité pour tester davantage les habiletés du.de la joueur.se.
Le démon Aeshma: Un mini-boss se cachant dans la section la plus à l'est du niveau. Le vaincre complète la quête du villageois pour cet acte.
Concept





Le sorcier Illmedous: Le boss, un sorcier puissant ayant établi son repaire dans les cavernes infestées de poison dans la partie la plus profonde du niveau. Le vaincre donne à Thiess un morceau du contrat satanique.
Mélusine: Une sorcière PNJ alliée de Thiess, son sanctuaire est niché dans les cavernes de Furies' Den, au centre du niveau. Le.a joueur.se doit passer par Furies' Den afin d'atteindre le démon, tout comme le boss, lui donnant ainsi l'opportunité d'amasser des informations importantes à propos des objectifs du niveau.
Points d'intérêt
J'ai conçu le niveau pour être plus vertical, donnant ainsi une meilleure impression de s'enfoncer plus profondément en Enfer, et imposant un plus grand défi au niveau du platforming. Il comprend 15 salles, et 7 zones générales:
Caves of Rage: Un petit réseau de cavernes surplombant le marécage. Il sert de première zone plus facile du niveau.
Stygian Swamp: Le marécage en soi. Une grande aire ouverte dont le sol est couvert d'eau empoisonnée, rendant la zone dangereuse à traverser.
Festering Ash: Un immense arbre ayant poussé du marécage à l'intérieur d'un longue caverne verticale. Le zone Heart of Hatred était accessible à partir de ses racines, mais l'accès a récemment été bloqué par Mélusine.
Furies' Den: Mélusine y a établi son sanctuaire. Encore une fois, sa proximité protège Thiess, à qui elle peut aussi offrir des informations utiles.
Shrine of Satan: Des cavernes infestées par des plantes tordues et épineuses. Un démon en a fait son antre et commande les diablotins de cette région.
Maze of Madness: Un réseau de tunnels sombres, sinueux et étroits qui est un véritable nid de Chorts. Passer à travers cette zone est désormais le seul moyen d'atteindre la zone finale, Heart of Hatred.
Heart of Hatred: De grandes cavernes situées au bas du niveau, dans lesquelles des rivières de poison s'écoulent. Le sorcier Illmedous y rôde.
Configuration




Carte in-game du niveau 2
Toutes les scènes du niveau 2 dans Unity
2 chemins initiaux à partir du début.
Configuration simple avec du platforming facile.
Navigation et chemins
Si le.a joueur.se se rend en bas de Festering Ash, il.elle peut découvrir que le chemin est bloqué par un bloc détachable qui peut être brisé et abaissé à partir de l'autre côté.
Configuration verticale avec des aires ouvertes et des plateformes semi-solides.
La configuration guide naturellement le.a joueur.se vers le Stygian Swamp et le sanctuaire de Mélusine dans Furies' Den, où il.elle peut acquérir de l'information par Mélusine.
Des plateformes semi-solides au-dessus de l'eau empoisonnée, beaucoup de geysers.
Un autre bloc détachable servant de raccourci qui peut être ouvert à partir de la salle du démon.
(oui c'est un bug de rendering que je n'ai pas encore réglé...)
Le chemin qui mène vers le Shrine of Satan grimpe jusqu'au démon Aeshma. Lorsque celui-ci est battu, il est possible d'ouvrir le raccourci ramenant au Stygian Swamp.
Beaucoup de pics, beaucoup de platforming sans de plateformes semi-solides.
Le chemin à travers le Maze of Madness pour revenir vers Festering Ash, abaisser le bloc détachable et ainsi pouvoir accéder à la zone Heart of Hatred, où se trouve le boss, Illmedous.
Sombre et étroit, rempli de Chorts (satyres).






























Grandeur
L'un de mes plus grands défis lors de la conception de ce niveau a été d'arriver avec une configuration qui n'était pas trop grosse pour notre expérience de jeu, mais tout de même intéressante.
Dans mes premiers designs, j'ai commencé avec plus de salles que nécessaire pour obtenir une configuration globale qui me satisfaisait, et j'ai ensuite réduit le nombre de salles en retirant tout ce qui ne servait pas un but spécifique. J'ai aussi réduit la taille de plusieurs salles qui étaient trop grandes, rendant la navigation et l'orientation difficile pour les joueur.se.s.
Les playtests ont grandement aider à comprendre quelles parties du niveau créaient de la confusion ou étaient inintéressantes.
Verticalité
Puisque notre personnage jouable était un humanoïde plus grand qu'il était large, et qu'il n'avait pas un saut ridiculement haut, ça a été un défi de créer des sections de niveau où, par exemple, il pouvait marcher sous un bout de terrain, mais aussi sauter par-dessus. Ça s'est avéré assez limitant pour les salles véritablement verticales et m'a forcé à créer des design encombrants et inélégants. Nous nous sommes consulté en tant qu'équipe de design et avons décidé d'introduire des plateformes semi-solides, qui permettent de sauter d'en-dessous et d'atterrir sur elles. Cet objet de level design a beaucoup aidé à créer des configurations de salles verticales plus intéressantes, avec plus d'aires ouvertes, qui offrent ainsi une plus grande liberté de mouvement, que ce soit en montant ou en descendant.
Je ne voulais pas systématiquement utiliser des plateformes semi-solides dans mon level design, alors la verticalité a aussi introduit des situations où j'ai conçu des sections requérant du platforming trop difficile et compliqué. J'ai dû peaufiner ces sections afin de conserver l'intention initiale. Je les ai donc testées et affinées abondamment, et j'ai encore une fois obtenu des retours très utiles des playtests.
La verticalité a aussi introduit de nombreuses possibilités pour des blind jumps (saut à l'aveuglette), où le.a joueur.se pouvait sauter en bas d'un terrain ou d'une plateforme sans voir ce qui se trouvait au-delà du champ de vision restreint de la caméra. J'ai assumé l'inévitabilité des blind jumps, et donc toujours fourni un moyen de descendre avec des plateformes et du terrain (sauf dans la salle du boss, dans laquelle le.a joueur.se doit sauter sans savoir où il.elle va atterrir). J'ai tenté d'éviter de placer des obstacles en des endroits où Thiess pouvait atterrir à la suite d'un blind jump.
Par exemple, dans la grande salle du Stygian Swamp, le sol est couvert d'eau empoisonnée. Je suis parvenu à réduire la probabilité d'un blind jump atterrissant dans cette eau, tout en gardant le danger présent, en ajoutant des plateformes à des hauteurs différentes sur tout le long du poison. Thiess a donc plus de chances d'atterrir sur l'une de ces plateformes, mais afin de traverser la salle horizontalement, il a quand même besoin de sauter d'une plateforme à une autre, parfois en partant d'un point moins élevé.
Défis et apprentissages
Comparaison des retours sur le niveau 2 de nos 2 derniers playtests, effectués à un mois d'intervalle. On peut voir une amélioration significative pour la difficulté et la grandeur visées, ainsi que le plaisir d'exploration.
PROGRAMMATION / DESIGN TECHNIQUE
Programmer toute l'architecture et les systèmes pour les rendre fonctionnels, solides, scalable et (presque) sans bugs.
Design des détails techniques de toutes les mécaniques du personnage, des comportements des ennemis et des systèmes additionnels comme ceux de dialogue, de popups et de tutoriel.
Optimiser le jeu pour sa performance et sa maintenabilité.
Offrir une expérience fluide pour favoriser l'immersion.
Simplifier l'usage du moteur de jeu pour les autres membres de l'équipe (particulièrement les level designers).
Simplifier l'usage de la gestion de version pour les autres membres de l'équipe et éviter des conflits de merge.
Tâches et contraintes
Expérimenter avec des mécaniques de platforming afin de créer une expérience agréable.
Expérimenter avec des mécaniques de combat pour bâtir un système de combat satisfaisant.
J'ai implémenté plusieurs mécaniques additionnelles comme un système de block/parry, un slide-attack et un backstab. Cependant, afin de simplifier notre game design pour cette courte expérience, et puisque nous n'avions pas assez de ressources d'art, ces mécaniques ne se sont pas rendues dans la version finale.
Expérimenter avec l'IA des ennemis et des comportements complexes.
Mes buts
Modèle de singletons avec des scripts "manager" pour chaque élément.
Scène "Boot" contenant tous les game objects manager persistants.
Game Manager
Loading Manager
Transition Manager
Spawner
Time Manager
Progression Manager
Cutscene Manager
Input Manager
Audio Manager
UI Manager
Camera
Chargement de scènes de manière asynchrone afin de garder un contrôle plus modulaire de ce qui est chargée, et d'optimiser la performance durant les transitions de scènes et les temps de chargement.
Architecture et système de chargement/transitions
Saute plus haut en tenant le bouton + haute gravité pour permettre un meilleur contrôle.
Contrôle complet sur le mouvement horizontal (aucun momentum), ce qui fonctionnait mieux avec notre level design.
Limite de vélocité en tombant, afin de permettre un meilleur temps de réaction dans les salles verticales.
Mécanique de "regrab" inspirée de Super Mario World: le personnage tombe légèrement plus lentement lorsqu'on tient le bouton Saut, ce qui permet davantage de contrôle.
Mécaniques du personnage - Détails techniques
Glisse le long des murs lorsqu'il y touche, pour permettre une chute plus lente et un meilleur contrôle des wall jumps.
Le momentum horizontal empêche de retourner sur le même mur à la même hauteur ou plus haut.
Peut activer le wall jump à partir d'une courte distance du mur (coyote inverse).
Peut être utilisé pour glisser sous des murs dans des espaces d'une tile.
Ne sortira pas de l'état sliding tant qu'il y a un mur au-dessus.
Plusieurs attaques régulières exécutées en succession donnent un combo. La troisième inflige légèrement plus de dégât.
Attaque plus puissante ayant un cooldown.
Lorsqu'utilisée dans les airs, Thiess plonge vers l'avant et le bas, et attaque les ennemis sur son chemin.
Lorsqu'utilisée sur le sol, Thiess plonge vers l'avant et attaque les ennemis sur son chemin.
Lorsque Thiess a peu de vie, le.a joueur.se peut décider de sacrifier du grain requis pour compléter l'un des objectifs du niveau afin de le manger et de récupéer un peu de vie.
Manger prend un court temps et montre une rétroaction du grain qui est perdu.
Thiess peut méditer pour diminuer sa rage graduellement.
1 seconde pour descendre en position avant de commencer à méditer, et 1 seconde pour se relever. Cela pousse le.a joueur.se à trouver un endroit sécuritaire pour méditer.
Une petite quantité de rage est perdue à chaque seconde pendant la méditation.
Le.a joueur.se peut ouvrir la Carte du niveau actuel afin de mieux s'orienter et de trouver les différents points d'intérêt.
Les salles ne sont pas révélées jusqu'à ce qu'elles soient découvertes.
Les points d'intérêts ne sont pas révélés jusqu'à ce qu'ils soient découverts, ou que Mélusine les mentionne.
Descend progressivement en tout temps, augmente quand des ennemis sont tués.
Dans la salle de Mélusine et la première salle du tutoriel, la rage se déplace vers son centre, vers l'équilibre.
Méditer réduit graduellement la rage.















Saut
Wall Jump
Slide
Attaque
Peut attaquer vers le haut et vers le bas.
Lorsque le bouton d'attaque est tenu, Thiess charge et exécute une attaque chargée plus puissante.
Dash Attack
Consommer du grain
Méditation
Carte et Panneau des quêtes
Le.a joueur.se peut ouvrir le Panneau des quêtes pour voir son progrès pour les 3 objectifs différents. Il.elle peut le laisser ouvert dans le HUD en jouant, ou le laisser fermé pour un HUD plus minimaliste.
Jauge de rage

Le personnage grimpe (vault) sur les coins supérieurs de terrain pour éviter la frustration d'un saut ou wall jump presque complet.
Peut être utilisé pour esquiver les attaques ennemies.
Temps de coyote et buffering d'input pour permettre des inputs légèrement moins précis et éviter des situations paraissant injustes.
Quand Thiess attaque un ennemi vers le bas en étant dans les airs, il rebondit.




Si la rage atteint son maximum, Thiess entre en état de rage incontrôlable.
Thiess perd une petite quantité de grain lorsqu'il tombe dans cet état.
Thiess perd graduellement de la vie.
La caméra zoom plus près de Thiess, réduisant la visibilité.
Thiess inflige légèrement plus de dégât.
Plus éléments de rétroaction mettent l'accent sur cet état.
Si la rage atteint son minimum, Thiess redevient humain et est expulsé de l'Enfer.
Comportement du personnage séparés en plusieurs classes pour la modularité:
Player Controller (classe principale)
Wall Jump Manager
Slide Manager
Attack Manager
Dash Attack Manager
Player Health
Player Rage
Abstraction des classes des ennemis pour le comportement répété.
Les actions du personnage et les comportements des ennemis sont gérés par des state machines.
Personnage jouable et ennemis
GitHub
Système de checkout sur notre serveur Discord
Envoyer un message comprenant la scène, le prefab ou la structure de dossier à checkout dans le channel, avec un X en réaction pour indiquer que ce contenu est checked out.
Lorsque le travail sur les fichiers/dossiers est terminé, changer le X pour un crochet afin d'indiquer qu'ils sont prêts pour un merge.
Lorsque le merge est fait, je supprime les messages marqués d'un crochet pour indiquer que les fichiers/dossiers sont libres.
Hiérarchie de branches claire
Gestion des versions
Changement de scope
Nous avons commencé à développer le jeu à partir d'un vieux prototype de Metroidvania que j'avais réalisé, et que j'ai modifié pour mieux correspondre à nos besoins. Pendant le développement, le scope a changé à plusieurs reprises. Nous l'avons parfois réduit pour éliminer des mécaniques ou fonctionnalités additionnelles qui n'étaient pas essentielles à notre expérience fondamentale, nous permettant ainsi de passer plus de temps à polir ce qui l'était. D'autres fois, nous avons augmenté le scope afin d'ajouter de petites mécaniques ou fonctionnalités lorsque nous avons réalisé (particulièrement suite aux playtests) qu'elles aideraient considérablement nos joueur.se.s à mieux comprendre et jouer notre jeu. Tous ces changements de scope m'ont poussé à permettre une implémentation plus facile en rendant le code plus flexible, modulaire et abstrait (voir Personnage jouable et ennemis).
Transmission de connaissances et troubleshooting
Ce n'était pas tout le monde dans l'équipe qui avait le même niveau d'expérience avec Unity et GitHub, et étant celui dans l'équipe ayant le plus d'expertise technique, j'ai pris le temps d'apprendre aux autres membres leur fonctionnement de base. Je n'ai évidemment pas eu le temps de leur enseigner tout ce que je savais, alors je leur ai fourni plusieurs ressources et tutoriels afin qu'ils puissent apprendre par eux-mêmes.
Pour GitHub, j'ai géré le répertoire, les pull requests et les merges. Assez tôt, nous avons eu plusieurs conflits de merge en raison de malentendus ou de problèmes de communication. J'ai donc amené à l'équipe un système simple pour leur permettre de checkout des fichiers et des dossiers dans le projet à travers un channel sur Discord.
J'ai aussi dû prendre plus de temps que prévu à troubleshoot des problèmes techniques que les membres de l'équipes avaient dans Unity. Cette expérience m'a appris à planifier pour ce temps dans le futur, lorsque je sers de ressource technique pour l'équipe.
IA des ennemis
Développer une bonne IA pas trop brisée a requis beaucoup plus de temps que j'avais prévu. En raison de mes nombreuses tâches et du temps limité à ma disposition, j'ai éventuellement réalisé que je ne pourrais pas implémenter tout ce que j'avais prévu initialement. J'ai donc dû me concentrer le comportement général des ennemis, afin de le faire paraître réel et motivé, ainsi que les peaufiner et régler des bugs autant que je pouvais pour éviter de briser l'immersion.
Être le seul programmeur de l'équipe
...a certainement été un défi. Je me suis ramassé dans cette situation en raison des nombreux changements de scope et des extensions au calendrier du projet, qui était initialement supposé durer 3 mois. En soi, les tâches que j'ai accomplies étaient faisables, mais sur le long terme, avec d'autres projets et un emploi en parallèle avec le développement d'Old Thiess, nous aurions mieux fait d'amener d'autres programmeur.e.s à bord. Ce projet m'a toute fois permis d'avoir une bien meilleure idée de la quantité de travail que je peux effectuer dans un délai donné.