Start here
Breeds
A breed is a constrained slice of the gene pool plus the
metadata the spawn and breeding systems need. Wild herds are
rolled from a breed so that a paddock of horses reads as a population rather
than 47 unrelated animals; a lone wild horse, a /summon or a
spawn-egg horse is the Feral Mixed breed and rolls every gene
unconstrained — the pre-breeds behaviour. This page is the readable
version of the breed files; the numbers in them are a first pass.
A breed is a JSON file. Every breed here lives in
common/src/main/resources/horsegenetics/breeds/, one file each, and a
breed you write yourself goes in .minecraft/phc/breeds/ and needs
nothing but the jar - the folder is made on first launch, and the Breeds tab of the H
menu opens it. The breed designer writes them and the
breed file format documents them. Java breeds are
still possible for one that needs behaviour rather than numbers, and
Feral Mixed is the only one shipping that way.
Herd or loner
BreedSpawnHandler (a one-line FinalizeSpawnEvent
hook) does nothing but tag a NATURAL / CHUNK_GENERATION / SPAWNER horse with
a wild_spawn NBT flag. It does not touch the pack
SpawnGroupData: Horse.finalizeSpawn replaces any
custom pack data with its own Horse.HorseGroupData between every
pack member, so that route can carry nothing (the earlier
BandData attempt silently made every horse its own herd of one
— "herds are all mixed breeds", "groups of four solo Feral Mixed").
HerdManager.assignFounder forms the herd by proximity,
one tick later (deferred from onHorseJoin's
server.execute, so nothing heavy runs inside the chunk system).
A freshly-spawned wild horse looks at the untamed wild horses within
HERD_RADIUS (32) blocks:
- if one is already in a wild herd → join it: its breed, its band, its lead, and a sex that fits the band (traditional joiner = mare, bachelor joiner = stallion);
- else if one is also a fresh natural spawn (a pack-mate still
waiting its turn) → found a herd: this horse is the lead
stallion, the breed is
pickHerdBreed(weighted by commonness, Feral Mixed only if the biome has no breeds), the band is a 70/30 coin; - else it is genuinely alone → a lone Feral Mixed, no herd.
So every clump of wild horses is one herd of one breed, and only a
solitary horse is Feral Mixed — and because a lone horse near an existing
herd joins it, you never see a knot of unrelated solo horses. A
spawn-egg horse (record pre-set) or a /summon has no flag and
stays Feral Mixed; breeding overrides that with the parents’ cross.
Which biomes spawn horses at all is
data/horsegenetics/neoforge/biome_modifier/add_horse_herds.json, a
horsegenetics:breed_herds modifier (BreedHerdsBiomeModifier):
herd-sized (weight 10, 3–6) horse spawns in the biomes it lists
and in every biome any wild breed names - once each, never twice.
The second half is what makes a drop-in breed spawn: a breed living in a dark forest
or a modded biome gets herds there on the next start, with nothing edited but its own
file. add_horse_loners.json adds a thin weight-1 1–1 trickle to every
overworld surface biome (a strong bias to packs). So horses appear in taiga, jungle,
badlands, swamp, the snowy biomes and mushroom fields, none of which spawn them in
vanilla. A horse still needs grass and light to spawn, so a breed that names a desert
or the Nether will rarely or never be seen wild.
Day and night. A breed's spawn_time (any,
day or night) is checked when a herd is founded: outside its
hours the breed is not a candidate, and the biome's other breeds share the draw
(HerdManager.pickHerdBreed). Vanilla will not spawn an animal in the dark
on a chunk near a player, so a night breed's herds mostly come from chunks generated
after dark.
Traditional bands and bachelor bands
A wild pack is one of two shapes (BandType), chosen ~70/30 by
the first member spawned:
- Traditional — one stallion (the herd lead), his
harem of mares, and the occasional foal. Foal rate is vanilla's ~5% per
pack member for now — the pack
AgeableMobGroupDatacan no longer be overridden, so the intended "up to 3 foals" is a follow-up. - Bachelor — a band of 3–5 stallions, no mares, no foals. The first one spawned is the lead.
Every member of the herd shares the lead's breed and band. WildHerdGoal
(a follow goal on every untamed horse) keeps non-leads within a few blocks
of the lead, re-pathing every ~15 ticks, so a spawned pack stays clumped and
wanders together. If the lead dies or unloads for 10 s, the first
member to notice promotes itself. HorseCareHandler's
together-timer herd formation now skips any horse already in one of these
natural herds.
Wild horses aggro like wolves
HorseAggroHandler. Hitting an untamed horse turns it
and every herd-mate within 24 blocks on the attacker — a
horse will path to and kick anything it is angry at, for 4 damage (vanilla
horses have no ATTACK_DAMAGE; this handler adds it via
EntityAttributeModificationEvent). Break line of sight for
3 seconds and the horse clears its target and goes back to neutral
(WildHorseForgetTargetGoal). Tamed horses are never affected,
and debug-dimension horses take no damage so they never aggro.
What a breed pins
| Category | Behaviour when the breed doesn’t name it |
|---|---|
| Coat genes (extension, agouti, the dilutions, every white-pattern locus) | Forced to wild type. A breed is visually unified — a Friesian is jet black because nothing switches a pattern or dilution on. A breed that should have a pattern lists it with a rate. |
| Disorder genes (ACAN, PLOD1, MET…) | Forced clear. A breed carries exactly the disorders its sheet lists — the Quarter Horse names HYPP, PSSM1 and HERDA at their carrier rates, the Arabian SCID, CA and LFS — and nothing else ever turns up on a founder. There is no background rate. A foal can still inherit one from a parent of another line. |
| The four magical body-stat genes (size, speed, health, jump) | Driven by the breed’s stat bands: an axis with a band makes every founder carry that gene’s pushing allele and writes the target onto its copies - two copies for speed, health and jump; for size one copy between 0.7x and 1.3x and two outside it; an axis with no band is left wild. Founders only. |
| Other magical genes (mane/tail colour, healer, zebra, milk, light, particle, verdant…) | Forced wild. A breed has the magic it names and no other — see where magic comes from. |
| Any gene’s epigenetic numbers (how far a splash covers, how wide a dorsal stripe is) | Rolled from the value’s own design range. A breed that names a band for one gets every founder written inside it instead. Founders only. |
Epigenetic bands: “deeply black”, not merely “black”
A pool says which allele; a band says how much. Each gene declares named numbers on every allele copy, and a breed may pin any of them to a closed range — the general form of what the stat bands already did for the four body axes. Each founder gets a point inside the band on both copies, drawn separately so its two gametes are not interchangeable.
Three things a band will not do, each warned about at load rather than silently ignored: it cannot touch the four body-stat genes (those belong to the breed’s stat scores), it cannot band a seed or a category (neither has a “slightly more”), and a value the gene does not declare is dropped the way an unknown gene is. See the format page.
Stats: the score → multiplier curve
The sheet scores speed, jump and heartiness 1–10. Score 5 is the value the vanilla-calibrated baseline already produces — multiplier ×1.0. Score 10 is the sheet’s stated ceiling, and the curve is linear to it:
| Axis | 5/10 | 10/10 | × at 10 | × at 1 |
|---|---|---|---|---|
| Speed | 9.71 m/s | 19.6 m/s | ×2.02 | ×0.20 |
| Health | 22.5 hp (11¼ hearts) | 50.5 hp | ×2.24 | ×0.20 |
| Jump | 2.5 m | 8.57 m | ×3.43 | ×0.20 |
Size is not scored; a breed writes it as a multiple of an
ordinary horse, "size": [lo, hi], and the range is the
band. A Quarter Horse runs about ×0.92–1.05, a
Percheron ×0.98–1.38 (taller than the player at the top end), a Shire
or Clydesdale ×1.14–1.43, a Falabella ×0.38–0.51. The files were
written in hands until 2026-09-10 and were converted through the old curve - hands over
15.75, with the part above 1.0 tripled (BreedStatCurve.sizeForHands) -
so no breed changed size. Hands are still how a horse's size reads: the info
screen and the Breeds tab turn a scale back into them (handsFor).
Size decides the genes, founder by founder. A founder's size is drawn inside the range first. Between 0.7x and 1.3x it carries one copy of the size allele and the wild type, with the whole distance on that copy; outside it, two, sharing it. So a miniature or a draught horse breeds true for size, and a breed of ordinary-sized horses throws some variety among its foals - which is how most size variation is carried. A range across 1.3 (a Clydesdale's) produces both.
Each axis becomes a target band (BreedStatCurve).
Every founder of the breed is given the pushing allele (both copies, bar the size rule
above), and BreedFounder then picks a point inside the band and
writes it onto that founder’s two allele copies as
ordinary epigenetic numbers. So a Thoroughbred reliably resolves near
×2 speed even though two Swift copies on the ordinary
Gaussian would only reach ×1.2. A band that would straddle 1.0 (a
near-baseline breed) is dropped and the locus is left wild, so the horse sits
exactly on the baseline.
The two copies split the target unevenly, on purpose. Two identical copies would make a founder’s gametes interchangeable, and half the interest in breeding from a good stallion is that his foals differ depending on which copy they drew.
A breed shapes its founders and then lets go
BreedFounder is the only place a breed
influences a number. Once a horse exists it is whatever it inherited:
nothing re-imposes the standard, and a cross is never
normalised. A Percheron bred to a Falabella produces a foal
carrying one enormous copy and one tiny one — whichever copies it
actually drew — and its siblings differ from it accordingly.
This used to be false, and it was the main reason for the epigenetics
rewrite. The band was applied every time a horse’s body was
resolved, and BreedLineage.statTargets() handed a
cross the per-axis average of its two parents’ bands. So that
Percheron × Falabella foal had its size recomputed into a mid-size
band on every lookup, regardless of its alleles, with no way for a breeder
to select out of it. BreedStatTargets.average and the
resolve-time path are both gone.
A breed label is therefore cosmetic. It decides what a wild horse of that breed is born as and what a herd spawns, and after that it is lineage bookkeeping for the family tree and the naming. A “Percheron” bred tiny for fifty generations is tiny, and still labelled Percheron. Keeping a line to a standard is the player’s job, not the game’s.
Where magic comes from
A breed's founders carry exactly the magic the breed names. A zombie breed is a set of genes that make it look rotted, a temper and a slow speed score, and every founder is that; it never throws a galaxy coat or a healer because a dice roll said so. Magic in a breed is a design decision, made in the breed designer or the file.
Random magic still exists, in one place: Feral Mixed, the unbred population a vanilla horse spawn and a breedless custom egg belong to. It rolls every gene from that gene's own founder table, magical ones included, so a feral horse is where a stray magical trait turns up — and breeding it into a line is how a player gets magic a breed was not designed with. (Generated stables still add their own extra magic on top of the breeds they place — see stables.)
Where a breed may come from
A breed names any subset of four sources, and naming none means all four. They are a checklist rather than a mode because they are genuinely independent — “a breed the cowboy has heard of but that no longer runs wild” is a real thing to want to say, and so is “a collector’s breed that only exists as an egg”.
| Source | What switching it on means |
|---|---|
wild | May head a wild herd, in one of its biomes. This is what Breeds.forBiome filters on. |
cowboy | The cowboy may breed and sell one, as a signed transfer paper priced from the breed’s range. |
spawn_egg | A breed spawn egg exists for it, and can turn up in dungeon loot or the horseman’s stock. Clearing this is the “opt out of having an egg” switch. |
stable | May be pre-placed in a generated stable. A stable definition naming a breed that has switched this off skips it. |
Feral Mixed names no source at all, which is the honest answer:
it is the absence of a breed, so it never spawns as itself and never has an egg.
A world's own ecology: breed-spawning.toml
A player's breeds are their own files; the breeds the mod ships are inside the jar.
.minecraft/phc/breed-spawning.toml is how a world changes
the shipped ones without unpacking it — and how it switches them off entirely,
so that the only horses in it are the ones its owner designed. It is written on first
launch, generated from the registry: one section per shipped breed, each defaulting to
what that breed’s own file says, so what you edit is a number you can see.
| Setting | What it does |
|---|---|
general.shipped_breeds_enabled | false switches every shipped breed off at once — no herds, cowboy stock, stables or eggs — whatever their sections say. |
breeds.<id>.enabled | false: the breed loses every source. It keeps its entry — horses already carrying the label still have a breed, and the breed book still explains it (“Not found anywhere in this world”). |
breeds.<id>.spawn_weight | Its pull against the other breeds of the same biome when a herd is founded, on the commonness scale (moderate is 6). 0 takes it out of the wild only; the cowboy, stables and eggs keep it. |
breeds.<id>.biomes | Where its wild herds live. Any biome id, modded included. |
breeds.<id>.spawn_time | any, day or night. |
feral_mixed.enabled | Whether a wild horse may be Feral Mixed at all. |
feral_mixed.biomes | Where it may be. Empty is everywhere. |
feral_mixed.herd_weight | Its weight against a biome's breeds when a herd is founded. 0 (the default) keeps it to where no breed may spawn, which is what it always was. |
A wild horse with nothing to be does not spawn. A natural spawn,
chunk-generation spawn or spawner spawn is refused outright
(BreedSpawnHandler, Breeds.anythingMaySpawn) when no breed of
its biome may head a herd at that hour and Feral Mixed is not allowed there.
What gets past that — a horse that turns out to be alone where Feral Mixed is off
— is discarded by HerdManager a second later, before any record or
coat is made for it. /summon and a vanilla spawn egg are a player asking
for a horse, and always make a Feral Mixed.
Everything that spawns a horse asks the same registry, so nothing else knows the file
exists: Breeds.applySpawnSettings keeps each breed as its file says and
publishes a copy with the world's settings applied. Edits are re-read while the game
runs and reach herds, the cowboy, stables and eggs at once; which biomes get extra
herd spawns is decided by the biome modifier at world start, so moving a breed to
a new biome wants a restart.
Despite the name of this section, the file belongs to the install (or the dedicated server), and every world opened on it shares it. It is a COMMON config because the herd biome modifier needs it before any world exists. A per-world copy is recorded as gap 190.
Breeding: crosses and mixes
A foal’s breed label (BreedLineage.combine, applied in
HorseBreedingHandler.applyBredFoal):
| Dam × Sire | Foal |
|---|---|
| Friesian × Friesian | Friesian |
| Friesian × Arabian | Arabian × Friesian cross (components sorted, so order never matters) |
| (Arabian × Friesian cross) × (Friesian × Arabian cross) | Arabian × Friesian cross |
| (Arabian × Friesian cross) × Arabian | Arabian × Friesian cross |
| (Arabian × Friesian cross) × Quarter Horse | Mixed |
| (Arabian × Friesian cross) × (Friesian × Quarter Horse cross) | Mixed |
| Mixed × anything | Mixed |
| anything × Feral Mixed | Mixed (Feral Mixed is absorbing — see below) |
| Feral Mixed × Feral Mixed | Mixed (no back door to a “pure feral” line) |
Spliced lines
A gene splice carrot whose allele actually reaches the foal
marks it Spliced (its breed), and the mark never washes out. It is not
a new rule: splice is a reserved lineage component, so a spliced Friesian
is the pair {friesian, splice} and every row of the table above applies to
it unchanged.
| Dam × Sire | Foal |
|---|---|
| Spliced (Friesian) × Friesian | Spliced (Friesian) |
| Spliced (Friesian) × Spliced (Friesian) | Spliced (Friesian) |
| Spliced (Friesian) × Arabian | Mixed |
| Spliced (Friesian) × Spliced (Arabian) | Mixed |
| a cross, spliced | Mixed (three lines, which has always been Mixed) |
| Mixed or Feral Mixed, spliced | unchanged (neither names an ancestry to qualify) |
“Actually reaches the foal” is decided by
SpliceOutcome.spliceReached, and it asks a question about the foal rather
than about the carrot: at a locus a carrot substituted, does the foal carry an
allele neither parent had? A mare fed a splice for a gene the stallion already
carries has added nothing, and correctly does not mark the foal. Feeding a splice is a
gamble and the carrot is spent either way.
This is what makes an ordinary purebred worth more than a spectacular spliced one. Anybody can splice a Friesian into something remarkable; only a breeder can get there without, and the label is the difference.
The label is stored on the HorseRecord (breed,
an optional string token) and surfaced in three places: the mounted-horse
info panel (under the sex / generation line), the right-click-with-paper
dump (breed: line), and the dev-build [coat] chat
line (a [Breed Name] tag). The stallion seed jar carries the
donor’s breed token in its StoredGenome so a seed-jar foal
crosses correctly.
The custom spawn egg “Breed:” preset
CustomHorseSpawnScreen has a Breed: cycle button.
Landing on a real breed calls BreedFounder.roll and loads a
fresh wild individual of it — genotype, epigenome and sex —
straight into the editor; you can then hand-edit any locus. The selected
breed token rides along in SpawnCustomHorsePayload and is
stamped on the spawned horse (record.withBreed) — but the
label alone changes no number, so a horse whose genome you then hand-edited is
whatever you edited it into. The first entry, Feral Mixed, is no
preset: it leaves the current genome alone and spawns an unbred horse. Drop-in
breeds from .minecraft/phc/breeds/ are in the list with the rest.
Not modelled (yet)
The sheet asks for genes and features this mod does not have. None were built
in this pass; each is recorded in the breed’s notes() and
collected in the roadmap:
Leopard complex (— built 2026-09-06 as three loci. Appaloosa / Knabstrupper roll it heavily, Kiger / Mustang / Shetland lightly. Striped hooves and white sclera are drawn; mottled skin is not (no skin layer).Lp+PATN1)HYPP— Quarter Horse / Paint. Built as SCN4A: one copy is a survivable heart-and-speed cost, two are lethal at birth, and it is dominant — so a wild-caught Quarter Horse really can be an affected one. PSSM1 and HERDA shipped with it.Pangare / mealy— built as its own three-allele locus. Exmoor and Fjord carry it near-fixed.- Early-lethal foal disorders named on the sheet —
SCID,CA,LFS,GBED,CVM,megaesophagusall built on the recessive-disorder pattern (PRKDC, TOE1, MYO5A, GBE1, CVM, megaesophagus). NNF is the one still without a locus. - Mane shape — the baroque flowing manes (Andalusian, Friesian, Gypsy), Przewalski’s upright mane with no forelock. Roadmap render item. The Fjord’s two-tone mane is colour, not shape, and dun draws it.
- Lower-leg feathering — Clydesdale, Shire, Friesian, Gypsy Vanner, Dales, Dartmoor. Roadmap render layer.
Flaxen— built as a three-allele dosage locus. Haflinger and Belgian Draft carry it heavily.- Gait (
DMRT3) — the gaited breeds (Paso Fino, Tennessee Walking, Standardbred, Icelandic tölt, Hackney action). Needs animation work. - Won’t model — the Akhal-Teke / Karabakh metallic sheen (a shader), the Marwari’s inward-curving ear tips (a mesh change), and dished / convex / Roman head profiles (Arabian, Lusitano, Percheron, Lipizzan, Shire).
The 49 breeds
Every one of them also has an entry in the breed book — what the breed is, what it was made for, and how it came to be running loose here. This table is the machinery; that page is the reason the machinery has these particular numbers in it.
Height is the stable-notation range from the sheet (baseline 15.75 hh = ×1.0 scale). S / J / H are the 1–10 speed / jump / heartiness scores. Rarity sets the herd-roll weight (Extremely common 48 → Very rare 0.75, doubling per step).
| Breed | Biomes | Height | S | J | H | Rarity | Colour genes & notes |
|---|---|---|---|---|---|---|---|
| Akhal-Teke | desert, savanna, badlands, savanna plateau | 14.2–16.0 | 9 | 5 | 8 | Uncommon | any base; light cream; occasional grey; often nd1. Metallic sheen not modelled. |
| American Cream Draft | plains, sunflower plains, meadow | 15.0–16.0 | 3 | 2 | 5 | Rare | fixed e/e + fixed Cr/Cr → cremello, amber eyes, pink skin. |
| American Miniature | plains, sunflower plains, meadow | 7.0–8.2 | 2 | 1 | 4 | Very common | every dilution + tobiano + sabino + roan + SW1 splash. Size band sits near the minimum scale. |
| American Paint | plains, savanna, windswept savanna | 14.2–16.0 | 7 | 5 | 6 | Very common | tobiano + sabino + three KIT boosters (W20, W35, W32, W34) + frame overo + splash at both loci (SW1 and SW2). O/O lethal white is the breeding hazard, and HYPP is the other one. |
| Andalusian | plains, forest, sunflower plains, meadow | 15.0–16.2 | 6 | 8 | 5 | Moderate | black-biased; often grey. Baroque mane not modelled. |
| Appaloosa | taiga, forest, windswept hills | 14.2–16.0 | 6 | 7 | 7 | Moderate | the defining leopard-complex breed — ~75% carry LP, PATN1-dominant, so most of a herd shows leopard / fewspot / blanket. Light roan too, and the only breed carrying SW4 — the splash allele described in one Appaloosa family. |
| Arabian | desert, savanna, badlands, savanna plateau | 14.2–15.3 | 7 | 6 | 9 | Common | bay-biased; grey common; light sabino. Dished face not modelled. Carries SCID, CA and LFS at carrier rates. |
| Banker Horse | beach, stony shore, river | 13.2–14.2 | 6 | 4 | 9 | Rare | feral Spanish stock; primitive marks, sabino, occasional cream. |
| Belgian Draft | plains, forest, meadow | 16.0–17.0 | 3 | 2 | 6 | Common | chestnut; roan common; occasional cream/pearl. Flaxen not built. |
| Camargue | swamp, mangrove swamp, river, beach | 13.2–14.2 | 5 | 4 | 9 | Uncommon | fixed grey — born dark, whitens with age (age not modelled, so effectively always grey). |
| Canadian Horse | snowy taiga, grove, snowy plains | 14.0–16.0 | 6 | 5 | 9 | Rare | black-biased; some grey / roan. |
| Caspian Pony | desert, badlands, savanna | 9.0–11.2 | 5 | 4 | 7 | Rare | bay-biased; minimal white. Fragile bones → low heartiness, not a lethal gene. |
| Cleveland Bay | plains, forest, meadow | 16.0–16.2 | 6 | 6 | 8 | Rare | fixed A_ + E-heavy extension → always bay with black points, minimal white. |
| Clydesdale | taiga, snowy taiga, grove, river | 16.2–18.0 | 3 | 3 | 5 | Uncommon | black-biased; tobiano; heavy sabino + splash → big white legs / face. Feathering not built. |
| Connemara Pony | windswept hills / gravelly hills / forest, stony shore | 13.0–14.2 | 5 | 8 | 8 | Moderate | often grey; occasional cream / dun. |
| Dales Pony | windswept hills / gravelly hills, taiga | 13.2–14.2 | 5 | 6 | 9 | Rare | black-biased; some grey / roan; occasional dun. Feathering not built. |
| Dartmoor Pony | windswept hills, meadow, forest | 11.2–12.2 | 4 | 5 | 8 | Rare | any base; some grey / roan; occasional cream. |
| Exmoor Pony | windswept hills, taiga, snowy slopes | 11.2–12.3 | 4 | 4 | 10 | Rare | landrace; bay-biased; nd1 primitive marks, no white/dilution. Pangare not built. |
| Falabella | plains, sunflower plains, meadow | 6.0–8.0 | 2 | 1 | 3 | Uncommon | every dilution + tobiano + sabino + splash. Smallest breed — size band at the minimum scale. |
| Norwegian Fjord | snowy taiga, frozen river, snowy slopes, grove | 13.2–14.2 | 4 | 3 | 9 | Uncommon | E_ + a/a + near-fixed dun → brown dun with primitive stripes and the two-tone midtstol mane. Near-fixed pangare too. |
| Friesian | plains, forest, meadow, river | 15.0–17.0 | 5 | 4 | 4 | Moderate | fixed E/E a/a, no white or dilution — always jet black. Feathering / wavy mane not built. |
| Gypsy Vanner | plains, river, swamp, meadow | 14.0–15.2 | 4 | 3 | 7 | Common | usually tobiano pinto + sabino + splash. Feathering / abundant mane not built. |
| Hackney | plains, sunflower plains, meadow | 14.2–16.0 | 6 | 3 | 4 | Uncommon | bay-biased; occasional roan; light splash. High knee action = gait, not built. |
| Haflinger | cherry grove, meadow, windswept hills, grove | 13.2–15.0 | 5 | 5 | 8 | Common | fixed e/e → chestnut; occasional roan. Flaxen mane not built. |
| Hanoverian | plains, forest, meadow, sunflower plains | 15.3–17.1 | 7 | 9 | 5 | Very common | bay-biased; some grey / roan; light splash. The jumping warmblood. |
| Icelandic Horse | snowy plains, ice spikes, frozen / jagged peaks, snowy slopes | 13.0–14.0 | 5 | 4 | 10 | Moderate | every colour — grey, roan, dun, tobiano, splash. Tölt = gait, not built. |
| Irish Draught | windswept hills / gravelly hills, taiga, forest | 15.2–17.0 | 5 | 7 | 8 | Uncommon | any base; grey / roan; occasional cream / dun. The sport-horse foundation. |
| Karabakh | desert, savanna, badlands | 14.0–15.0 | 7 | 5 | 8 | Rare | bay-biased; grey; occasional cream. Golden sheen not modelled. |
| Kiger Mustang | badlands, eroded / wooded badlands, savanna | 13.0–14.2 | 7 | 5 | 10 | Rare | strongly dun (dorsal + leg bars); occasional cream. Some carry the leopard complex; GBED and HERDA at carrier rates. |
| Knabstrupper | plains, birch forest, forest, meadow | 14.2–15.2 | 6 | 7 | 6 | Uncommon | bred hard for bold leopard — ~82% carry LP, PATN1-heavy, so leopard and fewspot dominate. Occasional cream; SW1 splash. |
| Lipizzan | plains, windswept hills, meadow, sunflower plains | 14.2–16.1 | 5 | 7 | 7 | Uncommon | heavy grey — born dark, whitens. One of the three breeds carrying SW2. Roman nose not modelled. |
| Lusitano | savanna, plains, savanna plateau | 15.0–16.0 | 6 | 8 | 6 | Moderate | black-biased; often grey. Convex profile not modelled. |
| Marwari | jungle, sparse / bamboo jungle, savanna | 14.2–15.2 | 7 | 5 | 9 | Rare | any base; tobiano; grey; occasional cream / dun. Lyre-shaped ears NOT modelled. |
| Morgan | plains, forest, taiga, meadow | 14.1–15.2 | 6 | 6 | 8 | Very common | any base; roan; sabino; SW1 splash; occasional cream / dun. Versatile American foundation breed. |
| Mustang | badlands, eroded / wooded badlands, savanna, windswept savanna | 13.2–15.2 | 7 | 5 | 10 | Moderate | wild-type diversity — every colour, dun, roan, tobiano, sabino, champagne. Some carry the leopard complex. |
| New Forest Pony | forest, birch / old-growth birch, flower forest | 12.0–14.2 | 5 | 6 | 8 | Common | any base; some grey / roan; occasional dun. |
| Paso Fino | savanna, jungle, sparse / bamboo jungle | 13.0–15.2 | 5 | 4 | 6 | Moderate | any base; roan; can carry dominant white / W20 / W35. Smooth lateral gait not built. |
| Percheron | plains, snowy plains, meadow, sunflower plains | 15.2–17.3 | 4 | 3 | 6 | Common | black-biased; heavy grey. Straight-profile draft. |
| Przewalski’s Horse | desert, badlands, savanna | 12.0–14.0 | 6 | 3 | 10 | Rare | near-fixed E_ A_ + fixed dun → stocky bay dun; no spotting. The true wild horse. Upright mane not built. |
| Puerto Rican Paso Fino | jungle, savanna, beach, mangrove swamp | 13.0–15.0 | 5 | 4 | 6 | Rare | any base; occasional cream / dun. Tiger eye — 26% carry a copy, 4% show the amber iris. The breed's signature, and essentially the only place to find the gene. |
| Quarter Horse | plains, savanna, sunflower plains, meadow | 14.2–16.0 | 8 | 5 | 7 | Extremely common | any base + cream + nd1/nd2 + roan + sabino, and splash at both loci — SW2 was described here. The sprinter, and the breed HYPP is named for. |
| Shetland Pony | mushroom fields, snowy plains, taiga, grove | 8.0–10.2 | 3 | 3 | 9 | Very common | any base; tobiano; sabino; SW1 splash; occasional dun / cream. Some carry the leopard complex. |
| Shire | plains, river, meadow, swamp | 16.2–17.3+ | 3 | 2 | 4 | Uncommon | black-biased; heavy sabino + splash. Tallest breed — scale band at the draught ceiling. Feathering not built. |
| Standardbred | plains, sunflower plains, meadow | 14.2–16.2 | 9 | 5 | 6 | Very common | any base; roan; light sabino; occasional cream / dun. Harness racer — pace/trot gait not built. |
| Suffolk Punch | plains, forest, meadow, sunflower plains | 16.0–17.2 | 3 | 2 | 5 | Rare | fixed e/e, no white or dilution — always “Suffolk sorrel” chestnut. |
| Tennessee Walking Horse | plains, forest, swamp, meadow | 14.3–17.0 | 5 | 4 | 7 | Very common | any base; cream / champagne; roan; sabino; some grey; splash. Running walk = gait, not built. |
| Thoroughbred | plains, savanna, sunflower plains, meadow | 15.2–17.0 | 10 | 8 | 4 | Very common | bay-biased; occasional grey / roan; SW1 splash. The highest W20 rate of any breed, plus a trace of W5 and W22 — most of the rare W series was first described here. Fastest and among the most fragile. |
| Trakehner | taiga, forest, old-growth pine taiga, grove | 15.2–17.0 | 7 | 8 | 5 | Common | bay-biased; some grey / roan; light splash. The lightest warmblood. |
| Welsh Pony | windswept hills, taiga, plains, meadow | 11.0–14.2 | 4–6 | 5 | 8 | Very common | any base; grey common; roan; sabino; SW1 splash; occasional cream / dun. |
Feral Mixed is absorbing
A horse with no herd identity — a lone wild spawn, a /summon, a
spawn-egg horse — is Feral Mixed, and every cross involving one
produces a plain Mixed foal. Feral × Feral included,
so there is no back door to a “pure feral” line.
It used to be called Unknown and combined like an ordinary distinct breed, so a Friesian bred to a wild loner produced a “Friesian × Unknown cross”. That forced the model to answer a question it has no good answer to: is Unknown a breed? Does it have a stat band, a gene pool, a purity? Can a line be bred back to pure Unknown? Making it absorbing deletes the question instead of answering it, and says the true thing — a horse of unrecorded ancestry contributes unrecorded ancestry, and what comes out is a horse of mixed breeding.
The serialised token is feral_mixed. Like every other format change in
this mod there is no back-compatibility: a horse saved as unknown reads
as Feral Mixed anyway, since an unrecognised token has always fallen through to it.
Code map
common/breed/Breed— the record: id, name, natural/magical, biomes, spawn weight, source checklist, per-gene pools (as allele tokens), stat scores, epigenetic bands, price, notes. A fluentBuilder, used by the parser and by the Java escape hatch.common/breed/Breeds— the registry: the shipped files, the drop-in folder,FERAL_MIXED;forBiome,from,get,displayName,registerJava. The count isBreeds.all().size().common/breed/BreedSource— the four-way source checklist.common/breed/BreedBands— the epigenetic bands a breed pins.common/breed/spec/—BreedSpecParser,BreedSpecWriter,BreedSpecLoader,BreedFileTool: the file format, both ways round.neoforge/ModBreedSpecs— loads.minecraft/phc/breeds/, after the drop-in genes;folder()is what the Breeds tab's button opens.neoforge/world/BreedHerdsBiomeModifier— herd spawns in every biome a wild breed names.common/breed/Commonness— the rarity → weight ladder.common/breed/BreedStatCurve— score / hands →TargetBand.common/breed/BreedFounder— rolls a founderGenomefor a breed (start fromGenotype.random, override the constrained / coat / body-stat / magical genes).common/breed/BreedLineage— the label value object: pure / cross / spliced / mixed / feral,combine,displayName, token round-trip.common/genetics/SpliceOutcome— did the splice carrot’s allele actually reach the foal.common/trait/{StatAxis,TargetBand,BreedStatTargets}— the band types;HorseTraits.resolvetakes aBreedStatTargets, and the four magical body-stat genes read it throughTraitBuilder.breedBand.neoforge/server/BreedSpawnHandler— a one-lineFinalizeSpawnEventhook that flags natural spawns.neoforge/server/HerdManager— the deferred genome / record / proximity herd formation.neoforge/server/DebugHighlightHandler— the F8 glow toggle.neoforge/server/WildHerdGoal— a herd member trails its lead.neoforge/server/HorseAggroHandler— wolf-style herd aggro + the horseATTACK_DAMAGEattribute.common/breed/BandType—TRADITIONAL/BACHELOR.neoforge/…/data/horsegenetics/neoforge/biome_modifier/— which biomes spawn horses.