The Shooting of Isaac: Rebirth

The Shooting of Isaac était un projet étudiant à développer pendant les vacances de Noël 2013. En Juillet 2020, sept ans plus tard, j’ai enfin eu le temps de commencer le développement d’un remake avec de meilleures méchaniques et graphismes, en utilisant les assets de The Binding of Isaac: Rebirth. Grâce au DLC Afterbirth+ et ses possibilités de modding (extracteur de données et console dans le jeu), j’ai eu accès à tous les fichiers du jeu, ce qui m’a permis d’être aussi proche que possible du jeu de base. Le wiki du jeu m’a aussi énormément aidé.

Le Jeu

The Shooting of Isaac: Rebirth est un shooter vertical en 2D dans lequel vous jouez un personnage parmi six disponibles, tous avec leur propres statistiques, qui parcourt différents niveaux remplis d’ennemis à tuer pour gagner du score et d’un boss à la fin. De temps en temps, des objets à rammasser apparaîtront. Les effets de vos objets se combinent pour changer le gameplay de votre personnage ou donner des effets aux larmes que vous tirez, vous pouvez en porter trois à la fois maximum. Si vous avez déjà le maximum d’objets sur vous et que vous en voyez un qui vous intéresse au sol, vous pouvez sélectionner celui que vous voulez remplacer dans votre inventaire (tab / RB par défaut) et le nouveau prendra sa place dans son emplacement. Entre chaque niveau, il y aura un magasin dans lequel vous pourrez vous soigner et acheter de nouveaux objets. Quand le boss de fin est tué, ou que vous mourez, vous pourrez alors entrer votre nom et sauvegarder votre score.

Je n’étais pas vraiment satisfait par certains aspects de mon premier jeu, limité par le temps et mes compétences. La première exemple qui me vient en tête étant la combinaison Technology (laser qui remplace les larmes normales) + Wiggle Worm (tirs sinusoïdaux), qui aurait du donner un laser sinusoïdal, au lieu d’un laser rectiligne se déplaçant de gauche à droite. Ayant ça en tête, je voulais réadapter les synergies et avoir des effets plus classe. Même si Wiggle Worm n’est plus dans la version Rebirth, Technology a profité d’une refonte, l’une d’entre elles étant la combinaison avec Spoon Bender (tirs téléguidés) qui donne un laser à tête chercheuse qui part du personnage et va vers les ennemis.

Le Développement

Ceci est le premier gros projet sur lequel j’ai travaillé en utilisant FaZoN, mon framework personnel basé sur la SFML, en utilisant le C++ et un peu de C# dans Visual Studio 2017 et 2019, et je suis très satisfait du résultat. Travailler sur mon framework m’a permis de beaucoup le peaufiner et de l’améliorer car j’ai eu un bon nombre de besoins tout le long de la production. J’ai, par exemple, eu à ajouter tout un nouveau système d’animation qui pouvait lire les fichiers du jeu de base, au lieu de les convertir pour le système que j’avais déjà. Ça m’a pris pas mal de temps mais je suis content de l’avoir fait car ça a rendu la suite beaucoup plus rapide, j’ai pu prendre les fichiers .anm2 du jeu de base et les coller dans les dossiers de mon jeu pour que tout marche instantanément. C’était aussi un bien meilleur système que celui que j’avais déjà en place, assez rudimentaire.
Comme avec les animations, tous les ajouts que j’ai fait à mon framework ont pris du temps et ont certainement ralenti la production, mais je suis content de les avoir fait car FaZoN est meilleur maintenant et mes futurs projets seront beaucoup plus fluides.

Ennemis

Une des grandes étapes que j’ai du traverser pendant le développement a été de décider comment gérer mes ennemis, je voulais en implémenter un bon nombre et je ne voulais pas partir sur de l’héritage qui m’aurait demander de créer beaucoup de classes différentes avec peu de code en elles. À la place, j’ai regardé les actions et déclencheurs de ces actions dont mes ennemis avaient besoin et les ai mis dans mon code en tant que fonctions séparées, appellées dans mon unique classe Enemy par un tableau et des structures de descriptions. Par exemple, deux ennemis qui tirent des larmes vont tous deux appeller la fonction Shoot que j’ai créé, mais avec différentes descriptions détaillées dans un fichier XML gardé en mémoire dans la classe.

Sur l’image au dessus, on peut voir un example de XML d’un ennemi, c’est l’un des premier que j’ai créé. Il y a le bloc des fonctions en rouge, le bloc des animations en vert, et celui des sons en bleu.
Il y a trois types de fonctions:
– Movement, qui décrit comment l’ennemi bouge (déplacement aléatoire, poursuite du joueur, etc…).
– Action, qui décrit ce que l’ennemi peut faire (tirer, charger, etc…).
– ActionTrigger, qui décrit comment et quand l’ennemi fera son action (proximité avec le joueur, temps, etc…).

Les fonctions de mouvement peuvent être cumulées, par exemple, un ennemi qui a la fonction de poursuite du joueur en plus de celle le faisant bouger de manière aléatoire, le fera se déplacer vers le joueur de manière ératique au lieu d’aller directement vers le joueur en ligne droite.

Plus tard, j’ai ajouté des behavior trees aux ennemis, ce qui m’a aussi pris un peu de temps mais a vraiment aidé à fluidifier le processus de création sur certains d’entre eux.

J’ai travaillé à faire en sorte de pouvoir appeller mes fonctions d’action au sein du behavior tree, ce qui a rendu les choses plus faciles car j’avais juste à donner un nom de fonction existante au lieu de créer des variables et de les initialiser dans une tâche de behavior tree.
On peut voir les occurences de la fonction d’action encadrée en rouge dans le behavior tree mis en évidence en vert sur l’image au dessus.

Éditeur

Au début, je modifiais mes fichiers XML à la main, mais c’est rapidement devenu compliqué car j’avais de plus en plus de variables à gérer et il fallait que je me rappelle de laquelle d’entre elles allait avec quelle fonction. Pour rendre les choses plus faciles et travailler plus vite, j’ai créé un éditeur qui lit mes fichiers et m’affiche tout dans une interface ImGUI très pratique. Ça a également beaucoup aidé quand j’ai commencé à travailler sur les behavior trees.
J’ai aussi pu me créer une fenêtre affichant mes enums et valeurs de masques clairement pour ne plus avoir à ouvrir un fichier sur le côté pour me donner quelle valeur correspond à quel champ d’enum ou bit de masque.

Créer cet éditeur était aussi un moyen de créer et travailler sur les patterns de tirs des ennemis. Le premier que j’ai créé n’avait qu’un tir allant en direction du joueur, d’autres ont été beaucoup plus compliqués comme Mom’s Heart qui avait plusieurs phases et patterns de tirs à gérer. Cela voulait dire qu’en plus d’un endroit ou créer et modifier mon behavior tree, j’avais aussi besoin d’une fenêtre où créer, régler et surtout prévisualier mes patterns.

Les deux vidéos au dessus montrent l’édition d’un pattern (gauche) et la prévisualisation de certains que j’ai créé pour Mom’s Heart. Quand Isaac est affiché, cela veut dire que le pattern s’adapte à la position du joueur:
– Les brimstones (lasers rouges) tourneront vers le joueur (il est sur la gauche du laser se trouvant en bas à droite, la rotation s’effectuera donc vers la gauche).
– La ligne unique de larmes (0:47) tire simplement sur le joueur.
– les cinq lignes de larmes (0:56) tournent dans le sens opposé de la direction que prend le joueur.

Cryptage de données

Puisque je ne suis pas propriétaire des assets graphiques et sonores, mais que je partage mon jeu sur mon github, je voulais protéger ses données. Ça a toujours été un but pour moi puisque c’est ce qu’on est sensé faire avec ses productions, mais vu que les miennes ont toujours été de petits projets étudiants, je ne m’étais jamais encore penché sur la question. Je ne vais pas donner trop de détails ici pour garder un maximum de sécurité sur les assets. Ce que je peux dire, c’est que j’ai eu un peu de mal au début avec la marche à suivre, mais je suis content de l’avoir fait, et j’ai maintenant un système de cryptage qui marche avec une jolie application Windows Forms pour rendre les choses plus faciles.

L’application est divisée en trois parties:
À gauche, la hiérarchie des fichiers source, ceux que je vais crypter. Je peux cocher un fichier ou un dossier et ne traiter que ceux là, ou passer sur tous les fichiers d’un coup avec les boutons juste en dessous. Par défaut, l’application ne réécrit pas les fichiers existants, mais je peux le forcer en cochant la case “Force Build”, dans le cas où j’aurais modifié un fichier source que je voudrais recrypter par exemple.
À droite, la hiérarchie des fichiers cryptés, pour voir si tout est bien là. Depuis cet affichage, je peux aussi décrypter un fichier pour voir si tout s’est passé, c’est plutôt une fonctionnalité de debug. J’ai ajouté un bouton “Delete Decrypted Files” pour supprimer les fichiers décryptés avant de copier mon dossier de données pour une release.
En bas, la barre de progression et le compte de fichiers du cryptage en cours et la console qui indique quel fichier est en train d’être traité. Si le fichier existe déjà et que je ne force pas le traitement, une ligne grise disant “skipped” apparaîtra au lieu des “encrypting” noires visibles sur la capture d’écran.

Streaming

Pendant le développement, j’ai streamé sur Twitch pour me faire une archive et montrer aux gens ce sur quoi je travaillais. J’ai commencé à un moment où je travaillais sur l’éditeur et j’ai arrêté (pour l’instant) quand j’ai démarré le travail sur le cryptage de données, donc toute la production n’y est pas présente mais vous pouvez jeter un oeil aux playlists de mes streams sur Twitch et sur Youtube.

Remerciements

Ce projet a été un vrai défi à relever et je suis heureux d’avoir des gens pour m’aider quand j’en ai besoin, j’aimerais donc remercier Rémi Maigné et Jérôme Bevenuti pour leur aide et leurs suggestions, mais aussi Simon Parzer, lead programmeur sur le jeu de base, qui a répondu à mes questions à propos du jeu, et tous les gens autour de moi pour leur soutien pendant le développement.

Captures d’écran

TitleScreen
CharacterSelection
ControlsKB
ControlsXInput
HighScores
Basement
Nightmare
Caves
Depths
Womb
MomsHeart
EnterScore
Credits
previous arrow
next arrow
 
TitleScreen
CharacterSelection
ControlsKB
ControlsXInput
HighScores
Basement
Nightmare
Caves
Depths
Womb
MomsHeart
EnterScore
Credits
previous arrow
next arrow
Shadow

Liens

Vous pouvez télécharger la version alpha du jeu ci-dessous. Il n’est pas encore terminé, mais il est dans un état que je juge montrable et partageable.