import pymem

pm = pymem.Pymem(43084)
base = 0x7ff6afc20000
igs = pm.read_ulonglong(base + 0x4430108)
area = pm.read_ulonglong(igs + 0x290)
if not (0x10000 <= area <= 0x7fffffffffff):
    area = pm.read_ulonglong(igs + 0x2a0)

for off in [0x938, 0xa70, 0xa78, 0xf70, 0xf78, 0x1018]:
    p1 = pm.read_ulonglong(area + off)
    p2 = pm.read_ulonglong(area + off + 8)
    cnt = (p2 - p1) // 8
    print(f"\n--- AreaInstance +0x{off:x} ({cnt} pointers): ---")
    for i in range(min(cnt, 15)):
        ptr = pm.read_ulonglong(p1 + i * 8)
        if 0x100000000 <= ptr <= 0x7fffffffffff:
            try:
                vt = pm.read_ulonglong(ptr) - base
                raw = pm.read_bytes(ptr, 64)
                # check string
                s = ""
                for so in range(8, 64, 8):
                    sp = int.from_bytes(raw[so:so+8], "little")
                    if 0x100000000 <= sp <= 0x7fffffffffff:
                        try:
                            txt = pm.read_bytes(sp, 64).decode("ascii", errors="ignore").split('\x00')[0]
                            if len(txt) >= 3 and txt.isprintable():
                                s += f" \"{txt}\""
                        except: pass
                # check floats (x, y, z)
                fx = pm.read_float(ptr + 0x10)
                fy = pm.read_float(ptr + 0x14)
                print(f"  [{i}] {hex(ptr)} (VT RVA {hex(vt)}): floats({round(fx,1)}, {round(fy,1)}){s}")
            except Exception as e:
                print(f"  [{i}] {hex(ptr)} error: {e}")
        else:
            print(f"  [{i}] {hex(ptr)}")
