import sys, struct, ctypes
from ctypes import wintypes

sys.stdout.reconfigure(encoding='utf-8')
kernel32 = ctypes.windll.kernel32
advapi32 = ctypes.windll.advapi32

def enable_debug():
    hToken = wintypes.HANDLE()
    if advapi32.OpenProcessToken(kernel32.GetCurrentProcess(), 0x0020 | 0x0008, ctypes.byref(hToken)):
        luid = wintypes.LARGE_INTEGER()
        if advapi32.LookupPrivilegeValueW(None, "SeDebugPrivilege", ctypes.byref(luid)):
            class TP(ctypes.Structure):
                _fields_ = [('Count', wintypes.DWORD), ('Luid', wintypes.LARGE_INTEGER), ('Attr', wintypes.DWORD)]
            tp = TP(1, luid, 2)
            advapi32.AdjustTokenPrivileges(hToken, False, ctypes.byref(tp), ctypes.sizeof(tp), None, None)
        kernel32.CloseHandle(hToken)
enable_debug()

targets = [
    (30076, "MeCuaCacCon", 548, 2455, 709, 47),
    (32572, "BoCuaCacCon", 846, 2409, 924, 75),
    (12768, "ConGailCung", 540, 1203, 687, 46),
    (31164, "ConCuaBoMe", 612, 1419, 592, 49),
]

for pid, name, exp_hp, exp_mp, exp_sta, exp_lvl in targets:
    hProc = kernel32.OpenProcess(0x0010 | 0x0400, False, pid)
    if not hProc:
        print(f"Cannot open PID {pid}")
        continue
        
    # Read 256 bytes around 0x00657300
    base_addr = 0x00657280
    size = 0x200
    buf = (ctypes.c_char * size)()
    bytesRead = ctypes.c_size_t()
    
    print(f"\n=======================================================")
    print(f"PID {pid} | {name} | Expected: HP={exp_hp}, MP={exp_mp}, Sta={exp_sta}, Lvl={exp_lvl}")
    print(f"=======================================================")
    
    if kernel32.ReadProcessMemory(hProc, ctypes.c_void_p(base_addr), buf, size, ctypes.byref(bytesRead)):
        data = bytes(buf)[:bytesRead.value]
        for i in range(0, len(data) - 4, 4):
            val = struct.unpack_from('<i', data, i)[0]
            val_u = struct.unpack_from('<I', data, i)[0]
            addr = base_addr + i
            tag = ""
            if val == exp_hp: tag = f" <=== HP ({exp_hp})"
            elif val == exp_mp: tag = f" <=== MP ({exp_mp})"
            elif val == exp_sta: tag = f" <=== STAMINA ({exp_sta})"
            elif val == exp_lvl: tag = f" <=== LEVEL ({exp_lvl})"
            
            if tag or (val > 0 and val < 50000):
                print(f"  0x{addr:08X}: {val:<8} (0x{val_u:08X}){tag}")
                
    kernel32.CloseHandle(hProc)
