Eliott BlachaDéveloppeur et designer

Spindle Garden

Un simulateur de jardinage où l’on croise d’étranges plantes. Chaque plante est assemblée à partir de modules, et deux plantes qui se rencontrent peuvent donner un hybride.

Année
2024–2025
Contexte
Projet de fin d’études, ICAN
Rôle
Seul programmeur, design des systèmes, outils, technical art
Réalisé avec
C#, Unity, FMOD, shaders
Ampleur
Plus de 15 000 lignes de C#, plus de 50 classes
Un manoir de guingois dans un jardin sombre, éclairé par de petites lanternes et des plantes lumineuses.

Le concept

Le joueur cultive des plantes sur un réseau de cellules reliées entre elles : il les arrose, les regarde pousser et les laisse se propager. Quand deux plantes différentes se rencontrent en se propageant, elles peuvent se croiser et donner un hybride qui mêle les traits de ses deux parents.

Chaque plante est faite de trois modules, une tête, un corps et un pied, et chaque module porte ses propres propriétés. Les combinaisons se comptent par millions, et chaque nouveau module les multiplie.

Le jardin à la tombée de la nuit, en vue subjective : une tente de marché violette, des parterres plantés et un arrosoir en main.
Le jardin au crépuscule. Les plantes poussent sur les parterres de pierre et passent de l’un à l’autre.

Ce que j’ai construit

J’ai programmé le jeu seul. Voici les systèmes sur lesquels il repose.

Les cellules reliées
Les cellules sont des nœuds reliés par des liens plutôt qu’une grille fixe. Les plantes se propagent le long de ces liens grâce à une recherche de chemin, et des outils d’éditeur permettent de dessiner et d’inspecter le réseau.
Le cycle de vie des plantes
Une machine à états mène chaque plante de la croissance à la maturité, à la décomposition puis à la mort, synchronisée avec le cycle jour-nuit, l’arrosage et le son FMOD.
L’hybridation
Quand deux plantes se rencontrent, les parents sont validés, des modules sont tirés de chacun, à 50/50 par défaut ou selon l’engrais de la cellule, les propriétés sont moyennées et une nouvelle définition de plante est créée. La consanguinité est empêchée pour garder des lignées variées.
L’assemblage modulaire
Les modules s’emboîtent sur des points d’ancrage ; positions et statistiques combinées sont calculées à l’exécution.
Une plante qui se propage d’un parterre de pierre au suivant le long d’un lien.
Relier deux cellules, puis laisser une plante passer de l’une à l’autre.
Schéma : deux agents parents aux modules AAA et BBB donnent un hybride qui mélange leurs modules. (ouvre l’image en taille réelle)
Comment naît un hybride. Ouvrir en taille réelle.
Schéma de l’architecture des scripts du jeu : des managers pour le jeu, les zones, les commandes et l’interface, reliés aux cellules, aux plantes et aux agents. (ouvre l’image en taille réelle)
L’architecture des scripts : managers du jeu, des zones, des commandes, de la monnaie et de l’interface, au-dessus des cellules, des plantes et des agents. Ouvrir en taille réelle.

Autour du cœur

L’herbier
Un livre de collection dans l’esprit d’un Pokédex. Les plantes découvertes y sont affichées en 3D en temps réel, filtrables par famille, avec les propriétés de chaque hybride obtenu.
Les agents invasifs
Des nuisibles autonomes cherchent les plantes du joueur, s’en approchent et les parasitent, chacun piloté par sa propre machine à états.
L’économie
Les prix suivent la complexité d’une plante. Les zones et l’inventaire s’améliorent, et des commandes de PNJ réclament des hybrides précis.
Le livre de l’herbier qui s’ouvre, avec des emplacements vides pour les modules tête, corps et pied.
L’herbier se remplit au fil des découvertes.
Schéma de la machine à états : croissance, pause, maturité, décomposition et mort. (ouvre l’image en taille réelle)
Les états d’un agent plante. Ouvrir en taille réelle.
Logigrammes du cycle de vie d’une plante, de l’hybridation et de l’usage des outils. (ouvre l’image en taille réelle)
Cycle de vie, hybridation et outils. Ouvrir en taille réelle.

L’architecture

Le code s’appuie sur quelques patrons : managers singletons, machines à états, observateurs et fabriques, avec un système d’événements entre les modules et des ScriptableObjects pour les données.

Ce qu’on y gagne, c’est l’extensibilité. Un nouveau type de module, de comportement ou de règle de propagation tient en quelques lignes plutôt qu’en une réécriture.

Une jeune pousse sur un parterre de pierre, une jauge d’arrosage à gauche de l’écran.
Planter et arroser.
Une tente violette derrière deux parterres de pierre, la main du joueur tenant un outil.
Projet suivantStage, 2024NovuumUn jeu d’action narratif à la troisième personne. Pendant mon stage chez Pocmaker, j’en ai construit la démo jouable sous Unreal Engine 5.