简介
作为新手玩家在游戏进程中遇到的第一个”BOSS“,很多人会对如何拓展自己的疆域感到无从下手,那么本文就简单介绍一下在殖民地扩张的过程中你可能会遇到的一些问题和该怎么改写自己的代码吧。
多房间
首先来简单了解一下怎么殖民到新的房间,在游戏中有个等级叫做GCL
(全局控制等级)。如果你不太了解的话可以参考 Screeps 概念介绍(下) 中的 等级 小节。每升一级GCL
,都会给你解锁一个新的房间控制额度。新玩家的GCL
为1
级。一般会在你第一个房间的RCL
(房间控制等级) 达到5
级半时升至2
级GCL
,从而解锁第二个房间的控制额度。
建议在阅读完本文后再开始动手,以防出现准备不充分的情况发生。
第一步:占领新房间!
当你达到 GCL2 之后,你就可以着手开始发展你的第二块殖民地了。想占领新的房间,就要占领他的控制器。而占领控制器我们需要调用creep
的 claimController 方法,并传入想要占领房间的控制器即可占领该房间,如下:
// 要占领房间的 creep
const creep = Game.creeps['claimer']
// 要占领的房间
// 注意这一句有可能会获取不到 room 对象,下面会解释
const room = Game.rooms['要占领的房间名']
// 移动到房间的控制器并占领
if (creep.claimController(room.controller) == ERR_NOT_IN_RANGE) {
creep.moveTo(room.controller)
}
注意,执行claimController
方法要求 creep 拥有CLAIM
身体部分。你可以生成一个最小的身体结构[ CLAIM, MOVE ]
来完成新房间的占领工作。
但是!当你执行上面代码的时候,你可能会发现下面这行代码有问题:
const room = Game.rooms['要占领的房间名, 如W1N1'] // room 的值为 undefined
这句话获取不到room
对象,哪里出问题了!不用担心,你的写法没错。在作怪的是一个叫做 视野 的游戏机制。
你可能会疑惑,我点进房间里什么都可以看得到啊。没错,你是能看到,但是代码看不到。你可以在 官方 api 文档 中找到这句话:
注意后面这句,当房间中有自己的 creep 或者建筑时,该房间可见。所以说,如果我们没有任何单位在房间中时,我们将无法获取那个房间的对象。现在让我们来改写一下上面的代码:
// 要占领房间的 creep
const creep = Game.creeps['claimer']
// 要占领的房间
const room = Game.rooms['要占领的房间名']
// 如果该房间不存在就先往房间走
if (!room) {
creep.moveTo(new RoomPosition(25, 25, '要占领的房间'))
}
else {
// 如果房间存在了就说明已经进入了该房间
// 移动到房间的控制器并占领
if (creep.claimController(room.controller) == ERR_NOT_IN_RANGE) {
creep.moveTo(room.controller)
}
}
这样就可以保证 creep 正确的跑到目标房间然后占领控制器,关于其中RoomPosition
的文档看 这里,这里不再赘述。
当 creep 跑到控制器面前然后顶了一下控制器后,你就会发现控制器瞬间升到了1
级。没错,你已经占领了这个房间。如果你并没有看到这一幕,请打印 claimController()
的返回值并查阅文档。
第二步:建造 Spawn !
当你占领了房间之后就会发现,什么都没有发生。是的,占领新房间并不会送你什么建筑,你需要手动建造。首先要建造的就是Spawn
建筑。在Construct
建筑列表中,你可以在下方找到解锁的 Spawn
(如果你没有找到的话请检查房间中是否有别人遗留下来的 Spawn,可以直接摧毁,其他建筑同理)。
现在,我们需要生产建筑工来将我们的 spawn 造好,使用如下代码将建筑工引导至新房间:
// 因为我们的 claimer 已经在房间里了
// 所以我们可以正常的获取该房间的对象。
const target = Game.getObjectById('spawn工地的id')
const creep = Game.creeps['builder']
// 获取能量的逻辑
// ...
// 建造 spawn
if(target) {
if(creep.build(target) == ERR_NOT_IN_RANGE) {
creep.moveTo(target)
}
}
注意,creep 距离目标越远,moveTo()
所消耗的 cpu 就会越高,你可以使用如下形式的moveTo
来提高缓存的距离以节省 cpu:
// reusePath 代表缓存的距离,默认为 5
creep.moveTo(target, { reusePath: 50 })
上面的代码仅为参考,你应该结合你的 creep 数量控制模块 以及 角色模块 来创建一个通用性更高的“新房间占领逻辑”。
建造一个 spawn 要花费 1.5k
的能量,所以你应该在你源房间的能力范围内生成最多身体部件的builder
来加快 spawn 的建造。当你的新 spawn 建造完成后,一个崭新的殖民地就准备就绪了。你可以像之前一样挖矿并升级你的房间控制器了。
小提示:1 级的房间控制器将在
20,000 ticks
后降级至 0 级。届时你将失去这个房间并需要重新占领。所以请在其降至 0 级前建立起可靠的控制器升级逻辑。
ok,到目前为止我们已经讲完了如何控制一个新的房间,接下来我们就来讲一下给殖民地发展增速的有效手段:外矿。
外矿
在不属于自己的房间内采集并收集能量的行为 被称为开外矿。例如下图,可以看到其只有中间一个房间有完整的基地,而周围有很多房间的矿(外矿 )通过道路和基地连接在一起:
我们点开基地下方的房间就可以更清楚的了解到这个概念:
可以看到房间内只有两个 creep。一个在采集能量,另一个对着房间控制器不知道在做着什么,在做什么我们稍后再来讨论。
很多新手玩家再没接触过这个玩法之前很难想象到可以这么做。实际上,官方并没有禁止甚至推荐这么做。你可以发现,road
和container
这两种建筑实际上是可以在不属于自己的房间内建造的。所以你可以借此让你的外矿运作效率更高。
外矿的好处与坏处?
开外矿可以使得你基地的能量获取更加充沛从而提高殖民地运转效率,或许你已经注意到了,采矿需要时间一点一点的开采,而从存储中获取能量在一个 tick 中就可以完成。所以在建立了 开采 > 存储 > 使用 体系后,你会发现,开采的很容易跟不上消耗的速度,而开外矿则可以很好的缓解甚至解决这个问题。
那么古尔丹,代价是什么呢?
代价就是,你的 cpu 消耗可能会因此增加很多。creep 寻路会消耗 cpu。路程越长 cpu 消耗量越大。当你的外矿距离比较远时,使用一般的moveTo
进行寻路可能会导致你的 cpu 飙升。这时候你就需要一些额外手段了,例如使用PathFinder
、room.findPath
手动寻路并缓存路径等。所以开外矿实际是在 cpu 使用量和能量开采速率之间做权衡。
提高外矿的效率
当你随便点开一个无主房间的能量矿后,你会发现这个矿的容量上限居然只有可怜的1500
。什么情况?
我们可以在 官方 api 文档 中找到为什么,注意红框中最后一行,未预定的房间中容量上限为 1500。:
1500 也太少了点,那么能不能...能!我们只需要把这个房间 预定 了即可。什么是预定呢?实际上,creep 拥有三种针对控制器的行为,预定就是其中的一种,下面我们来简单介绍一下:
- 占领
claimController
:将该房间占领,房间的所有者owner
会变成自己,同时可以对房间控制器升级,从而解锁更高级和更多的建筑,要求自己有空余的房间控制额度。占领房间的 creep 必须拥有CLAIM
身体。 - 预定
reserveController
:强度稍弱一点的宣称,房间的所有者依旧为空,但是房间中能量矿的上限恢复至正常的3000
。预定时间会不断衰减,衰减至 0 时能量矿上限重新变成1500
。预定房间的 creep 必须拥有CLAIM
身体。 - 签名
signController
:最弱(没用)的宣称,你可以使用任意身体部件的 creep 给任意房间 (包括敌对房间 ) 控制器签名。签名可以在世界地图中看到并且不会自动衰减消失。但是不会对房间造成任何影响。
这里主要介绍一下预定reserveController
,预定并不像占领一样,一下就可以完成,而是需要有 creep 进行持续的预定,其原因在于:每一个CLAIM
身体每次只能增加1
tick 的预定时间。也就是说,如果你有一个[ CLAIM, MOVE ]
的 creep 每 tick 对房间控制器执行一次reserveController
的话,当 creep 死掉的时候,你对房间的预定会立马结束。所以为了获得更加充裕的预定时间,请确保你的 creep 拥有最少两个CLAIM
身体部件。
预定时间最长为5000
ticks,可以通过controller
面板中的Reserved
属性看到,见上图。
有一点需要注意的是,即使不对房间进行预定,也不影响你正常开外矿,只是外矿效率只有预定后的一半,所以推荐先完成外矿的逻辑代码,再来考虑预定者的逻辑。
开外矿会遇到的问题
入侵者
只要房间内的能量矿被开采,那么这个房间就有会产生 npc 入侵者,所以在外矿中面临的最大问题可能就是来自入侵者的威胁了。由于无法建造 tower 进行防御,所以你需要给外矿房间内派遣一些守卫(常驻或检测到入侵者后再生成)。或者你可以采取更猥琐一点的方法,例如有入侵者的话就直接撤退至安全房间直到入侵者老死。
在更新了 4.0 版本以后游戏新增了 NPC 要塞的机制,这个机制对于外矿的开发来说有不小的影响。NPC 会不断的在没有claim
的房间内生成一个小型的核心来预定房间。所以你可能要在外矿维护的模块中添加一些额外逻辑来清除这些惹人厌的 NPC 核心(当然如果你懒的打的话,core 一般也会在几万 tick 内消失 )。
需要注意的是,Creep.dismantle()
是对小型核心没有效果的,不要想着让外矿采集单位顺手拆掉。
你可以从 NPC 入侵者 - 要塞 和 原型介绍 - InvaderCore 了解到更多信息。
基建维护
因为 road 和 container 可以在RCL 0
的房间内建造,所以很多人都会在外矿中建造这两者来提高效率,但是这两者都会磨损,所以对房间内基础设施的维护就成为了一个重要的问题。你可以让你的开采者或运输者在运能量回来时顺路检查其生命值并维修,或者其他你能想到的更好办法。
视野问题
由于外矿房间内属于自己的单位并不多,所以有的时候可能会出现该房间没有视野的问题,所以请确保你的外矿房间有可靠的视野,或者你的代码足够健壮,当房间没有视野时也不影响正常的工作。
总结
本文简单介绍了如何拓展自己的殖民地,你可以控制的房间数量和你的GCL
等级是相等的,在拥有空余的房间控制额度时,你可以通过 creep 的claimController
来占领一个新的房间,但是要记得在占领新房间后及时建造spawn
。
除了占领新房间,你还可以通过开外矿的形式来利用其他房间的能量矿。使用reserveController
可以预定房间,从而使该房间的能量矿上限恢复至3000
。另外还要注意 npc 入侵者、基建维护、视野以及寻路成本带来的影响。
如果你想要了解更多关于 screeps 的内容,欢迎访问我的文集《Screeps》~