alloc(newmem,2048,"DiabloImmortal.exe"+748302)
label(returnhere)
label(exit)
label(if01)
label(history_loop)
label(setup_02)
label(shift_queue)
label(save_to_history)
label(find_free_history)
label(next_slot_ok)

newmem:
push rax
push rbx
push rcx

// Quản lý bộ đệm bộ nhớ:
// [rax+0]  -> Slot 1 (Flat cũ)
// [rax+8]  -> Slot 2 (Flat mới nhất)
// [rax+50] đến [rax+C8] -> History Storage (16 slots)
mov rax,newmem+500

// =========================================================================
// 1. AUTO REMOVE FOG FOR ALL TILES
// =========================================================================
cmp r14,0
je if01
cmp byte ptr [r14+18],3F
jne if01
cmp byte ptr [r14+38],1F
jne if01
cmp byte ptr [r14+50],40
jne if01
mov byte ptr [r14+18],0F
if01:

// =========================================================================
// [HARD STOP]: KIỂM TRA SLOT 16 (C8 HEX) ĐỂ TRANH TRÀN BỘ NHỚ
// =========================================================================
cmp qword ptr [rax+C8],0
jne exit

// =========================================================================
// 2. BỘ LỌC CHỮ KÝ & TOẠ ĐỘ LỌC RÁC
// =========================================================================
cmp r14,0
je exit

cmp byte ptr [r14+18],0F
jne exit
cmp byte ptr [r14+38],1F
jne exit
cmp byte ptr [r14+50],40
jne exit

cmp dword ptr [r14-10],(float)655
jb exit
cmp dword ptr [r14-10],(float)715
ja exit
cmp dword ptr [r14-C],(float)478
jb exit
cmp dword ptr [r14-C],(float)538
ja exit

// =========================================================================
// 3. KIỂM TRA HISTORY (QUÉT TỪ Ô 50 ĐẾN C8 - TRÁNH TRÙNG 16 FLAT CŨ)
// =========================================================================
xor rcx,rcx                // rcx = 0 làm chỉ số mảng
history_loop:
cmp [rax+50+rcx*8],r14     // Quét toàn bộ 16 ô nhớ lịch sử
je exit                    // Nếu trùng với bất kỳ Flat cũ nào -> Thoát ngay
inc rcx
cmp rcx,10                 // Chạy từ 0 đến 15 (16 ô)
jl history_loop

// =========================================================================
// 4. KIỂM TRA QUEUE (SLOT 1 & 2) HOẶC KHỞI TẠO BAN ĐẦU
// =========================================================================
cmp [rax+0],r14
je exit
cmp [rax+8],r14
je exit

// Nếu Slot 1 trống -> Nạp vào Slot 1
cmp qword ptr [rax+0],0
jne setup_02
mov [rax+0],r14
jmp save_to_history

// Nếu Slot 1 có dữ liệu nhưng Slot 2 trống -> Nạp vào Slot 2
setup_02:
cmp qword ptr [rax+8],0
jne shift_queue            // Cả 2 slot đều đầy -> Tiến hành "Đốt cầu" dịch chuyển
mov [rax+8],r14
jmp save_to_history

// =========================================================================
// 5. CHIẾN THUẬT "ĐỐT CẦU": XÓA 01, ĐỔI 02 THÀNH 01, RESET 02 = 0
// =========================================================================
shift_queue:
// Tắt/Xóa Flat cũ nhất ở Slot 1 (01) khỏi bản đồ hiển thị của game
mov rbx,[rax+0]
cmp rbx,0
je +2
mov byte ptr [rbx+38],00   // Ẩn map cũ (đốt cầu)

// Đẩy Slot 2 (02) lên thay thế vị trí Slot 1 (01)
mov rbx,[rax+8]
mov [rax+0],rbx

// Reset hoàn toàn vị trí Slot 2 (02) về 0000000000000000
mov qword ptr [rax+8],0

// Nạp Flat mới nhất hiện tại (r14) đè vào Slot 2 vừa được reset
mov [rax+8],r14

// =========================================================================
// 6. GHI FLAT MỚI NÀY VÀO BỘ NHỚ LỊCH SỬ HƠN
// =========================================================================
save_to_history:
xor rcx,rcx                // Reset index rcx = 0
find_free_history:
cmp qword ptr [rax+50+rcx*8],0 // Tìm ô trống từ vị trí 50 Hex đi lên
je next_slot_ok
inc rcx
cmp rcx,10                 // Giới hạn trong 16 ô lịch sử
jl find_free_history
jmp exit

next_slot_ok:
mov [rax+50+rcx*8],r14     // Lưu địa chỉ Flat hợp lệ vào ô trống lịch sử

exit:
pop rcx
pop rbx
pop rax
jmp returnhere

"DiabloImmortal.exe"+748302:
jmp newmem
returnhere:
