9a0a76c9f4
The pool now comes from the game's OWN resident database, not from a rating index plus guesses. tools/db_dump.py walked the client's self-describing table catalog read-only and wrote data/tables/ (149 tables, 55MB); tools/build_player_facts.py turned it into data/player_facts.json; data/pool.json is the compact form fut_cards loads. MEASURED, per player: position (players.preferredposition1), nationality, teamid, leagueid (via leagueteamlinks), and the six card attributes. The six attributes are NOT columns -- they are a weighted sum of the 29 base attributes, and the weights are read out of the game's own playerattributesmapping table rather than from published formulas. Checked against real FIFA 17 cards: Messi 89/90/86/96/26/61 and Ibrahimovic 72/90/81/85/31/86 are EXACT, Suarez is one off on physical, Ronaldo within two on pace and shooting. Keepers come out directly from the gk* columns. What this fixes on screen: Kaka was a CDM, Bale a CM, Suarez a GK, and every attribute was derived from the rating. Now Bale is RW, Boateng is a CB with 90 defending, De Gea is a GK, and a bronze pack deals real bronze players in real positions. REVERSAL, deliberate: nation/team/league were being sent as ZERO so the client would fill its own values (the merge fills those three only when they arrive zero). Now that we hold the game's own numbers there is nothing to gain from zeros, and they actively hurt -- club-stats drill-downs bucket by the item's own nation and leagueId, so a club full of zeros would have quietly emptied the per-nation and per-league panels fixed the day before. Send the real values. The old rating-index path is kept as a fallback so the pool still builds without data/pool.json, and it now says out loud which of the two it used, because one is a measurement and the other is a guess. 439 + 61 checks green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VUT92pz6RWKih9dSr8ZpxW
1 line
6.3 KiB
JSON
1 line
6.3 KiB
JSON
{"table":"customformations","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":196,"rows_emitted":0,"rowblock":"0x4274df48","rowblock_bytes":5521,"descriptor":"0x42547c38","schema":[{"name":"offset6x","bit":0,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset5y","bit":32,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset10x","bit":64,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset2x","bit":96,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"defenders","bit":128,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset2y","bit":160,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset6y","bit":192,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset7x","bit":224,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset3x","bit":256,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset8x","bit":288,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset10y","bit":320,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset3y","bit":352,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset4x","bit":384,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset7y","bit":416,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset0x","bit":448,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset8y","bit":480,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"attackers","bit":512,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset9x","bit":544,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"midfielders","bit":576,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset5x","bit":608,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset0y","bit":640,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset1x","bit":672,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset4y","bit":704,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset9y","bit":736,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"offset1y","bit":768,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"formationname","bit":800,"width":200,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"playerinstruction10_1","bit":1000,"width":30,"kind":"int","min":0,"max":1073741823,"storage":"int"},{"name":"playerinstruction3_1","bit":1030,"width":30,"kind":"int","min":0,"max":1073741823,"storage":"int"},{"name":"playerinstruction1_1","bit":1060,"width":30,"kind":"int","min":0,"max":1073741823,"storage":"int"},{"name":"position10","bit":1090,"width":5,"kind":"int","min":1,"max":32,"storage":"int"},{"name":"playerinstruction9_2","bit":1095,"width":10,"kind":"int","min":0,"max":1023,"storage":"int"},{"name":"playerinstruction9_1","bit":1105,"width":30,"kind":"int","min":0,"max":1073741823,"storage":"int"},{"name":"playerinstruction4_2","bit":1135,"width":10,"kind":"int","min":0,"max":1023,"storage":"int"},{"name":"position6","bit":1145,"width":5,"kind":"int","min":1,"max":32,"storage":"int"},{"name":"playerinstruction1_2","bit":1150,"width":10,"kind":"int","min":0,"max":1023,"storage":"int"},{"name":"playerinstruction5_2","bit":1160,"width":10,"kind":"int","min":0,"max":1023,"storage":"int"},{"name":"offensiverating","bit":1170,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"position8","bit":1173,"width":5,"kind":"int","min":1,"max":32,"storage":"int"},{"name":"playerinstruction7_1","bit":1178,"width":30,"kind":"int","min":0,"max":1073741823,"storage":"int"},{"name":"playerinstruction0_2","bit":1208,"width":10,"kind":"int","min":0,"max":1023,"storage":"int"},{"name":"playerinstruction8_1","bit":1218,"width":30,"kind":"int","min":0,"max":1073741823,"storage":"int"},{"name":"playerinstruction5_1","bit":1248,"width":30,"kind":"int","min":0,"max":1073741823,"storage":"int"},{"name":"position5","bit":1278,"width":5,"kind":"int","min":1,"max":32,"storage":"int"},{"name":"formationaudioid","bit":1283,"width":5,"kind":"int","min":-1,"max":30,"storage":"int"},{"name":"playerinstruction6_1","bit":1288,"width":30,"kind":"int","min":0,"max":1073741823,"storage":"int"},{"name":"playerinstruction6_2","bit":1318,"width":10,"kind":"int","min":0,"max":1023,"storage":"int"},{"name":"playerinstruction10_2","bit":1328,"width":10,"kind":"int","min":0,"max":1023,"storage":"int"},{"name":"playerinstruction3_2","bit":1338,"width":10,"kind":"int","min":0,"max":1023,"storage":"int"},{"name":"teamid","bit":1348,"width":18,"kind":"int","min":-2,"max":200000,"storage":"int"},{"name":"position2","bit":1366,"width":5,"kind":"int","min":1,"max":32,"storage":"int"},{"name":"playerinstruction4_1","bit":1371,"width":30,"kind":"int","min":0,"max":1073741823,"storage":"int"},{"name":"formationid","bit":1401,"width":10,"kind":"int","min":0,"max":1000,"storage":"int"},{"name":"playerinstruction8_2","bit":1411,"width":10,"kind":"int","min":0,"max":1023,"storage":"int"},{"name":"playerinstruction0_1","bit":1421,"width":30,"kind":"int","min":0,"max":1073741823,"storage":"int"},{"name":"relativeformationid","bit":1451,"width":10,"kind":"int","min":-1,"max":1000,"storage":"int"},{"name":"position4","bit":1461,"width":5,"kind":"int","min":1,"max":32,"storage":"int"},{"name":"playerinstruction2_2","bit":1466,"width":10,"kind":"int","min":0,"max":1023,"storage":"int"},{"name":"position3","bit":1476,"width":5,"kind":"int","min":1,"max":32,"storage":"int"},{"name":"formationfullnameid","bit":1481,"width":5,"kind":"int","min":-1,"max":30,"storage":"int"},{"name":"playerinstruction7_2","bit":1486,"width":10,"kind":"int","min":0,"max":1023,"storage":"int"},{"name":"position0","bit":1496,"width":1,"kind":"int","min":0,"max":1,"storage":"int"},{"name":"position9","bit":1497,"width":5,"kind":"int","min":1,"max":32,"storage":"int"},{"name":"position7","bit":1502,"width":5,"kind":"int","min":1,"max":32,"storage":"int"},{"name":"position1","bit":1507,"width":5,"kind":"int","min":1,"max":32,"storage":"int"},{"name":"playerinstruction2_1","bit":1512,"width":30,"kind":"int","min":0,"max":1073741823,"storage":"int"}],"rows":[]} |