Eliott BlachaDeveloper and designer

Spindle Garden

A gardening simulator about breeding strange plants. Every plant is assembled from modules, and two plants that meet can produce a hybrid.

Year
2024–2025
Context
Final-year project, ICAN
Role
Sole programmer, systems design, tools, technical art
Built with
C#, Unity, FMOD, shaders
Scope
15,000+ lines of C#, 50+ classes
A crooked manor in a dark garden, lit by small lanterns and glowing plants.

Concept

The player tends plants on a network of connected cells: watering them, watching them grow, and letting them spread. When two different plants meet while spreading, they can cross and produce a hybrid that mixes the traits of both parents.

Each plant is built from three modules, a head, a body and a foot, and each module carries its own properties. The combinations run into the millions, and every new module multiplies them.

First-person view of the garden at dusk: a purple market tent, planted beds and a watering can in hand.
The garden at dusk. Plants grow on the stone beds and spread from one to the next.

What I built

I programmed the game alone. These are the systems it rests on.

Connected cells
Cells are nodes joined by links rather than a fixed grid. Plants spread along those links with a pathfinding pass, and editor tools let you draw and inspect the network.
Plant lifecycle
A state machine carries each plant from growth to maturity, decomposition and death, synchronised with the day and night cycle, watering and FMOD audio.
Hybridisation
When two plants collide, the parents are validated, modules are picked from each, 50/50 by default or weighted by the fertiliser on the cell, properties are averaged and a new plant definition is created. Inbreeding is prevented to keep lineages varied.
Modular assembly
Modules snap together on anchor points; positions and combined stats are computed at runtime.
A plant spreading from one stone bed to the next along a link.
Linking two cells, then letting a plant spread across.
Diagram: two parent agents with module sets AAA and BBB produce a hybrid mixing their modules. (opens the full-size image)
How a hybrid is made. Open for full size.
Diagram of the gam’ script architecture: managers for the game, zones, orders and UI, connected to cells, plants and agents. (opens the full-size image)
Script architecture: game, zone, order, currency and UI managers above the cells, plants and agents. Open for full size.

Around the core

Herbarium
A collection book in the spirit of a Pokédex. Discovered plants are rendered live in 3D, filterable by family, with the properties of every hybrid you have made.
Invasive agents
Autonomous pests search for, move toward and parasitise the playe’ plants, each driven by its own state machine.
Economy
Prices follow a plan’ complexity. Zones and inventory can be upgraded, and NPC orders ask for specific hybrids.
The herbarium book opening, with empty slots for head, body and foot modules.
The herbarium fills in as new plants are discovered.
State machine diagram: growing, pause, mature, decomposing and dead. (opens the full-size image)
Plant agent states. Open for full size.
Flowcharts for a plan’ lifecycle, the hybridisation process and tool handling. (opens the full-size image)
Lifecycle, hybridisation and tool flows. Open for full size.

Architecture

The codebase leans on a handful of patterns: singleton managers, state machines, observers and factories, with an event system between modules and ScriptableObjects for data.

The payoff is extensibility. A new module type, behaviour or propagation rule takes a few lines rather than a rewrite.

A seedling on a stone bed, with a watering gauge on the left of the screen.
Planting and watering.
A purple tent beyond two stone beds, the playe’ hand holding a tool.
Next projectInternship, 2024NovuumA narrative third-person action game. During my internship at Pocmaker I built its playable demo in Unreal Engine 5.