🃏 The DOC Player Card — Corrected Byte Map what each byte does, and where the old maps were wrong

The authoritative, byte-verified map of the 207-byte US/World-Edition .card: what each byte does in the game, and the offsets the community had wrong. Verified against real cards by the doc_card.py codec (round-trips byte-exact). A wrong offset doesn't throw an error — it silently changes the wrong thing.

Why this exists (a cautionary tale)

A longtime community card editor — call him JJ — modified cards and sold them. He'd used an early editor whose field map was incomplete. When he moved to a more thorough tool and changed the value he'd always changed, he unknowingly altered the horse's personality — because that byte sat next to, or was mislabeled as, the one he meant to edit. He wasn't careless; the map was wrong. The community has been editing off a moderate understanding ever since.
We audited our own editor and found the exact culprit — and fixed it. The Stable Management System had the offsets right (personality at a1[6]=0x3F, hood at a2[26]=0x70, correct track-reversal), but its personality control was a lossy 5-choice dropdown that wrote only {0,48,64,80,208}. So re-saving any card whose personality byte wasn't one of those five silently rewrote it (100→80, 128/180/200→64, 244→208) — even if you never touched personality. That's what changed JJ's horse. Fixed (Jun 2026): the editor now preserves the exact 0–255 personality byte and only changes it when you deliberately pick a different one.

The rule that breaks naive maps: tracks are stored REVERSED

The card is 207 bytes = 3 tracks of 69. Within a track the logical bytes are stored back-to-front: logical aN[k] lives at file offset t*69 + (69−k). If a tool addresses the card by raw offset without undoing the reversal, every field after the first is shifted — the root cause of most historical mismaps. There is no whole-card checksum, so any byte is freely editable (and silently mis-editable).

The danger cluster — file 0x3C–0x3F (the JJ trap)

Four adjacent track-0 bytes, all cosmetic-looking, one of which is not:

filelogicalfieldgameplay effect
0x3Ca1[9]Coat modifiercosmetic (coat variant)
0x3Da1[8]Coat basecosmetic (coat color)
0x3Ea1[7]Run-style seedcreation seed only — does NOT reliably set displayed running style (leg-type is derived from externals at race time). A known false lever.
0x3Fa1[6]PERSONALITY (0–255)drives the post-race bond multiplier — the right response per personality builds the bond ×2.0, the wrong one lowers it. Change this and the horse reacts to you differently forever.

What was wrong → what's right

fieldOLD / communityCORRECTEDwhy it matters
Hood"0x73"0x70 (a2[26])0x73 is retirement SHARP — editing "hood" at 0x73 silently changes a stat.
Personality5 buckets {R,I,C,H,S}raw 0–255, 8 bands @0x3Fthe 5-bucket write is lossy; band breakpoints affect bonding
Run-style (0x3E)"the running style"creation seed onlyediting it to change style usually does nothing visible
Track storageraw forward offsetsreversed per trackthe master cause of shifted maps
Checksum"don't edit, it'll corrupt"no whole-card checksumcards are freely editable; bad edits aren't caught
Personality on CPU horses"horses have a personality byte"player-card onlyCPU racing horses don't store it

Full corrected field map

Reversal already applied — these are final file offsets a hex editor can use directly. All byte-exact.

filefieldgameplay effect
0x00–0x12Horse name (18 ASCII, reversed)identity
0x14–0x26Sire namepedigree / lineage
0x28–0x3ADam namepedigree
0x3C–0x3DCoat (mod / base)cosmetic
0x3ERun-style seedcreation seed only
0x3FPersonalitypost-race bonding multiplier
0x40–0x43UID / horse id (mirrored all 3 tracks)identity / lineage links
0x45–0x4DInternals: stamina / speed / sharp (cap 60)core stats (externals matter more for base ability)
0x51–0x53G1 titles (bitfield)career titles
0x55–0x57Earningsprize total
0x59–0x67Race record + hearts (@0x65)career stats
0x5F–0x64Externals (current): start/corner/oob/competing/tenacious/spurt (stored display−1)the dominant driver of race ability; also derive leg type
0x69–0x6ERetirement externalsbreeding-stock value
0x70Hood (0–63)cosmetic — NOT 0x73
0x71–0x73Retirement internals stamina/speed/sharp (cap 45)breeding value (0x73 = ret. sharp, not hood)
0x7ASex (0 M / 1 F / 2 Gelding)breeding role
0x7B–0x7DSilk pattern / color1 (0x7C) / color2 (0x7D)cosmetic
0x8A–0x91SEGABEF0 markercard-type signature (US/WE)
0x92Dirt aptitude (0–255)dirt vs turf suitability (banded)
0x96 / 0x9ARetired flag / breedsretirement state, breed count

Edit safely

  1. Edit by these file offsets, or use the Stable Management System / doc_card.py (they apply the reversal for you). Don't trust a raw-offset edit from an older tool.
  2. Treat 0x3C–0x3F as one careful zone — a coat edit is one byte from personality.
  3. Hood is 0x70. If your old workflow said 0x73, you've been editing retirement sharp.
  4. No checksum protects you — verify by decoding the card back (round-trip).

Gameplay effects of these bytes → The Hidden Rules. Layout details → the ROM architecture doc.