Gameplay / progression
The checklist & the collection
Two answers to “what do I do now?” — a checklist that walks you through everything the mod can do, and a collection of every allele in it with the ones you have never met still under fog.
The checklist
At the bottom of the Getting started tab, under the prose it explains. Thirty-one tasks in seven groups, from taming your first mare to signing a transfer paper, and each unticked one carries a line saying what to actually do.
It gates nothing. Nothing in the mod asks whether a task is done. A player who reads this wiki and builds a research shelf on their first day ticks two boxes at once and is not stopped — the moment a checklist gates content it stops being advice and starts being homework.
Ticking one says so in chat, once, with a running count. The groups are:
- First steps — tame a mare, tame a stallion, shear one for hair, name one, breed a foal.
- Reading a horse — take a gene off one with a book, build a shelf, file a paper, copy one.
- Putting a gene into a horse — craft a gene carrot, feed one, and use each of the four general breeding carrots.
- What breeding can produce — a foal carrying something it does not show, one homozygous for a non-baseline allele, one homozygous for the baseline. These arrive on their own; they are there so the words mean something the first time you read them.
- The horse dimension — light a hay portal, go through it, bring a horse back.
- Living with horses — bond with one, milk a mare, give one a stall, use each of the three whistles, fill a seed jar.
- Other people — trade with a horseman, meet a cowboy, sign a transfer paper.
The collection
The Alleles tab is every allele of every gene in the mod. The ones you have met are named and lit; the ones you have not are ??? and a row of question marks the right length. Each gene shows how many of its alleles you have, and the header counts the lot.
Every allele on any horse you tame or breed joins the collection — both copies, at every locus, baseline alleles included. That is a record of what you have laid eyes on, and the plain wild-type alleles count exactly as much as the strange ones.
Discovering a gene is the other thing and is deliberately harder: it takes owning a living horse that carries something other than the plain baseline there — tamed, bred, bought or given — and that is also what unlocks the gene's carrot recipe. A research paper will not do it; papers are components, not lessons. An ordinary horse fills in a lot of your collection and discovers nothing.
So the two tabs answer different questions. The gene database is what can I make?; the collection is what is left out there?
Tasks are an enum in common/
common/progress/ProgressTask is the vocabulary: an id, a title, a hint
and a group, with no Minecraft in it, so it is testable without a game and it survives
the version port. The hooks that complete a task are necessarily Minecraft-side and
live next to whatever event already existed — taming in the tame handler, foals
in the breeding handler, whistles in the whistle item.
A checklist with an item nobody can tick is worse than a shorter checklist: it
reads as a bug and the player cannot tell which one. Because the enum is in one
module and the hooks are scattered across another by design, nothing but a sweep
can prove they are all reachable —
node neoforge-26.1.2/tools/check-progress-tasks.mjs is that sweep,
and it fails by name.
HorseProgress.complete(player, task) is the whole API a handler uses. It
swallows a client-side player, a null and a server-less world, because it is called
from a dozen files and the twelfth call site will be careless.
HorseProgressData is the {@code SavedData} behind it, keyed by player
UUID beside the gene database, and completing is idempotent - it says something in
chat exactly once.
The collection is a second set, on purpose
GeneDatabaseData holds two things per player now: the book of
discovered genes, and a flat set of geneKey|token for alleles seen. They
are separate because sharing one map would have made one behaviour quietly become the
other — an entry in the book is what knows() tests, so recording
baseline alleles there would have unlocked every gene in the mod off one ordinary
horse.
Both ride the same GeneDatabaseSyncPayload, which grew a third field, and
both are mirrored client-side in ClientGeneDatabase.
collect() is called from GeneDiscoveryHandler.discoverFrom,
which is already the one place that sees a genotype the player has earned.