Comme l’année dernière, j’ai participé à la Global Game Jam de Rennes, voici mon retour d’expérience sur Darksoda, le jeu développé à cette occasion avec cubcubcub

1/ Présentation de la GGJ

GGJ_logo

La GGJ est un évènement annuel qui se déroule généralement en début d’année (du 24 au 26 janvier 2014 pour cette édition) et qui a pour objectif la création de prototype de jeux vidéo en l’espace de 2 jours sur un thème imposé.
Ça démarre le vendredi avec le thème lâché à 17h pour chaque fuseau horaire de tout les pays participants (d’où le secret pendant quelques heures le temps que tout les fuseaux aient le sujet qui est le même pour tous).
Cette année, comme l’année dernière, j’ai participé à la GGJ de Rennes organisée par les associations 3hit Combo et West Indie Collective. Ca s’est passé au Jardin Moderne de Rennes qui a accueilli une quarantaine de jammers formant des équipes plus ou moins nombreuses pour la concrétisation de  12 projets de jeu.

Photo de la présentation du jeu au public venu au Jardin Moderne le dimanche après midi (et en streaming sur la chaine TwitchTV de 3hit combo)

2/ Thème de 2014 et concept de Darksoda

Cette année la thématique est textuelle et sujet à interprétations : “We don’t see things as they are, we see them as we are” que je traduis par “Nous ne voyons pas les choses comme elles sont, nous les voyons comme nous sommes”.
Un thème un peu particulier qui peut sembler complexe par le jeu de la langue et de la traduction tout en laissant une grande liberté d’interprétation.

Pour information, l’année dernière la thématique était sonore, un son de battement de cœur.

Vous pouvez d’ailleurs constater le résultat du brainstorming général qui s’est déroulé au Jardin Moderne cette année avec le tableau visible à cette adresse : http://linoit.com/users/3hitcombo/canvases/Global%20Game%20Jam%202014

Pour répondre à la thématique, je me suis associé à un ami répondant au nom de cubcubcub, développeur web de profession. Grands amateurs de jeu d’arcade tel que les shmups ou les puzzles games, nous avons pris pour objectif de réaliser un shoot’em up multi-joueur en local à l’image de Twinkle Star Sprite sortie sur NeoGeo mais avec une composante de puzzle game tel que Magical Drop 3 également sortie sur NeoGeo (nos deux jeux favoris)

Screnshot-MagicalDrop3jpg

Capture d’écran du jeu Magical Drop 3 (Neo Geo 1995)

Screenshot-TwinkleStarSprite

Capture d’écran du jeu Twinkle Star Sprite (Neo Geo 1996)

Darksoda, le principe.

Le nom du jeu est venu après un bon moment de réflexion intensive. Il s’agit en fait du nom du thème installé sur l’éditeur open sources d’Adobe nommé Bracket de cubcubcub tout simplement ;)
Le principe de notre concept est plus ou moins simple. Le but est de survivre plus longtemps que son adversaire, et pour cela il y a moyen de lui pourrir l’existence en lui envoyant un super boss dès lors que l’on rempli un objectif précis. Cet objectif est de réussir à absorber des essences de couleurs selon une chaine précise indiquée à l’écran. Pour voir les couleurs des essences et les absorber, il faut utiliser les fonctions spéciales du vaisseau, mais attention, certaines essences sont infectées par un parasite, il ne faut donc pas les absorber.

Capture d'écran de Darksoda

Capture d’écran de Darksoda

Techno utilisées pour le jeu.

Concernant le code, cubcubcub étant un web dev, il a choisi de faire le jeu en JavaScript pour son côté très pratique de pouvoir tester le tout dans un navigateur sans avoir à compiler quoi que ce soit. Et j’ajoute que c’est quelque chose de vraiment génial dans un cadre comme la Global Game Jam qui se passe dans un temps très court. C’est un peu comme faire du temps réel au lieu du pré-calculé dans la 3D :)

Côté bibliothèque, il a utilisé la librairie libre Phaser.io pour la tester dans un cadre de jeu, ce qui tombe bien car elle est bien fournie pour générer les différents effets dont nous allons avoir besoin pour Darksoda.

Pour ma part, les graphismes ont été fait avec des logiciels libres tel que GIMP  pour la 2D et Blender pour la 3D.
En effet, j’ai employé des outils 3D pour générer les sprites 2D qui compose le jeu.
Ma machine utilisée pour la GGJ2014 est un pc portable Dell inspiron N5110 à base d’i7-2670QM à 2.20ghz, de 8go de RAM avec une nVidia GeForce GT 525M. C’est pas une machine de guerre, mais pour la GGJ, c’est largement suffisant :) Le tout couplé avec une tablette Bamboo basique mais bien efficace.

Le vaisseau

Le vaisseau dispose de 3 modes qui lui permettent différentes actions.

– le mode de tir.

Sprite_Vaisseau_tir

Vaisseau en tir

C’est le mode de base, il sert à détruire les essences et les ennemis qui arrivent à l’écran (mais pas tous). Dans ce mode toutes les essences sont grises, on ne peut donc pas les différencier. Et si l’on touche une essence infectée, le parasite sort de sa coquille et fonce sur le vaisseau. Une essence saine sera simplement détruite sans autres conséquence particulière.

– le mode scan.

Sprite_Vaisseau_scan

Vaisseau en scan

Ce mode ne permet pas le tir, il est actif pendant un temps limité à 5 secondes. Ce mode permet de voir la véritable nature des essences qui “descendent”, on peut voir leurs couleurs et surtout voir si elles sont infectées par un parasite. Ce mode à un nombre de lancement limité, en début de partie on peut lancer 3 scans. Pour scanner à nouveau il faudra récupérer des items en forme de capsules oranges qui sont cumulables jusqu’à 5.

Sprite_PowerUpScan

Capsule de scan

Lors qu’on stop le scanner pour un autre mode (tir ou absorption), toutes les essences redeviennent grises

– le mode absorption.

Sprite_Vaisseau_aspi

Vaisseau en absorption

C’est dans ce mode que vous pouvez absorber les essences (et uniquement des essences). Comme indiqué précédemment, ce mode ne permet pas de voir la nature des essences. Il faut donc mémoriser la position des essences qui nous intéressent pour réaliser la chaine de couleurs demandée pour lancer un boss chez l’adversaire. Attention, si l’on absorbe une essence infectée, le vaisseau se retrouve lui même infecté pendant un temps limité. Cette infection a pour conséquence l’impossibilité de tirer et la réduction des capacités de déplacement.

Sprite_Vaisseau_infected

Vaisseau infecté

 

La chaine de couleurs.

Cette chaine est indiqué en bas de l’écran.

La chaine de couleurs

La chaine de couleurs

Il faut absorber 5 couleurs dans un ordre précis indiqué par les petites lucioles de couleurs au dessus des essences grises. Il faut lire l’ordre de la chaine comme un sens de lecture occidental classique : de gauche à droite.
La subtilité dans cette partie du jeu, c’est que les absorptions se font sur un schéma d’historique. C’est à dire que toutes les essences absorbées seront visibles, et en cas d’erreur, l’historique d’absorption se poursuit mais il faut tout refaire depuis la première couleur demandée. Les essences arrivent de gauche à droite dans l’historique, donc quand la chaine est complète, elle semble à l’envers comparée à la séquence demandée.
C’est un mode particulier qui ajoute à la difficulté générale du jeu. Il faut donc faire attention à ce que la chaine ne soit pas brisée par l’absorption d’une essence de la mauvaise couleur.

Les ennemis.

Ils y a 3 types d’ennemis dans le jeu:

Sprite_Parasite

Ennemi de base

En premier lieu, les parasites qui sont contenus dans les essences. Lorsque l’essence parasitée est détruite, le parasite fonce sur le vaisseau en ligne droite avec plus ou moins de vitesse. Plus il part de loin, et plus sa vitesse sera grande au contact. Cette vitesse n’a pas d’importance sur la quantité des dégâts, elle demande plus de réflexe pour l’esquive.

Sprite_Boss

Ennemi mouvant et boss

Ensuite arrivent les ennemis actifs, ils sont mouvants dans le tableau et lancent des parasites à intervalle plus ou moins régulier. Il faut les toucher 3 fois avec le tir pour qu’ils disparaissent de l’écran.
Le dernier type est le boss. Il a le même motif que l’ennemi actif mais en beaucoup plus gros. Il est largement plus résistant et lance des salves de 5 parasites d’un coup sur le joueur. C’est pas un boss pour rien :)

La vie.

Darksoda_Vie

La vie dans Darksoda

Dans ce jeu, on dispose de 3 cœurs de vie. Et c’est tout. Il n’y aucun moyen d’en récupérer durant la partie. Se faire toucher par une essence, par un parasite ou par un ennemi actif nous fait perdre un cœur. Après le 3e perdu, c’est le game over et l’adversaire remporte la partie.

3/ Création des assets

Recherche et conception.

Pour définir le design des éléments du jeu, rien de tel que le crayon et le papier.

Darksoda-scan-RD-Boss-Parasite

Dessins des ennemis

Darksoda-scan-RD-CapsuleScan

Dessins de la capsule de scan

Darksoda-scan-RD-Ess

Dessins des essences et de l’animation de destruction prévue

Darksoda-scan-RD-Vaisseau

Dessins des vaisseaux, de leurs modes et des différents designs

J’ai dessiné la plupart des éléments nécessaire au jeu sur du papier pour valider les designs avec cubcubcub avant la production numérique. Coté style visuel, on a défini ensemble de faire les assets en pixel art (Il faut dire que les inspirations datant de la NeoGeo parlent d’elle même).

Essences

Essence_all

Les différentes essences de Darksoda et leurs versions infectées

Une fois les designs validés, j’ai commencé par refaire les essences sur GIMP pour donner de quoi tester le code à cubcubcub avec des éléments visuels temporaires remplaçables. Au final les essences sont restées des éléments 2D et je les aient terminé dans GIMP pour faire les différentes teintes et la version infectée.

Capture_essences_GIMP

Vaisseau

Le vaisseau sans arme

Le vaisseau sans arme

Après les essences, l’élément principal est le vaisseau.
Celui ci, j’ai décidé de le faire en 3D dans Blender mais avec un rendu en pixel art. Les assets étant des sprites 2D, je me réserve aussi la possibilité de pouvoir les compléter/retoucher dans GIMP après le rendu.
Pour faire le vaisseau, la géométrie de base est très simple comme on peut le voir. Il est symétrique, rondouillard avec peu d’éléments visuels perturbateurs.

Le vaisseau en création dans Blender

Le vaisseau en création dans Blender

Côté rendu, je me suis servi du moteur interne de Blender et de la surcouche Freestyle pour augmenter l’effet 2D avec un contour de couleur noir, le tout dans une résolution basse et sans anti-aliasing pour le côté pixel de l’ensemble.

Paramètre de rendu dans Blender

Paramètre de rendu dans Blender

Paramètre de Freestyle dans Blender

Paramètre de Freestyle dans Blender

 

Le vaisseau est composé de plusieurs éléments. La coque, le hublot, la flamme de propulsion et les armes.
Tout n’est pas attaché, par exemple, le hublot ne fait pas parti de la coque, il n’est même pas en contact avec le corps du vaisseau pour que freestyle me fasse un contours délimitant le hublot du reste du vaisseau. En effet, Freestyle génère un contours pour tout les bords d’un élément qui n’est pas en contact avec un autre.

Vue du vaisseau dans Blender. Les éléments nécessitant une bordure calculée par Freestyle ne sont pas en contact avec les autres

Vue du vaisseau dans Blender. Les éléments nécessitant une bordure calculée par Freestyle ne sont pas en contact avec les autres

On peut voir sur mon rendu du vaisseau que les ailes ont un contour sur l’extérieur, mais pas sur la partie qui est posé sur la coque du corps. C’est pourquoi certaines parties du vaisseau ne sont pas du tout collées au vaisseau.
Par contre, tout les éléments du vaisseau sont inclus dans le sprite du vaisseau. Il n’y a pas eu de décision de séparer les différents éléments qui complète le vaisseau comme la flamme de propulsion ou les éléments du scan et de l’absorption en sprite additionnels. Ce qui a été problématique par la suite mais j’y reviendrais.

J’ai agi avec la même démarche pour les armes, on peut voir sur les captures que les canons qui permettent de tirer ne sont pas collé au vaisseau. Mais comme le rendu se fait du dessus avec une caméra orthographique, on ne voit pas du tout le trucage.

Pour faciliter la production des sprites, j’ai un seul fichier par asset. Donc je peux faire le rendu de tout les modes du vaisseau en masquant certains éléments non nécessaire au sprites que je veux générer.
Par exemple, si je veux faire un rendu du vaisseau en mode scan, je n’ai qu’à décocher la capacité d’apparaître au rendu des canons et du halo d’absorption pour avoir le vaisseau et son rayonnement du scanner.

L'outliner du vaisseau dans Blender

L’outliner du vaisseau dans Blender

Pour le shader du vaisseau j’ai opté pour un Fresnel avec la Ramp active dans une interpolation constante. Ce qui me permet d’avoir ce rendu un peu cartoon comme des aplats de couleurs définissant mon volume.
Ce shader à été le même pour tout les assets du jeu généré avec Blender, j’ai seulement changé la position des transitions de la ramp et la couleur selon les besoins.

Tous les shader utilisés pour les rendus du vaisseau

Tous les shaders utilisés pour les rendus du vaisseau

C’était la phase de tâtonnement ces réglages. Ils m’ont demandé de faire des rendus à de nombreuses reprises jusqu’à obtenir ce que je voulais vraiment. Mais les calculs se sont fait très rapidement même en CPU de part la résolution et le type de shader employé. Au final, la phase de calcul la plus longue était le calcul de Freestyler sur certains sprites.

L’état infecté du vaisseau à nécessité plus de travail 2D avec l’ajout du parasite dans le cockpit et les racines d’infection qui englobe le vaisseau. Pour souligner le déplacement réduit, j’ai diminué la flamme et lui ai donné une teinte rouge qui elle est rendue en 3D comme la flamme de propulsion de base.

Retouche du vaisseau infecté dans GIMP après le rendu dans Blender

Retouche du vaisseau infecté dans GIMP après le rendu dans Blender

Pour finir avec ce sprite, les lasers des tirs ont été dessiné dans GIMP.

Sprite_Bullets

Ennemi/Boss

Ce sprite a demandé du temps pour le concrétiser dans Blender. Le design 2D s’est fait rapidement mais ensuite j’ai un peu tâtonné pour la 3D. J’ai tenté différentes approches pour au final faire de la modélisation simple avec des objets que j’ai légèrement déformé par rapport au point de vue de la caméra. C’est l’asset le plus déstructuré que j’ai fait pour Darksoda côté modélisation.

Le boss/ennemi actif dans Blender. On voit bien les éléments détachés pour conserver le contour au rendu.

Le boss/ennemi actif dans Blender. On voit bien les éléments détachés pour conserver le contour au rendu.

Pour obtenir le rendu des narines et de la bouche dans Blender, le visage est sculpté dans Blender. L’objet a un modificateurs Multi-résolution qui permet de voir le résultat au rendu mais pas dans le viewport tant qu’il n’est pas appliqué et que je ne passe pas en mode Scult l’objet en question.
Il a demandé aussi pas mal de travail de retouche 2D par la suite après le rendu, mais comme il n’y a qu’un seul état pour ce sprites, ce n’était pas vraiment un probleme :)

Le boss dans GIMP

Le boss dans GIMP

Parasites

Élément important du jeu, ces ennemis ont la fâcheuse particularité d’être très peu visible avec le fond spatial sombre, je les ai conçus en 2D dans GIMP vu la simplicité du design.

Sprite_Parasite

Décors et UI.

Pour cette partie, je suis resté en 2D dans GIMP.
Avec quelques brosses j’ai peint le fond sur une base noir/bleu très foncé un effet de nuage cosmic en plusieurs calques et quelques étoiles d’un pixel. Ce fond est scrollé à la vertical très lentement dans le jeu étant donnée qu’il représente l’espace lointain.

Le fond du jeu dans GIMP

Le fond du jeu dans GIMP

Concernant les étoiles sur les plans les plus rapprochés du scrolling, elles sont générées de façon procédurale et j’ai créé deux sprites de 3 et 6 pixels carré représentant deux niveau de scrolling parallaxe.

Pour le reste de l’interface, j’ai généré une barre de séparation des espaces de jeu des joueurs au centre, le cadre vert entourant la fenêtre de jeu est généré par cubcubcub en code.

Animation.

Une fois tout les sprites 2D prêts, il me reste à faire les animations de ces sprites.
En effet, nous avons privilégié des sprites fixes pour avoir tout nos éléments prêt en se donnant une marge pour l’animation si le temps restant nous le permet.
Dans la liste des animations prévues il y a celles du vaisseau (scan, absorption, propulsion et directions) et les animations de destruction des sprites.

Pour le vaisseau, l’animation des modes comme le scan ou l’absorption n’ont pas posé de soucis, j’ai animé un shape key des objets 3D dans blender pour les deux cas afin d’obtenir mon effet.

Animation du scan

Animation du scan

Animation de l'absorption

Animation de l’absorption

L’animation des flammes de propulsion n’a pas été compliqué non plus, un empty parent de la géométrie et animé dans le scale me permet d’avoir l’effet désiré.

Animation de la propulsion

Animation de la propulsion

Pour les animations de direction, elles ont été faite et rendue mais il s’est avéré qu’inclure tout les éléments composant le vaisseau dans le même sprite pose un soucis dans les animations.
Par exemple, il faut rendre tout 3 fois (une fois par mode) selon qu’on est en position normal, vers la gauche ou vers la droite. Ce n’est pas un soucis de temps mais d’intégration qui se voit rallonger d’autant. Et comme les animations ont été réalisées dans la nuit blanche du samedi au dimanche, le choix à été fait de ne pas avoir d’animation pour indiquer l’orientation du vaisseau. Par contre les animations des modes scan et absorption sont primordiales et donc ont été intégrées.
Pour faciliter les animations, il nous aurait donc fallut séparer en plusieurs sprites les éléments qui compose le vaisseau. Donc un sprite du corps du vaisseau, un sprite de la flamme et un sprite de l’arme active. De cette façon, les animations auraient été séparées avec des sprites se superposant et il n’y aurait pas eu besoin de les multiplier pour qu’elles s’enchainent bien selon l’action du joueur. Leçon apprise et retenue :).

Les animations restantes sont la destructions des essences, du boss et du vaisseau. Sur le papier, j’avais prévu de dessiner des étapes d’animation de chaque éléments (on peut voir l’exemple en début de chapitre sur la création de l’essence), mais au vu du temps qui passe il a été décidé de ne faire qu’une animation d’explosion qu’on colle à tout élément détruit dans le jeu. Animation en 3 étapes dessinée directement dans GIMP.

Animation de l'explosion

Animation de l’explosion

Il reste les écrans titres du jeu et quelques captures pour la page de participation. Pour l’écran titre, on a choisi de tout faire en une seule page, il faut montrer le style du jeu, le nom du jeu et expliquer rapidement les commandes utilisées pour jouer au jeu (ainsi que les crédits pour les créateurs :p ). C’est très condensé et probablement à revoir mais dans l’ensemble ça fait le boulot (et puis on est bien fatigué après avoir passé toute la journée de samedi et la nuit qui a suivi à développer Darksoda ^^” )

Écran titre dans GIMP

Écran titre dans GIMP

4/ Le jeu en lui même

Le développement du jeu s’est fini le dimanche vers midi. Le reste du temps alloué pour la création du jeu a été utilisé pour préparer les fichiers qu’il faut déposer sur la page officielle de la global game jam afin de valider notre participation.

On a passé du temps à tester le jeu au fur et à mesure des mécaniques mise en place (surtout cubcubcub pendant que je préparais les assets). Le jeu est très exigeant, très dur pour faire durer les parties. Il faut faire attention aux essences, utiliser les scans pour repérer celles qu’il nous faut pour la chaine de couleurs, les absorber tout en évitant les tirs des ennemis actifs qu’il faut détruire. Réaliser la chaine de 5 couleurs est vite compliquée car une erreur et il faut tout refaire en sachant que les couleurs défiles selon l’historique d’absorption. C’est dur, mais c’est comme ça qu’on a voulu le jeu, tel un défi des anciens jeux de l’époque de l’arcade et de la NeoGeo.
On a pu voir que pour les nouveaux joueurs qui découvrent Darksoda, le défi est très relevé, il faut plusieurs parties pour se faire aux mécaniques de jeu, surtout le concept du scan limité dans le nombre et dans le temps qu’on recharge avec les capsules et de l’absorption après avoir bien repéré les essences nécessaires.
Ce n’est pas impossible à faire, on a réussi à le faire à plusieurs reprises au fil des parties test, même si ce n’est pas simple.

Screenshot d'une partie de Darksoda

Screenshot d’une partie de Darksoda

Une chose manque vraiment, c’est le son. On aurait pu prendre le temps de chercher des fichiers dans une bibliothèque libre pour trouver des sons qui nous plaisent et les intégrer mais on a eu le coup de fatigue ultime. Le jeu est jouable comme on le souhaitait, la direction artistique du jeu tient la route. On a réussi à inclure toutes les mécaniques de gameplay qu’on a défini dans la réflexion du projet. C’est dommage mais on était vraiment épuisé pour partir à la recherche de fichiers sons spécifiques parmi les milliers disponibles sur les bibliothèques en ligne. D’autant qu’il aurait surement fallu les retoucher avec Audacity pour qu’ils nous conviennent parfaitement, sans parler de l’intégration qui aurait suivi. Donc pas de son pour Darksoda, dans l’espace, personne ne vous entendra crier… Ouep elle est facile celle là.

Globalement, ce qui pourrait être amélioré dans Darksoda c’est la chaine de couleurs à réaliser. Je pense qu’une chaine de 3 couleurs pourrait être plus simple à gérer surtout lorsqu’on doit se concentrer pour vérifier que la chaine n’est pas brisée par une erreur. Ensuite, et on en avait déjà pas mal discuté avec cubcubcub pour sa mise en place, le concept d’historique d’absorption est peut être un peu rude vu le challenge avec les ennemis actifs qui nous tirent dessus sans cesse. Loin de moi l’idée de le rendre plus simple en réduisant la difficulté, je pense ici surtout à la lecture du jeu en pleine partie.
L’autre concept pour la chaine était d’avoir une chaine aléatoire comme actuellement, mais au lieu de voir défiler les essences de couleurs de gauche a droite, elles s’allumeraient à chaque fois que la bonne essence est absorbée pour faire la chaine. Et en cas d’erreur, toutes les essences retournent à l’état neutre (grise) et il faut refaire la chaine depuis le début.
Ça ne rend pas le jeu plus facile pour autant, mais améliorerait peut être sa lisibilité pendant le jeu.

Techniquement, ce qui serait à refaire c’est le découpage des sprites en plusieurs sprites superposés pour permettre d’inclure plus facilement les animations comme je l’ai expliqué plus haut.
Et puis ajouter des sons pour donner une identité sonore à Darksoda.
Pour la partie code, je ne saurais dire ce qu’il faudrait changer, il faudra voir avec cubcubcub.

5/ Conclusion et licence des assets.

Cette participation à la Global Gam Jam 2014 est une franche réussite pour moi. On a réussi à faire un jeu le plus abouti possible dans le temps impartit tout en répondant à la thématique (On se change soi-même pour voir les choses autrement avec la fonction scan du vaisseau).
Le jeu est sympa à jouer, difficile et on a réussi à inclure tout ce qu’on voulait y mettre tout en tenant une direction artistique régulière.
J’ai appris de nouvelles méthodes pour générer des sprites avec Blender et le rendu en pixel art car c’est une chose que je voulais expérimenter depuis un moment. La GGJ m’aura permis de faire cette expérimentation dans un cadre bien particulier et de valider cette approche.

Bref, c’est une expérience à faire et j’invite tout le monde à le tenter au moins une fois. Même si les nuits blanches à développer un jeu peut sembler horrible ou difficile. C’est le concept même d’une Jam et personne n’oblige à tenir le rythme du développement continu (c’est même déconseillé pour une bonne expérience de l’évènement).

Pour finir, vous trouverez tout mes fichiers sources qui m’ont servit à générer ces assets sous licence Creative Commons comme indiqué en bas de l’article à cette adresse (sauvegarder sous). C’est une archive zip de 5mo contenant les fichiers GIMP (XCF) et Blender (Blend) ainsi que les sprites.

Vous pouvez aussi télécharger le jeu et y jouer en local depuis votre navigateur ou simplement aller sur une section du site de cubcubcub pour faire une partie de Darksoda.
Il vous faut impérativement un clavier 105 touches avec pavé numérique pour jouer à deux. Si vous préférez le gamepad, c’est possible en mappant les touches du clavier sur les boutons du pad avec Joy 2 key qui est très simple à utiliser. C’est aussi une option intéressante si vous n’avez pas de pavé numérique sur votre clavier.

En espérant que cette lecture vous aura donner l’envie de vous essayer à une Game Jam :)

GGJ_logo 2

Creative Commons License
Darksoda by rls & cubcubcub is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.