Magical gene / no coat effect
Dryad
Every so often the horse leaves something growing where it has been, and what it leaves is written on the allele. Nine of them: six trees, mushrooms, flowers, and one that plants nothing at all and hurries along whatever is already there. Left in one place long enough, a dryad makes the place its own — one block at a time and entirely without hurrying.
The first dryad tree in the mod's history: a sapling appeared at 00:00:03 and was six logs and fifty-two leaves by 00:01:09. The gene had never been watched doing anything before — not because it was broken, but because the horse dimension forbade the spreading verb and, before that, the test pen had the wrong floor under it.
What it does
| Combination | Outcome |
|---|---|
n/n | nothing — the ground is left as it was |
one variant and n | nothing. A variant is recessive to the wild type, and the horse passes it on |
| two of the same variant | that one thing, at full rate |
| two different variants | both, each at half rate |
The nine things a dryad can leave
| Allele | Leaves |
|---|---|
Oak | oak saplings — the common one, and the fastest to become a tree |
Brch | birch saplings — tall, thin, and forgiving about where they stand |
Spru | spruce saplings — a spruce horse makes a wood you cannot see through |
Jung | jungle saplings — the tallest single sapling in the game, and the one that wants room |
Aca | acacia saplings — grows crooked, so an acacia line never makes the same shape twice |
Dark | dark oak saplings — the only one that needs four of itself in a square, so it plants beside what it has already planted and a grove takes a few days rather than one |
Mush | mushrooms, red and brown — and only where they will survive: out of the light, or on mycelium and podzol where the light does not matter |
Flwr | flowers, one at a time |
Bone | plants nothing. It fertilises what is already there — saplings, grass, flowers, moss, mushrooms — and pointedly never a crop |
Two different alleles is not nothing, and it is not double
This is the part worth understanding before breeding for it. A variant is still recessive to the wild type: one copy and a wild type does nothing at all, exactly as it always did. But two different variants do not cancel out the way verdant's do. They both express, each at half its usual rate.
So the total is the same either way, and the choice is about what rather than how much:
- A matched pair specialises. It is the only way to a reliable dark oak grove, or to a wood that is all spruce.
- A mixed pair diversifies. It leaves a bit of everything, and will never make a monoculture — or a dark oak grove.
Halving is what keeps that a real choice. If a mismatch planted two things at full speed, every breeder would keep their lines deliberately mixed and a matched pair would be strictly worse than the thing you get by accident.
The rate is epigenetic
Roughly once a game day is the default; the interval is written on the allele copy and drifts with breeding, so a line can be pushed faster. Not much faster — the cap is deliberate. In a mixed horse each copy carries its own interval, so the two halves are not identical twins: one side of the pair can be quicker than the other, and that is inherited.
Measured over three continuous hours: three plantings, not twenty. The
spread verb picks one block per interval and gives up if
that block will not take, and for something that builds upward
only one of its three vertical candidates can ever work. Expect roughly
a third of the nominal rate. Gap 208.
Health
None.
- Gene key
horsegenetics.dryad- Alleles
Oak,Brch,Spru,Jung,Aca,Dark,Mush,Flwr,Bone,n- Inheritance
- recessive to
n; incompletely dominant between any two variants - Reaches the game as
- one
spreadeffect, or two at double interval - Epigenetic
interval, per copy- Coat effect
- none, ever
The interval is epigenetic and lives on the copy, so a mixed
horse reads copy(0) and copy(1) separately and
doubles each. GeneEpigenetics.copy(int)'s own documentation
already said it exists for “a codominant gene, where both copies
contribute at once” — the model was shaped for this before
anything needed it. Asking for expressed() here would count
one allele twice and the other never.
It used to be picked from pos.hashCode(), from a list of
six — and one of the six was dark oak, which
vanilla will only grow from a 2 × 2 block of saplings. A
gene that plants one at a time, at random, every few thousand ticks,
will essentially never make a square. A sixth of this gene's
entire output was permanent litter, and it also blocked the
square it stood on.
Measured the night of 2026-09-13: a dark oak planted at 01:28 was still a sapling at 02:04, while an oak planted at 00:00 had been a tree since 00:01, and one position logged ten failed growth attempts in forty-five minutes. Naming the species on the allele fixes it at the root — a dark-oak horse plants only dark oak, so its saplings accumulate in one place — and the translator then clusters them, preferring a free spot beside one already standing. The square completes on its own.
Every planting word goes through BlockState.canSurvive
before the block is written. A mushroom placed into daylight pops off on
the next tick and a flower on the wrong ground never existed —
both look exactly like a broken gene, which is the failure this project
keeps rediscovering. One call covers every species, and it is why the
mushroom allele needs no light table of its own.
Note what it does not cover: a dark oak can survive
anywhere an oak can. It simply cannot grow. That is why the clustering
is a separate mechanism and not a stricter canSurvive.
This gene's javadoc used to carry the sentence: “An earlier specification had it bone-mealing the surrounding area. That makes a horse which auto-farms every crop you own, which is an economy lever nobody asked for and very hard to walk back once players have it.” The owner asked for the allele on 2026-09-13, and that note did exactly the job it was written for: it made the reversal deliberate rather than quiet.
So the objection is met head-on. The
bonemeal cover refuses crops — wheat, carrots,
potatoes, beetroot, stems, nether wart, cocoa, berries. What is left is
a horse that hurries a wood along, which is the flavour the allele was
wanted for and none of the economy the old note was worried about. It
also rolls the block's own isBonemealSuccess, so it is no
faster than a player with a stack of the stuff.
Nine variants makes the arithmetic do something interesting
Nine variants means nine matched pairs and thirty-six mixed
ones. At any allele frequency a wild dryad is overwhelmingly likely
to be mixed — which is the right texture (you find horses that leave a
bit of everything; a horse that plants only dark oak is something somebody
bred) but it also means the expressing rate climbs fast with frequency. The
per-variant figure is held low to keep the locus near the one per cent it
has always been. Name the constant, never the number:
DryadGene.PER_VARIANT.
A gene you notice a week later
Almost everything in the mod expresses immediately or not at all. This one expresses across sessions: you stable a horse, and later there are trees there. That is a different relationship to a gene than any other locus offers, and it is worth having one.
Why this locus is incompletely dominant when the others are not
Verdant and the matched-pair loci all take the opposite rule: two different variants are inert. That was a deliberate design — a locus with dozens of alleles where any one showed would be a slot machine, and requiring the same allele twice makes it a search with a target.
Dryad is the one place that rule cost more than it bought, and the reason is that its outcomes compose. Two different ground covers genuinely conflict: a block is mycelium or it is moss. Two different plantings do not conflict at all — a wood can hold oak and birch, and a horse that leaves both is a coherent thing to be. So the inert-mismatch rule was doing no work here except deleting outcomes, while the dark oak needed a reason for a breeder to fix a line.
Halving the mixed rates supplies that reason without punishing the mix: specialise and you get one thing reliably, including the only tree that requires it; mix and you get variety at the same total pace. The locus now has two ways to be played well, which is more than it had.
What was considered and not done
- Dropping dark oak. Simplest, and it throws away the one allele with a real breeding story attached — the only one where a matched pair is not merely tidier but necessary.
- Planting the 2 × 2 outright. Guaranteed, and it makes dark oak the only allele that produces a whole tree per interval rather than a sapling. Clustering keeps every allele on the same budget and keeps the owner's word for it, which was “eventually”.
- Full rate for both halves of a mixed pair. Easier to explain, and it makes a mismatch strictly better than a match — which would give breeders a reason to never fix a line, at a locus whose most interesting allele requires one.
common/genetics/genes/DryadGene.java