"""DIMENSION 4 (duplicates), pass 2: who READS the duplicate field.

ESTABLISHED IN PASS 1: all four consumers of the 0x20-byte duplicate record
(0x180162880 CreatePack, 0x18013e7f0 IS-list, 0x18013bd40, 0x1801293d0) do the
identical fixup:  for each record, scan the just-parsed item list, and where
item->+0x08 == record->+0x00 (itemId), set item->+0x10 = record->+0x10
(duplicateItemId). The record's +0x08 (itemLoans) and +0x18 (duplicateItemLoans)
are never read by any of the four, and the record vector is a stack local freed at
the end of each, so no other code can see it.

HYPOTHESIS FOR THIS PASS: the UI reads item->+0x10 and surfaces it as the
Scaleform key "HAS_DUPLICATE" (0x1801f6510) and/or the script command
"GetCardDuplicate" (0x1801f3ad8).

CONTROL: for each candidate reader we print the FULL decompile with len(src) and
say FULL, and we look for BOTH `+ 0x10` load forms and the `== 0` / `!= 0` test
forms. We also decompile a control function that references "IS_LOAN_PLAYER" but
not HAS_DUPLICATE, to check that our reading of the data-provider idiom is right.
"""
import traceback

OUT = "/tmp/claude-1000/-home-alex-Documents-OpenFUT/8e521ca1-ca3e-4138-bb96-df1744dd1d30/scratchpad/store/dup2_out.txt"

def w(fh, s=""):
    fh.write(str(s) + "\n")

def dump(fh, a, label):
    s = dec(a)
    w(fh, "")
    w(fh, "#" * 70)
    w(fh, "# %s   %#x   len(src)=%d   FULL (no truncation)" % (label, a, len(s)))
    w(fh, "#" * 70)
    w(fh, s)

try:
    fh = open(OUT, "w")

    w(fh, "A. xrefs to string literals of interest")
    for name, a in (("GetCardDuplicate", 0x1801F3AD8),
                    ("HAS_DUPLICATE", 0x1801F6510),
                    ("SwapCard", 0x18021EF58),
                    ("SWAPCARD", 0x18021EF68),
                    ("IS_LOAN_PLAYER", 0x1801F6520),
                    ("FUT_LOAN_MATCHES", 0x1802044F8)):
        w(fh, "-- %s @ %#x" % (name, a))
        for frm, typ, fn, ent in xrefs_to(a):
            w(fh, "     %#x %s in %s @ %#x" % (frm, typ, fn, ent))

    for a, lbl in ((0x1800394C0, "GetCardDuplicate registrar/handler"),
                   (0x180043880, "HAS_DUPLICATE user 1"),
                   (0x180094220, "HAS_DUPLICATE user 2"),
                   (0x180084720, "HAS_DUPLICATE user 3")):
        dump(fh, a, lbl)

    w(fh, "")
    w(fh, "B. CONTROL: 0x18015fa80 references IS_LOAN_PLAYER but not HAS_DUPLICATE")
    dump(fh, 0x18015FA80, "CONTROL loan-only user")

    fh.close()
    print("WROTE", OUT)
except Exception:
    traceback.print_exc()
