9feb577c1c
headcoachcards 124 rows 2000004..2000328, gkcoachcards 121 rows 9000001..9000324, physiocards 51 rows 4000002..4000259, fitnesscoachcards 115 rows 3000019..3000328. All MEASURED from data/tables/, dumped read-only from the running client; rowcount == rows_emitted == len(rows) on all four, which is what makes "this id is absent" a claim about a complete dump rather than about a truncated one. assetid == carddbid on every row; every id fits in 24 bits. WHY COACHES ARE THE CHEAPEST FAMILY TO TEST. Their four arms of FUN_180141660 (2,129 bytes, 214-line decompile read to its closing `return`) are the only merges in the game that label their own failure: on rowcount < 1 each writes firstname = lastname = "DB Error", rec+0xb4 = 0x32, rec+0x58 = 1 and a TABLE-UNIQUE assetid -- head 2000148, fitness 3000259, physio 4000146, gkcoach 9000258. Two independent facts make that a one-glance oracle, both verified by exhaustive scan of all 411 rows: no row in any of the four tables has value == 50, and no fitnesscoach row is (fieldpos 1, posbonus 7, amount 1). CORRECTION to docs/plan-2026-08-04-card-families.md: the miss-fill is NOT uniform. Only head coach and GK coach write 0xf into the attribute array at rec+0x98. Physio writes 0xf into a BYTE at rec+0xdd; fitness coach writes no 0xf at all -- rec+0xde = 0x107 and rec+0xdd = 1. So card_identity_probe's attrs column means something different per family, and its F_NAME_KNOWN=0xdd string read sits directly on top of physio's, fitness coach's and the manager's raw stat bytes. Use coach_probe.py. The key is RAW: all four staff branches pass *(u32*)(rec+0x18) unmasked into `WHERE carddbid == ?`. Players are the only family that masks with & 0xffffff, so a version byte in the top octet breaks every staff lookup -- silently on a manager, loudly on a coach. WHAT WE SEND: id, resourceId, cardsubtypeid, itemType, contract, itemState, owners, untradeable. Nothing else. rating/rareflag/assetId are overwritten by the merge; nation/leagueId/teamid would be INVENTED, because none of the four tables has such a column; preferredPosition (rec+0x146) and attributeList (rec+0x98..) SURVIVE the merge and are read by the generic view-model FUN_1800d7920, so sending them would hang a position label and six attribute numbers on a coach. Omission is safe; a scalar where an object is expected is not. The starter shelf is one card per (tier, rare) combination per family -- 24 cards -- with two exclusions: the four miss-fill assetids (three of which are REAL rows, so a hit and a miss would look identical on those cards), and any row whose own stat write is byte-identical to its family's miss-fill (head/GK attribute 0 amount 15). tier() is the binary's own tail, not our convention: the shared exit of FUN_180141660 writes rec+0x54 = 3 if rating >= 0x4b else 2 - (rating < 0x41), for every arm including the miss arms. Also lands the design round's read-only probe tooling: coach_probe.py (grades a live record HIT/MISS/WRONG-BRANCH/NO-MERGE against the on-disk rows) and coach_window.py (builds a mixed-control window; fires nothing). Not wired into the server in this commit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VUT92pz6RWKih9dSr8ZpxW
416 lines
7.0 KiB
JSON
416 lines
7.0 KiB
JSON
{
|
|
"_source": "data/tables/*.json dumped read-only from the running client by tools/db_dump.py",
|
|
"_key": "resourceId == carddbid, RAW u32 (the staff branches of FUN_180141660 do NOT mask, unlike players)",
|
|
"families": {
|
|
"headcoach": {
|
|
"cardsubtypeid": 5,
|
|
"table": "headcoachcards",
|
|
"record_4c": 3,
|
|
"rowcount": 124,
|
|
"carddbid_band": [
|
|
2000004,
|
|
2000328
|
|
],
|
|
"absent_ids_in_band": 201,
|
|
"miss_fill_assetid": 2000148,
|
|
"seeds": [
|
|
{
|
|
"carddbid": 2000004,
|
|
"assetid": 2000004,
|
|
"attribute": 0,
|
|
"value": 55,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 2000008,
|
|
"assetid": 2000008,
|
|
"attribute": 2,
|
|
"value": 55,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 2000016,
|
|
"assetid": 2000016,
|
|
"attribute": 5,
|
|
"value": 55,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 2000024,
|
|
"assetid": 2000024,
|
|
"attribute": 4,
|
|
"value": 55,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 2000032,
|
|
"assetid": 2000032,
|
|
"attribute": 5,
|
|
"value": 55,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 2000044,
|
|
"assetid": 2000044,
|
|
"attribute": 1,
|
|
"value": 64,
|
|
"amount": 5,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 2000064,
|
|
"assetid": 2000064,
|
|
"attribute": 1,
|
|
"value": 80,
|
|
"amount": 15,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 2000084,
|
|
"assetid": 2000084,
|
|
"attribute": 3,
|
|
"value": 66,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 2000124,
|
|
"assetid": 2000124,
|
|
"attribute": 0,
|
|
"value": 70,
|
|
"amount": 10,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 2000164,
|
|
"assetid": 2000164,
|
|
"attribute": 1,
|
|
"value": 77,
|
|
"amount": 10,
|
|
"rare": 0
|
|
}
|
|
],
|
|
"bad_controls": [
|
|
2000005,
|
|
2000089,
|
|
2000177,
|
|
2000259
|
|
]
|
|
},
|
|
"gkcoach": {
|
|
"cardsubtypeid": 6,
|
|
"table": "gkcoachcards",
|
|
"record_4c": 10,
|
|
"rowcount": 121,
|
|
"carddbid_band": [
|
|
9000001,
|
|
9000324
|
|
],
|
|
"absent_ids_in_band": 203,
|
|
"miss_fill_assetid": 9000258,
|
|
"seeds": [
|
|
{
|
|
"carddbid": 9000001,
|
|
"assetid": 9000001,
|
|
"attribute": 0,
|
|
"value": 55,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 9000017,
|
|
"assetid": 9000017,
|
|
"attribute": 4,
|
|
"value": 55,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 9000021,
|
|
"assetid": 9000021,
|
|
"attribute": 5,
|
|
"value": 55,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 9000025,
|
|
"assetid": 9000025,
|
|
"attribute": 0,
|
|
"value": 80,
|
|
"amount": 15,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 9000037,
|
|
"assetid": 9000037,
|
|
"attribute": 3,
|
|
"value": 64,
|
|
"amount": 5,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 9000081,
|
|
"assetid": 9000081,
|
|
"attribute": 2,
|
|
"value": 66,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 9000117,
|
|
"assetid": 9000117,
|
|
"attribute": 5,
|
|
"value": 80,
|
|
"amount": 15,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 9000121,
|
|
"assetid": 9000121,
|
|
"attribute": 0,
|
|
"value": 75,
|
|
"amount": 10,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 9000125,
|
|
"assetid": 9000125,
|
|
"attribute": 1,
|
|
"value": 74,
|
|
"amount": 10,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 9000308,
|
|
"assetid": 9000308,
|
|
"attribute": 5,
|
|
"value": 80,
|
|
"amount": 15,
|
|
"rare": 1
|
|
}
|
|
],
|
|
"bad_controls": [
|
|
9000002,
|
|
9000086,
|
|
9000174,
|
|
9000280
|
|
]
|
|
},
|
|
"physio": {
|
|
"cardsubtypeid": 7,
|
|
"table": "physiocards",
|
|
"record_4c": 5,
|
|
"rowcount": 51,
|
|
"carddbid_band": [
|
|
4000002,
|
|
4000259
|
|
],
|
|
"absent_ids_in_band": 207,
|
|
"miss_fill_assetid": 4000146,
|
|
"seeds": [
|
|
{
|
|
"carddbid": 4000002,
|
|
"assetid": 4000002,
|
|
"attribute": 5,
|
|
"value": 55,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 4000018,
|
|
"assetid": 4000018,
|
|
"attribute": 6,
|
|
"value": 55,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 4000022,
|
|
"assetid": 4000022,
|
|
"attribute": 0,
|
|
"value": 80,
|
|
"amount": 15,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 4000026,
|
|
"assetid": 4000026,
|
|
"attribute": 2,
|
|
"value": 55,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 4000046,
|
|
"assetid": 4000046,
|
|
"attribute": 3,
|
|
"value": 64,
|
|
"amount": 5,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 4000078,
|
|
"assetid": 4000078,
|
|
"attribute": 4,
|
|
"value": 66,
|
|
"amount": 5,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 4000122,
|
|
"assetid": 4000122,
|
|
"attribute": 3,
|
|
"value": 74,
|
|
"amount": 10,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 4000170,
|
|
"assetid": 4000170,
|
|
"attribute": 1,
|
|
"value": 75,
|
|
"amount": 10,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 4000194,
|
|
"assetid": 4000194,
|
|
"attribute": 6,
|
|
"value": 75,
|
|
"amount": 10,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 4000254,
|
|
"assetid": 4000254,
|
|
"attribute": 6,
|
|
"value": 80,
|
|
"amount": 15,
|
|
"rare": 1
|
|
}
|
|
],
|
|
"bad_controls": [
|
|
4000003,
|
|
4000089,
|
|
4000175,
|
|
4000257
|
|
]
|
|
},
|
|
"fitnesscoach": {
|
|
"cardsubtypeid": 8,
|
|
"table": "fitnesscoachcards",
|
|
"record_4c": 4,
|
|
"rowcount": 115,
|
|
"carddbid_band": [
|
|
3000019,
|
|
3000328
|
|
],
|
|
"absent_ids_in_band": 195,
|
|
"miss_fill_assetid": 3000259,
|
|
"seeds": [
|
|
{
|
|
"carddbid": 3000019,
|
|
"assetid": 3000019,
|
|
"value": 55,
|
|
"amount": 1,
|
|
"posbonus": 3,
|
|
"fieldpos": 1,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 3000023,
|
|
"assetid": 3000023,
|
|
"value": 55,
|
|
"amount": 1,
|
|
"posbonus": 5,
|
|
"fieldpos": 1,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 3000035,
|
|
"assetid": 3000035,
|
|
"value": 55,
|
|
"amount": 1,
|
|
"posbonus": 5,
|
|
"fieldpos": 0,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 3000043,
|
|
"assetid": 3000043,
|
|
"value": 64,
|
|
"amount": 2,
|
|
"posbonus": 6,
|
|
"fieldpos": 2,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 3000047,
|
|
"assetid": 3000047,
|
|
"value": 64,
|
|
"amount": 2,
|
|
"posbonus": 2,
|
|
"fieldpos": 1,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 3000059,
|
|
"assetid": 3000059,
|
|
"value": 64,
|
|
"amount": 2,
|
|
"posbonus": 1,
|
|
"fieldpos": 0,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 3000083,
|
|
"assetid": 3000083,
|
|
"value": 66,
|
|
"amount": 2,
|
|
"posbonus": 5,
|
|
"fieldpos": 0,
|
|
"rare": 0
|
|
},
|
|
{
|
|
"carddbid": 3000091,
|
|
"assetid": 3000091,
|
|
"value": 80,
|
|
"amount": 5,
|
|
"posbonus": 5,
|
|
"fieldpos": 2,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 3000127,
|
|
"assetid": 3000127,
|
|
"value": 70,
|
|
"amount": 3,
|
|
"posbonus": 5,
|
|
"fieldpos": 1,
|
|
"rare": 1
|
|
},
|
|
{
|
|
"carddbid": 3000171,
|
|
"assetid": 3000171,
|
|
"value": 77,
|
|
"amount": 3,
|
|
"posbonus": 5,
|
|
"fieldpos": 3,
|
|
"rare": 0
|
|
}
|
|
],
|
|
"bad_controls": [
|
|
3000020,
|
|
3000100,
|
|
3000178,
|
|
3000307
|
|
]
|
|
}
|
|
}
|
|
} |