feat(market): bounded Q2 candidate — one unlisted pile item as tradeState "inactive"
PHASE A settled the token from the CLIENT ITSELF, so this is not a guessed enum.
vocab_dump.py (new; static, read-only, VA->offset through the real PE section table)
dumps CardsDLL's NULL-terminated {const char*, int} vocabularies. The tradeState
table at 0x180229e40 reads exactly:
'active' = 1 'inactive' = 2 'expired' = 3 'closed' = 4
The sibling tables (type/zone/lev/pos) match the corpus verbatim, which validates the
dumper. So "inactive" is a token the client's own parser decodes.
PHASE B, bounded as instructed. `OPENFUT_FIFA17_UNLISTED_PROBE=<wire id>` exposes
EXACTLY ONE unlisted trade-pile item on /tradePile as a non-active record; unset,
behaviour is byte-identical to before. The other stranded pile items are untouched --
no bulk migration.
Why this shape is forced rather than chosen: the route table has exactly one
trade-pile route, it carries only twelve-atom auction records, `pile` (0x226) has no
deserializer arm so membership comes from the owning list, and of those atoms only
tradeState expresses lifecycle. The row carries tradeState "inactive" with
expires/prices/bid all zero so it cannot render a countdown or a price, and reuses the
item's stable tradeId because the client keys its record store on tradeId and
re-parents itemData -- so listing the item later UPDATES the row instead of leaving a
duplicate ghost.
Both preconditions are re-checked at response time: the item must actually be in the
`trade` pile, and it must not already own a listing. Two tests cover exactly those.
counts semantics deliberately unchanged -- the inactive row is not counted.
340 tests pass, 0 failed, clippy clean. Deployed; the wire now carries all three
lifecycle states at once (expired 1000000097, active 1000000155, inactive 1000000059)
and that body is preserved as a fixture.
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
|
||||
=== tradeState (table walk) VA 0x180229e40 -> off 0x229240 ===
|
||||
'active' = 1
|
||||
'inactive' = 2
|
||||
'expired' = 3
|
||||
'closed' = 4
|
||||
-- NULL terminator after 4 rows --
|
||||
|
||||
=== type VA 0x180229c30 -> off 0x229030 ===
|
||||
'any' = -1
|
||||
'player' = 1
|
||||
'staff' = 2
|
||||
'clubInfo' = 3
|
||||
'training' = 4
|
||||
'development' = 5
|
||||
'stadium' = 6
|
||||
'ball' = 7
|
||||
-- NULL terminator after 8 rows --
|
||||
|
||||
=== zone VA 0x1802296e0 -> off 0x228ae0 ===
|
||||
'goalKeeper' = 0
|
||||
'defense' = 1
|
||||
'midfield' = 2
|
||||
'attacker' = 3
|
||||
-- NULL terminator after 4 rows --
|
||||
|
||||
=== lev VA 0x180229a60 -> off 0x228e60 ===
|
||||
'any' = 0
|
||||
'gold' = 3
|
||||
'silver' = 2
|
||||
'bronze' = 1
|
||||
-- NULL terminator after 4 rows --
|
||||
|
||||
=== pos VA 0x1802295c0 -> off 0x2289c0 ===
|
||||
'GK' = 0
|
||||
'RWB' = 2
|
||||
'RB' = 3
|
||||
'CB' = 5
|
||||
'LB' = 7
|
||||
'LWB' = 8
|
||||
'CDM' = 10
|
||||
'RM' = 12
|
||||
'CM' = 14
|
||||
'LM' = 16
|
||||
'CAM' = 18
|
||||
'RF' = 20
|
||||
'CF' = 21
|
||||
'LF' = 22
|
||||
'RW' = 23
|
||||
'ST' = 25
|
||||
'LW' = 27
|
||||
-- NULL terminator after 17 rows --
|
||||
|
||||
=== cat VA 0x180229ab0 -> off 0x228eb0 ===
|
||||
'any' = -1
|
||||
'playerGK' = 1
|
||||
'playerRD' = 2
|
||||
'playerRM' = 3
|
||||
'playerRA' = 4
|
||||
'manager' = 5
|
||||
'headCoach' = 6
|
||||
'GKCoach' = 7
|
||||
'fitnessCoach' = 8
|
||||
'physio' = 9
|
||||
'badge' = 10
|
||||
'kit' = 11
|
||||
'leagueLogo' = 12
|
||||
'playerTraining' = 13
|
||||
'GKTraining' = 14
|
||||
'position' = 15
|
||||
'playStyle' = 16
|
||||
'managerLeagueModifier' = 17
|
||||
'contract' = 18
|
||||
'fitness' = 19
|
||||
'healing' = 20
|
||||
'stadium' = 21
|
||||
'ball' = 22
|
||||
-- NULL terminator after 23 rows --
|
||||
|
||||
=== form VA 0x180229880 -> off 0x228c80 ===
|
||||
'f3412' = 23
|
||||
'f3421' = 24
|
||||
'f343' = 25
|
||||
'f352' = 27
|
||||
'f41212' = 14
|
||||
'f4231' = 3
|
||||
'f4222' = 13
|
||||
'f4312' = 6
|
||||
'f4321' = 7
|
||||
'f433' = 8
|
||||
'f4411' = 19
|
||||
'f442' = 16
|
||||
'f451' = 21
|
||||
'f5212' = 29
|
||||
'f5221' = 30
|
||||
'f532' = 31
|
||||
'f541' = 32
|
||||
'f41212a' = 15
|
||||
'f4141' = 2
|
||||
'f4231a' = 4
|
||||
'f433a' = 9
|
||||
'f433b' = 10
|
||||
'f433c' = 11
|
||||
'f433d' = 12
|
||||
'f442a' = 17
|
||||
'f451a' = 20
|
||||
-- NULL terminator after 26 rows --
|
||||
+190
@@ -0,0 +1,190 @@
|
||||
{
|
||||
"auctionInfo": [
|
||||
{
|
||||
"bidState": "none",
|
||||
"buyNowPrice": 15000,
|
||||
"coinsProcessed": 0,
|
||||
"currentBid": 0,
|
||||
"expires": 0,
|
||||
"itemData": {
|
||||
"assetId": 20801,
|
||||
"attributeList": [
|
||||
{
|
||||
"index": 0,
|
||||
"value": 92
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"value": 92
|
||||
},
|
||||
{
|
||||
"index": 2,
|
||||
"value": 81
|
||||
},
|
||||
{
|
||||
"index": 3,
|
||||
"value": 91
|
||||
},
|
||||
{
|
||||
"index": 4,
|
||||
"value": 33
|
||||
},
|
||||
{
|
||||
"index": 5,
|
||||
"value": 80
|
||||
}
|
||||
],
|
||||
"cardassetid": 20801,
|
||||
"cardsubtypeid": 0,
|
||||
"contract": 7,
|
||||
"definitionId": 20801,
|
||||
"discardValue": 1500,
|
||||
"fitness": 99,
|
||||
"id": 100000097,
|
||||
"itemState": "listFS",
|
||||
"itemType": "player",
|
||||
"leagueId": 53,
|
||||
"nation": 38,
|
||||
"owners": 1,
|
||||
"playStyle": 250,
|
||||
"preferredPosition": "LW",
|
||||
"rareflag": 1,
|
||||
"rating": 94,
|
||||
"resourceId": 20801,
|
||||
"teamid": 243,
|
||||
"untradeable": false
|
||||
},
|
||||
"sellerEstablished": 1,
|
||||
"sellerName": "CAGE",
|
||||
"startingBid": 150,
|
||||
"tradeId": 1000000097,
|
||||
"tradeState": "expired",
|
||||
"watched": false
|
||||
},
|
||||
{
|
||||
"bidState": "none",
|
||||
"buyNowPrice": 15000,
|
||||
"coinsProcessed": 0,
|
||||
"currentBid": 0,
|
||||
"expires": 2996,
|
||||
"itemData": {
|
||||
"assetId": 158023,
|
||||
"attributeList": [
|
||||
{
|
||||
"index": 0,
|
||||
"value": 89
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"value": 90
|
||||
},
|
||||
{
|
||||
"index": 2,
|
||||
"value": 86
|
||||
},
|
||||
{
|
||||
"index": 3,
|
||||
"value": 96
|
||||
},
|
||||
{
|
||||
"index": 4,
|
||||
"value": 26
|
||||
},
|
||||
{
|
||||
"index": 5,
|
||||
"value": 61
|
||||
}
|
||||
],
|
||||
"cardassetid": 158023,
|
||||
"cardsubtypeid": 0,
|
||||
"contract": 7,
|
||||
"definitionId": 158023,
|
||||
"discardValue": 1500,
|
||||
"fitness": 99,
|
||||
"id": 100000155,
|
||||
"itemState": "listFS",
|
||||
"itemType": "player",
|
||||
"leagueId": 53,
|
||||
"nation": 52,
|
||||
"owners": 1,
|
||||
"playStyle": 250,
|
||||
"preferredPosition": "RW",
|
||||
"rareflag": 1,
|
||||
"rating": 93,
|
||||
"resourceId": 158023,
|
||||
"teamid": 241,
|
||||
"untradeable": false
|
||||
},
|
||||
"sellerEstablished": 1,
|
||||
"sellerName": "CAGE",
|
||||
"startingBid": 150,
|
||||
"tradeId": 1000000155,
|
||||
"tradeState": "active",
|
||||
"watched": false
|
||||
},
|
||||
{
|
||||
"bidState": "none",
|
||||
"buyNowPrice": 0,
|
||||
"coinsProcessed": 0,
|
||||
"currentBid": 0,
|
||||
"expires": 0,
|
||||
"itemData": {
|
||||
"assetId": 158023,
|
||||
"attributeList": [
|
||||
{
|
||||
"index": 0,
|
||||
"value": 89
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"value": 90
|
||||
},
|
||||
{
|
||||
"index": 2,
|
||||
"value": 86
|
||||
},
|
||||
{
|
||||
"index": 3,
|
||||
"value": 96
|
||||
},
|
||||
{
|
||||
"index": 4,
|
||||
"value": 26
|
||||
},
|
||||
{
|
||||
"index": 5,
|
||||
"value": 61
|
||||
}
|
||||
],
|
||||
"cardassetid": 158023,
|
||||
"cardsubtypeid": 0,
|
||||
"contract": 7,
|
||||
"definitionId": 158023,
|
||||
"discardValue": 1500,
|
||||
"fitness": 99,
|
||||
"id": 100000059,
|
||||
"itemState": "free",
|
||||
"itemType": "player",
|
||||
"leagueId": 53,
|
||||
"nation": 52,
|
||||
"owners": 1,
|
||||
"playStyle": 250,
|
||||
"preferredPosition": "RW",
|
||||
"rareflag": 1,
|
||||
"rating": 93,
|
||||
"resourceId": 158023,
|
||||
"teamid": 241,
|
||||
"untradeable": false
|
||||
},
|
||||
"sellerEstablished": 1,
|
||||
"sellerName": "CAGE",
|
||||
"startingBid": 0,
|
||||
"tradeId": 1000000059,
|
||||
"tradeState": "inactive",
|
||||
"watched": false
|
||||
}
|
||||
],
|
||||
"credits": 29843976,
|
||||
"duplicateItemIdList": [],
|
||||
"total": 3
|
||||
}
|
||||
Reference in New Issue
Block a user