# 关卡数据库 `levels-database.json`

## 单一数据源

| 文件 | 说明 |
|------|------|
| `assets/resources/level/levels-database.json` | **全部关卡**（增删查改改这个文件） |
| `assets/scripts/level/LevelDatabase.ts` | 加载与 CRUD API |
| `assets/scripts/level/LevelRegistry.ts` | 游戏内统一入口 |

每条关卡结构与 Unity 一致：

- `spawns` ← `Levels*.cs`（运行时由 `GameManager` 生成 Player/Prop）
- `ground` / `border` ← Unity `LevelN.prefab` Tilemap（烘焙进 Cocos 预制体）
- `unityPrefab` ← 原 Unity 资源路径（便于对照）

## 关卡地图编辑面板（对齐 Unity Tile Palette）

见 **`tools/level-map-editor.md`**：中间编辑关卡网格，右侧选择 `map-tiles/MapTile_*` 模块绘制，保存后烘焙预制体。

## 关卡地图预制体（与 Unity Instantiate 一致）

| 路径 | 说明 |
|------|------|
| `assets/resources/level-prefabs/Level{N}.prefab` | 地图视觉 + `LevelMapData`（Ground/Border 子节点） |
| `assets/scripts/level/LevelMapData.ts` | 挂在预制体根节点，提供可走/阻挡逻辑 |
| `tools/bake_cocos_level_prefabs.py` | 从 `levels-database.json` 批量生成预制体 |

运行时 `GameManager` 只做：

1. `resources.load('level-prefabs/LevelN')` → `instantiate`
2. 从预制体 `LevelMapData` 读取 `ground` / `border`
3. 按 `spawns` 生成角色与道具

**不再**用代码 `drawGridDebug` 拼地图。

修改 JSON 后需重新烘焙：

```bash
python3 tools/bake_cocos_level_prefabs.py \
  --db assets/resources/level/levels-database.json \
  --out-dir assets/resources/level-prefabs
```

## 贴图（角色 / 砖块）

从 Unity `Assets/Texture` 导入：

```bash
python3 tools/import_unity_textures.py --unity-root "/path/to/主站"
# Creator 刷新 textures 后：
python3 tools/fix_tile_texture_metas.py
```

目录与主题：`textures/default`、`silu`、`chinese`、`redArmy`、`numMan`、`snow`、`sanxing`。

## 从 Unity 重新导出

```bash
cd /path/to/cocos/tfrh001
python3 tools/export_all_levels.py \
  --unity-root "/path/to/主站" \
  --output assets/resources/level/levels-database.json
```

调试可加 `--limit 50` 只导出前 50 关。

## 增删查改示例（代码）

```typescript
import { getLevelConfig, setLevel, removeLevel, addLevel, getLevelIds } from './level/LevelRegistry';

const cfg = getLevelConfig(3);
setLevel({ ...cfg!, levelID: 99, spawns: [...] });
removeLevel(99);
console.log(getLevelIds());
```

直接编辑 JSON 后，在 Cocos 中刷新资源并重新预览即可。
