DIAGNOSTIC NETWORK

高频错误诊断路径

从返回码出发,继续进入它已经关联的 API、对象 Hub、专题教程、工具与已接受 Runtime Verification,而不是停留在错误码释义。

10 条重点路径
返回值 -9

ERR_NOT_IN_RANGE

动作目标存在,但当前对象没有满足这次调用的距离规则。先确认真实返回值,再决定是否移动。

下一步检查什么?

  1. 确认目标变量真实存在,而且目标类型适用于当前方法。
  2. 保存动作返回值;只有实际得到 -9 时才进入距离分支。
  3. 如果是 Creep 动作,检查当前位置与目标距离,再决定是否调用 moveTo()。
  4. 在下一 tick 重新执行原动作,并核对位置、Store 或目标状态是否变化。
返回值 -2

ERR_NO_PATH

移动或寻路系统没有找到当前约束下可用的路径。不要只继续重复 moveTo(),先判断是哪一层路径约束失败。

下一步检查什么?

  1. 确认目标位置与目标房间当前可解析,跨房任务同时检查视野和出口。
  2. 检查墙体、不可通行地形、Rampart 与其他会改变可通行性的对象。
  3. 检查 range、routeCallback、roomCallback 或 CostMatrix 是否把可行路线排除了。
  4. 如果直接使用 PathFinder,检查 incomplete、path、cost 和 ops,而不是只看 path 数组。
返回值 -6

ERR_NOT_ENOUGH_RESOURCES

当前方法需要的资源不足。-6 不等于永远缺 Energy,必须回到具体 API 判断缺的是哪一种库存、Credits 或成本。

下一步检查什么?

  1. 先确认是哪个 API 返回 -6,并查清该方法实际消耗的资源类型。
  2. 检查 Creep、Structure、房间或账号当前库存,不要只看计划值。
  3. 把计划执行量与真实可用量、交易成本或配方消耗放在一起计算。
  4. 资源补齐后再重试,并保存新的返回值确认失败原因已经改变。
返回值 -4

ERR_BUSY

对象正处于与当前请求冲突的忙碌状态。对 Spawn 来说,先判断占用状态,再决定排队、等待还是切换 Spawn。

下一步检查什么?

  1. 确认当前 API 的文档确实可能返回 ERR_BUSY,不要把别的方法规则机械套过来。
  2. 对 Spawn 检查 spawn.spawning,以及当前队列是否已经为它分配任务。
  3. 确认同一 tick 没有重复向同一个对象提交互斥动作。
  4. 等待或改派后保存下一次返回值,避免把持续失败误判成正常排队。
返回值 -7

ERR_INVALID_TARGET

目标对象存在,但它不符合当前方法的目标契约。先判断目标类型和状态,再检查距离或资源。

下一步检查什么?

  1. 打印目标对象并确认它不是 undefined、null 或已经失效的缓存。
  2. 确认对象类型、所有权和当前状态满足这一个 API 的目标要求。
  3. 把目标类型错误与距离不足、容量不足分开处理,不要用 moveTo() 掩盖无效目标。
  4. 修正目标后保存新的返回值,并在下一 tick 核对动作结果。
返回值 -8

ERR_FULL

目标没有足够剩余容量。检查目标的真实 free capacity,并考虑同一 tick 其他动作已经预占或改变容量。

下一步检查什么?

  1. 确认是哪个目标返回容量不足,并读取对应 Store 或结构容量。
  2. 使用 getFreeCapacity(resourceType) 检查具体资源通道,而不是只看总容量。
  3. 检查同一 tick 其他 Creep 或 Structure 是否也在向同一目标写入资源。
  4. 重新计算安全 amount 后再调用,并保存新的返回值。
返回值 -11

ERR_TIRED

当前对象暂时不能再次行动:Creep 可能有 fatigue,Structure 可能还在 cooldown。先读状态,不要无条件重复调用。

下一步检查什么?

  1. 如果是 Creep 移动,读取 creep.fatigue 并检查 MOVE 与身体重量的配比。
  2. 如果是 Structure 动作,读取对应 cooldown 并确认它是否已经归零。
  3. 确认代码没有在 cooldown/fatigue 明显存在时反复提交同一动作并刷日志。
  4. 状态恢复后重新调用并保存返回值,确认失败分支已经退出。
返回值 -10

ERR_INVALID_ARGS

参数没有满足方法契约。把每个参数的真实值打印出来,逐项核对类型、顺序、范围和选项对象。

下一步检查什么?

  1. 确认调用的是哪个重载或参数形式,并对照当前 API 的参数顺序。
  2. 逐个打印 body、name、roomName、resourceType、amount 或 opts 的真实值。
  3. 检查数字范围、字符串格式、数组内容和选项字段是否存在非法值。
  4. 修正后只调用一次并保存返回值,避免重复调用掩盖最初的参数错误。
返回值 -3

ERR_NAME_EXISTS

准备创建的 Creep 名称仍被占用。名称生成属于 Spawn 生命周期的一部分,应在入队或生成前保证唯一。

下一步检查什么?

  1. 打印准备使用的名称,并检查 Game.creeps[name] 是否已经存在。
  2. 确认 Spawn 队列没有为多个任务提前分配相同名称。
  3. 使用可预测但唯一的命名策略,例如角色、序号与 Game.time 的组合。
  4. 重新生成名称后再次 dryRun 或正式调用,并保存返回值。
返回值 -14

ERR_RCL_NOT_ENOUGH

当前房间 Controller 等级或结构激活状态不允许这次操作。先确认 RCL、结构数量和 isActive(),再改任务计划。

下一步检查什么?

  1. 读取 room.controller?.level,并确认房间确实由当前代码预期的 Controller 控制。
  2. 对建设任务检查当前 RCL 的结构解锁等级和数量上限。
  3. 对现有 Structure 检查 structure.isActive(),不要只因为对象存在就认为它可用。
  4. RCL 不满足时应调整队列或等待升级,而不是每 tick 重复提交必然失败的动作。

找到 16 个返回值

返回值 0

OK

调用成功。

常见原因
动作已经被接受。
处理方法
不需要修复,但仍应在后续 tick 核对状态是否按预期变化。
返回值 -1

ERR_NOT_OWNER

目标不属于你,或当前对象不能由你控制。

常见原因
对其他玩家的 Creep、Spawn 或建筑执行受所有权限制的操作。
处理方法
确认目标属于自己,并检查房间控制权。
返回值 -3

ERR_NAME_EXISTS

打开重点诊断路径 ↑

准备创建的名称已经存在。

常见原因
spawnCreep() 使用了一个仍被占用的 Creep 名称。
处理方法
生成唯一名称,或在创建前检查 Game.creeps[name]。

推荐处理方式

const name = `Harvester${Game.time}`;
Game.spawns.Spawn1.spawnCreep([WORK, CARRY, MOVE], name);
返回值 -5

ERR_NOT_FOUND

没有找到要求的对象或目标。

常见原因
名称、ID、资源类型或查找条件不正确。
处理方法
打印变量并检查查找结果是否为 undefined、null 或空数组。
返回值 -6

ERR_NOT_ENOUGH_ENERGY

旧代码中常见的 Energy 不足名称,与 -6 返回值有关。

常见原因
创建身体成本超过房间当前 Energy,或动作对象没有足够 Energy。
处理方法
新文章优先按具体 API 使用 ERR_NOT_ENOUGH_RESOURCES,并同时检查 room.energyAvailable、Store 和任务计划量。
返回值 -7

ERR_INVALID_TARGET

打开重点诊断路径 ↑

目标不适用于当前动作。

常见原因
把 Source 传给 transfer(),把完整建筑当作 Construction Site,或使用了失效对象。
处理方法
确认方法需要的目标类型,并在调用前检查对象类型、所有权和当前状态。
返回值 -9

ERR_NOT_IN_RANGE

打开重点诊断路径 ↑

目标距离当前对象太远,这一次动作没有被安排。

常见原因
调用 harvest()、transfer()、upgradeController()、build()、repair()、recycleCreep()、transferEnergy() 或 launchNuke() 时不满足该 API 的范围规则。
处理方法
先保存动作返回值。Creep 动作只有返回 ERR_NOT_IN_RANGE 时才调用 moveTo();建筑 API 则检查其同房间或最大范围规则。

常见返回场景

harvest()transfer()upgradeController()build()repair()recycleCreep()transferEnergy()launchNuke()

建议排查顺序

  1. 确认目标变量真实存在,不是 undefined、null 或空数组中的缺失项。
  2. 确认目标类型适用于当前方法。
  3. 把动作返回值保存并输出,确认实际得到的确实是 ERR_NOT_IN_RANGE(-9)。
  4. Creep 动作收到 -9 后调用 moveTo(target),并在下一个 tick 重新执行原动作。
  5. Link 和 Nuker 等建筑方法不依赖 moveTo(),应检查同房间、目标房间或官方范围常量。

未处理返回值

// 只调用动作,没有处理距离不足
const result = creep.harvest(source);
console.log(result); // 可能得到 -9

推荐处理方式

const result = creep.harvest(source);

if (result === ERR_NOT_IN_RANGE) {
  const moveResult = creep.moveTo(source);

  if (moveResult !== OK) {
    console.log(creep.name + ' 移动失败:' + moveResult);
  }
}
返回值 -12

ERR_NO_BODYPART

Creep 缺少执行动作所需的有效身体部件。

常见原因
没有 WORK 却采集,缺少 CLAIM,或相关身体部件已经被摧毁。
处理方法
检查 creep.getActiveBodyparts(),并在创建时加入需要的部件。
返回值 -15

ERR_GCL_NOT_ENOUGH

全局控制等级不足。

常见原因
尝试 claim 超过 GCL 允许数量的房间。
处理方法
提升 GCL、放弃一个已有房间,或将当前任务改为 reserve。