TICK LAB · V1

把一行 Screeps 代码拆成一个 Tick

用受控的 transfer()、spawnCreep() 与 CPU / Bucket 实验,观察 API 返回值、Intent、预算检查与模型化 Tick 状态之间的区别。

Deterministic educational model
这是教学实验,不是完整 Screeps Engine 模拟器

当前包含三个经过约束的实验:Creep.transfer()、StructureSpawn.spawnCreep() 与 Game.cpu CPU / Bucket。每个实验都只开放少量可验证变量,并明确保留未建模边界;结果用于解释已核对的 API / Engine 行为或受控预算计算,不代表 Live shard 证据。

实验 01 / Transfer Energy

Creep.transfer()

把 Creep1 携带的 ENERGY 转移给相邻 Spawn1。

Tick 100 · World State
Creep1Creep
Energy
50 / 50
Position
20, 20
Spawn1StructureSpawn
Energy
250 / 300
Free capacity
50
Position
21, 20
Code
const result = creep.transfer(
  Game.spawns.Spawn1,
  RESOURCE_ENERGY
);
result—
Tick 101 · 模型化下一状态
运行 Tick 后显示状态变化
直接试一个分支

不用猜参数。选择典型场景后会立即运行,并把返回码、Intent 与下一状态一起展示。

自定义参数也可以自己改变世界状态,再运行一次。
Range

transfer() 的目标必须位于相邻格。

Tick Timeline

调整参数,然后运行这个 Tick。

Return Code

调整参数,然后运行这个 Tick。

实验 02 / Spawn Creep

StructureSpawn.spawnCreep()

用一个受控 StructureSpawn.spawnCreep() 调用观察名字、Busy 与 Energy 检查如何决定返回码。

受控边界

Spawn1 固定为己方、RCL 可用,name 固定为 Worker1,options 固定为空对象,body 只允许三个有效预设,并使用默认 Room energyAvailable。V1 不模拟 energyStructures 分配、directions、dryRun、出口阻塞或多个 Spawn 的竞争。

Tick 200 · World State
Spawn1StructureSpawn
State
Idle
energyAvailable
300 / 300
Name
Worker1 可用
Worker1Spawn request
Body cost
200 ENERGY
Spawn time
9 ticks
Body
3 parts
[WORK, CARRY, MOVE]
Code
const result = Game.spawns.Spawn1.spawnCreep(
  [WORK, CARRY, MOVE],
  "Worker1"
);
result—
Tick 201 · 模型化下一状态
运行 Tick 后显示 spawning 状态
直接试一个 Spawn 分支

这些场景同时体现真实检查优先级:名字冲突先于 Busy,Busy 又先于 Energy。

自定义 Spawn 参数改变 body、Room 能量、Busy 与名字占用状态,再运行一次。
Spawn busy
Worker1 exists
Spawn Timeline

选择场景或调整参数,然后运行这个 Tick。

Return Code

选择场景或调整参数,然后运行这个 Tick。

实验 03 / CPU Budget

Game.cpu

用一个受控 Game.cpu 快照理解 limit、tickLimit、bucket 与 getUsed() 如何共同决定可选任务是否还有安全预算。

受控边界
Game.cpu.limit = 100

本实验固定 Game.cpu.limit = 100 CPU,只改变 bucket、当前已使用 CPU 与一个可选任务的估算成本。tickLimit 按官方文档描述的 bucket 行为建模,上限 500;bucket 上限 10,000。RUN / SKIP 是本地教学守卫的决定,不是 Screeps API 返回码或 Intent。实际任务 CPU 成本仍必须在真实 shard 中测量。

Tick 300 · CPU Snapshot
Game.cpuCPU snapshot
limit
100
tickLimit
500
bucket
4000 / 10000
getUsed()
40
Optional tasklocal estimate
Estimated cost
20
Headroom
460
Budget Guard
const plannedTaskCost = 20; // local estimate
const used = Game.cpu.getUsed();
const headroom = Game.cpu.tickLimit - used;

if (headroom >= plannedTaskCost) {
  runOptionalTask();
}
decision—
Tick 301 · 模型化 Bucket
运行预算检查后显示模型化 CPU 与 bucket 变化
直接试一个 CPU 分支

这些场景把“补 bucket / 保持 / 花 bucket / 卡在 tickLimit / 主动跳过任务”拆开显示。

自定义 CPU 快照改变 bucket、当前 getUsed() 与可选任务成本估算,再运行一次预算检查。
CPU Timeline

选择场景或调整参数,然后运行这个 Tick。

Budget Decision

选择场景或调整参数,然后运行这个 Tick。