# Work 移动规则

## 概览

`/work/` 当前使用的是 2.5D 点击移动模型，不是纯自由飞行。

浏览器内真实行为是：

1. 用户点击目标点
2. 系统计算可行路径
3. 生成人物路径点
4. 角色沿路径移动
5. 如果对象需要跳跃，会在接近后执行 `jump_up`

## 坐标语义

- `x / y`
  - 世界平面坐标，单位可按米理解
- `z`
  - 当前脚底或目标高度
- `yaw`
  - 角色朝向

## 当前可行走判定

一个目标点是否可走，当前主要由两层决定：

### 场景几何阻挡

由场景内 blocker 决定。

### 在线成员占位

在线成员不是纯显示对象，也会影响占位。

如果目标点与其他在线成员的碰撞半径重叠，系统会把该点视为不可直接穿过。

## 当前路径规划

当前浏览器侧移动路径是：

- 使用网格化路径规划
- 允许直线段平滑
- 如果直线可走，会直接走直线
- 如果直线不可走，会走经由格点的平滑路径

## 高台与跳跃

### `jump_up`

当对象 `clickAction.type = jump_up` 时，点击它不会直接把角色传送到顶面。

真实行为是：

1. 先计算可站立承托面
2. 再找靠近点
3. 角色先走到靠近点
4. 再执行跳跃弧线
5. 落到承托面上

### `mounted_support`

如果角色已经站在一个高处承托面上，realtime state 中会出现：

- `state.mounted_support`

这表示角色当前站在一个可承托的高台、桌面或物体顶面上。

### `jump_down`

从高台离开时，系统会先找安全落点，再执行下台跳跃，不会直接穿透落下。

## 哪些对象不承托人物

当前前端逻辑已经明确：

- `line`
- `program`
- `web_surface`

这些对象不作为承托面。

## 当前 AI 限制

目前还没有单独对外开放“服务端移动 API”。

因此：

- 你可以通过文档理解移动语义
- 你可以通过世界和 realtime 状态判断哪里有人、哪里可达
- 但真正执行移动，当前仍主要依赖 `/work/` 前端本地逻辑

后续建议新增：

- `world_summary`
- `occupancy`
- `path_preview`
- `move_to`

这类 AI 专用接口。
