# TomoTool PC Bridge

PC 本地桥接服务，用于让 `https://www.tomodachilife.cn/` 读取和写回电脑模拟器里的
Tomodachi Life: Living the Dream 存档。

第一阶段目标：

- 手动选择包含 `Player.sav`、`Mii.sav`、`Map.sav` 的模拟器存档目录。
- 提供 TomoToolNX 风格的存档读写接口。
- 由用户手动创建、恢复和删除备份。
- 管理页会先提示用户创建备份，再打开网站修改存档。
- 网站写回后，在 TomoTool PC 管理页确认保存状态。
- 电脑端通过 `http://127.0.0.1:8080/bridge.html` 打开带顶部提示的桥接版网站，并自动带入本机 Switch 地址。
- 支持手机在同一局域网扫码访问桥接入口。

## 启动

双击 `start.bat`，或运行：

```powershell
npm install
npm run dev
```

启动后打开：

```text
http://127.0.0.1:8080
```

## 常用接口

```text
GET  /api/status
GET  /api/config
POST /api/config
GET  /api/save/download?file=player|mii|map
POST /api/save/upload?file=player|mii|map
POST /api/save/confirm
POST /api/save/backup
GET  /api/save/backups
POST /api/save/restore
POST /api/save/backup/delete
```

`POST /api/config` 示例：

```json
{
  "saveDir": "D:\\path\\to\\save\\0"
}
```

## 手机访问说明

手机和电脑需要在同一个 Wi-Fi。启动页面会显示局域网地址和二维码，例如：

```text
http://192.168.1.20:8080/mobile.html
```

注意：手机直接打开 `https://www.tomodachilife.cn/` 再请求电脑的 `http://192.168.x.x:8080`
可能会被浏览器的 HTTPS 混合内容或 Private Network Access 规则拦截。因此手机模式建议从二维码进入
PC Bridge 的 `mobile.html`。

电脑端请先在管理页创建备份，再点击“打开桥接版编辑网站”，或直接打开：

```text
http://127.0.0.1:8080/bridge.html
```

电脑端桥接页会在上方显示 TomoTool PC Bridge，并在页面内打开网站的 HTTP 操作页：

```text
http://www.tomodachilife.cn/?page=switch&switchAddress=http://127.0.0.1:8080
```

这样网站会按 TomoToolNX 普通插件模式读取 `/api/list`，目标纹理列表可以从 PC Bridge 返回。

`mobile.html` 会内嵌 `tomodachilife.cn`，并接受来自网站的 `postMessage` 请求：

```js
window.parent.postMessage({
  type: 'tomotoolpc:request',
  id: crypto.randomUUID(),
  method: 'GET',
  path: '/api/status'
}, '*');
```

上传二进制时可传 `bodyBytes`：

```js
window.parent.postMessage({
  type: 'tomotoolpc:request',
  id,
  method: 'POST',
  path: '/api/save/upload?file=player',
  headers: { 'Content-Type': 'application/octet-stream' },
  bodyBytes: arrayBuffer
}, '*');
```

注意：网站如果在 `bridgeMode=postmessage` 下直接把 `FormData` 传给 PC Bridge，会被浏览器跨域消息限制挡住。
前端需要先把表单序列化成 multipart 字节，或改为向 PC Bridge 直连地址发起普通 `fetch`。
PC Bridge 服务端已经支持 `multipart/form-data` 的 `/api/import` 和 `/api/mii/import`。

桥接页会回传：

```js
{
  type: 'tomotoolpc:response',
  id,
  ok,
  status,
  contentType,
  payload
}
```

## 安全建议

- 写回存档前关闭游戏或暂停模拟器，避免模拟器覆盖文件。
- 使用网站修改存档前，请先在 TomoTool PC 管理页创建一份备份。
- 涉及 Mii 删除、房屋、地图对象、关系图等跨文件修改时，必须一起保存相关的 `Mii.sav`、`Player.sav`、`Map.sav`。
- 备份只会在点击“创建备份”或调用 `POST /api/save/backup` 时生成。
