path = 'docs/development/28_standalone_visual_tool_zoom_and_fog.md'
with open(path, 'r', encoding='utf-8') as f:
    c = f.read()

target = '#### 2. Cơ chế Quét Mẫu AOB Xác định Vị trí Clamp trong `.text`'
repl = '''#### 2. Cơ chế Quét Mẫu AOB & Ma Trận Dự Phòng (Multi-AOB Fallback Matrix)
Trong phân vùng `.text` của `PathOfExile.exe` (x64), đoạn mã điều khiển clamp khoảng cách camera được nhận diện thông qua hệ thống ma trận 3 mẫu AOB theo thứ tự ưu tiên:

1. **Mẫu chính (Direct Clamp)**: `80 78 2F 00` (cmp byte ptr [rax+2Fh], 0).
2. **Mẫu dự phòng thanh ghi (Register Wildcard)**: `80 ? 2F 00` (hỗ trợ khi compiler chuyển sang rcx, rdx, rbx, rsi, rdi).
3. **Mẫu so sánh float (Float Clamp Comparison)**: `F3 0F 10 ? 34 0F 2F` (movss xmm, [reg+34h]; comiss).

#### 2.1. Cơ Chế Thẩm Định Ngữ Cảnh Trước Khi Vá (Pre-Patch Context Sanity Verification)
- **Tuyệt đối không vá mù (Anti-Blind Patching)**: Để loại trừ nguy cơ vá nhầm vào hàm khác khi một chuỗi byte ngắn vô tình trùng lặp, hệ thống đọc cửa sổ 32 byte xung quanh vị trí match.
- Bắt buộc phải xác nhận có sự hiện diện của các offset cấu trúc Camera: `+0x34` (maxDistance), `+0x2C` (currentDistance), hoặc opcode so sánh float `0x0F 0x2F` (comiss).
- Nếu không tìm thấy ngữ cảnh camera: match bị coi là False Positive và bị từ chối can thiệp.

#### 2.2. Cơ Chế Tự Động Hạ Cấp Xuống Data-Only Heap Mode (Graceful Degradation)
- Nếu game update bản vá làm thay đổi hoàn toàn cấu trúc ASM và toàn bộ AOB trong `.text` đều thất bại:
  * Hệ thống KHÔNG bao giờ bị crash hay dừng hoạt động.
  * Tự động chuyển xuống tầng dự phòng: **Data-Only Heap Mode** (`WriteMaxAndZFar` trên `CameraInstance`).
  * Người chơi vẫn điều khiển được góc nhìn qua wheel-drive và maxDistance trên Heap mà không gặp bất kỳ nguy cơ nào.'''

if target in c:
    c = c.replace(target, repl, 1)
    with open(path, 'w', encoding='utf-8') as f:
        f.write(c)
    print('Documentation updated successfully.')
else:
    print('Target not found in doc 28.')
