"""Q6 — the decisive reads: (a) who builds the /sold request (clear-all-sold) and what it is called; (b) who publishes FUT_TF_SELLING / FUT_TF_SOLD / FUT_TF_WINNING / FUT_TF_OUTBID, i.e. which count feeds the seller's SOLD bucket; (c) the GetAuctionCount deserializer, to pin the five counts atoms. """ print("=" * 78) print("== (a) xrefs: request names + the /sold path suffix") print("=" * 78) for label, a in (("RemoveAllSoldFromTradePile", 0x1801EFAE8), ("RemoveFromTradePile", 0x1801EFAD0), ("AddToWatchList", 0x1801EFAA8), ("/sold suffix", 0x180228BEC), ("RS4:FutISRemoveTradeServerResponse", 0x180228BC8)): xs = xrefs_to(a) print(f" {label:36s} {len(xs)} xref(s)") for x in xs[:10]: print(f" 0x{x[0]:x} {x[1]:12s} in {x[2]} (entry 0x{x[3]:x})") print() print("=" * 78) print("== (b) xrefs: the Transfer List caption keys") print("=" * 78) caps = (("FUT_TOTAL_AUCTIONS", 0x18020A080), ("FUT_UC_ITEMS", 0x18020A098), ("FUT_TF_SELLING", 0x18020A0A8), ("FUT_TF_SOLD", 0x18020A0C0), ("FUT_TF_WINNING", 0x18020A0D8), ("FUT_TF_OUTBID", 0x18020A0E8)) owners = {} for label, a in caps: xs = xrefs_to(a) print(f" {label:20s} {len(xs)} xref(s)") for x in xs[:10]: print(f" 0x{x[0]:x} {x[1]:12s} in {x[2]} (entry 0x{x[3]:x})") owners[x[3]] = owners.get(x[3], 0) + 1 print() print(" caption publisher candidates (entry -> #caption refs):", {hex(k): v for k, v in sorted(owners.items(), key=lambda kv: -kv[1])}) for ent in sorted(owners, key=lambda e: -owners[e])[:2]: print() print("=" * 78) print(f"== decompiled caption publisher 0x{ent:x}") print("=" * 78) print(dec(ent)) print() print("=" * 78) print("== (c) GetAuctionCount deserializer FUN_180163770") print("=" * 78) print(dec(0x180163770))