可控村民就职的村民AI分析

## `0` gt
此时村民有职业, 并且正在使用近端的工作方块.
- `block_event`: 切换工作方块, 从近到远
- `ValidateNearbyPoi`: 检查工作方块poi
- `brain.eraseMemory(JOB_SITE)`: 删除工作方块的记忆
- `brain.eraseMemory(POTENTIAL_JOB_SITE)`: 删除潜在工作方块的记忆
- `ResetProfession`: 重置职业
- 检查到有职业,不是傻子且没有经验, 通过
- `refreshBrain()` 重置大脑, 也就是重新生成所有的 `goal`
## `1` gt
此时村民没有职业, 而且刚刚重置大脑. 远处有一个可用的工作方块.
- `AcquirePoi`: 分配潜在工作方块
- 检查到 `nextScheduledStart == 0L`:
- `nextScheduledStart = 当前时间 + nextInt(20)`: 更新下次可用时间, 此处的 `nextInt(20)` 后文称为 `cd_19`
- 不通过检查, 跳过执行步骤
- 跳过执行步骤
## `max(2, 1 + cd_19)` gt
此时村民没有职业, 超过可用时间(`AcquirePoi.nextScheduledStart`). 远处有一个可用的工作方块.
- `AcquirePoi`: 分配潜在工作方块
- 检查到 `当前时间 >= nextScheduledStart` 通过检查
- `nextScheduledStart = 当前时间 + 20L + nextIint(20)`: 更新下次可用时间, 此处的 `20L + nextInt(20)` 后文称为 `cd_39`
- 此处省略一些操作, 之后另开一篇文章详细讲.
- 分配 潜在工作方块 `poi` 到远端的工作方块
- `brain.setMemory(POTENTIAL_JOB_SITE, blockpos)`
## `max(2, 1 + cd_19) + cd_39` gt (最大值 `59` gt)
此时村民没有职业, 但是已经分配了远端的潜在工作方块, 超过可用时间(`AcquirePoi.nextScheduledStart`)
## `58` gt
此时村民没有职业, 但是已经分配了远端的潜在工作方块(`58 > max(2, 1 + cd_19)`)
- `block_event`: 切换工作方块, 从远到近
- `ValidateNearbyPoi`: 检查工作方块poi
- `brain.eraseMemory(JOB_SITE)`: 删除工作方块的记忆
- `brain.eraseMemory(POTENTIAL_JOB_SITE)`: 删除潜在工作方块的记忆
- `AcquirePoi`: 分配潜在工作方块
- 检查到 `当前时间 >= nextScheduledStart` 通过检查 (极端情况下会推迟到一个gt执行 \[未验证\])
- `nextScheduledStart = 当前时间 + 20L + nextIint(20)`: 更新下次可用时间
- 此处省略一些操作, 之后另开一篇文章详细讲.
- 分配 潜在工作方块`poi` 到近端的工作方块
- `brain.setMemory(POTENTIAL_JOB_SITE, blockpos)`: 记住潜在工作方块
- `AssignProfessionFromJobSite`: 分配职业
- 检查距离潜在工作方块的距离 `< 2` 通过
- `brain.eraseMemory(POTENTIAL_JOB_SITE)`: 删除潜在工作方块记忆
- `brain.setMemory(JOB_SITE, blockpos)`: 记住工作方块
- 设置村民职业
## `60` gt
回到初始状态, 同 `0` gt. 此时村民有职业, 并且正在使用近端的工作方块.
- `block_event`: 切换工作方块, 从近到远
- `ValidateNearbyPoi`: 检查工作方块poi
- `brain.eraseMemory(JOB_SITE)`: 删除工作方块的记忆
- `brain.eraseMemory(POTENTIAL_JOB_SITE)`: 删除潜在工作方块的记忆
- `ResetProfession`: 重置职业
- 检查到有职业,不是傻子且没有经验, 通过
- `refreshBrain()` 重置大脑, 也就是重新生成所有的 `goal`