---
description: 自动规划模块
---

# Automatic Plan

在完成了基本的升级和填充能量之后，需要考虑的首要问题就是建造问题了。

在我上一版 Lucy 的 AI 当中，就已经写了一个自动规划模块。但是那个比较复杂，在 Apollo 的 AI 当中，我准备基于上次写的自动规划模块，进行一些精简。首先，最重要的就是定义接口，即我们希望怎么使用自动规划模块。

需要注意的是，建筑地是可以被踩的，所以最好是一次只建造一个地方。而自动规划模块应当支持对于房间内的规划，以及路径连接这两个功能。

对外，自动规划的功能应当仅仅是规划，不考虑怎么建造，以及什么时候建造。即，输入规划的请求，返回规划的位置或者说路径什么的。

而规划具体的建筑是以`Unit`为单元。`Unit`可以是非常具体的一系列建筑群，或者是某些单个的建筑，例如：Tower。`Unit`有许多可以配置的地方，例如选址等。而且，自动规划也应当考虑到不同建筑单元之间的关系，即某些建筑单元的选址依赖于尚未建造的另外的建筑单元。

因此，接口可以被定义为：

```typescript
interface PlanModuleRegisterUnitOpts {
    /** 指定根据距离判定选址位置的参照对象 (到) */
    distanceReferencesTo? : ( StructureConstant | 'sources' | 'mineral' )[]
    /** 指定根据距离判定选址位置的参照对象 (从) */
    distanceReferencesFrom? : StructureConstant[]
    /** 与路径的位置关系 - 沿着路径 | 避免与路径重叠 */
    roadRelationship? : 'along' | 'avoid'
    /** 规划的本建筑单元数量 */
    amount? : number
    /** 可视化时文本 */
    visualizePinText? : string
    /** 可视化时颜色 */
    visualizeStrokeColor? : string
}

/** 自动规划模块 */
interface PlanModule {
    /** 注册建筑单元 - 按照注册顺序进行规划 */
    register(token: 'unit', unitName: string, unit: Unit, opts?: PlanModuleRegisterUnitOpts)
    /** 连接建筑单元 - 按照注册顺序进行规划 */
    register(token: 'road', roadName: string, unitNameU: string, unitNameV: string)
    /** 连接建筑单元和位置 - 按照注册顺序进行规划 */
    register(token: 'road', roadName: string, unitName: string, pos: RoomPosition)
    /** 连接位置 - 按照注册顺序进行规划 */
    register(token: 'road', roadName: string, posU: RoomPosition, posV: RoomPosition)
    /** 设定某房间建筑单元位置 (即非自动规划, 手动指定) */
    setUnitPos(roomName: string, unitName: string, pos: RoomPosition)
    /** 规划某房间的建筑单位或连接路径 */
    plan(roomName: string, token: 'unit' | 'road', name: string): { [structureType in StructureConstant]? : RoomPosition[] }
    /** 判定位置是否 已有/规划 了建筑 - 可用于一些不利用自动规划模块的建筑规划 */
    isAvailable(pos: RoomPosition): boolean
    /** 可视化 */
    visualize()
}
```

最后的效果如图：

<figure><img src="https://726355213-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqtlvcTJVEwNrHqsXK2M3%2Fuploads%2FJb2xhqkblxWJeLQWWCd1%2FScreenshot%202023-02-15%20at%2001.56.55.png?alt=media&#x26;token=4ae0e1aa-9111-48a2-9b45-0c71158f6360" alt=""><figcaption></figcaption></figure>
