Magical gene / no coat effect

Magic fighter

What the horse hits for. Wild type is 3 points — a heart and a half. The gladiator allele adds a percentage of that, the wimp allele takes one off, and both copies are added with opposite signs, so a wimp copy really does count against a gladiator one.

Crossing two of them

What it does

Horses in this mod already fight: a wild one that is hit will path to its attacker and kick it, and its herd comes too. This locus decides how much that hurts.

CombinationOutcomeDamage
n/nwild3 points
Gld/nmore+1 to +3 from a wild copy
Gld/Glddouble-moreboth percentages, added — no ceiling
Wmp/nlessa share off
Wmp/Wmpdouble-lessboth off, floored at 1 point
Gld/Wmpbalancedthe two cancel

A wimp copy cancels a gladiator copy

This is the part worth knowing before breeding for it. A Gld/Wmp horse is not “a gladiator that also carries a wimp” — the two percentages are added with opposite signs and the horse comes out near the baseline while throwing both extremes.

So breeding a fighter means breeding the wimp allele out as much as breeding the gladiator in, and crossing a spectacular fighter with a poor one gives an ordinary foal carrying both. That is a far more interesting animal to own than one which simply inherited the better half.

No ceiling, but nothing to catch

A wild gladiator copy is worth between one and three extra points. Nothing caps it after that: the percentage drifts a little at every breeding, so a line selected for it climbs past the wild range and keeps climbing. What a player cannot do is catch a monster — the founder table lists the two carriers and the plain horse and no doubled form at all.

Health

None to the horse. A doubled wimp is harmless rather than unwell.

Its gene carrot

Gene key
horsegenetics.magic_fighter
Alleles
Gld gladiator, Wmp wimp, n
Priority
146 — the magical body-stat band
Reaches the game as
a combat effect — the horse’s ATTACK_DAMAGE base value
Coat effect
none, ever
Newly built, not yet play-tested

Nothing on this page has been seen in game. The translator was written against the 26.1.2 sources and is flagged as unverified in its own comments. Checklist on To be verified.

The floor is on the damage, not on the percentage

A wimp copy subtracts a share of the baseline, and two unlucky ones after a few generations of drift would take a horse to zero or below. Zero damage is not “a very weak horse”, it is a horse that cannot attack at all, which is a different animal. So the sum is applied and then the result is floored at one point.

common/genetics/genes/MagicFighterGene.java
public static double damageFor(double sum) {
    return Math.max(MIN_DAMAGE, BASELINE_DAMAGE * (1.0 + sum));
}

Two epigenetic values, not one

Every other summed locus here carries a single delta and lets the allele supply the sign. This one carries a gladiator percentage and a wimp percentage on every copy, and only ever reads the one matching its allele.

A single shared value would work arithmetically, but it would mean the two alleles drew from the same distribution — and they should not. A gladiator copy is worth a third to a whole baseline; a wimp copy takes off a seventh to three fifths. Writing both on every copy costs one number, keeps each allele’s range its own, and is what lets a carrier’s sheet say what it is carrying.

Where the baseline lives

HorseAggroHandler registers ATTACK_DAMAGE on EntityType.HORSE, because vanilla horses have none. That registration now takes its value from MagicFighterGene.BASELINE_DAMAGE rather than repeating a number: this locus is what a player reads to find out what a horse hits for, and its wild type has to mean the same thing as a horse that has never been near the gene.

The translator writes a base value rather than a modifier, because the gene’s number is absolute — it is the damage the horse deals, not an adjustment to something the reader would have to go and look up. It is only written when it differs, so the common case is a comparison rather than an attribute write on every tick of every horse.

Why codominance is the whole design

A ranked locus — gladiator dominant to wimp dominant to wild — would have been simpler and would have produced a much duller gene. Under ranking, a carrier is a carrier: you cannot tell how good the hidden allele is, and crossing your best fighter with anything gives you either a fighter or not.

Summing makes every combination genuinely different, and it makes the bad allele matter. A herd that looks unremarkable can be full of high gladiator percentages masked by wimps, and finding that out is a breeding programme rather than a lookup. It is the same argument the four body-stat genes make, applied to the one axis where a player is going to care about the number in a fight.

Why the wild range is +1 to +3

Because a wild horse should be a nuisance and not a threat. Three points is a heart and a half; a wild gladiator carrier hits for four to six, which is a bad surprise and not a death. Everything past that is somebody’s project, and the mod would rather a player met their first genuinely dangerous horse in a paddock they built.

Source: common/genetics/genes/MagicFighterGene.java, neoforge/server/HorseAggroHandler.java