import ctypes
import struct
import win32process
import win32api
import win32con

PROCESS_ALL_ACCESS = 0x1F0FFF
pid = 43084
h_proc = win32api.OpenProcess(PROCESS_ALL_ACCESS, False, pid)
if not h_proc:
    print(f"Failed to open PID {pid}")
    exit(1)

mod_base = 0x7FF6AFC20000

def rpm(addr, size):
    buf = ctypes.create_string_buffer(size)
    bytes_read = ctypes.c_size_t()
    res = ctypes.windll.kernel32.ReadProcessMemory(
        h_proc.handle,
        ctypes.c_void_p(addr),
        buf,
        ctypes.c_size_t(size),
        ctypes.byref(bytes_read)
    )
    if not res:
        return None
    return buf.raw[:bytes_read.value]

def rpm_u64(addr):
    raw = rpm(addr, 8)
    if not raw or len(raw) < 8:
        return 0
    return struct.unpack("<Q", raw)[0]

def rpm_f32(addr):
    raw = rpm(addr, 4)
    if not raw or len(raw) < 4:
        return 0.0
    return struct.unpack("<f", raw)[0]

in_game_state_rva = 0x4430108
in_game_state = rpm_u64(mod_base + in_game_state_rva)
print(f"InGameState: 0x{in_game_state:X}")

for off in [0x290, 0x2A0, 0x320, 0x368, 0x2F0]:
    val = rpm_u64(in_game_state + off)
    print(f"  InGameState + 0x{off:X} -> 0x{val:X}")

area_inst = rpm_u64(in_game_state + 0x290)
if area_inst < 0x10000:
    area_inst = rpm_u64(in_game_state + 0x2A0)

print(f"AreaInstance: 0x{area_inst:X}")
if area_inst >= 0x10000:
    p_expl = rpm_u64(area_inst + 0x9a0)
    p_expl_end = rpm_u64(area_inst + 0x9a8)
    p_terr = rpm_u64(area_inst + 0x9b8)
    p_terr_end = rpm_u64(area_inst + 0x9c0)
    
    sz_expl = p_expl_end - p_expl if p_expl_end > p_expl else 0
    sz_terr = p_terr_end - p_terr if p_terr_end > p_terr else 0
    print(f"  Exploration: 0x{p_expl:X} .. 0x{p_expl_end:X} (size={sz_expl})")
    print(f"  Terrain:     0x{p_terr:X} .. 0x{p_terr_end:X} (size={sz_terr})")
    
    if sz_expl > 0 and sz_terr > 0:
        sample_expl = rpm(p_expl, min(64, sz_expl))
        sample_terr = rpm(p_terr, min(64, sz_terr))
        print("  Sample expl:", sample_expl[:16].hex())
        print("  Sample terr:", sample_terr[:16].hex())

win32api.CloseHandle(h_proc)
