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.

Seen working, 2026-09-13

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

CombinationOutcome
n/nnothing — the ground is left as it was
one variant and nnothing. A variant is recessive to the wild type, and the horse passes it on
two of the same variantthat one thing, at full rate
two different variantsboth, each at half rate

The nine things a dryad can leave

AlleleLeaves
Oakoak saplings — the common one, and the fastest to become a tree
Brchbirch saplings — tall, thin, and forgiving about where they stand
Spruspruce saplings — a spruce horse makes a wood you cannot see through
Jungjungle saplings — the tallest single sapling in the game, and the one that wants room
Acaacacia saplings — grows crooked, so an acacia line never makes the same shape twice
Darkdark 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
Mushmushrooms, red and brown — and only where they will survive: out of the light, or on mycelium and podzol where the light does not matter
Flwrflowers, one at a time
Boneplants 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.

It is slower in practice than the interval suggests

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 spread effect, or two at double interval
Epigenetic
interval, per copy
Coat effect
none, ever
The half-rate rule needed no new machinery

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.

Why the species is on the allele, and not picked by the translator

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.

Never plant what cannot live there

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.

Bone meal was refused once, and the refusal was answered rather than overruled

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.
Source: common/genetics/genes/DryadGene.java