# Báo Cáo Khảo Sát Kiến Trúc: Hệ Thống Bản Đồ Thủ Tục Server-Side FreeExile

> **Vai trò**: Server Map Explorer  
> **Thời gian khảo sát**: 2026-10-01T19:25:00Z  
> **Thư mục làm việc**: `c:\Projects\FreeExile\.agents\teamwork\explorer_survey_server`  
> **Tài liệu tham chiếu**: [ORIGINAL_REQUEST.md](file:///c:/Projects/FreeExile/.agents/teamwork/ORIGINAL_REQUEST.md) (mục `## 2026-10-01T19:19:13Z`), [GEMINI.md](file:///c:/Projects/FreeExile/GEMINI.md)

---

## 1. Tóm Tắt Khảo Sát & Bối Cảnh Nghiên Cứu

Hệ thống bản đồ hiện tại của FreeExile trên Client WebApp chưa có cấu trúc dữ liệu tile map thực sự, mà chỉ render dựa vào công thức toán học nội suy cục bộ trong [world_renderer.js](file:///c:/Projects/FreeExile/client/webapp/js/engine/world_renderer.js) (dòng 21–23: `Math.abs(x-y) <= 1`).

Phía Server đã có sẵn nền tảng sinh dungeon ngẫu nhiên với phòng ốc BSP, hành lang A*, cổng trùm và chướng ngại vật chống bot tại [procedural_map_engine.py](file:///c:/Projects/FreeExile/server/world/procedural_map_engine.py). Tuy nhiên, engine này được thiết kế thuần túy cho phụ bản hầm ngục (dungeon ngầm), chưa hỗ trợ địa hình mở hoang dã (Open-World Wilderness), chưa sinh các loại tile địa hình mới (`PATH`, `DENSE_TERRAIN`, `WATER`, `POI`, `ENCOUNTER_*`), và chưa kết nối đường truyền nhị phân xuống Client.

Báo cáo này phân tích chi tiết mã nguồn hiện hữu, xác lập thuật toán mở rộng sinh bản đồ hoang dã từ $60 \times 45$ đến $120 \times 90$ tiles, định nghĩa giao thức nhị phân siêu tinh gọn `Uint8Array` ($1\text{ byte/tile}$), và tổng hợp ma trận kiểm thử bảo đảm tính tương thích ngược tuyệt đối.

---

## 2. Rà Soát Chi Tiết Các Module Server Hiện Hữu

| Tệp Nguồn | Số Dòng | Vai Trò & Hiện Trạng Kiến Trúc |
| :--- | :--- | :--- |
| [procedural_map_engine.py](file:///c:/Projects/FreeExile/server/world/procedural_map_engine.py) | 396 dòng | Sinh dungeon qua BSP rooms, kết nối hành lang A*, cổng Boss Gate, bẫy chống bot. Gần chạm ngưỡng Hard Cap (500 dòng). |
| [map_data_types.py](file:///c:/Projects/FreeExile/server/world/map_data_types.py) | 176 dòng | Định nghĩa `TileType` (13 types: 0..12), `FogState` (0..2), `ObstacleType`, `TileCell`, `MapRoom`, `MapGridData`. |
| [map_biome_catalog.py](file:///c:/Projects/FreeExile/server/world/map_biome_catalog.py) | 120 dòng | Danh mục 5 Biome Grimdark: `SAVAGE_MANGROVE_SWAMP`, `CRIMSON_BLOOD_FOREST`, `BLEACHED_BONE_CANYON`, `OUTCAST_MINE_SHAFTS`, `CORRUPTED_FIEND_RUINS`. |
| [zone_catalog.py](file:///c:/Projects/FreeExile/server/world/zone_catalog.py) | 625 dòng | Định nghĩa 10 phân khu chuẩn (2 Safe Havens, 8 Wilderness), tọa độ biên `bounds_width/height`, Waypoints (`safe_radius: 8.0`), Portals. |
| [zone_engine.py](file:///c:/Projects/FreeExile/server/world/zone_engine.py) | 473 dòng | Quản lý vòng đời zone, kiểm tra biên chuyển động, cấm quái tại Safe Haven & bán kính 8m quanh Waypoint. Chưa có kiểm tra tile collision. |

### 2.1. Phân Tích `server/world/map_data_types.py`
- **`TileType` hiện tại (13 giá trị)**:
  `VOID(0)`, `FLOOR(1)`, `WALL(2)`, `DESTRUCTIBLE_BARRICADE(3)`, `MUD_POOL(4)`, `SPIKE_TRAP(5)`, `CRUMBLED_DEBRIS(6)`, `BONE_PILE(7)`, `POISON_VENT(8)`, `CHASM(9)`, `BOSS_GATE(10)`, `BOSS_ALTAR(11)`, `RUNIC_FLOOR(12)`.
- **Thiếu sót**: Chưa có các tile mở rộng cho hoang dã theo yêu cầu:
  - `PATH`: Đường mòn tăng tốc chạy (+20% speed, `movement_cost = 0.83`).
  - `DENSE_TERRAIN`: Bụi gai/đầm lầy cản bước (-30% speed, `movement_cost = 1.43`).
  - `WATER`: Mặt nước/khe vực sâu không thể đi qua (`walkable = False`, `blocks_vision = False`).
  - `POI`: Điểm tương tác (thương nhân, tế đàn, NPC, bia đá).
  - `ENCOUNTER_LOW`, `ENCOUNTER_MEDIUM`, `ENCOUNTER_HIGH`: Vùng quái dày đặc theo cấp độ.
- **`MapGridData`**: Đã hỗ trợ `spatial_chunk_size = 16`, lưu trữ `tiles: List[List[TileCell]]`, `obstacles`, `rooms`, `spawn_point`, `boss_point`, `boss_gate`. Cần bổ sung danh sách `encounter_zones` và phương thức xuất nhị phân `to_binary()`.

### 2.2. Phân Tích `server/world/procedural_map_engine.py`
- Dòng 33–85 (`generate_map`): Khởi tạo lưới toàn bộ là `WALL`.
- Dòng 87–100 (`_generate_rooms`): Đặt phòng hình chữ nhật ngẫu nhiên không giao nhau.
- Dòng 102–111 (`_build_grand_boss_room`): Chọn phòng xa nhất từ điểm spawn, mở rộng thành phòng trùm.
- Dòng 126–160 (`_carve_corridor_path`): Dùng A* tìm đường nối 2 điểm, đục hành lang độ rộng 2x2.
- Dòng 177–205 (`_connect_and_gate_boss_room`): Nối phòng thường gần nhất đến tường phòng trùm, biến toàn bộ biên phòng trùm thành `WALL` kiên cố, chỉ để duy nhất 1 tile `BOSS_GATE`.
- Dòng 231–290 (`_inject_anti_bot_obstacles`): Chèn rào cản phá hủy được (`BARRICADE_WOOD_BONE`) tại choke points, chèn mud quagmire và concealed spikes, đặt `BOSS_SEAL_BARRIER` tại cửa Boss Gate.
- **Hạn chế đối với Open World**: Thuật toán hiện tại sinh ra các hộp phòng kín kết nối bằng hành lang hẹp; trong khi bản đồ hoang dã cần không gian thoáng đãng, đồi núi uốn lượn, sông suối và bãi quái lộ thiên.

---

## 3. Thiết Kế Mở Rộng: Bản Đồ Hoang Dã Mở (Wilderness Generator)

### 3.1. Kích Thước & Biome Phân Bổ Cho 10 Canonical Zones

| Zone ID | Tên Zone | Biome ID | Kích Thước Tiles | Ngân Sách Cells |
| :--- | :--- | :--- | :--- | :--- |
| `zone_boundless_sanctuary` | Doanh Trại Bến Lưu Đày | N/A (Safe Haven) | $40 \times 40$ (static hub) | 1.600 |
| `zone_player_hideout` | Tiên Phủ Động Thiên | N/A (Safe Haven) | $32 \times 32$ (static hub) | 1.024 |
| `zone_tang_kiem_nhai` | Bờ Đá Tàn Xương (Lv1–10) | `BLEACHED_BONE_CANYON` | $60 \times 45$ | 2.700 |
| `zone_ancient_sword_barrow`| Đầm Lầy Thối Rữa (Lv8–20) | `SAVAGE_MANGROVE_SWAMP` | $68 \times 50$ | 3.400 |
| `zone_boundless_sandstorm` | Sa Cốt Hoang Mạc (Lv20–30)| `BLEACHED_BONE_CANYON` | $76 \times 56$ | 4.256 |
| `zone_blood_scale_ruins` | Phế Tích Xẻ Thịt (Lv30–40) | `CORRUPTED_FIEND_RUINS` | $84 \times 62$ | 5.208 |
| `zone_five_elements_altar` | Tế Đàn Man Hoang (Lv40–50) | `CORRUPTED_FIEND_RUINS` | $92 \times 68$ | 6.256 |
| `zone_abyssal_ice_pond` | Vực Đầm Băng Độc (Lv50–60) | `SAVAGE_MANGROVE_SWAMP` | $100 \times 74$ | 7.400 |
| `zone_infinite_blood_rift` | Vực Đói Nuốt Chửng (Lv60–70)| `CRIMSON_BLOOD_FOREST` | $108 \times 80$ | 8.640 |
| `zone_purgatory_lava_cavern`| Miệng Lửa Nung Máu (Lv70–85)| `OUTCAST_MINE_SHAFTS` | $114 \times 84$ | 9.576 |
| `zone_boundless_celestial_palace`| Bệ Thờ Quỷ Đoạt Mệnh (Lv85+)| `CORRUPTED_FIEND_RUINS` | $120 \times 90$ | 10.800 |

### 3.2. Thuật Toán Sinh Hoang Dã (Wilderness Generation Pipeline)

```
[Khởi tạo Grid toàn WALL/WATER]
          │
          ▼
[1. Định vị Spawn (Biên Tây/Nam) & Khắc Vùng Bất Tử An Toàn (Bán kính 8 tiles = FLOOR/PATH)]
          │
          ▼
[2. Định vị Boss Arena & Boss Gate (Biên Đông/Bắc đối diện)]
          │
          ▼
[3. Phân bổ 2–3 Vùng Quái (Encounter Zones: Low -> Medium -> High)]
          │
          ▼
[4. Khắc Đường Mòn Chính (Main Path): Nối Spawn -> EZ1 -> EZ2 -> Boss Gate, Sinuosity >= 1.25]
          │
          ▼
[5. Đục 1–2 Đường Nhánh Cụt (Dead Ends): Đặt Rương Kho Báu / Mật Thất Cổ Võ]
          │
          ▼
[6. Cấy 1–3 Tiles POI (Thương Nhân, Điểm Truyền Tống, Tế Đàn)]
          │
          ▼
[7. Rải Chướng Ngại Vật & Bụi Gai Rậm (DENSE_TERRAIN, MUD_POOL, SPIKES)]
          │
          ▼
[8. Xác Thực Độ Thông Suốt A* 100% & Bán Kính An Toàn Spawn]
```

### 3.3. Các Quy Tắc Địa Hình Bắt Buộc
1. **Vùng Bất Tử An Toàn Tại Spawn Point**:
   - Tọa độ Spawn $(sx, sy)$ nằm ở góc hoặc biên bản đồ.
   - Mọi tile trong bán kính Euclid $r \le 8$ tiles: Bắt buộc là `FLOOR` hoặc `PATH`. Tuyệt đối không có `WALL`, `WATER`, quái vật thù địch hay bẫy sát thương.
   - Trụ Thần Hành (Waypoint) được cấy tại tọa độ $(sx, sy)$ với thuộc tính `safe_radius = 8.0`.
2. **Đường Mòn Chính (Main Path)**:
   - Dùng thuật toán A* kết hợp hàm phạt nhiễu ngẫu nhiên (Perlin/Simplex gradient noise) để đường đi uốn khúc tự nhiên, tỷ lệ uốn lượn $\text{Sinuosity} = \frac{\text{Chiều dài đường đi}}{\text{Khoảng cách Euclid}} \ge 1.25$.
   - Chiều rộng đường mòn: $2 - 3$ tiles, gán loại tile `TileType.PATH` (tăng tốc độ chạy 20%).
3. **Các Vùng Quái (Encounter Zones - EZ)**:
   - 2 đến 3 vùng đất trống hình elip/hữu cơ có bán kính $5 - 8$ tiles.
   - Được phân tầng lũy tiến: `ENCOUNTER_LOW` (gần spawn), `ENCOUNTER_MEDIUM` (giữa map), `ENCOUNTER_HIGH` (tiếp giáp cổng trùm).
   - Quái vật trong [wilderness_zone_packs.js](file:///c:/Projects/FreeExile/client/webapp/js/data/wilderness_zone_packs.js) sẽ được máy chủ chỉ định vị trí spawn ngẫu nhiên bên trong các vùng này thay vì toạ độ cố định cũ.
4. **Đường Cụt Thưởng (Dead Ends)**:
   - 1 đến 2 đường mòn phân nhánh tách khỏi lộ trình chính, dài $10 - 18$ tiles, kết thúc bằng một khoảng trống nhỏ ($6 \times 6$ tiles).
   - Chứa Rương Kho Báu (Loot Cache) hoặc Điểm Kích Hoạt Mật Thất Cổ Võ (`SecretChamberSession`).
5. **Cổng Boss (Boss Gate Tile)**:
   - 1 tile `TileType.BOSS_GATE` chặn lối vào Vực Trùm ở cuối bản đồ.
   - Trạng thái ban đầu: `is_walkable = False` (Phong ấn chặn lối). Khi người chơi tiêu diệt đủ số pack quái quy định trong zone, cổng tự động chuyển thành `FLOOR` (`walkable = True`).
6. **Điểm Điển Nhấn (POI Tiles)**:
   - 1 đến 3 tile `TileType.POI` rải rác dọc đường mòn hoặc tại các ngã ba: Trạm nghỉ, Thương nhân lưu đày, Tế đàn man tộc.

### 3.4. Kiến Trúc Module Tránh Vượt Ngưỡng Dòng (Decoupled Modular Architecture)
Để tuân thủ triệt để [GEMINI.md](file:///c:/Projects/FreeExile/GEMINI.md) (Soft Cap 350 dòng, Hard Cap 500 dòng):
- Không nhồi nhét toàn bộ logic sinh hoang dã vào [procedural_map_engine.py](file:///c:/Projects/FreeExile/server/world/procedural_map_engine.py) (đã 396 dòng).
- Kiến trúc đề xuất tách thành 3 module chuyên biệt:
  1. `server/world/wilderness_map_generator.py` ($\le 320$ dòng): Chuyên trách thuật toán sinh hoang dã mở, bãi quái, POI, đường mòn.
  2. `server/world/map_binary_serializer.py` ($\le 160$ dòng): Chuyên trách đóng gói / giải mã nhị phân `Uint8Array`.
  3. `server/world/procedural_map_engine.py` (Refactor gọn nhẹ $\le 300$ dòng): Đóng vai trò Facade API điều phối giữa Dungeon Generator và Wilderness Generator.

---

## 4. Giao Thức Đóng Gói Nhị Phân Siêu Tinh Gọn (Uint8Array Wire Format)

### 4.1. Cấu Trúc Khung Nhị Phân (Binary Frame Specification)

Khung truyền nhận nhị phân truyền trực tiếp qua WebSocket Binary Message, không cần bọc JSON.

```
+-------------------------------------------------------------------------------+
| HEADER (16 Bytes, Big-Endian)                                                 |
| 0x00: Magic (0x4645 'FE')   [2B] | 0x02: Version (1)               [1B]       |
| 0x03: Biome Enum Code        [1B] | 0x04: Width (Tiles)             [2B]       |
| 0x06: Height (Tiles)         [2B] | 0x08: Spawn X (Tile Coord)      [2B]       |
| 0x0A: Spawn Y (Tile Coord)   [2B] | 0x0C: Boss Gate X (0xFFFF=None) [2B]       |
| 0x0E: Boss Gate Y            [2B]                                             |
+-------------------------------------------------------------------------------+
| POI METADATA TABLE                                                            |
| 0x10: POI Count (P)          [1B]                                             |
| [P x 6 Bytes]: (X: uint16, Y: uint16, Type: uint8, Flags: uint8)              |
+-------------------------------------------------------------------------------+
| ENCOUNTER ZONES TABLE                                                         |
| 0x11 + (P*6): Encounter Count (E) [1B]                                        |
| [E x 9 Bytes]: (MinX: u16, MinY: u16, MaxX: u16, MaxY: u16, Tier: u8)         |
+-------------------------------------------------------------------------------+
| TILE GRID PAYLOAD (Row-Major: index = y * width + x)                          |
| Length = Width * Height Bytes (Mỗi tile = 1 Byte biểu diễn TileType enum)    |
+-------------------------------------------------------------------------------+
```

### 4.2. Bảng Mã Hóa `TileType` Chuẩn Hóa (1 Byte / Tile)

```python
class TileType(Enum):
    VOID = 0                 # Không gian rỗng ngoài rìa (đen tuyền)
    FLOOR = 1                # Nền đất thông thường (walkable)
    WALL = 2                 # Vách đá, tường núi, cây cổ thụ (impassable, blocks vision)
    DESTRUCTIBLE_BARRICADE = 3 # Rào chắn phá hủy được
    MUD_POOL = 4             # Vũng bùn lầy (speed -50%)
    SPIKE_TRAP = 5           # Bẫy gai sát thương
    CRUMBLED_DEBRIS = 6      # Đống đổ nát, đá lở
    BONE_PILE = 7            # Gò xương thú hoang
    POISON_VENT = 8          # Hốc khí độc
    CHASM = 9                # Vực sâu không đáy (impassable, nhìn xuyên qua)
    BOSS_GATE = 10           # Cổng phong ấn Boss (impassable khi chưa đủ điều kiện)
    BOSS_ALTAR = 11          # Bệ tế trùm
    RUNIC_FLOOR = 12         # Sàn cổ tự tăng uy lực
    PATH = 13                # Đường mòn khai hoang (speed +20%)
    DENSE_TERRAIN = 14       # Bụi rậm, đầm lầy gai (speed -30%)
    WATER = 15               # Sông hồ ngập nước (impassable, nhìn xuyên qua)
    POI = 16                 # Điểm quan trọng (thương nhân, nhiệm vụ, checkpoint)
    ENCOUNTER_LOW = 17       # Khu vực quái thường thưa
    ENCOUNTER_MEDIUM = 18    # Khu vực quái đàn vừa
    ENCOUNTER_HIGH = 19      # Khu vực quái tinh anh hung hãn
```

### 4.3. So Sánh Băng Thông & Tải Trọng Bộ Nhớ

| Chỉ Số Đánh Giá | Định Dạng Cũ (JSON Object Array) | Định Dạng Mới (Compact Binary Uint8Array) | Tỷ Lệ Tối Ưu |
| :--- | :--- | :--- | :--- |
| **Zone 60x45 (2.700 tiles)** | $\sim 216\text{ KB}$ JSON | **$2.73\text{ KB}$** nhị phân | **Giảm 98.7%** |
| **Zone 120x90 (10.800 tiles)**| $\sim 864\text{ KB}$ JSON | **$10.84\text{ KB}$** nhị phân | **Giảm 98.7%** |
| **Thời gian giải mã Client** | $15 - 35\text{ ms}$ (`JSON.parse` + allocations)| **$< 0.1\text{ ms}$** (`new Uint8Array(buffer)`) | **Nhanh gấp 200 lần** |
| **Client RAM Footprint** | $8 - 14\text{ MB}$ (Garbage Collection spikes) | **$10.8\text{ KB}$** mảng tĩnh | **Bảo vệ tuyệt đối 8MB RAM budget** |

---

## 5. Danh Mục Kiểm Thử Hiện Hữu & Kế Hoạch Xác Minh

### 5.1. Các Bộ Test Hiện Hữu Đã Khảo Sát & Xác Nhận PASS 100%

Hệ thống đã chạy kiểm chứng trực tiếp qua lệnh `pytest` và đạt kết quả $48/48$ tests PASS:

1. **[test_war_fog_and_procedural_map.py](file:///c:/Projects/FreeExile/tests/unit/test_war_fog_and_procedural_map.py)** (420 dòng, 20 test cases):
   - Tính tất định của seed (`test_deterministic_generation_with_seed`).
   - Độ thông suốt 100% từ spawn đến boss (`test_guaranteed_connectivity_spawn_to_boss`).
   - Độ phức tạp chống bot sinuosity $\ge 1.25$ (`test_anti_bot_sinuosity_path_complexity`).
   - Tỷ lệ co giãn bản đồ $32 \times 32$ đến $80 \times 80$ (`test_scalable_map_dimensions_optimization`).
   - Cổng boss gate breach và cấm bypass chu vi (`test_zero_boss_gate_bypass_and_single_perimeter_entrance`).
   - Nén & giải nén War Fog RLE không suy hao (`test_fog_rle_compression`).
2. **[test_map_quest_and_boss_integration.py](file:///c:/Projects/FreeExile/tests/unit/test_map_quest_and_boss_integration.py)** (186 dòng, 5 test cases):
   - Tích hợp vòng lặp đóng giữa sinh map $64 \times 64$, phá cổng trùm và trả nhiệm vụ QuestEngine.
   - Thước đo phần trăm sương mù chiến tranh (Fog clearance gauge behavior).
3. **[test_zone_bounds_expansion.py](file:///c:/Projects/FreeExile/tests/unit/test_zone_bounds_expansion.py)** (203 dòng, 9 test cases):
   - Nhân đôi kích thước 9 zone hoang dã (Bờ Đá Tàn Xương $\ge 2000 \times 2000$).
   - Giữ nguyên $800 \times 800$ cho Doanh Trại & Tiên Phủ.
   - Kiểm tra giới hạn di chuyển Server-authoritative.
4. **[test_zone_monster_spawning_rules.py](file:///c:/Projects/FreeExile/tests/unit/test_zone_monster_spawning_rules.py)** (259 dòng, 14 test cases):
   - Nghiêm cấm tuyệt đối quái vật thù địch tại Sanctuary Hub và Hideout.
   - Cho phép Mộc Nhân Luyện Võ (`isDummy: true`).
   - Cấm quái spawn trong phạm vi an toàn $8\text{m}$ quanh Waypoint.
5. **[test_movement_authority.py](file:///c:/Projects/FreeExile/tests/unit/test_movement_authority.py)** (61 dòng, 2 test cases):
   - Tích hợp vận tốc $6.0\text{ m/s}$, phát hiện speedhack và kéo giật (rubberband) về vị trí gốc.
6. **[test_fog_integrity_and_anti_exploit.py](file:///c:/Projects/FreeExile/tests/unit/test_fog_integrity_and_anti_exploit.py)** (120 dòng, 5 test cases):
   - Xác thực mã băm HMAC-SHA256 chống can thiệp RAM vào War Fog.
   - Chặn click xuyên tường và click mục tiêu trong sương mù.
7. **[test_adversarial_zone_bounds.py](file:///c:/Projects/FreeExile/tests/unit/test_adversarial_zone_bounds.py)** (230 dòng, 6 test cases):
   - Kiểm tra tọa độ biên cực hạn $999.0$ vs $1001.0$.
8. **[test_poe2_zone_and_encounter_e2e.py](file:///c:/Projects/FreeExile/tests/e2e/test_poe2_zone_and_encounter_e2e.py)** (348 dòng, 33 test cases):
   - Bộ E2E 4 tầng bao quát Safe Haven, Dodge i-Frame $250\text{ms}$, Poise/Stagger, Leashing và 6-portals Map Device.

### 5.2. Khoảng Trống Kiểm Thử (Test Gaps) Cần Bổ Sung Khi Triển Khai
- Chưa có `tests/unit/test_tile_collision.py`: Cần tối thiểu 10 test cases kiểm tra va chạm cấp tile (`WALL`, `WATER`, `CHASM`, `BOSS_GATE` bị khóa/mở) và kiểm tra hàm `validate_monster_spawn` tích hợp vị trí tile.
- Chưa có unit test cho `wilderness_map_generator.py`: Kiểm tra bán kính an toàn 8 tiles tại spawn point, tỷ lệ uốn lượn đường mòn $\ge 1.25$, số lượng vùng quái và POI.
- Chưa có unit test cho `map_binary_serializer.py`: Đóng gói `to_binary()`, giải mã `from_binary()`, kiểm tra khớp từng byte $100\%$.

---

## 6. Lộ Trình & Khuyến Nghị Kiến Trúc Dành Cho Implementer

1. **Bước 1 (Data Types & Catalog)**:
   - Thêm các giá trị mới vào `TileType` (`PATH=13`, `DENSE_TERRAIN=14`, `WATER=15`, `POI=16`, `ENCOUNTER_LOW=17`, `ENCOUNTER_MEDIUM=18`, `ENCOUNTER_HIGH=19`) trong `map_data_types.py`.
   - Cập nhật `MapGridData` lưu trữ danh sách `encounter_zones`.
2. **Bước 2 (Binary Serializer)**:
   - Tạo `server/world/map_binary_serializer.py` với 2 hàm `serialize_map_to_bytes(map_data: MapGridData) -> bytes` và `deserialize_map_from_bytes(data: bytes) -> MapGridData`.
3. **Bước 3 (Wilderness Generator)**:
   - Tạo `server/world/wilderness_map_generator.py` kế thừa hoặc dùng chung interface với engine, triển khai đầy đủ 8 bước trong pipeline hoang dã.
   - Đảm bảo độ dài file $\le 320$ dòng.
4. **Bước 4 (Tích hợp Facade & Zone Engine)**:
   - Thêm cờ `zone_type` hoặc phương thức `generate_wilderness_zone(zone_id, seed)` trong `ProceduralMapEngine`.
   - Trong `zone_engine.py`, cập nhật `validate_monster_spawn` để tra cứu tile tại tọa độ $(x, y)$: nếu tile là `WALL`, `WATER` hoặc `CHASM` thì từ chối sản sinh.
5. **Bước 5 (Unit Tests)**:
   - Viết `tests/unit/test_tile_collision.py` với $\ge 10$ test cases.
   - Chạy toàn bộ test suite để đảm bảo không có regression ($\ge 48$ tests hiện tại tiếp tục PASS).
